Page MenuHomec4science

No OneTemporary

File Metadata

Created
Sat, Jul 20, 21:37
This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/doc/Manual.html b/doc/Manual.html
index cb35f11bb..c7c008f6a 100644
--- a/doc/Manual.html
+++ b/doc/Manual.html
@@ -1,435 +1,435 @@
<HTML>
<HEAD>
<TITLE>LAMMPS-ICMS Users Manual</TITLE>
<META NAME="docnumber" CONTENT="24 Jan 2013 version">
<META NAME="author" CONTENT="http://lammps.sandia.gov - Sandia National Laboratories">
<META NAME="copyright" CONTENT="Copyright (2003) Sandia Corporation. This software and manual is distributed under the GNU General Public License.">
</HEAD>
<BODY>
<CENTER><A HREF = "http://lammps.sandia.gov">LAMMPS WWW Site</A> - <A HREF = "Manual.html">LAMMPS Documentation</A> - <A HREF = "Section_commands.html#comm">LAMMPS Commands</A>
</CENTER>
<HR>
<H1></H1>
<CENTER><H3>LAMMPS-ICMS Documentation
</H3></CENTER>
-<CENTER><H4>22 Aug 2013 version
+<CENTER><H4>24 Aug 2013 version
</H4></CENTER>
<H4>Version info:
</H4>
<P>The LAMMPS "version" is the date when it was released, such as 1 May
2010. LAMMPS is updated continuously. Whenever we fix a bug or add a
feature, we release it immediately, and post a notice on <A HREF = "http://lammps.sandia.gov/bug.html">this page of
the WWW site</A>. Each dated copy of LAMMPS contains all the
features and bug-fixes up to and including that version date. The
version date is printed to the screen and logfile every time you run
LAMMPS. It is also in the file src/version.h and in the LAMMPS
directory name created when you unpack a tarball, and at the top of
the first page of the manual (this page).
</P>
<P>LAMMPS-ICMS is an experimental variant of LAMMPS with additional
features made available for testing before they will be submitted
for inclusion into the official LAMMPS tree. The source code is
based on the official LAMMPS svn repository mirror at the Institute
for Computational Molecular Science at Temple University and generally
kept up-to-date as much as possible. Sometimes, e.g. when additional
development work is needed to adapt the upstream changes into
LAMMPS-ICMS it can take longer until synchronization; and occasionally,
e.g. in case of the rewrite of the multi-threading support, the
development will be halted except for important bugfixes until
all features of LAMMPS-ICMS fully compatible with the upstream
version or replaced by alternate implementations.
</P>
<UL><LI>If you browse the HTML doc pages on the LAMMPS WWW site, they always
describe the most current version of upstream LAMMPS, but may be
missing some new features in LAMMPS-ICMS.
<LI>If you browse the HTML doc pages included in your tarball, they
describe the version you have, however, not all new features in
LAMMPS-ICMS are documented immediately.
<LI>The <A HREF = "Manual.pdf">PDF file</A> on the WWW site or in the tarball is updated
about once per month. This is because it is large, and we don't want
it to be part of every patch.
<LI>There is also a <A HREF = "Developer.pdf">Developer.pdf</A> file in the doc
directory, which describes the internal structure and algorithms of
LAMMPS.
</UL>
<P>LAMMPS stands for Large-scale Atomic/Molecular Massively Parallel
Simulator.
</P>
<P>LAMMPS is a classical molecular dynamics simulation code designed to
run efficiently on parallel computers. It was developed at Sandia
National Laboratories, a US Department of Energy facility, with
funding from the DOE. It is an open-source code, distributed freely
under the terms of the GNU Public License (GPL).
</P>
<P>The primary developers of LAMMPS are <A HREF = "http://www.sandia.gov/~sjplimp">Steve Plimpton</A>, Aidan
Thompson, and Paul Crozier who can be contacted at
sjplimp,athomps,pscrozi at sandia.gov. The <A HREF = "http://lammps.sandia.gov">LAMMPS WWW Site</A> at
http://lammps.sandia.gov has more information about the code and its
uses.
</P>
<HR>
<P>The LAMMPS documentation is organized into the following sections. If
you find errors or omissions in this manual or have suggestions for
useful information to add, please send an email to the developers so
we can improve the LAMMPS documentation.
</P>
<P>Once you are familiar with LAMMPS, you may want to bookmark <A HREF = "Section_commands.html#comm">this
page</A> at Section_commands.html#comm since
it gives quick access to documentation for all LAMMPS commands.
</P>
<P><A HREF = "Manual.pdf">PDF file</A> of the entire manual, generated by
<A HREF = "http://www.easysw.com/htmldoc">htmldoc</A>
</P>
<OL><LI><A HREF = "Section_intro.html">Introduction</A>
<UL> 1.1 <A HREF = "Section_intro.html#intro_1">What is LAMMPS</A>
<BR>
1.2 <A HREF = "Section_intro.html#intro_2">LAMMPS features</A>
<BR>
1.3 <A HREF = "Section_intro.html#intro_3">LAMMPS non-features</A>
<BR>
1.4 <A HREF = "Section_intro.html#intro_4">Open source distribution</A>
<BR>
1.5 <A HREF = "Section_intro.html#intro_5">Acknowledgments and citations</A>
<BR></UL>
<LI><A HREF = "Section_start.html">Getting started</A>
<UL> 2.1 <A HREF = "Section_start.html#start_1">What's in the LAMMPS distribution</A>
<BR>
2.2 <A HREF = "Section_start.html#start_2">Making LAMMPS</A>
<BR>
2.3 <A HREF = "Section_start.html#start_3">Making LAMMPS with optional packages</A>
<BR>
2.4 <A HREF = "Section_start.html#start_4">Building LAMMPS via the Make.py script</A>
<BR>
2.5 <A HREF = "Section_start.html#start_5">Building LAMMPS as a library</A>
<BR>
2.6 <A HREF = "Section_start.html#start_6">Running LAMMPS</A>
<BR>
2.7 <A HREF = "Section_start.html#start_7">Command-line options</A>
<BR>
2.8 <A HREF = "Section_start.html#start_8">Screen output</A>
<BR>
2.9 <A HREF = "Section_start.html#start_9">Tips for users of previous versions</A>
<BR></UL>
<LI><A HREF = "Section_commands.html">Commands</A>
<UL> 3.1 <A HREF = "Section_commands.html#cmd_1">LAMMPS input script</A>
<BR>
3.2 <A HREF = "Section_commands.html#cmd_2">Parsing rules</A>
<BR>
3.3 <A HREF = "Section_commands.html#cmd_3">Input script structure</A>
<BR>
3.4 <A HREF = "Section_commands.html#cmd_4">Commands listed by category</A>
<BR>
3.5 <A HREF = "Section_commands.html#cmd_5">Commands listed alphabetically</A>
<BR></UL>
<LI><A HREF = "Section_packages.html">Packages</A>
<UL> 4.1 <A HREF = "Section_packages.html#pkg_1">Standard packages</A>
<BR>
4.2 <A HREF = "Section_packages.html#pkg_2">User packages</A>
<BR></UL>
<LI><A HREF = "Section_accelerate.html">Accelerating LAMMPS performance</A>
<UL> 5.1 <A HREF = "Section_accelerate.html#acc_1">Measuring performance</A>
<BR>
5.2 <A HREF = "Section_accelerate.html#acc_2">General strategies</A>
<BR>
5.3 <A HREF = "Section_accelerate.html#acc_3">Packages with optimized styles</A>
<BR>
5.4 <A HREF = "Section_accelerate.html#acc_4">OPT package</A>
<BR>
5.5 <A HREF = "Section_accelerate.html#acc_5">USER-OMP package</A>
<BR>
5.6 <A HREF = "Section_accelerate.html#acc_6">GPU package</A>
<BR>
5.7 <A HREF = "Section_accelerate.html#acc_7">USER-CUDA package</A>
<BR>
5.8 <A HREF = "Section_accelerate.html#acc_8">Comparison of GPU and USER-CUDA packages</A>
<BR></UL>
<LI><A HREF = "Section_howto.html">How-to discussions</A>
<UL> 6.1 <A HREF = "Section_howto.html#howto_1">Restarting a simulation</A>
<BR>
6.2 <A HREF = "Section_howto.html#howto_2">2d simulations</A>
<BR>
6.3 <A HREF = "Section_howto.html#howto_3">CHARMM and AMBER force fields</A>
<BR>
6.4 <A HREF = "Section_howto.html#howto_4">Running multiple simulations from one input script</A>
<BR>
6.5 <A HREF = "Section_howto.html#howto_5">Multi-replica simulations</A>
<BR>
6.6 <A HREF = "Section_howto.html#howto_6">Granular models</A>
<BR>
6.7 <A HREF = "Section_howto.html#howto_7">TIP3P water model</A>
<BR>
6.8 <A HREF = "Section_howto.html#howto_8">TIP4P water model</A>
<BR>
6.9 <A HREF = "Section_howto.html#howto_9">SPC water model</A>
<BR>
6.10 <A HREF = "Section_howto.html#howto_10">Coupling LAMMPS to other codes</A>
<BR>
6.11 <A HREF = "Section_howto.html#howto_11">Visualizing LAMMPS snapshots</A>
<BR>
6.12 <A HREF = "Section_howto.html#howto_12">Triclinic (non-orthogonal) simulation boxes</A>
<BR>
6.13 <A HREF = "Section_howto.html#howto_13">NEMD simulations</A>
<BR>
6.14 <A HREF = "Section_howto.html#howto_14">Finite-size spherical and aspherical particles</A>
<BR>
6.15 <A HREF = "Section_howto.html#howto_15">Output from LAMMPS (thermo, dumps, computes, fixes, variables)</A>
<BR>
6.16 <A HREF = "Section_howto.html#howto_16">Thermostatting, barostatting, and compute temperature</A>
<BR>
6.17 <A HREF = "Section_howto.html#howto_17">Walls</A>
<BR>
6.18 <A HREF = "Section_howto.html#howto_18">Elastic constants</A>
<BR>
6.19 <A HREF = "Section_howto.html#howto_19">Library interface to LAMMPS</A>
<BR>
6.20 <A HREF = "Section_howto.html#howto_20">Calculating thermal conductivity</A>
<BR>
6.21 <A HREF = "Section_howto.html#howto_21">Calculating viscosity</A>
<BR></UL>
<LI><A HREF = "Section_example.html">Example problems</A>
<LI><A HREF = "Section_perf.html">Performance & scalability</A>
<LI><A HREF = "Section_tools.html">Additional tools</A>
<LI><A HREF = "Section_modify.html">Modifying & extending LAMMPS</A>
<UL> 10.1 <A HREF = "Section_modify.html#mod_1">Atom styles</A>
<BR>
10.2 <A HREF = "Section_modify.html#mod_2">Bond, angle, dihedral, improper potentials</A>
<BR>
10.3 <A HREF = "Section_modify.html#mod_3">Compute styles</A>
<BR>
10.4 <A HREF = "Section_modify.html#mod_4">Dump styles</A>
<BR>
10.5 <A HREF = "Section_modify.html#mod_5">Dump custom output options</A>
<BR>
10.6 <A HREF = "Section_modify.html#mod_6">Fix styles</A>
<BR>
10.7 <A HREF = "Section_modify.html#mod_7">Input script commands</A>
<BR>
10.8 <A HREF = "Section_modify.html#mod_8">Kspace computations</A>
<BR>
10.9 <A HREF = "Section_modify.html#mod_9">Minimization styles</A>
<BR>
10.10 <A HREF = "Section_modify.html#mod_10">Pairwise potentials</A>
<BR>
10.11 <A HREF = "Section_modify.html#mod_11">Region styles</A>
<BR>
10.12 <A HREF = "Section_modify.html#mod_12">Body styles</A>
<BR>
10.13 <A HREF = "Section_modify.html#mod_13">Thermodynamic output options</A>
<BR>
10.14 <A HREF = "Section_modify.html#mod_14">Variable options</A>
<BR>
10.15 <A HREF = "Section_modify.html#mod_15">Submitting new features for inclusion in LAMMPS</A>
<BR></UL>
<LI><A HREF = "Section_python.html">Python interface</A>
<UL> 11.1 <A HREF = "Section_python.html#py_1">Building LAMMPS as a shared library</A>
<BR>
11.2 <A HREF = "Section_python.html#py_2">Installing the Python wrapper into Python</A>
<BR>
11.3 <A HREF = "Section_python.html#py_3">Extending Python with MPI to run in parallel</A>
<BR>
11.4 <A HREF = "Section_python.html#py_4">Testing the Python-LAMMPS interface</A>
<BR>
11.5 <A HREF = "Section_python.html#py_5">Using LAMMPS from Python</A>
<BR>
11.6 <A HREF = "Section_python.html#py_6">Example Python scripts that use LAMMPS</A>
<BR></UL>
<LI><A HREF = "Section_errors.html">Errors</A>
<UL> 12.1 <A HREF = "Section_errors.html#err_1">Common problems</A>
<BR>
12.2 <A HREF = "Section_errors.html#err_2">Reporting bugs</A>
<BR>
12.3 <A HREF = "Section_errors.html#err_3">Error & warning messages</A>
<BR></UL>
<LI><A HREF = "Section_history.html">Future and history</A>
<UL> 13.1 <A HREF = "Section_history.html#hist_1">Coming attractions</A>
<BR>
13.2 <A HREF = "Section_history.html#hist_2">Past versions</A>
<BR></UL>
</OL>
</BODY>
</HTML>
diff --git a/doc/Manual.txt b/doc/Manual.txt
index 11628b8d2..6dd80fdca 100644
--- a/doc/Manual.txt
+++ b/doc/Manual.txt
@@ -1,273 +1,273 @@
<HEAD>
<TITLE>LAMMPS-ICMS Users Manual</TITLE>
<META NAME="docnumber" CONTENT="24 Jan 2013 version">
<META NAME="author" CONTENT="http://lammps.sandia.gov - Sandia National Laboratories">
<META NAME="copyright" CONTENT="Copyright (2003) Sandia Corporation. This software and manual is distributed under the GNU General Public License.">
</HEAD>
<BODY>
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
:link(lws,http://lammps.sandia.gov)
:link(ld,Manual.html)
:link(lc,Section_commands.html#comm)
:line
<H1></H1>
LAMMPS-ICMS Documentation :c,h3
-22 Aug 2013 version :c,h4
+24 Aug 2013 version :c,h4
Version info: :h4
The LAMMPS "version" is the date when it was released, such as 1 May
2010. LAMMPS is updated continuously. Whenever we fix a bug or add a
feature, we release it immediately, and post a notice on "this page of
the WWW site"_bug. Each dated copy of LAMMPS contains all the
features and bug-fixes up to and including that version date. The
version date is printed to the screen and logfile every time you run
LAMMPS. It is also in the file src/version.h and in the LAMMPS
directory name created when you unpack a tarball, and at the top of
the first page of the manual (this page).
LAMMPS-ICMS is an experimental variant of LAMMPS with additional
features made available for testing before they will be submitted
for inclusion into the official LAMMPS tree. The source code is
based on the official LAMMPS svn repository mirror at the Institute
for Computational Molecular Science at Temple University and generally
kept up-to-date as much as possible. Sometimes, e.g. when additional
development work is needed to adapt the upstream changes into
LAMMPS-ICMS it can take longer until synchronization; and occasionally,
e.g. in case of the rewrite of the multi-threading support, the
development will be halted except for important bugfixes until
all features of LAMMPS-ICMS fully compatible with the upstream
version or replaced by alternate implementations.
If you browse the HTML doc pages on the LAMMPS WWW site, they always
describe the most current version of upstream LAMMPS, but may be
missing some new features in LAMMPS-ICMS. :ulb,l
If you browse the HTML doc pages included in your tarball, they
describe the version you have, however, not all new features in
LAMMPS-ICMS are documented immediately. :l
The "PDF file"_Manual.pdf on the WWW site or in the tarball is updated
about once per month. This is because it is large, and we don't want
it to be part of every patch. :l
There is also a "Developer.pdf"_Developer.pdf file in the doc
directory, which describes the internal structure and algorithms of
LAMMPS. :ule,l
LAMMPS stands for Large-scale Atomic/Molecular Massively Parallel
Simulator.
LAMMPS is a classical molecular dynamics simulation code designed to
run efficiently on parallel computers. It was developed at Sandia
National Laboratories, a US Department of Energy facility, with
funding from the DOE. It is an open-source code, distributed freely
under the terms of the GNU Public License (GPL).
The primary developers of LAMMPS are "Steve Plimpton"_sjp, Aidan
Thompson, and Paul Crozier who can be contacted at
sjplimp,athomps,pscrozi at sandia.gov. The "LAMMPS WWW Site"_lws at
http://lammps.sandia.gov has more information about the code and its
uses.
:link(bug,http://lammps.sandia.gov/bug.html)
:link(sjp,http://www.sandia.gov/~sjplimp)
:line
The LAMMPS documentation is organized into the following sections. If
you find errors or omissions in this manual or have suggestions for
useful information to add, please send an email to the developers so
we can improve the LAMMPS documentation.
Once you are familiar with LAMMPS, you may want to bookmark "this
page"_Section_commands.html#comm at Section_commands.html#comm since
it gives quick access to documentation for all LAMMPS commands.
"PDF file"_Manual.pdf of the entire manual, generated by
"htmldoc"_http://www.easysw.com/htmldoc
"Introduction"_Section_intro.html :olb,l
1.1 "What is LAMMPS"_intro_1 :ulb,b
1.2 "LAMMPS features"_intro_2 :b
1.3 "LAMMPS non-features"_intro_3 :b
1.4 "Open source distribution"_intro_4 :b
1.5 "Acknowledgments and citations"_intro_5 :ule,b
"Getting started"_Section_start.html :l
2.1 "What's in the LAMMPS distribution"_start_1 :ulb,b
2.2 "Making LAMMPS"_start_2 :b
2.3 "Making LAMMPS with optional packages"_start_3 :b
2.4 "Building LAMMPS via the Make.py script"_start_4 :b
2.5 "Building LAMMPS as a library"_start_5 :b
2.6 "Running LAMMPS"_start_6 :b
2.7 "Command-line options"_start_7 :b
2.8 "Screen output"_start_8 :b
2.9 "Tips for users of previous versions"_start_9 :ule,b
"Commands"_Section_commands.html :l
3.1 "LAMMPS input script"_cmd_1 :ulb,b
3.2 "Parsing rules"_cmd_2 :b
3.3 "Input script structure"_cmd_3 :b
3.4 "Commands listed by category"_cmd_4 :b
3.5 "Commands listed alphabetically"_cmd_5 :ule,b
"Packages"_Section_packages.html :l
4.1 "Standard packages"_pkg_1 :ulb,b
4.2 "User packages"_pkg_2 :ule,b
"Accelerating LAMMPS performance"_Section_accelerate.html :l
5.1 "Measuring performance"_acc_1 :ulb,b
5.2 "General strategies"_acc_2 :b
5.3 "Packages with optimized styles"_acc_3 :b
5.4 "OPT package"_acc_4 :b
5.5 "USER-OMP package"_acc_5 :b
5.6 "GPU package"_acc_6 :b
5.7 "USER-CUDA package"_acc_7 :b
5.8 "Comparison of GPU and USER-CUDA packages"_acc_8 :ule,b
"How-to discussions"_Section_howto.html :l
6.1 "Restarting a simulation"_howto_1 :ulb,b
6.2 "2d simulations"_howto_2 :b
6.3 "CHARMM and AMBER force fields"_howto_3 :b
6.4 "Running multiple simulations from one input script"_howto_4 :b
6.5 "Multi-replica simulations"_howto_5 :b
6.6 "Granular models"_howto_6 :b
6.7 "TIP3P water model"_howto_7 :b
6.8 "TIP4P water model"_howto_8 :b
6.9 "SPC water model"_howto_9 :b
6.10 "Coupling LAMMPS to other codes"_howto_10 :b
6.11 "Visualizing LAMMPS snapshots"_howto_11 :b
6.12 "Triclinic (non-orthogonal) simulation boxes"_howto_12 :b
6.13 "NEMD simulations"_howto_13 :b
6.14 "Finite-size spherical and aspherical particles"_howto_14 :b
6.15 "Output from LAMMPS (thermo, dumps, computes, fixes, variables)"_howto_15 :b
6.16 "Thermostatting, barostatting, and compute temperature"_howto_16 :b
6.17 "Walls"_howto_17 :b
6.18 "Elastic constants"_howto_18 :b
6.19 "Library interface to LAMMPS"_howto_19 :b
6.20 "Calculating thermal conductivity"_howto_20 :b
6.21 "Calculating viscosity"_howto_21 :ule,b
"Example problems"_Section_example.html :l
"Performance & scalability"_Section_perf.html :l
"Additional tools"_Section_tools.html :l
"Modifying & extending LAMMPS"_Section_modify.html :l
10.1 "Atom styles"_mod_1 :ulb,b
10.2 "Bond, angle, dihedral, improper potentials"_mod_2 :b
10.3 "Compute styles"_mod_3 :b
10.4 "Dump styles"_mod_4 :b
10.5 "Dump custom output options"_mod_5 :b
10.6 "Fix styles"_mod_6 :b
10.7 "Input script commands"_mod_7 :b
10.8 "Kspace computations"_mod_8 :b
10.9 "Minimization styles"_mod_9 :b
10.10 "Pairwise potentials"_mod_10 :b
10.11 "Region styles"_mod_11 :b
10.12 "Body styles"_mod_12 :b
10.13 "Thermodynamic output options"_mod_13 :b
10.14 "Variable options"_mod_14 :b
10.15 "Submitting new features for inclusion in LAMMPS"_mod_15 :ule,b
"Python interface"_Section_python.html :l
11.1 "Building LAMMPS as a shared library"_py_1 :ulb,b
11.2 "Installing the Python wrapper into Python"_py_2 :b
11.3 "Extending Python with MPI to run in parallel"_py_3 :b
11.4 "Testing the Python-LAMMPS interface"_py_4 :b
11.5 "Using LAMMPS from Python"_py_5 :b
11.6 "Example Python scripts that use LAMMPS"_py_6 :ule,b
"Errors"_Section_errors.html :l
12.1 "Common problems"_err_1 :ulb,b
12.2 "Reporting bugs"_err_2 :b
12.3 "Error & warning messages"_err_3 :ule,b
"Future and history"_Section_history.html :l
13.1 "Coming attractions"_hist_1 :ulb,b
13.2 "Past versions"_hist_2 :ule,b
:ole
:link(intro_1,Section_intro.html#intro_1)
:link(intro_2,Section_intro.html#intro_2)
:link(intro_3,Section_intro.html#intro_3)
:link(intro_4,Section_intro.html#intro_4)
:link(intro_5,Section_intro.html#intro_5)
:link(start_1,Section_start.html#start_1)
:link(start_2,Section_start.html#start_2)
:link(start_3,Section_start.html#start_3)
:link(start_4,Section_start.html#start_4)
:link(start_5,Section_start.html#start_5)
:link(start_6,Section_start.html#start_6)
:link(start_7,Section_start.html#start_7)
:link(start_8,Section_start.html#start_8)
:link(start_9,Section_start.html#start_9)
:link(cmd_1,Section_commands.html#cmd_1)
:link(cmd_2,Section_commands.html#cmd_2)
:link(cmd_3,Section_commands.html#cmd_3)
:link(cmd_4,Section_commands.html#cmd_4)
:link(cmd_5,Section_commands.html#cmd_5)
:link(pkg_1,Section_packages.html#pkg_1)
:link(pkg_2,Section_packages.html#pkg_2)
:link(acc_1,Section_accelerate.html#acc_1)
:link(acc_2,Section_accelerate.html#acc_2)
:link(acc_3,Section_accelerate.html#acc_3)
:link(acc_4,Section_accelerate.html#acc_4)
:link(acc_5,Section_accelerate.html#acc_5)
:link(acc_6,Section_accelerate.html#acc_6)
:link(acc_7,Section_accelerate.html#acc_7)
:link(acc_8,Section_accelerate.html#acc_8)
:link(howto_1,Section_howto.html#howto_1)
:link(howto_2,Section_howto.html#howto_2)
:link(howto_3,Section_howto.html#howto_3)
:link(howto_4,Section_howto.html#howto_4)
:link(howto_5,Section_howto.html#howto_5)
:link(howto_6,Section_howto.html#howto_6)
:link(howto_7,Section_howto.html#howto_7)
:link(howto_8,Section_howto.html#howto_8)
:link(howto_9,Section_howto.html#howto_9)
:link(howto_10,Section_howto.html#howto_10)
:link(howto_11,Section_howto.html#howto_11)
:link(howto_12,Section_howto.html#howto_12)
:link(howto_13,Section_howto.html#howto_13)
:link(howto_14,Section_howto.html#howto_14)
:link(howto_15,Section_howto.html#howto_15)
:link(howto_16,Section_howto.html#howto_16)
:link(howto_17,Section_howto.html#howto_17)
:link(howto_18,Section_howto.html#howto_18)
:link(howto_19,Section_howto.html#howto_19)
:link(howto_20,Section_howto.html#howto_20)
:link(howto_21,Section_howto.html#howto_21)
:link(mod_1,Section_modify.html#mod_1)
:link(mod_2,Section_modify.html#mod_2)
:link(mod_3,Section_modify.html#mod_3)
:link(mod_4,Section_modify.html#mod_4)
:link(mod_5,Section_modify.html#mod_5)
:link(mod_6,Section_modify.html#mod_6)
:link(mod_7,Section_modify.html#mod_7)
:link(mod_8,Section_modify.html#mod_8)
:link(mod_9,Section_modify.html#mod_9)
:link(mod_10,Section_modify.html#mod_10)
:link(mod_11,Section_modify.html#mod_11)
:link(mod_12,Section_modify.html#mod_12)
:link(mod_13,Section_modify.html#mod_13)
:link(mod_14,Section_modify.html#mod_14)
:link(mod_15,Section_modify.html#mod_15)
:link(py_1,Section_python.html#py_1)
:link(py_2,Section_python.html#py_2)
:link(py_3,Section_python.html#py_3)
:link(py_4,Section_python.html#py_4)
:link(py_5,Section_python.html#py_5)
:link(py_6,Section_python.html#py_6)
:link(err_1,Section_errors.html#err_1)
:link(err_2,Section_errors.html#err_2)
:link(err_3,Section_errors.html#err_3)
:link(hist_1,Section_history.html#hist_1)
:link(hist_2,Section_history.html#hist_2)
</BODY>
diff --git a/doc/USER/atc/man_add_molecule.html b/doc/USER/atc/man_add_molecule.html
new file mode 100644
index 000000000..99270c727
--- /dev/null
+++ b/doc/USER/atc/man_add_molecule.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC add_molecule</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_add_molecule">fix_modify AtC add_molecule </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify_AtC add_molecule &lt;small|large&gt; &lt;TAG&gt; &lt;GROUP_NAME&gt; <br/>
+</p>
+<ul>
+<li>small|large = can be small if molecule size &lt; cutoff radius, must be large otherwise <br/>
+</li>
+<li>&lt;TAG&gt; = tag for tracking a species <br/>
+</li>
+<li>&lt;GROUP_NAME&gt; = name of group that tracking will be applied to <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> group WATERGROUP type 1 2 </code> <br/>
+ <code> fix_modify AtC add_molecule small water WATERGROUP </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Associates a tag with all molecules corresponding to a specified group. <br/>
+ </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>No defaults for this command. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_add_species.html b/doc/USER/atc/man_add_species.html
new file mode 100644
index 000000000..95192034d
--- /dev/null
+++ b/doc/USER/atc/man_add_species.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC add_species</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_add_species">fix_modify AtC add_species </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify_AtC add_species &lt;TAG&gt; &lt;group|type&gt; &lt;ID&gt; <br/>
+</p>
+<ul>
+<li>&lt;TAG&gt; = tag for tracking a species <br/>
+</li>
+<li>group|type = LAMMPS defined group or type of atoms <br/>
+</li>
+<li>&lt;ID&gt; = name of group or type number <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC add_species gold type 1 </code> <br/>
+ <code> group GOLDGROUP type 1 </code> <br/>
+ <code> fix_modify AtC add_species gold group GOLDGROUP </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Associates a tag with all atoms of a specified type or within a specified group. <br/>
+ </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>No defaults for this command. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_atom_element_map.html b/doc/USER/atc/man_atom_element_map.html
index 33bd8e692..3073c0f92 100644
--- a/doc/USER/atc/man_atom_element_map.html
+++ b/doc/USER/atc/man_atom_element_map.html
@@ -1,26 +1,52 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer atom_element_map</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_atom_element_map">fix_modify AtC transfer atom_element_map</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC atom_element_map</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_atom_element_map">fix_modify AtC atom_element_map </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer atom_element_map &lt;eulerian|lagrangian&gt; &lt;frequency&gt; <br>
+<p>fix_modify AtC atom_element_map &lt;eulerian|lagrangian&gt; &lt;frequency&gt; <br/>
+</p>
<ul>
-<li>frequency (int) : frequency of updating atom-to-continuum maps based on the current configuration - only for eulerian </li></ul>
-<h2><a class="anchor" name="examples">
+<li>frequency (int) : frequency of updating atom-to-continuum maps based on the current configuration - only for eulerian </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify atc transfer atom_element_map eulerian 100 </code> <h2><a class="anchor" name="description">
+<p><code> fix_modify atc atom_element_map eulerian 100 </code> </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Changes frame of reference from eulerian to lagrangian and sets the frequency for which the map from atoms to elements is reformed and all the attendant data is recalculated. <h2><a class="anchor" name="restrictions">
+<p>Changes frame of reference from eulerian to lagrangian and sets the frequency for which the map from atoms to elements is reformed and all the attendant data is recalculated. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Cannot change map type after initialization. <h2><a class="anchor" name="related">
+<p>Cannot change map type after initialization. </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-<h2><a class="anchor" name="default">
+<h2><a class="anchor" id="default">
default</a></h2>
-lagrangian <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>lagrangian </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_atom_weight.html b/doc/USER/atc/man_atom_weight.html
new file mode 100644
index 000000000..18b0dcae6
--- /dev/null
+++ b/doc/USER/atc/man_atom_weight.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC atom_weight</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_atom_weight">fix_modify AtC atom_weight </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC atom_weight &lt;method&gt; &lt;arguments&gt;</p>
+<ul>
+<li>&lt;method&gt; = <br/>
+ value: atoms in specified group assigned constant value given <br/>
+ lattice: volume per atom for specified lattice type (e.g. fcc) and parameter <br/>
+ element: element volume divided among atoms within element <br/>
+ region: volume per atom determined based on the atom count in the MD regions and their volumes. Note: meaningful only if atoms completely fill all the regions. <br/>
+ group: volume per atom determined based on the atom count in a group and its volume<br/>
+ read_in: list of values for atoms are read-in from specified file <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc atom_weight constant myatoms 11.8 </code> <br/>
+ <code> fix_modify atc atom_weight lattice </code> <br/>
+ <code> fix_modify atc atom_weight read-in atm_wt_file.txt </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command for assigning the value of atomic weights used for atomic integration in atom-continuum coupled simulations. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Use of lattice option requires a lattice type and parameter is already specified. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>lattice </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_atomic_charge.html b/doc/USER/atc/man_atomic_charge.html
new file mode 100644
index 000000000..718f8a433
--- /dev/null
+++ b/doc/USER/atc/man_atomic_charge.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC atomic_charge</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_atomic_charge">fix_modify AtC atomic_charge </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC &lt;include | omit&gt; atomic_charge</p>
+<ul>
+<li>&lt;include | omit&gt; = switch to activiate/deactiviate inclusion of intrinsic atomic charge in <a class="el" href="namespaceATC.html" title="owned field/s: MASS_DENSITY">ATC</a> </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc compute include atomic_charge </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Determines whether AtC tracks the total charge as a finite element field </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Required for: electrostatics </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>if the atom charge is defined, default is on, otherwise default is off </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_boundary.html b/doc/USER/atc/man_boundary.html
new file mode 100644
index 000000000..3e877355f
--- /dev/null
+++ b/doc/USER/atc/man_boundary.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC boundary</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_boundary">fix_modify AtC boundary </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC boundary type &lt;atom-type-id&gt;</p>
+<ul>
+<li>&lt;atom-type-id&gt; = type id for atoms that represent a ficticious boundary internal to the FE mesh </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC boundary type ghost_atoms </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command to define the atoms that represent the ficticious boundary internal to the FE mesh. For fully overlapped MD/FE domains with periodic boundary conditions no boundary atoms should be defined. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_boundary_dynamics.html b/doc/USER/atc/man_boundary_dynamics.html
new file mode 100644
index 000000000..87696b8b4
--- /dev/null
+++ b/doc/USER/atc/man_boundary_dynamics.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC boundary_dynamics</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_boundary_dynamics">fix_modify AtC boundary_dynamics </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC boundary_dynamics &lt; on | damped_harmonic | prescribed | coupled | none &gt; [args] <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Sets different schemes for controlling boundary atoms. On will integrate the boundary atoms using the velocity-verlet algorithm. Damped harmonic uses a mass/spring/dashpot for the boundary atoms with added arguments of the damping and spring constants followed by the ratio of the boundary type mass to the desired mass. Prescribed forces the boundary atoms to follow the finite element displacement. Coupled does the same. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Boundary atoms must be specified. When using swaps between internal and boundary atoms, the initial configuration must have already correctly partitioned the two. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>prescribed on </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_boundary_faceset.html b/doc/USER/atc/man_boundary_faceset.html
new file mode 100644
index 000000000..2e96330d6
--- /dev/null
+++ b/doc/USER/atc/man_boundary_faceset.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC boundary_faceset</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_boundary_faceset">fix_modify AtC boundary_faceset </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC boundary_faceset &lt;is | add&gt; [args] </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p>fix_modify AtC boundary_faceset is obndy </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>This command species the faceset name when using a faceset to compute the MD/FE boundary fluxes. The faceset must already exist. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>This is only valid when fe_md_boundary is set to faceset. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_boundary_integral.html b/doc/USER/atc/man_boundary_integral.html
index 7f8379d9b..3e78f1296 100644
--- a/doc/USER/atc/man_boundary_integral.html
+++ b/doc/USER/atc/man_boundary_integral.html
@@ -1,26 +1,53 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC boundary_integral</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_boundary_integral">fix_modify AtC boundary_integral</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC output boundary_integral</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_boundary_integral">fix_modify AtC output boundary_integral </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer boundary_integral [field] faceset [name]<ul>
-<li>field (string) : name of hardy field</li><li>name (string) : name of faceset </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC output boundary_integral [field] faceset [name]</p>
+<ul>
+<li>field (string) : name of hardy field</li>
+<li>name (string) : name of faceset </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer boundary_integral stress faceset loop1 </code> <br>
- <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC output boundary_integral stress faceset loop1 </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file <h2><a class="anchor" name="restrictions">
+<p>Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Must be used with the hardy AtC transfer ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <h2><a class="anchor" name="related">
+<p>Must be used with the hardy/field type of AtC fix ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-<h2><a class="anchor" name="default">
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_consistent_fe_initialization.html b/doc/USER/atc/man_consistent_fe_initialization.html
new file mode 100644
index 000000000..2f3bf4a6c
--- /dev/null
+++ b/doc/USER/atc/man_consistent_fe_initialization.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC consistent_fe_initialization</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_consistent_fe_initialization">fix_modify AtC consistent_fe_initialization </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC consistent_fe_initialization &lt;on | off&gt;</p>
+<ul>
+<li>&lt;on|off&gt; = switch to activiate/deactiviate the intial setting of FE intrinsic field to match the projected MD field </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc consistent_fe_initialization on </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Determines whether AtC initializes FE intrinsic fields (e.g., temperature) to match the projected MD values. This is particularly useful for fully overlapping simulations. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Can be used with: thermal, two_temperature. Cannot be used with time filtering on. Does not include boundary nodes. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Default is off </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_contour_integral.html b/doc/USER/atc/man_contour_integral.html
index b87b2567b..c321605e8 100644
--- a/doc/USER/atc/man_contour_integral.html
+++ b/doc/USER/atc/man_contour_integral.html
@@ -1,26 +1,54 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC contour_integral</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_contour_integral">fix_modify AtC contour_integral</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC output contour_integral</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_contour_integral">fix_modify AtC output contour_integral </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer contour_integral [field] faceset [name] &lt;axis [x | y | z]&gt;<ul>
-<li>field (string) : name of hardy field</li><li>name (string) : name of faceset</li><li>axis (string) : x or y or z </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC output contour_integral [field] faceset [name] &lt;axis [x | y | z ]&gt;</p>
+<ul>
+<li>field (string) : name of hardy field</li>
+<li>name (string) : name of faceset</li>
+<li>axis (string) : x or y or z </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer contour_integral stress faceset loop1 </code> <br>
- <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC output contour_integral stress faceset loop1 </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file <h2><a class="anchor" name="restrictions">
+<p>Calculates a surface integral of the given field dotted with the outward normal of the faces and puts output in the "GLOBALS" file </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Must be used with the hardy AtC transfer ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <h2><a class="anchor" name="related">
+<p>Must be used with the hardy/field type of AtC fix ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-<h2><a class="anchor" name="default">
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_control.html b/doc/USER/atc/man_control.html
new file mode 100644
index 000000000..af0236f30
--- /dev/null
+++ b/doc/USER/atc/man_control.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC control</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_control">fix_modify AtC control </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC control &lt;physics_type&gt; &lt;solution_parameter&gt; </p>
+<p><br/>
+</p>
+<ul>
+<li>physics_type (string) = thermal | momentum<br/>
+</li>
+<li>solution_parameter (string) = max_iterations | tolerance<br/>
+</li>
+</ul>
+<p>fix_modify AtC transfer &lt;physics_type&gt; control max_iterations &lt;max_iterations&gt;<br/>
+</p>
+<ul>
+<li>max_iterations (int) = maximum number of iterations that will be used by iterative matrix solvers<br/>
+</li>
+</ul>
+<p>fix_modify AtC transfer &lt;physics_type&gt; control tolerance &lt;tolerance&gt; <br/>
+</p>
+<ul>
+<li>tolerance (float) = relative tolerance to which matrix equations will be solved<br/>
+</li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC control thermal max_iterations 10 </code> <br/>
+ <code> fix_modify AtC control momentum tolerance 1.e-5 </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Sets the numerical parameters for the matrix solvers used in the specified control algorithm. Many solution approaches require iterative solvers, and these methods enable users to provide the maximum number of iterations and the relative tolerance. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>only for be used with specific controllers : thermal, momentum <br/>
+ They are ignored if a lumped solution is requested </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>max_iterations is the number of rows in the matrix<br/>
+ tolerance is 1.e-10 </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_control_momentum.html b/doc/USER/atc/man_control_momentum.html
new file mode 100644
index 000000000..805c12567
--- /dev/null
+++ b/doc/USER/atc/man_control_momentum.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC control momentum</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_control_momentum">fix_modify AtC control momentum </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC control momentum none <br/>
+</p>
+<p>fix_modify AtC control momentum rescale &lt;frequency&gt;<br/>
+</p>
+<ul>
+<li>frequency (int) = time step frequency for applying displacement and velocity rescaling <br/>
+</li>
+</ul>
+<p>fix_modify AtC control momentum glc_displacement <br/>
+</p>
+<p>fix_modify AtC control momentum glc_velocity <br/>
+</p>
+<p>fix_modify AtC control momentum hoover <br/>
+</p>
+<p>fix_modify AtC control momentum flux [faceset face_set_id, interpolate]</p>
+<ul>
+<li>face_set_id (string) = id of boundary face set, if not specified (or not possible when the atomic domain does not line up with mesh boundaries) defaults to an atomic-quadrature approximate evaulation<br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p>fix_modify AtC control momentum glc_velocity <br/>
+ fix_modify AtC control momentum flux faceset bndy_faces <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>only to be used with specific transfers : elastic <br/>
+ rescale not valid with time filtering activated </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_control_thermal.html b/doc/USER/atc/man_control_thermal.html
new file mode 100644
index 000000000..301297f30
--- /dev/null
+++ b/doc/USER/atc/man_control_thermal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC control thermal</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_control_thermal">fix_modify AtC control thermal </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC control thermal &lt;control_type&gt; &lt;optional_args&gt;</p>
+<ul>
+<li>control_type (string) = none | rescale | hoover | flux<br/>
+</li>
+</ul>
+<p>fix_modify AtC control thermal rescale &lt;frequency&gt; <br/>
+</p>
+<ul>
+<li>frequency (int) = time step frequency for applying velocity rescaling <br/>
+</li>
+</ul>
+<p>fix_modify AtC control thermal hoover <br/>
+</p>
+<p>fix_modify AtC control thermal flux &lt;boundary_integration_type(optional)&gt; &lt;face_set_id(optional)&gt;<br/>
+</p>
+<ul>
+<li>boundary_integration_type (string) = faceset | interpolate<br/>
+</li>
+<li>face_set_id (string), optional = id of boundary face set, if not specified (or not possible when the atomic domain does not line up with mesh boundaries) defaults to an atomic-quadrature approximate evaulation, does not work with interpolate<br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC control thermal none </code> <br/>
+ <code> fix_modify AtC control thermal rescale 10 </code> <br/>
+ <code> fix_modify AtC control thermal hoover </code> <br/>
+ <code> fix_modify AtC control thermal flux </code> <br/>
+ <code> fix_modify AtC control thermal flux faceset bndy_faces </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Sets the energy exchange mechansim from the finite elements to the atoms, managed through a control algorithm. Rescale computes a scale factor for each atom to match the finite element temperature. Hoover is a Gaussian least-constraint isokinetic thermostat enforces that the nodal restricted atomic temperature matches the finite element temperature. Flux is a similar mode, but rather adds energy to the atoms based on conservation of energy. Hoover and flux allows the prescription of sources or fixed temperatures on the atoms. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>only for be used with specific transfers : thermal (rescale, hoover, flux), two_temperature (flux) <br/>
+ rescale not valid with time filtering activated </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>none<br/>
+ rescale frequency is 1<br/>
+ flux boundary_integration_type is interpolate </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_control_thermal_correction_max_iterations.html b/doc/USER/atc/man_control_thermal_correction_max_iterations.html
new file mode 100644
index 000000000..8a511019f
--- /dev/null
+++ b/doc/USER/atc/man_control_thermal_correction_max_iterations.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC control thermal correction_max_iterations</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_control_thermal_correction_max_iterations">fix_modify AtC control thermal correction_max_iterations </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC control thermal correction_max_iterations &lt;max_iterations&gt;</p>
+<ul>
+<li>max_iterations (int) = maximum number of iterations that will be used by iterative matrix solvers<br/>
+</li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC control thermal correction_max_iterations 10 </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Sets the maximum number of iterations to compute the 2nd order in time correction term for lambda with the fractional step method. The method uses the same tolerance as the controller's matrix solver. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>only for use with thermal physics using the fractional step method. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>correction_max_iterations is 20 </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_decomposition.html b/doc/USER/atc/man_decomposition.html
new file mode 100644
index 000000000..15725073d
--- /dev/null
+++ b/doc/USER/atc/man_decomposition.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC decomposition</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_decomposition">fix_modify AtC decomposition </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC decomposition &lt;type&gt;</p>
+<ul>
+<li>&lt;type&gt; = <br/>
+ replicated_memory: nodal information replicated on each processor <br/>
+ distributed_memory: only owned nodal information on processor <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc decomposition distributed_memory </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command for assigning the distribution of work and memory for parallel runs. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>replicated_memory is appropriate for simulations were the number of nodes &lt;&lt; number of atoms </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>replicated_memory </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_disp_control.html b/doc/USER/atc/man_disp_control.html
deleted file mode 100644
index 4b3dfe48a..000000000
--- a/doc/USER/atc/man_disp_control.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer momentum control</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_disp_control">fix_modify AtC transfer momentum control</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC transfer momentum control none <br>
-<p>
-fix_modify AtC transfer momentum control rescale &lt;frequency&gt;<br>
-<ul>
-<li>frequency (int) = time step frequency for applying displacement and velocity rescaling <br>
-</li></ul>
-<p>
-fix_modify AtC transfer momentum control glc_displacement <br>
-<p>
-fix_modify AtC transfer momentum control glc_velocity <br>
-<p>
-fix_modify AtC transfer momentum control flux [faceset face_set_id, interpolate]<ul>
-<li>face_set_id (string) = id of boundary face set, if not specified (or not possible when the atomic domain does not line up with mesh boundaries) defaults to an atomic-quadrature approximate evaulation<br>
- </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-fix_modify AtC transfer momentum control glc_velocity <br>
- fix_modify AtC transfer momentum control stress_flux faceset bndy_faces <br>
- <h2><a class="anchor" name="description">
-description</a></h2>
-<h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-only for be used with specific transfers : elastic <br>
- rescale not valid with time filtering activated <h2><a class="anchor" name="related">
-related</a></h2>
-<h2><a class="anchor" name="default">
-default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_electron_integration.html b/doc/USER/atc/man_electron_integration.html
index dbde3d777..b14c14d86 100644
--- a/doc/USER/atc/man_electron_integration.html
+++ b/doc/USER/atc/man_electron_integration.html
@@ -1,30 +1,56 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>ATC: fix_modify AtC extrinsic electron_integration</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_electron_integration">fix_modify AtC extrinsic electron_integration</a></h1><h2><a class="anchor" name="syntax">
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_electron_integration">fix_modify AtC extrinsic electron_integration </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC extrinsic electron_integration &lt;integration_type&gt; &lt;num_subcyle_steps(optional)&gt; <br>
+<p>fix_modify AtC extrinsic electron_integration &lt;integration_type&gt; &lt;num_subcyle_steps(optional)&gt; <br/>
+</p>
<ul>
-<li>integration_type (string) = explicit | implicit | steady <br>
-</li></ul>
-<p>
-num_subcycle_steps (int), optional = number of subcycle steps for the electron time integration<h2><a class="anchor" name="examples">
+<li>integration_type (string) = explicit | implicit | steady <br/>
+</li>
+<li>num_subcycle_steps (int), optional = number of subcycle steps for the electron time integration</li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC extrinsic electron_integration implicit </code> <br>
- <code> fix_modify AtC extrinsic electron_integration explicit 100 </code> <br>
-<h2><a class="anchor" name="description">
+<p><code> fix_modify AtC extrinsic electron_integration implicit </code> <br/>
+ <code> fix_modify AtC extrinsic electron_integration explicit 100 </code> <br/>
+</p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Switches between integration scheme for the electron temperature. The number of subcyling steps used to integrate the electron temperature 1 LAMMPS timestep can be manually adjusted to capture fast electron dynamics.<h2><a class="anchor" name="restrictions">
+<p>Switches between integration scheme for the electron temperature. The number of subcyling steps used to integrate the electron temperature 1 LAMMPS timestep can be manually adjusted to capture fast electron dynamics.</p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-For use only with two_temperature type of AtC fix ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <br>
- <h2><a class="anchor" name="default">
+<p>For use only with two_temperature type of AtC fix ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <br/>
+ </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-implicit<br>
- subcycle_steps = 1 <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>implicit<br/>
+ subcycle_steps = 1 </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_equilibrium_start.html b/doc/USER/atc/man_equilibrium_start.html
index 5aa645df6..3723cf98b 100644
--- a/doc/USER/atc/man_equilibrium_start.html
+++ b/doc/USER/atc/man_equilibrium_start.html
@@ -1,24 +1,50 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer equilibrium_start</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_equilibrium_start">fix_modify AtC transfer equilibrium_start</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC equilibrium_start</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_equilibrium_start">fix_modify AtC equilibrium_start </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer equilibrium_start &lt;on|off&gt;<h2><a class="anchor" name="examples">
+<p>fix_modify AtC equilibrium_start &lt;on|off&gt;</p>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify atc transfer equilibrium_start on </code> <br>
-<h2><a class="anchor" name="description">
+<p><code> fix_modify atc equilibrium_start on </code> <br/>
+</p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Starts filtered calculations assuming they start in equilibrium, i.e. perfect finite element force balance.<h2><a class="anchor" name="restrictions">
+<p>Starts filtered calculations assuming they start in equilibrium, i.e. perfect finite element force balance.</p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-only needed before filtering is begun<h2><a class="anchor" name="related">
+<p>only needed before filtering is begun</p>
+<h2><a class="anchor" id="related">
related</a></h2>
-see <a class="el" href="man_time_filter.html">fix_modify AtC transfer filter</a><h2><a class="anchor" name="default">
+<p>see <a class="el" href="man_time_filter.html">fix_modify AtC filter</a></p>
+<h2><a class="anchor" id="default">
default</a></h2>
-on <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>on </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_extrinsic_exchange.html b/doc/USER/atc/man_extrinsic_exchange.html
index f8337a7cc..8f6533ad6 100644
--- a/doc/USER/atc/man_extrinsic_exchange.html
+++ b/doc/USER/atc/man_extrinsic_exchange.html
@@ -1,24 +1,50 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>ATC: fix_modify AtC extrinsic exchange</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_extrinsic_exchange">fix_modify AtC extrinsic exchange</a></h1><h2><a class="anchor" name="syntax">
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_extrinsic_exchange">fix_modify AtC extrinsic exchange </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC extrinsic exchange &lt;on|off&gt;<h2><a class="anchor" name="examples">
+<p>fix_modify AtC extrinsic exchange &lt;on|off&gt;</p>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC extrinsic exchange on </code> <br>
-<h2><a class="anchor" name="description">
+<p><code> fix_modify AtC extrinsic exchange on </code> <br/>
+</p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Switches energy exchange between the MD system and electron system on and off<h2><a class="anchor" name="restrictions">
+<p>Switches energy exchange between the MD system and electron system on and off</p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Only valid for use with two_temperature type of AtC fix.<h2><a class="anchor" name="related">
+<p>Only valid for use with two_temperature type of AtC fix.</p>
+<h2><a class="anchor" id="related">
related</a></h2>
-see <a class="el" href="man_fix_atc.html">fix atc command</a><h2><a class="anchor" name="default">
+<p>see <a class="el" href="man_fix_atc.html">fix atc command</a></p>
+<h2><a class="anchor" id="default">
default</a></h2>
-on <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>on </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_fe_md_boundary.html b/doc/USER/atc/man_fe_md_boundary.html
new file mode 100644
index 000000000..06bca2b33
--- /dev/null
+++ b/doc/USER/atc/man_fe_md_boundary.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC fe_md_boundary</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_fe_md_boundary">fix_modify AtC fe_md_boundary </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC fe_md_boundary &lt;faceset | interpolate | no_boundary&gt; [args] </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc fe_md_boundary interpolate </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Specifies different methods for computing fluxes between between the MD and FE integration regions. Faceset defines a faceset separating the MD and FE regions and uses finite element face quadrature to compute the flux. Interpolate uses a reconstruction scheme to approximate the flux, which is more robust but less accurate if the MD/FE boundary does correspond to a faceset. No boundary results in no fluxes between the systems being computed. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>If faceset is used, all the AtC non-boundary atoms must lie within and completely fill the domain enclosed by the faceset. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p>see for how to specify the faceset name. </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Interpolate. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_filter_scale.html b/doc/USER/atc/man_filter_scale.html
index 606c41f17..975f87e94 100644
--- a/doc/USER/atc/man_filter_scale.html
+++ b/doc/USER/atc/man_filter_scale.html
@@ -1,28 +1,55 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer filter scale</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_filter_scale">fix_modify AtC transfer filter scale</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC filter scale</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_filter_scale">fix_modify AtC filter scale </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer filter scale &lt;scale&gt; <br>
+<p>fix_modify AtC filter scale &lt;scale&gt; <br/>
+</p>
<ul>
-<li>scale (real) = characteristic time scale of the filter <br>
-</li></ul>
-<h2><a class="anchor" name="examples">
+<li>scale (real) = characteristic time scale of the filter <br/>
+</li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer filter scale 10.0 </code> <br>
-<h2><a class="anchor" name="description">
+<p><code> fix_modify AtC filter scale 10.0 </code> <br/>
+</p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Filters the MD dynamics to construct a more appropriate continuous field. Equilibrating first filters the time derivatives without changing the dynamics to provide a better initial condition to the filtered dynamics <h2><a class="anchor" name="restrictions">
+<p>Filters the MD dynamics to construct a more appropriate continuous field. Equilibrating first filters the time derivatives without changing the dynamics to provide a better initial condition to the filtered dynamics </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-only for be used with specific transfers: thermal, two_temperature<h2><a class="anchor" name="related">
+<p>only for be used with specific transfers: thermal, two_temperature</p>
+<h2><a class="anchor" id="related">
related</a></h2>
-<a class="el" href="man_time_filter.html">fix_modify AtC transfer filter</a><h2><a class="anchor" name="default">
+<p><a class="el" href="man_time_filter.html">fix_modify AtC filter</a> <a class="el" href="man_filter_type.html">fix_modify AtC filter type</a></p>
+<h2><a class="anchor" id="default">
default</a></h2>
-0. <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>0. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_filter_type.html b/doc/USER/atc/man_filter_type.html
new file mode 100644
index 000000000..8d9dbd3d1
--- /dev/null
+++ b/doc/USER/atc/man_filter_type.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC filter type</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_filter_type">fix_modify AtC filter type </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC filter type &lt;exponential | step | no_filter&gt; <br/>
+</p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC filter type exponential </code> <br/>
+</p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Specifies the type of time filter used. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>only for be used with specific transfers: thermal, two_temperature</p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p><a class="el" href="man_time_filter.html">fix_modify AtC filter</a> <a class="el" href="man_filter_scale.html">fix_modify AtC filter scale</a></p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>No default. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_fix_atc.html b/doc/USER/atc/man_fix_atc.html
index f30b50349..d6076a091 100644
--- a/doc/USER/atc/man_fix_atc.html
+++ b/doc/USER/atc/man_fix_atc.html
@@ -1,119 +1,255 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>ATC: fix atc command</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_fix_atc">fix atc command</a></h1><h2><a class="anchor" name="syntax">
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_fix_atc">fix atc command </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix AtC transfer &lt;type&gt; &lt;parameter_file&gt;<ul>
-<li>type<br>
- = thermal : thermal coupling with fields: temperature <br>
- = two_temperature : electron-phonon coupling with field: temperature and electron_temperature <br>
- = hardy : Hardy on-the-fly post-processing (see "related" section for possible fields) <br>
-</li><li>parameter_file = name of the file with material parameters. <br>
- note: hardy does not require a parameter file </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix &lt;fixID&gt; &lt;group&gt; atc &lt;type&gt; &lt;parameter_file&gt;</p>
+<ul>
+<li>fixID = name of fix</li>
+<li>group = name of group fix is to be applied</li>
+<li>type<br/>
+ = thermal : thermal coupling with fields: temperature <br/>
+ = two_temperature : electron-phonon coupling with field: temperature and electron_temperature <br/>
+ = hardy : on-the-fly post-processing using kernel localization functions (see "related" section for possible fields) <br/>
+ = field : on-the-fly post-processing using mesh-based localization functions (see "related" section for possible fields) <br/>
+</li>
+<li>parameter_file = name of the file with material parameters. <br/>
+ note: Neither hardy nor field requires a parameter file </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer thermal Ar_thermal.dat </code> <br>
- <code> fix_modify AtC transfer hardy </code> <h2><a class="anchor" name="description">
+<p><code> fix AtC internal atc thermal Ar_thermal.dat </code> <br/>
+ <code> fix AtC internal atc two_temperature Ar_ttm.mat </code> <br/>
+ <code> fix AtC internal atc hardy </code> <br/>
+ <code> fix AtC internal atc field </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-This fix is the beginning to creating a coupled FE/MD simulation and/or an on-the-fly estimation of continuum fields. The coupled versions of this fix do Verlet integration and the Hardy/post-processing does not. After instantiating this fix, several other fix_modify commands will be needed to set up the problem, e.g. define the finite element mesh and prescribe initial and boundary conditions.<p>
-The following coupling example is typical, but non-exhaustive:<br>
-<p>
-<code> # ... commands to create and initialize the MD system <br>
-</code><p>
-<code> # initial fix to designate coupling type and group to apply it to <br>
- # tag group physics material_file <br>
- fix AtC internal atc thermal Ar_thermal.mat<br>
- <br>
- # create a uniform 12 x 2 x 2 mesh that covers region contain the group <br>
- # nx ny nz region periodicity <br>
- fix_modify AtC fem create mesh 12 2 2 mdRegion f p p<br>
- <br>
- # specify the control method for the type of coupling <br>
- # physics control_type <br>
- fix_modify AtC transfer thermal control flux <br>
- <br>
- # specify the initial values for the empirical field "temperature" <br>
- # field node_group value <br>
- fix_modify AtC transfer initial temperature all 30.<br>
- <br>
- # create an output stream for nodal fields <br>
- # filename output_frequency <br>
- fix_modify AtC transfer output atc_fe_output 100<br>
- <br>
-</code><p>
-<code> run 1000 <br>
- </code><p>
-likewise for this post-processing example: <br>
-<p>
-<code> # ... commands to create and initialize the MD system <br>
-</code><p>
-<code> # initial fix to designate post-processing and the group to apply it to <br>
- # no material file is allowed nor required <br>
- fix AtC internal atc hardy <br>
- <br>
- # create a uniform 1 x 1 x 1 mesh that covers region contain the group <br>
- # with periodicity this effectively creats a system average <br>
- fix_modify AtC fem create mesh 1 1 1 box p p p <br>
-<br>
- # change from default lagrangian map to eulerian <br>
- # refreshed every 100 steps <br>
- fix_modify AtC atom_element_map eulerian 100 <br>
- <br>
- # start with no field defined <br>
- fix_modify AtC transfer fields none <br>
- <br>
- # add mass density, potential energy density, stress and temperature <br>
- fix_modify AtC transfer fields add density energy stress temperature <br>
-<br>
- # create an output stream for nodal fields <br>
- # filename output_frequency <br>
- fix_modify AtC transfer output nvtFE 100 text <br>
-</code><p>
-<code> run 1000 <br>
- </code><p>
-Note coupling and post-processing can be combined in the same simulations using separate fixes. <br>
- For detailed exposition of the theory and algorithms please see:<br>
+<p>This fix is the beginning to creating a coupled FE/MD simulation and/or an on-the-fly estimation of continuum fields. The coupled versions of this fix do Verlet integration and the /post-processing does not. After instantiating this fix, several other fix_modify commands will be needed to set up the problem, e.g. define the finite element mesh and prescribe initial and boundary conditions.</p>
+<p>The following coupling example is typical, but non-exhaustive:<br/>
+</p>
+<p><code> # ... commands to create and initialize the MD system <br/>
+</code></p>
+<p><code> # initial fix to designate coupling type and group to apply it to <br/>
+ # tag group physics material_file <br/>
+ fix AtC internal atc thermal Ar_thermal.mat<br/>
+ <br/>
+ # create a uniform 12 x 2 x 2 mesh that covers region contain the group <br/>
+ # nx ny nz region periodicity <br/>
+ fix_modify AtC mesh create 12 2 2 mdRegion f p p<br/>
+ <br/>
+ # specify the control method for the type of coupling <br/>
+ # physics control_type <br/>
+ fix_modify AtC thermal control flux <br/>
+ <br/>
+ # specify the initial values for the empirical field "temperature" <br/>
+ # field node_group value <br/>
+ fix_modify AtC initial temperature all 30.<br/>
+ <br/>
+ # create an output stream for nodal fields <br/>
+ # filename output_frequency <br/>
+ fix_modify AtC output atc_fe_output 100<br/>
+ <br/>
+</code></p>
+<p><code> run 1000 <br/>
+ </code></p>
+<p>likewise for this post-processing example: <br/>
+</p>
+<p><code> # ... commands to create and initialize the MD system <br/>
+</code></p>
+<p><code> # initial fix to designate post-processing and the group to apply it to <br/>
+ # no material file is allowed nor required <br/>
+ fix AtC internal atc hardy <br/>
+ <br/>
+ # for hardy fix, specific kernel function (function type and range) to # be used as a localization function <br/>
+ fix AtC kernel quartic_sphere 10.0 <br/>
+ <br/>
+ # create a uniform 1 x 1 x 1 mesh that covers region contain the group <br/>
+ # with periodicity this effectively creats a system average <br/>
+ fix_modify AtC mesh create 1 1 1 box p p p <br/>
+<br/>
+ # change from default lagrangian map to eulerian <br/>
+ # refreshed every 100 steps <br/>
+ fix_modify AtC atom_element_map eulerian 100 <br/>
+ <br/>
+ # start with no field defined <br/>
+ # add mass density, potential energy density, stress and temperature <br/>
+ fix_modify AtC fields add density energy stress temperature <br/>
+<br/>
+ # create an output stream for nodal fields <br/>
+ # filename output_frequency <br/>
+ fix_modify AtC output nvtFE 100 text <br/>
+</code></p>
+<p><code> run 1000 <br/>
+ </code></p>
+<p>the mesh's linear interpolation functions can be used as the localization function <br/>
+ by using the field option: <br/>
+</p>
+<p><code> fix AtC internal atc field <br/>
+ <br/>
+ fix_modify AtC mesh create 1 1 1 box p p p <br/>
+<br/>
+ ... <br/>
+<br/>
+ </code></p>
+<p>Note coupling and post-processing can be combined in the same simulations using separate fixes. <br/>
+ For detailed exposition of the theory and algorithms please see:<br/>
+</p>
<ul>
-<li>Wagner, GJ; Jones, RE; Templeton, JA; Parks, MA. <em> An atomistic-to-continuum coupling method for heat transfer in solids. </em> Special Issue of Computer Methods and Applied Mechanics (2008) 197:3351.</li><li>Zimmerman, JA; Webb, EB; Hoyt, JJ;. Jones, RE; Klein, PA; Bammann, DJ, <em> Calculation of stress in atomistic simulation </em> Special Issue of Modelling and Simulation in Materials Science and Engineering (2004), 12:S319</li></ul>
-<p>
-Please refer to the standard finite element (FE) texts, e.g. T.J.R Hughes <em> The finite element method </em>, Dover 2003, for the basics of FE simulation.<h2><a class="anchor" name="restrictions">
+<li>Wagner, GJ; Jones, RE; Templeton, JA; Parks, MA, <em> An atomistic-to-continuum coupling method for heat transfer in solids. </em> Special Issue of Computer Methods and Applied Mechanics (2008) 197:3351. <br/>
+</li>
+<li>Zimmerman, JA; Webb, EB; Hoyt, JJ;. Jones, RE; Klein, PA; Bammann, DJ, <em> Calculation of stress in atomistic simulation. </em> Special Issue of Modelling and Simulation in Materials Science and Engineering (2004), 12:S319. <br/>
+</li>
+<li>Zimmerman, JA; Jones, RE; Templeton, JA, <em> A material frame approach for evaluating continuum variables in atomistic simulations. </em> Journal of Computational Physics (2010), 229:2364. <br/>
+</li>
+<li>Templeton, JA; Jones, RE; Wagner, GJ, <em> Application of a field-based method to spatially varying thermal transport problems in molecular dynamics. </em> Modelling and Simulation in Materials Science and Engineering (2010), 18:085007. <br/>
+</li>
+<li>Jones, RE; Templeton, JA; Wagner, GJ; Olmsted, D; Modine, JA, <em> Electron transport enhanced molecular dynamics for metals and semi-metals. </em> International Journal for Numerical Methods in Engineering (2010), 83:940. <br/>
+</li>
+<li>Templeton, JA; Jones, RE; Lee, JW; Zimmerman, JA; Wong, BM, <em> A long-range electric field solver for molecular dynamics based on atomistic-to-continuum modeling. </em> Journal of Chemical Theory and Computation (2011), 7:1736. <br/>
+</li>
+<li>Mandadapu, KK; Templeton, JA; Lee, JW, <em> Polarization as a field variable from molecular dynamics simulations. </em> Journal of Chemical Physics (2013), 139:054115. <br/>
+</li>
+</ul>
+<p>Please refer to the standard finite element (FE) texts, e.g. T.J.R Hughes <em> The finite element method </em>, Dover 2003, for the basics of FE simulation.</p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Thermal and two_temperature (coupling) types use a Verlet time-integration algorithm. The hardy type does not contain its own time-integrator and must be used with a separate fix that does contain one, e.g. nve, nvt, etc.<p>
-Currently,<ul>
-<li>the coupling is restricted to thermal physics</li><li>the FE computations are done in serial on each processor.</li></ul>
-<h2><a class="anchor" name="related">
+<p>Thermal and two_temperature (coupling) types use a Verlet time-integration algorithm. The hardy type does not contain its own time-integrator and must be used with a separate fix that does contain one, e.g. nve, nvt, etc.</p>
+<p>Currently,</p>
+<ul>
+<li>the coupling is restricted to thermal physics</li>
+<li>the FE computations are done in serial on each processor.</li>
+</ul>
+<h2><a class="anchor" id="related">
related</a></h2>
-fix_modify commands for setup: <br>
+<p>fix_modify commands for setup: <br/>
+</p>
<ul>
-<li><a class="el" href="man_fem_mesh.html">fix_modify AtC fem create mesh</a></li><li><a class="el" href="man_mesh_nodeset.html">fix_modify AtC mesh create_nodeset</a></li><li><a class="el" href="man_mesh_faceset.html">fix_modify AtC mesh create_faceset</a></li><li><a class="el" href="man_mesh_elemset.html">fix_modify AtC mesh create_elementset</a></li><li><a class="el" href="man_transfer_internal.html">fix_modify AtC transfer internal</a></li><li><a class="el" href="man_transfer_boundary.html">fix_modify AtC transfer boundary</a></li><li><a class="el" href="man_internal_quadrature.html">fix_modify AtC transfer internal_quadrature</a></li><li><a class="el" href="man_time_integration.html">fix_modify AtC transfer pmfc</a></li><li><a class="el" href="man_electron_integration.html">fix_modify AtC extrinsic electron_integration</a></li></ul>
-<p>
-fix_modify commands for boundary and initial conditions:<br>
+<li><a class="el" href="man_mesh_create.html">fix_modify AtC mesh create</a></li>
+<li><a class="el" href="man_mesh_quadrature.html">fix_modify AtC mesh quadrature</a></li>
+<li><a class="el" href="man_mesh_read.html">fix_modify AtC mesh read</a></li>
+<li><a class="el" href="man_mesh_write.html">fix_modify AtC mesh write</a></li>
+<li><a class="el" href="man_mesh_create_nodeset.html">fix_modify AtC mesh create_nodeset</a></li>
+<li><a class="el" href="man_mesh_add_to_nodeset.html">fix_modify AtC mesh add_to_nodeset</a></li>
+<li><a class="el" href="man_mesh_create_faceset_box.html">fix_modify AtC mesh create_faceset box</a></li>
+<li><a class="el" href="man_mesh_create_faceset_plane.html">fix_modify AtC mesh create_faceset plane</a></li>
+<li><a class="el" href="man_mesh_create_elementset.html">fix_modify AtC mesh create_elementset</a></li>
+<li><a class="el" href="man_mesh_delete_elements.html">fix_modify AtC mesh delete_elements</a></li>
+<li><a class="el" href="man_mesh_nodeset_to_elementset.html">fix_modify AtC mesh nodeset_to_elementset</a></li>
+<li><a class="el" href="man_boundary.html">fix_modify AtC boundary</a></li>
+<li><a class="el" href="man_internal_quadrature.html">fix_modify AtC internal_quadrature</a></li>
+<li><a class="el" href="man_thermal_time_integration.html">fix_modify AtC time_integration (thermal)</a></li>
+<li><a class="el" href="man_momentum_time_integration.html">fix_modify AtC time_integration (momentum)</a></li>
+<li><a class="el" href="man_electron_integration.html">fix_modify AtC extrinsic electron_integration</a></li>
+<li><a class="el" href="man_internal_element_set.html">fix_modify AtC internal_element_set</a></li>
+<li><a class="el" href="man_decomposition.html">fix_modify AtC decomposition</a></li>
+</ul>
+<p>fix_modify commands for boundary and initial conditions:<br/>
+</p>
<ul>
-<li><a class="el" href="man_initial.html">fix_modify AtC transfer initial</a></li><li><a class="el" href="man_fix_nodes.html">fix_modify AtC transfer fix</a></li><li><a class="el" href="man_unfix_nodes.html">fix_modify AtC transfer unfix</a></li><li><a class="el" href="man_fix_flux.html">fix_modify AtC transfer fix_flux</a></li><li><a class="el" href="man_unfix_flux.html">fix_modify AtC transfer unfix_flux</a></li><li><a class="el" href="man_source.html">fix_modify AtC transfer source</a></li><li><a class="el" href="man_remove_source.html">fix_modify AtC transfer remove_source</a></li></ul>
-<p>
-fix_modify commands for control and filtering: <br>
+<li><a class="el" href="man_initial.html">fix_modify AtC initial</a></li>
+<li><a class="el" href="man_fix_nodes.html">fix_modify AtC fix</a></li>
+<li><a class="el" href="man_unfix_nodes.html">fix_modify AtC unfix</a></li>
+<li><a class="el" href="man_fix_flux.html">fix_modify AtC fix_flux</a></li>
+<li><a class="el" href="man_unfix_flux.html">fix_modify AtC unfix_flux</a></li>
+<li><a class="el" href="man_source.html">fix_modify AtC source</a></li>
+<li><a class="el" href="man_remove_source.html">fix_modify AtC remove_source</a></li>
+</ul>
+<p>fix_modify commands for control and filtering: <br/>
+</p>
<ul>
-<li><a class="el" href="man_thermal_control.html">fix_modify AtC transfer thermal control</a></li><li><a class="el" href="man_time_filter.html">fix_modify AtC transfer filter</a></li><li><a class="el" href="man_filter_scale.html">fix_modify AtC transfer filter scale</a></li><li><a class="el" href="man_equilibrium_start.html">fix_modify AtC transfer equilibrium_start</a></li><li><a class="el" href="man_extrinsic_exchange.html">fix_modify AtC extrinsic exchange</a></li></ul>
-<p>
-fix_modify commands for output: <br>
+<li><a class="el" href="man_control.html">fix_modify AtC control</a></li>
+<li><a class="el" href="man_control_thermal.html">fix_modify AtC control thermal</a></li>
+<li><a class="el" href="man_control_thermal_correction_max_iterations.html">fix_modify AtC control thermal correction_max_iterations</a></li>
+<li><a class="el" href="man_control_momentum.html">fix_modify AtC control momentum</a></li>
+<li><a class="el" href="man_localized_lambda.html">fix_modify AtC control localized_lambda</a></li>
+<li><a class="el" href="man_lumped_lambda_solve.html">fix_modify AtC control lumped_lambda_solve</a></li>
+<li><a class="el" href="man_mask_direction.html">fix_modify AtC control mask_direction</a></li>
+<li><a class="el" href="man_time_filter.html">fix_modify AtC filter</a></li>
+<li><a class="el" href="man_filter_scale.html">fix_modify AtC filter scale</a></li>
+<li><a class="el" href="man_filter_type.html">fix_modify AtC filter type</a></li>
+<li><a class="el" href="man_equilibrium_start.html">fix_modify AtC equilibrium_start</a></li>
+<li><a class="el" href="man_extrinsic_exchange.html">fix_modify AtC extrinsic exchange</a></li>
+<li>man_charge_control</li>
+<li><a class="el" href="man_poisson_solver.html">fix_modify AtC poisson_solver</a></li>
+</ul>
+<p>fix_modify commands for output: <br/>
+</p>
<ul>
-<li><a class="el" href="man_transfer_output.html">fix_modify AtC transfer output</a></li><li><a class="el" href="man_transfer_atomic_output.html">fix_modify AtC transfer atomic_output</a></li><li><a class="el" href="man_mesh_output.html">fix_modify AtC mesh output</a></li><li><a class="el" href="man_write_restart.html">fix_modify AtC transfer write_restart</a></li><li><a class="el" href="man_read_restart.html">fix_modify AtC transfer read_restart</a></li></ul>
-<p>
-fix_modify commands for post-processing: <br>
+<li><a class="el" href="man_output.html">fix_modify AtC output</a></li>
+<li><a class="el" href="man_output_nodeset.html">fix_modify AtC output nodeset</a></li>
+<li><a class="el" href="man_output_elementset.html">fix_modify AtC output elementset</a></li>
+<li><a class="el" href="man_boundary_integral.html">fix_modify AtC output boundary_integral</a></li>
+<li><a class="el" href="man_contour_integral.html">fix_modify AtC output contour_integral</a></li>
+<li><a class="el" href="man_mesh_output.html">fix_modify AtC mesh output</a></li>
+<li><a class="el" href="man_write_restart.html">fix_modify AtC write_restart</a></li>
+<li><a class="el" href="man_read_restart.html">fix_modify AtC read_restart</a></li>
+</ul>
+<p>fix_modify commands for post-processing: <br/>
+</p>
<ul>
-<li><a class="el" href="man_hardy_fields.html">fix_modify AtC transfer fields</a></li><li><a class="el" href="man_hardy_gradients.html">fix_modify AtC transfer gradients</a></li><li><a class="el" href="man_hardy_rates.html">fix_modify AtC transfer rates</a></li><li><a class="el" href="man_hardy_computes.html">fix_modify AtC transfer computes</a></li><li><a class="el" href="man_hardy_set.html">fix_modify AtC set</a></li><li><a class="el" href="man_hardy_on_the_fly.html">fix_modify AtC transfer on_the_fly</a></li><li><a class="el" href="man_boundary_integral.html">fix_modify AtC boundary_integral</a></li><li><a class="el" href="man_contour_integral.html">fix_modify AtC contour_integral</a></li></ul>
-<p>
-miscellaneous fix_modify commands: <br>
+<li><a class="el" href="man_hardy_kernel.html">fix_modify AtC kernel</a></li>
+<li><a class="el" href="man_hardy_fields.html">fix_modify AtC fields</a></li>
+<li><a class="el" href="man_hardy_gradients.html">fix_modify AtC gradients</a></li>
+<li><a class="el" href="man_hardy_rates.html">fix_modify AtC rates</a></li>
+<li><a class="el" href="man_hardy_computes.html">fix_modify AtC computes</a></li>
+<li><a class="el" href="man_hardy_on_the_fly.html">fix_modify AtC on_the_fly</a></li>
+<li><a class="el" href="man_pair_interactions.html">fix_modify AtC pair_interactions/bond_interactions</a></li>
+<li><a class="el" href="man_sample_frequency.html">fix_modify AtC sample_frequency</a></li>
+<li><a class="el" href="man_set.html">fix_modify AtC set</a></li>
+</ul>
+<p>miscellaneous fix_modify commands: <br/>
+</p>
<ul>
-<li><a class="el" href="man_atom_element_map.html">fix_modify AtC transfer atom_element_map</a></li><li><a class="el" href="man_neighbor_reset_frequency.html">fix_modify AtC transfer neighbor_reset_frequency</a></li></ul>
-<p>
-Note: a set of example input files with the attendant material files are included with this package <h2><a class="anchor" name="default">
+<li><a class="el" href="man_atom_element_map.html">fix_modify AtC atom_element_map</a></li>
+<li><a class="el" href="man_atom_weight.html">fix_modify AtC atom_weight</a></li>
+<li><a class="el" href="man_write_atom_weights.html">fix_modify AtC write_atom_weights</a></li>
+<li><a class="el" href="man_reset_time.html">fix_modify AtC reset_time</a></li>
+<li><a class="el" href="man_reset_atomic_reference_positions.html">fix_modify AtC reset_atomic_reference_positions</a></li>
+<li><a class="el" href="man_fe_md_boundary.html">fix_modify AtC fe_md_boundary</a></li>
+<li><a class="el" href="man_boundary_faceset.html">fix_modify AtC boundary_faceset</a></li>
+<li><a class="el" href="man_consistent_fe_initialization.html">fix_modify AtC consistent_fe_initialization</a></li>
+<li><a class="el" href="man_mass_matrix.html">fix_modify AtC mass_matrix</a></li>
+<li><a class="el" href="man_material.html">fix_modify AtC material</a></li>
+<li><a class="el" href="man_atomic_charge.html">fix_modify AtC atomic_charge</a></li>
+<li><a class="el" href="man_source_integration.html">fix_modify AtC source_integration</a></li>
+<li><a class="el" href="man_temperature_definition.html">fix_modify AtC temperature_definition</a></li>
+<li><a class="el" href="man_track_displacement.html">fix_modify AtC track_displacement</a></li>
+<li><a class="el" href="man_boundary_dynamics.html">fix_modify AtC boundary_dynamics</a></li>
+<li><a class="el" href="man_add_species.html">fix_modify AtC add_species</a></li>
+<li><a class="el" href="man_add_molecule.html">fix_modify AtC add_molecule</a></li>
+<li><a class="el" href="man_remove_species.html">fix_modify AtC remove_species</a></li>
+<li><a class="el" href="man_remove_molecule.html">fix_modify AtC remove_molecule</a></li>
+</ul>
+<p>Note: a set of example input files with the attendant material files are included with this package </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_fix_flux.html b/doc/USER/atc/man_fix_flux.html
index 44fdd7348..d8369a878 100644
--- a/doc/USER/atc/man_fix_flux.html
+++ b/doc/USER/atc/man_fix_flux.html
@@ -1,26 +1,53 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer fix_flux</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_fix_flux">fix_modify AtC transfer fix_flux</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC fix_flux</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_fix_flux">fix_modify AtC fix_flux </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer fix_flux &lt;field&gt; &lt;face_set&gt; &lt;value | function&gt;<ul>
-<li>&lt;field&gt; = field name valid for type of physics, temperature | electron_temperature</li><li>&lt;face_set&gt; = name of set of element faces </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC fix_flux &lt;field&gt; &lt;face_set&gt; &lt;value | function&gt;</p>
+<ul>
+<li>&lt;field&gt; = field name valid for type of physics, temperature | electron_temperature</li>
+<li>&lt;face_set&gt; = name of set of element faces </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify atc transfer fix_flux temperature faceSet 10.0 </code> <br>
-<h2><a class="anchor" name="description">
+<p><code> fix_modify atc fix_flux temperature faceSet 10.0 </code> <br/>
+</p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Command for fixing normal fluxes e.g. heat_flux. This command only prescribes the normal component of the physical flux, e.g. heat (energy) flux. The units are in AtC units, i.e. derived from the LAMMPS length, time, and mass scales. <h2><a class="anchor" name="restrictions">
+<p>Command for fixing normal fluxes e.g. heat_flux. This command only prescribes the normal component of the physical flux, e.g. heat (energy) flux. The units are in AtC units, i.e. derived from the LAMMPS length, time, and mass scales. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Only normal fluxes (Neumann data) can be prescribed. <h2><a class="anchor" name="related">
+<p>Only normal fluxes (Neumann data) can be prescribed. </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-see <a class="el" href="man_unfix_flux.html">fix_modify AtC transfer unfix_flux</a> <h2><a class="anchor" name="default">
+<p>see <a class="el" href="man_unfix_flux.html">fix_modify AtC unfix_flux</a> </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-<hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_fix_nodes.html b/doc/USER/atc/man_fix_nodes.html
index 788e40d75..cf5c93590 100644
--- a/doc/USER/atc/man_fix_nodes.html
+++ b/doc/USER/atc/man_fix_nodes.html
@@ -1,27 +1,56 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer fix</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_fix_nodes">fix_modify AtC transfer fix</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC fix</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_fix_nodes">fix_modify AtC fix </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer fix &lt;field&gt; &lt;nodeset&gt; &lt;constant | function&gt;<ul>
-<li>&lt;field&gt; = field name valid for type of physics</li><li>&lt;nodeset&gt; = name of set of nodes to apply boundary condition</li><li>&lt;constant | function&gt; = value or name of function followed by its parameters </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC fix &lt;field&gt; &lt;nodeset&gt; &lt;constant | function&gt;</p>
+<ul>
+<li>&lt;field&gt; = field name valid for type of physics</li>
+<li>&lt;nodeset&gt; = name of set of nodes to apply boundary condition</li>
+<li>&lt;constant | function&gt; = value or name of function followed by its parameters </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer fix temperature groupNAME 10. </code> <br>
- <code> fix_modify AtC transfer fix temperature groupNAME 0 0 0 10.0 0 0 1.0 </code> <br>
- <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC fix temperature groupNAME 10. </code> <br/>
+ <code> fix_modify AtC fix temperature groupNAME 0 0 0 10.0 0 0 1.0 </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Creates a constraint on the values of the specified field at specified nodes. <h2><a class="anchor" name="restrictions">
+<p>Creates a constraint on the values of the specified field at specified nodes. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-keyword 'all' reserved in nodeset name <h2><a class="anchor" name="related">
+<p>keyword 'all' reserved in nodeset name </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-see <a class="el" href="man_unfix_nodes.html">fix_modify AtC transfer unfix</a> <h2><a class="anchor" name="default">
+<p>see <a class="el" href="man_unfix_nodes.html">fix_modify AtC unfix</a> </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_hardy_computes.html b/doc/USER/atc/man_hardy_computes.html
index 5eba042b9..c16550742 100644
--- a/doc/USER/atc/man_hardy_computes.html
+++ b/doc/USER/atc/man_hardy_computes.html
@@ -1,38 +1,67 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer computes</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_hardy_computes">fix_modify AtC transfer computes</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC computes</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_hardy_computes">fix_modify AtC computes </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer computes &lt;add | delete&gt; [per-atom compute id] &lt;volume | number&gt; <br>
+<p>fix_modify AtC computes &lt;add | delete&gt; [per-atom compute id] &lt;volume | number&gt; <br/>
+</p>
<ul>
-<li>add | delete (keyword) = add or delete the calculation of an equivalent continuum field for the specified per-atom compute as volume or number density quantity <br>
-</li><li>per-atom compute id = name/id for per-atom compute, fields can be calculated for all per-atom computes available from LAMMPS <br>
-</li><li>volume | number (keyword) = field created is a per-unit-volume quantity or a per-atom quantity as weighted by kernel functions <br>
-</li></ul>
-<h2><a class="anchor" name="examples">
+<li>add | delete (keyword) = add or delete the calculation of an equivalent continuum field for the specified per-atom compute as volume or number density quantity <br/>
+</li>
+<li>per-atom compute id = name/id for per-atom compute, fields can be calculated for all per-atom computes available from LAMMPS <br/>
+</li>
+<li>volume | number (keyword) = field created is a per-unit-volume quantity or a per-atom quantity as weighted by kernel functions <br/>
+</li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> compute virial all stress/atom </code> <br>
- <code> fix_modify AtC transfer computes add virial volume </code> <br>
- <code> fix_modify AtC transfer computes delete virial </code> <br>
- <br>
- <code> compute centrosymmetry all centro/atom </code> <br>
- <code> fix_modify AtC transfer computes add centrosymmetry number </code> <br>
- <h2><a class="anchor" name="description">
+<p><code> compute virial all stress/atom </code> <br/>
+ <code> fix_modify AtC computes add virial volume </code> <br/>
+ <code> fix_modify AtC computes delete virial </code> <br/>
+ <br/>
+ <code> compute centrosymmetry all centro/atom </code> <br/>
+ <code> fix_modify AtC computes add centrosymmetry number </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Calculates continuum fields corresponding to specified per-atom computes created by LAMMPS <br>
- <h2><a class="anchor" name="restrictions">
+<p>Calculates continuum fields corresponding to specified per-atom computes created by LAMMPS <br/>
+ </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Must be used with the hardy AtC transfer ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <br>
- Per-atom compute must be specified before corresponding continuum field can be requested <br>
- <h2><a class="anchor" name="related">
+<p>Must be used with the hardy/field type of AtC fix ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <br/>
+ Per-atom compute must be specified before corresponding continuum field can be requested <br/>
+ </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-See manual page for compute <h2><a class="anchor" name="default">
+<p>See manual page for compute </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-No defaults exist for this command <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>No defaults exist for this command </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_hardy_fields.html b/doc/USER/atc/man_hardy_fields.html
index fd23662f8..1f55fd5e3 100644
--- a/doc/USER/atc/man_hardy_fields.html
+++ b/doc/USER/atc/man_hardy_fields.html
@@ -1,46 +1,83 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer fields</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_hardy_fields">fix_modify AtC transfer fields</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_hardy_fields">fix_modify AtC fields </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer fields &lt;all | none&gt; <br>
- fix_modify AtC transfer fields &lt;add | delete&gt; &lt;list_of_fields&gt; <br>
+<p>fix_modify AtC fields &lt;all | none&gt; <br/>
+ fix_modify AtC fields &lt;add | delete&gt; &lt;list_of_fields&gt; <br/>
+</p>
<ul>
-<li>all | none (keyword) = output all or no fields <br>
-</li><li>add | delete (keyword) = add or delete the listed output fields <br>
-</li><li>fields (keyword) = <br>
- density : mass per unit volume <br>
- displacement : displacement vector <br>
- momentum : momentum per unit volume <br>
- velocity : defined by momentum divided by density <br>
- projected_velocity : simple kernel estimation of atomic velocities <br>
- temperature : temperature derived from the relative atomic kinetic energy (as done by Hardy) <br>
- kinetic_temperature : temperature derived from the full kinetic energy <br>
- energy : total energy (potential + kinetic) per unit volume <br>
- number_density : simple kernel estimation of number of atoms per unit volume <br>
- stress : Cauchy stress tensor for eulerian analysis (atom_element_map), or 1st Piola-Kirchhoff stress tensor for lagrangian analysis <br>
- transformed_stress : 1st Piola-Kirchhoff stress tensor for eulerian analysis (atom_element_map), or Cauchy stress tensor for lagrangian analysis <br>
- heat_flux : spatial heat flux vector for eulerian, or referential heat flux vector for lagrangian <br>
- </li></ul>
-<h2><a class="anchor" name="examples">
+<li>all | none (keyword) = output all or no fields <br/>
+</li>
+<li>add | delete (keyword) = add or delete the listed output fields <br/>
+</li>
+<li>fields (keyword) = <br/>
+ density : mass per unit volume <br/>
+ displacement : displacement vector <br/>
+ momentum : momentum per unit volume <br/>
+ velocity : defined by momentum divided by density <br/>
+ projected_velocity : simple kernel estimation of atomic velocities <br/>
+ temperature : temperature derived from the relative atomic kinetic energy (as done by ) <br/>
+ kinetic_temperature : temperature derived from the full kinetic energy <br/>
+ number_density : simple kernel estimation of number of atoms per unit volume <br/>
+ stress : Cauchy stress tensor for eulerian analysis (atom_element_map), or 1st Piola-Kirchhoff stress tensor for lagrangian analysis <br/>
+ transformed_stress : 1st Piola-Kirchhoff stress tensor for eulerian analysis (atom_element_map), or Cauchy stress tensor for lagrangian analysis <br/>
+ heat_flux : spatial heat flux vector for eulerian, or referential heat flux vector for lagrangian <br/>
+ potential_energy : potential energy per unit volume <br/>
+ kinetic_energy : kinetic energy per unit volume <br/>
+ thermal_energy : thermal energy (kinetic energy - continuum kinetic energy) per unit volume <br/>
+ internal_energy : total internal energy (potential + thermal) per unit volume <br/>
+ energy : total energy (potential + kinetic) per unit volume <br/>
+ number_density : number of atoms per unit volume <br/>
+ eshelby_stress: configurational stress (energy-momentum) tensor defined by Eshelby [References: Philos. Trans. Royal Soc. London A, Math. Phys. Sci., Vol. 244, No. 877 (1951) pp. 87-112; J. Elasticity, Vol. 5, Nos. 3-4 (1975) pp. 321-335] <br/>
+ vacancy_concentration: volume fraction of vacancy content <br/>
+ type_concentration: volume fraction of a specific atom type <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer fields add velocity temperature </code> <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC fields add velocity temperature </code> </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Allows modification of the fields calculated and output by the Hardy transfer class. The commands are cumulative, e.g.<br>
- <code> fix_modify AtC transfer fields none </code> <br>
- followed by <br>
- <code> fix_modify AtC transfer fields add velocity temperature </code> <br>
- will only output the velocity and temperature fields. <h2><a class="anchor" name="restrictions">
+<p>Allows modification of the fields calculated and output by the transfer class. The commands are cumulative, e.g.<br/>
+ <code> fix_modify AtC fields none </code> <br/>
+ followed by <br/>
+ <code> fix_modify AtC fields add velocity temperature </code> <br/>
+ will only output the velocity and temperature fields. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Must be used with the hardy AtC transfer, see <a class="el" href="man_fix_atc.html">fix atc command</a>. Currently, the stress and heat flux formulas are only correct for central force potentials, e.g. Lennard-Jones and EAM but not Stillinger-Weber. <h2><a class="anchor" name="related">
+<p>Must be used with the hardy/field type of AtC fix, see <a class="el" href="man_fix_atc.html">fix atc command</a>. Currently, the stress and heat flux formulas are only correct for central force potentials, e.g. Lennard-Jones and EAM but not Stillinger-Weber. </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-See <a class="el" href="man_hardy_gradients.html">fix_modify AtC transfer gradients</a> , <a class="el" href="man_hardy_rates.html">fix_modify AtC transfer rates</a> and <a class="el" href="man_hardy_computes.html">fix_modify AtC transfer computes</a> <h2><a class="anchor" name="default">
+<p>See <a class="el" href="man_hardy_gradients.html">fix_modify AtC gradients</a> , <a class="el" href="man_hardy_rates.html">fix_modify AtC rates</a> and <a class="el" href="man_hardy_computes.html">fix_modify AtC computes</a> </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-All fields are output by default <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>By default, no fields are output </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_hardy_gradients.html b/doc/USER/atc/man_hardy_gradients.html
index caeb8b174..708fecbca 100644
--- a/doc/USER/atc/man_hardy_gradients.html
+++ b/doc/USER/atc/man_hardy_gradients.html
@@ -1,30 +1,57 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer gradients</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_hardy_gradients">fix_modify AtC transfer gradients</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC gradients</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_hardy_gradients">fix_modify AtC gradients </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer gradients &lt;add | delete&gt; &lt;list_of_fields&gt; <br>
+<p>fix_modify AtC gradients &lt;add | delete&gt; &lt;list_of_fields&gt; <br/>
+</p>
<ul>
-<li>add | delete (keyword) = add or delete the calculation of gradients for the listed output fields <br>
-</li><li>fields (keyword) = <br>
- gradients can be calculated for all fields listed in <a class="el" href="man_hardy_fields.html">fix_modify AtC transfer fields</a></li></ul>
-<h2><a class="anchor" name="examples">
+<li>add | delete (keyword) = add or delete the calculation of gradients for the listed output fields <br/>
+</li>
+<li>fields (keyword) = <br/>
+ gradients can be calculated for all fields listed in <a class="el" href="man_hardy_fields.html">fix_modify AtC fields</a></li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer gradients add temperature velocity stress </code> <br>
- <code> fix_modify AtC transfer gradients delete velocity </code> <br>
- <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC gradients add temperature velocity stress </code> <br/>
+ <code> fix_modify AtC gradients delete velocity </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Requests calculation and ouput of gradients of the fields from the Hardy transfer class. These gradients will be with regard to spatial or material coordinate for eulerian or lagrangian analysis, respectively, as specified by atom_element_map (see <a class="el" href="man_atom_element_map.html">fix_modify AtC transfer atom_element_map</a> ) <h2><a class="anchor" name="restrictions">
+<p>Requests calculation and ouput of gradients of the fields from the transfer class. These gradients will be with regard to spatial or material coordinate for eulerian or lagrangian analysis, respectively, as specified by atom_element_map (see <a class="el" href="man_atom_element_map.html">fix_modify AtC atom_element_map</a> ) </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Must be used with the hardy AtC transfer ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <h2><a class="anchor" name="related">
+<p>Must be used with the hardy/field type of AtC fix ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-<h2><a class="anchor" name="default">
+<h2><a class="anchor" id="default">
default</a></h2>
-No gradients are calculated by default <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>No gradients are calculated by default </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_hardy_kernel.html b/doc/USER/atc/man_hardy_kernel.html
index 20c9410e5..3d81b367d 100644
--- a/doc/USER/atc/man_hardy_kernel.html
+++ b/doc/USER/atc/man_hardy_kernel.html
@@ -1,36 +1,65 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>ATC: fix_modify AtC kernel</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_hardy_kernel">fix_modify AtC kernel</a></h1><h2><a class="anchor" name="syntax">
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_hardy_kernel">fix_modify AtC kernel </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer kernel &lt;type&gt; &lt;parameters&gt;<ul>
-<li>type (keyword) = mesh, step, cell, cubic_cylinder, cubic_sphere, quartic_cylinder, quartic_sphere <br>
-</li><li>parameters :<br>
- mesh = none<br>
- step = radius (double) <br>
- cell = hx, hy, hz (double) or h (double) <br>
- cubic_cylinder = radius (double) <br>
- cubic_sphere = radius (double) <br>
- quartic_cylinder = radius (double) <br>
- quartic_sphere = radius (double) <br>
- </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC kernel &lt;type&gt; &lt;parameters&gt;</p>
+<ul>
+<li>type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere, quartic_bar, quartic_cylinder, quartic_sphere <br/>
+</li>
+<li>parameters :<br/>
+ step = radius (double) <br/>
+ cell = hx, hy, hz (double) or h (double) <br/>
+ cubic_bar = half-width (double) <br/>
+ cubic_cylinder = radius (double) <br/>
+ cubic_sphere = radius (double) <br/>
+ quartic_bar = half-width (double) <br/>
+ quartic_cylinder = radius (double) <br/>
+ quartic_sphere = radius (double) <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-fix_modify AtC transfer kernel cell 1.0 1.0 1.0 <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC kernel cell 1.0 1.0 1.0 </code> <br/>
+ <code> fix_modify AtC kernel quartic_sphere 10.0 </code> </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-<h2><a class="anchor" name="restrictions">
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Must be used with the hardy AtC transfer <br>
- For cylinder kernel types, cylindrical axis is assumed to be in z-direction <br>
- ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <h2><a class="anchor" name="related">
+<p>Must be used with the hardy AtC fix <br/>
+ For bar kernel types, half-width oriented along x-direction <br/>
+ For cylinder kernel types, cylindrical axis is assumed to be in z-direction <br/>
+ ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-<h2><a class="anchor" name="default">
+<h2><a class="anchor" id="default">
default</a></h2>
-Default to the mesh based kernel <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>No default </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_hardy_on_the_fly.html b/doc/USER/atc/man_hardy_on_the_fly.html
index 4d9645f1a..d140cf684 100644
--- a/doc/USER/atc/man_hardy_on_the_fly.html
+++ b/doc/USER/atc/man_hardy_on_the_fly.html
@@ -1,34 +1,60 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer on_the_fly</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_hardy_on_the_fly">fix_modify AtC transfer on_the_fly</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC on_the_fly</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_hardy_on_the_fly">fix_modify AtC on_the_fly </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer on_the_fly &lt;bond | kernel&gt; &lt;optional on | off&gt; <br>
+<p>fix_modify AtC on_the_fly &lt;bond | kernel&gt; &lt;optional on | off&gt; <br/>
+ - bond | kernel (keyword) = specifies on-the-fly calculation of bond or kernel matrix elements <br/>
+</p>
<ul>
-<li>bond | kernel (keyword) = specifies on-the-fly calculation of bond or kernel matrix elements <br>
-</li><li>on | off (keyword) = activate or discontinue on-the-fly mode <br>
-</li></ul>
-<h2><a class="anchor" name="examples">
+<li>on | off (keyword) = activate or discontinue on-the-fly mode <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer on_the_fly bond on </code> <br>
- <code> fix_modify AtC transfer on_the_fly kernel </code> <br>
- <code> fix_modify AtC transfer on_the_fly kernel off </code> <br>
- <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC on_the_fly bond on </code> <br/>
+ <code> fix_modify AtC on_the_fly kernel </code> <br/>
+ <code> fix_modify AtC on_the_fly kernel off </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Overrides normal mode of pre-calculating and storing bond pair-to-node and kernel atom-to-node matrices. If activated, will calculate elements of these matrices during repeated calls of field computations (i.e. "on-the-fly") and not store them for future use. <br>
- on flag is optional - if omitted, on_the_fly will be activated for the specified matrix. Can be deactivated using off flag. <br>
- <h2><a class="anchor" name="restrictions">
+<p>Overrides normal mode of pre-calculating and storing bond pair-to-node a nd kernel atom-to-node matrices. If activated, will calculate elements of t hese matrices during repeated calls of field computations (i.e. "on-the-fly") and not store them for future use. <br/>
+ on flag is optional - if omitted, on_the_fly will be activated for the s pecified matrix. Can be deactivated using off flag. <br/>
+ </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Must be used with the hardy AtC transfer ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <h2><a class="anchor" name="related">
+<p>Must be used with the hardy/field type of AtC fix ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-<h2><a class="anchor" name="default">
+<h2><a class="anchor" id="default">
default</a></h2>
-By default, on-the-fly calculation is not active (i.e. off). However, code does a memory allocation check to determine if it can store all needed bond and kernel matrix elements. If this allocation fails, on-the-fly is activated. <br>
- <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>By default, on-the-fly calculation is not active (i.e. off). However, code does a memory allocation check to determine if it can store all needed bond and kernel matrix ele ments. If this allocation fails, on-the-fly is activated. <br/>
+ </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_hardy_rates.html b/doc/USER/atc/man_hardy_rates.html
index f8d002d32..ab0315cb6 100644
--- a/doc/USER/atc/man_hardy_rates.html
+++ b/doc/USER/atc/man_hardy_rates.html
@@ -1,31 +1,58 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer rates</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_hardy_rates">fix_modify AtC transfer rates</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC rates</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_hardy_rates">fix_modify AtC rates </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer rates &lt;add | delete&gt; &lt;list_of_fields&gt; <br>
+<p>fix_modify AtC rates &lt;add | delete&gt; &lt;list_of_fields&gt; <br/>
+</p>
<ul>
-<li>add | delete (keyword) = add or delete the calculation of rates (time derivatives) for the listed output fields <br>
-</li><li>fields (keyword) = <br>
- rates can be calculated for all fields listed in <a class="el" href="man_hardy_fields.html">fix_modify AtC transfer fields</a></li></ul>
-<h2><a class="anchor" name="examples">
+<li>add | delete (keyword) = add or delete the calculation of rates (time derivatives) for the listed output fields <br/>
+</li>
+<li>fields (keyword) = <br/>
+ rates can be calculated for all fields listed in <a class="el" href="man_hardy_fields.html">fix_modify AtC fields</a></li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer rates add temperature velocity stress </code> <br>
- <code> fix_modify AtC transfer rates delete stress </code> <br>
- <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC rates add temperature velocity stress </code> <br/>
+ <code> fix_modify AtC rates delete stress </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Requests calculation and ouput of rates (time derivatives) of the fields from the Hardy transfer class. For eulerian analysis (see <a class="el" href="man_atom_element_map.html">fix_modify AtC transfer atom_element_map</a> ), these rates are the partial time derivatives of the nodal fields, not the full (material) time derivatives. <br>
- <h2><a class="anchor" name="restrictions">
+<p>Requests calculation and ouput of rates (time derivatives) of the fields from the transfer class. For eulerian analysis (see <a class="el" href="man_atom_element_map.html">fix_modify AtC atom_element_map</a> ), these rates are the partial time derivatives of the nodal fields, not the full (material) time derivatives. <br/>
+ </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-Must be used with the hardy AtC transfer ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <h2><a class="anchor" name="related">
+<p>Must be used with the hardy/field type of AtC fix ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-<h2><a class="anchor" name="default">
+<h2><a class="anchor" id="default">
default</a></h2>
-No rates are calculated by default <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>No rates are calculated by default </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_hardy_set.html b/doc/USER/atc/man_hardy_set.html
deleted file mode 100644
index 1f71fb720..000000000
--- a/doc/USER/atc/man_hardy_set.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC set</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_hardy_set">fix_modify AtC set</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC transfer set reference_potential_energy &lt;value&gt;<ul>
-<li>value (double) : optional user specified zero point for PE </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify AtC transfer set reference_potential_energy </code> <br>
- <code> fix_modify AtC transfer set reference_potential_energy -0.05 </code> <br>
- <h2><a class="anchor" name="description">
-description</a></h2>
-Used to set various quantities for the post-processing algorithms. Currently it only sets the zero point for the potential energy density using the value provided for all nodes, or from the current configuration of the lattice if no value is provided <h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-Must be used with the hardy AtC transfer ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) <h2><a class="anchor" name="related">
-related</a></h2>
-<h2><a class="anchor" name="default">
-default</a></h2>
-Defaults to lammps zero point i.e. isolated atoms <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_initial.html b/doc/USER/atc/man_initial.html
index 73438c925..c0a0be385 100644
--- a/doc/USER/atc/man_initial.html
+++ b/doc/USER/atc/man_initial.html
@@ -1,25 +1,51 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer initial</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_initial">fix_modify AtC transfer initial</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC initial</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_initial">fix_modify AtC initial </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer initial &lt;field&gt; &lt;nodeset&gt; &lt;constant | function&gt;<ul>
-<li>&lt;field&gt; = field name valid for type of physics, temperature | electron_temperature</li><li>&lt;nodeset&gt; = name of set of nodes to apply boundary condition</li><li>&lt;constant | function&gt; = value or name of function followed by its parameters </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC initial &lt;field&gt; &lt;nodeset&gt; &lt;constant | function&gt;</p>
+<ul>
+<li>&lt;field&gt; = field name valid for type of physics, temperature | electron_temperature</li>
+<li>&lt;nodeset&gt; = name of set of nodes to apply initial condition</li>
+<li>&lt;constant | function&gt; = value or name of function followed by its parameters </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify atc transfer initial temperature groupNAME 10. </code> <h2><a class="anchor" name="description">
+<p><code> fix_modify atc initial temperature groupNAME 10. </code> </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Sets the initial values for the specified field at the specified nodes. <h2><a class="anchor" name="restrictions">
+<p>Sets the initial values for the specified field at the specified nodes. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-keyword 'all' reserved in nodeset name <h2><a class="anchor" name="related">
-related</a></h2>
-see <a class="el" href="man_transfer_internal.html">fix_modify AtC transfer internal</a> <h2><a class="anchor" name="default">
+<p>keyword 'all' reserved in nodeset name </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_internal_atom_integrate.html b/doc/USER/atc/man_internal_atom_integrate.html
new file mode 100644
index 000000000..b15bf71aa
--- /dev/null
+++ b/doc/USER/atc/man_internal_atom_integrate.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC internal_atom_integrate</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_internal_atom_integrate">fix_modify AtC internal_atom_integrate </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC internal_atom_integrate &lt;on | off&gt; <code> fix_modify AtC internal_atom_integrate on </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Has AtC perform time integration for the atoms in the group on which it operates. This does not include boundary atoms. </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>on for coupling methods, off for post-processors off </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_internal_element_set.html b/doc/USER/atc/man_internal_element_set.html
new file mode 100644
index 000000000..31bee5786
--- /dev/null
+++ b/doc/USER/atc/man_internal_element_set.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC internal_element_set</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_internal_element_set">fix_modify AtC internal_element_set </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC internal_element_set &lt;element-set-name&gt;</p>
+<ul>
+<li>&lt;element-set-name&gt; = name of element set defining internal region, or off </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC internal_element_set myElementSet </code> <code> fix_modify AtC internal_element_set off </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Enables AtC to base the region for internal atoms to be an element set. If no ghost atoms are used, all the AtC atoms must be constrained to remain in this element set by the user, e.g., with walls. If boundary atoms are used in conjunction with Eulerian atom maps AtC will partition all atoms of a boundary or internal type to be of type internal if they are in the internal region or to be of type boundary otherwise. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>If boundary atoms are used in conjunction with Eulerian atom maps, the Eulerian reset frequency must be an integer multiple of the Lammps reneighbor frequency </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p>see atom_element_map_type and boundary </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>off </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_internal_quadrature.html b/doc/USER/atc/man_internal_quadrature.html
index beff89bdd..172187c29 100644
--- a/doc/USER/atc/man_internal_quadrature.html
+++ b/doc/USER/atc/man_internal_quadrature.html
@@ -1,23 +1,50 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer internal_quadrature</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_internal_quadrature">fix_modify AtC transfer internal_quadrature</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC internal_quadrature</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_internal_quadrature">fix_modify AtC internal_quadrature </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify atc transfer internal_quadrature &lt; on | off &gt; <h2><a class="anchor" name="examples">
+<p>fix_modify atc internal_quadrature &lt;on | off&gt; [region] </p>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify atc transfer internal_quadrature off </code> <h2><a class="anchor" name="description">
+<p><code> fix_modify atc internal_quadrature off </code> </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Command use or not use atomic quadrature on internal elements fully filled with atoms. By turning the internal quadrature off these elements do not contribute to the governing PDE and the fields at the internal nodes follow the weighted averages of the atomic data. <h2><a class="anchor" name="restrictions">
+<p>Command to use or not use atomic quadrature on internal elements fully filled with atoms. By turning the internal quadrature off these elements do not contribute to the governing PDE and the fields at the internal nodes follow the weighted averages of the atomic data. </p>
+<h2><a class="anchor" id="optional">
+optional</a></h2>
+<p>Optional region tag specifies which finite element nodes will be treated as being within the MD region. This option is only valid with internal_quadrature off. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-<h2><a class="anchor" name="related">
+<h2><a class="anchor" id="related">
related</a></h2>
-<h2><a class="anchor" name="default">
+<h2><a class="anchor" id="default">
default</a></h2>
-on <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>on </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_kernel_function.html b/doc/USER/atc/man_kernel_function.html
new file mode 100644
index 000000000..08ec827de
--- /dev/null
+++ b/doc/USER/atc/man_kernel_function.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC kernel</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_kernel_function">fix_modify AtC kernel </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC kernel &lt;type&gt; &lt;parameters&gt;</p>
+<ul>
+<li>type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere, quartic_bar, quartic_cylinder, quartic_sphere <br/>
+</li>
+<li>parameters :<br/>
+ step = radius (double) <br/>
+ cell = hx, hy, hz (double) or h (double) <br/>
+ cubic_bar = half-width (double) <br/>
+ cubic_cylinder = radius (double) <br/>
+ cubic_sphere = radius (double) <br/>
+ quartic_bar = half-width (double) <br/>
+ quartic_cylinder = radius (double) <br/>
+ quartic_sphere = radius (double) <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p>fix_modify AtC kernel cell 1.0 1.0 1.0 fix_modify AtC kernel quartic_sphere 10.0 </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Must be used with the hardy AtC fix <br/>
+ For bar kernel types, half-width oriented along x-direction <br/>
+ For cylinder kernel types, cylindrical axis is assumed to be in z-direction <br/>
+ ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>No default </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_localized_lambda.html b/doc/USER/atc/man_localized_lambda.html
new file mode 100644
index 000000000..5dadb9d73
--- /dev/null
+++ b/doc/USER/atc/man_localized_lambda.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC control localized_lambda</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_localized_lambda">fix_modify AtC control localized_lambda </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC control localized_lambda &lt;on|off&gt; </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc control localized_lambda on </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Turns on localization algorithms for control algorithms to restrict the influence of FE coupling or boundary conditions to a region near the boundary of the MD region. Control algorithms will not affect atoms in elements not possessing faces on the boundary of the region. Flux-based control is localized via row-sum lumping while quantity control is done by solving a truncated matrix equation. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Default is off. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_lumped_lambda_solve.html b/doc/USER/atc/man_lumped_lambda_solve.html
new file mode 100644
index 000000000..bb3f8cfde
--- /dev/null
+++ b/doc/USER/atc/man_lumped_lambda_solve.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC control lumped_lambda_solve</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_lumped_lambda_solve">fix_modify AtC control lumped_lambda_solve </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC control lumped_lambda_solve &lt;on|off&gt; </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc control lumped_lambda_solve on </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command to use or not use lumped matrix for lambda solve </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mask_direction.html b/doc/USER/atc/man_mask_direction.html
new file mode 100644
index 000000000..01ca9d192
--- /dev/null
+++ b/doc/USER/atc/man_mask_direction.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC control mask_direction</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mask_direction">fix_modify AtC control mask_direction </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC control mask_direction &lt;direction&gt; &lt;on|off&gt; </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc control mask_direction 0 on </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command to mask out certain dimensions from the atomic regulator </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mass_matrix.html b/doc/USER/atc/man_mass_matrix.html
new file mode 100644
index 000000000..5f543fc20
--- /dev/null
+++ b/doc/USER/atc/man_mass_matrix.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mass_matrix</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mass_matrix">fix_modify AtC mass_matrix </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC mass_matrix &lt;fe | md_fe&gt;</p>
+<ul>
+<li>&lt;fe | md_fe&gt; = activiate/deactiviate using the FE mass matrix in the MD region </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc mass_matrix fe </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Determines whether AtC uses the FE mass matrix based on Gaussian quadrature or based on atomic quadrature in the MD region. This is useful for fully overlapping simulations to improve efficiency. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Should not be used unless the FE region is contained within the MD region, otherwise the method will be unstable and inaccurate </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Default is off </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_material.html b/doc/USER/atc/man_material.html
new file mode 100644
index 000000000..9867e90f7
--- /dev/null
+++ b/doc/USER/atc/man_material.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC material</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_material">fix_modify AtC material </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC material [elementset_name] [material_id] <br/>
+ </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC material gap_region 2</code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Sets the material model in elementset_name to be of type material_id. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>The element set must already be created and the material must be specified in the material file given the the atc fix on construction </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>All elements default to the first material in the material file. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mesh_add_to_nodeset.html b/doc/USER/atc/man_mesh_add_to_nodeset.html
new file mode 100644
index 000000000..cf5ad52f6
--- /dev/null
+++ b/doc/USER/atc/man_mesh_add_to_nodeset.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mesh add_to_nodeset</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_add_to_nodeset">fix_modify AtC mesh add_to_nodeset </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC mesh add_to_nodeset &lt;id&gt; &lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt;</p>
+<ul>
+<li>&lt;id&gt; = id of FE nodeset to be added to</li>
+<li>&lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt; = coordinates of the bounding box that contains the desired nodes to be added </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC mesh add_to_nodeset lbc -11.9 -11 -12 12 -12 12 </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command to add nodes to an already existing FE nodeset. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Coordinates are assumed to be in lattice units. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mesh_create.html b/doc/USER/atc/man_mesh_create.html
new file mode 100644
index 000000000..efaf7f430
--- /dev/null
+++ b/doc/USER/atc/man_mesh_create.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mesh create</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_create">fix_modify AtC mesh create </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC mesh create &lt;nx&gt; &lt;ny&gt; &lt;nz&gt; &lt;region-id&gt; &lt;f|p&gt; &lt;f|p&gt; &lt;f|p&gt; <br/>
+</p>
+<ul>
+<li>nx ny nz = number of elements in x, y, z</li>
+<li>region-id = id of region that is to be meshed</li>
+<li>f p p = periodicity flags for x, y, z </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC mesh create 10 1 1 feRegion p p p </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Creates a uniform mesh in a rectangular region </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Creates only uniform rectangular grids in a rectangular region </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p><a class="el" href="man_mesh_quadrature.html">fix_modify AtC mesh quadrature</a> </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>When created, mesh defaults to gauss2 (2-point Gaussian) quadrature. Use "mesh quadrature" command to change quadrature style. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mesh_create_elementset.html b/doc/USER/atc/man_mesh_create_elementset.html
new file mode 100644
index 000000000..51bdae4fa
--- /dev/null
+++ b/doc/USER/atc/man_mesh_create_elementset.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mesh create_elementset</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_create_elementset">fix_modify AtC mesh create_elementset </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC create_elementset &lt;id&gt; &lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt;</p>
+<ul>
+<li>&lt;id&gt; = id to assign to the collection of FE element</li>
+<li>&lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt; = coordinates of the bounding box that contains only the desired elements </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC mesh create_elementset middle -4.1 4.1 -100 100 -100 1100 </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command to assign an id to a set of FE elements to be used subsequently in defining material and mesh-based operations. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Only viable for rectangular grids. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Coordinates are assumed to be in lattice units. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mesh_create_faceset_box.html b/doc/USER/atc/man_mesh_create_faceset_box.html
new file mode 100644
index 000000000..163a6b442
--- /dev/null
+++ b/doc/USER/atc/man_mesh_create_faceset_box.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mesh create_faceset box</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_create_faceset_box">fix_modify AtC mesh create_faceset box </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC mesh create_faceset &lt;id&gt; box &lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt; &lt;in|out&gt; [units]</p>
+<ul>
+<li>&lt;id&gt; = id to assign to the collection of FE faces</li>
+<li>&lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt; = coordinates of the bounding box that is coincident with the desired FE faces</li>
+<li>&lt;in|out&gt; = "in" gives inner faces to the box, "out" gives the outer faces to the box</li>
+<li>units = option to specify real as opposed to lattice units </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC mesh create_faceset obndy box -4.0 4.0 -12 12 -12 12 out </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command to assign an id to a set of FE faces. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Only viable for rectangular grids. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>The default options are units = lattice and the use of outer faces </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mesh_create_faceset_plane.html b/doc/USER/atc/man_mesh_create_faceset_plane.html
new file mode 100644
index 000000000..3ca1108d1
--- /dev/null
+++ b/doc/USER/atc/man_mesh_create_faceset_plane.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mesh create_faceset plane</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_create_faceset_plane">fix_modify AtC mesh create_faceset plane </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC mesh create_faceset &lt;id&gt; plane &lt;x|y|z&gt; &lt;val1&gt; &lt;x|y|z&gt; &lt;lval2&gt; &lt;uval2&gt; [units]</p>
+<ul>
+<li>&lt;id&gt; = id to assign to the collection of FE faces</li>
+<li>&lt;x|y|z&gt; = coordinate directions that define plane on which faceset lies</li>
+<li>&lt;val1&gt;,&lt;lval2&gt;,&lt;uval2&gt; = plane is specified as the x|y|z=val1 plane bounded by the segments x|y|z = [lval2,uval2]</li>
+<li>units = option to specify real as opposed to lattice units </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC mesh create_faceset xyplane plane y 0 x -4 0 </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command to assign an id to a set of FE faces. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Only viable for rectangular grids. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>The default option is units = lattice. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mesh_create_nodeset.html b/doc/USER/atc/man_mesh_create_nodeset.html
new file mode 100644
index 000000000..9d5d15565
--- /dev/null
+++ b/doc/USER/atc/man_mesh_create_nodeset.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mesh create_nodeset</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_create_nodeset">fix_modify AtC mesh create_nodeset </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC mesh create_nodeset &lt;id&gt; &lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt;</p>
+<ul>
+<li>&lt;id&gt; = id to assign to the collection of FE nodes</li>
+<li>&lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt; = coordinates of the bounding box that contains only the desired nodes </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -12 12 -12 12 </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command to assign an id to a set of FE nodes to be used subsequently in defining boundary conditions. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Coordinates are assumed to be in lattice units. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mesh_delete_elements.html b/doc/USER/atc/man_mesh_delete_elements.html
index a4f025eed..cc269c8e6 100644
--- a/doc/USER/atc/man_mesh_delete_elements.html
+++ b/doc/USER/atc/man_mesh_delete_elements.html
@@ -1,25 +1,50 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>ATC: fix_modify AtC mesh delete_elements</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_mesh_delete_elements">fix_modify AtC mesh delete_elements</a></h1><h2><a class="anchor" name="syntax">
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_delete_elements">fix_modify AtC mesh delete_elements </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC mesh delete_elements &lt;element_set&gt;<ul>
-<li>&lt;element_set&gt; = name of an element set </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC mesh delete_elements &lt;element_set&gt;</p>
+<ul>
+<li>&lt;element_set&gt; = name of an element set </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC delete_elements gap </code> <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC delete_elements gap </code> </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Deletes a group of elements from the mesh. <h2><a class="anchor" name="restrictions">
+<p>Deletes a group of elements from the mesh. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-<h2><a class="anchor" name="related">
+<h2><a class="anchor" id="related">
related</a></h2>
-<h2><a class="anchor" name="default">
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_mesh_elemset.html b/doc/USER/atc/man_mesh_elemset.html
deleted file mode 100644
index 6cfcf1e90..000000000
--- a/doc/USER/atc/man_mesh_elemset.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC mesh create_elementset</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_mesh_elemset">fix_modify AtC mesh create_elementset</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC create_elementset &lt;id&gt; &lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt;<ul>
-<li>&lt;id&gt; = id to assign to the collection of FE element</li><li>&lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt; = coordinates of the bounding box that contains only the desired elements </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify AtC mesh create_elementset middle -4.1 4.1 -100 100 -100 1100 </code> <h2><a class="anchor" name="description">
-description</a></h2>
-Command to assign an id to a set of FE elements to be used subsequently in defining material and mesh-based operations. <h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-Only viable for rectangular grids. Also "INF" is not currrently handled. <h2><a class="anchor" name="related">
-related</a></h2>
-<h2><a class="anchor" name="default">
-default</a></h2>
-Coordinates are assumed to be in lattice units. <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_mesh_faceset.html b/doc/USER/atc/man_mesh_faceset.html
deleted file mode 100644
index ab13339a4..000000000
--- a/doc/USER/atc/man_mesh_faceset.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC mesh create_faceset</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_mesh_faceset">fix_modify AtC mesh create_faceset</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC create_faceset &lt;id&gt; &lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt; &lt;in|out&gt; [units]<ul>
-<li>&lt;id&gt; = id to assign to the collection of FE faces</li><li>&lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt; = coordinates of the bounding box that is coincident with the desired FE faces</li><li>&lt;in|out&gt; = "in" gives inner faces to the box, "out" gives the outer faces to the box</li><li>units = option to specify real as opposed to lattice units </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify AtC mesh create_faceset obndy -4.0 4.0 -12 12 -12 12 out </code> <h2><a class="anchor" name="description">
-description</a></h2>
-Command to assign an id to a set of FE faces to be used subsequently in defining flux boundary conditions. <h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-Only viable for rectangular grids. Also "INF" is not currrently handled. <h2><a class="anchor" name="related">
-related</a></h2>
-<h2><a class="anchor" name="default">
-default</a></h2>
-The default option is units = lattice. <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_mesh_nodeset.html b/doc/USER/atc/man_mesh_nodeset.html
deleted file mode 100644
index 2d9b37711..000000000
--- a/doc/USER/atc/man_mesh_nodeset.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC mesh create_nodeset</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_mesh_nodeset">fix_modify AtC mesh create_nodeset</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC create_nodeset &lt;id&gt; &lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt;<ul>
-<li>&lt;id&gt; = id to assign to the collection of FE nodes</li><li>&lt;xmin&gt; &lt;xmax&gt; &lt;ymin&gt; &lt;ymax&gt; &lt;zmin&gt; &lt;zmax&gt; = coordinates of the bounding box that contains only the desired nodes </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify AtC mesh create_faceset left -4.1 3.9 -100 100 -100 100 </code> <h2><a class="anchor" name="description">
-description</a></h2>
-Command to assign an id to a set of FE nodes to be used subsequently in defining boundary conditions. <h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-Only viable for rectangular grids. Also "INF" is not currrently handled. <h2><a class="anchor" name="related">
-related</a></h2>
-<h2><a class="anchor" name="default">
-default</a></h2>
-Coordinates are assumed to be in lattice units. <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_mesh_nodeset_to_elementset.html b/doc/USER/atc/man_mesh_nodeset_to_elementset.html
new file mode 100644
index 000000000..45d03fc98
--- /dev/null
+++ b/doc/USER/atc/man_mesh_nodeset_to_elementset.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mesh nodeset_to_elementset</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_nodeset_to_elementset">fix_modify AtC mesh nodeset_to_elementset </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC nodeset_to_elementset &lt;nodeset_id&gt; &lt;elementset_id&gt; &lt;max/min&gt;</p>
+<ul>
+<li>&lt;nodeset_id&gt; = id of desired nodeset from which to create elementset</li>
+<li>&lt;elementset_id&gt; = id to assign to the collection of FE element</li>
+<li>&lt;max/min&gt; = flag to choose either the maximal or minimal elementset </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC mesh nodeset_to_elementset myNodeset myElementset min </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command to create an elementset from an existing nodeset. Either the minimal element set of elements with all nodes in the set, or maximal element set with all elements with at least one node in the set, can be created </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>None. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Unless specified, the maximal element set is created </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mesh_output.html b/doc/USER/atc/man_mesh_output.html
index 5e336fb5a..be1b4c194 100644
--- a/doc/USER/atc/man_mesh_output.html
+++ b/doc/USER/atc/man_mesh_output.html
@@ -1,24 +1,49 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>ATC: fix_modify AtC mesh output</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_mesh_output">fix_modify AtC mesh output</a></h1><h2><a class="anchor" name="syntax">
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_output">fix_modify AtC mesh output </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC mesh output &lt;file_prefix&gt; <h2><a class="anchor" name="examples">
+<p>fix_modify AtC mesh output &lt;file_prefix&gt; </p>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC mesh output meshData </code> <br>
- <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC mesh output meshData </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Command to output mesh and associated data: nodesets, facesets, and elementsets. This data is only output once upon initialization since currently the mesh is static. Creates (binary, "gold" format) Ensight output of mesh data. <h2><a class="anchor" name="restrictions">
+<p>Command to output mesh and associated data: nodesets, facesets, and elementsets. This data is only output once upon initialization since currently the mesh is static. Creates (binary, "gold" format) Ensight output of mesh data. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-none <h2><a class="anchor" name="related">
+<p>none </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-<h2><a class="anchor" name="default">
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_mesh_quadrature.html b/doc/USER/atc/man_mesh_quadrature.html
new file mode 100644
index 000000000..d5291d99d
--- /dev/null
+++ b/doc/USER/atc/man_mesh_quadrature.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mesh quadrature</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_quadrature">fix_modify AtC mesh quadrature </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC mesh quadrature &lt;quad&gt;</p>
+<ul>
+<li>quad = one of &lt;nodal|gauss1|gauss2|gauss3|face&gt; --- when a mesh is created it defaults to gauss2, use this call to change it after the fact </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC mesh quadrature face </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>(Re-)assigns the quadrature style for the existing mesh. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p><a class="el" href="man_mesh_create.html">fix_modify AtC mesh create</a> </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mesh_read.html b/doc/USER/atc/man_mesh_read.html
new file mode 100644
index 000000000..a497a2ed0
--- /dev/null
+++ b/doc/USER/atc/man_mesh_read.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mesh read</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_read">fix_modify AtC mesh read </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC mesh read &lt;filename&gt; &lt;f|p&gt; &lt;f|p&gt; &lt;f|p&gt;</p>
+<ul>
+<li>filename = name of file containing mesh to be read</li>
+<li>f p p = periodicity flags for x, y, z </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC mesh read myComponent.mesh p p p </code> <br/>
+ <code> fix_modify AtC mesh read myOtherComponent.exo </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Reads a mesh from a text or exodus file, and assigns periodic boundary conditions if needed. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>periodicity flags are false by default </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_mesh_write.html b/doc/USER/atc/man_mesh_write.html
new file mode 100644
index 000000000..21754a1e6
--- /dev/null
+++ b/doc/USER/atc/man_mesh_write.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC mesh write</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_mesh_write">fix_modify AtC mesh write </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC mesh write &lt;filename&gt;</p>
+<ul>
+<li>filename = name of file to write mesh </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC mesh write myMesh.mesh </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Writes a mesh to a text file. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_momentum_time_integration.html b/doc/USER/atc/man_momentum_time_integration.html
new file mode 100644
index 000000000..3b987f70e
--- /dev/null
+++ b/doc/USER/atc/man_momentum_time_integration.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC time_integration (momentum)</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_momentum_time_integration">fix_modify AtC time_integration (momentum) </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC time_integration &lt;descriptor&gt; <br/>
+</p>
+<ul>
+<li>descriptor (string) = time integration type <br/>
+</li>
+</ul>
+<p>various time integration methods for the finite elements<br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>verlet - atomic velocity update with 2nd order Verlet, nodal temperature update with 2nd order Verlet, kinetostats based on controlling force <br/>
+ fractional_step - atomic velocity update with 2nd order Verlet, mixed nodal momentum update, 2nd order Verlet for continuum and exact 2nd order Verlet for atomic contributions, kinetostats based on controlling discrete momentum changes<br/>
+ gear - atomic velocity update with 2nd order Verlet, nodal temperature update with 3rd or 4th order Gear, kinetostats based on controlling power <br/>
+ </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc time_integration verlet </code> <br/>
+ <code> fix_modify atc time_integration fractional_step </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p>see <a class="el" href="man_fix_atc.html">fix atc command</a> </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_neighbor_reset_frequency.html b/doc/USER/atc/man_neighbor_reset_frequency.html
deleted file mode 100644
index 8a83c22db..000000000
--- a/doc/USER/atc/man_neighbor_reset_frequency.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer neighbor_reset_frequency</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_neighbor_reset_frequency">fix_modify AtC transfer neighbor_reset_frequency</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC transfer neighbor_reset_frequency &lt;frequency&gt;<ul>
-<li>frequency (int) : reset neighbor map for AtC analysis every "frequency" steps </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify AtC transfer neighbor_reset_frequency 1000 </code> <h2><a class="anchor" name="description">
-description</a></h2>
-This command allows the control of how often the lists of which atoms pairs are in the support of a node are reformed <h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-Only currently relevant to Hardy post-processing see <a class="el" href="man_fix_atc.html">fix atc command</a> <h2><a class="anchor" name="related">
-related</a></h2>
-This command is different from <a class="el" href="man_atom_element_map.html">fix_modify AtC transfer atom_element_map</a> in that it only concerns neighbor lists internal to ATC not the map of atom locations to elements which define the shape function values at atoms. <h2><a class="anchor" name="default">
-default</a></h2>
-The default is for the internal neighbor lists to be recalculated on the next output step (or sample step if time filtering is used). <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_output.html b/doc/USER/atc/man_output.html
new file mode 100644
index 000000000..3129ff30c
--- /dev/null
+++ b/doc/USER/atc/man_output.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC output</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_output">fix_modify AtC output </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC output &lt;filename_prefix&gt; &lt;frequency&gt; [text | full_text | binary | vector_components | tensor_components ] fix_modify AtC output index [step | time ]</p>
+<ul>
+<li>filename_prefix (string) = prefix for data files</li>
+<li>frequency (integer) = frequency of output in time-steps</li>
+<li>options (keyword/s): <br/>
+ text = creates text output of index, step and nodal variable values for unique nodes <br/>
+ full_text = creates text output index, nodal id, step, nodal coordinates and nodal variable values for unique and image nodes <br/>
+ binary = creates binary Ensight output <br/>
+ vector_components = outputs vectors as scalar components <br/>
+ tensor_components = outputs tensor as scalar components (use this for Paraview)<br/>
+</li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC output heatFE 100 </code> <br/>
+ <code> fix_modify AtC output hardyFE 1 text tensor_components </code> <br/>
+ <code> fix_modify AtC output hardyFE 10 text binary tensor_components </code> <br/>
+ <code> fix_modify AtC output index step </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Creates text and/or binary (Ensight, "gold" format) output of nodal/mesh data which is transfer/physics specific. Output indexed by step or time is possible. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p>see <a class="el" href="man_fix_atc.html">fix atc command</a> </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>no default format output indexed by time </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_output_elementset.html b/doc/USER/atc/man_output_elementset.html
new file mode 100644
index 000000000..be259388b
--- /dev/null
+++ b/doc/USER/atc/man_output_elementset.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC output elementset</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_output_elementset">fix_modify AtC output elementset </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC output volume_integral &lt;eset_name&gt; &lt;field&gt; {`</p>
+<ul>
+<li>set_name (string) = name of elementset to be integrated over</li>
+<li>fieldname (string) = name of field to integrate csum = creates nodal sum over nodes in specified nodeset <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC output eset1 mass_density </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Performs volume integration of specified field over elementset and outputs resulting variable values to GLOBALS file. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p>see <a class="el" href="man_fix_atc.html">fix atc command</a> </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_output_nodeset.html b/doc/USER/atc/man_output_nodeset.html
new file mode 100644
index 000000000..db76c8008
--- /dev/null
+++ b/doc/USER/atc/man_output_nodeset.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC output nodeset</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_output_nodeset">fix_modify AtC output nodeset </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC output nodeset &lt;nodeset_name&gt; &lt;operation&gt;</p>
+<ul>
+<li>nodeset_name (string) = name of nodeset to be operated on</li>
+<li>operation (keyword/s): <br/>
+ sum = creates nodal sum over nodes in specified nodeset <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC output nodeset nset1 sum </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Performs operation over the nodes belonging to specified nodeset and outputs resulting variable values to GLOBALS file. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p>see <a class="el" href="man_fix_atc.html">fix atc command</a> </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_pair_interactions.html b/doc/USER/atc/man_pair_interactions.html
new file mode 100644
index 000000000..d46dcb123
--- /dev/null
+++ b/doc/USER/atc/man_pair_interactions.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC pair_interactions/bond_interactions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_pair_interactions">fix_modify AtC pair_interactions/bond_interactions </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC pair_interactions &lt;on|off&gt; <br/>
+ fix_modify AtC bond_interactions &lt;on|off&gt; <br/>
+</p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC bond_interactions on </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>include bonds and/or pairs in the stress and heat flux computations </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>pair interactions: on, bond interactions: off </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_poisson_solver.html b/doc/USER/atc/man_poisson_solver.html
new file mode 100644
index 000000000..d69d74db1
--- /dev/null
+++ b/doc/USER/atc/man_poisson_solver.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC poisson_solver</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_poisson_solver">fix_modify AtC poisson_solver </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC poisson_solver mesh create &lt;nx&gt; &lt;ny&gt; &lt;nz&gt; &lt;region-id&gt; &lt;f|p&gt; &lt;f|p&gt; &lt;f|p&gt;</p>
+<ul>
+<li>nx ny nz = number of elements in x, y, z</li>
+<li>region-id = id of region that is to be meshed</li>
+<li>f p p = perioidicity flags for x, y, z </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC poisson_solver mesh create 10 1 1 feRegion p p p </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Creates a uniform mesh in a rectangular region </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>creates only uniform rectangular grids in a rectangular region </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_read_restart.html b/doc/USER/atc/man_read_restart.html
index c7c9a35f4..96168fccc 100644
--- a/doc/USER/atc/man_read_restart.html
+++ b/doc/USER/atc/man_read_restart.html
@@ -1,25 +1,51 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer read_restart</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_read_restart">fix_modify AtC transfer read_restart</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC read_restart</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_read_restart">fix_modify AtC read_restart </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer read_restart [file_name] <br>
- <h2><a class="anchor" name="examples">
+<p>fix_modify AtC read_restart [file_name] <br/>
+ </p>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer read_restart ATC_state </code> <br>
- <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC read_restart ATC_state </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Reads the current state of the fields from a named text-based restart file. <h2><a class="anchor" name="restrictions">
+<p>Reads the current state of the fields from a named text-based restart file. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-The restart file only contains fields and their time derivatives. The reference positions of the atoms and the commands that initialize the fix are not saved e.g. an identical mesh containing the same atoms will have to be recreated. <h2><a class="anchor" name="related">
+<p>The restart file only contains fields and their time derivatives. The reference positions of the atoms and the commands that initialize the fix are not saved e.g. an identical mesh containing the same atoms will have to be recreated. </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-see write_restart <a class="el" href="man_write_restart.html">fix_modify AtC transfer write_restart</a> <h2><a class="anchor" name="default">
+<p>see write_restart <a class="el" href="man_write_restart.html">fix_modify AtC write_restart</a> </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_remove_molecule.html b/doc/USER/atc/man_remove_molecule.html
new file mode 100644
index 000000000..054291efd
--- /dev/null
+++ b/doc/USER/atc/man_remove_molecule.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC remove_molecule</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_remove_molecule">fix_modify AtC remove_molecule </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify_AtC remove_molecule &lt;TAG&gt; <br/>
+</p>
+<ul>
+<li>&lt;TAG&gt; = tag for tracking a molecule type <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC remove_molecule water </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Removes tag designated for tracking a specified set of molecules. <br/>
+ </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>No defaults for this command. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_remove_source.html b/doc/USER/atc/man_remove_source.html
index 7678d4cce..d1d249eb7 100644
--- a/doc/USER/atc/man_remove_source.html
+++ b/doc/USER/atc/man_remove_source.html
@@ -1,25 +1,52 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer remove_source</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_remove_source">fix_modify AtC transfer remove_source</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC remove_source</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_remove_source">fix_modify AtC remove_source </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer remove_source &lt;field&gt; &lt;element_set&gt;<ul>
-<li>&lt;field&gt; = field name valid for type of physics</li><li>&lt;element_set&gt; = name of set of elements </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC remove_source &lt;field&gt; &lt;element_set&gt;</p>
+<ul>
+<li>&lt;field&gt; = field name valid for type of physics</li>
+<li>&lt;element_set&gt; = name of set of elements </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify atc transfer remove_source temperature groupNAME </code> <h2><a class="anchor" name="description">
+<p><code> fix_modify atc remove_source temperature groupNAME </code> </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Remove a domain source. <h2><a class="anchor" name="restrictions">
+<p>Remove a domain source. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-keyword 'all' reserved in element_set name <h2><a class="anchor" name="related">
+<p>keyword 'all' reserved in element_set name </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-see <a class="el" href="man_source.html">fix_modify AtC transfer source</a> <h2><a class="anchor" name="default">
+<p>see <a class="el" href="man_source.html">fix_modify AtC source</a> </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-<hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_remove_species.html b/doc/USER/atc/man_remove_species.html
new file mode 100644
index 000000000..ba94a5265
--- /dev/null
+++ b/doc/USER/atc/man_remove_species.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC remove_species</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_remove_species">fix_modify AtC remove_species </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify_AtC delete_species &lt;TAG&gt; <br/>
+</p>
+<ul>
+<li>&lt;TAG&gt; = tag for tracking a species <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC remove_species gold </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Removes tag designated for tracking a specified species. <br/>
+ </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>No defaults for this command. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_reset_atomic_reference_positions.html b/doc/USER/atc/man_reset_atomic_reference_positions.html
new file mode 100644
index 000000000..cb82f61bb
--- /dev/null
+++ b/doc/USER/atc/man_reset_atomic_reference_positions.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC reset_atomic_reference_positions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_reset_atomic_reference_positions">fix_modify AtC reset_atomic_reference_positions </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC reset_atomic_reference_positions </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc reset_atomic_reference_positions </code></p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p><code> Resets the atomic positions <a class="el" href="namespaceATC.html" title="owned field/s: MASS_DENSITY">ATC</a> uses to perform point to field operations. In can be used to use perfect lattice sites in <a class="el" href="namespaceATC.html" title="owned field/s: MASS_DENSITY">ATC</a> but a thermalized or deformed lattice in LAMMPS. </code></p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p><code> </code></p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p><code> </code></p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p><code> Default is off </code></p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_reset_time.html b/doc/USER/atc/man_reset_time.html
new file mode 100644
index 000000000..35d75ccb9
--- /dev/null
+++ b/doc/USER/atc/man_reset_time.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC reset_time</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_reset_time">fix_modify AtC reset_time </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC reset_time </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc reset_time 0.0 </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Resets the simulation time counter. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC kernel_bandwidth </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc reset_time 8 </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Sets a maximum parallel bandwidth for the kernel functions during parallel communication. If the command is not issued, the default will be to assume the bandwidth of the kernel matrix corresponds to the number of sampling locations. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Only is used if kernel functions are being used. </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Number of sample locations. </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_sample_frequency.html b/doc/USER/atc/man_sample_frequency.html
new file mode 100644
index 000000000..13f468b22
--- /dev/null
+++ b/doc/USER/atc/man_sample_frequency.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC sample_frequency</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_sample_frequency">fix_modify AtC sample_frequency </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC sample_frequency [freq]</p>
+<ul>
+<li>freq (int) : frequency to sample field in number of steps </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC sample_frequency 10 </code></p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p><code> Specifies a frequency at which fields are computed for the case where time filters are being applied. </code></p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p><code> Must be used with the hardy/field AtC fix ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) and is only relevant when time filters are being used. </code></p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p><code> </code></p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p><code> none </code></p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_set.html b/doc/USER/atc/man_set.html
new file mode 100644
index 000000000..d104e535b
--- /dev/null
+++ b/doc/USER/atc/man_set.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC set</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_set">fix_modify AtC set </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC set reference_potential_energy &lt;value_or_filename(optional)&gt;</p>
+<ul>
+<li>value (double) : optional user specified zero point for PE in native LAMMPS energy units <br/>
+</li>
+<li>filename (string) : optional user specified string for file of nodal PE values to be read-in </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify AtC set reference_potential_energy </code> <br/>
+ <code> fix_modify AtC set reference_potential_energy -0.05 </code> <br/>
+ <code> fix_modify AtC set reference_potential_energy myPEvalues </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Used to set various quantities for the post-processing algorithms. It sets the zero point for the potential energy density using the value provided for all nodes, or from the current configuration of the lattice if no value is provided, or values provided within the specified filename. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Must be used with the hardy/field type of AtC fix ( see <a class="el" href="man_fix_atc.html">fix atc command</a> ) </p>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Defaults to lammps zero point i.e. isolated atoms </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_source.html b/doc/USER/atc/man_source.html
index d8070635c..833b2a866 100644
--- a/doc/USER/atc/man_source.html
+++ b/doc/USER/atc/man_source.html
@@ -1,25 +1,53 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer source</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_source">fix_modify AtC transfer source</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC source</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_source">fix_modify AtC source </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer source &lt;field&gt; &lt;element_set&gt; &lt;value | function&gt;<ul>
-<li>&lt;field&gt; = field name valid for type of physics</li><li>&lt;element_set&gt; = name of set of elements </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC source &lt;field&gt; &lt;element_set&gt; &lt;value | function&gt;</p>
+<ul>
+<li>&lt;field&gt; = field name valid for type of physics</li>
+<li>&lt;element_set&gt; = name of set of elements </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify atc transfer source temperature middle temporal_ramp 10. 0. </code> <h2><a class="anchor" name="description">
+<p><code> fix_modify atc source temperature middle temporal_ramp 10. 0. </code> </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Add domain sources to the mesh. The units are consistent with LAMMPS's units for mass, length and time and are defined by the PDE being solved, e.g. for thermal transfer the balance equation is for energy and source is energy per time. <h2><a class="anchor" name="restrictions">
+<p>Add domain sources to the mesh. The units are consistent with LAMMPS's units for mass, length and time and are defined by the PDE being solved, e.g. for thermal transfer the balance equation is for energy and source is energy per time. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-keyword 'all' reserved in element_set name <h2><a class="anchor" name="related">
+<p>keyword 'all' reserved in element_set name </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-see <a class="el" href="man_remove_source.html">fix_modify AtC transfer remove_source</a> <h2><a class="anchor" name="default">
+<p>see <a class="el" href="man_remove_source.html">fix_modify AtC remove_source</a> </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_source_integration.html b/doc/USER/atc/man_source_integration.html
new file mode 100644
index 000000000..70f62d2e5
--- /dev/null
+++ b/doc/USER/atc/man_source_integration.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC source_integration</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_source_integration">fix_modify AtC source_integration </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC source_integration &lt; fe | atom&gt; </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc source_integration atom </code> </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>Default is fe </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_temperature_definition.html b/doc/USER/atc/man_temperature_definition.html
new file mode 100644
index 000000000..f4fb21471
--- /dev/null
+++ b/doc/USER/atc/man_temperature_definition.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC temperature_definition</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_temperature_definition">fix_modify AtC temperature_definition </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC temperature_definition &lt;kinetic|total&gt;</p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc temperature_definition kinetic </code> <br/>
+</p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Change the definition for the atomic temperature used to create the finite element temperature. The kinetic option is based only on the kinetic energy of the atoms while the total option uses the total energy (kinetic + potential) of an atom.</p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>This command is only valid when using thermal coupling. Also, while not a formal restriction, the user should ensure that associating a potential energy with each atom makes physical sense for the total option to be meaningful.</p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>kinetic </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_thermal_control.html b/doc/USER/atc/man_thermal_control.html
deleted file mode 100644
index 72fdc885d..000000000
--- a/doc/USER/atc/man_thermal_control.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer thermal control</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_thermal_control">fix_modify AtC transfer thermal control</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC transfer thermal control &lt;control_type&gt; &lt;optional args=""&gt;<br>
-<ul>
-<li>control_type (string) = none | rescale | hoover | flux<br>
-</li></ul>
-<p>
-fix_modify AtC transfer thermal control rescale &lt;frequency&gt;<br>
-<ul>
-<li>frequency (int) = time step frequency for applying velocity rescaling <br>
-</li></ul>
-<p>
-fix_modify AtC transfer thermal control hoover <br>
-<p>
-fix_modify AtC transfer thermal control flux &lt;boundary_integration_type&gt; &lt;face_set_id(optional)&gt;<br>
-<ul>
-<li>boundary_integration_type (string) = faceset | interpolate<br>
-</li><li>face_set_id (string), optional = id of boundary face set, if not specified (or not possible when the atomic domain does not line up with mesh boundaries) defaults to an atomic-quadrature approximate evaulation, does not work with interpolate<br>
- </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify AtC transfer thermal control none </code> <br>
- <code> fix_modify AtC transfer thermal control rescale 10 </code> <br>
- <code> fix_modify AtC transfer thermal control hoover </code> <br>
- <code> fix_modify AtC transfer thermal control flux bndy_faces </code> <br>
- <h2><a class="anchor" name="description">
-description</a></h2>
-Sets the energy exchange mechansim from the finite elements to the atoms, managed through a control algorithm. Rescale computes a scale factor for each atom to match the finite element temperature. Hoover is a Gaussian least-constraint isokinetic thermostat enforces that the nodal restricted atomic temperature matches the finite element temperature. Flux is a similar mode, but rather adds energy to the atoms based on conservation of energy. Hoover and flux allows the prescription of sources or fixed temperatures on the atoms. <h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-only for be used with specific transfers : thermal (rescale, hoover, flux), two_temperature (flux) <br>
- rescale not valid with time filtering activated <h2><a class="anchor" name="related">
-related</a></h2>
-<h2><a class="anchor" name="default">
-default</a></h2>
-none<br>
- rescale frequency is 1<br>
- flux boundary_integration_type is interpolate <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_thermal_time_integration.html b/doc/USER/atc/man_thermal_time_integration.html
new file mode 100644
index 000000000..c2f636134
--- /dev/null
+++ b/doc/USER/atc/man_thermal_time_integration.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC time_integration (thermal)</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_thermal_time_integration">fix_modify AtC time_integration (thermal) </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC time_integration &lt;descriptor&gt; <br/>
+</p>
+<ul>
+<li>descriptor (string) = time integration type <br/>
+</li>
+</ul>
+<p>various time integration methods for the finite elements<br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>gear - atomic velocity update with 2nd order Verlet, nodal temperature update with 3rd or 4th order Gear, thermostats based on controlling power <br/>
+ fractional_step - atomic velocity update with 2nd order Verlet, mixed nodal temperature update, 3/4 Gear for continuum and 2 Verlet for atomic contributions, thermostats based on controlling discrete energy changes<br/>
+ </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc time_integration gear </code> <br/>
+ <code> fix_modify atc time_integration fractional_step </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<p>see <a class="el" href="man_fix_atc.html">fix atc command</a> </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_time_filter.html b/doc/USER/atc/man_time_filter.html
index 1d7777324..ec70fed87 100644
--- a/doc/USER/atc/man_time_filter.html
+++ b/doc/USER/atc/man_time_filter.html
@@ -1,29 +1,57 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer filter</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_time_filter">fix_modify AtC transfer filter</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC filter</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_time_filter">fix_modify AtC filter </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer filter &lt;on | off | equilibrate&gt; <br>
+<p>fix_modify AtC filter &lt;on | off | equilibrate&gt; <br/>
+</p>
<ul>
-<li>on | off (keyword) = turns filter on or off<br>
-</li><li>equilibrate = runs dynamics without filtering but initializes filtered quantities </li></ul>
-<h2><a class="anchor" name="examples">
+<li>on | off (keyword) = turns filter on or off<br/>
+</li>
+<li>equilibrate = runs dynamics without filtering but initializes filtered quantities </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify atc transfer filter on </code> <br>
-<h2><a class="anchor" name="description">
+<p><code> fix_modify atc transfer filter on </code> <br/>
+</p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Filters the MD dynamics to construct a more appropriate continuous field. Equilibrating first filters the time derivatives without changing the dynamics to provide a better initial condition to the filtered dynamics<h2><a class="anchor" name="restrictions">
+<p>Filters the MD dynamics to construct a more appropriate continuous field. Equilibrating first filters the time derivatives without changing the dynamics to provide a better initial condition to the filtered dynamics</p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-only for be used with specific transfers: thermal, two_temperature<h2><a class="anchor" name="related">
+<p>only for be used with specific transfers: thermal, two_temperature</p>
+<h2><a class="anchor" id="related">
related</a></h2>
-<a class="el" href="man_filter_scale.html">fix_modify AtC transfer filter scale</a> <br>
- <a class="el" href="man_equilibrium_start.html">fix_modify AtC transfer equilibrium_start</a><h2><a class="anchor" name="default">
+<p><a class="el" href="man_filter_scale.html">fix_modify AtC filter scale</a> <br/>
+ <a class="el" href="man_equilibrium_start.html">fix_modify AtC equilibrium_start</a></p>
+<h2><a class="anchor" id="default">
default</a></h2>
-off <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>off </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_time_integration.html b/doc/USER/atc/man_time_integration.html
deleted file mode 100644
index 09b218084..000000000
--- a/doc/USER/atc/man_time_integration.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer pmfc</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_time_integration">fix_modify AtC transfer pmfc</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC transfer pmfc &lt;on|off&gt;<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify atc transfer pmfc on </code><h2><a class="anchor" name="description">
-description</a></h2>
-Switches the poor man's fractional step algorithm on where the finite element data lags the exact atomic data by one time step for overlap nodes<h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-<h2><a class="anchor" name="related">
-related</a></h2>
-<h2><a class="anchor" name="default">
-default</a></h2>
-off <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_track_displacement.html b/doc/USER/atc/man_track_displacement.html
new file mode 100644
index 000000000..8f729cffe
--- /dev/null
+++ b/doc/USER/atc/man_track_displacement.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC track_displacement</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_track_displacement">fix_modify AtC track_displacement </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC track_displacement &lt;on/off&gt; <br/>
+ </p>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc track_displacement on </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Determines whether displacement is tracked or not. For solids problems this is a useful quantity, but for fluids it is not relevant. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<p>Some constitutive models require the displacement field </p>
+<h2><a class="anchor" id="default">
+default</a></h2>
+<p>on </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_transfer_atomic_output.html b/doc/USER/atc/man_transfer_atomic_output.html
deleted file mode 100644
index 6b42d1448..000000000
--- a/doc/USER/atc/man_transfer_atomic_output.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer atomic_output</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_transfer_atomic_output">fix_modify AtC transfer atomic_output</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC transfer atomic_output &lt;filename_prefix&gt; &lt;frequency&gt; [text]<ul>
-<li>filename_prefix (string) = prefix for data files</li><li>frequency (integer) = frequency of output in time-steps</li><li>option "text" = creates a text version of the output as well as the binary Ensight output </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify AtC transfer atomic_output heatMD 100 </code> <br>
- <code> fix_modify AtC transfer atomic_output nanoMD 1 text </code> <br>
- <h2><a class="anchor" name="description">
-description</a></h2>
-Creates (binary, "gold" format) Ensight output of atom (point) data which is transfer/physics specific. <h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-<h2><a class="anchor" name="related">
-related</a></h2>
-<h2><a class="anchor" name="default">
-default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_transfer_boundary.html b/doc/USER/atc/man_transfer_boundary.html
deleted file mode 100644
index 0ce730fbb..000000000
--- a/doc/USER/atc/man_transfer_boundary.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer boundary</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_transfer_boundary">fix_modify AtC transfer boundary</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC transfer boundary type &lt;atom-type-id&gt;<ul>
-<li>&lt;atom-type-id&gt; = type id for atoms that represent a ficticious boundary internal to the FE mesh </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify AtC transfer boundary type ghost_atoms </code> <h2><a class="anchor" name="description">
-description</a></h2>
-Command to define the atoms that represent the ficticious boundary internal to the FE mesh. For fully overlapped MD/FE domains with periodic boundary conditions no boundary atoms should be defined. <h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-<h2><a class="anchor" name="related">
-related</a></h2>
-see <a class="el" href="man_transfer_internal.html">fix_modify AtC transfer internal</a> <h2><a class="anchor" name="default">
-default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_transfer_internal.html b/doc/USER/atc/man_transfer_internal.html
deleted file mode 100644
index f413df3f7..000000000
--- a/doc/USER/atc/man_transfer_internal.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer internal</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_transfer_internal">fix_modify AtC transfer internal</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC transfer internal type &lt;atom-type-id&gt;<ul>
-<li>&lt;atom-type-id&gt; = type id for non-fixed atoms internal to the FE mesh </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify AtC transfer internal type internal_atoms </code> <h2><a class="anchor" name="description">
-description</a></h2>
-Command to define the atoms to couple to finite elements. This definition is required for a AtC simulation. <h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-<h2><a class="anchor" name="related">
-related</a></h2>
-see <a class="el" href="man_transfer_boundary.html">fix_modify AtC transfer boundary</a> <h2><a class="anchor" name="default">
-default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_transfer_output.html b/doc/USER/atc/man_transfer_output.html
deleted file mode 100644
index 61d87b956..000000000
--- a/doc/USER/atc/man_transfer_output.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer output</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_transfer_output">fix_modify AtC transfer output</a></h1><h2><a class="anchor" name="syntax">
-syntax</a></h2>
-fix_modify AtC transfer output &lt;filename_prefix&gt; &lt;frequency&gt; [text | vector_components | tensor_components ]<ul>
-<li>filename_prefix (string) = prefix for data files</li><li>frequency (integer) = frequency of output in time-steps</li><li>options (keyword/s): <br>
- text = creates text output as well as binary Ensight output <br>
- vector_components = outputs vectors as scalar components <br>
- tensor_components = outputs tensor as scalar components (use this for Paraview)<br>
- </li></ul>
-<h2><a class="anchor" name="examples">
-examples</a></h2>
-<code> fix_modify AtC transfer output heatFE 100 </code> <br>
- <code> fix_modify AtC transfer output hardyFE 1 text tensor_components </code> <br>
- <h2><a class="anchor" name="description">
-description</a></h2>
-Creates (binary, "gold" format) Ensight output of nodal/mesh data which is transfer/physics specific. <h2><a class="anchor" name="restrictions">
-restrictions</a></h2>
-<h2><a class="anchor" name="related">
-related</a></h2>
-see <a class="el" href="man_fix_atc.html">fix atc command</a> <h2><a class="anchor" name="default">
-default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
-<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
-</body>
-</html>
diff --git a/doc/USER/atc/man_unfix_flux.html b/doc/USER/atc/man_unfix_flux.html
index cdea61b8f..b2a19a7fd 100644
--- a/doc/USER/atc/man_unfix_flux.html
+++ b/doc/USER/atc/man_unfix_flux.html
@@ -1,26 +1,52 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer unfix_flux</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_unfix_flux">fix_modify AtC transfer unfix_flux</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC unfix_flux</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_unfix_flux">fix_modify AtC unfix_flux </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer fix_flux &lt;field&gt; &lt;face_set&gt; &lt;value | function&gt;<ul>
-<li>&lt;field&gt; = field name valid for type of physics, temperature | electron_temperature</li><li>&lt;face_set&gt; = name of set of element faces </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC fix_flux &lt;field&gt; &lt;face_set&gt; &lt;value | function&gt;</p>
+<ul>
+<li>&lt;field&gt; = field name valid for type of physics, temperature | electron_temperature</li>
+<li>&lt;face_set&gt; = name of set of element faces </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify atc transfer unfix_flux temperature faceSet </code> <br>
-<h2><a class="anchor" name="description">
+<p><code> fix_modify atc unfix_flux temperature faceSet </code> <br/>
+</p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Command for removing prescribed normal fluxes e.g. heat_flux, stress. <h2><a class="anchor" name="restrictions">
+<p>Command for removing prescribed normal fluxes e.g. heat_flux, stress. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-<h2><a class="anchor" name="related">
+<h2><a class="anchor" id="related">
related</a></h2>
-see <a class="el" href="man_unfix_flux.html">fix_modify AtC transfer unfix_flux</a> <h2><a class="anchor" name="default">
+<p>see <a class="el" href="man_unfix_flux.html">fix_modify AtC unfix_flux</a> </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-<hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_unfix_nodes.html b/doc/USER/atc/man_unfix_nodes.html
index 7a7d77c23..498d549f9 100644
--- a/doc/USER/atc/man_unfix_nodes.html
+++ b/doc/USER/atc/man_unfix_nodes.html
@@ -1,25 +1,53 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer unfix</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_unfix_nodes">fix_modify AtC transfer unfix</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC unfix</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_unfix_nodes">fix_modify AtC unfix </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer unfix &lt;field&gt; &lt;nodeset&gt;<ul>
-<li>&lt;field&gt; = field name valid for type of physics</li><li>&lt;nodeset&gt; = name of set of nodes </li></ul>
-<h2><a class="anchor" name="examples">
+<p>fix_modify AtC unfix &lt;field&gt; &lt;nodeset&gt;</p>
+<ul>
+<li>&lt;field&gt; = field name valid for type of physics</li>
+<li>&lt;nodeset&gt; = name of set of nodes </li>
+</ul>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer unfix temperature groupNAME </code> <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC unfix temperature groupNAME </code> </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Removes constraint on field values for specified nodes. <h2><a class="anchor" name="restrictions">
+<p>Removes constraint on field values for specified nodes. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-keyword 'all' reserved in nodeset name <h2><a class="anchor" name="related">
+<p>keyword 'all' reserved in nodeset name </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-see <a class="el" href="man_fix_nodes.html">fix_modify AtC transfer fix</a> <h2><a class="anchor" name="default">
+<p>see <a class="el" href="man_fix_nodes.html">fix_modify AtC fix</a> </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/man_write_atom_weights.html b/doc/USER/atc/man_write_atom_weights.html
new file mode 100644
index 000000000..939506a28
--- /dev/null
+++ b/doc/USER/atc/man_write_atom_weights.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC write_atom_weights</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_write_atom_weights">fix_modify AtC write_atom_weights </a></h1><h2><a class="anchor" id="syntax">
+syntax</a></h2>
+<p>fix_modify AtC write_atom_weights &lt;filename&gt; &lt;frequency&gt;</p>
+<ul>
+<li>&lt;filename&gt; = name of file that atomic weights are written to <br/>
+</li>
+<li>&lt;frequency&gt; = how often writes will occur <br/>
+ </li>
+</ul>
+<h2><a class="anchor" id="examples">
+examples</a></h2>
+<p><code> fix_modify atc write_atom_weights atm_wt_file.txt 10 </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
+description</a></h2>
+<p>Command for writing the values of atomic weights to a specified file. </p>
+<h2><a class="anchor" id="restrictions">
+restrictions</a></h2>
+<h2><a class="anchor" id="related">
+related</a></h2>
+<h2><a class="anchor" id="default">
+default</a></h2>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
+</body>
+</html>
diff --git a/doc/USER/atc/man_write_restart.html b/doc/USER/atc/man_write_restart.html
index bd92e3e90..6ea350d5e 100644
--- a/doc/USER/atc/man_write_restart.html
+++ b/doc/USER/atc/man_write_restart.html
@@ -1,25 +1,51 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>ATC: fix_modify AtC transfer write_restart</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
-<h1><a class="anchor" name="man_write_restart">fix_modify AtC transfer write_restart</a></h1><h2><a class="anchor" name="syntax">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<title>ATC: fix_modify AtC write_restart</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+<!-- Generated by Doxygen 1.6.1 -->
+<div class="navigation" id="top">
+ <div class="tabs">
+ <ul>
+ <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li><a href="dirs.html"><span>Directories</span></a></li>
+ </ul>
+ </div>
+</div>
+<div class="contents">
+
+
+<h1><a class="anchor" id="man_write_restart">fix_modify AtC write_restart </a></h1><h2><a class="anchor" id="syntax">
syntax</a></h2>
-fix_modify AtC transfer write_restart [file_name] <br>
- <h2><a class="anchor" name="examples">
+<p>fix_modify AtC write_restart [file_name] <br/>
+ </p>
+<h2><a class="anchor" id="examples">
examples</a></h2>
-<code> fix_modify AtC transfer write_restart restart.mydata </code> <br>
- <h2><a class="anchor" name="description">
+<p><code> fix_modify AtC write_restart restart.mydata </code> <br/>
+ </p>
+<h2><a class="anchor" id="description">
description</a></h2>
-Dumps the current state of the fields to a named text-based restart file. This done when the command is invoked and not repeated, unlike the similar lammps command. <h2><a class="anchor" name="restrictions">
+<p>Dumps the current state of the fields to a named text-based restart file. This done when the command is invoked and not repeated, unlike the similar lammps command. </p>
+<h2><a class="anchor" id="restrictions">
restrictions</a></h2>
-The restart file only contains fields and their time derivatives. The reference positions of the atoms and the commands that initialize the fix are not saved e.g. an identical mesh containing the same atoms will have to be recreated. <h2><a class="anchor" name="related">
+<p>The restart file only contains fields and their time derivatives. The reference positions of the atoms and the commands that initialize the fix are not saved e.g. an identical mesh containing the same atoms will have to be recreated. </p>
+<h2><a class="anchor" id="related">
related</a></h2>
-see read_restart <a class="el" href="man_read_restart.html">fix_modify AtC transfer read_restart</a> <h2><a class="anchor" name="default">
+<p>see read_restart <a class="el" href="man_read_restart.html">fix_modify AtC read_restart</a> </p>
+<h2><a class="anchor" id="default">
default</a></h2>
-none <hr size="1"><address style="align: right;"><small>Generated on Mon Aug 17 09:35:16 2009 for ATC by&nbsp;
+<p>none </p>
+</div>
+<hr size="1"/><address style="text-align: right;"><small>Generated on 21 Aug 2013 for ATC by&nbsp;
<a href="http://www.doxygen.org/index.html">
-<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>
diff --git a/doc/USER/atc/svn.stdout b/doc/USER/atc/svn.stdout
deleted file mode 100644
index 899aa46c7..000000000
--- a/doc/USER/atc/svn.stdout
+++ /dev/null
@@ -1,3 +0,0 @@
-Adding atc/svn.stdout
-Transmitting file data .
-Committed revision 10559.
diff --git a/doc/fix_rigid.html b/doc/fix_rigid.html
index d4fc57609..5947f83c3 100644
--- a/doc/fix_rigid.html
+++ b/doc/fix_rigid.html
@@ -1,737 +1,740 @@
<HTML>
<CENTER><A HREF = "http://lammps.sandia.gov">LAMMPS WWW Site</A> - <A HREF = "Manual.html">LAMMPS Documentation</A> - <A HREF = "Section_commands.html#comm">LAMMPS Commands</A>
</CENTER>
<HR>
<H3>fix rigid command
</H3>
<H3>fix rigid/nve command
</H3>
<H3>fix rigid/nvt command
</H3>
<H3>fix rigid/npt command
</H3>
<H3>fix rigid/nph command
</H3>
<H3>fix rigid/small command
</H3>
<P><B>Syntax:</B>
</P>
<PRE>fix ID group-ID style bodystyle args keyword values ...
</PRE>
<UL><LI>ID, group-ID are documented in <A HREF = "fix.html">fix</A> command
<LI>style = <I>rigid</I> or <I>rigid/nve</I> or <I>rigid/nvt</I> or <I>rigid/npt</I> or <I>rigid/nph</I> or <I>rigid/small</I>
<LI>bodystyle = <I>single</I> or <I>molecule</I> or <I>group</I>
<PRE> <I>single</I> args = none
<I>molecule</I> args = none
<I>group</I> args = N groupID1 groupID2 ...
N = # of groups
groupID1, groupID2, ... = list of N group IDs
</PRE>
<LI>zero or more keyword/value pairs may be appended
<LI>keyword = <I>langevin</I> or <I>temp</I> or <I>iso</I> or <I>aniso</I> or <I>x</I> or <I>y</I> or <I>z</I> or <I>couple</I> or <I>tparam</I> or <I>pchain</I> or <I>dilate</I> or <I>force</I> or <I>torque</I> or <I>infile</I>
<PRE> <I>langevin</I> values = Tstart Tstop Tperiod seed
Tstart,Tstop = desired temperature at start/stop of run (temperature units)
Tdamp = temperature damping parameter (time units)
seed = random number seed to use for white noise (positive integer)
<I>temp</I> values = Tstart Tstop Tdamp
Tstart,Tstop = desired temperature at start/stop of run (temperature units)
Tdamp = temperature damping parameter (time units)
<I>iso</I> or <I>aniso</I> values = Pstart Pstop Pdamp
Pstart,Pstop = scalar external pressure at start/end of run (pressure units)
Pdamp = pressure damping parameter (time units)
<I>x</I> or <I>y</I> or <I>z</I> values = Pstart Pstop Pdamp
Pstart,Pstop = external stress tensor component at start/end of run (pressure units)
Pdamp = stress damping parameter (time units)
<I>couple</I> = <I>none</I> or <I>xyz</I> or <I>xy</I> or <I>yz</I> or <I>xz</I>
<I>tparam</I> values = Tchain Titer Torder
Tchain = length of Nose/Hoover thermostat chain
Titer = number of thermostat iterations performed
Torder = 3 or 5 = Yoshida-Suzuki integration parameters
<I>pchain</I> values = Pchain
Pchain = length of the Nose/Hoover thermostat chain coupled with the barostat
<I>dilate</I> value = dilate-group-ID
dilate-group-ID = only dilate atoms in this group due to barostat volume changes
<I>force</I> values = M xflag yflag zflag
M = which rigid body from 1-Nbody (see asterisk form below)
xflag,yflag,zflag = off/on if component of center-of-mass force is active
<I>torque</I> values = M xflag yflag zflag
M = which rigid body from 1-Nbody (see asterisk form below)
xflag,yflag,zflag = off/on if component of center-of-mass torque is active
<I>infile</I> filename
filename = file with per-body values of mass, center-of-mass, moments of inertia
</PRE>
</UL>
<P><B>Examples:</B>
</P>
<PRE>fix 1 clump rigid single
fix 1 clump rigid/small molecule
fix 1 clump rigid single force 1 off off on langevin 1.0 1.0 1.0 428984
fix 1 polychains rigid/nvt molecule temp 1.0 1.0 5.0
fix 1 polychains rigid molecule force 1*5 off off off force 6*10 off off on
fix 1 polychains rigid/small molecule langevin 1.0 1.0 1.0 428984
fix 2 fluid rigid group 3 clump1 clump2 clump3 torque * off off off
fix 1 rods rigid/npt molecule temp 300.0 300.0 100.0 iso 0.5 0.5 10.0
fix 1 particles rigid/npt molecule temp 1.0 1.0 5.0 x 0.5 0.5 1.0 z 0.5 0.5 1.0 couple xz
fix 1 water rigid/nph molecule iso 0.5 0.5 1.0
</PRE>
<P><B>Description:</B>
</P>
<P>Treat one or more sets of atoms as independent rigid bodies. This
means that each timestep the total force and torque on each rigid body
is computed as the sum of the forces and torques on its constituent
particles and the coordinates, velocities, and orientations of the
atoms in each body are updated so that the body moves and rotates as a
single entity.
</P>
<P>Examples of large rigid bodies are a large colloidal particle, or
portions of a large biomolecule such as a protein.
</P>
<P>Example of small rigid bodies are patchy nanoparticles, such as those
modeled in <A HREF = "#Zhang">this paper</A> by Sharon Glotzer's group, clumps of
granular particles, lipid molecules consiting of one or more point
dipoles connected to other spheroids or ellipsoids, irregular
particles built from line segments (2d) or triangles (3d), and
coarse-grain models of nano or colloidal particles consisting of a
small number of constituent particles. Note that the <A HREF = "fix_shake.html">fix
shake</A> command can also be used to rigidify small
molecules of 2, 3, or 4 atoms, e.g. water molecules. That fix treats
the constituent atoms as point masses.
</P>
<P>These fixes also update the positions and velocities of the atoms in
each rigid body via time integration, in the NVE, NVT, NPT, or NPH
ensemble, as described below.
</P>
<P>There are two main variants of this fix, fix rigid and fix
rigid/small. The NVE/NVT/NPT/NHT versions belong to one of the two
variants, as their style names indicate.
</P>
<P>IMPORTANT NOTE: Not all of the bodystyle options and keyword/value
options are available for both the <I>rigid</I> and <I>rigid/small</I> variants.
See details below.
</P>
<P>The <I>rigid</I> variant is typically the best choice for a system with a
small number of large rigid bodies, each of which can extend across
the domain of many processors. It operates by creating a single
global list of rigid bodies, which all processors contribute to.
MPI_Allreduce operations are performed each timestep to sum the
contributions from each processor to the force and torque on all the
bodies. This operation will not scale well in parallel if large
numbers of rigid bodies are simulated.
</P>
<P>The <I>rigid/small</I> variant is typically best for a system with a large
number of small rigid bodies. Each body is assigned to the atom
closest to the geometrical center of the body. The fix operates using
local lists of rigid bodies owned by each processor and information is
exchanged and summed via local communication between neighboring
processors when ghost atom info is accumlated.
</P>
<P>IMPORTANT NOTE: To use <I>rigid/small</I> the ghost atom cutoff must be
large enough to span the distance between the atom that owns the body
and every other atom in the body. This distance value is printed out
when the rigid bodies are defined. If the
<A HREF = "pair_style.html">pair_style</A> cutoff plus neighbor skin does not span
this distance, then you should use the <A HREF = "communicate.html">communicate
cutoff</A> command with a setting epsilon larger than
the distance.
</P>
<P>Which of the two variants is faster for a particular problem is hard
to predict. The best way to decide is to perform a short test run.
Both variants should give identical numerical answers for short runs.
Long runs should give statistically similar results, but round-off
differences will accumulate to produce divergent trajectories.
</P>
<P>IMPORTANT NOTE: You should not update the atoms in rigid bodies via
other time-integration fixes (e.g. <A HREF = "fix_nve.html">fix nve</A>, <A HREF = "fix_nvt.html">fix
nvt</A>, <A HREF = "fix_npt.html">fix npt</A>), or you will be integrating
their motion more than once each timestep. When performing a hybrid
simulation with some atoms in rigid bodies, and some not, a separate
time integration fix like <A HREF = "fix_nve.html">fix nve</A> or <A HREF = "fix_nh.html">fix
nvt</A> should be used for the non-rigid particles.
</P>
<P>IMPORTANT NOTE: These fixes are overkill if you simply want to hold a
collection of atoms stationary or have them move with a constant
velocity. A simpler way to hold atoms stationary is to not include
those atoms in your time integration fix. E.g. use "fix 1 mobile nve"
instead of "fix 1 all nve", where "mobile" is the group of atoms that
you want to move. You can move atoms with a constant velocity by
assigning them an initial velocity (via the <A HREF = "velocity.html">velocity</A>
command), setting the force on them to 0.0 (via the <A HREF = "fix_setforce.html">fix
setforce</A> command), and integrating them as usual
(e.g. via the <A HREF = "fix_nve.html">fix nve</A> command).
</P>
<HR>
<P>Each rigid body must have two or more atoms. An atom can belong to at
most one rigid body. Which atoms are in which bodies can be defined
via several options.
</P>
<P>For bodystyle <I>single</I> the entire fix group of atoms is treated as one
rigid body. This option is only allowed for fix rigid and its
sub-styles.
</P>
<P>For bodystyle <I>molecule</I>, each set of atoms in the fix group with a
different molecule ID is treated as a rigid body. This option is
allowed for fix rigid and fix rigid/small, and their sub-styles. Note
that atoms with a molecule ID = 0 will be treated as a single rigid
body. For a system with atomic solvent (typically this is atoms with
molecule ID = 0) surrounding rigid bodies, this may not be what you
want. Thus you should be careful to use a fix group that only
includes atoms you want to be part of rigid bodies.
</P>
<P>For bodystyle <I>group</I>, each of the listed groups is treated as a
separate rigid body. Only atoms that are also in the fix group are
included in each rigid body. This option is only allowed for fix
rigid and its sub-styles.
</P>
<P>IMPORTANT NOTE: To compute the initial center-of-mass position and
other properties of each rigid body, the image flags for each atom in
the body are used to "unwrap" the atom coordinates. Thus you must
insure that these image flags are consistent so that the unwrapping
creates a valid rigid body (one where the atoms are close together),
particularly if the atoms in a single rigid body straddle a periodic
boundary. This means the input data file or restart file must define
the image flags for each atom consistently or that you have used the
<A HREF = "set.html">set</A> command to specify them correctly. If a dimension is
non-periodic then the image flag of each atom must be 0 in that
dimension, else an error is generated.
</P>
<P>The <I>force</I> and <I>torque</I> keywords discussed next are only allowed for
fix rigid and its sub-styles.
</P>
<P>By default, each rigid body is acted on by other atoms which induce an
external force and torque on its center of mass, causing it to
translate and rotate. Components of the external center-of-mass force
and torque can be turned off by the <I>force</I> and <I>torque</I> keywords.
This may be useful if you wish a body to rotate but not translate, or
vice versa, or if you wish it to rotate or translate continuously
unaffected by interactions with other particles. Note that if you
expect a rigid body not to move or rotate by using these keywords, you
must insure its initial center-of-mass translational or angular
velocity is 0.0. Otherwise the initial translational or angular
momentum the body has will persist.
</P>
<P>An xflag, yflag, or zflag set to <I>off</I> means turn off the component of
force of torque in that dimension. A setting of <I>on</I> means turn on
the component, which is the default. Which rigid body(s) the settings
apply to is determined by the first argument of the <I>force</I> and
<I>torque</I> keywords. It can be an integer M from 1 to Nbody, where
Nbody is the number of rigid bodies defined. A wild-card asterisk can
be used in place of, or in conjunction with, the M argument to set the
flags for multiple rigid bodies. This takes the form "*" or "*n" or
"n*" or "m*n". If N = the number of rigid bodies, then an asterisk
with no numeric values means all bodies from 1 to N. A leading
asterisk means all bodies from 1 to n (inclusive). A trailing
asterisk means all bodies from n to N (inclusive). A middle asterisk
means all types from m to n (inclusive). Note that you can use the
<I>force</I> or <I>torque</I> keywords as many times as you like. If a
particular rigid body has its component flags set multiple times, the
settings from the final keyword are used.
</P>
<P>For computational efficiency, you may wish to turn off pairwise and
bond interactions within each rigid body, as they no longer contribute
to the motion. The <A HREF = "neigh_modify.html">neigh_modify exclude</A> and
<A HREF = "delete_bonds.html">delete_bonds</A> commands are used to do this.
</P>
<P>For computational efficiency, you should typically define one fix
rigid or fix rigid/small command which includes all the desired rigid
bodies. LAMMPS will allow multiple rigid fixes to be defined, but it
is more expensive.
</P>
<HR>
<P>The constituent particles within a rigid body can be point particles
(the default in LAMMPS) or finite-size particles, such as spheres or
ellipsoids or line segments or triangles. See the <A HREF = "atom_style.html">atom_style sphere
and ellipsoid and line and tri</A> commands for more
details on these kinds of particles. Finite-size particles contribute
differently to the moment of inertia of a rigid body than do point
particles. Finite-size particles can also experience torque (e.g. due
to <A HREF = "pair_gran.html">frictional granular interactions</A>) and have an
orientation. These contributions are accounted for by these fixes.
</P>
<P>Forces between particles within a body do not contribute to the
external force or torque on the body. Thus for computational
efficiency, you may wish to turn off pairwise and bond interactions
between particles within each rigid body. The <A HREF = "neigh_modify.html">neigh_modify
exclude</A> and <A HREF = "delete_bonds.html">delete_bonds</A>
commands are used to do this. For finite-size particles this also
means the particles can be highly overlapped when creating the rigid
body.
</P>
<HR>
<P>The <I>rigid</I> and <I>rigid/small</I> and <I>rigid/nve</I> styles perform constant
NVE time integration. The only difference is that the <I>rigid</I> and
<I>rigid/small</I> styles use an integration technique based on Richardson
iterations. The <I>rigid/nve</I> style uses the methods described in the
paper by <A HREF = "#Miller">Miller</A>, which are thought to provide better energy
conservation than an iterative approach.
</P>
<P>The <I>rigid/nvt</I> style performs constant NVT integration using a
Nose/Hoover thermostat with chains as described originally in
<A HREF = "#Hoover">(Hoover)</A> and <A HREF = "#Martyna">(Martyna)</A>, which thermostats both
the translational and rotational degrees of freedom of the rigid
bodies. The rigid-body algorithm used by <I>rigid/nvt</I> is described in
the paper by <A HREF = "#Kamberaj">Kamberaj</A>.
</P>
<P>The <I>rigid/npt</I> and <I>rigid/nph</I> styles perform constant NPT or NPH
integration using a Nose/Hoover barostat with chains. For the NPT
case, the same Nose/Hoover thermostat is also used as with
<I>rigid/nvt</I>.
</P>
<P>The barostat parameters are specified using one or more of the <I>iso</I>,
<I>aniso</I>, <I>x</I>, <I>y</I>, <I>z</I> and <I>couple</I> keywords. These keywords give you
the ability to specify 3 diagonal components of the external stress
tensor, and to couple these components together so that the dimensions
they represent are varied together during a constant-pressure
simulation. The effects of these keywords are similar to those
defined in <A HREF = "fix_nh.html">fix npt/nph</A>
</P>
<P>NOTE: Currently the <I>rigid/npt</I> and <I>rigid/nph</I> styles do not support
triclinic (non-orthongonal) boxes.
</P>
<P>The target pressures for each of the 6 components of the stress tensor
can be specified independently via the <I>x</I>, <I>y</I>, <I>z</I> keywords, which
correspond to the 3 simulation box dimensions. For each component,
the external pressure or tensor component at each timestep is a ramped
value during the run from <I>Pstart</I> to <I>Pstop</I>. If a target pressure is
specified for a component, then the corresponding box dimension will
change during a simulation. For example, if the <I>y</I> keyword is used,
the y-box length will change. A box dimension will not change if that
component is not specified, although you have the option to change
that dimension via the <A HREF = "fix_deform.html">fix deform</A> command.
</P>
<P>For all barostat keywords, the <I>Pdamp</I> parameter operates like the
<I>Tdamp</I> parameter, determining the time scale on which pressure is
relaxed. For example, a value of 10.0 means to relax the pressure in
a timespan of (roughly) 10 time units (e.g. tau or fmsec or psec - see
the <A HREF = "units.html">units</A> command).
</P>
<P>Regardless of what atoms are in the fix group (the only atoms which
are time integrated), a global pressure or stress tensor is computed
for all atoms. Similarly, when the size of the simulation box is
changed, all atoms are re-scaled to new positions, unless the keyword
<I>dilate</I> is specified with a <I>dilate-group-ID</I> for a group that
represents a subset of the atoms. This can be useful, for example, to
leave the coordinates of atoms in a solid substrate unchanged and
controlling the pressure of a surrounding fluid. Another example is a
system consisting of rigid bodies and point particles where the
barostat is only coupled with the rigid bodies. This option should be
used with care, since it can be unphysical to dilate some atoms and
not others, because it can introduce large, instantaneous
displacements between a pair of atoms (one dilated, one not) that are
far from the dilation origin.
</P>
<P>The <I>couple</I> keyword allows two or three of the diagonal components of
the pressure tensor to be "coupled" together. The value specified
with the keyword determines which are coupled. For example, <I>xz</I>
means the <I>Pxx</I> and <I>Pzz</I> components of the stress tensor are coupled.
<I>Xyz</I> means all 3 diagonal components are coupled. Coupling means two
things: the instantaneous stress will be computed as an average of the
corresponding diagonal components, and the coupled box dimensions will
be changed together in lockstep, meaning coupled dimensions will be
dilated or contracted by the same percentage every timestep. The
<I>Pstart</I>, <I>Pstop</I>, <I>Pdamp</I> parameters for any coupled dimensions must
be identical. <I>Couple xyz</I> can be used for a 2d simulation; the <I>z</I>
dimension is simply ignored.
</P>
<P>The <I>iso</I> and <I>aniso</I> keywords are simply shortcuts that are
equivalent to specifying several other keywords together.
</P>
<P>The keyword <I>iso</I> means couple all 3 diagonal components together when
pressure is computed (hydrostatic pressure), and dilate/contract the
dimensions together. Using "iso Pstart Pstop Pdamp" is the same as
specifying these 4 keywords:
</P>
<PRE>x Pstart Pstop Pdamp
y Pstart Pstop Pdamp
z Pstart Pstop Pdamp
couple xyz
</PRE>
<P>The keyword <I>aniso</I> means <I>x</I>, <I>y</I>, and <I>z</I> dimensions are controlled
independently using the <I>Pxx</I>, <I>Pyy</I>, and <I>Pzz</I> components of the
stress tensor as the driving forces, and the specified scalar external
pressure. Using "aniso Pstart Pstop Pdamp" is the same as specifying
these 4 keywords:
</P>
<PRE>x Pstart Pstop Pdamp
y Pstart Pstop Pdamp
z Pstart Pstop Pdamp
couple none
</PRE>
<HR>
<P>The keyword/value option pairs are used in the following ways.
</P>
<P>The <I>langevin</I> and <I>temp</I> and <I>tparam</I> keywords perform thermostatting
of the rigid bodies, altering both their translational and rotational
degrees of freedom. What is meant by "temperature" of a collection of
rigid bodies and how it can be monitored via the fix output is
discussed below.
</P>
<P>The <I>langevin</I> keyword applies a Langevin thermostat to the constant
NVE time integration performed by either the <I>rigid</I> or <I>rigid/small</I>
or <I>rigid/nve</I> styles. It cannot be used with the <I>rigid/nvt</I> style.
The desired temperature at each timestep is a ramped value during the
run from <I>Tstart</I> to <I>Tstop</I>. The <I>Tdamp</I> parameter is specified in
time units and determines how rapidly the temperature is relaxed. For
example, a value of 100.0 means to relax the temperature in a timespan
of (roughly) 100 time units (tau or fmsec or psec - see the
<A HREF = "units.html">units</A> command). The random # <I>seed</I> must be a positive
integer. The way the Langevin thermostatting operates is explained on
the <A HREF = "fix_langevin.html">fix langevin</A> doc page.
</P>
<P>IMPORTANT NOTE: When the <I>langevin</I> keyword is used with fix rigid
versus fix rigid/small, different dynamics will result for parallel
runs. This is because of the way random numbers are used in the two
cases. The dynamics for the two cases should be statistically
similar, but will not be identical, even for a single timestep.
</P>
<P>The <I>temp</I> and <I>tparam</I> keywords apply a Nose/Hoover thermostat to the
NVT time integration performed by the <I>rigid/nvt</I> style. They cannot
be used with the <I>rigid</I> or <I>rigid/small</I> or <I>rigid/nve</I> styles. The
desired temperature at each timestep is a ramped value during the run
from <I>Tstart</I> to <I>Tstop</I>. The <I>Tdamp</I> parameter is specified in time
units and determines how rapidly the temperature is relaxed. For
example, a value of 100.0 means to relax the temperature in a timespan
of (roughly) 100 time units (tau or fmsec or psec - see the
<A HREF = "units.html">units</A> command).
</P>
<P>Nose/Hoover chains are used in conjunction with this thermostat. The
<I>tparam</I> keyword can optionally be used to change the chain settings
used. <I>Tchain</I> is the number of thermostats in the Nose Hoover chain.
This value, along with <I>Tdamp</I> can be varied to dampen undesirable
oscillations in temperature that can occur in a simulation. As a rule
of thumb, increasing the chain length should lead to smaller
oscillations. The keyword <I>pchain</I> specifies the number of
thermostats in the chain thermostatting the barostat degrees of
freedom.
</P>
<P>IMPORTANT NOTE: There are alternate ways to thermostat a system of
rigid bodies. You can use <A HREF = "fix_langevin.html">fix langevin</A> to treat
the individual particles in the rigid bodies as effectively immersed
in an implicit solvent, e.g. a Brownian dynamics model. For hybrid
systems with both rigid bodies and solvent particles, you can
thermostat only the solvent particles that surround one or more rigid
bodies by appropriate choice of groups in the compute and fix commands
for temperature and thermostatting. The solvent interactions with the
rigid bodies should then effectively thermostat the rigid body
temperature as well without use of the Langevin or Nose/Hoover options
associated with the fix rigid commands.
</P>
<P>The <I>infile</I> keyword allows a file of rigid body attributes to be read
in from a file, rather then having LAMMPS compute them. There are 3
such attributes: the total mass of the rigid body, its center-of-mass
position, and its 6 moments of inertia. For rigid bodies consisting
of point particles or non-overlapping finite-size particles, LAMMPS
can compute these values accurately. However, for rigid bodies
consisting of finite-size particles which overlap each other, LAMMPS
will ignore the overlaps when computing these 3 attributes. The
amount of error this induces depends on the amount of overlap. To
avoid this issue, the values can be pre-computed (e.g. using Monte
Carlo integration).
</P>
<P>The format of the file is as follows. Note that the file does not
have to list attributes for every rigid body integrated by fix rigid.
Only bodies which the file specifies will have their computed
attributes overridden. The file can contain initial blank lines or
comment lines starting with "#" which are ignored. The first
non-blank, non-comment line should list N = the number of lines to
follow. The N successive lines contain the following information:
</P>
<PRE>ID1 masstotal xcm ycm zcm ixx iyy izz ixy ixz iyz
ID2 masstotal xcm ycm zcm ixx iyy izz ixy ixz iyz
...
IDN masstotal xcm ycm zcm ixx iyy izz ixy ixz iyz
</PRE>
<P>The rigid body IDs are all positive integers. For the <I>single</I>
bodystyle, only an ID of 1 can be used. For the <I>group</I> bodystyle,
IDs from 1 to Ng can be used where Ng is the number of specified
groups. For the <I>molecule</I> bodystyle, use the molecule ID for the
atoms in a specific rigid body as the rigid body ID.
</P>
<P>The masstotal and center-of-mass coordinates (xcm,ycm,zcm) are
self-explanatory. The center-of-mass should be consistent with what
is calculated for the position of the rigid body with all its atoms
unwrapped by their respective image flags. If this produces a
center-of-mass that is outside the simulation box, LAMMPS wraps it
back into the box. The 6 moments of inertia (ixx,iyy,izz,ixy,ixz,iyz)
should be the values consistent with the current orientation of the
rigid body around its center of mass. The values are with respect to
the simulation box XYZ axes, not with respect to the prinicpal axes of
the rigid body itself. LAMMPS performs the latter calculation
internally.
</P>
-<P>IMPORTANT NOTE: The last point means that you cannot restart a
-simulation with rigid bodies using the
-<A HREF = "read_restart.html">read_restart</A> command and use the same <I>infile</I> of
-rigid body attributes as input for the 2nd simulation, if the rigid
-bodies have moved or rotated. Instead, you need to produce a new
-<I>infile</I> that reflects the correct attributes for each rigid body at
-the time of restart. We are thinking about a good way to make this
-process easier.
+<P>IMPORTANT NOTE: If you use the <I>infile</I> keyword and write restart
+files during a simulation, then each time a restart file is written,
+the fix also write an auxiliary restart file with the name
+rfile.rigid, where "rfile" is the name of the restart file,
+e.g. tmp.restart.10000 and tmp.restart.10000.rigid. This auxiliary
+file is in the same format described above and contains info on the
+current center-of-mass and 6 moments of inertia. Thus it can be used
+in a new input script that restarts the run and re-specifies a rigid
+fix using an <I>infile</I> keyword and the appropriate filename. Note that
+the auxiliary file will contain one line for every rigid body, even if
+the original file only listed a subset of the rigid bodies.
</P>
<HR>
<P>If you use a <A HREF = "compute.html">temperature compute</A> with a group that
includes particles in rigid bodies, the degrees-of-freedom removed by
each rigid body are accounted for in the temperature (and pressure)
computation, but only if the temperature group includes all the
particles in a particular rigid body.
</P>
<P>A 3d rigid body has 6 degrees of freedom (3 translational, 3
rotational), except for a collection of point particles lying on a
straight line, which has only 5, e.g a dimer. A 2d rigid body has 3
degrees of freedom (2 translational, 1 rotational).
</P>
<P>IMPORTANT NOTE: You may wish to explicitly subtract additional
degrees-of-freedom if you use the <I>force</I> and <I>torque</I> keywords to
eliminate certain motions of one or more rigid bodies. LAMMPS does
not do this automatically.
</P>
<P>The rigid body contribution to the pressure of the system (virial) is
also accounted for by this fix.
</P>
<P>IMPORTANT NOTE: The periodic image flags of atoms in rigid bodies are
altered so that the rigid body can be reconstructed correctly when it
straddles periodic boundaries. The atom image flags are not
incremented/decremented as they would be for non-rigid atoms as the
rigid body crosses periodic boundaries. Specifically, they are set so
that the center-of-mass (COM) of the rigid body always remains inside
the simulation box.
</P>
<P>This means that if you output per-atom image flags you cannot
interpret them as you normally would. I.e. the image flag values
written to a <A HREF = "dump.html">dump file</A> will be different than they would
be if the atoms were not in a rigid body. Likewise the <A HREF = "compute_msd.html">compute
msd</A> will not compute the expected mean-squared
displacement for such atoms if the body moves across periodic
boundaries. It also means that if you have bonds between a pair of
rigid bodies and the bond straddles a periodic boundary, you cannot
use the <A HREF = "replicate.html">replicate</A> command to increase the system
size.
</P>
<P>Here are details on how, you can post-process a dump file to calculate
a diffusion coefficient for rigid bodies, using the altered per-atom
image flags written to a dump file. The image flags for atoms in the
same rigid body can be used to unwrap the body and calculate its
center-of-mass (COM). As mentioned above, this COM will always be
inside the simulation box. Thus it will "jump" from one side of the
box to the other when the COM crosses a periodic boundary. If you
keep track of the jumps, you can effectively "unwrap" the COM and use
that value to track the displacement of each rigid body, and thus the
mean-squared displacement (MSD) of an ensemble of bodies, and thus a
diffusion coefficient.
</P>
<P>Note that fix rigid does define image flags for each rigid body, which
are incremented when the center-of-mass of the rigid body crosses a
periodic boundary in the usual way. These image flags have the same
meaning as atom images (see the "dump" command) and can be accessed
and output as described below.
</P>
<HR>
<P>If your simlulation is a hybrid model with a mixture of rigid bodies
and non-rigid particles (e.g. solvent) there are several ways these
rigid fixes can be used in tandem with <A HREF = "fix_nve.html">fix nve</A>, <A HREF = "fix_nh.html">fix
nvt</A>, <A HREF = "fix_nh.html">fix npt</A>, and <A HREF = "fix_nh.html">fix nph</A>.
</P>
<P>If you wish to perform NVE dynamics (no thermostatting or
barostatting), use fix rigid or fix rigid/nve to integrate the rigid
bodies, and <A HREF = "fix_nve.html">fix nve</A> to integrate the non-rigid
particles.
</P>
<P>If you wish to perform NVT dynamics (thermostatting, but no
barostatting), you can use fix rigid/nvt for the rigid bodies, and any
thermostatting fix for the non-rigid particles (<A HREF = "fix_nh.html">fix nvt</A>,
<A HREF = "fix_langevin.html">fix langevin</A>, <A HREF = "fix_temp_berendsen.html">fix
temp/berendsen</A>). You can also use fix rigid
or fix rigid/nve for the rigid bodies and thermostat them using <A HREF = "fix_langevin.html">fix
langevin</A> on the group that contains all the
particles in the rigid bodies. The net force added by <A HREF = "fix_langevin.html">fix
langevin</A> to each rigid body effectively thermostats
its translational center-of-mass motion. Not sure how well it does at
thermostatting its rotational motion.
</P>
<P>If you with to perform NPT or NPH dynamics (barostatting), you cannot
use both <A HREF = "fix_nh.html">fix npt</A> and fix rigid/npt (or the nph
variants). This is because there can only be one fix which monitors
the global pressure and changes the simulation box dimensions. So you
have 3 choices:
</P>
<UL><LI>Use fix rigid/npt for the rigid bodies. Use the <I>dilate</I> all option
so that it will dilate the positions of the non-rigid particles as
well. Use <A HREF = "fix_nh.html">fix nvt</A> (or any other thermostat) for the
non-rigid particles.
<LI>Use <A HREF = "fix_nh.html">fix npt</A> for the group of non-rigid particles. Use
the <I>dilate</I> all option so that it will dilate the center-of-mass
positions of the rigid bodies as well. Use fix rigid/nvt for the
rigid bodies.
<LI>Use <A HREF = "fix_press_berendsen.html">fix press/berendsen</A> to compute the
pressure and change the box dimensions. Use fix rigid/nvt for the
rigid bodies. Use <A HREF = "fix_nh.thml">fix nvt</A> (or any other thermostat) for
the non-rigid particles.
</UL>
<P>In all case, the rigid bodies and non-rigid particles both contribute
to the global pressure and the box is scaled the same by any of the
barostatting fixes.
</P>
<P>You could even use the 2nd and 3rd options for a non-hybrid simulation
consisting of only rigid bodies, assuming you give <A HREF = "fix_nh.html">fix
npt</A> an empty group, though it's an odd thing to do. The
barostatting fixes (<A HREF = "fix_nh.html">fix npt</A> and <A HREF = "fix_press_berendsen.html">fix
press/berensen</A>) will monitor the pressure
and change the box dimensions, but not time integrate any particles.
The integration of the rigid bodies will be performed by fix
rigid/nvt.
</P>
<HR>
<P>Styles with a <I>cuda</I>, <I>gpu</I>, <I>omp</I>, or <I>opt</I> suffix are functionally
the same as the corresponding style without the suffix. They have
been optimized to run faster, depending on your available hardware, as
discussed in <A HREF = "Section_accelerate.html">Section_accelerate</A> of the
manual. The accelerated styles take the same arguments and should
produce the same results, except for round-off and precision issues.
</P>
<P>These accelerated styles are part of the USER-CUDA, GPU, USER-OMP and OPT
packages, respectively. They are only enabled if LAMMPS was built with
those packages. See the <A HREF = "Section_start.html#start_3">Making LAMMPS</A>
section for more info.
</P>
<P>You can specify the accelerated styles explicitly in your input script
by including their suffix, or you can use the <A HREF = "Section_start.html#start_7">-suffix command-line
switch</A> when you invoke LAMMPS, or you can
use the <A HREF = "suffix.html">suffix</A> command in your input script.
</P>
<P>See <A HREF = "Section_accelerate.html">Section_accelerate</A> of the manual for
more instructions on how to use the accelerated styles effectively.
</P>
<HR>
<P><B>Restart, fix_modify, output, run start/stop, minimize info:</B>
</P>
<P>No information about the <I>rigid</I> and <I>rigid/small</I> and <I>rigid/nve</I>
fixes are written to <A HREF = "restart.html">binary restart files</A>. For style
<I>rigid/nvt</I> the state of the Nose/Hoover thermostat is written to
<A HREF = "restart.html">binary restart files</A>. See the
<A HREF = "read_restart.html">read_restart</A> command for info on how to re-specify
a fix in an input script that reads a restart file, so that the
operation of the fix continues in an uninterrupted fashion.
</P>
<P>The <A HREF = "fix_modify.html">fix_modify</A> <I>energy</I> option is supported by the
rigid/nvt fix to add the energy change induced by the thermostatting
to the system's potential energy as part of <A HREF = "thermo_style.html">thermodynamic
output</A>.
</P>
<P>The <A HREF = "fix_modify.html">fix_modify</A> <I>temp</I> and <I>press</I> options are
supported by the rigid/npt and rigid/nph fixes to change the computes used
to calculate the instantaneous pressure tensor. Note that the rigid/nvt fix
does not use any external compute to compute instantaneous temperature.
</P>
<P>The <I>rigid</I> and <I>rigid/small</I> and <I>rigid/nve</I> fixes compute a global
scalar which can be accessed by various <A HREF = "Section_howto.html#howto_15">output
commands</A>. The scalar value calculated by
these fixes is "intensive". The scalar is the current temperature of
the collection of rigid bodies. This is averaged over all rigid
bodies and their translational and rotational degrees of freedom. The
translational energy of a rigid body is 1/2 m v^2, where m = total
mass of the body and v = the velocity of its center of mass. The
rotational energy of a rigid body is 1/2 I w^2, where I = the moment
of inertia tensor of the body and w = its angular velocity. Degrees
of freedom constrained by the <I>force</I> and <I>torque</I> keywords are
removed from this calculation, but only for the <I>rigid</I> and
<I>rigid/nve</I> fixes.
</P>
<P>The <I>rigid/nvt</I>, <I>rigid/npt</I>, and <I>rigid/nph</I> fixes compute a global
scalar which can be accessed by various <A HREF = "Section_howto.html#howto_15">output
commands</A>. The scalar value calculated by
these fixes is "extensive". The scalar is the cumulative energy
change due to the thermostatting and barostatting the fix performs.
</P>
<P>All of the <I>rigid</I> fixes except <I>rigid/small</I> compute a global array
of values which can be accessed by various <A HREF = "Section_howto.html#howto_15">output
commands</A>. The number of rows in the
array is equal to the number of rigid bodies. The number of columns
is 15. Thus for each rigid body, 15 values are stored: the xyz coords
of the center of mass (COM), the xyz components of the COM velocity,
the xyz components of the force acting on the COM, the xyz components
of the torque acting on the COM, and the xyz image flags of the COM,
which have the same meaning as image flags for atom positions (see the
"dump" command). The force and torque values in the array are not
affected by the <I>force</I> and <I>torque</I> keywords in the fix rigid
command; they reflect values before any changes are made by those
keywords.
</P>
<P>The ordering of the rigid bodies (by row in the array) is as follows.
For the <I>single</I> keyword there is just one rigid body. For the
<I>molecule</I> keyword, the bodies are ordered by ascending molecule ID.
For the <I>group</I> keyword, the list of group IDs determines the ordering
of bodies.
</P>
<P>The array values calculated by these fixes are "intensive", meaning
they are independent of the number of atoms in the simulation.
</P>
<P>No parameter of these fixes can be used with the <I>start/stop</I> keywords
of the <A HREF = "run.html">run</A> command. These fixes are not invoked during
<A HREF = "minimize.html">energy minimization</A>.
</P>
<HR>
<P><B>Restrictions:</B>
</P>
<P>These fixes are all part of the RIGID package. It is only enabled if
LAMMPS was built with that package. See the <A HREF = "Section_start.html#start_3">Making
LAMMPS</A> section for more info.
</P>
<P><B>Related commands:</B>
</P>
<P><A HREF = "delete_bonds.html">delete_bonds</A>, <A HREF = "neigh_modify.html">neigh_modify</A>
exclude
</P>
<P><B>Default:</B>
</P>
<P>The option defaults are force * on on on and torque * on on on,
meaning all rigid bodies are acted on by center-of-mass force and
torque. Also Tchain = Pchain = 10, Titer = 1, Torder = 3.
</P>
<HR>
<A NAME = "Hoover"></A>
<P><B>(Hoover)</B> Hoover, Phys Rev A, 31, 1695 (1985).
</P>
<A NAME = "Kamberaj"></A>
<P><B>(Kamberaj)</B> Kamberaj, Low, Neal, J Chem Phys, 122, 224114 (2005).
</P>
<A NAME = "Martyna"></A>
<P><B>(Martyna)</B> Martyna, Klein, Tuckerman, J Chem Phys, 97, 2635 (1992);
Martyna, Tuckerman, Tobias, Klein, Mol Phys, 87, 1117.
</P>
<A NAME = "Miller"></A>
<P><B>(Miller)</B> Miller, Eleftheriou, Pattnaik, Ndirango, and Newns,
J Chem Phys, 116, 8649 (2002).
</P>
<A NAME = "Zhang"></A>
<P><B>(Zhang)</B> Zhang, Glotzer, Nanoletters, 4, 1407-1413 (2004).
</P>
</HTML>
diff --git a/doc/fix_rigid.txt b/doc/fix_rigid.txt
index e69345698..948b8e14e 100644
--- a/doc/fix_rigid.txt
+++ b/doc/fix_rigid.txt
@@ -1,716 +1,719 @@
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
:link(lws,http://lammps.sandia.gov)
:link(ld,Manual.html)
:link(lc,Section_commands.html#comm)
:line
fix rigid command :h3
fix rigid/nve command :h3
fix rigid/nvt command :h3
fix rigid/npt command :h3
fix rigid/nph command :h3
fix rigid/small command :h3
[Syntax:]
fix ID group-ID style bodystyle args keyword values ... :pre
ID, group-ID are documented in "fix"_fix.html command :ulb,l
style = {rigid} or {rigid/nve} or {rigid/nvt} or {rigid/npt} or {rigid/nph} or {rigid/small} :l
bodystyle = {single} or {molecule} or {group} :l
{single} args = none
{molecule} args = none
{group} args = N groupID1 groupID2 ...
N = # of groups
groupID1, groupID2, ... = list of N group IDs :pre
zero or more keyword/value pairs may be appended :l
keyword = {langevin} or {temp} or {iso} or {aniso} or {x} or {y} or {z} or {couple} or {tparam} or {pchain} or {dilate} or {force} or {torque} or {infile} :l
{langevin} values = Tstart Tstop Tperiod seed
Tstart,Tstop = desired temperature at start/stop of run (temperature units)
Tdamp = temperature damping parameter (time units)
seed = random number seed to use for white noise (positive integer)
{temp} values = Tstart Tstop Tdamp
Tstart,Tstop = desired temperature at start/stop of run (temperature units)
Tdamp = temperature damping parameter (time units)
{iso} or {aniso} values = Pstart Pstop Pdamp
Pstart,Pstop = scalar external pressure at start/end of run (pressure units)
Pdamp = pressure damping parameter (time units)
{x} or {y} or {z} values = Pstart Pstop Pdamp
Pstart,Pstop = external stress tensor component at start/end of run (pressure units)
Pdamp = stress damping parameter (time units)
{couple} = {none} or {xyz} or {xy} or {yz} or {xz}
{tparam} values = Tchain Titer Torder
Tchain = length of Nose/Hoover thermostat chain
Titer = number of thermostat iterations performed
Torder = 3 or 5 = Yoshida-Suzuki integration parameters
{pchain} values = Pchain
Pchain = length of the Nose/Hoover thermostat chain coupled with the barostat
{dilate} value = dilate-group-ID
dilate-group-ID = only dilate atoms in this group due to barostat volume changes
{force} values = M xflag yflag zflag
M = which rigid body from 1-Nbody (see asterisk form below)
xflag,yflag,zflag = off/on if component of center-of-mass force is active
{torque} values = M xflag yflag zflag
M = which rigid body from 1-Nbody (see asterisk form below)
xflag,yflag,zflag = off/on if component of center-of-mass torque is active
{infile} filename
filename = file with per-body values of mass, center-of-mass, moments of inertia :pre
:ule
[Examples:]
fix 1 clump rigid single
fix 1 clump rigid/small molecule
fix 1 clump rigid single force 1 off off on langevin 1.0 1.0 1.0 428984
fix 1 polychains rigid/nvt molecule temp 1.0 1.0 5.0
fix 1 polychains rigid molecule force 1*5 off off off force 6*10 off off on
fix 1 polychains rigid/small molecule langevin 1.0 1.0 1.0 428984
fix 2 fluid rigid group 3 clump1 clump2 clump3 torque * off off off
fix 1 rods rigid/npt molecule temp 300.0 300.0 100.0 iso 0.5 0.5 10.0
fix 1 particles rigid/npt molecule temp 1.0 1.0 5.0 x 0.5 0.5 1.0 z 0.5 0.5 1.0 couple xz
fix 1 water rigid/nph molecule iso 0.5 0.5 1.0 :pre
[Description:]
Treat one or more sets of atoms as independent rigid bodies. This
means that each timestep the total force and torque on each rigid body
is computed as the sum of the forces and torques on its constituent
particles and the coordinates, velocities, and orientations of the
atoms in each body are updated so that the body moves and rotates as a
single entity.
Examples of large rigid bodies are a large colloidal particle, or
portions of a large biomolecule such as a protein.
Example of small rigid bodies are patchy nanoparticles, such as those
modeled in "this paper"_#Zhang by Sharon Glotzer's group, clumps of
granular particles, lipid molecules consiting of one or more point
dipoles connected to other spheroids or ellipsoids, irregular
particles built from line segments (2d) or triangles (3d), and
coarse-grain models of nano or colloidal particles consisting of a
small number of constituent particles. Note that the "fix
shake"_fix_shake.html command can also be used to rigidify small
molecules of 2, 3, or 4 atoms, e.g. water molecules. That fix treats
the constituent atoms as point masses.
These fixes also update the positions and velocities of the atoms in
each rigid body via time integration, in the NVE, NVT, NPT, or NPH
ensemble, as described below.
There are two main variants of this fix, fix rigid and fix
rigid/small. The NVE/NVT/NPT/NHT versions belong to one of the two
variants, as their style names indicate.
IMPORTANT NOTE: Not all of the bodystyle options and keyword/value
options are available for both the {rigid} and {rigid/small} variants.
See details below.
The {rigid} variant is typically the best choice for a system with a
small number of large rigid bodies, each of which can extend across
the domain of many processors. It operates by creating a single
global list of rigid bodies, which all processors contribute to.
MPI_Allreduce operations are performed each timestep to sum the
contributions from each processor to the force and torque on all the
bodies. This operation will not scale well in parallel if large
numbers of rigid bodies are simulated.
The {rigid/small} variant is typically best for a system with a large
number of small rigid bodies. Each body is assigned to the atom
closest to the geometrical center of the body. The fix operates using
local lists of rigid bodies owned by each processor and information is
exchanged and summed via local communication between neighboring
processors when ghost atom info is accumlated.
IMPORTANT NOTE: To use {rigid/small} the ghost atom cutoff must be
large enough to span the distance between the atom that owns the body
and every other atom in the body. This distance value is printed out
when the rigid bodies are defined. If the
"pair_style"_pair_style.html cutoff plus neighbor skin does not span
this distance, then you should use the "communicate
cutoff"_communicate.html command with a setting epsilon larger than
the distance.
Which of the two variants is faster for a particular problem is hard
to predict. The best way to decide is to perform a short test run.
Both variants should give identical numerical answers for short runs.
Long runs should give statistically similar results, but round-off
differences will accumulate to produce divergent trajectories.
IMPORTANT NOTE: You should not update the atoms in rigid bodies via
other time-integration fixes (e.g. "fix nve"_fix_nve.html, "fix
nvt"_fix_nvt.html, "fix npt"_fix_npt.html), or you will be integrating
their motion more than once each timestep. When performing a hybrid
simulation with some atoms in rigid bodies, and some not, a separate
time integration fix like "fix nve"_fix_nve.html or "fix
nvt"_fix_nh.html should be used for the non-rigid particles.
IMPORTANT NOTE: These fixes are overkill if you simply want to hold a
collection of atoms stationary or have them move with a constant
velocity. A simpler way to hold atoms stationary is to not include
those atoms in your time integration fix. E.g. use "fix 1 mobile nve"
instead of "fix 1 all nve", where "mobile" is the group of atoms that
you want to move. You can move atoms with a constant velocity by
assigning them an initial velocity (via the "velocity"_velocity.html
command), setting the force on them to 0.0 (via the "fix
setforce"_fix_setforce.html command), and integrating them as usual
(e.g. via the "fix nve"_fix_nve.html command).
:line
Each rigid body must have two or more atoms. An atom can belong to at
most one rigid body. Which atoms are in which bodies can be defined
via several options.
For bodystyle {single} the entire fix group of atoms is treated as one
rigid body. This option is only allowed for fix rigid and its
sub-styles.
For bodystyle {molecule}, each set of atoms in the fix group with a
different molecule ID is treated as a rigid body. This option is
allowed for fix rigid and fix rigid/small, and their sub-styles. Note
that atoms with a molecule ID = 0 will be treated as a single rigid
body. For a system with atomic solvent (typically this is atoms with
molecule ID = 0) surrounding rigid bodies, this may not be what you
want. Thus you should be careful to use a fix group that only
includes atoms you want to be part of rigid bodies.
For bodystyle {group}, each of the listed groups is treated as a
separate rigid body. Only atoms that are also in the fix group are
included in each rigid body. This option is only allowed for fix
rigid and its sub-styles.
IMPORTANT NOTE: To compute the initial center-of-mass position and
other properties of each rigid body, the image flags for each atom in
the body are used to "unwrap" the atom coordinates. Thus you must
insure that these image flags are consistent so that the unwrapping
creates a valid rigid body (one where the atoms are close together),
particularly if the atoms in a single rigid body straddle a periodic
boundary. This means the input data file or restart file must define
the image flags for each atom consistently or that you have used the
"set"_set.html command to specify them correctly. If a dimension is
non-periodic then the image flag of each atom must be 0 in that
dimension, else an error is generated.
The {force} and {torque} keywords discussed next are only allowed for
fix rigid and its sub-styles.
By default, each rigid body is acted on by other atoms which induce an
external force and torque on its center of mass, causing it to
translate and rotate. Components of the external center-of-mass force
and torque can be turned off by the {force} and {torque} keywords.
This may be useful if you wish a body to rotate but not translate, or
vice versa, or if you wish it to rotate or translate continuously
unaffected by interactions with other particles. Note that if you
expect a rigid body not to move or rotate by using these keywords, you
must insure its initial center-of-mass translational or angular
velocity is 0.0. Otherwise the initial translational or angular
momentum the body has will persist.
An xflag, yflag, or zflag set to {off} means turn off the component of
force of torque in that dimension. A setting of {on} means turn on
the component, which is the default. Which rigid body(s) the settings
apply to is determined by the first argument of the {force} and
{torque} keywords. It can be an integer M from 1 to Nbody, where
Nbody is the number of rigid bodies defined. A wild-card asterisk can
be used in place of, or in conjunction with, the M argument to set the
flags for multiple rigid bodies. This takes the form "*" or "*n" or
"n*" or "m*n". If N = the number of rigid bodies, then an asterisk
with no numeric values means all bodies from 1 to N. A leading
asterisk means all bodies from 1 to n (inclusive). A trailing
asterisk means all bodies from n to N (inclusive). A middle asterisk
means all types from m to n (inclusive). Note that you can use the
{force} or {torque} keywords as many times as you like. If a
particular rigid body has its component flags set multiple times, the
settings from the final keyword are used.
For computational efficiency, you may wish to turn off pairwise and
bond interactions within each rigid body, as they no longer contribute
to the motion. The "neigh_modify exclude"_neigh_modify.html and
"delete_bonds"_delete_bonds.html commands are used to do this.
For computational efficiency, you should typically define one fix
rigid or fix rigid/small command which includes all the desired rigid
bodies. LAMMPS will allow multiple rigid fixes to be defined, but it
is more expensive.
:line
The constituent particles within a rigid body can be point particles
(the default in LAMMPS) or finite-size particles, such as spheres or
ellipsoids or line segments or triangles. See the "atom_style sphere
and ellipsoid and line and tri"_atom_style.html commands for more
details on these kinds of particles. Finite-size particles contribute
differently to the moment of inertia of a rigid body than do point
particles. Finite-size particles can also experience torque (e.g. due
to "frictional granular interactions"_pair_gran.html) and have an
orientation. These contributions are accounted for by these fixes.
Forces between particles within a body do not contribute to the
external force or torque on the body. Thus for computational
efficiency, you may wish to turn off pairwise and bond interactions
between particles within each rigid body. The "neigh_modify
exclude"_neigh_modify.html and "delete_bonds"_delete_bonds.html
commands are used to do this. For finite-size particles this also
means the particles can be highly overlapped when creating the rigid
body.
:line
The {rigid} and {rigid/small} and {rigid/nve} styles perform constant
NVE time integration. The only difference is that the {rigid} and
{rigid/small} styles use an integration technique based on Richardson
iterations. The {rigid/nve} style uses the methods described in the
paper by "Miller"_#Miller, which are thought to provide better energy
conservation than an iterative approach.
The {rigid/nvt} style performs constant NVT integration using a
Nose/Hoover thermostat with chains as described originally in
"(Hoover)"_#Hoover and "(Martyna)"_#Martyna, which thermostats both
the translational and rotational degrees of freedom of the rigid
bodies. The rigid-body algorithm used by {rigid/nvt} is described in
the paper by "Kamberaj"_#Kamberaj.
The {rigid/npt} and {rigid/nph} styles perform constant NPT or NPH
integration using a Nose/Hoover barostat with chains. For the NPT
case, the same Nose/Hoover thermostat is also used as with
{rigid/nvt}.
The barostat parameters are specified using one or more of the {iso},
{aniso}, {x}, {y}, {z} and {couple} keywords. These keywords give you
the ability to specify 3 diagonal components of the external stress
tensor, and to couple these components together so that the dimensions
they represent are varied together during a constant-pressure
simulation. The effects of these keywords are similar to those
defined in "fix npt/nph"_fix_nh.html
NOTE: Currently the {rigid/npt} and {rigid/nph} styles do not support
triclinic (non-orthongonal) boxes.
The target pressures for each of the 6 components of the stress tensor
can be specified independently via the {x}, {y}, {z} keywords, which
correspond to the 3 simulation box dimensions. For each component,
the external pressure or tensor component at each timestep is a ramped
value during the run from {Pstart} to {Pstop}. If a target pressure is
specified for a component, then the corresponding box dimension will
change during a simulation. For example, if the {y} keyword is used,
the y-box length will change. A box dimension will not change if that
component is not specified, although you have the option to change
that dimension via the "fix deform"_fix_deform.html command.
For all barostat keywords, the {Pdamp} parameter operates like the
{Tdamp} parameter, determining the time scale on which pressure is
relaxed. For example, a value of 10.0 means to relax the pressure in
a timespan of (roughly) 10 time units (e.g. tau or fmsec or psec - see
the "units"_units.html command).
Regardless of what atoms are in the fix group (the only atoms which
are time integrated), a global pressure or stress tensor is computed
for all atoms. Similarly, when the size of the simulation box is
changed, all atoms are re-scaled to new positions, unless the keyword
{dilate} is specified with a {dilate-group-ID} for a group that
represents a subset of the atoms. This can be useful, for example, to
leave the coordinates of atoms in a solid substrate unchanged and
controlling the pressure of a surrounding fluid. Another example is a
system consisting of rigid bodies and point particles where the
barostat is only coupled with the rigid bodies. This option should be
used with care, since it can be unphysical to dilate some atoms and
not others, because it can introduce large, instantaneous
displacements between a pair of atoms (one dilated, one not) that are
far from the dilation origin.
The {couple} keyword allows two or three of the diagonal components of
the pressure tensor to be "coupled" together. The value specified
with the keyword determines which are coupled. For example, {xz}
means the {Pxx} and {Pzz} components of the stress tensor are coupled.
{Xyz} means all 3 diagonal components are coupled. Coupling means two
things: the instantaneous stress will be computed as an average of the
corresponding diagonal components, and the coupled box dimensions will
be changed together in lockstep, meaning coupled dimensions will be
dilated or contracted by the same percentage every timestep. The
{Pstart}, {Pstop}, {Pdamp} parameters for any coupled dimensions must
be identical. {Couple xyz} can be used for a 2d simulation; the {z}
dimension is simply ignored.
The {iso} and {aniso} keywords are simply shortcuts that are
equivalent to specifying several other keywords together.
The keyword {iso} means couple all 3 diagonal components together when
pressure is computed (hydrostatic pressure), and dilate/contract the
dimensions together. Using "iso Pstart Pstop Pdamp" is the same as
specifying these 4 keywords:
x Pstart Pstop Pdamp
y Pstart Pstop Pdamp
z Pstart Pstop Pdamp
couple xyz :pre
The keyword {aniso} means {x}, {y}, and {z} dimensions are controlled
independently using the {Pxx}, {Pyy}, and {Pzz} components of the
stress tensor as the driving forces, and the specified scalar external
pressure. Using "aniso Pstart Pstop Pdamp" is the same as specifying
these 4 keywords:
x Pstart Pstop Pdamp
y Pstart Pstop Pdamp
z Pstart Pstop Pdamp
couple none :pre
:line
The keyword/value option pairs are used in the following ways.
The {langevin} and {temp} and {tparam} keywords perform thermostatting
of the rigid bodies, altering both their translational and rotational
degrees of freedom. What is meant by "temperature" of a collection of
rigid bodies and how it can be monitored via the fix output is
discussed below.
The {langevin} keyword applies a Langevin thermostat to the constant
NVE time integration performed by either the {rigid} or {rigid/small}
or {rigid/nve} styles. It cannot be used with the {rigid/nvt} style.
The desired temperature at each timestep is a ramped value during the
run from {Tstart} to {Tstop}. The {Tdamp} parameter is specified in
time units and determines how rapidly the temperature is relaxed. For
example, a value of 100.0 means to relax the temperature in a timespan
of (roughly) 100 time units (tau or fmsec or psec - see the
"units"_units.html command). The random # {seed} must be a positive
integer. The way the Langevin thermostatting operates is explained on
the "fix langevin"_fix_langevin.html doc page.
IMPORTANT NOTE: When the {langevin} keyword is used with fix rigid
versus fix rigid/small, different dynamics will result for parallel
runs. This is because of the way random numbers are used in the two
cases. The dynamics for the two cases should be statistically
similar, but will not be identical, even for a single timestep.
The {temp} and {tparam} keywords apply a Nose/Hoover thermostat to the
NVT time integration performed by the {rigid/nvt} style. They cannot
be used with the {rigid} or {rigid/small} or {rigid/nve} styles. The
desired temperature at each timestep is a ramped value during the run
from {Tstart} to {Tstop}. The {Tdamp} parameter is specified in time
units and determines how rapidly the temperature is relaxed. For
example, a value of 100.0 means to relax the temperature in a timespan
of (roughly) 100 time units (tau or fmsec or psec - see the
"units"_units.html command).
Nose/Hoover chains are used in conjunction with this thermostat. The
{tparam} keyword can optionally be used to change the chain settings
used. {Tchain} is the number of thermostats in the Nose Hoover chain.
This value, along with {Tdamp} can be varied to dampen undesirable
oscillations in temperature that can occur in a simulation. As a rule
of thumb, increasing the chain length should lead to smaller
oscillations. The keyword {pchain} specifies the number of
thermostats in the chain thermostatting the barostat degrees of
freedom.
IMPORTANT NOTE: There are alternate ways to thermostat a system of
rigid bodies. You can use "fix langevin"_fix_langevin.html to treat
the individual particles in the rigid bodies as effectively immersed
in an implicit solvent, e.g. a Brownian dynamics model. For hybrid
systems with both rigid bodies and solvent particles, you can
thermostat only the solvent particles that surround one or more rigid
bodies by appropriate choice of groups in the compute and fix commands
for temperature and thermostatting. The solvent interactions with the
rigid bodies should then effectively thermostat the rigid body
temperature as well without use of the Langevin or Nose/Hoover options
associated with the fix rigid commands.
The {infile} keyword allows a file of rigid body attributes to be read
in from a file, rather then having LAMMPS compute them. There are 3
such attributes: the total mass of the rigid body, its center-of-mass
position, and its 6 moments of inertia. For rigid bodies consisting
of point particles or non-overlapping finite-size particles, LAMMPS
can compute these values accurately. However, for rigid bodies
consisting of finite-size particles which overlap each other, LAMMPS
will ignore the overlaps when computing these 3 attributes. The
amount of error this induces depends on the amount of overlap. To
avoid this issue, the values can be pre-computed (e.g. using Monte
Carlo integration).
The format of the file is as follows. Note that the file does not
have to list attributes for every rigid body integrated by fix rigid.
Only bodies which the file specifies will have their computed
attributes overridden. The file can contain initial blank lines or
comment lines starting with "#" which are ignored. The first
non-blank, non-comment line should list N = the number of lines to
follow. The N successive lines contain the following information:
ID1 masstotal xcm ycm zcm ixx iyy izz ixy ixz iyz
ID2 masstotal xcm ycm zcm ixx iyy izz ixy ixz iyz
...
IDN masstotal xcm ycm zcm ixx iyy izz ixy ixz iyz :pre
The rigid body IDs are all positive integers. For the {single}
bodystyle, only an ID of 1 can be used. For the {group} bodystyle,
IDs from 1 to Ng can be used where Ng is the number of specified
groups. For the {molecule} bodystyle, use the molecule ID for the
atoms in a specific rigid body as the rigid body ID.
The masstotal and center-of-mass coordinates (xcm,ycm,zcm) are
self-explanatory. The center-of-mass should be consistent with what
is calculated for the position of the rigid body with all its atoms
unwrapped by their respective image flags. If this produces a
center-of-mass that is outside the simulation box, LAMMPS wraps it
back into the box. The 6 moments of inertia (ixx,iyy,izz,ixy,ixz,iyz)
should be the values consistent with the current orientation of the
rigid body around its center of mass. The values are with respect to
the simulation box XYZ axes, not with respect to the prinicpal axes of
the rigid body itself. LAMMPS performs the latter calculation
internally.
-IMPORTANT NOTE: The last point means that you cannot restart a
-simulation with rigid bodies using the
-"read_restart"_read_restart.html command and use the same {infile} of
-rigid body attributes as input for the 2nd simulation, if the rigid
-bodies have moved or rotated. Instead, you need to produce a new
-{infile} that reflects the correct attributes for each rigid body at
-the time of restart. We are thinking about a good way to make this
-process easier.
+IMPORTANT NOTE: If you use the {infile} keyword and write restart
+files during a simulation, then each time a restart file is written,
+the fix also write an auxiliary restart file with the name
+rfile.rigid, where "rfile" is the name of the restart file,
+e.g. tmp.restart.10000 and tmp.restart.10000.rigid. This auxiliary
+file is in the same format described above and contains info on the
+current center-of-mass and 6 moments of inertia. Thus it can be used
+in a new input script that restarts the run and re-specifies a rigid
+fix using an {infile} keyword and the appropriate filename. Note that
+the auxiliary file will contain one line for every rigid body, even if
+the original file only listed a subset of the rigid bodies.
:line
If you use a "temperature compute"_compute.html with a group that
includes particles in rigid bodies, the degrees-of-freedom removed by
each rigid body are accounted for in the temperature (and pressure)
computation, but only if the temperature group includes all the
particles in a particular rigid body.
A 3d rigid body has 6 degrees of freedom (3 translational, 3
rotational), except for a collection of point particles lying on a
straight line, which has only 5, e.g a dimer. A 2d rigid body has 3
degrees of freedom (2 translational, 1 rotational).
IMPORTANT NOTE: You may wish to explicitly subtract additional
degrees-of-freedom if you use the {force} and {torque} keywords to
eliminate certain motions of one or more rigid bodies. LAMMPS does
not do this automatically.
The rigid body contribution to the pressure of the system (virial) is
also accounted for by this fix.
IMPORTANT NOTE: The periodic image flags of atoms in rigid bodies are
altered so that the rigid body can be reconstructed correctly when it
straddles periodic boundaries. The atom image flags are not
incremented/decremented as they would be for non-rigid atoms as the
rigid body crosses periodic boundaries. Specifically, they are set so
that the center-of-mass (COM) of the rigid body always remains inside
the simulation box.
This means that if you output per-atom image flags you cannot
interpret them as you normally would. I.e. the image flag values
written to a "dump file"_dump.html will be different than they would
be if the atoms were not in a rigid body. Likewise the "compute
msd"_compute_msd.html will not compute the expected mean-squared
displacement for such atoms if the body moves across periodic
boundaries. It also means that if you have bonds between a pair of
rigid bodies and the bond straddles a periodic boundary, you cannot
use the "replicate"_replicate.html command to increase the system
size.
Here are details on how, you can post-process a dump file to calculate
a diffusion coefficient for rigid bodies, using the altered per-atom
image flags written to a dump file. The image flags for atoms in the
same rigid body can be used to unwrap the body and calculate its
center-of-mass (COM). As mentioned above, this COM will always be
inside the simulation box. Thus it will "jump" from one side of the
box to the other when the COM crosses a periodic boundary. If you
keep track of the jumps, you can effectively "unwrap" the COM and use
that value to track the displacement of each rigid body, and thus the
mean-squared displacement (MSD) of an ensemble of bodies, and thus a
diffusion coefficient.
Note that fix rigid does define image flags for each rigid body, which
are incremented when the center-of-mass of the rigid body crosses a
periodic boundary in the usual way. These image flags have the same
meaning as atom images (see the "dump" command) and can be accessed
and output as described below.
:line
If your simlulation is a hybrid model with a mixture of rigid bodies
and non-rigid particles (e.g. solvent) there are several ways these
rigid fixes can be used in tandem with "fix nve"_fix_nve.html, "fix
nvt"_fix_nh.html, "fix npt"_fix_nh.html, and "fix nph"_fix_nh.html.
If you wish to perform NVE dynamics (no thermostatting or
barostatting), use fix rigid or fix rigid/nve to integrate the rigid
bodies, and "fix nve"_fix_nve.html to integrate the non-rigid
particles.
If you wish to perform NVT dynamics (thermostatting, but no
barostatting), you can use fix rigid/nvt for the rigid bodies, and any
thermostatting fix for the non-rigid particles ("fix nvt"_fix_nh.html,
"fix langevin"_fix_langevin.html, "fix
temp/berendsen"_fix_temp_berendsen.html). You can also use fix rigid
or fix rigid/nve for the rigid bodies and thermostat them using "fix
langevin"_fix_langevin.html on the group that contains all the
particles in the rigid bodies. The net force added by "fix
langevin"_fix_langevin.html to each rigid body effectively thermostats
its translational center-of-mass motion. Not sure how well it does at
thermostatting its rotational motion.
If you with to perform NPT or NPH dynamics (barostatting), you cannot
use both "fix npt"_fix_nh.html and fix rigid/npt (or the nph
variants). This is because there can only be one fix which monitors
the global pressure and changes the simulation box dimensions. So you
have 3 choices:
Use fix rigid/npt for the rigid bodies. Use the {dilate} all option
so that it will dilate the positions of the non-rigid particles as
well. Use "fix nvt"_fix_nh.html (or any other thermostat) for the
non-rigid particles. :ulb,l
Use "fix npt"_fix_nh.html for the group of non-rigid particles. Use
the {dilate} all option so that it will dilate the center-of-mass
positions of the rigid bodies as well. Use fix rigid/nvt for the
rigid bodies. :l
Use "fix press/berendsen"_fix_press_berendsen.html to compute the
pressure and change the box dimensions. Use fix rigid/nvt for the
rigid bodies. Use "fix nvt"_fix_nh.thml (or any other thermostat) for
the non-rigid particles. :l,ule
In all case, the rigid bodies and non-rigid particles both contribute
to the global pressure and the box is scaled the same by any of the
barostatting fixes.
You could even use the 2nd and 3rd options for a non-hybrid simulation
consisting of only rigid bodies, assuming you give "fix
npt"_fix_nh.html an empty group, though it's an odd thing to do. The
barostatting fixes ("fix npt"_fix_nh.html and "fix
press/berensen"_fix_press_berendsen.html) will monitor the pressure
and change the box dimensions, but not time integrate any particles.
The integration of the rigid bodies will be performed by fix
rigid/nvt.
:line
Styles with a {cuda}, {gpu}, {omp}, or {opt} suffix are functionally
the same as the corresponding style without the suffix. They have
been optimized to run faster, depending on your available hardware, as
discussed in "Section_accelerate"_Section_accelerate.html of the
manual. The accelerated styles take the same arguments and should
produce the same results, except for round-off and precision issues.
These accelerated styles are part of the USER-CUDA, GPU, USER-OMP and OPT
packages, respectively. They are only enabled if LAMMPS was built with
those packages. See the "Making LAMMPS"_Section_start.html#start_3
section for more info.
You can specify the accelerated styles explicitly in your input script
by including their suffix, or you can use the "-suffix command-line
switch"_Section_start.html#start_7 when you invoke LAMMPS, or you can
use the "suffix"_suffix.html command in your input script.
See "Section_accelerate"_Section_accelerate.html of the manual for
more instructions on how to use the accelerated styles effectively.
:line
[Restart, fix_modify, output, run start/stop, minimize info:]
No information about the {rigid} and {rigid/small} and {rigid/nve}
fixes are written to "binary restart files"_restart.html. For style
{rigid/nvt} the state of the Nose/Hoover thermostat is written to
"binary restart files"_restart.html. See the
"read_restart"_read_restart.html command for info on how to re-specify
a fix in an input script that reads a restart file, so that the
operation of the fix continues in an uninterrupted fashion.
The "fix_modify"_fix_modify.html {energy} option is supported by the
rigid/nvt fix to add the energy change induced by the thermostatting
to the system's potential energy as part of "thermodynamic
output"_thermo_style.html.
The "fix_modify"_fix_modify.html {temp} and {press} options are
supported by the rigid/npt and rigid/nph fixes to change the computes used
to calculate the instantaneous pressure tensor. Note that the rigid/nvt fix
does not use any external compute to compute instantaneous temperature.
The {rigid} and {rigid/small} and {rigid/nve} fixes compute a global
scalar which can be accessed by various "output
commands"_Section_howto.html#howto_15. The scalar value calculated by
these fixes is "intensive". The scalar is the current temperature of
the collection of rigid bodies. This is averaged over all rigid
bodies and their translational and rotational degrees of freedom. The
translational energy of a rigid body is 1/2 m v^2, where m = total
mass of the body and v = the velocity of its center of mass. The
rotational energy of a rigid body is 1/2 I w^2, where I = the moment
of inertia tensor of the body and w = its angular velocity. Degrees
of freedom constrained by the {force} and {torque} keywords are
removed from this calculation, but only for the {rigid} and
{rigid/nve} fixes.
The {rigid/nvt}, {rigid/npt}, and {rigid/nph} fixes compute a global
scalar which can be accessed by various "output
commands"_Section_howto.html#howto_15. The scalar value calculated by
these fixes is "extensive". The scalar is the cumulative energy
change due to the thermostatting and barostatting the fix performs.
All of the {rigid} fixes except {rigid/small} compute a global array
of values which can be accessed by various "output
commands"_Section_howto.html#howto_15. The number of rows in the
array is equal to the number of rigid bodies. The number of columns
is 15. Thus for each rigid body, 15 values are stored: the xyz coords
of the center of mass (COM), the xyz components of the COM velocity,
the xyz components of the force acting on the COM, the xyz components
of the torque acting on the COM, and the xyz image flags of the COM,
which have the same meaning as image flags for atom positions (see the
"dump" command). The force and torque values in the array are not
affected by the {force} and {torque} keywords in the fix rigid
command; they reflect values before any changes are made by those
keywords.
The ordering of the rigid bodies (by row in the array) is as follows.
For the {single} keyword there is just one rigid body. For the
{molecule} keyword, the bodies are ordered by ascending molecule ID.
For the {group} keyword, the list of group IDs determines the ordering
of bodies.
The array values calculated by these fixes are "intensive", meaning
they are independent of the number of atoms in the simulation.
No parameter of these fixes can be used with the {start/stop} keywords
of the "run"_run.html command. These fixes are not invoked during
"energy minimization"_minimize.html.
:line
[Restrictions:]
These fixes are all part of the RIGID package. It is only enabled if
LAMMPS was built with that package. See the "Making
LAMMPS"_Section_start.html#start_3 section for more info.
[Related commands:]
"delete_bonds"_delete_bonds.html, "neigh_modify"_neigh_modify.html
exclude
[Default:]
The option defaults are force * on on on and torque * on on on,
meaning all rigid bodies are acted on by center-of-mass force and
torque. Also Tchain = Pchain = 10, Titer = 1, Torder = 3.
:line
:link(Hoover)
[(Hoover)] Hoover, Phys Rev A, 31, 1695 (1985).
:link(Kamberaj)
[(Kamberaj)] Kamberaj, Low, Neal, J Chem Phys, 122, 224114 (2005).
:link(Martyna)
[(Martyna)] Martyna, Klein, Tuckerman, J Chem Phys, 97, 2635 (1992);
Martyna, Tuckerman, Tobias, Klein, Mol Phys, 87, 1117.
:link(Miller)
[(Miller)] Miller, Eleftheriou, Pattnaik, Ndirango, and Newns,
J Chem Phys, 116, 8649 (2002).
:link(Zhang)
[(Zhang)] Zhang, Glotzer, Nanoletters, 4, 1407-1413 (2004).
diff --git a/examples/USER/atc/README b/examples/USER/atc/README
index 87820bbb9..f3a852dfe 100644
--- a/examples/USER/atc/README
+++ b/examples/USER/atc/README
@@ -1,109 +1,245 @@
ATC (Atom To Continuum methods)
Reese Jones, Jeremy Templeton, Jonathan Zimmerman
rjones@sandia.gov
September 2009
--------------
This directory contains examples run using the AtC library in LAMMPS
in its various coupling and post-processing modes. Descriptions of
the files in each are provided below. In addition to the included
output these examples will "dump" mesh-based data either in binary
(Ensight) format or simple column-based text format (for gnuplot, for
example).
-bar1d_thermal:
- input files:
- in.bar1d - Atoms comprise a subset of a 1D finite element bar,
- heated at the left end and cooled at the right end.
- A Gaussian isokinetic thermostat is used to keep the atomic
- kinetic temperature equal to the finite element temperature
- at the boundaries.
- in.bar1d_flux - Same setup and geometry as in.bar1d.
- A Gaussian isokinetic thermostat is used to transfer
- the FE heat flux to the atoms at the boundaries.
- Ar_thermal.mat - Material parameter file specifying
- the thermal properties of argon.
- temp.init - Initial set of atomic positions and velocities.
+cauchy_born:
+ input files:
+ in.cb_biaxial - Computes Hardy and Cauchy-Born metrics of energy density and stress for an lj/cut Ar system subjected to biaxial deformation equivalent to shearing
+ in.cb_shear - Computes Hardy and Cauchy-Born metrics of energy density and stress for an lj/cut Ar system subjected to shear deformation
+ in.cb_unistrain - Computes Hardy and Cauchy-Born metrics of energy density and stress for an lj/cut Ar system subjected to uniaxial strain deformation
+ in.cb_unistrain - Computes Hardy and Cauchy-Born metrics of energy density and stress for an lj/cut Ar system subjected to uniaxial strain deformation
+ in.cb_unistrain_eam - Computes Hardy and Cauchy-Born metrics of energy density and stress for an EAM Cu system subjected to uniaxial strain deformation
+ in.cb_unistrain_eam_linear - Computes Hardy and Cauchy-Born metrics of energy density and stress for an EAM Au system subjected to uniaxial strain deformation; Compares non-linear Cauchy-Born expressions with linearized versions
+ in.cb_volumetric - Computes Hardy and Cauchy-Born metrics of energy density and stress for an lj/cut Ar system subjected to volumetric stretching
+ in.flying_cube - Computes Hardy fields for a small block of LJ material undergoing translation in the x-direction through the periodic boundary
+ in.ftcb_constV - Computes Hardy and Cauchy-Born metrics of energy density and stress for an lj/cut Ar system undergoing dynamics at a finite temperature.
+ in.read_xref - Test for reading an atomic reference configuration
+
+ material files:
+ Ar_CauchyBorn.mat - Parameters used for constructing a Cauchy-Born equivalent model of a lj/cut Ar material
+ Ar_CauchyBorn_linear.mat - Parameters used for constructing a linearized Cauchy-Born equivalent model of a lj/cut Ar material
+ Au_CauchyBorn.mat - Parameters used for constructing a Cauchy-Born equivalent model of a lj/smooth/linear Au material
+ Au_CauchyBorn.mat - Parameters used for constructing a linearized Cauchy-Born equivalent model of a lj/smooth/linear Au material
+ Au_eam.mat - Parameters used for constructing a Cauchy-Born equivalent model of an EAM Au material
+ Au_eam_linear.mat - Parameters used for constructing a linearized Cauchy-Born equivalent model of an EAM Au material
+ Cu_CauchyBorn.mat - Parameters used for constructing a Cauchy-Born equivalent model of an EAM Cu material
output files:
- bar1d.log - LAMMPS log file generated by running in.bar1d.
- bar1d_flux.log - LAMMPS log file generated by running in.bar1d_flux.
+ XXX.screen - Screen/console output generated by running in.XXX
-bar1d_two_temperature:
+drift_diffusion
input files:
- in.bar1d_ttm - Atoms comprise a subset of a 1D finite element bar,
- with a high fixed electron temperature on the left end
- and low fixed phonon and electron temperatures on the right end.
- A Gaussian isokinetic thermostat is used to transfer energy
- from the electron temperature field to the atoms.
- in.gaussianIC_ttm - Atoms fully overlap an FE mesh with an initially
- elevated electron temperature having a Gaussian distribution.
- in.no_atoms - Heating followed by relaxation is simulated on a FE mesh.
- in.uniform_exchange - Electron and kinetic temperatures are initially
- spatially uniform but out of equilibrium, followed by relaxation.
- in.uniform_heating - Initially equal electron and kinetic temperatures
- are subjected to heating of the kinetic temperature only. The kinetic
- temperature is fixed at both ends while the electrons are insulated.
- Ar_ttm.mat - Material parameter file specifying
- the kinetic and electric thermal properties of argon.
- Cu_ttm.mat - Material parameter file specifying
- the kinetic and electric thermal properties of copper.
- temp.init - Initial set of atomic positions and velocities for most cases.
- uniform_exchange_init.data - Initial set of atomic positions and velocities
- for in.uniform_exchange
- uniform_heating_init.data - Initial set of atomic positions and velocities
- for in.uniform_heating
+ in.convective_pulse - 1D Haynes-Schockley pulse in copper with electron convection
+ in.ddm_schrodinger - 1D Haynes Schockley pulse in silicon using Schrodinger-Poisson model for electron density
+ in.finite_well - Quasi-static, 1D Schrodinger-Poisson electron density in a finite energy well
+ in.no_atoms_ddm - 1D Haynes--Schockley pulse in silicon with drift from an applied potential
+ in.null_material_ddm - 2D Argon drift diffusion with part of the region not including electron effects but including the electric potential
+ in.poisson1d_noatoms - Static 1D drift-diffusion model in silicon with a self consistent poisson solution for the electron density
+ in.poisson2d_noatoms - Static 2D drift-diffusion model in a CNT with a self consistent poisson solution for the electron density
+ in.schrodinger_poisson2d_XXX -Static 2D drift-diffusion model in silicon with a schrodinger-poisson solution for the elctron desntiy and electric fields and different mechanisms for drift: no-atoms (follows electric field), convective (electron convection), Jconstraint (conservation of current)
+ XXX_ddm_XXX.mat - Two-temperature and electron diffusion properties
+ XXX_cddm.mat - Two-temperaure, electron diffusion and convection properties
+ XXX_schrodinger.mat - Two-temperature, electron diffusion (and sometimes convection), and Schrodinger-Poisson parameters
+ Si_ddm_thermopower.mat -
output files:
- bar1d_ttm.log - LAMMPS log file generated by running in.bar1d_ttm.
- gaussianIC_ttm.log - log file generated by running in.gaussianIC_ttm.
- no_atoms.log - LAMMPS log file generated by running in.no_atoms.
- uniform_exchange.log - log file generated by running in.uniform_exchange.
- uniform_heating.log - LAMMPS log file generated by running in.uniform_heating.
+ XXX.screen - Screen/console output generated by running in.XXX
+
+elastic:
+ input files:
+ in.bar1d - Quasi-1D elastic wave propagation with coupling using momentum constraints
+ in.bar1d_damped - Quasi-1D elastic wave propagation with damped materials and ghost atoms for propagating waves out of MD region
+ in.bar1d_flux - Quasi-1D elastic wave propagation with coupling using boundary stresses from FEM
+ in.bar1d_frac_step - Quasi-1D elastic wave propagation with a fractional step time integrator
+ in.bar1d_ghost_flux - Quasi-1D elastic wave propagation with coupling using boundary stresses from ghost atoms
+ in.bar1d_thermo_elastic - Quasi-1D finite temperature elastic wave propagation
+ in.cnt_electrostatic - Mechanical response of CNT with fixed charge density in an electric field
+ in.cnt_electrostatic2 - Mechanical reponse of CNT with self-consistent charge density and electric field
+ in.cnt_fixed_charge - Mechancial response of CNT with fixed atomic charges in an electric field
+ in.eam_energy - Quasi-static/quasi-1D coupling and transfer extraction of energy density for EAM gold
+ in.electron_density - Mechanical response of differnt CNT models with a self-consistent electron density and electric field
+ in.electrostatic_bending_dos - Quasi-static bending of a CNT using a quantum density of states model for electron density
+ in.no_atoms - FE solution of a box subject to an initial displacement condition
+ in.no_atoms_cb - FE solution of a box subject to an initial displacement condition with a Cauchy-Born material model
+ in.no_atoms_cb_linear -FE solution of a box subject to an initial displacement condition with a linear Cauchy-Born material model
+ Ar_CauchyBornLinear.mat - Linear Cauchy Born material model for argon
+ Ar_CauchyBorn.mat - Cauchy-Born material model for argon
+ Ar_damped.mat - Argon elastic and fictitious damping material properties
+ Ar_elastic.mat - Argon elastic properties
+ Ar_thermo_elastic.mat - Argon elastic and thermal properties
+ Au_elastic.mat - Gold elastic properties
+ CNT_electrostatic2.mat - CNT elastic, electric field, and linear field/electron density properties
+ CNT_electrostatic.mat - CNT elastic and electric field properties
+ CNT_id.mat - CNT elastic and electric field properties
+ CNT.mat - Mechanical, electrical, and various field/electron density properties
+
+ output files:
+ XXX.screen - Screen/console output generated by running in.XXX
+
+fluids:
+ input_files:
+ in.bar1d_fluids - Quasi-1D FE/MD temperature coupling for liquid argon
+ in.concentration - Quasi-1D double layer with ion concentration controlled in some elements
+ in.conducting_interface - Quasi-2D double layer with a material model for a conducting solid
+ in.dielectric_interface - Quasi-2D double layer with a material model for a dielectric solid
+ in.double_layer - 3D double layer charging
+ in.liquid_electrostatic - Quasi-1D double layer with a fixed potential surface
+ in.opp_force - Computes electrostatic interactions between two oppositely charged groups in an argon lattice
+ in.poisson - Computes electrostatic interactions in a charged LJ fluid
+ in.shear_flow - Poisseuille flow
+ in.shear_no_atoms - No atom viscosity solution
+ Ar_electrostatic.mat - Liquid argon density and electrical properties
+ Ar_species_dl.mat - Faux mass density and electrical properties
+ Ar_species.mat - Electrical properties
+ Ar_thermal.mat - thermal properties of liquid argon
+ Ar_visc_no_atoms.mat - Viscous flow model
+ Ar_viscosity.mat - Viscous flow properties for liquid argon
hardy:
input files:
in.consistency - Small block of EAM Copper is used to confirm the
consistency between the atc calculations of 1st Piola-Kirchhoff (P-K)
stress, displacment gradient, and strain energy density for various
amounts of uniaxial strain.
in.eam_kernel_convergence - Block of EAM Gold is used to examine the
variation of the atc estimate of 1st P-K stress with size of localization
(averaging) volume. Volume is spherical, and kernel function
is quartic depending on radial distance from sphere center.
in.eam_unistrain_xxxx - Long block of EAM Copper is subjected to uniaxial
stretching and estimates of 1st P-K stress, energy density, displacement
and displacement gradient are calculated. The end-suffix denotes the
localization volume shape and kernel function type:
cell - 3D rectangular elements with step-functions at cell boundary
mesh - 3D rectangular elements with linear "tent" functions
qcylinder - cylindrical volume with quartic function dependent on
distance from cylinder axis
qsphere - spherical volume with quartic function dependent on
distance from sphere center
step - spherical volume with step-function at sphere boundary
in.eam_volume_stretch - Small block of EAM Copper is equitriaxially
stretched and estimates of 1st P-K stress, energy density, and mass
density are calculated.
+ in.eshelby_static - Static calculation of eshelby stress.
in.nvt - Block of Lennard-Jones Argon is simulated at 30K for 1000 timesteps.
output files:
- consistency.log - LAMMPS log file generated by running in.consistency
- consistency.screen - Screen/console output generated by running
- in.consistency
- eam_kernel_convergence.log - LAMMPS log file generated by running
- in.eam_kernel_convergence
- eam_kernel_convergence.screen - Screen/console output generated by running
- in.eam_kernel_convergence
- eam_unistrain_xxxx.log - LAMMPS log file generated by running
- in.eam_unistrain_xxxx
- eam_unistrain_xxxx.screen - Screen/console output generated by running
- in.eam_unistrain_xxxx ( xxxx = cell, mesh, qcylinder, qsphere, step )
- eam_volume_stretch.log - LAMMPS log file generated by running
- in.eam_volume_stretch
- eam_volume_stretchscreen - Screen/console output generated by running
- in.eam_volume_stretch
- nvt.log - LAMMPS log file generated by running in.nvt
- nvt.screen - Screen/console output generated by running in.nvt
+ XXX.log - LAMMPS log file generated by running in.XXX
+ XXX.screen - Screen/console output generated by running in.XXX
+
+elastic:
+ input files:
+ in.bar1d - Quasi-1D elastic wave propagation with coupling using momentum constraints
+ in.bar1d_damped - Quasi-1D elastic wave propagation with damped materials and ghost atoms for propagating waves out of MD region
+ in.bar1d_flux - Quasi-1D elastic wave propagation with coupling using boundary stresses from FEM
+ in.bar1d_frac_step - Quasi-1D elastic wave propagation with a fractional step time integrator
+ in.bar1d_ghost_flux - Quasi-1D elastic wave propagation with coupling using boundary stresses from ghost atoms
+ in.bar1d_thermo_elastic - Quasi-1D finite temperature elastic wave propagation
+ in.cnt_electrostatic - Mechanical response of CNT with fixed charge density in an electric field
+ in.cnt_electrostatic2 - Mechanical reponse of CNT with self-consistent charge density and electric field
+ in.cnt_fixed_charge - Mechancial response of CNT with fixed atomic charges in an electric field
+ in.eam_energy - Quasi-static/quasi-1D coupling and transfer extraction of energy density for EAM gold
+ in.electron_density - Mechanical response of differnt CNT models with a self-consistent electron density and electric field
+ in.electrostatic_bending_dos - Quasi-static bending of a CNT using a quantum density of states model for electron density
+ in.no_atoms - FE solution of a box subject to an initial displacement condition
+ in.no_atoms_cb - FE solution of a box subject to an initial displacement condition with a Cauchy-Born material model
+ in.no_atoms_cb_linear -FE solution of a box subject to an initial displacement condition with a linear Cauchy-Born material model
+ Ar_CauchyBornLinear.mat - Linear Cauchy Born material model for argon
+ Ar_CauchyBorn.mat - Cauchy-Born material model for argon
+ Ar_damped.mat - Argon elastic and fictitious damping material properties
+ Ar_elastic.mat - Argon elastic properties
+ Ar_thermo_elastic.mat - Argon elastic and thermal properties
+ Au_elastic.mat - Gold elastic properties
+ CNT_electrostatic2.mat - CNT elastic, electric field, and linear field/electron density properties
+ CNT_electrostatic.mat - CNT elastic and electric field properties
+ CNT_id.mat - CNT elastic and electric field properties
+ CNT.mat - Mechanical, electrical, and various field/electron density properties
+
+ output files:
+ XXX.screen - Screen/console output generated by running in.XXX
+
+mesh:
+ input_files:
+ in.gaussianICXd_YYY - Initial Gaussian temperature profile in X dimensions (1/2) decay using a YYY mesh type (hex, hex20, hex27, tet
+ in.kernel2d_YYY - hardy post-processing of initial Gaussian temperature profiles using a YYY mesh type (hex,tet)
+ in.mesh2d_tet - field-based hardy post-processing of initial Gaussian temperature profile using a 2d tet mesh
+ in.semicircle - heated semi-cicular domain using an unstructured 2d hex mesh
+ Ar_ttm.mat - two-temperature material model for argon
+
+ output files:
+ XXX.screen - Screen/console output generated by running in.XXX
+
+molecule:
+ input_files:
+ in.harmonic_bonds - Stress and heat flux calculation for a bonded lattice
+ in.polarize - Polarization calculation for water subject to an electric field
+ in.quartic_bonds - Stress and energy calculation for a system with bonds and pairs
+ in.water - Water polarization from an applied field using multiscale-based atomic weights
+ water.mat - Electrical properties for water cases
+
+ output files:
+ XXX.screen - Screen/console output generated by running in.XXX
+
+thermal:
+ input files:
+ in.bar1d - Atoms comprise a subset of a 1D finite element bar,
+ heated at the left end and cooled at the right end.
+ A Gaussian isokinetic thermostat is used to keep the atomic
+ kinetic temperature equal to the finite element temperature
+ at the boundaries.
+ in.bar1d_all_atoms - Fixed temperature and fixed flux boundary conditions are applied to a quasi-1D bar of atoms
+ in.bar1d_combined - Quasi-1D coupled heat flux using the kinetic + potential energy definition
+ in.bar1d_flux - Same setup and geometry as in.bar1d.
+ A Gaussian isokinetic thermostat is used to transfer
+ the FE heat flux to the atoms at the boundaries.
+ in.bar1d_frac_step - Quasi-1D all atom heat flux with fixed temperature boundaries using fractional step time integration
+ in.bar1d_hoover - Quasi-1D coupled heat flux using the kinetic + potential energy definition and fixed-temperature coupling mode
+ in.bar1d_interpolate - Quasi-1D coupled heat flux using the interpolation-based reconstruction to estimate the heat flux
+ in.bar1d_lumped - Quasi-1D coupled heat flux using localized heat flux control and time filtering
+ in.no_atoms - FE solution to a heat source temperature distribution
+ Ar_thermal.mat - Material parameter file specifying
+ the thermal properties of argon.
+ temp.init - Initial set of atomic positions and velocities.
+
+ output files:
+ XXX.log - LAMMPS log file generated by running in.XXX
+
+two_temperature:
+ input files:
+ in.bar1d_ttm - Atoms comprise a subset of a 1D finite element bar,
+ with a high fixed electron temperature on the left end
+ and low fixed phonon and electron temperatures on the right end.
+ A Gaussian isokinetic thermostat is used to transfer energy
+ from the electron temperature field to the atoms.
+ in.cutout - demonstrates how to delete elements from an intrinsic atc mesh.
+ in.gaussianIC_ttm - Atoms fully overlap an FE mesh with an initially
+ elevated electron temperature having a Gaussian distribution.
+ in.no_atoms - Heating followed by relaxation is simulated on a FE mesh.
+ in.restart - Demonstrates how to use atc restart commands.
+ in.uniform_exchange - Electron and kinetic temperatures are initially
+ spatially uniform but out of equilibrium, followed by relaxation.
+ in.uniform_heating - Initially equal electron and kinetic temperatures
+ are subjected to heating of the kinetic temperature only. The kinetic
+ temperature is fixed at both ends while the electrons are insulated.
+ Ar_ttm.mat - Material parameter file specifying
+ the kinetic and electric thermal properties of argon.
+ Cu_ttm.mat - Material parameter file specifying
+ the kinetic and electric thermal properties of copper.
+ temp.init - Initial set of atomic positions and velocities for most cases.
+ uniform_exchange_init.data - Initial set of atomic positions and velocities
+ for in.uniform_exchange
+ uniform_heating_init.data - Initial set of atomic positions and velocities
+ for in.uniform_heating
+
+ output files:
+ XXX.log - LAMMPS log file generated by running in.XXX
diff --git a/examples/USER/atc/bar1d_thermal/Ar_thermal.mat b/examples/USER/atc/bar1d_thermal/Ar_thermal.mat
deleted file mode 100644
index 1d7074242..000000000
--- a/examples/USER/atc/bar1d_thermal/Ar_thermal.mat
+++ /dev/null
@@ -1,11 +0,0 @@
-material Ar
- heat_flux linear
- conductivity .00000000168
- end
-end
-
-material Ar2
- heat_flux linear
- conductivity .00000000316
- end
-end
diff --git a/examples/USER/atc/bar1d_thermal/bar1d.log b/examples/USER/atc/bar1d_thermal/bar1d.log
deleted file mode 100644
index 88f13d8b7..000000000
--- a/examples/USER/atc/bar1d_thermal/bar1d.log
+++ /dev/null
@@ -1,286 +0,0 @@
-LAMMPS (7 Jul 2009)
-#AtC Thermal Coupling
-# This benchmark tests heat conducting into and out of the MD region. The
-# temperature is intially 20 everywhere and the left boundary BC is fixed at 40.
-# The result should show heat diffusing through the FEM to the MD and back out
-# to the FEM on the right. Insufficient time is captured to reach the linear
-# steady state, but heat crossing both boundaries should be observed.
-
-
-units real
-atom_style atomic
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
-# NOTE following 3 lines added for restart
-boundary f p p
-pair_style lj/cut 13.5
-read_data temp.init
- orthogonal box = (-27.025 -16.215 -16.215) to (27.025 16.215 16.215)
- 1 by 1 by 1 processor grid
- 1440 atoms
- 1440 velocities
-lattice fcc 5.405 origin 0.25 0.25 0.25
-Lattice spacing in x,y,z = 5.405 5.405 5.405
-region simRegion block -12 12 -3 3 -3 3
-
-# create atoms, NOTE commented out for restart
-#region mdRegion block -5 5 -3 3 -3 3
-#boundary f p p
-#create_box 1 mdRegion
-#create_atoms 1 region mdRegion
-#mass 1 39.95
-
-# specify interal/ghost atoms
-region mdInternal block -4 4 -3 3 -3 3
-group internal region mdInternal
-1152 atoms in group internal
-group ghost subtract all internal
-288 atoms in group ghost
-
-# velocities have Vcm = 0, NOTE next four lines commented out for restart
-#velocity internal create 40. 87287 mom yes loop geom
-
-#pair_style lj/cut 13.5
-##pair_coeff 1 1 0.010323166 3.405 13.5
-#pair_coeff 1 1 .238 3.405 13.5
-
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc thermal Ar_thermal.mat
-
-# ID part keywords nx ny nz region
-#fix_modify AtC fem create mesh 12 2 2 simRegion f p p
-fix_modify AtC fem create mesh 12 1 1 simRegion f p p
-
-# specify atom types
-#fix_modify AtC transfer internal type internal
-fix_modify AtC transfer boundary type ghost
-
-# fix a temperature
-fix_modify AtC transfer fix temperature all 20.
-
-# turn on thermostat
-fix_modify AtC transfer thermal control rescale 10
-
-# equilibrate MD field
-#dump D1 all atom 100 dump.bar1d
-#fix_modify AtC transfer output bar1dfe 100
-timestep 5
-variable xdof equal 3*count(ghost)
-compute_modify thermo_temp extra ${xdof}
-compute_modify thermo_temp extra 864
-thermo_style custom step cpu etotal pe f_AtC[1] temp f_AtC[2]
-thermo_modify format 1 %6i format 2 %7.2g
-thermo 100
-run 400
-Memory usage per processor = 8.7506 Mbytes
-Step CPU TotEng PotEng AtC[1] Temp AtC[2]
- 0 0 -2573.6428 -2710.8793 412.06718 39.965279 20
- 100 2.7 -2537.6764 -2606.3542 412.06718 20 20
- 200 5.5 -2584.8754 -2653.5532 412.06718 20 20
- 300 8.2 -2575.3126 -2643.9904 412.06718 20 20
- 400 11 -2573.4199 -2642.0977 412.06718 20 20
-Loop time of 10.9925 on 1 procs for 400 steps with 1440 atoms
-
-Pair time (%) = 4.30201 (39.1358)
-Neigh time (%) = 1.867 (16.9842)
-Comm time (%) = 0.0373757 (0.34001)
-Outpt time (%) = 0.00606346 (0.0551598)
-Other time (%) = 4.78008 (43.4848)
-
-Nlocal: 1440 ave 1440 max 1440 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 5320 ave 5320 max 5320 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 419459 ave 419459 max 419459 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 838918 ave 838918 max 838918 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 838918
-Ave neighs/atom = 582.582
-Neighbor list builds = 40
-Dangerous builds = 0
-
-# change thermostat to hoover
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer thermal control hoover
-fix_modify AtC transfer filter type exponential
-fix_modify AtC transfer filter scale 10000.0
-fix_modify AtC transfer filter on
-fix_modify AtC transfer internal_quadrature off
-
-# add nodesets
-# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
-fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -12 12 -12 12
-fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -12 12 -12 12
-fix_modify AtC transfer fix temperature lbc 40.
-fix_modify AtC transfer fix temperature rbc 20.
-
-# initialize filter
-#thermo 1
-run 100
-Memory usage per processor = 8.97948 Mbytes
-Step CPU TotEng PotEng AtC[1] Temp AtC[2]
- 400 0 -2573.4199 -2642.0977 274.71145 20 20
- 500 2.7 -2573.7738 -2643.7447 295.61002 20.376549 21.713472
-Loop time of 2.67287 on 1 procs for 100 steps with 1440 atoms
-
-Pair time (%) = 1.07427 (40.1917)
-Neigh time (%) = 0.466434 (17.4507)
-Comm time (%) = 0.00930166 (0.348003)
-Outpt time (%) = 0.00103688 (0.0387928)
-Other time (%) = 1.12183 (41.9709)
-
-Nlocal: 1440 ave 1440 max 1440 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 5320 ave 5320 max 5320 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 419059 ave 419059 max 419059 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 838118 ave 838118 max 838118 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 838118
-Ave neighs/atom = 582.026
-Neighbor list builds = 10
-Dangerous builds = 0
-
-# set up output, should be before a "run"
-fix_modify AtC transfer output bar1dFE 100 text
-
-# ouput command
-#dump D1 all atom 1000 dump.bar1d
-fix_modify AtC transfer atomic_output bar1dMD 100
-
-# run with FE
-reset_timestep 0
-thermo 100
-run 10000
-Memory usage per processor = 8.97948 Mbytes
-Step CPU TotEng PotEng AtC[1] Temp AtC[2]
- 0 0 -2573.7738 -2643.7447 295.61002 20.376549 21.713472
- 100 2.7 -2573.654 -2645.0562 298.997 20.793359 21.86901
- 200 5.4 -2574.0035 -2642.057 302.05784 19.818184 22.007349
- 300 8 -2573.5186 -2646.5507 304.88852 21.268004 22.143129
- 400 11 -2573.2662 -2641.032 307.48549 19.734394 22.262531
- 500 13 -2573.5673 -2644.7553 309.92162 20.730998 22.376015
- 600 16 -2572.9368 -2641.5818 312.18796 19.990452 22.483808
- 700 19 -2573.2457 -2642.9406 314.3431 20.296183 22.586025
- 800 21 -2573.215 -2642.7311 316.37915 20.244129 22.681635
- 900 24 -2572.7227 -2643.5215 318.29866 20.617655 22.772405
- 1000 27 -2572.411 -2644.5969 320.08215 21.021606 22.85772
- 1100 29 -2571.4099 -2642.08 321.74721 20.580181 22.940424
- 1200 32 -2570.5495 -2641.7296 323.29152 20.728698 23.01806
- 1300 35 -2570.2491 -2640.8115 324.79381 20.548784 23.09183
- 1400 37 -2570.159 -2641.2853 326.14846 20.713008 23.158731
- 1500 40 -2569.5061 -2642.2055 327.46482 21.171117 23.230527
- 1600 43 -2568.7522 -2639.5246 328.68994 20.609988 23.295442
- 1700 45 -2569.1809 -2642.0975 329.85636 21.234392 23.355365
- 1800 48 -2568.7484 -2643.2103 330.95066 21.684387 23.414458
- 1900 51 -2568.258 -2641.5017 332.02069 21.329638 23.476702
- 2000 54 -2568.192 -2641.4646 333.04827 21.338079 23.534077
- 2100 56 -2568.0746 -2639.9335 334.04476 20.926349 23.588633
- 2200 59 -2567.2717 -2642.2868 334.99014 21.84549 23.639739
- 2300 62 -2566.7209 -2639.9022 335.89195 21.311463 23.692327
- 2400 64 -2566.6054 -2638.8118 336.73569 21.02756 23.743177
- 2500 67 -2565.7629 -2639.6423 337.51835 21.514764 23.792702
- 2600 70 -2565.9251 -2642.5797 338.26277 22.322947 23.837067
- 2700 72 -2564.9995 -2640.0503 339.00006 21.855897 23.885327
- 2800 75 -2565.2468 -2638.033 339.72187 21.196396 23.929976
- 2900 78 -2565.0496 -2639.4905 340.4486 21.678289 23.975728
- 3000 80 -2565.1382 -2637.5132 341.15766 21.076651 24.018275
- 3100 83 -2564.4793 -2636.786 341.85076 21.056788 24.060818
- 3200 86 -2564.1799 -2637.5024 342.51347 21.352563 24.105465
- 3300 88 -2564.4531 -2641.3463 343.13584 22.392438 24.145599
- 3400 91 -2564.2323 -2641.0072 343.75483 22.357976 24.184764
- 3500 94 -2563.378 -2635.3819 344.36945 20.968577 24.22365
- 3600 96 -2563.5014 -2637.8324 345.00242 21.646292 24.265399
- 3700 99 -2563.4092 -2638.0479 345.63031 21.73589 24.302306
- 3800 1e+02 -2563.0307 -2637.5397 346.23705 21.698125 24.340069
- 3900 1e+02 -2562.1415 -2637.2704 346.79157 21.878655 24.379583
- 4000 1.1e+02 -2561.9968 -2637.3928 347.2934 21.956417 24.413166
- 4100 1.1e+02 -2560.7688 -2636.0902 347.76126 21.934696 24.449405
- 4200 1.1e+02 -2561.3033 -2638.2325 348.21187 22.402893 24.48165
- 4300 1.2e+02 -2560.9897 -2637.0909 348.67188 22.161792 24.517482
- 4400 1.2e+02 -2561.1676 -2638.5003 349.1221 22.52042 24.551399
- 4500 1.2e+02 -2560.4797 -2637.3716 349.57016 22.392068 24.58389
- 4600 1.2e+02 -2560.5787 -2637.0577 350.03085 22.2718 24.616821
- 4700 1.3e+02 -2560.9645 -2639.5114 350.46283 22.874034 24.648359
- 4800 1.3e+02 -2560.445 -2637.6681 350.93668 22.488484 24.682119
- 4900 1.3e+02 -2559.5243 -2635.9383 351.38797 22.252882 24.713605
- 5000 1.3e+02 -2559.4948 -2637.7238 351.82736 22.781448 24.746433
- 5100 1.4e+02 -2559.6822 -2636.169 352.25581 22.274077 24.77752
- 5200 1.4e+02 -2559.6398 -2637.3169 352.67163 22.620718 24.810244
- 5300 1.4e+02 -2558.6285 -2634.5293 353.06226 22.103426 24.836256
- 5400 1.4e+02 -2558.6394 -2637.9486 353.46662 23.096021 24.869663
- 5500 1.5e+02 -2558.1403 -2636.176 353.85792 22.725147 24.897758
- 5600 1.5e+02 -2558.0703 -2635.1367 354.27521 22.442874 24.929906
- 5700 1.5e+02 -2558.0656 -2636.7197 354.66462 22.905238 24.956168
- 5800 1.6e+02 -2557.3776 -2634.8266 355.06619 22.554271 24.987034
- 5900 1.6e+02 -2557.2526 -2635.9743 355.44501 22.924934 25.016353
- 6000 1.6e+02 -2557.3833 -2637.2292 355.80121 23.252296 25.043949
- 6100 1.6e+02 -2556.0263 -2633.5408 356.13412 22.573353 25.072447
- 6200 1.7e+02 -2555.7442 -2634.4378 356.46167 22.916748 25.100704
- 6300 1.7e+02 -2555.855 -2635.6231 356.75569 23.22965 25.127725
- 6400 1.7e+02 -2555.933 -2634.2031 357.04516 22.793407 25.152406
- 6500 1.7e+02 -2555.6529 -2635.6086 357.33016 23.28426 25.178081
- 6600 1.8e+02 -2554.8702 -2633.8043 357.60713 22.986754 25.203066
- 6700 1.8e+02 -2555.4594 -2637.4198 357.91044 23.868096 25.228913
- 6800 1.8e+02 -2555.1344 -2633.0306 358.23055 22.684511 25.254519
- 6900 1.8e+02 -2555.203 -2635.8935 358.56704 23.498239 25.281995
- 7000 1.9e+02 -2554.4151 -2634.9963 358.89735 23.466408 25.305952
- 7100 1.9e+02 -2555.5652 -2636.9959 359.27174 23.713819 25.334106
- 7200 1.9e+02 -2554.6218 -2632.7376 359.62885 22.748439 25.361455
- 7300 2e+02 -2553.7347 -2633.5173 359.96531 23.233845 25.386903
- 7400 2e+02 -2553.6833 -2632.7482 360.28731 23.024868 25.412373
- 7500 2e+02 -2554.1584 -2634.2224 360.62311 23.31579 25.437173
- 7600 2e+02 -2553.7146 -2636.4165 360.95078 24.084027 25.461273
- 7700 2.1e+02 -2553.0976 -2633.1652 361.2731 23.316874 25.488376
- 7800 2.1e+02 -2553.7234 -2633.641 361.58496 23.273177 25.51462
- 7900 2.1e+02 -2553.1572 -2635.2359 361.88331 23.902505 25.537243
- 8000 2.1e+02 -2553.0069 -2632.9284 362.20064 23.274304 25.562883
- 8100 2.2e+02 -2552.2172 -2632.9342 362.5047 23.505977 25.58597
- 8200 2.2e+02 -2552.6328 -2633.7047 362.84446 23.609337 25.610996
- 8300 2.2e+02 -2553.0514 -2636.536 363.15344 24.311943 25.634632
- 8400 2.3e+02 -2551.9163 -2634.5593 363.4457 24.066867 25.656569
- 8500 2.3e+02 -2551.1621 -2632.5819 363.73408 23.710645 25.680723
- 8600 2.3e+02 -2551.3228 -2631.8791 364.03489 23.459181 25.706041
- 8700 2.3e+02 -2551.3997 -2634.1928 364.32604 24.110586 25.728322
- 8800 2.4e+02 -2551.5524 -2635.9592 364.60259 24.58049 25.751881
- 8900 2.4e+02 -2550.9861 -2634.5125 364.87711 24.324098 25.772874
- 9000 2.4e+02 -2550.3983 -2630.9444 365.15409 23.456228 25.797098
- 9100 2.4e+02 -2550.2259 -2632.4851 365.42126 23.955067 25.819654
- 9200 2.5e+02 -2549.7275 -2633.251 365.67315 24.323271 25.84363
- 9300 2.5e+02 -2549.2312 -2632.0116 365.91463 24.106861 25.865763
- 9400 2.5e+02 -2549.1796 -2631.7916 366.12014 24.057833 25.884164
- 9500 2.5e+02 -2549.3237 -2632.8582 366.34704 24.326456 25.907195
- 9600 2.6e+02 -2548.7761 -2630.2005 366.56572 23.711991 25.926896
- 9700 2.6e+02 -2548.5538 -2631.9243 366.75569 24.278711 25.946464
- 9800 2.6e+02 -2548.3631 -2632.4881 366.94867 24.498431 25.965165
- 9900 2.7e+02 -2548.2213 -2631.2185 367.15325 24.169994 25.986899
- 10000 2.7e+02 -2547.7789 -2631.2241 367.37155 24.30047 26.007162
-Loop time of 267.8 on 1 procs for 10000 steps with 1440 atoms
-
-Pair time (%) = 107.528 (40.1525)
-Neigh time (%) = 46.6868 (17.4335)
-Comm time (%) = 0.952441 (0.355655)
-Outpt time (%) = 0.106937 (0.0399319)
-Other time (%) = 112.525 (42.0184)
-
-Nlocal: 1440 ave 1440 max 1440 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 5320 ave 5320 max 5320 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 419294 ave 419294 max 419294 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 838588 ave 838588 max 838588 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 838588
-Ave neighs/atom = 582.353
-Neighbor list builds = 1000
-Dangerous builds = 0
diff --git a/examples/USER/atc/bar1d_thermal/bar1d_flux.log b/examples/USER/atc/bar1d_thermal/bar1d_flux.log
deleted file mode 100644
index 4b818370f..000000000
--- a/examples/USER/atc/bar1d_thermal/bar1d_flux.log
+++ /dev/null
@@ -1,334 +0,0 @@
-LAMMPS (7 Jul 2009)
-#AtC Thermal Coupling
-# This benchmark tests heat conducting into and out of the MD region. The
-# temperature is intially 20 everywhere and the left boundary BC is fixed at
-# 40.# The result should show heat diffusing through the FEM to the MD and back
-# out # to the FEM on the right. Insufficient time is captured to reach the
-# linear # steady state, but heat crossing both boundaries should be observed.
-#echo both
-units real
-atom_style atomic
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
-# NOTE following 3 lines added for restart
-boundary f p p
-pair_style lj/cut 13.5
-read_data temp.init
- orthogonal box = (-27.025 -16.215 -16.215) to (27.025 16.215 16.215)
- 1 by 1 by 1 processor grid
- 1440 atoms
- 1440 velocities
-lattice fcc 5.405 origin 0.25 0.25 0.25
-Lattice spacing in x,y,z = 5.405 5.405 5.405
-region simRegion block -12 12 -3 3 -3 3
-
-# create atoms, NOTE commented out for restart
-#region mdRegion block -5 5 -3 3 -3 3
-#boundary f p p
-#create_box 1 mdRegion
-#create_atoms 1 region mdRegion
-#mass 1 39.95
-
-# specify interal/ghost atoms
-region mdInternal block -4 4 -3 3 -3 3
-group internal region mdInternal
-1152 atoms in group internal
-group ghost subtract all internal
-288 atoms in group ghost
-
-# velocities have Vcm = 0, NOTE next four lines commented out for restart
-#velocity internal create 40. 87287 mom yes loop geom
-
-#pair_style lj/cut 13.5
-##pair_coeff 1 1 0.010323166 3.405 13.5
-#pair_coeff 1 1 .238 3.405 13.5
-
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-#write_restart tinit.dat
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc thermal Ar_thermal.mat
-
-# ID part keywords nx ny nz region
-#fix_modify AtC fem create mesh 12 2 2 simRegion f p p
-fix_modify AtC fem create mesh 12 1 1 simRegion f p p
-fix_modify AtC mesh create_faceset ibndy box -4.0 4.0 -12 12 -12 12 in
-fix_modify AtC mesh create_faceset obndy box -4.0 4.0 -12 12 -12 12 outward
-
-# specify atom types
-#fix_modify AtC transfer internal type internal
-fix_modify AtC transfer boundary type ghost
-
-# fix a temperature
-fix_modify AtC transfer fix temperature all 20.
-#fix_modify AtC transfer fix temperature all linear 0 0 0 -0.154 0 0 30.
-
-# turn on thermostat
-fix_modify AtC transfer thermal control rescale 10
-
-variable xdof equal 3*count(ghost)
-compute_modify thermo_temp extra ${xdof}
-compute_modify thermo_temp extra 864
-thermo_style custom step cpu etotal pe f_AtC[1] temp f_AtC[2]
-thermo_modify format 1 %6i format 2 %7.2g
-
-# equilibrate MD field
-#fix_modify AtC transfer output bar1dfe_flux_init 100
-timestep 5
-thermo 10
-run 400
-Memory usage per processor = 8.7506 Mbytes
-Step CPU TotEng PotEng AtC[1] Temp AtC[2]
- 0 0 -2573.6428 -2710.8793 412.06718 39.965279 20
- 10 0.28 -2626.7498 -2695.4276 412.06718 20 20
- 20 0.56 -2600.7022 -2669.38 412.06718 20 20
- 30 0.84 -2570.0142 -2638.6921 412.06718 20 20
- 40 1.1 -2548.1494 -2616.8273 412.06718 20 20
- 50 1.4 -2541.6409 -2610.3188 412.06718 20 20
- 60 1.7 -2539.3355 -2608.0134 412.06718 20 20
- 70 2 -2534.3684 -2603.0463 412.06718 20 20
- 80 2.2 -2530.2415 -2598.9194 412.06718 20 20
- 90 2.5 -2531.3411 -2600.019 412.06718 20 20
- 100 2.8 -2537.6764 -2606.3542 412.06718 20 20
- 110 3.1 -2546.506 -2615.1838 412.06718 20 20
- 120 3.4 -2555.0937 -2623.7716 412.06718 20 20
- 130 3.6 -2562.4178 -2631.0957 412.06718 20 20
- 140 3.9 -2568.7827 -2637.4606 412.06718 20 20
- 150 4.2 -2574.6292 -2643.307 412.06718 20 20
- 160 4.5 -2579.7542 -2648.432 412.06718 20 20
- 170 4.8 -2583.6629 -2652.3408 412.06718 20 20
- 180 5 -2585.9113 -2654.5892 412.06718 20 20
- 190 5.3 -2586.1786 -2654.8565 412.06718 20 20
- 200 5.6 -2584.8754 -2653.5532 412.06718 20 20
- 210 5.9 -2582.8956 -2651.5734 412.06718 20 20
- 220 6.2 -2580.6882 -2649.366 412.06718 20 20
- 230 6.5 -2578.24 -2646.9179 412.06718 20 20
- 240 6.7 -2575.9058 -2644.5836 412.06718 20 20
- 250 7 -2574.2875 -2642.9654 412.06718 20 20
- 260 7.3 -2573.8273 -2642.5052 412.06718 20 20
- 270 7.6 -2574.3017 -2642.9796 412.06718 20 20
- 280 7.8 -2574.7059 -2643.3838 412.06718 20 20
- 290 8.1 -2574.7745 -2643.4524 412.06718 20 20
- 300 8.4 -2575.3126 -2643.9904 412.06718 20 20
- 310 8.7 -2576.5002 -2645.178 412.06718 20 20
- 320 9 -2577.7411 -2646.419 412.06718 20 20
- 330 9.3 -2578.2283 -2646.9061 412.06718 20 20
- 340 9.5 -2577.7485 -2646.4263 412.06718 20 20
- 350 9.8 -2576.9631 -2645.6409 412.06718 20 20
- 360 10 -2576.0309 -2644.7088 412.06718 20 20
- 370 10 -2574.9309 -2643.6088 412.06718 20 20
- 380 11 -2573.7943 -2642.4721 412.06718 20 20
- 390 11 -2573.0353 -2641.7132 412.06718 20 20
- 400 11 -2573.4199 -2642.0977 412.06718 20 20
-Loop time of 11.2102 on 1 procs for 400 steps with 1440 atoms
-
-Pair time (%) = 4.45575 (39.7474)
-Neigh time (%) = 1.86555 (16.6416)
-Comm time (%) = 0.0379353 (0.338401)
-Outpt time (%) = 0.0610819 (0.54488)
-Other time (%) = 4.78984 (42.7277)
-
-Nlocal: 1440 ave 1440 max 1440 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 5320 ave 5320 max 5320 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 419459 ave 419459 max 419459 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 838918 ave 838918 max 838918 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 838918
-Ave neighs/atom = 582.582
-Neighbor list builds = 40
-Dangerous builds = 0
-
-
-# change thermostat to hoover
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer thermal control flux faceset obndy
-fix_modify AtC transfer filter type exponential
-fix_modify AtC transfer filter scale 10000.0
-fix_modify AtC transfer filter on
-
-# add nodesets
-# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
-fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -12 12 -12 12
-fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -12 12 -12 12
-fix_modify AtC transfer fix temperature lbc 40.
-fix_modify AtC transfer fix temperature rbc 20.
-
-# initialize filter
-run 100
-Memory usage per processor = 8.97948 Mbytes
-Step CPU TotEng PotEng AtC[1] Temp AtC[2]
- 400 0 -2573.4199 -2642.0977 412.06718 20 20
- 410 0.3 -2573.399 -2643.8456 429.61396 20.515068 21.555366
- 420 0.6 -2573.4225 -2646.1086 430.028 21.16726 21.573916
- 430 0.91 -2573.4498 -2647.2056 430.455 21.478791 21.593046
- 440 1.2 -2573.4565 -2646.2695 430.87731 21.204227 21.611967
- 450 1.5 -2573.4725 -2644.3172 431.27891 20.631017 21.62996
- 460 1.8 -2573.4862 -2643.0051 431.65927 20.244924 21.647001
- 470 2.1 -2573.4906 -2642.6175 432.02801 20.130768 21.663521
- 480 2.4 -2573.5014 -2642.5644 432.3911 20.112138 21.679788
- 490 2.7 -2573.5132 -2642.9216 432.75177 20.212768 21.695947
- 500 3 -2573.5326 -2643.6695 433.11495 20.424906 21.712218
-Loop time of 3.0217 on 1 procs for 100 steps with 1440 atoms
-
-Pair time (%) = 1.11102 (36.7679)
-Neigh time (%) = 0.465189 (15.3949)
-Comm time (%) = 0.0091815 (0.303852)
-Outpt time (%) = 0.0152943 (0.506148)
-Other time (%) = 1.42102 (47.0272)
-
-Nlocal: 1440 ave 1440 max 1440 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 5320 ave 5320 max 5320 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 419046 ave 419046 max 419046 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 838092 ave 838092 max 838092 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 838092
-Ave neighs/atom = 582.008
-Neighbor list builds = 10
-Dangerous builds = 0
-
-# set up output, should be before a "run"
-fix_modify AtC transfer output bar1d_fluxFE 100 text
-
-# ouput command
-#dump D1 all atom 1000 dump.bar1d
-fix_modify AtC transfer atomic_output bar1d_fluxMD 100
-
-# run with FE
-reset_timestep 0
-thermo 100
-run 10000
-Memory usage per processor = 8.97948 Mbytes
-Step CPU TotEng PotEng AtC[1] Temp AtC[2]
- 0 0 -2573.5326 -2643.6695 433.11495 20.424906 21.712218
- 100 3 -2573.4996 -2644.68 436.56595 20.728783 21.866831
- 200 6 -2573.6452 -2641.8181 439.65242 19.852963 22.005112
- 300 8.9 -2573.7003 -2646.4622 442.67272 21.189339 22.140428
- 400 12 -2573.8123 -2641.5274 445.34109 19.719609 22.259977
- 500 15 -2573.523 -2644.2791 447.87899 20.605203 22.373681
- 600 18 -2573.5066 -2641.7526 450.30082 19.874234 22.482184
- 700 21 -2573.1755 -2642.9899 452.59197 20.330998 22.584833
- 800 24 -2572.7532 -2642.4538 454.74808 20.297842 22.681431
- 900 27 -2572.4242 -2643.2186 456.80456 20.616377 22.773566
- 1000 30 -2572.1111 -2644.2513 458.77119 21.008267 22.861675
- 1100 33 -2571.8664 -2642.2676 460.69037 20.501859 22.947659
- 1200 36 -2571.6698 -2642.4072 462.52036 20.599778 23.029647
- 1300 39 -2571.1188 -2640.8357 464.26327 20.302568 23.107733
- 1400 42 -2570.6841 -2642.0319 465.90618 20.777507 23.181339
- 1500 45 -2570.3755 -2642.5393 467.64779 21.015167 23.259367
- 1600 48 -2570.1086 -2640.3963 469.24937 20.468802 23.331122
- 1700 51 -2569.7084 -2642.3964 470.76324 21.167807 23.398946
- 1800 53 -2569.2903 -2643.213 472.26485 21.527379 23.466222
- 1900 56 -2568.8699 -2641.4957 473.83022 21.149691 23.536354
- 2000 59 -2568.3377 -2641.3608 475.30209 21.265411 23.602297
- 2100 62 -2567.6236 -2639.3792 476.69625 20.896274 23.664759
- 2200 65 -2566.8936 -2642.0946 478.02908 21.899656 23.724472
- 2300 68 -2566.4627 -2640.2742 479.41262 21.494985 23.786458
- 2400 71 -2566.0253 -2638.6268 480.76007 21.142611 23.846827
- 2500 74 -2565.8021 -2639.6421 482.09822 21.503291 23.906779
- 2600 77 -2565.2093 -2642.2012 483.3378 22.421166 23.962315
- 2700 80 -2564.6901 -2639.8567 484.63598 21.889625 24.020477
- 2800 83 -2564.0658 -2636.9481 485.8689 21.22441 24.075714
- 2900 86 -2563.3168 -2639.3155 487.10404 22.131928 24.131051
- 3000 89 -2562.6825 -2635.5318 488.27527 21.214781 24.183525
- 3100 92 -2562.1212 -2635.4426 489.43761 21.352279 24.2356
- 3200 95 -2561.6126 -2636.3019 490.64892 21.750607 24.28987
- 3300 98 -2561.1335 -2639.0741 491.78462 22.697438 24.340752
- 3400 1e+02 -2560.4828 -2638.3251 492.87662 22.66881 24.389676
- 3500 1e+02 -2559.8843 -2635.4238 493.96107 21.998211 24.438262
- 3600 1.1e+02 -2559.2443 -2634.7161 495.09564 21.97848 24.489093
- 3700 1.1e+02 -2558.5654 -2636.1565 496.14063 22.595663 24.535911
- 3800 1.1e+02 -2558.0214 -2636.7671 497.17918 22.931888 24.58244
- 3900 1.2e+02 -2557.9398 -2634.982 498.30063 22.435836 24.632684
- 4000 1.2e+02 -2557.8749 -2635.5655 499.26966 22.624655 24.676098
- 4100 1.2e+02 -2557.8331 -2635.3677 500.27412 22.579214 24.721101
- 4200 1.2e+02 -2557.6329 -2635.9432 501.25564 22.805115 24.765075
- 4300 1.3e+02 -2557.4707 -2636.512 502.24607 23.017987 24.809448
- 4400 1.3e+02 -2557.3019 -2632.8823 503.29942 22.010137 24.856641
- 4500 1.3e+02 -2556.8882 -2633.5726 504.19269 22.331634 24.896661
- 4600 1.4e+02 -2556.5255 -2637.0121 505.14884 23.438878 24.939499
- 4700 1.4e+02 -2556.1965 -2636.3657 506.12562 23.346446 24.983261
- 4800 1.4e+02 -2555.728 -2636.154 507.0392 23.421248 25.024191
- 4900 1.5e+02 -2555.3573 -2634.8572 507.93584 23.151538 25.064363
- 5000 1.5e+02 -2554.8839 -2635.3615 508.86307 23.436248 25.105905
- 5100 1.5e+02 -2554.5001 -2632.2863 509.79029 22.652461 25.147447
- 5200 1.5e+02 -2554.2786 -2635.3015 510.67821 23.595069 25.187227
- 5300 1.6e+02 -2554.1208 -2633.4672 511.56223 23.106822 25.226833
- 5400 1.6e+02 -2553.8571 -2632.9509 512.411 23.033282 25.26486
- 5500 1.6e+02 -2553.4771 -2633.4831 513.27749 23.29891 25.303681
- 5600 1.7e+02 -2552.995 -2634.0399 514.08357 23.601475 25.339795
- 5700 1.7e+02 -2552.6786 -2632.23 514.99251 23.166531 25.380517
- 5800 1.7e+02 -2552.1989 -2634.2926 515.83523 23.906877 25.418273
- 5900 1.8e+02 -2551.9275 -2633.7331 516.69181 23.822967 25.45665
- 6000 1.8e+02 -2551.5879 -2633.4709 517.50304 23.845533 25.492995
- 6100 1.8e+02 -2551.1096 -2633.3576 518.27013 23.951824 25.527362
- 6200 1.8e+02 -2550.6066 -2634.4431 519.07898 24.414427 25.5636
- 6300 1.9e+02 -2550.1427 -2633.9705 519.85788 24.411888 25.598497
- 6400 1.9e+02 -2549.6148 -2630.7643 520.70201 23.631931 25.636316
- 6500 1.9e+02 -2549.2143 -2629.4555 521.48165 23.3674 25.671246
- 6600 2e+02 -2548.823 -2629.4952 522.21153 23.492935 25.703946
- 6700 2e+02 -2548.6124 -2631.6154 523.03499 24.171693 25.740839
- 6800 2e+02 -2548.314 -2627.4378 523.72811 23.041997 25.771892
- 6900 2e+02 -2548.0996 -2632.112 524.53399 24.465645 25.807997
- 7000 2.1e+02 -2547.8468 -2630.457 525.24887 24.057291 25.840026
- 7100 2.1e+02 -2547.5093 -2630.8501 526.01815 24.27005 25.874491
- 7200 2.1e+02 -2547.1919 -2630.0362 526.75581 24.125462 25.90754
- 7300 2.2e+02 -2546.8056 -2631.0682 527.4846 24.538524 25.940191
- 7400 2.2e+02 -2546.541 -2632.4362 528.24198 25.01394 25.974124
- 7500 2.2e+02 -2546.1286 -2629.6863 528.94188 24.33324 26.005481
- 7600 2.3e+02 -2545.959 -2629.3922 529.57701 24.296979 26.033936
- 7700 2.3e+02 -2546.0743 -2629.693 530.30436 24.351001 26.066523
- 7800 2.3e+02 -2546.1431 -2631.6521 530.98889 24.901471 26.097191
- 7900 2.3e+02 -2546.1056 -2629.3749 531.66127 24.249239 26.127315
- 8000 2.4e+02 -2546.0454 -2630.0836 532.37925 24.473159 26.159482
- 8100 2.4e+02 -2545.9725 -2630.5976 533.05102 24.644071 26.18958
- 8200 2.4e+02 -2545.5772 -2629.4844 533.65121 24.435002 26.216469
- 8300 2.5e+02 -2545.5178 -2631.6842 534.43183 25.092927 26.251443
- 8400 2.5e+02 -2545.3432 -2629.5904 535.02156 24.534025 26.277864
- 8500 2.5e+02 -2545.2097 -2631.2853 535.66213 25.06648 26.306563
- 8600 2.6e+02 -2544.9173 -2629.2314 536.3311 24.553498 26.336535
- 8700 2.6e+02 -2544.5414 -2628.3855 536.99695 24.416625 26.366366
- 8800 2.6e+02 -2543.8563 -2629.5985 537.57029 24.969392 26.392053
- 8900 2.6e+02 -2543.2906 -2628.292 538.33031 24.753655 26.426103
- 9000 2.7e+02 -2542.5357 -2627.1708 538.87931 24.64698 26.4507
- 9100 2.7e+02 -2542.1926 -2627.894 539.53269 24.957511 26.479973
- 9200 2.7e+02 -2542.0567 -2627.6595 540.14474 24.928803 26.507394
- 9300 2.8e+02 -2542.1288 -2626.8786 540.80469 24.680402 26.536961
- 9400 2.8e+02 -2541.8301 -2627.2829 541.36001 24.885088 26.561841
- 9500 2.8e+02 -2541.6773 -2628.1451 541.99633 25.180691 26.590349
- 9600 2.9e+02 -2541.3762 -2629.589 542.51985 25.688852 26.613804
- 9700 2.9e+02 -2541.0314 -2625.3135 543.15786 24.544177 26.642389
- 9800 2.9e+02 -2540.6298 -2625.8733 543.76425 24.824163 26.669556
- 9900 2.9e+02 -2540.2376 -2628.1266 544.31076 25.594543 26.694041
- 10000 3e+02 -2540.0111 -2625.9159 544.89126 25.016719 26.720049
-Loop time of 297.023 on 1 procs for 10000 steps with 1440 atoms
-
-Pair time (%) = 107.376 (36.1506)
-Neigh time (%) = 46.5622 (15.6763)
-Comm time (%) = 0.924362 (0.311209)
-Outpt time (%) = 0.154094 (0.0518793)
-Other time (%) = 142.007 (47.81)
-
-Nlocal: 1440 ave 1440 max 1440 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 5320 ave 5320 max 5320 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 419203 ave 419203 max 419203 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 838406 ave 838406 max 838406 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 838406
-Ave neighs/atom = 582.226
-Neighbor list builds = 1000
-Dangerous builds = 0
diff --git a/examples/USER/atc/bar1d_thermal/in.bar1d b/examples/USER/atc/bar1d_thermal/in.bar1d
deleted file mode 100644
index 58cbd7b41..000000000
--- a/examples/USER/atc/bar1d_thermal/in.bar1d
+++ /dev/null
@@ -1,100 +0,0 @@
-#AtC Thermal Coupling
-# This benchmark tests heat conducting into and out of the MD region. The
-# temperature is intially 20 everywhere and the left boundary BC is fixed at 40.
-# The result should show heat diffusing through the FEM to the MD and back out
-# to the FEM on the right. Insufficient time is captured to reach the linear
-# steady state, but heat crossing both boundaries should be observed.
-
-
-units real
-atom_style atomic
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
-# NOTE following 3 lines added for restart
-boundary f p p
-pair_style lj/cut 13.5
-read_data temp.init
-lattice fcc 5.405 origin 0.25 0.25 0.25
-region simRegion block -12 12 -3 3 -3 3
-
-# create atoms, NOTE commented out for restart
-#region mdRegion block -5 5 -3 3 -3 3
-#boundary f p p
-#create_box 1 mdRegion
-#create_atoms 1 region mdRegion
-#mass 1 39.95
-
-# specify interal/ghost atoms
-region mdInternal block -4 4 -3 3 -3 3
-group internal region mdInternal
-group ghost subtract all internal
-
-# velocities have Vcm = 0, NOTE next four lines commented out for restart
-#velocity internal create 40. 87287 mom yes loop geom
-
-#pair_style lj/cut 13.5
-##pair_coeff 1 1 0.010323166 3.405 13.5
-#pair_coeff 1 1 .238 3.405 13.5
-
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc thermal Ar_thermal.mat
-
-# ID part keywords nx ny nz region
-#fix_modify AtC fem create mesh 12 2 2 simRegion f p p
-fix_modify AtC fem create mesh 12 1 1 simRegion f p p
-
-# specify atom types
-#fix_modify AtC transfer internal type internal
-fix_modify AtC transfer boundary type ghost
-
-# fix a temperature
-fix_modify AtC transfer fix temperature all 20.
-
-# turn on thermostat
-fix_modify AtC transfer thermal control rescale 10
-
-# equilibrate MD field
-#dump D1 all atom 100 dump.bar1d
-#fix_modify AtC transfer output bar1dfe 100
-timestep 5
-variable xdof equal 3*count(ghost)
-compute_modify thermo_temp extra ${xdof}
-thermo_style custom step cpu etotal pe f_AtC[1] temp f_AtC[2]
-thermo_modify format 1 %6i format 2 %7.2g
-thermo 100
-run 400
-
-# change thermostat to hoover
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer thermal control hoover
-fix_modify AtC transfer filter type exponential
-fix_modify AtC transfer filter scale 10000.0
-fix_modify AtC transfer filter on
-fix_modify AtC transfer internal_quadrature off
-
-# add nodesets
-# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
-fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -12 12 -12 12
-fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -12 12 -12 12
-fix_modify AtC transfer fix temperature lbc 40.
-fix_modify AtC transfer fix temperature rbc 20.
-
-# initialize filter
-#thermo 1
-run 100
-
-# set up output, should be before a "run"
-fix_modify AtC transfer output bar1dFE 100 text
-
-# ouput command
-#dump D1 all atom 1000 dump.bar1d
-fix_modify AtC transfer atomic_output bar1dMD 100
-
-# run with FE
-reset_timestep 0
-thermo 100
-run 10000
diff --git a/examples/USER/atc/bar1d_thermal/in.bar1d_flux b/examples/USER/atc/bar1d_thermal/in.bar1d_flux
deleted file mode 100644
index 5b16fcfcb..000000000
--- a/examples/USER/atc/bar1d_thermal/in.bar1d_flux
+++ /dev/null
@@ -1,103 +0,0 @@
-#AtC Thermal Coupling
-# This benchmark tests heat conducting into and out of the MD region. The
-# temperature is intially 20 everywhere and the left boundary BC is fixed at
-# 40.# The result should show heat diffusing through the FEM to the MD and back
-# out # to the FEM on the right. Insufficient time is captured to reach the
-# linear # steady state, but heat crossing both boundaries should be observed.
-#echo both
-units real
-atom_style atomic
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
-# NOTE following 3 lines added for restart
-boundary f p p
-pair_style lj/cut 13.5
-read_data temp.init
-lattice fcc 5.405 origin 0.25 0.25 0.25
-region simRegion block -12 12 -3 3 -3 3
-
-# create atoms, NOTE commented out for restart
-#region mdRegion block -5 5 -3 3 -3 3
-#boundary f p p
-#create_box 1 mdRegion
-#create_atoms 1 region mdRegion
-#mass 1 39.95
-
-# specify interal/ghost atoms
-region mdInternal block -4 4 -3 3 -3 3
-group internal region mdInternal
-group ghost subtract all internal
-
-# velocities have Vcm = 0, NOTE next four lines commented out for restart
-#velocity internal create 40. 87287 mom yes loop geom
-
-#pair_style lj/cut 13.5
-##pair_coeff 1 1 0.010323166 3.405 13.5
-#pair_coeff 1 1 .238 3.405 13.5
-
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-#write_restart tinit.dat
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc thermal Ar_thermal.mat
-
-# ID part keywords nx ny nz region
-#fix_modify AtC fem create mesh 12 2 2 simRegion f p p
-fix_modify AtC fem create mesh 12 1 1 simRegion f p p
-fix_modify AtC mesh create_faceset ibndy box -4.0 4.0 -12 12 -12 12 in
-fix_modify AtC mesh create_faceset obndy box -4.0 4.0 -12 12 -12 12 outward
-
-# specify atom types
-#fix_modify AtC transfer internal type internal
-fix_modify AtC transfer boundary type ghost
-
-# fix a temperature
-fix_modify AtC transfer fix temperature all 20.
-#fix_modify AtC transfer fix temperature all linear 0 0 0 -0.154 0 0 30.
-
-# turn on thermostat
-fix_modify AtC transfer thermal control rescale 10
-
-variable xdof equal 3*count(ghost)
-compute_modify thermo_temp extra ${xdof}
-thermo_style custom step cpu etotal pe f_AtC[1] temp f_AtC[2]
-thermo_modify format 1 %6i format 2 %7.2g
-
-# equilibrate MD field
-#fix_modify AtC transfer output bar1dfe_flux_init 100
-timestep 5
-thermo 10
-run 400
-
-
-# change thermostat to hoover
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer thermal control flux faceset obndy
-fix_modify AtC transfer filter type exponential
-fix_modify AtC transfer filter scale 10000.0
-fix_modify AtC transfer filter on
-
-# add nodesets
-# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
-fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -12 12 -12 12
-fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -12 12 -12 12
-fix_modify AtC transfer fix temperature lbc 40.
-fix_modify AtC transfer fix temperature rbc 20.
-
-# initialize filter
-run 100
-
-# set up output, should be before a "run"
-fix_modify AtC transfer output bar1d_fluxFE 100 text
-
-# ouput command
-#dump D1 all atom 1000 dump.bar1d
-fix_modify AtC transfer atomic_output bar1d_fluxMD 100
-
-# run with FE
-reset_timestep 0
-thermo 100
-run 10000
diff --git a/examples/USER/atc/bar1d_thermal/in.bar1d_frac_step b/examples/USER/atc/bar1d_thermal/in.bar1d_frac_step
deleted file mode 100644
index e602f4ad0..000000000
--- a/examples/USER/atc/bar1d_thermal/in.bar1d_frac_step
+++ /dev/null
@@ -1,112 +0,0 @@
-#AtC Thermal Coupling
-# This benchmark tests heat conducting into and out of the MD region. The
-# temperature is intially 20 everywhere and the left boundary BC is fixed at
-# 40.# The result should show heat diffusing through the FEM to the MD and back
-# out # to the FEM on the right. Insufficient time is captured to reach the
-# linear # steady state, but heat crossing both boundaries should be observed.
-
-
-units real
-atom_style atomic
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
-# NOTE following 3 lines added for restart
-boundary f p p
-pair_style lj/cut 13.5
-read_data temp.init
-lattice fcc 5.405 origin 0.25 0.25 0.25
-region simRegion block -12 12 -3 3 -3 3
-
-# create atoms, NOTE commented out for restart
-#region mdRegion block -5 5 -3 3 -3 3
-#boundary f p p
-#create_box 1 mdRegion
-#create_atoms 1 region mdRegion
-#mass 1 39.95
-
-# specify interal/ghost atoms
-region mdInternal block -4 4 -3 3 -3 3
-group internal region mdInternal
-group ghost subtract all internal
-
-# velocities have Vcm = 0, NOTE next four lines commented out for restart
-#velocity internal create 40. 87287 mom yes loop geom
-
-#pair_style lj/cut 13.5
-##pair_coeff 1 1 0.010323166 3.405 13.5
-#pair_coeff 1 1 .238 3.405 13.5
-
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc thermal Ar_thermal.mat
-
-# ID part keywords nx ny nz region
-#fix_modify AtC fem create mesh 12 2 2 simRegion f p p
-fix_modify AtC fem create mesh 4 1 1 mdInternal f p p
-#fix_modify AtC mesh create_faceset ibndy box -4.0 4.0 -12 12 -12 12 in
-#fix_modify AtC mesh create_faceset obndy box -4.0 4.0 -12 12 -12 12 outward
-
-# specify atom types
-#fix_modify AtC transfer internal type internal
-#fix_modify AtC transfer boundary type ghost
-
-# fix a temperature
-fix_modify AtC transfer fix temperature all 20.
-
-# turn on thermostat
-fix_modify AtC transfer thermal control rescale 10
-
-# equilibrate MD field
-#dump D1 all atom 100 dump.bar1d
-#fix_modify AtC transfer output bar1dfe 100
-timestep 5
-variable xdof equal 3*count(ghost)
-compute_modify thermo_temp extra ${xdof}
-thermo_style custom step cpu etotal pe f_AtC[1] temp f_AtC[2]
-thermo_modify format 1 %6i format 2 %7.2g
-thermo 100
-run 400
-
-# add nodesets
-# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
-fix_modify AtC mesh create_nodeset lbc -4.1 -3.9 -12 12 -12 12
-fix_modify AtC mesh create_nodeset rbc 3.9 4.1 -12 12 -12 12
-fix_modify AtC transfer fix temperature lbc 40.
-fix_modify AtC transfer fix temperature rbc 20.
-
-# initialize filter
-#timestep 0.5
-#fix_modify AtC transfer output bar1d_frac_stepFE 1
-#thermo 1
-run 400
-
-# change thermostat to hoover
-fix_modify AtC transfer pmfc
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer fix temperature lbc 40.
-fix_modify AtC transfer fix temperature rbc 20.
-# fix_modify AtC transfer thermal control none
-#fix_modify AtC transfer thermal control hoover
-fix_modify AtC transfer thermal control flux no_boundary
-# #fix_modify AtC transfer thermal control flux interpolate
-# #fix_modify AtC transfer thermal control flux faceset obndy
-fix_modify AtC transfer filter type exponential
-fix_modify AtC transfer filter scale 10000.0
-#fix_modify AtC transfer filter on
-fix_modify AtC transfer internal_quadrature off
-# #fix_modify AtC transfer localized_lambda on
-
-# set up output, should be before a "run"
-fix_modify AtC transfer output bar1d_frac_stepFE 100 text
-
-# ouput command
-#dump D1 all atom 1000 dump.bar1d
-fix_modify AtC transfer atomic_output bar1d_frac_stepMD 100
-
-# run with FE
-reset_timestep 0
-thermo 100
-run 10000
diff --git a/examples/USER/atc/bar1d_thermal/temp.init b/examples/USER/atc/bar1d_thermal/temp.init
deleted file mode 100644
index afa13e286..000000000
--- a/examples/USER/atc/bar1d_thermal/temp.init
+++ /dev/null
@@ -1,2903 +0,0 @@
-LAMMPS data file from restart file: timestep = 0, procs = 1
-
-1440 atoms
-
-1 atom types
-
--27.025 27.025 xlo xhi
--16.215 16.215 ylo yhi
--16.215 16.215 zlo zhi
-
-Masses
-
-1 39.95
-
-Pair Coeffs
-
-1 0.238 3.405
-
-Atoms
-
-1 1 -25.6738 -14.8638 -14.8638 0 0 0
-2 1 -22.9713 -12.1613 -14.8638 0 0 0
-3 1 -22.9713 -14.8638 -12.1613 0 0 0
-4 1 -25.6738 -12.1613 -12.1613 0 0 0
-5 1 -20.2688 -14.8638 -14.8638 0 0 0
-6 1 -17.5663 -12.1613 -14.8638 0 0 0
-7 1 -17.5663 -14.8638 -12.1613 0 0 0
-8 1 -20.2688 -12.1613 -12.1613 0 0 0
-9 1 -14.8638 -14.8638 -14.8638 0 0 0
-10 1 -12.1613 -12.1613 -14.8638 0 0 0
-11 1 -12.1613 -14.8638 -12.1613 0 0 0
-12 1 -14.8638 -12.1613 -12.1613 0 0 0
-13 1 -9.45875 -14.8638 -14.8638 0 0 0
-14 1 -6.75625 -12.1613 -14.8638 0 0 0
-15 1 -6.75625 -14.8638 -12.1613 0 0 0
-16 1 -9.45875 -12.1613 -12.1613 0 0 0
-17 1 -4.05375 -14.8638 -14.8638 0 0 0
-18 1 -1.35125 -12.1613 -14.8638 0 0 0
-19 1 -1.35125 -14.8638 -12.1613 0 0 0
-20 1 -4.05375 -12.1613 -12.1613 0 0 0
-21 1 1.35125 -14.8638 -14.8638 0 0 0
-22 1 4.05375 -12.1613 -14.8638 0 0 0
-23 1 4.05375 -14.8638 -12.1613 0 0 0
-24 1 1.35125 -12.1613 -12.1613 0 0 0
-25 1 6.75625 -14.8638 -14.8638 0 0 0
-26 1 9.45875 -12.1613 -14.8638 0 0 0
-27 1 9.45875 -14.8638 -12.1613 0 0 0
-28 1 6.75625 -12.1613 -12.1613 0 0 0
-29 1 12.1613 -14.8638 -14.8638 0 0 0
-30 1 14.8638 -12.1613 -14.8638 0 0 0
-31 1 14.8638 -14.8638 -12.1613 0 0 0
-32 1 12.1613 -12.1613 -12.1613 0 0 0
-33 1 17.5663 -14.8638 -14.8638 0 0 0
-34 1 20.2688 -12.1613 -14.8638 0 0 0
-35 1 20.2688 -14.8638 -12.1613 0 0 0
-36 1 17.5663 -12.1613 -12.1613 0 0 0
-37 1 22.9713 -14.8638 -14.8638 0 0 0
-38 1 25.6738 -12.1613 -14.8638 0 0 0
-39 1 25.6738 -14.8638 -12.1613 0 0 0
-40 1 22.9713 -12.1613 -12.1613 0 0 0
-41 1 -25.6738 -9.45875 -14.8638 0 0 0
-42 1 -22.9713 -6.75625 -14.8638 0 0 0
-43 1 -22.9713 -9.45875 -12.1613 0 0 0
-44 1 -25.6738 -6.75625 -12.1613 0 0 0
-45 1 -20.2688 -9.45875 -14.8638 0 0 0
-46 1 -17.5663 -6.75625 -14.8638 0 0 0
-47 1 -17.5663 -9.45875 -12.1613 0 0 0
-48 1 -20.2688 -6.75625 -12.1613 0 0 0
-49 1 -14.8638 -9.45875 -14.8638 0 0 0
-50 1 -12.1613 -6.75625 -14.8638 0 0 0
-51 1 -12.1613 -9.45875 -12.1613 0 0 0
-52 1 -14.8638 -6.75625 -12.1613 0 0 0
-53 1 -9.45875 -9.45875 -14.8638 0 0 0
-54 1 -6.75625 -6.75625 -14.8638 0 0 0
-55 1 -6.75625 -9.45875 -12.1613 0 0 0
-56 1 -9.45875 -6.75625 -12.1613 0 0 0
-57 1 -4.05375 -9.45875 -14.8638 0 0 0
-58 1 -1.35125 -6.75625 -14.8638 0 0 0
-59 1 -1.35125 -9.45875 -12.1613 0 0 0
-60 1 -4.05375 -6.75625 -12.1613 0 0 0
-61 1 1.35125 -9.45875 -14.8638 0 0 0
-62 1 4.05375 -6.75625 -14.8638 0 0 0
-63 1 4.05375 -9.45875 -12.1613 0 0 0
-64 1 1.35125 -6.75625 -12.1613 0 0 0
-65 1 6.75625 -9.45875 -14.8638 0 0 0
-66 1 9.45875 -6.75625 -14.8638 0 0 0
-67 1 9.45875 -9.45875 -12.1613 0 0 0
-68 1 6.75625 -6.75625 -12.1613 0 0 0
-69 1 12.1613 -9.45875 -14.8638 0 0 0
-70 1 14.8638 -6.75625 -14.8638 0 0 0
-71 1 14.8638 -9.45875 -12.1613 0 0 0
-72 1 12.1613 -6.75625 -12.1613 0 0 0
-73 1 17.5663 -9.45875 -14.8638 0 0 0
-74 1 20.2688 -6.75625 -14.8638 0 0 0
-75 1 20.2688 -9.45875 -12.1613 0 0 0
-76 1 17.5663 -6.75625 -12.1613 0 0 0
-77 1 22.9713 -9.45875 -14.8638 0 0 0
-78 1 25.6738 -6.75625 -14.8638 0 0 0
-79 1 25.6738 -9.45875 -12.1613 0 0 0
-80 1 22.9713 -6.75625 -12.1613 0 0 0
-81 1 -25.6738 -4.05375 -14.8638 0 0 0
-82 1 -22.9713 -1.35125 -14.8638 0 0 0
-83 1 -22.9713 -4.05375 -12.1613 0 0 0
-84 1 -25.6738 -1.35125 -12.1613 0 0 0
-85 1 -20.2688 -4.05375 -14.8638 0 0 0
-86 1 -17.5663 -1.35125 -14.8638 0 0 0
-87 1 -17.5663 -4.05375 -12.1613 0 0 0
-88 1 -20.2688 -1.35125 -12.1613 0 0 0
-89 1 -14.8638 -4.05375 -14.8638 0 0 0
-90 1 -12.1613 -1.35125 -14.8638 0 0 0
-91 1 -12.1613 -4.05375 -12.1613 0 0 0
-92 1 -14.8638 -1.35125 -12.1613 0 0 0
-93 1 -9.45875 -4.05375 -14.8638 0 0 0
-94 1 -6.75625 -1.35125 -14.8638 0 0 0
-95 1 -6.75625 -4.05375 -12.1613 0 0 0
-96 1 -9.45875 -1.35125 -12.1613 0 0 0
-97 1 -4.05375 -4.05375 -14.8638 0 0 0
-98 1 -1.35125 -1.35125 -14.8638 0 0 0
-99 1 -1.35125 -4.05375 -12.1613 0 0 0
-100 1 -4.05375 -1.35125 -12.1613 0 0 0
-101 1 1.35125 -4.05375 -14.8638 0 0 0
-102 1 4.05375 -1.35125 -14.8638 0 0 0
-103 1 4.05375 -4.05375 -12.1613 0 0 0
-104 1 1.35125 -1.35125 -12.1613 0 0 0
-105 1 6.75625 -4.05375 -14.8638 0 0 0
-106 1 9.45875 -1.35125 -14.8638 0 0 0
-107 1 9.45875 -4.05375 -12.1613 0 0 0
-108 1 6.75625 -1.35125 -12.1613 0 0 0
-109 1 12.1613 -4.05375 -14.8638 0 0 0
-110 1 14.8638 -1.35125 -14.8638 0 0 0
-111 1 14.8638 -4.05375 -12.1613 0 0 0
-112 1 12.1613 -1.35125 -12.1613 0 0 0
-113 1 17.5663 -4.05375 -14.8638 0 0 0
-114 1 20.2688 -1.35125 -14.8638 0 0 0
-115 1 20.2688 -4.05375 -12.1613 0 0 0
-116 1 17.5663 -1.35125 -12.1613 0 0 0
-117 1 22.9713 -4.05375 -14.8638 0 0 0
-118 1 25.6738 -1.35125 -14.8638 0 0 0
-119 1 25.6738 -4.05375 -12.1613 0 0 0
-120 1 22.9713 -1.35125 -12.1613 0 0 0
-121 1 -25.6738 1.35125 -14.8638 0 0 0
-122 1 -22.9713 4.05375 -14.8638 0 0 0
-123 1 -22.9713 1.35125 -12.1613 0 0 0
-124 1 -25.6738 4.05375 -12.1613 0 0 0
-125 1 -20.2688 1.35125 -14.8638 0 0 0
-126 1 -17.5663 4.05375 -14.8638 0 0 0
-127 1 -17.5663 1.35125 -12.1613 0 0 0
-128 1 -20.2688 4.05375 -12.1613 0 0 0
-129 1 -14.8638 1.35125 -14.8638 0 0 0
-130 1 -12.1613 4.05375 -14.8638 0 0 0
-131 1 -12.1613 1.35125 -12.1613 0 0 0
-132 1 -14.8638 4.05375 -12.1613 0 0 0
-133 1 -9.45875 1.35125 -14.8638 0 0 0
-134 1 -6.75625 4.05375 -14.8638 0 0 0
-135 1 -6.75625 1.35125 -12.1613 0 0 0
-136 1 -9.45875 4.05375 -12.1613 0 0 0
-137 1 -4.05375 1.35125 -14.8638 0 0 0
-138 1 -1.35125 4.05375 -14.8638 0 0 0
-139 1 -1.35125 1.35125 -12.1613 0 0 0
-140 1 -4.05375 4.05375 -12.1613 0 0 0
-141 1 1.35125 1.35125 -14.8638 0 0 0
-142 1 4.05375 4.05375 -14.8638 0 0 0
-143 1 4.05375 1.35125 -12.1613 0 0 0
-144 1 1.35125 4.05375 -12.1613 0 0 0
-145 1 6.75625 1.35125 -14.8638 0 0 0
-146 1 9.45875 4.05375 -14.8638 0 0 0
-147 1 9.45875 1.35125 -12.1613 0 0 0
-148 1 6.75625 4.05375 -12.1613 0 0 0
-149 1 12.1613 1.35125 -14.8638 0 0 0
-150 1 14.8638 4.05375 -14.8638 0 0 0
-151 1 14.8638 1.35125 -12.1613 0 0 0
-152 1 12.1613 4.05375 -12.1613 0 0 0
-153 1 17.5663 1.35125 -14.8638 0 0 0
-154 1 20.2688 4.05375 -14.8638 0 0 0
-155 1 20.2688 1.35125 -12.1613 0 0 0
-156 1 17.5663 4.05375 -12.1613 0 0 0
-157 1 22.9713 1.35125 -14.8638 0 0 0
-158 1 25.6738 4.05375 -14.8638 0 0 0
-159 1 25.6738 1.35125 -12.1613 0 0 0
-160 1 22.9713 4.05375 -12.1613 0 0 0
-161 1 -25.6738 6.75625 -14.8638 0 0 0
-162 1 -22.9713 9.45875 -14.8638 0 0 0
-163 1 -22.9713 6.75625 -12.1613 0 0 0
-164 1 -25.6738 9.45875 -12.1613 0 0 0
-165 1 -20.2688 6.75625 -14.8638 0 0 0
-166 1 -17.5663 9.45875 -14.8638 0 0 0
-167 1 -17.5663 6.75625 -12.1613 0 0 0
-168 1 -20.2688 9.45875 -12.1613 0 0 0
-169 1 -14.8638 6.75625 -14.8638 0 0 0
-170 1 -12.1613 9.45875 -14.8638 0 0 0
-171 1 -12.1613 6.75625 -12.1613 0 0 0
-172 1 -14.8638 9.45875 -12.1613 0 0 0
-173 1 -9.45875 6.75625 -14.8638 0 0 0
-174 1 -6.75625 9.45875 -14.8638 0 0 0
-175 1 -6.75625 6.75625 -12.1613 0 0 0
-176 1 -9.45875 9.45875 -12.1613 0 0 0
-177 1 -4.05375 6.75625 -14.8638 0 0 0
-178 1 -1.35125 9.45875 -14.8638 0 0 0
-179 1 -1.35125 6.75625 -12.1613 0 0 0
-180 1 -4.05375 9.45875 -12.1613 0 0 0
-181 1 1.35125 6.75625 -14.8638 0 0 0
-182 1 4.05375 9.45875 -14.8638 0 0 0
-183 1 4.05375 6.75625 -12.1613 0 0 0
-184 1 1.35125 9.45875 -12.1613 0 0 0
-185 1 6.75625 6.75625 -14.8638 0 0 0
-186 1 9.45875 9.45875 -14.8638 0 0 0
-187 1 9.45875 6.75625 -12.1613 0 0 0
-188 1 6.75625 9.45875 -12.1613 0 0 0
-189 1 12.1613 6.75625 -14.8638 0 0 0
-190 1 14.8638 9.45875 -14.8638 0 0 0
-191 1 14.8638 6.75625 -12.1613 0 0 0
-192 1 12.1613 9.45875 -12.1613 0 0 0
-193 1 17.5663 6.75625 -14.8638 0 0 0
-194 1 20.2688 9.45875 -14.8638 0 0 0
-195 1 20.2688 6.75625 -12.1613 0 0 0
-196 1 17.5663 9.45875 -12.1613 0 0 0
-197 1 22.9713 6.75625 -14.8638 0 0 0
-198 1 25.6738 9.45875 -14.8638 0 0 0
-199 1 25.6738 6.75625 -12.1613 0 0 0
-200 1 22.9713 9.45875 -12.1613 0 0 0
-201 1 -25.6738 12.1613 -14.8638 0 0 0
-202 1 -22.9713 14.8638 -14.8638 0 0 0
-203 1 -22.9713 12.1613 -12.1613 0 0 0
-204 1 -25.6738 14.8638 -12.1613 0 0 0
-205 1 -20.2688 12.1613 -14.8638 0 0 0
-206 1 -17.5663 14.8638 -14.8638 0 0 0
-207 1 -17.5663 12.1613 -12.1613 0 0 0
-208 1 -20.2688 14.8638 -12.1613 0 0 0
-209 1 -14.8638 12.1613 -14.8638 0 0 0
-210 1 -12.1613 14.8638 -14.8638 0 0 0
-211 1 -12.1613 12.1613 -12.1613 0 0 0
-212 1 -14.8638 14.8638 -12.1613 0 0 0
-213 1 -9.45875 12.1613 -14.8638 0 0 0
-214 1 -6.75625 14.8638 -14.8638 0 0 0
-215 1 -6.75625 12.1613 -12.1613 0 0 0
-216 1 -9.45875 14.8638 -12.1613 0 0 0
-217 1 -4.05375 12.1613 -14.8638 0 0 0
-218 1 -1.35125 14.8638 -14.8638 0 0 0
-219 1 -1.35125 12.1613 -12.1613 0 0 0
-220 1 -4.05375 14.8638 -12.1613 0 0 0
-221 1 1.35125 12.1613 -14.8638 0 0 0
-222 1 4.05375 14.8638 -14.8638 0 0 0
-223 1 4.05375 12.1613 -12.1613 0 0 0
-224 1 1.35125 14.8638 -12.1613 0 0 0
-225 1 6.75625 12.1613 -14.8638 0 0 0
-226 1 9.45875 14.8638 -14.8638 0 0 0
-227 1 9.45875 12.1613 -12.1613 0 0 0
-228 1 6.75625 14.8638 -12.1613 0 0 0
-229 1 12.1613 12.1613 -14.8638 0 0 0
-230 1 14.8638 14.8638 -14.8638 0 0 0
-231 1 14.8638 12.1613 -12.1613 0 0 0
-232 1 12.1613 14.8638 -12.1613 0 0 0
-233 1 17.5663 12.1613 -14.8638 0 0 0
-234 1 20.2688 14.8638 -14.8638 0 0 0
-235 1 20.2688 12.1613 -12.1613 0 0 0
-236 1 17.5663 14.8638 -12.1613 0 0 0
-237 1 22.9713 12.1613 -14.8638 0 0 0
-238 1 25.6738 14.8638 -14.8638 0 0 0
-239 1 25.6738 12.1613 -12.1613 0 0 0
-240 1 22.9713 14.8638 -12.1613 0 0 0
-241 1 -25.6738 -14.8638 -9.45875 0 0 0
-242 1 -22.9713 -12.1613 -9.45875 0 0 0
-243 1 -22.9713 -14.8638 -6.75625 0 0 0
-244 1 -25.6738 -12.1613 -6.75625 0 0 0
-245 1 -20.2688 -14.8638 -9.45875 0 0 0
-246 1 -17.5663 -12.1613 -9.45875 0 0 0
-247 1 -17.5663 -14.8638 -6.75625 0 0 0
-248 1 -20.2688 -12.1613 -6.75625 0 0 0
-249 1 -14.8638 -14.8638 -9.45875 0 0 0
-250 1 -12.1613 -12.1613 -9.45875 0 0 0
-251 1 -12.1613 -14.8638 -6.75625 0 0 0
-252 1 -14.8638 -12.1613 -6.75625 0 0 0
-253 1 -9.45875 -14.8638 -9.45875 0 0 0
-254 1 -6.75625 -12.1613 -9.45875 0 0 0
-255 1 -6.75625 -14.8638 -6.75625 0 0 0
-256 1 -9.45875 -12.1613 -6.75625 0 0 0
-257 1 -4.05375 -14.8638 -9.45875 0 0 0
-258 1 -1.35125 -12.1613 -9.45875 0 0 0
-259 1 -1.35125 -14.8638 -6.75625 0 0 0
-260 1 -4.05375 -12.1613 -6.75625 0 0 0
-261 1 1.35125 -14.8638 -9.45875 0 0 0
-262 1 4.05375 -12.1613 -9.45875 0 0 0
-263 1 4.05375 -14.8638 -6.75625 0 0 0
-264 1 1.35125 -12.1613 -6.75625 0 0 0
-265 1 6.75625 -14.8638 -9.45875 0 0 0
-266 1 9.45875 -12.1613 -9.45875 0 0 0
-267 1 9.45875 -14.8638 -6.75625 0 0 0
-268 1 6.75625 -12.1613 -6.75625 0 0 0
-269 1 12.1613 -14.8638 -9.45875 0 0 0
-270 1 14.8638 -12.1613 -9.45875 0 0 0
-271 1 14.8638 -14.8638 -6.75625 0 0 0
-272 1 12.1613 -12.1613 -6.75625 0 0 0
-273 1 17.5663 -14.8638 -9.45875 0 0 0
-274 1 20.2688 -12.1613 -9.45875 0 0 0
-275 1 20.2688 -14.8638 -6.75625 0 0 0
-276 1 17.5663 -12.1613 -6.75625 0 0 0
-277 1 22.9713 -14.8638 -9.45875 0 0 0
-278 1 25.6738 -12.1613 -9.45875 0 0 0
-279 1 25.6738 -14.8638 -6.75625 0 0 0
-280 1 22.9713 -12.1613 -6.75625 0 0 0
-281 1 -25.6738 -9.45875 -9.45875 0 0 0
-282 1 -22.9713 -6.75625 -9.45875 0 0 0
-283 1 -22.9713 -9.45875 -6.75625 0 0 0
-284 1 -25.6738 -6.75625 -6.75625 0 0 0
-285 1 -20.2688 -9.45875 -9.45875 0 0 0
-286 1 -17.5663 -6.75625 -9.45875 0 0 0
-287 1 -17.5663 -9.45875 -6.75625 0 0 0
-288 1 -20.2688 -6.75625 -6.75625 0 0 0
-289 1 -14.8638 -9.45875 -9.45875 0 0 0
-290 1 -12.1613 -6.75625 -9.45875 0 0 0
-291 1 -12.1613 -9.45875 -6.75625 0 0 0
-292 1 -14.8638 -6.75625 -6.75625 0 0 0
-293 1 -9.45875 -9.45875 -9.45875 0 0 0
-294 1 -6.75625 -6.75625 -9.45875 0 0 0
-295 1 -6.75625 -9.45875 -6.75625 0 0 0
-296 1 -9.45875 -6.75625 -6.75625 0 0 0
-297 1 -4.05375 -9.45875 -9.45875 0 0 0
-298 1 -1.35125 -6.75625 -9.45875 0 0 0
-299 1 -1.35125 -9.45875 -6.75625 0 0 0
-300 1 -4.05375 -6.75625 -6.75625 0 0 0
-301 1 1.35125 -9.45875 -9.45875 0 0 0
-302 1 4.05375 -6.75625 -9.45875 0 0 0
-303 1 4.05375 -9.45875 -6.75625 0 0 0
-304 1 1.35125 -6.75625 -6.75625 0 0 0
-305 1 6.75625 -9.45875 -9.45875 0 0 0
-306 1 9.45875 -6.75625 -9.45875 0 0 0
-307 1 9.45875 -9.45875 -6.75625 0 0 0
-308 1 6.75625 -6.75625 -6.75625 0 0 0
-309 1 12.1613 -9.45875 -9.45875 0 0 0
-310 1 14.8638 -6.75625 -9.45875 0 0 0
-311 1 14.8638 -9.45875 -6.75625 0 0 0
-312 1 12.1613 -6.75625 -6.75625 0 0 0
-313 1 17.5663 -9.45875 -9.45875 0 0 0
-314 1 20.2688 -6.75625 -9.45875 0 0 0
-315 1 20.2688 -9.45875 -6.75625 0 0 0
-316 1 17.5663 -6.75625 -6.75625 0 0 0
-317 1 22.9713 -9.45875 -9.45875 0 0 0
-318 1 25.6738 -6.75625 -9.45875 0 0 0
-319 1 25.6738 -9.45875 -6.75625 0 0 0
-320 1 22.9713 -6.75625 -6.75625 0 0 0
-321 1 -25.6738 -4.05375 -9.45875 0 0 0
-322 1 -22.9713 -1.35125 -9.45875 0 0 0
-323 1 -22.9713 -4.05375 -6.75625 0 0 0
-324 1 -25.6738 -1.35125 -6.75625 0 0 0
-325 1 -20.2688 -4.05375 -9.45875 0 0 0
-326 1 -17.5663 -1.35125 -9.45875 0 0 0
-327 1 -17.5663 -4.05375 -6.75625 0 0 0
-328 1 -20.2688 -1.35125 -6.75625 0 0 0
-329 1 -14.8638 -4.05375 -9.45875 0 0 0
-330 1 -12.1613 -1.35125 -9.45875 0 0 0
-331 1 -12.1613 -4.05375 -6.75625 0 0 0
-332 1 -14.8638 -1.35125 -6.75625 0 0 0
-333 1 -9.45875 -4.05375 -9.45875 0 0 0
-334 1 -6.75625 -1.35125 -9.45875 0 0 0
-335 1 -6.75625 -4.05375 -6.75625 0 0 0
-336 1 -9.45875 -1.35125 -6.75625 0 0 0
-337 1 -4.05375 -4.05375 -9.45875 0 0 0
-338 1 -1.35125 -1.35125 -9.45875 0 0 0
-339 1 -1.35125 -4.05375 -6.75625 0 0 0
-340 1 -4.05375 -1.35125 -6.75625 0 0 0
-341 1 1.35125 -4.05375 -9.45875 0 0 0
-342 1 4.05375 -1.35125 -9.45875 0 0 0
-343 1 4.05375 -4.05375 -6.75625 0 0 0
-344 1 1.35125 -1.35125 -6.75625 0 0 0
-345 1 6.75625 -4.05375 -9.45875 0 0 0
-346 1 9.45875 -1.35125 -9.45875 0 0 0
-347 1 9.45875 -4.05375 -6.75625 0 0 0
-348 1 6.75625 -1.35125 -6.75625 0 0 0
-349 1 12.1613 -4.05375 -9.45875 0 0 0
-350 1 14.8638 -1.35125 -9.45875 0 0 0
-351 1 14.8638 -4.05375 -6.75625 0 0 0
-352 1 12.1613 -1.35125 -6.75625 0 0 0
-353 1 17.5663 -4.05375 -9.45875 0 0 0
-354 1 20.2688 -1.35125 -9.45875 0 0 0
-355 1 20.2688 -4.05375 -6.75625 0 0 0
-356 1 17.5663 -1.35125 -6.75625 0 0 0
-357 1 22.9713 -4.05375 -9.45875 0 0 0
-358 1 25.6738 -1.35125 -9.45875 0 0 0
-359 1 25.6738 -4.05375 -6.75625 0 0 0
-360 1 22.9713 -1.35125 -6.75625 0 0 0
-361 1 -25.6738 1.35125 -9.45875 0 0 0
-362 1 -22.9713 4.05375 -9.45875 0 0 0
-363 1 -22.9713 1.35125 -6.75625 0 0 0
-364 1 -25.6738 4.05375 -6.75625 0 0 0
-365 1 -20.2688 1.35125 -9.45875 0 0 0
-366 1 -17.5663 4.05375 -9.45875 0 0 0
-367 1 -17.5663 1.35125 -6.75625 0 0 0
-368 1 -20.2688 4.05375 -6.75625 0 0 0
-369 1 -14.8638 1.35125 -9.45875 0 0 0
-370 1 -12.1613 4.05375 -9.45875 0 0 0
-371 1 -12.1613 1.35125 -6.75625 0 0 0
-372 1 -14.8638 4.05375 -6.75625 0 0 0
-373 1 -9.45875 1.35125 -9.45875 0 0 0
-374 1 -6.75625 4.05375 -9.45875 0 0 0
-375 1 -6.75625 1.35125 -6.75625 0 0 0
-376 1 -9.45875 4.05375 -6.75625 0 0 0
-377 1 -4.05375 1.35125 -9.45875 0 0 0
-378 1 -1.35125 4.05375 -9.45875 0 0 0
-379 1 -1.35125 1.35125 -6.75625 0 0 0
-380 1 -4.05375 4.05375 -6.75625 0 0 0
-381 1 1.35125 1.35125 -9.45875 0 0 0
-382 1 4.05375 4.05375 -9.45875 0 0 0
-383 1 4.05375 1.35125 -6.75625 0 0 0
-384 1 1.35125 4.05375 -6.75625 0 0 0
-385 1 6.75625 1.35125 -9.45875 0 0 0
-386 1 9.45875 4.05375 -9.45875 0 0 0
-387 1 9.45875 1.35125 -6.75625 0 0 0
-388 1 6.75625 4.05375 -6.75625 0 0 0
-389 1 12.1613 1.35125 -9.45875 0 0 0
-390 1 14.8638 4.05375 -9.45875 0 0 0
-391 1 14.8638 1.35125 -6.75625 0 0 0
-392 1 12.1613 4.05375 -6.75625 0 0 0
-393 1 17.5663 1.35125 -9.45875 0 0 0
-394 1 20.2688 4.05375 -9.45875 0 0 0
-395 1 20.2688 1.35125 -6.75625 0 0 0
-396 1 17.5663 4.05375 -6.75625 0 0 0
-397 1 22.9713 1.35125 -9.45875 0 0 0
-398 1 25.6738 4.05375 -9.45875 0 0 0
-399 1 25.6738 1.35125 -6.75625 0 0 0
-400 1 22.9713 4.05375 -6.75625 0 0 0
-401 1 -25.6738 6.75625 -9.45875 0 0 0
-402 1 -22.9713 9.45875 -9.45875 0 0 0
-403 1 -22.9713 6.75625 -6.75625 0 0 0
-404 1 -25.6738 9.45875 -6.75625 0 0 0
-405 1 -20.2688 6.75625 -9.45875 0 0 0
-406 1 -17.5663 9.45875 -9.45875 0 0 0
-407 1 -17.5663 6.75625 -6.75625 0 0 0
-408 1 -20.2688 9.45875 -6.75625 0 0 0
-409 1 -14.8638 6.75625 -9.45875 0 0 0
-410 1 -12.1613 9.45875 -9.45875 0 0 0
-411 1 -12.1613 6.75625 -6.75625 0 0 0
-412 1 -14.8638 9.45875 -6.75625 0 0 0
-413 1 -9.45875 6.75625 -9.45875 0 0 0
-414 1 -6.75625 9.45875 -9.45875 0 0 0
-415 1 -6.75625 6.75625 -6.75625 0 0 0
-416 1 -9.45875 9.45875 -6.75625 0 0 0
-417 1 -4.05375 6.75625 -9.45875 0 0 0
-418 1 -1.35125 9.45875 -9.45875 0 0 0
-419 1 -1.35125 6.75625 -6.75625 0 0 0
-420 1 -4.05375 9.45875 -6.75625 0 0 0
-421 1 1.35125 6.75625 -9.45875 0 0 0
-422 1 4.05375 9.45875 -9.45875 0 0 0
-423 1 4.05375 6.75625 -6.75625 0 0 0
-424 1 1.35125 9.45875 -6.75625 0 0 0
-425 1 6.75625 6.75625 -9.45875 0 0 0
-426 1 9.45875 9.45875 -9.45875 0 0 0
-427 1 9.45875 6.75625 -6.75625 0 0 0
-428 1 6.75625 9.45875 -6.75625 0 0 0
-429 1 12.1613 6.75625 -9.45875 0 0 0
-430 1 14.8638 9.45875 -9.45875 0 0 0
-431 1 14.8638 6.75625 -6.75625 0 0 0
-432 1 12.1613 9.45875 -6.75625 0 0 0
-433 1 17.5663 6.75625 -9.45875 0 0 0
-434 1 20.2688 9.45875 -9.45875 0 0 0
-435 1 20.2688 6.75625 -6.75625 0 0 0
-436 1 17.5663 9.45875 -6.75625 0 0 0
-437 1 22.9713 6.75625 -9.45875 0 0 0
-438 1 25.6738 9.45875 -9.45875 0 0 0
-439 1 25.6738 6.75625 -6.75625 0 0 0
-440 1 22.9713 9.45875 -6.75625 0 0 0
-441 1 -25.6738 12.1613 -9.45875 0 0 0
-442 1 -22.9713 14.8638 -9.45875 0 0 0
-443 1 -22.9713 12.1613 -6.75625 0 0 0
-444 1 -25.6738 14.8638 -6.75625 0 0 0
-445 1 -20.2688 12.1613 -9.45875 0 0 0
-446 1 -17.5663 14.8638 -9.45875 0 0 0
-447 1 -17.5663 12.1613 -6.75625 0 0 0
-448 1 -20.2688 14.8638 -6.75625 0 0 0
-449 1 -14.8638 12.1613 -9.45875 0 0 0
-450 1 -12.1613 14.8638 -9.45875 0 0 0
-451 1 -12.1613 12.1613 -6.75625 0 0 0
-452 1 -14.8638 14.8638 -6.75625 0 0 0
-453 1 -9.45875 12.1613 -9.45875 0 0 0
-454 1 -6.75625 14.8638 -9.45875 0 0 0
-455 1 -6.75625 12.1613 -6.75625 0 0 0
-456 1 -9.45875 14.8638 -6.75625 0 0 0
-457 1 -4.05375 12.1613 -9.45875 0 0 0
-458 1 -1.35125 14.8638 -9.45875 0 0 0
-459 1 -1.35125 12.1613 -6.75625 0 0 0
-460 1 -4.05375 14.8638 -6.75625 0 0 0
-461 1 1.35125 12.1613 -9.45875 0 0 0
-462 1 4.05375 14.8638 -9.45875 0 0 0
-463 1 4.05375 12.1613 -6.75625 0 0 0
-464 1 1.35125 14.8638 -6.75625 0 0 0
-465 1 6.75625 12.1613 -9.45875 0 0 0
-466 1 9.45875 14.8638 -9.45875 0 0 0
-467 1 9.45875 12.1613 -6.75625 0 0 0
-468 1 6.75625 14.8638 -6.75625 0 0 0
-469 1 12.1613 12.1613 -9.45875 0 0 0
-470 1 14.8638 14.8638 -9.45875 0 0 0
-471 1 14.8638 12.1613 -6.75625 0 0 0
-472 1 12.1613 14.8638 -6.75625 0 0 0
-473 1 17.5663 12.1613 -9.45875 0 0 0
-474 1 20.2688 14.8638 -9.45875 0 0 0
-475 1 20.2688 12.1613 -6.75625 0 0 0
-476 1 17.5663 14.8638 -6.75625 0 0 0
-477 1 22.9713 12.1613 -9.45875 0 0 0
-478 1 25.6738 14.8638 -9.45875 0 0 0
-479 1 25.6738 12.1613 -6.75625 0 0 0
-480 1 22.9713 14.8638 -6.75625 0 0 0
-481 1 -25.6738 -14.8638 -4.05375 0 0 0
-482 1 -22.9713 -12.1613 -4.05375 0 0 0
-483 1 -22.9713 -14.8638 -1.35125 0 0 0
-484 1 -25.6738 -12.1613 -1.35125 0 0 0
-485 1 -20.2688 -14.8638 -4.05375 0 0 0
-486 1 -17.5663 -12.1613 -4.05375 0 0 0
-487 1 -17.5663 -14.8638 -1.35125 0 0 0
-488 1 -20.2688 -12.1613 -1.35125 0 0 0
-489 1 -14.8638 -14.8638 -4.05375 0 0 0
-490 1 -12.1613 -12.1613 -4.05375 0 0 0
-491 1 -12.1613 -14.8638 -1.35125 0 0 0
-492 1 -14.8638 -12.1613 -1.35125 0 0 0
-493 1 -9.45875 -14.8638 -4.05375 0 0 0
-494 1 -6.75625 -12.1613 -4.05375 0 0 0
-495 1 -6.75625 -14.8638 -1.35125 0 0 0
-496 1 -9.45875 -12.1613 -1.35125 0 0 0
-497 1 -4.05375 -14.8638 -4.05375 0 0 0
-498 1 -1.35125 -12.1613 -4.05375 0 0 0
-499 1 -1.35125 -14.8638 -1.35125 0 0 0
-500 1 -4.05375 -12.1613 -1.35125 0 0 0
-501 1 1.35125 -14.8638 -4.05375 0 0 0
-502 1 4.05375 -12.1613 -4.05375 0 0 0
-503 1 4.05375 -14.8638 -1.35125 0 0 0
-504 1 1.35125 -12.1613 -1.35125 0 0 0
-505 1 6.75625 -14.8638 -4.05375 0 0 0
-506 1 9.45875 -12.1613 -4.05375 0 0 0
-507 1 9.45875 -14.8638 -1.35125 0 0 0
-508 1 6.75625 -12.1613 -1.35125 0 0 0
-509 1 12.1613 -14.8638 -4.05375 0 0 0
-510 1 14.8638 -12.1613 -4.05375 0 0 0
-511 1 14.8638 -14.8638 -1.35125 0 0 0
-512 1 12.1613 -12.1613 -1.35125 0 0 0
-513 1 17.5663 -14.8638 -4.05375 0 0 0
-514 1 20.2688 -12.1613 -4.05375 0 0 0
-515 1 20.2688 -14.8638 -1.35125 0 0 0
-516 1 17.5663 -12.1613 -1.35125 0 0 0
-517 1 22.9713 -14.8638 -4.05375 0 0 0
-518 1 25.6738 -12.1613 -4.05375 0 0 0
-519 1 25.6738 -14.8638 -1.35125 0 0 0
-520 1 22.9713 -12.1613 -1.35125 0 0 0
-521 1 -25.6738 -9.45875 -4.05375 0 0 0
-522 1 -22.9713 -6.75625 -4.05375 0 0 0
-523 1 -22.9713 -9.45875 -1.35125 0 0 0
-524 1 -25.6738 -6.75625 -1.35125 0 0 0
-525 1 -20.2688 -9.45875 -4.05375 0 0 0
-526 1 -17.5663 -6.75625 -4.05375 0 0 0
-527 1 -17.5663 -9.45875 -1.35125 0 0 0
-528 1 -20.2688 -6.75625 -1.35125 0 0 0
-529 1 -14.8638 -9.45875 -4.05375 0 0 0
-530 1 -12.1613 -6.75625 -4.05375 0 0 0
-531 1 -12.1613 -9.45875 -1.35125 0 0 0
-532 1 -14.8638 -6.75625 -1.35125 0 0 0
-533 1 -9.45875 -9.45875 -4.05375 0 0 0
-534 1 -6.75625 -6.75625 -4.05375 0 0 0
-535 1 -6.75625 -9.45875 -1.35125 0 0 0
-536 1 -9.45875 -6.75625 -1.35125 0 0 0
-537 1 -4.05375 -9.45875 -4.05375 0 0 0
-538 1 -1.35125 -6.75625 -4.05375 0 0 0
-539 1 -1.35125 -9.45875 -1.35125 0 0 0
-540 1 -4.05375 -6.75625 -1.35125 0 0 0
-541 1 1.35125 -9.45875 -4.05375 0 0 0
-542 1 4.05375 -6.75625 -4.05375 0 0 0
-543 1 4.05375 -9.45875 -1.35125 0 0 0
-544 1 1.35125 -6.75625 -1.35125 0 0 0
-545 1 6.75625 -9.45875 -4.05375 0 0 0
-546 1 9.45875 -6.75625 -4.05375 0 0 0
-547 1 9.45875 -9.45875 -1.35125 0 0 0
-548 1 6.75625 -6.75625 -1.35125 0 0 0
-549 1 12.1613 -9.45875 -4.05375 0 0 0
-550 1 14.8638 -6.75625 -4.05375 0 0 0
-551 1 14.8638 -9.45875 -1.35125 0 0 0
-552 1 12.1613 -6.75625 -1.35125 0 0 0
-553 1 17.5663 -9.45875 -4.05375 0 0 0
-554 1 20.2688 -6.75625 -4.05375 0 0 0
-555 1 20.2688 -9.45875 -1.35125 0 0 0
-556 1 17.5663 -6.75625 -1.35125 0 0 0
-557 1 22.9713 -9.45875 -4.05375 0 0 0
-558 1 25.6738 -6.75625 -4.05375 0 0 0
-559 1 25.6738 -9.45875 -1.35125 0 0 0
-560 1 22.9713 -6.75625 -1.35125 0 0 0
-561 1 -25.6738 -4.05375 -4.05375 0 0 0
-562 1 -22.9713 -1.35125 -4.05375 0 0 0
-563 1 -22.9713 -4.05375 -1.35125 0 0 0
-564 1 -25.6738 -1.35125 -1.35125 0 0 0
-565 1 -20.2688 -4.05375 -4.05375 0 0 0
-566 1 -17.5663 -1.35125 -4.05375 0 0 0
-567 1 -17.5663 -4.05375 -1.35125 0 0 0
-568 1 -20.2688 -1.35125 -1.35125 0 0 0
-569 1 -14.8638 -4.05375 -4.05375 0 0 0
-570 1 -12.1613 -1.35125 -4.05375 0 0 0
-571 1 -12.1613 -4.05375 -1.35125 0 0 0
-572 1 -14.8638 -1.35125 -1.35125 0 0 0
-573 1 -9.45875 -4.05375 -4.05375 0 0 0
-574 1 -6.75625 -1.35125 -4.05375 0 0 0
-575 1 -6.75625 -4.05375 -1.35125 0 0 0
-576 1 -9.45875 -1.35125 -1.35125 0 0 0
-577 1 -4.05375 -4.05375 -4.05375 0 0 0
-578 1 -1.35125 -1.35125 -4.05375 0 0 0
-579 1 -1.35125 -4.05375 -1.35125 0 0 0
-580 1 -4.05375 -1.35125 -1.35125 0 0 0
-581 1 1.35125 -4.05375 -4.05375 0 0 0
-582 1 4.05375 -1.35125 -4.05375 0 0 0
-583 1 4.05375 -4.05375 -1.35125 0 0 0
-584 1 1.35125 -1.35125 -1.35125 0 0 0
-585 1 6.75625 -4.05375 -4.05375 0 0 0
-586 1 9.45875 -1.35125 -4.05375 0 0 0
-587 1 9.45875 -4.05375 -1.35125 0 0 0
-588 1 6.75625 -1.35125 -1.35125 0 0 0
-589 1 12.1613 -4.05375 -4.05375 0 0 0
-590 1 14.8638 -1.35125 -4.05375 0 0 0
-591 1 14.8638 -4.05375 -1.35125 0 0 0
-592 1 12.1613 -1.35125 -1.35125 0 0 0
-593 1 17.5663 -4.05375 -4.05375 0 0 0
-594 1 20.2688 -1.35125 -4.05375 0 0 0
-595 1 20.2688 -4.05375 -1.35125 0 0 0
-596 1 17.5663 -1.35125 -1.35125 0 0 0
-597 1 22.9713 -4.05375 -4.05375 0 0 0
-598 1 25.6738 -1.35125 -4.05375 0 0 0
-599 1 25.6738 -4.05375 -1.35125 0 0 0
-600 1 22.9713 -1.35125 -1.35125 0 0 0
-601 1 -25.6738 1.35125 -4.05375 0 0 0
-602 1 -22.9713 4.05375 -4.05375 0 0 0
-603 1 -22.9713 1.35125 -1.35125 0 0 0
-604 1 -25.6738 4.05375 -1.35125 0 0 0
-605 1 -20.2688 1.35125 -4.05375 0 0 0
-606 1 -17.5663 4.05375 -4.05375 0 0 0
-607 1 -17.5663 1.35125 -1.35125 0 0 0
-608 1 -20.2688 4.05375 -1.35125 0 0 0
-609 1 -14.8638 1.35125 -4.05375 0 0 0
-610 1 -12.1613 4.05375 -4.05375 0 0 0
-611 1 -12.1613 1.35125 -1.35125 0 0 0
-612 1 -14.8638 4.05375 -1.35125 0 0 0
-613 1 -9.45875 1.35125 -4.05375 0 0 0
-614 1 -6.75625 4.05375 -4.05375 0 0 0
-615 1 -6.75625 1.35125 -1.35125 0 0 0
-616 1 -9.45875 4.05375 -1.35125 0 0 0
-617 1 -4.05375 1.35125 -4.05375 0 0 0
-618 1 -1.35125 4.05375 -4.05375 0 0 0
-619 1 -1.35125 1.35125 -1.35125 0 0 0
-620 1 -4.05375 4.05375 -1.35125 0 0 0
-621 1 1.35125 1.35125 -4.05375 0 0 0
-622 1 4.05375 4.05375 -4.05375 0 0 0
-623 1 4.05375 1.35125 -1.35125 0 0 0
-624 1 1.35125 4.05375 -1.35125 0 0 0
-625 1 6.75625 1.35125 -4.05375 0 0 0
-626 1 9.45875 4.05375 -4.05375 0 0 0
-627 1 9.45875 1.35125 -1.35125 0 0 0
-628 1 6.75625 4.05375 -1.35125 0 0 0
-629 1 12.1613 1.35125 -4.05375 0 0 0
-630 1 14.8638 4.05375 -4.05375 0 0 0
-631 1 14.8638 1.35125 -1.35125 0 0 0
-632 1 12.1613 4.05375 -1.35125 0 0 0
-633 1 17.5663 1.35125 -4.05375 0 0 0
-634 1 20.2688 4.05375 -4.05375 0 0 0
-635 1 20.2688 1.35125 -1.35125 0 0 0
-636 1 17.5663 4.05375 -1.35125 0 0 0
-637 1 22.9713 1.35125 -4.05375 0 0 0
-638 1 25.6738 4.05375 -4.05375 0 0 0
-639 1 25.6738 1.35125 -1.35125 0 0 0
-640 1 22.9713 4.05375 -1.35125 0 0 0
-641 1 -25.6738 6.75625 -4.05375 0 0 0
-642 1 -22.9713 9.45875 -4.05375 0 0 0
-643 1 -22.9713 6.75625 -1.35125 0 0 0
-644 1 -25.6738 9.45875 -1.35125 0 0 0
-645 1 -20.2688 6.75625 -4.05375 0 0 0
-646 1 -17.5663 9.45875 -4.05375 0 0 0
-647 1 -17.5663 6.75625 -1.35125 0 0 0
-648 1 -20.2688 9.45875 -1.35125 0 0 0
-649 1 -14.8638 6.75625 -4.05375 0 0 0
-650 1 -12.1613 9.45875 -4.05375 0 0 0
-651 1 -12.1613 6.75625 -1.35125 0 0 0
-652 1 -14.8638 9.45875 -1.35125 0 0 0
-653 1 -9.45875 6.75625 -4.05375 0 0 0
-654 1 -6.75625 9.45875 -4.05375 0 0 0
-655 1 -6.75625 6.75625 -1.35125 0 0 0
-656 1 -9.45875 9.45875 -1.35125 0 0 0
-657 1 -4.05375 6.75625 -4.05375 0 0 0
-658 1 -1.35125 9.45875 -4.05375 0 0 0
-659 1 -1.35125 6.75625 -1.35125 0 0 0
-660 1 -4.05375 9.45875 -1.35125 0 0 0
-661 1 1.35125 6.75625 -4.05375 0 0 0
-662 1 4.05375 9.45875 -4.05375 0 0 0
-663 1 4.05375 6.75625 -1.35125 0 0 0
-664 1 1.35125 9.45875 -1.35125 0 0 0
-665 1 6.75625 6.75625 -4.05375 0 0 0
-666 1 9.45875 9.45875 -4.05375 0 0 0
-667 1 9.45875 6.75625 -1.35125 0 0 0
-668 1 6.75625 9.45875 -1.35125 0 0 0
-669 1 12.1613 6.75625 -4.05375 0 0 0
-670 1 14.8638 9.45875 -4.05375 0 0 0
-671 1 14.8638 6.75625 -1.35125 0 0 0
-672 1 12.1613 9.45875 -1.35125 0 0 0
-673 1 17.5663 6.75625 -4.05375 0 0 0
-674 1 20.2688 9.45875 -4.05375 0 0 0
-675 1 20.2688 6.75625 -1.35125 0 0 0
-676 1 17.5663 9.45875 -1.35125 0 0 0
-677 1 22.9713 6.75625 -4.05375 0 0 0
-678 1 25.6738 9.45875 -4.05375 0 0 0
-679 1 25.6738 6.75625 -1.35125 0 0 0
-680 1 22.9713 9.45875 -1.35125 0 0 0
-681 1 -25.6738 12.1613 -4.05375 0 0 0
-682 1 -22.9713 14.8638 -4.05375 0 0 0
-683 1 -22.9713 12.1613 -1.35125 0 0 0
-684 1 -25.6738 14.8638 -1.35125 0 0 0
-685 1 -20.2688 12.1613 -4.05375 0 0 0
-686 1 -17.5663 14.8638 -4.05375 0 0 0
-687 1 -17.5663 12.1613 -1.35125 0 0 0
-688 1 -20.2688 14.8638 -1.35125 0 0 0
-689 1 -14.8638 12.1613 -4.05375 0 0 0
-690 1 -12.1613 14.8638 -4.05375 0 0 0
-691 1 -12.1613 12.1613 -1.35125 0 0 0
-692 1 -14.8638 14.8638 -1.35125 0 0 0
-693 1 -9.45875 12.1613 -4.05375 0 0 0
-694 1 -6.75625 14.8638 -4.05375 0 0 0
-695 1 -6.75625 12.1613 -1.35125 0 0 0
-696 1 -9.45875 14.8638 -1.35125 0 0 0
-697 1 -4.05375 12.1613 -4.05375 0 0 0
-698 1 -1.35125 14.8638 -4.05375 0 0 0
-699 1 -1.35125 12.1613 -1.35125 0 0 0
-700 1 -4.05375 14.8638 -1.35125 0 0 0
-701 1 1.35125 12.1613 -4.05375 0 0 0
-702 1 4.05375 14.8638 -4.05375 0 0 0
-703 1 4.05375 12.1613 -1.35125 0 0 0
-704 1 1.35125 14.8638 -1.35125 0 0 0
-705 1 6.75625 12.1613 -4.05375 0 0 0
-706 1 9.45875 14.8638 -4.05375 0 0 0
-707 1 9.45875 12.1613 -1.35125 0 0 0
-708 1 6.75625 14.8638 -1.35125 0 0 0
-709 1 12.1613 12.1613 -4.05375 0 0 0
-710 1 14.8638 14.8638 -4.05375 0 0 0
-711 1 14.8638 12.1613 -1.35125 0 0 0
-712 1 12.1613 14.8638 -1.35125 0 0 0
-713 1 17.5663 12.1613 -4.05375 0 0 0
-714 1 20.2688 14.8638 -4.05375 0 0 0
-715 1 20.2688 12.1613 -1.35125 0 0 0
-716 1 17.5663 14.8638 -1.35125 0 0 0
-717 1 22.9713 12.1613 -4.05375 0 0 0
-718 1 25.6738 14.8638 -4.05375 0 0 0
-719 1 25.6738 12.1613 -1.35125 0 0 0
-720 1 22.9713 14.8638 -1.35125 0 0 0
-721 1 -25.6738 -14.8638 1.35125 0 0 0
-722 1 -22.9713 -12.1613 1.35125 0 0 0
-723 1 -22.9713 -14.8638 4.05375 0 0 0
-724 1 -25.6738 -12.1613 4.05375 0 0 0
-725 1 -20.2688 -14.8638 1.35125 0 0 0
-726 1 -17.5663 -12.1613 1.35125 0 0 0
-727 1 -17.5663 -14.8638 4.05375 0 0 0
-728 1 -20.2688 -12.1613 4.05375 0 0 0
-729 1 -14.8638 -14.8638 1.35125 0 0 0
-730 1 -12.1613 -12.1613 1.35125 0 0 0
-731 1 -12.1613 -14.8638 4.05375 0 0 0
-732 1 -14.8638 -12.1613 4.05375 0 0 0
-733 1 -9.45875 -14.8638 1.35125 0 0 0
-734 1 -6.75625 -12.1613 1.35125 0 0 0
-735 1 -6.75625 -14.8638 4.05375 0 0 0
-736 1 -9.45875 -12.1613 4.05375 0 0 0
-737 1 -4.05375 -14.8638 1.35125 0 0 0
-738 1 -1.35125 -12.1613 1.35125 0 0 0
-739 1 -1.35125 -14.8638 4.05375 0 0 0
-740 1 -4.05375 -12.1613 4.05375 0 0 0
-741 1 1.35125 -14.8638 1.35125 0 0 0
-742 1 4.05375 -12.1613 1.35125 0 0 0
-743 1 4.05375 -14.8638 4.05375 0 0 0
-744 1 1.35125 -12.1613 4.05375 0 0 0
-745 1 6.75625 -14.8638 1.35125 0 0 0
-746 1 9.45875 -12.1613 1.35125 0 0 0
-747 1 9.45875 -14.8638 4.05375 0 0 0
-748 1 6.75625 -12.1613 4.05375 0 0 0
-749 1 12.1613 -14.8638 1.35125 0 0 0
-750 1 14.8638 -12.1613 1.35125 0 0 0
-751 1 14.8638 -14.8638 4.05375 0 0 0
-752 1 12.1613 -12.1613 4.05375 0 0 0
-753 1 17.5663 -14.8638 1.35125 0 0 0
-754 1 20.2688 -12.1613 1.35125 0 0 0
-755 1 20.2688 -14.8638 4.05375 0 0 0
-756 1 17.5663 -12.1613 4.05375 0 0 0
-757 1 22.9713 -14.8638 1.35125 0 0 0
-758 1 25.6738 -12.1613 1.35125 0 0 0
-759 1 25.6738 -14.8638 4.05375 0 0 0
-760 1 22.9713 -12.1613 4.05375 0 0 0
-761 1 -25.6738 -9.45875 1.35125 0 0 0
-762 1 -22.9713 -6.75625 1.35125 0 0 0
-763 1 -22.9713 -9.45875 4.05375 0 0 0
-764 1 -25.6738 -6.75625 4.05375 0 0 0
-765 1 -20.2688 -9.45875 1.35125 0 0 0
-766 1 -17.5663 -6.75625 1.35125 0 0 0
-767 1 -17.5663 -9.45875 4.05375 0 0 0
-768 1 -20.2688 -6.75625 4.05375 0 0 0
-769 1 -14.8638 -9.45875 1.35125 0 0 0
-770 1 -12.1613 -6.75625 1.35125 0 0 0
-771 1 -12.1613 -9.45875 4.05375 0 0 0
-772 1 -14.8638 -6.75625 4.05375 0 0 0
-773 1 -9.45875 -9.45875 1.35125 0 0 0
-774 1 -6.75625 -6.75625 1.35125 0 0 0
-775 1 -6.75625 -9.45875 4.05375 0 0 0
-776 1 -9.45875 -6.75625 4.05375 0 0 0
-777 1 -4.05375 -9.45875 1.35125 0 0 0
-778 1 -1.35125 -6.75625 1.35125 0 0 0
-779 1 -1.35125 -9.45875 4.05375 0 0 0
-780 1 -4.05375 -6.75625 4.05375 0 0 0
-781 1 1.35125 -9.45875 1.35125 0 0 0
-782 1 4.05375 -6.75625 1.35125 0 0 0
-783 1 4.05375 -9.45875 4.05375 0 0 0
-784 1 1.35125 -6.75625 4.05375 0 0 0
-785 1 6.75625 -9.45875 1.35125 0 0 0
-786 1 9.45875 -6.75625 1.35125 0 0 0
-787 1 9.45875 -9.45875 4.05375 0 0 0
-788 1 6.75625 -6.75625 4.05375 0 0 0
-789 1 12.1613 -9.45875 1.35125 0 0 0
-790 1 14.8638 -6.75625 1.35125 0 0 0
-791 1 14.8638 -9.45875 4.05375 0 0 0
-792 1 12.1613 -6.75625 4.05375 0 0 0
-793 1 17.5663 -9.45875 1.35125 0 0 0
-794 1 20.2688 -6.75625 1.35125 0 0 0
-795 1 20.2688 -9.45875 4.05375 0 0 0
-796 1 17.5663 -6.75625 4.05375 0 0 0
-797 1 22.9713 -9.45875 1.35125 0 0 0
-798 1 25.6738 -6.75625 1.35125 0 0 0
-799 1 25.6738 -9.45875 4.05375 0 0 0
-800 1 22.9713 -6.75625 4.05375 0 0 0
-801 1 -25.6738 -4.05375 1.35125 0 0 0
-802 1 -22.9713 -1.35125 1.35125 0 0 0
-803 1 -22.9713 -4.05375 4.05375 0 0 0
-804 1 -25.6738 -1.35125 4.05375 0 0 0
-805 1 -20.2688 -4.05375 1.35125 0 0 0
-806 1 -17.5663 -1.35125 1.35125 0 0 0
-807 1 -17.5663 -4.05375 4.05375 0 0 0
-808 1 -20.2688 -1.35125 4.05375 0 0 0
-809 1 -14.8638 -4.05375 1.35125 0 0 0
-810 1 -12.1613 -1.35125 1.35125 0 0 0
-811 1 -12.1613 -4.05375 4.05375 0 0 0
-812 1 -14.8638 -1.35125 4.05375 0 0 0
-813 1 -9.45875 -4.05375 1.35125 0 0 0
-814 1 -6.75625 -1.35125 1.35125 0 0 0
-815 1 -6.75625 -4.05375 4.05375 0 0 0
-816 1 -9.45875 -1.35125 4.05375 0 0 0
-817 1 -4.05375 -4.05375 1.35125 0 0 0
-818 1 -1.35125 -1.35125 1.35125 0 0 0
-819 1 -1.35125 -4.05375 4.05375 0 0 0
-820 1 -4.05375 -1.35125 4.05375 0 0 0
-821 1 1.35125 -4.05375 1.35125 0 0 0
-822 1 4.05375 -1.35125 1.35125 0 0 0
-823 1 4.05375 -4.05375 4.05375 0 0 0
-824 1 1.35125 -1.35125 4.05375 0 0 0
-825 1 6.75625 -4.05375 1.35125 0 0 0
-826 1 9.45875 -1.35125 1.35125 0 0 0
-827 1 9.45875 -4.05375 4.05375 0 0 0
-828 1 6.75625 -1.35125 4.05375 0 0 0
-829 1 12.1613 -4.05375 1.35125 0 0 0
-830 1 14.8638 -1.35125 1.35125 0 0 0
-831 1 14.8638 -4.05375 4.05375 0 0 0
-832 1 12.1613 -1.35125 4.05375 0 0 0
-833 1 17.5663 -4.05375 1.35125 0 0 0
-834 1 20.2688 -1.35125 1.35125 0 0 0
-835 1 20.2688 -4.05375 4.05375 0 0 0
-836 1 17.5663 -1.35125 4.05375 0 0 0
-837 1 22.9713 -4.05375 1.35125 0 0 0
-838 1 25.6738 -1.35125 1.35125 0 0 0
-839 1 25.6738 -4.05375 4.05375 0 0 0
-840 1 22.9713 -1.35125 4.05375 0 0 0
-841 1 -25.6738 1.35125 1.35125 0 0 0
-842 1 -22.9713 4.05375 1.35125 0 0 0
-843 1 -22.9713 1.35125 4.05375 0 0 0
-844 1 -25.6738 4.05375 4.05375 0 0 0
-845 1 -20.2688 1.35125 1.35125 0 0 0
-846 1 -17.5663 4.05375 1.35125 0 0 0
-847 1 -17.5663 1.35125 4.05375 0 0 0
-848 1 -20.2688 4.05375 4.05375 0 0 0
-849 1 -14.8638 1.35125 1.35125 0 0 0
-850 1 -12.1613 4.05375 1.35125 0 0 0
-851 1 -12.1613 1.35125 4.05375 0 0 0
-852 1 -14.8638 4.05375 4.05375 0 0 0
-853 1 -9.45875 1.35125 1.35125 0 0 0
-854 1 -6.75625 4.05375 1.35125 0 0 0
-855 1 -6.75625 1.35125 4.05375 0 0 0
-856 1 -9.45875 4.05375 4.05375 0 0 0
-857 1 -4.05375 1.35125 1.35125 0 0 0
-858 1 -1.35125 4.05375 1.35125 0 0 0
-859 1 -1.35125 1.35125 4.05375 0 0 0
-860 1 -4.05375 4.05375 4.05375 0 0 0
-861 1 1.35125 1.35125 1.35125 0 0 0
-862 1 4.05375 4.05375 1.35125 0 0 0
-863 1 4.05375 1.35125 4.05375 0 0 0
-864 1 1.35125 4.05375 4.05375 0 0 0
-865 1 6.75625 1.35125 1.35125 0 0 0
-866 1 9.45875 4.05375 1.35125 0 0 0
-867 1 9.45875 1.35125 4.05375 0 0 0
-868 1 6.75625 4.05375 4.05375 0 0 0
-869 1 12.1613 1.35125 1.35125 0 0 0
-870 1 14.8638 4.05375 1.35125 0 0 0
-871 1 14.8638 1.35125 4.05375 0 0 0
-872 1 12.1613 4.05375 4.05375 0 0 0
-873 1 17.5663 1.35125 1.35125 0 0 0
-874 1 20.2688 4.05375 1.35125 0 0 0
-875 1 20.2688 1.35125 4.05375 0 0 0
-876 1 17.5663 4.05375 4.05375 0 0 0
-877 1 22.9713 1.35125 1.35125 0 0 0
-878 1 25.6738 4.05375 1.35125 0 0 0
-879 1 25.6738 1.35125 4.05375 0 0 0
-880 1 22.9713 4.05375 4.05375 0 0 0
-881 1 -25.6738 6.75625 1.35125 0 0 0
-882 1 -22.9713 9.45875 1.35125 0 0 0
-883 1 -22.9713 6.75625 4.05375 0 0 0
-884 1 -25.6738 9.45875 4.05375 0 0 0
-885 1 -20.2688 6.75625 1.35125 0 0 0
-886 1 -17.5663 9.45875 1.35125 0 0 0
-887 1 -17.5663 6.75625 4.05375 0 0 0
-888 1 -20.2688 9.45875 4.05375 0 0 0
-889 1 -14.8638 6.75625 1.35125 0 0 0
-890 1 -12.1613 9.45875 1.35125 0 0 0
-891 1 -12.1613 6.75625 4.05375 0 0 0
-892 1 -14.8638 9.45875 4.05375 0 0 0
-893 1 -9.45875 6.75625 1.35125 0 0 0
-894 1 -6.75625 9.45875 1.35125 0 0 0
-895 1 -6.75625 6.75625 4.05375 0 0 0
-896 1 -9.45875 9.45875 4.05375 0 0 0
-897 1 -4.05375 6.75625 1.35125 0 0 0
-898 1 -1.35125 9.45875 1.35125 0 0 0
-899 1 -1.35125 6.75625 4.05375 0 0 0
-900 1 -4.05375 9.45875 4.05375 0 0 0
-901 1 1.35125 6.75625 1.35125 0 0 0
-902 1 4.05375 9.45875 1.35125 0 0 0
-903 1 4.05375 6.75625 4.05375 0 0 0
-904 1 1.35125 9.45875 4.05375 0 0 0
-905 1 6.75625 6.75625 1.35125 0 0 0
-906 1 9.45875 9.45875 1.35125 0 0 0
-907 1 9.45875 6.75625 4.05375 0 0 0
-908 1 6.75625 9.45875 4.05375 0 0 0
-909 1 12.1613 6.75625 1.35125 0 0 0
-910 1 14.8638 9.45875 1.35125 0 0 0
-911 1 14.8638 6.75625 4.05375 0 0 0
-912 1 12.1613 9.45875 4.05375 0 0 0
-913 1 17.5663 6.75625 1.35125 0 0 0
-914 1 20.2688 9.45875 1.35125 0 0 0
-915 1 20.2688 6.75625 4.05375 0 0 0
-916 1 17.5663 9.45875 4.05375 0 0 0
-917 1 22.9713 6.75625 1.35125 0 0 0
-918 1 25.6738 9.45875 1.35125 0 0 0
-919 1 25.6738 6.75625 4.05375 0 0 0
-920 1 22.9713 9.45875 4.05375 0 0 0
-921 1 -25.6738 12.1613 1.35125 0 0 0
-922 1 -22.9713 14.8638 1.35125 0 0 0
-923 1 -22.9713 12.1613 4.05375 0 0 0
-924 1 -25.6738 14.8638 4.05375 0 0 0
-925 1 -20.2688 12.1613 1.35125 0 0 0
-926 1 -17.5663 14.8638 1.35125 0 0 0
-927 1 -17.5663 12.1613 4.05375 0 0 0
-928 1 -20.2688 14.8638 4.05375 0 0 0
-929 1 -14.8638 12.1613 1.35125 0 0 0
-930 1 -12.1613 14.8638 1.35125 0 0 0
-931 1 -12.1613 12.1613 4.05375 0 0 0
-932 1 -14.8638 14.8638 4.05375 0 0 0
-933 1 -9.45875 12.1613 1.35125 0 0 0
-934 1 -6.75625 14.8638 1.35125 0 0 0
-935 1 -6.75625 12.1613 4.05375 0 0 0
-936 1 -9.45875 14.8638 4.05375 0 0 0
-937 1 -4.05375 12.1613 1.35125 0 0 0
-938 1 -1.35125 14.8638 1.35125 0 0 0
-939 1 -1.35125 12.1613 4.05375 0 0 0
-940 1 -4.05375 14.8638 4.05375 0 0 0
-941 1 1.35125 12.1613 1.35125 0 0 0
-942 1 4.05375 14.8638 1.35125 0 0 0
-943 1 4.05375 12.1613 4.05375 0 0 0
-944 1 1.35125 14.8638 4.05375 0 0 0
-945 1 6.75625 12.1613 1.35125 0 0 0
-946 1 9.45875 14.8638 1.35125 0 0 0
-947 1 9.45875 12.1613 4.05375 0 0 0
-948 1 6.75625 14.8638 4.05375 0 0 0
-949 1 12.1613 12.1613 1.35125 0 0 0
-950 1 14.8638 14.8638 1.35125 0 0 0
-951 1 14.8638 12.1613 4.05375 0 0 0
-952 1 12.1613 14.8638 4.05375 0 0 0
-953 1 17.5663 12.1613 1.35125 0 0 0
-954 1 20.2688 14.8638 1.35125 0 0 0
-955 1 20.2688 12.1613 4.05375 0 0 0
-956 1 17.5663 14.8638 4.05375 0 0 0
-957 1 22.9713 12.1613 1.35125 0 0 0
-958 1 25.6738 14.8638 1.35125 0 0 0
-959 1 25.6738 12.1613 4.05375 0 0 0
-960 1 22.9713 14.8638 4.05375 0 0 0
-961 1 -25.6738 -14.8638 6.75625 0 0 0
-962 1 -22.9713 -12.1613 6.75625 0 0 0
-963 1 -22.9713 -14.8638 9.45875 0 0 0
-964 1 -25.6738 -12.1613 9.45875 0 0 0
-965 1 -20.2688 -14.8638 6.75625 0 0 0
-966 1 -17.5663 -12.1613 6.75625 0 0 0
-967 1 -17.5663 -14.8638 9.45875 0 0 0
-968 1 -20.2688 -12.1613 9.45875 0 0 0
-969 1 -14.8638 -14.8638 6.75625 0 0 0
-970 1 -12.1613 -12.1613 6.75625 0 0 0
-971 1 -12.1613 -14.8638 9.45875 0 0 0
-972 1 -14.8638 -12.1613 9.45875 0 0 0
-973 1 -9.45875 -14.8638 6.75625 0 0 0
-974 1 -6.75625 -12.1613 6.75625 0 0 0
-975 1 -6.75625 -14.8638 9.45875 0 0 0
-976 1 -9.45875 -12.1613 9.45875 0 0 0
-977 1 -4.05375 -14.8638 6.75625 0 0 0
-978 1 -1.35125 -12.1613 6.75625 0 0 0
-979 1 -1.35125 -14.8638 9.45875 0 0 0
-980 1 -4.05375 -12.1613 9.45875 0 0 0
-981 1 1.35125 -14.8638 6.75625 0 0 0
-982 1 4.05375 -12.1613 6.75625 0 0 0
-983 1 4.05375 -14.8638 9.45875 0 0 0
-984 1 1.35125 -12.1613 9.45875 0 0 0
-985 1 6.75625 -14.8638 6.75625 0 0 0
-986 1 9.45875 -12.1613 6.75625 0 0 0
-987 1 9.45875 -14.8638 9.45875 0 0 0
-988 1 6.75625 -12.1613 9.45875 0 0 0
-989 1 12.1613 -14.8638 6.75625 0 0 0
-990 1 14.8638 -12.1613 6.75625 0 0 0
-991 1 14.8638 -14.8638 9.45875 0 0 0
-992 1 12.1613 -12.1613 9.45875 0 0 0
-993 1 17.5663 -14.8638 6.75625 0 0 0
-994 1 20.2688 -12.1613 6.75625 0 0 0
-995 1 20.2688 -14.8638 9.45875 0 0 0
-996 1 17.5663 -12.1613 9.45875 0 0 0
-997 1 22.9713 -14.8638 6.75625 0 0 0
-998 1 25.6738 -12.1613 6.75625 0 0 0
-999 1 25.6738 -14.8638 9.45875 0 0 0
-1000 1 22.9713 -12.1613 9.45875 0 0 0
-1001 1 -25.6738 -9.45875 6.75625 0 0 0
-1002 1 -22.9713 -6.75625 6.75625 0 0 0
-1003 1 -22.9713 -9.45875 9.45875 0 0 0
-1004 1 -25.6738 -6.75625 9.45875 0 0 0
-1005 1 -20.2688 -9.45875 6.75625 0 0 0
-1006 1 -17.5663 -6.75625 6.75625 0 0 0
-1007 1 -17.5663 -9.45875 9.45875 0 0 0
-1008 1 -20.2688 -6.75625 9.45875 0 0 0
-1009 1 -14.8638 -9.45875 6.75625 0 0 0
-1010 1 -12.1613 -6.75625 6.75625 0 0 0
-1011 1 -12.1613 -9.45875 9.45875 0 0 0
-1012 1 -14.8638 -6.75625 9.45875 0 0 0
-1013 1 -9.45875 -9.45875 6.75625 0 0 0
-1014 1 -6.75625 -6.75625 6.75625 0 0 0
-1015 1 -6.75625 -9.45875 9.45875 0 0 0
-1016 1 -9.45875 -6.75625 9.45875 0 0 0
-1017 1 -4.05375 -9.45875 6.75625 0 0 0
-1018 1 -1.35125 -6.75625 6.75625 0 0 0
-1019 1 -1.35125 -9.45875 9.45875 0 0 0
-1020 1 -4.05375 -6.75625 9.45875 0 0 0
-1021 1 1.35125 -9.45875 6.75625 0 0 0
-1022 1 4.05375 -6.75625 6.75625 0 0 0
-1023 1 4.05375 -9.45875 9.45875 0 0 0
-1024 1 1.35125 -6.75625 9.45875 0 0 0
-1025 1 6.75625 -9.45875 6.75625 0 0 0
-1026 1 9.45875 -6.75625 6.75625 0 0 0
-1027 1 9.45875 -9.45875 9.45875 0 0 0
-1028 1 6.75625 -6.75625 9.45875 0 0 0
-1029 1 12.1613 -9.45875 6.75625 0 0 0
-1030 1 14.8638 -6.75625 6.75625 0 0 0
-1031 1 14.8638 -9.45875 9.45875 0 0 0
-1032 1 12.1613 -6.75625 9.45875 0 0 0
-1033 1 17.5663 -9.45875 6.75625 0 0 0
-1034 1 20.2688 -6.75625 6.75625 0 0 0
-1035 1 20.2688 -9.45875 9.45875 0 0 0
-1036 1 17.5663 -6.75625 9.45875 0 0 0
-1037 1 22.9713 -9.45875 6.75625 0 0 0
-1038 1 25.6738 -6.75625 6.75625 0 0 0
-1039 1 25.6738 -9.45875 9.45875 0 0 0
-1040 1 22.9713 -6.75625 9.45875 0 0 0
-1041 1 -25.6738 -4.05375 6.75625 0 0 0
-1042 1 -22.9713 -1.35125 6.75625 0 0 0
-1043 1 -22.9713 -4.05375 9.45875 0 0 0
-1044 1 -25.6738 -1.35125 9.45875 0 0 0
-1045 1 -20.2688 -4.05375 6.75625 0 0 0
-1046 1 -17.5663 -1.35125 6.75625 0 0 0
-1047 1 -17.5663 -4.05375 9.45875 0 0 0
-1048 1 -20.2688 -1.35125 9.45875 0 0 0
-1049 1 -14.8638 -4.05375 6.75625 0 0 0
-1050 1 -12.1613 -1.35125 6.75625 0 0 0
-1051 1 -12.1613 -4.05375 9.45875 0 0 0
-1052 1 -14.8638 -1.35125 9.45875 0 0 0
-1053 1 -9.45875 -4.05375 6.75625 0 0 0
-1054 1 -6.75625 -1.35125 6.75625 0 0 0
-1055 1 -6.75625 -4.05375 9.45875 0 0 0
-1056 1 -9.45875 -1.35125 9.45875 0 0 0
-1057 1 -4.05375 -4.05375 6.75625 0 0 0
-1058 1 -1.35125 -1.35125 6.75625 0 0 0
-1059 1 -1.35125 -4.05375 9.45875 0 0 0
-1060 1 -4.05375 -1.35125 9.45875 0 0 0
-1061 1 1.35125 -4.05375 6.75625 0 0 0
-1062 1 4.05375 -1.35125 6.75625 0 0 0
-1063 1 4.05375 -4.05375 9.45875 0 0 0
-1064 1 1.35125 -1.35125 9.45875 0 0 0
-1065 1 6.75625 -4.05375 6.75625 0 0 0
-1066 1 9.45875 -1.35125 6.75625 0 0 0
-1067 1 9.45875 -4.05375 9.45875 0 0 0
-1068 1 6.75625 -1.35125 9.45875 0 0 0
-1069 1 12.1613 -4.05375 6.75625 0 0 0
-1070 1 14.8638 -1.35125 6.75625 0 0 0
-1071 1 14.8638 -4.05375 9.45875 0 0 0
-1072 1 12.1613 -1.35125 9.45875 0 0 0
-1073 1 17.5663 -4.05375 6.75625 0 0 0
-1074 1 20.2688 -1.35125 6.75625 0 0 0
-1075 1 20.2688 -4.05375 9.45875 0 0 0
-1076 1 17.5663 -1.35125 9.45875 0 0 0
-1077 1 22.9713 -4.05375 6.75625 0 0 0
-1078 1 25.6738 -1.35125 6.75625 0 0 0
-1079 1 25.6738 -4.05375 9.45875 0 0 0
-1080 1 22.9713 -1.35125 9.45875 0 0 0
-1081 1 -25.6738 1.35125 6.75625 0 0 0
-1082 1 -22.9713 4.05375 6.75625 0 0 0
-1083 1 -22.9713 1.35125 9.45875 0 0 0
-1084 1 -25.6738 4.05375 9.45875 0 0 0
-1085 1 -20.2688 1.35125 6.75625 0 0 0
-1086 1 -17.5663 4.05375 6.75625 0 0 0
-1087 1 -17.5663 1.35125 9.45875 0 0 0
-1088 1 -20.2688 4.05375 9.45875 0 0 0
-1089 1 -14.8638 1.35125 6.75625 0 0 0
-1090 1 -12.1613 4.05375 6.75625 0 0 0
-1091 1 -12.1613 1.35125 9.45875 0 0 0
-1092 1 -14.8638 4.05375 9.45875 0 0 0
-1093 1 -9.45875 1.35125 6.75625 0 0 0
-1094 1 -6.75625 4.05375 6.75625 0 0 0
-1095 1 -6.75625 1.35125 9.45875 0 0 0
-1096 1 -9.45875 4.05375 9.45875 0 0 0
-1097 1 -4.05375 1.35125 6.75625 0 0 0
-1098 1 -1.35125 4.05375 6.75625 0 0 0
-1099 1 -1.35125 1.35125 9.45875 0 0 0
-1100 1 -4.05375 4.05375 9.45875 0 0 0
-1101 1 1.35125 1.35125 6.75625 0 0 0
-1102 1 4.05375 4.05375 6.75625 0 0 0
-1103 1 4.05375 1.35125 9.45875 0 0 0
-1104 1 1.35125 4.05375 9.45875 0 0 0
-1105 1 6.75625 1.35125 6.75625 0 0 0
-1106 1 9.45875 4.05375 6.75625 0 0 0
-1107 1 9.45875 1.35125 9.45875 0 0 0
-1108 1 6.75625 4.05375 9.45875 0 0 0
-1109 1 12.1613 1.35125 6.75625 0 0 0
-1110 1 14.8638 4.05375 6.75625 0 0 0
-1111 1 14.8638 1.35125 9.45875 0 0 0
-1112 1 12.1613 4.05375 9.45875 0 0 0
-1113 1 17.5663 1.35125 6.75625 0 0 0
-1114 1 20.2688 4.05375 6.75625 0 0 0
-1115 1 20.2688 1.35125 9.45875 0 0 0
-1116 1 17.5663 4.05375 9.45875 0 0 0
-1117 1 22.9713 1.35125 6.75625 0 0 0
-1118 1 25.6738 4.05375 6.75625 0 0 0
-1119 1 25.6738 1.35125 9.45875 0 0 0
-1120 1 22.9713 4.05375 9.45875 0 0 0
-1121 1 -25.6738 6.75625 6.75625 0 0 0
-1122 1 -22.9713 9.45875 6.75625 0 0 0
-1123 1 -22.9713 6.75625 9.45875 0 0 0
-1124 1 -25.6738 9.45875 9.45875 0 0 0
-1125 1 -20.2688 6.75625 6.75625 0 0 0
-1126 1 -17.5663 9.45875 6.75625 0 0 0
-1127 1 -17.5663 6.75625 9.45875 0 0 0
-1128 1 -20.2688 9.45875 9.45875 0 0 0
-1129 1 -14.8638 6.75625 6.75625 0 0 0
-1130 1 -12.1613 9.45875 6.75625 0 0 0
-1131 1 -12.1613 6.75625 9.45875 0 0 0
-1132 1 -14.8638 9.45875 9.45875 0 0 0
-1133 1 -9.45875 6.75625 6.75625 0 0 0
-1134 1 -6.75625 9.45875 6.75625 0 0 0
-1135 1 -6.75625 6.75625 9.45875 0 0 0
-1136 1 -9.45875 9.45875 9.45875 0 0 0
-1137 1 -4.05375 6.75625 6.75625 0 0 0
-1138 1 -1.35125 9.45875 6.75625 0 0 0
-1139 1 -1.35125 6.75625 9.45875 0 0 0
-1140 1 -4.05375 9.45875 9.45875 0 0 0
-1141 1 1.35125 6.75625 6.75625 0 0 0
-1142 1 4.05375 9.45875 6.75625 0 0 0
-1143 1 4.05375 6.75625 9.45875 0 0 0
-1144 1 1.35125 9.45875 9.45875 0 0 0
-1145 1 6.75625 6.75625 6.75625 0 0 0
-1146 1 9.45875 9.45875 6.75625 0 0 0
-1147 1 9.45875 6.75625 9.45875 0 0 0
-1148 1 6.75625 9.45875 9.45875 0 0 0
-1149 1 12.1613 6.75625 6.75625 0 0 0
-1150 1 14.8638 9.45875 6.75625 0 0 0
-1151 1 14.8638 6.75625 9.45875 0 0 0
-1152 1 12.1613 9.45875 9.45875 0 0 0
-1153 1 17.5663 6.75625 6.75625 0 0 0
-1154 1 20.2688 9.45875 6.75625 0 0 0
-1155 1 20.2688 6.75625 9.45875 0 0 0
-1156 1 17.5663 9.45875 9.45875 0 0 0
-1157 1 22.9713 6.75625 6.75625 0 0 0
-1158 1 25.6738 9.45875 6.75625 0 0 0
-1159 1 25.6738 6.75625 9.45875 0 0 0
-1160 1 22.9713 9.45875 9.45875 0 0 0
-1161 1 -25.6738 12.1613 6.75625 0 0 0
-1162 1 -22.9713 14.8638 6.75625 0 0 0
-1163 1 -22.9713 12.1613 9.45875 0 0 0
-1164 1 -25.6738 14.8638 9.45875 0 0 0
-1165 1 -20.2688 12.1613 6.75625 0 0 0
-1166 1 -17.5663 14.8638 6.75625 0 0 0
-1167 1 -17.5663 12.1613 9.45875 0 0 0
-1168 1 -20.2688 14.8638 9.45875 0 0 0
-1169 1 -14.8638 12.1613 6.75625 0 0 0
-1170 1 -12.1613 14.8638 6.75625 0 0 0
-1171 1 -12.1613 12.1613 9.45875 0 0 0
-1172 1 -14.8638 14.8638 9.45875 0 0 0
-1173 1 -9.45875 12.1613 6.75625 0 0 0
-1174 1 -6.75625 14.8638 6.75625 0 0 0
-1175 1 -6.75625 12.1613 9.45875 0 0 0
-1176 1 -9.45875 14.8638 9.45875 0 0 0
-1177 1 -4.05375 12.1613 6.75625 0 0 0
-1178 1 -1.35125 14.8638 6.75625 0 0 0
-1179 1 -1.35125 12.1613 9.45875 0 0 0
-1180 1 -4.05375 14.8638 9.45875 0 0 0
-1181 1 1.35125 12.1613 6.75625 0 0 0
-1182 1 4.05375 14.8638 6.75625 0 0 0
-1183 1 4.05375 12.1613 9.45875 0 0 0
-1184 1 1.35125 14.8638 9.45875 0 0 0
-1185 1 6.75625 12.1613 6.75625 0 0 0
-1186 1 9.45875 14.8638 6.75625 0 0 0
-1187 1 9.45875 12.1613 9.45875 0 0 0
-1188 1 6.75625 14.8638 9.45875 0 0 0
-1189 1 12.1613 12.1613 6.75625 0 0 0
-1190 1 14.8638 14.8638 6.75625 0 0 0
-1191 1 14.8638 12.1613 9.45875 0 0 0
-1192 1 12.1613 14.8638 9.45875 0 0 0
-1193 1 17.5663 12.1613 6.75625 0 0 0
-1194 1 20.2688 14.8638 6.75625 0 0 0
-1195 1 20.2688 12.1613 9.45875 0 0 0
-1196 1 17.5663 14.8638 9.45875 0 0 0
-1197 1 22.9713 12.1613 6.75625 0 0 0
-1198 1 25.6738 14.8638 6.75625 0 0 0
-1199 1 25.6738 12.1613 9.45875 0 0 0
-1200 1 22.9713 14.8638 9.45875 0 0 0
-1201 1 -25.6738 -14.8638 12.1613 0 0 0
-1202 1 -22.9713 -12.1613 12.1613 0 0 0
-1203 1 -22.9713 -14.8638 14.8638 0 0 0
-1204 1 -25.6738 -12.1613 14.8638 0 0 0
-1205 1 -20.2688 -14.8638 12.1613 0 0 0
-1206 1 -17.5663 -12.1613 12.1613 0 0 0
-1207 1 -17.5663 -14.8638 14.8638 0 0 0
-1208 1 -20.2688 -12.1613 14.8638 0 0 0
-1209 1 -14.8638 -14.8638 12.1613 0 0 0
-1210 1 -12.1613 -12.1613 12.1613 0 0 0
-1211 1 -12.1613 -14.8638 14.8638 0 0 0
-1212 1 -14.8638 -12.1613 14.8638 0 0 0
-1213 1 -9.45875 -14.8638 12.1613 0 0 0
-1214 1 -6.75625 -12.1613 12.1613 0 0 0
-1215 1 -6.75625 -14.8638 14.8638 0 0 0
-1216 1 -9.45875 -12.1613 14.8638 0 0 0
-1217 1 -4.05375 -14.8638 12.1613 0 0 0
-1218 1 -1.35125 -12.1613 12.1613 0 0 0
-1219 1 -1.35125 -14.8638 14.8638 0 0 0
-1220 1 -4.05375 -12.1613 14.8638 0 0 0
-1221 1 1.35125 -14.8638 12.1613 0 0 0
-1222 1 4.05375 -12.1613 12.1613 0 0 0
-1223 1 4.05375 -14.8638 14.8638 0 0 0
-1224 1 1.35125 -12.1613 14.8638 0 0 0
-1225 1 6.75625 -14.8638 12.1613 0 0 0
-1226 1 9.45875 -12.1613 12.1613 0 0 0
-1227 1 9.45875 -14.8638 14.8638 0 0 0
-1228 1 6.75625 -12.1613 14.8638 0 0 0
-1229 1 12.1613 -14.8638 12.1613 0 0 0
-1230 1 14.8638 -12.1613 12.1613 0 0 0
-1231 1 14.8638 -14.8638 14.8638 0 0 0
-1232 1 12.1613 -12.1613 14.8638 0 0 0
-1233 1 17.5663 -14.8638 12.1613 0 0 0
-1234 1 20.2688 -12.1613 12.1613 0 0 0
-1235 1 20.2688 -14.8638 14.8638 0 0 0
-1236 1 17.5663 -12.1613 14.8638 0 0 0
-1237 1 22.9713 -14.8638 12.1613 0 0 0
-1238 1 25.6738 -12.1613 12.1613 0 0 0
-1239 1 25.6738 -14.8638 14.8638 0 0 0
-1240 1 22.9713 -12.1613 14.8638 0 0 0
-1241 1 -25.6738 -9.45875 12.1613 0 0 0
-1242 1 -22.9713 -6.75625 12.1613 0 0 0
-1243 1 -22.9713 -9.45875 14.8638 0 0 0
-1244 1 -25.6738 -6.75625 14.8638 0 0 0
-1245 1 -20.2688 -9.45875 12.1613 0 0 0
-1246 1 -17.5663 -6.75625 12.1613 0 0 0
-1247 1 -17.5663 -9.45875 14.8638 0 0 0
-1248 1 -20.2688 -6.75625 14.8638 0 0 0
-1249 1 -14.8638 -9.45875 12.1613 0 0 0
-1250 1 -12.1613 -6.75625 12.1613 0 0 0
-1251 1 -12.1613 -9.45875 14.8638 0 0 0
-1252 1 -14.8638 -6.75625 14.8638 0 0 0
-1253 1 -9.45875 -9.45875 12.1613 0 0 0
-1254 1 -6.75625 -6.75625 12.1613 0 0 0
-1255 1 -6.75625 -9.45875 14.8638 0 0 0
-1256 1 -9.45875 -6.75625 14.8638 0 0 0
-1257 1 -4.05375 -9.45875 12.1613 0 0 0
-1258 1 -1.35125 -6.75625 12.1613 0 0 0
-1259 1 -1.35125 -9.45875 14.8638 0 0 0
-1260 1 -4.05375 -6.75625 14.8638 0 0 0
-1261 1 1.35125 -9.45875 12.1613 0 0 0
-1262 1 4.05375 -6.75625 12.1613 0 0 0
-1263 1 4.05375 -9.45875 14.8638 0 0 0
-1264 1 1.35125 -6.75625 14.8638 0 0 0
-1265 1 6.75625 -9.45875 12.1613 0 0 0
-1266 1 9.45875 -6.75625 12.1613 0 0 0
-1267 1 9.45875 -9.45875 14.8638 0 0 0
-1268 1 6.75625 -6.75625 14.8638 0 0 0
-1269 1 12.1613 -9.45875 12.1613 0 0 0
-1270 1 14.8638 -6.75625 12.1613 0 0 0
-1271 1 14.8638 -9.45875 14.8638 0 0 0
-1272 1 12.1613 -6.75625 14.8638 0 0 0
-1273 1 17.5663 -9.45875 12.1613 0 0 0
-1274 1 20.2688 -6.75625 12.1613 0 0 0
-1275 1 20.2688 -9.45875 14.8638 0 0 0
-1276 1 17.5663 -6.75625 14.8638 0 0 0
-1277 1 22.9713 -9.45875 12.1613 0 0 0
-1278 1 25.6738 -6.75625 12.1613 0 0 0
-1279 1 25.6738 -9.45875 14.8638 0 0 0
-1280 1 22.9713 -6.75625 14.8638 0 0 0
-1281 1 -25.6738 -4.05375 12.1613 0 0 0
-1282 1 -22.9713 -1.35125 12.1613 0 0 0
-1283 1 -22.9713 -4.05375 14.8638 0 0 0
-1284 1 -25.6738 -1.35125 14.8638 0 0 0
-1285 1 -20.2688 -4.05375 12.1613 0 0 0
-1286 1 -17.5663 -1.35125 12.1613 0 0 0
-1287 1 -17.5663 -4.05375 14.8638 0 0 0
-1288 1 -20.2688 -1.35125 14.8638 0 0 0
-1289 1 -14.8638 -4.05375 12.1613 0 0 0
-1290 1 -12.1613 -1.35125 12.1613 0 0 0
-1291 1 -12.1613 -4.05375 14.8638 0 0 0
-1292 1 -14.8638 -1.35125 14.8638 0 0 0
-1293 1 -9.45875 -4.05375 12.1613 0 0 0
-1294 1 -6.75625 -1.35125 12.1613 0 0 0
-1295 1 -6.75625 -4.05375 14.8638 0 0 0
-1296 1 -9.45875 -1.35125 14.8638 0 0 0
-1297 1 -4.05375 -4.05375 12.1613 0 0 0
-1298 1 -1.35125 -1.35125 12.1613 0 0 0
-1299 1 -1.35125 -4.05375 14.8638 0 0 0
-1300 1 -4.05375 -1.35125 14.8638 0 0 0
-1301 1 1.35125 -4.05375 12.1613 0 0 0
-1302 1 4.05375 -1.35125 12.1613 0 0 0
-1303 1 4.05375 -4.05375 14.8638 0 0 0
-1304 1 1.35125 -1.35125 14.8638 0 0 0
-1305 1 6.75625 -4.05375 12.1613 0 0 0
-1306 1 9.45875 -1.35125 12.1613 0 0 0
-1307 1 9.45875 -4.05375 14.8638 0 0 0
-1308 1 6.75625 -1.35125 14.8638 0 0 0
-1309 1 12.1613 -4.05375 12.1613 0 0 0
-1310 1 14.8638 -1.35125 12.1613 0 0 0
-1311 1 14.8638 -4.05375 14.8638 0 0 0
-1312 1 12.1613 -1.35125 14.8638 0 0 0
-1313 1 17.5663 -4.05375 12.1613 0 0 0
-1314 1 20.2688 -1.35125 12.1613 0 0 0
-1315 1 20.2688 -4.05375 14.8638 0 0 0
-1316 1 17.5663 -1.35125 14.8638 0 0 0
-1317 1 22.9713 -4.05375 12.1613 0 0 0
-1318 1 25.6738 -1.35125 12.1613 0 0 0
-1319 1 25.6738 -4.05375 14.8638 0 0 0
-1320 1 22.9713 -1.35125 14.8638 0 0 0
-1321 1 -25.6738 1.35125 12.1613 0 0 0
-1322 1 -22.9713 4.05375 12.1613 0 0 0
-1323 1 -22.9713 1.35125 14.8638 0 0 0
-1324 1 -25.6738 4.05375 14.8638 0 0 0
-1325 1 -20.2688 1.35125 12.1613 0 0 0
-1326 1 -17.5663 4.05375 12.1613 0 0 0
-1327 1 -17.5663 1.35125 14.8638 0 0 0
-1328 1 -20.2688 4.05375 14.8638 0 0 0
-1329 1 -14.8638 1.35125 12.1613 0 0 0
-1330 1 -12.1613 4.05375 12.1613 0 0 0
-1331 1 -12.1613 1.35125 14.8638 0 0 0
-1332 1 -14.8638 4.05375 14.8638 0 0 0
-1333 1 -9.45875 1.35125 12.1613 0 0 0
-1334 1 -6.75625 4.05375 12.1613 0 0 0
-1335 1 -6.75625 1.35125 14.8638 0 0 0
-1336 1 -9.45875 4.05375 14.8638 0 0 0
-1337 1 -4.05375 1.35125 12.1613 0 0 0
-1338 1 -1.35125 4.05375 12.1613 0 0 0
-1339 1 -1.35125 1.35125 14.8638 0 0 0
-1340 1 -4.05375 4.05375 14.8638 0 0 0
-1341 1 1.35125 1.35125 12.1613 0 0 0
-1342 1 4.05375 4.05375 12.1613 0 0 0
-1343 1 4.05375 1.35125 14.8638 0 0 0
-1344 1 1.35125 4.05375 14.8638 0 0 0
-1345 1 6.75625 1.35125 12.1613 0 0 0
-1346 1 9.45875 4.05375 12.1613 0 0 0
-1347 1 9.45875 1.35125 14.8638 0 0 0
-1348 1 6.75625 4.05375 14.8638 0 0 0
-1349 1 12.1613 1.35125 12.1613 0 0 0
-1350 1 14.8638 4.05375 12.1613 0 0 0
-1351 1 14.8638 1.35125 14.8638 0 0 0
-1352 1 12.1613 4.05375 14.8638 0 0 0
-1353 1 17.5663 1.35125 12.1613 0 0 0
-1354 1 20.2688 4.05375 12.1613 0 0 0
-1355 1 20.2688 1.35125 14.8638 0 0 0
-1356 1 17.5663 4.05375 14.8638 0 0 0
-1357 1 22.9713 1.35125 12.1613 0 0 0
-1358 1 25.6738 4.05375 12.1613 0 0 0
-1359 1 25.6738 1.35125 14.8638 0 0 0
-1360 1 22.9713 4.05375 14.8638 0 0 0
-1361 1 -25.6738 6.75625 12.1613 0 0 0
-1362 1 -22.9713 9.45875 12.1613 0 0 0
-1363 1 -22.9713 6.75625 14.8638 0 0 0
-1364 1 -25.6738 9.45875 14.8638 0 0 0
-1365 1 -20.2688 6.75625 12.1613 0 0 0
-1366 1 -17.5663 9.45875 12.1613 0 0 0
-1367 1 -17.5663 6.75625 14.8638 0 0 0
-1368 1 -20.2688 9.45875 14.8638 0 0 0
-1369 1 -14.8638 6.75625 12.1613 0 0 0
-1370 1 -12.1613 9.45875 12.1613 0 0 0
-1371 1 -12.1613 6.75625 14.8638 0 0 0
-1372 1 -14.8638 9.45875 14.8638 0 0 0
-1373 1 -9.45875 6.75625 12.1613 0 0 0
-1374 1 -6.75625 9.45875 12.1613 0 0 0
-1375 1 -6.75625 6.75625 14.8638 0 0 0
-1376 1 -9.45875 9.45875 14.8638 0 0 0
-1377 1 -4.05375 6.75625 12.1613 0 0 0
-1378 1 -1.35125 9.45875 12.1613 0 0 0
-1379 1 -1.35125 6.75625 14.8638 0 0 0
-1380 1 -4.05375 9.45875 14.8638 0 0 0
-1381 1 1.35125 6.75625 12.1613 0 0 0
-1382 1 4.05375 9.45875 12.1613 0 0 0
-1383 1 4.05375 6.75625 14.8638 0 0 0
-1384 1 1.35125 9.45875 14.8638 0 0 0
-1385 1 6.75625 6.75625 12.1613 0 0 0
-1386 1 9.45875 9.45875 12.1613 0 0 0
-1387 1 9.45875 6.75625 14.8638 0 0 0
-1388 1 6.75625 9.45875 14.8638 0 0 0
-1389 1 12.1613 6.75625 12.1613 0 0 0
-1390 1 14.8638 9.45875 12.1613 0 0 0
-1391 1 14.8638 6.75625 14.8638 0 0 0
-1392 1 12.1613 9.45875 14.8638 0 0 0
-1393 1 17.5663 6.75625 12.1613 0 0 0
-1394 1 20.2688 9.45875 12.1613 0 0 0
-1395 1 20.2688 6.75625 14.8638 0 0 0
-1396 1 17.5663 9.45875 14.8638 0 0 0
-1397 1 22.9713 6.75625 12.1613 0 0 0
-1398 1 25.6738 9.45875 12.1613 0 0 0
-1399 1 25.6738 6.75625 14.8638 0 0 0
-1400 1 22.9713 9.45875 14.8638 0 0 0
-1401 1 -25.6738 12.1613 12.1613 0 0 0
-1402 1 -22.9713 14.8638 12.1613 0 0 0
-1403 1 -22.9713 12.1613 14.8638 0 0 0
-1404 1 -25.6738 14.8638 14.8638 0 0 0
-1405 1 -20.2688 12.1613 12.1613 0 0 0
-1406 1 -17.5663 14.8638 12.1613 0 0 0
-1407 1 -17.5663 12.1613 14.8638 0 0 0
-1408 1 -20.2688 14.8638 14.8638 0 0 0
-1409 1 -14.8638 12.1613 12.1613 0 0 0
-1410 1 -12.1613 14.8638 12.1613 0 0 0
-1411 1 -12.1613 12.1613 14.8638 0 0 0
-1412 1 -14.8638 14.8638 14.8638 0 0 0
-1413 1 -9.45875 12.1613 12.1613 0 0 0
-1414 1 -6.75625 14.8638 12.1613 0 0 0
-1415 1 -6.75625 12.1613 14.8638 0 0 0
-1416 1 -9.45875 14.8638 14.8638 0 0 0
-1417 1 -4.05375 12.1613 12.1613 0 0 0
-1418 1 -1.35125 14.8638 12.1613 0 0 0
-1419 1 -1.35125 12.1613 14.8638 0 0 0
-1420 1 -4.05375 14.8638 14.8638 0 0 0
-1421 1 1.35125 12.1613 12.1613 0 0 0
-1422 1 4.05375 14.8638 12.1613 0 0 0
-1423 1 4.05375 12.1613 14.8638 0 0 0
-1424 1 1.35125 14.8638 14.8638 0 0 0
-1425 1 6.75625 12.1613 12.1613 0 0 0
-1426 1 9.45875 14.8638 12.1613 0 0 0
-1427 1 9.45875 12.1613 14.8638 0 0 0
-1428 1 6.75625 14.8638 14.8638 0 0 0
-1429 1 12.1613 12.1613 12.1613 0 0 0
-1430 1 14.8638 14.8638 12.1613 0 0 0
-1431 1 14.8638 12.1613 14.8638 0 0 0
-1432 1 12.1613 14.8638 14.8638 0 0 0
-1433 1 17.5663 12.1613 12.1613 0 0 0
-1434 1 20.2688 14.8638 12.1613 0 0 0
-1435 1 20.2688 12.1613 14.8638 0 0 0
-1436 1 17.5663 14.8638 14.8638 0 0 0
-1437 1 22.9713 12.1613 12.1613 0 0 0
-1438 1 25.6738 14.8638 12.1613 0 0 0
-1439 1 25.6738 12.1613 14.8638 0 0 0
-1440 1 22.9713 14.8638 14.8638 0 0 0
-
-Velocities
-
-1 0 0 0
-2 0 0 0
-3 0 0 0
-4 0 0 0
-5 0.00140531 0.00136547 -0.000774762
-6 -0.0013584 0.00112231 -0.00153087
-7 0.000667836 0.000355774 0.000398352
-8 0.000891869 0.000956849 -0.000625177
-9 -0.00158243 0.000521234 -0.000507341
-10 -0.00119575 0.000278072 -0.00126345
-11 6.05493e-05 0.000956464 -0.000806194
-12 0.00105452 0.000112612 -0.000357756
-13 -0.00117575 -0.000779011 0.000542234
-14 -0.00078907 -0.00102217 -0.000213874
-15 0.000467228 -0.000343781 0.000243382
-16 0.0014612 -0.00118763 0.000691819
-17 0.00136735 -0.000178321 -0.000662312
-18 0.0012172 -0.000334637 -0.000437109
-19 -0.000676897 0.000343755 2.01468e-05
-20 0.000853913 -0.000586943 -0.000512727
-21 -0.00137636 -0.00147857 0.000387264
-22 -0.00152652 0.00151551 0.000612466
-23 -0.000270218 -0.00095649 0.00106972
-24 0.00126059 0.0012632 0.000536849
-25 0.000629904 -0.00079103 0.000164029
-26 0.00101659 -0.00103419 -0.00059208
-27 -0.000877504 -0.0003558 -0.000134823
-28 0.000116467 -0.00119965 0.000313614
-29 0.00103658 0.00105912 0.0012136
-30 0.00142327 0.000815955 0.000457496
-31 -0.000470826 0.00149435 0.000914752
-32 0.000523146 0.000650495 0.00136319
-33 0.00119923 0.000214879 0.00148102
-34 -0.00156447 -2.82822e-05 0.000724916
-35 -0.000308174 0.000650109 0.00118217
-36 0.000685798 -0.000193742 -0.00151978
-37 0 0 0
-38 0 0 0
-39 0 0 0
-40 0 0 0
-41 0 0 0
-42 0 0 0
-43 0 0 0
-44 0 0 0
-45 0.000866629 -0.00108846 0.000933319
-46 0.0014107 0.000625543 0.00100519
-47 0.00012916 0.00105223 -0.00104396
-48 -0.000259363 -0.00124538 0.000438921
-49 0.00102928 0.00121769 0.00120074
-50 0.000803411 0.00122623 -0.000199352
-51 -0.000478127 -0.00149747 0.000901887
-52 -9.6711e-05 0.00106077 0.000706341
-53 0.00143596 -8.25506e-05 -0.000900076
-54 0.00121009 -7.40114e-05 0.000850223
-55 -7.1448e-05 0.000352679 -0.00119893
-56 0.000309968 -0.000239472 -0.00139448
-57 0.000828674 0.00051814 0.00104577
-58 6.59648e-05 0.000613524 0.000626988
-59 -0.00121557 0.00104022 -0.00142216
-60 -0.000297319 0.000361219 0.000551371
-61 0.00123535 -0.000782105 -0.00105505
-62 0.000472644 -0.000686721 -0.00147383
-63 -0.000808894 -0.00026003 -0.000372588
-64 0.00010936 -0.000939026 -0.00154945
-65 9.12278e-05 -9.45696e-05 -0.00127828
-66 -0.000134643 -8.60304e-05 0.000472018
-67 -0.000646242 -0.00110427 -0.000105168
-68 -0.00103476 -0.000251491 0.00137771
-69 0.000497906 -0.00139481 -0.000228706
-70 0.000272036 -0.00138628 0.00152159
-71 -0.000239563 0.000745879 0.000944408
-72 -0.000628086 -0.00155174 -0.000723105
-73 0.000660559 0.00091134 3.87143e-05
-74 0.000434688 0.000919879 -0.00136138
-75 -0.00084685 0.00134657 -0.000260138
-76 -0.000465434 0.000754419 -0.000455685
-77 0 0 0
-78 0 0 0
-79 0 0 0
-80 0 0 0
-81 0 0 0
-82 0 0 0
-83 0 0 0
-84 0 0 0
-85 0.00102217 0.00147832 -0.000662319
-86 0.000872021 0.001322 -0.000437117
-87 -0.000485234 -0.00123684 -0.000961172
-88 -0.000798039 -0.00054892 -0.00100339
-89 0.00118483 0.000634082 -0.000394899
-90 0.000264735 -0.0012277 0.00150873
-91 -0.000322582 0.00106931 -0.000693751
-92 -0.000635387 -0.00139316 -0.000735969
-93 -0.00155889 -0.000666162 0.000654676
-94 0.000671413 0.000622449 -0.000592087
-95 8.40968e-05 -0.000230932 0.000355824
-96 -0.000228708 0.000456989 0.000313606
-97 0.000984218 -6.54722e-05 -0.000549869
-98 -0.000472711 0.00130998 -0.000815322
-99 -0.00106003 0.000456603 0.000132589
-100 -0.000835995 0.00105768 -0.00089094
-101 0.0013909 -0.00136572 0.000499706
-102 -6.60325e-05 9.73993e-06 0.000234253
-103 -0.000653349 -0.000843642 0.00118216
-104 -0.000429316 -0.000242566 0.000158636
-105 0.000246773 -0.000678181 0.000276471
-106 -0.000673319 0.00061043 -0.000970293
-107 -0.00126064 -0.000242951 -2.23812e-05
-108 -0.00157344 0.00044497 -6.45992e-05
-109 0.000653451 0.00117197 0.00132605
-110 0.000503298 0.00101565 0.00155125
-111 -0.000853957 -0.0015432 0.00102719
-112 -0.00116676 -0.000855275 0.000984976
-113 0.000816103 0.000327728 -0.00155692
-114 -0.000103988 -0.00153405 0.000346703
-115 -0.000691305 0.000762958 0.00129461
-116 -0.00100411 0.00145088 0.0012524
-117 0 0 0
-118 0 0 0
-119 0 0 0
-120 0 0 0
-121 0 0 0
-122 0 0 0
-123 0 0 0
-124 0 0 0
-125 0.000483498 -0.000975611 0.00104576
-126 0.000257627 -0.000967072 -0.000354331
-127 -0.00102391 -0.000540381 0.000746909
-128 -0.000642494 -0.00113253 0.000551363
-129 0.00064615 0.00133054 0.00131318
-130 0.000420279 0.00133908 -8.69102e-05
-131 -0.000861258 -0.00138462 0.00101433
-132 -0.00124978 -0.000531842 -0.000653183
-133 0.00105283 3.02981e-05 -0.000787634
-134 0.000826958 3.88373e-05 0.000962665
-135 -0.000454579 0.000465528 -0.00108649
-136 -7.31635e-05 -0.000126623 -0.00128203
-137 0.000445542 0.000630988 0.00115821
-138 -0.000317166 0.000726373 0.00073943
-139 -0.0015987 0.00115306 -0.00130972
-140 -0.00068045 0.000474067 0.000663813
-141 0.000852221 -0.000669257 -0.000942604
-142 8.95123e-05 -0.000573872 -0.00136139
-143 -0.00119203 -0.000147181 -0.000260146
-144 -0.000273772 -0.000826178 -0.001437
-145 -0.000291903 1.82791e-05 -0.00116584
-146 -0.000517774 2.68183e-05 0.00058446
-147 0.00135108 0.000453509 -0.00146469
-148 -0.0014179 -0.000138642 0.00149015
-149 0.000114775 -0.00128197 -0.000116264
-150 -0.000111096 -0.00127343 -0.00151636
-151 -0.00139263 -0.000846736 -0.000415116
-152 -0.00101122 -0.00143889 -0.000610663
-153 0.000277427 0.00102419 0.000151157
-154 5.15565e-05 0.00103273 -0.00124894
-155 -0.00122998 0.00145942 -0.000147696
-156 0.00153189 -0.000838197 0.00133518
-157 0 0 0
-158 0 0 0
-159 0 0 0
-160 0 0 0
-161 0 0 0
-162 0 0 0
-163 0 0 0
-164 0 0 0
-165 -5.51779e-05 -0.000279151 -0.000396549
-166 -0.000281049 -0.000270611 0.00135375
-167 -0.00156259 0.000156079 -0.000695401
-168 -0.00118117 -0.000436072 -0.000890947
-169 0.000107474 -0.00112339 -0.000129128
-170 -0.000118397 -0.00111485 -0.00152922
-171 -0.00139993 -0.000688158 -0.000427981
-172 -0.00101852 -0.00128031 -0.000623527
-173 0.000514153 0.000726759 0.000920447
-174 0.000288282 0.000735298 -0.000479645
-175 -0.000993255 0.00116199 0.000621595
-176 -0.00061184 0.000569838 0.000426048
-177 -9.31337e-05 0.00132745 -0.000284099
-178 -0.000855842 0.00142283 -0.00070288
-179 0.00101301 -0.00130087 0.00039836
-180 -0.00121913 0.00117053 -0.000778497
-181 0.000313545 2.72039e-05 0.000765477
-182 -0.000449164 0.000122589 0.000346695
-183 0.00141969 0.000549279 0.00144794
-184 -0.000812448 -0.000129717 0.000271078
-185 -0.000830579 0.00071474 0.000542242
-186 -0.00105645 0.000723279 -0.00085785
-187 0.000812403 0.00114997 0.00024339
-188 0.00119382 0.000557819 4.7843e-05
-189 -0.000423901 -0.000585505 -0.00155857
-190 -0.000649772 -0.000576966 0.000191725
-191 0.00121908 -0.000150275 0.00129296
-192 -0.00154989 -0.000742426 0.00109742
-193 -0.000261249 -0.00142974 -0.00129115
-194 -0.00048712 -0.0014212 0.000459145
-195 0.00138173 -0.000994512 0.00156039
-196 0.000993211 -0.000141736 -0.000107127
-197 0 0 0
-198 0 0 0
-199 0 0 0
-200 0 0 0
-201 0 0 0
-202 0 0 0
-203 0 0 0
-204 0 0 0
-205 -0.00120641 0.00066901 0.000667549
-206 -0.000819725 0.000425849 -8.85598e-05
-207 0.00120651 -0.000340687 -0.00130973
-208 0.00143054 0.000260389 0.000817134
-209 -0.00104376 -0.000175227 0.000934969
-210 -0.000657073 -0.000418388 0.000178861
-211 0.000599225 0.000260003 0.000636117
-212 -0.00155719 -0.000583848 0.00108455
-213 -0.000637079 -0.00147547 -0.00116585
-214 -0.000250394 0.00143176 0.00122844
-215 0.0010059 -0.00104024 -0.0014647
-216 -0.00115052 0.0012663 -0.00101626
-217 -0.00124437 -0.000874781 0.000779999
-218 -0.00139452 -0.0010311 0.0010052
-219 -0.00013822 -0.000352706 0.00146246
-220 0.00139259 -0.0012834 0.000929584
-221 -0.000837687 0.000975365 -0.00132082
-222 -0.00098784 0.000819049 -0.00109561
-223 0.000268458 0.00149744 -0.000638359
-224 -0.00135112 0.000566743 -0.00117123
-225 0.00116858 -0.00148749 -0.00154405
-226 -0.00159513 0.00141974 0.000850231
-227 -0.000338828 -0.00105226 0.00130749
-228 0.000655143 0.00125428 -0.00139447
-229 -0.00157513 0.000362656 -0.000494477
-230 -0.00118845 0.000119494 -0.00125059
-231 6.78502e-05 0.000797886 -0.000793329
-232 0.00106182 -4.59657e-05 -0.000344892
-233 -0.00141248 -0.000481581 -0.000227057
-234 -0.0010258 -0.000724743 -0.000983165
-235 0.000230502 -4.63514e-05 -0.000525909
-236 0.00122447 -0.000890203 -7.74715e-05
-237 0 0 0
-238 0 0 0
-239 0 0 0
-240 0 0 0
-241 0 0 0
-242 0 0 0
-243 0 0 0
-244 0 0 0
-245 -0.00100222 -0.00151515 -0.000167921
-246 -0.00061554 0.00139208 -0.000924029
-247 0.0014107 0.000625543 0.00100519
-248 -0.00151566 0.00122662 -1.83355e-05
-249 -0.000839572 0.000791003 9.94998e-05
-250 -0.000452887 0.000547842 -0.000656609
-251 0.000803411 0.00122623 -0.000199352
-252 -0.00135301 0.000382382 0.000249085
-253 -0.000432894 -0.000509241 0.00114908
-254 -4.62087e-05 -0.000752403 0.000392967
-255 0.00121009 -7.40114e-05 0.000850223
-256 -0.00094633 -0.000917863 0.00129866
-257 -0.00104018 9.14488e-05 -5.54705e-05
-258 -0.00119033 -6.48671e-05 0.000169732
-259 6.59648e-05 0.000613524 0.000626988
-260 -0.00155362 -0.000317173 9.41145e-05
-261 -0.000633502 -0.0012088 0.000994105
-262 -0.000783654 -0.00136511 0.00121931
-263 0.000472644 -0.000686721 -0.00147383
-264 -0.00114694 0.00153297 0.00114369
-265 0.00137277 -0.00052126 0.00077087
-266 -0.00139094 -0.000764422 1.47616e-05
-267 -0.000134643 -8.60304e-05 0.000472018
-268 0.000859328 -0.000929882 0.000920455
-269 -0.00137095 0.00132889 -0.00132995
-270 -0.000984262 0.00108572 0.00106434
-271 0.000272036 -0.00138628 0.00152159
-272 0.00126601 0.000920264 -0.00118036
-273 -0.0012083 0.000484649 -0.00106253
-274 -0.00082161 0.000241487 0.00133176
-275 0.000434688 0.000919879 -0.00136138
-276 0.00142866 7.60273e-05 -0.000912941
-277 0 0 0
-278 0 0 0
-279 0 0 0
-280 0 0 0
-281 0 0 0
-282 0 0 0
-283 0 0 0
-284 0 0 0
-285 -0.0015409 -0.00081869 0.00154016
-286 0.00138362 -0.000810151 0.000140068
-287 0.000872021 0.001322 -0.000437117
-288 0.000483498 -0.000975611 0.00104576
-289 -0.00137825 0.00148746 -0.00134281
-290 0.00154627 0.001496 0.000407489
-291 0.000264735 -0.0012277 0.00150873
-292 0.00064615 0.00133054 0.00131318
-293 -0.00097157 0.000187219 -0.000293235
-294 -0.00119744 0.000195758 0.00145706
-295 0.000671413 0.000622449 -0.000592087
-296 0.00105283 3.02981e-05 -0.000787634
-297 -0.00157886 0.000787909 -0.00149778
-298 0.000808826 0.000883294 0.00123383
-299 -0.000472711 0.00130998 -0.000815322
-300 0.000445542 0.000630988 0.00115821
-301 -0.00117218 -0.000512336 -0.000448205
-302 0.0012155 -0.000416951 -0.000866987
-303 -6.60325e-05 9.73993e-06 0.000234253
-304 0.000852221 -0.000669257 -0.000942604
-305 0.000834089 0.0001752 -0.00067144
-306 0.000608218 0.000183739 0.00107886
-307 -0.000673319 0.00061043 -0.000970293
-308 -0.000291903 1.82791e-05 -0.00116584
-309 0.00124077 -0.00112504 0.000378135
-310 0.0010149 -0.00111651 -0.00102196
-311 0.000503298 0.00101565 0.00155125
-312 0.000114775 -0.00128197 -0.000116264
-313 0.00140342 0.00118111 0.000645555
-314 0.00117755 0.00118965 -0.000754537
-315 -0.000103988 -0.00153405 0.000346703
-316 0.000277427 0.00102419 0.000151157
-317 0 0 0
-318 0 0 0
-319 0 0 0
-320 0 0 0
-321 0 0 0
-322 0 0 0
-323 0 0 0
-324 0 0 0
-325 -0.00138536 -0.0014023 -5.54783e-05
-326 -0.00153551 -0.00155862 0.000169724
-327 0.000257627 -0.000967072 -0.000354331
-328 -5.51779e-05 -0.000279151 -0.000396549
-329 -0.0012227 0.000903852 0.000211942
-330 0.0010076 -0.000957928 -0.00103482
-331 0.000420279 0.00133908 -8.69102e-05
-332 0.000107474 -0.00112339 -0.000129128
-333 -0.000816025 -0.000396393 0.00126152
-334 0.00141427 0.000892219 1.47537e-05
-335 0.000826958 3.88373e-05 0.000962665
-336 0.000514153 0.000726759 0.000920447
-337 -0.00142331 0.000204297 5.69718e-05
-338 0.00027015 0.00157975 -0.000208481
-339 -0.000317166 0.000726373 0.00073943
-340 -9.31337e-05 0.00132745 -0.000284099
-341 -0.00101663 -0.00109595 0.00110655
-342 0.000676829 0.00027951 0.000841094
-343 8.95123e-05 -0.000573872 -0.00136139
-344 0.000313545 2.72039e-05 0.000765477
-345 0.000989634 -0.000408412 0.000883312
-346 6.95421e-05 0.0008802 -0.000363452
-347 -0.000517774 2.68183e-05 0.00058446
-348 -0.000830579 0.00071474 0.000542242
-349 0.00139631 0.00144173 -0.0012175
-350 0.000476221 -0.000420045 0.000686124
-351 -0.000111096 -0.00127343 -0.00151636
-352 -0.000423901 -0.000585505 -0.00155857
-353 0.000789026 -0.00110797 0.000728342
-354 0.000638873 -0.00126428 0.000953544
-355 5.15565e-05 0.00103273 -0.00124894
-356 -0.000261249 -0.00142974 -0.00129115
-357 0 0 0
-358 0 0 0
-359 0 0 0
-360 0 0 0
-361 0 0 0
-362 0 0 0
-363 0 0 0
-364 0 0 0
-365 0.00122636 -0.000705841 -0.00149779
-366 0.00100049 -0.000697302 0.00025251
-367 -0.000281049 -0.000270611 0.00135375
-368 0.000100367 -0.000862762 0.0011582
-369 0.00138901 -0.00155008 -0.00123037
-370 0.00116314 -0.00154154 0.000519931
-371 -0.000118397 -0.00111485 -0.00152922
-372 -0.00050692 -0.000262072 -4.63418e-05
-373 -0.0013547 0.000300068 -0.000180793
-374 -0.00158057 0.000308607 -0.00158089
-375 0.000288282 0.000735298 -0.000479645
-376 -0.000100241 -0.00156232 0.00100323
-377 0.0011884 0.000900758 -0.00138534
-378 0.000425695 0.000996143 0.00134627
-379 -0.000855842 0.00142283 -0.00070288
-380 6.24111e-05 0.000743837 0.00127065
-381 -0.00155531 -0.000399487 -0.000335763
-382 0.000832374 -0.000304102 -0.000754545
-383 -0.000449164 0.000122589 0.000346695
-384 0.00046909 -0.000556408 -0.000830162
-385 0.000450958 0.000288049 -0.000558998
-386 0.000225087 0.000296588 0.0011913
-387 -0.00105645 0.000723279 -0.00085785
-388 -0.000675035 0.000131128 -0.0010534
-389 0.000857637 -0.0010122 0.000490577
-390 0.000631766 -0.00100366 -0.000909515
-391 -0.000649772 -0.000576966 0.000191725
-392 -0.000268356 -0.00116912 -3.82157e-06
-393 0.00102029 0.00129396 0.000757998
-394 0.000794418 0.0013025 -0.000642095
-395 -0.00048712 -0.0014212 0.000459145
-396 -0.000875643 -0.000568427 -0.00120837
-397 0 0 0
-398 0 0 0
-399 0 0 0
-400 0 0 0
-401 0 0 0
-402 0 0 0
-403 0 0 0
-404 0 0 0
-405 0.000687683 -9.3809e-06 0.000210292
-406 0.000461812 -8.41725e-07 -0.0011898
-407 -0.000819725 0.000425849 -8.85598e-05
-408 -0.000438309 -0.000166302 -0.000284106
-409 0.000850336 -0.000853618 0.000477713
-410 0.000624465 -0.000845079 -0.000922379
-411 -0.000657073 -0.000418388 0.000178861
-412 -0.000275657 -0.00101054 -1.6686e-05
-413 0.00125701 0.000996528 0.00152729
-414 0.00103114 0.00100507 0.000127196
-415 -0.000250394 0.00143176 0.00122844
-416 0.000131022 0.000839607 0.00103289
-417 0.000649728 -0.00155317 0.000322743
-418 -0.000112981 -0.00145779 -9.6039e-05
-419 -0.00139452 -0.0010311 0.0010052
-420 -0.000476265 0.0014403 -0.000171656
-421 0.00105641 0.000296974 0.00137232
-422 0.000293698 0.000392358 0.000953536
-423 -0.00098784 0.000819049 -0.00109561
-424 -6.95862e-05 0.000140053 0.000877919
-425 -8.77182e-05 0.000984509 0.00114908
-426 -0.000313589 0.000993049 -0.000251009
-427 -0.00159513 0.00141974 0.000850231
-428 -0.00121371 0.000827588 0.000654684
-429 0.000318961 -0.000315735 -0.000951733
-430 9.30896e-05 -0.000307196 0.000798566
-431 -0.00118845 0.000119494 -0.00125059
-432 -0.000807032 -0.000472657 -0.00144613
-433 0.000481613 -0.00115997 -0.000684313
-434 0.000255742 -0.00115143 0.00106599
-435 -0.0010258 -0.000724743 -0.000983165
-436 -0.00141432 0.000128034 0.000499714
-437 0 0 0
-438 0 0 0
-439 0 0 0
-440 0 0 0
-441 0 0 0
-442 0 0 0
-443 0 0 0
-444 0 0 0
-445 -0.000463548 0.00093878 0.00127439
-446 -7.68635e-05 0.000695619 0.000518281
-447 0.00117943 0.00137401 0.000975537
-448 -0.000976985 0.000530159 0.00142397
-449 -0.000300896 9.4543e-05 0.00154181
-450 8.57887e-05 -0.000148618 0.000785702
-451 0.00134209 0.000529773 0.00124296
-452 -0.000814333 -0.000314079 -0.001459
-453 0.000105782 -0.0012057 -0.000559006
-454 0.000492467 -0.00144886 -0.00131511
-455 -0.00140163 -0.000770472 -0.000857858
-456 -0.000407654 0.00153607 -0.000409421
-457 -0.000501504 -0.000605012 0.00138684
-458 -0.000651657 -0.000761328 -0.00153835
-459 0.000604641 -8.29362e-05 -0.00108109
-460 -0.00101494 -0.00101363 0.00153642
-461 -9.48256e-05 0.00124513 -0.000713976
-462 -0.000244978 0.00108882 -0.000488774
-463 0.00101132 -0.00138318 -3.15178e-05
-464 -0.000608262 0.000836513 -0.000564391
-465 -0.00123895 -0.00121772 -0.000937211
-466 -0.000852265 -0.00146088 0.00145707
-467 0.000404033 -0.000782491 -0.00123606
-468 0.001398 0.00152405 -0.000787626
-469 -0.000832271 0.000632426 0.000112364
-470 -0.000445586 0.000389264 -0.000643744
-471 0.000810712 0.00106766 -0.000186488
-472 -0.00134571 0.000223804 0.000261949
-473 -0.000669619 -0.000211812 0.000379785
-474 -0.000282934 -0.000454973 -0.000376324
-475 0.000973364 0.000223418 8.09323e-05
-476 0.0011974 0.000824494 -0.000942596
-477 0 0 0
-478 0 0 0
-479 0 0 0
-480 0 0 0
-481 0 0 0
-482 0 0 0
-483 0 0 0
-484 0 0 0
-485 0.000432025 0.000279987 -0.000581823
-486 0.00081871 3.68259e-05 -0.00133793
-487 0.00138362 -0.000810151 0.000140068
-488 -0.0007728 0.00149639 0.000588506
-489 -0.000175261 0.000880677 0.00136402
-490 0.000211424 0.000637516 0.000607914
-491 0.00154627 0.001496 0.000407489
-492 -0.000610148 0.000652152 0.000855926
-493 0.000231417 -0.000419567 -0.000736794
-494 0.00138804 0.00104274 -2.09359e-05
-495 -0.00119744 0.000195758 0.00145706
-496 -0.000203469 -0.000648093 -0.00124489
-497 0.00039407 -0.0012638 -0.000469373
-498 -0.000526022 2.48069e-05 0.00143425
-499 0.000808826 0.000883294 0.00123383
-500 -0.000810756 -4.74031e-05 0.000700956
-501 0.000800748 0.000586342 0.000580202
-502 -0.000119343 -0.00127544 -0.000666562
-503 0.0012155 -0.000416951 -0.000866987
-504 -0.000404077 -0.00134765 -0.00139986
-505 -0.000343376 0.00127388 0.000356967
-506 4.33088e-05 0.00103072 -0.000399141
-507 0.000608218 0.000183739 0.00107886
-508 -0.0015482 -0.000660112 0.0015273
-509 6.33025e-05 -2.63672e-05 0.00140654
-510 0.000449987 -0.000269529 0.000650434
-511 0.0010149 -0.00111651 -0.00102196
-512 -0.00114152 0.00119003 -0.00057352
-513 -0.000543984 0.000574323 0.000201997
-514 -0.000157299 0.000331162 -0.000554111
-515 0.00117755 0.00118965 -0.000754537
-516 -0.000978871 0.000345797 -0.0003061
-517 0 0 0
-518 0 0 0
-519 0 0 0
-520 0 0 0
-521 0 0 0
-522 0 0 0
-523 0 0 0
-524 0 0 0
-525 -0.000106651 0.000976448 0.00112626
-526 -0.000332522 0.000984987 -0.000273835
-527 -0.00153551 -0.00155862 0.000169724
-528 0.00122636 -0.000705841 -0.00149779
-529 -0.000713937 0.00157714 -7.8288e-05
-530 -0.000169869 0.00014075 -6.41415e-06
-531 0.0010076 -0.000957928 -0.00103482
-532 0.00138901 -0.00155008 -0.00123037
-533 -0.000307259 0.000276893 0.000971287
-534 0.000236809 -0.0011595 0.00104316
-535 0.00141427 0.000892219 1.47537e-05
-536 -0.0013547 0.000300068 -0.000180793
-537 -0.000144606 -0.000567344 0.00123871
-538 0.00147314 0.000972968 -0.00065204
-539 0.00027015 0.00157975 -0.000208481
-540 0.0011884 0.000900758 -0.00138534
-541 0.000262072 0.0012828 -0.000862108
-542 -0.00127058 -0.000327277 0.000397536
-543 0.000676829 0.00027951 0.000841094
-544 -0.00155531 -0.000399487 -0.000335763
-545 -0.000882052 -0.00118005 -0.00108534
-546 -0.00110792 -0.00117151 0.000664956
-547 6.95421e-05 0.0008802 -0.000363452
-548 0.000450958 0.000288049 -0.000558998
-549 -0.000475374 0.000670093 -3.57677e-05
-550 -0.000701244 0.000678632 -0.00143586
-551 0.000476221 -0.000420045 0.000686124
-552 0.000857637 -0.0010122 0.000490577
-553 -0.00108266 0.00127078 -0.00124031
-554 -0.00130853 0.00127932 0.000509986
-555 0.000638873 -0.00126428 0.000953544
-556 0.00102029 0.00129396 0.000757998
-557 0 0 0
-558 0 0 0
-559 0 0 0
-560 0 0 0
-561 0 0 0
-562 0 0 0
-563 0 0 0
-564 0 0 0
-565 4.88942e-05 0.000392836 -0.000469381
-566 -0.000871198 -0.00146894 0.00143425
-567 0.00100049 -0.000697302 0.00025251
-568 0.000687683 -9.3809e-06 0.000210292
-569 -0.000558392 0.000993526 0.00147646
-570 -0.000708545 0.00083721 -0.00144872
-571 0.00116314 -0.00154154 0.000519931
-572 0.000850336 -0.000853618 0.000477713
-573 -0.000151714 -0.000306719 -0.000624351
-574 -0.000301867 -0.000463035 -0.000399149
-575 -0.00158057 0.000308607 -0.00158089
-576 0.00125701 0.000996528 0.00152729
-577 1.09384e-05 -0.00115096 -0.000356931
-578 0.000934461 -0.00148096 0.00105604
-579 0.000425695 0.000996143 0.00134627
-580 0.000649728 -0.00155317 0.000322743
-581 0.000417617 0.000699191 0.000692644
-582 0.00134114 0.000369184 -0.00104477
-583 0.000832374 -0.000304102 -0.000754545
-584 0.00105641 0.000296974 0.00137232
-585 -0.000726507 0.00138673 0.000469409
-586 0.00150379 -0.000475054 -0.000777354
-587 0.000225087 0.000296588 0.0011913
-588 -8.77182e-05 0.000984509 0.00114908
-589 -0.000319829 8.64815e-05 0.00151898
-590 -0.00123992 0.00137509 0.000272221
-591 0.000631766 -0.00100366 -0.000909515
-592 0.000318961 -0.000315735 -0.000951733
-593 -0.000927115 0.000687172 0.000314439
-594 0.00130318 -0.00117461 -0.000932325
-595 0.000794418 0.0013025 -0.000642095
-596 0.000481613 -0.00115997 -0.000684313
-597 0 0 0
-598 0 0 0
-599 0 0 0
-600 0 0 0
-601 0 0 0
-602 0 0 0
-603 0 0 0
-604 0 0 0
-605 -0.000489782 0.0010893 0.0012387
-606 -0.000715653 0.00109784 -0.000161392
-607 0.000461812 -8.41725e-07 -0.0011898
-608 0.000843228 -0.000592993 -0.00138535
-609 -0.00109707 -0.0014604 3.41543e-05
-610 -0.00132294 -0.00145187 -0.00136594
-611 0.000624465 -0.000845079 -0.000922379
-612 0.000235942 7.69745e-06 0.000560499
-613 -0.00069039 0.000389742 0.00108373
-614 -0.000916261 0.000398281 -0.000316363
-615 0.00103114 0.00100507 0.000127196
-616 0.00064262 -0.00129255 -0.00154032
-617 -0.000527738 -0.000454495 0.00135115
-618 0.00109001 0.00108582 -0.000539598
-619 -0.000112981 -0.00145779 -9.6039e-05
-620 0.000805272 0.00101361 -0.0012729
-621 -0.000121059 0.00139565 -0.000749666
-622 0.00149668 -0.000214428 0.000509978
-623 0.000293698 0.000392358 0.000953536
-624 0.00121195 -0.000286638 -0.000223321
-625 -0.00126518 -0.0010672 -0.000972901
-626 -0.00149105 -0.00105867 0.000777398
-627 -0.000313589 0.000993049 -0.000251009
-628 6.78266e-05 0.000400898 -0.000446556
-629 -0.000858505 0.000782942 7.66745e-05
-630 -0.00108438 0.000791481 -0.00132342
-631 9.30896e-05 -0.000307196 0.000798566
-632 0.000474505 -0.000899347 0.00060302
-633 -0.00146579 0.00138363 -0.00112787
-634 0.00145873 0.00139217 0.000622428
-635 0.000255742 -0.00115143 0.00106599
-636 -0.000132781 -0.000298657 -0.000601526
-637 0 0 0
-638 0 0 0
-639 0 0 0
-640 0 0 0
-641 0 0 0
-642 0 0 0
-643 0 0 0
-644 0 0 0
-645 -0.00102846 -0.00136463 -0.00020361
-646 -0.00125433 -0.0013561 0.00154669
-647 -7.68635e-05 0.000695619 0.000518281
-648 0.000304552 0.000103468 0.000322735
-649 0.00151465 -0.000763944 -0.00140816
-650 0.00128878 -0.000755405 0.000342143
-651 8.57887e-05 -0.000148618 0.000785702
-652 -0.000302734 0.000704158 -0.000881811
-653 -0.00122907 0.0010862 -0.000358581
-654 -0.00145494 0.00109474 0.00139172
-655 0.000492467 -0.00144886 -0.00131511
-656 0.000103944 -0.000596087 0.000167764
-657 -0.00106641 0.000241965 -9.11602e-05
-658 0.00055133 -0.00136811 0.00116848
-659 -0.000651657 -0.000761328 -0.00153835
-660 0.000266596 -0.00144032 0.000435185
-661 -0.000659735 -0.00105828 0.000958415
-662 0.000958009 0.000482032 -0.000932332
-663 -0.000244978 0.00108882 -0.000488774
-664 0.000673275 0.000409822 0.00148476
-665 0.00134653 -0.000370744 0.00073518
-666 0.00112066 -0.000362205 -0.000664912
-667 -0.000852265 -0.00146088 0.00145707
-668 -0.000470849 0.00109736 0.00126153
-669 -0.00139718 0.0014794 -0.00136564
-670 0.00152734 0.00148794 0.000384663
-671 -0.000445586 0.000389264 -0.000643744
-672 -6.41707e-05 -0.000202887 -0.000839291
-673 0.00114592 -0.0010703 0.00058021
-674 0.000920053 -0.00106176 -0.000819882
-675 -0.000282934 -0.000454973 -0.000376324
-676 -0.000671457 0.000397803 0.00110655
-677 0 0 0
-678 0 0 0
-679 0 0 0
-680 0 0 0
-681 0 0 0
-682 0 0 0
-683 0 0 0
-684 0 0 0
-685 0.000970701 -0.000416473 0.000860487
-686 0.00135739 -0.000659635 0.000104379
-687 -0.0012281 -0.00150661 -0.00156801
-688 -0.000234124 0.000799928 -0.00111958
-689 0.000363415 0.000184217 -0.000344059
-690 0.0007501 -5.89444e-05 -0.00110017
-691 -0.00106544 0.000799543 -0.00130059
-692 -7.14716e-05 -4.43089e-05 -0.000852155
-693 0.000770093 -0.00111603 0.000705517
-694 0.00115678 -0.00135919 -5.05917e-05
-695 -0.000658765 -0.000500702 -0.000251017
-696 0.000335207 -0.00134455 0.00019742
-697 0.000932746 0.00119013 0.000972937
-698 1.26539e-05 -0.000671654 -0.000273827
-699 0.0013475 0.000186833 -0.000474252
-700 -0.00027208 -0.000743864 -0.00100713
-701 0.00133942 -0.000110119 -0.00112788
-702 0.000419333 0.00117849 0.000775749
-703 -0.00139621 -0.00111341 0.000575323
-704 0.000134599 0.00110628 4.245e-05
-705 0.0001953 0.000577417 -0.00135111
-706 0.000581985 0.000334256 0.00104317
-707 0.00114689 -0.000512721 -0.000629222
-708 -0.00100953 -0.00135657 -0.000180785
-709 0.000601979 -0.000722828 -0.000301539
-710 0.000988663 -0.000965989 -0.00105765
-711 -0.00159682 0.00133743 0.000420353
-712 -0.000602847 0.000493574 0.00086879
-713 -5.30813e-06 -0.000122138 -0.00150608
-714 0.000381377 -0.000365299 0.000888199
-715 -0.00143417 0.000493188 0.000687773
-716 -0.00121013 0.00109426 -0.000335755
-717 0 0 0
-718 0 0 0
-719 0 0 0
-720 0 0 0
-721 0 0 0
-722 0 0 0
-723 0 0 0
-724 0 0 0
-725 0.000483498 -0.000975611 0.00104576
-726 0.000870183 -0.00121877 0.000289653
-727 -0.000332522 0.000984987 -0.000273835
-728 0.00066145 0.000141135 0.000174603
-729 0.00064615 0.00133054 0.00131318
-730 0.00103284 0.00108738 0.000557074
-731 -0.000169869 0.00014075 -6.41415e-06
-732 5.41634e-05 0.000741826 -0.00102994
-733 0.00105283 3.02981e-05 -0.000787634
-734 0.00143951 -0.000212863 -0.00154374
-735 0.000236809 -0.0011595 0.00104316
-736 0.000460842 -0.000558419 1.96325e-05
-737 0.000445542 0.000630988 0.00115821
-738 0.000295389 0.000474672 0.00138341
-739 0.00147314 0.000972968 -0.00065204
-740 0.000623494 -0.00140266 0.000287053
-741 0.000852221 -0.000669257 -0.000942604
-742 0.000702068 -0.000825572 -0.000717402
-743 -0.00127058 -0.000327277 0.000397536
-744 0.00103017 0.00044749 0.00133663
-745 -0.000291903 1.82791e-05 -0.00116584
-746 9.47815e-05 -0.000224882 0.00122844
-747 -0.00110792 -0.00117151 0.000664956
-748 -0.000113952 0.00113503 0.00111339
-749 0.000114775 -0.00128197 -0.000116264
-750 0.00050146 -0.00152513 -0.000872372
-751 -0.000701244 0.000678632 -0.00143586
-752 0.000292727 -0.000165219 -0.000987423
-753 0.000277427 0.00102419 0.000151157
-754 0.000664112 0.000781027 -0.000604952
-755 -0.00130853 0.00127932 0.000509986
-756 -0.00031456 0.000435471 0.000958423
-757 0 0 0
-758 0 0 0
-759 0 0 0
-760 0 0 0
-761 0 0 0
-762 0 0 0
-763 0 0 0
-764 0 0 0
-765 -5.51779e-05 -0.000279151 -0.000396549
-766 -0.000281049 -0.000270611 0.00135375
-767 -0.000871198 -0.00146894 0.00143425
-768 -0.000489782 0.0010893 0.0012387
-769 0.000107474 -0.00112339 -0.000129128
-770 -0.000118397 -0.00111485 -0.00152922
-771 -0.000708545 0.00083721 -0.00144872
-772 -0.00109707 -0.0014604 3.41543e-05
-773 0.000514153 0.000726759 0.000920447
-774 0.000288282 0.000735298 -0.000479645
-775 -0.000301867 -0.000463035 -0.000399149
-776 -0.00069039 0.000389742 0.00108373
-777 -9.31337e-05 0.00132745 -0.000284099
-778 -0.000855842 0.00142283 -0.00070288
-779 0.000934461 -0.00148096 0.00105604
-780 -0.000527738 -0.000454495 0.00135115
-781 0.000313545 2.72039e-05 0.000765477
-782 -0.000449164 0.000122589 0.000346695
-783 0.00134114 0.000369184 -0.00104477
-784 -0.000121059 0.00139565 -0.000749666
-785 -0.000830579 0.00071474 0.000542242
-786 -0.00105645 0.000723279 -0.00085785
-787 0.00150379 -0.000475054 -0.000777354
-788 -0.00126518 -0.0010672 -0.000972901
-789 -0.000423901 -0.000585505 -0.00155857
-790 -0.000649772 -0.000576966 0.000191725
-791 -0.00123992 0.00137509 0.000272221
-792 -0.000858505 0.000782942 7.66745e-05
-793 -0.000261249 -0.00142974 -0.00129115
-794 -0.00048712 -0.0014212 0.000459145
-795 0.00130318 -0.00117461 -0.000932325
-796 -0.00146579 0.00138363 -0.00112787
-797 0 0 0
-798 0 0 0
-799 0 0 0
-800 0 0 0
-801 0 0 0
-802 0 0 0
-803 0 0 0
-804 0 0 0
-805 0.000100367 -0.000862762 0.0011582
-806 -0.000819725 0.000425849 -8.85598e-05
-807 -0.000715653 0.00109784 -0.000161392
-808 -0.00102846 -0.00136463 -0.00020361
-809 -0.00050692 -0.000262072 -4.63418e-05
-810 -0.000657073 -0.000418388 0.000178861
-811 -0.00132294 -0.00145187 -0.00136594
-812 0.00151465 -0.000763944 -0.00140816
-813 -0.000100241 -0.00156232 0.00100323
-814 -0.000250394 0.00143176 0.00122844
-815 -0.000916261 0.000398281 -0.000316363
-816 -0.00122907 0.0010862 -0.000358581
-817 6.24111e-05 0.000743837 0.00127065
-818 -0.00139452 -0.0010311 0.0010052
-819 0.00109001 0.00108582 -0.000539598
-820 -0.00106641 0.000241965 -9.11602e-05
-821 0.00046909 -0.000556408 -0.000830162
-822 -0.00098784 0.000819049 -0.00109561
-823 0.00149668 -0.000214428 0.000509978
-824 -0.000659735 -0.00105828 0.000958415
-825 -0.000675035 0.000131128 -0.0010534
-826 -0.00159513 0.00141974 0.000850231
-827 -0.00149105 -0.00105867 0.000777398
-828 0.00134653 -0.000370744 0.00073518
-829 -0.000268356 -0.00116912 -3.82157e-06
-830 -0.00118845 0.000119494 -0.00125059
-831 -0.00108438 0.000791481 -0.00132342
-832 -0.00139718 0.0014794 -0.00136564
-833 -0.000875643 -0.000568427 -0.00120837
-834 -0.0010258 -0.000724743 -0.000983165
-835 0.00145873 0.00139217 0.000622428
-836 0.00114592 -0.0010703 0.00058021
-837 0 0 0
-838 0 0 0
-839 0 0 0
-840 0 0 0
-841 0 0 0
-842 0 0 0
-843 0 0 0
-844 0 0 0
-845 -0.000438309 -0.000166302 -0.000284106
-846 -0.00066418 -0.000157763 0.00146619
-847 -0.00125433 -0.0013561 0.00154669
-848 0.00150754 -0.000503319 -0.000120824
-849 -0.000275657 -0.00101054 -1.6686e-05
-850 -0.000501528 -0.001002 -0.00141678
-851 0.00128878 -0.000755405 0.000342143
-852 -0.0014802 -0.00134756 0.000146597
-853 0.000131022 0.000839607 0.00103289
-854 -9.48492e-05 0.000848146 -0.000367203
-855 -0.00145494 0.00109474 0.00139172
-856 -0.00107352 0.000502591 0.00119617
-857 -0.000476265 0.0014403 -0.000171656
-858 0.00114148 -0.000169782 0.00108799
-859 0.00055133 -0.00136811 0.00116848
-860 0.00146958 0.00110328 -8.37372e-06
-861 -6.95862e-05 0.000140053 0.000877919
-862 -0.000832295 0.000235437 0.000459138
-863 0.000958009 0.000482032 -0.000932332
-864 -0.00050419 0.0015085 -0.000637224
-865 -0.00121371 0.000827588 0.000654684
-866 -0.00143958 0.000836127 -0.000745408
-867 0.00112066 -0.000362205 -0.000664912
-868 0.000732138 0.000490572 0.000817967
-869 -0.000807032 -0.000472657 -0.00144613
-870 -0.0010329 -0.000464117 0.000304167
-871 0.00152734 0.00148794 0.000384663
-872 0.00113882 -0.000809673 -0.00128285
-873 -0.00141432 0.000128034 0.000499714
-874 -0.000870251 -0.00130835 0.000571588
-875 0.000920053 -0.00106176 -0.000819882
-876 0.00130147 0.00149648 -0.00101543
-877 0 0 0
-878 0 0 0
-879 0 0 0
-880 0 0 0
-881 0 0 0
-882 0 0 0
-883 0 0 0
-884 0 0 0
-885 -0.000976985 0.000530159 0.00142397
-886 -0.00120286 0.000538698 2.38825e-05
-887 0.00135739 -0.000659635 0.000104379
-888 -0.00141159 -0.00125179 -9.1168e-05
-889 -0.000814333 -0.000314079 -0.001459
-890 -0.0010402 -0.000305539 0.000291303
-891 0.0007501 -5.89444e-05 -0.00110017
-892 0.00113152 -0.000651095 -0.00129571
-893 -0.000407654 0.00153607 -0.000409421
-894 -0.000633525 0.00154461 0.00134088
-895 0.00115678 -0.00135919 -5.05917e-05
-896 0.00153819 0.00119905 -0.000246138
-897 -0.00101494 -0.00101363 0.00153642
-898 0.00137274 -0.000918249 0.00111764
-899 1.26539e-05 -0.000671654 -0.000273827
-900 -0.00144954 0.000354814 2.12821e-05
-901 -0.000608262 0.000836513 -0.000564391
-902 -0.00137097 0.000931898 -0.000983173
-903 0.000419333 0.00117849 0.000775749
-904 -0.00104287 -0.000945431 0.00107086
-905 0.001398 0.00152405 -0.000787626
-906 0.00117213 0.00153259 0.000962673
-907 0.000581985 0.000334256 0.00104317
-908 0.000193462 0.00118703 -0.000624344
-909 -0.00134571 0.000223804 0.000261949
-910 -0.00157158 0.000232343 -0.00113814
-911 0.000988663 -0.000965989 -0.00105765
-912 0.00060014 -0.000113213 0.000425232
-913 0.0011974 0.000824494 -0.000942596
-914 -0.00140893 -0.000611894 -0.000870723
-915 0.000381377 -0.000365299 0.000888199
-916 0.000762793 -0.00095745 0.000692652
-917 0 0 0
-918 0 0 0
-919 0 0 0
-920 0 0 0
-921 0 0 0
-922 0 0 0
-923 0 0 0
-924 0 0 0
-925 0.00102217 0.00147832 -0.000662319
-926 0.00140886 0.00123516 -0.00141843
-927 0.000206154 0.000288527 0.00116848
-928 0.00120013 -0.000555325 -0.00153348
-929 0.00118483 0.000634082 -0.000394899
-930 -0.00157888 0.000390921 -0.00115101
-931 -0.000401132 0.000889217 -3.60699e-05
-932 0.000592839 4.53651e-05 0.000412367
-933 -0.00155889 -0.000666162 0.000654676
-934 -0.0011722 -0.000909324 -0.000101432
-935 5.54651e-06 -0.000411028 0.00101351
-936 0.000999518 -0.00125488 0.00146194
-937 0.000984218 -6.54722e-05 -0.000549869
-938 0.000834065 -0.000221788 -0.000324667
-939 -0.00113858 0.000276508 0.00079027
-940 0.00116217 0.00105127 -0.00142103
-941 0.0013909 -0.00136572 0.000499706
-942 0.00124074 -0.00152203 0.000724908
-943 -0.000731899 -0.00102374 -0.00131055
-944 -0.00158154 -0.00024897 -0.000371453
-945 0.000246773 -0.000678181 0.000276471
-946 0.000633458 -0.000921343 -0.000479637
-947 -0.000569247 0.00128242 -0.00104313
-948 -0.000345214 -0.0012669 0.00108374
-949 0.000653451 0.00117197 0.00132605
-950 0.00104014 0.000928804 0.000569938
-951 -0.000162568 -1.78281e-05 6.45027e-06
-952 0.000831403 -0.00086168 0.000454888
-953 0.000816103 0.000327728 -0.00155692
-954 0.00120279 8.45664e-05 0.000837358
-955 -0.000769855 0.000582862 -0.0011981
-956 0.000224117 -0.000260989 -0.000749658
-957 0 0 0
-958 0 0 0
-959 0 0 0
-960 0 0 0
-961 0 0 0
-962 0 0 0
-963 0 0 0
-964 0 0 0
-965 -0.00123264 0.000819527 0.000631859
-966 -0.000845958 0.000576365 -0.000124249
-967 -0.000817887 -0.000183766 -0.00081533
-968 -0.000593854 0.00041731 0.00131153
-969 0.00131046 0.00142022 -0.000572687
-970 -0.00145324 0.00117706 -0.0013288
-971 -0.00142517 0.000416924 0.00113052
-972 -0.000431202 -0.000426927 -0.00157144
-973 -0.00143325 0.000119972 0.000476889
-974 -0.00104657 -0.000123189 -0.00027922
-975 -0.00101849 -0.000883321 -0.0009703
-976 -2.4523e-05 0.00142322 -0.000521863
-977 -0.0012706 -0.000724265 0.000744309
-978 0.000959701 0.000564346 -0.000502455
-979 0.000987772 -0.000195785 -0.00119354
-980 -0.00063181 -0.00112648 0.00142398
-981 -0.00086392 0.00112588 -0.00135651
-982 0.00136638 -0.000735898 0.000547121
-983 0.00139445 -0.00149603 -0.00014396
-984 -0.000225131 0.000723664 -0.000676833
-985 0.00114235 -0.00133697 -0.00157974
-986 0.00152903 0.00157026 0.000814541
-987 -0.00159329 0.000810124 0.00012346
-988 -0.00136926 0.0014112 -0.000900068
-989 0.00154903 0.000513172 -0.000530167
-990 -0.00121468 0.000270011 -0.00128627
-991 -0.00118661 -0.000490121 0.00117304
-992 -0.000962577 0.000110955 0.000149507
-993 0.000941738 0.00111386 0.00141568
-994 0.00132842 0.000870701 0.000659571
-995 0.00135649 0.00011057 -3.151e-05
-996 -0.000799925 -0.000733282 0.000416927
-997 0 0 0
-998 0 0 0
-999 0 0 0
-1000 0 0 0
-1001 0 0 0
-1002 0 0 0
-1003 0 0 0
-1004 0 0 0
-1005 0.00137907 0.00151599 -0.000810451
-1006 0.0011532 0.00152453 0.000939848
-1007 -0.00135656 0.000512695 0.000892751
-1008 0.00140531 0.00136547 -0.000774762
-1009 0.000771785 -0.00103371 0.00113539
-1010 0.000545914 -0.00102517 -0.000264698
-1011 0.00118654 0.00111338 -0.000311795
-1012 -0.00158243 0.000521234 -0.000507341
-1013 0.00117846 0.000816433 -0.000965422
-1014 0.000952593 0.000824972 0.000784877
-1015 -0.00155717 -0.00018686 0.000737781
-1016 -0.00117575 -0.000779011 0.000542234
-1017 0.00134112 -2.78046e-05 -0.000698001
-1018 -0.000191531 0.00151251 0.000561642
-1019 0.000449096 0.000500676 0.000514546
-1020 0.00136735 -0.000178321 -0.000662312
-1021 -0.0014026 -0.00132805 0.000351574
-1022 0.000215147 0.000212263 -0.00153917
-1023 0.000855775 -0.000799569 0.00156412
-1024 -0.00137636 -0.00147857 0.000387264
-1025 0.00060367 -0.000640514 0.000128339
-1026 0.000377799 -0.000631975 -0.00127175
-1027 0.00101843 0.00150658 -0.00131885
-1028 0.000629904 -0.00079103 0.000164029
-1029 0.00101035 0.00120963 0.00117791
-1030 0.000784478 0.00121817 -0.000222178
-1031 0.00142511 0.00020634 -0.000269275
-1032 0.00103658 0.00105912 0.0012136
-1033 0.000403062 -0.00134007 -2.66312e-05
-1034 0.000177192 -0.00133153 -0.00142672
-1035 0.000817819 0.00080703 -0.00147382
-1036 0.00119923 0.000214879 0.00148102
-1037 0 0 0
-1038 0 0 0
-1039 0 0 0
-1040 0 0 0
-1041 0 0 0
-1042 0 0 0
-1043 0 0 0
-1044 0 0 0
-1045 0.00153462 0.000932375 0.000744301
-1046 0.000614525 -0.000929404 -0.000502463
-1047 0.00117943 0.00137401 0.000975537
-1048 0.000866629 -0.00108846 0.000933319
-1049 0.00092733 0.00153307 -0.000460245
-1050 7.23841e-06 -0.000328714 0.00144338
-1051 0.00134209 0.000529773 0.00124296
-1052 0.00102928 0.00121769 0.00120074
-1053 0.00133401 0.000232821 0.000589331
-1054 0.00118386 7.65049e-05 0.000814533
-1055 -0.00140163 -0.000770472 -0.000857858
-1056 0.00143596 -8.25506e-05 -0.000900076
-1057 0.00149666 -0.000611416 0.000856751
-1058 -0.000730207 -0.000941423 -0.000880668
-1059 0.000604641 -8.29362e-05 -0.00108109
-1060 0.000828674 0.00051814 0.00104577
-1061 -0.00124705 0.00123873 -0.00124406
-1062 -0.000323529 0.000908723 0.000168908
-1063 0.00101132 -0.00138318 -3.15178e-05
-1064 0.00123535 -0.000782105 -0.00105505
-1065 -1.07236e-05 0.000220802 0.000211126
-1066 -0.000160877 6.4486e-05 0.000436328
-1067 0.000404033 -0.000782491 -0.00123606
-1068 9.12278e-05 -9.45696e-05 -0.00127828
-1069 0.000395955 -0.00107944 0.0012607
-1070 0.000245802 -0.00123576 0.0014859
-1071 0.000810712 0.00106766 -0.000186488
-1072 0.000497906 -0.00139481 -0.000228706
-1073 0.000558607 0.00122671 0.00152812
-1074 -0.000361484 -0.000635069 0.000281358
-1075 0.000973364 0.000223418 8.09323e-05
-1076 0.000660559 0.00091134 3.87143e-05
-1077 0 0 0
-1078 0 0 0
-1079 0 0 0
-1080 0 0 0
-1081 0 0 0
-1082 0 0 0
-1083 0 0 0
-1084 0 0 0
-1085 0.000995941 -0.00152156 -0.000698009
-1086 0.00077007 -0.00151302 0.00105229
-1087 0.0014107 0.000625543 0.00100519
-1088 0.00102217 0.00147832 -0.000662319
-1089 0.000388654 -0.000920865 0.00124784
-1090 0.000162783 -0.000912326 -0.000152256
-1091 0.000803411 0.00122623 -0.000199352
-1092 0.00118483 0.000634082 -0.000394899
-1093 0.000795333 0.000929281 -0.000852979
-1094 0.000569462 0.000937821 0.00089732
-1095 0.00121009 -7.40114e-05 0.000850223
-1096 -0.00155889 -0.000666162 0.000654676
-1097 0.000957985 8.50441e-05 -0.000585559
-1098 -0.000574663 -0.00152504 0.000674085
-1099 6.59648e-05 0.000613524 0.000626988
-1100 0.000984218 -6.54722e-05 -0.000549869
-1101 0.00136466 -0.0012152 0.000464016
-1102 -0.000167984 0.000325111 -0.00142673
-1103 0.000472644 -0.000686721 -0.00147383
-1104 0.0013909 -0.00136572 0.000499706
-1105 -0.0005494 0.000917262 -0.00123118
-1106 -5.33175e-06 -0.000519126 -0.00115931
-1107 -0.000134643 -8.60304e-05 0.000472018
-1108 0.000246773 -0.000678181 0.000276471
-1109 0.000627218 0.00132248 0.00129036
-1110 0.000401347 0.00133102 -0.000109735
-1111 0.000272036 -0.00138628 0.00152159
-1112 0.000653451 0.00117197 0.00132605
-1113 1.99312e-05 -0.00122722 8.58111e-05
-1114 -0.00020594 -0.00121868 -0.00131428
-1115 0.000434688 0.000919879 -0.00136138
-1116 0.000816103 0.000327728 -0.00155692
-1117 0 0 0
-1118 0 0 0
-1119 0 0 0
-1120 0 0 0
-1121 0 0 0
-1122 0 0 0
-1123 0 0 0
-1124 0 0 0
-1125 0.000457265 -0.000825095 0.00101007
-1126 0.000231394 -0.000816556 -0.00039002
-1127 0.000872021 0.001322 -0.000437117
-1128 0.000483498 -0.000975611 0.00104576
-1129 -0.000150022 -0.000224405 -0.000194474
-1130 -0.000375893 -0.000215865 0.00155583
-1131 0.000264735 -0.0012277 0.00150873
-1132 0.00064615 0.00133054 0.00131318
-1133 0.000256657 -0.00152465 0.000855102
-1134 3.07859e-05 -0.00151611 -0.000544991
-1135 0.000671413 0.000622449 -0.000592087
-1136 0.00105283 3.02981e-05 -0.000787634
-1137 0.000419309 0.000781505 0.00112252
-1138 -0.00111334 -0.000828575 -0.000768226
-1139 -0.000472711 0.00130998 -0.000815322
-1140 0.000445542 0.000630988 0.00115821
-1141 0.000825988 -0.00051874 -0.000978294
-1142 -0.00070666 0.00102157 0.00028135
-1143 -6.60325e-05 9.73993e-06 0.000234253
-1144 0.000852221 -0.000669257 -0.000942604
-1145 -0.000318137 0.000168795 -0.00120153
-1146 -0.000544008 0.000177335 0.00054877
-1147 -0.000673319 0.00061043 -0.000970293
-1148 -0.000291903 1.82791e-05 -0.00116584
-1149 8.85419e-05 -0.00113145 -0.000151954
-1150 -0.000137329 -0.00112291 -0.00155205
-1151 0.000503298 0.00101565 0.00155125
-1152 0.000114775 -0.00128197 -0.000116264
-1153 -0.000518745 -0.000530759 -0.0013565
-1154 -0.000744616 -0.00052222 0.0003938
-1155 -0.000103988 -0.00153405 0.000346703
-1156 0.000277427 0.00102419 0.000151157
-1157 0 0 0
-1158 0 0 0
-1159 0 0 0
-1160 0 0 0
-1161 0 0 0
-1162 0 0 0
-1163 0 0 0
-1164 0 0 0
-1165 -0.000693967 0.000123066 -0.00107622
-1166 -0.000307282 -0.000120095 0.00131806
-1167 -0.000279211 -0.000880226 0.00062698
-1168 -5.51779e-05 -0.000279151 -0.000396549
-1169 -0.00130125 0.000723756 0.000869623
-1170 -0.000914569 0.000480595 0.000113515
-1171 -0.000886497 -0.000279536 -0.000577566
-1172 0.000107474 -0.00112339 -0.000129128
-1173 -0.000894575 -0.000576488 -0.00123119
-1174 -0.00050789 -0.00081965 0.00116309
-1175 -0.000479819 0.00157061 0.00047201
-1176 0.000514153 0.000726759 0.000920447
-1177 -0.000731923 -0.00142073 -0.000963772
-1178 0.00149838 -0.000132114 0.000939855
-1179 0.00152645 -0.000892245 0.000248775
-1180 -9.31337e-05 0.00132745 -0.000284099
-1181 -0.000325244 0.000429421 8.58033e-05
-1182 -0.00124534 -0.00143236 -0.00116096
-1183 -0.00121726 0.000957901 0.00129835
-1184 0.000313545 2.72039e-05 0.000765477
-1185 -0.00146937 0.00111696 -0.000137432
-1186 -0.00108268 0.000873795 -0.00089354
-1187 0.00132584 0.00155859 9.38045e-05
-1188 -0.000830579 0.00071474 0.000542242
-1189 -0.00106269 -0.000183288 0.000912144
-1190 -0.000676005 -0.00042645 0.000156035
-1191 -0.000647934 -0.00118658 -0.000535045
-1192 -0.000423901 -0.000585505 -0.00155857
-1193 0.00148041 0.000417402 -0.000292402
-1194 -0.00128329 0.00017424 -0.00104851
-1195 -0.00125522 -0.000585891 0.0014108
-1196 -0.000261249 -0.00142974 -0.00129115
-1197 0 0 0
-1198 0 0 0
-1199 0 0 0
-1200 0 0 0
-1201 0 0 0
-1202 0 0 0
-1203 0 0 0
-1204 0 0 0
-1205 -0.000489782 0.0010893 0.0012387
-1206 -0.000103097 0.000846135 0.000482592
-1207 -0.000153576 -9.40919e-05 0.000449192
-1208 0.000840396 -0.000937943 0.00089763
-1209 -0.00109707 -0.0014604 3.41543e-05
-1210 -0.000710384 0.00144683 -0.000721954
-1211 9.07659e-06 -0.000938329 0.000716613
-1212 0.000233109 -0.000337253 -0.000306916
-1213 -0.00069039 0.000389742 0.00108373
-1214 -0.000303705 0.00014658 0.000327621
-1215 0.000415755 0.000911817 -0.0013842
-1216 0.000639788 0.00151289 0.000742659
-1217 -0.000527738 -0.000454495 0.00135115
-1218 -0.00144783 0.000834116 0.000104386
-1219 -0.000728369 -0.00155104 0.00154295
-1220 0.00080244 0.000668656 0.00101008
-1221 -0.000121059 0.00139565 -0.000749666
-1222 -0.00104115 -0.000466129 0.00115396
-1223 -0.000321691 0.000299108 -0.000557863
-1224 0.00120912 -0.000631589 -0.00109074
-1225 -0.00126518 -0.0010672 -0.000972901
-1226 -0.000878498 -0.00131037 0.00142138
-1227 -0.000928977 0.000899798 0.00138798
-1228 6.49944e-05 5.59468e-05 -0.00131397
-1229 -0.000858505 0.000782942 7.66745e-05
-1230 -0.00047182 0.000539781 -0.000679434
-1231 -0.000522299 -0.000400446 -0.000712833
-1232 0.000471673 -0.0012443 -0.000264396
-1233 -0.00146579 0.00138363 -0.00112787
-1234 -0.00107911 0.00114047 0.00126641
-1235 -0.000359646 -0.00124468 -0.000445413
-1236 -0.000135614 -0.000643608 -0.00146894
-1237 0 0 0
-1238 0 0 0
-1239 0 0 0
-1240 0 0 0
-1241 0 0 0
-1242 0 0 0
-1243 0 0 0
-1244 0 0 0
-1245 -0.00102846 -0.00136463 -0.00020361
-1246 -0.00125433 -0.0013561 0.00154669
-1247 -0.000692252 0.000602369 -0.000993118
-1248 -0.000310836 1.02176e-05 -0.00118866
-1249 0.00151465 -0.000763944 -0.00140816
-1250 0.00128878 -0.000755405 0.000342143
-1251 -0.000529599 -0.000241869 -0.000725698
-1252 -0.000918123 0.000610908 0.000757181
-1253 -0.00122907 0.0010862 -0.000358581
-1254 -0.00145494 0.00109474 0.00139172
-1255 -0.000122921 -0.00154211 0.000323878
-1256 -0.000511444 -0.000689337 -0.00134363
-1257 -0.00106641 0.000241965 -9.11602e-05
-1258 0.00055133 -0.00136811 0.00116848
-1259 -0.00126705 -0.000854578 0.000100643
-1260 -0.000348792 -0.00153357 -0.00107621
-1261 -0.000659735 -0.00105828 0.000958415
-1262 0.000958009 0.000482032 -0.000932332
-1263 -0.000860367 0.000995569 0.00115022
-1264 5.7887e-05 0.000316572 -2.6639e-05
-1265 0.00134653 -0.000370744 0.00073518
-1266 0.00112066 -0.000362205 -0.000664912
-1267 -0.00146765 -0.00155413 -5.43274e-05
-1268 -0.00108624 0.00100411 -0.000249874
-1269 -0.00139718 0.0014794 -0.00136564
-1270 0.00152734 0.00148794 0.000384663
-1271 -0.00106097 0.000296014 0.000995248
-1272 -0.000679559 -0.000296137 0.000799701
-1273 0.00114592 -0.0010703 0.00058021
-1274 0.000920053 -0.00106176 -0.000819882
-1275 -0.000898322 -0.000548223 0.00126267
-1276 -0.00128685 0.000304553 -0.000404844
-1277 0 0 0
-1278 0 0 0
-1279 0 0 0
-1280 0 0 0
-1281 0 0 0
-1282 0 0 0
-1283 0 0 0
-1284 0 0 0
-1285 0.00150754 -0.000503319 -0.000120824
-1286 0.00135739 -0.000659635 0.000104379
-1287 -0.000536707 1.87568e-05 0.000561635
-1288 -0.000849512 0.000706678 0.000519417
-1289 -0.0014802 -0.00134756 0.000146597
-1290 0.0007501 -5.89444e-05 -0.00110017
-1291 -0.00114399 0.000619447 -0.000642911
-1292 -0.0014568 0.00130737 -0.000685129
-1293 -0.00107352 0.000502591 0.00119617
-1294 0.00115678 -0.00135919 -5.05917e-05
-1295 3.2624e-05 0.00102467 -0.00127176
-1296 -0.000280181 -0.0014378 -0.00131398
-1297 0.00146958 0.00110328 -8.37372e-06
-1298 1.26539e-05 -0.000671654 -0.000273827
-1299 0.00126895 6.73779e-06 0.000183429
-1300 -0.000887468 -0.000837114 0.000631867
-1301 -0.00050419 0.0015085 -0.000637224
-1302 0.000419333 0.00117849 0.000775749
-1303 -0.00147476 -0.00129351 0.001233
-1304 -0.000480789 0.00101303 -0.00146895
-1305 0.000732138 0.000490572 0.000817967
-1306 0.000581985 0.000334256 0.00104317
-1307 -0.00131211 0.00101265 0.00150043
-1308 0.00152548 -0.00144982 0.00145821
-1309 0.00113882 -0.000809673 -0.00128285
-1310 0.000988663 -0.000965989 -0.00105765
-1311 -0.00090543 -0.000287598 -0.000600391
-1312 -0.00121823 0.000400324 -0.000642609
-1313 0.00130147 0.00149648 -0.00101543
-1314 0.000381377 -0.000365299 0.000888199
-1315 -0.00151272 0.000313092 0.00134545
-1316 0.00132487 0.00100101 0.00130324
-1317 0 0 0
-1318 0 0 0
-1319 0 0 0
-1320 0 0 0
-1321 0 0 0
-1322 0 0 0
-1323 0 0 0
-1324 0 0 0
-1325 -0.00141159 -0.00125179 -9.1168e-05
-1326 0.00151293 -0.00124325 -0.00149126
-1327 -0.00107538 0.000715217 -0.000880676
-1328 -0.000693967 0.000123066 -0.00107622
-1329 0.00113152 -0.000651095 -0.00129571
-1330 0.000905645 -0.000642556 0.000454585
-1331 -0.000912731 -0.00012902 -0.000613255
-1332 -0.00130125 0.000723756 0.000869623
-1333 0.00153819 0.00119905 -0.000246138
-1334 0.00131232 0.00120759 0.00150416
-1335 -0.000506052 -0.00142926 0.00043632
-1336 -0.000894575 -0.000576488 -0.00123119
-1337 -0.00144954 0.000354814 2.12821e-05
-1338 0.000168199 -0.00125527 0.00128093
-1339 0.000730276 0.000703198 -0.00125888
-1340 -0.000731923 -0.00142073 -0.000963772
-1341 -0.00104287 -0.000945431 0.00107086
-1342 0.000574877 0.000594881 -0.00081989
-1343 0.00113695 -0.000597047 -0.000209306
-1344 -0.000325244 0.000429421 8.58033e-05
-1345 0.000193462 0.00118703 -0.000624344
-1346 0.00073753 -0.000249356 -0.00055247
-1347 0.00129961 -0.00144128 5.81149e-05
-1348 -0.00146937 0.00111696 -0.000137432
-1349 0.00060014 -0.000113213 0.000425232
-1350 0.00114421 -0.0015496 0.000497106
-1351 -0.00144411 0.000408863 0.00110769
-1352 -0.00106269 -0.000183288 0.000912144
-1353 0.000762793 -0.00095745 0.000692652
-1354 0.000536922 -0.000948911 -0.00070744
-1355 0.001099 0.00100955 -9.68554e-05
-1356 0.00148041 0.000417402 -0.000292402
-1357 0 0 0
-1358 0 0 0
-1359 0 0 0
-1360 0 0 0
-1361 0 0 0
-1362 0 0 0
-1363 0 0 0
-1364 0 0 0
-1365 0.00120013 -0.000555325 -0.00153348
-1366 0.000974255 -0.000546786 0.000216821
-1367 0.00153633 0.00141168 0.000827405
-1368 -0.00123264 0.000819527 0.000631859
-1369 0.000592839 4.53651e-05 0.000412367
-1370 0.000366968 5.39043e-05 -0.000987725
-1371 -0.00145141 0.000567441 0.00109483
-1372 0.00131046 0.00142022 -0.000572687
-1373 0.000999518 -0.00125488 0.00146194
-1374 0.000773647 -0.00124634 6.18505e-05
-1375 -0.00104473 -0.000732804 -0.00100599
-1376 -0.00143325 0.000119972 0.000476889
-1377 0.00116217 0.00105127 -0.00142103
-1378 -0.000370477 -0.000558805 -0.000161384
-1379 0.0001916 0.00139966 0.0004492
-1380 -0.0012706 -0.000724265 0.000744309
-1381 -0.00158154 -0.00024897 -0.000371453
-1382 3.62014e-05 0.00129134 0.000888191
-1383 0.00136822 -0.00134551 -0.00017965
-1384 -0.00086392 0.00112588 -0.00135651
-1385 -0.000345214 -0.0012669 0.00108374
-1386 0.000198854 0.000447104 0.00115561
-1387 0.000760931 -0.000744823 -0.0013842
-1388 0.00114235 -0.00133697 -0.00157974
-1389 0.000831403 -0.00086168 0.000454888
-1390 0.000605532 -0.00085314 -0.000945205
-1391 0.00116761 0.00110532 -0.00033462
-1392 0.00154903 0.000513172 -0.000530167
-1393 0.000224117 -0.000260989 -0.000749658
-1394 -1.75442e-06 -0.00025245 0.00100064
-1395 0.00133026 0.000261086 -6.71996e-05
-1396 0.000941738 0.00111386 0.00141568
-1397 0 0 0
-1398 0 0 0
-1399 0 0 0
-1400 0 0 0
-1401 0 0 0
-1402 0 0 0
-1403 0 0 0
-1404 0 0 0
-1405 4.88942e-05 0.000392836 -0.000469381
-1406 0.000435579 0.000149675 -0.00122549
-1407 0.0003851 -0.000790552 -0.00125889
-1408 0.00137907 0.00151599 -0.000810451
-1409 -0.000558392 0.000993526 0.00147646
-1410 -0.000171708 0.000750365 0.000720356
-1411 0.000547753 0.0015156 -0.000991468
-1412 0.000771785 -0.00103371 0.00113539
-1413 -0.000151714 -0.000306719 -0.000624351
-1414 0.000234971 -0.00054988 -0.00138046
-1415 0.000954431 0.000215357 5.8107e-05
-1416 0.00117846 0.000816433 -0.000965422
-1417 1.09384e-05 -0.00115096 -0.000356931
-1418 -0.000909153 0.000137656 0.0015467
-1419 -0.000189693 0.000902892 -0.000165128
-1420 0.00134112 -2.78046e-05 -0.000698001
-1421 0.000417617 0.000699191 0.000692644
-1422 -0.000502475 -0.00116259 -0.000554119
-1423 0.000216985 -0.000397352 0.000884447
-1424 -0.0014026 -0.00132805 0.000351574
-1425 -0.000726507 0.00138673 0.000469409
-1426 -0.000339822 0.00114356 -0.000286699
-1427 -0.000390301 0.000203338 -0.000320098
-1428 0.00060367 -0.000640514 0.000128339
-1429 -0.000319829 8.64815e-05 0.00151898
-1430 6.68562e-05 -0.00015668 0.000762876
-1431 1.63775e-05 -0.00109691 0.000729477
-1432 0.00101035 0.00120963 0.00117791
-1433 -0.000927115 0.000687172 0.000314439
-1434 -0.00054043 0.00044401 -0.000441669
-1435 0.00017903 0.00120925 0.000996897
-1436 0.000403062 -0.00134007 -2.66312e-05
-1437 0 0 0
-1438 0 0 0
-1439 0 0 0
-1440 0 0 0
diff --git a/examples/USER/atc/bar1d_two_temperature/Ar_ttm.mat b/examples/USER/atc/bar1d_two_temperature/Ar_ttm.mat
deleted file mode 100644
index 179e2e7d9..000000000
--- a/examples/USER/atc/bar1d_two_temperature/Ar_ttm.mat
+++ /dev/null
@@ -1,35 +0,0 @@
-material Ar
-heat_capacity constant
-capacity 0.000000063363
-end
-electron_heat_capacity constant
-capacity 0.000000063363
-end
-heat_flux linear
-conductivity 0.0000000030111
-end
-electron_heat_flux linear
-conductivity 0.0000000030111
-end
-electron_phonon_exchange linear
-coefficient 0.00000000001
-end
-end
-
-material Null
-heat_capacity constant
-capacity 1.0
-end
-electron_heat_capacity constant
-capacity 1.0
-end
-heat_flux linear
-conductivity 0.0
-end
-electron_heat_flux linear
-conductivity 0.0
-end
-electron_phonon_exchange linear
-coefficient 0.0
-end
-end
diff --git a/examples/USER/atc/bar1d_two_temperature/Cu_ttm.mat b/examples/USER/atc/bar1d_two_temperature/Cu_ttm.mat
deleted file mode 100644
index b52a839a8..000000000
--- a/examples/USER/atc/bar1d_two_temperature/Cu_ttm.mat
+++ /dev/null
@@ -1,17 +0,0 @@
-material Cu
-heat_capacity constant
-capacity 0.211977459280654
-end
-heat_flux linear
-conductivity 67.4479848
-end
-electron_heat_flux linear
-conductivity 441.362750535
-end
-electron_heat_capacity constant
-capacity 0.005817388689
-end
-electron_phonon_exchange linear
-coefficient 0.0156575679
-end
-end
diff --git a/examples/USER/atc/bar1d_two_temperature/bar1d_ttm.log b/examples/USER/atc/bar1d_two_temperature/bar1d_ttm.log
deleted file mode 100644
index 27f4d5d27..000000000
--- a/examples/USER/atc/bar1d_two_temperature/bar1d_ttm.log
+++ /dev/null
@@ -1,537 +0,0 @@
-LAMMPS (7 Jul 2009)
-# in this example the electron temperature on the left is ramped up in time
-# and held fixed on the right. the phonon temperature is free on the left
-# and fixed and consistent with the electron temperature on the right.
-# this mimics some simplified pumped system
-# also a volume source is added to mimic Joule heating
-
-#echo both
-
-# units
-units real
-atom_style atomic
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3,
-# where N = 4 for fcc,
-# s = 3.405 A (Wagner)
-# a = 5.25 A (Ashcroft & Mermin, p. 70)
-#if {restart}
-boundary f p p
-pair_style lj/cut 13.5
-read_data temp.init
- orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
- 1 by 1 by 1 processor grid
- 3456 atoms
- 3456 velocities
-#endif
-
-lattice fcc 5.405 origin 0.25 0.25 0.25
-Lattice spacing in x,y,z = 5.405 5.405 5.405
-region feRegion block -14 14 -3 3 -3 3
-region mdRegion block -12 12 -3 3 -3 3
-region mdInternal block -10 10 -3 3 -3 3
-
-# NOTE: don't define ghosts if they are outside the feRegion
-group internal region mdInternal
-2880 atoms in group internal
-group ghost subtract all internal
-576 atoms in group ghost
-
-# create atoms
-#if !{restart}
-#boundary f p p
-#create_box 1 mdRegion
-#create_atoms 1 region mdRegion
-#mass 1 39.95
-#pair_style lj/cut 13.5
-#pair_coeff 1 1 .238 3.405 13.5
-#velocity internal create 40 87287 mom yes loop geom
-#endif
-
-# timestep & neighboring
-timestep 5.0
-thermo 10
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc two_temperature Ar_ttm.mat
-
-# ID part keywords nx ny nz region
-fix_modify AtC fem create mesh 14 1 1 feRegion f p p
-
-# specify atom types for the atc fix
-#fix_modify AtC transfer internal type internal
-fix_modify AtC transfer boundary type ghost
-
-# fix initial temperatures
-#if !{restart}
-#velocity internal create 40 87287 mom yes loop geom
-#endif
-fix_modify AtC transfer initial temperature all 20
-fix_modify AtC transfer fix temperature all 20
-fix_modify AtC transfer initial electron_temperature all 20
-fix_modify AtC transfer fix electron_temperature all 20
-
-# equilibrate MD field with rescale
-fix_modify AtC extrinsic exchange off
-fix_modify AtC transfer thermal control rescale 10
-#if !{restart}
-#run 1000
-#endif
-
-# change thermostat
-fix_modify AtC extrinsic exchange on
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer unfix electron_temperature all
-# note does not handle "inf"s
-#fix_modify AtC mesh create_faceset bndy -8 8 inf inf inf inf
-fix_modify AtC mesh create_faceset bndy box -10 10 -10 10 -10 10
-fix_modify AtC transfer thermal control flux faceset bndy
-# .. this controls the time filtering ....
-#fix_modify AtC transfer filter scale 500.0
-
-# add nodesets & boundary temperature controls
-# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
-# NOTE create_nodeset doesn't handle "inf"
-fix_modify AtC mesh create_nodeset lbc -14.1 -13.9 -6 6 -6 6
-fix_modify AtC mesh create_nodeset rbc 13.9 14.1 -6 6 -6 6
-fix_modify AtC transfer fix electron_temperature lbc 40.
-fix_modify AtC transfer fix electron_temperature rbc 20.
-fix_modify AtC transfer fix temperature rbc 20.
-#fix_modify AtC transfer source electron_temperature all 0.0015
-fix_modify AtC transfer source electron_temperature all 9.50445e-11
-
-
-# output filename frequency [text output]
-fix_modify AtC transfer output bar1d_ttmFE 100 text
-
-# run transient to steady state
-thermo 10
-reset_timestep 0
-run 4000
-Memory usage per processor = 20.4457 Mbytes
-Step Temp E_pair E_mol TotEng Press
- 0 16.671491 -6505.7593 0 -6334.0647 -1236.2423
- 10 16.651705 -6505.5537 0 -6334.0628 -1236.063
- 20 16.530158 -6504.2726 0 -6334.0335 -1232.9374
- 30 16.484745 -6503.7602 0 -6333.9888 -1231.0691
- 40 16.543953 -6504.3215 0 -6333.9403 -1231.4891
- 50 16.594988 -6504.7418 0 -6333.835 -1231.8556
- 60 16.569044 -6504.3689 0 -6333.7293 -1230.7731
- 70 16.505629 -6503.6163 0 -6333.6298 -1229.1909
- 80 16.499955 -6503.4447 0 -6333.5166 -1229.1002
- 90 16.523227 -6503.6042 0 -6333.4365 -1229.6937
- 100 16.508157 -6503.3717 0 -6333.3591 -1229.2842
- 110 16.515733 -6503.374 0 -6333.2834 -1229.1993
- 120 16.568236 -6503.8632 0 -6333.2319 -1230.0834
- 130 16.554884 -6503.675 0 -6333.1812 -1229.6144
- 140 16.473429 -6502.736 0 -6333.0811 -1227.7486
- 150 16.469794 -6502.5514 0 -6332.934 -1227.607
- 160 16.579831 -6503.5343 0 -6332.7836 -1229.6567
- 170 16.624378 -6503.8396 0 -6332.6301 -1229.6114
- 180 16.501732 -6502.377 0 -6332.4306 -1225.3556
- 190 16.388366 -6500.9672 0 -6332.1884 -1221.4971
- 200 16.484582 -6501.7504 0 -6331.9806 -1223.1577
- 210 16.699214 -6503.7792 0 -6331.799 -1228.2052
- 220 16.791874 -6504.548 0 -6331.6136 -1230.5561
- 230 16.748075 -6503.9202 0 -6331.4368 -1229.213
- 240 16.665833 -6502.8491 0 -6331.2127 -1226.4072
- 250 16.621232 -6502.1717 0 -6330.9946 -1224.5041
- 260 16.658091 -6502.3535 0 -6330.7969 -1224.89
- 270 16.739152 -6502.9658 0 -6330.5744 -1226.6051
- 280 16.804835 -6503.4492 0 -6330.3813 -1227.9296
- 290 16.798717 -6503.126 0 -6330.121 -1227.0917
- 300 16.696278 -6501.8014 0 -6329.8514 -1223.5739
- 310 16.591095 -6500.3987 0 -6329.532 -1219.6969
- 320 16.562079 -6499.7687 0 -6329.2009 -1217.6605
- 330 16.629333 -6500.1646 0 -6328.9041 -1218.1376
- 340 16.735568 -6500.9667 0 -6328.6121 -1219.8673
- 350 16.848974 -6501.8919 0 -6328.3694 -1222.1931
- 360 16.98713 -6503.0922 0 -6328.1469 -1225.3572
- 370 17.06977 -6503.7257 0 -6327.9293 -1227.2193
- 380 16.971691 -6502.4327 0 -6327.6463 -1224.4904
- 390 16.743361 -6499.7176 0 -6327.2828 -1218.0682
- 400 16.574649 -6497.518 0 -6326.8207 -1212.3628
- 410 16.56711 -6496.9847 0 -6326.3651 -1210.1976
- 420 16.671542 -6497.6307 0 -6325.9355 -1210.9062
- 430 16.808348 -6498.617 0 -6325.5129 -1212.8599
- 440 16.918663 -6499.3855 0 -6325.1453 -1214.7492
- 450 16.998348 -6499.8258 0 -6324.7649 -1216.1894
- 460 17.101907 -6500.4972 0 -6324.3698 -1217.98
- 470 17.199306 -6501.0962 0 -6323.9657 -1219.0689
- 480 17.133501 -6500.0357 0 -6323.5829 -1216.0406
- 490 16.939851 -6497.6902 0 -6323.2317 -1210.2749
- 500 16.919105 -6497.0735 0 -6322.8287 -1209.1143
- 510 17.178498 -6499.3244 0 -6322.4083 -1215.1868
- 520 17.48021 -6502.0287 0 -6322.0053 -1222.3728
- 530 17.559531 -6502.438 0 -6321.5977 -1223.4739
- 540 17.38932 -6500.2923 0 -6321.2049 -1217.4934
- 550 17.142234 -6497.3094 0 -6320.7667 -1209.0997
- 560 17.01647 -6495.5092 0 -6320.2617 -1204.0898
- 570 17.150938 -6496.3914 0 -6319.7591 -1206.2366
- 580 17.393162 -6498.4183 0 -6319.2914 -1211.65
- 590 17.504817 -6499.1265 0 -6318.8497 -1213.8141
- 600 17.500349 -6498.6418 0 -6318.411 -1212.1111
- 610 17.406024 -6497.2206 0 -6317.9612 -1207.3661
- 620 17.220843 -6494.8037 0 -6317.4514 -1200.5909
- 630 17.102363 -6493.032 0 -6316.8999 -1196.203
- 640 17.148333 -6492.9097 0 -6316.3042 -1196.5894
- 650 17.311596 -6493.9994 0 -6315.7125 -1200.1099
- 660 17.48294 -6495.2118 0 -6315.1602 -1203.3122
- 670 17.519633 -6495.0681 0 -6314.6387 -1202.4983
- 680 17.457125 -6493.9797 0 -6314.194 -1198.8656
- 690 17.470863 -6493.6507 0 -6313.7235 -1197.0165
- 700 17.576148 -6494.2454 0 -6313.2339 -1197.8281
- 710 17.697902 -6495.025 0 -6312.7596 -1199.4344
- 720 17.743065 -6494.9543 0 -6312.2238 -1199.2455
- 730 17.699788 -6493.9456 0 -6311.6608 -1196.7949
- 740 17.627877 -6492.6298 0 -6311.0856 -1193.4101
- 750 17.550154 -6491.244 0 -6310.5002 -1189.7954
- 760 17.539095 -6490.5769 0 -6309.947 -1187.8995
- 770 17.673363 -6491.4351 0 -6309.4225 -1189.7523
- 780 17.882147 -6493.062 0 -6308.8991 -1193.7188
- 790 18.00966 -6493.8707 0 -6308.3947 -1195.8005
- 800 17.980583 -6493.0714 0 -6307.8948 -1193.6851
- 810 17.825824 -6490.9588 0 -6307.376 -1188.1017
- 820 17.692317 -6489.0401 0 -6306.8322 -1183.0295
- 830 17.710419 -6488.6573 0 -6306.2631 -1181.9387
- 840 17.808262 -6489.0855 0 -6305.6836 -1183.0468
- 850 17.829578 -6488.7143 0 -6305.0928 -1182.1899
- 860 17.771342 -6487.5008 0 -6304.4791 -1179.1217
- 870 17.820295 -6487.3695 0 -6303.8436 -1178.575
- 880 18.063537 -6489.2637 0 -6303.2327 -1183.0663
- 890 18.369284 -6491.8496 0 -6302.6699 -1189.4275
- 900 18.525872 -6492.9961 0 -6302.2037 -1192.342
- 910 18.472235 -6492.0343 0 -6301.7943 -1190.0811
- 920 18.372321 -6490.5617 0 -6301.3507 -1186.1654
- 930 18.288123 -6489.2163 0 -6300.8724 -1181.9829
- 940 18.096622 -6486.6631 0 -6300.2914 -1174.8569
- 950 17.882153 -6483.7861 0 -6299.6232 -1167.0973
- 960 17.867323 -6482.9268 0 -6298.9166 -1164.4853
- 970 18.09915 -6484.6345 0 -6298.2368 -1168.6545
- 980 18.443545 -6487.5728 0 -6297.6283 -1176.2602
- 990 18.703733 -6489.7042 0 -6297.0801 -1181.8804
- 1000 18.753218 -6489.6818 0 -6296.548 -1181.8673
- 1010 18.610779 -6487.6703 0 -6296.0035 -1176.534
- 1020 18.39336 -6484.8445 0 -6295.4168 -1168.9352
- 1030 18.247821 -6482.6945 0 -6294.7657 -1162.956
- 1040 18.27653 -6482.3647 0 -6294.1402 -1161.3767
- 1050 18.418106 -6483.2621 0 -6293.5796 -1163.05
- 1060 18.573973 -6484.3115 0 -6293.0237 -1165.571
- 1070 18.664801 -6484.6987 0 -6292.4755 -1166.7949
- 1080 18.621552 -6483.6737 0 -6291.896 -1164.8778
- 1090 18.53927 -6482.1938 0 -6291.2635 -1161.868
- 1100 18.568833 -6481.8649 0 -6290.6301 -1161.2524
- 1110 18.683765 -6482.4291 0 -6290.0106 -1162.4768
- 1120 18.808147 -6483.0831 0 -6289.3837 -1163.5972
- 1130 18.884946 -6483.3252 0 -6288.8348 -1163.2843
- 1140 18.846682 -6482.3961 0 -6288.2998 -1160.2541
- 1150 18.748976 -6480.8337 0 -6287.7436 -1156.1965
- 1160 18.759994 -6480.3843 0 -6287.1808 -1155.1103
- 1170 18.901967 -6481.2895 0 -6286.6238 -1157.2721
- 1180 19.011261 -6481.9017 0 -6286.1104 -1158.6901
- 1190 19.040255 -6481.7192 0 -6285.6293 -1158.1377
- 1200 19.106103 -6481.8954 0 -6285.1274 -1158.289
- 1210 19.229265 -6482.6335 0 -6284.5971 -1159.6899
- 1220 19.239111 -6482.1951 0 -6284.0573 -1158.6039
- 1230 19.157688 -6480.7877 0 -6283.4884 -1155.4514
- 1240 19.174743 -6480.4215 0 -6282.9466 -1154.4926
- 1250 19.286153 -6481.0811 0 -6282.4589 -1155.5921
- 1260 19.320062 -6480.9602 0 -6281.9887 -1154.5954
- 1270 19.190466 -6479.1585 0 -6281.5217 -1149.413
- 1280 18.995019 -6476.6109 0 -6280.9869 -1142.6018
- 1290 18.914422 -6475.1574 0 -6280.3635 -1138.9829
- 1300 19.050226 -6475.8748 0 -6279.6823 -1141.1071
- 1310 19.272645 -6477.5322 0 -6279.049 -1145.5684
- 1320 19.357581 -6477.7617 0 -6278.4038 -1146.3936
- 1330 19.266387 -6476.2235 0 -6277.8047 -1142.4125
- 1340 19.168211 -6474.5602 0 -6277.1526 -1137.831
- 1350 19.257232 -6474.8149 0 -6276.4904 -1137.9089
- 1360 19.550412 -6477.2011 0 -6275.8573 -1143.4638
- 1370 19.796833 -6479.1494 0 -6275.2678 -1148.551
- 1380 19.7815 -6478.4409 0 -6274.7172 -1147.5698
- 1390 19.631575 -6476.3413 0 -6274.1616 -1142.7018
- 1400 19.521048 -6474.5989 0 -6273.5575 -1138.0212
- 1410 19.519644 -6473.9613 0 -6272.9343 -1135.7628
- 1420 19.608168 -6474.2556 0 -6272.317 -1136.0104
- 1430 19.764525 -6475.2719 0 -6271.723 -1138.215
- 1440 19.912587 -6476.2047 0 -6271.131 -1140.1734
- 1450 19.913759 -6475.6003 0 -6270.5145 -1138.3693
- 1460 19.79157 -6473.6952 0 -6269.8678 -1133.2856
- 1470 19.714636 -6472.2575 0 -6269.2224 -1129.0564
- 1480 19.737365 -6471.846 0 -6268.5768 -1127.3107
- 1490 19.766194 -6471.5403 0 -6267.9742 -1126.1998
- 1500 19.7696 -6470.9664 0 -6267.3653 -1124.9092
- 1510 19.827695 -6470.9018 0 -6266.7023 -1124.9431
- 1520 19.944447 -6471.4439 0 -6266.042 -1126.1254
- 1530 19.973951 -6471.1382 0 -6265.4325 -1125.053
- 1540 19.886531 -6469.6311 0 -6264.8257 -1121.0356
- 1550 19.818466 -6468.3255 0 -6264.221 -1117.3869
- 1560 19.839194 -6467.8989 0 -6263.5811 -1115.9427
- 1570 19.921311 -6468.101 0 -6262.9374 -1116.1766
- 1580 20.015732 -6468.4487 0 -6262.3127 -1116.9107
- 1590 20.110315 -6468.7904 0 -6261.6803 -1117.8602
- 1600 20.264876 -6469.7349 0 -6261.0331 -1120.2718
- 1610 20.380324 -6470.3096 0 -6260.4188 -1121.7548
- 1620 20.322098 -6469.1089 0 -6259.8178 -1119.0178
- 1630 20.232717 -6467.5453 0 -6259.1747 -1115.1644
- 1640 20.313706 -6467.7411 0 -6258.5363 -1115.2943
- 1650 20.575967 -6469.8346 0 -6257.9289 -1120.0993
- 1660 20.793996 -6471.5219 0 -6257.3708 -1124.1915
- 1670 20.736006 -6470.3925 0 -6256.8386 -1121.5447
- 1680 20.444958 -6466.8331 0 -6256.2767 -1112.7298
- 1690 20.22674 -6463.9901 0 -6255.681 -1105.0268
- 1700 20.274891 -6463.902 0 -6255.097 -1103.5997
- 1710 20.45142 -6465.094 0 -6254.471 -1105.8914
- 1720 20.56919 -6465.7092 0 -6253.8733 -1107.7881
- 1730 20.641711 -6465.8219 0 -6253.2392 -1108.9745
- 1740 20.728211 -6466.1028 0 -6252.6292 -1110.0176
- 1750 20.722246 -6465.3722 0 -6251.96 -1107.879
- 1760 20.538713 -6462.7849 0 -6251.2629 -1100.8039
- 1770 20.35658 -6460.178 0 -6250.5317 -1093.4872
- 1780 20.411269 -6460.0611 0 -6249.8516 -1092.0689
- 1790 20.661313 -6461.9598 0 -6249.1752 -1096.0711
- 1800 20.95287 -6464.3187 0 -6248.5314 -1101.9506
- 1810 21.25238 -6466.7902 0 -6247.9183 -1108.1806
- 1820 21.413306 -6467.889 0 -6247.3598 -1110.7541
- 1830 21.265567 -6465.8163 0 -6246.8086 -1105.462
- 1840 20.904899 -6461.4789 0 -6246.1856 -1094.6349
- 1850 20.604956 -6457.7007 0 -6245.4965 -1085.2083
- 1860 20.577858 -6456.6395 0 -6244.7144 -1082.4955
- 1870 20.79238 -6458.0326 0 -6243.8981 -1085.8989
- 1880 21.103689 -6460.5343 0 -6243.1938 -1091.8916
- 1890 21.349681 -6462.4189 0 -6242.545 -1096.2855
- 1900 21.424808 -6462.6294 0 -6241.9818 -1096.4936
- 1910 21.349347 -6461.3082 0 -6241.4377 -1092.941
- 1920 21.18517 -6459.1076 0 -6240.928 -1087.3369
- 1930 21.036065 -6457.0235 0 -6240.3794 -1082.2115
- 1940 21.024255 -6456.3164 0 -6239.794 -1080.5427
- 1950 21.289969 -6458.4084 0 -6239.1495 -1085.3514
- 1960 21.667609 -6461.6896 0 -6238.5414 -1092.5154
- 1970 21.745842 -6461.9113 0 -6237.9574 -1092.2463
- 1980 21.479887 -6458.5535 0 -6237.3386 -1083.5811
- 1990 21.293202 -6456.0149 0 -6236.7226 -1076.7027
- 2000 21.279875 -6455.261 0 -6236.106 -1074.3201
- 2010 21.209986 -6453.9211 0 -6235.4858 -1071.2596
- 2020 21.123158 -6452.3385 0 -6234.7975 -1068.0754
- 2030 21.231892 -6452.7558 0 -6234.0949 -1069.5067
- 2040 21.508927 -6454.8747 0 -6233.3608 -1074.7487
- 2050 21.689676 -6456.0738 0 -6232.6984 -1077.5956
- 2060 21.647006 -6455.0083 0 -6232.0723 -1075.0067
- 2070 21.595825 -6453.8924 0 -6231.4835 -1072.0624
- 2080 21.722464 -6454.6421 0 -6230.929 -1073.3487
- 2090 21.936202 -6456.321 0 -6230.4066 -1076.6812
- 2100 21.94343 -6455.8658 0 -6229.877 -1075.0841
- 2110 21.710389 -6452.8983 0 -6229.3096 -1067.7357
- 2120 21.539354 -6450.4365 0 -6228.6092 -1061.8052
- 2130 21.625914 -6450.5981 0 -6227.8793 -1062.4766
- 2140 21.960668 -6453.3298 0 -6227.1635 -1069.5494
- 2150 22.310957 -6456.2864 0 -6226.5125 -1077.1038
- 2160 22.442785 -6457.0871 0 -6225.9556 -1078.9487
- 2170 22.307481 -6455.1658 0 -6225.4278 -1073.5529
- 2180 22.01895 -6451.6169 0 -6224.8504 -1063.9995
- 2190 21.809231 -6448.8289 0 -6224.2222 -1056.4997
- 2200 21.834738 -6448.4131 0 -6223.5437 -1055.247
- 2210 22.053404 -6449.9713 0 -6222.8499 -1059.0126
- 2220 22.211871 -6450.9665 0 -6222.2131 -1061.1631
- 2230 22.136256 -6449.519 0 -6221.5444 -1057.005
- 2240 21.95616 -6446.9579 0 -6220.838 -1049.819
- 2250 21.923576 -6445.8406 0 -6220.0563 -1046.3662
- 2260 22.155568 -6447.4761 0 -6219.3026 -1050.0877
- 2270 22.472144 -6450.0957 0 -6218.6619 -1056.7086
- 2280 22.625353 -6451.0829 0 -6218.0712 -1059.4587
- 2290 22.542977 -6449.6972 0 -6217.5338 -1055.8674
- 2300 22.353808 -6447.0998 0 -6216.8847 -1048.8464
- 2310 22.199672 -6444.8501 0 -6216.2224 -1042.6858
- 2320 22.168149 -6443.8627 0 -6215.5596 -1040.2713
- 2330 22.326947 -6444.8459 0 -6214.9074 -1043.2191
- 2340 22.619445 -6447.2547 0 -6214.3038 -1049.6256
- 2350 22.841953 -6448.9708 0 -6213.7284 -1054.0085
- 2360 22.832357 -6448.29 0 -6213.1464 -1052.3278
- 2370 22.676181 -6446.0942 0 -6212.559 -1046.8884
- 2380 22.573679 -6444.4435 0 -6211.964 -1042.7352
- 2390 22.582663 -6443.8955 0 -6211.3234 -1041.3299
- 2400 22.653145 -6443.9587 0 -6210.6608 -1041.3709
- 2410 22.763485 -6444.4279 0 -6209.9936 -1042.0924
- 2420 22.873423 -6444.9515 0 -6209.385 -1042.6384
- 2430 22.906275 -6444.7449 0 -6208.8401 -1041.5096
- 2440 22.910306 -6444.2555 0 -6208.3092 -1039.9263
- 2450 23.026189 -6444.906 0 -6207.7662 -1040.9903
- 2460 23.150543 -6445.6549 0 -6207.2345 -1042.0974
- 2470 23.03306 -6443.8888 0 -6206.6783 -1037.2926
- 2480 22.842772 -6441.2953 0 -6206.0445 -1030.4331
- 2490 22.911334 -6441.3197 0 -6205.3627 -1029.7119
- 2500 23.153003 -6443.2121 0 -6204.7663 -1033.9009
- 2510 23.302474 -6444.2371 0 -6204.252 -1036.5887
- 2520 23.252259 -6443.2208 0 -6203.7528 -1034.4441
- 2530 23.053919 -6440.6493 0 -6203.2239 -1028.2518
- 2540 22.849407 -6437.9368 0 -6202.6177 -1021.2949
- 2550 22.71295 -6435.8556 0 -6201.9418 -1015.6613
- 2560 22.715354 -6435.146 0 -6201.2074 -1013.3958
- 2570 22.864096 -6435.9504 0 -6200.48 -1015.1761
- 2580 23.14749 -6438.1503 0 -6199.7612 -1020.6574
- 2590 23.497133 -6441.031 0 -6199.0411 -1027.6059
- 2600 23.697975 -6442.4482 0 -6198.3899 -1030.8199
- 2610 23.740349 -6442.2782 0 -6197.7835 -1030.0732
- 2620 23.75572 -6441.8591 0 -6197.206 -1028.6315
- 2630 23.699131 -6440.7117 0 -6196.6415 -1025.8508
- 2640 23.5571 -6438.6417 0 -6196.0342 -1021.2352
- 2650 23.389543 -6436.2703 0 -6195.3884 -1015.7993
- 2660 23.267974 -6434.3342 0 -6194.7043 -1011.0616
- 2670 23.287404 -6433.8493 0 -6194.0194 -1009.2211
- 2680 23.400854 -6434.3704 0 -6193.372 -1009.3078
- 2690 23.416634 -6433.8866 0 -6192.7257 -1007.2707
- 2700 23.427232 -6433.3541 0 -6192.0841 -1005.4693
- 2710 23.635545 -6434.8406 0 -6191.4252 -1008.7624
- 2720 24.010565 -6438.1027 0 -6190.8251 -1016.3862
- 2730 24.23397 -6439.8767 0 -6190.2984 -1020.4547
- 2740 24.078692 -6437.7148 0 -6189.7356 -1015.0876
- 2750 23.670633 -6432.8931 0 -6189.1164 -1003.3684
- 2760 23.373655 -6429.1855 0 -6188.4673 -994.51945
- 2770 23.482791 -6429.5982 0 -6187.756 -995.83147
- 2780 23.872126 -6432.9614 0 -6187.1096 -1004.3236
- 2790 24.162 -6435.438 0 -6186.6008 -1010.2907
- 2800 24.108594 -6434.4173 0 -6186.1301 -1007.1844
- 2810 23.814401 -6430.8633 0 -6185.606 -997.59405
- 2820 23.671042 -6428.7616 0 -6184.9807 -991.50142
- 2830 23.904253 -6430.4417 0 -6184.259 -994.88526
- 2840 24.222253 -6433.0419 0 -6183.5843 -1001.3792
- 2850 24.366623 -6433.9188 0 -6182.9743 -1004.2837
- 2860 24.357528 -6433.2663 0 -6182.4155 -1003.1189
- 2870 24.267904 -6431.8546 0 -6181.9268 -999.3335
- 2880 24.1373 -6429.9704 0 -6181.3876 -994.19805
- 2890 24.088236 -6428.8913 0 -6180.8138 -991.20406
- 2900 24.237479 -6429.859 0 -6180.2445 -993.58209
- 2910 24.537221 -6432.4491 0 -6179.7477 -1000.1557
- 2920 24.725978 -6433.9593 0 -6179.3139 -1004.2865
- 2930 24.666397 -6432.9221 0 -6178.8903 -1002.0287
- 2940 24.431333 -6430.0101 0 -6178.3992 -994.8963
- 2950 24.205387 -6427.1163 0 -6177.8323 -987.58777
- 2960 24.165998 -6426.0758 0 -6177.1974 -984.54957
- 2970 24.304869 -6426.8576 0 -6176.5491 -985.75023
- 2980 24.507852 -6428.3077 0 -6175.9087 -988.49496
- 2990 24.71811 -6429.8823 0 -6175.3179 -991.35348
- 3000 24.795515 -6430.196 0 -6174.8344 -991.38382
- 3010 24.684857 -6428.5861 0 -6174.3641 -987.38566
- 3020 24.566106 -6426.8412 0 -6173.8422 -983.14118
- 3030 24.5132 -6425.7553 0 -6173.3012 -980.29245
- 3040 24.445354 -6424.4783 0 -6172.7229 -977.31599
- 3050 24.449132 -6423.8964 0 -6172.1021 -976.31361
- 3060 24.574974 -6424.5399 0 -6171.4496 -978.26691
- 3070 24.694342 -6425.1325 0 -6170.8129 -979.70901
- 3080 24.649447 -6424.071 0 -6170.2138 -976.60226
- 3090 24.476494 -6421.6191 0 -6169.5431 -970.00913
- 3100 24.513281 -6421.3556 0 -6168.9007 -968.37295
- 3110 24.821876 -6423.9501 0 -6168.3171 -973.82404
- 3120 25.101656 -6426.3352 0 -6167.8208 -979.74497
- 3130 25.270758 -6427.6016 0 -6167.3457 -983.50283
- 3140 25.403423 -6428.5364 0 -6166.9142 -985.98587
- 3150 25.397638 -6428.0315 0 -6166.4689 -984.51906
- 3160 25.128712 -6424.8064 0 -6166.0133 -976.55331
- 3170 24.797216 -6420.8279 0 -6165.4489 -967.18014
- 3180 24.861755 -6420.8636 0 -6164.8199 -966.99651
- 3190 25.218012 -6423.92 0 -6164.2073 -973.58189
- 3200 25.337601 -6424.6054 0 -6163.6611 -974.78523
- 3210 25.107309 -6421.6886 0 -6163.1159 -967.83802
- 3220 24.898576 -6418.9494 0 -6162.5265 -961.26736
- 3230 24.956173 -6418.9898 0 -6161.9737 -960.87585
- 3240 25.076431 -6419.7207 0 -6161.4661 -962.14002
- 3250 25.08389 -6419.2993 0 -6160.9679 -960.88619
- 3260 25.079853 -6418.7103 0 -6160.4205 -959.28426
- 3270 25.215389 -6419.4987 0 -6159.813 -961.04963
- 3280 25.54459 -6422.342 0 -6159.2659 -967.73074
- 3290 25.87554 -6425.2881 0 -6158.8037 -974.74344
- 3300 25.903164 -6425.1578 0 -6158.3889 -974.55815
- 3310 25.680487 -6422.4196 0 -6157.944 -967.79715
- 3320 25.436459 -6419.4634 0 -6157.501 -959.93171
- 3330 25.271552 -6417.219 0 -6156.955 -953.99906
- 3340 25.346444 -6417.3919 0 -6156.3565 -954.0175
- 3350 25.587077 -6419.3 0 -6155.7864 -958.22206
- 3360 25.695996 -6419.8737 0 -6155.2383 -959.6718
- 3370 25.720883 -6419.6273 0 -6154.7357 -959.2484
- 3380 25.879074 -6420.7997 0 -6154.2789 -961.83955
- 3390 26.036918 -6421.9789 0 -6153.8325 -964.45572
- 3400 25.948629 -6420.6132 0 -6153.3761 -961.19626
- 3410 25.603577 -6416.4955 0 -6152.812 -951.49936
- 3420 25.277837 -6412.527 0 -6152.1982 -941.89472
- 3430 25.230926 -6411.4805 0 -6151.6348 -938.85197
- 3440 25.407463 -6412.7782 0 -6151.1144 -941.42569
- 3450 25.617358 -6414.4021 0 -6150.5766 -944.96905
- 3460 25.786076 -6415.5599 0 -6149.9968 -947.32234
- 3470 25.922851 -6416.4053 0 -6149.4336 -949.06813
- 3480 26.119347 -6417.8636 0 -6148.8683 -952.68886
- 3490 26.218974 -6418.4654 0 -6148.4441 -954.69743
- 3500 26.049233 -6416.2679 0 -6147.9947 -950.18839
- 3510 25.693394 -6412.0535 0 -6147.445 -940.43261
- 3520 25.499588 -6409.4156 0 -6146.803 -933.41544
- 3530 25.586974 -6409.6226 0 -6146.11 -932.74156
- 3540 25.860392 -6411.7931 0 -6145.4647 -937.15348
- 3550 26.188484 -6414.6069 0 -6144.8996 -943.87737
- 3560 26.461464 -6416.9396 0 -6144.421 -949.90349
- 3570 26.589315 -6417.8021 0 -6143.9668 -952.4457
- 3580 26.56993 -6417.1574 0 -6143.5217 -950.92142
- 3590 26.455909 -6415.5203 0 -6143.0589 -946.16358
- 3600 26.152282 -6411.8875 0 -6142.5531 -936.37401
- 3610 25.775567 -6407.352 0 -6141.8973 -924.87198
- 3620 25.668894 -6405.556 0 -6141.1997 -920.34854
- 3630 25.978149 -6408.0811 0 -6140.5399 -926.56734
- 3640 26.564553 -6413.4864 0 -6139.9061 -939.48639
- 3650 26.909124 -6416.5404 0 -6139.4115 -946.37805
- 3660 26.724717 -6414.1574 0 -6138.9276 -940.42555
- 3670 26.422189 -6410.5082 0 -6138.394 -931.50617
- 3680 26.398635 -6409.7042 0 -6137.8326 -929.4103
- 3690 26.570748 -6410.9307 0 -6137.2866 -932.34441
- 3700 26.651417 -6411.2063 0 -6136.7314 -933.36511
- 3710 26.589807 -6410.0585 0 -6136.2181 -931.02997
- 3720 26.533858 -6408.9543 0 -6135.6901 -928.38574
- 3730 26.50668 -6408.1736 0 -6135.1892 -925.86436
- 3740 26.46159 -6407.1775 0 -6134.6575 -922.39462
- 3750 26.396595 -6405.9681 0 -6134.1175 -918.45094
- 3760 26.440196 -6405.8064 0 -6133.5068 -917.56053
- 3770 26.743112 -6408.2451 0 -6132.8259 -923.15375
- 3780 27.038748 -6410.6332 0 -6132.1693 -928.92314
- 3790 27.002397 -6409.6317 0 -6131.5421 -927.11925
- 3800 26.812667 -6407.1061 0 -6130.9705 -921.57646
- 3810 26.751391 -6405.9331 0 -6130.4286 -918.81768
- 3820 26.79566 -6405.8688 0 -6129.9083 -918.41904
- 3830 26.818814 -6405.6095 0 -6129.4106 -917.33046
- 3840 26.779516 -6404.6176 0 -6128.8234 -914.63692
- 3850 26.811121 -6404.3106 0 -6128.1909 -913.56294
- 3860 26.8958 -6404.519 0 -6127.5273 -913.78855
- 3870 26.921326 -6404.1181 0 -6126.8635 -912.87443
- 3880 27.099964 -6405.3939 0 -6126.2995 -915.28328
- 3890 27.27787 -6406.7453 0 -6125.8188 -917.59696
- 3900 27.219648 -6405.6017 0 -6125.2748 -914.50763
- 3910 27.105833 -6403.8204 0 -6124.6656 -910.07587
- 3920 27.116709 -6403.2885 0 -6124.0216 -908.42333
- 3930 27.081527 -6402.2517 0 -6123.3472 -905.89446
- 3940 26.932756 -6400.0687 0 -6122.6964 -901.1286
- 3950 26.930705 -6399.4167 0 -6122.0655 -899.88995
- 3960 27.236836 -6401.9835 0 -6121.4795 -905.52465
- 3970 27.502217 -6404.206 0 -6120.969 -910.18191
- 3980 27.430879 -6402.9045 0 -6120.4021 -907.21813
- 3990 27.280358 -6400.7263 0 -6119.7741 -902.29762
- 4000 27.27069 -6399.9508 0 -6119.0981 -900.12014
-Loop time of 344.483 on 1 procs for 4000 steps with 3456 atoms
-
-Pair time (%) = 115.899 (33.6442)
-Neigh time (%) = 49.9152 (14.4899)
-Comm time (%) = 1.06949 (0.310462)
-Outpt time (%) = 0.0676758 (0.0196456)
-Other time (%) = 177.532 (51.5358)
-
-Nlocal: 3456 ave 3456 max 3456 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 12768 ave 12768 max 12768 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 1.0891e+06 ave 1.0891e+06 max 1.0891e+06 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 2.1782e+06 ave 2.1782e+06 max 2.1782e+06 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 2178196
-Ave neighs/atom = 630.265
-Neighbor list builds = 400
-Dangerous builds = 0
diff --git a/examples/USER/atc/bar1d_two_temperature/gaussianIC_ttm.log b/examples/USER/atc/bar1d_two_temperature/gaussianIC_ttm.log
deleted file mode 100644
index 37ea02ca3..000000000
--- a/examples/USER/atc/bar1d_two_temperature/gaussianIC_ttm.log
+++ /dev/null
@@ -1,168 +0,0 @@
-LAMMPS (7 Jul 2009)
-#AtC Two temperature Coupling
-# DESCRIPTION:
-# full overlap of MD and FE regions w/ free ends & lateral periodic bcs
-# initial gaussian electron temperature profile and uniform phonon temperature
-# results in fast exchange followed by slower diffusion and finally relaxation
-# to equilibrium
-#
-echo both
-units real
-atom_style atomic
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3,
-# where N = 4 for fcc,
-# s = 3.405 A (Wagner)
-# a = 5.25 A (Ashcroft & Mermin, p. 70)
-# to create restart :
-# write_restart temp.bin
-# then : restart2data temp.bin temp.init
-#if {restart}
-boundary f p p
-pair_style lj/cut 13.5
-read_data temp.init
- orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
- 1 by 1 by 1 processor grid
- 3456 atoms
- 3456 velocities
-#endif
-
-lattice fcc 5.405 origin 0.25 0.25 0.25
-Lattice spacing in x,y,z = 5.405 5.405 5.405
-region feRegion block -10 10 -3 3 -3 3
-region mdRegion block -12 12 -3 3 -3 3
-region mdInternal block -10 10 -3 3 -3 3
-
-
-# create atoms, NOTE commented out for restart
-#if !{restart}
-#boundary f p p
-#create_box 1 mdRegion
-#create_atoms 1 region mdRegion
-#mass 1 39.95
-#pair_style lj/cut 13.5
-#pair_coeff 1 1 .238 3.405 13.5
-#velocity internal create 40 87287 mom yes loop geom
-#endif
-
-# specify interal/ghost atoms
-group internal region mdInternal
-2880 atoms in group internal
-# do not define ghosts if outside fe region
-#group ghost subtract all internal
-
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc two_temperature Ar_ttm.mat
-
-# ID part keywords nx ny nz region
-fix_modify AtC fem create mesh 10 1 1 feRegion f p p
-
-# specify atom types
-#fix_modify AtC transfer internal type internal
-
-# fix a temperature
-fix_modify AtC transfer fix temperature all 20.0
-fix_modify AtC transfer initial temperature all 20.0
-fix_modify AtC transfer initial electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
-fix_modify AtC transfer fix electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
-
-
-# turn on thermostat
-fix_modify AtC extrinsic exchange off
-fix_modify AtC transfer thermal control rescale 10
-
-# equilibrate MD field
-timestep 5.0
-#timestep 0.1
-thermo 10
-#if !{restart}
-#run 1000
-#endif
-
-# write restart file (for atoms)
-#if !{restart}
-#write_restart gaussianT0.dat
-#endif
-
-#output
-fix_modify AtC transfer output gaussianIC_ttmFE 10 text
-
-# change thermostat
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer unfix electron_temperature all
-fix_modify AtC transfer thermal control flux
-fix_modify AtC extrinsic exchange on
-fix_modify AtC extrinsic electron_integration explicit 10
-
-# run with FE
-thermo_style custom step temp pe f_AtC[2] f_AtC[4]
-reset_timestep 0
-run 400
-Memory usage per processor = 20.4457 Mbytes
-Step Temp PotEng AtC[2] AtC[4]
- 0 16.671491 -6505.7593 20 21.852118
- 10 16.677475 -6505.5427 20.002541 21.837728
- 20 16.576352 -6504.1927 19.867309 21.822847
- 30 16.543006 -6503.5347 19.829679 21.807329
- 40 16.606315 -6503.9098 19.948237 21.79227
- 50 16.657241 -6504.1495 20.063768 21.77819
- 60 16.632334 -6503.6282 20.043346 21.764516
- 70 16.575817 -6502.7756 19.922594 21.750359
- 80 16.582959 -6502.556 19.854482 21.735666
- 90 16.619481 -6502.6709 19.843443 21.720989
- 100 16.61416 -6502.3553 19.823604 21.706411
- 110 16.63 -6502.2515 19.868881 21.692096
- 120 16.693117 -6502.6546 19.982758 21.67865
- 130 16.690721 -6502.395 19.998489 21.665851
- 140 16.614049 -6501.3546 19.912824 21.652674
- 150 16.61038 -6501.0505 19.922441 21.639146
- 160 16.722799 -6501.9758 20.079964 21.626427
- 170 16.770602 -6502.2509 20.17121 21.614856
- 180 16.650892 -6500.7765 20.054544 21.603105
- 190 16.541447 -6499.381 19.906876 21.590204
- 200 16.645228 -6500.2039 19.964842 21.577132
- 210 16.869527 -6502.3001 20.162483 21.565509
- 220 16.964383 -6503.0601 20.257183 21.55523
- 230 16.911611 -6502.3326 20.238311 21.545157
- 240 16.817036 -6501.1565 20.182711 21.534754
- 250 16.768709 -6500.4545 20.137714 21.524032
- 260 16.815288 -6500.7352 20.15617 21.51338
- 270 16.910049 -6501.5019 20.224357 21.50326
- 280 16.977499 -6502.0383 20.29341 21.493767
- 290 16.956659 -6501.6276 20.291231 21.484565
- 300 16.835262 -6500.213 20.164202 21.474772
- 310 16.71985 -6498.8264 20.004642 21.463806
- 320 16.69098 -6498.3213 19.932827 21.452076
- 330 16.761703 -6498.8528 20.012407 21.440668
- 340 16.868998 -6499.7478 20.16924 21.430476
- 350 16.984511 -6500.7709 20.340112 21.421697
- 360 17.123542 -6502.0546 20.527447 21.414404
- 370 17.196695 -6502.6994 20.623027 21.408269
- 380 17.078535 -6501.3567 20.479029 21.401788
- 390 16.82808 -6498.6218 20.180491 21.393274
- 400 16.644633 -6496.5257 19.969187 21.382648
-Loop time of 38.0403 on 1 procs for 400 steps with 3456 atoms
-
-Pair time (%) = 11.5723 (30.4211)
-Neigh time (%) = 4.98386 (13.1015)
-Comm time (%) = 0.111562 (0.293273)
-Outpt time (%) = 0.00291038 (0.00765077)
-Other time (%) = 21.3697 (56.1764)
-
-Nlocal: 3456 ave 3456 max 3456 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 12768 ave 12768 max 12768 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 1.09177e+06 ave 1.09177e+06 max 1.09177e+06 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 2.18354e+06 ave 2.18354e+06 max 2.18354e+06 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 2183544
-Ave neighs/atom = 631.812
-Neighbor list builds = 40
-Dangerous builds = 0
diff --git a/examples/USER/atc/bar1d_two_temperature/in.bar1d_ttm b/examples/USER/atc/bar1d_two_temperature/in.bar1d_ttm
deleted file mode 100644
index 46ad394b2..000000000
--- a/examples/USER/atc/bar1d_two_temperature/in.bar1d_ttm
+++ /dev/null
@@ -1,105 +0,0 @@
-# in this example the electron temperature on the left is ramped up in time
-# and held fixed on the right. the phonon temperature is free on the left
-# and fixed and consistent with the electron temperature on the right.
-# this mimics some simplified pumped system
-# also a volume source is added to mimic Joule heating
-
-#echo both
-
-# units
-units real
-atom_style atomic
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3,
-# where N = 4 for fcc,
-# s = 3.405 A (Wagner)
-# a = 5.25 A (Ashcroft & Mermin, p. 70)
-#if {restart}
-boundary f p p
-pair_style lj/cut 13.5
-read_data temp.init
-#endif
-
-lattice fcc 5.405 origin 0.25 0.25 0.25
-region feRegion block -14 14 -3 3 -3 3
-region mdRegion block -12 12 -3 3 -3 3
-region mdInternal block -10 10 -3 3 -3 3
-
-# NOTE: don't define ghosts if they are outside the feRegion
-group internal region mdInternal
-group ghost subtract all internal
-
-# create atoms
-#if !{restart}
-#boundary f p p
-#create_box 1 mdRegion
-#create_atoms 1 region mdRegion
-#mass 1 39.95
-#pair_style lj/cut 13.5
-#pair_coeff 1 1 .238 3.405 13.5
-#velocity internal create 40 87287 mom yes loop geom
-#endif
-
-# timestep & neighboring
-timestep 5.0
-thermo 10
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc two_temperature Ar_ttm.mat
-
-# ID part keywords nx ny nz region
-fix_modify AtC fem create mesh 14 1 1 feRegion f p p
-
-# specify atom types for the atc fix
-#fix_modify AtC transfer internal type internal
-fix_modify AtC transfer boundary type ghost
-
-# fix initial temperatures
-#if !{restart}
-#velocity internal create 40 87287 mom yes loop geom
-#endif
-fix_modify AtC transfer initial temperature all 20
-fix_modify AtC transfer fix temperature all 20
-fix_modify AtC transfer initial electron_temperature all 20
-fix_modify AtC transfer fix electron_temperature all 20
-
-# equilibrate MD field with rescale
-fix_modify AtC extrinsic exchange off
-fix_modify AtC transfer thermal control rescale 10
-#if !{restart}
-#run 1000
-#endif
-
-# change thermostat
-fix_modify AtC extrinsic exchange on
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer unfix electron_temperature all
-# note does not handle "inf"s
-#fix_modify AtC mesh create_faceset bndy -8 8 inf inf inf inf
-fix_modify AtC mesh create_faceset bndy box -10 10 -10 10 -10 10
-fix_modify AtC transfer thermal control flux faceset bndy
-# .. this controls the time filtering ....
-#fix_modify AtC transfer filter scale 500.0
-
-# add nodesets & boundary temperature controls
-# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
-# NOTE create_nodeset doesn't handle "inf"
-fix_modify AtC mesh create_nodeset lbc -14.1 -13.9 -6 6 -6 6
-fix_modify AtC mesh create_nodeset rbc 13.9 14.1 -6 6 -6 6
-fix_modify AtC transfer fix electron_temperature lbc 40.
-fix_modify AtC transfer fix electron_temperature rbc 20.
-fix_modify AtC transfer fix temperature rbc 20.
-#fix_modify AtC transfer source electron_temperature all 0.0015
-fix_modify AtC transfer source electron_temperature all 9.50445e-11
-
-
-# output filename frequency [text output]
-fix_modify AtC transfer output bar1d_ttmFE 100 text
-
-# run transient to steady state
-thermo 10
-reset_timestep 0
-run 4000
diff --git a/examples/USER/atc/bar1d_two_temperature/in.gaussianIC_ttm b/examples/USER/atc/bar1d_two_temperature/in.gaussianIC_ttm
deleted file mode 100644
index 360952aa3..000000000
--- a/examples/USER/atc/bar1d_two_temperature/in.gaussianIC_ttm
+++ /dev/null
@@ -1,97 +0,0 @@
-#AtC Two temperature Coupling
-# DESCRIPTION:
-# full overlap of MD and FE regions w/ free ends & lateral periodic bcs
-# initial gaussian electron temperature profile and uniform phonon temperature
-# results in fast exchange followed by slower diffusion and finally relaxation
-# to equilibrium
-#
-echo both
-units real
-atom_style atomic
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3,
-# where N = 4 for fcc,
-# s = 3.405 A (Wagner)
-# a = 5.25 A (Ashcroft & Mermin, p. 70)
-# to create restart :
-# write_restart temp.bin
-# then : restart2data temp.bin temp.init
-#if {restart}
-boundary f p p
-pair_style lj/cut 13.5
-read_data temp.init
-#endif
-
-lattice fcc 5.405 origin 0.25 0.25 0.25
-region feRegion block -10 10 -3 3 -3 3
-region mdRegion block -12 12 -3 3 -3 3
-region mdInternal block -10 10 -3 3 -3 3
-
-
-# create atoms, NOTE commented out for restart
-#if !{restart}
-#boundary f p p
-#create_box 1 mdRegion
-#create_atoms 1 region mdRegion
-#mass 1 39.95
-#pair_style lj/cut 13.5
-#pair_coeff 1 1 .238 3.405 13.5
-#velocity internal create 40 87287 mom yes loop geom
-#endif
-
-# specify interal/ghost atoms
-group internal region mdInternal
-# do not define ghosts if outside fe region
-#group ghost subtract all internal
-
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc two_temperature Ar_ttm.mat
-
-# ID part keywords nx ny nz region
-fix_modify AtC fem create mesh 10 1 1 feRegion f p p
-
-# specify atom types
-#fix_modify AtC transfer internal type internal
-
-# fix a temperature
-fix_modify AtC transfer fix temperature all 20.0
-fix_modify AtC transfer initial temperature all 20.0
-fix_modify AtC transfer initial electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
-fix_modify AtC transfer fix electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
-
-
-# turn on thermostat
-fix_modify AtC extrinsic exchange off
-fix_modify AtC transfer thermal control rescale 10
-
-# equilibrate MD field
-timestep 5.0
-#timestep 0.1
-thermo 10
-#if !{restart}
-#run 1000
-#endif
-
-# write restart file (for atoms)
-#if !{restart}
-#write_restart gaussianT0.dat
-#endif
-
-#output
-fix_modify AtC transfer output gaussianIC_ttmFE 10 text
-
-# change thermostat
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer unfix electron_temperature all
-fix_modify AtC transfer thermal control flux
-fix_modify AtC extrinsic exchange on
-fix_modify AtC extrinsic electron_integration explicit 10
-
-# run with FE
-thermo_style custom step temp pe f_AtC[2] f_AtC[4]
-reset_timestep 0
-run 400
diff --git a/examples/USER/atc/bar1d_two_temperature/in.no_atoms b/examples/USER/atc/bar1d_two_temperature/in.no_atoms
deleted file mode 100644
index 9b10b7aba..000000000
--- a/examples/USER/atc/bar1d_two_temperature/in.no_atoms
+++ /dev/null
@@ -1,57 +0,0 @@
-#AtC Two temperature Coupling
-# DESCRIPTION:
-# no atoms and FE regions with periodic boundary conditions.
-# heating and then relaxation
-
-echo both
-#units real
-units metal
-
-atom_style atomic
-
-lattice fcc 5.405 origin 0.25 0.25 0.25
-region simRegion block -14 14 -3 3 -3 3
-region feRegion block -12 12 -3 3 -3 3
-
-# create atoms
-region mdRegion block -12 12 -3 3 -3 3
-boundary f p p
-create_box 1 mdRegion
-mass 1 39.95 # need to keep this
-
-# ID group atc PhysicsType ParameterFile
-fix AtC all atc two_temperature Cu_ttm.mat
-timestep 0.002
-thermo 20
-
-# ID part keywords nx ny nz region
-fix_modify AtC fem create mesh 12 1 1 feRegion f p p
-
-# fix a temperature
-fix_modify AtC transfer initial temperature all 20.0
-#fix_modify AtC transfer initial electron_temperature all 30.0
-fix_modify AtC transfer initial electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
-
-# relaxation
-thermo_style custom step cpu f_AtC[1] f_AtC[2] f_AtC[3] f_AtC[4]
-fix_modify AtC transfer output no_atomsFE 10 text
-#fix_modify AtC extrinsic electron_integration subcycle 100
-fix_modify AtC extrinsic electron_integration implicit
-run 400
-
-# heating
-fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -12 12 -12 12
-fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -12 12 -12 12
-fix_modify AtC transfer fix electron_temperature lbc 20.
-fix_modify AtC transfer fix electron_temperature rbc 20.
-#fix_modify AtC extrinsic exchange off
-#fix_modify AtC transfer fix temperature lbc 20.
-#fix_modify AtC transfer fix temperature rbc 20.
-#fix_modify AtC extrinsic electron_integration lockstep
-#fix_modify AtC transfer source electron_temperature all 1000.0
-fix_modify AtC transfer source electron_temperature all 0.521981
-run 400
-
-# relaxation
-fix_modify AtC transfer remove_source electron_temperature all
-run 400
diff --git a/examples/USER/atc/bar1d_two_temperature/in.uniform_exchange b/examples/USER/atc/bar1d_two_temperature/in.uniform_exchange
deleted file mode 100644
index 3e28a93d6..000000000
--- a/examples/USER/atc/bar1d_two_temperature/in.uniform_exchange
+++ /dev/null
@@ -1,67 +0,0 @@
-#AtC Two temperature Coupling
-# DESCRIPTION:
-# full overlap of MD and FE regions with full periodic boundary conditions.
-# initial electron and phonon temperatures are different and then allowed to
-# relax.
-#
-
-units real
-atom_style atomic
-boundary p p p
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3,
-# where N = 4 for fcc,
-# s = 3.405 A (Wagner)
-# a = 5.25 A (Ashcroft & Mermin, p. 70)
-lattice fcc 5.405 origin 0.25 0.25 0.25
-
-pair_style lj/cut 13.5
-
-read_data uniform_exchange_init.data
-
-region simRegion block -12 12 -3 3 -3 3
-region feRegion block -12 12 -3 3 -3 3
-
-# create atoms
-region mdRegion block -12 12 -3 3 -3 3
-
-# specify interal/ghost atoms
-region mdInternal block -12 12 -3 3 -3 3
-group internal region mdInternal
-
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc two_temperature Ar_ttm.mat
-
-# ID part keywords nx ny nz region
-fix_modify AtC fem create mesh 4 1 1 feRegion p p p
-
-# fix a temperature
-fix_modify AtC transfer fix temperature all 20.0
-fix_modify AtC transfer fix electron_temperature all 30.0
-
-timestep 5.0
-
-# output
-thermo_style custom step pe temp f_AtC[2] f_AtC[4]
-thermo 10
-
-# equilibrate MD field
-fix_modify AtC transfer thermal control rescale 13
-run 500
-
-# relax
-fix_modify AtC transfer output uniform_exchangeFE 100 text
-fix_modify AtC transfer atomic_output uniform_exchangeMD 10000
-fix_modify AtC transfer filter type exponential
-fix_modify AtC transfer filter scale 5.0e2
-fix_modify AtC transfer filter on
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer unfix electron_temperature all
-fix_modify AtC transfer thermal control flux
-
-# run with FE
-run 5000
diff --git a/examples/USER/atc/bar1d_two_temperature/in.uniform_heating b/examples/USER/atc/bar1d_two_temperature/in.uniform_heating
deleted file mode 100644
index 33143ef9f..000000000
--- a/examples/USER/atc/bar1d_two_temperature/in.uniform_heating
+++ /dev/null
@@ -1,74 +0,0 @@
-#AtC Thermal Coupling
-
-echo both
-units real
-atom_style atomic
-boundary f p p
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
-
-pair_style lj/cut 13.5
-
-read_data uniform_heating_init.data
-lattice fcc 5.405 origin 0.25 0.25 0.25
-
-region mdRegion block -8 8 -3 3 -3 3
-region mdInternal block -6 6 -3 3 -3 3
-
-group internal region mdInternal
-
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc two_temperature Ar_ttm.mat
-
-# ID part keywords nx ny nz region
-fix_modify AtC fem create mesh 6 1 1 mdInternal f p p
-
-# specify atom types
-#fix_modify AtC transfer internal type internal
-
-# fix a temperature
-fix_modify AtC transfer initial temperature all 20.
-fix_modify AtC transfer fix temperature all 20.
-fix_modify AtC transfer initial electron_temperature all 20.
-fix_modify AtC transfer fix electron_temperature all 20.
-
-# turn on thermostat
-fix_modify AtC transfer thermal control rescale 10
-
-# output
-thermo_style custom step cpu pe etotal temp f_AtC[1] f_AtC[2]
-thermo 100
-log uniform_heating.log
-
-# make thermo output the correct temperature by removing ghost dof
-# variable xdof equal 3*count(ghost)
-# compute_modify thermo_temp extra ${xdof}
-
-# equilibrate MD field
-timestep 5
-run 400
-
-# change thermostat
-fix_modify AtC transfer output uniform_heatingFE 100 text
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer thermal control flux
-
-# fix boundary
-fix_modify AtC mesh create_nodeset lbc -6.1 -5.9 -12 12 -12 12
-fix_modify AtC transfer fix temperature lbc 20.
-fix_modify AtC mesh create_nodeset rbc 5.9 6.1 -12 12 -12 12
-fix_modify AtC transfer fix temperature rbc 20.
-
-
-# add source
-fix_modify AtC transfer internal_quadrature on
-#fix_modify AtC transfer source temperature all 0.01
-fix_modify AtC transfer source temperature all 6.3363e-10
-
-# run with FE
-reset_timestep 0
-run 1000
diff --git a/examples/USER/atc/bar1d_two_temperature/no_atoms.log b/examples/USER/atc/bar1d_two_temperature/no_atoms.log
deleted file mode 100644
index 7fbc8d8db..000000000
--- a/examples/USER/atc/bar1d_two_temperature/no_atoms.log
+++ /dev/null
@@ -1,190 +0,0 @@
-LAMMPS (7 Jul 2009)
-#AtC Two temperature Coupling
-# DESCRIPTION:
-# no atoms and FE regions with periodic boundary conditions.
-# heating and then relaxation
-
-echo both
-#units real
-units metal
-
-atom_style atomic
-
-lattice fcc 5.405 origin 0.25 0.25 0.25
-Lattice spacing in x,y,z = 5.405 5.405 5.405
-region simRegion block -14 14 -3 3 -3 3
-region feRegion block -12 12 -3 3 -3 3
-
-# create atoms
-region mdRegion block -12 12 -3 3 -3 3
-boundary f p p
-create_box 1 mdRegion
-Created orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
- 1 by 1 by 1 processor grid
-mass 1 39.95 # need to keep this
-
-# ID group atc PhysicsType ParameterFile
-fix AtC all atc two_temperature Cu_ttm.mat
-timestep 0.002
-thermo 20
-
-# ID part keywords nx ny nz region
-fix_modify AtC fem create mesh 12 1 1 feRegion f p p
-
-# fix a temperature
-fix_modify AtC transfer initial temperature all 20.0
-#fix_modify AtC transfer initial electron_temperature all 30.0
-fix_modify AtC transfer initial electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
-
-# relaxation
-thermo_style custom step cpu f_AtC[1] f_AtC[2] f_AtC[3] f_AtC[4]
-fix_modify AtC transfer output no_atomsFE 10 text
-#fix_modify AtC extrinsic electron_integration subcycle 100
-fix_modify AtC extrinsic electron_integration implicit
-run 400
-Memory usage per processor = 0.412468 Mbytes
-Step CPU AtC[1] AtC[2] AtC[3] AtC[4]
- 0 0 59.94586 20 1.7847722 21.567177
- 20 0.46597385 59.95972 20.00454 1.770575 21.52456
- 40 0.93160486 59.97247 20.008795 1.7578608 21.370605
- 60 1.368351 59.983888 20.012606 1.7464745 21.232182
- 80 1.8008358 59.994113 20.016019 1.7362775 21.108216
- 100 2.2340729 60.00327 20.019076 1.7271457 20.997198
- 120 2.667372 60.01147 20.021814 1.7189676 20.897776
- 140 3.101615 60.018815 20.024266 1.7116438 20.808739
- 160 3.5347569 60.025391 20.026462 1.7050849 20.729002
- 180 3.9713268 60.031281 20.028429 1.6992111 20.657594
- 200 4.4060199 60.036556 20.030191 1.6939509 20.593644
- 220 4.8383729 60.04128 20.031768 1.6892401 20.536374
- 240 5.2700989 60.045511 20.033181 1.6850213 20.485086
- 260 5.702713 60.049299 20.034447 1.6812432 20.439154
- 280 6.1313 60.052692 20.035581 1.6778597 20.398021
- 300 6.552902 60.05573 20.036596 1.6748297 20.361184
- 320 6.978493 60.058451 20.037506 1.6721161 20.328194
- 340 7.3976619 60.060888 20.03832 1.6696859 20.298651
- 360 7.817637 60.063071 20.03905 1.6675096 20.272193
- 380 8.227901 60.065025 20.039703 1.6655606 20.248499
- 400 8.6359458 60.066775 20.040289 1.6638152 20.227279
-Loop time of 8.63894 on 1 procs for 400 steps with 0 atoms
-
-Pair time (%) = 0 (0)
-Neigh time (%) = 0 (0)
-Comm time (%) = 0.000214577 (0.00248383)
-Outpt time (%) = 0.0595214 (0.68899)
-Other time (%) = 8.5792 (99.3085)
-
-Nlocal: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 0
-Neighbor list builds = 0
-Dangerous builds = 0
-
-# heating
-fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -12 12 -12 12
-fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -12 12 -12 12
-fix_modify AtC transfer fix electron_temperature lbc 20.
-fix_modify AtC transfer fix electron_temperature rbc 20.
-#fix_modify AtC extrinsic exchange off
-#fix_modify AtC transfer fix temperature lbc 20.
-#fix_modify AtC transfer fix temperature rbc 20.
-#fix_modify AtC extrinsic electron_integration lockstep
-#fix_modify AtC transfer source electron_temperature all 1000.0
-fix_modify AtC transfer source electron_temperature all 0.521981
-run 400
-Memory usage per processor = 0.412468 Mbytes
-Step CPU AtC[1] AtC[2] AtC[3] AtC[4]
- 400 0 60.066775 20.040289 1.6638152 20.227279
- 420 0.46465707 60.074057 20.042563 1.7526734 21.206964
- 440 0.93380594 60.08642 20.046435 1.7697616 21.398727
- 460 1.4028659 60.099602 20.050578 1.7726213 21.43082
- 480 1.872489 60.112889 20.054768 1.7731138 21.436346
- 500 2.341527 60.126162 20.058968 1.7732124 21.437452
- 520 2.8146279 60.139402 20.063168 1.7732452 21.437821
- 540 3.2863479 60.152606 20.067367 1.773267 21.438066
- 560 3.7559209 60.165773 20.071564 1.7732869 21.438289
- 580 4.2253721 60.178904 20.075757 1.7733063 21.438507
- 600 4.696142 60.191997 20.079946 1.7733256 21.438723
- 620 5.164628 60.205055 20.084131 1.7733447 21.438937
- 640 5.633961 60.218075 20.08831 1.7733637 21.43915
- 660 6.1026099 60.23106 20.092484 1.7733825 21.439362
- 680 6.5716951 60.244008 20.096653 1.7734013 21.439572
- 700 7.0413561 60.256919 20.100815 1.7734199 21.439781
- 720 7.5101869 60.269795 20.10497 1.7734384 21.439989
- 740 7.9797149 60.282635 20.109119 1.7734568 21.440195
- 760 8.4487319 60.295439 20.11326 1.7734751 21.4404
- 780 8.9184639 60.308207 20.117395 1.7734932 21.440604
- 800 9.3883049 60.320939 20.121522 1.7735113 21.440807
-Loop time of 9.39129 on 1 procs for 400 steps with 0 atoms
-
-Pair time (%) = 0 (0)
-Neigh time (%) = 0 (0)
-Comm time (%) = 0.000202179 (0.00215284)
-Outpt time (%) = 0.0597332 (0.636049)
-Other time (%) = 9.33135 (99.3618)
-
-Nlocal: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 0
-Neighbor list builds = 0
-Dangerous builds = 0
-
-# relaxation
-fix_modify AtC transfer remove_source electron_temperature all
-run 400
-Memory usage per processor = 0.412468 Mbytes
-Step CPU AtC[1] AtC[2] AtC[3] AtC[4]
- 800 0 60.320939 20.121522 1.7735113 21.440807
- 820 0.46552801 60.326208 20.123317 1.6666305 20.24139
- 840 0.93443298 60.326191 20.123452 1.6491438 20.045155
- 860 1.4037609 60.325301 20.123302 1.6462322 20.012481
- 880 1.87309 60.324267 20.123096 1.6457454 20.007018
- 900 2.341542 60.323212 20.122873 1.6456621 20.006083
- 920 2.810395 60.322156 20.122641 1.6456459 20.005902
- 940 3.279598 60.321102 20.122402 1.645641 20.005846
- 960 3.7478158 60.320051 20.122158 1.645638 20.005813
- 980 4.21626 60.319003 20.121908 1.6456354 20.005783
- 1000 4.6847739 60.317957 20.121654 1.6456328 20.005754
- 1020 5.1538019 60.316914 20.121396 1.6456303 20.005726
- 1040 5.622643 60.315874 20.121135 1.6456279 20.005699
- 1060 6.0918579 60.314837 20.120871 1.6456255 20.005672
- 1080 6.561069 60.313803 20.120603 1.6456231 20.005645
- 1100 7.0291269 60.312771 20.120334 1.6456208 20.005619
- 1120 7.497472 60.311742 20.120061 1.6456185 20.005593
- 1140 7.9661739 60.310716 20.119787 1.6456162 20.005568
- 1160 8.4346058 60.309693 20.119511 1.645614 20.005543
- 1180 8.9034901 60.308673 20.119234 1.6456118 20.005519
- 1200 9.373548 60.307655 20.118954 1.6456097 20.005495
-Loop time of 9.37655 on 1 procs for 400 steps with 0 atoms
-
-Pair time (%) = 0 (0)
-Neigh time (%) = 0 (0)
-Comm time (%) = 0.000205755 (0.00219436)
-Outpt time (%) = 0.0598149 (0.637921)
-Other time (%) = 9.31653 (99.3599)
-
-Nlocal: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 0 ave 0 max 0 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 0
-Neighbor list builds = 0
-Dangerous builds = 0
diff --git a/examples/USER/atc/bar1d_two_temperature/temp.init b/examples/USER/atc/bar1d_two_temperature/temp.init
deleted file mode 100644
index 45eec7c96..000000000
--- a/examples/USER/atc/bar1d_two_temperature/temp.init
+++ /dev/null
@@ -1,6935 +0,0 @@
-LAMMPS data file from restart file: timestep = 1000, procs = 1
-
-3456 atoms
-
-1 atom types
-
--64.86 64.86 xlo xhi
--16.215 16.215 ylo yhi
--16.215 16.215 zlo zhi
-
-Masses
-
-1 39.95
-
-Pair Coeffs
-
-1 0.238 3.405
-
-Atoms
-
-1 1 -63.50875 -14.86375 -14.86375 0 0 0
-2 1 -60.80625 -12.16125 -14.86375 0 0 0
-3 1 -60.80625 -14.86375 -12.16125 0 0 0
-4 1 -63.50875 -12.16125 -12.16125 0 0 0
-5 1 -58.10375 -14.86375 -14.86375 0 0 0
-6 1 -55.40125 -12.16125 -14.86375 0 0 0
-7 1 -55.40125 -14.86375 -12.16125 0 0 0
-8 1 -58.10375 -12.16125 -12.16125 0 0 0
-9 1 -52.6882431683 -15.0292653969 -14.7711101576 0 0 0
-10 1 -49.9859690738 -12.2194498013 -15.066569253 0 0 0
-11 1 -49.9058690551 -14.8616600117 -12.225677753 0 0 0
-12 1 -52.7982268173 -12.2365163158 -12.3645268929 0 0 0
-13 1 -47.2789541291 -14.8350100098 -14.8793942736 0 0 0
-14 1 -44.6161936991 -12.2584517831 -15.1730980713 0 0 0
-15 1 -44.7566429615 -14.7064765091 -12.2408008559 0 0 0
-16 1 -47.436748302 -12.1928693727 -12.3161348556 0 0 0
-17 1 -41.9941398421 -14.9055716027 -14.8019423823 0 0 0
-18 1 -39.552902088 -11.9696227637 -14.882687326 0 0 0
-19 1 -39.2963451816 -14.7809978795 -12.0679138476 0 0 0
-20 1 -42.1075911365 -12.3614167156 -11.9824983107 0 0 0
-21 1 -36.6599909481 -14.6859201893 -14.9229927117 0 0 0
-22 1 -33.8548039224 -12.4439159769 -14.9776806264 0 0 0
-23 1 -33.9818236349 -15.0024566739 -12.0774927125 0 0 0
-24 1 -36.6776916297 -12.2919900539 -11.9714480675 0 0 0
-25 1 -31.176047451 -14.9579853413 -14.9411383004 0 0 0
-26 1 -28.3279983628 -12.224182297 -15.1018513778 0 0 0
-27 1 -28.3709052996 -14.8500854137 -12.3553247994 0 0 0
-28 1 -31.3016422878 -12.3980239187 -12.1929255382 0 0 0
-29 1 -25.6390397761 -14.9941940637 -15.0811539273 0 0 0
-30 1 -23.1221810152 -12.1162707805 -14.995512818 0 0 0
-31 1 -23.0516135261 -14.9313023779 -12.2215833531 0 0 0
-32 1 -25.5633374974 -12.0824738284 -12.2428110047 0 0 0
-33 1 -20.2477636679 -14.8135045948 -15.1878559553 0 0 0
-34 1 -17.428471 -12.1677669269 -15.0511210833 0 0 0
-35 1 -17.4724383098 -14.9562465835 -12.4008012653 0 0 0
-36 1 -20.2613586415 -12.1444568697 -12.5541704265 0 0 0
-37 1 -14.849713087 -15.0276330368 -15.0152979285 0 0 0
-38 1 -11.9998892944 -12.297984413 -15.1773718883 0 0 0
-39 1 -12.092274515 -14.9332495513 -12.4313549179 0 0 0
-40 1 -14.9475468327 -12.4149838871 -12.3273421642 0 0 0
-41 1 -9.5498900617 -14.9528990896 -14.8550217233 0 0 0
-42 1 -6.90713087905 -12.0715363437 -15.0758851025 0 0 0
-43 1 -6.94146528284 -14.8797779019 -12.3547569533 0 0 0
-44 1 -9.58377282472 -12.2556196002 -12.1730747738 0 0 0
-45 1 -4.14133195741 -14.7325008801 -15.1129528486 0 0 0
-46 1 -1.28082069762 -12.3303633554 -14.9041421352 0 0 0
-47 1 -1.4551916541 -14.7815629449 -12.0288433203 0 0 0
-48 1 -4.14421092669 -11.9574375857 -12.4614036795 0 0 0
-49 1 1.33497202193 -14.9806266648 -15.0123181012 0 0 0
-50 1 4.13148259067 -12.2865627528 -14.9314453953 0 0 0
-51 1 4.01159182414 -14.9867466724 -12.3448907236 0 0 0
-52 1 1.40016491184 -12.4790773874 -12.3570185331 0 0 0
-53 1 6.70901582244 -14.7970439402 -14.8122619149 0 0 0
-54 1 9.48595342681 -12.3008265816 -14.9894469435 0 0 0
-55 1 9.32356514192 -14.8609673701 -12.3199712775 0 0 0
-56 1 6.77252296315 -12.0345964188 -12.2496837977 0 0 0
-57 1 12.3206297417 -15.0444305358 -14.9848153417 0 0 0
-58 1 15.0602229179 -12.2208198781 -15.0115434051 0 0 0
-59 1 15.0025647762 -14.7998931953 -12.3299110238 0 0 0
-60 1 12.1734639441 -12.2331441583 -12.3946362528 0 0 0
-61 1 17.7573138628 -15.0802123617 -15.0980416148 0 0 0
-62 1 20.4336730024 -12.3867722245 -14.8566846055 0 0 0
-63 1 20.3648138682 -14.921271059 -12.2454267144 0 0 0
-64 1 17.8192710401 -12.370519942 -12.2193467619 0 0 0
-65 1 23.053815233 -15.113878626 -14.9605596962 0 0 0
-66 1 25.7655247635 -12.2724970174 -14.8186117536 0 0 0
-67 1 25.6935094399 -14.8989043964 -12.0651986649 0 0 0
-68 1 23.1110532104 -12.2321182964 -12.1920394322 0 0 0
-69 1 28.3807819537 -14.8217032377 -14.8854767323 0 0 0
-70 1 31.2388953622 -12.4977435011 -15.1845687041 0 0 0
-71 1 31.4015037854 -14.9759427603 -12.3059886658 0 0 0
-72 1 28.4884182157 -12.2188057793 -12.2482702417 0 0 0
-73 1 33.9639361618 -15.0994329557 -14.9585569285 0 0 0
-74 1 36.3499166236 -12.1620421532 -15.1793085145 0 0 0
-75 1 36.4979855854 -15.2292470756 -12.1554559001 0 0 0
-76 1 34.1015266121 -12.2675754794 -12.3842590248 0 0 0
-77 1 39.2868558973 -15.0214949528 -14.744030989 0 0 0
-78 1 41.6496971091 -12.1644399225 -15.0397621687 0 0 0
-79 1 41.9764711045 -14.5271124915 -12.2962617684 0 0 0
-80 1 38.9902306353 -12.1504698335 -12.2840840223 0 0 0
-81 1 44.7018171481 -14.4670354557 -15.1340435397 0 0 0
-82 1 47.5442621314 -12.0220711127 -14.9599232311 0 0 0
-83 1 47.4646962644 -14.8564644004 -12.3544721269 0 0 0
-84 1 44.5208876972 -11.9510563651 -12.3210700168 0 0 0
-85 1 50.1225886408 -14.7974100036 -14.9995519196 0 0 0
-86 1 52.8495925768 -12.2395428389 -14.7374191827 0 0 0
-87 1 52.6655284736 -14.9918447334 -12.2244904165 0 0 0
-88 1 49.9143079405 -12.1584605131 -12.1635477782 0 0 0
-89 1 55.40125 -14.86375 -14.86375 0 0 0
-90 1 58.10375 -12.16125 -14.86375 0 0 0
-91 1 58.10375 -14.86375 -12.16125 0 0 0
-92 1 55.40125 -12.16125 -12.16125 0 0 0
-93 1 60.80625 -14.86375 -14.86375 0 0 0
-94 1 63.50875 -12.16125 -14.86375 0 0 0
-95 1 63.50875 -14.86375 -12.16125 0 0 0
-96 1 60.80625 -12.16125 -12.16125 0 0 0
-97 1 -63.50875 -9.45875 -14.86375 0 0 0
-98 1 -60.80625 -6.75625 -14.86375 0 0 0
-99 1 -60.80625 -9.45875 -12.16125 0 0 0
-100 1 -63.50875 -6.75625 -12.16125 0 0 0
-101 1 -58.10375 -9.45875 -14.86375 0 0 0
-102 1 -55.40125 -6.75625 -14.86375 0 0 0
-103 1 -55.40125 -9.45875 -12.16125 0 0 0
-104 1 -58.10375 -6.75625 -12.16125 0 0 0
-105 1 -52.708732172 -9.54502879843 -14.9933713296 0 0 0
-106 1 -49.9586408245 -6.86740297339 -14.9623297945 0 0 0
-107 1 -50.1021912778 -9.6265265848 -12.1340020246 0 0 0
-108 1 -52.8226182744 -6.86755646141 -12.1180149807 0 0 0
-109 1 -47.3483275527 -9.61960912956 -15.059628301 0 0 0
-110 1 -44.8449781269 -6.74921458768 -14.9439827279 0 0 0
-111 1 -44.8666968558 -9.6088072765 -12.2983180503 0 0 0
-112 1 -47.3762292302 -6.77066671103 -12.0619200174 0 0 0
-113 1 -42.1700117604 -9.41768664705 -14.8122551284 0 0 0
-114 1 -39.3541012543 -6.75757840452 -15.0466724304 0 0 0
-115 1 -39.5565437067 -9.56341702927 -12.1630060736 0 0 0
-116 1 -42.296758707 -6.76513683569 -12.196880532 0 0 0
-117 1 -36.6404551776 -9.53429111552 -14.875536566 0 0 0
-118 1 -33.8863979335 -7.19365732636 -14.9482094182 0 0 0
-119 1 -33.8098409335 -9.56531365313 -12.3103164515 0 0 0
-120 1 -37.0438956185 -6.90070371603 -12.3257915984 0 0 0
-121 1 -31.1555830372 -9.77817130452 -14.9741008675 0 0 0
-122 1 -28.4760371551 -6.9102593272 -15.0383622891 0 0 0
-123 1 -28.439072951 -9.40232608456 -12.3138999249 0 0 0
-124 1 -31.2173971126 -6.7109323447 -12.3031970881 0 0 0
-125 1 -25.6576617672 -9.5445888664 -15.0061200883 0 0 0
-126 1 -23.1922679936 -6.82970533685 -15.0904287057 0 0 0
-127 1 -23.0607927014 -9.3488605537 -12.1943639381 0 0 0
-128 1 -25.7044031802 -6.88144516419 -12.320873576 0 0 0
-129 1 -20.4260105061 -9.58980106445 -15.1124215299 0 0 0
-130 1 -17.8710167849 -6.89791214147 -14.8196699339 0 0 0
-131 1 -17.6669067397 -9.66896957065 -12.2032741178 0 0 0
-132 1 -20.4651312981 -6.89138495389 -12.4036663327 0 0 0
-133 1 -14.7762808738 -9.62045045323 -14.9524686313 0 0 0
-134 1 -12.2516048141 -6.77450940491 -15.0944008876 0 0 0
-135 1 -12.1640826137 -9.5281706868 -12.2766177842 0 0 0
-136 1 -15.0171414701 -6.79009556282 -12.1920667103 0 0 0
-137 1 -9.40362035622 -9.48364412423 -15.0417447023 0 0 0
-138 1 -6.94750115651 -6.66974754097 -15.0273466591 0 0 0
-139 1 -6.94215079061 -9.54426814381 -12.348246843 0 0 0
-140 1 -9.58939088619 -6.75027937756 -12.305217677 0 0 0
-141 1 -4.12884196188 -9.36315821404 -15.0753744261 0 0 0
-142 1 -1.30065868623 -6.75492282709 -15.1116164334 0 0 0
-143 1 -1.29796249354 -9.60124070716 -12.3749209236 0 0 0
-144 1 -4.18491716382 -6.73753956855 -12.3262607751 0 0 0
-145 1 1.35164200619 -9.69415167247 -15.0308156629 0 0 0
-146 1 3.90538848162 -6.94454413123 -14.8654216273 0 0 0
-147 1 4.02878659881 -9.57890403064 -12.3315147694 0 0 0
-148 1 1.32091812283 -6.84682885025 -12.0135377308 0 0 0
-149 1 6.8527392813 -9.60045362239 -14.9281980039 0 0 0
-150 1 9.43613802902 -6.84002252453 -14.7824530775 0 0 0
-151 1 9.30935858469 -9.44293726178 -12.1161900338 0 0 0
-152 1 6.60149445183 -6.76290822036 -12.1494970251 0 0 0
-153 1 12.3368916671 -9.36720549159 -14.8712595891 0 0 0
-154 1 14.9111486782 -6.71150660138 -15.0536676503 0 0 0
-155 1 15.005662701 -9.68285844002 -12.1933087027 0 0 0
-156 1 12.1936139347 -6.78455223587 -12.2160734663 0 0 0
-157 1 17.5800998043 -9.55599344754 -14.9626172471 0 0 0
-158 1 20.3548000599 -6.71741999102 -14.77725721 0 0 0
-159 1 20.2539961838 -9.44681040065 -12.3528595854 0 0 0
-160 1 17.5427862263 -6.82372135815 -12.4719243656 0 0 0
-161 1 22.9222581128 -9.51539170012 -14.9115597657 0 0 0
-162 1 25.6780706763 -6.76795654143 -15.0397091536 0 0 0
-163 1 25.6418073222 -9.34830603316 -12.4166465173 0 0 0
-164 1 22.9743666914 -6.6176437682 -12.2232390904 0 0 0
-165 1 28.6404300192 -9.64323295308 -15.0441255476 0 0 0
-166 1 31.2431047902 -6.71630434186 -15.1919612958 0 0 0
-167 1 31.4026957787 -9.58938206327 -12.1855450792 0 0 0
-168 1 28.6558834245 -6.91920918375 -12.4363983227 0 0 0
-169 1 33.8204059228 -9.50032765545 -15.2860954733 0 0 0
-170 1 36.2612886388 -6.72527684399 -15.1370878102 0 0 0
-171 1 36.3318309734 -9.50365540603 -12.386220521 0 0 0
-172 1 33.8413940492 -6.69462896759 -12.4186513082 0 0 0
-173 1 38.9559905495 -9.52876651276 -15.0435400085 0 0 0
-174 1 41.8719850633 -6.90567716427 -14.9189378552 0 0 0
-175 1 41.6883703375 -9.62551857049 -12.4172245674 0 0 0
-176 1 39.149147174 -6.75496303251 -12.3920956927 0 0 0
-177 1 44.6019738473 -9.43655058351 -15.1230829588 0 0 0
-178 1 47.4748877409 -6.86817145364 -14.9069509256 0 0 0
-179 1 47.4165914388 -9.49523990877 -12.2020451359 0 0 0
-180 1 44.5290731857 -6.9532221467 -12.116960926 0 0 0
-181 1 50.1491399858 -9.39551648297 -14.8018319341 0 0 0
-182 1 52.7039614492 -6.71081056641 -14.9833252296 0 0 0
-183 1 52.5952937838 -9.36294136168 -12.2218170874 0 0 0
-184 1 50.0412292514 -6.84783104604 -12.0222195312 0 0 0
-185 1 55.40125 -9.45875 -14.86375 0 0 0
-186 1 58.10375 -6.75625 -14.86375 0 0 0
-187 1 58.10375 -9.45875 -12.16125 0 0 0
-188 1 55.40125 -6.75625 -12.16125 0 0 0
-189 1 60.80625 -9.45875 -14.86375 0 0 0
-190 1 63.50875 -6.75625 -14.86375 0 0 0
-191 1 63.50875 -9.45875 -12.16125 0 0 0
-192 1 60.80625 -6.75625 -12.16125 0 0 0
-193 1 -63.50875 -4.05375 -14.86375 0 0 0
-194 1 -60.80625 -1.35125 -14.86375 0 0 0
-195 1 -60.80625 -4.05375 -12.16125 0 0 0
-196 1 -63.50875 -1.35125 -12.16125 0 0 0
-197 1 -58.10375 -4.05375 -14.86375 0 0 0
-198 1 -55.40125 -1.35125 -14.86375 0 0 0
-199 1 -55.40125 -4.05375 -12.16125 0 0 0
-200 1 -58.10375 -1.35125 -12.16125 0 0 0
-201 1 -52.622528549 -4.05891086433 -15.0369038552 0 0 0
-202 1 -49.9729230948 -1.32323591598 -14.9237193151 0 0 0
-203 1 -50.0977026856 -4.21009581004 -12.344898444 0 0 0
-204 1 -52.6874171827 -1.25124242523 -12.1509481346 0 0 0
-205 1 -47.3463914107 -3.93557070695 -14.8279066636 0 0 0
-206 1 -44.6631062046 -1.23866768984 -15.0862561301 0 0 0
-207 1 -44.6863718098 -4.07048715014 -12.11829466 0 0 0
-208 1 -47.2130640123 -1.27349159011 -12.1378845008 0 0 0
-209 1 -42.0104887137 -4.02530830406 -14.8891537226 0 0 0
-210 1 -39.1479917827 -1.24550523493 -14.9750496216 0 0 0
-211 1 -39.4851617286 -3.99671251747 -12.2771841494 0 0 0
-212 1 -41.8621787487 -1.28370946598 -12.2788687471 0 0 0
-213 1 -36.6373582394 -4.12655112677 -14.8739913307 0 0 0
-214 1 -33.8446758588 -1.63106993568 -15.083949396 0 0 0
-215 1 -33.8829810823 -4.19593003341 -12.3693744536 0 0 0
-216 1 -36.6386288596 -1.30503564532 -12.4058891799 0 0 0
-217 1 -31.203210921 -4.26117432267 -15.1716577609 0 0 0
-218 1 -28.5929148809 -1.46778812339 -15.0318111357 0 0 0
-219 1 -28.4214537344 -4.29875744386 -12.2924781875 0 0 0
-220 1 -31.0133835606 -1.54279303004 -12.3685473225 0 0 0
-221 1 -25.8147913207 -4.22669385372 -14.7380621703 0 0 0
-222 1 -23.118087225 -1.56054681883 -14.9529986848 0 0 0
-223 1 -23.1284030134 -4.17559254079 -12.282814826 0 0 0
-224 1 -25.8507825706 -1.42456482985 -12.3305798033 0 0 0
-225 1 -20.4421153691 -4.42141916172 -15.1210809518 0 0 0
-226 1 -17.7173073122 -1.52926560797 -15.1842439777 0 0 0
-227 1 -17.7304753881 -4.19485966778 -12.3529105705 0 0 0
-228 1 -20.2784011882 -1.56090311696 -12.4585466406 0 0 0
-229 1 -15.0001519787 -4.27871778543 -15.0022789117 0 0 0
-230 1 -12.3925675714 -1.34672909831 -15.0539054566 0 0 0
-231 1 -12.2694374323 -4.04798799508 -12.3860266466 0 0 0
-232 1 -15.0651743417 -1.54587337575 -12.3389455715 0 0 0
-233 1 -9.43411715396 -3.94136091162 -14.8899418671 0 0 0
-234 1 -6.76913370035 -1.3871833816 -14.8021048924 0 0 0
-235 1 -6.77910453191 -4.05314760298 -12.1962231878 0 0 0
-236 1 -9.47103543098 -1.24569498242 -12.2918118762 0 0 0
-237 1 -3.88559490004 -4.17008400706 -15.0137214583 0 0 0
-238 1 -1.02372589992 -1.46813255859 -14.9940812542 0 0 0
-239 1 -1.29206756053 -4.21781858483 -12.3494115554 0 0 0
-240 1 -3.61326918731 -1.36596024064 -12.212823064 0 0 0
-241 1 1.36450343035 -4.33080442712 -14.9318648122 0 0 0
-242 1 4.22424592864 -1.49965602873 -15.0011380909 0 0 0
-243 1 4.07857691806 -3.93257391823 -12.3327553844 0 0 0
-244 1 1.30112865464 -1.29628981934 -12.1080013268 0 0 0
-245 1 6.63702893661 -4.18642595888 -14.8807100204 0 0 0
-246 1 9.4551932896 -1.56063476076 -14.7520672446 0 0 0
-247 1 9.47317555594 -4.19201517741 -12.2888001679 0 0 0
-248 1 6.81353087584 -1.31373004982 -12.0831064153 0 0 0
-249 1 12.1361291749 -4.15616395951 -14.957737764 0 0 0
-250 1 14.6275775138 -1.58659763813 -14.9208567855 0 0 0
-251 1 14.8953774006 -4.35138189601 -12.1478208131 0 0 0
-252 1 12.1508006598 -1.50549215515 -12.205242892 0 0 0
-253 1 17.5175711847 -4.10346143348 -14.9832860363 0 0 0
-254 1 20.2922166817 -1.51132989502 -14.9248505416 0 0 0
-255 1 20.2095214756 -4.03785212293 -12.2095231722 0 0 0
-256 1 17.3379390909 -1.35480366161 -12.4069413664 0 0 0
-257 1 22.9122703775 -3.97805772771 -15.0630102681 0 0 0
-258 1 25.7872940217 -1.3764297291 -15.1004718389 0 0 0
-259 1 25.821587268 -4.23552651118 -12.4356245642 0 0 0
-260 1 23.0690141379 -1.46942899406 -12.3185610805 0 0 0
-261 1 28.5442270019 -3.99539143142 -15.1234317258 0 0 0
-262 1 30.8463409362 -1.22993870469 -14.922210912 0 0 0
-263 1 31.0911026404 -4.16189848027 -12.2710786562 0 0 0
-264 1 28.4644085193 -1.41193505837 -12.2433144491 0 0 0
-265 1 33.7282995053 -3.94737945158 -15.1459129743 0 0 0
-266 1 36.6476240081 -1.30573985752 -15.0874902286 0 0 0
-267 1 36.5372929195 -4.05344224235 -12.4400673022 0 0 0
-268 1 33.8228988697 -1.52646163238 -12.338368944 0 0 0
-269 1 39.1437920203 -4.06660094875 -15.1407158365 0 0 0
-270 1 41.7668706608 -1.46015310666 -14.8293490593 0 0 0
-271 1 41.7516104018 -4.07581075193 -12.3337263317 0 0 0
-272 1 39.0420746133 -1.23418967495 -12.2797928014 0 0 0
-273 1 44.7063671918 -4.49574295982 -14.7143399866 0 0 0
-274 1 47.5026489175 -1.47184169633 -14.9455388094 0 0 0
-275 1 47.3747861924 -4.05279628277 -12.0697294174 0 0 0
-276 1 44.6000847829 -1.3655863554 -12.1794058638 0 0 0
-277 1 49.9040230478 -4.17436190307 -14.8707723899 0 0 0
-278 1 52.7048004403 -1.36506095118 -14.9080388123 0 0 0
-279 1 52.6945835962 -4.271399166 -12.2533331847 0 0 0
-280 1 50.0911099674 -1.49124308676 -12.2482034984 0 0 0
-281 1 55.40125 -4.05375 -14.86375 0 0 0
-282 1 58.10375 -1.35125 -14.86375 0 0 0
-283 1 58.10375 -4.05375 -12.16125 0 0 0
-284 1 55.40125 -1.35125 -12.16125 0 0 0
-285 1 60.80625 -4.05375 -14.86375 0 0 0
-286 1 63.50875 -1.35125 -14.86375 0 0 0
-287 1 63.50875 -4.05375 -12.16125 0 0 0
-288 1 60.80625 -1.35125 -12.16125 0 0 0
-289 1 -63.50875 1.35125 -14.86375 0 0 0
-290 1 -60.80625 4.05375 -14.86375 0 0 0
-291 1 -60.80625 1.35125 -12.16125 0 0 0
-292 1 -63.50875 4.05375 -12.16125 0 0 0
-293 1 -58.10375 1.35125 -14.86375 0 0 0
-294 1 -55.40125 4.05375 -14.86375 0 0 0
-295 1 -55.40125 1.35125 -12.16125 0 0 0
-296 1 -58.10375 4.05375 -12.16125 0 0 0
-297 1 -52.5851800414 1.41330263328 -15.032822654 0 0 0
-298 1 -49.9103617223 4.00246690603 -14.9370449774 0 0 0
-299 1 -49.7671570762 1.31856095242 -12.1829596967 0 0 0
-300 1 -52.7217032703 3.9255597142 -12.0970566636 0 0 0
-301 1 -47.2796330002 1.26700204123 -15.0340272638 0 0 0
-302 1 -44.5824236077 3.98639555278 -14.9617306539 0 0 0
-303 1 -44.6048155462 1.32376605076 -12.2355255643 0 0 0
-304 1 -47.1763748292 3.91992052781 -12.1941157253 0 0 0
-305 1 -41.8611445055 1.39692663041 -14.9278945508 0 0 0
-306 1 -39.0539094673 3.9717179457 -15.1419647922 0 0 0
-307 1 -39.3290610389 1.43131037259 -12.2994052543 0 0 0
-308 1 -41.7805897034 4.05336178165 -12.2649452033 0 0 0
-309 1 -36.3378982995 1.33555319336 -15.0553532801 0 0 0
-310 1 -33.8496097988 4.01303376992 -14.8997314093 0 0 0
-311 1 -33.7648574619 1.01300600081 -12.3378523028 0 0 0
-312 1 -36.6308921433 3.90629939445 -12.4205188285 0 0 0
-313 1 -31.1593439764 1.29578115961 -14.8905664438 0 0 0
-314 1 -28.4013390255 4.03095817964 -14.9315442567 0 0 0
-315 1 -28.4199555389 1.24430456104 -12.3748452284 0 0 0
-316 1 -31.1168171045 3.93602710443 -12.3148478854 0 0 0
-317 1 -25.6917963926 1.31249942809 -14.9338065705 0 0 0
-318 1 -23.0661106699 4.02149084919 -15.09075948 0 0 0
-319 1 -23.0605072709 1.34488101325 -12.290742722 0 0 0
-320 1 -25.7532331832 3.87186125798 -12.2439019802 0 0 0
-321 1 -20.4667376379 1.3030132019 -15.0949705426 0 0 0
-322 1 -17.8017296973 4.03433440566 -15.1846811873 0 0 0
-323 1 -17.677917034 1.1779702799 -12.2585068755 0 0 0
-324 1 -20.4296941822 4.175538913 -12.3970708852 0 0 0
-325 1 -14.9950615073 1.3282138027 -14.9548218539 0 0 0
-326 1 -12.0894775214 4.02316997032 -14.9529440837 0 0 0
-327 1 -12.1264605267 1.12535078697 -12.370398008 0 0 0
-328 1 -15.0035804634 4.0247954852 -12.2018188332 0 0 0
-329 1 -9.30763061103 1.43837012252 -14.9312541901 0 0 0
-330 1 -6.74426687385 4.03527709804 -14.9674599542 0 0 0
-331 1 -6.6324383485 1.2273126361 -12.2055161899 0 0 0
-332 1 -9.5485195272 3.8742141939 -12.0242323635 0 0 0
-333 1 -4.09397726674 1.50902890906 -15.0123636967 0 0 0
-334 1 -1.45626530811 4.16815358904 -15.172696193 0 0 0
-335 1 -1.40300008818 1.55090463631 -12.4898604184 0 0 0
-336 1 -4.12219573713 4.16034075798 -12.2753371143 0 0 0
-337 1 1.55858651874 1.1375558052 -14.8927523023 0 0 0
-338 1 4.11043485001 4.01139983627 -14.8393749779 0 0 0
-339 1 4.11955734789 1.20374907483 -12.0857750575 0 0 0
-340 1 1.4373084859 4.30188495941 -12.3137298352 0 0 0
-341 1 6.77309608293 1.08113238289 -15.0987722268 0 0 0
-342 1 9.37655662291 3.76421414879 -15.0456117052 0 0 0
-343 1 9.33937514794 1.34435227448 -12.3814506754 0 0 0
-344 1 6.81731343423 3.88911795207 -12.1421269274 0 0 0
-345 1 12.0363657892 1.17408147011 -15.0194478226 0 0 0
-346 1 14.7222092173 4.02987586059 -15.2929867923 0 0 0
-347 1 14.7684144925 1.3360038472 -12.3456589287 0 0 0
-348 1 12.1256348018 3.9022922635 -12.5318903927 0 0 0
-349 1 17.4829079924 1.25318838963 -14.8858123914 0 0 0
-350 1 20.2320175359 3.96740894689 -14.848530691 0 0 0
-351 1 20.5493398198 1.27590852857 -12.1495657703 0 0 0
-352 1 17.5277184691 4.11994532558 -12.4509521425 0 0 0
-353 1 23.1245403369 1.39345466976 -15.1004381874 0 0 0
-354 1 25.6031164112 3.9935509079 -15.0177247625 0 0 0
-355 1 25.7366802268 1.10541959817 -12.2960276187 0 0 0
-356 1 23.0652991581 4.02121017102 -12.2415263497 0 0 0
-357 1 28.2164029099 1.44338367969 -15.0184623366 0 0 0
-358 1 31.1799886083 4.09927916346 -14.8254783125 0 0 0
-359 1 31.1313616815 1.44141814514 -12.3126666353 0 0 0
-360 1 28.4223342115 4.09605063975 -12.3855174817 0 0 0
-361 1 33.8912604235 1.42328595999 -14.8373043359 0 0 0
-362 1 36.7270822808 4.06512766911 -14.8932655659 0 0 0
-363 1 36.4159272028 1.40115893285 -12.0592125745 0 0 0
-364 1 33.7731995842 4.1769909023 -12.2205040668 0 0 0
-365 1 39.359779366 1.27679119334 -15.1005899059 0 0 0
-366 1 42.0238216661 3.91673410956 -14.8185980702 0 0 0
-367 1 42.0556783074 1.29151514382 -12.3016861399 0 0 0
-368 1 39.3581647875 3.97496629732 -12.0934370002 0 0 0
-369 1 44.7724790542 1.33270790402 -14.9319510147 0 0 0
-370 1 47.3074092746 4.06023399864 -14.8427260624 0 0 0
-371 1 47.5712411197 1.44803713023 -12.223282484 0 0 0
-372 1 44.7460808586 3.93313609457 -12.1789403465 0 0 0
-373 1 50.0627135242 1.49338196942 -14.8128574005 0 0 0
-374 1 52.7459112148 4.14611140351 -14.9283216309 0 0 0
-375 1 52.7396359887 1.3330229087 -12.3663363638 0 0 0
-376 1 50.2514193288 4.17969940028 -12.1613676886 0 0 0
-377 1 55.40125 1.35125 -14.86375 0 0 0
-378 1 58.10375 4.05375 -14.86375 0 0 0
-379 1 58.10375 1.35125 -12.16125 0 0 0
-380 1 55.40125 4.05375 -12.16125 0 0 0
-381 1 60.80625 1.35125 -14.86375 0 0 0
-382 1 63.50875 4.05375 -14.86375 0 0 0
-383 1 63.50875 1.35125 -12.16125 0 0 0
-384 1 60.80625 4.05375 -12.16125 0 0 0
-385 1 -63.50875 6.75625 -14.86375 0 0 0
-386 1 -60.80625 9.45875 -14.86375 0 0 0
-387 1 -60.80625 6.75625 -12.16125 0 0 0
-388 1 -63.50875 9.45875 -12.16125 0 0 0
-389 1 -58.10375 6.75625 -14.86375 0 0 0
-390 1 -55.40125 9.45875 -14.86375 0 0 0
-391 1 -55.40125 6.75625 -12.16125 0 0 0
-392 1 -58.10375 9.45875 -12.16125 0 0 0
-393 1 -52.7367794957 6.70703557801 -14.8335594433 0 0 0
-394 1 -50.0833080047 9.19203493061 -15.0873450514 0 0 0
-395 1 -50.0756593322 6.35763921574 -12.0148488859 0 0 0
-396 1 -52.7720526656 9.39682522517 -12.095405165 0 0 0
-397 1 -47.3800585652 6.561457847 -14.8413998027 0 0 0
-398 1 -44.6220999174 9.44444201697 -14.8769345148 0 0 0
-399 1 -44.6129987032 6.63322172253 -12.3499134645 0 0 0
-400 1 -47.4088772085 9.2580731895 -12.1206430343 0 0 0
-401 1 -41.7437080657 6.53541222103 -15.1195022566 0 0 0
-402 1 -39.1200860624 9.41321473912 -14.9387416259 0 0 0
-403 1 -39.0818064258 6.86293815601 -12.1478182703 0 0 0
-404 1 -41.9681625049 9.3610474214 -12.2675373348 0 0 0
-405 1 -36.4712334622 6.83726359733 -15.0537546866 0 0 0
-406 1 -33.8170008268 9.67709820063 -15.0372625061 0 0 0
-407 1 -33.8801632686 6.78153213494 -12.2764309413 0 0 0
-408 1 -36.4371282263 9.40556232052 -12.2859672079 0 0 0
-409 1 -31.2742865588 6.76511824535 -14.8460249492 0 0 0
-410 1 -28.6270861231 9.55281431192 -15.0157874703 0 0 0
-411 1 -28.5946087193 6.67091787671 -12.4279689658 0 0 0
-412 1 -31.1095058754 9.54860244307 -12.2926292326 0 0 0
-413 1 -25.9393758523 6.83445013753 -14.8882236067 0 0 0
-414 1 -23.0247101191 9.31406870253 -14.9854443802 0 0 0
-415 1 -23.1948959414 6.83985940172 -12.2749060411 0 0 0
-416 1 -25.823705635 9.58074013952 -12.3665827957 0 0 0
-417 1 -20.3425547294 6.61024571015 -15.0014192784 0 0 0
-418 1 -17.6642040971 9.43420459275 -14.9520037916 0 0 0
-419 1 -17.6447725841 6.71548999953 -12.4285657979 0 0 0
-420 1 -20.4170455863 9.60000030863 -12.4317668435 0 0 0
-421 1 -14.9296126666 6.71377107047 -15.0663474972 0 0 0
-422 1 -12.3635997324 9.49053021875 -14.9570516221 0 0 0
-423 1 -12.2813114839 6.71841996292 -12.2393061338 0 0 0
-424 1 -15.1079047295 9.3871227088 -12.2736082387 0 0 0
-425 1 -9.42610915672 6.80144748914 -14.9163775429 0 0 0
-426 1 -6.52774850372 9.53125048121 -14.9841187891 0 0 0
-427 1 -6.65714757356 6.7874213937 -12.0657621054 0 0 0
-428 1 -9.40008302786 9.39252514926 -12.325092314 0 0 0
-429 1 -4.04020114433 6.73721991163 -15.0569567719 0 0 0
-430 1 -1.15472589872 9.44659357274 -14.9414686268 0 0 0
-431 1 -1.34778222296 6.81829674103 -12.1853215895 0 0 0
-432 1 -3.93916009097 9.572382781 -12.148006932 0 0 0
-433 1 1.27004774225 6.7365745855 -14.9901242045 0 0 0
-434 1 4.16800421415 9.49947990178 -15.0741079187 0 0 0
-435 1 4.15933762179 6.80103976582 -12.2010837488 0 0 0
-436 1 1.30111937965 9.43633319947 -12.2847915742 0 0 0
-437 1 6.80676946951 6.64556847958 -14.9931203743 0 0 0
-438 1 9.51488270844 9.40947839304 -14.8793352755 0 0 0
-439 1 9.4393249707 6.60846236573 -12.2670763422 0 0 0
-440 1 6.74668406216 9.38577792888 -12.2548306721 0 0 0
-441 1 11.9704775311 6.56240296829 -14.8790581311 0 0 0
-442 1 14.9587646084 9.51054368293 -14.8920905101 0 0 0
-443 1 14.7944918768 6.66789966161 -12.2852892102 0 0 0
-444 1 12.060467712 9.68218513825 -12.3438670596 0 0 0
-445 1 17.3652610956 6.68041733101 -15.1028471578 0 0 0
-446 1 20.1701148511 9.51942909785 -14.8605025415 0 0 0
-447 1 20.1878150155 6.81239041218 -12.3923790653 0 0 0
-448 1 17.5932861359 9.44075682534 -12.2518057102 0 0 0
-449 1 22.926035188 6.88418417327 -15.0959512417 0 0 0
-450 1 25.6627103661 9.44645333921 -14.816077097 0 0 0
-451 1 25.8859082828 6.6307907066 -12.3479385678 0 0 0
-452 1 22.9480807214 9.47998949857 -12.0601329523 0 0 0
-453 1 28.4093485447 6.88979113944 -14.9583737865 0 0 0
-454 1 31.2162759248 9.26295445876 -15.0836120863 0 0 0
-455 1 31.1025721978 6.85460359391 -12.1801765871 0 0 0
-456 1 28.4426530426 9.45451322438 -12.2099871365 0 0 0
-457 1 34.0286699518 6.75028331415 -15.0678467573 0 0 0
-458 1 36.7156828329 9.49886122635 -15.0531251226 0 0 0
-459 1 36.3921155984 6.80542639943 -12.3501805319 0 0 0
-460 1 33.9584768375 9.4210277306 -12.3412375343 0 0 0
-461 1 39.2184262151 6.72293293941 -14.9900065509 0 0 0
-462 1 41.8573198514 9.31946007982 -14.9502914608 0 0 0
-463 1 41.9689084875 6.65875436143 -12.1223345707 0 0 0
-464 1 39.3044167406 9.23154901304 -12.3886411951 0 0 0
-465 1 44.6458043682 6.80807328059 -15.0077323836 0 0 0
-466 1 47.2164920749 9.53093046531 -15.101431673 0 0 0
-467 1 47.2950248417 6.68996345848 -12.0545414185 0 0 0
-468 1 44.4595018015 9.67470889901 -12.2838052818 0 0 0
-469 1 49.8432272198 6.80794606806 -14.7242414691 0 0 0
-470 1 52.707451594 9.57239965343 -15.0873893666 0 0 0
-471 1 52.6958476171 6.78422464795 -12.3339722806 0 0 0
-472 1 49.991564232 9.5448252454 -12.2481961355 0 0 0
-473 1 55.40125 6.75625 -14.86375 0 0 0
-474 1 58.10375 9.45875 -14.86375 0 0 0
-475 1 58.10375 6.75625 -12.16125 0 0 0
-476 1 55.40125 9.45875 -12.16125 0 0 0
-477 1 60.80625 6.75625 -14.86375 0 0 0
-478 1 63.50875 9.45875 -14.86375 0 0 0
-479 1 63.50875 6.75625 -12.16125 0 0 0
-480 1 60.80625 9.45875 -12.16125 0 0 0
-481 1 -63.50875 12.16125 -14.86375 0 0 0
-482 1 -60.80625 14.86375 -14.86375 0 0 0
-483 1 -60.80625 12.16125 -12.16125 0 0 0
-484 1 -63.50875 14.86375 -12.16125 0 0 0
-485 1 -58.10375 12.16125 -14.86375 0 0 0
-486 1 -55.40125 14.86375 -14.86375 0 0 0
-487 1 -55.40125 12.16125 -12.16125 0 0 0
-488 1 -58.10375 14.86375 -12.16125 0 0 0
-489 1 -52.7055918953 12.1542659904 -14.7690321315 0 0 0
-490 1 -50.0102300398 14.6790662766 -14.8109641541 0 0 0
-491 1 -49.9430695395 11.8639442042 -12.2125436525 0 0 0
-492 1 -52.5621779546 14.7387292452 -12.0504425827 0 0 0
-493 1 -47.2455724955 12.1271356158 -14.9222614555 0 0 0
-494 1 -44.5321402463 14.8296131691 -14.7239449184 0 0 0
-495 1 -44.6654591844 12.13520652 -12.2310834345 0 0 0
-496 1 -47.388459781 14.8739217994 -12.4102945436 0 0 0
-497 1 -41.7590449345 11.989233103 -15.0291038513 0 0 0
-498 1 -39.2532725474 14.9507163121 -14.8503664857 0 0 0
-499 1 -39.1918223311 12.3441834961 -12.2672374835 0 0 0
-500 1 -42.0332810248 14.7975756573 -12.0357640619 0 0 0
-501 1 -36.6177490694 12.309406401 -15.0016023848 0 0 0
-502 1 -33.9832394684 15.05610863 -15.0808953109 0 0 0
-503 1 -33.9990433389 12.1995259259 -12.3546752016 0 0 0
-504 1 -36.5464944224 14.9492144225 -12.327315729 0 0 0
-505 1 -31.2727527021 12.3099506601 -15.0019793195 0 0 0
-506 1 -28.6218872941 14.8178034443 -15.1735155295 0 0 0
-507 1 -28.6018774016 12.1585741081 -12.4138345057 0 0 0
-508 1 -31.3927064942 14.6615154831 -12.2752828578 0 0 0
-509 1 -25.6251764645 12.1831418585 -15.1785957586 0 0 0
-510 1 -22.9730599157 14.8657770216 -15.0022161762 0 0 0
-511 1 -23.2050908712 12.4061522851 -12.1573469523 0 0 0
-512 1 -25.8731431063 14.9317663049 -12.4184385151 0 0 0
-513 1 -20.371941438 12.0255253534 -15.1066321225 0 0 0
-514 1 -17.6357274848 14.8986621202 -15.0928235257 0 0 0
-515 1 -17.6583155442 12.1376361635 -12.3995373277 0 0 0
-516 1 -20.387040665 14.8208685678 -12.2202161574 0 0 0
-517 1 -15.1566815182 12.2613520747 -15.0775362829 0 0 0
-518 1 -12.4108674617 14.7926050807 -14.8749015949 0 0 0
-519 1 -12.2639082372 12.0896886472 -12.1320751913 0 0 0
-520 1 -14.8715671393 14.9956890753 -12.1176221959 0 0 0
-521 1 -9.38533580442 12.2873517366 -14.7902990595 0 0 0
-522 1 -6.68184808724 14.8189777694 -15.0255410116 0 0 0
-523 1 -6.54040307472 12.1176985944 -12.0606653808 0 0 0
-524 1 -9.57123627476 14.7427405974 -12.0968668701 0 0 0
-525 1 -4.09687471944 12.1993303027 -15.0340277354 0 0 0
-526 1 -1.37749777517 15.0193878088 -15.0238351994 0 0 0
-527 1 -1.20218494591 12.3428499456 -12.3034512003 0 0 0
-528 1 -4.21564754831 14.9177415357 -12.2968081977 0 0 0
-529 1 1.17580119105 12.1936960407 -15.0452743356 0 0 0
-530 1 3.8915214222 14.5753534342 -14.9625936475 0 0 0
-531 1 3.93572920799 12.1397535317 -12.2499733859 0 0 0
-532 1 1.41621528561 14.8770795378 -12.3182799743 0 0 0
-533 1 6.8268134961 12.0071603515 -14.7815932339 0 0 0
-534 1 9.5585436261 14.9284728848 -14.9816737756 0 0 0
-535 1 9.45463076381 12.3066926272 -12.0624296099 0 0 0
-536 1 6.66921566005 14.82098239 -12.2974048009 0 0 0
-537 1 12.3836331028 12.1424248393 -15.0332550331 0 0 0
-538 1 14.9147784531 14.8077199468 -15.0565036575 0 0 0
-539 1 14.9818067374 12.0876425662 -12.1651785732 0 0 0
-540 1 12.0341649282 14.922697689 -12.2976463887 0 0 0
-541 1 17.5114968864 12.1785378698 -14.8459854593 0 0 0
-542 1 20.1731744306 14.5530089919 -14.896171819 0 0 0
-543 1 20.2274445987 12.0958397073 -12.1275958539 0 0 0
-544 1 17.6439411232 14.8255088264 -12.0918029408 0 0 0
-545 1 22.9103960211 12.1934130276 -14.8181023798 0 0 0
-546 1 25.8076351391 14.8181470446 -14.8881231524 0 0 0
-547 1 25.8423409289 12.0972031825 -12.3721330614 0 0 0
-548 1 23.1307406138 14.7711778744 -12.086145757 0 0 0
-549 1 28.5766505707 11.9175479147 -14.8666915188 0 0 0
-550 1 31.5007493722 14.8144835306 -14.9400837738 0 0 0
-551 1 31.0777156008 11.866080411 -12.23599673 0 0 0
-552 1 28.5949388622 14.746080072 -12.2052045462 0 0 0
-553 1 33.8524094986 11.9298523413 -15.0211179116 0 0 0
-554 1 36.5433070347 14.6114847949 -14.9233557408 0 0 0
-555 1 36.6886248328 12.0865619567 -12.3122971349 0 0 0
-556 1 34.01999714 14.6118203728 -11.9694913532 0 0 0
-557 1 39.356242246 12.2029497042 -15.1162187832 0 0 0
-558 1 42.067087505 14.9817341984 -14.7264295644 0 0 0
-559 1 41.6688208519 12.1888914087 -12.3503438693 0 0 0
-560 1 39.2070946185 14.6851283609 -12.1997156329 0 0 0
-561 1 44.6318904422 12.3649858725 -14.9594674907 0 0 0
-562 1 47.2990179439 14.8847858226 -14.9425410244 0 0 0
-563 1 47.2167550916 12.1118760784 -12.1702274032 0 0 0
-564 1 44.6681587384 14.7806209685 -12.264499211 0 0 0
-565 1 50.1930568675 12.1550473267 -15.0136834039 0 0 0
-566 1 52.6759099649 15.0504868019 -14.759322921 0 0 0
-567 1 52.8370109225 12.0262642212 -12.1878058216 0 0 0
-568 1 49.9972308612 14.8412677126 -12.1903182156 0 0 0
-569 1 55.40125 12.16125 -14.86375 0 0 0
-570 1 58.10375 14.86375 -14.86375 0 0 0
-571 1 58.10375 12.16125 -12.16125 0 0 0
-572 1 55.40125 14.86375 -12.16125 0 0 0
-573 1 60.80625 12.16125 -14.86375 0 0 0
-574 1 63.50875 14.86375 -14.86375 0 0 0
-575 1 63.50875 12.16125 -12.16125 0 0 0
-576 1 60.80625 14.86375 -12.16125 0 0 0
-577 1 -63.50875 -14.86375 -9.45875 0 0 0
-578 1 -60.80625 -12.16125 -9.45875 0 0 0
-579 1 -60.80625 -14.86375 -6.75625 0 0 0
-580 1 -63.50875 -12.16125 -6.75625 0 0 0
-581 1 -58.10375 -14.86375 -9.45875 0 0 0
-582 1 -55.40125 -12.16125 -9.45875 0 0 0
-583 1 -55.40125 -14.86375 -6.75625 0 0 0
-584 1 -58.10375 -12.16125 -6.75625 0 0 0
-585 1 -52.6040729154 -14.8848992199 -9.59903963256 0 0 0
-586 1 -49.9968782138 -12.1320697459 -9.53289236237 0 0 0
-587 1 -49.9200937048 -14.9720317017 -6.88609822577 0 0 0
-588 1 -52.6279976548 -12.3240907176 -6.62912331123 0 0 0
-589 1 -47.3169360366 -15.1159274949 -9.38054911678 0 0 0
-590 1 -44.8006944205 -12.0688951955 -9.47023340421 0 0 0
-591 1 -44.8554245711 -14.6869951947 -6.76895882499 0 0 0
-592 1 -47.3898530135 -12.0988954993 -6.66942434981 0 0 0
-593 1 -42.1384850429 -14.9314433697 -9.46330781208 0 0 0
-594 1 -39.4983326548 -12.1423060548 -9.37678688406 0 0 0
-595 1 -39.3889704375 -14.8205093444 -6.9625316064 0 0 0
-596 1 -42.1413722945 -11.9843825442 -6.79049659645 0 0 0
-597 1 -36.5087876672 -15.0435591589 -9.57703329294 0 0 0
-598 1 -34.0164146489 -12.289691312 -9.41077338042 0 0 0
-599 1 -33.8068119256 -15.052707366 -6.78881431903 0 0 0
-600 1 -36.5579007854 -12.0702981653 -6.67756313294 0 0 0
-601 1 -31.3863872642 -14.9124273289 -9.46652445971 0 0 0
-602 1 -28.3815099325 -12.2578152963 -9.69489408432 0 0 0
-603 1 -28.3324645966 -14.8567671322 -6.82863959238 0 0 0
-604 1 -31.0219995075 -12.244205976 -6.93909517602 0 0 0
-605 1 -25.8220485245 -14.8870359629 -9.69587584687 0 0 0
-606 1 -22.9396280013 -12.3119656122 -9.56685150963 0 0 0
-607 1 -22.9651159519 -14.8617575019 -6.78946306283 0 0 0
-608 1 -25.6403192598 -12.3069367501 -6.89073990246 0 0 0
-609 1 -20.312601671 -15.0147445079 -9.59225144559 0 0 0
-610 1 -17.5226208536 -12.4755543071 -9.72637360124 0 0 0
-611 1 -17.4305616469 -15.1476165017 -6.72152806194 0 0 0
-612 1 -20.1337841343 -12.3089799271 -7.04506142608 0 0 0
-613 1 -14.8326373325 -15.0373433071 -9.46759776328 0 0 0
-614 1 -12.0701477528 -12.3186642462 -9.51796775859 0 0 0
-615 1 -12.2436540608 -14.850484649 -6.76397750165 0 0 0
-616 1 -15.0590443615 -12.3435517042 -6.79979670575 0 0 0
-617 1 -9.48989973036 -14.9171229837 -9.6658257281 0 0 0
-618 1 -6.79743113215 -12.1930179504 -9.60735162689 0 0 0
-619 1 -6.9934352638 -14.8104422308 -6.79928189162 0 0 0
-620 1 -9.54564512789 -12.1258816334 -6.92172605898 0 0 0
-621 1 -4.14203987926 -14.8118844814 -9.37623936367 0 0 0
-622 1 -1.4576601816 -12.1147254541 -9.56730908695 0 0 0
-623 1 -1.3657344766 -14.9797544012 -6.83442239117 0 0 0
-624 1 -4.32554662076 -12.1632757063 -6.657498923 0 0 0
-625 1 1.44455645646 -15.1028335621 -9.45064095625 0 0 0
-626 1 4.15864652459 -12.3782108048 -9.66077404721 0 0 0
-627 1 4.06938980354 -14.7683558381 -6.65250719676 0 0 0
-628 1 1.31765477499 -12.4720123172 -6.81858787306 0 0 0
-629 1 6.64378887118 -15.0838156569 -9.48343551476 0 0 0
-630 1 9.21304614597 -12.2671841223 -9.52197968473 0 0 0
-631 1 9.34289605336 -14.7457070452 -6.77996694839 0 0 0
-632 1 6.54643736585 -12.1132357152 -6.65603468417 0 0 0
-633 1 11.9967642227 -14.775937519 -9.71221925433 0 0 0
-634 1 14.7082545974 -12.5276995822 -9.64624191062 0 0 0
-635 1 15.0455894641 -14.9813000773 -6.9363866073 0 0 0
-636 1 12.0477954107 -12.2585211432 -6.91865828053 0 0 0
-637 1 17.650105675 -14.9844769871 -9.62987788247 0 0 0
-638 1 20.5061839075 -12.2290039116 -9.50381238334 0 0 0
-639 1 20.3910904226 -14.8000106764 -6.88478318232 0 0 0
-640 1 17.6277216623 -12.0600852247 -6.84575981458 0 0 0
-641 1 23.124888118 -14.7694645483 -9.51099465159 0 0 0
-642 1 25.7998481414 -11.8884717477 -9.5744881312 0 0 0
-643 1 25.8758721435 -14.9760128978 -7.00812461892 0 0 0
-644 1 23.0346134506 -12.1467929149 -6.87480286907 0 0 0
-645 1 28.5088305432 -14.7985224789 -9.57301515959 0 0 0
-646 1 31.3532997415 -12.4628711729 -9.63448109513 0 0 0
-647 1 31.1656041737 -14.9952522691 -6.71057724314 0 0 0
-648 1 28.7965113659 -12.1612305191 -7.06613082769 0 0 0
-649 1 33.8652375002 -15.2883301848 -9.36041185039 0 0 0
-650 1 36.3354919954 -12.3762380013 -9.40423131088 0 0 0
-651 1 36.530800939 -14.9864715504 -6.75227046874 0 0 0
-652 1 33.7016203699 -12.3791493988 -6.68047517093 0 0 0
-653 1 39.3232004579 -14.9316216555 -9.76633440272 0 0 0
-654 1 41.9765961807 -12.2042205996 -9.5785202445 0 0 0
-655 1 41.8396125859 -14.6945246618 -6.73648081902 0 0 0
-656 1 39.3108739695 -12.406393688 -6.94329083263 0 0 0
-657 1 44.5907907223 -14.6978846635 -9.66238050053 0 0 0
-658 1 47.1481899845 -12.176488114 -9.54323446995 0 0 0
-659 1 47.1873797642 -14.9162234046 -6.73862493122 0 0 0
-660 1 44.6650560882 -12.1567861954 -6.85620145903 0 0 0
-661 1 50.0324734362 -14.8157632961 -9.51713426946 0 0 0
-662 1 52.6241177089 -12.4032023084 -9.63826313891 0 0 0
-663 1 52.6331441761 -14.9024558737 -6.77931754401 0 0 0
-664 1 49.8595474587 -12.330461093 -6.70832475471 0 0 0
-665 1 55.40125 -14.86375 -9.45875 0 0 0
-666 1 58.10375 -12.16125 -9.45875 0 0 0
-667 1 58.10375 -14.86375 -6.75625 0 0 0
-668 1 55.40125 -12.16125 -6.75625 0 0 0
-669 1 60.80625 -14.86375 -9.45875 0 0 0
-670 1 63.50875 -12.16125 -9.45875 0 0 0
-671 1 63.50875 -14.86375 -6.75625 0 0 0
-672 1 60.80625 -12.16125 -6.75625 0 0 0
-673 1 -63.50875 -9.45875 -9.45875 0 0 0
-674 1 -60.80625 -6.75625 -9.45875 0 0 0
-675 1 -60.80625 -9.45875 -6.75625 0 0 0
-676 1 -63.50875 -6.75625 -6.75625 0 0 0
-677 1 -58.10375 -9.45875 -9.45875 0 0 0
-678 1 -55.40125 -6.75625 -9.45875 0 0 0
-679 1 -55.40125 -9.45875 -6.75625 0 0 0
-680 1 -58.10375 -6.75625 -6.75625 0 0 0
-681 1 -52.6120772347 -9.65521374743 -9.36974462437 0 0 0
-682 1 -49.9861536049 -6.8392083453 -9.71378225559 0 0 0
-683 1 -49.9040700161 -9.37205625745 -6.81812706733 0 0 0
-684 1 -52.6248141365 -6.8446611798 -6.98308659632 0 0 0
-685 1 -47.4640083148 -9.48048330862 -9.56110663388 0 0 0
-686 1 -44.6628123394 -6.56193964055 -9.3659269659 0 0 0
-687 1 -44.6271703573 -9.43339481743 -6.67968619211 0 0 0
-688 1 -47.3119875616 -6.69620611761 -6.78978681846 0 0 0
-689 1 -42.148990771 -9.46551041617 -9.54960334275 0 0 0
-690 1 -39.2647152934 -6.77022412531 -9.63021705543 0 0 0
-691 1 -39.3122724237 -9.49793039289 -6.74599966955 0 0 0
-692 1 -41.9957511136 -6.71342814939 -6.82196194879 0 0 0
-693 1 -36.4257940673 -9.31506739043 -9.58925064067 0 0 0
-694 1 -33.9247404497 -6.73076211948 -9.86332118059 0 0 0
-695 1 -33.6863113487 -9.48761786216 -7.10004914423 0 0 0
-696 1 -36.5101612048 -6.64853295181 -7.03574629933 0 0 0
-697 1 -31.074559776 -9.4954912837 -9.67418129389 0 0 0
-698 1 -28.294537062 -6.83298978835 -9.58510833095 0 0 0
-699 1 -28.4102953667 -9.6167139414 -6.83075575841 0 0 0
-700 1 -31.0977125915 -6.747151293 -6.85457701446 0 0 0
-701 1 -25.6829003055 -9.47366354012 -9.30235730116 0 0 0
-702 1 -23.1933223007 -6.84563957884 -9.29154046846 0 0 0
-703 1 -23.0837840767 -9.63394062749 -6.76859362716 0 0 0
-704 1 -25.8033075155 -6.81248291509 -6.70406655605 0 0 0
-705 1 -20.3816211566 -9.60545546343 -9.56841630376 0 0 0
-706 1 -17.7591927947 -6.99043474234 -9.64124871602 0 0 0
-707 1 -17.4736300839 -9.62797126541 -6.8544975397 0 0 0
-708 1 -20.5062522132 -6.91692551164 -6.81314410103 0 0 0
-709 1 -14.8769822336 -9.66870114401 -9.67267988709 0 0 0
-710 1 -12.2062527723 -6.84590764332 -9.57757147848 0 0 0
-711 1 -12.3885531632 -9.70828460078 -6.65081595626 0 0 0
-712 1 -14.9383107084 -6.87585946674 -6.95247372138 0 0 0
-713 1 -9.58043033238 -9.54213496513 -9.56054656571 0 0 0
-714 1 -7.16066565542 -6.83443835931 -9.49770648855 0 0 0
-715 1 -7.01311721491 -9.38786899673 -6.8160134726 0 0 0
-716 1 -9.69180663948 -6.67720692304 -6.7319604069 0 0 0
-717 1 -4.2990990517 -9.38948012312 -9.69985939655 0 0 0
-718 1 -1.49917478163 -6.82019166985 -9.60496700918 0 0 0
-719 1 -1.60287294783 -9.54987836198 -6.86616311266 0 0 0
-720 1 -4.25708012965 -6.75936350871 -6.99712454133 0 0 0
-721 1 1.22476607342 -9.75518527556 -9.64932807555 0 0 0
-722 1 3.89118253456 -6.83913597121 -9.57161040147 0 0 0
-723 1 3.85853621553 -9.6111969143 -6.86438975392 0 0 0
-724 1 1.35034909106 -6.92674622488 -6.83089549194 0 0 0
-725 1 6.68876104793 -9.44534036734 -9.51432478039 0 0 0
-726 1 9.43680234052 -6.85893856269 -9.65785649165 0 0 0
-727 1 9.27667085057 -9.4535792349 -6.77481478269 0 0 0
-728 1 6.79055817917 -6.86056607863 -6.94362234987 0 0 0
-729 1 12.0213964727 -9.6835328486 -9.54882834905 0 0 0
-730 1 14.800474769 -6.8706572821 -9.38950293253 0 0 0
-731 1 14.8629708733 -9.59634731125 -7.02104868083 0 0 0
-732 1 12.0684375523 -6.92694353527 -6.89728756293 0 0 0
-733 1 17.747134111 -9.53161640402 -9.6877952476 0 0 0
-734 1 20.2594673304 -6.70997989932 -9.48504731622 0 0 0
-735 1 20.2694634596 -9.34377592312 -6.70903640641 0 0 0
-736 1 17.5352846566 -6.87242754228 -6.68869985704 0 0 0
-737 1 22.7906609071 -9.36272312522 -9.67810076299 0 0 0
-738 1 25.6562631712 -6.6937186192 -9.541914477 0 0 0
-739 1 25.8025601916 -9.32090526824 -6.78218854654 0 0 0
-740 1 22.9046306765 -6.75190189262 -6.78007908623 0 0 0
-741 1 28.4357211866 -9.43563523164 -9.65005620525 0 0 0
-742 1 31.3839102369 -6.81389748589 -9.66171933531 0 0 0
-743 1 31.3251625865 -9.30474260339 -6.75941251321 0 0 0
-744 1 28.3847530423 -6.77877451785 -6.86563623578 0 0 0
-745 1 33.8499393192 -9.55696096592 -9.44850084544 0 0 0
-746 1 36.5116363189 -6.97246908438 -9.45049841827 0 0 0
-747 1 36.3475923053 -9.53415006763 -6.59762391103 0 0 0
-748 1 33.8658174845 -6.6851997174 -6.72250492943 0 0 0
-749 1 39.0307617804 -9.61503307797 -9.53857498626 0 0 0
-750 1 41.6642712631 -6.8052209675 -9.65744879819 0 0 0
-751 1 41.9099304543 -9.64618848216 -6.8820442662 0 0 0
-752 1 39.193851831 -6.81892145055 -6.81396639243 0 0 0
-753 1 44.5080662824 -9.41429171123 -9.44466737811 0 0 0
-754 1 47.4478798374 -6.83312143344 -9.24893082951 0 0 0
-755 1 47.4185928157 -9.49971728319 -6.70566840243 0 0 0
-756 1 44.5834371412 -6.7896006598 -6.55808712076 0 0 0
-757 1 49.9027547313 -9.52479247047 -9.33997191799 0 0 0
-758 1 52.7675506904 -6.85840567223 -9.36534255603 0 0 0
-759 1 52.6030679012 -9.71011685431 -6.57150549839 0 0 0
-760 1 50.1800149737 -6.75589335928 -6.71330096264 0 0 0
-761 1 55.40125 -9.45875 -9.45875 0 0 0
-762 1 58.10375 -6.75625 -9.45875 0 0 0
-763 1 58.10375 -9.45875 -6.75625 0 0 0
-764 1 55.40125 -6.75625 -6.75625 0 0 0
-765 1 60.80625 -9.45875 -9.45875 0 0 0
-766 1 63.50875 -6.75625 -9.45875 0 0 0
-767 1 63.50875 -9.45875 -6.75625 0 0 0
-768 1 60.80625 -6.75625 -6.75625 0 0 0
-769 1 -63.50875 -4.05375 -9.45875 0 0 0
-770 1 -60.80625 -1.35125 -9.45875 0 0 0
-771 1 -60.80625 -4.05375 -6.75625 0 0 0
-772 1 -63.50875 -1.35125 -6.75625 0 0 0
-773 1 -58.10375 -4.05375 -9.45875 0 0 0
-774 1 -55.40125 -1.35125 -9.45875 0 0 0
-775 1 -55.40125 -4.05375 -6.75625 0 0 0
-776 1 -58.10375 -1.35125 -6.75625 0 0 0
-777 1 -52.6417673337 -3.92232611021 -9.58229331117 0 0 0
-778 1 -50.001216127 -1.27359147632 -9.48638343339 0 0 0
-779 1 -50.0661057943 -3.89310585953 -6.79031645579 0 0 0
-780 1 -52.8376107567 -1.23342816217 -6.68078436946 0 0 0
-781 1 -47.4660853471 -3.99754681541 -9.5677571152 0 0 0
-782 1 -44.6010392258 -1.33468876903 -9.41914235329 0 0 0
-783 1 -44.6802677388 -3.86735994685 -6.77435046814 0 0 0
-784 1 -47.3750659139 -1.44353332163 -6.74799600535 0 0 0
-785 1 -41.8775469168 -3.99240228719 -9.47173966804 0 0 0
-786 1 -39.0596982615 -1.50723781574 -9.60597648672 0 0 0
-787 1 -39.1292062404 -4.16698904137 -6.92997579987 0 0 0
-788 1 -41.7960552884 -1.12312170637 -6.95795209966 0 0 0
-789 1 -36.6140344235 -4.16099935981 -9.89021612104 0 0 0
-790 1 -33.9483814642 -1.49787499521 -9.60456366331 0 0 0
-791 1 -33.7596454051 -4.17226468444 -6.9630879781 0 0 0
-792 1 -36.5271645453 -1.64589381448 -6.80044714978 0 0 0
-793 1 -30.9186181198 -4.08327784032 -9.47287320058 0 0 0
-794 1 -28.4102268462 -1.44898179958 -9.68019523814 0 0 0
-795 1 -28.3998026185 -4.08440502253 -6.81810588487 0 0 0
-796 1 -31.2137107215 -1.54901437261 -6.92979048069 0 0 0
-797 1 -25.7786563521 -4.18582642684 -9.67499953865 0 0 0
-798 1 -23.0778143662 -1.36299958305 -9.84521547949 0 0 0
-799 1 -23.1643321339 -3.96558853474 -6.97297871985 0 0 0
-800 1 -25.8641698569 -1.49922043409 -7.06428191916 0 0 0
-801 1 -20.4193481573 -4.08568125277 -9.62251591561 0 0 0
-802 1 -17.6448116466 -1.5671291475 -9.47447296057 0 0 0
-803 1 -17.7647698673 -4.00158185191 -6.75769012902 0 0 0
-804 1 -20.3154259894 -1.30263145124 -7.08476457601 0 0 0
-805 1 -14.8630260687 -4.2004260264 -9.46520367994 0 0 0
-806 1 -12.2284772477 -1.42922241261 -9.63479338223 0 0 0
-807 1 -12.324325766 -4.08933019193 -6.87437520298 0 0 0
-808 1 -14.831997407 -1.38049434642 -6.88222988245 0 0 0
-809 1 -9.62612426971 -3.94351225831 -9.69232091095 0 0 0
-810 1 -6.79050685968 -1.44728076959 -9.72238137719 0 0 0
-811 1 -6.95167307273 -4.11659184922 -6.83627514616 0 0 0
-812 1 -9.6146284862 -1.47770112886 -6.69441308868 0 0 0
-813 1 -3.97655292211 -4.22255601996 -9.61748167474 0 0 0
-814 1 -1.17337163985 -1.32680605114 -9.16265465241 0 0 0
-815 1 -1.28356644193 -4.13274673981 -6.85234534425 0 0 0
-816 1 -4.20738932589 -1.58268981193 -6.7959782655 0 0 0
-817 1 1.29930877099 -4.2418471428 -9.46530432814 0 0 0
-818 1 3.9071749253 -1.45234936313 -9.33227777607 0 0 0
-819 1 4.08108474699 -4.0270296995 -6.67682344837 0 0 0
-820 1 1.5376102081 -1.20692978192 -6.52751251899 0 0 0
-821 1 6.73874105331 -4.22339021619 -9.52496576832 0 0 0
-822 1 9.30219291872 -1.37706640878 -9.46519895154 0 0 0
-823 1 9.45802964399 -4.23971158756 -6.89439401556 0 0 0
-824 1 6.90284437996 -1.42589759777 -6.65728459159 0 0 0
-825 1 11.9647586996 -4.03934103022 -9.51791592916 0 0 0
-826 1 14.6187399773 -1.29553129171 -9.52583863816 0 0 0
-827 1 14.7765812088 -3.94225846725 -6.92101364812 0 0 0
-828 1 11.8130740431 -1.45555124249 -6.71574002357 0 0 0
-829 1 17.3994125902 -4.16910151001 -9.45739961687 0 0 0
-830 1 20.1997882042 -1.31502107307 -9.48219424852 0 0 0
-831 1 20.3023066359 -3.99332482955 -6.79454620269 0 0 0
-832 1 17.4677346861 -1.24082733617 -7.17592389219 0 0 0
-833 1 22.8337345246 -4.11464103053 -9.53424222876 0 0 0
-834 1 25.5071481041 -1.63549851644 -9.58557011511 0 0 0
-835 1 25.6851015566 -4.22056637997 -6.89350546964 0 0 0
-836 1 22.934431664 -1.3881730884 -6.88822945922 0 0 0
-837 1 28.4285198023 -4.16086354195 -9.72643074256 0 0 0
-838 1 31.18045466 -1.37103718833 -9.48434445997 0 0 0
-839 1 31.0021639417 -4.04696745468 -6.85321544181 0 0 0
-840 1 28.1619361549 -1.38055899927 -6.74144155728 0 0 0
-841 1 33.9339570001 -4.03080854148 -9.72941005687 0 0 0
-842 1 36.4410181579 -1.45046064071 -9.5706021298 0 0 0
-843 1 36.4585689944 -4.09631277566 -6.8073894512 0 0 0
-844 1 33.9504504561 -1.29438442969 -6.88044463309 0 0 0
-845 1 39.1598300176 -4.04128458957 -9.63842767061 0 0 0
-846 1 41.8555564465 -1.20195156145 -9.52056010322 0 0 0
-847 1 41.7546648867 -3.9589996949 -6.86751486837 0 0 0
-848 1 39.2899088637 -1.29354887084 -6.74912193047 0 0 0
-849 1 44.7506225466 -4.24906431528 -9.55879093076 0 0 0
-850 1 47.3834682291 -1.48065286301 -9.4559850197 0 0 0
-851 1 47.3490993899 -4.08230491463 -6.78011944849 0 0 0
-852 1 44.7190321329 -1.33155504558 -6.88535182355 0 0 0
-853 1 50.0301009102 -4.09806430618 -9.40098587234 0 0 0
-854 1 52.7520530102 -1.39567213241 -9.71249734908 0 0 0
-855 1 52.6705356762 -4.0906638711 -6.91930837527 0 0 0
-856 1 50.0930145473 -1.22559636815 -6.78145329406 0 0 0
-857 1 55.40125 -4.05375 -9.45875 0 0 0
-858 1 58.10375 -1.35125 -9.45875 0 0 0
-859 1 58.10375 -4.05375 -6.75625 0 0 0
-860 1 55.40125 -1.35125 -6.75625 0 0 0
-861 1 60.80625 -4.05375 -9.45875 0 0 0
-862 1 63.50875 -1.35125 -9.45875 0 0 0
-863 1 63.50875 -4.05375 -6.75625 0 0 0
-864 1 60.80625 -1.35125 -6.75625 0 0 0
-865 1 -63.50875 1.35125 -9.45875 0 0 0
-866 1 -60.80625 4.05375 -9.45875 0 0 0
-867 1 -60.80625 1.35125 -6.75625 0 0 0
-868 1 -63.50875 4.05375 -6.75625 0 0 0
-869 1 -58.10375 1.35125 -9.45875 0 0 0
-870 1 -55.40125 4.05375 -9.45875 0 0 0
-871 1 -55.40125 1.35125 -6.75625 0 0 0
-872 1 -58.10375 4.05375 -6.75625 0 0 0
-873 1 -52.7877032172 1.26564483011 -9.60420906672 0 0 0
-874 1 -50.0295233638 3.88752280871 -9.2487951709 0 0 0
-875 1 -50.067326819 1.44830156211 -6.76478166529 0 0 0
-876 1 -52.8071172425 4.05468908035 -6.83068299986 0 0 0
-877 1 -47.2045196034 1.1939373827 -9.26868731821 0 0 0
-878 1 -44.5729943069 3.82099152009 -9.49977097236 0 0 0
-879 1 -44.5204130345 1.23920234331 -6.701664434 0 0 0
-880 1 -46.9518763083 4.01278238481 -6.86580812486 0 0 0
-881 1 -41.8260091733 1.41300713011 -9.58820491006 0 0 0
-882 1 -39.2572214107 4.15983948229 -9.50914051849 0 0 0
-883 1 -39.188648642 1.24285820746 -6.93385169451 0 0 0
-884 1 -41.9782532576 3.73394068375 -6.72138601478 0 0 0
-885 1 -36.4944784963 1.21795533123 -9.60424110639 0 0 0
-886 1 -33.6020898105 4.04862721765 -9.69863260347 0 0 0
-887 1 -33.7788872887 1.33739853191 -6.89317400361 0 0 0
-888 1 -36.4734853761 3.95924450352 -6.91638374293 0 0 0
-889 1 -31.2074623405 0.962615661338 -9.62600552072 0 0 0
-890 1 -28.5967573871 3.94163293173 -9.64152053715 0 0 0
-891 1 -28.6819894122 1.3585066124 -6.89464523181 0 0 0
-892 1 -31.2976403287 4.08118559417 -6.84417294292 0 0 0
-893 1 -25.6661251811 1.42388608748 -9.37217581633 0 0 0
-894 1 -22.9912923287 4.04599550994 -9.50072877759 0 0 0
-895 1 -22.9910877065 1.15132879512 -6.80955854767 0 0 0
-896 1 -25.7474385318 3.84883032794 -6.66018817149 0 0 0
-897 1 -20.4240855788 1.34565498461 -9.69251727622 0 0 0
-898 1 -17.758182026 3.99732386482 -9.56653980997 0 0 0
-899 1 -17.5818551753 1.26016367968 -7.0953055868 0 0 0
-900 1 -20.3663232075 3.86922015804 -6.9899702359 0 0 0
-901 1 -14.7454714745 1.30329303364 -9.76273814022 0 0 0
-902 1 -12.2932698133 4.09562044322 -9.5706700262 0 0 0
-903 1 -12.1993184344 1.38673379169 -6.93348146784 0 0 0
-904 1 -14.9844385842 3.92706439785 -6.73840818461 0 0 0
-905 1 -9.47290015438 1.05734604202 -9.49795793989 0 0 0
-906 1 -6.66934717853 3.9179013525 -9.45673318951 0 0 0
-907 1 -6.77817909384 1.20172317672 -6.85126874014 0 0 0
-908 1 -9.29942353781 4.19316776354 -6.9440518613 0 0 0
-909 1 -3.79763977338 1.1803227013 -9.30043563642 0 0 0
-910 1 -1.34952860416 3.93216398732 -9.56391804832 0 0 0
-911 1 -1.22155812277 1.28721023863 -6.7279244745 0 0 0
-912 1 -4.01398872652 3.90700103411 -6.77867476742 0 0 0
-913 1 1.48734466106 1.54205661113 -9.68557906785 0 0 0
-914 1 4.10882164659 4.03316900762 -9.68976482956 0 0 0
-915 1 4.01852982903 1.50403122006 -6.88161047068 0 0 0
-916 1 1.28931884043 4.14517421616 -6.88360475232 0 0 0
-917 1 6.88031993466 1.21560900654 -9.42040325157 0 0 0
-918 1 9.50860751935 3.84745617646 -9.57986150753 0 0 0
-919 1 9.47502411803 1.26469621302 -6.88435915415 0 0 0
-920 1 6.73885924378 4.0933854791 -6.78408590349 0 0 0
-921 1 12.1713855372 1.33078183164 -9.58669514153 0 0 0
-922 1 14.8974000745 3.97815187862 -9.8025772005 0 0 0
-923 1 14.7322243867 1.41657692623 -6.89563102918 0 0 0
-924 1 12.3218422102 4.06044384247 -6.89887568174 0 0 0
-925 1 17.4834719019 1.37863130112 -9.7932406333 0 0 0
-926 1 20.2923594011 4.13236244814 -9.66013621131 0 0 0
-927 1 20.1245505307 1.45394179747 -7.06540215452 0 0 0
-928 1 17.6117479875 4.16119193152 -6.89685059516 0 0 0
-929 1 22.9885941357 1.26638426374 -9.51317152595 0 0 0
-930 1 25.7351753681 4.10181205118 -9.57256883993 0 0 0
-931 1 25.5963935108 1.4841708736 -6.84471717433 0 0 0
-932 1 22.7677668558 4.20539667301 -6.92008787423 0 0 0
-933 1 28.4333214574 1.29433067731 -9.8128848806 0 0 0
-934 1 30.839023665 4.0228142774 -9.6876985468 0 0 0
-935 1 30.9733263324 1.10730186383 -6.80715562908 0 0 0
-936 1 28.323820564 4.03986895475 -6.93563152821 0 0 0
-937 1 33.7880682171 1.25624469726 -9.66653426236 0 0 0
-938 1 36.3525226011 4.2374279607 -9.40970763146 0 0 0
-939 1 36.5393267921 1.33014978643 -6.99900949675 0 0 0
-940 1 33.7480412123 4.10697468024 -6.81521997778 0 0 0
-941 1 39.2227266561 1.262425503 -9.46650129011 0 0 0
-942 1 42.2205527778 3.73515614789 -9.60296353291 0 0 0
-943 1 41.9126857149 1.4357897683 -6.82786238946 0 0 0
-944 1 39.2666375395 4.09652531386 -6.78933221579 0 0 0
-945 1 44.7629084023 1.44590719011 -9.34480565554 0 0 0
-946 1 47.4084116058 4.12680718917 -9.38394343614 0 0 0
-947 1 47.442360897 1.23489154021 -6.80215841807 0 0 0
-948 1 44.686594436 3.81083169749 -6.7289788188 0 0 0
-949 1 50.3391131396 1.45902530672 -9.38850386255 0 0 0
-950 1 52.8013219947 4.10362310054 -9.4930198462 0 0 0
-951 1 52.868235367 1.46045262963 -6.62738503788 0 0 0
-952 1 49.99628289 4.18248373236 -6.7717190657 0 0 0
-953 1 55.40125 1.35125 -9.45875 0 0 0
-954 1 58.10375 4.05375 -9.45875 0 0 0
-955 1 58.10375 1.35125 -6.75625 0 0 0
-956 1 55.40125 4.05375 -6.75625 0 0 0
-957 1 60.80625 1.35125 -9.45875 0 0 0
-958 1 63.50875 4.05375 -9.45875 0 0 0
-959 1 63.50875 1.35125 -6.75625 0 0 0
-960 1 60.80625 4.05375 -6.75625 0 0 0
-961 1 -63.50875 6.75625 -9.45875 0 0 0
-962 1 -60.80625 9.45875 -9.45875 0 0 0
-963 1 -60.80625 6.75625 -6.75625 0 0 0
-964 1 -63.50875 9.45875 -6.75625 0 0 0
-965 1 -58.10375 6.75625 -9.45875 0 0 0
-966 1 -55.40125 9.45875 -9.45875 0 0 0
-967 1 -55.40125 6.75625 -6.75625 0 0 0
-968 1 -58.10375 9.45875 -6.75625 0 0 0
-969 1 -52.7122285978 6.65827588279 -9.56509756851 0 0 0
-970 1 -49.867050475 9.29213823604 -9.4144864281 0 0 0
-971 1 -49.9722411283 6.61651643821 -6.61153772357 0 0 0
-972 1 -52.6109249597 9.39810486444 -6.83014787025 0 0 0
-973 1 -47.3927149438 6.39949697113 -9.59381199964 0 0 0
-974 1 -44.7670207727 9.44103653658 -9.54302923888 0 0 0
-975 1 -44.6845204506 6.63164372002 -6.76937250817 0 0 0
-976 1 -47.417135316 9.30400212901 -6.8640145934 0 0 0
-977 1 -41.8835115668 6.71090485705 -9.63785408615 0 0 0
-978 1 -39.2350504909 9.42953955288 -9.57250184235 0 0 0
-979 1 -39.1365218185 6.80902119684 -6.88968212863 0 0 0
-980 1 -41.7745674972 9.38901984967 -6.83232840585 0 0 0
-981 1 -36.4898162108 6.56729171413 -9.66180708511 0 0 0
-982 1 -33.8713292888 9.47740926969 -9.38751542124 0 0 0
-983 1 -33.9302336109 6.78388115493 -6.99727345503 0 0 0
-984 1 -36.4747863269 9.6165494304 -6.89782587163 0 0 0
-985 1 -31.3503460122 6.8882110205 -9.64109554523 0 0 0
-986 1 -28.5807958454 9.67086879982 -9.85260013434 0 0 0
-987 1 -28.6430616319 6.70976639471 -6.87782613485 0 0 0
-988 1 -31.1217306185 9.47851576401 -6.90175345871 0 0 0
-989 1 -25.8927339741 6.80617919847 -9.54530413187 0 0 0
-990 1 -23.1810535896 9.5794822575 -9.55134005461 0 0 0
-991 1 -23.1571099689 6.67298386697 -7.00982719947 0 0 0
-992 1 -25.8307240205 9.62507901851 -7.12163502607 0 0 0
-993 1 -20.5531670729 6.80040618338 -9.70290809461 0 0 0
-994 1 -17.5588885619 9.51917852478 -9.59480234419 0 0 0
-995 1 -17.9326882505 6.7461089128 -6.94258388402 0 0 0
-996 1 -20.3065074361 9.48132370298 -6.93997596714 0 0 0
-997 1 -14.9044896993 6.75431642624 -9.47974287676 0 0 0
-998 1 -12.3960383515 9.46592559326 -9.61806953943 0 0 0
-999 1 -12.3747519475 6.67425327953 -6.87667033263 0 0 0
-1000 1 -14.8832901189 9.51541004692 -6.92560271981 0 0 0
-1001 1 -9.54324087113 6.70467069674 -9.63159788116 0 0 0
-1002 1 -6.70413228382 9.40168236123 -9.47474118825 0 0 0
-1003 1 -6.75125432676 6.78843428599 -6.90872027556 0 0 0
-1004 1 -9.56647354161 9.37032774175 -7.04446753834 0 0 0
-1005 1 -3.97859354146 6.92764348389 -9.52082288082 0 0 0
-1006 1 -1.45349892883 9.68728307007 -9.58813538728 0 0 0
-1007 1 -1.38136748794 6.87991978569 -6.89803140543 0 0 0
-1008 1 -4.06056588635 9.4424087669 -6.86213505071 0 0 0
-1009 1 1.38108748884 6.91888388673 -9.55986683143 0 0 0
-1010 1 4.28832422691 9.50198188086 -9.55137474082 0 0 0
-1011 1 4.12127130435 6.68127604521 -6.88937094078 0 0 0
-1012 1 1.32237205619 9.49723964891 -6.63892090204 0 0 0
-1013 1 6.92411301623 6.66331768571 -9.70350582782 0 0 0
-1014 1 9.45118357509 9.5343788324 -9.61507494858 0 0 0
-1015 1 9.59428107302 6.74878903913 -6.89564240808 0 0 0
-1016 1 6.88742374233 9.31586139926 -6.93395964347 0 0 0
-1017 1 12.009472165 6.65196944159 -9.83378684658 0 0 0
-1018 1 14.8825823593 9.27211094265 -9.66498013215 0 0 0
-1019 1 14.781797725 6.79344813446 -6.95197232338 0 0 0
-1020 1 11.9377473286 9.54783477375 -7.0626425892 0 0 0
-1021 1 17.6943702359 6.76391137315 -9.76470505278 0 0 0
-1022 1 20.2504572298 9.41565047636 -9.45803142763 0 0 0
-1023 1 20.2131532756 6.68923662675 -6.75770081682 0 0 0
-1024 1 17.4076509323 9.66616471392 -6.8014175118 0 0 0
-1025 1 23.061570373 6.85222762345 -9.65025832355 0 0 0
-1026 1 25.7057381718 9.43339610835 -9.61659236994 0 0 0
-1027 1 25.7552209795 6.71033198745 -6.89161804995 0 0 0
-1028 1 23.0377488099 9.35024072534 -7.05249592509 0 0 0
-1029 1 28.393635954 6.85146546644 -9.59947996154 0 0 0
-1030 1 31.0823526869 9.42055203396 -9.33626338307 0 0 0
-1031 1 30.9871419402 6.65168454019 -6.90475236698 0 0 0
-1032 1 28.4338261758 9.24956662441 -6.70957146304 0 0 0
-1033 1 33.8101934758 6.76402874782 -9.36171183814 0 0 0
-1034 1 36.6883256197 9.31445105811 -9.78162237109 0 0 0
-1035 1 36.7764397522 6.84259060107 -6.71850460126 0 0 0
-1036 1 33.8702931504 9.34268229794 -6.95657105073 0 0 0
-1037 1 39.320369471 6.66986888162 -9.54385371315 0 0 0
-1038 1 42.1249701444 9.46449401842 -9.53439283594 0 0 0
-1039 1 42.0602377539 6.56129284611 -6.82447368713 0 0 0
-1040 1 39.4312163056 9.39168355494 -6.74678231471 0 0 0
-1041 1 44.6273415132 6.56951330081 -9.48656312444 0 0 0
-1042 1 47.1308056058 9.23844685604 -9.39077255517 0 0 0
-1043 1 47.3774411216 6.75293488134 -6.66383777927 0 0 0
-1044 1 44.6438565663 9.40988463249 -6.50747099108 0 0 0
-1045 1 49.9463455569 6.89486744387 -9.48098027532 0 0 0
-1046 1 52.6607327186 9.46305409703 -9.47004043759 0 0 0
-1047 1 52.6383956994 6.780698961 -6.68391458104 0 0 0
-1048 1 50.0824965433 9.64992285376 -6.80885505405 0 0 0
-1049 1 55.40125 6.75625 -9.45875 0 0 0
-1050 1 58.10375 9.45875 -9.45875 0 0 0
-1051 1 58.10375 6.75625 -6.75625 0 0 0
-1052 1 55.40125 9.45875 -6.75625 0 0 0
-1053 1 60.80625 6.75625 -9.45875 0 0 0
-1054 1 63.50875 9.45875 -9.45875 0 0 0
-1055 1 63.50875 6.75625 -6.75625 0 0 0
-1056 1 60.80625 9.45875 -6.75625 0 0 0
-1057 1 -63.50875 12.16125 -9.45875 0 0 0
-1058 1 -60.80625 14.86375 -9.45875 0 0 0
-1059 1 -60.80625 12.16125 -6.75625 0 0 0
-1060 1 -63.50875 14.86375 -6.75625 0 0 0
-1061 1 -58.10375 12.16125 -9.45875 0 0 0
-1062 1 -55.40125 14.86375 -9.45875 0 0 0
-1063 1 -55.40125 12.16125 -6.75625 0 0 0
-1064 1 -58.10375 14.86375 -6.75625 0 0 0
-1065 1 -52.6405472255 11.9385047321 -9.42863482943 0 0 0
-1066 1 -50.0273932982 14.7307144673 -9.48427776868 0 0 0
-1067 1 -50.0626631298 12.2230163681 -6.68244113657 0 0 0
-1068 1 -52.7346058859 14.8210610758 -6.86872315333 0 0 0
-1069 1 -47.2242791212 12.301849874 -9.45757159614 0 0 0
-1070 1 -44.5018944987 14.6695854916 -9.40206120213 0 0 0
-1071 1 -44.4473440575 11.941706711 -6.72359872332 0 0 0
-1072 1 -47.3035086247 14.6579969551 -6.69564797797 0 0 0
-1073 1 -41.9474614584 11.9997570662 -9.63629115933 0 0 0
-1074 1 -39.3486387586 14.804397415 -9.48320738247 0 0 0
-1075 1 -39.3034542308 12.2016045552 -6.63138947201 0 0 0
-1076 1 -42.0503564501 14.9453234773 -6.66095274396 0 0 0
-1077 1 -36.6254970472 12.2254599245 -9.48061388261 0 0 0
-1078 1 -33.8453764958 14.7101057008 -9.52344429755 0 0 0
-1079 1 -33.9425195443 12.1702471918 -6.79211954213 0 0 0
-1080 1 -36.6662866441 14.8439030939 -6.736468515 0 0 0
-1081 1 -31.1885039732 12.1015697738 -9.57823013068 0 0 0
-1082 1 -28.5086492449 15.0402164743 -9.41095621402 0 0 0
-1083 1 -28.4890238535 12.1150855649 -6.89866899078 0 0 0
-1084 1 -31.2362771426 14.7023644408 -6.7453280767 0 0 0
-1085 1 -25.8983829505 12.389028779 -9.63354340988 0 0 0
-1086 1 -22.9807257703 14.7650675847 -9.52870454701 0 0 0
-1087 1 -23.247156709 12.2949841499 -6.68965995791 0 0 0
-1088 1 -25.7827198474 15.0174647602 -6.87219790326 0 0 0
-1089 1 -20.1532568585 12.0913973243 -9.43428610419 0 0 0
-1090 1 -17.7197646151 14.841913542 -9.60003931065 0 0 0
-1091 1 -17.4825351408 12.0096736577 -6.5812369411 0 0 0
-1092 1 -20.2366260981 14.8222875218 -6.77203726922 0 0 0
-1093 1 -14.9902776914 12.1733180683 -9.53698563591 0 0 0
-1094 1 -12.2425036028 14.5863556085 -9.3702239611 0 0 0
-1095 1 -12.318095122 12.0021264669 -6.66335777861 0 0 0
-1096 1 -14.7713385271 14.4841961211 -6.68703507691 0 0 0
-1097 1 -9.63246859528 11.9672438359 -9.74023668454 0 0 0
-1098 1 -6.90746846923 14.9748188423 -9.47918844403 0 0 0
-1099 1 -6.7570993922 12.2286836315 -6.7977663734 0 0 0
-1100 1 -9.64559219086 14.9749110217 -6.8568859968 0 0 0
-1101 1 -4.13017045502 12.3939862764 -9.35182915543 0 0 0
-1102 1 -1.47955784571 15.001500476 -9.43275331375 0 0 0
-1103 1 -1.24878588464 12.1591098578 -6.76855753779 0 0 0
-1104 1 -4.1550596714 14.9143886069 -6.68489616808 0 0 0
-1105 1 1.4259297669 12.1724377124 -9.66342587253 0 0 0
-1106 1 3.9838029257 14.8210138588 -9.43113417021 0 0 0
-1107 1 4.05478076296 12.2624610798 -6.84812567815 0 0 0
-1108 1 1.44537996519 14.9743102529 -6.62116884862 0 0 0
-1109 1 6.72185012046 12.3064536085 -9.63296534573 0 0 0
-1110 1 9.39450612145 15.0535222301 -9.46538908416 0 0 0
-1111 1 9.34329870445 12.2847162629 -6.91855401835 0 0 0
-1112 1 6.74751814391 15.0274983516 -6.73691785509 0 0 0
-1113 1 12.1710255022 12.1619012057 -9.56335668867 0 0 0
-1114 1 14.8186864832 14.9770479229 -9.60675936283 0 0 0
-1115 1 14.6848881733 12.0584251558 -6.78282325418 0 0 0
-1116 1 12.175191508 15.1509308641 -6.85612721403 0 0 0
-1117 1 17.4563855896 12.1322439647 -9.55173303783 0 0 0
-1118 1 20.2285360063 14.7918005917 -9.35750083923 0 0 0
-1119 1 20.4101786266 12.2167717207 -6.76604543276 0 0 0
-1120 1 17.4257149043 14.6845937684 -6.81980594627 0 0 0
-1121 1 22.9292926285 12.1739782357 -9.55122583947 0 0 0
-1122 1 25.8436926659 14.6590075994 -9.45154364006 0 0 0
-1123 1 25.8422939747 11.8871558685 -6.99296256754 0 0 0
-1124 1 23.0764687102 14.9527029052 -7.12728310791 0 0 0
-1125 1 28.3072021113 11.9588768561 -9.52798009173 0 0 0
-1126 1 31.2326472023 14.6363407986 -9.37787502413 0 0 0
-1127 1 31.1464355643 12.064570902 -6.52464380787 0 0 0
-1128 1 28.5549080219 14.8566850284 -7.0403633793 0 0 0
-1129 1 33.932455034 11.9373695683 -9.56609597157 0 0 0
-1130 1 36.7887285224 14.6626952079 -9.37488172596 0 0 0
-1131 1 36.6966712269 12.0181719695 -6.94647141169 0 0 0
-1132 1 33.8901012742 14.7474286254 -6.71442704999 0 0 0
-1133 1 39.3846655807 12.0974230318 -9.43803745089 0 0 0
-1134 1 41.9733655579 14.9010452484 -9.61104420036 0 0 0
-1135 1 42.1715685743 12.2841288094 -6.93599023249 0 0 0
-1136 1 39.2550183725 14.7635045209 -6.76731964366 0 0 0
-1137 1 44.6011776952 12.1970282597 -9.58013492828 0 0 0
-1138 1 47.1081987135 15.0667892631 -9.62400346626 0 0 0
-1139 1 47.0889959509 12.1947072829 -6.78786586088 0 0 0
-1140 1 44.6899624209 15.1230555829 -6.95928329414 0 0 0
-1141 1 49.7367424525 12.1850467572 -9.66437142329 0 0 0
-1142 1 52.6027139111 14.7722244275 -9.60610990409 0 0 0
-1143 1 52.6211907863 12.1309465764 -6.81701632965 0 0 0
-1144 1 49.8116550289 14.8917574136 -6.81107475951 0 0 0
-1145 1 55.40125 12.16125 -9.45875 0 0 0
-1146 1 58.10375 14.86375 -9.45875 0 0 0
-1147 1 58.10375 12.16125 -6.75625 0 0 0
-1148 1 55.40125 14.86375 -6.75625 0 0 0
-1149 1 60.80625 12.16125 -9.45875 0 0 0
-1150 1 63.50875 14.86375 -9.45875 0 0 0
-1151 1 63.50875 12.16125 -6.75625 0 0 0
-1152 1 60.80625 14.86375 -6.75625 0 0 0
-1153 1 -63.50875 -14.86375 -4.05375 0 0 0
-1154 1 -60.80625 -12.16125 -4.05375 0 0 0
-1155 1 -60.80625 -14.86375 -1.35125 0 0 0
-1156 1 -63.50875 -12.16125 -1.35125 0 0 0
-1157 1 -58.10375 -14.86375 -4.05375 0 0 0
-1158 1 -55.40125 -12.16125 -4.05375 0 0 0
-1159 1 -55.40125 -14.86375 -1.35125 0 0 0
-1160 1 -58.10375 -12.16125 -1.35125 0 0 0
-1161 1 -52.6003353614 -14.9024173384 -3.88501205687 0 0 0
-1162 1 -50.1025069425 -12.3204817976 -3.9955780487 0 0 0
-1163 1 -50.0108279976 -14.9133608055 -1.18563054665 0 0 0
-1164 1 -52.8296051346 -12.1505778788 -1.37624215872 0 0 0
-1165 1 -47.613609817 -15.1286432524 -3.9893223383 0 0 0
-1166 1 -44.7494477177 -12.2861221963 -3.88338953058 0 0 0
-1167 1 -44.6882423585 -14.9728286661 -1.1681089692 0 0 0
-1168 1 -47.3558496572 -12.423240089 -1.37295460412 0 0 0
-1169 1 -41.9715606587 -14.759002325 -4.05633147223 0 0 0
-1170 1 -39.2953057797 -12.009965716 -4.05426368753 0 0 0
-1171 1 -39.3322686212 -14.8943991359 -1.36466573375 0 0 0
-1172 1 -42.0096944973 -12.0523892901 -1.32017387613 0 0 0
-1173 1 -36.5564144546 -14.7627045998 -4.30705286275 0 0 0
-1174 1 -33.7130773832 -12.1475704699 -4.00261585971 0 0 0
-1175 1 -33.9269201515 -14.9120357752 -1.38767158727 0 0 0
-1176 1 -36.3882622449 -12.2533421794 -1.47985219626 0 0 0
-1177 1 -31.0770682253 -15.0372885823 -4.16524756211 0 0 0
-1178 1 -28.3282109231 -12.2604400165 -4.11653045055 0 0 0
-1179 1 -28.3895477768 -14.875862308 -1.4513570252 0 0 0
-1180 1 -31.0641700734 -12.3372627436 -1.53108446041 0 0 0
-1181 1 -25.8359810417 -14.9154608382 -4.17265994686 0 0 0
-1182 1 -23.0274328844 -12.2004922514 -4.21509880078 0 0 0
-1183 1 -22.7993476507 -14.8957836389 -1.47173955436 0 0 0
-1184 1 -25.719053698 -12.2063222986 -1.49820432237 0 0 0
-1185 1 -19.9885562479 -15.0956205071 -4.19882325144 0 0 0
-1186 1 -17.3729143832 -12.3538719266 -4.04878057888 0 0 0
-1187 1 -17.4371832293 -15.1241960582 -1.37996104415 0 0 0
-1188 1 -20.2503923506 -12.18659657 -1.60625238388 0 0 0
-1189 1 -14.8203335621 -15.0550135236 -4.09407227032 0 0 0
-1190 1 -12.2479743536 -12.2732902071 -4.02080651756 0 0 0
-1191 1 -12.1290437273 -15.0023205408 -1.18255830915 0 0 0
-1192 1 -14.7614390999 -12.2278882516 -1.38390976522 0 0 0
-1193 1 -9.65152921817 -14.9117454115 -3.95232751182 0 0 0
-1194 1 -7.02735281584 -12.1528838899 -4.01073485879 0 0 0
-1195 1 -6.8237476456 -14.8170116174 -1.36581217168 0 0 0
-1196 1 -9.69344296268 -12.1856376891 -1.37006166524 0 0 0
-1197 1 -4.33327859141 -14.9996433743 -4.27858041882 0 0 0
-1198 1 -1.36847246508 -12.224360661 -4.02658179323 0 0 0
-1199 1 -1.44643880952 -15.0847199707 -1.5391289476 0 0 0
-1200 1 -4.03782822954 -12.2314089535 -1.45725373833 0 0 0
-1201 1 1.34843682014 -14.7577955701 -3.99696222127 0 0 0
-1202 1 3.98414115811 -12.1448802439 -3.85260189205 0 0 0
-1203 1 4.05475791089 -14.9836800422 -1.2233652296 0 0 0
-1204 1 1.3722140134 -12.0856575253 -1.25300777203 0 0 0
-1205 1 6.70863907503 -14.8536332422 -3.80565517188 0 0 0
-1206 1 9.2357230288 -12.2687910903 -4.03668293418 0 0 0
-1207 1 9.55385802125 -14.9107474793 -1.31378865335 0 0 0
-1208 1 6.78998106234 -12.0718174625 -1.27256984948 0 0 0
-1209 1 12.1592105598 -14.8022797493 -4.0542350816 0 0 0
-1210 1 14.9965169927 -12.0641409267 -4.11610950196 0 0 0
-1211 1 14.8548445124 -15.101567407 -1.36787377708 0 0 0
-1212 1 12.1931792955 -12.4435609575 -1.3680526737 0 0 0
-1213 1 17.390393563 -14.9652659647 -4.1567167837 0 0 0
-1214 1 20.2991622501 -12.1338115968 -4.13210572067 0 0 0
-1215 1 20.4049325987 -14.8655175472 -1.6195283656 0 0 0
-1216 1 17.658849822 -12.1912538189 -1.54006117407 0 0 0
-1217 1 23.1716132112 -14.9091369125 -4.40344192185 0 0 0
-1218 1 26.092182864 -12.2380278512 -4.57280223576 0 0 0
-1219 1 25.9472107104 -14.7199137466 -1.59703098679 0 0 0
-1220 1 22.9947809282 -12.0989586141 -1.62198082057 0 0 0
-1221 1 28.4350729077 -15.0189294997 -4.35167111153 0 0 0
-1222 1 31.0481894889 -12.0491834001 -4.00431235415 0 0 0
-1223 1 31.0792872507 -15.1294797514 -1.4912495131 0 0 0
-1224 1 28.6365637591 -12.1374075953 -1.41010367913 0 0 0
-1225 1 33.888180763 -14.9478622979 -4.01850495321 0 0 0
-1226 1 36.3526824548 -12.2864400335 -3.9203446168 0 0 0
-1227 1 36.4846991928 -15.0962667003 -1.42166501993 0 0 0
-1228 1 33.5310442473 -12.0013454855 -1.27080930852 0 0 0
-1229 1 39.3824582833 -14.8609998941 -4.06097904342 0 0 0
-1230 1 41.8650647009 -12.2541444213 -3.83656313498 0 0 0
-1231 1 41.8209029301 -14.9120592572 -1.36005455465 0 0 0
-1232 1 39.1294938229 -12.215271226 -1.45875923662 0 0 0
-1233 1 44.6694000298 -14.8881224962 -4.01176297353 0 0 0
-1234 1 47.3837762387 -12.2369613894 -3.93967724243 0 0 0
-1235 1 47.1899556978 -15.0141792329 -1.29722218046 0 0 0
-1236 1 44.5596688698 -11.8524461612 -1.44254654697 0 0 0
-1237 1 49.9573043208 -14.947033511 -3.96206753934 0 0 0
-1238 1 52.6093527903 -12.3000962714 -3.96049922289 0 0 0
-1239 1 52.5733378744 -14.7802190084 -1.28295034069 0 0 0
-1240 1 49.9804873863 -12.003083173 -1.08422649707 0 0 0
-1241 1 55.40125 -14.86375 -4.05375 0 0 0
-1242 1 58.10375 -12.16125 -4.05375 0 0 0
-1243 1 58.10375 -14.86375 -1.35125 0 0 0
-1244 1 55.40125 -12.16125 -1.35125 0 0 0
-1245 1 60.80625 -14.86375 -4.05375 0 0 0
-1246 1 63.50875 -12.16125 -4.05375 0 0 0
-1247 1 63.50875 -14.86375 -1.35125 0 0 0
-1248 1 60.80625 -12.16125 -1.35125 0 0 0
-1249 1 -63.50875 -9.45875 -4.05375 0 0 0
-1250 1 -60.80625 -6.75625 -4.05375 0 0 0
-1251 1 -60.80625 -9.45875 -1.35125 0 0 0
-1252 1 -63.50875 -6.75625 -1.35125 0 0 0
-1253 1 -58.10375 -9.45875 -4.05375 0 0 0
-1254 1 -55.40125 -6.75625 -4.05375 0 0 0
-1255 1 -55.40125 -9.45875 -1.35125 0 0 0
-1256 1 -58.10375 -6.75625 -1.35125 0 0 0
-1257 1 -52.6465750131 -9.34701116705 -3.9715529754 0 0 0
-1258 1 -49.9411391723 -6.59082582305 -4.19033035577 0 0 0
-1259 1 -50.2297557143 -9.4681678446 -1.41683745457 0 0 0
-1260 1 -52.6553152752 -6.59904074453 -1.26028960288 0 0 0
-1261 1 -47.3525849197 -9.37633129547 -4.0654133717 0 0 0
-1262 1 -44.7003173342 -6.62381228183 -4.04980418465 0 0 0
-1263 1 -44.6695105775 -9.34118082243 -1.35111100242 0 0 0
-1264 1 -47.4066348659 -6.66129318063 -1.36230591829 0 0 0
-1265 1 -42.0929840996 -9.41581842848 -4.16407667685 0 0 0
-1266 1 -39.2675803026 -6.66198964804 -3.99286744614 0 0 0
-1267 1 -39.3154285877 -9.40841546967 -1.58863602899 0 0 0
-1268 1 -41.893536647 -6.51781167707 -1.4993831137 0 0 0
-1269 1 -36.2779050637 -9.42829708062 -4.23778860505 0 0 0
-1270 1 -33.810315495 -6.87946800434 -4.33871346937 0 0 0
-1271 1 -33.5617453016 -9.49619198325 -1.61140442036 0 0 0
-1272 1 -36.3301889179 -6.74934974206 -1.45275682555 0 0 0
-1273 1 -31.0722694795 -9.55242543641 -4.37893874683 0 0 0
-1274 1 -28.5101081599 -6.70799984885 -4.21229451358 0 0 0
-1275 1 -28.374442027 -9.71123308303 -1.69182675352 0 0 0
-1276 1 -31.1058786142 -6.73787647809 -1.5570894739 0 0 0
-1277 1 -25.6841524994 -9.53318944994 -4.03981475765 0 0 0
-1278 1 -23.0054576949 -6.66286591142 -4.13351091554 0 0 0
-1279 1 -22.8925853416 -9.58192326677 -1.53584692705 0 0 0
-1280 1 -25.5340813847 -6.85606392925 -1.4702201934 0 0 0
-1281 1 -20.0610389157 -9.76465329274 -4.41976251603 0 0 0
-1282 1 -17.6259083889 -6.71890063322 -4.39272145918 0 0 0
-1283 1 -17.4799731656 -9.46818018835 -1.52578497422 0 0 0
-1284 1 -20.3522265352 -6.94900461305 -1.6323508044 0 0 0
-1285 1 -14.9312194565 -9.44662606593 -4.29116821626 0 0 0
-1286 1 -12.2281479032 -6.86855672191 -4.24538524148 0 0 0
-1287 1 -12.1731726293 -9.4423115972 -1.57670363547 0 0 0
-1288 1 -14.8929391321 -6.80126526576 -1.62975262776 0 0 0
-1289 1 -9.66989847806 -9.57887092719 -4.20667675396 0 0 0
-1290 1 -6.64825248375 -6.55501660236 -4.02320192102 0 0 0
-1291 1 -6.96018478241 -9.60835511641 -1.43841713774 0 0 0
-1292 1 -9.72061539835 -6.79209978574 -1.46211269315 0 0 0
-1293 1 -4.09355109996 -9.46404413156 -3.91442399588 0 0 0
-1294 1 -1.40464475265 -6.82821891318 -4.04401698588 0 0 0
-1295 1 -1.29002430461 -9.28738835807 -1.3060733826 0 0 0
-1296 1 -3.92390367764 -6.71036442307 -1.44182316383 0 0 0
-1297 1 1.41025718191 -9.46508382346 -4.19853584394 0 0 0
-1298 1 3.99008469552 -6.89438316601 -4.18247817126 0 0 0
-1299 1 4.03087051072 -9.46072481441 -1.26654068249 0 0 0
-1300 1 1.32891230215 -6.8266798026 -1.5257440598 0 0 0
-1301 1 6.75127509259 -9.55787501038 -4.05504087553 0 0 0
-1302 1 9.41168302958 -6.90898430863 -4.1202409253 0 0 0
-1303 1 9.45774770261 -9.60214085774 -1.38226797093 0 0 0
-1304 1 6.7572197141 -6.82546463653 -1.45126230986 0 0 0
-1305 1 12.0624478585 -9.62605370964 -4.28807911183 0 0 0
-1306 1 14.6045838682 -6.55536466916 -4.23996151683 0 0 0
-1307 1 14.9107515966 -9.31663527085 -1.42323803749 0 0 0
-1308 1 12.1926001642 -6.91880215668 -1.43190052195 0 0 0
-1309 1 17.7867124514 -9.36336646863 -4.03269717415 0 0 0
-1310 1 20.4112975417 -6.66998291865 -4.13700479007 0 0 0
-1311 1 20.2044623036 -9.3173376133 -1.34738820245 0 0 0
-1312 1 17.5279960301 -6.60799367658 -1.49903677431 0 0 0
-1313 1 23.1261811788 -9.49594375708 -4.14753532081 0 0 0
-1314 1 25.7020943154 -6.83135270401 -4.18380144686 0 0 0
-1315 1 25.6825805597 -9.56321435477 -1.31598352974 0 0 0
-1316 1 23.0224059846 -6.82273600804 -1.4507372352 0 0 0
-1317 1 28.5271063913 -9.33946804523 -4.15956704911 0 0 0
-1318 1 31.0346408476 -6.59854457961 -4.11411480063 0 0 0
-1319 1 30.9430187733 -9.33235798406 -1.4461544054 0 0 0
-1320 1 28.4690488097 -6.80389316529 -1.40357354315 0 0 0
-1321 1 33.801899073 -9.34317183241 -3.92195080906 0 0 0
-1322 1 36.5420874418 -6.73968907663 -4.1123223482 0 0 0
-1323 1 36.4603089985 -9.44061523613 -1.26840260849 0 0 0
-1324 1 33.6250744865 -6.73669109804 -1.34113605985 0 0 0
-1325 1 39.2405634486 -9.64515524896 -4.20160272368 0 0 0
-1326 1 41.811194985 -6.7833365335 -3.89020794161 0 0 0
-1327 1 41.5387120273 -9.32641934278 -1.4181187415 0 0 0
-1328 1 38.9177312671 -6.8885458492 -1.29456364533 0 0 0
-1329 1 44.5229819072 -9.37135565404 -4.03159504382 0 0 0
-1330 1 47.3986500808 -6.78888966816 -4.1149510616 0 0 0
-1331 1 47.3753113139 -9.45596638111 -1.33486262615 0 0 0
-1332 1 44.4228527349 -6.78478357781 -1.24135686995 0 0 0
-1333 1 50.0505115471 -9.59798074193 -4.01169066189 0 0 0
-1334 1 52.7600620936 -6.87153134137 -4.06939186033 0 0 0
-1335 1 52.5859106212 -9.45496145643 -1.30052083037 0 0 0
-1336 1 50.1393402277 -6.81950028608 -1.55770336391 0 0 0
-1337 1 55.40125 -9.45875 -4.05375 0 0 0
-1338 1 58.10375 -6.75625 -4.05375 0 0 0
-1339 1 58.10375 -9.45875 -1.35125 0 0 0
-1340 1 55.40125 -6.75625 -1.35125 0 0 0
-1341 1 60.80625 -9.45875 -4.05375 0 0 0
-1342 1 63.50875 -6.75625 -4.05375 0 0 0
-1343 1 63.50875 -9.45875 -1.35125 0 0 0
-1344 1 60.80625 -6.75625 -1.35125 0 0 0
-1345 1 -63.50875 -4.05375 -4.05375 0 0 0
-1346 1 -60.80625 -1.35125 -4.05375 0 0 0
-1347 1 -60.80625 -4.05375 -1.35125 0 0 0
-1348 1 -63.50875 -1.35125 -1.35125 0 0 0
-1349 1 -58.10375 -4.05375 -4.05375 0 0 0
-1350 1 -55.40125 -1.35125 -4.05375 0 0 0
-1351 1 -55.40125 -4.05375 -1.35125 0 0 0
-1352 1 -58.10375 -1.35125 -1.35125 0 0 0
-1353 1 -52.7850116641 -4.22160675376 -4.24015339454 0 0 0
-1354 1 -50.0037226008 -1.32161262963 -3.99304213156 0 0 0
-1355 1 -50.0840367507 -3.8572126806 -1.31242798208 0 0 0
-1356 1 -52.8222554347 -1.58771154444 -1.45434470732 0 0 0
-1357 1 -47.3339757172 -3.92250788007 -4.09010995369 0 0 0
-1358 1 -44.7979165319 -1.30805723973 -4.22984059866 0 0 0
-1359 1 -44.8533871388 -3.94018425482 -1.43518298072 0 0 0
-1360 1 -47.5335423817 -1.18226630607 -1.32368656418 0 0 0
-1361 1 -42.0193810857 -3.86165098997 -4.20771314497 0 0 0
-1362 1 -39.2206925651 -1.3866553519 -4.06734951114 0 0 0
-1363 1 -38.9710356455 -3.9629687181 -1.31099750502 0 0 0
-1364 1 -41.8710562174 -1.48826595045 -1.51341974677 0 0 0
-1365 1 -36.5787366392 -4.09844294774 -4.03462158403 0 0 0
-1366 1 -33.8562440146 -1.22208722645 -4.25301540641 0 0 0
-1367 1 -33.7704505572 -4.0419828916 -1.49011087633 0 0 0
-1368 1 -36.3718961195 -1.5224901112 -1.3120420741 0 0 0
-1369 1 -31.2509435887 -4.22662081422 -4.22652254393 0 0 0
-1370 1 -28.5137708055 -1.52594808456 -4.33472880558 0 0 0
-1371 1 -28.4296432985 -4.0736942747 -1.46507152759 0 0 0
-1372 1 -31.0622464729 -1.63933823801 -1.50862158895 0 0 0
-1373 1 -25.6768237862 -4.02724072703 -4.19118374244 0 0 0
-1374 1 -23.026817444 -1.38968461341 -4.22674700917 0 0 0
-1375 1 -22.97014724 -4.13012586595 -1.4361667605 0 0 0
-1376 1 -25.7861785832 -1.68047583109 -1.51272475626 0 0 0
-1377 1 -20.505132222 -4.04381929225 -4.43204678909 0 0 0
-1378 1 -17.574902399 -1.56166546985 -3.95999552944 0 0 0
-1379 1 -17.6127453023 -4.36517356328 -1.38781422202 0 0 0
-1380 1 -20.2552817497 -1.55972547375 -1.52218222125 0 0 0
-1381 1 -14.829549335 -4.12094153388 -4.16432759086 0 0 0
-1382 1 -12.2563341344 -1.3119184306 -4.03121497043 0 0 0
-1383 1 -12.3087187453 -4.10963984353 -1.36763672788 0 0 0
-1384 1 -15.0124455866 -1.46143493431 -1.38823267238 0 0 0
-1385 1 -9.5232868945 -3.95556917023 -4.05899439001 0 0 0
-1386 1 -6.70864890438 -1.27148440875 -4.04004130311 0 0 0
-1387 1 -6.62568662837 -4.2272528659 -1.20579133294 0 0 0
-1388 1 -9.55451069607 -1.40785960368 -1.57504688639 0 0 0
-1389 1 -3.97920095423 -4.14703200055 -4.15422401144 0 0 0
-1390 1 -1.45115564694 -1.41015039236 -4.13279766667 0 0 0
-1391 1 -1.05717419825 -4.00711675133 -1.4305528206 0 0 0
-1392 1 -4.01795081291 -1.39373464984 -1.53104766992 0 0 0
-1393 1 1.43845943588 -4.14494800533 -4.17537250549 0 0 0
-1394 1 4.13473008326 -1.29883685586 -3.92884141625 0 0 0
-1395 1 4.02199964185 -4.05412682974 -1.43262313962 0 0 0
-1396 1 1.3743438532 -1.32697636006 -1.51540883967 0 0 0
-1397 1 6.89042979258 -4.00193239717 -4.13006821906 0 0 0
-1398 1 9.36949297216 -1.29203556424 -3.83344605696 0 0 0
-1399 1 9.50661573065 -4.15929481504 -1.48841499438 0 0 0
-1400 1 6.6715538871 -1.33586645892 -1.30700757226 0 0 0
-1401 1 12.0670203502 -4.04662195692 -4.21270246396 0 0 0
-1402 1 14.6833024872 -1.2735673684 -4.09364364236 0 0 0
-1403 1 14.7369542898 -4.042939799 -1.63824055374 0 0 0
-1404 1 12.1835015398 -1.41194137814 -1.42770412544 0 0 0
-1405 1 17.5534003626 -3.92511929774 -4.10723465147 0 0 0
-1406 1 20.2141427116 -1.27221674773 -4.35663308727 0 0 0
-1407 1 20.164377945 -4.03648376686 -1.61108538354 0 0 0
-1408 1 17.3669884097 -1.03107712223 -1.44711203948 0 0 0
-1409 1 23.0827382222 -4.09497669113 -4.11649119335 0 0 0
-1410 1 25.4985296199 -1.29408763314 -4.20721482676 0 0 0
-1411 1 25.7740700147 -4.1679915746 -1.43063528478 0 0 0
-1412 1 22.853207428 -1.5523009731 -1.45114618689 0 0 0
-1413 1 28.2704004744 -4.1599035547 -4.30841005935 0 0 0
-1414 1 31.0624401223 -1.40543249796 -4.14730502594 0 0 0
-1415 1 31.0542050542 -3.99366159567 -1.36031854221 0 0 0
-1416 1 28.2197342137 -1.35130920857 -1.52063598811 0 0 0
-1417 1 33.8737109142 -3.8836371276 -4.035935714 0 0 0
-1418 1 36.607407572 -1.25092227819 -4.1763396025 0 0 0
-1419 1 36.4419623038 -4.05002874827 -1.29091993842 0 0 0
-1420 1 33.8006865812 -1.32247412944 -1.42943592258 0 0 0
-1421 1 39.1788543019 -3.98350218234 -3.8534874577 0 0 0
-1422 1 41.9163396687 -1.36333962628 -4.12945345282 0 0 0
-1423 1 42.120204399 -3.98877630081 -1.39488196199 0 0 0
-1424 1 39.4248405771 -1.2260664669 -1.49474274865 0 0 0
-1425 1 44.771800131 -4.20969947642 -3.84844415283 0 0 0
-1426 1 47.4260230625 -1.46906413607 -4.05653114071 0 0 0
-1427 1 47.3985487835 -4.19974614794 -1.42438539766 0 0 0
-1428 1 44.7017241667 -1.33944153824 -1.42744388327 0 0 0
-1429 1 50.0944056735 -4.15277587867 -4.02788000728 0 0 0
-1430 1 52.6975771211 -1.41398882816 -3.99217527357 0 0 0
-1431 1 52.7458542821 -3.99598640963 -1.40199467467 0 0 0
-1432 1 50.0023049106 -1.41576239778 -1.25134900817 0 0 0
-1433 1 55.40125 -4.05375 -4.05375 0 0 0
-1434 1 58.10375 -1.35125 -4.05375 0 0 0
-1435 1 58.10375 -4.05375 -1.35125 0 0 0
-1436 1 55.40125 -1.35125 -1.35125 0 0 0
-1437 1 60.80625 -4.05375 -4.05375 0 0 0
-1438 1 63.50875 -1.35125 -4.05375 0 0 0
-1439 1 63.50875 -4.05375 -1.35125 0 0 0
-1440 1 60.80625 -1.35125 -1.35125 0 0 0
-1441 1 -63.50875 1.35125 -4.05375 0 0 0
-1442 1 -60.80625 4.05375 -4.05375 0 0 0
-1443 1 -60.80625 1.35125 -1.35125 0 0 0
-1444 1 -63.50875 4.05375 -1.35125 0 0 0
-1445 1 -58.10375 1.35125 -4.05375 0 0 0
-1446 1 -55.40125 4.05375 -4.05375 0 0 0
-1447 1 -55.40125 1.35125 -1.35125 0 0 0
-1448 1 -58.10375 4.05375 -1.35125 0 0 0
-1449 1 -52.7388938965 1.47327488896 -3.99654210894 0 0 0
-1450 1 -49.9036544128 4.15342393768 -3.99670926474 0 0 0
-1451 1 -50.1560601063 1.50165148686 -1.37890062305 0 0 0
-1452 1 -52.777187059 4.28695418014 -1.32045895248 0 0 0
-1453 1 -47.37699735 1.30365118694 -4.03890782097 0 0 0
-1454 1 -44.4856006399 3.97511279035 -3.9649933054 0 0 0
-1455 1 -44.6129155196 1.24043386968 -1.3012455591 0 0 0
-1456 1 -47.221482644 4.02105643467 -1.43701430683 0 0 0
-1457 1 -41.8350983398 1.30730916619 -3.93294879168 0 0 0
-1458 1 -39.1804114483 4.00166757554 -4.20739446969 0 0 0
-1459 1 -38.9626967268 1.13625850989 -1.50855684136 0 0 0
-1460 1 -41.7901505404 3.91687479795 -1.42536677594 0 0 0
-1461 1 -36.5527980324 1.38981166084 -4.21821913321 0 0 0
-1462 1 -33.8464424968 3.95655235891 -4.20360609497 0 0 0
-1463 1 -33.7590141093 1.34518677306 -1.37889865972 0 0 0
-1464 1 -36.5226345241 3.94712506133 -1.46183638682 0 0 0
-1465 1 -31.1082675561 1.26980234423 -3.99506057998 0 0 0
-1466 1 -28.4805734806 4.15236933219 -4.10709052527 0 0 0
-1467 1 -28.4744887214 0.880523413134 -1.28016230164 0 0 0
-1468 1 -31.3058905887 4.14759318654 -1.60179224676 0 0 0
-1469 1 -25.7666060477 0.985027564448 -4.12621204012 0 0 0
-1470 1 -23.0683415147 3.79606823414 -4.20424956175 0 0 0
-1471 1 -22.9889425829 1.1610771666 -1.66043756202 0 0 0
-1472 1 -25.7722432639 3.91288669779 -1.49076937079 0 0 0
-1473 1 -20.2659716124 1.16813221525 -4.13257915455 0 0 0
-1474 1 -17.5815892665 4.02769657036 -4.17068502156 0 0 0
-1475 1 -17.6884675595 1.37678463857 -1.46539721481 0 0 0
-1476 1 -20.6068339118 3.956281561 -1.63049560378 0 0 0
-1477 1 -15.0594081503 1.38618120361 -4.1836851729 0 0 0
-1478 1 -12.2965207723 4.03739945213 -4.00511191914 0 0 0
-1479 1 -12.32077267 1.40366133025 -1.59011863722 0 0 0
-1480 1 -15.1673772047 4.09046882466 -1.55609581988 0 0 0
-1481 1 -9.46769441699 1.42838977513 -4.19241527514 0 0 0
-1482 1 -6.72488375107 3.94790362485 -4.32060138916 0 0 0
-1483 1 -6.86685732705 1.26889884342 -1.44900952125 0 0 0
-1484 1 -9.43808880222 3.96183319348 -1.409527961 0 0 0
-1485 1 -4.05334518962 1.32553902532 -3.98920358367 0 0 0
-1486 1 -1.34476756839 3.99158385339 -4.31948897043 0 0 0
-1487 1 -1.33045566876 1.34891449708 -1.36929888736 0 0 0
-1488 1 -4.0491056056 4.12247439678 -1.37883362445 0 0 0
-1489 1 1.29376481825 1.46110629911 -4.18421124985 0 0 0
-1490 1 4.12706218008 4.06517448398 -4.01902534566 0 0 0
-1491 1 4.09707819708 1.29245297812 -1.51675499826 0 0 0
-1492 1 1.22543199855 4.05219880836 -1.54258525822 0 0 0
-1493 1 7.00526075914 1.438774597 -3.97273512599 0 0 0
-1494 1 9.49960005323 4.11832893928 -4.21964332384 0 0 0
-1495 1 9.57720732984 1.32147632497 -1.4025982009 0 0 0
-1496 1 6.86587514083 4.10399429122 -1.35002859807 0 0 0
-1497 1 12.2045702885 1.30976872061 -4.02396445451 0 0 0
-1498 1 14.7420415924 4.12065232849 -4.33189408879 0 0 0
-1499 1 14.666137793 1.49321469848 -1.4128092973 0 0 0
-1500 1 12.0120306854 4.02836245939 -1.46673183968 0 0 0
-1501 1 17.3514622743 1.33922586222 -4.22121683936 0 0 0
-1502 1 20.373116966 4.03347778762 -4.15679497268 0 0 0
-1503 1 20.1092578066 1.3702687856 -1.64918069963 0 0 0
-1504 1 17.3737256363 4.15897900992 -1.69528440881 0 0 0
-1505 1 22.9618670235 1.37651993939 -4.18548360717 0 0 0
-1506 1 25.5245366601 4.10460763363 -4.04877452563 0 0 0
-1507 1 25.6040096592 1.30375954117 -1.43478980743 0 0 0
-1508 1 22.9334377155 4.02517303658 -1.38660582527 0 0 0
-1509 1 28.3494464983 1.4939764763 -4.20040830791 0 0 0
-1510 1 31.0464237267 3.87212492971 -4.19356927642 0 0 0
-1511 1 30.9821478998 1.11745619349 -1.40226846809 0 0 0
-1512 1 28.3134937772 3.95642051213 -1.47967006653 0 0 0
-1513 1 33.7909515015 1.13060924444 -4.21998023378 0 0 0
-1514 1 36.5613547633 4.12353363124 -4.36433113895 0 0 0
-1515 1 36.4981668706 1.32735137829 -1.66683750769 0 0 0
-1516 1 33.8887522895 3.97584473704 -1.58498912868 0 0 0
-1517 1 39.2566363344 1.49187164015 -4.11875626139 0 0 0
-1518 1 41.9309038778 4.10973422137 -3.86551329735 0 0 0
-1519 1 42.070863132 1.3545755342 -1.29431507638 0 0 0
-1520 1 39.2681426409 3.97711495479 -1.42455666459 0 0 0
-1521 1 44.4824794712 1.32169535442 -3.96500498245 0 0 0
-1522 1 47.3901909494 4.01838010479 -4.16156287475 0 0 0
-1523 1 47.5108976982 1.44049463658 -1.45667596206 0 0 0
-1524 1 44.7315760569 3.9177137697 -1.33991929588 0 0 0
-1525 1 49.9576641851 1.40725595774 -4.0241749533 0 0 0
-1526 1 52.7918898379 4.05049518727 -3.9390776023 0 0 0
-1527 1 52.6836780584 1.29163097226 -1.37007926337 0 0 0
-1528 1 50.2083544333 4.20823683094 -1.31694511397 0 0 0
-1529 1 55.40125 1.35125 -4.05375 0 0 0
-1530 1 58.10375 4.05375 -4.05375 0 0 0
-1531 1 58.10375 1.35125 -1.35125 0 0 0
-1532 1 55.40125 4.05375 -1.35125 0 0 0
-1533 1 60.80625 1.35125 -4.05375 0 0 0
-1534 1 63.50875 4.05375 -4.05375 0 0 0
-1535 1 63.50875 1.35125 -1.35125 0 0 0
-1536 1 60.80625 4.05375 -1.35125 0 0 0
-1537 1 -63.50875 6.75625 -4.05375 0 0 0
-1538 1 -60.80625 9.45875 -4.05375 0 0 0
-1539 1 -60.80625 6.75625 -1.35125 0 0 0
-1540 1 -63.50875 9.45875 -1.35125 0 0 0
-1541 1 -58.10375 6.75625 -4.05375 0 0 0
-1542 1 -55.40125 9.45875 -4.05375 0 0 0
-1543 1 -55.40125 6.75625 -1.35125 0 0 0
-1544 1 -58.10375 9.45875 -1.35125 0 0 0
-1545 1 -52.6717181458 6.80452497206 -4.18748141406 0 0 0
-1546 1 -49.8166337467 9.53748401059 -4.19005765705 0 0 0
-1547 1 -49.9298076285 6.83115964292 -1.37047630494 0 0 0
-1548 1 -52.4039910971 9.3843488026 -1.5216715979 0 0 0
-1549 1 -47.2888425986 6.87730864893 -4.0242649868 0 0 0
-1550 1 -44.4058010225 9.42435535787 -3.98146032291 0 0 0
-1551 1 -44.4746144037 6.50448585118 -1.42464600406 0 0 0
-1552 1 -47.1763295997 9.46397747392 -1.24925583019 0 0 0
-1553 1 -41.7537694273 6.74802361996 -3.95753517772 0 0 0
-1554 1 -39.2149116155 9.40686546072 -4.00547512654 0 0 0
-1555 1 -39.2358103433 6.56975921504 -1.43021202981 0 0 0
-1556 1 -41.7323904817 9.25796649749 -1.33295561272 0 0 0
-1557 1 -36.5782281858 6.7348580375 -4.29456439445 0 0 0
-1558 1 -34.0234884132 9.40416573114 -3.85506641304 0 0 0
-1559 1 -34.2095251818 6.84247300029 -1.45833971572 0 0 0
-1560 1 -36.62166761 9.47811898109 -1.44490024195 0 0 0
-1561 1 -31.4672460848 6.74535722298 -4.18758662418 0 0 0
-1562 1 -28.4794296333 9.471502597 -4.14531015534 0 0 0
-1563 1 -28.4633268154 6.78167659534 -1.36069381855 0 0 0
-1564 1 -31.2801214876 9.62584593545 -1.38050899953 0 0 0
-1565 1 -25.8292272659 6.80967903176 -4.18089688026 0 0 0
-1566 1 -23.0120596765 9.38574125602 -4.56085359797 0 0 0
-1567 1 -23.0253111161 6.67088453468 -1.74883442585 0 0 0
-1568 1 -25.9181680853 9.3005861108 -1.60976470179 0 0 0
-1569 1 -20.4068298243 6.65211430029 -4.34642231668 0 0 0
-1570 1 -17.7309313136 9.48453723005 -4.05052456235 0 0 0
-1571 1 -17.8568886389 6.74526815221 -1.49718102213 0 0 0
-1572 1 -20.5908115258 9.4942779678 -1.51293340304 0 0 0
-1573 1 -15.059248835 6.85750316292 -4.2504552293 0 0 0
-1574 1 -12.2277840315 9.29276808504 -4.19931534189 0 0 0
-1575 1 -12.1238746219 6.58333485512 -1.43320056576 0 0 0
-1576 1 -14.7692488661 9.14024499827 -1.26573242302 0 0 0
-1577 1 -9.40360623315 6.59678645433 -4.26864230094 0 0 0
-1578 1 -6.51984244204 9.30110790284 -3.9810244779 0 0 0
-1579 1 -6.68421135763 6.63865996567 -1.34188946639 0 0 0
-1580 1 -9.57476224107 9.28482366985 -1.58066514978 0 0 0
-1581 1 -4.06524638096 6.70956875277 -4.25843311888 0 0 0
-1582 1 -1.36615183653 9.34937697926 -4.13536731888 0 0 0
-1583 1 -1.34894780045 6.71306673234 -1.43215767554 0 0 0
-1584 1 -3.84037339684 9.46188183728 -1.35574453277 0 0 0
-1585 1 1.33211598226 6.75839210589 -4.24029859598 0 0 0
-1586 1 3.94753669049 9.3746525194 -4.17682403828 0 0 0
-1587 1 4.1416150545 6.65635874439 -1.53839866901 0 0 0
-1588 1 1.39103267757 9.4514127008 -1.40204578434 0 0 0
-1589 1 6.87491528025 6.61243757511 -4.10889056279 0 0 0
-1590 1 9.62624499221 9.350286104 -4.06752238713 0 0 0
-1591 1 9.56543204088 6.66632098377 -1.25808693595 0 0 0
-1592 1 6.88759655501 9.19207194658 -1.65562540765 0 0 0
-1593 1 11.9784799894 6.78429263837 -4.15430762072 0 0 0
-1594 1 14.8028944125 9.40548481452 -4.1234185068 0 0 0
-1595 1 14.7127698511 6.68752615726 -1.61411874757 0 0 0
-1596 1 12.1142490674 9.33451272726 -1.31030304755 0 0 0
-1597 1 17.5400947388 6.69844142105 -4.19075349211 0 0 0
-1598 1 20.3530769154 9.50851135145 -4.26088968253 0 0 0
-1599 1 20.2928741113 6.66715866615 -1.59459732414 0 0 0
-1600 1 17.4648783395 9.31048464638 -1.51152390938 0 0 0
-1601 1 22.9439906153 6.72142500283 -4.08021192234 0 0 0
-1602 1 25.6211103761 9.29038195907 -4.23745622249 0 0 0
-1603 1 25.6230782322 6.71291220956 -1.30843545887 0 0 0
-1604 1 23.0619783201 9.51554947877 -1.70415931714 0 0 0
-1605 1 28.2555479571 6.59322735466 -4.06363108092 0 0 0
-1606 1 31.0596474916 9.29984986222 -4.06442514098 0 0 0
-1607 1 31.2479338594 6.66178979724 -1.42844051077 0 0 0
-1608 1 28.2639714472 9.41002911631 -1.39390646561 0 0 0
-1609 1 33.7856263928 6.67916225449 -4.18704325598 0 0 0
-1610 1 36.5671334001 9.4142615363 -4.16151604154 0 0 0
-1611 1 36.5241334137 6.5587016431 -1.47292122697 0 0 0
-1612 1 33.8163790221 9.36871452638 -1.60542825431 0 0 0
-1613 1 39.3461115198 6.73458687629 -4.01572512251 0 0 0
-1614 1 42.0733417402 9.34072087298 -4.04746243806 0 0 0
-1615 1 42.1555040208 6.83226824592 -1.36270041785 0 0 0
-1616 1 39.3665930649 9.54061299939 -1.51988428224 0 0 0
-1617 1 44.6690893211 6.61525863935 -4.02319612808 0 0 0
-1618 1 47.3545343828 9.40145064061 -4.01199503014 0 0 0
-1619 1 47.39184627 6.65288974344 -1.41427315024 0 0 0
-1620 1 44.6877611868 9.60964011209 -1.41372628684 0 0 0
-1621 1 50.148413897 6.78046430623 -4.06170565201 0 0 0
-1622 1 52.7382448328 9.44716771924 -4.097502781 0 0 0
-1623 1 52.7242048389 6.99419811425 -1.15623951705 0 0 0
-1624 1 50.0714172928 9.57911411679 -1.30020482179 0 0 0
-1625 1 55.40125 6.75625 -4.05375 0 0 0
-1626 1 58.10375 9.45875 -4.05375 0 0 0
-1627 1 58.10375 6.75625 -1.35125 0 0 0
-1628 1 55.40125 9.45875 -1.35125 0 0 0
-1629 1 60.80625 6.75625 -4.05375 0 0 0
-1630 1 63.50875 9.45875 -4.05375 0 0 0
-1631 1 63.50875 6.75625 -1.35125 0 0 0
-1632 1 60.80625 9.45875 -1.35125 0 0 0
-1633 1 -63.50875 12.16125 -4.05375 0 0 0
-1634 1 -60.80625 14.86375 -4.05375 0 0 0
-1635 1 -60.80625 12.16125 -1.35125 0 0 0
-1636 1 -63.50875 14.86375 -1.35125 0 0 0
-1637 1 -58.10375 12.16125 -4.05375 0 0 0
-1638 1 -55.40125 14.86375 -4.05375 0 0 0
-1639 1 -55.40125 12.16125 -1.35125 0 0 0
-1640 1 -58.10375 14.86375 -1.35125 0 0 0
-1641 1 -52.5977794743 12.2157030451 -4.10759818466 0 0 0
-1642 1 -50.0222033895 14.6975274472 -4.01697950365 0 0 0
-1643 1 -49.9052986768 12.0779589636 -1.45122675451 0 0 0
-1644 1 -52.7075432919 14.9055250752 -1.34336112429 0 0 0
-1645 1 -47.0986928958 11.8764983767 -4.02245287204 0 0 0
-1646 1 -44.6976564745 14.8474425266 -4.05558363181 0 0 0
-1647 1 -44.5995657727 12.1194538028 -1.26784817821 0 0 0
-1648 1 -47.1677685614 14.5769753318 -1.33437718756 0 0 0
-1649 1 -41.857000336 11.9959843134 -4.04845443297 0 0 0
-1650 1 -39.2990592802 14.8929521639 -4.07915864748 0 0 0
-1651 1 -39.3359120126 12.1431801893 -1.41129339865 0 0 0
-1652 1 -42.0127718916 14.9359447991 -1.40625715166 0 0 0
-1653 1 -36.7053329551 12.3328908687 -3.95841084123 0 0 0
-1654 1 -33.8234134579 14.7923241355 -4.08588114046 0 0 0
-1655 1 -33.8239233422 12.1495559015 -1.29943014243 0 0 0
-1656 1 -36.6172753496 15.1312441629 -1.40117951587 0 0 0
-1657 1 -31.1385082968 12.0801728154 -3.94881699666 0 0 0
-1658 1 -28.4774230683 14.8813509624 -4.24795556835 0 0 0
-1659 1 -28.249221349 12.1956665713 -1.39183578674 0 0 0
-1660 1 -31.0054279971 14.7233902076 -1.41547819485 0 0 0
-1661 1 -25.8487500896 12.0725297009 -4.31446036168 0 0 0
-1662 1 -23.0220834537 14.9947260118 -4.10032188274 0 0 0
-1663 1 -23.2791123361 12.1348837508 -1.64611878955 0 0 0
-1664 1 -25.7422884392 14.7996900409 -1.66297238109 0 0 0
-1665 1 -20.3259999838 12.123607564 -4.09698001083 0 0 0
-1666 1 -17.4156160042 14.5824911943 -3.94652916394 0 0 0
-1667 1 -17.6501436247 11.8914078934 -1.34746433214 0 0 0
-1668 1 -20.093062241 14.6343294059 -1.37663907373 0 0 0
-1669 1 -14.8793488042 11.9502735984 -3.95960883908 0 0 0
-1670 1 -12.158466559 14.6667326606 -4.05100971227 0 0 0
-1671 1 -12.2014173044 12.0373762437 -1.55265742119 0 0 0
-1672 1 -14.8489591475 14.7338675616 -1.24075339863 0 0 0
-1673 1 -9.42389023401 11.9252834673 -4.25698253633 0 0 0
-1674 1 -7.03281599716 14.9027821932 -4.07317794082 0 0 0
-1675 1 -6.73139702731 12.1546064537 -1.39817944599 0 0 0
-1676 1 -9.4374613949 15.0249419898 -1.29173332387 0 0 0
-1677 1 -4.16833532944 12.1422475371 -4.07088713978 0 0 0
-1678 1 -1.34452336223 14.9547929723 -4.08030010366 0 0 0
-1679 1 -1.19853370581 12.1466633795 -1.36930176334 0 0 0
-1680 1 -4.15515984932 14.7265652615 -1.35204836436 0 0 0
-1681 1 1.27280906152 12.2568073871 -4.02815180174 0 0 0
-1682 1 4.05927615524 14.903676757 -3.97361072987 0 0 0
-1683 1 3.7966257628 12.1360220437 -1.68386703981 0 0 0
-1684 1 1.22644338793 14.8454460086 -1.40107036518 0 0 0
-1685 1 6.78240477514 11.9786530837 -4.29778613619 0 0 0
-1686 1 9.1566111603 14.953334873 -3.95894890687 0 0 0
-1687 1 9.3941412533 11.9187858435 -1.29597914866 0 0 0
-1688 1 6.72356619288 14.754511832 -1.23074252869 0 0 0
-1689 1 12.12105709 11.9411229703 -4.05713420902 0 0 0
-1690 1 14.6940424346 14.8055392475 -4.12746148899 0 0 0
-1691 1 14.9402339156 12.1102574997 -1.32805639249 0 0 0
-1692 1 12.0602410929 14.5877546205 -1.50776421572 0 0 0
-1693 1 17.5199081318 12.1848773347 -4.08916096318 0 0 0
-1694 1 20.1795131216 14.9532677753 -4.2693276182 0 0 0
-1695 1 20.3677226895 12.0140688202 -1.61040698406 0 0 0
-1696 1 17.8551134112 14.7762158177 -1.3681926246 0 0 0
-1697 1 23.1039646713 12.1678291538 -4.42729033991 0 0 0
-1698 1 25.7987819425 14.872847226 -4.23063053914 0 0 0
-1699 1 25.6616376966 12.2330560337 -1.66543594328 0 0 0
-1700 1 23.0196936302 14.9645330487 -1.63027567646 0 0 0
-1701 1 28.3561831688 11.9336610547 -4.08624521425 0 0 0
-1702 1 31.1502546054 14.7763437423 -4.14382158358 0 0 0
-1703 1 31.2529030899 11.9377027887 -1.65215547385 0 0 0
-1704 1 28.3122755177 14.8495000025 -1.301375497 0 0 0
-1705 1 33.9789646115 11.8618539808 -4.30497253647 0 0 0
-1706 1 36.5373817026 14.8425582364 -4.15850856436 0 0 0
-1707 1 36.5059371899 12.0259699612 -1.59504757875 0 0 0
-1708 1 33.7321416127 14.7175682672 -1.4808370377 0 0 0
-1709 1 39.401111658 12.0369235987 -4.19686052885 0 0 0
-1710 1 41.9913439044 14.8682038618 -4.040397077 0 0 0
-1711 1 41.9901776783 12.1377782436 -1.22651790777 0 0 0
-1712 1 39.1676991758 14.7297402417 -1.67146118851 0 0 0
-1713 1 44.7262084155 12.3564847923 -3.98091283226 0 0 0
-1714 1 47.330675635 15.0220831536 -3.97427358172 0 0 0
-1715 1 47.1389485664 12.0904403954 -1.22186233092 0 0 0
-1716 1 44.5450658786 14.7806396512 -1.29553017436 0 0 0
-1717 1 49.8474624748 12.2148571793 -3.89791959693 0 0 0
-1718 1 52.5767984427 14.8473954798 -4.22424695397 0 0 0
-1719 1 52.7008980681 12.0465082457 -1.46410958004 0 0 0
-1720 1 50.0346131307 14.9244423671 -1.29943218931 0 0 0
-1721 1 55.40125 12.16125 -4.05375 0 0 0
-1722 1 58.10375 14.86375 -4.05375 0 0 0
-1723 1 58.10375 12.16125 -1.35125 0 0 0
-1724 1 55.40125 14.86375 -1.35125 0 0 0
-1725 1 60.80625 12.16125 -4.05375 0 0 0
-1726 1 63.50875 14.86375 -4.05375 0 0 0
-1727 1 63.50875 12.16125 -1.35125 0 0 0
-1728 1 60.80625 14.86375 -1.35125 0 0 0
-1729 1 -63.50875 -14.86375 1.35125 0 0 0
-1730 1 -60.80625 -12.16125 1.35125 0 0 0
-1731 1 -60.80625 -14.86375 4.05375 0 0 0
-1732 1 -63.50875 -12.16125 4.05375 0 0 0
-1733 1 -58.10375 -14.86375 1.35125 0 0 0
-1734 1 -55.40125 -12.16125 1.35125 0 0 0
-1735 1 -55.40125 -14.86375 4.05375 0 0 0
-1736 1 -58.10375 -12.16125 4.05375 0 0 0
-1737 1 -52.7245314987 -14.9017442486 1.39999344647 0 0 0
-1738 1 -50.2878864574 -12.1254761749 1.17939412669 0 0 0
-1739 1 -50.1894689377 -14.9701610778 3.90548333012 0 0 0
-1740 1 -52.9029750212 -12.3105518613 4.10596120708 0 0 0
-1741 1 -47.5312875912 -15.1612355205 1.38911168084 0 0 0
-1742 1 -44.9050062705 -12.1079365416 1.25682067399 0 0 0
-1743 1 -44.9057330153 -14.8380115035 3.92329400121 0 0 0
-1744 1 -47.7442677694 -12.2047395976 3.89059931354 0 0 0
-1745 1 -42.0898745825 -14.759870484 1.29733926466 0 0 0
-1746 1 -39.1242961225 -12.1452805117 1.11730056916 0 0 0
-1747 1 -39.1699715632 -14.7340549652 3.83507735044 0 0 0
-1748 1 -41.9478306066 -11.9350393401 3.67954112526 0 0 0
-1749 1 -36.491980724 -14.8283782413 1.30622498465 0 0 0
-1750 1 -33.6120478318 -12.1445254723 1.04927696768 0 0 0
-1751 1 -33.9308721194 -14.893867344 3.95267745657 0 0 0
-1752 1 -36.5952435298 -12.0897208934 3.89605015909 0 0 0
-1753 1 -30.9767536529 -15.2039840457 1.10414941738 0 0 0
-1754 1 -28.4960876638 -12.2796452799 1.16081052415 0 0 0
-1755 1 -28.2949983639 -15.0580158811 3.91317356785 0 0 0
-1756 1 -31.123873032 -12.4496068907 3.86776226625 0 0 0
-1757 1 -25.7638947579 -15.046453184 1.08221170722 0 0 0
-1758 1 -23.0010524232 -12.2430917272 1.28308759452 0 0 0
-1759 1 -22.9895724333 -14.920883703 3.77055349667 0 0 0
-1760 1 -25.7044734876 -12.3770730566 3.75179774028 0 0 0
-1761 1 -20.1710301424 -14.8916032399 1.12884765961 0 0 0
-1762 1 -17.5930190424 -12.2666422308 1.14138993546 0 0 0
-1763 1 -17.2992152685 -14.8206490362 3.91120261064 0 0 0
-1764 1 -20.1043591223 -12.1996869425 3.77143244912 0 0 0
-1765 1 -14.6861267619 -14.9197547759 1.43803703118 0 0 0
-1766 1 -12.1472301511 -12.2338393226 1.35847139483 0 0 0
-1767 1 -12.1644313169 -14.8393337617 3.94421944361 0 0 0
-1768 1 -14.8211619439 -12.1199864681 3.84902594377 0 0 0
-1769 1 -9.45416327009 -14.8286314663 1.53535754112 0 0 0
-1770 1 -6.83717963244 -12.1694403598 1.31437191992 0 0 0
-1771 1 -6.7018477845 -14.6770369668 3.82657883905 0 0 0
-1772 1 -9.502619079 -12.0729959851 3.94168864365 0 0 0
-1773 1 -4.27153364303 -14.7813766941 1.14465728421 0 0 0
-1774 1 -1.37867122864 -12.523506393 1.21103406703 0 0 0
-1775 1 -1.3895105638 -14.9606706863 4.02150577463 0 0 0
-1776 1 -3.99984567935 -12.3049671086 3.82955726099 0 0 0
-1777 1 1.39317603083 -14.9335745965 1.3594005035 0 0 0
-1778 1 4.12661995868 -12.1288645207 1.24829066073 0 0 0
-1779 1 4.11775736966 -14.8975909441 3.99598873792 0 0 0
-1780 1 1.24928187174 -12.1645622816 3.83590517518 0 0 0
-1781 1 7.03974057536 -15.1254989428 1.28641254354 0 0 0
-1782 1 9.50020192978 -12.1830775594 1.30884766783 0 0 0
-1783 1 9.49796509096 -14.6844704234 3.9559239435 0 0 0
-1784 1 6.72857151886 -12.1059497117 3.82424492611 0 0 0
-1785 1 12.1783849214 -14.9342205362 1.21638754181 0 0 0
-1786 1 14.9112000012 -12.3926655619 1.33758091831 0 0 0
-1787 1 14.8039102758 -14.9534411013 4.07846705396 0 0 0
-1788 1 12.1869871156 -12.1139514385 4.02720241101 0 0 0
-1789 1 17.8728791357 -14.8238324955 1.14897391384 0 0 0
-1790 1 20.1990376015 -11.9872682985 1.15931589705 0 0 0
-1791 1 20.3771543474 -14.9589404277 3.95507583945 0 0 0
-1792 1 17.6956668644 -12.2433311102 4.06534263959 0 0 0
-1793 1 22.8933812222 -15.0726937244 1.13898827275 0 0 0
-1794 1 25.6708104922 -12.3330313894 1.05916701716 0 0 0
-1795 1 25.6268179141 -15.0777802234 3.82602042907 0 0 0
-1796 1 22.8156305163 -12.1042710622 3.7612604249 0 0 0
-1797 1 28.3109254203 -14.9626614127 1.26783115404 0 0 0
-1798 1 31.1137738603 -12.2606220706 1.4466959788 0 0 0
-1799 1 30.9153730757 -15.0669650135 3.7773459085 0 0 0
-1800 1 28.2590457667 -12.2571707402 3.76840834022 0 0 0
-1801 1 33.9327817182 -15.1892734428 1.21894895979 0 0 0
-1802 1 36.2024165703 -12.3017110533 1.05645001749 0 0 0
-1803 1 36.437915074 -15.0346502386 3.9167267572 0 0 0
-1804 1 33.7716936909 -12.5437858392 3.84523391284 0 0 0
-1805 1 39.0532644866 -15.1358146003 1.1513179175 0 0 0
-1806 1 41.8292600977 -12.2120852964 1.1091639536 0 0 0
-1807 1 41.8624420217 -14.8852908685 3.88128436336 0 0 0
-1808 1 38.9856468557 -12.3937520214 3.71355243448 0 0 0
-1809 1 44.5555639949 -15.0006933689 1.31242432274 0 0 0
-1810 1 47.1184947558 -12.1235723746 1.27950145141 0 0 0
-1811 1 47.0637677734 -14.7958851052 3.99638808788 0 0 0
-1812 1 44.589075576 -12.3085309 3.7671975105 0 0 0
-1813 1 49.985507492 -14.8440236903 1.51444899488 0 0 0
-1814 1 52.8401632076 -12.0782178893 1.40772684047 0 0 0
-1815 1 52.7001014393 -14.6996917994 4.05744980849 0 0 0
-1816 1 50.0067422764 -12.0597182501 3.96892888746 0 0 0
-1817 1 55.40125 -14.86375 1.35125 0 0 0
-1818 1 58.10375 -12.16125 1.35125 0 0 0
-1819 1 58.10375 -14.86375 4.05375 0 0 0
-1820 1 55.40125 -12.16125 4.05375 0 0 0
-1821 1 60.80625 -14.86375 1.35125 0 0 0
-1822 1 63.50875 -12.16125 1.35125 0 0 0
-1823 1 63.50875 -14.86375 4.05375 0 0 0
-1824 1 60.80625 -12.16125 4.05375 0 0 0
-1825 1 -63.50875 -9.45875 1.35125 0 0 0
-1826 1 -60.80625 -6.75625 1.35125 0 0 0
-1827 1 -60.80625 -9.45875 4.05375 0 0 0
-1828 1 -63.50875 -6.75625 4.05375 0 0 0
-1829 1 -58.10375 -9.45875 1.35125 0 0 0
-1830 1 -55.40125 -6.75625 1.35125 0 0 0
-1831 1 -55.40125 -9.45875 4.05375 0 0 0
-1832 1 -58.10375 -6.75625 4.05375 0 0 0
-1833 1 -52.6461298887 -9.27974315357 1.38300662112 0 0 0
-1834 1 -49.9812468538 -6.49817040219 1.42651628819 0 0 0
-1835 1 -50.1194463615 -9.46648116441 3.8103434062 0 0 0
-1836 1 -52.5338122588 -6.49358522234 4.09480275465 0 0 0
-1837 1 -47.5617588486 -9.30151394591 1.28176783253 0 0 0
-1838 1 -44.6929483593 -6.56423512082 1.27925307439 0 0 0
-1839 1 -44.8903931196 -9.45036247717 3.89606948574 0 0 0
-1840 1 -47.3895381761 -6.59535465872 4.16101455509 0 0 0
-1841 1 -41.8844092513 -9.28839464133 1.2971680511 0 0 0
-1842 1 -39.1587168778 -6.80056697306 1.20459563706 0 0 0
-1843 1 -39.1790191903 -9.33501865497 3.86189330221 0 0 0
-1844 1 -41.9854738995 -6.72782539515 3.95599166312 0 0 0
-1845 1 -36.2550849201 -9.40197673909 0.881785204358 0 0 0
-1846 1 -33.6798687248 -6.61898164466 1.05054905519 0 0 0
-1847 1 -33.5228085527 -9.49635494406 3.82322533322 0 0 0
-1848 1 -36.3251737574 -6.97781598538 3.7019651324 0 0 0
-1849 1 -30.9464149869 -9.48628372101 1.09706094603 0 0 0
-1850 1 -28.3900210809 -6.83722013289 1.1085050701 0 0 0
-1851 1 -28.4179412368 -9.61899159549 3.98527696256 0 0 0
-1852 1 -30.8972012902 -6.69829550461 3.98044725428 0 0 0
-1853 1 -25.6725961836 -9.57384295242 1.123238343 0 0 0
-1854 1 -22.9479756311 -6.84394235538 1.12423161773 0 0 0
-1855 1 -22.778510175 -9.43759879576 3.76083284484 0 0 0
-1856 1 -25.5767612795 -6.94449660271 3.81363280557 0 0 0
-1857 1 -20.1910996476 -9.53868079494 1.09796623362 0 0 0
-1858 1 -17.5753204213 -7.02791381463 1.2237957713 0 0 0
-1859 1 -17.6152528917 -9.40007355458 3.84264479886 0 0 0
-1860 1 -20.2106506739 -6.73493449613 3.87806267714 0 0 0
-1861 1 -14.8195567018 -9.7138661922 1.12522991678 0 0 0
-1862 1 -12.2135429184 -6.69853825469 1.14908700045 0 0 0
-1863 1 -12.110970065 -9.4114476294 3.98932620534 0 0 0
-1864 1 -14.991438395 -6.81269196456 4.09417068587 0 0 0
-1865 1 -9.724064212 -9.38965739941 1.28941646924 0 0 0
-1866 1 -6.79381612579 -6.93459108098 1.24357041797 0 0 0
-1867 1 -6.87765514605 -9.42825304557 3.83547300326 0 0 0
-1868 1 -9.57081115382 -6.51970651525 3.76670349323 0 0 0
-1869 1 -4.26376675297 -9.39110043993 1.10603563184 0 0 0
-1870 1 -1.16874187616 -6.73514552229 1.36406175668 0 0 0
-1871 1 -1.43644371989 -9.5667337508 3.61311145599 0 0 0
-1872 1 -4.25859443305 -6.67124063872 3.88944206648 0 0 0
-1873 1 1.32105160918 -9.47473949996 1.26589220653 0 0 0
-1874 1 3.89228522706 -6.70952450576 1.25859686309 0 0 0
-1875 1 3.95098586699 -9.43646673376 3.86433137586 0 0 0
-1876 1 1.17043159283 -6.83216650298 4.02724212661 0 0 0
-1877 1 6.97174477293 -9.42339696567 1.34583476581 0 0 0
-1878 1 9.48260138167 -6.71856232698 1.35762934014 0 0 0
-1879 1 9.50317147802 -9.4405518141 4.1217257903 0 0 0
-1880 1 6.81704568567 -6.74324881069 3.95734917099 0 0 0
-1881 1 12.2708614329 -9.50327904174 1.15523413984 0 0 0
-1882 1 14.6905372309 -6.61495902439 1.36062199311 0 0 0
-1883 1 14.8055336089 -9.5755051003 3.92960599218 0 0 0
-1884 1 12.2422847912 -6.7065653745 3.9503077191 0 0 0
-1885 1 17.2846482236 -9.43753994003 1.19407385867 0 0 0
-1886 1 20.1516628633 -6.70970230743 1.39112608959 0 0 0
-1887 1 20.1624665328 -9.29281691044 3.94773513699 0 0 0
-1888 1 17.2295631733 -6.5946930889 3.92579821256 0 0 0
-1889 1 23.0425726992 -9.57111719516 1.08790304176 0 0 0
-1890 1 25.8902373091 -6.80373637735 1.43759079995 0 0 0
-1891 1 25.7116331878 -9.72435197015 3.98617086293 0 0 0
-1892 1 23.2851294128 -6.92484260533 3.98456744047 0 0 0
-1893 1 28.4437368398 -9.47446097815 1.2930757113 0 0 0
-1894 1 30.858583219 -6.68143842698 1.43187925264 0 0 0
-1895 1 30.9724541826 -9.59476718426 4.06939227962 0 0 0
-1896 1 28.3249040402 -6.86603565944 4.22110400709 0 0 0
-1897 1 33.6540681013 -9.26480377518 1.37477258686 0 0 0
-1898 1 36.4924153132 -6.74698156777 1.3653927199 0 0 0
-1899 1 36.4863719889 -9.5332522435 3.94348749431 0 0 0
-1900 1 33.8821167752 -6.74383029363 3.98436246232 0 0 0
-1901 1 39.1570781812 -9.57787335216 1.27198584345 0 0 0
-1902 1 41.7638417425 -6.80241312646 1.31823857099 0 0 0
-1903 1 41.7692885406 -9.61773673237 4.10685609442 0 0 0
-1904 1 39.1224557502 -6.61542736582 4.1456755866 0 0 0
-1905 1 44.3370429918 -9.37035244496 1.36898774685 0 0 0
-1906 1 47.3439855914 -6.69818571407 1.22585795179 0 0 0
-1907 1 47.1750052339 -9.16294774307 3.80479994829 0 0 0
-1908 1 44.5817396761 -6.65121797184 3.98262017002 0 0 0
-1909 1 50.0183636135 -9.23460612947 1.42602899121 0 0 0
-1910 1 52.624936537 -6.73117630835 1.41127602582 0 0 0
-1911 1 52.7316271006 -9.32558396467 3.8891026762 0 0 0
-1912 1 49.8818791423 -6.62887686012 3.998685124 0 0 0
-1913 1 55.40125 -9.45875 1.35125 0 0 0
-1914 1 58.10375 -6.75625 1.35125 0 0 0
-1915 1 58.10375 -9.45875 4.05375 0 0 0
-1916 1 55.40125 -6.75625 4.05375 0 0 0
-1917 1 60.80625 -9.45875 1.35125 0 0 0
-1918 1 63.50875 -6.75625 1.35125 0 0 0
-1919 1 63.50875 -9.45875 4.05375 0 0 0
-1920 1 60.80625 -6.75625 4.05375 0 0 0
-1921 1 -63.50875 -4.05375 1.35125 0 0 0
-1922 1 -60.80625 -1.35125 1.35125 0 0 0
-1923 1 -60.80625 -4.05375 4.05375 0 0 0
-1924 1 -63.50875 -1.35125 4.05375 0 0 0
-1925 1 -58.10375 -4.05375 1.35125 0 0 0
-1926 1 -55.40125 -1.35125 1.35125 0 0 0
-1927 1 -55.40125 -4.05375 4.05375 0 0 0
-1928 1 -58.10375 -1.35125 4.05375 0 0 0
-1929 1 -52.7012274082 -3.94475478315 1.47500606539 0 0 0
-1930 1 -50.2536257696 -1.19327072431 1.36446757357 0 0 0
-1931 1 -50.0079853827 -3.74716313147 4.01162682255 0 0 0
-1932 1 -52.9105272068 -1.26474984397 4.13645500883 0 0 0
-1933 1 -47.3077083772 -3.80313007728 1.33055299952 0 0 0
-1934 1 -44.4683313863 -1.56846577047 1.40550575785 0 0 0
-1935 1 -44.7392937724 -4.09549375905 4.09327464517 0 0 0
-1936 1 -47.3129281604 -1.21350836922 4.15571438579 0 0 0
-1937 1 -41.8093359192 -4.0179242192 1.14784863638 0 0 0
-1938 1 -39.0431997602 -1.44625876315 1.44742842537 0 0 0
-1939 1 -39.1279844257 -4.26244369905 3.95421260849 0 0 0
-1940 1 -41.8777133385 -1.49852753485 4.04292971332 0 0 0
-1941 1 -36.3608395163 -4.02977703313 1.43074450857 0 0 0
-1942 1 -33.7404731809 -1.38399635546 1.26884005825 0 0 0
-1943 1 -33.6103691604 -4.17426278842 3.83613853525 0 0 0
-1944 1 -36.2971870886 -1.43785752567 3.96958568157 0 0 0
-1945 1 -31.1101957297 -4.03817621525 1.20108632716 0 0 0
-1946 1 -28.4141441513 -1.56405755715 1.47902032909 0 0 0
-1947 1 -28.1426026047 -4.18274993249 4.05661153762 0 0 0
-1948 1 -31.0574586521 -1.61239412459 4.12530077631 0 0 0
-1949 1 -25.501899501 -4.11933753089 1.35849712936 0 0 0
-1950 1 -22.7764926904 -1.67663726828 1.24959256298 0 0 0
-1951 1 -23.0866320659 -4.12530894585 4.01284026267 0 0 0
-1952 1 -25.6989756554 -1.44686422204 3.89159135285 0 0 0
-1953 1 -20.2347426846 -4.25637531109 1.16044820981 0 0 0
-1954 1 -17.6612944093 -1.629796553 1.29481711546 0 0 0
-1955 1 -17.6433335604 -4.23667481033 4.02320766151 0 0 0
-1956 1 -20.1726959485 -1.54324056207 4.04268628978 0 0 0
-1957 1 -15.0634953758 -4.12654511955 1.30462918097 0 0 0
-1958 1 -12.2507898386 -1.37449134229 1.13370062315 0 0 0
-1959 1 -12.1874422314 -3.97643312293 3.8758312364 0 0 0
-1960 1 -15.023841178 -1.46179169105 3.81205452311 0 0 0
-1961 1 -9.44460233704 -3.8018442555 1.11342172294 0 0 0
-1962 1 -6.76506314074 -1.36021516642 1.41737191743 0 0 0
-1963 1 -6.73958239001 -3.95471063938 3.84236356011 0 0 0
-1964 1 -9.55891648705 -1.17977763197 3.90466479094 0 0 0
-1965 1 -3.87820827761 -3.93634075543 1.3264520233 0 0 0
-1966 1 -1.31680007922 -1.35041733231 1.20042810765 0 0 0
-1967 1 -1.22570957528 -3.99853953245 3.89606556748 0 0 0
-1968 1 -3.84130557832 -1.45036094785 4.06512251321 0 0 0
-1969 1 1.43541232892 -3.96414339156 1.32638554967 0 0 0
-1970 1 4.13845959246 -1.32900478847 1.23520905075 0 0 0
-1971 1 4.11049827975 -3.97550345573 4.20064356556 0 0 0
-1972 1 1.43486725718 -1.47841439254 4.06264513049 0 0 0
-1973 1 6.72345884131 -4.13566489077 1.19109444436 0 0 0
-1974 1 9.41702526394 -1.25997269381 1.2280317373 0 0 0
-1975 1 9.41883583857 -4.15071300949 3.78657776809 0 0 0
-1976 1 6.86256772366 -1.29308628564 3.94125641632 0 0 0
-1977 1 12.0895498004 -4.0262492971 1.15018714509 0 0 0
-1978 1 14.6912244231 -1.37688597215 1.15974871136 0 0 0
-1979 1 14.6089283942 -3.81879997342 4.05400206022 0 0 0
-1980 1 11.9946893 -1.37214331804 4.0693378469 0 0 0
-1981 1 17.5105600508 -3.96069591127 1.11408390212 0 0 0
-1982 1 20.2101993674 -1.24098799918 1.21477426319 0 0 0
-1983 1 20.515271009 -4.01105220466 3.81971296909 0 0 0
-1984 1 17.4947330617 -1.18450956159 3.92969917468 0 0 0
-1985 1 22.8736212632 -4.17584602762 1.06577292009 0 0 0
-1986 1 25.5251485183 -1.38897770774 1.07128839484 0 0 0
-1987 1 25.6104905256 -3.9911625322 3.8214002683 0 0 0
-1988 1 23.1176702134 -1.12213854309 3.928152701 0 0 0
-1989 1 28.3013079509 -3.85357653951 1.26322502044 0 0 0
-1990 1 31.0690486269 -1.46826538171 1.25063162021 0 0 0
-1991 1 31.1191049936 -4.23213320525 4.0615354348 0 0 0
-1992 1 28.1894722411 -1.47507658778 4.11375876145 0 0 0
-1993 1 33.7728686412 -3.98068214019 1.31769300656 0 0 0
-1994 1 36.3582429638 -1.16660673589 1.29145491181 0 0 0
-1995 1 36.5273377738 -4.11400081701 3.88997558947 0 0 0
-1996 1 33.7038355844 -1.31725972961 3.99898205097 0 0 0
-1997 1 39.1251424418 -3.92785476861 1.2253538555 0 0 0
-1998 1 42.003816534 -1.50456544612 1.23500870188 0 0 0
-1999 1 41.8279074239 -3.96559058377 4.00653396217 0 0 0
-2000 1 39.1505303359 -1.15689646052 4.07498579913 0 0 0
-2001 1 44.6033358494 -4.00749826873 1.22290188285 0 0 0
-2002 1 47.3206810885 -1.45556778998 1.34531279112 0 0 0
-2003 1 47.2189149665 -4.14484555445 3.85245788468 0 0 0
-2004 1 44.6751181935 -1.4381024002 4.01480306006 0 0 0
-2005 1 50.0660614735 -4.25683561437 1.23177025441 0 0 0
-2006 1 52.7426240978 -1.28090182529 1.42042557813 0 0 0
-2007 1 52.6812169568 -3.87795265265 3.94948911256 0 0 0
-2008 1 49.9241533123 -1.45391071392 3.96283746703 0 0 0
-2009 1 55.40125 -4.05375 1.35125 0 0 0
-2010 1 58.10375 -1.35125 1.35125 0 0 0
-2011 1 58.10375 -4.05375 4.05375 0 0 0
-2012 1 55.40125 -1.35125 4.05375 0 0 0
-2013 1 60.80625 -4.05375 1.35125 0 0 0
-2014 1 63.50875 -1.35125 1.35125 0 0 0
-2015 1 63.50875 -4.05375 4.05375 0 0 0
-2016 1 60.80625 -1.35125 4.05375 0 0 0
-2017 1 -63.50875 1.35125 1.35125 0 0 0
-2018 1 -60.80625 4.05375 1.35125 0 0 0
-2019 1 -60.80625 1.35125 4.05375 0 0 0
-2020 1 -63.50875 4.05375 4.05375 0 0 0
-2021 1 -58.10375 1.35125 1.35125 0 0 0
-2022 1 -55.40125 4.05375 1.35125 0 0 0
-2023 1 -55.40125 1.35125 4.05375 0 0 0
-2024 1 -58.10375 4.05375 4.05375 0 0 0
-2025 1 -52.8596282587 1.48738459365 1.34527067034 0 0 0
-2026 1 -50.1939784765 4.08758391924 1.26067024845 0 0 0
-2027 1 -50.1366784116 1.4746411828 3.87787361299 0 0 0
-2028 1 -52.974831304 4.00419752611 3.9671323059 0 0 0
-2029 1 -47.4199533685 1.5735406559 1.12942300341 0 0 0
-2030 1 -44.46948935 4.0125376038 1.30735285484 0 0 0
-2031 1 -44.4853416585 1.25183388248 4.01612882323 0 0 0
-2032 1 -47.3144365562 4.06552705422 3.80920787621 0 0 0
-2033 1 -41.7906397329 1.13907865953 1.42691910395 0 0 0
-2034 1 -39.1427451913 3.68012356645 1.26360353327 0 0 0
-2035 1 -39.0825923367 1.24279967453 4.10011608461 0 0 0
-2036 1 -41.6221968741 3.78976462463 4.04355597719 0 0 0
-2037 1 -36.5537677615 1.25297974236 1.42835793505 0 0 0
-2038 1 -33.9171523697 4.1739737449 1.30066748637 0 0 0
-2039 1 -33.6894488103 1.40850322577 4.11553589885 0 0 0
-2040 1 -36.5897390266 3.89818072659 4.06462678431 0 0 0
-2041 1 -31.1780812703 1.59960150645 1.22258703053 0 0 0
-2042 1 -28.2747076027 4.04296370004 1.13193780033 0 0 0
-2043 1 -28.5072946102 1.36551393372 3.88383559831 0 0 0
-2044 1 -31.1753082183 4.1703880044 3.82952517599 0 0 0
-2045 1 -25.6357801834 1.02862536523 1.14029858855 0 0 0
-2046 1 -23.1134786709 3.78167826731 0.958001410156 0 0 0
-2047 1 -23.0546478984 1.02974071799 3.96365954817 0 0 0
-2048 1 -25.7883358745 3.83807576074 3.94596325681 0 0 0
-2049 1 -20.4165203132 1.18743163492 1.34043756543 0 0 0
-2050 1 -17.9607778821 4.12097334534 1.18781638002 0 0 0
-2051 1 -17.821687877 1.2526647199 4.03719319823 0 0 0
-2052 1 -20.4885650583 4.04383729713 3.97923980147 0 0 0
-2053 1 -15.2032213018 1.46903865393 1.45065072035 0 0 0
-2054 1 -12.3530228412 3.9401972035 1.1452857948 0 0 0
-2055 1 -12.4581929014 1.38420961668 3.82951117012 0 0 0
-2056 1 -15.0210213059 4.0321569944 4.07982918844 0 0 0
-2057 1 -9.49299903692 1.33278593133 1.25784892582 0 0 0
-2058 1 -6.64436141014 3.8196122355 1.30045284256 0 0 0
-2059 1 -6.67737617025 1.29219410612 4.00700468631 0 0 0
-2060 1 -9.4767883138 3.68787409952 4.17636937584 0 0 0
-2061 1 -4.01165506105 1.05554530842 1.26689789204 0 0 0
-2062 1 -1.44741392251 3.86430033119 1.250372929 0 0 0
-2063 1 -1.45605763901 1.32312355308 3.95849128846 0 0 0
-2064 1 -4.03027758838 3.93422144312 4.01282855757 0 0 0
-2065 1 1.30544526033 1.29981065898 1.24286994365 0 0 0
-2066 1 3.98371173778 4.03921879383 1.12241725104 0 0 0
-2067 1 3.99852962615 1.5388543236 3.77524837144 0 0 0
-2068 1 1.21207078088 4.02201555827 3.8803284334 0 0 0
-2069 1 6.83140950862 1.38576976111 1.32767199885 0 0 0
-2070 1 9.60102570826 3.87597229614 1.36063063639 0 0 0
-2071 1 9.60054221293 1.20775249496 3.98383776793 0 0 0
-2072 1 6.87954803885 4.0183956207 4.16075333151 0 0 0
-2073 1 12.1902505544 1.26405701682 1.38029419386 0 0 0
-2074 1 14.4671220422 4.05609028539 1.25796473028 0 0 0
-2075 1 14.7322578054 1.47655450495 4.13991859359 0 0 0
-2076 1 12.1069236204 3.94435789566 4.22901865993 0 0 0
-2077 1 17.4139117625 1.56902949734 1.16794952239 0 0 0
-2078 1 20.2147009039 4.028540406 1.16159949938 0 0 0
-2079 1 20.2176796119 1.47321799933 3.83042762698 0 0 0
-2080 1 17.5148546114 4.06421602673 3.99864217669 0 0 0
-2081 1 22.8619162404 1.45519499754 1.28045183389 0 0 0
-2082 1 25.7472262773 3.9564371351 1.14096306628 0 0 0
-2083 1 25.7989820445 1.53130816072 4.0139596025 0 0 0
-2084 1 22.8650342631 4.23097004185 3.86868657946 0 0 0
-2085 1 28.3271023427 1.18452542236 1.20945299717 0 0 0
-2086 1 30.9125338813 4.05435791114 1.22497026451 0 0 0
-2087 1 30.8598356652 1.30101535333 4.04143570375 0 0 0
-2088 1 28.2957637238 4.11115369425 3.96132399218 0 0 0
-2089 1 33.5235892801 1.60418944839 1.4034884659 0 0 0
-2090 1 36.6492445545 4.06884099375 1.25271063204 0 0 0
-2091 1 36.5177657244 1.50693857988 3.89355214645 0 0 0
-2092 1 33.654535669 4.03910289881 4.15697935441 0 0 0
-2093 1 39.4539589409 1.23199352818 1.21951717055 0 0 0
-2094 1 42.1239842386 3.84867152346 1.2146081789 0 0 0
-2095 1 41.973622714 1.33902551082 3.86239121712 0 0 0
-2096 1 39.4360605326 4.04692017885 3.86565623174 0 0 0
-2097 1 44.7048225084 1.11778593127 1.37989065121 0 0 0
-2098 1 47.485163158 3.77360997815 1.41221803765 0 0 0
-2099 1 47.4006097974 1.2125851126 4.11001977983 0 0 0
-2100 1 44.70920409 3.80597288064 4.13668527636 0 0 0
-2101 1 50.1964538435 1.22994888297 1.32682842427 0 0 0
-2102 1 52.5513439211 4.10364879996 1.60316280624 0 0 0
-2103 1 52.7510376721 1.28624344447 4.0364896369 0 0 0
-2104 1 49.9912467399 3.89211222643 4.42615465183 0 0 0
-2105 1 55.40125 1.35125 1.35125 0 0 0
-2106 1 58.10375 4.05375 1.35125 0 0 0
-2107 1 58.10375 1.35125 4.05375 0 0 0
-2108 1 55.40125 4.05375 4.05375 0 0 0
-2109 1 60.80625 1.35125 1.35125 0 0 0
-2110 1 63.50875 4.05375 1.35125 0 0 0
-2111 1 63.50875 1.35125 4.05375 0 0 0
-2112 1 60.80625 4.05375 4.05375 0 0 0
-2113 1 -63.50875 6.75625 1.35125 0 0 0
-2114 1 -60.80625 9.45875 1.35125 0 0 0
-2115 1 -60.80625 6.75625 4.05375 0 0 0
-2116 1 -63.50875 9.45875 4.05375 0 0 0
-2117 1 -58.10375 6.75625 1.35125 0 0 0
-2118 1 -55.40125 9.45875 1.35125 0 0 0
-2119 1 -55.40125 6.75625 4.05375 0 0 0
-2120 1 -58.10375 9.45875 4.05375 0 0 0
-2121 1 -52.725549717 6.8377739782 1.46420992107 0 0 0
-2122 1 -50.0668519119 9.59556433231 1.17760401522 0 0 0
-2123 1 -49.9879829743 6.58592778388 4.04611606211 0 0 0
-2124 1 -52.9005959051 9.53006782012 3.97899243579 0 0 0
-2125 1 -47.2188295295 6.68719441582 1.26256982575 0 0 0
-2126 1 -44.4346381406 9.12993480995 1.59996731471 0 0 0
-2127 1 -44.2799590614 6.53065865312 3.94207089672 0 0 0
-2128 1 -47.2003792348 9.13957913698 4.04423720009 0 0 0
-2129 1 -41.7277324048 6.59477137875 1.30450532196 0 0 0
-2130 1 -39.3369760062 9.52066757064 1.26885555283 0 0 0
-2131 1 -39.1365994419 6.57236532005 4.03640078606 0 0 0
-2132 1 -41.668950352 9.37372375465 4.04283816408 0 0 0
-2133 1 -36.6933352261 6.69900498562 1.52235626878 0 0 0
-2134 1 -33.9842854912 9.27463876484 1.14907701735 0 0 0
-2135 1 -33.9124441876 6.85906678822 4.13306167118 0 0 0
-2136 1 -36.6497622591 9.37289102266 4.01640138747 0 0 0
-2137 1 -31.1464910639 6.73805433139 1.24354857268 0 0 0
-2138 1 -28.3664261779 9.46992345334 1.16576531511 0 0 0
-2139 1 -28.2419648071 6.56413200714 3.93770794976 0 0 0
-2140 1 -31.2871665624 9.5123350694 3.77125864691 0 0 0
-2141 1 -25.7418673339 6.63791965335 1.21446842657 0 0 0
-2142 1 -23.2663028054 9.42110780403 1.17205941447 0 0 0
-2143 1 -23.1729473525 6.60499147076 3.95372196199 0 0 0
-2144 1 -25.8249666871 9.21957001036 3.90987333133 0 0 0
-2145 1 -20.5812002741 6.80745470048 1.28914572121 0 0 0
-2146 1 -17.9127840633 9.27886858838 1.27901388191 0 0 0
-2147 1 -17.7481452412 6.66278307081 4.12506463808 0 0 0
-2148 1 -20.6019723058 9.51832079237 4.00325180157 0 0 0
-2149 1 -15.0505086493 6.59108099824 1.36237826544 0 0 0
-2150 1 -12.0011024487 9.20360309968 1.32981550621 0 0 0
-2151 1 -12.082846601 6.54891904198 3.89629102167 0 0 0
-2152 1 -14.8523388533 9.33401455765 3.90832246973 0 0 0
-2153 1 -9.3819754795 6.56297527744 1.09898580661 0 0 0
-2154 1 -6.79765946956 9.34174258988 1.19836999002 0 0 0
-2155 1 -6.68410194233 6.52064047369 3.84693719085 0 0 0
-2156 1 -9.32769928349 9.18885436185 3.90340104088 0 0 0
-2157 1 -3.89452436586 6.71074195145 1.46038494059 0 0 0
-2158 1 -1.4469082849 9.39491005509 1.47730875508 0 0 0
-2159 1 -1.31735663263 6.65086300914 4.1444813568 0 0 0
-2160 1 -4.17294587156 9.49296591197 4.00215346521 0 0 0
-2161 1 1.33937146694 6.77698258325 1.27491504953 0 0 0
-2162 1 3.97889512353 9.58184763443 1.24628608796 0 0 0
-2163 1 3.91919696654 6.67441470611 4.04235415943 0 0 0
-2164 1 1.2855315333 9.32289027962 4.08189544128 0 0 0
-2165 1 6.77913985359 6.67255726616 1.39655749527 0 0 0
-2166 1 9.38634548224 9.23203456409 1.17884235365 0 0 0
-2167 1 9.42295768525 6.66103942382 4.04294712154 0 0 0
-2168 1 6.75276811293 9.32872735947 4.02103418727 0 0 0
-2169 1 12.1683323517 6.85307471163 1.37475332248 0 0 0
-2170 1 14.859263517 9.33968131511 1.38679790412 0 0 0
-2171 1 14.8007409656 6.65413789996 4.17307552194 0 0 0
-2172 1 12.0379545488 9.47450880594 3.93401684605 0 0 0
-2173 1 17.4582013739 6.64750374509 1.30028119311 0 0 0
-2174 1 20.0951142704 9.37891810172 1.01299793 0 0 0
-2175 1 20.2860612193 6.78146642973 3.95174917535 0 0 0
-2176 1 17.4359450367 9.45821791753 4.02128787558 0 0 0
-2177 1 22.8187689425 6.86064168324 1.15057754639 0 0 0
-2178 1 25.7212125888 9.55618304605 1.12597667187 0 0 0
-2179 1 25.4704229878 6.68191564538 3.95943717384 0 0 0
-2180 1 23.1009297852 9.38285412468 3.89274752654 0 0 0
-2181 1 28.3519387405 6.6382351757 1.25819154691 0 0 0
-2182 1 31.0100261667 9.2740042176 1.12590383602 0 0 0
-2183 1 30.9775067463 6.66312606821 3.85997487115 0 0 0
-2184 1 28.1581942956 9.39367615445 3.79768033524 0 0 0
-2185 1 33.7965585793 6.59592103655 1.35097250297 0 0 0
-2186 1 36.4327940997 9.36648825681 1.15513120341 0 0 0
-2187 1 36.7471194814 6.762954415 4.07360526781 0 0 0
-2188 1 33.6790217278 9.41180557915 3.76236607485 0 0 0
-2189 1 39.3574717421 6.80060916157 1.30029934126 0 0 0
-2190 1 41.9798006089 9.40559436602 1.38205737664 0 0 0
-2191 1 42.2473555071 6.54295080615 4.05574437764 0 0 0
-2192 1 39.4585131711 9.29506269186 4.21741290964 0 0 0
-2193 1 44.7339039663 6.66900413602 1.11198305629 0 0 0
-2194 1 47.3433829673 9.37969691834 1.16454417762 0 0 0
-2195 1 47.3729090401 6.62218903748 4.26210884117 0 0 0
-2196 1 44.7069884103 9.35305403086 3.94289380725 0 0 0
-2197 1 50.026057733 6.65733792783 1.7276411962 0 0 0
-2198 1 52.6640479554 9.66203694366 1.58768377126 0 0 0
-2199 1 52.7852589838 6.80788322259 4.18588342082 0 0 0
-2200 1 49.7534739626 9.60285219428 4.11579250201 0 0 0
-2201 1 55.40125 6.75625 1.35125 0 0 0
-2202 1 58.10375 9.45875 1.35125 0 0 0
-2203 1 58.10375 6.75625 4.05375 0 0 0
-2204 1 55.40125 9.45875 4.05375 0 0 0
-2205 1 60.80625 6.75625 1.35125 0 0 0
-2206 1 63.50875 9.45875 1.35125 0 0 0
-2207 1 63.50875 6.75625 4.05375 0 0 0
-2208 1 60.80625 9.45875 4.05375 0 0 0
-2209 1 -63.50875 12.16125 1.35125 0 0 0
-2210 1 -60.80625 14.86375 1.35125 0 0 0
-2211 1 -60.80625 12.16125 4.05375 0 0 0
-2212 1 -63.50875 14.86375 4.05375 0 0 0
-2213 1 -58.10375 12.16125 1.35125 0 0 0
-2214 1 -55.40125 14.86375 1.35125 0 0 0
-2215 1 -55.40125 12.16125 4.05375 0 0 0
-2216 1 -58.10375 14.86375 4.05375 0 0 0
-2217 1 -52.9883564682 12.1150126498 1.34561625595 0 0 0
-2218 1 -50.0483095337 14.5124914791 1.27375994807 0 0 0
-2219 1 -50.0418441842 11.9227000193 3.96703885974 0 0 0
-2220 1 -52.7231138672 14.8546902685 4.04486636961 0 0 0
-2221 1 -46.994469592 11.7565449451 1.5458586835 0 0 0
-2222 1 -44.7852249382 14.7360554943 1.5332382962 0 0 0
-2223 1 -44.5614757022 11.9303305087 4.14624746894 0 0 0
-2224 1 -47.4066755777 14.4809566596 4.0933755619 0 0 0
-2225 1 -41.9902918181 12.12800448 1.47256744102 0 0 0
-2226 1 -39.3520545045 14.6983428306 1.21135361136 0 0 0
-2227 1 -39.2623536563 12.1927306333 4.11605819188 0 0 0
-2228 1 -42.0037614597 14.953460152 3.92528772562 0 0 0
-2229 1 -36.5696782717 11.8540161174 1.33942976 0 0 0
-2230 1 -33.8717345537 14.8511749169 1.33744377922 0 0 0
-2231 1 -33.9035464773 12.115627308 4.17006006035 0 0 0
-2232 1 -36.5379471713 14.9890550376 3.84667235064 0 0 0
-2233 1 -31.077751615 12.02187149 1.33786718674 0 0 0
-2234 1 -28.2528621614 14.7631978132 1.26778658399 0 0 0
-2235 1 -28.3266417146 12.1163557563 3.90083345612 0 0 0
-2236 1 -30.9951716637 14.7900414248 3.99800631319 0 0 0
-2237 1 -25.5175063797 12.1539300799 1.37028423924 0 0 0
-2238 1 -22.9723038659 14.9066761967 0.996516579137 0 0 0
-2239 1 -23.0094270369 12.2855636056 4.12473450504 0 0 0
-2240 1 -25.5560350662 14.8474751526 3.77674626644 0 0 0
-2241 1 -20.3690156918 12.0342599198 1.24140052696 0 0 0
-2242 1 -17.430647169 14.7125303182 1.48687401213 0 0 0
-2243 1 -17.5616771581 11.9053423092 3.8937862363 0 0 0
-2244 1 -20.2208004446 14.8821432332 3.81931460939 0 0 0
-2245 1 -14.8017086117 11.8252734156 1.27433975154 0 0 0
-2246 1 -11.9885620093 14.7257052818 1.43868659831 0 0 0
-2247 1 -12.0194452247 11.8903964145 4.04899032329 0 0 0
-2248 1 -14.5998604675 14.7519008576 4.00526669342 0 0 0
-2249 1 -9.40247805341 11.899726895 1.19765425324 0 0 0
-2250 1 -6.57552256914 14.8248782985 1.42899607167 0 0 0
-2251 1 -6.72004649539 12.1941319279 4.02174127305 0 0 0
-2252 1 -9.30523792782 15.0211557748 4.19245986454 0 0 0
-2253 1 -3.99878055473 12.0909342541 1.39621164072 0 0 0
-2254 1 -1.23359261629 14.9155423822 1.31844736808 0 0 0
-2255 1 -1.37454541422 12.1806551369 3.83695127313 0 0 0
-2256 1 -3.85229725455 14.8507583066 3.94056784328 0 0 0
-2257 1 1.3164552539 12.1913268301 1.2538029069 0 0 0
-2258 1 3.9207270708 14.7315553935 1.45307094314 0 0 0
-2259 1 3.87282965826 12.0214971906 4.06048928692 0 0 0
-2260 1 1.34001481889 14.6691429363 3.9770366803 0 0 0
-2261 1 6.67094196277 12.1120940228 1.30294615186 0 0 0
-2262 1 9.60042167648 14.6507111377 1.45264023618 0 0 0
-2263 1 9.4116299685 11.8844282571 3.94652832929 0 0 0
-2264 1 6.59293026119 14.8957046196 3.9933811544 0 0 0
-2265 1 12.3556806202 12.1107018363 1.29867718105 0 0 0
-2266 1 14.9319238079 14.8151994613 1.28285312481 0 0 0
-2267 1 14.7930237678 12.1372128442 4.04119941484 0 0 0
-2268 1 12.1629945701 14.9606034744 4.09338647611 0 0 0
-2269 1 17.6260219248 12.1319157376 1.1972430341 0 0 0
-2270 1 20.2652050927 14.873309031 1.26738534129 0 0 0
-2271 1 20.2180972936 11.8307908556 3.97594241211 0 0 0
-2272 1 17.5942617521 14.8875335217 3.98062168362 0 0 0
-2273 1 22.9960749826 12.119649909 1.07906786924 0 0 0
-2274 1 25.4487899191 14.8778189264 1.07125795036 0 0 0
-2275 1 25.6636042999 12.0759802366 3.83450466797 0 0 0
-2276 1 22.7072501625 14.795197914 3.78948381512 0 0 0
-2277 1 28.3505406881 12.0394872038 0.971381839452 0 0 0
-2278 1 31.2129323196 14.6302246077 1.16387842698 0 0 0
-2279 1 30.7664582407 12.0436581901 3.79583121921 0 0 0
-2280 1 28.2666973302 14.7511573005 3.69856082969 0 0 0
-2281 1 33.6899839177 11.8566055772 1.17086815027 0 0 0
-2282 1 36.4749752507 14.5835675414 1.10245690946 0 0 0
-2283 1 36.3807567235 12.1470202677 3.96297315844 0 0 0
-2284 1 33.6427157249 14.8327401621 3.91618378446 0 0 0
-2285 1 39.0670340002 11.8904211141 1.35588884331 0 0 0
-2286 1 42.0460420396 14.6720249609 1.32610286977 0 0 0
-2287 1 41.9206007865 12.1591445028 3.94269177844 0 0 0
-2288 1 39.0715658761 14.6864419454 3.80984925109 0 0 0
-2289 1 44.8204714647 12.134804632 1.34742917319 0 0 0
-2290 1 47.3010086975 14.8997123474 1.39529469939 0 0 0
-2291 1 47.1700980889 12.1772199431 4.09393105242 0 0 0
-2292 1 44.611095964 14.9538348527 4.0013460867 0 0 0
-2293 1 50.016319526 12.1915014493 1.40865578467 0 0 0
-2294 1 52.621784258 15.019059163 1.40892426182 0 0 0
-2295 1 52.8548247173 12.2070570286 4.16166014298 0 0 0
-2296 1 49.8912080232 14.9162320343 4.05298343734 0 0 0
-2297 1 55.40125 12.16125 1.35125 0 0 0
-2298 1 58.10375 14.86375 1.35125 0 0 0
-2299 1 58.10375 12.16125 4.05375 0 0 0
-2300 1 55.40125 14.86375 4.05375 0 0 0
-2301 1 60.80625 12.16125 1.35125 0 0 0
-2302 1 63.50875 14.86375 1.35125 0 0 0
-2303 1 63.50875 12.16125 4.05375 0 0 0
-2304 1 60.80625 14.86375 4.05375 0 0 0
-2305 1 -63.50875 -14.86375 6.75625 0 0 0
-2306 1 -60.80625 -12.16125 6.75625 0 0 0
-2307 1 -60.80625 -14.86375 9.45875 0 0 0
-2308 1 -63.50875 -12.16125 9.45875 0 0 0
-2309 1 -58.10375 -14.86375 6.75625 0 0 0
-2310 1 -55.40125 -12.16125 6.75625 0 0 0
-2311 1 -55.40125 -14.86375 9.45875 0 0 0
-2312 1 -58.10375 -12.16125 9.45875 0 0 0
-2313 1 -52.7490977064 -14.8689560423 6.89511568696 0 0 0
-2314 1 -49.8178420352 -12.356118884 6.78737611842 0 0 0
-2315 1 -50.0219240266 -15.090432588 9.5969456805 0 0 0
-2316 1 -52.7413825087 -12.2919724506 9.4390567597 0 0 0
-2317 1 -47.3071701262 -15.1035559085 6.58911179964 0 0 0
-2318 1 -44.6072332224 -12.0110979636 6.5842761004 0 0 0
-2319 1 -44.5629743778 -14.9838221626 9.28435032426 0 0 0
-2320 1 -47.2749540412 -12.5403242823 9.33380562914 0 0 0
-2321 1 -41.897428697 -14.7304117403 6.43143199191 0 0 0
-2322 1 -39.2714419898 -12.3035580754 6.46870984742 0 0 0
-2323 1 -39.3249911578 -14.9202866984 9.45537979905 0 0 0
-2324 1 -41.8715030839 -12.1222304838 9.29302128863 0 0 0
-2325 1 -36.5387951091 -14.9979690296 6.65518260082 0 0 0
-2326 1 -33.8026895504 -12.2640267778 6.44497700286 0 0 0
-2327 1 -33.8740935985 -14.8886755597 9.4018108443 0 0 0
-2328 1 -36.7817003049 -12.0920087302 9.38507223414 0 0 0
-2329 1 -31.0317072764 -14.9495431598 6.71798137551 0 0 0
-2330 1 -28.3052389006 -12.2970735859 6.54107869684 0 0 0
-2331 1 -28.3460942009 -14.7492007476 9.23033882967 0 0 0
-2332 1 -31.1186043784 -12.0287866283 9.33489194263 0 0 0
-2333 1 -25.7212390418 -14.9630012784 6.62689314591 0 0 0
-2334 1 -22.8672273277 -12.4249742846 6.27805724513 0 0 0
-2335 1 -23.05069219 -14.8231050694 9.4286238734 0 0 0
-2336 1 -25.646758697 -12.2414205088 9.24133298949 0 0 0
-2337 1 -20.1998009493 -14.8815552367 6.50899928167 0 0 0
-2338 1 -17.532284017 -12.1478644298 6.58438695901 0 0 0
-2339 1 -17.5653030481 -14.9860704173 9.36059599801 0 0 0
-2340 1 -20.3091905297 -12.4391122802 9.0915792668 0 0 0
-2341 1 -14.7200557308 -14.9658741871 6.69703630815 0 0 0
-2342 1 -12.0602340391 -12.1008493712 6.47415388615 0 0 0
-2343 1 -12.0095727034 -14.8996689362 9.34313192948 0 0 0
-2344 1 -14.8702381839 -12.2579503169 9.33527950754 0 0 0
-2345 1 -9.38878104381 -14.7348305996 6.61958201522 0 0 0
-2346 1 -6.73358233908 -12.0640568044 6.44583260319 0 0 0
-2347 1 -6.61548634185 -14.7973539438 9.18487102469 0 0 0
-2348 1 -9.27598699324 -12.1399633849 9.21100426055 0 0 0
-2349 1 -4.09187722672 -14.81603865 6.57446897189 0 0 0
-2350 1 -1.37928213641 -12.1807653931 6.51769889092 0 0 0
-2351 1 -1.14751946818 -14.8992658106 9.37317088265 0 0 0
-2352 1 -4.11368353744 -12.175086967 9.09574738655 0 0 0
-2353 1 1.37762306555 -15.0059319402 6.38441103652 0 0 0
-2354 1 4.07406369975 -12.0759975822 6.57233213643 0 0 0
-2355 1 3.89150885694 -14.8997063053 9.41705359936 0 0 0
-2356 1 1.12822571973 -12.3323336032 9.41747253214 0 0 0
-2357 1 6.67491760963 -14.7797889411 6.63256961222 0 0 0
-2358 1 9.52592916661 -12.3104345865 6.66065144118 0 0 0
-2359 1 9.3731933709 -14.9146997639 9.54282786473 0 0 0
-2360 1 6.55665149655 -12.1946827524 9.29916550805 0 0 0
-2361 1 12.1184905417 -14.8576510741 6.66164938949 0 0 0
-2362 1 14.8003115581 -12.1141325762 6.89740388234 0 0 0
-2363 1 14.9386533945 -14.9218239132 9.4487993797 0 0 0
-2364 1 12.1874067777 -12.0704739473 9.34423170769 0 0 0
-2365 1 17.6738178138 -14.9383449868 6.81266390525 0 0 0
-2366 1 20.2911890226 -12.0035885451 6.46456438433 0 0 0
-2367 1 20.4721035064 -14.8702350112 9.28514044579 0 0 0
-2368 1 17.5840191407 -12.2949708862 9.32180477296 0 0 0
-2369 1 22.8728883046 -14.935384779 6.51543046786 0 0 0
-2370 1 25.6166301056 -12.5097367073 6.63063839147 0 0 0
-2371 1 25.4708114759 -15.0084055523 9.31730527834 0 0 0
-2372 1 22.7079258078 -11.9932547131 9.14168893108 0 0 0
-2373 1 28.2650211821 -15.0450142045 6.5392588921 0 0 0
-2374 1 30.9933645001 -12.4314165664 6.62579760132 0 0 0
-2375 1 31.0570417682 -15.2351681912 9.15081707866 0 0 0
-2376 1 28.3686231653 -12.4252225781 9.22042214419 0 0 0
-2377 1 33.6381172809 -15.005127764 6.53029807684 0 0 0
-2378 1 36.4075788581 -12.2368622753 6.55964259789 0 0 0
-2379 1 36.4421983818 -15.1182212247 9.39511277333 0 0 0
-2380 1 33.8371154088 -12.5514655864 9.12941756408 0 0 0
-2381 1 39.1394494732 -15.0709064478 6.61566746941 0 0 0
-2382 1 41.6166431606 -12.3640344422 6.62717443723 0 0 0
-2383 1 41.6475617862 -14.8151672735 9.25439881918 0 0 0
-2384 1 38.8757391086 -12.2551884778 9.36644411177 0 0 0
-2385 1 44.5663797523 -14.7284879703 6.70286700744 0 0 0
-2386 1 47.2622964922 -11.9989507259 6.53240427254 0 0 0
-2387 1 47.3053716409 -14.7443518535 9.36223165586 0 0 0
-2388 1 44.5304986997 -12.0544233732 9.33111706539 0 0 0
-2389 1 49.939788109 -14.746987815 6.70112124306 0 0 0
-2390 1 52.6874437436 -12.0255403026 6.63225016951 0 0 0
-2391 1 52.7969094231 -14.7789601316 9.19332061681 0 0 0
-2392 1 49.9494277307 -12.1455728928 9.36248685639 0 0 0
-2393 1 55.40125 -14.86375 6.75625 0 0 0
-2394 1 58.10375 -12.16125 6.75625 0 0 0
-2395 1 58.10375 -14.86375 9.45875 0 0 0
-2396 1 55.40125 -12.16125 9.45875 0 0 0
-2397 1 60.80625 -14.86375 6.75625 0 0 0
-2398 1 63.50875 -12.16125 6.75625 0 0 0
-2399 1 63.50875 -14.86375 9.45875 0 0 0
-2400 1 60.80625 -12.16125 9.45875 0 0 0
-2401 1 -63.50875 -9.45875 6.75625 0 0 0
-2402 1 -60.80625 -6.75625 6.75625 0 0 0
-2403 1 -60.80625 -9.45875 9.45875 0 0 0
-2404 1 -63.50875 -6.75625 9.45875 0 0 0
-2405 1 -58.10375 -9.45875 6.75625 0 0 0
-2406 1 -55.40125 -6.75625 6.75625 0 0 0
-2407 1 -55.40125 -9.45875 9.45875 0 0 0
-2408 1 -58.10375 -6.75625 9.45875 0 0 0
-2409 1 -52.7474389138 -9.31064507068 6.58503565108 0 0 0
-2410 1 -50.0813247995 -6.65008807715 6.83283438065 0 0 0
-2411 1 -50.1260202108 -9.41384562489 9.36993683153 0 0 0
-2412 1 -52.867958927 -6.66518285031 9.48275483971 0 0 0
-2413 1 -47.4101805213 -9.39400713394 6.83040619462 0 0 0
-2414 1 -44.74956387 -6.55272073515 6.81043263191 0 0 0
-2415 1 -44.7374951699 -9.22866930527 9.33706403423 0 0 0
-2416 1 -47.4323266524 -6.56106863046 9.43765973608 0 0 0
-2417 1 -41.9805113299 -9.43572144278 6.65546824193 0 0 0
-2418 1 -39.0963270858 -6.95788933348 6.57210762667 0 0 0
-2419 1 -39.2357437826 -9.47512377555 9.29796793415 0 0 0
-2420 1 -41.7690452978 -6.64708750468 9.16890035406 0 0 0
-2421 1 -36.5166465639 -9.49680349875 6.50653665013 0 0 0
-2422 1 -33.7116397555 -6.80429693362 6.67024990499 0 0 0
-2423 1 -33.9731964256 -9.60202988855 9.1372373389 0 0 0
-2424 1 -36.5859300959 -6.83276404713 9.10225476448 0 0 0
-2425 1 -31.1675207723 -9.54219525216 6.4967035898 0 0 0
-2426 1 -28.4878054112 -6.79842104267 6.55270281521 0 0 0
-2427 1 -28.3190001269 -9.66455662794 9.04084169247 0 0 0
-2428 1 -31.0536102235 -6.88422145576 9.34533480571 0 0 0
-2429 1 -25.5549757081 -9.73973174483 6.32782199824 0 0 0
-2430 1 -23.2504616791 -6.85369698275 6.64781940271 0 0 0
-2431 1 -23.0818402534 -9.74766519631 9.29704210192 0 0 0
-2432 1 -25.7298515089 -6.96925448407 9.22152493792 0 0 0
-2433 1 -20.2795120989 -9.60858707571 6.64264621336 0 0 0
-2434 1 -17.6153669603 -6.89506921366 6.65674044323 0 0 0
-2435 1 -17.7288338847 -9.5122136754 9.40116329671 0 0 0
-2436 1 -20.510497596 -7.16041547103 9.3641856036 0 0 0
-2437 1 -14.8264062416 -9.62449624886 6.60864494755 0 0 0
-2438 1 -12.2288351479 -6.70513805362 6.5526039736 0 0 0
-2439 1 -11.8978923132 -9.47321358126 9.30205283977 0 0 0
-2440 1 -14.8904578469 -6.85993226798 9.31668912146 0 0 0
-2441 1 -9.57372618211 -9.25307155659 6.62242405878 0 0 0
-2442 1 -6.81352386128 -6.85227603738 6.35653805902 0 0 0
-2443 1 -6.87528615498 -9.25174197847 9.1352183348 0 0 0
-2444 1 -9.55608367799 -6.57944400568 9.2374802133 0 0 0
-2445 1 -3.91923857075 -9.42244998021 6.35104759357 0 0 0
-2446 1 -1.43059215126 -6.74100909681 6.55044420879 0 0 0
-2447 1 -1.29444196527 -9.47807983131 9.09276396583 0 0 0
-2448 1 -3.95001641038 -6.7759116597 9.29235110888 0 0 0
-2449 1 1.24445781121 -9.61830525046 6.61012881188 0 0 0
-2450 1 4.00900554079 -6.96030387328 6.80533186404 0 0 0
-2451 1 3.86705690369 -9.49582316704 9.43544586891 0 0 0
-2452 1 1.19389112873 -6.78072138879 9.23214426969 0 0 0
-2453 1 6.706880223 -9.47669087323 6.61938910246 0 0 0
-2454 1 9.42639364782 -6.81020678106 6.71753297146 0 0 0
-2455 1 9.40294105977 -9.58959513143 9.18858719469 0 0 0
-2456 1 6.87013943276 -6.93662609654 9.22680426012 0 0 0
-2457 1 12.1708423221 -9.40809909417 6.74622004518 0 0 0
-2458 1 14.7689255455 -6.62150616426 6.65098609558 0 0 0
-2459 1 14.870761232 -9.38196605019 9.41451935355 0 0 0
-2460 1 12.2254712046 -6.90622053272 9.49517559263 0 0 0
-2461 1 17.4832090099 -9.31092119629 6.47847365445 0 0 0
-2462 1 20.2670563435 -6.69486314647 6.46805996245 0 0 0
-2463 1 19.9888682294 -9.51051705912 9.21900753528 0 0 0
-2464 1 17.5050813825 -6.77171696813 9.19320314966 0 0 0
-2465 1 22.8911763757 -9.37920026108 6.59486537472 0 0 0
-2466 1 25.6308036299 -6.68333996532 6.64533913889 0 0 0
-2467 1 25.4703324681 -9.68386428844 9.13735995448 0 0 0
-2468 1 23.0129666453 -6.86550757426 9.32533047408 0 0 0
-2469 1 28.3043866066 -9.86198937701 6.59044139824 0 0 0
-2470 1 31.0085618977 -6.86925723154 6.64338386566 0 0 0
-2471 1 31.3692987362 -9.85476758564 9.2855336805 0 0 0
-2472 1 28.3536167487 -6.94832866275 9.10522730255 0 0 0
-2473 1 33.8381168679 -9.67400512985 6.28474766511 0 0 0
-2474 1 36.4109167331 -6.61764844345 6.82740703617 0 0 0
-2475 1 36.2787022781 -9.65408835112 9.30587940889 0 0 0
-2476 1 33.6150075195 -6.75580675255 9.29293466772 0 0 0
-2477 1 39.1284470524 -9.57758488229 6.68453836189 0 0 0
-2478 1 41.7228775824 -6.79120162699 6.6177142926 0 0 0
-2479 1 41.7399295629 -9.60982012629 9.37680909922 0 0 0
-2480 1 38.9093780682 -6.76176561318 9.41145754568 0 0 0
-2481 1 44.3945068931 -9.62252037247 6.71245324695 0 0 0
-2482 1 47.1508407412 -6.95941840886 6.6708283344 0 0 0
-2483 1 47.3468155787 -9.49307218336 9.34288966537 0 0 0
-2484 1 44.4995120257 -6.77931023789 9.24471671566 0 0 0
-2485 1 49.9749201467 -9.33930235373 6.50479210098 0 0 0
-2486 1 52.6666532863 -6.66298879717 6.7069370026 0 0 0
-2487 1 52.5037415703 -9.79473681002 9.41028615419 0 0 0
-2488 1 50.0712114978 -6.69488131544 9.28616142838 0 0 0
-2489 1 55.40125 -9.45875 6.75625 0 0 0
-2490 1 58.10375 -6.75625 6.75625 0 0 0
-2491 1 58.10375 -9.45875 9.45875 0 0 0
-2492 1 55.40125 -6.75625 9.45875 0 0 0
-2493 1 60.80625 -9.45875 6.75625 0 0 0
-2494 1 63.50875 -6.75625 6.75625 0 0 0
-2495 1 63.50875 -9.45875 9.45875 0 0 0
-2496 1 60.80625 -6.75625 9.45875 0 0 0
-2497 1 -63.50875 -4.05375 6.75625 0 0 0
-2498 1 -60.80625 -1.35125 6.75625 0 0 0
-2499 1 -60.80625 -4.05375 9.45875 0 0 0
-2500 1 -63.50875 -1.35125 9.45875 0 0 0
-2501 1 -58.10375 -4.05375 6.75625 0 0 0
-2502 1 -55.40125 -1.35125 6.75625 0 0 0
-2503 1 -55.40125 -4.05375 9.45875 0 0 0
-2504 1 -58.10375 -1.35125 9.45875 0 0 0
-2505 1 -52.7186064376 -3.93357478779 6.92111474381 0 0 0
-2506 1 -50.0325067083 -1.25259148172 6.58387375186 0 0 0
-2507 1 -50.082100783 -3.93367705043 9.29322901727 0 0 0
-2508 1 -52.7422472344 -1.19437610359 9.37508532125 0 0 0
-2509 1 -47.2339910849 -3.74017174471 6.69247723324 0 0 0
-2510 1 -44.5535580428 -1.29734095572 6.84863006286 0 0 0
-2511 1 -44.5737581001 -4.17585072375 9.39060239289 0 0 0
-2512 1 -47.2472499446 -1.38445847231 9.51399503803 0 0 0
-2513 1 -41.7674172694 -4.06272922108 6.60072511584 0 0 0
-2514 1 -38.9885762242 -1.42991263179 6.58033748549 0 0 0
-2515 1 -39.2326362826 -4.04736061367 9.3934851502 0 0 0
-2516 1 -41.6893051643 -1.40837164389 9.31511827847 0 0 0
-2517 1 -36.3758484646 -4.08294455958 6.79389336664 0 0 0
-2518 1 -33.7449142857 -1.42984912938 6.69551683362 0 0 0
-2519 1 -33.6881608876 -4.2917849548 9.35848442698 0 0 0
-2520 1 -36.369860469 -1.39817549964 9.39973507674 0 0 0
-2521 1 -31.079785795 -4.08208355196 6.80049947029 0 0 0
-2522 1 -28.4125751458 -1.35618703671 6.54582073367 0 0 0
-2523 1 -28.6507525835 -4.14661586641 9.39815667381 0 0 0
-2524 1 -30.9666079184 -1.40626938529 9.29421395821 0 0 0
-2525 1 -25.6878463163 -4.12966493379 6.78881118028 0 0 0
-2526 1 -22.9826630304 -1.18379855975 6.77556897966 0 0 0
-2527 1 -23.0541768824 -4.40238916891 9.40038829723 0 0 0
-2528 1 -25.6347805096 -1.45859527979 9.22097055255 0 0 0
-2529 1 -20.4524224864 -4.15672286103 6.68937003903 0 0 0
-2530 1 -17.6892491794 -1.53613095444 6.71596661348 0 0 0
-2531 1 -17.6886877858 -4.14062403098 9.42163159719 0 0 0
-2532 1 -20.4330625942 -1.49207007348 9.51994990172 0 0 0
-2533 1 -15.057013088 -4.16979741984 6.60808325088 0 0 0
-2534 1 -12.4536389212 -1.41642207975 6.68752820093 0 0 0
-2535 1 -12.4066401348 -4.04160716156 9.45234817993 0 0 0
-2536 1 -14.9399136547 -1.41138277214 9.57598013554 0 0 0
-2537 1 -9.51946911892 -3.85374898457 6.50448758079 0 0 0
-2538 1 -6.78852779793 -1.37978195371 6.5162272613 0 0 0
-2539 1 -6.87894513435 -4.31655921696 9.1681692645 0 0 0
-2540 1 -9.492696115 -1.44159232103 9.34792494195 0 0 0
-2541 1 -4.1976231882 -3.99635604634 6.70124178457 0 0 0
-2542 1 -1.17061101745 -1.35885244141 6.73505258893 0 0 0
-2543 1 -1.55943265231 -4.14861626595 9.47476553503 0 0 0
-2544 1 -4.12130673457 -1.32460559135 9.49536571709 0 0 0
-2545 1 1.17659461436 -4.2294616088 6.77260181565 0 0 0
-2546 1 4.07720125227 -1.13598598986 6.56692170886 0 0 0
-2547 1 4.16402805617 -4.09491213878 9.3096016626 0 0 0
-2548 1 1.32238906897 -1.50749689454 9.36632437149 0 0 0
-2549 1 6.62712328711 -4.06620545584 6.61534133352 0 0 0
-2550 1 9.39489270613 -1.50805635666 6.68808944127 0 0 0
-2551 1 9.36577291778 -4.08395822 9.32468528641 0 0 0
-2552 1 6.6795923563 -1.38789082784 9.38738602798 0 0 0
-2553 1 11.9246935185 -4.00274927491 6.63421443302 0 0 0
-2554 1 14.9794776286 -1.34009727793 6.68889074224 0 0 0
-2555 1 14.6369349243 -4.06049696557 9.37294732732 0 0 0
-2556 1 12.0842470438 -1.47304254526 9.43290045828 0 0 0
-2557 1 17.5848804595 -4.00641710462 6.68183524712 0 0 0
-2558 1 20.2075840431 -1.32171330221 6.39335699053 0 0 0
-2559 1 20.1781021089 -4.01909239582 9.19069011312 0 0 0
-2560 1 17.4141306513 -1.37416411568 9.37150884559 0 0 0
-2561 1 22.9459957067 -4.03032549329 6.49944141518 0 0 0
-2562 1 25.4844675228 -1.32951486649 6.52176846536 0 0 0
-2563 1 25.6471109827 -4.08420121084 9.25653969927 0 0 0
-2564 1 23.0912469 -1.42757473359 9.2971476314 0 0 0
-2565 1 28.2979777062 -4.04028019152 6.5346928317 0 0 0
-2566 1 31.0398049905 -1.32047442774 6.79197126262 0 0 0
-2567 1 30.9307728622 -4.02909819052 9.26753689545 0 0 0
-2568 1 28.2975827402 -1.56408319338 9.28685883701 0 0 0
-2569 1 33.638180956 -4.18072355575 6.6156943959 0 0 0
-2570 1 36.5292307415 -1.20712096794 6.50699524725 0 0 0
-2571 1 36.1921079142 -3.85887174979 9.41899686958 0 0 0
-2572 1 33.6087400586 -1.14277732891 9.51786954625 0 0 0
-2573 1 39.0293991888 -4.00091452555 6.77180552534 0 0 0
-2574 1 41.7987449515 -1.32064835536 6.6679486717 0 0 0
-2575 1 41.6773638029 -4.09290661565 9.24515569724 0 0 0
-2576 1 39.0106775464 -1.29897252669 9.1809130691 0 0 0
-2577 1 44.6588260257 -4.07153657786 6.52762837747 0 0 0
-2578 1 47.3231343094 -1.41304408358 6.64516205379 0 0 0
-2579 1 47.2405137369 -4.35837713731 9.32210648868 0 0 0
-2580 1 44.6444714205 -1.50905197138 9.31676159675 0 0 0
-2581 1 49.9335443184 -3.93532705951 6.78609545018 0 0 0
-2582 1 52.7349455407 -1.31773513365 6.77917837218 0 0 0
-2583 1 52.6271758111 -4.08870448309 9.69047990727 0 0 0
-2584 1 49.9288743022 -1.33045056646 9.47760652088 0 0 0
-2585 1 55.40125 -4.05375 6.75625 0 0 0
-2586 1 58.10375 -1.35125 6.75625 0 0 0
-2587 1 58.10375 -4.05375 9.45875 0 0 0
-2588 1 55.40125 -1.35125 9.45875 0 0 0
-2589 1 60.80625 -4.05375 6.75625 0 0 0
-2590 1 63.50875 -1.35125 6.75625 0 0 0
-2591 1 63.50875 -4.05375 9.45875 0 0 0
-2592 1 60.80625 -1.35125 9.45875 0 0 0
-2593 1 -63.50875 1.35125 6.75625 0 0 0
-2594 1 -60.80625 4.05375 6.75625 0 0 0
-2595 1 -60.80625 1.35125 9.45875 0 0 0
-2596 1 -63.50875 4.05375 9.45875 0 0 0
-2597 1 -58.10375 1.35125 6.75625 0 0 0
-2598 1 -55.40125 4.05375 6.75625 0 0 0
-2599 1 -55.40125 1.35125 9.45875 0 0 0
-2600 1 -58.10375 4.05375 9.45875 0 0 0
-2601 1 -52.7959824149 1.46895132032 6.72668260359 0 0 0
-2602 1 -49.9394374427 4.16908257248 6.62324750764 0 0 0
-2603 1 -49.9368647369 1.38263857887 9.23417032497 0 0 0
-2604 1 -52.5495790155 4.15820776884 9.40756756823 0 0 0
-2605 1 -47.3056417807 1.42962896582 6.63072295849 0 0 0
-2606 1 -44.4920891576 4.11943917223 6.62945726776 0 0 0
-2607 1 -44.3325300568 1.23335764334 9.45435681083 0 0 0
-2608 1 -47.1808060457 4.11934896611 9.43678211639 0 0 0
-2609 1 -41.6915756779 1.35506324886 6.96873883223 0 0 0
-2610 1 -38.9989808709 4.01800928433 6.77494125944 0 0 0
-2611 1 -38.936285556 1.31657769401 9.41755288076 0 0 0
-2612 1 -41.78492686 3.99300770024 9.31162822444 0 0 0
-2613 1 -36.4022173162 1.4089269518 6.74632979188 0 0 0
-2614 1 -33.7293967731 4.16203876996 6.74573361743 0 0 0
-2615 1 -33.8011205734 1.45207523181 9.07650522185 0 0 0
-2616 1 -36.3279975122 4.01586359776 9.45455491337 0 0 0
-2617 1 -30.9599359302 1.16106269943 6.48283131894 0 0 0
-2618 1 -28.5625749691 3.9945667995 6.40358897128 0 0 0
-2619 1 -28.5171989452 1.41107867034 9.29965104553 0 0 0
-2620 1 -31.0684048029 4.24868098182 9.20373208767 0 0 0
-2621 1 -25.721606921 1.40928281959 6.64823995452 0 0 0
-2622 1 -23.0905510557 4.02954838959 6.60619627058 0 0 0
-2623 1 -23.0215083948 1.41775472351 9.45857753324 0 0 0
-2624 1 -25.9708860497 4.10980364049 9.35963678822 0 0 0
-2625 1 -20.2937122124 1.29534664537 6.71315829866 0 0 0
-2626 1 -17.9059552583 4.20026534634 6.79600353197 0 0 0
-2627 1 -17.7335272875 1.16091462549 9.34783536039 0 0 0
-2628 1 -20.4455771659 4.13850795501 9.31678346284 0 0 0
-2629 1 -15.0487624875 1.27595700107 6.57310304177 0 0 0
-2630 1 -12.3417718127 4.0967047608 6.75342899496 0 0 0
-2631 1 -12.2609309366 1.36537079163 9.43818537357 0 0 0
-2632 1 -15.1703979507 3.94481191164 9.35306621696 0 0 0
-2633 1 -9.75768373105 1.18889077474 6.7589370192 0 0 0
-2634 1 -6.80888527946 3.75761354364 6.72685223327 0 0 0
-2635 1 -7.00227144196 1.30347529062 9.43598204312 0 0 0
-2636 1 -9.51936906396 4.20577591314 9.41686649457 0 0 0
-2637 1 -3.7481524093 1.24143236091 6.76198944843 0 0 0
-2638 1 -1.34873357018 3.9685062432 6.68485648542 0 0 0
-2639 1 -1.22783107484 1.29300511627 9.58196925592 0 0 0
-2640 1 -3.95989293755 3.99294309564 9.4423008152 0 0 0
-2641 1 1.25127851349 1.45768763364 6.54996648202 0 0 0
-2642 1 3.87238110025 3.98311285714 6.75393253416 0 0 0
-2643 1 4.09282452014 1.39219252668 9.40139332605 0 0 0
-2644 1 1.27401105667 4.00336602006 9.46048404128 0 0 0
-2645 1 6.83222429863 1.3599944591 6.73422104233 0 0 0
-2646 1 9.64156316565 3.78735180689 6.70871684583 0 0 0
-2647 1 9.36728959106 1.18822227908 9.47148681091 0 0 0
-2648 1 6.71631365254 4.15143068438 9.41778851746 0 0 0
-2649 1 12.3470504222 1.16466235442 6.75854391898 0 0 0
-2650 1 14.8069515369 4.01045461282 6.80964400897 0 0 0
-2651 1 14.7482359551 1.36596424802 9.42894567219 0 0 0
-2652 1 12.2602167169 4.05465650315 9.35897655267 0 0 0
-2653 1 17.5136569282 1.37428490716 6.72850290473 0 0 0
-2654 1 20.2110769918 4.13974489364 6.68695370877 0 0 0
-2655 1 20.3647226515 1.2070814598 9.29766591399 0 0 0
-2656 1 17.6244725305 3.97919595039 9.43615601831 0 0 0
-2657 1 22.7950279507 1.48104435557 6.48071661838 0 0 0
-2658 1 25.5985590392 4.29377120349 6.56390743885 0 0 0
-2659 1 25.5210362025 1.39864040828 9.06486992536 0 0 0
-2660 1 22.9040074719 4.10624777523 9.37038382439 0 0 0
-2661 1 28.2332555114 1.19661079241 6.54922290541 0 0 0
-2662 1 30.8498536809 4.07143615325 6.63806422569 0 0 0
-2663 1 30.7554647606 1.29974362132 9.2607033237 0 0 0
-2664 1 28.1641128796 4.05569421464 9.29403333838 0 0 0
-2665 1 33.6767961026 1.36474229431 6.58964902388 0 0 0
-2666 1 36.4700353983 4.1762349936 6.78260264048 0 0 0
-2667 1 36.4623527402 1.55918600416 9.38984110808 0 0 0
-2668 1 33.6523907229 3.95189492543 9.48293931105 0 0 0
-2669 1 39.1550734409 1.54369308438 6.66670413349 0 0 0
-2670 1 42.0888399718 3.9464090798 6.9645578922 0 0 0
-2671 1 41.8844759523 1.07652484943 9.37295180192 0 0 0
-2672 1 39.3736306314 3.96744773906 9.38827540984 0 0 0
-2673 1 44.5902123019 1.0250724791 6.67023522416 0 0 0
-2674 1 47.3754740161 4.09465858759 6.9074591629 0 0 0
-2675 1 47.2801223933 1.19117390839 9.41291371301 0 0 0
-2676 1 44.7148226079 3.74191878181 9.58728630123 0 0 0
-2677 1 50.0927262737 1.22596637305 6.90758854844 0 0 0
-2678 1 52.8402809312 3.96405999231 6.7474021733 0 0 0
-2679 1 52.6564509324 1.25921109537 9.57967132397 0 0 0
-2680 1 50.0264542956 4.00938726744 9.44846107399 0 0 0
-2681 1 55.40125 1.35125 6.75625 0 0 0
-2682 1 58.10375 4.05375 6.75625 0 0 0
-2683 1 58.10375 1.35125 9.45875 0 0 0
-2684 1 55.40125 4.05375 9.45875 0 0 0
-2685 1 60.80625 1.35125 6.75625 0 0 0
-2686 1 63.50875 4.05375 6.75625 0 0 0
-2687 1 63.50875 1.35125 9.45875 0 0 0
-2688 1 60.80625 4.05375 9.45875 0 0 0
-2689 1 -63.50875 6.75625 6.75625 0 0 0
-2690 1 -60.80625 9.45875 6.75625 0 0 0
-2691 1 -60.80625 6.75625 9.45875 0 0 0
-2692 1 -63.50875 9.45875 9.45875 0 0 0
-2693 1 -58.10375 6.75625 6.75625 0 0 0
-2694 1 -55.40125 9.45875 6.75625 0 0 0
-2695 1 -55.40125 6.75625 9.45875 0 0 0
-2696 1 -58.10375 9.45875 9.45875 0 0 0
-2697 1 -52.706238898 6.77753637938 6.76710503002 0 0 0
-2698 1 -49.8688597745 9.27912358033 6.70095740973 0 0 0
-2699 1 -49.9402962762 6.61995421102 9.36779177141 0 0 0
-2700 1 -52.5776795541 9.33283340826 9.47172624608 0 0 0
-2701 1 -47.1281822763 6.59932945285 6.57399833123 0 0 0
-2702 1 -44.3639511011 9.4686691244 6.81506468388 0 0 0
-2703 1 -44.6207754765 6.64471620138 9.34003435895 0 0 0
-2704 1 -47.197099686 9.28281499038 9.43711568033 0 0 0
-2705 1 -41.6455919393 6.59706525874 6.73555522814 0 0 0
-2706 1 -38.9690230659 9.30497728876 6.79752660852 0 0 0
-2707 1 -39.0765870523 6.77380432622 9.36646341788 0 0 0
-2708 1 -41.9792808781 9.26742052872 9.51261558701 0 0 0
-2709 1 -36.4140233279 6.75194285067 6.67059446276 0 0 0
-2710 1 -33.8203596994 9.40130897766 6.67454039012 0 0 0
-2711 1 -33.6235288666 6.87289894944 9.40642727985 0 0 0
-2712 1 -36.472933307 9.30128857846 9.25488381018 0 0 0
-2713 1 -31.1888005344 6.98114378157 6.55233113267 0 0 0
-2714 1 -28.3427207188 9.50599876029 6.72143075513 0 0 0
-2715 1 -28.4186467256 6.76482818192 9.29306564109 0 0 0
-2716 1 -31.1616954897 9.63320186675 9.23894516103 0 0 0
-2717 1 -25.6470642225 6.82630068784 6.61437102116 0 0 0
-2718 1 -23.0619560442 9.47970275597 6.48561184263 0 0 0
-2719 1 -23.0827722779 6.80879726207 9.34342237952 0 0 0
-2720 1 -25.8117969575 9.38584470564 9.30094986019 0 0 0
-2721 1 -20.4863797269 6.78399532274 6.62581578384 0 0 0
-2722 1 -17.7282257294 9.46330343671 6.45873075398 0 0 0
-2723 1 -17.7666587841 6.85552192337 9.22159587962 0 0 0
-2724 1 -20.5164207291 9.4794124892 9.2084844657 0 0 0
-2725 1 -15.0906294816 6.80970355979 6.7396309728 0 0 0
-2726 1 -12.1584705044 9.18639982575 6.39626492058 0 0 0
-2727 1 -12.2715268695 6.60810405002 9.31916254617 0 0 0
-2728 1 -14.8961705816 9.37546300661 9.19595823915 0 0 0
-2729 1 -9.46214149667 6.6628255885 6.54682575489 0 0 0
-2730 1 -6.80686449549 9.32937007319 6.76050586916 0 0 0
-2731 1 -6.91042958292 6.72297827727 9.3615484191 0 0 0
-2732 1 -9.54724706338 9.17663474083 9.43853738317 0 0 0
-2733 1 -4.17791289464 6.6857035774 6.77847490733 0 0 0
-2734 1 -1.55065345176 9.30472980449 6.67680189277 0 0 0
-2735 1 -1.53534728309 6.73070229091 9.49447702605 0 0 0
-2736 1 -4.24538249091 9.4797552277 9.49550150394 0 0 0
-2737 1 1.27532812611 6.64931243036 7.00991964915 0 0 0
-2738 1 3.99256875221 9.1357969259 6.84503021911 0 0 0
-2739 1 4.05844792932 6.5388424457 9.5274516914 0 0 0
-2740 1 1.27571395808 9.33459144718 9.40963541489 0 0 0
-2741 1 6.97610524872 6.75455755134 6.68992479989 0 0 0
-2742 1 9.46191873162 9.43501196385 6.83568578841 0 0 0
-2743 1 9.40866449115 6.69650137756 9.33025939972 0 0 0
-2744 1 6.58749578902 9.36265938698 9.47381047004 0 0 0
-2745 1 11.9723917877 6.67712176952 6.82193787404 0 0 0
-2746 1 14.7887767804 9.440056868 6.68202268225 0 0 0
-2747 1 14.6733878038 6.78895862072 9.53233529068 0 0 0
-2748 1 12.1564016549 9.48655696095 9.29223696336 0 0 0
-2749 1 17.4303280417 6.69666847548 6.90888534654 0 0 0
-2750 1 20.1405674529 9.4634864668 6.83806874497 0 0 0
-2751 1 20.2660954869 6.67285290266 9.41344559401 0 0 0
-2752 1 17.5530999686 9.45132978855 9.58150151208 0 0 0
-2753 1 22.9291263422 6.98691327646 6.52104873425 0 0 0
-2754 1 25.7525803451 9.72042886848 6.48961618825 0 0 0
-2755 1 25.5325475859 6.80951650322 9.2960674664 0 0 0
-2756 1 22.9923929297 9.43835693767 9.37529734911 0 0 0
-2757 1 28.3166615725 6.87065459919 6.67233210362 0 0 0
-2758 1 30.8809969757 9.45422147405 6.63468082343 0 0 0
-2759 1 30.9056942082 6.79305651646 9.23053189221 0 0 0
-2760 1 28.3021924799 9.81010265833 9.35606939375 0 0 0
-2761 1 33.6295908141 6.8986380404 6.93415700268 0 0 0
-2762 1 36.3598119096 9.5592903652 6.51374869607 0 0 0
-2763 1 36.3792764134 6.92378780862 9.39090783944 0 0 0
-2764 1 33.6719574826 9.44079548408 9.48281043535 0 0 0
-2765 1 39.34634605 6.85025740215 6.82115708318 0 0 0
-2766 1 41.973247539 9.53418361057 6.71839724829 0 0 0
-2767 1 42.1136110481 6.58987853545 9.60984353794 0 0 0
-2768 1 39.3555360938 9.59933249845 9.23855912562 0 0 0
-2769 1 44.6625302041 6.67400710314 6.70439577461 0 0 0
-2770 1 47.1986889956 9.56042474183 6.86133784812 0 0 0
-2771 1 47.3466213736 6.90026848764 9.47700816473 0 0 0
-2772 1 44.5293399422 9.49470864539 9.34548329136 0 0 0
-2773 1 50.0114058112 6.83816517937 6.76096661942 0 0 0
-2774 1 52.6241310207 9.57068754225 6.89699683035 0 0 0
-2775 1 52.6760848988 6.85853142111 9.44098244338 0 0 0
-2776 1 50.0034774651 9.51781490645 9.63356583747 0 0 0
-2777 1 55.40125 6.75625 6.75625 0 0 0
-2778 1 58.10375 9.45875 6.75625 0 0 0
-2779 1 58.10375 6.75625 9.45875 0 0 0
-2780 1 55.40125 9.45875 9.45875 0 0 0
-2781 1 60.80625 6.75625 6.75625 0 0 0
-2782 1 63.50875 9.45875 6.75625 0 0 0
-2783 1 63.50875 6.75625 9.45875 0 0 0
-2784 1 60.80625 9.45875 9.45875 0 0 0
-2785 1 -63.50875 12.16125 6.75625 0 0 0
-2786 1 -60.80625 14.86375 6.75625 0 0 0
-2787 1 -60.80625 12.16125 9.45875 0 0 0
-2788 1 -63.50875 14.86375 9.45875 0 0 0
-2789 1 -58.10375 12.16125 6.75625 0 0 0
-2790 1 -55.40125 14.86375 6.75625 0 0 0
-2791 1 -55.40125 12.16125 9.45875 0 0 0
-2792 1 -58.10375 14.86375 9.45875 0 0 0
-2793 1 -52.690605633 11.9267300627 6.66830523022 0 0 0
-2794 1 -50.1733279909 14.7070267168 6.73002385616 0 0 0
-2795 1 -50.1108366625 12.1583861602 9.39904672373 0 0 0
-2796 1 -52.6630786553 14.8020478878 9.37543818526 0 0 0
-2797 1 -47.2042089046 11.7941265233 6.85867823755 0 0 0
-2798 1 -44.6184764711 14.665964236 6.73550832541 0 0 0
-2799 1 -44.6318924532 12.0345988781 9.62606248584 0 0 0
-2800 1 -47.3335249302 14.8627240557 9.47504712209 0 0 0
-2801 1 -41.8136208116 11.9456262908 6.91799950923 0 0 0
-2802 1 -39.3074885787 15.0900837868 6.59877767537 0 0 0
-2803 1 -39.2180707087 12.0544329575 9.42517525387 0 0 0
-2804 1 -41.9306898014 14.8808537589 9.25901628246 0 0 0
-2805 1 -36.5464273581 12.1168452486 6.66560436466 0 0 0
-2806 1 -33.7508056569 15.044157725 6.5432036964 0 0 0
-2807 1 -33.8181300574 12.3705284324 9.22549946895 0 0 0
-2808 1 -36.6629461963 14.9793267523 9.4481223121 0 0 0
-2809 1 -31.2814437931 12.2773432437 6.69554782809 0 0 0
-2810 1 -28.2551464956 14.8043533868 6.65985843405 0 0 0
-2811 1 -28.5393952028 12.0208324271 9.36821673468 0 0 0
-2812 1 -31.019537089 14.8127519157 9.41177150448 0 0 0
-2813 1 -25.6404623782 12.1791803516 6.626816794 0 0 0
-2814 1 -23.057173464 14.8906649147 6.6197441442 0 0 0
-2815 1 -23.1842236929 12.1236167025 9.35422679328 0 0 0
-2816 1 -25.6330568092 14.7539705079 9.21968716756 0 0 0
-2817 1 -20.3154304759 12.3266800532 6.5819150198 0 0 0
-2818 1 -17.6220485958 14.8752323905 6.49471558675 0 0 0
-2819 1 -17.785825564 12.0962984631 9.24637749796 0 0 0
-2820 1 -20.4588871942 14.7181677504 9.36318909947 0 0 0
-2821 1 -14.806527417 12.1674653814 6.45808693376 0 0 0
-2822 1 -12.1489501476 14.8029501896 6.62142724764 0 0 0
-2823 1 -12.3044496505 12.1818938128 9.3258438889 0 0 0
-2824 1 -14.8788560289 14.7037821638 9.46446979736 0 0 0
-2825 1 -9.59472427728 12.0195596453 6.8270219419 0 0 0
-2826 1 -6.69287651662 14.8440945589 6.63710261165 0 0 0
-2827 1 -6.84060743142 12.2311010668 9.4006170218 0 0 0
-2828 1 -9.42652257929 14.8500372892 9.13822538473 0 0 0
-2829 1 -4.21800744272 12.0520459665 6.70850660261 0 0 0
-2830 1 -1.4439030807 14.8347351604 6.60904760367 0 0 0
-2831 1 -1.53625270806 12.0696255982 9.24876932219 0 0 0
-2832 1 -4.03120507371 14.7348764801 9.21797614697 0 0 0
-2833 1 1.11746388268 11.9611652251 6.82694581985 0 0 0
-2834 1 4.0035698849 14.8245758978 6.55116667132 0 0 0
-2835 1 3.85547144494 12.1632086519 9.21478137297 0 0 0
-2836 1 1.38751569291 14.9135653889 9.32680383779 0 0 0
-2837 1 6.84539190134 11.860622915 6.7113386232 0 0 0
-2838 1 9.35967028121 14.9041161708 6.59238691526 0 0 0
-2839 1 9.5119759984 12.1882821601 9.3933033347 0 0 0
-2840 1 6.66383474573 14.6719746216 9.35630075803 0 0 0
-2841 1 12.0931725197 12.1370822014 6.69082298005 0 0 0
-2842 1 14.9878049462 14.90043019 6.86551093997 0 0 0
-2843 1 14.9421181391 12.0391442736 9.48810111898 0 0 0
-2844 1 12.1660701673 14.8639562603 9.33909787722 0 0 0
-2845 1 17.5974826474 12.0820973765 6.58020716856 0 0 0
-2846 1 20.1930056235 14.7737329418 6.52675782413 0 0 0
-2847 1 20.1755716539 12.1671532767 9.4338334075 0 0 0
-2848 1 17.6633717129 14.8952102411 9.52654177602 0 0 0
-2849 1 22.9369743287 11.9676019129 6.66903814006 0 0 0
-2850 1 25.4766100802 14.8213604389 6.53503316397 0 0 0
-2851 1 25.5278947334 12.1692560982 9.26119461437 0 0 0
-2852 1 22.8744591139 14.8310950858 9.3186904057 0 0 0
-2853 1 28.1247295598 12.4418156071 6.64846512612 0 0 0
-2854 1 30.7630475128 14.8105540378 6.56491465646 0 0 0
-2855 1 31.040687786 12.2696302312 9.20747113197 0 0 0
-2856 1 28.1704833528 14.8643204755 9.51816789424 0 0 0
-2857 1 33.4629485806 12.0458640621 6.4799588643 0 0 0
-2858 1 36.5920199833 14.757851162 6.56970982326 0 0 0
-2859 1 36.449521371 12.1379986793 9.14818644369 0 0 0
-2860 1 33.5550225464 14.727407317 9.0991245817 0 0 0
-2861 1 39.0556790264 12.1715006218 6.53774881734 0 0 0
-2862 1 41.782965239 14.8633136032 6.60978442318 0 0 0
-2863 1 41.945458462 12.3018302728 9.29630869331 0 0 0
-2864 1 39.2804469269 14.9008271346 9.33799014983 0 0 0
-2865 1 44.6504570645 12.2309737673 6.59256789098 0 0 0
-2866 1 47.2785425513 14.8967123468 6.68667129612 0 0 0
-2867 1 47.2155826584 12.2348307073 9.27778547678 0 0 0
-2868 1 44.5562866373 15.0727297198 9.44727160713 0 0 0
-2869 1 49.970610667 12.2624597483 6.70574764608 0 0 0
-2870 1 52.6991681134 14.8531010398 6.72439272719 0 0 0
-2871 1 52.6747453052 12.2119254236 9.27058571069 0 0 0
-2872 1 50.0793048789 15.1199921601 9.20251377634 0 0 0
-2873 1 55.40125 12.16125 6.75625 0 0 0
-2874 1 58.10375 14.86375 6.75625 0 0 0
-2875 1 58.10375 12.16125 9.45875 0 0 0
-2876 1 55.40125 14.86375 9.45875 0 0 0
-2877 1 60.80625 12.16125 6.75625 0 0 0
-2878 1 63.50875 14.86375 6.75625 0 0 0
-2879 1 63.50875 12.16125 9.45875 0 0 0
-2880 1 60.80625 14.86375 9.45875 0 0 0
-2881 1 -63.50875 -14.86375 12.16125 0 0 0
-2882 1 -60.80625 -12.16125 12.16125 0 0 0
-2883 1 -60.80625 -14.86375 14.86375 0 0 0
-2884 1 -63.50875 -12.16125 14.86375 0 0 0
-2885 1 -58.10375 -14.86375 12.16125 0 0 0
-2886 1 -55.40125 -12.16125 12.16125 0 0 0
-2887 1 -55.40125 -14.86375 14.86375 0 0 0
-2888 1 -58.10375 -12.16125 14.86375 0 0 0
-2889 1 -52.755087149 -14.8341449838 12.2112324021 0 0 0
-2890 1 -50.1460636619 -12.2723316508 12.0457698481 0 0 0
-2891 1 -49.9229658563 -15.1629585008 14.9755040002 0 0 0
-2892 1 -52.6424334411 -12.1440285793 14.7638657378 0 0 0
-2893 1 -47.3727586496 -14.9879912067 12.1021992329 0 0 0
-2894 1 -44.5804831047 -12.0894900787 11.9572367169 0 0 0
-2895 1 -44.5308213424 -14.9389993998 14.7897150065 0 0 0
-2896 1 -47.3529959697 -12.1797409222 14.5412806683 0 0 0
-2897 1 -42.1437226173 -14.9257175901 12.0263078141 0 0 0
-2898 1 -39.286099939 -12.1800770255 12.1348147571 0 0 0
-2899 1 -39.3223280735 -14.8261313913 14.7743558966 0 0 0
-2900 1 -41.8797729486 -12.0811632107 14.8527361046 0 0 0
-2901 1 -36.6779466669 -14.5842169831 11.9966458432 0 0 0
-2902 1 -33.7693006546 -12.2478987771 11.797295209 0 0 0
-2903 1 -33.9995969894 -14.8226401813 14.5794666805 0 0 0
-2904 1 -36.6636827533 -12.0890377845 14.736345663 0 0 0
-2905 1 -31.078601806 -14.8013863646 11.7957151581 0 0 0
-2906 1 -28.4904646646 -12.3677875052 11.9053576353 0 0 0
-2907 1 -28.4500833657 -14.876614226 14.7524180627 0 0 0
-2908 1 -31.0765141566 -12.3831315371 14.5006098356 0 0 0
-2909 1 -25.8191598375 -14.9985358496 11.9507160204 0 0 0
-2910 1 -22.9384774288 -12.0867146944 12.1514093369 0 0 0
-2911 1 -23.1600771982 -14.847570699 14.7062991038 0 0 0
-2912 1 -25.8844551891 -12.3456839352 14.6945183569 0 0 0
-2913 1 -20.6050831057 -15.0491353579 12.0619576639 0 0 0
-2914 1 -17.4917831579 -12.2380620329 11.9739938211 0 0 0
-2915 1 -17.674211068 -14.7499266724 14.6779432083 0 0 0
-2916 1 -20.4356661783 -11.9354771189 14.7765139565 0 0 0
-2917 1 -14.856735743 -14.8302596684 11.7687854565 0 0 0
-2918 1 -12.2470632786 -12.1699598582 11.9919773911 0 0 0
-2919 1 -12.1534458706 -14.9186651227 14.7646458568 0 0 0
-2920 1 -14.7459717935 -12.1439005061 14.8126311431 0 0 0
-2921 1 -9.42983169644 -15.0026472073 12.1567295435 0 0 0
-2922 1 -6.73789416537 -12.2865591265 12.036026539 0 0 0
-2923 1 -6.72728408458 -14.8567126694 14.7327730279 0 0 0
-2924 1 -9.43932196856 -12.3534285147 14.6232166697 0 0 0
-2925 1 -4.16976333497 -14.8607933512 11.9015191514 0 0 0
-2926 1 -1.26828001725 -12.1927344109 12.1762687255 0 0 0
-2927 1 -1.49345140027 -15.0184158715 14.5116437342 0 0 0
-2928 1 -4.0009219675 -12.0639088354 14.8875686843 0 0 0
-2929 1 1.35960091255 -15.0474268999 12.2609381609 0 0 0
-2930 1 3.91606848412 -12.2828710498 12.2098087846 0 0 0
-2931 1 4.15177984564 -15.1147552976 14.9435157285 0 0 0
-2932 1 1.32693427927 -12.2674093289 14.9004499063 0 0 0
-2933 1 6.67128536065 -14.8796609377 12.1641069578 0 0 0
-2934 1 9.38568814326 -12.0922102994 12.0305301618 0 0 0
-2935 1 9.45635831428 -14.8063423701 14.8324898964 0 0 0
-2936 1 6.7218530686 -12.1087081514 14.7293347902 0 0 0
-2937 1 12.139712843 -14.8589162521 12.1356491551 0 0 0
-2938 1 15.0535744746 -12.154463936 12.0153868917 0 0 0
-2939 1 14.8631780007 -14.8758270171 14.686907743 0 0 0
-2940 1 12.4219990999 -12.1580180768 14.8107718257 0 0 0
-2941 1 17.7952294206 -14.7973429793 11.9201522785 0 0 0
-2942 1 20.4080843887 -12.0250460778 11.9320135814 0 0 0
-2943 1 20.5356934587 -14.8942771105 14.6932570013 0 0 0
-2944 1 17.7215243951 -12.159788282 14.7616488489 0 0 0
-2945 1 23.0844809207 -14.868342965 12.1781905399 0 0 0
-2946 1 25.4844828 -11.9946793179 11.9193104028 0 0 0
-2947 1 25.5164983343 -14.7120114512 14.6925049464 0 0 0
-2948 1 22.820445304 -12.1374815645 14.9023315091 0 0 0
-2949 1 28.2285936621 -15.0607774842 12.1756709456 0 0 0
-2950 1 30.9948236249 -12.4204247864 11.905179057 0 0 0
-2951 1 31.0536035977 -15.0506822889 14.7351136581 0 0 0
-2952 1 28.262729645 -12.2008808957 14.781382994 0 0 0
-2953 1 33.7690702364 -15.088444393 11.8953166221 0 0 0
-2954 1 36.3637271439 -12.3967027727 11.9512445666 0 0 0
-2955 1 36.4279555137 -15.2576479692 14.5977060608 0 0 0
-2956 1 33.8028583798 -12.4314078497 14.6579973449 0 0 0
-2957 1 39.0937702623 -14.9081389862 12.047378118 0 0 0
-2958 1 41.9038131357 -12.1170802627 12.0579638458 0 0 0
-2959 1 41.8340759375 -14.7911632437 14.9136371967 0 0 0
-2960 1 39.0174501237 -12.2572494206 14.4464924874 0 0 0
-2961 1 44.5369093383 -14.6965668996 12.1125462144 0 0 0
-2962 1 47.3638567137 -12.0994160746 11.9807959838 0 0 0
-2963 1 47.4241485445 -14.8245237428 14.6378399692 0 0 0
-2964 1 44.3906202145 -11.977732469 14.6077478555 0 0 0
-2965 1 50.1296014046 -14.8931793164 12.0906985924 0 0 0
-2966 1 52.6725095653 -12.3220796428 12.2120897921 0 0 0
-2967 1 52.8250179943 -15.082917124 14.7914823503 0 0 0
-2968 1 50.2043342455 -12.2615129929 14.824647339 0 0 0
-2969 1 55.40125 -14.86375 12.16125 0 0 0
-2970 1 58.10375 -12.16125 12.16125 0 0 0
-2971 1 58.10375 -14.86375 14.86375 0 0 0
-2972 1 55.40125 -12.16125 14.86375 0 0 0
-2973 1 60.80625 -14.86375 12.16125 0 0 0
-2974 1 63.50875 -12.16125 12.16125 0 0 0
-2975 1 63.50875 -14.86375 14.86375 0 0 0
-2976 1 60.80625 -12.16125 14.86375 0 0 0
-2977 1 -63.50875 -9.45875 12.16125 0 0 0
-2978 1 -60.80625 -6.75625 12.16125 0 0 0
-2979 1 -60.80625 -9.45875 14.86375 0 0 0
-2980 1 -63.50875 -6.75625 14.86375 0 0 0
-2981 1 -58.10375 -9.45875 12.16125 0 0 0
-2982 1 -55.40125 -6.75625 12.16125 0 0 0
-2983 1 -55.40125 -9.45875 14.86375 0 0 0
-2984 1 -58.10375 -6.75625 14.86375 0 0 0
-2985 1 -52.7105675696 -9.407690514 12.1515866894 0 0 0
-2986 1 -50.0840308975 -6.69939743968 11.9159944573 0 0 0
-2987 1 -50.0269514445 -9.61484035986 14.7143635118 0 0 0
-2988 1 -52.713671175 -6.83330440237 14.8017772932 0 0 0
-2989 1 -47.4352740771 -9.57453056569 12.0948121676 0 0 0
-2990 1 -44.616306611 -6.75608236438 12.0703603774 0 0 0
-2991 1 -44.7028356807 -9.40579663829 14.5765342106 0 0 0
-2992 1 -47.3760887537 -6.9566160783 14.6815342516 0 0 0
-2993 1 -41.9567593312 -9.38391366146 12.0109813036 0 0 0
-2994 1 -39.1102266797 -6.76592139886 11.9931191498 0 0 0
-2995 1 -39.2700499468 -9.23235120091 14.8876036844 0 0 0
-2996 1 -41.8536188316 -6.64367687971 14.8262126419 0 0 0
-2997 1 -36.4154421045 -9.48261725883 11.9046793557 0 0 0
-2998 1 -33.791862907 -6.9342901994 12.0844822651 0 0 0
-2999 1 -33.7493001766 -9.66379923586 14.7168354453 0 0 0
-3000 1 -36.4707471511 -7.12608618343 14.7252050546 0 0 0
-3001 1 -31.0827281457 -9.42358032315 11.9808296428 0 0 0
-3002 1 -28.3759952102 -6.90671059642 12.02042474 0 0 0
-3003 1 -28.3583759554 -9.66894158307 14.751616196 0 0 0
-3004 1 -31.2768623693 -6.89721630553 14.7918930442 0 0 0
-3005 1 -25.8673814307 -9.5923510593 12.1746260553 0 0 0
-3006 1 -23.2024928509 -6.91017999694 12.1725584342 0 0 0
-3007 1 -23.186115322 -9.40212102104 14.6796170435 0 0 0
-3008 1 -25.8346927532 -6.87708237837 14.7494898334 0 0 0
-3009 1 -20.3511560464 -9.60340908775 12.1037367302 0 0 0
-3010 1 -17.7662210155 -6.97707412111 12.1012597998 0 0 0
-3011 1 -17.5786024379 -9.57468356944 14.6801396344 0 0 0
-3012 1 -20.4879097428 -6.91587053321 14.6525772635 0 0 0
-3013 1 -14.6968285164 -9.57599359513 11.9079016024 0 0 0
-3014 1 -11.9907379422 -6.84675701822 11.9377087569 0 0 0
-3015 1 -12.1585137556 -9.45940711026 14.700588156 0 0 0
-3016 1 -14.8609023532 -7.14224428271 14.5638108164 0 0 0
-3017 1 -9.42181390111 -9.44526898808 11.9746782661 0 0 0
-3018 1 -6.65342970317 -6.70882010481 12.0874219427 0 0 0
-3019 1 -6.90045317358 -9.34829310835 14.6095724788 0 0 0
-3020 1 -9.49239645053 -6.70114325482 14.7853925638 0 0 0
-3021 1 -4.20292272137 -9.5308036191 12.1424700003 0 0 0
-3022 1 -1.51858168642 -6.83963314761 12.0070165976 0 0 0
-3023 1 -1.40552549436 -9.55240299446 14.8634035911 0 0 0
-3024 1 -4.14659286544 -6.79077875229 14.7414479196 0 0 0
-3025 1 1.3731941684 -9.46069355261 12.0390109 0 0 0
-3026 1 4.01303599281 -6.95948290686 12.0553217103 0 0 0
-3027 1 4.14677297745 -9.5339519501 14.9091481115 0 0 0
-3028 1 1.4252102753 -6.64875852421 14.7291674754 0 0 0
-3029 1 6.63980353888 -9.37257637458 12.0704208054 0 0 0
-3030 1 9.52159209641 -6.81763589442 12.1567576428 0 0 0
-3031 1 9.56950965317 -9.55109206789 14.8868673702 0 0 0
-3032 1 6.71440783315 -6.87762595536 14.8323648651 0 0 0
-3033 1 12.0769337897 -9.49486588759 12.0834286568 0 0 0
-3034 1 15.0664307784 -6.73523839337 12.1431692641 0 0 0
-3035 1 15.065503762 -9.53524218155 14.6840469358 0 0 0
-3036 1 12.027442677 -6.96807206607 14.7171121105 0 0 0
-3037 1 17.727704539 -9.48135508719 11.9738889947 0 0 0
-3038 1 20.125160402 -6.63639058537 11.8409696587 0 0 0
-3039 1 20.3968426021 -9.32457029101 14.8378395515 0 0 0
-3040 1 17.6302103545 -6.74158910978 14.7162756074 0 0 0
-3041 1 22.8458153118 -9.31258418374 11.9720807896 0 0 0
-3042 1 25.6506757376 -6.72771647148 12.0511433157 0 0 0
-3043 1 25.6694675781 -9.53323810483 14.7768349024 0 0 0
-3044 1 22.8019767459 -6.60655196642 14.8022069366 0 0 0
-3045 1 28.3136526936 -9.62852620812 11.7700104267 0 0 0
-3046 1 30.8700205939 -7.00458077027 11.8014581366 0 0 0
-3047 1 31.1719299803 -9.68212946777 14.3791741915 0 0 0
-3048 1 28.3237779989 -6.82965910783 14.6841884118 0 0 0
-3049 1 33.8955540638 -9.6094757499 11.8577467723 0 0 0
-3050 1 36.4673140145 -6.75854234768 11.99555812 0 0 0
-3051 1 36.5406456888 -9.36822554985 14.6366459264 0 0 0
-3052 1 33.8472282676 -6.72281497436 14.3756790073 0 0 0
-3053 1 39.094473191 -9.33817517408 12.0513123062 0 0 0
-3054 1 41.7856896425 -6.77146453319 11.8894698594 0 0 0
-3055 1 41.6827088459 -9.53215099912 14.6754276003 0 0 0
-3056 1 39.1760309733 -6.65785749716 14.8982537501 0 0 0
-3057 1 44.4163327316 -9.50235797009 11.9832053715 0 0 0
-3058 1 47.1898937685 -6.89355357319 12.1530589046 0 0 0
-3059 1 47.4722356696 -9.5117048027 14.9639085251 0 0 0
-3060 1 44.7425413573 -7.01298594135 14.6825161447 0 0 0
-3061 1 50.0437745901 -9.51764842263 12.0674067616 0 0 0
-3062 1 52.7485344563 -6.8840747019 12.0724034597 0 0 0
-3063 1 52.7585971137 -9.4922869161 15.0111866982 0 0 0
-3064 1 50.0263095825 -6.8329543645 14.7617921769 0 0 0
-3065 1 55.40125 -9.45875 12.16125 0 0 0
-3066 1 58.10375 -6.75625 12.16125 0 0 0
-3067 1 58.10375 -9.45875 14.86375 0 0 0
-3068 1 55.40125 -6.75625 14.86375 0 0 0
-3069 1 60.80625 -9.45875 12.16125 0 0 0
-3070 1 63.50875 -6.75625 12.16125 0 0 0
-3071 1 63.50875 -9.45875 14.86375 0 0 0
-3072 1 60.80625 -6.75625 14.86375 0 0 0
-3073 1 -63.50875 -4.05375 12.16125 0 0 0
-3074 1 -60.80625 -1.35125 12.16125 0 0 0
-3075 1 -60.80625 -4.05375 14.86375 0 0 0
-3076 1 -63.50875 -1.35125 14.86375 0 0 0
-3077 1 -58.10375 -4.05375 12.16125 0 0 0
-3078 1 -55.40125 -1.35125 12.16125 0 0 0
-3079 1 -55.40125 -4.05375 14.86375 0 0 0
-3080 1 -58.10375 -1.35125 14.86375 0 0 0
-3081 1 -52.765206602 -4.08138186916 12.3453637457 0 0 0
-3082 1 -50.1011626264 -1.1482084682 11.9777740527 0 0 0
-3083 1 -49.8155216474 -3.98704225682 14.558168322 0 0 0
-3084 1 -52.8587390059 -1.20720194098 14.6188075867 0 0 0
-3085 1 -47.3476343627 -3.808120494 11.9546413206 0 0 0
-3086 1 -44.3998634166 -1.39827479188 12.0171665872 0 0 0
-3087 1 -44.5630749046 -3.94382285004 14.7400188199 0 0 0
-3088 1 -47.2841712386 -1.30484631841 14.5178619344 0 0 0
-3089 1 -41.7676048685 -4.21855822808 11.9343486531 0 0 0
-3090 1 -38.8919714199 -1.49959177541 11.9979722179 0 0 0
-3091 1 -39.2767966679 -4.00666921164 14.9205918501 0 0 0
-3092 1 -41.6980501289 -1.50203072606 14.9181284554 0 0 0
-3093 1 -36.3460997712 -4.3638575144 12.0041293035 0 0 0
-3094 1 -33.8339001518 -1.72550540836 12.0969387929 0 0 0
-3095 1 -34.183796038 -4.38695000107 14.8060832951 0 0 0
-3096 1 -36.5990236922 -1.39801837578 14.7334169278 0 0 0
-3097 1 -31.1788053106 -4.21103248213 12.0388490081 0 0 0
-3098 1 -28.4110706128 -1.43103872474 12.0304607289 0 0 0
-3099 1 -28.5182137975 -4.14972181923 14.8744757098 0 0 0
-3100 1 -31.22180354 -1.63170840831 14.6176038405 0 0 0
-3101 1 -25.8107880487 -4.16719116949 11.9704473602 0 0 0
-3102 1 -23.25418104 -1.46490487944 12.0266786671 0 0 0
-3103 1 -23.3072158118 -4.26504169952 14.6083597318 0 0 0
-3104 1 -25.7696954535 -1.53154448469 14.7906638727 0 0 0
-3105 1 -20.3782000005 -4.33697957025 12.0540678991 0 0 0
-3106 1 -17.6876874151 -1.57616477025 12.1403919975 0 0 0
-3107 1 -17.7340355819 -4.38167363137 14.8069745357 0 0 0
-3108 1 -20.5101615861 -1.55978302055 14.7704205061 0 0 0
-3109 1 -15.0080648652 -4.18992609112 12.1567647719 0 0 0
-3110 1 -12.0582976223 -1.5338847546 12.1582628833 0 0 0
-3111 1 -12.2447321429 -4.13887286509 14.8665520446 0 0 0
-3112 1 -15.010003177 -1.47359032341 14.7367357851 0 0 0
-3113 1 -9.39762202501 -4.1307351553 12.1364494274 0 0 0
-3114 1 -6.87003591793 -1.17802438707 12.0724232451 0 0 0
-3115 1 -6.78984757956 -4.1917527088 14.8483988022 0 0 0
-3116 1 -9.48361061067 -1.47493367406 14.9031107663 0 0 0
-3117 1 -4.26667125331 -3.96205041313 12.0452779343 0 0 0
-3118 1 -1.40715471873 -1.41985957854 12.1797733856 0 0 0
-3119 1 -1.22180282566 -4.05291850039 14.6397748737 0 0 0
-3120 1 -3.91331870288 -1.19621656275 14.8269457594 0 0 0
-3121 1 1.3609005662 -4.27607860938 11.8241947944 0 0 0
-3122 1 4.14256127039 -1.38199820478 11.9903204126 0 0 0
-3123 1 4.15557822657 -4.2358352749 14.8093660218 0 0 0
-3124 1 1.36075678317 -1.31096262073 14.5181250255 0 0 0
-3125 1 6.6990018017 -4.19860743636 12.117018768 0 0 0
-3126 1 9.371814088 -1.43646510575 12.1269428924 0 0 0
-3127 1 9.56774481285 -4.15704769589 14.8874898036 0 0 0
-3128 1 6.81166876098 -1.59240335005 14.8595282705 0 0 0
-3129 1 12.0902875256 -4.10334686112 12.1438808614 0 0 0
-3130 1 14.6634513657 -1.38362641973 11.9325524191 0 0 0
-3131 1 14.7742998908 -4.18603315096 14.8376057431 0 0 0
-3132 1 12.2517146636 -1.381801428 14.7806014116 0 0 0
-3133 1 17.5623172359 -3.97838781804 12.0254276177 0 0 0
-3134 1 20.3989185183 -1.49646216871 12.1789882753 0 0 0
-3135 1 20.1756038541 -4.11035928979 14.7355637029 0 0 0
-3136 1 17.3968572303 -1.36331118012 14.6032780049 0 0 0
-3137 1 23.0540367233 -4.17091194886 12.0555140562 0 0 0
-3138 1 25.7513348673 -1.41092227247 12.1393645105 0 0 0
-3139 1 25.752792126 -4.05355659459 14.7313251026 0 0 0
-3140 1 23.0532228882 -1.15725548241 14.6710343286 0 0 0
-3141 1 28.2704218936 -4.19523484581 11.7946930346 0 0 0
-3142 1 30.9167908411 -1.15278538465 11.974795241 0 0 0
-3143 1 30.79982106 -4.11328119308 14.3497586736 0 0 0
-3144 1 28.387446248 -1.41764367866 14.6278998775 0 0 0
-3145 1 33.7579535652 -3.86445149876 12.0273583659 0 0 0
-3146 1 36.4022437253 -1.1413056187 12.0345858479 0 0 0
-3147 1 36.239168524 -3.99043709822 14.7337578123 0 0 0
-3148 1 33.339786336 -1.13996880607 14.8972848318 0 0 0
-3149 1 39.0409033912 -4.12549115128 12.0428478812 0 0 0
-3150 1 41.9936655568 -1.60046124321 12.1492820692 0 0 0
-3151 1 42.0964830004 -4.2658997226 14.8826688388 0 0 0
-3152 1 39.0762096084 -1.48240898531 14.5566222293 0 0 0
-3153 1 44.549331403 -4.19208823108 11.828897122 0 0 0
-3154 1 47.1719351558 -1.5791122865 12.2683074922 0 0 0
-3155 1 47.3143703594 -4.31845476027 14.8095404361 0 0 0
-3156 1 44.5888162731 -1.44810088631 15.1851898592 0 0 0
-3157 1 49.7871424201 -4.14693955002 11.9499032896 0 0 0
-3158 1 52.6797383194 -1.34086476831 12.367107353 0 0 0
-3159 1 52.7512579373 -4.19590481162 14.882697553 0 0 0
-3160 1 50.1420269141 -1.50285675251 14.8930981979 0 0 0
-3161 1 55.40125 -4.05375 12.16125 0 0 0
-3162 1 58.10375 -1.35125 12.16125 0 0 0
-3163 1 58.10375 -4.05375 14.86375 0 0 0
-3164 1 55.40125 -1.35125 14.86375 0 0 0
-3165 1 60.80625 -4.05375 12.16125 0 0 0
-3166 1 63.50875 -1.35125 12.16125 0 0 0
-3167 1 63.50875 -4.05375 14.86375 0 0 0
-3168 1 60.80625 -1.35125 14.86375 0 0 0
-3169 1 -63.50875 1.35125 12.16125 0 0 0
-3170 1 -60.80625 4.05375 12.16125 0 0 0
-3171 1 -60.80625 1.35125 14.86375 0 0 0
-3172 1 -63.50875 4.05375 14.86375 0 0 0
-3173 1 -58.10375 1.35125 12.16125 0 0 0
-3174 1 -55.40125 4.05375 12.16125 0 0 0
-3175 1 -55.40125 1.35125 14.86375 0 0 0
-3176 1 -58.10375 4.05375 14.86375 0 0 0
-3177 1 -52.8019156685 1.33343949254 11.954447983 0 0 0
-3178 1 -50.0091972853 3.96958564836 12.1009302933 0 0 0
-3179 1 -49.8933726551 1.21214561911 14.8245480889 0 0 0
-3180 1 -52.6986582148 3.87369833601 14.7898825169 0 0 0
-3181 1 -47.2821125713 1.31412103962 11.9914388352 0 0 0
-3182 1 -44.3580229782 4.07858300714 11.9581166892 0 0 0
-3183 1 -44.5030058135 1.28549722098 14.5404953574 0 0 0
-3184 1 -47.1419252998 3.92441359864 14.7739450089 0 0 0
-3185 1 -41.6729409046 1.29219647503 11.9855799534 0 0 0
-3186 1 -38.8230654373 4.12346933238 11.9715476962 0 0 0
-3187 1 -38.905118224 1.49983406959 14.5179232449 0 0 0
-3188 1 -41.8375098433 3.87630655217 14.7476263615 0 0 0
-3189 1 -36.1881818214 1.37100210472 12.0579190607 0 0 0
-3190 1 -33.6580766796 4.16557755558 11.8945466195 0 0 0
-3191 1 -33.6734665802 1.29860717991 14.7206017046 0 0 0
-3192 1 -36.2361199639 4.10707530024 14.7465605929 0 0 0
-3193 1 -31.2565222978 1.35223730335 11.7958618361 0 0 0
-3194 1 -28.6389416597 4.08379835808 12.0282322761 0 0 0
-3195 1 -28.2989897259 1.16581803878 14.659953485 0 0 0
-3196 1 -31.0326465534 4.03144348837 14.7483209772 0 0 0
-3197 1 -25.9118633384 1.1756082207 11.8997413672 0 0 0
-3198 1 -23.0670458323 3.98169317275 12.0986758424 0 0 0
-3199 1 -23.1219503767 1.39722329561 14.737137628 0 0 0
-3200 1 -25.7463099364 3.89050754014 14.8294750763 0 0 0
-3201 1 -20.2856635275 1.13440167515 12.2427456914 0 0 0
-3202 1 -17.7009760955 3.9674339583 12.0996330712 0 0 0
-3203 1 -17.6378184079 1.1542068998 14.8778440011 0 0 0
-3204 1 -20.3044633379 3.93254339108 14.5227216502 0 0 0
-3205 1 -14.8344793023 1.2713961017 12.1759590618 0 0 0
-3206 1 -12.266805112 4.16481308089 12.1823077319 0 0 0
-3207 1 -11.9818387801 1.39854935079 14.9023008379 0 0 0
-3208 1 -14.7889368389 3.95543626984 14.88589957 0 0 0
-3209 1 -9.59459561922 1.42126391378 12.0404260257 0 0 0
-3210 1 -6.89130981754 4.1742992161 11.9662424027 0 0 0
-3211 1 -6.82556080123 1.28193028829 14.8439992532 0 0 0
-3212 1 -9.3872058089 4.08440624821 14.7957235708 0 0 0
-3213 1 -4.09763426779 1.24839568963 12.0054235792 0 0 0
-3214 1 -1.30033581063 4.11923266857 12.0589682566 0 0 0
-3215 1 -1.30553824444 1.4594753319 14.6918068588 0 0 0
-3216 1 -4.15422302382 3.98100286156 14.5266359544 0 0 0
-3217 1 1.39814820175 1.50401441231 12.2391943968 0 0 0
-3218 1 4.07202873772 4.06182568909 12.2411149429 0 0 0
-3219 1 4.1701894243 1.13915541914 14.8522901756 0 0 0
-3220 1 1.46650550807 4.21842278629 14.7765100874 0 0 0
-3221 1 6.73492092195 1.33483444389 12.0325481381 0 0 0
-3222 1 9.32405569642 4.06368330656 12.0540351705 0 0 0
-3223 1 9.59672559417 1.20745326173 14.7219702942 0 0 0
-3224 1 6.75316312491 3.72872030979 14.8726892118 0 0 0
-3225 1 12.1123353991 1.26790112275 12.0558584731 0 0 0
-3226 1 14.8152915099 3.98728720912 12.2562913645 0 0 0
-3227 1 14.739352777 1.34785550123 14.7313522341 0 0 0
-3228 1 11.8523900732 4.04294066421 14.7383897273 0 0 0
-3229 1 17.4181747581 1.38163895715 12.0323577167 0 0 0
-3230 1 20.3501024646 3.89494486476 12.0420639739 0 0 0
-3231 1 20.3206948778 1.29890217662 14.8263167826 0 0 0
-3232 1 17.6407032224 4.04015225103 14.8358284384 0 0 0
-3233 1 23.0451120064 1.21182470736 11.8398653336 0 0 0
-3234 1 25.4891020126 4.06150292379 12.0476670396 0 0 0
-3235 1 25.8089920246 1.42206817261 14.6339514033 0 0 0
-3236 1 22.9682470715 4.03664348059 14.8062441471 0 0 0
-3237 1 28.3063723618 1.38139149615 11.9742719245 0 0 0
-3238 1 30.9194215808 4.18097593653 11.8209877639 0 0 0
-3239 1 30.8258960821 1.63460044121 14.7295179623 0 0 0
-3240 1 28.1597831614 4.23011580343 14.6303645126 0 0 0
-3241 1 33.4371980724 1.4578112144 11.9906176526 0 0 0
-3242 1 36.4494235682 4.0181268246 12.1322269055 0 0 0
-3243 1 36.3091513401 1.4419868187 14.7237390839 0 0 0
-3244 1 33.746028702 4.053540687 14.6640427243 0 0 0
-3245 1 39.2189472496 1.41222059147 11.9358404411 0 0 0
-3246 1 41.8988910231 3.89799227556 12.2391793176 0 0 0
-3247 1 42.1168459206 1.19401578359 14.866432007 0 0 0
-3248 1 39.3429893311 3.98545622907 14.6789710178 0 0 0
-3249 1 44.6152914411 1.06711617073 12.0741354824 0 0 0
-3250 1 47.2611268875 4.00602694168 12.1872128902 0 0 0
-3251 1 47.2641746832 1.23701358386 15.0459850518 0 0 0
-3252 1 44.6293150256 3.99074009025 14.7265460611 0 0 0
-3253 1 49.9320223643 1.40972083899 12.264735894 0 0 0
-3254 1 52.6439649522 4.07951797804 12.1529154343 0 0 0
-3255 1 52.7361455278 1.55718477397 14.8096941494 0 0 0
-3256 1 49.9605030519 4.16571682793 14.6891843432 0 0 0
-3257 1 55.40125 1.35125 12.16125 0 0 0
-3258 1 58.10375 4.05375 12.16125 0 0 0
-3259 1 58.10375 1.35125 14.86375 0 0 0
-3260 1 55.40125 4.05375 14.86375 0 0 0
-3261 1 60.80625 1.35125 12.16125 0 0 0
-3262 1 63.50875 4.05375 12.16125 0 0 0
-3263 1 63.50875 1.35125 14.86375 0 0 0
-3264 1 60.80625 4.05375 14.86375 0 0 0
-3265 1 -63.50875 6.75625 12.16125 0 0 0
-3266 1 -60.80625 9.45875 12.16125 0 0 0
-3267 1 -60.80625 6.75625 14.86375 0 0 0
-3268 1 -63.50875 9.45875 14.86375 0 0 0
-3269 1 -58.10375 6.75625 12.16125 0 0 0
-3270 1 -55.40125 9.45875 12.16125 0 0 0
-3271 1 -55.40125 6.75625 14.86375 0 0 0
-3272 1 -58.10375 9.45875 14.86375 0 0 0
-3273 1 -52.8334177903 6.80383357421 12.1239594061 0 0 0
-3274 1 -49.8277810704 9.45481265453 12.0285236328 0 0 0
-3275 1 -49.8714207245 6.74487270812 14.6444423393 0 0 0
-3276 1 -52.6071032659 9.2428223329 14.6905206139 0 0 0
-3277 1 -47.1920960763 6.69625166251 12.1066765958 0 0 0
-3278 1 -44.53014259 9.27322466742 12.0321217245 0 0 0
-3279 1 -44.5173243304 6.73471417507 14.6668689935 0 0 0
-3280 1 -47.3153758695 9.39320173961 14.7009816114 0 0 0
-3281 1 -41.8343299426 6.53803583688 12.0091601343 0 0 0
-3282 1 -39.3035160141 9.36394405465 12.0897310478 0 0 0
-3283 1 -39.0906618253 6.79494891165 14.7103762046 0 0 0
-3284 1 -41.9372221377 9.26747376278 14.6891984847 0 0 0
-3285 1 -36.451911222 6.8324340805 12.0310108596 0 0 0
-3286 1 -33.9471674442 9.60423546021 11.9559761635 0 0 0
-3287 1 -33.8312360121 6.7994855321 14.7329618258 0 0 0
-3288 1 -36.4773363769 9.52605616358 14.876161406 0 0 0
-3289 1 -31.1128523738 6.90222156393 12.0669619438 0 0 0
-3290 1 -28.4647027337 9.4223236453 11.8803926826 0 0 0
-3291 1 -28.409476449 6.72367366182 14.6266285789 0 0 0
-3292 1 -31.2730738117 9.53501156356 14.6284582126 0 0 0
-3293 1 -25.7961540975 6.71715283679 11.9993970946 0 0 0
-3294 1 -23.2543498794 9.39677114146 12.1844178178 0 0 0
-3295 1 -22.9980236714 6.76232078346 14.7904023766 0 0 0
-3296 1 -25.855919836 9.56217577445 14.6504485463 0 0 0
-3297 1 -20.6016060418 6.90153934237 11.9206577563 0 0 0
-3298 1 -17.8163716636 9.38426531098 12.0172949422 0 0 0
-3299 1 -17.6261649919 6.72504166 14.8183988001 0 0 0
-3300 1 -20.4513737044 9.25222865673 14.8573430761 0 0 0
-3301 1 -15.1221618031 6.78201373442 12.1799240902 0 0 0
-3302 1 -12.2249142986 9.52034187639 11.9695753299 0 0 0
-3303 1 -12.3119974636 6.85892298104 14.6429264673 0 0 0
-3304 1 -15.0686711411 9.49711863192 14.7122309966 0 0 0
-3305 1 -9.51906000905 6.67599553029 12.2684968234 0 0 0
-3306 1 -7.12466286085 9.46514982379 12.1862915146 0 0 0
-3307 1 -6.83476884576 6.73545575408 14.8707591112 0 0 0
-3308 1 -9.71253246318 9.54723471926 15.0137620623 0 0 0
-3309 1 -4.26662609908 6.75598329676 12.1036320773 0 0 0
-3310 1 -1.30163514481 9.46636098481 12.0365534798 0 0 0
-3311 1 -1.36466397212 6.72010689235 14.6699072911 0 0 0
-3312 1 -3.89909785028 9.54842471751 14.6490360457 0 0 0
-3313 1 1.28768870398 6.70752340003 12.0625759331 0 0 0
-3314 1 3.98760215791 9.42448223617 12.017912463 0 0 0
-3315 1 4.16204041042 6.90215610721 14.7684250376 0 0 0
-3316 1 1.27134834298 9.3813237867 14.6613571421 0 0 0
-3317 1 6.69232021383 6.64358426117 12.2410698173 0 0 0
-3318 1 9.29116285416 9.31528478706 11.9248874116 0 0 0
-3319 1 9.29666773904 6.74372841471 14.6768595741 0 0 0
-3320 1 6.75689263191 9.60984594317 14.7538575194 0 0 0
-3321 1 11.9544768094 6.80212549826 12.0311220133 0 0 0
-3322 1 14.8790037622 9.41912137968 12.0899275817 0 0 0
-3323 1 14.6926334515 6.80026890587 14.7230231169 0 0 0
-3324 1 12.1210352979 9.25015261619 14.8529102847 0 0 0
-3325 1 17.552605394 6.75955624234 12.1560433492 0 0 0
-3326 1 20.2941626558 9.53113059749 12.2474421872 0 0 0
-3327 1 20.1462486252 6.78283287535 14.8162493053 0 0 0
-3328 1 17.5087247171 9.46667074045 14.879885398 0 0 0
-3329 1 22.8314838567 6.82630223559 12.1565588519 0 0 0
-3330 1 25.7767689689 9.55126969708 11.8505042596 0 0 0
-3331 1 25.6104863327 6.97855478791 14.7518943531 0 0 0
-3332 1 23.0054499371 9.45769725202 14.6621142631 0 0 0
-3333 1 28.231330942 6.80334453575 11.9085205404 0 0 0
-3334 1 31.0152786625 9.65857104264 11.9568695774 0 0 0
-3335 1 30.7810678532 6.86542971963 14.6411395069 0 0 0
-3336 1 28.2043363599 9.4949393088 14.8102033335 0 0 0
-3337 1 33.7170430754 6.66712813335 11.9762271988 0 0 0
-3338 1 36.5588857611 9.33039272806 12.0575182906 0 0 0
-3339 1 36.7166358665 6.65941635655 14.5722145056 0 0 0
-3340 1 33.8262947217 9.31787819439 14.7350152298 0 0 0
-3341 1 39.3633777638 6.85420951963 12.0390478939 0 0 0
-3342 1 41.9180552182 9.56099524755 12.019877172 0 0 0
-3343 1 41.876185498 6.89840017124 14.7214774587 0 0 0
-3344 1 39.3114679182 9.35509181609 14.7157951846 0 0 0
-3345 1 44.7510390145 6.67299631083 12.268813279 0 0 0
-3346 1 47.3305062943 9.7463581434 12.0699416198 0 0 0
-3347 1 47.3370623237 6.80555900076 14.7274612608 0 0 0
-3348 1 44.6206183359 9.59196798401 14.7144968226 0 0 0
-3349 1 49.996200691 6.76921243489 12.1621475609 0 0 0
-3350 1 52.7983466056 9.45136792933 12.1471942909 0 0 0
-3351 1 52.6232458081 6.69098104965 14.7690728435 0 0 0
-3352 1 49.8660736488 9.64172455831 14.7387021079 0 0 0
-3353 1 55.40125 6.75625 12.16125 0 0 0
-3354 1 58.10375 9.45875 12.16125 0 0 0
-3355 1 58.10375 6.75625 14.86375 0 0 0
-3356 1 55.40125 9.45875 14.86375 0 0 0
-3357 1 60.80625 6.75625 12.16125 0 0 0
-3358 1 63.50875 9.45875 12.16125 0 0 0
-3359 1 63.50875 6.75625 14.86375 0 0 0
-3360 1 60.80625 9.45875 14.86375 0 0 0
-3361 1 -63.50875 12.16125 12.16125 0 0 0
-3362 1 -60.80625 14.86375 12.16125 0 0 0
-3363 1 -60.80625 12.16125 14.86375 0 0 0
-3364 1 -63.50875 14.86375 14.86375 0 0 0
-3365 1 -58.10375 12.16125 12.16125 0 0 0
-3366 1 -55.40125 14.86375 12.16125 0 0 0
-3367 1 -55.40125 12.16125 14.86375 0 0 0
-3368 1 -58.10375 14.86375 14.86375 0 0 0
-3369 1 -52.4864437071 12.079199166 12.2322186949 0 0 0
-3370 1 -49.8707618264 14.8459862963 12.2325121648 0 0 0
-3371 1 -49.9421392444 11.8847426262 14.8450327823 0 0 0
-3372 1 -52.6036157386 14.7825105527 14.9242657841 0 0 0
-3373 1 -47.3471122809 12.0317312342 12.1109595091 0 0 0
-3374 1 -44.680730804 14.6841656715 12.058460384 0 0 0
-3375 1 -44.4446582583 11.9129270091 14.8955523506 0 0 0
-3376 1 -47.3171936757 14.8283125958 14.8491090689 0 0 0
-3377 1 -41.9379535153 12.1964200074 12.0964864971 0 0 0
-3378 1 -39.3230710072 14.8861508968 12.279074569 0 0 0
-3379 1 -39.1996491069 12.105461918 14.8400184235 0 0 0
-3380 1 -41.903966514 14.7746715765 15.0070836928 0 0 0
-3381 1 -36.6314076419 12.091493145 12.1649944549 0 0 0
-3382 1 -33.8905019538 14.9314536814 12.1143102974 0 0 0
-3383 1 -33.8828555254 12.2134638282 14.4643863139 0 0 0
-3384 1 -36.5288938073 15.0280132499 14.7394081476 0 0 0
-3385 1 -31.0725015969 12.328219321 11.8327381436 0 0 0
-3386 1 -28.263633951 14.8301152049 11.866651928 0 0 0
-3387 1 -28.6018325475 12.0870259552 14.8921317947 0 0 0
-3388 1 -31.2781513589 14.9453115449 14.5789130103 0 0 0
-3389 1 -25.8824602921 12.1587449533 11.9863398369 0 0 0
-3390 1 -23.2328187527 14.7829087959 12.0978769619 0 0 0
-3391 1 -23.1145809883 11.9804622326 14.8323544712 0 0 0
-3392 1 -25.7559917678 14.9080252318 14.7597468043 0 0 0
-3393 1 -20.4957043204 11.904317467 12.0891122935 0 0 0
-3394 1 -17.6614915909 15.0634376467 12.0125213542 0 0 0
-3395 1 -17.7121831792 12.2414114761 14.6104526519 0 0 0
-3396 1 -20.4120365224 14.8210397844 14.7555796073 0 0 0
-3397 1 -14.9566299194 12.1266720373 12.0699202037 0 0 0
-3398 1 -12.0899995843 14.9367837458 12.1300232712 0 0 0
-3399 1 -12.1635491437 12.3176729941 14.692946611 0 0 0
-3400 1 -14.9824007473 14.781884944 14.7320239711 0 0 0
-3401 1 -9.52861050773 12.4613812609 12.13971431 0 0 0
-3402 1 -6.73752617342 14.8169267671 12.2022305998 0 0 0
-3403 1 -6.99096128546 12.0580031431 14.8164944024 0 0 0
-3404 1 -9.45651605592 14.8971384128 14.912520927 0 0 0
-3405 1 -4.09049982008 12.1879266951 12.1757285135 0 0 0
-3406 1 -1.42555268326 14.7388424864 11.9623946815 0 0 0
-3407 1 -1.48934039353 12.093701784 14.7503895841 0 0 0
-3408 1 -4.13455423411 14.7515080469 14.6045471573 0 0 0
-3409 1 1.34080971457 11.9522567252 11.9316886089 0 0 0
-3410 1 3.93252609894 14.8873391584 12.1721399295 0 0 0
-3411 1 4.06622173834 12.2971083686 14.7281777758 0 0 0
-3412 1 1.33631982714 14.8093319817 14.7584033139 0 0 0
-3413 1 6.59270613709 12.0474123713 12.0222271237 0 0 0
-3414 1 9.28424162464 14.8377515214 12.2610604215 0 0 0
-3415 1 9.49891823303 12.0760939346 14.6309373426 0 0 0
-3416 1 6.82463677057 14.6211848005 14.8359397337 0 0 0
-3417 1 12.1702620634 12.2960482132 12.2854968828 0 0 0
-3418 1 14.8036779306 14.8437213678 12.0722997276 0 0 0
-3419 1 14.8604408155 12.1773504002 14.8393649722 0 0 0
-3420 1 12.2130182043 14.8951199889 14.7206885231 0 0 0
-3421 1 17.5369608244 12.148070384 12.1281975479 0 0 0
-3422 1 20.3822684874 14.944215749 12.0762826437 0 0 0
-3423 1 20.2022101691 12.1047245235 14.7299130905 0 0 0
-3424 1 17.5056609356 14.8389643762 14.5401366164 0 0 0
-3425 1 23.0963106856 12.1926259826 11.9584951172 0 0 0
-3426 1 25.5300469345 14.8609615486 12.1646159882 0 0 0
-3427 1 25.6584461382 12.2782697014 14.7449916887 0 0 0
-3428 1 23.1016171895 14.7727570473 14.8803871572 0 0 0
-3429 1 28.1125902284 12.1385216708 12.1641907532 0 0 0
-3430 1 30.946262257 14.8393937327 12.0000678195 0 0 0
-3431 1 31.155940735 12.0876296068 14.7803021299 0 0 0
-3432 1 28.410948147 14.7238691647 14.9510172639 0 0 0
-3433 1 33.7960868149 12.0675061806 11.9059510465 0 0 0
-3434 1 36.4987153276 14.6680966937 11.7468823401 0 0 0
-3435 1 36.508475523 12.058427652 14.6843660647 0 0 0
-3436 1 33.8741055487 14.7011427357 14.6378303555 0 0 0
-3437 1 39.2850312001 12.207272566 11.7851526498 0 0 0
-3438 1 41.868368069 15.103191364 12.0947729578 0 0 0
-3439 1 41.89629961 12.0936855559 14.6178159422 0 0 0
-3440 1 39.2858179807 14.8915377692 14.9385579106 0 0 0
-3441 1 44.6627976567 12.4898163926 11.8928314202 0 0 0
-3442 1 47.3824690994 15.2044588578 11.9834198374 0 0 0
-3443 1 47.2732348992 12.3801304804 14.7096923197 0 0 0
-3444 1 44.6548311114 14.9713971696 14.6992743798 0 0 0
-3445 1 50.0879260577 12.4113059727 12.1273869068 0 0 0
-3446 1 52.6952688163 14.912080369 11.9014673279 0 0 0
-3447 1 52.7763844057 12.2499337619 14.796684186 0 0 0
-3448 1 50.1167174462 14.917318732 14.9086036377 0 0 0
-3449 1 55.40125 12.16125 12.16125 0 0 0
-3450 1 58.10375 14.86375 12.16125 0 0 0
-3451 1 58.10375 12.16125 14.86375 0 0 0
-3452 1 55.40125 14.86375 14.86375 0 0 0
-3453 1 60.80625 12.16125 12.16125 0 0 0
-3454 1 63.50875 14.86375 12.16125 0 0 0
-3455 1 63.50875 12.16125 14.86375 0 0 0
-3456 1 60.80625 14.86375 14.86375 0 0 0
-
-Velocities
-
-1 0 0 0
-2 0 0 0
-3 0 0 0
-4 0 0 0
-5 0 0 0
-6 0 0 0
-7 0 0 0
-8 0 0 0
-9 0.000255120826775 0.00128350805913 0.00066559079985
-10 1.56170899138e-05 0.000134729184326 0.000103722710301
-11 0.000296994048999 0.000879160598493 0.000245800212671
-12 0.000502988580744 -0.000378476509636 0.0001021847453
-13 0.000417803601764 -0.00030499366625 0.0010018960295
-14 -0.000443222863624 -0.000442059265142 0.000280359323891
-15 0.000927921909832 -0.000412038964698 -5.4008550122e-05
-16 -0.000771121020629 0.000134275487112 0.000325599466728
-17 0.000400669401039 0.000642392415125 1.67404998779e-05
-18 0.000385482220232 -0.000134389426733 -0.000278384703393
-19 0.000925681431931 0.00042138727132 -0.000931442018092
-20 0.0001285004036 -8.49750214957e-07 0.000863710311693
-21 -4.97510859956e-05 -0.00025723251579 -0.000632514431656
-22 -5.79866061918e-05 -1.77779139116e-05 0.000557405343641
-23 0.000254419969142 0.00104903433527 5.24170749576e-05
-24 0.0015658771935 9.12882886177e-05 -0.000384532657626
-25 9.3261308887e-05 -0.00118757805045 0.000658141289698
-26 0.000142309862153 -0.000724629832494 0.00018617738793
-27 -0.00135026799141 0.000230671275618 0.000880446685747
-28 -0.00029076637874 -0.000956547205543 -0.00110808641056
-29 6.80408398199e-05 0.000550571067856 -0.000543014596922
-30 -0.000268145707727 0.000945298640959 0.000306042822423
-31 0.000156291539428 -0.000361332842921 0.00023401411096
-32 7.53067419282e-05 0.000759216493739 0.000897638856717
-33 0.000173281221576 0.000165115652534 0.000241171459816
-34 4.96593678679e-05 -0.000509073131469 0.000309602919728
-35 0.000358829842445 0.00118447380842 -0.000382959464491
-36 0.000812731424916 -0.000611013581212 -0.0013298436087
-37 -0.000334522480514 -0.000651682567005 0.000418636135308
-38 0.00017955977467 -0.000296800840368 0.000187944351086
-39 -0.000408512084335 0.000172330303707 -0.00079540527946
-40 -0.000353824378679 0.000276186492153 -0.000243139926253
-41 0.00164337789195 -0.000601999776792 -0.000488703332053
-42 0.00100832429 -0.000398064799661 0.000244334800135
-43 -0.000213332427573 0.000546472735183 0.000827194997411
-44 -0.00083880150193 0.00100251813697 0.00051228009879
-45 -0.000972826297418 -0.000262502605027 -0.000375904792081
-46 -0.000511181487301 0.000132716549562 -0.000593053353929
-47 -0.00116109646884 -0.000692831236003 -0.000429402613926
-48 -0.000128233665484 -0.00081619015621 0.0012233628907
-49 -0.000782539119449 0.000298183034923 -0.000716928426819
-50 0.000191457410829 4.76359749177e-05 0.00048260914709
-51 -0.000230588408453 7.02224772722e-05 -0.00050086709266
-52 5.49254448269e-06 0.000234219504351 -0.000182348639362
-53 -0.00109967504351 -9.68119855808e-06 0.000160040345676
-54 0.000335368863981 -0.000111767762814 -9.60962202391e-06
-55 -0.000510580142164 -0.000143254624725 -0.000424265642272
-56 -0.000364807519391 0.0010995965123 0.000786111390959
-57 -0.000481061330083 -0.0011704455458 0.000102909642384
-58 0.000515828540045 0.000462254739207 -9.2457242364e-05
-59 0.000129698221217 -9.45743145338e-05 -0.000271555953761
-60 0.0003039450425 -0.000581614360867 -0.00109515441721
-61 -3.17385143033e-05 -2.7444293711e-05 7.43129823576e-05
-62 -0.000293290749517 -0.000978417491763 0.000195721318838
-63 4.21437172785e-05 0.000299723157037 -0.000181998220065
-64 -0.000113827742994 -6.39862183862e-05 -0.000425710407324
-65 -0.000774209946682 -0.000574932983703 -0.000709901731747
-66 -0.000677730065332 -1.22285679444e-05 0.000169209973326
-67 0.00101465434921 0.00065516539851 2.50303546484e-05
-68 0.000757771446177 -0.000624632868308 0.000503458494847
-69 -0.000351444874067 1.28698406654e-05 -0.000262282860294
-70 -0.000456060103334 0.000643933912273 -0.000460820245131
-71 0.000349546516517 -0.000904443689761 0.00017421744472
-72 0.00011566527083 0.000642277942457 0.000345848758832
-73 -0.000128141565599 0.000144782462027 0.000320807633337
-74 -0.000704852039898 0.000109983460457 -0.000180848927356
-75 -0.000447034318211 0.00102633554508 0.00103126629074
-76 0.000553659842197 -0.00125472964914 -0.000501364298203
-77 0.000579339883591 -0.000273775080651 3.27017741826e-05
-78 0.000732838552787 0.000866279463772 -0.000420092172135
-79 -0.000474908181457 -9.85608462347e-06 -5.97852017637e-05
-80 0.000475892861685 0.000285239932896 0.000500845051963
-81 0.00053894320974 0.000674763787051 0.000425822474905
-82 -0.000382820774169 0.000450081662443 0.000391434334002
-83 -0.000417342847232 -0.000442284542699 0.00112610334537
-84 -0.000439765506256 0.000764206763582 6.86612325971e-06
-85 -0.000203170299972 2.26439311964e-05 0.000418868069188
-86 7.22064038004e-05 0.000135904365507 -0.000891641570743
-87 0.000313970881599 0.000138249301599 -0.000449598628412
-88 -1.55626265326e-05 0.00114977671435 -6.41073254697e-05
-89 0 0 0
-90 0 0 0
-91 0 0 0
-92 0 0 0
-93 0 0 0
-94 0 0 0
-95 0 0 0
-96 0 0 0
-97 0 0 0
-98 0 0 0
-99 0 0 0
-100 0 0 0
-101 0 0 0
-102 0 0 0
-103 0 0 0
-104 0 0 0
-105 0.000614763353165 -0.000527860113719 -0.000471863865934
-106 -0.000465732432404 0.000211186862741 -0.000906480836222
-107 -0.000148984687965 -0.000500177935973 -0.00043593130742
-108 7.10126498319e-06 0.000440537546437 -0.000277749111498
-109 -0.000340729745069 -0.000282555205999 9.84075932819e-06
-110 0.000108123183977 -0.00016454919014 -0.000266920240126
-111 0.000683009469434 0.000600769568158 0.00142354388264
-112 -0.000762300108919 -0.000783472035491 0.000228717710294
-113 0.000215290470355 0.000357337227648 0.00015765715327
-114 0.000724050218783 0.000412944158034 -0.000212244489051
-115 -0.000348873401479 0.00133266593795 0.000602030399416
-116 -0.000193295130839 -0.000158646732641 -0.000567176866946
-117 0.000254321825832 0.000404997746373 0.000230590806429
-118 0.000339875914443 0.000336352593708 -0.000683730723345
-119 0.000706088530989 -0.000113023277786 -0.000531706196534
-120 0.000203706247666 0.00034423491175 0.00110248675405
-121 -0.000151447749729 -0.00051706987967 -0.00106457334765
-122 -0.000138450756647 3.37482772271e-05 0.000631712041709
-123 0.00105194035032 -0.00011466730669 0.000238342544334
-124 0.000216041452246 7.30655663919e-05 0.000281387898355
-125 0.000591129806667 -5.56853620025e-05 -0.000930030388697
-126 0.00069495996277 0.000358713580197 0.000821231752843
-127 -0.00059117684854 0.000707856760408 0.000849204100643
-128 0.000394598293262 -0.00116361913691 -7.66219196392e-07
-129 0.000207519708653 -0.00058955027217 0.000272578412608
-130 7.07054111787e-05 4.88531857716e-05 0.000254226185034
-131 -0.000408115071624 -4.43222562337e-05 -0.000856339721372
-132 0.000594281361756 -0.000381914968428 8.06175667761e-05
-133 0.00202442704072 9.43477487968e-06 -0.000939936438498
-134 0.001186285814 0.000315206149408 0.000182034762476
-135 -0.000729578439183 -6.78434146666e-05 -0.000121844899949
-136 -0.00143395154671 0.000852835732041 -8.46773884906e-05
-137 7.59764451332e-05 0.00067994330874 0.000458346484964
-138 0.000404740077844 0.000985601858889 0.000454096169876
-139 0.000250416365128 0.00113903244697 0.000325972316146
-140 0.00110974748485 9.55961421829e-05 -0.000148557148208
-141 -0.0007751409162 0.000826844612327 0.000551865417982
-142 0.000960283862394 0.000394478863265 0.000247134520007
-143 0.00107951211791 0.000965338988469 0.00136584625153
-144 0.00121736768577 -0.000109565036066 -0.000849300555942
-145 4.55067499423e-06 1.35532077694e-05 0.000265713802447
-146 0.000470047383943 0.00055323250977 9.23702186791e-05
-147 -0.000108047309845 0.000322155201075 -0.000891021789389
-148 2.575831553e-06 0.000354042103095 -0.000196822594189
-149 4.11008964921e-05 -3.47223942594e-05 0.000758277854292
-150 0.000544251528669 0.000633730938776 0.000360251732516
-151 0.000991007614104 -0.000150941626479 0.000859376159393
-152 -0.000498305286667 -0.000294929181725 -0.000755362574408
-153 -0.00123608283916 0.000286379952891 0.000327706471266
-154 0.000914600239289 -0.00021971459026 0.000382729926709
-155 -0.000301588501828 -0.000543820668526 0.000714013961457
-156 0.000813079868305 -0.000123275870203 0.000428775775844
-157 0.000592476750792 -0.00102883665456 0.000256034519457
-158 0.00128440273607 0.000497769775023 -0.000301589827717
-159 0.000109308793076 -0.000844686013058 -0.000212364803339
-160 0.000725999806263 -0.000225232419637 -0.00114550766351
-161 0.00112496692413 0.000228139923802 -0.000373940528533
-162 0.000466538255277 -9.88087618075e-05 -0.00055753251288
-163 0.000924571883314 7.26712628912e-05 -0.00164810266169
-164 6.75597615643e-05 0.000173178199667 -0.000781284446167
-165 4.20578971618e-05 0.00120172221686 -0.000495706839538
-166 0.000824492875977 0.000135033730959 0.000280770854982
-167 -0.000154813788976 -0.00124568902933 -0.000765073971613
-168 0.000886982897836 -0.000840311062576 -0.000360324938536
-169 -0.000408237732126 -0.000439473122303 -6.00637683469e-05
-170 -0.000544401990229 -0.000408014660042 0.000731444416054
-171 -0.00077039491652 -0.000289731024736 -0.000633438772895
-172 -0.00035345459384 -0.00140761650151 -0.000398920215362
-173 -0.000393163626452 -0.00205741939737 0.000908888421744
-174 0.00119493389693 0.000425362978691 -0.00116399014342
-175 0.000406036991752 -0.000370530228714 -0.000316445039804
-176 0.000659517471128 -0.000714987499452 -0.000811556408536
-177 -1.73347051062e-05 0.000210144614394 -0.00141774899964
-178 0.00069670647133 0.00059654926721 0.00170418359338
-179 -0.000664782895393 0.000274600818305 -0.000639448338693
-180 2.97836965956e-07 0.00095599325272 0.000123097878939
-181 0.000190667597743 0.000532186140693 0.000881150009412
-182 0.000248838663068 0.000227147293551 0.000457985256216
-183 -0.000101169160363 0.000718760276956 0.000159574989291
-184 0.000756386656007 0.000413583870947 -0.000140269881012
-185 0 0 0
-186 0 0 0
-187 0 0 0
-188 0 0 0
-189 0 0 0
-190 0 0 0
-191 0 0 0
-192 0 0 0
-193 0 0 0
-194 0 0 0
-195 0 0 0
-196 0 0 0
-197 0 0 0
-198 0 0 0
-199 0 0 0
-200 0 0 0
-201 -0.000470782155272 0.000686344287856 -0.000631285394191
-202 0.00160447635539 -0.000574668528137 -0.00049832445954
-203 -0.00023160348482 0.000658903052381 -8.25128262365e-05
-204 0.000453410618861 0.000391533700288 0.000261920285378
-205 -0.000676699012146 0.000650573470639 0.000635532843956
-206 1.93406551344e-06 -0.00100806879323 0.000939444407899
-207 0.000529058714807 -0.000849442242784 0.000361646284283
-208 -0.000138528303647 0.000395944051906 -0.000796560774497
-209 -0.000441637236533 0.000800250875495 8.65415273194e-05
-210 -0.000510057061436 -0.00082873115016 0.000129302913469
-211 -0.000125212911895 -0.00111954151267 -0.000386278040749
-212 0.00061803815668 -0.000332740532739 7.37447841488e-05
-213 0.000632603576727 0.00103346905137 -0.000135162793212
-214 0.000591276455637 0.000718476781338 -0.000381561097087
-215 -0.000746114902817 -9.16130017671e-06 0.000873155656146
-216 -0.000185896569771 0.001322147221 0.000750924923601
-217 0.000315790283566 -0.00061835363479 0.000237747230413
-218 0.000217267411221 -0.000210967209236 0.00125434688372
-219 -2.16698551922e-05 0.000498561293296 -0.000134000320917
-220 0.000475318092539 -0.000105943969532 0.000215518576073
-221 -0.000943814929475 4.34790335772e-05 0.000231789302343
-222 0.000657214284876 0.000657777370866 0.000978833501354
-223 0.000691729707728 0.00061998561665 -0.000691915430003
-224 -0.000816462503957 0.000637247988826 0.000458357237312
-225 -0.00022952448707 0.000326054315559 -0.00062705870052
-226 -0.000806876449554 -2.76673446381e-05 -0.00122774224641
-227 0.000803412716252 0.000113278966868 0.00100224804231
-228 -0.00053237500539 0.000356827515084 0.000173305020399
-229 0.000941471418197 0.000779284154142 -0.000565382168606
-230 0.0004312404756 -0.00012378801569 -0.000198356923857
-231 -0.00062886528526 5.83589203054e-05 0.00125254881729
-232 -0.000166885331729 0.000669484277142 -0.000340845810656
-233 0.000255875921743 0.000415528621893 -0.00207494655846
-234 0.000524908889753 -0.000221216564887 0.000421203406273
-235 0.000652789986439 -0.000198886138039 0.00053218811415
-236 0.000104015559053 0.000533860482533 0.000583834095848
-237 -0.00103977924599 0.000302307268303 -0.000392111499976
-238 -0.000314096172382 -0.00020219356116 -7.81795089861e-05
-239 -0.000431397554005 0.000207990866194 -0.000284530039866
-240 0.000387357059103 0.00124108231153 0.000205422066136
-241 0.00102135718716 0.000143739569763 0.000405646797597
-242 0.000150762484153 -2.34955015729e-06 0.00100905383482
-243 0.000778372465526 0.000226566245489 -8.90579547277e-05
-244 -0.000165865479734 0.000256608620277 0.000441268360689
-245 0.000887517894511 -0.000388267634204 -0.00180703251755
-246 0.000169800955797 -0.000248991699536 -0.000188337495634
-247 0.000103083541579 0.000707353610867 0.000437410912044
-248 -8.82847401922e-05 -0.00059249960215 0.000355888111925
-249 -9.01213630546e-05 -0.000504856097232 -0.000831046564763
-250 -0.00126091863523 9.48655763577e-05 -7.94051783043e-05
-251 0.00142940766911 0.00027004799633 -0.000170755057804
-252 0.000391070443941 -0.000590845923178 -0.00100469722891
-253 0.000963695457542 -3.67027023806e-05 -0.000632987900134
-254 0.000463039312119 4.09118865893e-05 0.000108328694763
-255 0.000612331996388 0.000604918955692 -6.44437783514e-05
-256 0.000270557628313 0.000181982966318 -0.000669617524467
-257 -0.000516216155716 0.000660566313306 -0.000413662294054
-258 0.00114185090992 -0.000370225189481 -0.000420939571316
-259 0.000931561445564 0.000889963181137 -0.00063878229219
-260 0.000552359786938 -1.32463383882e-05 0.000495714704861
-261 -0.000913790748321 0.000247669255732 0.000142019882677
-262 1.17864702105e-06 0.000465030350594 0.00048716362649
-263 0.000323535318757 0.00108797066799 0.000637010433409
-264 -0.000378963919697 -0.000531934067272 -3.12413569764e-05
-265 0.00067397260191 -0.00151216951905 0.000132416414045
-266 0.000638612100013 -8.77695903419e-05 -0.000221573852154
-267 0.000514195515428 -0.000807878268994 -0.000439083908716
-268 0.000402825067813 0.000744496235456 0.000921124755611
-269 0.000878499781401 6.09075575359e-05 0.000620737931558
-270 0.000168843194107 -0.000363156737874 -0.000543396371405
-271 -0.00104965336887 0.000554795450186 -0.000907515156565
-272 0.00110820315774 0.000756725116381 -0.000714949264906
-273 0.00120243156223 8.38369685492e-05 -0.000551226592986
-274 -0.000547741560932 -0.00154182481296 -0.000181808451348
-275 0.000453493334468 0.000223156465491 -0.000854536544268
-276 -7.71637279824e-05 8.39209843639e-05 0.000254937012137
-277 0.000482608222528 2.58771752799e-05 0.000896853345805
-278 -2.88636141408e-05 0.000229708958316 9.9622291731e-05
-279 -0.000326900335251 0.000157810243297 -0.000146794754834
-280 -1.67780457295e-05 0.000343254974739 0.000564507573703
-281 0 0 0
-282 0 0 0
-283 0 0 0
-284 0 0 0
-285 0 0 0
-286 0 0 0
-287 0 0 0
-288 0 0 0
-289 0 0 0
-290 0 0 0
-291 0 0 0
-292 0 0 0
-293 0 0 0
-294 0 0 0
-295 0 0 0
-296 0 0 0
-297 -0.000847999427813 0.000543096027248 -0.000858921807344
-298 -0.000411556678673 -0.000560324785168 -8.94686056856e-05
-299 0.000436908997099 0.000279524903117 -0.000780407499274
-300 -4.34043728135e-05 0.000248881805504 2.42764877269e-05
-301 2.60700080735e-05 -0.00152880657581 0.000302003897858
-302 2.79350375487e-05 -0.000117963688144 0.00013493850538
-303 -0.000494330572839 -0.000983375648348 0.000672962869342
-304 0.00143845801915 -0.00104751767433 -0.00015222532148
-305 -4.40590872505e-05 -0.000585914654242 -0.000413422764978
-306 -0.000319592251173 0.000479334066734 0.000127829678979
-307 0.00140300705104 0.00171087396643 1.18086464364e-05
-308 -2.05391926878e-05 0.0013009045169 0.000116656043793
-309 -0.000717356023439 0.000419651026143 0.000647051135105
-310 0.000858935016737 -0.000339740773802 0.000452664865756
-311 -0.000318971471468 -5.55425181972e-05 0.00134636462989
-312 -0.000581889664429 0.000691314380656 -0.000389521100873
-313 -5.54221335355e-05 9.41456395771e-05 0.00108925711705
-314 -0.000144157381376 8.19971435024e-05 2.48088070021e-05
-315 -0.000494003543328 0.00107690823658 -0.000497873923992
-316 -0.000157510662725 -0.000312426921401 2.77659632871e-05
-317 -3.99419137904e-05 0.000179667335411 0.000459793220386
-318 -0.00107395797416 0.00154268002051 0.000133805005523
-319 0.000104785137586 0.00109683852978 -0.00138072067499
-320 -8.57474266919e-05 0.000152269644925 -0.000148701501048
-321 -0.000702115204584 -0.000201514479645 -0.000847680021153
-322 0.00123225347202 0.000339561565895 0.000520104459174
-323 0.000483792854275 0.00112652950647 0.000351172421215
-324 -0.000352319825964 -0.000788304904779 -0.00104291744692
-325 0.000971785957364 0.000169559901887 0.000147038795776
-326 -0.000229973713389 0.000139264941276 0.00112808951182
-327 0.000172387327371 0.000173543596072 0.000274097610911
-328 -0.00045432248555 0.000424908545606 0.000207739910038
-329 -0.00159912749249 -0.00121733062444 -0.000480305200486
-330 -0.00039402511802 0.000420342409612 -0.000115257049148
-331 -0.000354926010722 0.000206815012606 -0.00102268707872
-332 0.00089770404808 -9.58446634713e-05 0.000284782509257
-333 0.000410033512199 -4.56320655852e-05 -0.000961183041695
-334 -3.48518259567e-05 0.000573262600364 -0.000567691047237
-335 0.000263781950487 -0.000769696393136 0.000287582402398
-336 -0.000156658039942 0.000782046179021 0.000160273835814
-337 0.000330377025434 0.000528383590053 -0.000166970435504
-338 0.000408390794293 5.91981610372e-05 0.00161373176379
-339 -0.000518303056878 0.0010028094329 0.00118857907092
-340 -0.000960877812702 0.000556625611215 -0.000601808679398
-341 -0.000397342745405 0.000340348846777 -0.000951949793951
-342 -0.000203921089418 -0.000170714864826 9.91192948248e-06
-343 0.000533089456369 -0.000478342408012 0.000751101676911
-344 0.000627461148408 -2.73985289153e-05 0.000850459296634
-345 0.000163585766301 -0.000432651900685 -0.00147391084763
-346 -0.000206927167439 -0.000457691403367 0.000828163926356
-347 9.60992068037e-05 0.000905754285182 -0.000794556876052
-348 -0.000314661797691 -0.000142983857907 -0.000316254187478
-349 -0.000484550685188 0.000705092018233 -0.000730652037924
-350 7.15125708671e-05 -0.000386740668979 0.000218832125616
-351 -8.58975038635e-05 0.000992949947669 0.000254291789186
-352 0.000502783159435 0.000473650886082 0.000843159264893
-353 -7.52375516397e-05 -0.000239243361365 -1.54391583409e-06
-354 0.000634001259036 0.000458667989021 0.000320300501183
-355 0.000627530898075 -0.00116124529488 -0.00103089320068
-356 -0.000595232071643 0.000389023335335 0.000477931736642
-357 -3.51317241555e-05 -0.000465988178323 0.000415337073387
-358 -0.000530429968773 0.00111418702801 0.00108109798786
-359 -0.000748620417534 -0.000141123730118 0.000221032628243
-360 -0.000347824734266 -0.000796185471525 -0.000364603552267
-361 0.000709345412474 -0.00103230115948 -0.000757114349347
-362 -0.000168475964243 8.0544547308e-05 0.000249745721999
-363 -0.000295410810434 0.000834646976798 0.000897560163092
-364 0.000969036932008 -3.28891336068e-05 -0.00035053743744
-365 -0.000612034066191 0.00106276297909 0.00155049108802
-366 0.000482079002287 0.000385796150908 0.000405546189165
-367 -0.000156090716994 -0.00086571179828 -0.000367495970787
-368 -0.00070614474349 0.000496067610375 0.00063591525588
-369 -0.000889561670513 -2.80115295811e-05 0.000253233883985
-370 -0.000349057050355 0.000710302668613 0.000139154565347
-371 -0.000520950181372 -0.00034340175639 0.00096746441956
-372 0.000982474301766 -0.000916078991029 0.000103147224865
-373 -9.37470580769e-05 0.000193821218821 -0.000431553618952
-374 -0.000961694844104 8.34360270855e-05 -0.000569693357836
-375 0.000211356970567 -0.00111541633172 0.000722421954068
-376 0.000727618664648 -0.000808398222257 -0.000533862117564
-377 0 0 0
-378 0 0 0
-379 0 0 0
-380 0 0 0
-381 0 0 0
-382 0 0 0
-383 0 0 0
-384 0 0 0
-385 0 0 0
-386 0 0 0
-387 0 0 0
-388 0 0 0
-389 0 0 0
-390 0 0 0
-391 0 0 0
-392 0 0 0
-393 -0.000318401879973 -0.00143924874442 -0.000512020560963
-394 0.000285904666538 -0.000361379800249 -0.000464764331843
-395 -0.000894572131521 -0.000233718743227 -0.000341696170322
-396 9.54923193295e-05 0.000119019979691 0.000596080575981
-397 -0.000653729136217 -0.000363078531726 0.00119272260381
-398 -0.000272079256642 0.000644323447877 -0.000450593702542
-399 -0.00032659696289 -0.000136751273029 -0.000423032191177
-400 -0.000307217320953 0.000583002531468 -0.000714268102265
-401 0.00094468567876 0.000371223998034 -0.000582882600859
-402 -9.6460933467e-05 0.00032188011575 5.35095700012e-05
-403 0.000281834997023 -1.88029305378e-05 -0.000348583446974
-404 0.000440989431128 0.0011885566461 -0.000380666742942
-405 0.000373581704839 0.000568291645338 -0.000182514559943
-406 -0.000252310459484 0.000531725302754 -0.000571904999182
-407 0.000106817739707 -0.000232100839649 1.62877687084e-05
-408 -0.000181664386562 -0.00175438261488 -0.000278959468976
-409 0.000143191327893 0.000870761135305 0.000363919051032
-410 -0.000412261598318 -0.000108562081852 -0.00088888861987
-411 0.000562604043316 0.000646979962282 -0.00104505184196
-412 0.000249243629329 -7.38132824656e-05 0.00115652571467
-413 9.75672730387e-05 0.00121590823792 -0.000483003303731
-414 0.000188708280613 -7.43082385771e-05 -0.000636392297858
-415 -0.000490943329484 0.00106246372782 -0.000810509350357
-416 -0.000880589149364 -0.000314572836048 -0.000464938701815
-417 0.000688049695198 9.12631214183e-05 -0.00022769682389
-418 0.000734391945109 0.000119517635367 -0.00088909393016
-419 0.000323727256497 0.000331493750506 -0.000209397261497
-420 -0.000536363783328 0.000304542572494 -8.0282334066e-05
-421 0.000493889297768 3.84939118859e-05 -0.000928493461928
-422 -0.000133439036018 -0.000754869203488 -0.000373136197736
-423 -0.000183730665021 0.000995462627223 7.98951284059e-05
-424 -0.000774329220426 -0.000271772623553 0.000726245874547
-425 -0.000907322510837 0.000491531257753 -0.000744373827531
-426 -0.000411821105182 -0.00091251098061 -0.00101718415998
-427 -5.19614225296e-05 0.000984958361399 -0.000570520241037
-428 0.000316025850782 0.000256043369423 -0.00171526714072
-429 0.000907778910981 0.000376436113253 -0.000102821751978
-430 0.000414975256286 2.44871171189e-05 0.00149495043614
-431 -0.000196530855532 -0.000787474716174 -0.000347405807396
-432 -0.000835473704472 0.000257934694097 -0.000381272307458
-433 -0.00103283030705 -0.0010008792827 8.94603117845e-05
-434 6.53296388133e-05 -0.000955388276698 -0.000319736192822
-435 -0.000806562843646 0.000281549961211 -0.000391874306232
-436 -0.000498252096749 -0.000659229817449 -0.00132736561292
-437 -0.000754840816492 0.000682465575862 0.000308123735298
-438 -0.000306074013139 -0.000686591694369 0.000122054097011
-439 -0.00133954925196 0.000602945407897 -0.000183797394564
-440 0.000137361629057 0.000320346580448 -0.000468664832671
-441 -0.00135885920678 -0.000278172760775 0.000739140421407
-442 -0.000700620809132 0.000430711757579 -0.000681963240477
-443 -0.00149409797485 0.000136058079464 0.000459332366504
-444 -0.000566979289604 0.00055576890022 -0.000202389283666
-445 -8.86096051288e-06 -0.000344075943029 7.85887273403e-05
-446 0.000481690525548 -0.000724895263906 0.000227385611297
-447 0.000154047850938 0.000108260060023 -5.13054077924e-05
-448 -0.000479941939784 -0.00128053178195 -8.82992154911e-05
-449 0.000361147684213 4.17470445827e-05 0.000461739261961
-450 0.000294429314668 -3.26032238969e-05 -0.00037231829393
-451 -0.000965683469475 -0.000436952973703 -0.000262180609718
-452 -0.000189872540857 0.00133179996439 0.000288998655775
-453 -0.000602892501882 -0.00104063357796 -0.000114062808729
-454 -0.000448501900608 -0.000110717293209 0.00044477808907
-455 -8.78212000504e-05 -0.000176076082757 -0.000410633429962
-456 -0.000457233402893 0.00044689105178 0.000286669159423
-457 -0.000353911723835 -7.80718568335e-05 -0.000310788335389
-458 -0.000171411025712 -0.000428220085848 0.000550573480343
-459 0.000122692382933 -0.00168169997669 0.000268707712419
-460 0.000224779496212 -0.00089120948557 -6.74227139508e-05
-461 0.000731706371449 0.000180059409083 0.000864192713714
-462 -0.00131049536078 -0.000393737075673 5.85810366258e-05
-463 -0.000332982623128 -0.00128609961282 0.000178487887594
-464 -0.000572449420665 0.000287787581488 0.000496296612349
-465 -0.000104808082843 0.000200165055287 0.000377791956253
-466 0.000107219728303 0.000236187756522 -0.000533380776821
-467 -0.000770282788916 -0.000427106879033 -0.000337859090497
-468 -0.00027657770674 0.00021432707663 6.4195397045e-05
-469 -0.000950530873156 0.000627952567271 0.000285984768352
-470 -0.000651242496351 -7.5536403554e-05 0.000105962503075
-471 0.000698459055333 0.000291556354342 -0.000797473879732
-472 -0.000212358972424 -0.000396186639688 0.000656622048664
-473 0 0 0
-474 0 0 0
-475 0 0 0
-476 0 0 0
-477 0 0 0
-478 0 0 0
-479 0 0 0
-480 0 0 0
-481 0 0 0
-482 0 0 0
-483 0 0 0
-484 0 0 0
-485 0 0 0
-486 0 0 0
-487 0 0 0
-488 0 0 0
-489 0.00122612705996 0.000145203440134 0.000769299945344
-490 -6.15626385198e-05 0.000422607197848 0.000485032340613
-491 -0.000212645826711 0.000148368277232 -0.00102051556943
-492 0.00017088229696 0.000817804313742 0.000454595876391
-493 0.00078645772164 0.000942356812735 -0.000860386144655
-494 0.000398621631865 0.000563334694291 -0.000531467250573
-495 -0.000795194677943 0.00115451456714 -0.000330123010931
-496 0.000290624766082 0.000914994462789 0.000805913094079
-497 -3.10739367703e-05 0.000263182970804 0.000761746096762
-498 0.000281181737994 -0.000489106734933 -0.000387064139961
-499 -0.00135485126974 -0.000194327018632 0.000489764858205
-500 -0.000576208087042 0.000914338487348 -0.00015792720268
-501 -0.000807553334801 -0.00105982484106 0.000511955912954
-502 0.000772556111962 -9.12989130724e-05 0.000590804875403
-503 0.000962354619886 0.000164594903751 -0.000313800254376
-504 -0.00059538809902 0.000488721415675 0.000968424413379
-505 -0.000493785130292 -6.9269758407e-05 -0.000782365675341
-506 2.22461139405e-05 -0.000666382703518 0.000350616719443
-507 -0.000193350251984 -0.000258926338843 0.000966017234934
-508 0.000619840382079 0.00102647648202 -0.000276536897792
-509 0.000745165415132 0.000845011587562 2.23225916767e-05
-510 0.000341467898826 -0.000580021083296 -0.000175603854993
-511 6.02210178606e-06 -0.00070480222417 0.000315196707308
-512 -0.000698647948606 7.41873318488e-05 0.000652154132687
-513 0.000521807205806 0.00024488813039 6.01359915102e-05
-514 -0.000261477531387 3.51611733152e-05 -9.86749995803e-05
-515 -0.000137828264475 -0.000830376938506 -1.27990384857e-05
-516 -1.09086292552e-05 -0.00059452405925 -5.29145726729e-05
-517 0.000176941644002 0.000520247351601 2.26027700724e-05
-518 0.000562494403295 -0.00154249548489 0.000380417712574
-519 -0.000416363549402 -7.25683527273e-05 5.27628151985e-05
-520 0.00137976609268 8.80936554159e-05 -0.000715521543295
-521 0.000601819111772 -0.000923853769277 -0.000447223734183
-522 -0.000767635155492 0.000849128281167 -0.000614636960503
-523 0.000408479981771 -0.000561202643417 -0.000137391855243
-524 0.000195750111526 0.000927401949437 0.000322642985371
-525 -0.000670105483513 0.000290990813811 -0.000372050275114
-526 -0.000594297790262 -0.000162588139645 0.000532358260076
-527 -0.000243622072619 0.00016826551432 0.00127424537679
-528 -0.000221412109147 0.000591331987732 0.000282077634589
-529 0.000306549836758 0.000955549993752 -0.000618713440075
-530 -0.00163753426419 -7.79548566377e-05 -0.000918679616861
-531 0.000492266055432 0.000523246407251 0.00091846133275
-532 1.25915779281e-05 -4.93457563688e-05 0.000289418546148
-533 -0.000401009804973 -0.00095717327053 -0.000295417286428
-534 -0.00116789734213 -0.000408643387533 -0.000386159886601
-535 -0.000233105667321 0.00112062359929 -0.000343361591761
-536 -0.000259623781344 -0.000748853300181 0.000621869883565
-537 0.000257226119254 2.05065192669e-05 -0.000341053848449
-538 -0.000133911467147 -0.000178275687916 -0.000509556244858
-539 0.000252710332101 0.00110093682022 0.00158999335593
-540 -0.000276230996399 0.000187627083179 0.000320208339079
-541 0.000648075911832 0.00103160920118 -0.000487426475198
-542 -0.000687808246274 0.000349059106792 -0.000330213074975
-543 0.000314873106912 0.000605749701642 -0.00110626841651
-544 -0.000657973806426 0.000985838823081 -6.2340515909e-05
-545 -0.00075387629115 -0.00114862822724 8.24539453738e-05
-546 0.00042259771147 -0.000600278512193 0.00132413833279
-547 5.38007390659e-05 0.000620648917256 -0.00102464020693
-548 0.000662028050252 0.00129707447696 0.00017225263395
-549 2.97444864237e-05 0.000399450109698 -0.000307377744355
-550 -0.000769303473479 0.000906633794731 -0.000433999502436
-551 -0.000531650269815 0.00153702649778 0.000188393102404
-552 0.000355233034673 0.000322323438972 0.000295673008512
-553 -0.000499667872819 0.000893083965239 -0.00089192798316
-554 -0.00080109791483 -0.000362796057031 -0.000641780900607
-555 -0.000814433722596 0.00106185000187 -6.33584700097e-05
-556 -0.000291749090807 0.000388834892338 -0.00098338890087
-557 0.00040531361552 -0.000521007340629 0.000225573855187
-558 -0.00169467030238 0.000462163309959 0.000416836715191
-559 0.000466884512228 -0.000277201704346 0.000214952125157
-560 0.000243632708039 -0.000160663521822 -0.000462055952701
-561 -0.00127544026768 0.000100059047376 -0.00123072240625
-562 -0.000618015772176 0.000552937154674 4.98953761426e-05
-563 0.000356765864303 -0.000206234659092 0.000134201039821
-564 -0.000672000208343 -0.000385343982002 0.000514873958137
-565 8.03918554935e-05 0.000143071265001 -0.00136381212759
-566 -0.000540089050275 0.000298477448989 -0.000995382799042
-567 0.000415369259295 -0.00064432093359 -6.98217048063e-05
-568 -0.000883646503636 0.000157303873139 0.000747903936881
-569 0 0 0
-570 0 0 0
-571 0 0 0
-572 0 0 0
-573 0 0 0
-574 0 0 0
-575 0 0 0
-576 0 0 0
-577 0 0 0
-578 0 0 0
-579 0 0 0
-580 0 0 0
-581 0 0 0
-582 0 0 0
-583 0 0 0
-584 0 0 0
-585 0.000467938668613 0.00022347865891 -0.000316233793044
-586 7.48937591591e-05 0.000324991900104 -0.000259671000355
-587 0.000492268345272 0.000410981043054 -0.000431594809852
-588 0.000428545184671 0.000358257649668 -0.000980972890763
-589 0.00128851986903 -0.000617707704444 -0.00034529185456
-590 -0.00021679403031 0.000626740665207 -0.00010838594795
-591 0.000513605766393 0.000843113245321 -0.000399879335521
-592 0.000171968683712 0.000695109843372 -0.000128839126957
-593 0.000456816188928 -0.00097460314458 0.000515086434075
-594 -0.000240014492161 -0.000687895768389 -0.000620956528783
-595 0.000533224567638 -0.00040144279342 0.000305493983306
-596 0.00119441006037 -0.000535975733591 -0.000659406526408
-597 0.000685577824884 -0.000605795884442 4.60979917392e-05
-598 0.000538698041922 -0.000115778776908 -0.000289719189212
-599 -1.97349579524e-05 -0.000464093423705 -4.10710177983e-05
-600 0.000926747396344 0.00139123722404 4.67311639358e-05
-601 0.000625832759266 -0.000126474999146 -0.000992572940801
-602 0.000625739765893 0.000942265814441 0.00158090257723
-603 0.00034093332558 0.000479755035684 -9.92191567457e-05
-604 -0.000204675289494 0.000422933092182 -9.00363262742e-05
-605 0.000417475851845 -0.000548033919943 0.000511135278618
-606 0.00109619419425 -0.000323972740822 0.00128121328831
-607 0.00072943719739 0.0011347554529 6.14493331713e-05
-608 -0.000898408004539 0.000380759933444 -0.0011598233861
-609 0.000607541787733 0.00100118140875 -0.00101150653207
-610 -0.000571325639251 -0.00142757573892 -0.000412481799896
-611 -0.000191638540161 -0.000534427678838 0.00046285663606
-612 -9.4817195971e-05 -0.000589723952267 0.000969150922393
-613 0.000704581020208 0.000201825115092 -0.000596325391352
-614 0.000462479654216 -3.68803708079e-05 -0.00125269136014
-615 0.00100621883113 -0.000585684055825 -0.000498158056997
-616 -0.000264314932544 0.00058330851263 0.000258497698146
-617 0.000297065081093 6.49866334625e-05 0.000164242462178
-618 7.95805506718e-05 -0.00103444153242 0.000884314978718
-619 0.000337789030776 -0.000298688720286 -0.000154576644343
-620 0.000265900588823 5.24615321466e-05 -0.000257423814351
-621 -0.000413132828924 0.000248353231542 5.18569443578e-05
-622 0.000224878958842 0.000489385980459 0.000127724976365
-623 5.98381262648e-05 -0.000265873035978 -0.000242978457617
-624 4.82182828256e-05 0.000449036992112 -7.10875932305e-05
-625 0.00045210400649 0.000224217147666 0.000631311832751
-626 -0.000573416481692 7.6693396857e-06 0.000677855194689
-627 -0.00100094209777 -0.000904908780178 0.000414871299652
-628 0.000300772864132 -0.000423172924398 -0.00049205920761
-629 7.27956312205e-05 -0.000128615036989 -0.00017042445903
-630 0.000396742162931 -6.84407716101e-05 0.000137341815533
-631 -7.97372934269e-05 -0.000242292752205 0.00039284765978
-632 -0.000690923362568 -0.000106521392487 -0.0007564306701
-633 0.000115977070846 -0.000661909223981 0.000583731136439
-634 5.77465925738e-05 0.000724045119613 0.0010916057891
-635 -0.000863529384669 -0.000483779907058 -0.000581810190785
-636 -0.000656479053044 5.19881108684e-05 0.000279913841961
-637 -0.00152876234204 0.000329946323902 -0.000796602959987
-638 0.000656401109671 0.000265512573935 0.000630058708506
-639 0.00108552450202 -0.00029957627811 0.000168375953519
-640 -9.82352958149e-05 0.000285195287644 -9.61071829733e-05
-641 -0.000100619106857 -0.000634074407051 0.000579434027011
-642 -5.57063927657e-05 -0.000267855277508 0.00056261444654
-643 0.000969815342267 -0.00015696985258 -0.000126585604526
-644 0.000148304959148 0.000681500124926 -0.000199554104886
-645 0.000553427572838 -0.000226463123444 -0.00118012790365
-646 -0.000442689535862 -0.000656658604475 0.000951298760472
-647 -0.000976435710431 0.000481466330729 0.00165371154851
-648 -0.000418599714929 0.00025737265494 -0.000167304444537
-649 -0.000261254893371 -0.00138455643483 -0.000460243106656
-650 -0.000105497405376 -0.00133852011514 5.61649045984e-07
-651 0.000466311179086 -0.000197204359571 0.000643871298593
-652 0.000661222888449 -0.000630327764589 4.89229092173e-05
-653 -0.000364390009628 -0.000296585068169 0.000559576050823
-654 -0.000272742532044 -5.40034331722e-05 0.00041202624626
-655 0.00144181634142 -0.000250703928513 -0.000285393673027
-656 0.000296375562406 -0.000417309582146 0.000247103199104
-657 -0.000506659633608 -0.000434805268445 0.000635982401187
-658 0.000956710354653 -0.000946581351331 0.000973859968828
-659 0.000797621166695 0.000116713167408 -0.000356235039264
-660 -0.000600406058476 0.000528137663811 -0.000444318750051
-661 -0.00110182194885 0.000753024971956 -3.1918448412e-05
-662 -1.18289363094e-05 0.00115916543794 0.000381320366018
-663 -0.000580443923815 -6.62625321579e-05 0.000153322703565
-664 0.000869174037604 0.000857415469883 -0.0004512045732
-665 0 0 0
-666 0 0 0
-667 0 0 0
-668 0 0 0
-669 0 0 0
-670 0 0 0
-671 0 0 0
-672 0 0 0
-673 0 0 0
-674 0 0 0
-675 0 0 0
-676 0 0 0
-677 0 0 0
-678 0 0 0
-679 0 0 0
-680 0 0 0
-681 0.000125861238314 0.000602762390732 -0.000421840918268
-682 -0.000771633030512 0.000228971175264 -0.000178493440633
-683 -0.000510968054694 -0.00111956568125 0.00115187461131
-684 0.000336291129955 0.000983296575262 0.000518884753367
-685 0.00114209883393 1.91801609632e-05 0.00180370567981
-686 7.88246468786e-05 -0.000299870202032 -0.000278025484418
-687 3.28065696665e-06 1.12853929838e-05 -1.10480107217e-06
-688 0.000949920592349 -0.000456823076085 -0.000833330658098
-689 0.000756113422377 2.58525714584e-05 0.00075389903003
-690 -0.00012495165038 0.0010263432738 7.78556226217e-05
-691 0.000281336004676 -0.000569824192136 0.000496829302233
-692 3.69788288195e-05 0.000337163222288 -0.000493619675157
-693 0.000454685717112 7.08348664191e-06 -0.000344748149734
-694 0.0011612108287 -0.000140424423031 -0.000378522639684
-695 -0.000157143726185 0.000691472709193 -0.000871049452186
-696 -0.00077825974757 -0.000642950002774 -0.000699929568539
-697 -0.000128606790418 6.99295566114e-05 -0.000484130854983
-698 -0.000354495870706 -0.000788836473365 -0.000289006535543
-699 0.000432166496562 -9.31840892104e-05 0.000846190741651
-700 -0.000402161433571 -0.000250070713402 0.000536619045069
-701 0.00056414664982 0.000533667424006 -0.000151914227165
-702 -0.000150748191073 -0.000251680652074 -0.000736235083653
-703 0.000755439015836 0.000523636398554 0.000138404580364
-704 0.000504605658963 -0.000159451972718 -0.000411700962022
-705 0.000906303649887 -0.000216645798531 0.000332069975823
-706 0.000519042096356 -0.0010429163174 -9.81648309282e-05
-707 -2.4324814673e-05 -0.000323934181679 -0.000211649086774
-708 0.000169303181195 -0.000294488914256 -0.00143838439117
-709 -0.000274007343084 0.00107727492063 -0.00110311651756
-710 -0.000752371334681 -0.000601222339218 -0.00055071935027
-711 0.000996002493432 -0.000867500745281 -1.93068383516e-05
-712 -0.000327293866612 -5.63519286636e-05 0.000254939708064
-713 -0.000810915062859 0.00178065307403 -0.00140729172143
-714 7.7055252289e-05 0.000377459940512 0.000724196718595
-715 0.000372754623673 0.000505017662911 0.0006971274991
-716 -0.000610872570232 -4.33196601737e-05 0.000716956177831
-717 0.000807380456868 -5.78484550917e-05 0.000379302416677
-718 -0.000652970070039 -0.00105953471926 -0.000214607929445
-719 0.000804404483867 0.000575496304152 -0.000551621546457
-720 0.000119746025126 0.000511023628138 -0.00129496665109
-721 -0.000497491677519 -1.00793392014e-06 0.000591458163753
-722 -0.00143522312749 0.000403423525933 -0.000108088749775
-723 -0.000797490974197 0.000336945950168 6.40408039731e-05
-724 -0.000794639303534 -0.00242233165569 0.000610246596479
-725 7.21291124776e-05 4.06057619515e-05 0.000479835269906
-726 -0.000266646749763 5.23899618386e-05 0.000421465167704
-727 -0.000703514717085 -0.000421234605317 0.00199451698947
-728 -0.00044751864382 -0.000277098154417 -0.000269443730398
-729 0.000478313713487 -1.89876474181e-05 0.000696916434761
-730 0.000524836490236 0.00032106049759 0.000183972488366
-731 -0.000642547209588 1.86619295154e-05 0.000328189583461
-732 0.000902708914427 0.000156675056364 -0.00103054960129
-733 -0.000456014194449 -0.0001390932024 0.000273005377277
-734 -0.000328539693834 -0.00062334244164 -0.000374987134622
-735 0.000274174828657 0.00167471248868 0.00064779793577
-736 -0.000149341129393 9.4470640305e-05 -0.0012063547891
-737 0.000938687363338 0.00106786727568 0.000584057143098
-738 -0.000190497849528 -0.00101107890896 0.000251232934852
-739 -0.000897045698221 -0.000393386210704 0.000170532476738
-740 1.70140779998e-05 0.00118883223515 0.000561101792169
-741 0.000208452475571 -9.81170851684e-05 -0.000179501825732
-742 -0.000313070911027 -0.000798406430188 0.000500698468378
-743 -0.000457126844856 -0.000793092058653 0.000238853135534
-744 -0.000432015533948 0.00060522468873 -0.000575278355942
-745 0.000342685839826 -0.000353097695883 0.000505013957807
-746 0.000324018256825 0.000535370249985 9.92765765552e-05
-747 -0.000125658605852 -0.000562160762009 -0.00045694190761
-748 -1.68146818126e-05 -0.00103960380358 0.000280481910537
-749 0.000399858431338 -0.000769599022949 0.00123071095384
-750 2.23942545081e-05 -0.000169222624927 0.000822539603443
-751 0.000321899650883 0.000240049849167 -0.0009235975459
-752 -0.000544961045295 -0.00115152427007 0.000835623978865
-753 0.000674459962482 -0.000344790365109 -0.000764865601254
-754 5.03801392972e-05 0.000316169607796 -0.000331313743728
-755 -0.000387201196794 0.000398352940889 0.000566231931307
-756 0.000230633229148 3.02422858453e-05 -0.000226031101176
-757 -0.000163632312048 0.000581825335764 0.0003615578226
-758 -0.000312033286048 0.000650942464444 0.000836598516166
-759 -0.000428390509234 0.000244322979492 0.000624833010909
-760 -0.000316258993779 -0.000480010674615 -0.000760920475033
-761 0 0 0
-762 0 0 0
-763 0 0 0
-764 0 0 0
-765 0 0 0
-766 0 0 0
-767 0 0 0
-768 0 0 0
-769 0 0 0
-770 0 0 0
-771 0 0 0
-772 0 0 0
-773 0 0 0
-774 0 0 0
-775 0 0 0
-776 0 0 0
-777 0.000422913750215 0.000898454846512 0.00087172435543
-778 -0.000744305305284 -0.00107911574 0.00055973214231
-779 0.000452159289289 0.000409667390102 0.000274012778122
-780 8.90013412364e-05 -0.000619420821455 -0.000891343155027
-781 0.000379900503698 0.000498129863604 0.000645995573535
-782 4.50728534065e-05 -0.000523448417687 8.53324100056e-05
-783 -0.000495034204936 0.000440949323228 5.32692136098e-05
-784 0.000118084662069 -0.000857362137037 0.00109976224406
-785 -0.000309324930972 -0.00123852386784 4.87690756926e-05
-786 -0.000494891140957 0.000359528388874 1.79122774987e-05
-787 0.000220035162553 0.0016547619012 6.70869967406e-05
-788 0.000543930003437 -0.000878457829141 -0.00049069328743
-789 0.000232033089264 0.000348958131946 0.000381381951156
-790 -0.000835324650957 -0.000103273582103 -0.00104190513184
-791 -0.000524161925938 -0.000472626343856 0.000274567538209
-792 0.00108052154957 0.000256949162422 -0.000154832365898
-793 0.00121443816902 0.000505239235585 -6.5874930855e-05
-794 -0.000411218032902 -0.000403346390105 -0.000261709218327
-795 -0.000205028923452 -0.000520184805601 -0.000430899686685
-796 -0.000426342148457 0.000252433154972 0.000472979352304
-797 0.000973645110135 -0.000162492933566 0.000192999123014
-798 8.08780603312e-05 -0.000151114422659 0.000556255405265
-799 -0.000680952862048 -0.000501120630805 -0.000558149525153
-800 6.3703124424e-05 -0.00108340137069 -8.63312245882e-05
-801 -0.000958717420466 -0.00120548051329 0.000543872922385
-802 -0.000637649743237 -0.000984783122184 -0.000642337828039
-803 0.000426138097011 -0.000342657236305 -0.000349488864701
-804 -0.00054541812151 -0.000599328782788 0.000146355774835
-805 6.42904035682e-05 0.000432576979345 0.00112533325493
-806 0.000505166528334 -0.000572342694923 -0.000980926965799
-807 0.000387597272631 0.00108248961891 0.001619192304
-808 0.000683442623854 0.000368198343801 -3.76867979304e-05
-809 0.000377856466026 0.000663503581592 0.000505687971186
-810 0.00047699969737 4.60727641296e-05 -0.000411277212222
-811 0.000341074783289 -0.000232095264991 0.000361348281783
-812 -0.000930335509958 0.00110140983242 -2.38811030507e-05
-813 -3.35658244165e-05 -0.00055081100143 9.51186730791e-05
-814 0.000203724875114 -0.00024713235356 -0.000813819811841
-815 0.00152678632139 0.000147619779281 -0.000620246891967
-816 -0.000504270442919 0.00118540976455 0.000281208097258
-817 -0.000920362142829 -0.000393950083173 0.000485256315517
-818 -0.000190976125167 0.000758982733228 -0.000211873065629
-819 0.000120999909254 -0.00106009702613 -0.000292323445368
-820 0.000753489926811 0.000391000079586 -2.97528257384e-05
-821 0.00083479462817 0.00139537188734 6.69867341757e-05
-822 0.000435061189032 0.000331437306419 0.000452374425255
-823 -0.000588666900495 -5.47515854304e-05 -0.000443774710499
-824 0.000523911263655 0.000185626728595 -0.000526223968299
-825 -0.0006050890434 0.000556173525137 0.000506735635525
-826 0.00117646794083 -0.00102675710815 -0.000239651204983
-827 0.000220776094878 0.000680386689978 -0.00101583337635
-828 -0.000334282979312 -0.000670096993143 -0.000455377613225
-829 0.00108713187517 0.00163134850049 0.000227680320437
-830 -0.000800894485775 -0.000412298067174 -0.000177172656432
-831 -0.000337394538403 0.000673329959587 -0.000192610989357
-832 -0.00121562703185 0.000795037896866 0.000288165965327
-833 -0.000869729230632 -0.000379104620889 -0.000419439082754
-834 0.000528976049044 -2.41546971957e-05 0.000772821837261
-835 0.000468788223034 -0.000610010348531 0.00101120206006
-836 -0.000272336610023 -0.000421376799839 0.000401014100644
-837 0.000391260508161 8.57382965631e-05 -0.000264298850023
-838 -2.02037528916e-05 -8.49997488681e-05 -0.00132771231367
-839 0.00159257055491 0.000600372297412 -0.000595927008491
-840 7.94683950106e-05 0.00101681991225 0.000596095264965
-841 0.000606557893893 0.000123761079571 0.000330974968927
-842 -0.000708561109325 0.000307036838771 0.000556137017814
-843 0.00118837270455 -0.000458404647769 -0.000374938030408
-844 0.000464513046182 0.000600225844322 0.00179029308878
-845 0.000206505535646 -0.00129126398704 -0.000241301595989
-846 -0.00100068758885 -5.38064013378e-05 -0.000410328534304
-847 -0.000139928683398 7.00523213923e-05 7.22918398295e-05
-848 -0.000588924597497 0.000720967588812 0.000627128977631
-849 -0.000108227193627 -0.000112563223653 0.000476431189199
-850 -0.000299871388857 -0.000370434716163 -0.000111103063385
-851 -0.000372970375617 0.00200028075745 0.000171217032521
-852 -0.00071428686547 0.000658251234005 -0.000400984670431
-853 0.000904681360491 -0.000375351656082 0.000108619180997
-854 -0.00070040107427 0.0013270798112 4.24678277871e-05
-855 0.00081817478034 -0.00107087130936 -0.000645508048294
-856 0.000468904190179 -0.00095038045522 0.000278488756739
-857 0 0 0
-858 0 0 0
-859 0 0 0
-860 0 0 0
-861 0 0 0
-862 0 0 0
-863 0 0 0
-864 0 0 0
-865 0 0 0
-866 0 0 0
-867 0 0 0
-868 0 0 0
-869 0 0 0
-870 0 0 0
-871 0 0 0
-872 0 0 0
-873 0.000394528782274 -0.00125888312571 -0.00096071414376
-874 -0.000388567327033 -9.7514119484e-05 -0.000792547294877
-875 0.000994135458316 -0.000919953719544 -0.000110230084593
-876 2.19077523601e-05 -0.000279434741079 0.000223444520829
-877 -1.90579055359e-05 -0.000290558213198 -0.00149443826745
-878 -0.000496122463084 0.000279709151322 0.000380375273594
-879 0.000373411309166 -0.000461462306493 0.000897471064099
-880 -6.97719612331e-05 -0.00109613798786 -5.22944135328e-05
-881 -7.50269338512e-05 -0.000111583726313 -0.000780804947429
-882 -9.90515332513e-05 0.00044595112181 -0.000148831635487
-883 2.13372544396e-05 -0.00013915424583 0.000753433377773
-884 0.000634812752897 -0.00127263936631 -0.00110216876679
-885 0.000388397791717 -0.000252453408651 -0.00148879983581
-886 0.000613748631023 0.000322117935422 0.000299666695199
-887 0.00140104601497 0.000797066949905 0.000701728392107
-888 0.000546022927362 0.000392557817847 -0.000462912861284
-889 0.000434694655885 -0.000906481858318 0.000608020356185
-890 0.000612534088409 -0.000791361318547 -7.48515727591e-05
-891 -5.05660171747e-05 -0.000969833615199 0.000209469140576
-892 -0.00165859214245 -0.000853369219669 -8.85351025894e-05
-893 -0.000786307868906 -0.000408744138508 9.22549545744e-05
-894 -0.000398085329149 0.000663273877735 -0.00049005163254
-895 -0.00044253359194 4.97034798184e-05 0.00137024646983
-896 0.000834795502843 0.000511734224973 -0.00145203744252
-897 -0.000712942334431 0.000574231986808 -0.000332250644638
-898 -0.0013697493277 0.000309197744602 -0.000383281922303
-899 0.0010443089468 0.00113228722393 -0.000376701263762
-900 -0.000804620974915 -0.000255464573497 -0.000691606244688
-901 7.62862882302e-05 0.00012403198644 -0.000558317886057
-902 -0.000115778701383 0.00166611639398 0.00011118296418
-903 -0.000330534196473 -0.000536485038411 -0.000324344022294
-904 0.00108770975163 0.000451521316447 -0.000132068255426
-905 0.00139440640358 -4.23287051725e-06 0.000373992444966
-906 -0.00013675322577 0.000397576650474 -9.14217917037e-05
-907 0.000553969990598 0.000885875671328 -0.000869753919262
-908 -1.40942265731e-05 0.000223182084141 -0.000600834603392
-909 0.000887791163089 0.000993479863041 -0.000128106122961
-910 -0.000916471770499 0.00154999782445 0.000264955492911
-911 0.000214027674829 0.000422107298679 -4.09183349129e-05
-912 0.000336530796429 -9.89113632779e-05 -0.000124477761992
-913 -0.00014245245971 -0.00069866917549 -0.00023116788546
-914 -0.00128942405067 0.00109293679605 7.28040380192e-05
-915 -0.000169879928506 -0.000397466473402 -0.000310578918314
-916 0.000600406916917 0.000132780124828 0.000518056635597
-917 -0.000331004594429 -0.00110090185957 -0.000206747666592
-918 -0.000246238332043 0.00067147562387 -0.000238342237828
-919 -0.000791793561677 2.32390725398e-05 -0.000685750917479
-920 -0.000135709522322 0.000780179753556 0.000499433495642
-921 0.000594198981839 -0.000622693143724 9.51765447188e-05
-922 -0.000222646718351 -0.000663832721091 0.000175552660616
-923 -0.000261938001526 0.000649276455506 8.68179235895e-05
-924 -0.000869910967647 0.00123933832112 -3.58915580619e-05
-925 -0.000754317784534 0.00113032930402 -0.000557677877047
-926 -0.000338153455118 -0.000676566489564 0.000624033422364
-927 -0.0001387525539 -0.000404530739616 0.000906691969854
-928 -0.000691306645665 -3.17441055887e-05 -0.00102029648505
-929 -0.00111058896459 -0.000510881950519 0.000449782538107
-930 -0.000371748885868 -0.00144115671433 -0.00101066064435
-931 -0.000938035675507 0.000556459131585 -0.00171221768225
-932 0.000128108796143 0.000404672728234 0.000465256404552
-933 -0.000454733475295 0.000499657180977 -0.000737638233872
-934 0.00117197469388 -0.000344347689392 -0.000610334722914
-935 0.000849020721505 -5.53994091156e-05 0.000125180076464
-936 0.00193500069083 0.000256555527392 -4.23964842793e-06
-937 -0.000913218472275 0.000134331564815 0.000647418634549
-938 -0.000620529670304 -0.000181557689217 -0.000993605209108
-939 -8.37976161262e-05 -0.000307928515509 0.000566495759785
-940 -0.000826512319743 0.000309683578403 -0.000304455166557
-941 -0.000256269476354 -0.000327396016567 -0.000459835151612
-942 0.000358628036419 -0.000188810599155 -9.51173247113e-05
-943 -0.00124391133999 -0.000773099344345 -0.000277595067308
-944 -0.000627658775185 -0.000812463073608 0.000452817164917
-945 0.00138131489117 -0.000119459158732 7.7814185026e-05
-946 -0.00125294832502 -0.000176366473963 -0.00116660963644
-947 -0.000361672884677 0.000781127080334 -0.000368384635795
-948 -0.000823555901467 -0.000103488018708 0.000491927584537
-949 0.000677721724981 -0.000410567924802 2.25317086581e-05
-950 -0.000400632285999 -0.00116677876658 0.000442796983606
-951 -0.000149486799763 0.000483504915309 0.000892850581718
-952 -0.00049638220879 -0.000209591900707 0.000694911767751
-953 0 0 0
-954 0 0 0
-955 0 0 0
-956 0 0 0
-957 0 0 0
-958 0 0 0
-959 0 0 0
-960 0 0 0
-961 0 0 0
-962 0 0 0
-963 0 0 0
-964 0 0 0
-965 0 0 0
-966 0 0 0
-967 0 0 0
-968 0 0 0
-969 0.000526160381583 0.000500269121663 0.000223819051277
-970 0.0007904922663 -0.000564871313828 -0.000987626645239
-971 -6.59489829817e-05 0.000220765487503 0.000708655775591
-972 -0.000778971490989 2.53081698954e-05 -0.000130076465807
-973 0.00023062087673 -0.000158455668213 -1.88372018501e-05
-974 0.000240538252349 -0.00045655252313 0.000246806417545
-975 4.26004123496e-05 -0.000373827233736 -0.000255643859702
-976 -0.000137179845184 -7.9944632784e-05 -0.00119458219966
-977 -9.87743008325e-05 0.00125539992201 -0.0007362162325
-978 0.000647083203591 -0.000876519368052 0.000320587565352
-979 0.000887915819795 0.00134719135229 0.000395338254465
-980 0.00012648681088 0.000589622224935 -0.000106871303315
-981 0.000342415959454 -3.93451810354e-05 0.000565732677495
-982 0.000387703752428 -0.000796902557432 0.000502498940957
-983 -0.000423423301781 -0.000673513543835 0.000143822801438
-984 3.58704662688e-05 -9.12353590134e-06 0.0003036175746
-985 9.61462213992e-05 -0.000649555155725 -0.000936113452328
-986 0.000414982444954 -0.00031749806085 0.00138975061828
-987 -0.000179090139033 0.000842187616248 -3.35701277563e-05
-988 0.000423628686989 -0.000496820132375 7.4946295497e-05
-989 -0.00103363636897 -0.000813984947078 -0.000208786567627
-990 -0.000899958115072 0.00158636315278 0.000164927982688
-991 -0.000690103320006 0.000133800818714 -0.000245768362378
-992 -0.000436026005805 -3.92078886124e-06 0.000690313058668
-993 -0.00142198942934 -0.000490130713138 0.000260495969906
-994 0.000442613557215 -0.000240750369015 -0.000428735573826
-995 -0.000428258135786 -0.00021024676227 0.000657662770852
-996 -0.000884746500774 -0.000292246399424 0.000393558510237
-997 0.000660178341399 -0.000935126712734 -0.000918762421204
-998 0.000231484204345 0.000233769263318 -0.000442961501734
-999 -0.000323607829547 -0.00110162083696 0.00109132470548
-1000 0.000446711406416 0.000305954277985 -0.000235756866454
-1001 -0.00128950760835 -0.00081673171905 -5.04606688287e-05
-1002 -0.00027624869255 -4.86578427366e-05 -0.00047131107155
-1003 0.000629037590126 -0.000621772024911 0.00132687054439
-1004 -0.000187362017633 -0.00012258769111 -0.000759122911642
-1005 2.48885777049e-05 -0.000355318213068 0.000634784262326
-1006 -0.000978369653604 -0.000174593965531 -0.000655278463516
-1007 -0.00097821176862 -0.000442650768364 0.000318961679825
-1008 0.000360936827929 -0.000101525532006 0.00123784783679
-1009 2.83535166769e-05 0.000966987272016 0.000697660186982
-1010 -0.00037036908281 -0.000427575307254 -0.000496053373537
-1011 0.000334238481934 -0.00118692155049 0.00167769293331
-1012 -6.69528692114e-05 -0.000295886627583 -0.000895790170989
-1013 0.000213715215766 -0.000195764538399 0.000535885944948
-1014 -0.000838113450561 7.69792002893e-05 0.000639490992446
-1015 -0.000640765582187 -0.000402370664067 -0.000403329486389
-1016 -0.000808490281778 -0.000176169299743 0.000177512832958
-1017 -0.000716025824471 -0.00103981866024 0.00132892356167
-1018 -0.0002447295369 0.000907404437875 0.000230542519296
-1019 -4.66790204155e-05 0.000412658913039 0.000457480990169
-1020 0.000121211408353 -0.000818117182703 0.000370211330637
-1021 0.0005009422704 0.00116872692643 0.000748319895124
-1022 -0.000690526892311 0.000403612070308 -0.000712047419432
-1023 0.000493271966107 -0.00108472292918 6.22009235797e-05
-1024 -0.000668130490914 -0.000663756604583 -0.00119055014365
-1025 0.000115214751811 0.000334493831545 -0.000111716570604
-1026 -2.78624155719e-05 -0.000144126243127 0.00059284288193
-1027 -0.00065325903359 0.000689028416567 0.000958897609162
-1028 -0.000122296671506 -0.000966557763898 0.000415843696723
-1029 0.000681589126969 0.000613290361017 0.000344544788741
-1030 -0.000296836233575 0.000667142923124 0.000550008073447
-1031 0.000679456547669 0.000184977473314 0.000469548073941
-1032 5.32596915339e-05 -8.15054178899e-05 0.000539525856799
-1033 -0.00048560924879 -0.000675495598272 -0.000244403934615
-1034 -0.000237383109717 0.000243481981293 -0.0003063538945
-1035 -0.000398646730948 0.000342103622211 0.000419449877773
-1036 -0.000987715868866 0.000821981554309 -0.000650101413403
-1037 0.00172643999938 -0.000188704902581 -0.000616496357186
-1038 0.000704942072404 0.000168538138166 7.66705196576e-05
-1039 -0.000203411002623 0.000848837199239 -0.000435692337103
-1040 0.00128125035385 0.000316719927775 -0.00101433712478
-1041 0.000196982012873 0.00015806359396 0.000505822381162
-1042 -0.000387578436505 -0.00105849966582 0.000110168082369
-1043 -0.000132546782155 -0.000104902286311 0.000389399323764
-1044 0.000188324156376 -0.000242495049601 5.73042664153e-05
-1045 -0.000254969123791 0.000745657638978 2.97534566312e-05
-1046 0.000363411204546 -0.000196541279852 -0.000648635591474
-1047 -0.000605671713214 -0.000259190696926 0.000178929612507
-1048 0.000127546761118 0.000532455567601 -9.65139416869e-05
-1049 0 0 0
-1050 0 0 0
-1051 0 0 0
-1052 0 0 0
-1053 0 0 0
-1054 0 0 0
-1055 0 0 0
-1056 0 0 0
-1057 0 0 0
-1058 0 0 0
-1059 0 0 0
-1060 0 0 0
-1061 0 0 0
-1062 0 0 0
-1063 0 0 0
-1064 0 0 0
-1065 0.000673921713415 -0.000487937553543 0.000508758459667
-1066 -8.39962746896e-05 0.00183543526833 0.00118372020246
-1067 0.00122985619488 -0.000118333518956 0.000423894501965
-1068 -0.000256422505775 0.000598158107824 -0.000676831399981
-1069 -0.00103844176076 0.00032541442825 0.000564682549837
-1070 -0.000365105857934 0.000624992798287 -0.000656813151486
-1071 -0.000533657832421 0.000365324433668 0.000802551923021
-1072 0.000141532550212 0.000218207421807 0.000278985234814
-1073 -0.000830381277448 8.72596590587e-05 0.000636333793834
-1074 0.000174946235881 -4.69905929621e-05 0.000359908045237
-1075 -0.000315250215855 0.000371053923221 0.000109938965214
-1076 -0.0005778693989 0.000372927762082 0.000139108253004
-1077 0.000136512305853 -0.000610175018755 0.000212228547579
-1078 -0.000253405438443 0.000190660253024 -0.00061811497302
-1079 -0.000104772942413 -0.00110410479909 -0.00103738005711
-1080 -0.000131152106775 0.000734873660755 0.000372080053982
-1081 0.000836055285238 1.40218732321e-05 0.000758918701078
-1082 0.000136075403958 0.000505864227619 -0.000636587690845
-1083 0.000846726549917 -0.00116653046938 0.000447654707772
-1084 -0.000497077214372 6.64027118385e-05 0.000184722162657
-1085 -0.000500251572563 -0.000122515170002 -0.00103094462248
-1086 0.000265423236338 -0.00039188334383 -0.00155004252402
-1087 0.0008510161657 0.000200072223157 0.000712340496448
-1088 -2.67548704546e-05 0.000716244951904 -0.000235803619143
-1089 -0.000265748285817 0.000243001857661 -0.00039651217745
-1090 -0.000327268347631 -0.000101243928732 1.59996677692e-05
-1091 0.000398153350545 -0.000383771648847 -0.000520782457436
-1092 -1.12273741083e-06 -8.79252351722e-06 -0.000689694059486
-1093 4.67572737781e-05 0.000699451376838 0.000267648622109
-1094 0.000696134717852 -0.000843818567722 -9.6768981013e-05
-1095 -0.000255278880929 -0.000391384347073 -0.000352600051275
-1096 0.000958441518858 -0.000170097262362 0.000245662658914
-1097 -0.000553391392975 0.000491905913747 0.00146395580493
-1098 0.000822451868431 0.000410621759648 -0.000320696018342
-1099 -0.000246958398532 0.000179856214056 0.000489795611126
-1100 -2.5808017835e-05 0.000942619256112 -0.000281026371735
-1101 -0.00104425903225 0.000148154298732 0.000566400670921
-1102 -8.09849855481e-05 -0.000672831466374 0.00131338635456
-1103 0.000878331126582 -0.00124868876905 0.000748308849279
-1104 0.000249723109491 -0.000199226447611 0.000128468901481
-1105 0.000126713913131 0.000584509375854 0.00125927442278
-1106 0.000184928252901 -0.000120315672341 -7.97341135149e-05
-1107 -0.00125993304926 -0.00012998845053 0.000160407612542
-1108 0.000100445641884 -0.00144076187456 0.000767847085625
-1109 0.000131203698411 -0.000242731518901 0.000722611434095
-1110 -0.000546928694866 0.000256268023442 7.36283659769e-05
-1111 -0.00160143958407 -0.000311439530067 0.000179447842034
-1112 -0.00101111348411 -8.2193683938e-06 -7.93735239983e-05
-1113 -6.96247268532e-05 -0.000271259477014 0.000196289985528
-1114 -0.000165183891689 -0.000195390838617 -0.000402605532601
-1115 -0.000904199593235 -0.00115183383636 -4.0607803907e-05
-1116 0.000405523598193 0.000570503440023 0.000600983104083
-1117 -0.00116967360976 -0.00014554605456 -0.000409720966389
-1118 0.000428738054888 -0.00092848915203 -0.000381512301806
-1119 -0.000652070852137 -3.35958037778e-05 -0.000917021408773
-1120 0.000320111738913 -0.00109274781626 0.000575014319488
-1121 0.000460106966926 -0.00189813587624 -0.000676397702464
-1122 1.49908550123e-05 -0.00168192190257 0.000971971592935
-1123 -0.000462289652149 -0.000769893012737 5.165730943e-05
-1124 -0.00022153576046 -0.000206450780579 -0.000432401980151
-1125 0.0008962969426 0.000483990660416 -0.000637482323177
-1126 -0.00147390181653 0.000660932543084 -0.000943065950905
-1127 -0.000142044998314 0.000562695441403 0.000271038084478
-1128 -0.00149992650939 0.000796973623299 0.000329573159327
-1129 -0.000135088071513 -0.000608667219134 -0.000627690813849
-1130 -0.000263996020698 -0.00112506024569 -0.000571515493574
-1131 -0.000776846470756 0.000395520716817 -0.0010886130746
-1132 -0.000650110752796 -0.000394187785613 7.75066827625e-05
-1133 -0.000628318560186 5.06904936665e-05 -0.00066376769682
-1134 8.80057604905e-06 -0.00102790940843 -0.000683946316795
-1135 -0.000287519767058 0.000145779462888 0.000184021076139
-1136 0.000684794843422 -0.000984274950248 0.000335663632692
-1137 0.000546550228807 -0.000340877517604 0.00105519435369
-1138 -0.0014480974818 7.39163485536e-05 4.09990788245e-05
-1139 -0.000146730609272 -0.000229894338598 0.00027040459424
-1140 -0.0004181551148 -0.00106897720825 0.000440308863451
-1141 -0.000193415263918 -0.000469742431007 -0.000942972717343
-1142 0.000695445507 -0.000220721063819 -0.000332368720926
-1143 -0.000422852782158 0.000726782203409 -0.000761797661703
-1144 0.00101808355354 0.000678007718723 0.000918939891835
-1145 0 0 0
-1146 0 0 0
-1147 0 0 0
-1148 0 0 0
-1149 0 0 0
-1150 0 0 0
-1151 0 0 0
-1152 0 0 0
-1153 0 0 0
-1154 0 0 0
-1155 0 0 0
-1156 0 0 0
-1157 0 0 0
-1158 0 0 0
-1159 0 0 0
-1160 0 0 0
-1161 -0.000161563794498 -0.00041969331193 -0.000556992452116
-1162 0.00104432997199 0.000449167287424 -0.000138392636484
-1163 0.00110510333952 0.000586917092107 0.000817306922107
-1164 0.000154848200436 0.000634780337511 -0.000518914716075
-1165 -0.000882193890584 2.36197677773e-05 0.000579724624363
-1166 -0.000139863030474 -0.000878217768886 0.000413078175462
-1167 0.000453186518129 4.16548279911e-05 0.000730414943009
-1168 0.000319798784672 0.00100402657166 -0.000901990798732
-1169 -0.000157080138838 0.000528849327072 -0.00051162229089
-1170 -0.000348199683156 -0.000782275624634 0.00151644887125
-1171 0.000934079118914 0.000488883566865 0.000271032191893
-1172 -0.000344868806871 -0.00043421021086 0.000514794704927
-1173 0.000675300540143 -0.000480425120529 -0.000184586601568
-1174 -0.000504781811188 -0.000690007842643 -0.000160357567875
-1175 -0.000651738375303 -5.64858463728e-05 -0.00121574999998
-1176 -0.000982543615638 -0.000199000214821 -0.00082330495774
-1177 0.000162809715102 7.07935376325e-05 5.90072318268e-05
-1178 -0.00078343887026 0.000334090087213 -0.000293641888564
-1179 0.000277092898518 -0.000132067591177 -0.00130359231567
-1180 -0.000694672329905 0.000115400239443 -0.000403404745127
-1181 0.000211611456605 0.00037307091338 -0.000178715453206
-1182 -0.000969974510482 0.000470361291765 -0.00028938952634
-1183 -0.00057568178074 -0.000567990237398 -0.000893015929806
-1184 -0.000281051996494 -0.00158813310498 0.000293885833035
-1185 0.000261096237522 0.000674395812107 -0.000330761345156
-1186 -0.000240292820004 0.000912937278199 0.000356482929319
-1187 0.000542131589242 0.000342501149151 0.00109147504986
-1188 0.000146987153513 -0.00109805834089 -0.000801302146804
-1189 0.00040607202641 -0.000109528406445 3.66978463529e-05
-1190 0.000633811900863 0.00047756856637 8.78973298144e-05
-1191 -5.74252535099e-06 0.000258563577965 -0.000100086151517
-1192 -2.44661317663e-06 0.000580055387911 0.000433208217877
-1193 -5.98519687761e-05 -0.000278324840997 -0.000543893514763
-1194 -0.000666695822239 0.000239262167629 0.00118249160494
-1195 0.000588256924561 0.00110556439741 -8.58001254548e-05
-1196 0.000336013103453 0.000697633961576 -0.00124210806467
-1197 0.00173450754524 -0.00111674022414 -3.1522799464e-05
-1198 -0.000561797815179 0.000829231336923 -8.43845965941e-05
-1199 0.000197557848229 0.000549885784319 0.000135334412719
-1200 0.000112706746513 -0.00096104073389 -0.000735922022392
-1201 -0.00116434268893 -3.36204111591e-05 -0.000667671151409
-1202 -0.000107532128731 0.000532693784554 -0.000637997499567
-1203 -0.000484748070392 0.000428125315921 -0.000451597907227
-1204 -0.000444571718445 0.000499957000145 0.0014192125673
-1205 -0.000655187949779 0.00140128161113 0.000394167946192
-1206 0.000665623377684 0.000574473487268 -2.91143833903e-05
-1207 0.000264578613655 -0.00036315539686 -0.00121488584865
-1208 0.000331646614868 0.000357685757497 0.000349610410474
-1209 1.98240451744e-05 -0.000716396335046 0.000444371974031
-1210 0.000910479993061 0.000276093738545 -0.000417956716154
-1211 9.49063262859e-05 -0.000538150410264 -0.00201471141001
-1212 0.000557893164085 -0.00033842875932 0.000353572910339
-1213 -0.000309659684479 0.000299616425388 5.60088188825e-05
-1214 0.000875335906597 0.000606680593904 -2.08034134618e-05
-1215 -0.000294337157499 0.000587398920842 3.7632216903e-05
-1216 0.00062126659047 0.000510199981551 0.000145547046645
-1217 0.000145096868764 0.000300599039451 -0.000919578301987
-1218 0.000404399673802 0.000268492763969 -0.000718401474804
-1219 0.000420465685542 0.000893616025185 0.000154615705834
-1220 -0.000394810657884 -0.000370104653271 -0.000825839748739
-1221 -0.000651604002339 -0.00118629136981 0.000864383744364
-1222 -0.000903721580607 0.000538540435124 -6.40424745155e-05
-1223 5.93552999001e-05 -0.000384170403191 -0.000371682409223
-1224 -0.000215706260171 0.000196272004168 0.000753382695128
-1225 0.000382681780441 0.000196696021406 -0.000693405073212
-1226 -4.05119066248e-05 0.00058939850037 0.000118957729567
-1227 -0.000299119802361 0.000269909923669 -0.00137946524709
-1228 0.000193575863645 -0.000777749973659 0.000278732385308
-1229 -0.00041701400742 0.000369899527941 0.000875626068082
-1230 -5.31453408381e-05 -0.000554028793194 -0.000626029627062
-1231 3.37695389152e-05 0.00023649983973 0.000515711426202
-1232 0.00121991223025 -0.000506364011574 0.000347566543046
-1233 0.000735102536155 0.00095988929488 -0.000182635141402
-1234 0.000713708319344 0.000970491574148 0.000259044856271
-1235 -0.000230783061928 0.000416345969213 0.000825263546561
-1236 -0.000434427064263 0.000531166609586 -0.00143528986995
-1237 0.000899607796822 -0.000232614707071 0.000568123158933
-1238 -0.00035105720428 0.00228153060438 -8.01207961443e-05
-1239 -0.000693909917159 -2.39039292127e-05 0.000596483705928
-1240 0.00045293617987 0.000318736100969 -0.000498593398852
-1241 0 0 0
-1242 0 0 0
-1243 0 0 0
-1244 0 0 0
-1245 0 0 0
-1246 0 0 0
-1247 0 0 0
-1248 0 0 0
-1249 0 0 0
-1250 0 0 0
-1251 0 0 0
-1252 0 0 0
-1253 0 0 0
-1254 0 0 0
-1255 0 0 0
-1256 0 0 0
-1257 0.000268680983252 -0.000383360242826 0.000853212031378
-1258 -0.000313508770695 -9.44334363615e-05 0.000625446962888
-1259 -4.80454340929e-05 -0.000906292874754 -0.000146148920551
-1260 0.000508934998675 -0.000938379620844 4.31474071993e-05
-1261 0.00092977783216 -0.000443937975196 0.000182275091336
-1262 0.000646701731707 -0.000317622230762 0.000523544889518
-1263 -0.00078580530506 0.000739692356971 0.000257879510869
-1264 -0.000256126444858 -0.000346046347725 0.00021475068001
-1265 0.00162834320553 0.00109149349253 -0.000279026463972
-1266 -9.84059145757e-05 -0.000405337020973 -0.000748478626904
-1267 0.00108829953843 -0.000451531172948 -0.000301313710979
-1268 0.000248901955934 0.000288427798719 0.000235117131288
-1269 -5.16315234017e-05 0.000419572302537 -0.000568680912451
-1270 -0.000911913259422 -0.000277465287404 0.000399084427464
-1271 -0.000563248682304 -0.000413940118897 0.000499280254254
-1272 -0.00027025211047 -0.000161822208875 -7.5568673539e-05
-1273 0.000233465931653 0.000334515180185 -0.000178485979443
-1274 -0.000431381853923 0.000365980360635 0.000205636902304
-1275 0.000240622158082 0.00173255187271 7.36515938036e-05
-1276 -0.000488000520806 -0.000417304551897 0.000110247868048
-1277 -0.000159952285503 0.00136594368158 -0.0012893498687
-1278 -0.000403312897594 -0.000299936818782 -0.000620002037066
-1279 -0.000244407688381 -0.000417685728885 -0.000306164987065
-1280 -0.00101366023116 -0.000137072389242 -0.00130725532531
-1281 0.000123341852058 -0.000254718513142 0.000675658378151
-1282 -0.000378109231088 0.000640745453858 -0.000385067561762
-1283 0.000381952174393 -5.98075225721e-05 0.000125616150469
-1284 -0.0004231931657 0.000145899656802 0.000879206757396
-1285 0.000495415162209 -0.000969051414267 0.000122577513172
-1286 -0.000469400482351 -0.000242798621966 -4.52007900025e-05
-1287 0.000917184882758 0.000311138371154 0.000252515514275
-1288 3.97143325737e-05 -0.000255250956576 -0.000365321290412
-1289 -7.14392910082e-05 0.000268657317369 -0.00187101683703
-1290 -3.26629742087e-05 -0.00125956692015 3.82557432453e-05
-1291 0.000548857854236 -0.000324215078233 -0.000427553560894
-1292 -0.000691217420823 -1.92126480225e-05 0.00057781187461
-1293 0.000292251821551 -0.000276003489877 0.000155404246774
-1294 0.000763034452283 0.000589644902624 0.000105326820666
-1295 0.000233173069056 -0.000169029664171 -0.000275604861646
-1296 -0.000258018572367 -0.000180418216936 -0.000151187670053
-1297 0.000631003790936 -0.00081209516058 0.000932571115829
-1298 -0.00055186504559 -0.000154512795187 0.000413862327937
-1299 -0.000385230643888 0.000144480517509 -0.00010496069305
-1300 -0.000136530928514 -0.000364328888655 2.21118811374e-05
-1301 -0.000263167780404 0.000402812493239 -0.000233581228506
-1302 -0.000285871845148 0.000670432973611 0.000377368459367
-1303 0.000374456736842 0.000276402690589 0.000463722447464
-1304 0.000344600456874 -1.84219125775e-05 -0.000657745292413
-1305 0.00105171227898 0.000340419497578 3.60117530749e-05
-1306 0.000969524595794 0.000908187548773 0.00122914491531
-1307 0.000113650688139 2.39085684399e-05 0.000492143328489
-1308 0.000698941892547 -0.000527861342743 0.00023802505645
-1309 -0.000209152659535 0.000445868746217 0.000405819635043
-1310 0.00148296110728 -0.000327339472151 -0.000245314531886
-1311 0.000173324192122 -0.00026344372976 -3.52414823145e-06
-1312 7.98105936409e-05 -0.000440871835031 -0.000452321215667
-1313 -0.000173178567775 -0.000561801672586 0.000520118918577
-1314 -0.000561169332212 -0.000416125976714 -0.000705320747574
-1315 0.000759966919931 0.000754173034993 -0.000440905077943
-1316 0.0012090374663 0.000264620405786 -0.00109049887271
-1317 -0.000806768964225 0.000249999372626 -0.00101733421197
-1318 -0.000157576518393 -0.000577886361463 0.000484375008293
-1319 0.000329532462274 -0.00080138440141 -0.00016683154977
-1320 0.000231261044222 -0.000596179398374 0.000379025799569
-1321 0.000437457528985 0.000149016388515 -0.000444359912625
-1322 -0.000667044749069 -0.00168568961473 -0.000157461744764
-1323 0.00012574112391 0.000234538441774 3.09353629141e-05
-1324 0.000584252328559 0.00100494479614 -0.000159247199909
-1325 -0.000683933565306 0.000663491738098 -0.000252638474744
-1326 7.9136305004e-05 5.88101309679e-05 0.00150710398218
-1327 0.000172006132996 -0.000149484814091 -0.000485017638074
-1328 -0.000266989613957 -0.000170524249948 0.00103670891738
-1329 0.00045072418767 -0.000235249869913 -0.000195044973888
-1330 0.000720676073183 8.71073139746e-05 -0.00064046589906
-1331 0.000777223843354 0.000336645924152 -5.61930652381e-05
-1332 0.000383578235435 0.000158842442828 -0.000746069486365
-1333 -0.00010449224452 0.000388765940687 0.00122988124586
-1334 -0.00161247571046 -0.000511883988533 0.000796960979087
-1335 -0.00052448332586 -9.1501664809e-05 -7.78792207697e-05
-1336 0.000537565645054 0.000273867825261 0.000518962098228
-1337 0 0 0
-1338 0 0 0
-1339 0 0 0
-1340 0 0 0
-1341 0 0 0
-1342 0 0 0
-1343 0 0 0
-1344 0 0 0
-1345 0 0 0
-1346 0 0 0
-1347 0 0 0
-1348 0 0 0
-1349 0 0 0
-1350 0 0 0
-1351 0 0 0
-1352 0 0 0
-1353 -0.000842050271361 0.000279358180154 0.000448212920382
-1354 -0.000143379469891 -0.00112068779303 0.0012090798395
-1355 -0.000369150709867 0.000382651237838 -0.000819663772694
-1356 0.00095095181524 0.000330924727932 -0.00132963504432
-1357 0.00045033836858 0.000240784548093 5.74333107081e-06
-1358 0.000549894477661 0.000770579040231 -0.0006047156814
-1359 0.00118076936008 -3.92195803475e-05 0.000251229346556
-1360 -0.000531180009199 0.000421720748993 -0.00043452567684
-1361 0.000954917045474 0.000773871177105 0.000758654919887
-1362 -0.000689410635524 0.000760089192708 -0.000886191880274
-1363 -0.000876015959152 0.000858878802886 -1.42909829617e-05
-1364 -0.00176629516211 0.000894440800259 0.000517421384431
-1365 0.000444147108231 9.8036095692e-06 0.000121696187108
-1366 4.27346578853e-05 -0.000680171478378 3.42658179478e-05
-1367 -0.000366941197524 0.00045510124511 1.218471965e-06
-1368 -0.00119545714305 0.00198247295601 -0.000324786939715
-1369 -0.000934169811217 0.000282638915834 0.000213725579655
-1370 -0.00071418682105 -0.000990891429799 0.000947680585422
-1371 -6.85962237588e-05 0.000124250163359 -0.000272266984303
-1372 -0.000593199680025 -0.000213215563271 -0.00070201763078
-1373 -4.39753307224e-05 0.000604344379866 0.000297256533513
-1374 -0.000802373379611 -0.000317618436636 0.00015293518274
-1375 -0.00030568284876 0.000196259542153 -0.000671883993622
-1376 -0.000460175841755 0.000449933081716 0.00118044731289
-1377 0.000370902956939 0.000130984043579 -0.00100232601908
-1378 -0.000989723325053 -4.96007416737e-05 0.0011399520344
-1379 -0.000513303462405 -0.000283772861488 -0.000458194602968
-1380 -0.000448711271278 -0.000576515699936 -0.000592495303523
-1381 -2.31948448131e-06 0.000976736570068 -0.000160448627516
-1382 -0.00103644292377 0.000633296123631 -0.000419057074743
-1383 0.0002845265804 -0.000392508703816 -0.000849093705811
-1384 -0.000662456162364 0.000153715679886 -0.000613153579949
-1385 -0.000566230170059 3.06609916352e-05 -0.000545702431549
-1386 -0.000155651795755 0.000395964040199 0.000595360976392
-1387 -0.00190584535308 0.000241038764696 0.000373770458822
-1388 -7.35756868784e-05 0.000345217776803 0.000506985774957
-1389 -0.000157984344678 -0.000164333936638 -0.000399585269326
-1390 -0.000457915957733 0.000525463826812 -0.000643977323059
-1391 -0.000214843597582 0.000311260093376 7.08802413901e-05
-1392 0.000392182836306 -0.00144347675114 -0.000141461008901
-1393 0.000257708008392 0.00116385476392 -0.00111005839093
-1394 -0.000286453999879 -0.000304293587464 -0.000181887331473
-1395 -0.000436959519181 0.000455934015546 -0.000640054015529
-1396 -7.67761358331e-05 1.94831941066e-05 -0.000460808751919
-1397 0.00119393688669 0.000839912488826 -0.000359267574956
-1398 0.000944521325705 0.000178568525462 -0.000728975985086
-1399 -0.000697105572935 -8.30912691118e-05 -0.000430060741954
-1400 -0.000890065003165 0.000325354796951 -0.000617950067158
-1401 -0.000113635160456 -0.00105654570381 -0.00025218088553
-1402 -0.000863054097535 -0.000527767214956 -0.000505610779087
-1403 -0.000187690101247 0.00138600964402 -0.000247490522778
-1404 0.000331308004517 -0.000305982057572 0.000202562768583
-1405 -0.00063724471704 -0.000139154710732 0.000606614980531
-1406 -0.000650607317549 0.00066935128811 0.0010419666183
-1407 3.50212625646e-05 0.000123464496592 -7.14894175377e-05
-1408 -0.000160869814741 -0.000147808989377 2.43620587011e-05
-1409 0.000316808668476 0.00058259730701 -0.000426553448165
-1410 0.000135422806292 -0.000663921462527 -0.000473422239857
-1411 0.000157944442114 -0.00033285456422 0.000695222817061
-1412 -5.29514775112e-05 -0.000542125129178 0.0005874298095
-1413 -0.000142241066222 -0.00100672073372 0.00130802623512
-1414 0.00136500274499 -0.000885152015797 -0.000916721549687
-1415 -9.28609997823e-06 -0.000694762944908 -0.000739541580285
-1416 0.000742837474016 -0.00032308872957 0.000329837514609
-1417 0.000477762725826 -0.000547260172468 -8.02353911227e-05
-1418 0.000997884238057 6.27437002732e-05 9.99180244689e-05
-1419 -0.000235118001254 -1.42020932242e-05 -0.000479224165941
-1420 8.21516670886e-05 0.000470564246865 -0.000209402217568
-1421 -0.000662666098596 -7.85751434553e-05 0.000914476341925
-1422 0.00156958243466 -0.000741267240203 0.000683658495021
-1423 -0.000165976617012 0.000311112895453 -0.000370204511644
-1424 -0.00065418065278 -0.000269692762323 -0.000184632815533
-1425 -0.000257145644974 0.000325084904201 0.000826538681838
-1426 8.86867606037e-05 -0.00128320202755 0.00076919746347
-1427 -0.000540319508842 0.000641324280724 0.00148372530488
-1428 0.000308396696355 0.00115992133441 -0.000656504852797
-1429 -0.00141058988765 0.000590337796182 -0.00146037453092
-1430 0.000675896761804 0.000916815802833 0.00083664691961
-1431 0.000805011109864 -0.000181284562423 0.000183955734494
-1432 -0.000652626288951 -0.000332195875795 0.000108413215495
-1433 0 0 0
-1434 0 0 0
-1435 0 0 0
-1436 0 0 0
-1437 0 0 0
-1438 0 0 0
-1439 0 0 0
-1440 0 0 0
-1441 0 0 0
-1442 0 0 0
-1443 0 0 0
-1444 0 0 0
-1445 0 0 0
-1446 0 0 0
-1447 0 0 0
-1448 0 0 0
-1449 0.000493723449102 -0.000419962329146 -0.000351412492013
-1450 -0.00059332841803 -0.00118528731192 -0.0015278417367
-1451 0.000835654544127 5.61704927713e-05 -0.00105964206175
-1452 -3.18524858799e-05 -0.000640481553872 0.00117234566416
-1453 -0.000401141745089 7.57906290124e-05 0.000594884444703
-1454 0.000103419713103 -9.07554986889e-05 0.000612300421304
-1455 0.000270037531354 0.000559933849958 -0.000718967961659
-1456 0.00132475912564 -6.51359627283e-05 0.00027833344937
-1457 0.000103471837032 -0.000256771488913 0.000237700127186
-1458 -0.000318243371643 0.00059656256215 -0.000175605305121
-1459 -0.000162428158102 0.000356621589089 -2.23015798804e-05
-1460 -0.00102055708506 0.000354068230247 0.00122520725921
-1461 0.000244012922123 -0.000279788391012 0.000380924789923
-1462 0.000302914953458 -0.00018433226938 0.000512889634747
-1463 1.54959638893e-05 0.00131303594485 -0.00081430918336
-1464 -0.000228516975102 1.25482499748e-05 0.000406997650948
-1465 -0.000428064626375 0.00130206452583 -7.30527271704e-05
-1466 -0.00120735883162 9.96935200145e-05 0.000291706273942
-1467 -0.000197474225208 -0.000556400246337 -3.55609764941e-05
-1468 0.000848865450313 -0.000488777711012 -0.00032851430469
-1469 0.000468887703225 -0.000939071931678 -0.000579644510084
-1470 0.000792393834395 0.000748419473931 -0.000786684074777
-1471 -0.000195766287688 -0.000103940100223 0.000988178961386
-1472 -0.000255994686064 -0.000269816483587 0.000138792019023
-1473 -0.000717476249005 0.000363356345125 -0.000596709096511
-1474 -0.000114307259238 -0.000441919036008 -0.000214395977959
-1475 0.000237916878625 0.000351073370333 0.000189765391206
-1476 0.000468799194203 -0.000143674797187 3.02487758625e-05
-1477 -0.000984847127973 8.31516116942e-05 -7.02288564799e-05
-1478 -0.00100090746638 -0.000653263821017 -0.000165428845324
-1479 0.000130545864591 -0.000157358625284 0.000723726754999
-1480 0.000406991958018 0.000127423891466 0.000371489251473
-1481 -0.000258610825462 0.000482326670367 -4.46617946439e-05
-1482 0.000532551112589 0.000166369737267 -0.000344740581864
-1483 0.000624195837723 -0.000379850681789 -0.000186938899501
-1484 3.51772828635e-05 0.000147518526095 9.92293641505e-05
-1485 -3.32396378903e-05 -0.000530715533986 -0.00115233776489
-1486 0.000280146514127 0.000164020547571 0.000468194286835
-1487 -0.000568577407412 0.000204951537248 -0.000749361165942
-1488 0.000545125375188 -0.000337606320277 -0.000794102751089
-1489 0.000646014652942 0.00120615465433 -0.000452584649434
-1490 0.000317108398666 -0.000105968515289 -0.000390381720111
-1491 4.9410326585e-05 -0.000363098116814 -0.000714641848247
-1492 0.000904621763142 -0.00108727042596 -0.000632228710339
-1493 0.000151569420861 -0.000583790928055 -0.000261422285113
-1494 -0.000425194198419 0.000837291945286 -0.000235102645479
-1495 -0.00138645146658 -0.000403571618865 0.000155898012908
-1496 -9.89717273553e-05 -0.000885117451888 -0.000409222062434
-1497 -0.0015668432636 -0.00129377158576 -6.50725990331e-05
-1498 0.000211215210497 -0.000427224422237 0.000345500061025
-1499 0.00043300028105 0.000873776087432 -0.000132109405922
-1500 -0.000146226175352 0.000608154803364 0.000447588040347
-1501 -0.000785023842458 0.000725515022509 -0.000395901097296
-1502 -0.00125294539156 -0.000469859709241 -0.000231156427906
-1503 0.000355279804485 0.00153531299806 0.000161378111274
-1504 -0.000408191595779 0.000353420033142 -0.000348138570195
-1505 -4.20170091722e-05 -1.44075891143e-05 0.000286335029338
-1506 -0.00054819103665 0.000200874148912 0.000216743314645
-1507 -0.000394997491101 -0.000856201285642 -6.36581512513e-07
-1508 -4.41734577473e-05 -0.000678817891607 8.49054245764e-05
-1509 0.000168524032685 0.000392271079056 3.78432402066e-05
-1510 -0.00034870716935 0.00106959210177 0.000312861985312
-1511 0.000960750886659 -5.64696034099e-05 0.000712977482705
-1512 -5.90420191517e-05 0.00078298451173 -0.000561476621516
-1513 0.000210011330591 -0.000534548000735 0.000635541828307
-1514 -0.000449249037379 0.000434714706239 -5.1084852074e-05
-1515 -0.00149408260264 -0.000297154846122 0.000288768856553
-1516 1.4311206717e-05 0.0010468296864 -0.000421686485266
-1517 -0.00154011039647 0.000985982079326 -0.000643685283341
-1518 -0.000730660668077 -4.44271763372e-07 -1.64664628747e-05
-1519 0.000177547959253 0.00103494907206 -0.000520677755935
-1520 0.000121787301554 -0.000327236587875 -9.66394139395e-05
-1521 0.0011762996169 0.00014276443243 0.000145097932848
-1522 -0.000414734431447 0.000729388609555 -0.000954128876823
-1523 -0.000510079315381 -6.27861106236e-07 -0.000494196499662
-1524 9.91474013897e-07 -0.000146948580916 0.000511969375604
-1525 -0.000621699092723 -0.000448795534176 -9.42060968977e-06
-1526 -3.93802318909e-05 0.000731588273894 -0.000302806999875
-1527 0.00186064045322 0.000171701581425 -0.000138866216839
-1528 -0.000846796171987 0.000801281824593 -0.000339955939767
-1529 0 0 0
-1530 0 0 0
-1531 0 0 0
-1532 0 0 0
-1533 0 0 0
-1534 0 0 0
-1535 0 0 0
-1536 0 0 0
-1537 0 0 0
-1538 0 0 0
-1539 0 0 0
-1540 0 0 0
-1541 0 0 0
-1542 0 0 0
-1543 0 0 0
-1544 0 0 0
-1545 0.00141890597709 -0.000595855324304 -0.000198951608731
-1546 0.000106672174605 0.000103404413539 0.000388553214568
-1547 0.000302987174791 0.000119779003392 0.000255274700292
-1548 -0.000182323578852 0.000220597327454 -0.0011604510314
-1549 0.000157123652337 0.000856983592761 8.29508956774e-05
-1550 0.000267997456954 0.00082192607878 -0.000823360852726
-1551 0.00070580677984 -0.000104147032993 4.2914904994e-05
-1552 0.00162161745609 0.000205327079948 0.0013278985592
-1553 -6.16174673546e-05 0.000644612161103 0.000349533939616
-1554 -0.000684961876521 -5.65945678855e-06 0.000316834248253
-1555 0.00011410984404 0.000263007304653 -0.000188441985966
-1556 -0.000888363262275 -0.0001771308925 0.000552804592926
-1557 -0.000380941640435 -0.000649578949379 0.000531350011991
-1558 0.000288404307108 -0.000253084473089 0.000448040864061
-1559 0.000183341613193 -8.66490063001e-05 0.000199920542533
-1560 0.000448946536537 -0.000295775978385 0.000686011525677
-1561 0.000889697160319 0.000304353409897 0.00051061142582
-1562 0.00050670995272 -0.00035137945194 0.000276369925127
-1563 8.8208582457e-05 0.000467502650498 0.000424396046907
-1564 0.00134132792722 0.000594427261705 -0.000581222043566
-1565 0.00131757972854 0.000453493819426 0.00116630572287
-1566 0.000117455877989 0.00019507745629 -0.000952159800669
-1567 -0.000893060014322 0.000708036285511 -0.000453793944448
-1568 0.000201083654691 0.00130564583946 0.00110768730451
-1569 0.000534070232979 -0.000881050721673 -0.000723161104151
-1570 0.000312484484898 0.00030935719478 9.9769916594e-05
-1571 5.99671105167e-05 -0.000480682936342 0.000459449153515
-1572 0.000235916891342 -0.00106530544557 -0.00106796232288
-1573 0.000401058642608 -0.000996161220847 0.000144378161003
-1574 -0.000108668714752 0.00110226800395 0.00122791184142
-1575 4.60037123638e-05 0.000282177487109 -0.000292016098503
-1576 -0.000864593726404 -0.00151624562657 0.000633782076552
-1577 0.000321927219197 -0.000391280488692 0.000829697964374
-1578 -0.000304439293083 7.91706609579e-05 -0.000490603916042
-1579 -0.000378748911799 0.000613520680531 0.000159493260909
-1580 -0.00031617775511 0.000562906382041 -0.000834871181044
-1581 -0.000184311247191 0.000509710954383 -0.000181922614085
-1582 -3.60869252934e-05 6.82838938436e-05 -0.000318163417172
-1583 -0.000152929811943 0.000305175588784 -2.79870340829e-05
-1584 0.000870730106558 -0.000404275529841 -0.00196004995171
-1585 0.00123687860969 -0.000672650803801 8.32774844212e-05
-1586 0.000198973224228 0.000370108475787 -0.000253882191447
-1587 -0.000303158466462 -0.000710390594523 -5.41764581924e-05
-1588 -0.000276744567197 -0.000958137509869 0.00102178053572
-1589 -6.53046660892e-05 0.000469454805512 -0.000465682855579
-1590 -0.00100351607159 -0.000353393626672 -0.000220479734509
-1591 0.00113719747146 0.000201488268343 0.00111277506448
-1592 0.000277604808808 0.000899497547607 -0.000415795405674
-1593 -0.000257756005973 0.000228183166454 0.000122606784736
-1594 0.000324819653975 -0.000845354495803 -0.000253629595179
-1595 8.67372074436e-05 0.000124180111521 4.13656656834e-05
-1596 0.000908916953351 0.000736347627467 -0.000812750760454
-1597 0.000371220167084 -9.68486412392e-06 -0.000849432266143
-1598 -0.000790378783673 -0.000116748122961 0.00110331831345
-1599 -0.000258572051567 0.000886151888328 -0.00159418599098
-1600 -0.00104914895139 0.000196638671999 -0.000208705896244
-1601 -0.000154836603276 0.00098439137274 0.000855146268815
-1602 -2.60073959329e-05 0.000537336782276 -2.71230624208e-05
-1603 -0.00148433878214 -0.00181783491094 0.000620288966564
-1604 -0.000238533863408 7.61853664897e-05 -0.000622852697972
-1605 -0.000222232786639 -2.28341257064e-05 -0.000126318250648
-1606 -0.000952792569656 0.00138800963277 -0.00155008240497
-1607 -0.00162477153194 -0.000962620720658 0.000976220523958
-1608 0.000605240666934 0.000393576517353 -1.0165148877e-05
-1609 9.57001020514e-05 -0.000788297518987 0.000152676757146
-1610 -0.00036401502137 -0.000513741744334 -0.000712327009791
-1611 0.0012203788601 -0.000726593088284 0.000140230152715
-1612 -0.000957308524095 -0.000154559711169 -0.000618180991779
-1613 -0.000783482882781 0.000584178998208 0.000681228380857
-1614 -0.000584753704219 -9.13155087229e-05 4.23520680327e-05
-1615 -0.000353142087762 -0.00116385414718 0.00104809450736
-1616 9.83608671433e-05 0.00043596717853 -3.77129960137e-05
-1617 0.000204737538346 -0.000909158376698 0.000797169261765
-1618 -0.000612854725064 -0.00065365536056 0.00103101640121
-1619 0.000205512070542 0.00171625276398 -7.37992008118e-05
-1620 -0.00015581968797 -0.00174252503793 0.000969216336799
-1621 0.000725609303707 -0.000831275928621 0.000382708634791
-1622 -0.000442068747892 0.000805877926586 0.000638120566515
-1623 9.27306663182e-05 0.000230702264504 -0.000336679479859
-1624 0.000168055974364 -0.000397031615185 4.28014910549e-05
-1625 0 0 0
-1626 0 0 0
-1627 0 0 0
-1628 0 0 0
-1629 0 0 0
-1630 0 0 0
-1631 0 0 0
-1632 0 0 0
-1633 0 0 0
-1634 0 0 0
-1635 0 0 0
-1636 0 0 0
-1637 0 0 0
-1638 0 0 0
-1639 0 0 0
-1640 0 0 0
-1641 -0.000355069490138 -0.000938726834376 0.000317088197584
-1642 -0.000301754208188 0.001084379125 0.000650042537078
-1643 0.000313674006154 -0.000333786678979 -0.000673271343207
-1644 4.95048840527e-05 -4.10536268856e-05 0.00105952790588
-1645 0.000571105159312 0.000156292345502 1.96639693597e-05
-1646 0.000151939039432 0.000702898677543 0.000210870626613
-1647 -5.01101070272e-05 0.000344084129687 -0.000981915287899
-1648 0.000661335197637 -3.05027240734e-05 -0.000872289714066
-1649 -0.000614914664849 0.000768777665472 0.000933971269914
-1650 1.17675443095e-05 0.000308092179296 8.83295370649e-07
-1651 0.000206619132849 0.00021630013474 0.000989348903177
-1652 -3.65366793659e-05 0.000418943036952 0.000137570288394
-1653 -0.00105693241139 0.000287470347211 8.18754009237e-05
-1654 7.52331351988e-05 -0.000380965550678 -0.00044328695125
-1655 0.000504072045565 0.00045645759915 -0.000689766569516
-1656 0.000472463513297 -0.000959323688841 0.000373613523943
-1657 0.000581107781464 -0.000815738209134 -0.000902208185972
-1658 0.00169230562201 -0.000158951969127 -0.000368533469073
-1659 0.000552602360471 -0.000237913614169 0.000502312581092
-1660 0.00058372819334 -0.000710153242237 -0.000621307124385
-1661 -2.3907334828e-06 0.000477291864403 -0.00039713407971
-1662 0.000975445299313 0.000276996829075 0.00010459994712
-1663 -0.000176041702927 0.000868717076268 3.779529279e-05
-1664 0.000536786028641 -0.000799292220708 0.000506065814294
-1665 -0.000291615486638 0.00125566276419 -0.000549836793625
-1666 0.0011621534395 -0.000951986544634 -0.000144720248923
-1667 -3.17279671651e-05 -0.000369073730729 -0.000122282035265
-1668 0.00105172021277 -0.000537983573741 0.000485568110345
-1669 -0.000728885402845 0.00091384934425 3.61045057615e-05
-1670 4.3363847642e-05 0.000843492174761 0.000325540256882
-1671 0.000170888536581 -0.000714990124481 0.000167492021447
-1672 0.00075791155452 0.000307705078813 -0.000353693644809
-1673 0.000397490432066 0.000671982687226 -0.000503101130834
-1674 0.000498507535481 -4.00993286371e-05 -0.000559919183067
-1675 0.000352463423883 0.000600262015135 -0.000438796795101
-1676 -0.000682746310057 -0.000515050116136 -0.0012479505416
-1677 0.000491135623619 -0.0004580794135 -0.000707279115987
-1678 -0.000141474248018 -0.000350211138892 -0.000548731732361
-1679 0.00014483561258 0.000939969691501 0.0014266600752
-1680 0.00114898692854 -0.001373704552 -0.000816865749527
-1681 0.000620442780645 0.000507878210909 0.000607262140059
-1682 0.000132660153551 -0.000479151057027 -4.38374031811e-05
-1683 -0.00117161961771 6.85912873182e-05 0.000131820326658
-1684 0.000746742204439 -0.00034957167676 0.00083312450171
-1685 0.000101061136088 -0.000186440648076 -0.000379723911932
-1686 6.08599145931e-05 0.000531399405128 -0.00109108022159
-1687 -0.00150971485482 0.000377454189298 -0.000471582670394
-1688 0.000116103885315 -0.00103909026881 -0.00178257262758
-1689 0.000213493407699 -0.000588416150434 0.000802299063994
-1690 0.00085417078909 0.000172525705891 0.000245929768079
-1691 0.000226104855306 0.00020624536861 0.000432887998399
-1692 -5.87362746752e-05 -0.00114724285772 0.000918901939849
-1693 0.00039561665917 -0.00078486105943 -0.00077761491118
-1694 0.000534558030811 -0.000715718597926 -0.000769469333194
-1695 -0.000483851989429 0.000898073581075 -4.15196459808e-05
-1696 0.000758752257081 0.00105791884716 0.000221793876359
-1697 0.000717713127743 0.000370659626972 -0.00150257207726
-1698 -2.48387160364e-06 -0.000563001983849 -0.000265834701277
-1699 -0.000286602326415 0.000221777149659 -0.000841071799523
-1700 0.000318236217163 -1.62251218865e-06 -0.000805368211491
-1701 -0.000116504183896 0.000157989299094 -0.00026146569721
-1702 -0.00036922581896 0.000471119896464 -0.000539473691052
-1703 0.000734661394714 -0.000825863354169 -0.000401545321693
-1704 -0.000150255110387 0.000144110736182 0.000286426582666
-1705 -0.00067582363199 0.000152942598272 0.000381518458543
-1706 0.000326927229486 -8.65775551002e-05 0.00014621890965
-1707 -0.000300924917937 6.28384586799e-05 0.00059668233946
-1708 0.000216406850049 -0.000112358677239 0.000417680616184
-1709 -4.47675393337e-05 -3.402089798e-05 -0.000782851379561
-1710 0.000268072375351 6.1859490593e-05 -0.000782198338474
-1711 0.000241974021999 -0.000226312692289 -0.00163476390887
-1712 -0.000245083434403 0.000717128350085 0.000407141110278
-1713 0.00140037275382 -0.00122122428866 0.000598414880124
-1714 -0.000147380413945 0.000390545471567 -0.000189399372613
-1715 -0.000190075006453 0.000493888405525 -0.00129795760303
-1716 -0.000454198934342 -0.00106376230881 -0.000173201405643
-1717 -0.000721388247346 0.00115095441054 0.000368678908654
-1718 0.000261120005719 -0.000757816270424 0.000178826507374
-1719 -0.000192535683052 -0.000138482974379 0.000926552043803
-1720 0.000889933828801 -0.000508815139619 0.000876713010168
-1721 0 0 0
-1722 0 0 0
-1723 0 0 0
-1724 0 0 0
-1725 0 0 0
-1726 0 0 0
-1727 0 0 0
-1728 0 0 0
-1729 0 0 0
-1730 0 0 0
-1731 0 0 0
-1732 0 0 0
-1733 0 0 0
-1734 0 0 0
-1735 0 0 0
-1736 0 0 0
-1737 -0.000303023162449 -0.000816933366173 -0.000644258676272
-1738 0.000774477200174 0.00038414028686 -4.69615661697e-05
-1739 0.000199696170941 0.000439072715377 0.00118666363011
-1740 -0.000120256353389 2.49802203942e-05 2.10700310287e-06
-1741 -0.00048657864068 -8.00873734153e-05 0.000441907844445
-1742 0.000393569363878 -0.000629397336766 0.000751092874642
-1743 9.2592000244e-05 -0.000223863847906 -0.00151307684886
-1744 0.000449246643631 0.00029821231201 -0.000978996753633
-1745 5.89931556843e-05 -0.000478596364853 -0.000680733237876
-1746 -0.000325077805186 -0.000242838766095 -0.000729048470036
-1747 -0.000405853006436 0.000906882765091 -0.000949695864987
-1748 -0.000934855746565 0.00136944581196 0.00081619581328
-1749 -0.000746424781314 -0.000199561364539 -0.000401703273252
-1750 0.000824592229954 0.000139823654374 0.000469159248877
-1751 0.00067499475242 -0.000312767122327 -1.65184649835e-05
-1752 -0.00115295004257 0.000533191024985 -0.000341333645165
-1753 0.00101298329204 0.000380783898004 -0.000738084848036
-1754 -0.000899770854559 0.00143252771786 -0.000570432805385
-1755 -0.000519754320115 0.000634783157571 0.0002426551625
-1756 -0.000482658172724 2.3357878659e-05 -0.000252914982642
-1757 0.000889855814455 0.000100164609556 0.000684794613683
-1758 -0.000769761588756 -0.00120719938294 -0.000976521788181
-1759 -0.000671176323663 0.000162174109026 -0.000740474863309
-1760 0.000711252188026 0.00011308704179 0.000223824505485
-1761 -0.000161534094491 0.000448254732712 -0.00112878076551
-1762 0.001400640933 -8.18799058622e-05 0.000679738765941
-1763 -0.000145799057394 -0.000181931952605 -0.000236670330798
-1764 5.17769964301e-05 -0.00185627249061 -0.000141845058151
-1765 -0.000498066934693 -0.000531001273708 0.00085647953321
-1766 -0.000260814327963 0.000673647679962 5.43369248692e-05
-1767 0.00114663837264 -0.00216212679085 -0.000103877142188
-1768 2.54090035215e-05 -0.000758978016162 -0.000909343488021
-1769 -0.000922604769937 0.00058112571606 -0.000534537630024
-1770 0.000290451419205 -0.000292185875475 -0.000641968567593
-1771 0.00049501302947 -6.65870432887e-06 0.00116256712606
-1772 9.42157085364e-05 0.000274823160199 7.94877843312e-05
-1773 0.000211966680885 0.000347584899365 -0.000359429990657
-1774 0.000926856796126 0.000930518865531 -0.000562567043488
-1775 -0.00103581314259 0.000259571716096 0.000295616977183
-1776 -0.000812638248764 0.000166231204096 -0.00043525161444
-1777 -0.000327472558623 -0.00140603759544 0.000601561697867
-1778 -0.00021378292437 -3.62167737298e-05 0.000347267313468
-1779 0.000702048440251 -0.000532888103881 0.00112755345784
-1780 -9.96621483393e-05 -0.000838311893396 -0.000574798089043
-1781 -0.000656100458627 0.000938821396289 0.000169884355271
-1782 0.000518246188611 -0.000706325835241 4.55210711535e-05
-1783 -0.000323783176298 0.000971061214222 0.000710650102278
-1784 0.000123668912269 9.67570542389e-05 9.89958105119e-05
-1785 -0.000206664136097 0.000826322332879 -0.000181067192486
-1786 0.000843730392202 -6.58907409387e-05 -6.18286366884e-05
-1787 0.00112471088923 -0.000314454593993 -0.000168627242018
-1788 0.000172272311056 -0.000373110762475 -0.0011955201543
-1789 0.000815621335685 -0.00128782349499 0.000404809554785
-1790 4.15160143063e-05 0.00019084723024 2.97691950937e-06
-1791 0.000167186818831 0.00082918357532 -0.000572234546371
-1792 -0.000312158359973 -0.000823645780731 0.000841572393031
-1793 1.81617245042e-06 0.000677215547871 0.000245555991654
-1794 -0.000516517918736 -0.00131583405776 -9.33978862441e-05
-1795 -0.000191015337182 -0.000432851047961 0.00148015529342
-1796 0.000230137108869 0.000450384241452 0.000640820916024
-1797 0.000423083914698 0.000762444821589 0.000904258978119
-1798 -0.000183423206226 -0.00171909587475 -0.000180729976934
-1799 0.00059714990799 0.000526218485934 1.12547349746e-05
-1800 0.000401339796395 -0.00011351611267 -0.000232013784664
-1801 -0.00110526492981 -0.000529936016405 -0.000132626745142
-1802 0.000353677599753 0.0011093209693 -0.000683544596698
-1803 0.000818515666025 0.000923964503935 0.0010248242239
-1804 0.000474621415991 0.000741039167285 0.00104149601303
-1805 -0.000899625079277 0.000997898580955 0.000180261587497
-1806 -3.40974829329e-05 -0.00153490718237 0.000682728577111
-1807 -0.000636806296474 -0.000147032463319 0.000937742584517
-1808 0.000143143275044 -0.000642572256177 0.000706784848537
-1809 0.000492834322321 0.000828474324522 -0.000544902759033
-1810 -0.00047044854434 0.00181463429659 -0.000170904414184
-1811 0.000153834587384 -0.00105805146137 0.000850754058473
-1812 -0.000523095506846 -0.000514151769116 0.000401568105404
-1813 -0.00023917785845 0.000657553597654 0.00065739756553
-1814 0.000240012007953 -1.2879839802e-05 -0.000691279219766
-1815 0.00012308072215 0.000531188024128 0.000943035827205
-1816 -0.00109135624614 -0.00090452017936 0.000453046317884
-1817 0 0 0
-1818 0 0 0
-1819 0 0 0
-1820 0 0 0
-1821 0 0 0
-1822 0 0 0
-1823 0 0 0
-1824 0 0 0
-1825 0 0 0
-1826 0 0 0
-1827 0 0 0
-1828 0 0 0
-1829 0 0 0
-1830 0 0 0
-1831 0 0 0
-1832 0 0 0
-1833 -0.000517881436747 -0.000173069173503 -0.000481054497143
-1834 0.000678114854996 -0.000658202569104 -0.000433727137348
-1835 -0.00035837447506 0.000354105546616 -0.00118498587133
-1836 0.0014332701078 -0.00103482684606 -0.000619415887086
-1837 7.43899192019e-05 -7.16113077028e-05 3.67786542629e-05
-1838 0.000223248414047 0.000892608941263 -0.00106262092619
-1839 -0.000125205729572 7.12904803574e-05 -0.000423990862442
-1840 -4.34820798365e-05 -0.000306618030126 -0.000125715090783
-1841 -0.000158715498265 0.00145322344291 -0.000265056997512
-1842 8.03129854979e-05 -0.000568159289129 0.00023865716847
-1843 0.000265953240323 0.000584845254559 0.000415369757389
-1844 0.000479059895597 -0.000175213028252 0.000490549547879
-1845 -0.000150063834405 -0.000642281583351 0.000328013828631
-1846 0.000435509046716 0.000446682507961 9.15228322656e-06
-1847 -0.000455743618841 -0.000520638604216 0.000743623947352
-1848 -0.000355314111917 -0.000378006242335 -0.000829985818878
-1849 0.000322031247513 4.95201039832e-05 0.000521965186581
-1850 -0.000125035745399 -0.000350264439999 0.000122046079583
-1851 -0.000357283281401 0.000144400482948 -0.000804665729414
-1852 -0.000943434789813 -0.000229982399217 -0.00155665178113
-1853 0.000147131261158 0.000745671645731 -0.0006124552981
-1854 0.0010485997044 0.000418089863373 -0.000160342335134
-1855 8.83135889465e-06 -0.000537366702516 0.000142654156249
-1856 0.000746806862546 -0.00130768243581 0.000600150555054
-1857 0.000149485046524 -0.00125550700218 -0.000502665206325
-1858 -0.000154862981938 -0.00146476521383 -0.00120699806543
-1859 0.000244889696804 -0.00055175989456 0.00037109643214
-1860 -0.000368713572203 -0.000221817776219 -1.16139860903e-05
-1861 -0.000808669321198 -0.000730242795678 0.000168551818737
-1862 -7.93154597569e-05 -0.000362311667807 -0.000717321513181
-1863 0.00102314969201 -0.000645854226895 0.00064217692321
-1864 -0.000389935158686 -0.000894269386765 -0.000785369903582
-1865 -0.0002403246778 -0.000305156511709 0.000137014357835
-1866 -0.000845610373082 -0.000441032597074 -0.000587530559427
-1867 -8.40573528706e-05 -3.04242079288e-05 -0.000497464292211
-1868 -0.000421794858856 0.00120294085133 0.000751733580718
-1869 -0.00133276059055 0.000798747648198 0.000851174899696
-1870 0.000383550742329 0.000636882112609 -0.000458641208057
-1871 -0.000325618063591 -0.000915214879872 -0.000104720126018
-1872 -0.000858949681605 0.000556920785182 0.00125384865817
-1873 0.000253054548492 0.000119674823349 0.0010119873194
-1874 -0.000821983792301 0.000799787524116 -0.000163537097256
-1875 0.00035934281099 -0.000143795340902 0.000123918984338
-1876 0.000881803515311 0.000415375338097 0.000263739955799
-1877 -0.000582559717782 0.000890806165908 -0.000242566151301
-1878 0.00031245487522 -6.30100402551e-05 0.000714150406556
-1879 0.000453338843322 -0.00127819029446 -0.00163381636722
-1880 -3.69323101543e-05 -0.000553437913191 -0.000524936521826
-1881 0.000742423906686 0.000288637036004 -0.00120149766461
-1882 0.00104394900897 -0.000684167832178 0.000562633359802
-1883 0.000513468539518 -0.0016538592209 -0.00164714771945
-1884 -0.000123240021727 -0.000702308296156 0.00026833927326
-1885 -0.00124336812923 0.000135814462232 0.000364475018016
-1886 -0.000291668439079 -0.00104611738309 4.7600849695e-05
-1887 0.00010471413323 -0.000809223676195 0.00032951399974
-1888 0.000584512590047 0.000465145684074 -5.19851887547e-05
-1889 -0.000679725421987 -0.00015028567672 -0.00128628930063
-1890 -0.00140412500978 -0.000478596922696 0.000111887516097
-1891 -0.000289852919288 -0.000574456750731 -0.000678370153521
-1892 -0.00046846 0.000971766921544 -0.0009746588244
-1893 0.00128744802451 -0.000300800700554 -5.40293018128e-06
-1894 0.000197380979724 -0.000321923891189 0.000938694755712
-1895 0.000111727545535 0.000679670883163 0.000233446687782
-1896 -0.000489146871203 2.13866581919e-05 0.000272408688143
-1897 0.000292943979807 -0.000168540281074 -3.64828310625e-05
-1898 -0.000111329507394 0.000406902343136 -0.000990125152177
-1899 -5.58562524961e-05 0.000220055574639 1.81307744309e-05
-1900 -0.000612255491328 -0.000281298908376 -0.000388606856571
-1901 0.000200697331859 1.08148048063e-05 7.73709089235e-05
-1902 -0.000722598640822 -0.00043389882833 2.49051343077e-05
-1903 -0.0014393574533 0.000386192201666 -0.000451394696051
-1904 -0.00070901370187 -0.000195241691563 0.000260154224843
-1905 -0.000156423620959 0.000297992731228 -0.00146487626584
-1906 0.000152496895427 -0.000447469639161 -0.00019336629961
-1907 3.99581343322e-05 -0.000163175069551 -0.000449770762677
-1908 -0.000534885885806 0.000966056138766 0.000437982153294
-1909 0.00100898576628 0.00059063315724 0.00125189812892
-1910 0.000138562014152 0.000130947310046 0.000103503661332
-1911 0.000426152842758 0.0014024875513 0.000312704958395
-1912 -5.27498397225e-05 0.000218596452785 -0.000802390558084
-1913 0 0 0
-1914 0 0 0
-1915 0 0 0
-1916 0 0 0
-1917 0 0 0
-1918 0 0 0
-1919 0 0 0
-1920 0 0 0
-1921 0 0 0
-1922 0 0 0
-1923 0 0 0
-1924 0 0 0
-1925 0 0 0
-1926 0 0 0
-1927 0 0 0
-1928 0 0 0
-1929 -0.000129646566049 -0.00135582741448 -3.89200201859e-05
-1930 0.00132469535083 -8.70811433816e-05 0.000179785591956
-1931 0.000370098191109 0.000264851972024 -0.000313415364732
-1932 9.82704138993e-05 0.000175078319071 -0.00102513415512
-1933 0.00046703908773 -0.00207683227011 -0.00010159847201
-1934 -0.000202310458339 0.000317099124533 0.000102413010711
-1935 -0.000383115917055 -3.68519882211e-05 0.000633005214614
-1936 -0.00101602441698 -0.000621754877124 -0.000769363013277
-1937 0.000440751277505 -6.30104870546e-05 -0.000735282601911
-1938 -0.00091640233667 -0.000444931224335 0.000700994191663
-1939 -0.000922317210029 0.00069105284116 0.000995794260117
-1940 0.000345835987752 0.000374812586329 0.000137792295216
-1941 -0.000926264617614 0.000990107432818 -0.000448344478161
-1942 -0.000547095616639 0.000378222689018 0.000355918045032
-1943 -0.000810538851686 -0.000308016861296 -0.00140825191801
-1944 -0.00113694595792 9.00232777464e-05 -0.000509403322448
-1945 -4.11730823891e-05 0.000290228076288 -0.000376515906672
-1946 -0.00118384265777 -0.000260219586303 -0.000553778461846
-1947 4.36292485124e-06 -0.000122329604461 -5.70933486376e-05
-1948 0.000880938652431 0.000548281909716 -2.40756518953e-05
-1949 0.000401243581379 0.000295982052629 -0.000127163209501
-1950 9.92369004346e-05 1.81721125941e-05 0.000302328754164
-1951 -0.000757774237605 0.000571267352477 0.00013640787129
-1952 0.00101683313199 -5.40702786025e-05 0.00070835314578
-1953 0.000575939167188 0.000679410167935 -0.000680453767324
-1954 0.000156107776853 0.00023709697913 -0.000429406325018
-1955 -0.000650960023431 -0.000690391828361 -0.000257877892996
-1956 -0.000270751852139 0.000612429991043 0.00029258650179
-1957 -0.000233436065861 -0.000946737713064 0.000287761154739
-1958 -0.000948468515419 0.000593584271503 0.000329014554635
-1959 0.000300892026846 2.87999812945e-05 -0.00169599132058
-1960 -0.000490541854624 0.000916361463085 1.91338246503e-05
-1961 0.000563325197621 0.00042759416525 0.000539791597266
-1962 0.000239879820646 -0.000576576640271 0.000699863779737
-1963 0.000211650978999 0.000159217078686 0.000428462638282
-1964 0.000344426452845 0.000667695398154 0.000829325526665
-1965 -0.000495427057004 0.000348211279619 0.000766054753119
-1966 -0.000112372212144 -0.000718761294113 0.000223551887282
-1967 0.000487181098151 -0.000556449264697 -0.000169471931827
-1968 -2.39256998619e-06 -0.000979164248325 0.000266001661741
-1969 -7.15785393819e-05 -0.000667629840248 -0.000101055477666
-1970 -0.00127146160817 0.000115768072988 0.000507715675749
-1971 0.000237659769666 0.000470968114689 9.47479871711e-05
-1972 -0.000578370341879 0.000158971249217 1.14972928314e-05
-1973 0.000143172941225 0.000581193364266 0.000751010763248
-1974 4.05456968117e-05 -0.00130962154423 -0.000332441943443
-1975 -0.000220688287266 -7.25035142261e-05 -0.00181637935252
-1976 -0.000627996750692 -7.55386106792e-05 0.000195712057002
-1977 0.000155495908764 0.000563549455464 0.000475285346549
-1978 0.000291445351046 0.00037275220112 -0.000260253085129
-1979 -0.000684942922562 -0.000300436357879 0.000233394636398
-1980 0.00128264599788 -0.000402613323517 0.000766215453902
-1981 -0.00051143016436 0.000716115559789 -0.000410717167277
-1982 0.00113502870294 -0.000364505329515 0.000851812106974
-1983 -0.000522685382665 -0.00017973468955 0.000404934831916
-1984 -6.99932672461e-05 0.000966086380956 0.000334874512163
-1985 0.000145946784158 0.000957236541958 0.000273473732638
-1986 -0.000865894942234 -0.000430232529059 -0.00170942042348
-1987 -0.0010762603356 0.000137044292398 -0.00138027663188
-1988 0.000231053297426 -0.00149391374475 -0.000410200673195
-1989 -0.000316014502052 0.000858981154896 2.11244586501e-05
-1990 -0.000445382086487 0.00121915702543 -9.16840381071e-05
-1991 -0.000683392504839 -0.000291761435399 -0.000586621632454
-1992 0.00080165872228 0.000143602056372 -0.000941392844827
-1993 -0.000752419365712 -0.000784115793828 -0.000196567876871
-1994 0.000646867404248 -0.000819797839272 -0.000246066024342
-1995 -2.0716895151e-05 0.000120974188249 0.000541160212776
-1996 0.000208513515615 -0.000603662550706 0.000488166111451
-1997 -0.000506299341706 -0.000759158873369 0.000859206187248
-1998 -0.000594978409833 -0.000468152287483 -2.71414179661e-05
-1999 -0.000909624873167 -0.000464231590461 -0.000628710887617
-2000 0.000775004992448 0.00167107810253 0.000227439947903
-2001 -0.000274751660334 8.00056924808e-05 -0.000354920634261
-2002 -0.000597843423692 0.000300326633792 0.000451004958973
-2003 -0.000906075802037 0.00137245560109 0.000570289330961
-2004 -7.29944783577e-05 -0.000911985356054 -0.00119253744387
-2005 5.81798794978e-05 0.00114609783878 -0.000691761997899
-2006 3.37845679473e-05 6.44556730046e-05 -0.000266679457358
-2007 0.000571040294879 0.00119149692059 -0.000462996034032
-2008 0.000678950620395 -8.55616872338e-05 0.000968113403782
-2009 0 0 0
-2010 0 0 0
-2011 0 0 0
-2012 0 0 0
-2013 0 0 0
-2014 0 0 0
-2015 0 0 0
-2016 0 0 0
-2017 0 0 0
-2018 0 0 0
-2019 0 0 0
-2020 0 0 0
-2021 0 0 0
-2022 0 0 0
-2023 0 0 0
-2024 0 0 0
-2025 -0.000797275935794 -0.000302060770488 -0.000590721456965
-2026 0.00227495497588 -0.000458553371158 0.0007258527086
-2027 -0.00114276968591 -0.000453657431959 -0.000468979924905
-2028 0.000609661263875 0.000118598480022 -0.000221071465531
-2029 -7.86564762915e-05 0.000388477677581 -0.000134888078339
-2030 -0.0014303061141 -0.00079354890961 9.65167076058e-05
-2031 0.00103149654063 -0.000812769945747 -0.000838881296256
-2032 -0.000160381335332 -0.00111952163336 0.000138462921748
-2033 0.00111329316184 0.000772749696451 -0.000228151616869
-2034 0.000903487025843 -0.000976377434823 0.000341963616678
-2035 -0.000771280480959 0.000450451078531 0.000189114390428
-2036 -7.72675271538e-05 0.000670564825992 -1.69066336015e-05
-2037 0.000636890768309 2.29880030665e-05 -0.000862163545258
-2038 7.18791187513e-05 0.00185420726494 -0.000627353715421
-2039 -0.00128173900027 -0.000202985977786 0.000384001409612
-2040 -0.00060073861253 0.00091088638572 -0.000927981069333
-2041 -0.000565785794481 0.000212743833627 0.000849652023398
-2042 0.000464734249618 -0.00125909903153 0.000615248856318
-2043 0.000778112980142 4.64209067272e-05 -0.00106646353867
-2044 -0.000939942080474 -6.8414785203e-06 -0.000650892579724
-2045 -0.000112377808523 -0.0008093082999 -0.000458590206802
-2046 0.00103792098898 0.000202654834339 -0.000597913753286
-2047 -0.000671526707812 -0.00056704835313 0.000360325674895
-2048 -0.000525240667569 -0.000241724612774 -0.00110645202848
-2049 -0.000524021156416 0.000595465002371 -9.54039993016e-05
-2050 0.000271206870586 6.594388451e-05 -0.000322488640546
-2051 0.000207593009286 0.00119101914424 -0.000397093147727
-2052 -0.000405439027181 0.000901719383852 0.000982301508912
-2053 -0.00051506509919 0.00103608972838 -0.000906236647955
-2054 -0.000455570081616 -0.000292541796936 -0.000872857924282
-2055 0.000492246752146 -0.000178902693747 -0.000941591227303
-2056 -0.000438235190198 0.000459499536238 9.3305831658e-05
-2057 0.000528155465512 0.000941803839438 0.000122324663654
-2058 0.000746630732718 -0.000715545297698 7.48747855645e-05
-2059 7.76726883186e-05 -0.000348601539877 0.000588576772413
-2060 0.000264880461933 -0.000158898822076 0.00108735529738
-2061 -0.000589714566004 -0.000168185733477 0.00113871503523
-2062 0.000196390662642 0.000482693601466 0.000204730190063
-2063 -0.000419615029091 -0.00045700884648 -0.000822606197201
-2064 0.000296428071 0.000574724550648 0.000109597219692
-2065 -0.000770175524207 -0.000224381586296 -0.000707548972192
-2066 0.000523732618369 -0.00066997461924 -0.00083312484885
-2067 -0.000227947662291 0.00121525552571 -0.00162917718616
-2068 0.00069407069604 -7.08873337243e-05 0.000608522699625
-2069 0.000197211175327 0.000193973543094 -1.60230931154e-05
-2070 -0.000795061837197 -0.000196893239672 0.000124855102308
-2071 -0.00120533949969 -0.000120637058752 0.000256018984519
-2072 5.1274925292e-05 -0.000953099497532 -1.18501583025e-05
-2073 -0.00135092203853 0.000430522533772 0.000135018621941
-2074 0.00021605409036 -0.000990098000397 2.29266460018e-05
-2075 0.000850861358792 -0.00068847699457 -0.00043421743671
-2076 -0.000927697474825 -0.00010625361106 9.14320208233e-05
-2077 0.000250104882487 -0.000331008755573 -0.000933926037767
-2078 0.000362968645736 -0.000337397077938 0.00016196308549
-2079 -0.000501943578035 3.36443946451e-05 -0.000112260995777
-2080 2.0878569439e-05 4.89705018792e-06 0.000542801436518
-2081 0.000119755595555 -0.000689002499292 0.00113317930341
-2082 0.000622408059237 -4.42886077921e-05 -0.000346437648258
-2083 6.93038720514e-05 0.00155978315161 -0.000341678318464
-2084 -0.000536649432152 -0.000358596273718 -0.00043132396138
-2085 0.00047872399088 -0.000381911378997 0.000152304489195
-2086 0.000561050564965 -6.17144967695e-05 -0.000689624974796
-2087 -6.9738621761e-06 -0.000228247895147 -0.000340307017351
-2088 0.000610603431644 -0.000339842325117 -0.000445938493391
-2089 -0.000635258323996 0.000575419878067 -0.000277442379729
-2090 -1.22155183695e-05 -0.000913568877483 -0.00064171518458
-2091 -8.76971472333e-05 0.000674074766031 0.000539046074104
-2092 -0.000282607982434 -0.000811570512321 -0.000349404860457
-2093 -0.0017351571984 -0.000267691400696 -0.000213591544841
-2094 0.000281810865265 -0.000655053697203 0.000139327493654
-2095 -6.84456730253e-05 -0.00123975313479 0.000978686697526
-2096 0.000377486349301 0.00028077040077 -0.0002365007994
-2097 -0.000880788381165 0.000747586491969 0.000795362642528
-2098 0.000617374465506 0.000624485813408 0.000570946049269
-2099 -0.00045897797514 -0.000315336569125 -0.000583784805308
-2100 0.000788435402271 -0.000547506210712 -0.000665063372161
-2101 -0.000491339351413 -0.000565977612057 -0.000451035291843
-2102 -4.32803002325e-06 -0.000172760810326 -0.000489806579599
-2103 -0.000779262868761 0.000608876281523 -0.000895445272362
-2104 -0.000369513354722 -0.000384713201596 0.000200504320491
-2105 0 0 0
-2106 0 0 0
-2107 0 0 0
-2108 0 0 0
-2109 0 0 0
-2110 0 0 0
-2111 0 0 0
-2112 0 0 0
-2113 0 0 0
-2114 0 0 0
-2115 0 0 0
-2116 0 0 0
-2117 0 0 0
-2118 0 0 0
-2119 0 0 0
-2120 0 0 0
-2121 0.000766919306593 0.000184588341704 -0.000781030351521
-2122 -0.000349113973713 -0.000332181665316 -1.82431455399e-05
-2123 -6.31315849771e-05 0.000726547814495 0.00073868020398
-2124 -0.000459945884994 -0.000658325050237 -0.000817516746388
-2125 0.00109230114798 -0.000395865104366 -6.62995329335e-05
-2126 -0.00106710362304 0.000608577978471 -0.000766134576694
-2127 0.000745144616289 -0.00125984931168 0.00104176647518
-2128 0.000278022894277 -1.90026437308e-05 -4.41695451274e-05
-2129 -0.00152505128925 -0.000314168902283 -0.000446471635758
-2130 7.50818012482e-05 -0.000287198399277 0.000207722400707
-2131 0.000366610687454 0.000576518643325 -0.000836195908038
-2132 0.00112291922365 -0.000273861195423 -0.000853660040471
-2133 0.00020342707049 -0.000253193229781 0.000320437441805
-2134 -0.000614466262502 -0.000125332420462 -0.000194947471957
-2135 5.80466582384e-05 -0.000382466256307 0.000292714298296
-2136 0.000721738026029 -0.000313684408459 -0.000802564658716
-2137 0.000167381821204 0.000802392913594 0.000317599749128
-2138 0.000278811855407 -0.000321904714714 -5.53722524355e-05
-2139 -2.81890370544e-05 -0.00140858055116 0.000311058749281
-2140 0.0010725834639 -0.000727058221644 -0.000335020951047
-2141 0.000901137809339 0.00192838039603 -0.000315385287114
-2142 0.000217631180259 0.000256797803761 -0.000736312716998
-2143 -0.000641457986525 0.000788648598806 -0.000121984112785
-2144 0.000134622353991 -0.00107230432888 -0.000811896186906
-2145 -0.000348995650227 0.000674527785853 0.000563734931863
-2146 0.00131785320166 0.00042873161305 0.000681397394861
-2147 0.000298512900418 -0.000327469828133 0.000187260583331
-2148 -0.000221130598852 0.000669431373133 0.00121011418341
-2149 -0.000688458976414 0.000313309791075 -0.000132493725589
-2150 0.00121675828569 -0.000774935160264 0.000293783059047
-2151 -3.67097555063e-05 0.000256737456511 -0.000686486634207
-2152 -0.000511362704387 -0.000249228792463 -0.000410989098794
-2153 0.00152386067599 0.00121895962195 0.000405319146683
-2154 0.00118354281592 0.00082126470645 0.000258433668375
-2155 -0.000494667568135 0.000801127458993 0.00032025285759
-2156 0.000468572119756 -0.000597837938149 0.00116662415098
-2157 0.000167626244351 0.000362235986931 1.84996472898e-05
-2158 0.00135110189057 0.000189801320353 0.000948297816455
-2159 7.02569555984e-05 0.00123754674982 -0.00105334132701
-2160 -0.00055855021846 0.000122990799339 -4.57509397286e-05
-2161 0.000676916236202 0.000387438205239 0.000286311419399
-2162 0.000428325137026 -0.00131343905711 0.000138372192517
-2163 0.000207669479797 0.000321912000165 0.000641622908584
-2164 0.000790903719788 -0.000469818650172 -0.00108325237705
-2165 0.000441337036319 -0.000731663553558 -0.00090983840195
-2166 -0.000598148090922 0.00100272644223 0.00118628071745
-2167 0.000623082401574 0.000956283119445 0.000190976168127
-2168 -0.000484400176925 -0.000709284692683 -0.000260507648228
-2169 -8.36800424011e-07 0.000452208092057 0.000835162103535
-2170 0.000489973312653 -0.000167544534111 0.000725810490499
-2171 0.000259899152697 0.00121145902126 -0.0014734451885
-2172 0.000798623470708 0.000413607329121 -0.00010890647102
-2173 -0.000558298017724 0.000623362583026 0.000820326913578
-2174 0.000595476142695 -0.00075745215885 -0.000326728478522
-2175 -6.09677733028e-05 -0.00012277482872 -0.00134129386508
-2176 -0.000679271537212 0.000731114277101 -0.000258399608501
-2177 0.000698761475241 -0.00116064809209 -0.000713724185828
-2178 -0.000859729641353 0.000864104143992 -0.000138068211935
-2179 0.000564223972675 0.000267427371317 -0.000147271589403
-2180 0.000490595810285 -0.000248679132476 -9.83668012755e-05
-2181 0.00140449603511 -0.00109569625421 0.000281105108014
-2182 0.00047539379793 -0.000202026664028 -0.00076217675577
-2183 0.00083632611328 1.04876994524e-05 -0.000142857142254
-2184 0.00139541520121 -0.000813936174155 -0.00039107044619
-2185 -0.0005639147336 -0.00032667972203 0.000672532362705
-2186 0.000248902036759 0.000737495641075 -0.000539517890169
-2187 -0.000256695044255 -0.000594755091072 0.000594767038156
-2188 0.000844744594437 -0.000210227324817 0.00013775159076
-2189 0.000306559673487 -9.09086243801e-05 -0.000342075363232
-2190 0.000713268093093 -0.000676817996707 -0.000781061367581
-2191 0.00134775732023 -0.0002258568208 0.000538582163719
-2192 0.00040134589269 -0.000408291704078 -0.00048345486263
-2193 0.000446608748087 -0.000502982561334 -7.12455297493e-05
-2194 0.000646048917932 0.000164216779042 -0.00149073719375
-2195 0.00122693118173 -0.000654724689328 0.000378132329231
-2196 -5.26306077286e-05 0.000623186981124 0.000593524604575
-2197 0.000846602610046 -0.000669452500425 0.00172671371731
-2198 8.00953445259e-05 -0.00171538171937 -3.91937625149e-05
-2199 -0.00157772059111 -0.000583021185128 -0.00100737374725
-2200 -0.00059345560344 -0.00136986193644 0.000395078076943
-2201 0 0 0
-2202 0 0 0
-2203 0 0 0
-2204 0 0 0
-2205 0 0 0
-2206 0 0 0
-2207 0 0 0
-2208 0 0 0
-2209 0 0 0
-2210 0 0 0
-2211 0 0 0
-2212 0 0 0
-2213 0 0 0
-2214 0 0 0
-2215 0 0 0
-2216 0 0 0
-2217 0.000698593670562 0.000962785289653 -0.000281844282241
-2218 -0.000727305854141 -0.000198840452009 -0.000155860101342
-2219 0.00066801261682 -0.000275626215251 0.000715677339397
-2220 0.000719318014819 -0.000643396226967 0.000569240018522
-2221 -0.00142236226988 0.000972637274538 -0.000341397379131
-2222 -0.0017674821415 0.000365608436139 -0.000966075910486
-2223 -0.000174881282019 -0.000444839069722 0.00112264633102
-2224 0.000537113858243 -0.00124782621688 0.000606941193043
-2225 0.000183415935094 0.000738145893897 0.000218763782598
-2226 0.000184198197293 0.000126510378835 0.000237961523691
-2227 -0.00031753954456 0.000164709738947 0.000368492231207
-2228 0.00159629829173 -0.000254998685984 -0.000860599512699
-2229 -0.000178801827656 -0.000156440458859 -0.000555760420615
-2230 0.000285710356408 -0.00207733005706 8.49515130336e-05
-2231 3.43233852781e-05 -0.00043495383989 0.000159828547399
-2232 -0.000269857533911 -0.000695246904273 -0.000386181798905
-2233 0.000432013495615 -0.000565725126656 0.000745256595551
-2234 0.000462366889195 0.00144903115301 -0.000763573839444
-2235 0.000152575423905 -0.000818607964829 -0.000138736761333
-2236 0.000353003978419 -0.000880301704275 7.78681330629e-05
-2237 -9.47982813324e-05 0.000190710764145 -0.000957221699516
-2238 0.00107923811946 7.58129080172e-05 0.000491530872087
-2239 0.000205574984589 0.000337345134266 -0.000669440512546
-2240 0.000535917925553 -0.000335045232963 -0.000305444212046
-2241 -0.00125444261022 0.0008594237772 -0.00117386928622
-2242 -0.000445546563483 0.000138931224388 -6.62340582905e-06
-2243 0.000229002810282 -0.000246063029736 0.000868996654279
-2244 0.000232865973709 0.000883374419931 0.00038366303655
-2245 -6.19291670862e-05 -0.00117806313007 0.000607976104653
-2246 -0.000482073835086 0.000224310137491 -7.67554446652e-05
-2247 -8.58401600228e-05 -0.000290490411348 0.000630123944726
-2248 -0.000260522024425 -0.000830371586377 0.00107276116197
-2249 -0.00018059524899 -0.000243270901612 0.000340153559515
-2250 -0.000179432261831 -0.000465388465988 0.00113784647639
-2251 -0.00119002649755 0.000696073432149 -0.000724616561825
-2252 0.000582087995033 -0.000352282046291 -0.000508349335885
-2253 -0.000738037468683 0.000774024787489 -7.11293794357e-05
-2254 0.000773469669606 6.36821031681e-05 -0.000480918021053
-2255 -0.00115822911937 0.000347756723084 -3.00758265214e-05
-2256 0.00059226791022 0.000309460472374 0.000688504076451
-2257 -0.000239259157437 -0.000755472221882 0.000532437738033
-2258 -0.000171416437598 0.000556024466223 -0.000358683357798
-2259 0.000574531747057 -0.000234513689806 -5.22188957177e-05
-2260 -9.80941337411e-05 -0.000642629934498 0.000206398852987
-2261 0.00050725872605 0.000579728259438 0.000618603861623
-2262 -0.000730583833481 0.0012421849455 -0.000759107038727
-2263 -0.000341175271133 -0.000473015883005 0.000772859703615
-2264 8.61543262863e-06 -0.000568209973595 -0.000633216859537
-2265 -2.19229287067e-05 0.00106040862702 -0.00072320543095
-2266 0.0010430538576 4.10677996812e-05 0.00104052252957
-2267 -0.00068201834486 0.000527733749128 0.000753381339498
-2268 2.96642150536e-05 -0.000744304947584 0.000896527004595
-2269 0.000940123781913 -0.000988680941885 -0.000264608856363
-2270 -0.000760524120009 0.000497178872555 -0.000321418054706
-2271 0.00031116057121 0.000801745345938 -4.49410694095e-05
-2272 -0.000156449925158 -0.0010308523398 -1.79536002246e-05
-2273 -0.000122818678976 0.000696136243372 -0.000274721684232
-2274 -0.000956399226893 0.000610101354718 0.000438963039691
-2275 -0.000194374727392 0.000830697528126 -0.000299949587968
-2276 0.000126613427806 0.000225011540619 -5.52001065551e-05
-2277 0.000757500093849 0.000481592847966 -0.00115158261801
-2278 0.000756386698636 4.50667892734e-05 -0.000162469772669
-2279 0.000175249099538 0.000762650115538 -1.98051696024e-05
-2280 -0.000137414238591 0.000566360364906 -2.53618947262e-05
-2281 -0.000165772947849 0.000432695071922 0.000210774606847
-2282 -0.000854899249863 -0.000389068376686 -0.000996662801762
-2283 0.00109960173605 0.00103548817301 0.000227811050064
-2284 -0.00153902092283 0.00157843472339 -0.00051965168077
-2285 0.00102800651556 -0.000108364086507 -0.000722190894118
-2286 -0.000156885912362 0.00105695841259 -0.000118181768634
-2287 -0.000734272961942 0.000108549132956 0.000242508692746
-2288 -0.000131673732694 0.000460487035522 0.000319161102257
-2289 9.53972561667e-05 0.000463953037839 -0.000186528134285
-2290 -0.000532565652966 0.000445080367628 -0.000905745626919
-2291 -0.000242733604368 0.000774902363316 -4.71486626405e-05
-2292 0.000222174684339 -0.00011048360212 -0.000175348159061
-2293 7.96295577209e-05 0.000146372810992 0.00122778230637
-2294 0.0012562277792 -0.000292939654273 0.00108513293527
-2295 -1.00621826289e-05 -0.000895737991239 0.000209875997095
-2296 -0.00155378291881 -0.000738803823768 0.000743393565251
-2297 0 0 0
-2298 0 0 0
-2299 0 0 0
-2300 0 0 0
-2301 0 0 0
-2302 0 0 0
-2303 0 0 0
-2304 0 0 0
-2305 0 0 0
-2306 0 0 0
-2307 0 0 0
-2308 0 0 0
-2309 0 0 0
-2310 0 0 0
-2311 0 0 0
-2312 0 0 0
-2313 -0.000265374439332 0.000508273805003 0.00053083150899
-2314 -0.000618899982904 0.000409351337464 -0.000200359461293
-2315 2.6537924553e-05 -0.000347691626509 0.000609438303335
-2316 -0.000397676747727 8.56401491856e-05 0.000564874818174
-2317 -0.00106536336151 0.00154459842455 -8.95860458633e-05
-2318 -0.000193343973341 0.000546326572757 0.00101728406943
-2319 -0.000821077618598 0.000737809671998 -0.00063659939953
-2320 0.000266288821251 -0.000928355306274 -0.000663545098002
-2321 7.01833194408e-05 0.000641878444224 0.0004952012031
-2322 0.000531957918393 -0.000450258816327 -0.000741212112504
-2323 -0.000520059393678 0.00043353800991 -0.000679723186194
-2324 -0.000663734327032 -0.000324416474762 0.00117042416783
-2325 -0.000351758305481 0.00041298350602 -0.000474676577719
-2326 -0.0016551452895 -0.000737174575222 -0.000851405727445
-2327 0.000455761267092 0.000487886214644 0.00113443051419
-2328 -0.00110334304417 0.000115203000131 -0.000885275216128
-2329 0.000347579206748 0.000365824894233 -0.00118565621892
-2330 7.44540400658e-05 0.000528568994755 -1.21380239625e-05
-2331 -0.00049052408307 0.00119928262468 -0.000952256488559
-2332 0.000990077131715 -0.00103757993616 0.000216224028317
-2333 0.00061581427225 -0.000937847137228 -0.00111029801375
-2334 0.0012058289229 -4.19866018974e-05 -0.000925108234978
-2335 0.000115790543534 0.000519676767967 -0.000619072414385
-2336 0.000532378505481 0.000737962644375 0.000838160556803
-2337 -0.000897015546463 -0.000203028484484 3.29561533046e-05
-2338 -0.00012820629919 -0.000415973344996 -0.000599756660832
-2339 -0.000764280434401 0.000188400276575 -5.32580471177e-05
-2340 -9.92087134884e-05 0.000880345788335 -0.000834323945742
-2341 -0.000809379140892 -3.73814251826e-05 -0.000512777498248
-2342 -4.72831779093e-05 -0.000564997489487 0.000904128218228
-2343 -0.00134742871096 0.000265417239038 6.97874925494e-05
-2344 -0.000198278578235 0.000466436195938 0.00075227477076
-2345 0.00131987008249 -9.58594151255e-05 0.000207148836732
-2346 0.00014333505153 -0.000175367647958 0.000265482603595
-2347 -0.000191133158519 -0.000918097926061 1.64578927813e-06
-2348 0.000498849150221 -0.000247759427375 -0.000271526474784
-2349 -0.00155722484748 0.000426758818529 0.000644431775217
-2350 0.000230407420665 -0.00077128452407 -0.000383024505644
-2351 -0.000951607442091 -0.00122412839492 -0.000208569104537
-2352 -0.000267650618227 0.000226050573301 -0.00157484327942
-2353 0.000857773145326 0.00129712554423 -0.000549721563825
-2354 0.00186247832705 -2.62678250388e-05 0.000799678860249
-2355 -0.000165861549756 -0.000798982844948 -0.000609491567727
-2356 -0.000768830093674 0.000910095118477 -0.000323304528975
-2357 -0.000672025508365 -5.25176829448e-05 -0.000496759960154
-2358 -0.00159308171149 -7.46532847597e-05 0.000351975373706
-2359 0.00136466851474 0.000266144514979 0.00170412128783
-2360 -0.000226080788607 -0.000336545672427 0.000829253229908
-2361 -0.0012073179026 0.000241406737213 -0.000569012137633
-2362 -0.000292991680916 -0.00159604762824 -0.00182322612857
-2363 0.000162299208577 -0.000191776794365 -0.000358907172159
-2364 -0.000658176621319 0.000274262724013 -0.00103285897579
-2365 0.000142576593293 0.000918828745699 -0.000702989757099
-2366 0.00023902817526 8.9674103716e-05 0.000117668881132
-2367 0.000221358174559 -0.000807348782201 0.000818974396654
-2368 0.000182857612286 -0.000427514685387 7.88987080759e-05
-2369 0.000281112702095 0.000381829038529 -0.000775538883567
-2370 -0.000694922918774 0.000168705879574 -0.000582657188363
-2371 0.000884639242602 0.000250729190634 8.32300904673e-06
-2372 -0.0011231789859 0.00151500191423 -0.000171614440324
-2373 0.000205732295026 0.00191634822272 0.000765015560806
-2374 0.000164599999684 0.000295453376612 -0.000392841871971
-2375 0.000351004154728 -0.000527620343648 0.000420985324119
-2376 -0.000962607855326 -4.61398244684e-05 0.000257489845358
-2377 2.91547866042e-05 -0.000668269053308 -0.000195978563756
-2378 0.000920359070788 0.000429742271699 -0.00104212232056
-2379 7.98533411366e-06 -0.000469968544377 -0.000697945294537
-2380 0.000263583135196 0.00027168745603 -0.000215484480184
-2381 0.000880361674441 -0.000139140621972 -0.000723541502058
-2382 0.000271007652768 0.000100533076123 0.000381254512677
-2383 -0.00019681595743 -0.000288687499558 0.000711450451694
-2384 -0.000559225356231 0.00115069744973 0.000409510410769
-2385 0.000822923556174 0.000589295317341 -0.00076582739925
-2386 0.000296224900865 -7.87370490793e-06 -0.000242051394172
-2387 -0.000868203589673 -0.000198695890883 0.000749347780991
-2388 -0.000303085542818 0.00087719664825 0.000479248278368
-2389 0.000414650129573 0.000457378547464 -0.00106187684355
-2390 0.0010601878902 0.000186809249152 0.000361688890669
-2391 0.000332283820188 0.00105069264043 -5.53367222495e-06
-2392 0.000394333612398 0.00112848994717 0.000244985724833
-2393 0 0 0
-2394 0 0 0
-2395 0 0 0
-2396 0 0 0
-2397 0 0 0
-2398 0 0 0
-2399 0 0 0
-2400 0 0 0
-2401 0 0 0
-2402 0 0 0
-2403 0 0 0
-2404 0 0 0
-2405 0 0 0
-2406 0 0 0
-2407 0 0 0
-2408 0 0 0
-2409 -0.000447023013326 0.000207216468771 0.000436718174612
-2410 0.000463713750206 -0.000630812060336 6.63721652601e-06
-2411 -0.00101271302592 -5.1389651856e-05 -0.000234998293565
-2412 0.000869714014963 -0.000217232701674 0.000201741892411
-2413 -2.64976636745e-05 0.00120072148316 0.000965393703432
-2414 -4.20682786072e-05 -0.000445942116951 5.99395321019e-05
-2415 1.8348093251e-05 0.00063244659793 -8.41273004648e-05
-2416 0.000135636954112 0.000561393888846 -0.000221975394668
-2417 -0.000472577238534 -0.0004299222937 0.00223274078826
-2418 0.000654004237392 -0.000136435679883 -0.000273802183637
-2419 -0.000872500166139 -0.00148164149905 1.68677954724e-05
-2420 -0.000595703571018 -0.000714847611478 -0.0008305880535
-2421 -0.00092015466429 -0.000222423072024 -0.000829988835049
-2422 -0.000461881950929 0.000684436049402 0.000584844623441
-2423 0.00153130690844 -0.000136755929792 -0.000599071390908
-2424 0.000738763509668 -0.00115453221289 -0.000766492322582
-2425 0.000280900828053 0.000664634264954 0.000458977105391
-2426 0.000585040766549 0.000477134800138 -0.000532893919108
-2427 -0.000832778855057 0.000603078574569 -0.000464350379789
-2428 -0.000424536947513 -0.00028679862617 -0.000477437522343
-2429 -0.000473549645335 0.00116269241893 0.00112950645256
-2430 -0.000181043806094 -0.000156098193226 0.000994117662243
-2431 0.000412918358596 2.90224268574e-06 -0.000331206660113
-2432 0.000728056756081 -0.000507972648283 0.000897817301284
-2433 -0.000129499497076 -0.000197360209924 0.000356012007303
-2434 -0.000671053749485 -0.000601359984166 0.00146173165142
-2435 -5.3607487343e-05 -0.00122993760604 0.00058096635
-2436 0.000799979670072 -0.000369581601519 -0.000470435340938
-2437 -0.000463019997454 -0.000757660059975 -4.74915174429e-05
-2438 -0.000488638791599 -0.000590461540513 0.000963397720363
-2439 -0.000384011686254 -0.000315340019567 0.00103185089799
-2440 -0.0011999830211 -0.00057201264125 0.00043347601372
-2441 0.000638088144084 -0.0001468820053 0.00105997676124
-2442 3.76090828121e-05 -0.000253864122483 0.000941349150725
-2443 -0.000249406471754 -0.000379480100847 -5.70286725954e-06
-2444 -0.00123013463295 0.000675970182851 -2.04095946939e-05
-2445 -0.0005541933952 4.85596266638e-05 -1.22165145234e-05
-2446 6.20470142861e-05 -0.00085426515332 0.000383968454764
-2447 -0.000341953150021 -0.00034878688537 0.000280009805424
-2448 -0.000202029342752 0.000501691099663 0.000332653855205
-2449 -7.95737251597e-05 -0.000428793009576 -0.000261288002855
-2450 0.000212059287042 -0.000471649080151 0.00056616213415
-2451 0.000324530635951 -0.000779545140324 0.00110262770754
-2452 0.000282041254087 0.000226129004577 -0.000109215820766
-2453 -0.000503596541879 0.00135934902048 -0.000255933152541
-2454 -0.000685937836146 0.000376401771064 0.000389750060208
-2455 6.39880367534e-05 0.00023048529624 -0.000250397379108
-2456 0.000801519264472 0.000356553750821 -0.000530223181511
-2457 0.000942878111254 0.000720864382226 7.82745483349e-05
-2458 0.000403560688531 5.54569996157e-05 -0.000451980571597
-2459 0.000605170669733 1.82073747312e-06 0.00105785613426
-2460 -4.61482176679e-05 6.76638475052e-06 0.00108243506516
-2461 -0.000315747638072 5.20301646808e-05 -2.48041914049e-05
-2462 0.000318378771972 -0.000284196752344 0.00128644921324
-2463 0.000654887064537 -0.000180729511366 -0.000399477945042
-2464 0.000144986036979 0.000373723781554 -0.000632600494686
-2465 0.000217489221731 -0.000528734177861 -3.64197619734e-06
-2466 0.000339547733036 -0.000253907819808 -0.000385213750196
-2467 0.000367789706878 -0.000163666748907 -0.000586129158563
-2468 -0.000127093818598 -0.000890836460899 0.000247688919084
-2469 0.000717497572642 0.000748937894885 -0.000570728261461
-2470 0.00108592952826 -0.000583122431307 8.02618731392e-05
-2471 0.000849525056982 0.000832296057223 0.000966990678257
-2472 0.000891085870402 -0.000452544716368 -0.000639414934598
-2473 -0.00025753806775 -0.00013738543212 -0.00031364839717
-2474 0.000590053661362 0.000389636538659 0.000649924979881
-2475 -0.000773503736137 -0.00012287197144 -0.000144107957545
-2476 0.000152217400563 6.81837515946e-06 0.00132244527431
-2477 -0.00033309666069 -0.00018470748217 0.000964316260728
-2478 0.000417255936075 -0.000340384939163 -0.000506852957301
-2479 -1.02059175313e-06 0.000188227865631 -0.00115914554774
-2480 -0.000352535852634 -0.000329662929843 -4.87397076335e-05
-2481 -0.000268212841578 -0.000274267366153 0.00132256213335
-2482 0.000366040178292 0.000580906590241 -0.000290758283267
-2483 9.6861299511e-05 0.00119599432318 -0.00104231611069
-2484 -2.80251858306e-05 0.000823395878954 0.000356337811326
-2485 0.000104252494514 0.000427419784859 -0.00047501519524
-2486 -0.000118846265743 -0.000507675956036 -0.000653248859725
-2487 -1.84921269434e-06 0.000340416253395 -0.000816508054585
-2488 0.000139355893264 -0.00111894239112 -0.000894787602358
-2489 0 0 0
-2490 0 0 0
-2491 0 0 0
-2492 0 0 0
-2493 0 0 0
-2494 0 0 0
-2495 0 0 0
-2496 0 0 0
-2497 0 0 0
-2498 0 0 0
-2499 0 0 0
-2500 0 0 0
-2501 0 0 0
-2502 0 0 0
-2503 0 0 0
-2504 0 0 0
-2505 0.000729524964746 -0.000189463885287 0.000912532875285
-2506 -0.000210258549737 -0.000336821066563 0.00062526128996
-2507 -0.000331562901338 -0.00126930435679 -0.00104473660309
-2508 0.000895921985974 -0.000520517170228 0.00124809276688
-2509 0.00036100248207 -0.00110145018179 0.0002887722655
-2510 7.89543308551e-05 0.000100151822707 -4.8839401272e-05
-2511 -0.000185087924755 0.0001382919704 -0.00013028130163
-2512 -0.000256584446644 -0.00067332077974 -0.000147305554275
-2513 -0.000190537980802 0.000271233633814 0.000733584559957
-2514 -0.000699231721004 0.000676698175134 0.000248453674134
-2515 0.00165417358229 -0.000399840421376 0.000264697799477
-2516 0.000528011535863 0.000306859664368 0.000776377188648
-2517 0.000567171943499 6.15117582674e-05 1.72955516482e-05
-2518 -0.00053945348991 0.000105492749507 0.000454710649476
-2519 -0.000190705584901 0.00053605634553 0.00101460538899
-2520 6.27739094268e-05 -1.99727684128e-05 0.00047594297492
-2521 0.000577659038109 -0.000396447961473 -0.000529742063753
-2522 -0.000191058622984 8.85806351995e-05 0.000549303262359
-2523 -0.000432869870232 0.000349577914528 -0.000805399012907
-2524 0.000681437302762 6.81804059134e-05 -0.000256699035836
-2525 0.000815906991971 -0.00060312482074 0.00113618045526
-2526 0.00056294355041 0.000291603428824 0.000455863406476
-2527 0.000164712662891 0.000350376088636 0.000368648934058
-2528 0.000627195471192 0.000996653453703 0.000235298253347
-2529 0.000914161908423 0.000780736685276 -1.56956114624e-05
-2530 -0.00114034934608 0.000233558590233 2.29409273416e-05
-2531 -0.000356704797061 -0.000191860764404 -0.00117608814743
-2532 -0.000784853740718 0.000517259249814 -1.91033862179e-05
-2533 -0.00118438704598 -0.00125847470435 0.000931324644056
-2534 -0.0003608482047 -0.000702914218595 0.00123524562806
-2535 0.000610235584478 -0.00052280697485 0.00148622109518
-2536 0.000661953942365 0.000316208204878 -0.000103352787101
-2537 0.000148172082426 0.000374311313809 0.00120171618514
-2538 0.000542581862248 -0.000238615180939 0.000560655352916
-2539 0.000822686975816 -0.000138509241975 5.26236280928e-05
-2540 0.00104593187023 0.000665653318348 -0.000770294329385
-2541 0.000471460704278 -0.00143046755481 -6.48560507224e-05
-2542 -7.88959485635e-05 -0.0010435832881 0.000417412113208
-2543 -0.000214345909132 -0.000735301405104 6.52323671721e-05
-2544 -0.0006366067371 -0.000110090459086 -3.89633363234e-05
-2545 0.000352069017938 -0.000262863117716 -0.000888704086842
-2546 -0.000368561774561 -0.000290242325938 -0.00044155084096
-2547 0.000354458361479 0.000140724312271 0.000106522548
-2548 0.000449426792968 0.00128620703919 0.000336728590322
-2549 -0.00104442055237 0.000126872338561 -0.000219405485999
-2550 -0.000347699732161 0.000851123651849 0.000906236171767
-2551 -0.000444137467239 -0.000208330057424 0.000908884182965
-2552 0.000797020074624 -0.000862952525166 -0.000324316256333
-2553 -0.000397738257649 -0.00031278798517 -0.000555879601451
-2554 0.000453838020716 -0.000220571566003 1.1874486148e-06
-2555 0.000767080096941 -0.00021158423834 -0.000131757910514
-2556 -0.000309988670397 0.000483449743581 0.000495748216175
-2557 0.000266886704022 -0.000112019325036 0.000864200662553
-2558 -0.000493763551408 -0.000338557600538 0.000589852072301
-2559 -1.81721836764e-05 0.000483541135228 -0.000177069989564
-2560 0.000134108760466 -2.56348523133e-05 -0.000415535178477
-2561 -0.000528208509991 0.000953146891397 0.00126810721185
-2562 0.000448629450395 -0.000440579729435 5.57944149641e-05
-2563 0.000116403362598 -0.000357438719119 0.000581474668067
-2564 0.000971286828697 6.75506626152e-05 -5.85361306577e-05
-2565 1.97200083429e-05 -0.00120377617287 0.000758921627479
-2566 -0.000826945318853 0.000170726189729 0.000539621537933
-2567 -0.00110672880896 0.00028219684567 -0.000201769745984
-2568 -0.000898062833925 -3.9697353094e-05 -0.00056826356761
-2569 -0.000531818613926 -0.000919120250147 0.000779216362022
-2570 -0.000249985731471 -8.66723785407e-05 0.000595851893944
-2571 -0.00028475219759 0.000160984889086 0.000982789167105
-2572 -0.000647465777815 0.00105574418037 0.000880935044393
-2573 0.000272258764509 0.000881883122324 0.000865064143906
-2574 0.000247793550227 -0.000788155402217 -0.000941346938352
-2575 -0.000945088335135 -0.000326847037352 -0.000315328733874
-2576 0.000497078052623 -0.00134663521818 -0.000939154468449
-2577 -0.000878106455253 0.000778213965974 -0.000215741802414
-2578 -0.000458691627503 0.000584487190661 0.000290404886956
-2579 -0.000818359844836 0.000233144278562 -0.000848276061362
-2580 0.000650825576262 -0.000966369801223 0.000713985089816
-2581 7.06349178607e-05 0.000826655417428 0.000446198206242
-2582 -0.000489452744579 -0.000771272950892 0.000464908617365
-2583 5.10029315606e-05 -0.000231979154208 0.000689059440083
-2584 -0.00180424946126 -0.000862212866662 0.000592441317585
-2585 0 0 0
-2586 0 0 0
-2587 0 0 0
-2588 0 0 0
-2589 0 0 0
-2590 0 0 0
-2591 0 0 0
-2592 0 0 0
-2593 0 0 0
-2594 0 0 0
-2595 0 0 0
-2596 0 0 0
-2597 0 0 0
-2598 0 0 0
-2599 0 0 0
-2600 0 0 0
-2601 -0.00104861687189 0.000261546219688 -0.000323357462861
-2602 0.000755218154487 0.000798884458385 -0.000585522284192
-2603 0.00045280384446 -9.20626749796e-05 -0.000337087425426
-2604 0.000555311868891 -0.000772130898886 -0.00027720418264
-2605 -0.000622742872596 5.58719690031e-05 0.000175971220613
-2606 0.000545572183978 0.000375935131154 -0.00152135959605
-2607 -0.000629637130485 -0.000779690619211 -0.000498861646305
-2608 0.000188103998262 -6.79252339527e-05 -0.000804311344721
-2609 0.000321051949502 -0.00169131040369 0.000605275013949
-2610 9.16149613071e-06 0.000796059374525 0.000596673959012
-2611 -0.000158075614527 -0.000996681173507 0.000235911051764
-2612 1.19627879847e-05 0.00021809852693 -0.000541913848467
-2613 -0.000447586616365 0.000182791776571 7.85134631273e-05
-2614 -0.000562897066467 0.000917399530351 -0.000421163883198
-2615 7.93827403337e-05 0.0011126547019 -0.000692136637996
-2616 0.000769287275575 -0.000184119333498 -1.01671250065e-05
-2617 5.18660940994e-05 0.000672919791424 -0.000122186894857
-2618 0.000575628156484 0.000230226623766 -0.000728549799022
-2619 0.00015627398999 0.000630472785694 -1.64515408956e-05
-2620 -0.000405551995655 5.74963072066e-05 0.000221729945662
-2621 0.000188468442889 -0.000300112900965 -0.00148546453391
-2622 0.000282127370913 0.000396721478498 -0.000746674919426
-2623 7.24188902968e-05 -0.000302888107335 5.75032671063e-05
-2624 9.21212390647e-05 7.87421788024e-05 0.000460073874767
-2625 -0.00124317482793 -4.78959956615e-05 -0.000897816109137
-2626 -0.000542417585311 0.000159734812572 0.000106632839609
-2627 0.00021217446869 0.000566973289916 -0.000692809152823
-2628 4.43903170078e-07 -0.00161706951222 -0.00111848418709
-2629 1.36693708288e-05 0.00069210092883 9.0681975482e-05
-2630 0.000524233757336 -2.18510785407e-07 0.000729058326593
-2631 0.0008094464008 8.90601325475e-05 -0.00037781957121
-2632 -0.000196823237692 0.000265987645777 -0.000544866310528
-2633 -0.00125241848262 0.000500117282941 0.000223551069527
-2634 0.00106822623382 -0.000821751258518 -0.000345727886926
-2635 0.00104130629483 -0.000200078766895 0.000356298820028
-2636 0.00111724394146 0.000389894747364 -0.000413206746609
-2637 0.000336894518876 -0.000721116600507 -0.00103230411717
-2638 4.54133914819e-05 0.000372267256864 0.00142810248182
-2639 -0.000483517549578 -0.000492118811692 -0.000977403608298
-2640 -0.000451782240437 5.26534524636e-05 9.73375465992e-05
-2641 0.000526375624872 -9.43471925152e-05 -0.000718312212233
-2642 0.000262717880227 0.000263910244519 0.000253643936281
-2643 -7.67844389234e-05 0.000351585803564 -0.00126307035332
-2644 0.000777302588513 0.000165991026559 -0.000624471521009
-2645 -0.000616314305772 0.00120485875071 0.000193782285209
-2646 0.000914701641612 -0.000588943696745 0.00012420469118
-2647 0.000130052739995 0.000614059110851 -0.000233526826996
-2648 0.000714296636525 0.000463324101573 0.000457506358332
-2649 0.000971092888932 -0.000737364778121 0.00065589327495
-2650 0.000775882149081 0.000759819782185 -0.000437985514827
-2651 -0.000839465799245 0.000244664803445 -0.000232019673244
-2652 -0.000619819918051 -0.000514183162687 0.000664241051449
-2653 0.000133010267304 -8.64951564506e-05 0.000115197617328
-2654 -0.000247355480775 0.000396575458714 0.000202240747628
-2655 0.000677468315126 -0.000675208069406 -0.000216738358903
-2656 0.000919496987928 -0.00059870733499 -0.000310541959408
-2657 -0.000264361464309 -0.00052491557601 0.000636392128708
-2658 0.0002231942268 0.000937667299343 -0.000196530935787
-2659 0.00012621609603 0.000164784519138 0.000545510435165
-2660 -0.000722404300496 -0.000183470408011 -0.000764420053786
-2661 0.000718792476958 -1.6233919906e-05 0.000489176343655
-2662 0.000898784230873 -0.000575575080841 0.000301028115944
-2663 -0.000927973175297 -0.000412098299862 -0.000248536010351
-2664 -0.000476085972037 -0.00103352809321 -8.57919946354e-05
-2665 0.000231990378711 0.000244615978296 -0.000550640415715
-2666 0.00045775644646 -0.000865649897962 0.00056457157614
-2667 0.000407911611029 -0.00015716832756 0.000202468979587
-2668 0.00100136508514 0.00050795551537 -0.000397055506671
-2669 0.000728008124434 -0.000626543462906 -0.000194118736371
-2670 0.000665667678806 0.00056041552309 -0.000537141548292
-2671 0.00171398447113 0.00105567528928 -7.65742261478e-05
-2672 4.45403075139e-05 -0.000893387768419 0.00076267972018
-2673 0.000550084029209 -0.000269102769767 -0.000155016757572
-2674 -0.000313807981032 -0.00138356380544 0.000478863064999
-2675 0.000110678759153 -3.96288231858e-05 -0.000477177198929
-2676 -1.99941929625e-05 7.30478813217e-05 -0.000212175158282
-2677 2.36419081998e-05 -2.15284588398e-05 -0.000538480395556
-2678 -0.000887686896286 -0.000226590035253 -0.000266595724698
-2679 0.000331160981027 0.000376961587567 -0.000479964977491
-2680 0.000359724898613 0.000630069172716 0.000294243257804
-2681 0 0 0
-2682 0 0 0
-2683 0 0 0
-2684 0 0 0
-2685 0 0 0
-2686 0 0 0
-2687 0 0 0
-2688 0 0 0
-2689 0 0 0
-2690 0 0 0
-2691 0 0 0
-2692 0 0 0
-2693 0 0 0
-2694 0 0 0
-2695 0 0 0
-2696 0 0 0
-2697 0.00141185174301 0.000501312183415 0.000608978928635
-2698 -1.9100962856e-05 -0.000475882835884 7.60889709039e-05
-2699 3.61617488588e-05 -0.000253952808421 0.000971341799911
-2700 0.00179821639048 -0.00117971727486 8.53373390985e-05
-2701 -8.81485937704e-05 7.29287477326e-05 0.000137341393994
-2702 5.31114264602e-05 -9.56196104002e-05 -0.000775731860571
-2703 0.000300461175963 -0.000393641895513 -0.000403361446053
-2704 -0.000288527318172 -0.00118259134657 -0.000653480939785
-2705 0.000349895370834 -0.00160857797158 9.68481906433e-05
-2706 0.000298160398026 0.000299947065728 -0.000743804351595
-2707 -0.000129996659764 0.000211105583524 0.000540282757691
-2708 0.00115504965532 -0.00150388526972 0.000298398648239
-2709 -0.000416959277578 -0.00061754784643 0.000656529201607
-2710 0.000503728162888 -0.000226215715052 0.00154069231229
-2711 0.000910994171371 -0.000713476932062 1.44222962106e-05
-2712 -0.000897719145865 -0.000766323195434 -0.000109975858019
-2713 -0.000222443350585 -0.000762407523973 7.89317523338e-05
-2714 0.000306910673745 -0.001254553945 -0.000288156514021
-2715 -0.000893015603759 -0.00240028186857 -0.000256270074865
-2716 0.000454423595422 -0.000103923548571 0.000885472515769
-2717 0.000249166524154 0.000277448830002 -0.00013186560655
-2718 0.000139679903823 -4.15179945354e-05 0.000652738130932
-2719 0.00109710388825 -0.000225885239123 -4.03016736211e-05
-2720 0.00144676138638 0.000347807923085 0.000522282929458
-2721 -0.000561843885325 -4.84443414016e-05 0.000326928436452
-2722 0.00111923336191 -4.15105672005e-05 0.000201994334681
-2723 -0.000732653755023 0.000742600073658 -0.000160282412612
-2724 0.000570321608467 0.00023181287138 0.000605131762852
-2725 2.4989817473e-05 0.000758599328178 -0.000576061405138
-2726 2.19078746795e-05 0.000126612885463 7.60199055343e-05
-2727 -0.000199740381389 0.000769726811626 -0.000177447652827
-2728 -0.000905431505134 2.98991035755e-05 -3.03845985039e-05
-2729 8.69875294752e-05 -0.000754999929279 -0.00059645102253
-2730 0.000518719566669 0.000304620864345 -0.000461507214541
-2731 0.000550827831311 -0.000266231772565 0.00105447126703
-2732 -8.82902440049e-05 -0.00133474260427 -0.000698793988953
-2733 -0.000385423222449 0.000671344717313 -0.00029137058505
-2734 0.000338080115099 0.00057587665106 -0.000925940874245
-2735 0.000693958024293 0.000265394886053 0.000458100095548
-2736 0.00108369369582 0.00131934343558 0.000487194957235
-2737 -0.0002912146535 5.61883027355e-05 -0.000926125308996
-2738 0.00122441073324 0.000129795485148 0.000176057648369
-2739 0.00130186560312 0.000390380277875 -3.37339093272e-05
-2740 8.97730303139e-05 0.000626647907357 0.000227064286865
-2741 -0.000254510299607 0.000205514545276 -0.000972269790247
-2742 -0.00040293473986 0.000476685555656 0.00067078056291
-2743 0.000228852193232 0.000120750706096 0.00102895729399
-2744 -0.00057000761145 -0.00014070728087 6.93188684447e-05
-2745 0.000202874842953 -4.57426626235e-05 -0.000166191259438
-2746 -0.000163068666767 -0.00041995441489 -0.00127829674232
-2747 0.000865406143509 0.000268414206672 -0.000381913359705
-2748 0.00129336919538 -0.000496534704185 0.00140823426025
-2749 -8.81535602542e-05 -0.000566177540693 -0.000568798969643
-2750 6.36843369e-05 0.000951698329054 0.000652450270346
-2751 -0.00121927554411 -0.000479990444248 -0.00136953994994
-2752 -0.000465152379154 0.000943303920585 -4.43168673564e-05
-2753 0.000453540643398 2.49630082161e-05 2.21594506868e-05
-2754 0.000324488314644 0.000231699778596 0.000400784076053
-2755 0.000457744307649 -0.00024676480771 -0.000244450692202
-2756 7.34882608653e-05 0.00105951651642 0.000254927614705
-2757 -9.88378625735e-05 -0.00110937743046 -0.000790359765705
-2758 -0.000799474196663 0.00077537138365 -0.000676180810639
-2759 0.00103150838334 -0.000506280019053 -0.000593334991553
-2760 0.000700497395819 0.000511562500812 -7.69935059231e-05
-2761 0.000394811101416 -0.000764225750094 -0.000254364077537
-2762 -4.84526274982e-05 -0.000195330363429 0.000302648314838
-2763 -0.000592794206329 -0.00157564223427 -5.77197738412e-05
-2764 -6.49958278897e-06 -0.000478565240004 -4.32254268605e-05
-2765 0.00060276042389 0.000389493745008 0.000682249850462
-2766 0.000571528664245 -6.77280780121e-05 -0.000162062295977
-2767 0.000268281664799 -0.000883560420089 -0.000463424709392
-2768 0.00118410721565 1.56078559228e-05 -0.00029810286056
-2769 0.000416407731865 0.000186887771181 -0.00032409924129
-2770 0.000288130717197 0.000432043393092 -0.000524649261014
-2771 -0.000581498017316 -0.000522053644215 0.00062523324236
-2772 0.000547679541452 -1.51461536891e-05 -0.00103078283221
-2773 -0.000196840151348 -9.00220554599e-05 -0.000132594162089
-2774 0.000629637323972 4.00867316057e-05 -0.000306737016225
-2775 0.00120746424801 -0.000532472501611 -0.000274579637319
-2776 -7.01470941665e-05 -0.0011031802813 0.000226061251746
-2777 0 0 0
-2778 0 0 0
-2779 0 0 0
-2780 0 0 0
-2781 0 0 0
-2782 0 0 0
-2783 0 0 0
-2784 0 0 0
-2785 0 0 0
-2786 0 0 0
-2787 0 0 0
-2788 0 0 0
-2789 0 0 0
-2790 0 0 0
-2791 0 0 0
-2792 0 0 0
-2793 0.000269112073422 0.00026385176513 -0.000601401792834
-2794 9.83295641259e-05 -0.000284003851127 0.000612352568854
-2795 0.0010576538654 0.00010674124691 -5.68187904382e-05
-2796 0.00010650453159 0.000372248616419 0.000720377885493
-2797 -0.000501510775876 -4.87811829902e-05 -0.000135086820379
-2798 0.000655367592468 -0.000312271883561 -0.00102840374679
-2799 0.000186113956684 -0.000186832982974 -0.000780372884835
-2800 -0.0015289968774 0.000273761183236 0.00044599042431
-2801 0.000736343624552 -6.76074133466e-05 0.000267354829102
-2802 0.000827370451394 -0.000984931636782 9.56054421946e-05
-2803 8.85672166753e-05 0.000367228324784 -0.00044167987407
-2804 -0.00119760699997 -0.000241545563731 -0.00115527626655
-2805 0.000253786788808 -0.000633494632719 -1.6957605555e-05
-2806 0.000152418538733 -0.00075719881291 0.00177697812226
-2807 -0.000986991754447 -0.000301435669503 0.000254825242561
-2808 0.000427050435427 -7.10254394332e-05 -0.000201428546328
-2809 0.00032802301544 0.000469538862301 0.000392620077035
-2810 -0.000714231056485 -0.000322851329198 -0.000423117400014
-2811 -0.00041711278329 -4.85048875173e-05 -0.000303658258932
-2812 -0.000136039019294 0.000465466382156 0.0018758329035
-2813 -0.000878382810073 0.000424206277631 -0.000117666970175
-2814 0.000855067195741 0.000971128884422 -0.000157336232096
-2815 -0.000849430177239 -0.000370918265775 0.00141748618027
-2816 -0.00111681444188 -0.00013379405364 -0.000339933037911
-2817 0.00140195120705 -0.00164808985557 0.000608365051339
-2818 0.000335057644079 -0.000108539810395 0.000601765592104
-2819 0.000689247550533 0.000105603611445 -0.000411756547129
-2820 -0.000194179653192 -0.000594089260478 -0.00044274078325
-2821 0.000104033685415 -0.000520900193926 0.000187334630792
-2822 6.41312915126e-06 -0.00145235524998 -7.15223504682e-05
-2823 3.37135975437e-05 -3.71463907974e-05 0.000389679705631
-2824 -0.000143824022064 -0.000394484805168 -0.000281684747971
-2825 -0.000474910078908 -0.000600470608392 -0.000663404824541
-2826 -0.00114170879845 0.000608928998185 -0.000251154374546
-2827 -0.000858374139033 -0.000258948980651 0.000239954079201
-2828 0.000748812528765 0.00100344323295 -0.000655763604999
-2829 4.03452318865e-05 0.00059393391802 -0.000644343558854
-2830 -0.000143501355088 0.000144570430338 -0.00031900195055
-2831 0.000341764533243 0.00125196106272 0.00101739767491
-2832 0.000290617250245 0.000291382399493 -0.000641469425444
-2833 -0.000440089367121 -0.000684973483822 0.000766324803235
-2834 0.00026352867576 -0.00167134713672 0.000593968664911
-2835 0.000168212494788 0.000109671710174 -0.000536436678033
-2836 -0.000142958345109 -0.000465554593085 4.97841553842e-05
-2837 0.000279409328321 -0.000711787602179 -0.000596293738732
-2838 -0.000165649679284 0.000985134697817 0.000728948128447
-2839 -0.000223148761305 0.0005914314779 0.000233149052978
-2840 -0.000338542482226 9.18865142785e-05 0.00020357360784
-2841 0.00019028329197 0.000165537388854 0.000173512099563
-2842 0.00100303702246 -0.000522192754196 -0.000207292548682
-2843 -0.0002193274108 -0.000869592274314 0.000889577909031
-2844 0.000210773025978 0.000810057925972 0.000125803682972
-2845 0.0008835270036 0.000139225300463 -0.000405595363736
-2846 -0.000139496518968 -0.000188999569118 -0.000193523226882
-2847 -0.000697622752621 -0.000361263956003 0.000507896722116
-2848 -0.000795324220535 -0.00193189487074 -1.23457362894e-05
-2849 0.0012058945529 -0.000586863312567 0.000534105609536
-2850 -0.000987177800835 0.00146793266847 -0.00124646908147
-2851 0.00146273226279 -0.00069404574596 -0.000880055811358
-2852 -0.000728331139986 8.40344502259e-05 -0.000560572962919
-2853 0.0017441939541 0.000230081772957 -0.000371397874715
-2854 -0.000156367303909 0.000623198970011 0.000775389261959
-2855 -0.000777870729388 -1.43401852081e-05 -0.00077730982918
-2856 -0.000356942997516 -0.000950566889836 0.000499344322252
-2857 0.000672833678051 -3.17014661147e-05 -0.000890939455273
-2858 -0.00106203120505 -0.00025076488387 0.000178765129352
-2859 0.000320518221338 -0.000388136912146 -0.000682254036521
-2860 -0.000380037843454 1.91955552852e-05 0.000169269342057
-2861 -0.000145021657966 0.000153456763767 0.000476633518001
-2862 0.000295600448759 -0.000839255236577 0.000492658859587
-2863 0.000247912893737 -0.000305438855976 -0.000372418611262
-2864 0.000215928545772 -0.00110569407266 0.000373823555959
-2865 0.000892917918248 -0.000799791638149 0.00126024622568
-2866 0.000116736320704 0.000426804487078 -4.75496003064e-05
-2867 -0.00019994841904 -0.000346336434971 -0.000267849908449
-2868 0.000880492181247 -0.000107789274108 -0.000630041915075
-2869 0.000647068143242 -0.000288986447357 -0.00108706466296
-2870 0.00048030386245 -3.58787709144e-05 0.000547755847622
-2871 -0.000830598611119 -0.000348100910373 -0.000468742036382
-2872 -8.77031662595e-05 0.00097421803485 0.000231086458203
-2873 0 0 0
-2874 0 0 0
-2875 0 0 0
-2876 0 0 0
-2877 0 0 0
-2878 0 0 0
-2879 0 0 0
-2880 0 0 0
-2881 0 0 0
-2882 0 0 0
-2883 0 0 0
-2884 0 0 0
-2885 0 0 0
-2886 0 0 0
-2887 0 0 0
-2888 0 0 0
-2889 0.000247880496089 -0.000158805922327 -0.000694100199131
-2890 0.00125965532105 -0.00046397966507 0.000763513801137
-2891 -0.000501528757186 0.000271232494327 0.000260941161505
-2892 0.000267332032234 0.000417321999509 0.000236361685371
-2893 -0.00109277460437 -0.000429811448799 -0.00045913798998
-2894 -0.0010242085245 0.000339672219121 3.28127671774e-05
-2895 0.000199026924355 -0.000430853652428 -2.15271717676e-05
-2896 -0.000191935907893 -3.85347392406e-05 9.52892344225e-06
-2897 -0.00107111064936 0.000390168727088 -0.00163067021121
-2898 0.000624611013621 0.000186037984862 -0.000667101453873
-2899 -0.00024456529263 -0.000288745979946 -0.000990385975379
-2900 0.000772737623711 0.000211736391213 -7.25794262954e-05
-2901 -0.000383602672299 -0.000633943327884 0.000412579484509
-2902 -0.000782187315903 0.000854150852976 -0.00147358821543
-2903 0.000797652520698 -0.000947144803256 -2.88701104093e-05
-2904 -0.00101223923835 -0.000764928052705 0.000332963946594
-2905 -9.5458393785e-05 -0.000827764501219 -0.00087583694003
-2906 -0.000238625008927 -0.00056116944177 -0.000934070093772
-2907 0.000955879284829 0.00127043656993 0.000685271680456
-2908 0.00124536294516 -0.000456797126067 0.00019113358371
-2909 0.000118595470762 0.000547764732651 -0.000436254817184
-2910 -0.000759304140068 0.000311113979251 -0.00011745469681
-2911 -0.000440360234983 0.000247893796965 -0.000463384621458
-2912 -0.00081564966165 -0.000232568718472 0.000927389284475
-2913 -0.00105630927135 0.00036925051111 0.000704702605314
-2914 0.000131122413169 0.00158190621881 0.000156797711462
-2915 0.00131100698516 1.35920090293e-06 0.000314194666673
-2916 0.000385465555345 0.000152268446165 0.000555002679579
-2917 -0.000647542727469 -0.00108345441498 -0.000439818018025
-2918 -0.000599429858167 -0.00131172322587 0.000662824622404
-2919 0.000931111189426 -0.000540037920036 0.000881051920953
-2920 -3.93127068175e-05 -0.000126152268532 0.000721981785816
-2921 -0.000209122974219 -0.000468804273259 -1.66202985868e-05
-2922 -0.000325331546463 -0.000721818253614 0.000338874722029
-2923 -0.00038791830611 -0.000315684226402 -3.98432324245e-05
-2924 -0.00112251490368 0.00060854364816 0.000850272500325
-2925 -0.000497473164436 -0.000808019359975 -0.000189755795926
-2926 6.20508805981e-05 -0.000332873744983 4.77034856091e-05
-2927 9.1024406475e-05 -0.000849528259417 -0.000701286384154
-2928 -0.00105525218209 -0.000838185644108 -0.000298145398824
-2929 0.000164744248529 0.000214926536373 -0.000355483363682
-2930 0.00165877460311 -0.000113522802653 0.000440959652103
-2931 -0.000133527395898 0.000176287403161 -0.000547729329547
-2932 0.000138689461907 0.000600956954269 -0.000651745133866
-2933 0.000647138476445 -0.000425476618173 0.000717294275337
-2934 -0.000306391598205 -0.00115061530187 -0.000324818306457
-2935 -0.000485765522197 4.78291013761e-05 0.000392443015907
-2936 0.000706546367696 0.000306457671339 0.00115915274111
-2937 9.08560964652e-05 6.47305974219e-05 0.000769702371572
-2938 0.00086589619971 0.000245162724204 0.00124679621429
-2939 0.000231796250925 8.39125820212e-05 -0.000326162568412
-2940 -7.78405422125e-05 0.000166419342603 0.000111099065001
-2941 0.000327829167658 -0.000917994853928 8.56027026549e-05
-2942 0.000686452300504 -0.00162946099469 1.65071625474e-05
-2943 -0.000494217660289 -0.00105167955913 0.000966050363969
-2944 0.000612089888479 -0.000159421093512 -0.000920392518443
-2945 -0.000534459672978 -0.000984539082492 0.000323200193587
-2946 -0.000688943813442 0.000109430277247 -0.00150725667352
-2947 -0.000148927370106 0.000319821112233 -0.000617140218002
-2948 -0.000409293748729 -0.000309744318503 2.18539404148e-05
-2949 0.000578407263285 -2.67793038338e-05 -0.00043447630329
-2950 0.000742251900265 0.000398411470193 -0.000155987764869
-2951 0.000777371587416 -0.000253648297992 -0.000943890200948
-2952 -0.000638814746908 -0.000436665314715 -0.000195530757083
-2953 -0.000483867045403 0.00116249137047 -0.000387908146507
-2954 0.000470578456773 -0.000389962906792 -2.78122199358e-05
-2955 0.000220001422671 1.90793676311e-05 0.000719882193386
-2956 -0.000586680907691 0.000319900311567 0.000431731922715
-2957 -0.000375802652246 -4.9230966856e-06 -0.00149387748166
-2958 4.44752908599e-06 0.000220411278709 -0.00122362212593
-2959 0.000637670821404 0.00127443069168 -0.000971909641153
-2960 0.000406957477329 0.000331105862819 -0.000189851699483
-2961 3.76113434133e-05 0.000757129670522 0.000287860471999
-2962 -0.000156007085945 -0.00111037269518 7.33206758439e-05
-2963 -0.00122695894235 0.000126860118163 -0.000646780461142
-2964 -0.00135237592851 0.000814928383809 -0.000428582804037
-2965 -0.000306933589918 0.000253766637645 0.000816431649073
-2966 -0.000176538174943 -0.000342156000751 -0.000507973488745
-2967 -0.00032491890408 -0.000556080985647 -6.97718003065e-05
-2968 -0.000289298787842 0.00130763846099 0.0014796123075
-2969 0 0 0
-2970 0 0 0
-2971 0 0 0
-2972 0 0 0
-2973 0 0 0
-2974 0 0 0
-2975 0 0 0
-2976 0 0 0
-2977 0 0 0
-2978 0 0 0
-2979 0 0 0
-2980 0 0 0
-2981 0 0 0
-2982 0 0 0
-2983 0 0 0
-2984 0 0 0
-2985 -0.00163069615743 0.000212186021006 -0.00121231479247
-2986 -0.000952790306145 -6.48887046245e-05 0.000639139904077
-2987 -0.00013012647638 -0.000368272748333 -0.000705056811699
-2988 -0.000567198353001 -1.04315900643e-05 0.000858162645901
-2989 -0.000763139741429 -0.000376954356733 5.44310659308e-05
-2990 0.000103014683608 -0.000140511493329 -4.04510255408e-05
-2991 0.000613882633869 -0.000262370424993 -0.000458570704024
-2992 -0.000280553563299 -0.0010268485802 9.72512324516e-05
-2993 0.000161000474643 -0.000148255538612 7.19788721641e-05
-2994 0.000754908311297 -0.000406984303403 0.000268135766424
-2995 -0.000339235783414 -0.000380206244778 0.0011746336513
-2996 -0.000303589833172 -9.67048582568e-05 -0.000318433588197
-2997 0.000276554018118 -0.000493200242488 0.000134171551635
-2998 0.000512434883425 0.000402593734263 -0.000577564830774
-2999 0.000208369833291 -0.000304607298567 2.29722822846e-05
-3000 0.000753021416259 0.000370057221562 0.00106893702165
-3001 0.00104862816211 -0.000174198055261 0.000374506206502
-3002 -0.000471004980254 0.000575939991981 0.000662901876463
-3003 0.000367089873857 0.000664411658404 0.000623775415507
-3004 0.000815513142928 0.00077123364222 0.000341539121133
-3005 -0.000710392626972 -5.87234750742e-05 -0.00107118925416
-3006 0.00081701553182 5.88679320005e-05 -0.00030318406359
-3007 0.000765787398954 0.000303134433083 0.00018468205659
-3008 -0.000767841984678 -0.000109819847617 0.000101861676874
-3009 -0.000213959486523 -8.32135187683e-05 -0.000986257910369
-3010 -0.000108264971632 0.00042103935505 2.3813685542e-05
-3011 0.000512299706796 -0.000726019932261 4.66637418707e-05
-3012 -0.00011519896304 0.000594959880379 -3.45791326925e-05
-3013 0.0013599094716 -0.00129225881518 -0.000307530016354
-3014 0.000149764914841 0.00115359415248 -4.51965040933e-05
-3015 0.000107706037854 0.000827294955091 -0.000389674271851
-3016 0.000298022784601 -0.000323532206866 0.000137039496391
-3017 -7.51732024937e-05 0.00039217330113 0.000134135071056
-3018 4.32135614518e-05 -0.000692902674221 -0.000133160255078
-3019 -0.000568366361307 -0.000111148010822 -0.000881083895093
-3020 -0.000468555781018 -0.000472670194677 -0.00019677081969
-3021 -0.00102727015974 -0.000378902485012 0.000286528653351
-3022 -0.000827040239129 0.000711969376069 -0.00076808056498
-3023 0.00104440748013 0.000223155864668 0.000572780067969
-3024 0.000458736313401 -0.000111505587853 5.14491250288e-05
-3025 -0.000181379133339 -0.000276521100952 -0.0010168994662
-3026 -0.00112147074003 -0.000580682147713 -0.00029045168947
-3027 -0.000259852987807 0.000613926165544 -0.00105052247829
-3028 -0.00077172890211 0.00132843333798 -4.34194450142e-05
-3029 -0.000852408017465 -0.0001901075591 -0.000458455489217
-3030 -0.000604942379172 0.000238022962799 0.000345439294452
-3031 -0.000600483837014 0.000231314165806 -0.00143855314464
-3032 -0.000658268435476 0.000554206410107 0.000198118434414
-3033 6.03282652821e-05 0.000439195778813 0.000809080513252
-3034 0.000350376238855 -0.000188941461139 5.68523581039e-05
-3035 9.45840050041e-06 -0.000246954889595 0.000412434529737
-3036 0.000605458023036 -0.000820239500783 -0.00102280420373
-3037 0.000152823582123 -0.00038969417526 0.000916633923999
-3038 0.000586141076678 0.000971730349726 0.000646529102118
-3039 -0.000185235023501 -0.00060673086398 0.000360883195327
-3040 -0.000307554964808 0.000370633308291 -4.33478453319e-07
-3041 0.000172184290057 0.00062655143911 -0.00113698487394
-3042 7.67739073897e-05 0.000830428210832 -0.000805687999291
-3043 -0.000143902346672 0.000963213866189 -0.000575380763926
-3044 -0.000262235047697 0.000195098148445 -0.000628636545509
-3045 -0.00127828979328 -0.000142390994742 -9.86011684298e-05
-3046 0.000319767339571 0.000495147256384 -0.00024572489448
-3047 0.000512922621541 0.000228367930079 0.0011252590128
-3048 0.000469989147114 0.000228278092233 0.000566710771449
-3049 0.000585230604456 -0.000885552731884 -0.00158918211277
-3050 0.000508734855759 0.000523947840986 -0.000634179035003
-3051 0.000949677437625 -0.000493496579015 -0.00110189924065
-3052 2.20871999133e-05 -0.000729368930257 -0.000949041671766
-3053 0.000625138547579 0.000845628920654 -0.000168311196177
-3054 0.000774920424951 0.000689510373093 -0.000702400876296
-3055 -0.00172067219315 -0.0011783870566 -0.000317914488658
-3056 0.000535705918543 0.0015301526394 0.00038661042756
-3057 -0.00015696814314 -8.76623859033e-05 0.000113236707648
-3058 0.000601685252502 8.50666389166e-05 0.000168630744766
-3059 -0.000385807880639 0.00116741048773 -0.000257470840014
-3060 3.89309392288e-05 0.00111070178471 0.000497304265883
-3061 0.000261538633526 -0.000809923792436 -0.000399886968229
-3062 -1.75293003439e-05 -0.000835998211526 0.000697204753068
-3063 0.000808919740412 0.000178070775978 -5.47736467075e-05
-3064 -8.25265722326e-07 -0.00016423627553 -0.00098074588215
-3065 0 0 0
-3066 0 0 0
-3067 0 0 0
-3068 0 0 0
-3069 0 0 0
-3070 0 0 0
-3071 0 0 0
-3072 0 0 0
-3073 0 0 0
-3074 0 0 0
-3075 0 0 0
-3076 0 0 0
-3077 0 0 0
-3078 0 0 0
-3079 0 0 0
-3080 0 0 0
-3081 -0.000337656753313 -0.0014838514396 -0.000537594234193
-3082 1.67017596237e-07 -0.000184027646725 0.000992413669348
-3083 -0.00026807039023 -0.00058153820952 -0.00132526360361
-3084 -0.000525252778259 0.000531129340112 0.00110689765077
-3085 -2.58729939997e-05 -0.00042984189394 -2.97868859081e-05
-3086 0.000269932413107 6.38246412113e-05 0.00051030814911
-3087 -0.00118793635064 -0.000517763887493 -0.000633182551425
-3088 0.00128790575611 0.0005634366805 0.000742518375032
-3089 0.000800619758082 -0.00071856147628 -0.000240744587673
-3090 -0.00130125970092 -6.49748989495e-05 0.000202667735795
-3091 -0.000440865453639 0.000141202007234 -0.00100763728387
-3092 -0.000141394052767 0.000619448809792 0.000532075662161
-3093 0.000553187794436 0.00219669197856 -0.000628797128355
-3094 9.12588239463e-05 0.000845941325923 -0.000489214206533
-3095 0.000386150736741 0.00110536151476 -0.000219218619536
-3096 0.000130309071042 0.000272063811133 0.000445885145344
-3097 -0.000504133905432 0.000727879499115 -0.000837933127212
-3098 -0.000120059380259 0.000798708007428 0.00114730005625
-3099 5.4013299448e-06 0.000516495565653 -7.00185252858e-05
-3100 -0.000598187046673 -0.000783331187763 8.31569830124e-05
-3101 -0.000997625131146 0.000194444680307 0.000973509453624
-3102 -0.000486855715954 -0.000123841259599 0.00116595468617
-3103 0.00138257180002 -0.000360208580991 0.000223837075094
-3104 0.000235853540312 -0.000283160886039 -0.000477549732856
-3105 0.00138010978405 0.0003431807117 -0.00101227808229
-3106 0.000591075572149 -0.000434774371209 -6.07413710043e-05
-3107 3.08904582897e-05 -0.000617753658093 0.000282134004591
-3108 -3.44596804097e-05 -0.000648327842433 0.00056580100183
-3109 -0.000163462828383 7.42923458034e-05 7.93872558335e-06
-3110 -0.000539365530006 0.00121597329454 -0.00124435486099
-3111 -0.000654991923314 0.000559878342024 0.000576806719388
-3112 -0.000479245010819 0.000310421480252 -0.00024332648641
-3113 2.59450348223e-05 -0.000440860827178 -3.49203172137e-05
-3114 -0.000349266142171 0.000769875371558 0.000752020276554
-3115 3.34392927045e-05 0.000169387612273 -0.00021485034098
-3116 0.00026694419904 0.000586612274204 0.000574195416892
-3117 0.00118245066388 -0.000488259678479 0.0010732117518
-3118 0.00175846530149 -0.000337493745953 0.000101420697931
-3119 -0.000641314555473 -7.24488738761e-05 8.15498869977e-05
-3120 0.000437324500561 -0.000674281392916 0.000890510472152
-3121 -0.000295478070564 8.52452228764e-05 0.0011738938244
-3122 7.3081490483e-05 -0.000535854669534 0.000887652063098
-3123 0.000416566854048 -0.000549170395671 0.00124289633712
-3124 -0.000430479433037 -0.000290648319077 0.000683629363704
-3125 -0.000102673235114 0.000202833479034 0.00167107958858
-3126 0.00022601240912 -0.000106254989052 0.000927411465178
-3127 0.00028392085847 0.000239929811819 -0.000370327681069
-3128 0.000563155615931 -0.000553487519297 0.000523375090602
-3129 0.000265933916888 0.000654165401292 0.00121016561741
-3130 0.000223084666351 -0.000466168472215 0.000493971665581
-3131 5.28698861678e-05 0.000522067206694 0.000757611257636
-3132 6.78088959866e-05 5.17473427869e-05 -0.000984607243969
-3133 -0.000859252835667 0.000305654418598 -0.00125282775597
-3134 -0.000834660138769 -0.000384414762122 -5.29264425621e-05
-3135 0.000299109034271 0.000225483466641 -0.000248675714774
-3136 -0.000580002389178 -0.000415252922999 -0.000690327306464
-3137 -0.00034809289231 0.00103607819462 0.000659712136921
-3138 -0.00101118967856 -0.00133340955322 -0.000319047292175
-3139 0.000270153045033 0.000916790772451 -0.00114990922591
-3140 0.00069483202551 -0.000221388691622 -2.55198732256e-05
-3141 0.000473625748713 -0.00050670616451 -0.000488491300622
-3142 -0.000118291400781 -0.00196767355331 0.000795910780986
-3143 -1.37251455276e-05 0.000314621945059 -5.49405014517e-05
-3144 0.000640977831163 -0.000934919990327 6.34470185167e-05
-3145 0.000345079416701 -0.000300576501068 4.25458274993e-05
-3146 0.000216327930108 3.93020136209e-05 -0.000128649318079
-3147 -0.000258389462739 -0.000282412204522 -0.000432995419054
-3148 0.000827714086872 -0.000760436620525 -0.000131111743397
-3149 -0.000510618816804 -0.000809175409544 0.000393790281395
-3150 0.00031312921694 -1.08528126905e-05 0.0001245826288
-3151 0.000144527794683 7.39492661527e-05 0.000147181974066
-3152 -0.000816324179275 0.000137762836566 5.65636920077e-05
-3153 0.000422733922405 -0.000687936799054 0.000315876966723
-3154 0.00062256970281 0.000133275509564 -0.000118232254121
-3155 7.54834682552e-05 -0.000374028151891 -0.000372225872173
-3156 0.000142360332219 0.000524789099931 0.00108850930898
-3157 -0.00150606424115 0.000434159856741 0.00128235875202
-3158 0.00054948469472 0.000145345341825 -0.000344967916336
-3159 -0.000228749448801 0.000738632926208 -0.000698010393913
-3160 0.00103052011785 -0.000280052497134 0.000837166950741
-3161 0 0 0
-3162 0 0 0
-3163 0 0 0
-3164 0 0 0
-3165 0 0 0
-3166 0 0 0
-3167 0 0 0
-3168 0 0 0
-3169 0 0 0
-3170 0 0 0
-3171 0 0 0
-3172 0 0 0
-3173 0 0 0
-3174 0 0 0
-3175 0 0 0
-3176 0 0 0
-3177 0.000653380903452 -0.000331155006592 -0.000881636118698
-3178 0.000983099091124 0.000543656737924 0.000390962249388
-3179 0.000125600713886 0.00035078357748 -0.000895499554194
-3180 0.00074368510898 0.000309658011682 -2.2988117846e-05
-3181 -6.2252085808e-05 -0.000363968049211 -0.000144117919588
-3182 0.000410550882425 0.000505022921437 0.000444843896499
-3183 0.00035453770828 -0.00100845175729 -0.000238571298473
-3184 0.000243107677642 0.000371190067154 0.000265027329723
-3185 8.3907575284e-06 -0.00059504465156 -0.000543446462838
-3186 -1.15555158097e-05 -0.000370875423075 -0.000751544237881
-3187 -0.00176476041714 9.13068681833e-05 0.000411328972423
-3188 0.000456936254986 -1.94112454656e-05 -0.00031141055848
-3189 -0.000621547732782 0.00141725476058 0.000651091954934
-3190 0.000307239612766 -0.000691784665781 0.000466976137032
-3191 0.000526975974981 0.000974863072246 -0.000640468998136
-3192 0.00102416074622 0.000166282183767 -0.000945059926871
-3193 0.000414235701288 0.000499322780953 -0.00133630519679
-3194 0.000409299598166 -0.00113173630244 -0.000577097465712
-3195 0.000436992124356 -0.000684346776094 -9.48411710201e-05
-3196 -0.000905495754951 0.000299525109048 0.000116172599064
-3197 0.000832434001758 -0.000974367266453 0.00110351162394
-3198 -0.000228006361861 -0.000443410563641 -0.000214913307361
-3199 0.00121377969406 -0.000331173492013 0.00026508348028
-3200 0.000298547511707 -0.00052637616996 -0.000144988719233
-3201 -0.000629679319752 0.000889388139154 0.00113225086977
-3202 0.000267536539792 -7.7247094751e-05 0.000829900872727
-3203 3.83578094372e-06 -0.00060226453589 0.00049894542966
-3204 6.46957564851e-05 -0.000635978687269 0.00049214515822
-3205 -0.000521498060847 -0.000687983302414 -0.000265006110155
-3206 -0.000971650691869 0.000193826899694 -0.00020347631794
-3207 -0.000709953069743 -0.000418124838148 -0.000583004461618
-3208 0.000489865320914 0.000314446495511 0.00130471860816
-3209 -0.000288951099259 0.000554901460789 0.00062957395415
-3210 0.000356995079896 0.000315325566648 0.00117644906795
-3211 0.000691716610372 -0.000793699441408 0.000648366077637
-3212 0.000687172185128 0.000280052717657 0.00127148775794
-3213 -0.000155726725756 4.52916120892e-05 0.000779645332524
-3214 0.000687090992851 -0.000502296795962 -0.000261453578016
-3215 0.000587384618803 0.00087463218102 0.000769448170767
-3216 -0.000692464100185 -0.0006555758231 -0.000825671819056
-3217 -0.00134985412362 0.000544067577907 0.00092769263622
-3218 -0.00107492883726 -0.000463885116938 -0.000659994445806
-3219 0.000522389743004 -0.00083506012659 0.00129169144677
-3220 0.000245082814705 0.000160615454731 0.00158176190737
-3221 0.00040056883814 -0.000408401302115 -0.000201279916592
-3222 0.000777693143572 -0.00049839957687 0.000702638888637
-3223 0.000682008061604 0.000173504591029 0.00101370731898
-3224 -0.000662189501028 3.40973468266e-05 -0.000421550199778
-3225 0.00197188107853 0.000474718538292 0.000244254253579
-3226 0.00161524367356 0.00016060318399 -0.00014366264248
-3227 -0.000640056164477 0.000122044824693 7.59529389139e-05
-3228 -0.000870474975005 0.00178254866447 0.000946460246424
-3229 -0.000353324833765 -0.000546509748548 1.99100984482e-05
-3230 -0.000914963280339 9.29767991317e-05 -0.00106394227511
-3231 -0.000526861054906 -0.000989823528298 -0.000809798136833
-3232 0.000543926030664 0.000556372433451 -0.00011790061717
-3233 -5.45021056373e-05 0.00125750736635 -0.00141829576984
-3234 0.000298992364531 0.000499246772233 0.00158288844074
-3235 -0.000103154280604 -1.09770596979e-05 -0.000372463694624
-3236 0.00126115448891 0.000466995407013 0.000136756924886
-3237 0.000745527333021 -0.00121005960196 -0.000299586623229
-3238 0.00056195063959 0.000836351425527 0.000826934040999
-3239 0.000348166877431 0.000346484966257 -7.40025762175e-05
-3240 -0.000820739877517 7.52186803881e-05 -0.000255517316145
-3241 -0.000431669529834 0.000439881933928 -0.000721787683874
-3242 4.15096349685e-05 -0.000124168749233 0.000545169984256
-3243 -0.000917051439978 0.000151350558886 -0.000531255946135
-3244 -0.000102407421288 -0.000391476635203 -0.000115588972697
-3245 -0.000788860735849 -0.000609180627129 -1.81502689627e-05
-3246 -0.000580485826274 -0.00155114595237 0.000689276252566
-3247 0.000309819667983 -0.000386951476868 -0.000286621395127
-3248 -0.000675632742202 0.000477276441777 -0.000948792547518
-3249 -0.00118657197757 -0.000389755001813 0.000713981692626
-3250 0.000397567230658 4.61617998346e-05 0.00027446933466
-3251 0.00104045459552 -0.00107351050015 0.000420062147114
-3252 -0.00055502281547 -0.000228605886681 0.00040839510588
-3253 0.000497202759203 0.000499030343741 -0.000605655736577
-3254 -0.00078749151335 -0.000663051204339 -0.00161357911843
-3255 0.000760784336491 0.000482930384685 -0.000493314212298
-3256 7.86326785466e-05 0.000306455433239 -0.000142444921218
-3257 0 0 0
-3258 0 0 0
-3259 0 0 0
-3260 0 0 0
-3261 0 0 0
-3262 0 0 0
-3263 0 0 0
-3264 0 0 0
-3265 0 0 0
-3266 0 0 0
-3267 0 0 0
-3268 0 0 0
-3269 0 0 0
-3270 0 0 0
-3271 0 0 0
-3272 0 0 0
-3273 -5.38232881462e-05 -0.000582488114934 -0.000339985540339
-3274 -0.000476134497117 -0.00112068987049 -0.000276492287184
-3275 0.00139850346546 -0.000895517640617 0.000127919771687
-3276 0.00010472281906 0.000183512224911 0.000271419926975
-3277 -0.000628761035557 -0.000662897113076 0.00180104421431
-3278 6.07742091826e-05 0.0005551741047 0.000285835893059
-3279 0.000133275981586 -0.000144782202682 3.3177970188e-05
-3280 -0.00118244355437 0.000856385141424 -0.000354232562761
-3281 -0.000976570158463 0.000270144983813 0.00134789638594
-3282 0.000414539518342 -0.00091611755159 -2.4880996321e-05
-3283 -0.000516725824071 1.79347472841e-05 -0.000303150012729
-3284 9.75655037595e-05 0.000927134537912 0.000484927373873
-3285 0.000714684204641 -0.000865999528988 -0.00103133165906
-3286 0.00013649149534 0.000992152015272 1.72146108549e-05
-3287 0.000527145988882 -0.000539380363593 0.000860350604314
-3288 -0.000360603907198 0.0005813063905 -7.42591356676e-05
-3289 -2.91580608312e-06 -0.000817388213251 0.000171607151974
-3290 -0.00107790999259 0.000253262782023 6.30179871056e-05
-3291 -0.00023392740777 1.92257106897e-05 0.00043504634092
-3292 -0.000557270369718 0.000808609256739 -0.000145335650626
-3293 -0.00054859120506 0.000113374047749 0.000178603807189
-3294 0.000347385909038 -0.00104746178448 -0.00071037781597
-3295 0.000556364378077 0.0011610558902 0.00112371093475
-3296 1.76119369363e-05 -5.69894664488e-05 -0.000210421539056
-3297 -0.000503627021556 0.000312480024358 -0.000749781443403
-3298 -0.000913410104789 0.000377053257255 0.000587808324304
-3299 0.00164761702639 -0.00121486782204 -0.000638448439786
-3300 -0.000881275880712 0.000589502244594 0.000577138500201
-3301 0.000603984021494 -0.000336146396563 -5.849456218e-05
-3302 -0.00130927654352 -0.000262788230494 -0.000416209492396
-3303 -0.001198172286 0.000522757338402 -0.000568986322531
-3304 -0.000654527868645 0.000598150994881 0.000372618274637
-3305 -0.00107468234411 -0.000889347414818 0.000179883556468
-3306 0.000373661848582 0.000562679021673 0.000761822367948
-3307 0.000493695301177 -0.00134181738403 -1.90376080026e-05
-3308 0.00081406526481 -0.000171872381066 8.5727726889e-05
-3309 0.000883051164627 0.000607955369918 -0.000381510250024
-3310 0.000109265293227 3.19276872146e-07 0.00043974897296
-3311 -0.000779245321039 -0.000943793381547 0.00229782132761
-3312 0.000130346834904 0.00068061579453 0.000648100524186
-3313 -0.000875180977863 -0.000610027895067 0.00044030401699
-3314 0.000790830910649 -0.000226722947129 0.000949553577899
-3315 0.000122497745515 0.000496445067389 -0.000576442748982
-3316 0.000643247308314 8.99258745358e-05 0.00110823776013
-3317 0.000367439346124 0.000396410189075 0.000578121115544
-3318 0.000306647036993 0.000366798912575 -5.35921261546e-05
-3319 -0.000154885149885 0.000846975047428 -5.18141075606e-05
-3320 -0.00011214657657 -0.000489598904144 -4.37007376943e-05
-3321 0.000364991423976 0.000825735987662 0.000560637896089
-3322 -0.000974636985678 0.000505854925537 0.000223864521407
-3323 0.000196889487473 0.000141725279531 -0.000340649275059
-3324 -0.000322302378062 0.000553760871954 -0.000375248544355
-3325 7.18084635289e-05 -0.000205617600096 -0.00142382579882
-3326 -0.000463066219558 -0.00122799556805 -0.00022271461234
-3327 -0.00135270202428 -0.000677253316485 -0.000365297115779
-3328 0.00113128324333 0.000427407368247 3.0002609993e-05
-3329 0.00018959065171 -9.32674200569e-06 0.000810568178624
-3330 -0.000365074699547 0.000304776355393 0.000440355863153
-3331 -0.000374921862215 -0.00101587839412 0.000731304139129
-3332 -0.000452852676665 -0.000706179420771 0.00177449690393
-3333 0.000904366550994 -0.00100821819751 0.000950595813158
-3334 0.000543357872895 0.000413798935361 -7.3870780163e-05
-3335 -0.000307029873837 8.81951893943e-05 0.000377275136824
-3336 0.000146426849494 0.000130573724468 0.000151428737057
-3337 -0.000402127508217 0.000777513054825 -0.00161619906115
-3338 8.4133533982e-05 -0.000111975607999 8.69741598339e-05
-3339 -0.000631872953379 -0.000471102277565 -0.000992270195252
-3340 -0.0007815651615 -0.00112889646324 -0.000141439974641
-3341 4.5765465625e-05 -0.000438143292492 -0.00118529205352
-3342 -0.00118693734924 3.64165953372e-05 -0.000739127462517
-3343 -0.000780403349674 -0.000947583947545 0.00034548420627
-3344 -0.000244929787702 -0.000417781535758 0.00045477622311
-3345 0.000212336248435 0.000306970187569 0.000147980969869
-3346 -0.000142031396499 -0.000502539484695 -0.000648063669673
-3347 0.000939157081629 -0.000453460657419 -0.000135829768042
-3348 0.000904858787987 -0.000194448822139 -0.00123848645966
-3349 0.000528240858701 0.000558269073126 0.000664184972336
-3350 0.000341225466624 0.000692830554723 0.000321753673721
-3351 -0.00098844926829 4.75453213146e-05 -0.000157273536601
-3352 -5.47919895015e-05 0.000539316566546 -6.89199395939e-05
-3353 0 0 0
-3354 0 0 0
-3355 0 0 0
-3356 0 0 0
-3357 0 0 0
-3358 0 0 0
-3359 0 0 0
-3360 0 0 0
-3361 0 0 0
-3362 0 0 0
-3363 0 0 0
-3364 0 0 0
-3365 0 0 0
-3366 0 0 0
-3367 0 0 0
-3368 0 0 0
-3369 -5.69093548877e-05 0.000444330132688 0.000678068324358
-3370 -0.000807216555192 0.000225690854548 -9.76176196647e-05
-3371 -7.04415018484e-05 2.01404140127e-05 -0.000324760038052
-3372 0.000776277870121 2.4571097184e-05 0.0011660850734
-3373 0.000518883331703 -0.000635942377575 0.000677042687765
-3374 0.00048316327077 -0.000786846583705 0.000247459462484
-3375 -0.000438481823206 0.00132832426847 0.000136094562445
-3376 -0.000658827282235 -0.000472362275136 0.000846582521011
-3377 -0.00119564390442 0.000703561060893 0.000789758396288
-3378 -0.000431815435808 -0.000758872394439 -0.000545483145656
-3379 -0.000812213206257 -0.000477986361766 -0.000876521299494
-3380 -0.000364092647073 0.00142258169758 0.00079983029574
-3381 -0.000569513463797 -0.0015288036341 0.000245843917758
-3382 -0.000470884220078 -0.000353905799925 -0.000728155586024
-3383 -0.000869466081114 -0.00214137725506 -0.000423593050981
-3384 -0.00132045472431 -0.000162014404252 -0.000616402598796
-3385 0.000952353258171 0.000788560826569 0.000830186974903
-3386 0.0003947514689 0.000489709124304 0.00109067852623
-3387 0.000542779256897 -0.000727215988339 9.74125347637e-05
-3388 0.000170181766225 0.000467900701235 0.00133146126048
-3389 0.000988530016427 0.000273104707549 0.000170432113961
-3390 0.000365935218879 4.21085625446e-05 0.000353031922605
-3391 -0.00103859175512 0.000253308038737 -0.000417650177584
-3392 -0.00133787567235 -0.00040337143128 0.000605889212187
-3393 -0.00105393188582 3.21091898928e-06 0.000923637688616
-3394 0.000746369220495 0.00056702252435 0.000662994148771
-3395 -0.000529281554236 -6.79293323608e-05 0.000848028414971
-3396 -0.000881277981566 -0.000335469376506 0.00157233891192
-3397 -0.00135549362111 -7.06025738117e-05 0.000678648555441
-3398 0.00032594540605 0.000573133661579 -0.000234915556656
-3399 0.000554775841219 -0.000330652383572 0.000348663577735
-3400 0.000598209189686 -0.000965599981924 1.69486574078e-05
-3401 0.00138851792373 1.41155081755e-05 -0.000818768464586
-3402 -0.000357603894193 -0.000163171542812 0.000719926077333
-3403 0.000139819890671 -0.000188677719973 0.000472739450516
-3404 0.000498844856969 -0.000173274933387 0.000180191602
-3405 -0.000892327043383 -0.000240271596289 -0.000606173456071
-3406 -0.000764156515584 -0.000687716009056 -6.3661984463e-05
-3407 -0.000250855469726 -0.000693124251687 8.88248383733e-06
-3408 -0.00133773163272 -0.000972540729122 2.88577304928e-06
-3409 -0.0016135474392 -0.000197382824698 0.00117423622271
-3410 0.000311248857492 -0.00120004142189 -0.000482172880095
-3411 0.00102926281941 0.00117151708076 0.000100488113035
-3412 -9.37764738161e-05 0.000333347358683 0.000887786154757
-3413 0.00142027863265 0.000426040168399 -0.000515401362474
-3414 -0.00086691407537 0.00135841541936 0.000487653980897
-3415 -0.000100719148632 -0.00197339946901 -0.00059520759593
-3416 0.000443061715272 8.80038404461e-05 -0.000322751135957
-3417 -3.16201397552e-06 0.000486205839491 -0.000115503401556
-3418 -0.00110842970567 0.000452448923891 -0.000110248324089
-3419 -0.000838614447477 -6.74949041028e-05 6.42007410115e-05
-3420 -0.000654267727017 -0.000831779367861 0.000396207228662
-3421 -4.90752078649e-05 -0.000477324499112 0.000200854814396
-3422 -0.000398008723309 0.000499463275428 0.000223248450018
-3423 -0.000259311786585 -0.000548118461312 -0.000255126102068
-3424 0.000477062670201 -0.000833326554075 -0.000797090071961
-3425 0.000786227714005 0.000141106960072 -0.000348729934096
-3426 -0.000100714705448 0.000110464185272 0.000694893732025
-3427 0.000980797882936 0.00094158443039 -0.000244047193253
-3428 -0.000194342188072 -2.21956173548e-05 0.000506625278237
-3429 -0.000931025996796 0.000564265838912 -0.00035928581996
-3430 -0.00145029817418 0.000659955317176 -0.000426719942719
-3431 -0.00044151011652 -0.000241802900579 4.55246463526e-05
-3432 6.00241196067e-05 -0.00107534919385 -0.000512759934325
-3433 0.000456503688425 0.000377550070597 1.99379496576e-06
-3434 0.000239814409186 0.000345954452197 0.00028107075378
-3435 -0.000554156875842 0.00111050008047 -0.000716990015437
-3436 -0.00120603300603 -0.000320794927501 -0.000388215618363
-3437 0.00014110181025 0.000290650098723 -0.0006079357266
-3438 0.000532347317557 -0.000360652521708 0.000696403014876
-3439 0.000922071427497 -0.000145492347393 0.000614566682524
-3440 0.000190330623267 -5.91518542882e-05 0.000584147504457
-3441 -7.78779270858e-05 -0.00102036775951 0.00026381517339
-3442 -0.000653069342304 -8.59835246664e-05 7.29008318846e-05
-3443 -0.000376629701888 -0.000345768803551 -6.99857753758e-05
-3444 0.000371869323487 6.16512970482e-05 0.000267388732885
-3445 0.000126033754376 0.00131748801388 -0.000392755024403
-3446 -0.000504709391121 -0.000174709424119 -0.000443637489907
-3447 -0.00116460836953 0.00101606570667 -0.000184889394401
-3448 -0.000470730763731 0.000531387638563 0.000218614842349
-3449 0 0 0
-3450 0 0 0
-3451 0 0 0
-3452 0 0 0
-3453 0 0 0
-3454 0 0 0
-3455 0 0 0
-3456 0 0 0
diff --git a/examples/USER/atc/bar1d_two_temperature/uniform_exchange.log b/examples/USER/atc/bar1d_two_temperature/uniform_exchange.log
deleted file mode 100644
index d2b09415e..000000000
--- a/examples/USER/atc/bar1d_two_temperature/uniform_exchange.log
+++ /dev/null
@@ -1,672 +0,0 @@
-LAMMPS (7 Jul 2009)
-#AtC Two temperature Coupling
-# DESCRIPTION:
-# full overlap of MD and FE regions with full periodic boundary conditions.
-# initial electron and phonon temperatures are different and then allowed to
-# relax.
-#
-
-units real
-atom_style atomic
-boundary p p p
-
-# create domain
-#lattice type reduced density rho* = 4*(sigma/a)^3,
-# where N = 4 for fcc,
-# s = 3.405 A (Wagner)
-# a = 5.25 A (Ashcroft & Mermin, p. 70)
-lattice fcc 5.405 origin 0.25 0.25 0.25
-Lattice spacing in x,y,z = 5.405 5.405 5.405
-
-pair_style lj/cut 13.5
-
-read_data uniform_exchange_init.data
- orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
- 1 by 1 by 1 processor grid
- 3456 atoms
- 3456 velocities
-
-region simRegion block -12 12 -3 3 -3 3
-region feRegion block -12 12 -3 3 -3 3
-
-# create atoms
-region mdRegion block -12 12 -3 3 -3 3
-
-# specify interal/ghost atoms
-region mdInternal block -12 12 -3 3 -3 3
-group internal region mdInternal
-3456 atoms in group internal
-
-neighbor 5. bin
-neigh_modify every 10 delay 0 check no
-
-# ID group atc PhysicsType ParameterFile
-fix AtC internal atc two_temperature Ar_ttm.mat
-
-# ID part keywords nx ny nz region
-fix_modify AtC fem create mesh 4 1 1 feRegion p p p
-
-# fix a temperature
-fix_modify AtC transfer fix temperature all 20.0
-fix_modify AtC transfer fix electron_temperature all 30.0
-
-timestep 5.0
-
-# output
-thermo_style custom step pe temp f_AtC[2] f_AtC[4]
-thermo 10
-
-# equilibrate MD field
-fix_modify AtC transfer thermal control rescale 13
-run 500
-Memory usage per processor = 21.0377 Mbytes
-Step PotEng Temp AtC[2] AtC[4]
- 0 -6783.1469 40 20 30
- 10 -6735.22 35.347373 20 30
- 20 -6638.0676 13.590854 20 30
- 30 -6546.9613 16.073857 20 30
- 40 -6490.431 19.681958 20 30
- 50 -6479.6344 18.576331 20 30
- 60 -6478.1607 19.820313 20 30
- 70 -6466.4024 19.347063 20 30
- 80 -6460.4965 20.043544 20 30
- 90 -6475.7847 21.525054 20 30
- 100 -6506.4571 22.734929 20 30
- 110 -6537.5028 21.72233 20 30
- 120 -6560.5557 20.545507 20 30
- 130 -6574.1125 20.005789 20 30
- 140 -6580.4816 20.638888 20 30
- 150 -6583.1325 20.170952 20 30
- 160 -6585.5219 20.117764 20 30
- 170 -6590.0974 20.060397 20 30
- 180 -6596.3875 20.679965 20 30
- 190 -6600.9942 20.347234 20 30
- 200 -6601.4311 19.975895 20 30
- 210 -6598.8067 19.945866 20 30
- 220 -6595.9852 19.679031 20 30
- 230 -6595.1077 19.944269 20 30
- 240 -6595.9943 20.070388 20 30
- 250 -6596.6556 20.011201 20 30
- 260 -6595.7678 20.005789 20 30
- 270 -6593.2664 19.759981 20 30
- 280 -6589.8904 19.770089 20 30
- 290 -6586.5561 19.876762 20 30
- 300 -6583.355 19.976674 20 30
- 310 -6580.8402 19.728887 20 30
- 320 -6579.781 19.931828 20 30
- 330 -6579.6954 20.004298 20 30
- 340 -6579.3344 19.991891 20 30
- 350 -6577.9943 19.863213 20 30
- 360 -6576.2366 19.850666 20 30
- 370 -6575.6064 19.992817 20 30
- 380 -6577.2176 20.076185 20 30
- 390 -6580.379 20.005789 20 30
- 400 -6584.1107 20.372789 20 30
- 410 -6587.9805 20.271504 20 30
- 420 -6590.8266 20.093685 20 30
- 430 -6591.9592 20.011482 20 30
- 440 -6592.611 20.077122 20 30
- 450 -6593.5045 20.07691 20 30
- 460 -6593.8748 20.010686 20 30
- 470 -6593.217 19.98456 20 30
- 480 -6591.7933 19.843386 20 30
- 490 -6589.9573 19.837677 20 30
- 500 -6587.2689 19.832888 20 30
-Loop time of 35.8006 on 1 procs for 500 steps with 3456 atoms
-
-Pair time (%) = 15.2531 (42.6057)
-Neigh time (%) = 6.75833 (18.8777)
-Comm time (%) = 0.191267 (0.534258)
-Outpt time (%) = 0.0041759 (0.0116643)
-Other time (%) = 13.5937 (37.9707)
-
-Nlocal: 3456 ave 3456 max 3456 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 17500 ave 17500 max 17500 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 1.15129e+06 ave 1.15129e+06 max 1.15129e+06 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 2.30259e+06 ave 2.30259e+06 max 2.30259e+06 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 2302588
-Ave neighs/atom = 666.258
-Neighbor list builds = 50
-Dangerous builds = 0
-
-# relax
-fix_modify AtC transfer output uniform_exchangeFE 100 text
-fix_modify AtC transfer atomic_output uniform_exchangeMD 10000
-fix_modify AtC transfer filter type exponential
-fix_modify AtC transfer filter scale 5.0e2
-fix_modify AtC transfer filter on
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer unfix electron_temperature all
-fix_modify AtC transfer thermal control flux
-
-# run with FE
-run 5000
-Memory usage per processor = 21.4955 Mbytes
-Step PotEng Temp AtC[2] AtC[4]
- 500 -6587.2689 19.832888 20 30
- 510 -6583.6679 19.63388 19.99067 29.921403
- 520 -6580.4044 19.4659 19.964127 29.843272
- 530 -6578.0632 19.385557 19.929008 29.765503
- 540 -6576.7688 19.408522 19.894578 29.688066
- 550 -6577.5441 19.634386 19.875758 29.611022
- 560 -6580.0311 20.033795 19.890374 29.53457
- 570 -6582.692 20.453287 19.943612 29.459004
- 580 -6584.4988 20.792547 20.027892 29.384591
- 590 -6584.8106 20.986314 20.129173 29.311509
- 600 -6583.0642 20.973001 20.22873 29.239803
- 610 -6579.3187 20.764598 20.306625 29.16936
- 620 -6575.2098 20.510316 20.35374 29.099949
- 630 -6571.8246 20.325666 20.375584 29.031339
- 640 -6569.5494 20.242631 20.383183 28.96337
- 650 -6568.5339 20.279067 20.388293 28.895976
- 660 -6569.1807 20.481137 20.404722 28.82919
- 670 -6571.8804 20.888192 20.449466 28.763169
- 680 -6575.8853 21.427508 20.536803 28.698198
- 690 -6578.9633 21.878185 20.664173 28.634605
- 700 -6578.9118 22.022484 20.807267 28.572603
- 710 -6575.3784 21.818747 20.931312 28.51215
- 720 -6570.6353 21.492481 21.01549 28.452979
- 730 -6567.3963 21.301197 21.066664 28.39478
- 740 -6566.2643 21.309502 21.105617 28.337373
- 750 -6566.5396 21.457094 21.149722 28.280738
- 760 -6567.3538 21.656064 21.206898 28.224948
- 770 -6568.3366 21.872173 21.278393 28.170108
- 780 -6569.7079 22.127021 21.365289 28.116326
- 790 -6571.8911 22.460621 21.472163 28.063731
- 800 -6573.915 22.778464 21.601239 28.012488
- 810 -6573.25 22.83355 21.736318 27.962706
- 820 -6568.3888 22.472517 21.841822 27.914274
- 830 -6561.7617 21.926658 21.890085 27.866811
- 840 -6557.7119 21.622644 21.892222 27.81988
- 850 -6557.6644 21.705712 21.886316 27.773274
- 860 -6559.1067 21.938106 21.89967 27.727064
- 870 -6558.3139 21.958478 21.924594 27.681388
- 880 -6555.286 21.753082 21.935245 27.636218
- 890 -6553.5069 21.670608 21.929199 27.591405
- 900 -6554.6754 21.873951 21.93129 27.546912
- 910 -6557.3535 22.227866 21.961833 27.502902
- 920 -6559.804 22.562976 22.023052 27.459614
- 930 -6561.1035 22.79027 22.104812 27.417244
- 940 -6561.0754 22.886975 22.193563 27.375888
- 950 -6559.6583 22.843876 22.275637 27.335535
- 960 -6557.4925 22.726414 22.340854 27.296074
- 970 -6556.6435 22.735242 22.393663 27.257372
- 980 -6558.3713 22.994521 22.455738 27.219413
- 990 -6560.8396 23.325967 22.542517 27.182345
- 1000 -6561.3932 23.466884 22.643974 27.146328
- 1010 -6558.92 23.310436 22.73347 27.111357
- 1020 -6554.7313 22.97887 22.788548 27.077224
- 1030 -6551.9728 22.778205 22.811405 27.043641
- 1040 -6552.7121 22.918294 22.830752 27.010464
- 1050 -6555.4107 23.25518 22.874224 26.977793
- 1060 -6557.2332 23.507029 22.942583 26.945836
- 1070 -6557.3475 23.592787 23.019287 26.914715
- 1080 -6556.597 23.589643 23.091387 26.884426
- 1090 -6555.4951 23.548501 23.154448 26.854904
- 1100 -6553.7313 23.441062 23.204214 26.826055
- 1110 -6551.9517 23.328444 23.237874 26.797754
- 1120 -6551.0782 23.301201 23.26207 26.769892
- 1130 -6550.2773 23.281684 23.282808 26.742424
- 1140 -6549.0221 23.216408 23.297021 26.715309
- 1150 -6547.9388 23.165837 23.304079 26.688486
- 1160 -6547.5388 23.17981 23.308483 26.661913
- 1170 -6549.0771 23.386392 23.322795 26.635614
- 1180 -6552.9501 23.82246 23.368332 26.609757
- 1190 -6556.3527 24.216018 23.451529 26.584629
- 1200 -6556.0233 24.248394 23.546626 26.56043
- 1210 -6551.6739 23.885282 23.613811 26.53707
- 1220 -6546.3396 23.413349 23.631352 26.51421
- 1230 -6543.8694 23.214363 23.6148 26.491499
- 1240 -6545.2248 23.388954 23.601111 26.468824
- 1250 -6548.9978 23.804744 23.619657 26.446347
- 1260 -6552.0331 24.153528 23.675151 26.42436
- 1270 -6551.2447 24.130608 23.740189 26.403048
- 1280 -6546.9419 23.761466 23.776739 26.382311
- 1290 -6543.2504 23.442367 23.773669 26.361846
- 1300 -6544.0697 23.560897 23.762296 26.341452
- 1310 -6548.1889 24.00497 23.783494 26.321251
- 1320 -6550.8691 24.316793 23.840927 26.301545
- 1330 -6550.16 24.296091 23.904741 26.282495
- 1340 -6547.5804 24.091397 23.948993 26.264021
- 1350 -6545.5875 23.937081 23.970706 26.245937
- 1360 -6545.7935 23.992778 23.986105 26.228124
- 1370 -6547.9636 24.244836 24.016755 26.210627
- 1380 -6550.0271 24.487949 24.069589 26.193606
- 1390 -6550.748 24.602181 24.133807 26.177193
- 1400 -6549.5567 24.526748 24.193782 26.161407
- 1410 -6545.7348 24.189059 24.226461 26.146114
- 1420 -6541.8049 23.835117 24.220739 26.131029
- 1430 -6539.7085 23.656302 24.19082 26.115899
- 1440 -6539.9557 23.705239 24.158333 26.100628
- 1450 -6542.6224 23.996103 24.146799 26.085297
- 1460 -6546.255 24.386388 24.170746 26.070146
- 1470 -6548.5015 24.643846 24.224187 26.055442
- 1480 -6547.7415 24.610745 24.281882 26.04131
- 1490 -6545.2911 24.406159 24.319952 26.027667
- 1500 -6544.0033 24.31102 24.33879 26.014338
- 1510 -6545.1817 24.454182 24.359724 26.001255
- 1520 -6546.9716 24.656688 24.397463 25.988511
- 1530 -6547.337 24.722103 24.444177 25.976212
- 1540 -6546.4396 24.665666 24.485712 25.964361
- 1550 -6544.6031 24.515493 24.513107 25.952873
- 1560 -6542.0417 24.286541 24.519007 25.941602
- 1570 -6539.924 24.098546 24.503746 25.93037
- 1580 -6539.2427 24.051084 24.479094 25.919055
- 1590 -6540.47 24.188563 24.461792 25.907656
- 1600 -6543.5268 24.510003 24.469289 25.896308
- 1610 -6546.3182 24.810245 24.508235 25.885248
- 1620 -6544.9543 24.707464 24.552878 25.874633
- 1630 -6539.6863 24.213642 24.560345 25.864314
- 1640 -6535.4885 23.822162 24.521524 25.853923
- 1650 -6535.6525 23.850915 24.471296 25.84323
- 1660 -6537.9998 24.099209 24.442787 25.83231
- 1670 -6540.151 24.332665 24.440284 25.821366
- 1680 -6542.4466 24.584801 24.460451 25.810588
- 1690 -6544.8542 24.849339 24.503996 25.800154
- 1700 -6546.292 25.0213 24.564184 25.790224
- 1710 -6546.4347 25.065675 24.628133 25.780869
- 1720 -6545.9648 25.0447 24.685966 25.772068
- 1730 -6545.5871 25.030591 24.73665 25.763758
- 1740 -6544.4505 24.941938 24.77843 25.755877
- 1750 -6541.6713 24.688734 24.79902 25.748305
- 1760 -6539.0289 24.44345 24.7918 25.74083
- 1770 -6539.3176 24.483553 24.775655 25.733299
- 1780 -6542.0848 24.765189 24.779816 25.725774
- 1790 -6543.1928 24.886643 24.805158 25.718447
- 1800 -6540.1609 24.605257 24.818215 25.711348
- 1810 -6535.7937 24.186873 24.792665 25.704246
- 1820 -6534.2421 24.039421 24.74188 25.696869
- 1830 -6536.6369 24.282841 24.703222 25.689179
- 1840 -6539.9801 24.624823 24.700101 25.681396
- 1850 -6540.2476 24.668839 24.715536 25.673753
- 1860 -6538.3668 24.504144 24.720045 25.666255
- 1870 -6537.6209 24.445697 24.712456 25.658791
- 1880 -6538.6438 24.561109 24.709858 25.651336
- 1890 -6539.466 24.660384 24.719506 25.643975
- 1900 -6538.9182 24.624177 24.730114 25.636761
- 1910 -6538.628 24.614154 24.735921 25.629663
- 1920 -6540.1221 24.775356 24.749034 25.622688
- 1930 -6542.452 25.023854 24.78218 25.615953
- 1940 -6543.3431 25.134236 24.830292 25.609607
- 1950 -6541.5193 24.976983 24.869936 25.603669
- 1960 -6539.1628 24.760981 24.885117 25.597985
- 1970 -6539.2823 24.783512 24.889791 25.592402
- 1980 -6540.7963 24.942943 24.90599 25.586942
- 1990 -6540.3741 24.91461 24.927471 25.581689
- 2000 -6538.1889 24.712386 24.933358 25.576588
- 2010 -6536.9679 24.602664 24.922546 25.571493
- 2020 -6537.5036 24.6615 24.912017 25.566344
- 2030 -6538.3282 24.752621 24.910662 25.561191
- 2040 -6539.0384 24.830601 24.917315 25.556104
- 2050 -6539.3726 24.877446 24.92958 25.551136
- 2060 -6538.5177 24.805175 24.939349 25.546301
- 2070 -6536.9777 24.663065 24.936466 25.541529
- 2080 -6536.0953 24.583463 24.923169 25.536721
- 2090 -6535.7139 24.554377 24.906814 25.531831
- 2100 -6535.4232 24.532482 24.889552 25.526846
- 2110 -6535.7906 24.576113 24.874652 25.52177
- 2120 -6537.4405 24.750456 24.871846 25.516662
- 2130 -6540.6254 25.071774 24.893787 25.511671
- 2140 -6543.8757 25.408101 24.946696 25.507027
- 2150 -6544.8455 25.519155 25.016043 25.502922
- 2160 -6542.465 25.303874 25.07216 25.499358
- 2170 -6538.0696 24.881733 25.089735 25.496107
- 2180 -6534.4995 24.537126 25.067709 25.492839
- 2190 -6533.6381 24.451523 25.02814 25.48933
- 2200 -6535.3207 24.617318 24.998296 25.485564
- 2210 -6537.6097 24.846562 24.99231 25.481694
- 2220 -6538.0545 24.899867 25.000682 25.477883
- 2230 -6536.3515 24.740221 25.00117 25.474147
- 2240 -6534.7208 24.587268 24.984642 25.470368
- 2250 -6535.237 24.647545 24.965848 25.466464
- 2260 -6537.1641 24.843312 24.96326 25.462507
- 2270 -6538.6557 24.998812 24.978116 25.45864
- 2280 -6539.5707 25.09882 25.003003 25.454967
- 2290 -6540.1337 25.165772 25.033386 25.451545
- 2300 -6539.6374 25.12831 25.06263 25.448391
- 2310 -6537.488 24.929215 25.076593 25.445435
- 2320 -6535.5588 24.744551 25.069274 25.442517
- 2330 -6535.6453 24.756559 25.054735 25.439519
- 2340 -6537.6865 24.96228 25.053928 25.436478
- 2350 -6539.5064 25.147711 25.073603 25.433547
- 2360 -6538.9785 25.104764 25.097982 25.43083
- 2370 -6535.9938 24.81954 25.10214 25.428252
- 2380 -6533.2946 24.560341 25.077546 25.425598
- 2390 -6533.5869 24.593174 25.045104 25.422718
- 2400 -6536.8933 24.921555 25.035318 25.419686
- 2410 -6541.0746 25.338331 25.064543 25.416767
- 2420 -6542.5816 25.499512 25.119582 25.414232
- 2430 -6540.063 25.264983 25.162836 25.412124
- 2440 -6536.9576 24.968222 25.172898 25.410228
- 2450 -6536.951 24.969345 25.168211 25.408342
- 2460 -6539.4419 25.214921 25.179043 25.406486
- 2470 -6541.1806 25.392515 25.210842 25.404828
- 2480 -6540.4123 25.324658 25.243707 25.403453
- 2490 -6538.0804 25.101896 25.257565 25.402274
- 2500 -6535.6554 24.867152 25.247508 25.401108
- 2510 -6534.4717 24.74523 25.221069 25.399792
- 2520 -6535.4275 24.836527 25.196548 25.398274
- 2530 -6538.0484 25.091527 25.192681 25.396655
- 2540 -6539.9593 25.283759 25.212446 25.395127
- 2550 -6538.2499 25.119889 25.23125 25.393786
- 2560 -6533.5145 24.658368 25.214545 25.392466
- 2570 -6530.2956 24.339786 25.159637 25.390847
- 2580 -6531.6565 24.468597 25.102613 25.38877
- 2590 -6536.4187 24.933447 25.083292 25.386406
- 2600 -6540.3305 25.323643 25.109487 25.384115
- 2610 -6539.7078 25.278653 25.148619 25.382134
- 2620 -6535.3812 24.864243 25.15787 25.380367
- 2630 -6531.6571 24.503504 25.126242 25.378503
- 2640 -6532.1378 24.548061 25.083352 25.376328
- 2650 -6536.513 24.978713 25.07096 25.373943
- 2660 -6541.0671 25.432831 25.105063 25.371683
- 2670 -6542.5346 25.593366 25.164578 25.369841
- 2680 -6541.3055 25.487926 25.218359 25.368472
- 2690 -6539.0338 25.274683 25.250359 25.367447
- 2700 -6536.932 25.070102 25.258694 25.366577
- 2710 -6536.337 25.014184 25.253661 25.36571
- 2720 -6537.5684 25.134734 25.25396 25.364822
- 2730 -6538.7522 25.254801 25.267149 25.364002
- 2740 -6538.738 25.257133 25.284427 25.363317
- 2750 -6538.1195 25.200206 25.296109 25.362752
- 2760 -6538.4498 25.232579 25.305125 25.362266
- 2770 -6539.4182 25.327904 25.320942 25.36188
- 2780 -6539.5018 25.338481 25.340332 25.361643
- 2790 -6539.179 25.307551 25.355836 25.361546
- 2800 -6538.7423 25.263215 25.36689 25.361552
- 2810 -6536.8564 25.077086 25.366095 25.361603
- 2820 -6533.8447 24.780923 25.340443 25.361545
- 2830 -6532.5021 24.64363 25.295434 25.36119
- 2840 -6533.9931 24.78317 25.25683 25.360494
- 2850 -6536.148 24.990655 25.241027 25.359597
- 2860 -6536.449 25.01986 25.237977 25.358651
- 2870 -6535.2997 24.91021 25.22919 25.357671
- 2880 -6534.3565 24.818339 25.211284 25.356589
- 2890 -6533.5574 24.737242 25.187118 25.355347
- 2900 -6533.454 24.730052 25.160421 25.353908
- 2910 -6535.0653 24.887773 25.144195 25.352305
- 2920 -6537.6792 25.149129 25.150698 25.350682
- 2930 -6540.0654 25.391995 25.18162 25.349231
- 2940 -6540.3661 25.43401 25.223084 25.348094
- 2950 -6539.3637 25.343507 25.255387 25.34726
- 2960 -6539.8616 25.396878 25.28256 25.346653
- 2970 -6540.7425 25.489455 25.316564 25.346293
- 2980 -6539.5572 25.379366 25.346386 25.346198
- 2990 -6536.6805 25.103907 25.352834 25.346246
- 3000 -6534.4652 24.884149 25.333822 25.346228
- 3010 -6534.1671 24.849993 25.305501 25.346008
- 3020 -6534.8623 24.914856 25.283048 25.345587
- 3030 -6535.6612 24.993225 25.26938 25.34503
- 3040 -6537.6493 25.186591 25.269652 25.344424
- 3050 -6539.9926 25.42064 25.292463 25.343922
- 3060 -6539.7826 25.40483 25.323614 25.343656
- 3070 -6537.5109 25.184227 25.337514 25.343575
- 3080 -6535.6456 24.998436 25.329887 25.343505
- 3090 -6534.5985 24.892705 25.309812 25.343317
- 3100 -6534.1432 24.842631 25.284758 25.342947
- 3110 -6533.9749 24.823894 25.259178 25.342378
- 3120 -6534.0254 24.824242 25.235123 25.341619
- 3130 -6535.3169 24.949861 25.218498 25.3407
- 3140 -6538.8237 25.296996 25.227751 25.339758
- 3150 -6541.5395 25.569606 25.268148 25.339038
- 3160 -6541.2883 25.553386 25.315141 25.33869
- 3170 -6539.7281 25.40703 25.347478 25.338656
- 3180 -6538.5967 25.297385 25.364213 25.338806
- 3190 -6537.7425 25.2129 25.371095 25.339041
- 3200 -6535.9467 25.035124 25.365116 25.339279
- 3210 -6533.3 24.773082 25.337727 25.339378
- 3220 -6530.6338 24.504815 25.287305 25.339161
- 3230 -6529.1331 24.349645 25.220879 25.338472
- 3240 -6530.1991 24.446533 25.158679 25.337268
- 3250 -6534.3024 24.844155 25.127479 25.335701
- 3260 -6539.5426 25.358505 25.145934 25.334112
- 3270 -6541.5921 25.569557 25.198132 25.332851
- 3280 -6539.6223 25.390844 25.243112 25.332003
- 3290 -6537.2113 25.16368 25.261615 25.3314
- 3300 -6536.1615 25.065082 25.263657 25.330867
- 3310 -6535.8385 25.034668 25.260387 25.330326
- 3320 -6535.6703 25.021271 25.255639 25.329756
- 3330 -6535.8095 25.03327 25.251102 25.329153
- 3340 -6536.2748 25.082314 25.250386 25.328534
- 3350 -6536.6 25.112787 25.253728 25.327932
- 3360 -6536.7488 25.130726 25.258572 25.32737
- 3370 -6537.3855 25.194718 25.2668 25.326861
- 3380 -6538.1563 25.270292 25.281642 25.326449
- 3390 -6538.3249 25.290401 25.299512 25.326175
- 3400 -6537.5034 25.213493 25.313081 25.32603
- 3410 -6535.2381 24.99426 25.310262 25.325931
- 3420 -6533.2319 24.794828 25.286114 25.325714
- 3430 -6533.3393 24.798837 25.255413 25.325267
- 3440 -6535.4422 25.003549 25.239243 25.324633
- 3450 -6537.9943 25.254931 25.248171 25.323985
- 3460 -6538.7605 25.331471 25.272125 25.323491
- 3470 -6537.7503 25.233915 25.290464 25.323175
- 3480 -6537.0843 25.169627 25.298439 25.322956
- 3490 -6537.1112 25.170227 25.303272 25.322785
- 3500 -6537.7611 25.234727 25.310985 25.322661
- 3510 -6538.2408 25.283019 25.324602 25.322626
- 3520 -6536.8595 25.147213 25.332621 25.322686
- 3530 -6533.7188 24.83662 25.316807 25.322715
- 3540 -6530.7734 24.540788 25.272188 25.322492
- 3550 -6529.7444 24.433842 25.212795 25.321842
- 3560 -6531.3469 24.584517 25.162556 25.320754
- 3570 -6534.0579 24.848326 25.13945 25.319392
- 3580 -6535.2761 24.97031 25.13723 25.317962
- 3590 -6535.1081 24.963418 25.138825 25.31655
- 3600 -6534.7802 24.93572 25.138272 25.315153
- 3610 -6534.3909 24.90361 25.134511 25.313748
- 3620 -6535.3477 25.002897 25.133519 25.312329
- 3630 -6538.679 25.334465 25.154688 25.310995
- 3640 -6541.4791 25.616476 25.20632 25.309976
- 3650 -6539.778 25.460697 25.258053 25.3094
- 3660 -6535.1377 25.010006 25.271211 25.309084
- 3670 -6532.6338 24.765372 25.247769 25.308698
- 3680 -6534.3079 24.929933 25.225526 25.30811
- 3690 -6537.9993 25.294817 25.233913 25.307474
- 3700 -6540.3433 25.529579 25.271624 25.307047
- 3710 -6539.9411 25.49804 25.313231 25.306955
- 3720 -6539.2002 25.430008 25.34382 25.307142
- 3730 -6539.2664 25.436451 25.369625 25.307543
- 3740 -6538.5567 25.365851 25.39078 25.308129
- 3750 -6536.2916 25.143204 25.395047 25.308812
- 3760 -6533.7851 24.891501 25.374724 25.309416
- 3770 -6532.7643 24.783967 25.339286 25.30978
- 3780 -6533.4489 24.842155 25.306126 25.309862
- 3790 -6535.0135 24.991419 25.287313 25.30974
- 3800 -6535.4923 25.037885 25.280918 25.309534
- 3810 -6533.5853 24.848268 25.266669 25.309259
- 3820 -6531.8583 24.678119 25.233693 25.30879
- 3830 -6533.6311 24.850013 25.204527 25.30806
- 3840 -6538.3299 25.310761 25.211531 25.307247
- 3850 -6542.574 25.73673 25.262558 25.306692
- 3860 -6542.5857 25.748011 25.329936 25.306642
- 3870 -6537.0829 25.215826 25.361756 25.307001
- 3880 -6532.1817 24.735668 25.336047 25.307348
- 3890 -6534.4809 24.953451 25.302546 25.30741
- 3900 -6540.4701 25.539887 25.318158 25.307401
- 3910 -6542.9599 25.792473 25.374044 25.307717
- 3920 -6540.5413 25.561212 25.421677 25.308463
- 3930 -6536.3122 25.147316 25.430381 25.309418
- 3940 -6533.6221 24.879512 25.404882 25.310273
- 3950 -6533.3474 24.842024 25.369272 25.310862
- 3960 -6533.7666 24.874337 25.338585 25.311184
- 3970 -6533.6879 24.863079 25.311849 25.311283
- 3980 -6533.244 24.816284 25.284335 25.311169
- 3990 -6533.259 24.815347 25.256556 25.310836
- 4000 -6534.5517 24.939522 25.237776 25.310319
- 4010 -6536.0789 25.091987 25.235683 25.30973
- 4020 -6535.8844 25.078138 25.240131 25.309169
- 4030 -6535.3555 25.02731 25.238437 25.308623
- 4040 -6537.1013 25.197763 25.243021 25.308079
- 4050 -6539.6199 25.449006 25.270042 25.307671
- 4060 -6540.3986 25.531772 25.310327 25.307547
- 4070 -6539.5084 25.451784 25.34529 25.307728
- 4080 -6538.1577 25.324203 25.365895 25.308122
- 4090 -6537.5593 25.267095 25.37547 25.308621
- 4100 -6537.8475 25.293 25.383723 25.309181
- 4110 -6537.8872 25.295676 25.393196 25.309808
- 4120 -6537.2622 25.231835 25.398449 25.310491
- 4130 -6536.0501 25.111078 25.394152 25.311171
- 4140 -6534.4892 24.954586 25.376477 25.311756
- 4150 -6533.6538 24.868587 25.348298 25.312146
- 4160 -6534.5523 24.956357 25.323523 25.312315
- 4170 -6536.6395 25.157201 25.316528 25.312359
- 4180 -6538.3119 25.320029 25.328083 25.312432
- 4190 -6538.8911 25.376999 25.348713 25.312642
- 4200 -6537.9572 25.290203 25.365223 25.313004
- 4210 -6536.7709 25.173775 25.368577 25.313437
- 4220 -6537.2691 25.220268 25.368689 25.313867
- 4230 -6538.2886 25.321535 25.377853 25.314331
- 4240 -6537.9491 25.287644 25.38953 25.314884
- 4250 -6536.1194 25.109123 25.388466 25.315478
- 4260 -6534.3985 24.937074 25.3697 25.31598
- 4270 -6533.6519 24.858538 25.341305 25.316282
- 4280 -6533.8806 24.875393 25.312936 25.316353
- 4290 -6535.9379 25.072139 25.297539 25.316245
- 4300 -6539.6662 25.437267 25.31242 25.316139
- 4310 -6541.739 25.643241 25.355427 25.316286
- 4320 -6539.0241 25.382742 25.389952 25.316764
- 4330 -6533.5044 24.842688 25.378465 25.317324
- 4340 -6529.9373 24.486837 25.323472 25.317585
- 4350 -6530.4701 24.528733 25.260973 25.317353
- 4360 -6533.7894 24.845446 25.224514 25.316729
- 4370 -6537.5183 25.209526 25.225723 25.315986
- 4380 -6539.6412 25.425416 25.254686 25.315391
- 4390 -6539.0509 25.374158 25.28781 25.315063
- 4400 -6536.1206 25.091171 25.299323 25.314919
- 4410 -6533.9567 24.879583 25.283889 25.314741
- 4420 -6534.7145 24.951514 25.264894 25.31441
- 4430 -6536.2656 25.104852 25.261386 25.313996
- 4440 -6536.1346 25.092331 25.264813 25.313599
- 4450 -6534.8926 24.974094 25.259499 25.3132
- 4460 -6535.057 24.9926 25.249055 25.31273
- 4470 -6537.3839 25.220723 25.253033 25.312232
- 4480 -6540.2277 25.503923 25.282586 25.311879
- 4490 -6541.8456 25.669268 25.331215 25.311852
- 4500 -6541.091 25.601424 25.378769 25.312218
- 4510 -6538.9713 25.39624 25.406706 25.312877
- 4520 -6537.3013 25.233013 25.413671 25.313655
- 4530 -6536.8398 25.183688 25.410637 25.31443
- 4540 -6536.3536 25.132267 25.404731 25.315164
- 4550 -6534.3097 24.929694 25.386713 25.315802
- 4560 -6531.8407 24.683308 25.34745 25.316203
- 4570 -6530.9144 24.583408 25.294813 25.316223
- 4580 -6532.7912 24.75696 25.252108 25.315855
- 4590 -6535.7514 25.045266 25.238033 25.315274
- 4600 -6537.6363 25.229728 25.248103 25.3147
- 4610 -6537.792 25.251127 25.266171 25.314255
- 4620 -6536.3983 25.117623 25.276005 25.313929
- 4630 -6534.5672 24.939853 25.268776 25.313611
- 4640 -6533.4331 24.828261 25.24834 25.313176
- 4650 -6533.8103 24.863909 25.226376 25.312567
- 4660 -6536.1182 25.089611 25.219959 25.311847
- 4670 -6539.7174 25.446333 25.243392 25.311204
- 4680 -6542.3279 25.710054 25.295851 25.310885
- 4690 -6541.4186 25.631483 25.351201 25.311017
- 4700 -6537.8829 25.288876 25.377928 25.311473
- 4710 -6534.4499 24.950975 25.368312 25.311974
- 4720 -6532.1278 24.715487 25.333007 25.312276
- 4730 -6530.8911 24.58177 25.283963 25.312232
- 4740 -6531.2701 24.611996 25.234939 25.311792
- 4750 -6533.3482 24.810093 25.202985 25.311035
- 4760 -6535.5974 25.03102 25.195283 25.310138
- 4770 -6536.9532 25.166885 25.204967 25.30927
- 4780 -6537.7181 25.248615 25.223325 25.308526
- 4790 -6537.6447 25.247517 25.244092 25.307948
- 4800 -6536.6577 25.153281 25.256841 25.307508
- 4810 -6536.8034 25.168748 25.263785 25.307139
- 4820 -6538.3174 25.317178 25.279721 25.306859
- 4830 -6538.9558 25.381122 25.305443 25.306755
- 4840 -6537.7898 25.268152 25.325142 25.306839
- 4850 -6535.7991 25.075013 25.32706 25.307004
- 4860 -6534.1303 24.911139 25.311502 25.307103
- 4870 -6532.9988 24.800685 25.284748 25.307027
- 4880 -6532.8016 24.778236 25.254157 25.306719
- 4890 -6533.9121 24.885926 25.231314 25.306198
- 4900 -6535.7463 25.064522 25.225147 25.305571
- 4910 -6537.8798 25.273809 25.238247 25.304983
- 4920 -6539.1951 25.406749 25.267581 25.30458
- 4930 -6537.4521 25.240192 25.291972 25.304408
- 4940 -6533.9081 24.894588 25.285942 25.304306
- 4950 -6532.7343 24.778079 25.25729 25.304043
- 4960 -6534.5236 24.952741 25.237351 25.303576
- 4970 -6536.2977 25.126322 25.23785 25.303047
- 4980 -6536.9578 25.194672 25.248843 25.302579
- 4990 -6537.1578 25.217257 25.262555 25.302215
- 5000 -6536.8376 25.187791 25.274576 25.301959
- 5010 -6536.1979 25.125233 25.280363 25.301773
- 5020 -6535.9038 25.097062 25.281288 25.30161
- 5030 -6535.5094 25.058244 25.27963 25.301446
- 5040 -6534.6382 24.970893 25.27155 25.301245
- 5050 -6534.2083 24.93028 25.257573 25.300953
- 5060 -6534.8051 24.98816 25.246427 25.300559
- 5070 -6535.6238 25.068136 25.243858 25.300117
- 5080 -6535.8714 25.093069 25.246352 25.299685
- 5090 -6535.9431 25.101267 25.249454 25.299279
- 5100 -6536.3657 25.142361 25.254857 25.298908
- 5110 -6536.449 25.153818 25.262675 25.298596
- 5120 -6536.2916 25.142934 25.268877 25.298342
- 5130 -6537.05 25.216595 25.277483 25.298143
- 5140 -6537.9504 25.307283 25.294484 25.298049
- 5150 -6537.5766 25.271706 25.31233 25.298102
- 5160 -6536.315 25.15146 25.319554 25.298254
- 5170 -6535.9252 25.114151 25.317923 25.298416
- 5180 -6536.4797 25.166993 25.31887 25.29857
- 5190 -6536.1179 25.131359 25.321011 25.298741
- 5200 -6534.9205 25.015122 25.314483 25.298895
- 5210 -6534.1764 24.937389 25.298688 25.298953
- 5220 -6534.5271 24.971833 25.282929 25.298879
- 5230 -6535.3186 25.047102 25.27495 25.298714
- 5240 -6535.931 25.108114 25.273958 25.298519
- 5250 -6536.9152 25.207036 25.280381 25.298348
- 5260 -6538.4517 25.35902 25.298595 25.298277
- 5270 -6539.799 25.494651 25.329407 25.298406
- 5280 -6539.8898 25.50717 25.36441 25.298803
- 5290 -6538.0805 25.333627 25.38759 25.299432
- 5300 -6535.0967 25.042437 25.384621 25.300131
- 5310 -6533.658 24.896665 25.359622 25.300693
- 5320 -6535.3136 25.053548 25.339646 25.301057
- 5330 -6537.5652 25.272894 25.342373 25.301359
- 5340 -6537.8096 25.296812 25.356373 25.301742
- 5350 -6535.8769 25.106667 25.359182 25.302196
- 5360 -6533.9006 24.911229 25.341371 25.302578
- 5370 -6533.6917 24.885202 25.315233 25.302769
- 5380 -6535.1639 25.02472 25.298247 25.302783
- 5390 -6536.8588 25.192813 25.299422 25.302742
- 5400 -6536.3923 25.145895 25.306382 25.30275
- 5410 -6534.0169 24.912716 25.296709 25.302752
- 5420 -6532.4609 24.759441 25.268064 25.302588
- 5430 -6533.6554 24.873377 25.240966 25.302189
- 5440 -6537.273 25.226778 25.241142 25.301685
- 5450 -6540.52 25.548422 25.275716 25.301341
- 5460 -6540.7994 25.581781 25.323131 25.301347
- 5470 -6538.9727 25.411283 25.356422 25.301676
- 5480 -6538.026 25.32227 25.372919 25.302184
- 5490 -6538.1542 25.336104 25.386457 25.302798
- 5500 -6536.874 25.212637 25.393998 25.303497
-Loop time of 478.494 on 1 procs for 5000 steps with 3456 atoms
-
-Pair time (%) = 152.419 (31.8539)
-Neigh time (%) = 67.4687 (14.1002)
-Comm time (%) = 1.95807 (0.409215)
-Outpt time (%) = 0.0418682 (0.00875)
-Other time (%) = 256.606 (53.6279)
-
-Nlocal: 3456 ave 3456 max 3456 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 17500 ave 17500 max 17500 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 1.15063e+06 ave 1.15063e+06 max 1.15063e+06 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 2.30127e+06 ave 2.30127e+06 max 2.30127e+06 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 2301266
-Ave neighs/atom = 665.876
-Neighbor list builds = 500
-Dangerous builds = 0
diff --git a/examples/USER/atc/bar1d_two_temperature/uniform_exchange_init.data b/examples/USER/atc/bar1d_two_temperature/uniform_exchange_init.data
deleted file mode 100644
index 12157e90e..000000000
--- a/examples/USER/atc/bar1d_two_temperature/uniform_exchange_init.data
+++ /dev/null
@@ -1,6935 +0,0 @@
-LAMMPS data file from restart file: timestep = 0, procs = 1
-
-3456 atoms
-
-1 atom types
-
--64.86 64.86 xlo xhi
--16.215 16.215 ylo yhi
--16.215 16.215 zlo zhi
-
-Masses
-
-1 39.95
-
-Pair Coeffs
-
-1 0.238 3.405
-
-Atoms
-
-1 1 -63.50875 -14.86375 -14.86375 0 0 0
-2 1 -60.80625 -12.16125 -14.86375 0 0 0
-3 1 -60.80625 -14.86375 -12.16125 0 0 0
-4 1 -63.50875 -12.16125 -12.16125 0 0 0
-5 1 -58.10375 -14.86375 -14.86375 0 0 0
-6 1 -55.40125 -12.16125 -14.86375 0 0 0
-7 1 -55.40125 -14.86375 -12.16125 0 0 0
-8 1 -58.10375 -12.16125 -12.16125 0 0 0
-9 1 -52.69875 -14.86375 -14.86375 0 0 0
-10 1 -49.99625 -12.16125 -14.86375 0 0 0
-11 1 -49.99625 -14.86375 -12.16125 0 0 0
-12 1 -52.69875 -12.16125 -12.16125 0 0 0
-13 1 -47.29375 -14.86375 -14.86375 0 0 0
-14 1 -44.59125 -12.16125 -14.86375 0 0 0
-15 1 -44.59125 -14.86375 -12.16125 0 0 0
-16 1 -47.29375 -12.16125 -12.16125 0 0 0
-17 1 -41.88875 -14.86375 -14.86375 0 0 0
-18 1 -39.18625 -12.16125 -14.86375 0 0 0
-19 1 -39.18625 -14.86375 -12.16125 0 0 0
-20 1 -41.88875 -12.16125 -12.16125 0 0 0
-21 1 -36.48375 -14.86375 -14.86375 0 0 0
-22 1 -33.78125 -12.16125 -14.86375 0 0 0
-23 1 -33.78125 -14.86375 -12.16125 0 0 0
-24 1 -36.48375 -12.16125 -12.16125 0 0 0
-25 1 -31.07875 -14.86375 -14.86375 0 0 0
-26 1 -28.37625 -12.16125 -14.86375 0 0 0
-27 1 -28.37625 -14.86375 -12.16125 0 0 0
-28 1 -31.07875 -12.16125 -12.16125 0 0 0
-29 1 -25.67375 -14.86375 -14.86375 0 0 0
-30 1 -22.97125 -12.16125 -14.86375 0 0 0
-31 1 -22.97125 -14.86375 -12.16125 0 0 0
-32 1 -25.67375 -12.16125 -12.16125 0 0 0
-33 1 -20.26875 -14.86375 -14.86375 0 0 0
-34 1 -17.56625 -12.16125 -14.86375 0 0 0
-35 1 -17.56625 -14.86375 -12.16125 0 0 0
-36 1 -20.26875 -12.16125 -12.16125 0 0 0
-37 1 -14.86375 -14.86375 -14.86375 0 0 0
-38 1 -12.16125 -12.16125 -14.86375 0 0 0
-39 1 -12.16125 -14.86375 -12.16125 0 0 0
-40 1 -14.86375 -12.16125 -12.16125 0 0 0
-41 1 -9.45875 -14.86375 -14.86375 0 0 0
-42 1 -6.75625 -12.16125 -14.86375 0 0 0
-43 1 -6.75625 -14.86375 -12.16125 0 0 0
-44 1 -9.45875 -12.16125 -12.16125 0 0 0
-45 1 -4.05375 -14.86375 -14.86375 0 0 0
-46 1 -1.35125 -12.16125 -14.86375 0 0 0
-47 1 -1.35125 -14.86375 -12.16125 0 0 0
-48 1 -4.05375 -12.16125 -12.16125 0 0 0
-49 1 1.35125 -14.86375 -14.86375 0 0 0
-50 1 4.05375 -12.16125 -14.86375 0 0 0
-51 1 4.05375 -14.86375 -12.16125 0 0 0
-52 1 1.35125 -12.16125 -12.16125 0 0 0
-53 1 6.75625 -14.86375 -14.86375 0 0 0
-54 1 9.45875 -12.16125 -14.86375 0 0 0
-55 1 9.45875 -14.86375 -12.16125 0 0 0
-56 1 6.75625 -12.16125 -12.16125 0 0 0
-57 1 12.16125 -14.86375 -14.86375 0 0 0
-58 1 14.86375 -12.16125 -14.86375 0 0 0
-59 1 14.86375 -14.86375 -12.16125 0 0 0
-60 1 12.16125 -12.16125 -12.16125 0 0 0
-61 1 17.56625 -14.86375 -14.86375 0 0 0
-62 1 20.26875 -12.16125 -14.86375 0 0 0
-63 1 20.26875 -14.86375 -12.16125 0 0 0
-64 1 17.56625 -12.16125 -12.16125 0 0 0
-65 1 22.97125 -14.86375 -14.86375 0 0 0
-66 1 25.67375 -12.16125 -14.86375 0 0 0
-67 1 25.67375 -14.86375 -12.16125 0 0 0
-68 1 22.97125 -12.16125 -12.16125 0 0 0
-69 1 28.37625 -14.86375 -14.86375 0 0 0
-70 1 31.07875 -12.16125 -14.86375 0 0 0
-71 1 31.07875 -14.86375 -12.16125 0 0 0
-72 1 28.37625 -12.16125 -12.16125 0 0 0
-73 1 33.78125 -14.86375 -14.86375 0 0 0
-74 1 36.48375 -12.16125 -14.86375 0 0 0
-75 1 36.48375 -14.86375 -12.16125 0 0 0
-76 1 33.78125 -12.16125 -12.16125 0 0 0
-77 1 39.18625 -14.86375 -14.86375 0 0 0
-78 1 41.88875 -12.16125 -14.86375 0 0 0
-79 1 41.88875 -14.86375 -12.16125 0 0 0
-80 1 39.18625 -12.16125 -12.16125 0 0 0
-81 1 44.59125 -14.86375 -14.86375 0 0 0
-82 1 47.29375 -12.16125 -14.86375 0 0 0
-83 1 47.29375 -14.86375 -12.16125 0 0 0
-84 1 44.59125 -12.16125 -12.16125 0 0 0
-85 1 49.99625 -14.86375 -14.86375 0 0 0
-86 1 52.69875 -12.16125 -14.86375 0 0 0
-87 1 52.69875 -14.86375 -12.16125 0 0 0
-88 1 49.99625 -12.16125 -12.16125 0 0 0
-89 1 55.40125 -14.86375 -14.86375 0 0 0
-90 1 58.10375 -12.16125 -14.86375 0 0 0
-91 1 58.10375 -14.86375 -12.16125 0 0 0
-92 1 55.40125 -12.16125 -12.16125 0 0 0
-93 1 60.80625 -14.86375 -14.86375 0 0 0
-94 1 63.50875 -12.16125 -14.86375 0 0 0
-95 1 63.50875 -14.86375 -12.16125 0 0 0
-96 1 60.80625 -12.16125 -12.16125 0 0 0
-97 1 -63.50875 -9.45875 -14.86375 0 0 0
-98 1 -60.80625 -6.75625 -14.86375 0 0 0
-99 1 -60.80625 -9.45875 -12.16125 0 0 0
-100 1 -63.50875 -6.75625 -12.16125 0 0 0
-101 1 -58.10375 -9.45875 -14.86375 0 0 0
-102 1 -55.40125 -6.75625 -14.86375 0 0 0
-103 1 -55.40125 -9.45875 -12.16125 0 0 0
-104 1 -58.10375 -6.75625 -12.16125 0 0 0
-105 1 -52.69875 -9.45875 -14.86375 0 0 0
-106 1 -49.99625 -6.75625 -14.86375 0 0 0
-107 1 -49.99625 -9.45875 -12.16125 0 0 0
-108 1 -52.69875 -6.75625 -12.16125 0 0 0
-109 1 -47.29375 -9.45875 -14.86375 0 0 0
-110 1 -44.59125 -6.75625 -14.86375 0 0 0
-111 1 -44.59125 -9.45875 -12.16125 0 0 0
-112 1 -47.29375 -6.75625 -12.16125 0 0 0
-113 1 -41.88875 -9.45875 -14.86375 0 0 0
-114 1 -39.18625 -6.75625 -14.86375 0 0 0
-115 1 -39.18625 -9.45875 -12.16125 0 0 0
-116 1 -41.88875 -6.75625 -12.16125 0 0 0
-117 1 -36.48375 -9.45875 -14.86375 0 0 0
-118 1 -33.78125 -6.75625 -14.86375 0 0 0
-119 1 -33.78125 -9.45875 -12.16125 0 0 0
-120 1 -36.48375 -6.75625 -12.16125 0 0 0
-121 1 -31.07875 -9.45875 -14.86375 0 0 0
-122 1 -28.37625 -6.75625 -14.86375 0 0 0
-123 1 -28.37625 -9.45875 -12.16125 0 0 0
-124 1 -31.07875 -6.75625 -12.16125 0 0 0
-125 1 -25.67375 -9.45875 -14.86375 0 0 0
-126 1 -22.97125 -6.75625 -14.86375 0 0 0
-127 1 -22.97125 -9.45875 -12.16125 0 0 0
-128 1 -25.67375 -6.75625 -12.16125 0 0 0
-129 1 -20.26875 -9.45875 -14.86375 0 0 0
-130 1 -17.56625 -6.75625 -14.86375 0 0 0
-131 1 -17.56625 -9.45875 -12.16125 0 0 0
-132 1 -20.26875 -6.75625 -12.16125 0 0 0
-133 1 -14.86375 -9.45875 -14.86375 0 0 0
-134 1 -12.16125 -6.75625 -14.86375 0 0 0
-135 1 -12.16125 -9.45875 -12.16125 0 0 0
-136 1 -14.86375 -6.75625 -12.16125 0 0 0
-137 1 -9.45875 -9.45875 -14.86375 0 0 0
-138 1 -6.75625 -6.75625 -14.86375 0 0 0
-139 1 -6.75625 -9.45875 -12.16125 0 0 0
-140 1 -9.45875 -6.75625 -12.16125 0 0 0
-141 1 -4.05375 -9.45875 -14.86375 0 0 0
-142 1 -1.35125 -6.75625 -14.86375 0 0 0
-143 1 -1.35125 -9.45875 -12.16125 0 0 0
-144 1 -4.05375 -6.75625 -12.16125 0 0 0
-145 1 1.35125 -9.45875 -14.86375 0 0 0
-146 1 4.05375 -6.75625 -14.86375 0 0 0
-147 1 4.05375 -9.45875 -12.16125 0 0 0
-148 1 1.35125 -6.75625 -12.16125 0 0 0
-149 1 6.75625 -9.45875 -14.86375 0 0 0
-150 1 9.45875 -6.75625 -14.86375 0 0 0
-151 1 9.45875 -9.45875 -12.16125 0 0 0
-152 1 6.75625 -6.75625 -12.16125 0 0 0
-153 1 12.16125 -9.45875 -14.86375 0 0 0
-154 1 14.86375 -6.75625 -14.86375 0 0 0
-155 1 14.86375 -9.45875 -12.16125 0 0 0
-156 1 12.16125 -6.75625 -12.16125 0 0 0
-157 1 17.56625 -9.45875 -14.86375 0 0 0
-158 1 20.26875 -6.75625 -14.86375 0 0 0
-159 1 20.26875 -9.45875 -12.16125 0 0 0
-160 1 17.56625 -6.75625 -12.16125 0 0 0
-161 1 22.97125 -9.45875 -14.86375 0 0 0
-162 1 25.67375 -6.75625 -14.86375 0 0 0
-163 1 25.67375 -9.45875 -12.16125 0 0 0
-164 1 22.97125 -6.75625 -12.16125 0 0 0
-165 1 28.37625 -9.45875 -14.86375 0 0 0
-166 1 31.07875 -6.75625 -14.86375 0 0 0
-167 1 31.07875 -9.45875 -12.16125 0 0 0
-168 1 28.37625 -6.75625 -12.16125 0 0 0
-169 1 33.78125 -9.45875 -14.86375 0 0 0
-170 1 36.48375 -6.75625 -14.86375 0 0 0
-171 1 36.48375 -9.45875 -12.16125 0 0 0
-172 1 33.78125 -6.75625 -12.16125 0 0 0
-173 1 39.18625 -9.45875 -14.86375 0 0 0
-174 1 41.88875 -6.75625 -14.86375 0 0 0
-175 1 41.88875 -9.45875 -12.16125 0 0 0
-176 1 39.18625 -6.75625 -12.16125 0 0 0
-177 1 44.59125 -9.45875 -14.86375 0 0 0
-178 1 47.29375 -6.75625 -14.86375 0 0 0
-179 1 47.29375 -9.45875 -12.16125 0 0 0
-180 1 44.59125 -6.75625 -12.16125 0 0 0
-181 1 49.99625 -9.45875 -14.86375 0 0 0
-182 1 52.69875 -6.75625 -14.86375 0 0 0
-183 1 52.69875 -9.45875 -12.16125 0 0 0
-184 1 49.99625 -6.75625 -12.16125 0 0 0
-185 1 55.40125 -9.45875 -14.86375 0 0 0
-186 1 58.10375 -6.75625 -14.86375 0 0 0
-187 1 58.10375 -9.45875 -12.16125 0 0 0
-188 1 55.40125 -6.75625 -12.16125 0 0 0
-189 1 60.80625 -9.45875 -14.86375 0 0 0
-190 1 63.50875 -6.75625 -14.86375 0 0 0
-191 1 63.50875 -9.45875 -12.16125 0 0 0
-192 1 60.80625 -6.75625 -12.16125 0 0 0
-193 1 -63.50875 -4.05375 -14.86375 0 0 0
-194 1 -60.80625 -1.35125 -14.86375 0 0 0
-195 1 -60.80625 -4.05375 -12.16125 0 0 0
-196 1 -63.50875 -1.35125 -12.16125 0 0 0
-197 1 -58.10375 -4.05375 -14.86375 0 0 0
-198 1 -55.40125 -1.35125 -14.86375 0 0 0
-199 1 -55.40125 -4.05375 -12.16125 0 0 0
-200 1 -58.10375 -1.35125 -12.16125 0 0 0
-201 1 -52.69875 -4.05375 -14.86375 0 0 0
-202 1 -49.99625 -1.35125 -14.86375 0 0 0
-203 1 -49.99625 -4.05375 -12.16125 0 0 0
-204 1 -52.69875 -1.35125 -12.16125 0 0 0
-205 1 -47.29375 -4.05375 -14.86375 0 0 0
-206 1 -44.59125 -1.35125 -14.86375 0 0 0
-207 1 -44.59125 -4.05375 -12.16125 0 0 0
-208 1 -47.29375 -1.35125 -12.16125 0 0 0
-209 1 -41.88875 -4.05375 -14.86375 0 0 0
-210 1 -39.18625 -1.35125 -14.86375 0 0 0
-211 1 -39.18625 -4.05375 -12.16125 0 0 0
-212 1 -41.88875 -1.35125 -12.16125 0 0 0
-213 1 -36.48375 -4.05375 -14.86375 0 0 0
-214 1 -33.78125 -1.35125 -14.86375 0 0 0
-215 1 -33.78125 -4.05375 -12.16125 0 0 0
-216 1 -36.48375 -1.35125 -12.16125 0 0 0
-217 1 -31.07875 -4.05375 -14.86375 0 0 0
-218 1 -28.37625 -1.35125 -14.86375 0 0 0
-219 1 -28.37625 -4.05375 -12.16125 0 0 0
-220 1 -31.07875 -1.35125 -12.16125 0 0 0
-221 1 -25.67375 -4.05375 -14.86375 0 0 0
-222 1 -22.97125 -1.35125 -14.86375 0 0 0
-223 1 -22.97125 -4.05375 -12.16125 0 0 0
-224 1 -25.67375 -1.35125 -12.16125 0 0 0
-225 1 -20.26875 -4.05375 -14.86375 0 0 0
-226 1 -17.56625 -1.35125 -14.86375 0 0 0
-227 1 -17.56625 -4.05375 -12.16125 0 0 0
-228 1 -20.26875 -1.35125 -12.16125 0 0 0
-229 1 -14.86375 -4.05375 -14.86375 0 0 0
-230 1 -12.16125 -1.35125 -14.86375 0 0 0
-231 1 -12.16125 -4.05375 -12.16125 0 0 0
-232 1 -14.86375 -1.35125 -12.16125 0 0 0
-233 1 -9.45875 -4.05375 -14.86375 0 0 0
-234 1 -6.75625 -1.35125 -14.86375 0 0 0
-235 1 -6.75625 -4.05375 -12.16125 0 0 0
-236 1 -9.45875 -1.35125 -12.16125 0 0 0
-237 1 -4.05375 -4.05375 -14.86375 0 0 0
-238 1 -1.35125 -1.35125 -14.86375 0 0 0
-239 1 -1.35125 -4.05375 -12.16125 0 0 0
-240 1 -4.05375 -1.35125 -12.16125 0 0 0
-241 1 1.35125 -4.05375 -14.86375 0 0 0
-242 1 4.05375 -1.35125 -14.86375 0 0 0
-243 1 4.05375 -4.05375 -12.16125 0 0 0
-244 1 1.35125 -1.35125 -12.16125 0 0 0
-245 1 6.75625 -4.05375 -14.86375 0 0 0
-246 1 9.45875 -1.35125 -14.86375 0 0 0
-247 1 9.45875 -4.05375 -12.16125 0 0 0
-248 1 6.75625 -1.35125 -12.16125 0 0 0
-249 1 12.16125 -4.05375 -14.86375 0 0 0
-250 1 14.86375 -1.35125 -14.86375 0 0 0
-251 1 14.86375 -4.05375 -12.16125 0 0 0
-252 1 12.16125 -1.35125 -12.16125 0 0 0
-253 1 17.56625 -4.05375 -14.86375 0 0 0
-254 1 20.26875 -1.35125 -14.86375 0 0 0
-255 1 20.26875 -4.05375 -12.16125 0 0 0
-256 1 17.56625 -1.35125 -12.16125 0 0 0
-257 1 22.97125 -4.05375 -14.86375 0 0 0
-258 1 25.67375 -1.35125 -14.86375 0 0 0
-259 1 25.67375 -4.05375 -12.16125 0 0 0
-260 1 22.97125 -1.35125 -12.16125 0 0 0
-261 1 28.37625 -4.05375 -14.86375 0 0 0
-262 1 31.07875 -1.35125 -14.86375 0 0 0
-263 1 31.07875 -4.05375 -12.16125 0 0 0
-264 1 28.37625 -1.35125 -12.16125 0 0 0
-265 1 33.78125 -4.05375 -14.86375 0 0 0
-266 1 36.48375 -1.35125 -14.86375 0 0 0
-267 1 36.48375 -4.05375 -12.16125 0 0 0
-268 1 33.78125 -1.35125 -12.16125 0 0 0
-269 1 39.18625 -4.05375 -14.86375 0 0 0
-270 1 41.88875 -1.35125 -14.86375 0 0 0
-271 1 41.88875 -4.05375 -12.16125 0 0 0
-272 1 39.18625 -1.35125 -12.16125 0 0 0
-273 1 44.59125 -4.05375 -14.86375 0 0 0
-274 1 47.29375 -1.35125 -14.86375 0 0 0
-275 1 47.29375 -4.05375 -12.16125 0 0 0
-276 1 44.59125 -1.35125 -12.16125 0 0 0
-277 1 49.99625 -4.05375 -14.86375 0 0 0
-278 1 52.69875 -1.35125 -14.86375 0 0 0
-279 1 52.69875 -4.05375 -12.16125 0 0 0
-280 1 49.99625 -1.35125 -12.16125 0 0 0
-281 1 55.40125 -4.05375 -14.86375 0 0 0
-282 1 58.10375 -1.35125 -14.86375 0 0 0
-283 1 58.10375 -4.05375 -12.16125 0 0 0
-284 1 55.40125 -1.35125 -12.16125 0 0 0
-285 1 60.80625 -4.05375 -14.86375 0 0 0
-286 1 63.50875 -1.35125 -14.86375 0 0 0
-287 1 63.50875 -4.05375 -12.16125 0 0 0
-288 1 60.80625 -1.35125 -12.16125 0 0 0
-289 1 -63.50875 1.35125 -14.86375 0 0 0
-290 1 -60.80625 4.05375 -14.86375 0 0 0
-291 1 -60.80625 1.35125 -12.16125 0 0 0
-292 1 -63.50875 4.05375 -12.16125 0 0 0
-293 1 -58.10375 1.35125 -14.86375 0 0 0
-294 1 -55.40125 4.05375 -14.86375 0 0 0
-295 1 -55.40125 1.35125 -12.16125 0 0 0
-296 1 -58.10375 4.05375 -12.16125 0 0 0
-297 1 -52.69875 1.35125 -14.86375 0 0 0
-298 1 -49.99625 4.05375 -14.86375 0 0 0
-299 1 -49.99625 1.35125 -12.16125 0 0 0
-300 1 -52.69875 4.05375 -12.16125 0 0 0
-301 1 -47.29375 1.35125 -14.86375 0 0 0
-302 1 -44.59125 4.05375 -14.86375 0 0 0
-303 1 -44.59125 1.35125 -12.16125 0 0 0
-304 1 -47.29375 4.05375 -12.16125 0 0 0
-305 1 -41.88875 1.35125 -14.86375 0 0 0
-306 1 -39.18625 4.05375 -14.86375 0 0 0
-307 1 -39.18625 1.35125 -12.16125 0 0 0
-308 1 -41.88875 4.05375 -12.16125 0 0 0
-309 1 -36.48375 1.35125 -14.86375 0 0 0
-310 1 -33.78125 4.05375 -14.86375 0 0 0
-311 1 -33.78125 1.35125 -12.16125 0 0 0
-312 1 -36.48375 4.05375 -12.16125 0 0 0
-313 1 -31.07875 1.35125 -14.86375 0 0 0
-314 1 -28.37625 4.05375 -14.86375 0 0 0
-315 1 -28.37625 1.35125 -12.16125 0 0 0
-316 1 -31.07875 4.05375 -12.16125 0 0 0
-317 1 -25.67375 1.35125 -14.86375 0 0 0
-318 1 -22.97125 4.05375 -14.86375 0 0 0
-319 1 -22.97125 1.35125 -12.16125 0 0 0
-320 1 -25.67375 4.05375 -12.16125 0 0 0
-321 1 -20.26875 1.35125 -14.86375 0 0 0
-322 1 -17.56625 4.05375 -14.86375 0 0 0
-323 1 -17.56625 1.35125 -12.16125 0 0 0
-324 1 -20.26875 4.05375 -12.16125 0 0 0
-325 1 -14.86375 1.35125 -14.86375 0 0 0
-326 1 -12.16125 4.05375 -14.86375 0 0 0
-327 1 -12.16125 1.35125 -12.16125 0 0 0
-328 1 -14.86375 4.05375 -12.16125 0 0 0
-329 1 -9.45875 1.35125 -14.86375 0 0 0
-330 1 -6.75625 4.05375 -14.86375 0 0 0
-331 1 -6.75625 1.35125 -12.16125 0 0 0
-332 1 -9.45875 4.05375 -12.16125 0 0 0
-333 1 -4.05375 1.35125 -14.86375 0 0 0
-334 1 -1.35125 4.05375 -14.86375 0 0 0
-335 1 -1.35125 1.35125 -12.16125 0 0 0
-336 1 -4.05375 4.05375 -12.16125 0 0 0
-337 1 1.35125 1.35125 -14.86375 0 0 0
-338 1 4.05375 4.05375 -14.86375 0 0 0
-339 1 4.05375 1.35125 -12.16125 0 0 0
-340 1 1.35125 4.05375 -12.16125 0 0 0
-341 1 6.75625 1.35125 -14.86375 0 0 0
-342 1 9.45875 4.05375 -14.86375 0 0 0
-343 1 9.45875 1.35125 -12.16125 0 0 0
-344 1 6.75625 4.05375 -12.16125 0 0 0
-345 1 12.16125 1.35125 -14.86375 0 0 0
-346 1 14.86375 4.05375 -14.86375 0 0 0
-347 1 14.86375 1.35125 -12.16125 0 0 0
-348 1 12.16125 4.05375 -12.16125 0 0 0
-349 1 17.56625 1.35125 -14.86375 0 0 0
-350 1 20.26875 4.05375 -14.86375 0 0 0
-351 1 20.26875 1.35125 -12.16125 0 0 0
-352 1 17.56625 4.05375 -12.16125 0 0 0
-353 1 22.97125 1.35125 -14.86375 0 0 0
-354 1 25.67375 4.05375 -14.86375 0 0 0
-355 1 25.67375 1.35125 -12.16125 0 0 0
-356 1 22.97125 4.05375 -12.16125 0 0 0
-357 1 28.37625 1.35125 -14.86375 0 0 0
-358 1 31.07875 4.05375 -14.86375 0 0 0
-359 1 31.07875 1.35125 -12.16125 0 0 0
-360 1 28.37625 4.05375 -12.16125 0 0 0
-361 1 33.78125 1.35125 -14.86375 0 0 0
-362 1 36.48375 4.05375 -14.86375 0 0 0
-363 1 36.48375 1.35125 -12.16125 0 0 0
-364 1 33.78125 4.05375 -12.16125 0 0 0
-365 1 39.18625 1.35125 -14.86375 0 0 0
-366 1 41.88875 4.05375 -14.86375 0 0 0
-367 1 41.88875 1.35125 -12.16125 0 0 0
-368 1 39.18625 4.05375 -12.16125 0 0 0
-369 1 44.59125 1.35125 -14.86375 0 0 0
-370 1 47.29375 4.05375 -14.86375 0 0 0
-371 1 47.29375 1.35125 -12.16125 0 0 0
-372 1 44.59125 4.05375 -12.16125 0 0 0
-373 1 49.99625 1.35125 -14.86375 0 0 0
-374 1 52.69875 4.05375 -14.86375 0 0 0
-375 1 52.69875 1.35125 -12.16125 0 0 0
-376 1 49.99625 4.05375 -12.16125 0 0 0
-377 1 55.40125 1.35125 -14.86375 0 0 0
-378 1 58.10375 4.05375 -14.86375 0 0 0
-379 1 58.10375 1.35125 -12.16125 0 0 0
-380 1 55.40125 4.05375 -12.16125 0 0 0
-381 1 60.80625 1.35125 -14.86375 0 0 0
-382 1 63.50875 4.05375 -14.86375 0 0 0
-383 1 63.50875 1.35125 -12.16125 0 0 0
-384 1 60.80625 4.05375 -12.16125 0 0 0
-385 1 -63.50875 6.75625 -14.86375 0 0 0
-386 1 -60.80625 9.45875 -14.86375 0 0 0
-387 1 -60.80625 6.75625 -12.16125 0 0 0
-388 1 -63.50875 9.45875 -12.16125 0 0 0
-389 1 -58.10375 6.75625 -14.86375 0 0 0
-390 1 -55.40125 9.45875 -14.86375 0 0 0
-391 1 -55.40125 6.75625 -12.16125 0 0 0
-392 1 -58.10375 9.45875 -12.16125 0 0 0
-393 1 -52.69875 6.75625 -14.86375 0 0 0
-394 1 -49.99625 9.45875 -14.86375 0 0 0
-395 1 -49.99625 6.75625 -12.16125 0 0 0
-396 1 -52.69875 9.45875 -12.16125 0 0 0
-397 1 -47.29375 6.75625 -14.86375 0 0 0
-398 1 -44.59125 9.45875 -14.86375 0 0 0
-399 1 -44.59125 6.75625 -12.16125 0 0 0
-400 1 -47.29375 9.45875 -12.16125 0 0 0
-401 1 -41.88875 6.75625 -14.86375 0 0 0
-402 1 -39.18625 9.45875 -14.86375 0 0 0
-403 1 -39.18625 6.75625 -12.16125 0 0 0
-404 1 -41.88875 9.45875 -12.16125 0 0 0
-405 1 -36.48375 6.75625 -14.86375 0 0 0
-406 1 -33.78125 9.45875 -14.86375 0 0 0
-407 1 -33.78125 6.75625 -12.16125 0 0 0
-408 1 -36.48375 9.45875 -12.16125 0 0 0
-409 1 -31.07875 6.75625 -14.86375 0 0 0
-410 1 -28.37625 9.45875 -14.86375 0 0 0
-411 1 -28.37625 6.75625 -12.16125 0 0 0
-412 1 -31.07875 9.45875 -12.16125 0 0 0
-413 1 -25.67375 6.75625 -14.86375 0 0 0
-414 1 -22.97125 9.45875 -14.86375 0 0 0
-415 1 -22.97125 6.75625 -12.16125 0 0 0
-416 1 -25.67375 9.45875 -12.16125 0 0 0
-417 1 -20.26875 6.75625 -14.86375 0 0 0
-418 1 -17.56625 9.45875 -14.86375 0 0 0
-419 1 -17.56625 6.75625 -12.16125 0 0 0
-420 1 -20.26875 9.45875 -12.16125 0 0 0
-421 1 -14.86375 6.75625 -14.86375 0 0 0
-422 1 -12.16125 9.45875 -14.86375 0 0 0
-423 1 -12.16125 6.75625 -12.16125 0 0 0
-424 1 -14.86375 9.45875 -12.16125 0 0 0
-425 1 -9.45875 6.75625 -14.86375 0 0 0
-426 1 -6.75625 9.45875 -14.86375 0 0 0
-427 1 -6.75625 6.75625 -12.16125 0 0 0
-428 1 -9.45875 9.45875 -12.16125 0 0 0
-429 1 -4.05375 6.75625 -14.86375 0 0 0
-430 1 -1.35125 9.45875 -14.86375 0 0 0
-431 1 -1.35125 6.75625 -12.16125 0 0 0
-432 1 -4.05375 9.45875 -12.16125 0 0 0
-433 1 1.35125 6.75625 -14.86375 0 0 0
-434 1 4.05375 9.45875 -14.86375 0 0 0
-435 1 4.05375 6.75625 -12.16125 0 0 0
-436 1 1.35125 9.45875 -12.16125 0 0 0
-437 1 6.75625 6.75625 -14.86375 0 0 0
-438 1 9.45875 9.45875 -14.86375 0 0 0
-439 1 9.45875 6.75625 -12.16125 0 0 0
-440 1 6.75625 9.45875 -12.16125 0 0 0
-441 1 12.16125 6.75625 -14.86375 0 0 0
-442 1 14.86375 9.45875 -14.86375 0 0 0
-443 1 14.86375 6.75625 -12.16125 0 0 0
-444 1 12.16125 9.45875 -12.16125 0 0 0
-445 1 17.56625 6.75625 -14.86375 0 0 0
-446 1 20.26875 9.45875 -14.86375 0 0 0
-447 1 20.26875 6.75625 -12.16125 0 0 0
-448 1 17.56625 9.45875 -12.16125 0 0 0
-449 1 22.97125 6.75625 -14.86375 0 0 0
-450 1 25.67375 9.45875 -14.86375 0 0 0
-451 1 25.67375 6.75625 -12.16125 0 0 0
-452 1 22.97125 9.45875 -12.16125 0 0 0
-453 1 28.37625 6.75625 -14.86375 0 0 0
-454 1 31.07875 9.45875 -14.86375 0 0 0
-455 1 31.07875 6.75625 -12.16125 0 0 0
-456 1 28.37625 9.45875 -12.16125 0 0 0
-457 1 33.78125 6.75625 -14.86375 0 0 0
-458 1 36.48375 9.45875 -14.86375 0 0 0
-459 1 36.48375 6.75625 -12.16125 0 0 0
-460 1 33.78125 9.45875 -12.16125 0 0 0
-461 1 39.18625 6.75625 -14.86375 0 0 0
-462 1 41.88875 9.45875 -14.86375 0 0 0
-463 1 41.88875 6.75625 -12.16125 0 0 0
-464 1 39.18625 9.45875 -12.16125 0 0 0
-465 1 44.59125 6.75625 -14.86375 0 0 0
-466 1 47.29375 9.45875 -14.86375 0 0 0
-467 1 47.29375 6.75625 -12.16125 0 0 0
-468 1 44.59125 9.45875 -12.16125 0 0 0
-469 1 49.99625 6.75625 -14.86375 0 0 0
-470 1 52.69875 9.45875 -14.86375 0 0 0
-471 1 52.69875 6.75625 -12.16125 0 0 0
-472 1 49.99625 9.45875 -12.16125 0 0 0
-473 1 55.40125 6.75625 -14.86375 0 0 0
-474 1 58.10375 9.45875 -14.86375 0 0 0
-475 1 58.10375 6.75625 -12.16125 0 0 0
-476 1 55.40125 9.45875 -12.16125 0 0 0
-477 1 60.80625 6.75625 -14.86375 0 0 0
-478 1 63.50875 9.45875 -14.86375 0 0 0
-479 1 63.50875 6.75625 -12.16125 0 0 0
-480 1 60.80625 9.45875 -12.16125 0 0 0
-481 1 -63.50875 12.16125 -14.86375 0 0 0
-482 1 -60.80625 14.86375 -14.86375 0 0 0
-483 1 -60.80625 12.16125 -12.16125 0 0 0
-484 1 -63.50875 14.86375 -12.16125 0 0 0
-485 1 -58.10375 12.16125 -14.86375 0 0 0
-486 1 -55.40125 14.86375 -14.86375 0 0 0
-487 1 -55.40125 12.16125 -12.16125 0 0 0
-488 1 -58.10375 14.86375 -12.16125 0 0 0
-489 1 -52.69875 12.16125 -14.86375 0 0 0
-490 1 -49.99625 14.86375 -14.86375 0 0 0
-491 1 -49.99625 12.16125 -12.16125 0 0 0
-492 1 -52.69875 14.86375 -12.16125 0 0 0
-493 1 -47.29375 12.16125 -14.86375 0 0 0
-494 1 -44.59125 14.86375 -14.86375 0 0 0
-495 1 -44.59125 12.16125 -12.16125 0 0 0
-496 1 -47.29375 14.86375 -12.16125 0 0 0
-497 1 -41.88875 12.16125 -14.86375 0 0 0
-498 1 -39.18625 14.86375 -14.86375 0 0 0
-499 1 -39.18625 12.16125 -12.16125 0 0 0
-500 1 -41.88875 14.86375 -12.16125 0 0 0
-501 1 -36.48375 12.16125 -14.86375 0 0 0
-502 1 -33.78125 14.86375 -14.86375 0 0 0
-503 1 -33.78125 12.16125 -12.16125 0 0 0
-504 1 -36.48375 14.86375 -12.16125 0 0 0
-505 1 -31.07875 12.16125 -14.86375 0 0 0
-506 1 -28.37625 14.86375 -14.86375 0 0 0
-507 1 -28.37625 12.16125 -12.16125 0 0 0
-508 1 -31.07875 14.86375 -12.16125 0 0 0
-509 1 -25.67375 12.16125 -14.86375 0 0 0
-510 1 -22.97125 14.86375 -14.86375 0 0 0
-511 1 -22.97125 12.16125 -12.16125 0 0 0
-512 1 -25.67375 14.86375 -12.16125 0 0 0
-513 1 -20.26875 12.16125 -14.86375 0 0 0
-514 1 -17.56625 14.86375 -14.86375 0 0 0
-515 1 -17.56625 12.16125 -12.16125 0 0 0
-516 1 -20.26875 14.86375 -12.16125 0 0 0
-517 1 -14.86375 12.16125 -14.86375 0 0 0
-518 1 -12.16125 14.86375 -14.86375 0 0 0
-519 1 -12.16125 12.16125 -12.16125 0 0 0
-520 1 -14.86375 14.86375 -12.16125 0 0 0
-521 1 -9.45875 12.16125 -14.86375 0 0 0
-522 1 -6.75625 14.86375 -14.86375 0 0 0
-523 1 -6.75625 12.16125 -12.16125 0 0 0
-524 1 -9.45875 14.86375 -12.16125 0 0 0
-525 1 -4.05375 12.16125 -14.86375 0 0 0
-526 1 -1.35125 14.86375 -14.86375 0 0 0
-527 1 -1.35125 12.16125 -12.16125 0 0 0
-528 1 -4.05375 14.86375 -12.16125 0 0 0
-529 1 1.35125 12.16125 -14.86375 0 0 0
-530 1 4.05375 14.86375 -14.86375 0 0 0
-531 1 4.05375 12.16125 -12.16125 0 0 0
-532 1 1.35125 14.86375 -12.16125 0 0 0
-533 1 6.75625 12.16125 -14.86375 0 0 0
-534 1 9.45875 14.86375 -14.86375 0 0 0
-535 1 9.45875 12.16125 -12.16125 0 0 0
-536 1 6.75625 14.86375 -12.16125 0 0 0
-537 1 12.16125 12.16125 -14.86375 0 0 0
-538 1 14.86375 14.86375 -14.86375 0 0 0
-539 1 14.86375 12.16125 -12.16125 0 0 0
-540 1 12.16125 14.86375 -12.16125 0 0 0
-541 1 17.56625 12.16125 -14.86375 0 0 0
-542 1 20.26875 14.86375 -14.86375 0 0 0
-543 1 20.26875 12.16125 -12.16125 0 0 0
-544 1 17.56625 14.86375 -12.16125 0 0 0
-545 1 22.97125 12.16125 -14.86375 0 0 0
-546 1 25.67375 14.86375 -14.86375 0 0 0
-547 1 25.67375 12.16125 -12.16125 0 0 0
-548 1 22.97125 14.86375 -12.16125 0 0 0
-549 1 28.37625 12.16125 -14.86375 0 0 0
-550 1 31.07875 14.86375 -14.86375 0 0 0
-551 1 31.07875 12.16125 -12.16125 0 0 0
-552 1 28.37625 14.86375 -12.16125 0 0 0
-553 1 33.78125 12.16125 -14.86375 0 0 0
-554 1 36.48375 14.86375 -14.86375 0 0 0
-555 1 36.48375 12.16125 -12.16125 0 0 0
-556 1 33.78125 14.86375 -12.16125 0 0 0
-557 1 39.18625 12.16125 -14.86375 0 0 0
-558 1 41.88875 14.86375 -14.86375 0 0 0
-559 1 41.88875 12.16125 -12.16125 0 0 0
-560 1 39.18625 14.86375 -12.16125 0 0 0
-561 1 44.59125 12.16125 -14.86375 0 0 0
-562 1 47.29375 14.86375 -14.86375 0 0 0
-563 1 47.29375 12.16125 -12.16125 0 0 0
-564 1 44.59125 14.86375 -12.16125 0 0 0
-565 1 49.99625 12.16125 -14.86375 0 0 0
-566 1 52.69875 14.86375 -14.86375 0 0 0
-567 1 52.69875 12.16125 -12.16125 0 0 0
-568 1 49.99625 14.86375 -12.16125 0 0 0
-569 1 55.40125 12.16125 -14.86375 0 0 0
-570 1 58.10375 14.86375 -14.86375 0 0 0
-571 1 58.10375 12.16125 -12.16125 0 0 0
-572 1 55.40125 14.86375 -12.16125 0 0 0
-573 1 60.80625 12.16125 -14.86375 0 0 0
-574 1 63.50875 14.86375 -14.86375 0 0 0
-575 1 63.50875 12.16125 -12.16125 0 0 0
-576 1 60.80625 14.86375 -12.16125 0 0 0
-577 1 -63.50875 -14.86375 -9.45875 0 0 0
-578 1 -60.80625 -12.16125 -9.45875 0 0 0
-579 1 -60.80625 -14.86375 -6.75625 0 0 0
-580 1 -63.50875 -12.16125 -6.75625 0 0 0
-581 1 -58.10375 -14.86375 -9.45875 0 0 0
-582 1 -55.40125 -12.16125 -9.45875 0 0 0
-583 1 -55.40125 -14.86375 -6.75625 0 0 0
-584 1 -58.10375 -12.16125 -6.75625 0 0 0
-585 1 -52.69875 -14.86375 -9.45875 0 0 0
-586 1 -49.99625 -12.16125 -9.45875 0 0 0
-587 1 -49.99625 -14.86375 -6.75625 0 0 0
-588 1 -52.69875 -12.16125 -6.75625 0 0 0
-589 1 -47.29375 -14.86375 -9.45875 0 0 0
-590 1 -44.59125 -12.16125 -9.45875 0 0 0
-591 1 -44.59125 -14.86375 -6.75625 0 0 0
-592 1 -47.29375 -12.16125 -6.75625 0 0 0
-593 1 -41.88875 -14.86375 -9.45875 0 0 0
-594 1 -39.18625 -12.16125 -9.45875 0 0 0
-595 1 -39.18625 -14.86375 -6.75625 0 0 0
-596 1 -41.88875 -12.16125 -6.75625 0 0 0
-597 1 -36.48375 -14.86375 -9.45875 0 0 0
-598 1 -33.78125 -12.16125 -9.45875 0 0 0
-599 1 -33.78125 -14.86375 -6.75625 0 0 0
-600 1 -36.48375 -12.16125 -6.75625 0 0 0
-601 1 -31.07875 -14.86375 -9.45875 0 0 0
-602 1 -28.37625 -12.16125 -9.45875 0 0 0
-603 1 -28.37625 -14.86375 -6.75625 0 0 0
-604 1 -31.07875 -12.16125 -6.75625 0 0 0
-605 1 -25.67375 -14.86375 -9.45875 0 0 0
-606 1 -22.97125 -12.16125 -9.45875 0 0 0
-607 1 -22.97125 -14.86375 -6.75625 0 0 0
-608 1 -25.67375 -12.16125 -6.75625 0 0 0
-609 1 -20.26875 -14.86375 -9.45875 0 0 0
-610 1 -17.56625 -12.16125 -9.45875 0 0 0
-611 1 -17.56625 -14.86375 -6.75625 0 0 0
-612 1 -20.26875 -12.16125 -6.75625 0 0 0
-613 1 -14.86375 -14.86375 -9.45875 0 0 0
-614 1 -12.16125 -12.16125 -9.45875 0 0 0
-615 1 -12.16125 -14.86375 -6.75625 0 0 0
-616 1 -14.86375 -12.16125 -6.75625 0 0 0
-617 1 -9.45875 -14.86375 -9.45875 0 0 0
-618 1 -6.75625 -12.16125 -9.45875 0 0 0
-619 1 -6.75625 -14.86375 -6.75625 0 0 0
-620 1 -9.45875 -12.16125 -6.75625 0 0 0
-621 1 -4.05375 -14.86375 -9.45875 0 0 0
-622 1 -1.35125 -12.16125 -9.45875 0 0 0
-623 1 -1.35125 -14.86375 -6.75625 0 0 0
-624 1 -4.05375 -12.16125 -6.75625 0 0 0
-625 1 1.35125 -14.86375 -9.45875 0 0 0
-626 1 4.05375 -12.16125 -9.45875 0 0 0
-627 1 4.05375 -14.86375 -6.75625 0 0 0
-628 1 1.35125 -12.16125 -6.75625 0 0 0
-629 1 6.75625 -14.86375 -9.45875 0 0 0
-630 1 9.45875 -12.16125 -9.45875 0 0 0
-631 1 9.45875 -14.86375 -6.75625 0 0 0
-632 1 6.75625 -12.16125 -6.75625 0 0 0
-633 1 12.16125 -14.86375 -9.45875 0 0 0
-634 1 14.86375 -12.16125 -9.45875 0 0 0
-635 1 14.86375 -14.86375 -6.75625 0 0 0
-636 1 12.16125 -12.16125 -6.75625 0 0 0
-637 1 17.56625 -14.86375 -9.45875 0 0 0
-638 1 20.26875 -12.16125 -9.45875 0 0 0
-639 1 20.26875 -14.86375 -6.75625 0 0 0
-640 1 17.56625 -12.16125 -6.75625 0 0 0
-641 1 22.97125 -14.86375 -9.45875 0 0 0
-642 1 25.67375 -12.16125 -9.45875 0 0 0
-643 1 25.67375 -14.86375 -6.75625 0 0 0
-644 1 22.97125 -12.16125 -6.75625 0 0 0
-645 1 28.37625 -14.86375 -9.45875 0 0 0
-646 1 31.07875 -12.16125 -9.45875 0 0 0
-647 1 31.07875 -14.86375 -6.75625 0 0 0
-648 1 28.37625 -12.16125 -6.75625 0 0 0
-649 1 33.78125 -14.86375 -9.45875 0 0 0
-650 1 36.48375 -12.16125 -9.45875 0 0 0
-651 1 36.48375 -14.86375 -6.75625 0 0 0
-652 1 33.78125 -12.16125 -6.75625 0 0 0
-653 1 39.18625 -14.86375 -9.45875 0 0 0
-654 1 41.88875 -12.16125 -9.45875 0 0 0
-655 1 41.88875 -14.86375 -6.75625 0 0 0
-656 1 39.18625 -12.16125 -6.75625 0 0 0
-657 1 44.59125 -14.86375 -9.45875 0 0 0
-658 1 47.29375 -12.16125 -9.45875 0 0 0
-659 1 47.29375 -14.86375 -6.75625 0 0 0
-660 1 44.59125 -12.16125 -6.75625 0 0 0
-661 1 49.99625 -14.86375 -9.45875 0 0 0
-662 1 52.69875 -12.16125 -9.45875 0 0 0
-663 1 52.69875 -14.86375 -6.75625 0 0 0
-664 1 49.99625 -12.16125 -6.75625 0 0 0
-665 1 55.40125 -14.86375 -9.45875 0 0 0
-666 1 58.10375 -12.16125 -9.45875 0 0 0
-667 1 58.10375 -14.86375 -6.75625 0 0 0
-668 1 55.40125 -12.16125 -6.75625 0 0 0
-669 1 60.80625 -14.86375 -9.45875 0 0 0
-670 1 63.50875 -12.16125 -9.45875 0 0 0
-671 1 63.50875 -14.86375 -6.75625 0 0 0
-672 1 60.80625 -12.16125 -6.75625 0 0 0
-673 1 -63.50875 -9.45875 -9.45875 0 0 0
-674 1 -60.80625 -6.75625 -9.45875 0 0 0
-675 1 -60.80625 -9.45875 -6.75625 0 0 0
-676 1 -63.50875 -6.75625 -6.75625 0 0 0
-677 1 -58.10375 -9.45875 -9.45875 0 0 0
-678 1 -55.40125 -6.75625 -9.45875 0 0 0
-679 1 -55.40125 -9.45875 -6.75625 0 0 0
-680 1 -58.10375 -6.75625 -6.75625 0 0 0
-681 1 -52.69875 -9.45875 -9.45875 0 0 0
-682 1 -49.99625 -6.75625 -9.45875 0 0 0
-683 1 -49.99625 -9.45875 -6.75625 0 0 0
-684 1 -52.69875 -6.75625 -6.75625 0 0 0
-685 1 -47.29375 -9.45875 -9.45875 0 0 0
-686 1 -44.59125 -6.75625 -9.45875 0 0 0
-687 1 -44.59125 -9.45875 -6.75625 0 0 0
-688 1 -47.29375 -6.75625 -6.75625 0 0 0
-689 1 -41.88875 -9.45875 -9.45875 0 0 0
-690 1 -39.18625 -6.75625 -9.45875 0 0 0
-691 1 -39.18625 -9.45875 -6.75625 0 0 0
-692 1 -41.88875 -6.75625 -6.75625 0 0 0
-693 1 -36.48375 -9.45875 -9.45875 0 0 0
-694 1 -33.78125 -6.75625 -9.45875 0 0 0
-695 1 -33.78125 -9.45875 -6.75625 0 0 0
-696 1 -36.48375 -6.75625 -6.75625 0 0 0
-697 1 -31.07875 -9.45875 -9.45875 0 0 0
-698 1 -28.37625 -6.75625 -9.45875 0 0 0
-699 1 -28.37625 -9.45875 -6.75625 0 0 0
-700 1 -31.07875 -6.75625 -6.75625 0 0 0
-701 1 -25.67375 -9.45875 -9.45875 0 0 0
-702 1 -22.97125 -6.75625 -9.45875 0 0 0
-703 1 -22.97125 -9.45875 -6.75625 0 0 0
-704 1 -25.67375 -6.75625 -6.75625 0 0 0
-705 1 -20.26875 -9.45875 -9.45875 0 0 0
-706 1 -17.56625 -6.75625 -9.45875 0 0 0
-707 1 -17.56625 -9.45875 -6.75625 0 0 0
-708 1 -20.26875 -6.75625 -6.75625 0 0 0
-709 1 -14.86375 -9.45875 -9.45875 0 0 0
-710 1 -12.16125 -6.75625 -9.45875 0 0 0
-711 1 -12.16125 -9.45875 -6.75625 0 0 0
-712 1 -14.86375 -6.75625 -6.75625 0 0 0
-713 1 -9.45875 -9.45875 -9.45875 0 0 0
-714 1 -6.75625 -6.75625 -9.45875 0 0 0
-715 1 -6.75625 -9.45875 -6.75625 0 0 0
-716 1 -9.45875 -6.75625 -6.75625 0 0 0
-717 1 -4.05375 -9.45875 -9.45875 0 0 0
-718 1 -1.35125 -6.75625 -9.45875 0 0 0
-719 1 -1.35125 -9.45875 -6.75625 0 0 0
-720 1 -4.05375 -6.75625 -6.75625 0 0 0
-721 1 1.35125 -9.45875 -9.45875 0 0 0
-722 1 4.05375 -6.75625 -9.45875 0 0 0
-723 1 4.05375 -9.45875 -6.75625 0 0 0
-724 1 1.35125 -6.75625 -6.75625 0 0 0
-725 1 6.75625 -9.45875 -9.45875 0 0 0
-726 1 9.45875 -6.75625 -9.45875 0 0 0
-727 1 9.45875 -9.45875 -6.75625 0 0 0
-728 1 6.75625 -6.75625 -6.75625 0 0 0
-729 1 12.16125 -9.45875 -9.45875 0 0 0
-730 1 14.86375 -6.75625 -9.45875 0 0 0
-731 1 14.86375 -9.45875 -6.75625 0 0 0
-732 1 12.16125 -6.75625 -6.75625 0 0 0
-733 1 17.56625 -9.45875 -9.45875 0 0 0
-734 1 20.26875 -6.75625 -9.45875 0 0 0
-735 1 20.26875 -9.45875 -6.75625 0 0 0
-736 1 17.56625 -6.75625 -6.75625 0 0 0
-737 1 22.97125 -9.45875 -9.45875 0 0 0
-738 1 25.67375 -6.75625 -9.45875 0 0 0
-739 1 25.67375 -9.45875 -6.75625 0 0 0
-740 1 22.97125 -6.75625 -6.75625 0 0 0
-741 1 28.37625 -9.45875 -9.45875 0 0 0
-742 1 31.07875 -6.75625 -9.45875 0 0 0
-743 1 31.07875 -9.45875 -6.75625 0 0 0
-744 1 28.37625 -6.75625 -6.75625 0 0 0
-745 1 33.78125 -9.45875 -9.45875 0 0 0
-746 1 36.48375 -6.75625 -9.45875 0 0 0
-747 1 36.48375 -9.45875 -6.75625 0 0 0
-748 1 33.78125 -6.75625 -6.75625 0 0 0
-749 1 39.18625 -9.45875 -9.45875 0 0 0
-750 1 41.88875 -6.75625 -9.45875 0 0 0
-751 1 41.88875 -9.45875 -6.75625 0 0 0
-752 1 39.18625 -6.75625 -6.75625 0 0 0
-753 1 44.59125 -9.45875 -9.45875 0 0 0
-754 1 47.29375 -6.75625 -9.45875 0 0 0
-755 1 47.29375 -9.45875 -6.75625 0 0 0
-756 1 44.59125 -6.75625 -6.75625 0 0 0
-757 1 49.99625 -9.45875 -9.45875 0 0 0
-758 1 52.69875 -6.75625 -9.45875 0 0 0
-759 1 52.69875 -9.45875 -6.75625 0 0 0
-760 1 49.99625 -6.75625 -6.75625 0 0 0
-761 1 55.40125 -9.45875 -9.45875 0 0 0
-762 1 58.10375 -6.75625 -9.45875 0 0 0
-763 1 58.10375 -9.45875 -6.75625 0 0 0
-764 1 55.40125 -6.75625 -6.75625 0 0 0
-765 1 60.80625 -9.45875 -9.45875 0 0 0
-766 1 63.50875 -6.75625 -9.45875 0 0 0
-767 1 63.50875 -9.45875 -6.75625 0 0 0
-768 1 60.80625 -6.75625 -6.75625 0 0 0
-769 1 -63.50875 -4.05375 -9.45875 0 0 0
-770 1 -60.80625 -1.35125 -9.45875 0 0 0
-771 1 -60.80625 -4.05375 -6.75625 0 0 0
-772 1 -63.50875 -1.35125 -6.75625 0 0 0
-773 1 -58.10375 -4.05375 -9.45875 0 0 0
-774 1 -55.40125 -1.35125 -9.45875 0 0 0
-775 1 -55.40125 -4.05375 -6.75625 0 0 0
-776 1 -58.10375 -1.35125 -6.75625 0 0 0
-777 1 -52.69875 -4.05375 -9.45875 0 0 0
-778 1 -49.99625 -1.35125 -9.45875 0 0 0
-779 1 -49.99625 -4.05375 -6.75625 0 0 0
-780 1 -52.69875 -1.35125 -6.75625 0 0 0
-781 1 -47.29375 -4.05375 -9.45875 0 0 0
-782 1 -44.59125 -1.35125 -9.45875 0 0 0
-783 1 -44.59125 -4.05375 -6.75625 0 0 0
-784 1 -47.29375 -1.35125 -6.75625 0 0 0
-785 1 -41.88875 -4.05375 -9.45875 0 0 0
-786 1 -39.18625 -1.35125 -9.45875 0 0 0
-787 1 -39.18625 -4.05375 -6.75625 0 0 0
-788 1 -41.88875 -1.35125 -6.75625 0 0 0
-789 1 -36.48375 -4.05375 -9.45875 0 0 0
-790 1 -33.78125 -1.35125 -9.45875 0 0 0
-791 1 -33.78125 -4.05375 -6.75625 0 0 0
-792 1 -36.48375 -1.35125 -6.75625 0 0 0
-793 1 -31.07875 -4.05375 -9.45875 0 0 0
-794 1 -28.37625 -1.35125 -9.45875 0 0 0
-795 1 -28.37625 -4.05375 -6.75625 0 0 0
-796 1 -31.07875 -1.35125 -6.75625 0 0 0
-797 1 -25.67375 -4.05375 -9.45875 0 0 0
-798 1 -22.97125 -1.35125 -9.45875 0 0 0
-799 1 -22.97125 -4.05375 -6.75625 0 0 0
-800 1 -25.67375 -1.35125 -6.75625 0 0 0
-801 1 -20.26875 -4.05375 -9.45875 0 0 0
-802 1 -17.56625 -1.35125 -9.45875 0 0 0
-803 1 -17.56625 -4.05375 -6.75625 0 0 0
-804 1 -20.26875 -1.35125 -6.75625 0 0 0
-805 1 -14.86375 -4.05375 -9.45875 0 0 0
-806 1 -12.16125 -1.35125 -9.45875 0 0 0
-807 1 -12.16125 -4.05375 -6.75625 0 0 0
-808 1 -14.86375 -1.35125 -6.75625 0 0 0
-809 1 -9.45875 -4.05375 -9.45875 0 0 0
-810 1 -6.75625 -1.35125 -9.45875 0 0 0
-811 1 -6.75625 -4.05375 -6.75625 0 0 0
-812 1 -9.45875 -1.35125 -6.75625 0 0 0
-813 1 -4.05375 -4.05375 -9.45875 0 0 0
-814 1 -1.35125 -1.35125 -9.45875 0 0 0
-815 1 -1.35125 -4.05375 -6.75625 0 0 0
-816 1 -4.05375 -1.35125 -6.75625 0 0 0
-817 1 1.35125 -4.05375 -9.45875 0 0 0
-818 1 4.05375 -1.35125 -9.45875 0 0 0
-819 1 4.05375 -4.05375 -6.75625 0 0 0
-820 1 1.35125 -1.35125 -6.75625 0 0 0
-821 1 6.75625 -4.05375 -9.45875 0 0 0
-822 1 9.45875 -1.35125 -9.45875 0 0 0
-823 1 9.45875 -4.05375 -6.75625 0 0 0
-824 1 6.75625 -1.35125 -6.75625 0 0 0
-825 1 12.16125 -4.05375 -9.45875 0 0 0
-826 1 14.86375 -1.35125 -9.45875 0 0 0
-827 1 14.86375 -4.05375 -6.75625 0 0 0
-828 1 12.16125 -1.35125 -6.75625 0 0 0
-829 1 17.56625 -4.05375 -9.45875 0 0 0
-830 1 20.26875 -1.35125 -9.45875 0 0 0
-831 1 20.26875 -4.05375 -6.75625 0 0 0
-832 1 17.56625 -1.35125 -6.75625 0 0 0
-833 1 22.97125 -4.05375 -9.45875 0 0 0
-834 1 25.67375 -1.35125 -9.45875 0 0 0
-835 1 25.67375 -4.05375 -6.75625 0 0 0
-836 1 22.97125 -1.35125 -6.75625 0 0 0
-837 1 28.37625 -4.05375 -9.45875 0 0 0
-838 1 31.07875 -1.35125 -9.45875 0 0 0
-839 1 31.07875 -4.05375 -6.75625 0 0 0
-840 1 28.37625 -1.35125 -6.75625 0 0 0
-841 1 33.78125 -4.05375 -9.45875 0 0 0
-842 1 36.48375 -1.35125 -9.45875 0 0 0
-843 1 36.48375 -4.05375 -6.75625 0 0 0
-844 1 33.78125 -1.35125 -6.75625 0 0 0
-845 1 39.18625 -4.05375 -9.45875 0 0 0
-846 1 41.88875 -1.35125 -9.45875 0 0 0
-847 1 41.88875 -4.05375 -6.75625 0 0 0
-848 1 39.18625 -1.35125 -6.75625 0 0 0
-849 1 44.59125 -4.05375 -9.45875 0 0 0
-850 1 47.29375 -1.35125 -9.45875 0 0 0
-851 1 47.29375 -4.05375 -6.75625 0 0 0
-852 1 44.59125 -1.35125 -6.75625 0 0 0
-853 1 49.99625 -4.05375 -9.45875 0 0 0
-854 1 52.69875 -1.35125 -9.45875 0 0 0
-855 1 52.69875 -4.05375 -6.75625 0 0 0
-856 1 49.99625 -1.35125 -6.75625 0 0 0
-857 1 55.40125 -4.05375 -9.45875 0 0 0
-858 1 58.10375 -1.35125 -9.45875 0 0 0
-859 1 58.10375 -4.05375 -6.75625 0 0 0
-860 1 55.40125 -1.35125 -6.75625 0 0 0
-861 1 60.80625 -4.05375 -9.45875 0 0 0
-862 1 63.50875 -1.35125 -9.45875 0 0 0
-863 1 63.50875 -4.05375 -6.75625 0 0 0
-864 1 60.80625 -1.35125 -6.75625 0 0 0
-865 1 -63.50875 1.35125 -9.45875 0 0 0
-866 1 -60.80625 4.05375 -9.45875 0 0 0
-867 1 -60.80625 1.35125 -6.75625 0 0 0
-868 1 -63.50875 4.05375 -6.75625 0 0 0
-869 1 -58.10375 1.35125 -9.45875 0 0 0
-870 1 -55.40125 4.05375 -9.45875 0 0 0
-871 1 -55.40125 1.35125 -6.75625 0 0 0
-872 1 -58.10375 4.05375 -6.75625 0 0 0
-873 1 -52.69875 1.35125 -9.45875 0 0 0
-874 1 -49.99625 4.05375 -9.45875 0 0 0
-875 1 -49.99625 1.35125 -6.75625 0 0 0
-876 1 -52.69875 4.05375 -6.75625 0 0 0
-877 1 -47.29375 1.35125 -9.45875 0 0 0
-878 1 -44.59125 4.05375 -9.45875 0 0 0
-879 1 -44.59125 1.35125 -6.75625 0 0 0
-880 1 -47.29375 4.05375 -6.75625 0 0 0
-881 1 -41.88875 1.35125 -9.45875 0 0 0
-882 1 -39.18625 4.05375 -9.45875 0 0 0
-883 1 -39.18625 1.35125 -6.75625 0 0 0
-884 1 -41.88875 4.05375 -6.75625 0 0 0
-885 1 -36.48375 1.35125 -9.45875 0 0 0
-886 1 -33.78125 4.05375 -9.45875 0 0 0
-887 1 -33.78125 1.35125 -6.75625 0 0 0
-888 1 -36.48375 4.05375 -6.75625 0 0 0
-889 1 -31.07875 1.35125 -9.45875 0 0 0
-890 1 -28.37625 4.05375 -9.45875 0 0 0
-891 1 -28.37625 1.35125 -6.75625 0 0 0
-892 1 -31.07875 4.05375 -6.75625 0 0 0
-893 1 -25.67375 1.35125 -9.45875 0 0 0
-894 1 -22.97125 4.05375 -9.45875 0 0 0
-895 1 -22.97125 1.35125 -6.75625 0 0 0
-896 1 -25.67375 4.05375 -6.75625 0 0 0
-897 1 -20.26875 1.35125 -9.45875 0 0 0
-898 1 -17.56625 4.05375 -9.45875 0 0 0
-899 1 -17.56625 1.35125 -6.75625 0 0 0
-900 1 -20.26875 4.05375 -6.75625 0 0 0
-901 1 -14.86375 1.35125 -9.45875 0 0 0
-902 1 -12.16125 4.05375 -9.45875 0 0 0
-903 1 -12.16125 1.35125 -6.75625 0 0 0
-904 1 -14.86375 4.05375 -6.75625 0 0 0
-905 1 -9.45875 1.35125 -9.45875 0 0 0
-906 1 -6.75625 4.05375 -9.45875 0 0 0
-907 1 -6.75625 1.35125 -6.75625 0 0 0
-908 1 -9.45875 4.05375 -6.75625 0 0 0
-909 1 -4.05375 1.35125 -9.45875 0 0 0
-910 1 -1.35125 4.05375 -9.45875 0 0 0
-911 1 -1.35125 1.35125 -6.75625 0 0 0
-912 1 -4.05375 4.05375 -6.75625 0 0 0
-913 1 1.35125 1.35125 -9.45875 0 0 0
-914 1 4.05375 4.05375 -9.45875 0 0 0
-915 1 4.05375 1.35125 -6.75625 0 0 0
-916 1 1.35125 4.05375 -6.75625 0 0 0
-917 1 6.75625 1.35125 -9.45875 0 0 0
-918 1 9.45875 4.05375 -9.45875 0 0 0
-919 1 9.45875 1.35125 -6.75625 0 0 0
-920 1 6.75625 4.05375 -6.75625 0 0 0
-921 1 12.16125 1.35125 -9.45875 0 0 0
-922 1 14.86375 4.05375 -9.45875 0 0 0
-923 1 14.86375 1.35125 -6.75625 0 0 0
-924 1 12.16125 4.05375 -6.75625 0 0 0
-925 1 17.56625 1.35125 -9.45875 0 0 0
-926 1 20.26875 4.05375 -9.45875 0 0 0
-927 1 20.26875 1.35125 -6.75625 0 0 0
-928 1 17.56625 4.05375 -6.75625 0 0 0
-929 1 22.97125 1.35125 -9.45875 0 0 0
-930 1 25.67375 4.05375 -9.45875 0 0 0
-931 1 25.67375 1.35125 -6.75625 0 0 0
-932 1 22.97125 4.05375 -6.75625 0 0 0
-933 1 28.37625 1.35125 -9.45875 0 0 0
-934 1 31.07875 4.05375 -9.45875 0 0 0
-935 1 31.07875 1.35125 -6.75625 0 0 0
-936 1 28.37625 4.05375 -6.75625 0 0 0
-937 1 33.78125 1.35125 -9.45875 0 0 0
-938 1 36.48375 4.05375 -9.45875 0 0 0
-939 1 36.48375 1.35125 -6.75625 0 0 0
-940 1 33.78125 4.05375 -6.75625 0 0 0
-941 1 39.18625 1.35125 -9.45875 0 0 0
-942 1 41.88875 4.05375 -9.45875 0 0 0
-943 1 41.88875 1.35125 -6.75625 0 0 0
-944 1 39.18625 4.05375 -6.75625 0 0 0
-945 1 44.59125 1.35125 -9.45875 0 0 0
-946 1 47.29375 4.05375 -9.45875 0 0 0
-947 1 47.29375 1.35125 -6.75625 0 0 0
-948 1 44.59125 4.05375 -6.75625 0 0 0
-949 1 49.99625 1.35125 -9.45875 0 0 0
-950 1 52.69875 4.05375 -9.45875 0 0 0
-951 1 52.69875 1.35125 -6.75625 0 0 0
-952 1 49.99625 4.05375 -6.75625 0 0 0
-953 1 55.40125 1.35125 -9.45875 0 0 0
-954 1 58.10375 4.05375 -9.45875 0 0 0
-955 1 58.10375 1.35125 -6.75625 0 0 0
-956 1 55.40125 4.05375 -6.75625 0 0 0
-957 1 60.80625 1.35125 -9.45875 0 0 0
-958 1 63.50875 4.05375 -9.45875 0 0 0
-959 1 63.50875 1.35125 -6.75625 0 0 0
-960 1 60.80625 4.05375 -6.75625 0 0 0
-961 1 -63.50875 6.75625 -9.45875 0 0 0
-962 1 -60.80625 9.45875 -9.45875 0 0 0
-963 1 -60.80625 6.75625 -6.75625 0 0 0
-964 1 -63.50875 9.45875 -6.75625 0 0 0
-965 1 -58.10375 6.75625 -9.45875 0 0 0
-966 1 -55.40125 9.45875 -9.45875 0 0 0
-967 1 -55.40125 6.75625 -6.75625 0 0 0
-968 1 -58.10375 9.45875 -6.75625 0 0 0
-969 1 -52.69875 6.75625 -9.45875 0 0 0
-970 1 -49.99625 9.45875 -9.45875 0 0 0
-971 1 -49.99625 6.75625 -6.75625 0 0 0
-972 1 -52.69875 9.45875 -6.75625 0 0 0
-973 1 -47.29375 6.75625 -9.45875 0 0 0
-974 1 -44.59125 9.45875 -9.45875 0 0 0
-975 1 -44.59125 6.75625 -6.75625 0 0 0
-976 1 -47.29375 9.45875 -6.75625 0 0 0
-977 1 -41.88875 6.75625 -9.45875 0 0 0
-978 1 -39.18625 9.45875 -9.45875 0 0 0
-979 1 -39.18625 6.75625 -6.75625 0 0 0
-980 1 -41.88875 9.45875 -6.75625 0 0 0
-981 1 -36.48375 6.75625 -9.45875 0 0 0
-982 1 -33.78125 9.45875 -9.45875 0 0 0
-983 1 -33.78125 6.75625 -6.75625 0 0 0
-984 1 -36.48375 9.45875 -6.75625 0 0 0
-985 1 -31.07875 6.75625 -9.45875 0 0 0
-986 1 -28.37625 9.45875 -9.45875 0 0 0
-987 1 -28.37625 6.75625 -6.75625 0 0 0
-988 1 -31.07875 9.45875 -6.75625 0 0 0
-989 1 -25.67375 6.75625 -9.45875 0 0 0
-990 1 -22.97125 9.45875 -9.45875 0 0 0
-991 1 -22.97125 6.75625 -6.75625 0 0 0
-992 1 -25.67375 9.45875 -6.75625 0 0 0
-993 1 -20.26875 6.75625 -9.45875 0 0 0
-994 1 -17.56625 9.45875 -9.45875 0 0 0
-995 1 -17.56625 6.75625 -6.75625 0 0 0
-996 1 -20.26875 9.45875 -6.75625 0 0 0
-997 1 -14.86375 6.75625 -9.45875 0 0 0
-998 1 -12.16125 9.45875 -9.45875 0 0 0
-999 1 -12.16125 6.75625 -6.75625 0 0 0
-1000 1 -14.86375 9.45875 -6.75625 0 0 0
-1001 1 -9.45875 6.75625 -9.45875 0 0 0
-1002 1 -6.75625 9.45875 -9.45875 0 0 0
-1003 1 -6.75625 6.75625 -6.75625 0 0 0
-1004 1 -9.45875 9.45875 -6.75625 0 0 0
-1005 1 -4.05375 6.75625 -9.45875 0 0 0
-1006 1 -1.35125 9.45875 -9.45875 0 0 0
-1007 1 -1.35125 6.75625 -6.75625 0 0 0
-1008 1 -4.05375 9.45875 -6.75625 0 0 0
-1009 1 1.35125 6.75625 -9.45875 0 0 0
-1010 1 4.05375 9.45875 -9.45875 0 0 0
-1011 1 4.05375 6.75625 -6.75625 0 0 0
-1012 1 1.35125 9.45875 -6.75625 0 0 0
-1013 1 6.75625 6.75625 -9.45875 0 0 0
-1014 1 9.45875 9.45875 -9.45875 0 0 0
-1015 1 9.45875 6.75625 -6.75625 0 0 0
-1016 1 6.75625 9.45875 -6.75625 0 0 0
-1017 1 12.16125 6.75625 -9.45875 0 0 0
-1018 1 14.86375 9.45875 -9.45875 0 0 0
-1019 1 14.86375 6.75625 -6.75625 0 0 0
-1020 1 12.16125 9.45875 -6.75625 0 0 0
-1021 1 17.56625 6.75625 -9.45875 0 0 0
-1022 1 20.26875 9.45875 -9.45875 0 0 0
-1023 1 20.26875 6.75625 -6.75625 0 0 0
-1024 1 17.56625 9.45875 -6.75625 0 0 0
-1025 1 22.97125 6.75625 -9.45875 0 0 0
-1026 1 25.67375 9.45875 -9.45875 0 0 0
-1027 1 25.67375 6.75625 -6.75625 0 0 0
-1028 1 22.97125 9.45875 -6.75625 0 0 0
-1029 1 28.37625 6.75625 -9.45875 0 0 0
-1030 1 31.07875 9.45875 -9.45875 0 0 0
-1031 1 31.07875 6.75625 -6.75625 0 0 0
-1032 1 28.37625 9.45875 -6.75625 0 0 0
-1033 1 33.78125 6.75625 -9.45875 0 0 0
-1034 1 36.48375 9.45875 -9.45875 0 0 0
-1035 1 36.48375 6.75625 -6.75625 0 0 0
-1036 1 33.78125 9.45875 -6.75625 0 0 0
-1037 1 39.18625 6.75625 -9.45875 0 0 0
-1038 1 41.88875 9.45875 -9.45875 0 0 0
-1039 1 41.88875 6.75625 -6.75625 0 0 0
-1040 1 39.18625 9.45875 -6.75625 0 0 0
-1041 1 44.59125 6.75625 -9.45875 0 0 0
-1042 1 47.29375 9.45875 -9.45875 0 0 0
-1043 1 47.29375 6.75625 -6.75625 0 0 0
-1044 1 44.59125 9.45875 -6.75625 0 0 0
-1045 1 49.99625 6.75625 -9.45875 0 0 0
-1046 1 52.69875 9.45875 -9.45875 0 0 0
-1047 1 52.69875 6.75625 -6.75625 0 0 0
-1048 1 49.99625 9.45875 -6.75625 0 0 0
-1049 1 55.40125 6.75625 -9.45875 0 0 0
-1050 1 58.10375 9.45875 -9.45875 0 0 0
-1051 1 58.10375 6.75625 -6.75625 0 0 0
-1052 1 55.40125 9.45875 -6.75625 0 0 0
-1053 1 60.80625 6.75625 -9.45875 0 0 0
-1054 1 63.50875 9.45875 -9.45875 0 0 0
-1055 1 63.50875 6.75625 -6.75625 0 0 0
-1056 1 60.80625 9.45875 -6.75625 0 0 0
-1057 1 -63.50875 12.16125 -9.45875 0 0 0
-1058 1 -60.80625 14.86375 -9.45875 0 0 0
-1059 1 -60.80625 12.16125 -6.75625 0 0 0
-1060 1 -63.50875 14.86375 -6.75625 0 0 0
-1061 1 -58.10375 12.16125 -9.45875 0 0 0
-1062 1 -55.40125 14.86375 -9.45875 0 0 0
-1063 1 -55.40125 12.16125 -6.75625 0 0 0
-1064 1 -58.10375 14.86375 -6.75625 0 0 0
-1065 1 -52.69875 12.16125 -9.45875 0 0 0
-1066 1 -49.99625 14.86375 -9.45875 0 0 0
-1067 1 -49.99625 12.16125 -6.75625 0 0 0
-1068 1 -52.69875 14.86375 -6.75625 0 0 0
-1069 1 -47.29375 12.16125 -9.45875 0 0 0
-1070 1 -44.59125 14.86375 -9.45875 0 0 0
-1071 1 -44.59125 12.16125 -6.75625 0 0 0
-1072 1 -47.29375 14.86375 -6.75625 0 0 0
-1073 1 -41.88875 12.16125 -9.45875 0 0 0
-1074 1 -39.18625 14.86375 -9.45875 0 0 0
-1075 1 -39.18625 12.16125 -6.75625 0 0 0
-1076 1 -41.88875 14.86375 -6.75625 0 0 0
-1077 1 -36.48375 12.16125 -9.45875 0 0 0
-1078 1 -33.78125 14.86375 -9.45875 0 0 0
-1079 1 -33.78125 12.16125 -6.75625 0 0 0
-1080 1 -36.48375 14.86375 -6.75625 0 0 0
-1081 1 -31.07875 12.16125 -9.45875 0 0 0
-1082 1 -28.37625 14.86375 -9.45875 0 0 0
-1083 1 -28.37625 12.16125 -6.75625 0 0 0
-1084 1 -31.07875 14.86375 -6.75625 0 0 0
-1085 1 -25.67375 12.16125 -9.45875 0 0 0
-1086 1 -22.97125 14.86375 -9.45875 0 0 0
-1087 1 -22.97125 12.16125 -6.75625 0 0 0
-1088 1 -25.67375 14.86375 -6.75625 0 0 0
-1089 1 -20.26875 12.16125 -9.45875 0 0 0
-1090 1 -17.56625 14.86375 -9.45875 0 0 0
-1091 1 -17.56625 12.16125 -6.75625 0 0 0
-1092 1 -20.26875 14.86375 -6.75625 0 0 0
-1093 1 -14.86375 12.16125 -9.45875 0 0 0
-1094 1 -12.16125 14.86375 -9.45875 0 0 0
-1095 1 -12.16125 12.16125 -6.75625 0 0 0
-1096 1 -14.86375 14.86375 -6.75625 0 0 0
-1097 1 -9.45875 12.16125 -9.45875 0 0 0
-1098 1 -6.75625 14.86375 -9.45875 0 0 0
-1099 1 -6.75625 12.16125 -6.75625 0 0 0
-1100 1 -9.45875 14.86375 -6.75625 0 0 0
-1101 1 -4.05375 12.16125 -9.45875 0 0 0
-1102 1 -1.35125 14.86375 -9.45875 0 0 0
-1103 1 -1.35125 12.16125 -6.75625 0 0 0
-1104 1 -4.05375 14.86375 -6.75625 0 0 0
-1105 1 1.35125 12.16125 -9.45875 0 0 0
-1106 1 4.05375 14.86375 -9.45875 0 0 0
-1107 1 4.05375 12.16125 -6.75625 0 0 0
-1108 1 1.35125 14.86375 -6.75625 0 0 0
-1109 1 6.75625 12.16125 -9.45875 0 0 0
-1110 1 9.45875 14.86375 -9.45875 0 0 0
-1111 1 9.45875 12.16125 -6.75625 0 0 0
-1112 1 6.75625 14.86375 -6.75625 0 0 0
-1113 1 12.16125 12.16125 -9.45875 0 0 0
-1114 1 14.86375 14.86375 -9.45875 0 0 0
-1115 1 14.86375 12.16125 -6.75625 0 0 0
-1116 1 12.16125 14.86375 -6.75625 0 0 0
-1117 1 17.56625 12.16125 -9.45875 0 0 0
-1118 1 20.26875 14.86375 -9.45875 0 0 0
-1119 1 20.26875 12.16125 -6.75625 0 0 0
-1120 1 17.56625 14.86375 -6.75625 0 0 0
-1121 1 22.97125 12.16125 -9.45875 0 0 0
-1122 1 25.67375 14.86375 -9.45875 0 0 0
-1123 1 25.67375 12.16125 -6.75625 0 0 0
-1124 1 22.97125 14.86375 -6.75625 0 0 0
-1125 1 28.37625 12.16125 -9.45875 0 0 0
-1126 1 31.07875 14.86375 -9.45875 0 0 0
-1127 1 31.07875 12.16125 -6.75625 0 0 0
-1128 1 28.37625 14.86375 -6.75625 0 0 0
-1129 1 33.78125 12.16125 -9.45875 0 0 0
-1130 1 36.48375 14.86375 -9.45875 0 0 0
-1131 1 36.48375 12.16125 -6.75625 0 0 0
-1132 1 33.78125 14.86375 -6.75625 0 0 0
-1133 1 39.18625 12.16125 -9.45875 0 0 0
-1134 1 41.88875 14.86375 -9.45875 0 0 0
-1135 1 41.88875 12.16125 -6.75625 0 0 0
-1136 1 39.18625 14.86375 -6.75625 0 0 0
-1137 1 44.59125 12.16125 -9.45875 0 0 0
-1138 1 47.29375 14.86375 -9.45875 0 0 0
-1139 1 47.29375 12.16125 -6.75625 0 0 0
-1140 1 44.59125 14.86375 -6.75625 0 0 0
-1141 1 49.99625 12.16125 -9.45875 0 0 0
-1142 1 52.69875 14.86375 -9.45875 0 0 0
-1143 1 52.69875 12.16125 -6.75625 0 0 0
-1144 1 49.99625 14.86375 -6.75625 0 0 0
-1145 1 55.40125 12.16125 -9.45875 0 0 0
-1146 1 58.10375 14.86375 -9.45875 0 0 0
-1147 1 58.10375 12.16125 -6.75625 0 0 0
-1148 1 55.40125 14.86375 -6.75625 0 0 0
-1149 1 60.80625 12.16125 -9.45875 0 0 0
-1150 1 63.50875 14.86375 -9.45875 0 0 0
-1151 1 63.50875 12.16125 -6.75625 0 0 0
-1152 1 60.80625 14.86375 -6.75625 0 0 0
-1153 1 -63.50875 -14.86375 -4.05375 0 0 0
-1154 1 -60.80625 -12.16125 -4.05375 0 0 0
-1155 1 -60.80625 -14.86375 -1.35125 0 0 0
-1156 1 -63.50875 -12.16125 -1.35125 0 0 0
-1157 1 -58.10375 -14.86375 -4.05375 0 0 0
-1158 1 -55.40125 -12.16125 -4.05375 0 0 0
-1159 1 -55.40125 -14.86375 -1.35125 0 0 0
-1160 1 -58.10375 -12.16125 -1.35125 0 0 0
-1161 1 -52.69875 -14.86375 -4.05375 0 0 0
-1162 1 -49.99625 -12.16125 -4.05375 0 0 0
-1163 1 -49.99625 -14.86375 -1.35125 0 0 0
-1164 1 -52.69875 -12.16125 -1.35125 0 0 0
-1165 1 -47.29375 -14.86375 -4.05375 0 0 0
-1166 1 -44.59125 -12.16125 -4.05375 0 0 0
-1167 1 -44.59125 -14.86375 -1.35125 0 0 0
-1168 1 -47.29375 -12.16125 -1.35125 0 0 0
-1169 1 -41.88875 -14.86375 -4.05375 0 0 0
-1170 1 -39.18625 -12.16125 -4.05375 0 0 0
-1171 1 -39.18625 -14.86375 -1.35125 0 0 0
-1172 1 -41.88875 -12.16125 -1.35125 0 0 0
-1173 1 -36.48375 -14.86375 -4.05375 0 0 0
-1174 1 -33.78125 -12.16125 -4.05375 0 0 0
-1175 1 -33.78125 -14.86375 -1.35125 0 0 0
-1176 1 -36.48375 -12.16125 -1.35125 0 0 0
-1177 1 -31.07875 -14.86375 -4.05375 0 0 0
-1178 1 -28.37625 -12.16125 -4.05375 0 0 0
-1179 1 -28.37625 -14.86375 -1.35125 0 0 0
-1180 1 -31.07875 -12.16125 -1.35125 0 0 0
-1181 1 -25.67375 -14.86375 -4.05375 0 0 0
-1182 1 -22.97125 -12.16125 -4.05375 0 0 0
-1183 1 -22.97125 -14.86375 -1.35125 0 0 0
-1184 1 -25.67375 -12.16125 -1.35125 0 0 0
-1185 1 -20.26875 -14.86375 -4.05375 0 0 0
-1186 1 -17.56625 -12.16125 -4.05375 0 0 0
-1187 1 -17.56625 -14.86375 -1.35125 0 0 0
-1188 1 -20.26875 -12.16125 -1.35125 0 0 0
-1189 1 -14.86375 -14.86375 -4.05375 0 0 0
-1190 1 -12.16125 -12.16125 -4.05375 0 0 0
-1191 1 -12.16125 -14.86375 -1.35125 0 0 0
-1192 1 -14.86375 -12.16125 -1.35125 0 0 0
-1193 1 -9.45875 -14.86375 -4.05375 0 0 0
-1194 1 -6.75625 -12.16125 -4.05375 0 0 0
-1195 1 -6.75625 -14.86375 -1.35125 0 0 0
-1196 1 -9.45875 -12.16125 -1.35125 0 0 0
-1197 1 -4.05375 -14.86375 -4.05375 0 0 0
-1198 1 -1.35125 -12.16125 -4.05375 0 0 0
-1199 1 -1.35125 -14.86375 -1.35125 0 0 0
-1200 1 -4.05375 -12.16125 -1.35125 0 0 0
-1201 1 1.35125 -14.86375 -4.05375 0 0 0
-1202 1 4.05375 -12.16125 -4.05375 0 0 0
-1203 1 4.05375 -14.86375 -1.35125 0 0 0
-1204 1 1.35125 -12.16125 -1.35125 0 0 0
-1205 1 6.75625 -14.86375 -4.05375 0 0 0
-1206 1 9.45875 -12.16125 -4.05375 0 0 0
-1207 1 9.45875 -14.86375 -1.35125 0 0 0
-1208 1 6.75625 -12.16125 -1.35125 0 0 0
-1209 1 12.16125 -14.86375 -4.05375 0 0 0
-1210 1 14.86375 -12.16125 -4.05375 0 0 0
-1211 1 14.86375 -14.86375 -1.35125 0 0 0
-1212 1 12.16125 -12.16125 -1.35125 0 0 0
-1213 1 17.56625 -14.86375 -4.05375 0 0 0
-1214 1 20.26875 -12.16125 -4.05375 0 0 0
-1215 1 20.26875 -14.86375 -1.35125 0 0 0
-1216 1 17.56625 -12.16125 -1.35125 0 0 0
-1217 1 22.97125 -14.86375 -4.05375 0 0 0
-1218 1 25.67375 -12.16125 -4.05375 0 0 0
-1219 1 25.67375 -14.86375 -1.35125 0 0 0
-1220 1 22.97125 -12.16125 -1.35125 0 0 0
-1221 1 28.37625 -14.86375 -4.05375 0 0 0
-1222 1 31.07875 -12.16125 -4.05375 0 0 0
-1223 1 31.07875 -14.86375 -1.35125 0 0 0
-1224 1 28.37625 -12.16125 -1.35125 0 0 0
-1225 1 33.78125 -14.86375 -4.05375 0 0 0
-1226 1 36.48375 -12.16125 -4.05375 0 0 0
-1227 1 36.48375 -14.86375 -1.35125 0 0 0
-1228 1 33.78125 -12.16125 -1.35125 0 0 0
-1229 1 39.18625 -14.86375 -4.05375 0 0 0
-1230 1 41.88875 -12.16125 -4.05375 0 0 0
-1231 1 41.88875 -14.86375 -1.35125 0 0 0
-1232 1 39.18625 -12.16125 -1.35125 0 0 0
-1233 1 44.59125 -14.86375 -4.05375 0 0 0
-1234 1 47.29375 -12.16125 -4.05375 0 0 0
-1235 1 47.29375 -14.86375 -1.35125 0 0 0
-1236 1 44.59125 -12.16125 -1.35125 0 0 0
-1237 1 49.99625 -14.86375 -4.05375 0 0 0
-1238 1 52.69875 -12.16125 -4.05375 0 0 0
-1239 1 52.69875 -14.86375 -1.35125 0 0 0
-1240 1 49.99625 -12.16125 -1.35125 0 0 0
-1241 1 55.40125 -14.86375 -4.05375 0 0 0
-1242 1 58.10375 -12.16125 -4.05375 0 0 0
-1243 1 58.10375 -14.86375 -1.35125 0 0 0
-1244 1 55.40125 -12.16125 -1.35125 0 0 0
-1245 1 60.80625 -14.86375 -4.05375 0 0 0
-1246 1 63.50875 -12.16125 -4.05375 0 0 0
-1247 1 63.50875 -14.86375 -1.35125 0 0 0
-1248 1 60.80625 -12.16125 -1.35125 0 0 0
-1249 1 -63.50875 -9.45875 -4.05375 0 0 0
-1250 1 -60.80625 -6.75625 -4.05375 0 0 0
-1251 1 -60.80625 -9.45875 -1.35125 0 0 0
-1252 1 -63.50875 -6.75625 -1.35125 0 0 0
-1253 1 -58.10375 -9.45875 -4.05375 0 0 0
-1254 1 -55.40125 -6.75625 -4.05375 0 0 0
-1255 1 -55.40125 -9.45875 -1.35125 0 0 0
-1256 1 -58.10375 -6.75625 -1.35125 0 0 0
-1257 1 -52.69875 -9.45875 -4.05375 0 0 0
-1258 1 -49.99625 -6.75625 -4.05375 0 0 0
-1259 1 -49.99625 -9.45875 -1.35125 0 0 0
-1260 1 -52.69875 -6.75625 -1.35125 0 0 0
-1261 1 -47.29375 -9.45875 -4.05375 0 0 0
-1262 1 -44.59125 -6.75625 -4.05375 0 0 0
-1263 1 -44.59125 -9.45875 -1.35125 0 0 0
-1264 1 -47.29375 -6.75625 -1.35125 0 0 0
-1265 1 -41.88875 -9.45875 -4.05375 0 0 0
-1266 1 -39.18625 -6.75625 -4.05375 0 0 0
-1267 1 -39.18625 -9.45875 -1.35125 0 0 0
-1268 1 -41.88875 -6.75625 -1.35125 0 0 0
-1269 1 -36.48375 -9.45875 -4.05375 0 0 0
-1270 1 -33.78125 -6.75625 -4.05375 0 0 0
-1271 1 -33.78125 -9.45875 -1.35125 0 0 0
-1272 1 -36.48375 -6.75625 -1.35125 0 0 0
-1273 1 -31.07875 -9.45875 -4.05375 0 0 0
-1274 1 -28.37625 -6.75625 -4.05375 0 0 0
-1275 1 -28.37625 -9.45875 -1.35125 0 0 0
-1276 1 -31.07875 -6.75625 -1.35125 0 0 0
-1277 1 -25.67375 -9.45875 -4.05375 0 0 0
-1278 1 -22.97125 -6.75625 -4.05375 0 0 0
-1279 1 -22.97125 -9.45875 -1.35125 0 0 0
-1280 1 -25.67375 -6.75625 -1.35125 0 0 0
-1281 1 -20.26875 -9.45875 -4.05375 0 0 0
-1282 1 -17.56625 -6.75625 -4.05375 0 0 0
-1283 1 -17.56625 -9.45875 -1.35125 0 0 0
-1284 1 -20.26875 -6.75625 -1.35125 0 0 0
-1285 1 -14.86375 -9.45875 -4.05375 0 0 0
-1286 1 -12.16125 -6.75625 -4.05375 0 0 0
-1287 1 -12.16125 -9.45875 -1.35125 0 0 0
-1288 1 -14.86375 -6.75625 -1.35125 0 0 0
-1289 1 -9.45875 -9.45875 -4.05375 0 0 0
-1290 1 -6.75625 -6.75625 -4.05375 0 0 0
-1291 1 -6.75625 -9.45875 -1.35125 0 0 0
-1292 1 -9.45875 -6.75625 -1.35125 0 0 0
-1293 1 -4.05375 -9.45875 -4.05375 0 0 0
-1294 1 -1.35125 -6.75625 -4.05375 0 0 0
-1295 1 -1.35125 -9.45875 -1.35125 0 0 0
-1296 1 -4.05375 -6.75625 -1.35125 0 0 0
-1297 1 1.35125 -9.45875 -4.05375 0 0 0
-1298 1 4.05375 -6.75625 -4.05375 0 0 0
-1299 1 4.05375 -9.45875 -1.35125 0 0 0
-1300 1 1.35125 -6.75625 -1.35125 0 0 0
-1301 1 6.75625 -9.45875 -4.05375 0 0 0
-1302 1 9.45875 -6.75625 -4.05375 0 0 0
-1303 1 9.45875 -9.45875 -1.35125 0 0 0
-1304 1 6.75625 -6.75625 -1.35125 0 0 0
-1305 1 12.16125 -9.45875 -4.05375 0 0 0
-1306 1 14.86375 -6.75625 -4.05375 0 0 0
-1307 1 14.86375 -9.45875 -1.35125 0 0 0
-1308 1 12.16125 -6.75625 -1.35125 0 0 0
-1309 1 17.56625 -9.45875 -4.05375 0 0 0
-1310 1 20.26875 -6.75625 -4.05375 0 0 0
-1311 1 20.26875 -9.45875 -1.35125 0 0 0
-1312 1 17.56625 -6.75625 -1.35125 0 0 0
-1313 1 22.97125 -9.45875 -4.05375 0 0 0
-1314 1 25.67375 -6.75625 -4.05375 0 0 0
-1315 1 25.67375 -9.45875 -1.35125 0 0 0
-1316 1 22.97125 -6.75625 -1.35125 0 0 0
-1317 1 28.37625 -9.45875 -4.05375 0 0 0
-1318 1 31.07875 -6.75625 -4.05375 0 0 0
-1319 1 31.07875 -9.45875 -1.35125 0 0 0
-1320 1 28.37625 -6.75625 -1.35125 0 0 0
-1321 1 33.78125 -9.45875 -4.05375 0 0 0
-1322 1 36.48375 -6.75625 -4.05375 0 0 0
-1323 1 36.48375 -9.45875 -1.35125 0 0 0
-1324 1 33.78125 -6.75625 -1.35125 0 0 0
-1325 1 39.18625 -9.45875 -4.05375 0 0 0
-1326 1 41.88875 -6.75625 -4.05375 0 0 0
-1327 1 41.88875 -9.45875 -1.35125 0 0 0
-1328 1 39.18625 -6.75625 -1.35125 0 0 0
-1329 1 44.59125 -9.45875 -4.05375 0 0 0
-1330 1 47.29375 -6.75625 -4.05375 0 0 0
-1331 1 47.29375 -9.45875 -1.35125 0 0 0
-1332 1 44.59125 -6.75625 -1.35125 0 0 0
-1333 1 49.99625 -9.45875 -4.05375 0 0 0
-1334 1 52.69875 -6.75625 -4.05375 0 0 0
-1335 1 52.69875 -9.45875 -1.35125 0 0 0
-1336 1 49.99625 -6.75625 -1.35125 0 0 0
-1337 1 55.40125 -9.45875 -4.05375 0 0 0
-1338 1 58.10375 -6.75625 -4.05375 0 0 0
-1339 1 58.10375 -9.45875 -1.35125 0 0 0
-1340 1 55.40125 -6.75625 -1.35125 0 0 0
-1341 1 60.80625 -9.45875 -4.05375 0 0 0
-1342 1 63.50875 -6.75625 -4.05375 0 0 0
-1343 1 63.50875 -9.45875 -1.35125 0 0 0
-1344 1 60.80625 -6.75625 -1.35125 0 0 0
-1345 1 -63.50875 -4.05375 -4.05375 0 0 0
-1346 1 -60.80625 -1.35125 -4.05375 0 0 0
-1347 1 -60.80625 -4.05375 -1.35125 0 0 0
-1348 1 -63.50875 -1.35125 -1.35125 0 0 0
-1349 1 -58.10375 -4.05375 -4.05375 0 0 0
-1350 1 -55.40125 -1.35125 -4.05375 0 0 0
-1351 1 -55.40125 -4.05375 -1.35125 0 0 0
-1352 1 -58.10375 -1.35125 -1.35125 0 0 0
-1353 1 -52.69875 -4.05375 -4.05375 0 0 0
-1354 1 -49.99625 -1.35125 -4.05375 0 0 0
-1355 1 -49.99625 -4.05375 -1.35125 0 0 0
-1356 1 -52.69875 -1.35125 -1.35125 0 0 0
-1357 1 -47.29375 -4.05375 -4.05375 0 0 0
-1358 1 -44.59125 -1.35125 -4.05375 0 0 0
-1359 1 -44.59125 -4.05375 -1.35125 0 0 0
-1360 1 -47.29375 -1.35125 -1.35125 0 0 0
-1361 1 -41.88875 -4.05375 -4.05375 0 0 0
-1362 1 -39.18625 -1.35125 -4.05375 0 0 0
-1363 1 -39.18625 -4.05375 -1.35125 0 0 0
-1364 1 -41.88875 -1.35125 -1.35125 0 0 0
-1365 1 -36.48375 -4.05375 -4.05375 0 0 0
-1366 1 -33.78125 -1.35125 -4.05375 0 0 0
-1367 1 -33.78125 -4.05375 -1.35125 0 0 0
-1368 1 -36.48375 -1.35125 -1.35125 0 0 0
-1369 1 -31.07875 -4.05375 -4.05375 0 0 0
-1370 1 -28.37625 -1.35125 -4.05375 0 0 0
-1371 1 -28.37625 -4.05375 -1.35125 0 0 0
-1372 1 -31.07875 -1.35125 -1.35125 0 0 0
-1373 1 -25.67375 -4.05375 -4.05375 0 0 0
-1374 1 -22.97125 -1.35125 -4.05375 0 0 0
-1375 1 -22.97125 -4.05375 -1.35125 0 0 0
-1376 1 -25.67375 -1.35125 -1.35125 0 0 0
-1377 1 -20.26875 -4.05375 -4.05375 0 0 0
-1378 1 -17.56625 -1.35125 -4.05375 0 0 0
-1379 1 -17.56625 -4.05375 -1.35125 0 0 0
-1380 1 -20.26875 -1.35125 -1.35125 0 0 0
-1381 1 -14.86375 -4.05375 -4.05375 0 0 0
-1382 1 -12.16125 -1.35125 -4.05375 0 0 0
-1383 1 -12.16125 -4.05375 -1.35125 0 0 0
-1384 1 -14.86375 -1.35125 -1.35125 0 0 0
-1385 1 -9.45875 -4.05375 -4.05375 0 0 0
-1386 1 -6.75625 -1.35125 -4.05375 0 0 0
-1387 1 -6.75625 -4.05375 -1.35125 0 0 0
-1388 1 -9.45875 -1.35125 -1.35125 0 0 0
-1389 1 -4.05375 -4.05375 -4.05375 0 0 0
-1390 1 -1.35125 -1.35125 -4.05375 0 0 0
-1391 1 -1.35125 -4.05375 -1.35125 0 0 0
-1392 1 -4.05375 -1.35125 -1.35125 0 0 0
-1393 1 1.35125 -4.05375 -4.05375 0 0 0
-1394 1 4.05375 -1.35125 -4.05375 0 0 0
-1395 1 4.05375 -4.05375 -1.35125 0 0 0
-1396 1 1.35125 -1.35125 -1.35125 0 0 0
-1397 1 6.75625 -4.05375 -4.05375 0 0 0
-1398 1 9.45875 -1.35125 -4.05375 0 0 0
-1399 1 9.45875 -4.05375 -1.35125 0 0 0
-1400 1 6.75625 -1.35125 -1.35125 0 0 0
-1401 1 12.16125 -4.05375 -4.05375 0 0 0
-1402 1 14.86375 -1.35125 -4.05375 0 0 0
-1403 1 14.86375 -4.05375 -1.35125 0 0 0
-1404 1 12.16125 -1.35125 -1.35125 0 0 0
-1405 1 17.56625 -4.05375 -4.05375 0 0 0
-1406 1 20.26875 -1.35125 -4.05375 0 0 0
-1407 1 20.26875 -4.05375 -1.35125 0 0 0
-1408 1 17.56625 -1.35125 -1.35125 0 0 0
-1409 1 22.97125 -4.05375 -4.05375 0 0 0
-1410 1 25.67375 -1.35125 -4.05375 0 0 0
-1411 1 25.67375 -4.05375 -1.35125 0 0 0
-1412 1 22.97125 -1.35125 -1.35125 0 0 0
-1413 1 28.37625 -4.05375 -4.05375 0 0 0
-1414 1 31.07875 -1.35125 -4.05375 0 0 0
-1415 1 31.07875 -4.05375 -1.35125 0 0 0
-1416 1 28.37625 -1.35125 -1.35125 0 0 0
-1417 1 33.78125 -4.05375 -4.05375 0 0 0
-1418 1 36.48375 -1.35125 -4.05375 0 0 0
-1419 1 36.48375 -4.05375 -1.35125 0 0 0
-1420 1 33.78125 -1.35125 -1.35125 0 0 0
-1421 1 39.18625 -4.05375 -4.05375 0 0 0
-1422 1 41.88875 -1.35125 -4.05375 0 0 0
-1423 1 41.88875 -4.05375 -1.35125 0 0 0
-1424 1 39.18625 -1.35125 -1.35125 0 0 0
-1425 1 44.59125 -4.05375 -4.05375 0 0 0
-1426 1 47.29375 -1.35125 -4.05375 0 0 0
-1427 1 47.29375 -4.05375 -1.35125 0 0 0
-1428 1 44.59125 -1.35125 -1.35125 0 0 0
-1429 1 49.99625 -4.05375 -4.05375 0 0 0
-1430 1 52.69875 -1.35125 -4.05375 0 0 0
-1431 1 52.69875 -4.05375 -1.35125 0 0 0
-1432 1 49.99625 -1.35125 -1.35125 0 0 0
-1433 1 55.40125 -4.05375 -4.05375 0 0 0
-1434 1 58.10375 -1.35125 -4.05375 0 0 0
-1435 1 58.10375 -4.05375 -1.35125 0 0 0
-1436 1 55.40125 -1.35125 -1.35125 0 0 0
-1437 1 60.80625 -4.05375 -4.05375 0 0 0
-1438 1 63.50875 -1.35125 -4.05375 0 0 0
-1439 1 63.50875 -4.05375 -1.35125 0 0 0
-1440 1 60.80625 -1.35125 -1.35125 0 0 0
-1441 1 -63.50875 1.35125 -4.05375 0 0 0
-1442 1 -60.80625 4.05375 -4.05375 0 0 0
-1443 1 -60.80625 1.35125 -1.35125 0 0 0
-1444 1 -63.50875 4.05375 -1.35125 0 0 0
-1445 1 -58.10375 1.35125 -4.05375 0 0 0
-1446 1 -55.40125 4.05375 -4.05375 0 0 0
-1447 1 -55.40125 1.35125 -1.35125 0 0 0
-1448 1 -58.10375 4.05375 -1.35125 0 0 0
-1449 1 -52.69875 1.35125 -4.05375 0 0 0
-1450 1 -49.99625 4.05375 -4.05375 0 0 0
-1451 1 -49.99625 1.35125 -1.35125 0 0 0
-1452 1 -52.69875 4.05375 -1.35125 0 0 0
-1453 1 -47.29375 1.35125 -4.05375 0 0 0
-1454 1 -44.59125 4.05375 -4.05375 0 0 0
-1455 1 -44.59125 1.35125 -1.35125 0 0 0
-1456 1 -47.29375 4.05375 -1.35125 0 0 0
-1457 1 -41.88875 1.35125 -4.05375 0 0 0
-1458 1 -39.18625 4.05375 -4.05375 0 0 0
-1459 1 -39.18625 1.35125 -1.35125 0 0 0
-1460 1 -41.88875 4.05375 -1.35125 0 0 0
-1461 1 -36.48375 1.35125 -4.05375 0 0 0
-1462 1 -33.78125 4.05375 -4.05375 0 0 0
-1463 1 -33.78125 1.35125 -1.35125 0 0 0
-1464 1 -36.48375 4.05375 -1.35125 0 0 0
-1465 1 -31.07875 1.35125 -4.05375 0 0 0
-1466 1 -28.37625 4.05375 -4.05375 0 0 0
-1467 1 -28.37625 1.35125 -1.35125 0 0 0
-1468 1 -31.07875 4.05375 -1.35125 0 0 0
-1469 1 -25.67375 1.35125 -4.05375 0 0 0
-1470 1 -22.97125 4.05375 -4.05375 0 0 0
-1471 1 -22.97125 1.35125 -1.35125 0 0 0
-1472 1 -25.67375 4.05375 -1.35125 0 0 0
-1473 1 -20.26875 1.35125 -4.05375 0 0 0
-1474 1 -17.56625 4.05375 -4.05375 0 0 0
-1475 1 -17.56625 1.35125 -1.35125 0 0 0
-1476 1 -20.26875 4.05375 -1.35125 0 0 0
-1477 1 -14.86375 1.35125 -4.05375 0 0 0
-1478 1 -12.16125 4.05375 -4.05375 0 0 0
-1479 1 -12.16125 1.35125 -1.35125 0 0 0
-1480 1 -14.86375 4.05375 -1.35125 0 0 0
-1481 1 -9.45875 1.35125 -4.05375 0 0 0
-1482 1 -6.75625 4.05375 -4.05375 0 0 0
-1483 1 -6.75625 1.35125 -1.35125 0 0 0
-1484 1 -9.45875 4.05375 -1.35125 0 0 0
-1485 1 -4.05375 1.35125 -4.05375 0 0 0
-1486 1 -1.35125 4.05375 -4.05375 0 0 0
-1487 1 -1.35125 1.35125 -1.35125 0 0 0
-1488 1 -4.05375 4.05375 -1.35125 0 0 0
-1489 1 1.35125 1.35125 -4.05375 0 0 0
-1490 1 4.05375 4.05375 -4.05375 0 0 0
-1491 1 4.05375 1.35125 -1.35125 0 0 0
-1492 1 1.35125 4.05375 -1.35125 0 0 0
-1493 1 6.75625 1.35125 -4.05375 0 0 0
-1494 1 9.45875 4.05375 -4.05375 0 0 0
-1495 1 9.45875 1.35125 -1.35125 0 0 0
-1496 1 6.75625 4.05375 -1.35125 0 0 0
-1497 1 12.16125 1.35125 -4.05375 0 0 0
-1498 1 14.86375 4.05375 -4.05375 0 0 0
-1499 1 14.86375 1.35125 -1.35125 0 0 0
-1500 1 12.16125 4.05375 -1.35125 0 0 0
-1501 1 17.56625 1.35125 -4.05375 0 0 0
-1502 1 20.26875 4.05375 -4.05375 0 0 0
-1503 1 20.26875 1.35125 -1.35125 0 0 0
-1504 1 17.56625 4.05375 -1.35125 0 0 0
-1505 1 22.97125 1.35125 -4.05375 0 0 0
-1506 1 25.67375 4.05375 -4.05375 0 0 0
-1507 1 25.67375 1.35125 -1.35125 0 0 0
-1508 1 22.97125 4.05375 -1.35125 0 0 0
-1509 1 28.37625 1.35125 -4.05375 0 0 0
-1510 1 31.07875 4.05375 -4.05375 0 0 0
-1511 1 31.07875 1.35125 -1.35125 0 0 0
-1512 1 28.37625 4.05375 -1.35125 0 0 0
-1513 1 33.78125 1.35125 -4.05375 0 0 0
-1514 1 36.48375 4.05375 -4.05375 0 0 0
-1515 1 36.48375 1.35125 -1.35125 0 0 0
-1516 1 33.78125 4.05375 -1.35125 0 0 0
-1517 1 39.18625 1.35125 -4.05375 0 0 0
-1518 1 41.88875 4.05375 -4.05375 0 0 0
-1519 1 41.88875 1.35125 -1.35125 0 0 0
-1520 1 39.18625 4.05375 -1.35125 0 0 0
-1521 1 44.59125 1.35125 -4.05375 0 0 0
-1522 1 47.29375 4.05375 -4.05375 0 0 0
-1523 1 47.29375 1.35125 -1.35125 0 0 0
-1524 1 44.59125 4.05375 -1.35125 0 0 0
-1525 1 49.99625 1.35125 -4.05375 0 0 0
-1526 1 52.69875 4.05375 -4.05375 0 0 0
-1527 1 52.69875 1.35125 -1.35125 0 0 0
-1528 1 49.99625 4.05375 -1.35125 0 0 0
-1529 1 55.40125 1.35125 -4.05375 0 0 0
-1530 1 58.10375 4.05375 -4.05375 0 0 0
-1531 1 58.10375 1.35125 -1.35125 0 0 0
-1532 1 55.40125 4.05375 -1.35125 0 0 0
-1533 1 60.80625 1.35125 -4.05375 0 0 0
-1534 1 63.50875 4.05375 -4.05375 0 0 0
-1535 1 63.50875 1.35125 -1.35125 0 0 0
-1536 1 60.80625 4.05375 -1.35125 0 0 0
-1537 1 -63.50875 6.75625 -4.05375 0 0 0
-1538 1 -60.80625 9.45875 -4.05375 0 0 0
-1539 1 -60.80625 6.75625 -1.35125 0 0 0
-1540 1 -63.50875 9.45875 -1.35125 0 0 0
-1541 1 -58.10375 6.75625 -4.05375 0 0 0
-1542 1 -55.40125 9.45875 -4.05375 0 0 0
-1543 1 -55.40125 6.75625 -1.35125 0 0 0
-1544 1 -58.10375 9.45875 -1.35125 0 0 0
-1545 1 -52.69875 6.75625 -4.05375 0 0 0
-1546 1 -49.99625 9.45875 -4.05375 0 0 0
-1547 1 -49.99625 6.75625 -1.35125 0 0 0
-1548 1 -52.69875 9.45875 -1.35125 0 0 0
-1549 1 -47.29375 6.75625 -4.05375 0 0 0
-1550 1 -44.59125 9.45875 -4.05375 0 0 0
-1551 1 -44.59125 6.75625 -1.35125 0 0 0
-1552 1 -47.29375 9.45875 -1.35125 0 0 0
-1553 1 -41.88875 6.75625 -4.05375 0 0 0
-1554 1 -39.18625 9.45875 -4.05375 0 0 0
-1555 1 -39.18625 6.75625 -1.35125 0 0 0
-1556 1 -41.88875 9.45875 -1.35125 0 0 0
-1557 1 -36.48375 6.75625 -4.05375 0 0 0
-1558 1 -33.78125 9.45875 -4.05375 0 0 0
-1559 1 -33.78125 6.75625 -1.35125 0 0 0
-1560 1 -36.48375 9.45875 -1.35125 0 0 0
-1561 1 -31.07875 6.75625 -4.05375 0 0 0
-1562 1 -28.37625 9.45875 -4.05375 0 0 0
-1563 1 -28.37625 6.75625 -1.35125 0 0 0
-1564 1 -31.07875 9.45875 -1.35125 0 0 0
-1565 1 -25.67375 6.75625 -4.05375 0 0 0
-1566 1 -22.97125 9.45875 -4.05375 0 0 0
-1567 1 -22.97125 6.75625 -1.35125 0 0 0
-1568 1 -25.67375 9.45875 -1.35125 0 0 0
-1569 1 -20.26875 6.75625 -4.05375 0 0 0
-1570 1 -17.56625 9.45875 -4.05375 0 0 0
-1571 1 -17.56625 6.75625 -1.35125 0 0 0
-1572 1 -20.26875 9.45875 -1.35125 0 0 0
-1573 1 -14.86375 6.75625 -4.05375 0 0 0
-1574 1 -12.16125 9.45875 -4.05375 0 0 0
-1575 1 -12.16125 6.75625 -1.35125 0 0 0
-1576 1 -14.86375 9.45875 -1.35125 0 0 0
-1577 1 -9.45875 6.75625 -4.05375 0 0 0
-1578 1 -6.75625 9.45875 -4.05375 0 0 0
-1579 1 -6.75625 6.75625 -1.35125 0 0 0
-1580 1 -9.45875 9.45875 -1.35125 0 0 0
-1581 1 -4.05375 6.75625 -4.05375 0 0 0
-1582 1 -1.35125 9.45875 -4.05375 0 0 0
-1583 1 -1.35125 6.75625 -1.35125 0 0 0
-1584 1 -4.05375 9.45875 -1.35125 0 0 0
-1585 1 1.35125 6.75625 -4.05375 0 0 0
-1586 1 4.05375 9.45875 -4.05375 0 0 0
-1587 1 4.05375 6.75625 -1.35125 0 0 0
-1588 1 1.35125 9.45875 -1.35125 0 0 0
-1589 1 6.75625 6.75625 -4.05375 0 0 0
-1590 1 9.45875 9.45875 -4.05375 0 0 0
-1591 1 9.45875 6.75625 -1.35125 0 0 0
-1592 1 6.75625 9.45875 -1.35125 0 0 0
-1593 1 12.16125 6.75625 -4.05375 0 0 0
-1594 1 14.86375 9.45875 -4.05375 0 0 0
-1595 1 14.86375 6.75625 -1.35125 0 0 0
-1596 1 12.16125 9.45875 -1.35125 0 0 0
-1597 1 17.56625 6.75625 -4.05375 0 0 0
-1598 1 20.26875 9.45875 -4.05375 0 0 0
-1599 1 20.26875 6.75625 -1.35125 0 0 0
-1600 1 17.56625 9.45875 -1.35125 0 0 0
-1601 1 22.97125 6.75625 -4.05375 0 0 0
-1602 1 25.67375 9.45875 -4.05375 0 0 0
-1603 1 25.67375 6.75625 -1.35125 0 0 0
-1604 1 22.97125 9.45875 -1.35125 0 0 0
-1605 1 28.37625 6.75625 -4.05375 0 0 0
-1606 1 31.07875 9.45875 -4.05375 0 0 0
-1607 1 31.07875 6.75625 -1.35125 0 0 0
-1608 1 28.37625 9.45875 -1.35125 0 0 0
-1609 1 33.78125 6.75625 -4.05375 0 0 0
-1610 1 36.48375 9.45875 -4.05375 0 0 0
-1611 1 36.48375 6.75625 -1.35125 0 0 0
-1612 1 33.78125 9.45875 -1.35125 0 0 0
-1613 1 39.18625 6.75625 -4.05375 0 0 0
-1614 1 41.88875 9.45875 -4.05375 0 0 0
-1615 1 41.88875 6.75625 -1.35125 0 0 0
-1616 1 39.18625 9.45875 -1.35125 0 0 0
-1617 1 44.59125 6.75625 -4.05375 0 0 0
-1618 1 47.29375 9.45875 -4.05375 0 0 0
-1619 1 47.29375 6.75625 -1.35125 0 0 0
-1620 1 44.59125 9.45875 -1.35125 0 0 0
-1621 1 49.99625 6.75625 -4.05375 0 0 0
-1622 1 52.69875 9.45875 -4.05375 0 0 0
-1623 1 52.69875 6.75625 -1.35125 0 0 0
-1624 1 49.99625 9.45875 -1.35125 0 0 0
-1625 1 55.40125 6.75625 -4.05375 0 0 0
-1626 1 58.10375 9.45875 -4.05375 0 0 0
-1627 1 58.10375 6.75625 -1.35125 0 0 0
-1628 1 55.40125 9.45875 -1.35125 0 0 0
-1629 1 60.80625 6.75625 -4.05375 0 0 0
-1630 1 63.50875 9.45875 -4.05375 0 0 0
-1631 1 63.50875 6.75625 -1.35125 0 0 0
-1632 1 60.80625 9.45875 -1.35125 0 0 0
-1633 1 -63.50875 12.16125 -4.05375 0 0 0
-1634 1 -60.80625 14.86375 -4.05375 0 0 0
-1635 1 -60.80625 12.16125 -1.35125 0 0 0
-1636 1 -63.50875 14.86375 -1.35125 0 0 0
-1637 1 -58.10375 12.16125 -4.05375 0 0 0
-1638 1 -55.40125 14.86375 -4.05375 0 0 0
-1639 1 -55.40125 12.16125 -1.35125 0 0 0
-1640 1 -58.10375 14.86375 -1.35125 0 0 0
-1641 1 -52.69875 12.16125 -4.05375 0 0 0
-1642 1 -49.99625 14.86375 -4.05375 0 0 0
-1643 1 -49.99625 12.16125 -1.35125 0 0 0
-1644 1 -52.69875 14.86375 -1.35125 0 0 0
-1645 1 -47.29375 12.16125 -4.05375 0 0 0
-1646 1 -44.59125 14.86375 -4.05375 0 0 0
-1647 1 -44.59125 12.16125 -1.35125 0 0 0
-1648 1 -47.29375 14.86375 -1.35125 0 0 0
-1649 1 -41.88875 12.16125 -4.05375 0 0 0
-1650 1 -39.18625 14.86375 -4.05375 0 0 0
-1651 1 -39.18625 12.16125 -1.35125 0 0 0
-1652 1 -41.88875 14.86375 -1.35125 0 0 0
-1653 1 -36.48375 12.16125 -4.05375 0 0 0
-1654 1 -33.78125 14.86375 -4.05375 0 0 0
-1655 1 -33.78125 12.16125 -1.35125 0 0 0
-1656 1 -36.48375 14.86375 -1.35125 0 0 0
-1657 1 -31.07875 12.16125 -4.05375 0 0 0
-1658 1 -28.37625 14.86375 -4.05375 0 0 0
-1659 1 -28.37625 12.16125 -1.35125 0 0 0
-1660 1 -31.07875 14.86375 -1.35125 0 0 0
-1661 1 -25.67375 12.16125 -4.05375 0 0 0
-1662 1 -22.97125 14.86375 -4.05375 0 0 0
-1663 1 -22.97125 12.16125 -1.35125 0 0 0
-1664 1 -25.67375 14.86375 -1.35125 0 0 0
-1665 1 -20.26875 12.16125 -4.05375 0 0 0
-1666 1 -17.56625 14.86375 -4.05375 0 0 0
-1667 1 -17.56625 12.16125 -1.35125 0 0 0
-1668 1 -20.26875 14.86375 -1.35125 0 0 0
-1669 1 -14.86375 12.16125 -4.05375 0 0 0
-1670 1 -12.16125 14.86375 -4.05375 0 0 0
-1671 1 -12.16125 12.16125 -1.35125 0 0 0
-1672 1 -14.86375 14.86375 -1.35125 0 0 0
-1673 1 -9.45875 12.16125 -4.05375 0 0 0
-1674 1 -6.75625 14.86375 -4.05375 0 0 0
-1675 1 -6.75625 12.16125 -1.35125 0 0 0
-1676 1 -9.45875 14.86375 -1.35125 0 0 0
-1677 1 -4.05375 12.16125 -4.05375 0 0 0
-1678 1 -1.35125 14.86375 -4.05375 0 0 0
-1679 1 -1.35125 12.16125 -1.35125 0 0 0
-1680 1 -4.05375 14.86375 -1.35125 0 0 0
-1681 1 1.35125 12.16125 -4.05375 0 0 0
-1682 1 4.05375 14.86375 -4.05375 0 0 0
-1683 1 4.05375 12.16125 -1.35125 0 0 0
-1684 1 1.35125 14.86375 -1.35125 0 0 0
-1685 1 6.75625 12.16125 -4.05375 0 0 0
-1686 1 9.45875 14.86375 -4.05375 0 0 0
-1687 1 9.45875 12.16125 -1.35125 0 0 0
-1688 1 6.75625 14.86375 -1.35125 0 0 0
-1689 1 12.16125 12.16125 -4.05375 0 0 0
-1690 1 14.86375 14.86375 -4.05375 0 0 0
-1691 1 14.86375 12.16125 -1.35125 0 0 0
-1692 1 12.16125 14.86375 -1.35125 0 0 0
-1693 1 17.56625 12.16125 -4.05375 0 0 0
-1694 1 20.26875 14.86375 -4.05375 0 0 0
-1695 1 20.26875 12.16125 -1.35125 0 0 0
-1696 1 17.56625 14.86375 -1.35125 0 0 0
-1697 1 22.97125 12.16125 -4.05375 0 0 0
-1698 1 25.67375 14.86375 -4.05375 0 0 0
-1699 1 25.67375 12.16125 -1.35125 0 0 0
-1700 1 22.97125 14.86375 -1.35125 0 0 0
-1701 1 28.37625 12.16125 -4.05375 0 0 0
-1702 1 31.07875 14.86375 -4.05375 0 0 0
-1703 1 31.07875 12.16125 -1.35125 0 0 0
-1704 1 28.37625 14.86375 -1.35125 0 0 0
-1705 1 33.78125 12.16125 -4.05375 0 0 0
-1706 1 36.48375 14.86375 -4.05375 0 0 0
-1707 1 36.48375 12.16125 -1.35125 0 0 0
-1708 1 33.78125 14.86375 -1.35125 0 0 0
-1709 1 39.18625 12.16125 -4.05375 0 0 0
-1710 1 41.88875 14.86375 -4.05375 0 0 0
-1711 1 41.88875 12.16125 -1.35125 0 0 0
-1712 1 39.18625 14.86375 -1.35125 0 0 0
-1713 1 44.59125 12.16125 -4.05375 0 0 0
-1714 1 47.29375 14.86375 -4.05375 0 0 0
-1715 1 47.29375 12.16125 -1.35125 0 0 0
-1716 1 44.59125 14.86375 -1.35125 0 0 0
-1717 1 49.99625 12.16125 -4.05375 0 0 0
-1718 1 52.69875 14.86375 -4.05375 0 0 0
-1719 1 52.69875 12.16125 -1.35125 0 0 0
-1720 1 49.99625 14.86375 -1.35125 0 0 0
-1721 1 55.40125 12.16125 -4.05375 0 0 0
-1722 1 58.10375 14.86375 -4.05375 0 0 0
-1723 1 58.10375 12.16125 -1.35125 0 0 0
-1724 1 55.40125 14.86375 -1.35125 0 0 0
-1725 1 60.80625 12.16125 -4.05375 0 0 0
-1726 1 63.50875 14.86375 -4.05375 0 0 0
-1727 1 63.50875 12.16125 -1.35125 0 0 0
-1728 1 60.80625 14.86375 -1.35125 0 0 0
-1729 1 -63.50875 -14.86375 1.35125 0 0 0
-1730 1 -60.80625 -12.16125 1.35125 0 0 0
-1731 1 -60.80625 -14.86375 4.05375 0 0 0
-1732 1 -63.50875 -12.16125 4.05375 0 0 0
-1733 1 -58.10375 -14.86375 1.35125 0 0 0
-1734 1 -55.40125 -12.16125 1.35125 0 0 0
-1735 1 -55.40125 -14.86375 4.05375 0 0 0
-1736 1 -58.10375 -12.16125 4.05375 0 0 0
-1737 1 -52.69875 -14.86375 1.35125 0 0 0
-1738 1 -49.99625 -12.16125 1.35125 0 0 0
-1739 1 -49.99625 -14.86375 4.05375 0 0 0
-1740 1 -52.69875 -12.16125 4.05375 0 0 0
-1741 1 -47.29375 -14.86375 1.35125 0 0 0
-1742 1 -44.59125 -12.16125 1.35125 0 0 0
-1743 1 -44.59125 -14.86375 4.05375 0 0 0
-1744 1 -47.29375 -12.16125 4.05375 0 0 0
-1745 1 -41.88875 -14.86375 1.35125 0 0 0
-1746 1 -39.18625 -12.16125 1.35125 0 0 0
-1747 1 -39.18625 -14.86375 4.05375 0 0 0
-1748 1 -41.88875 -12.16125 4.05375 0 0 0
-1749 1 -36.48375 -14.86375 1.35125 0 0 0
-1750 1 -33.78125 -12.16125 1.35125 0 0 0
-1751 1 -33.78125 -14.86375 4.05375 0 0 0
-1752 1 -36.48375 -12.16125 4.05375 0 0 0
-1753 1 -31.07875 -14.86375 1.35125 0 0 0
-1754 1 -28.37625 -12.16125 1.35125 0 0 0
-1755 1 -28.37625 -14.86375 4.05375 0 0 0
-1756 1 -31.07875 -12.16125 4.05375 0 0 0
-1757 1 -25.67375 -14.86375 1.35125 0 0 0
-1758 1 -22.97125 -12.16125 1.35125 0 0 0
-1759 1 -22.97125 -14.86375 4.05375 0 0 0
-1760 1 -25.67375 -12.16125 4.05375 0 0 0
-1761 1 -20.26875 -14.86375 1.35125 0 0 0
-1762 1 -17.56625 -12.16125 1.35125 0 0 0
-1763 1 -17.56625 -14.86375 4.05375 0 0 0
-1764 1 -20.26875 -12.16125 4.05375 0 0 0
-1765 1 -14.86375 -14.86375 1.35125 0 0 0
-1766 1 -12.16125 -12.16125 1.35125 0 0 0
-1767 1 -12.16125 -14.86375 4.05375 0 0 0
-1768 1 -14.86375 -12.16125 4.05375 0 0 0
-1769 1 -9.45875 -14.86375 1.35125 0 0 0
-1770 1 -6.75625 -12.16125 1.35125 0 0 0
-1771 1 -6.75625 -14.86375 4.05375 0 0 0
-1772 1 -9.45875 -12.16125 4.05375 0 0 0
-1773 1 -4.05375 -14.86375 1.35125 0 0 0
-1774 1 -1.35125 -12.16125 1.35125 0 0 0
-1775 1 -1.35125 -14.86375 4.05375 0 0 0
-1776 1 -4.05375 -12.16125 4.05375 0 0 0
-1777 1 1.35125 -14.86375 1.35125 0 0 0
-1778 1 4.05375 -12.16125 1.35125 0 0 0
-1779 1 4.05375 -14.86375 4.05375 0 0 0
-1780 1 1.35125 -12.16125 4.05375 0 0 0
-1781 1 6.75625 -14.86375 1.35125 0 0 0
-1782 1 9.45875 -12.16125 1.35125 0 0 0
-1783 1 9.45875 -14.86375 4.05375 0 0 0
-1784 1 6.75625 -12.16125 4.05375 0 0 0
-1785 1 12.16125 -14.86375 1.35125 0 0 0
-1786 1 14.86375 -12.16125 1.35125 0 0 0
-1787 1 14.86375 -14.86375 4.05375 0 0 0
-1788 1 12.16125 -12.16125 4.05375 0 0 0
-1789 1 17.56625 -14.86375 1.35125 0 0 0
-1790 1 20.26875 -12.16125 1.35125 0 0 0
-1791 1 20.26875 -14.86375 4.05375 0 0 0
-1792 1 17.56625 -12.16125 4.05375 0 0 0
-1793 1 22.97125 -14.86375 1.35125 0 0 0
-1794 1 25.67375 -12.16125 1.35125 0 0 0
-1795 1 25.67375 -14.86375 4.05375 0 0 0
-1796 1 22.97125 -12.16125 4.05375 0 0 0
-1797 1 28.37625 -14.86375 1.35125 0 0 0
-1798 1 31.07875 -12.16125 1.35125 0 0 0
-1799 1 31.07875 -14.86375 4.05375 0 0 0
-1800 1 28.37625 -12.16125 4.05375 0 0 0
-1801 1 33.78125 -14.86375 1.35125 0 0 0
-1802 1 36.48375 -12.16125 1.35125 0 0 0
-1803 1 36.48375 -14.86375 4.05375 0 0 0
-1804 1 33.78125 -12.16125 4.05375 0 0 0
-1805 1 39.18625 -14.86375 1.35125 0 0 0
-1806 1 41.88875 -12.16125 1.35125 0 0 0
-1807 1 41.88875 -14.86375 4.05375 0 0 0
-1808 1 39.18625 -12.16125 4.05375 0 0 0
-1809 1 44.59125 -14.86375 1.35125 0 0 0
-1810 1 47.29375 -12.16125 1.35125 0 0 0
-1811 1 47.29375 -14.86375 4.05375 0 0 0
-1812 1 44.59125 -12.16125 4.05375 0 0 0
-1813 1 49.99625 -14.86375 1.35125 0 0 0
-1814 1 52.69875 -12.16125 1.35125 0 0 0
-1815 1 52.69875 -14.86375 4.05375 0 0 0
-1816 1 49.99625 -12.16125 4.05375 0 0 0
-1817 1 55.40125 -14.86375 1.35125 0 0 0
-1818 1 58.10375 -12.16125 1.35125 0 0 0
-1819 1 58.10375 -14.86375 4.05375 0 0 0
-1820 1 55.40125 -12.16125 4.05375 0 0 0
-1821 1 60.80625 -14.86375 1.35125 0 0 0
-1822 1 63.50875 -12.16125 1.35125 0 0 0
-1823 1 63.50875 -14.86375 4.05375 0 0 0
-1824 1 60.80625 -12.16125 4.05375 0 0 0
-1825 1 -63.50875 -9.45875 1.35125 0 0 0
-1826 1 -60.80625 -6.75625 1.35125 0 0 0
-1827 1 -60.80625 -9.45875 4.05375 0 0 0
-1828 1 -63.50875 -6.75625 4.05375 0 0 0
-1829 1 -58.10375 -9.45875 1.35125 0 0 0
-1830 1 -55.40125 -6.75625 1.35125 0 0 0
-1831 1 -55.40125 -9.45875 4.05375 0 0 0
-1832 1 -58.10375 -6.75625 4.05375 0 0 0
-1833 1 -52.69875 -9.45875 1.35125 0 0 0
-1834 1 -49.99625 -6.75625 1.35125 0 0 0
-1835 1 -49.99625 -9.45875 4.05375 0 0 0
-1836 1 -52.69875 -6.75625 4.05375 0 0 0
-1837 1 -47.29375 -9.45875 1.35125 0 0 0
-1838 1 -44.59125 -6.75625 1.35125 0 0 0
-1839 1 -44.59125 -9.45875 4.05375 0 0 0
-1840 1 -47.29375 -6.75625 4.05375 0 0 0
-1841 1 -41.88875 -9.45875 1.35125 0 0 0
-1842 1 -39.18625 -6.75625 1.35125 0 0 0
-1843 1 -39.18625 -9.45875 4.05375 0 0 0
-1844 1 -41.88875 -6.75625 4.05375 0 0 0
-1845 1 -36.48375 -9.45875 1.35125 0 0 0
-1846 1 -33.78125 -6.75625 1.35125 0 0 0
-1847 1 -33.78125 -9.45875 4.05375 0 0 0
-1848 1 -36.48375 -6.75625 4.05375 0 0 0
-1849 1 -31.07875 -9.45875 1.35125 0 0 0
-1850 1 -28.37625 -6.75625 1.35125 0 0 0
-1851 1 -28.37625 -9.45875 4.05375 0 0 0
-1852 1 -31.07875 -6.75625 4.05375 0 0 0
-1853 1 -25.67375 -9.45875 1.35125 0 0 0
-1854 1 -22.97125 -6.75625 1.35125 0 0 0
-1855 1 -22.97125 -9.45875 4.05375 0 0 0
-1856 1 -25.67375 -6.75625 4.05375 0 0 0
-1857 1 -20.26875 -9.45875 1.35125 0 0 0
-1858 1 -17.56625 -6.75625 1.35125 0 0 0
-1859 1 -17.56625 -9.45875 4.05375 0 0 0
-1860 1 -20.26875 -6.75625 4.05375 0 0 0
-1861 1 -14.86375 -9.45875 1.35125 0 0 0
-1862 1 -12.16125 -6.75625 1.35125 0 0 0
-1863 1 -12.16125 -9.45875 4.05375 0 0 0
-1864 1 -14.86375 -6.75625 4.05375 0 0 0
-1865 1 -9.45875 -9.45875 1.35125 0 0 0
-1866 1 -6.75625 -6.75625 1.35125 0 0 0
-1867 1 -6.75625 -9.45875 4.05375 0 0 0
-1868 1 -9.45875 -6.75625 4.05375 0 0 0
-1869 1 -4.05375 -9.45875 1.35125 0 0 0
-1870 1 -1.35125 -6.75625 1.35125 0 0 0
-1871 1 -1.35125 -9.45875 4.05375 0 0 0
-1872 1 -4.05375 -6.75625 4.05375 0 0 0
-1873 1 1.35125 -9.45875 1.35125 0 0 0
-1874 1 4.05375 -6.75625 1.35125 0 0 0
-1875 1 4.05375 -9.45875 4.05375 0 0 0
-1876 1 1.35125 -6.75625 4.05375 0 0 0
-1877 1 6.75625 -9.45875 1.35125 0 0 0
-1878 1 9.45875 -6.75625 1.35125 0 0 0
-1879 1 9.45875 -9.45875 4.05375 0 0 0
-1880 1 6.75625 -6.75625 4.05375 0 0 0
-1881 1 12.16125 -9.45875 1.35125 0 0 0
-1882 1 14.86375 -6.75625 1.35125 0 0 0
-1883 1 14.86375 -9.45875 4.05375 0 0 0
-1884 1 12.16125 -6.75625 4.05375 0 0 0
-1885 1 17.56625 -9.45875 1.35125 0 0 0
-1886 1 20.26875 -6.75625 1.35125 0 0 0
-1887 1 20.26875 -9.45875 4.05375 0 0 0
-1888 1 17.56625 -6.75625 4.05375 0 0 0
-1889 1 22.97125 -9.45875 1.35125 0 0 0
-1890 1 25.67375 -6.75625 1.35125 0 0 0
-1891 1 25.67375 -9.45875 4.05375 0 0 0
-1892 1 22.97125 -6.75625 4.05375 0 0 0
-1893 1 28.37625 -9.45875 1.35125 0 0 0
-1894 1 31.07875 -6.75625 1.35125 0 0 0
-1895 1 31.07875 -9.45875 4.05375 0 0 0
-1896 1 28.37625 -6.75625 4.05375 0 0 0
-1897 1 33.78125 -9.45875 1.35125 0 0 0
-1898 1 36.48375 -6.75625 1.35125 0 0 0
-1899 1 36.48375 -9.45875 4.05375 0 0 0
-1900 1 33.78125 -6.75625 4.05375 0 0 0
-1901 1 39.18625 -9.45875 1.35125 0 0 0
-1902 1 41.88875 -6.75625 1.35125 0 0 0
-1903 1 41.88875 -9.45875 4.05375 0 0 0
-1904 1 39.18625 -6.75625 4.05375 0 0 0
-1905 1 44.59125 -9.45875 1.35125 0 0 0
-1906 1 47.29375 -6.75625 1.35125 0 0 0
-1907 1 47.29375 -9.45875 4.05375 0 0 0
-1908 1 44.59125 -6.75625 4.05375 0 0 0
-1909 1 49.99625 -9.45875 1.35125 0 0 0
-1910 1 52.69875 -6.75625 1.35125 0 0 0
-1911 1 52.69875 -9.45875 4.05375 0 0 0
-1912 1 49.99625 -6.75625 4.05375 0 0 0
-1913 1 55.40125 -9.45875 1.35125 0 0 0
-1914 1 58.10375 -6.75625 1.35125 0 0 0
-1915 1 58.10375 -9.45875 4.05375 0 0 0
-1916 1 55.40125 -6.75625 4.05375 0 0 0
-1917 1 60.80625 -9.45875 1.35125 0 0 0
-1918 1 63.50875 -6.75625 1.35125 0 0 0
-1919 1 63.50875 -9.45875 4.05375 0 0 0
-1920 1 60.80625 -6.75625 4.05375 0 0 0
-1921 1 -63.50875 -4.05375 1.35125 0 0 0
-1922 1 -60.80625 -1.35125 1.35125 0 0 0
-1923 1 -60.80625 -4.05375 4.05375 0 0 0
-1924 1 -63.50875 -1.35125 4.05375 0 0 0
-1925 1 -58.10375 -4.05375 1.35125 0 0 0
-1926 1 -55.40125 -1.35125 1.35125 0 0 0
-1927 1 -55.40125 -4.05375 4.05375 0 0 0
-1928 1 -58.10375 -1.35125 4.05375 0 0 0
-1929 1 -52.69875 -4.05375 1.35125 0 0 0
-1930 1 -49.99625 -1.35125 1.35125 0 0 0
-1931 1 -49.99625 -4.05375 4.05375 0 0 0
-1932 1 -52.69875 -1.35125 4.05375 0 0 0
-1933 1 -47.29375 -4.05375 1.35125 0 0 0
-1934 1 -44.59125 -1.35125 1.35125 0 0 0
-1935 1 -44.59125 -4.05375 4.05375 0 0 0
-1936 1 -47.29375 -1.35125 4.05375 0 0 0
-1937 1 -41.88875 -4.05375 1.35125 0 0 0
-1938 1 -39.18625 -1.35125 1.35125 0 0 0
-1939 1 -39.18625 -4.05375 4.05375 0 0 0
-1940 1 -41.88875 -1.35125 4.05375 0 0 0
-1941 1 -36.48375 -4.05375 1.35125 0 0 0
-1942 1 -33.78125 -1.35125 1.35125 0 0 0
-1943 1 -33.78125 -4.05375 4.05375 0 0 0
-1944 1 -36.48375 -1.35125 4.05375 0 0 0
-1945 1 -31.07875 -4.05375 1.35125 0 0 0
-1946 1 -28.37625 -1.35125 1.35125 0 0 0
-1947 1 -28.37625 -4.05375 4.05375 0 0 0
-1948 1 -31.07875 -1.35125 4.05375 0 0 0
-1949 1 -25.67375 -4.05375 1.35125 0 0 0
-1950 1 -22.97125 -1.35125 1.35125 0 0 0
-1951 1 -22.97125 -4.05375 4.05375 0 0 0
-1952 1 -25.67375 -1.35125 4.05375 0 0 0
-1953 1 -20.26875 -4.05375 1.35125 0 0 0
-1954 1 -17.56625 -1.35125 1.35125 0 0 0
-1955 1 -17.56625 -4.05375 4.05375 0 0 0
-1956 1 -20.26875 -1.35125 4.05375 0 0 0
-1957 1 -14.86375 -4.05375 1.35125 0 0 0
-1958 1 -12.16125 -1.35125 1.35125 0 0 0
-1959 1 -12.16125 -4.05375 4.05375 0 0 0
-1960 1 -14.86375 -1.35125 4.05375 0 0 0
-1961 1 -9.45875 -4.05375 1.35125 0 0 0
-1962 1 -6.75625 -1.35125 1.35125 0 0 0
-1963 1 -6.75625 -4.05375 4.05375 0 0 0
-1964 1 -9.45875 -1.35125 4.05375 0 0 0
-1965 1 -4.05375 -4.05375 1.35125 0 0 0
-1966 1 -1.35125 -1.35125 1.35125 0 0 0
-1967 1 -1.35125 -4.05375 4.05375 0 0 0
-1968 1 -4.05375 -1.35125 4.05375 0 0 0
-1969 1 1.35125 -4.05375 1.35125 0 0 0
-1970 1 4.05375 -1.35125 1.35125 0 0 0
-1971 1 4.05375 -4.05375 4.05375 0 0 0
-1972 1 1.35125 -1.35125 4.05375 0 0 0
-1973 1 6.75625 -4.05375 1.35125 0 0 0
-1974 1 9.45875 -1.35125 1.35125 0 0 0
-1975 1 9.45875 -4.05375 4.05375 0 0 0
-1976 1 6.75625 -1.35125 4.05375 0 0 0
-1977 1 12.16125 -4.05375 1.35125 0 0 0
-1978 1 14.86375 -1.35125 1.35125 0 0 0
-1979 1 14.86375 -4.05375 4.05375 0 0 0
-1980 1 12.16125 -1.35125 4.05375 0 0 0
-1981 1 17.56625 -4.05375 1.35125 0 0 0
-1982 1 20.26875 -1.35125 1.35125 0 0 0
-1983 1 20.26875 -4.05375 4.05375 0 0 0
-1984 1 17.56625 -1.35125 4.05375 0 0 0
-1985 1 22.97125 -4.05375 1.35125 0 0 0
-1986 1 25.67375 -1.35125 1.35125 0 0 0
-1987 1 25.67375 -4.05375 4.05375 0 0 0
-1988 1 22.97125 -1.35125 4.05375 0 0 0
-1989 1 28.37625 -4.05375 1.35125 0 0 0
-1990 1 31.07875 -1.35125 1.35125 0 0 0
-1991 1 31.07875 -4.05375 4.05375 0 0 0
-1992 1 28.37625 -1.35125 4.05375 0 0 0
-1993 1 33.78125 -4.05375 1.35125 0 0 0
-1994 1 36.48375 -1.35125 1.35125 0 0 0
-1995 1 36.48375 -4.05375 4.05375 0 0 0
-1996 1 33.78125 -1.35125 4.05375 0 0 0
-1997 1 39.18625 -4.05375 1.35125 0 0 0
-1998 1 41.88875 -1.35125 1.35125 0 0 0
-1999 1 41.88875 -4.05375 4.05375 0 0 0
-2000 1 39.18625 -1.35125 4.05375 0 0 0
-2001 1 44.59125 -4.05375 1.35125 0 0 0
-2002 1 47.29375 -1.35125 1.35125 0 0 0
-2003 1 47.29375 -4.05375 4.05375 0 0 0
-2004 1 44.59125 -1.35125 4.05375 0 0 0
-2005 1 49.99625 -4.05375 1.35125 0 0 0
-2006 1 52.69875 -1.35125 1.35125 0 0 0
-2007 1 52.69875 -4.05375 4.05375 0 0 0
-2008 1 49.99625 -1.35125 4.05375 0 0 0
-2009 1 55.40125 -4.05375 1.35125 0 0 0
-2010 1 58.10375 -1.35125 1.35125 0 0 0
-2011 1 58.10375 -4.05375 4.05375 0 0 0
-2012 1 55.40125 -1.35125 4.05375 0 0 0
-2013 1 60.80625 -4.05375 1.35125 0 0 0
-2014 1 63.50875 -1.35125 1.35125 0 0 0
-2015 1 63.50875 -4.05375 4.05375 0 0 0
-2016 1 60.80625 -1.35125 4.05375 0 0 0
-2017 1 -63.50875 1.35125 1.35125 0 0 0
-2018 1 -60.80625 4.05375 1.35125 0 0 0
-2019 1 -60.80625 1.35125 4.05375 0 0 0
-2020 1 -63.50875 4.05375 4.05375 0 0 0
-2021 1 -58.10375 1.35125 1.35125 0 0 0
-2022 1 -55.40125 4.05375 1.35125 0 0 0
-2023 1 -55.40125 1.35125 4.05375 0 0 0
-2024 1 -58.10375 4.05375 4.05375 0 0 0
-2025 1 -52.69875 1.35125 1.35125 0 0 0
-2026 1 -49.99625 4.05375 1.35125 0 0 0
-2027 1 -49.99625 1.35125 4.05375 0 0 0
-2028 1 -52.69875 4.05375 4.05375 0 0 0
-2029 1 -47.29375 1.35125 1.35125 0 0 0
-2030 1 -44.59125 4.05375 1.35125 0 0 0
-2031 1 -44.59125 1.35125 4.05375 0 0 0
-2032 1 -47.29375 4.05375 4.05375 0 0 0
-2033 1 -41.88875 1.35125 1.35125 0 0 0
-2034 1 -39.18625 4.05375 1.35125 0 0 0
-2035 1 -39.18625 1.35125 4.05375 0 0 0
-2036 1 -41.88875 4.05375 4.05375 0 0 0
-2037 1 -36.48375 1.35125 1.35125 0 0 0
-2038 1 -33.78125 4.05375 1.35125 0 0 0
-2039 1 -33.78125 1.35125 4.05375 0 0 0
-2040 1 -36.48375 4.05375 4.05375 0 0 0
-2041 1 -31.07875 1.35125 1.35125 0 0 0
-2042 1 -28.37625 4.05375 1.35125 0 0 0
-2043 1 -28.37625 1.35125 4.05375 0 0 0
-2044 1 -31.07875 4.05375 4.05375 0 0 0
-2045 1 -25.67375 1.35125 1.35125 0 0 0
-2046 1 -22.97125 4.05375 1.35125 0 0 0
-2047 1 -22.97125 1.35125 4.05375 0 0 0
-2048 1 -25.67375 4.05375 4.05375 0 0 0
-2049 1 -20.26875 1.35125 1.35125 0 0 0
-2050 1 -17.56625 4.05375 1.35125 0 0 0
-2051 1 -17.56625 1.35125 4.05375 0 0 0
-2052 1 -20.26875 4.05375 4.05375 0 0 0
-2053 1 -14.86375 1.35125 1.35125 0 0 0
-2054 1 -12.16125 4.05375 1.35125 0 0 0
-2055 1 -12.16125 1.35125 4.05375 0 0 0
-2056 1 -14.86375 4.05375 4.05375 0 0 0
-2057 1 -9.45875 1.35125 1.35125 0 0 0
-2058 1 -6.75625 4.05375 1.35125 0 0 0
-2059 1 -6.75625 1.35125 4.05375 0 0 0
-2060 1 -9.45875 4.05375 4.05375 0 0 0
-2061 1 -4.05375 1.35125 1.35125 0 0 0
-2062 1 -1.35125 4.05375 1.35125 0 0 0
-2063 1 -1.35125 1.35125 4.05375 0 0 0
-2064 1 -4.05375 4.05375 4.05375 0 0 0
-2065 1 1.35125 1.35125 1.35125 0 0 0
-2066 1 4.05375 4.05375 1.35125 0 0 0
-2067 1 4.05375 1.35125 4.05375 0 0 0
-2068 1 1.35125 4.05375 4.05375 0 0 0
-2069 1 6.75625 1.35125 1.35125 0 0 0
-2070 1 9.45875 4.05375 1.35125 0 0 0
-2071 1 9.45875 1.35125 4.05375 0 0 0
-2072 1 6.75625 4.05375 4.05375 0 0 0
-2073 1 12.16125 1.35125 1.35125 0 0 0
-2074 1 14.86375 4.05375 1.35125 0 0 0
-2075 1 14.86375 1.35125 4.05375 0 0 0
-2076 1 12.16125 4.05375 4.05375 0 0 0
-2077 1 17.56625 1.35125 1.35125 0 0 0
-2078 1 20.26875 4.05375 1.35125 0 0 0
-2079 1 20.26875 1.35125 4.05375 0 0 0
-2080 1 17.56625 4.05375 4.05375 0 0 0
-2081 1 22.97125 1.35125 1.35125 0 0 0
-2082 1 25.67375 4.05375 1.35125 0 0 0
-2083 1 25.67375 1.35125 4.05375 0 0 0
-2084 1 22.97125 4.05375 4.05375 0 0 0
-2085 1 28.37625 1.35125 1.35125 0 0 0
-2086 1 31.07875 4.05375 1.35125 0 0 0
-2087 1 31.07875 1.35125 4.05375 0 0 0
-2088 1 28.37625 4.05375 4.05375 0 0 0
-2089 1 33.78125 1.35125 1.35125 0 0 0
-2090 1 36.48375 4.05375 1.35125 0 0 0
-2091 1 36.48375 1.35125 4.05375 0 0 0
-2092 1 33.78125 4.05375 4.05375 0 0 0
-2093 1 39.18625 1.35125 1.35125 0 0 0
-2094 1 41.88875 4.05375 1.35125 0 0 0
-2095 1 41.88875 1.35125 4.05375 0 0 0
-2096 1 39.18625 4.05375 4.05375 0 0 0
-2097 1 44.59125 1.35125 1.35125 0 0 0
-2098 1 47.29375 4.05375 1.35125 0 0 0
-2099 1 47.29375 1.35125 4.05375 0 0 0
-2100 1 44.59125 4.05375 4.05375 0 0 0
-2101 1 49.99625 1.35125 1.35125 0 0 0
-2102 1 52.69875 4.05375 1.35125 0 0 0
-2103 1 52.69875 1.35125 4.05375 0 0 0
-2104 1 49.99625 4.05375 4.05375 0 0 0
-2105 1 55.40125 1.35125 1.35125 0 0 0
-2106 1 58.10375 4.05375 1.35125 0 0 0
-2107 1 58.10375 1.35125 4.05375 0 0 0
-2108 1 55.40125 4.05375 4.05375 0 0 0
-2109 1 60.80625 1.35125 1.35125 0 0 0
-2110 1 63.50875 4.05375 1.35125 0 0 0
-2111 1 63.50875 1.35125 4.05375 0 0 0
-2112 1 60.80625 4.05375 4.05375 0 0 0
-2113 1 -63.50875 6.75625 1.35125 0 0 0
-2114 1 -60.80625 9.45875 1.35125 0 0 0
-2115 1 -60.80625 6.75625 4.05375 0 0 0
-2116 1 -63.50875 9.45875 4.05375 0 0 0
-2117 1 -58.10375 6.75625 1.35125 0 0 0
-2118 1 -55.40125 9.45875 1.35125 0 0 0
-2119 1 -55.40125 6.75625 4.05375 0 0 0
-2120 1 -58.10375 9.45875 4.05375 0 0 0
-2121 1 -52.69875 6.75625 1.35125 0 0 0
-2122 1 -49.99625 9.45875 1.35125 0 0 0
-2123 1 -49.99625 6.75625 4.05375 0 0 0
-2124 1 -52.69875 9.45875 4.05375 0 0 0
-2125 1 -47.29375 6.75625 1.35125 0 0 0
-2126 1 -44.59125 9.45875 1.35125 0 0 0
-2127 1 -44.59125 6.75625 4.05375 0 0 0
-2128 1 -47.29375 9.45875 4.05375 0 0 0
-2129 1 -41.88875 6.75625 1.35125 0 0 0
-2130 1 -39.18625 9.45875 1.35125 0 0 0
-2131 1 -39.18625 6.75625 4.05375 0 0 0
-2132 1 -41.88875 9.45875 4.05375 0 0 0
-2133 1 -36.48375 6.75625 1.35125 0 0 0
-2134 1 -33.78125 9.45875 1.35125 0 0 0
-2135 1 -33.78125 6.75625 4.05375 0 0 0
-2136 1 -36.48375 9.45875 4.05375 0 0 0
-2137 1 -31.07875 6.75625 1.35125 0 0 0
-2138 1 -28.37625 9.45875 1.35125 0 0 0
-2139 1 -28.37625 6.75625 4.05375 0 0 0
-2140 1 -31.07875 9.45875 4.05375 0 0 0
-2141 1 -25.67375 6.75625 1.35125 0 0 0
-2142 1 -22.97125 9.45875 1.35125 0 0 0
-2143 1 -22.97125 6.75625 4.05375 0 0 0
-2144 1 -25.67375 9.45875 4.05375 0 0 0
-2145 1 -20.26875 6.75625 1.35125 0 0 0
-2146 1 -17.56625 9.45875 1.35125 0 0 0
-2147 1 -17.56625 6.75625 4.05375 0 0 0
-2148 1 -20.26875 9.45875 4.05375 0 0 0
-2149 1 -14.86375 6.75625 1.35125 0 0 0
-2150 1 -12.16125 9.45875 1.35125 0 0 0
-2151 1 -12.16125 6.75625 4.05375 0 0 0
-2152 1 -14.86375 9.45875 4.05375 0 0 0
-2153 1 -9.45875 6.75625 1.35125 0 0 0
-2154 1 -6.75625 9.45875 1.35125 0 0 0
-2155 1 -6.75625 6.75625 4.05375 0 0 0
-2156 1 -9.45875 9.45875 4.05375 0 0 0
-2157 1 -4.05375 6.75625 1.35125 0 0 0
-2158 1 -1.35125 9.45875 1.35125 0 0 0
-2159 1 -1.35125 6.75625 4.05375 0 0 0
-2160 1 -4.05375 9.45875 4.05375 0 0 0
-2161 1 1.35125 6.75625 1.35125 0 0 0
-2162 1 4.05375 9.45875 1.35125 0 0 0
-2163 1 4.05375 6.75625 4.05375 0 0 0
-2164 1 1.35125 9.45875 4.05375 0 0 0
-2165 1 6.75625 6.75625 1.35125 0 0 0
-2166 1 9.45875 9.45875 1.35125 0 0 0
-2167 1 9.45875 6.75625 4.05375 0 0 0
-2168 1 6.75625 9.45875 4.05375 0 0 0
-2169 1 12.16125 6.75625 1.35125 0 0 0
-2170 1 14.86375 9.45875 1.35125 0 0 0
-2171 1 14.86375 6.75625 4.05375 0 0 0
-2172 1 12.16125 9.45875 4.05375 0 0 0
-2173 1 17.56625 6.75625 1.35125 0 0 0
-2174 1 20.26875 9.45875 1.35125 0 0 0
-2175 1 20.26875 6.75625 4.05375 0 0 0
-2176 1 17.56625 9.45875 4.05375 0 0 0
-2177 1 22.97125 6.75625 1.35125 0 0 0
-2178 1 25.67375 9.45875 1.35125 0 0 0
-2179 1 25.67375 6.75625 4.05375 0 0 0
-2180 1 22.97125 9.45875 4.05375 0 0 0
-2181 1 28.37625 6.75625 1.35125 0 0 0
-2182 1 31.07875 9.45875 1.35125 0 0 0
-2183 1 31.07875 6.75625 4.05375 0 0 0
-2184 1 28.37625 9.45875 4.05375 0 0 0
-2185 1 33.78125 6.75625 1.35125 0 0 0
-2186 1 36.48375 9.45875 1.35125 0 0 0
-2187 1 36.48375 6.75625 4.05375 0 0 0
-2188 1 33.78125 9.45875 4.05375 0 0 0
-2189 1 39.18625 6.75625 1.35125 0 0 0
-2190 1 41.88875 9.45875 1.35125 0 0 0
-2191 1 41.88875 6.75625 4.05375 0 0 0
-2192 1 39.18625 9.45875 4.05375 0 0 0
-2193 1 44.59125 6.75625 1.35125 0 0 0
-2194 1 47.29375 9.45875 1.35125 0 0 0
-2195 1 47.29375 6.75625 4.05375 0 0 0
-2196 1 44.59125 9.45875 4.05375 0 0 0
-2197 1 49.99625 6.75625 1.35125 0 0 0
-2198 1 52.69875 9.45875 1.35125 0 0 0
-2199 1 52.69875 6.75625 4.05375 0 0 0
-2200 1 49.99625 9.45875 4.05375 0 0 0
-2201 1 55.40125 6.75625 1.35125 0 0 0
-2202 1 58.10375 9.45875 1.35125 0 0 0
-2203 1 58.10375 6.75625 4.05375 0 0 0
-2204 1 55.40125 9.45875 4.05375 0 0 0
-2205 1 60.80625 6.75625 1.35125 0 0 0
-2206 1 63.50875 9.45875 1.35125 0 0 0
-2207 1 63.50875 6.75625 4.05375 0 0 0
-2208 1 60.80625 9.45875 4.05375 0 0 0
-2209 1 -63.50875 12.16125 1.35125 0 0 0
-2210 1 -60.80625 14.86375 1.35125 0 0 0
-2211 1 -60.80625 12.16125 4.05375 0 0 0
-2212 1 -63.50875 14.86375 4.05375 0 0 0
-2213 1 -58.10375 12.16125 1.35125 0 0 0
-2214 1 -55.40125 14.86375 1.35125 0 0 0
-2215 1 -55.40125 12.16125 4.05375 0 0 0
-2216 1 -58.10375 14.86375 4.05375 0 0 0
-2217 1 -52.69875 12.16125 1.35125 0 0 0
-2218 1 -49.99625 14.86375 1.35125 0 0 0
-2219 1 -49.99625 12.16125 4.05375 0 0 0
-2220 1 -52.69875 14.86375 4.05375 0 0 0
-2221 1 -47.29375 12.16125 1.35125 0 0 0
-2222 1 -44.59125 14.86375 1.35125 0 0 0
-2223 1 -44.59125 12.16125 4.05375 0 0 0
-2224 1 -47.29375 14.86375 4.05375 0 0 0
-2225 1 -41.88875 12.16125 1.35125 0 0 0
-2226 1 -39.18625 14.86375 1.35125 0 0 0
-2227 1 -39.18625 12.16125 4.05375 0 0 0
-2228 1 -41.88875 14.86375 4.05375 0 0 0
-2229 1 -36.48375 12.16125 1.35125 0 0 0
-2230 1 -33.78125 14.86375 1.35125 0 0 0
-2231 1 -33.78125 12.16125 4.05375 0 0 0
-2232 1 -36.48375 14.86375 4.05375 0 0 0
-2233 1 -31.07875 12.16125 1.35125 0 0 0
-2234 1 -28.37625 14.86375 1.35125 0 0 0
-2235 1 -28.37625 12.16125 4.05375 0 0 0
-2236 1 -31.07875 14.86375 4.05375 0 0 0
-2237 1 -25.67375 12.16125 1.35125 0 0 0
-2238 1 -22.97125 14.86375 1.35125 0 0 0
-2239 1 -22.97125 12.16125 4.05375 0 0 0
-2240 1 -25.67375 14.86375 4.05375 0 0 0
-2241 1 -20.26875 12.16125 1.35125 0 0 0
-2242 1 -17.56625 14.86375 1.35125 0 0 0
-2243 1 -17.56625 12.16125 4.05375 0 0 0
-2244 1 -20.26875 14.86375 4.05375 0 0 0
-2245 1 -14.86375 12.16125 1.35125 0 0 0
-2246 1 -12.16125 14.86375 1.35125 0 0 0
-2247 1 -12.16125 12.16125 4.05375 0 0 0
-2248 1 -14.86375 14.86375 4.05375 0 0 0
-2249 1 -9.45875 12.16125 1.35125 0 0 0
-2250 1 -6.75625 14.86375 1.35125 0 0 0
-2251 1 -6.75625 12.16125 4.05375 0 0 0
-2252 1 -9.45875 14.86375 4.05375 0 0 0
-2253 1 -4.05375 12.16125 1.35125 0 0 0
-2254 1 -1.35125 14.86375 1.35125 0 0 0
-2255 1 -1.35125 12.16125 4.05375 0 0 0
-2256 1 -4.05375 14.86375 4.05375 0 0 0
-2257 1 1.35125 12.16125 1.35125 0 0 0
-2258 1 4.05375 14.86375 1.35125 0 0 0
-2259 1 4.05375 12.16125 4.05375 0 0 0
-2260 1 1.35125 14.86375 4.05375 0 0 0
-2261 1 6.75625 12.16125 1.35125 0 0 0
-2262 1 9.45875 14.86375 1.35125 0 0 0
-2263 1 9.45875 12.16125 4.05375 0 0 0
-2264 1 6.75625 14.86375 4.05375 0 0 0
-2265 1 12.16125 12.16125 1.35125 0 0 0
-2266 1 14.86375 14.86375 1.35125 0 0 0
-2267 1 14.86375 12.16125 4.05375 0 0 0
-2268 1 12.16125 14.86375 4.05375 0 0 0
-2269 1 17.56625 12.16125 1.35125 0 0 0
-2270 1 20.26875 14.86375 1.35125 0 0 0
-2271 1 20.26875 12.16125 4.05375 0 0 0
-2272 1 17.56625 14.86375 4.05375 0 0 0
-2273 1 22.97125 12.16125 1.35125 0 0 0
-2274 1 25.67375 14.86375 1.35125 0 0 0
-2275 1 25.67375 12.16125 4.05375 0 0 0
-2276 1 22.97125 14.86375 4.05375 0 0 0
-2277 1 28.37625 12.16125 1.35125 0 0 0
-2278 1 31.07875 14.86375 1.35125 0 0 0
-2279 1 31.07875 12.16125 4.05375 0 0 0
-2280 1 28.37625 14.86375 4.05375 0 0 0
-2281 1 33.78125 12.16125 1.35125 0 0 0
-2282 1 36.48375 14.86375 1.35125 0 0 0
-2283 1 36.48375 12.16125 4.05375 0 0 0
-2284 1 33.78125 14.86375 4.05375 0 0 0
-2285 1 39.18625 12.16125 1.35125 0 0 0
-2286 1 41.88875 14.86375 1.35125 0 0 0
-2287 1 41.88875 12.16125 4.05375 0 0 0
-2288 1 39.18625 14.86375 4.05375 0 0 0
-2289 1 44.59125 12.16125 1.35125 0 0 0
-2290 1 47.29375 14.86375 1.35125 0 0 0
-2291 1 47.29375 12.16125 4.05375 0 0 0
-2292 1 44.59125 14.86375 4.05375 0 0 0
-2293 1 49.99625 12.16125 1.35125 0 0 0
-2294 1 52.69875 14.86375 1.35125 0 0 0
-2295 1 52.69875 12.16125 4.05375 0 0 0
-2296 1 49.99625 14.86375 4.05375 0 0 0
-2297 1 55.40125 12.16125 1.35125 0 0 0
-2298 1 58.10375 14.86375 1.35125 0 0 0
-2299 1 58.10375 12.16125 4.05375 0 0 0
-2300 1 55.40125 14.86375 4.05375 0 0 0
-2301 1 60.80625 12.16125 1.35125 0 0 0
-2302 1 63.50875 14.86375 1.35125 0 0 0
-2303 1 63.50875 12.16125 4.05375 0 0 0
-2304 1 60.80625 14.86375 4.05375 0 0 0
-2305 1 -63.50875 -14.86375 6.75625 0 0 0
-2306 1 -60.80625 -12.16125 6.75625 0 0 0
-2307 1 -60.80625 -14.86375 9.45875 0 0 0
-2308 1 -63.50875 -12.16125 9.45875 0 0 0
-2309 1 -58.10375 -14.86375 6.75625 0 0 0
-2310 1 -55.40125 -12.16125 6.75625 0 0 0
-2311 1 -55.40125 -14.86375 9.45875 0 0 0
-2312 1 -58.10375 -12.16125 9.45875 0 0 0
-2313 1 -52.69875 -14.86375 6.75625 0 0 0
-2314 1 -49.99625 -12.16125 6.75625 0 0 0
-2315 1 -49.99625 -14.86375 9.45875 0 0 0
-2316 1 -52.69875 -12.16125 9.45875 0 0 0
-2317 1 -47.29375 -14.86375 6.75625 0 0 0
-2318 1 -44.59125 -12.16125 6.75625 0 0 0
-2319 1 -44.59125 -14.86375 9.45875 0 0 0
-2320 1 -47.29375 -12.16125 9.45875 0 0 0
-2321 1 -41.88875 -14.86375 6.75625 0 0 0
-2322 1 -39.18625 -12.16125 6.75625 0 0 0
-2323 1 -39.18625 -14.86375 9.45875 0 0 0
-2324 1 -41.88875 -12.16125 9.45875 0 0 0
-2325 1 -36.48375 -14.86375 6.75625 0 0 0
-2326 1 -33.78125 -12.16125 6.75625 0 0 0
-2327 1 -33.78125 -14.86375 9.45875 0 0 0
-2328 1 -36.48375 -12.16125 9.45875 0 0 0
-2329 1 -31.07875 -14.86375 6.75625 0 0 0
-2330 1 -28.37625 -12.16125 6.75625 0 0 0
-2331 1 -28.37625 -14.86375 9.45875 0 0 0
-2332 1 -31.07875 -12.16125 9.45875 0 0 0
-2333 1 -25.67375 -14.86375 6.75625 0 0 0
-2334 1 -22.97125 -12.16125 6.75625 0 0 0
-2335 1 -22.97125 -14.86375 9.45875 0 0 0
-2336 1 -25.67375 -12.16125 9.45875 0 0 0
-2337 1 -20.26875 -14.86375 6.75625 0 0 0
-2338 1 -17.56625 -12.16125 6.75625 0 0 0
-2339 1 -17.56625 -14.86375 9.45875 0 0 0
-2340 1 -20.26875 -12.16125 9.45875 0 0 0
-2341 1 -14.86375 -14.86375 6.75625 0 0 0
-2342 1 -12.16125 -12.16125 6.75625 0 0 0
-2343 1 -12.16125 -14.86375 9.45875 0 0 0
-2344 1 -14.86375 -12.16125 9.45875 0 0 0
-2345 1 -9.45875 -14.86375 6.75625 0 0 0
-2346 1 -6.75625 -12.16125 6.75625 0 0 0
-2347 1 -6.75625 -14.86375 9.45875 0 0 0
-2348 1 -9.45875 -12.16125 9.45875 0 0 0
-2349 1 -4.05375 -14.86375 6.75625 0 0 0
-2350 1 -1.35125 -12.16125 6.75625 0 0 0
-2351 1 -1.35125 -14.86375 9.45875 0 0 0
-2352 1 -4.05375 -12.16125 9.45875 0 0 0
-2353 1 1.35125 -14.86375 6.75625 0 0 0
-2354 1 4.05375 -12.16125 6.75625 0 0 0
-2355 1 4.05375 -14.86375 9.45875 0 0 0
-2356 1 1.35125 -12.16125 9.45875 0 0 0
-2357 1 6.75625 -14.86375 6.75625 0 0 0
-2358 1 9.45875 -12.16125 6.75625 0 0 0
-2359 1 9.45875 -14.86375 9.45875 0 0 0
-2360 1 6.75625 -12.16125 9.45875 0 0 0
-2361 1 12.16125 -14.86375 6.75625 0 0 0
-2362 1 14.86375 -12.16125 6.75625 0 0 0
-2363 1 14.86375 -14.86375 9.45875 0 0 0
-2364 1 12.16125 -12.16125 9.45875 0 0 0
-2365 1 17.56625 -14.86375 6.75625 0 0 0
-2366 1 20.26875 -12.16125 6.75625 0 0 0
-2367 1 20.26875 -14.86375 9.45875 0 0 0
-2368 1 17.56625 -12.16125 9.45875 0 0 0
-2369 1 22.97125 -14.86375 6.75625 0 0 0
-2370 1 25.67375 -12.16125 6.75625 0 0 0
-2371 1 25.67375 -14.86375 9.45875 0 0 0
-2372 1 22.97125 -12.16125 9.45875 0 0 0
-2373 1 28.37625 -14.86375 6.75625 0 0 0
-2374 1 31.07875 -12.16125 6.75625 0 0 0
-2375 1 31.07875 -14.86375 9.45875 0 0 0
-2376 1 28.37625 -12.16125 9.45875 0 0 0
-2377 1 33.78125 -14.86375 6.75625 0 0 0
-2378 1 36.48375 -12.16125 6.75625 0 0 0
-2379 1 36.48375 -14.86375 9.45875 0 0 0
-2380 1 33.78125 -12.16125 9.45875 0 0 0
-2381 1 39.18625 -14.86375 6.75625 0 0 0
-2382 1 41.88875 -12.16125 6.75625 0 0 0
-2383 1 41.88875 -14.86375 9.45875 0 0 0
-2384 1 39.18625 -12.16125 9.45875 0 0 0
-2385 1 44.59125 -14.86375 6.75625 0 0 0
-2386 1 47.29375 -12.16125 6.75625 0 0 0
-2387 1 47.29375 -14.86375 9.45875 0 0 0
-2388 1 44.59125 -12.16125 9.45875 0 0 0
-2389 1 49.99625 -14.86375 6.75625 0 0 0
-2390 1 52.69875 -12.16125 6.75625 0 0 0
-2391 1 52.69875 -14.86375 9.45875 0 0 0
-2392 1 49.99625 -12.16125 9.45875 0 0 0
-2393 1 55.40125 -14.86375 6.75625 0 0 0
-2394 1 58.10375 -12.16125 6.75625 0 0 0
-2395 1 58.10375 -14.86375 9.45875 0 0 0
-2396 1 55.40125 -12.16125 9.45875 0 0 0
-2397 1 60.80625 -14.86375 6.75625 0 0 0
-2398 1 63.50875 -12.16125 6.75625 0 0 0
-2399 1 63.50875 -14.86375 9.45875 0 0 0
-2400 1 60.80625 -12.16125 9.45875 0 0 0
-2401 1 -63.50875 -9.45875 6.75625 0 0 0
-2402 1 -60.80625 -6.75625 6.75625 0 0 0
-2403 1 -60.80625 -9.45875 9.45875 0 0 0
-2404 1 -63.50875 -6.75625 9.45875 0 0 0
-2405 1 -58.10375 -9.45875 6.75625 0 0 0
-2406 1 -55.40125 -6.75625 6.75625 0 0 0
-2407 1 -55.40125 -9.45875 9.45875 0 0 0
-2408 1 -58.10375 -6.75625 9.45875 0 0 0
-2409 1 -52.69875 -9.45875 6.75625 0 0 0
-2410 1 -49.99625 -6.75625 6.75625 0 0 0
-2411 1 -49.99625 -9.45875 9.45875 0 0 0
-2412 1 -52.69875 -6.75625 9.45875 0 0 0
-2413 1 -47.29375 -9.45875 6.75625 0 0 0
-2414 1 -44.59125 -6.75625 6.75625 0 0 0
-2415 1 -44.59125 -9.45875 9.45875 0 0 0
-2416 1 -47.29375 -6.75625 9.45875 0 0 0
-2417 1 -41.88875 -9.45875 6.75625 0 0 0
-2418 1 -39.18625 -6.75625 6.75625 0 0 0
-2419 1 -39.18625 -9.45875 9.45875 0 0 0
-2420 1 -41.88875 -6.75625 9.45875 0 0 0
-2421 1 -36.48375 -9.45875 6.75625 0 0 0
-2422 1 -33.78125 -6.75625 6.75625 0 0 0
-2423 1 -33.78125 -9.45875 9.45875 0 0 0
-2424 1 -36.48375 -6.75625 9.45875 0 0 0
-2425 1 -31.07875 -9.45875 6.75625 0 0 0
-2426 1 -28.37625 -6.75625 6.75625 0 0 0
-2427 1 -28.37625 -9.45875 9.45875 0 0 0
-2428 1 -31.07875 -6.75625 9.45875 0 0 0
-2429 1 -25.67375 -9.45875 6.75625 0 0 0
-2430 1 -22.97125 -6.75625 6.75625 0 0 0
-2431 1 -22.97125 -9.45875 9.45875 0 0 0
-2432 1 -25.67375 -6.75625 9.45875 0 0 0
-2433 1 -20.26875 -9.45875 6.75625 0 0 0
-2434 1 -17.56625 -6.75625 6.75625 0 0 0
-2435 1 -17.56625 -9.45875 9.45875 0 0 0
-2436 1 -20.26875 -6.75625 9.45875 0 0 0
-2437 1 -14.86375 -9.45875 6.75625 0 0 0
-2438 1 -12.16125 -6.75625 6.75625 0 0 0
-2439 1 -12.16125 -9.45875 9.45875 0 0 0
-2440 1 -14.86375 -6.75625 9.45875 0 0 0
-2441 1 -9.45875 -9.45875 6.75625 0 0 0
-2442 1 -6.75625 -6.75625 6.75625 0 0 0
-2443 1 -6.75625 -9.45875 9.45875 0 0 0
-2444 1 -9.45875 -6.75625 9.45875 0 0 0
-2445 1 -4.05375 -9.45875 6.75625 0 0 0
-2446 1 -1.35125 -6.75625 6.75625 0 0 0
-2447 1 -1.35125 -9.45875 9.45875 0 0 0
-2448 1 -4.05375 -6.75625 9.45875 0 0 0
-2449 1 1.35125 -9.45875 6.75625 0 0 0
-2450 1 4.05375 -6.75625 6.75625 0 0 0
-2451 1 4.05375 -9.45875 9.45875 0 0 0
-2452 1 1.35125 -6.75625 9.45875 0 0 0
-2453 1 6.75625 -9.45875 6.75625 0 0 0
-2454 1 9.45875 -6.75625 6.75625 0 0 0
-2455 1 9.45875 -9.45875 9.45875 0 0 0
-2456 1 6.75625 -6.75625 9.45875 0 0 0
-2457 1 12.16125 -9.45875 6.75625 0 0 0
-2458 1 14.86375 -6.75625 6.75625 0 0 0
-2459 1 14.86375 -9.45875 9.45875 0 0 0
-2460 1 12.16125 -6.75625 9.45875 0 0 0
-2461 1 17.56625 -9.45875 6.75625 0 0 0
-2462 1 20.26875 -6.75625 6.75625 0 0 0
-2463 1 20.26875 -9.45875 9.45875 0 0 0
-2464 1 17.56625 -6.75625 9.45875 0 0 0
-2465 1 22.97125 -9.45875 6.75625 0 0 0
-2466 1 25.67375 -6.75625 6.75625 0 0 0
-2467 1 25.67375 -9.45875 9.45875 0 0 0
-2468 1 22.97125 -6.75625 9.45875 0 0 0
-2469 1 28.37625 -9.45875 6.75625 0 0 0
-2470 1 31.07875 -6.75625 6.75625 0 0 0
-2471 1 31.07875 -9.45875 9.45875 0 0 0
-2472 1 28.37625 -6.75625 9.45875 0 0 0
-2473 1 33.78125 -9.45875 6.75625 0 0 0
-2474 1 36.48375 -6.75625 6.75625 0 0 0
-2475 1 36.48375 -9.45875 9.45875 0 0 0
-2476 1 33.78125 -6.75625 9.45875 0 0 0
-2477 1 39.18625 -9.45875 6.75625 0 0 0
-2478 1 41.88875 -6.75625 6.75625 0 0 0
-2479 1 41.88875 -9.45875 9.45875 0 0 0
-2480 1 39.18625 -6.75625 9.45875 0 0 0
-2481 1 44.59125 -9.45875 6.75625 0 0 0
-2482 1 47.29375 -6.75625 6.75625 0 0 0
-2483 1 47.29375 -9.45875 9.45875 0 0 0
-2484 1 44.59125 -6.75625 9.45875 0 0 0
-2485 1 49.99625 -9.45875 6.75625 0 0 0
-2486 1 52.69875 -6.75625 6.75625 0 0 0
-2487 1 52.69875 -9.45875 9.45875 0 0 0
-2488 1 49.99625 -6.75625 9.45875 0 0 0
-2489 1 55.40125 -9.45875 6.75625 0 0 0
-2490 1 58.10375 -6.75625 6.75625 0 0 0
-2491 1 58.10375 -9.45875 9.45875 0 0 0
-2492 1 55.40125 -6.75625 9.45875 0 0 0
-2493 1 60.80625 -9.45875 6.75625 0 0 0
-2494 1 63.50875 -6.75625 6.75625 0 0 0
-2495 1 63.50875 -9.45875 9.45875 0 0 0
-2496 1 60.80625 -6.75625 9.45875 0 0 0
-2497 1 -63.50875 -4.05375 6.75625 0 0 0
-2498 1 -60.80625 -1.35125 6.75625 0 0 0
-2499 1 -60.80625 -4.05375 9.45875 0 0 0
-2500 1 -63.50875 -1.35125 9.45875 0 0 0
-2501 1 -58.10375 -4.05375 6.75625 0 0 0
-2502 1 -55.40125 -1.35125 6.75625 0 0 0
-2503 1 -55.40125 -4.05375 9.45875 0 0 0
-2504 1 -58.10375 -1.35125 9.45875 0 0 0
-2505 1 -52.69875 -4.05375 6.75625 0 0 0
-2506 1 -49.99625 -1.35125 6.75625 0 0 0
-2507 1 -49.99625 -4.05375 9.45875 0 0 0
-2508 1 -52.69875 -1.35125 9.45875 0 0 0
-2509 1 -47.29375 -4.05375 6.75625 0 0 0
-2510 1 -44.59125 -1.35125 6.75625 0 0 0
-2511 1 -44.59125 -4.05375 9.45875 0 0 0
-2512 1 -47.29375 -1.35125 9.45875 0 0 0
-2513 1 -41.88875 -4.05375 6.75625 0 0 0
-2514 1 -39.18625 -1.35125 6.75625 0 0 0
-2515 1 -39.18625 -4.05375 9.45875 0 0 0
-2516 1 -41.88875 -1.35125 9.45875 0 0 0
-2517 1 -36.48375 -4.05375 6.75625 0 0 0
-2518 1 -33.78125 -1.35125 6.75625 0 0 0
-2519 1 -33.78125 -4.05375 9.45875 0 0 0
-2520 1 -36.48375 -1.35125 9.45875 0 0 0
-2521 1 -31.07875 -4.05375 6.75625 0 0 0
-2522 1 -28.37625 -1.35125 6.75625 0 0 0
-2523 1 -28.37625 -4.05375 9.45875 0 0 0
-2524 1 -31.07875 -1.35125 9.45875 0 0 0
-2525 1 -25.67375 -4.05375 6.75625 0 0 0
-2526 1 -22.97125 -1.35125 6.75625 0 0 0
-2527 1 -22.97125 -4.05375 9.45875 0 0 0
-2528 1 -25.67375 -1.35125 9.45875 0 0 0
-2529 1 -20.26875 -4.05375 6.75625 0 0 0
-2530 1 -17.56625 -1.35125 6.75625 0 0 0
-2531 1 -17.56625 -4.05375 9.45875 0 0 0
-2532 1 -20.26875 -1.35125 9.45875 0 0 0
-2533 1 -14.86375 -4.05375 6.75625 0 0 0
-2534 1 -12.16125 -1.35125 6.75625 0 0 0
-2535 1 -12.16125 -4.05375 9.45875 0 0 0
-2536 1 -14.86375 -1.35125 9.45875 0 0 0
-2537 1 -9.45875 -4.05375 6.75625 0 0 0
-2538 1 -6.75625 -1.35125 6.75625 0 0 0
-2539 1 -6.75625 -4.05375 9.45875 0 0 0
-2540 1 -9.45875 -1.35125 9.45875 0 0 0
-2541 1 -4.05375 -4.05375 6.75625 0 0 0
-2542 1 -1.35125 -1.35125 6.75625 0 0 0
-2543 1 -1.35125 -4.05375 9.45875 0 0 0
-2544 1 -4.05375 -1.35125 9.45875 0 0 0
-2545 1 1.35125 -4.05375 6.75625 0 0 0
-2546 1 4.05375 -1.35125 6.75625 0 0 0
-2547 1 4.05375 -4.05375 9.45875 0 0 0
-2548 1 1.35125 -1.35125 9.45875 0 0 0
-2549 1 6.75625 -4.05375 6.75625 0 0 0
-2550 1 9.45875 -1.35125 6.75625 0 0 0
-2551 1 9.45875 -4.05375 9.45875 0 0 0
-2552 1 6.75625 -1.35125 9.45875 0 0 0
-2553 1 12.16125 -4.05375 6.75625 0 0 0
-2554 1 14.86375 -1.35125 6.75625 0 0 0
-2555 1 14.86375 -4.05375 9.45875 0 0 0
-2556 1 12.16125 -1.35125 9.45875 0 0 0
-2557 1 17.56625 -4.05375 6.75625 0 0 0
-2558 1 20.26875 -1.35125 6.75625 0 0 0
-2559 1 20.26875 -4.05375 9.45875 0 0 0
-2560 1 17.56625 -1.35125 9.45875 0 0 0
-2561 1 22.97125 -4.05375 6.75625 0 0 0
-2562 1 25.67375 -1.35125 6.75625 0 0 0
-2563 1 25.67375 -4.05375 9.45875 0 0 0
-2564 1 22.97125 -1.35125 9.45875 0 0 0
-2565 1 28.37625 -4.05375 6.75625 0 0 0
-2566 1 31.07875 -1.35125 6.75625 0 0 0
-2567 1 31.07875 -4.05375 9.45875 0 0 0
-2568 1 28.37625 -1.35125 9.45875 0 0 0
-2569 1 33.78125 -4.05375 6.75625 0 0 0
-2570 1 36.48375 -1.35125 6.75625 0 0 0
-2571 1 36.48375 -4.05375 9.45875 0 0 0
-2572 1 33.78125 -1.35125 9.45875 0 0 0
-2573 1 39.18625 -4.05375 6.75625 0 0 0
-2574 1 41.88875 -1.35125 6.75625 0 0 0
-2575 1 41.88875 -4.05375 9.45875 0 0 0
-2576 1 39.18625 -1.35125 9.45875 0 0 0
-2577 1 44.59125 -4.05375 6.75625 0 0 0
-2578 1 47.29375 -1.35125 6.75625 0 0 0
-2579 1 47.29375 -4.05375 9.45875 0 0 0
-2580 1 44.59125 -1.35125 9.45875 0 0 0
-2581 1 49.99625 -4.05375 6.75625 0 0 0
-2582 1 52.69875 -1.35125 6.75625 0 0 0
-2583 1 52.69875 -4.05375 9.45875 0 0 0
-2584 1 49.99625 -1.35125 9.45875 0 0 0
-2585 1 55.40125 -4.05375 6.75625 0 0 0
-2586 1 58.10375 -1.35125 6.75625 0 0 0
-2587 1 58.10375 -4.05375 9.45875 0 0 0
-2588 1 55.40125 -1.35125 9.45875 0 0 0
-2589 1 60.80625 -4.05375 6.75625 0 0 0
-2590 1 63.50875 -1.35125 6.75625 0 0 0
-2591 1 63.50875 -4.05375 9.45875 0 0 0
-2592 1 60.80625 -1.35125 9.45875 0 0 0
-2593 1 -63.50875 1.35125 6.75625 0 0 0
-2594 1 -60.80625 4.05375 6.75625 0 0 0
-2595 1 -60.80625 1.35125 9.45875 0 0 0
-2596 1 -63.50875 4.05375 9.45875 0 0 0
-2597 1 -58.10375 1.35125 6.75625 0 0 0
-2598 1 -55.40125 4.05375 6.75625 0 0 0
-2599 1 -55.40125 1.35125 9.45875 0 0 0
-2600 1 -58.10375 4.05375 9.45875 0 0 0
-2601 1 -52.69875 1.35125 6.75625 0 0 0
-2602 1 -49.99625 4.05375 6.75625 0 0 0
-2603 1 -49.99625 1.35125 9.45875 0 0 0
-2604 1 -52.69875 4.05375 9.45875 0 0 0
-2605 1 -47.29375 1.35125 6.75625 0 0 0
-2606 1 -44.59125 4.05375 6.75625 0 0 0
-2607 1 -44.59125 1.35125 9.45875 0 0 0
-2608 1 -47.29375 4.05375 9.45875 0 0 0
-2609 1 -41.88875 1.35125 6.75625 0 0 0
-2610 1 -39.18625 4.05375 6.75625 0 0 0
-2611 1 -39.18625 1.35125 9.45875 0 0 0
-2612 1 -41.88875 4.05375 9.45875 0 0 0
-2613 1 -36.48375 1.35125 6.75625 0 0 0
-2614 1 -33.78125 4.05375 6.75625 0 0 0
-2615 1 -33.78125 1.35125 9.45875 0 0 0
-2616 1 -36.48375 4.05375 9.45875 0 0 0
-2617 1 -31.07875 1.35125 6.75625 0 0 0
-2618 1 -28.37625 4.05375 6.75625 0 0 0
-2619 1 -28.37625 1.35125 9.45875 0 0 0
-2620 1 -31.07875 4.05375 9.45875 0 0 0
-2621 1 -25.67375 1.35125 6.75625 0 0 0
-2622 1 -22.97125 4.05375 6.75625 0 0 0
-2623 1 -22.97125 1.35125 9.45875 0 0 0
-2624 1 -25.67375 4.05375 9.45875 0 0 0
-2625 1 -20.26875 1.35125 6.75625 0 0 0
-2626 1 -17.56625 4.05375 6.75625 0 0 0
-2627 1 -17.56625 1.35125 9.45875 0 0 0
-2628 1 -20.26875 4.05375 9.45875 0 0 0
-2629 1 -14.86375 1.35125 6.75625 0 0 0
-2630 1 -12.16125 4.05375 6.75625 0 0 0
-2631 1 -12.16125 1.35125 9.45875 0 0 0
-2632 1 -14.86375 4.05375 9.45875 0 0 0
-2633 1 -9.45875 1.35125 6.75625 0 0 0
-2634 1 -6.75625 4.05375 6.75625 0 0 0
-2635 1 -6.75625 1.35125 9.45875 0 0 0
-2636 1 -9.45875 4.05375 9.45875 0 0 0
-2637 1 -4.05375 1.35125 6.75625 0 0 0
-2638 1 -1.35125 4.05375 6.75625 0 0 0
-2639 1 -1.35125 1.35125 9.45875 0 0 0
-2640 1 -4.05375 4.05375 9.45875 0 0 0
-2641 1 1.35125 1.35125 6.75625 0 0 0
-2642 1 4.05375 4.05375 6.75625 0 0 0
-2643 1 4.05375 1.35125 9.45875 0 0 0
-2644 1 1.35125 4.05375 9.45875 0 0 0
-2645 1 6.75625 1.35125 6.75625 0 0 0
-2646 1 9.45875 4.05375 6.75625 0 0 0
-2647 1 9.45875 1.35125 9.45875 0 0 0
-2648 1 6.75625 4.05375 9.45875 0 0 0
-2649 1 12.16125 1.35125 6.75625 0 0 0
-2650 1 14.86375 4.05375 6.75625 0 0 0
-2651 1 14.86375 1.35125 9.45875 0 0 0
-2652 1 12.16125 4.05375 9.45875 0 0 0
-2653 1 17.56625 1.35125 6.75625 0 0 0
-2654 1 20.26875 4.05375 6.75625 0 0 0
-2655 1 20.26875 1.35125 9.45875 0 0 0
-2656 1 17.56625 4.05375 9.45875 0 0 0
-2657 1 22.97125 1.35125 6.75625 0 0 0
-2658 1 25.67375 4.05375 6.75625 0 0 0
-2659 1 25.67375 1.35125 9.45875 0 0 0
-2660 1 22.97125 4.05375 9.45875 0 0 0
-2661 1 28.37625 1.35125 6.75625 0 0 0
-2662 1 31.07875 4.05375 6.75625 0 0 0
-2663 1 31.07875 1.35125 9.45875 0 0 0
-2664 1 28.37625 4.05375 9.45875 0 0 0
-2665 1 33.78125 1.35125 6.75625 0 0 0
-2666 1 36.48375 4.05375 6.75625 0 0 0
-2667 1 36.48375 1.35125 9.45875 0 0 0
-2668 1 33.78125 4.05375 9.45875 0 0 0
-2669 1 39.18625 1.35125 6.75625 0 0 0
-2670 1 41.88875 4.05375 6.75625 0 0 0
-2671 1 41.88875 1.35125 9.45875 0 0 0
-2672 1 39.18625 4.05375 9.45875 0 0 0
-2673 1 44.59125 1.35125 6.75625 0 0 0
-2674 1 47.29375 4.05375 6.75625 0 0 0
-2675 1 47.29375 1.35125 9.45875 0 0 0
-2676 1 44.59125 4.05375 9.45875 0 0 0
-2677 1 49.99625 1.35125 6.75625 0 0 0
-2678 1 52.69875 4.05375 6.75625 0 0 0
-2679 1 52.69875 1.35125 9.45875 0 0 0
-2680 1 49.99625 4.05375 9.45875 0 0 0
-2681 1 55.40125 1.35125 6.75625 0 0 0
-2682 1 58.10375 4.05375 6.75625 0 0 0
-2683 1 58.10375 1.35125 9.45875 0 0 0
-2684 1 55.40125 4.05375 9.45875 0 0 0
-2685 1 60.80625 1.35125 6.75625 0 0 0
-2686 1 63.50875 4.05375 6.75625 0 0 0
-2687 1 63.50875 1.35125 9.45875 0 0 0
-2688 1 60.80625 4.05375 9.45875 0 0 0
-2689 1 -63.50875 6.75625 6.75625 0 0 0
-2690 1 -60.80625 9.45875 6.75625 0 0 0
-2691 1 -60.80625 6.75625 9.45875 0 0 0
-2692 1 -63.50875 9.45875 9.45875 0 0 0
-2693 1 -58.10375 6.75625 6.75625 0 0 0
-2694 1 -55.40125 9.45875 6.75625 0 0 0
-2695 1 -55.40125 6.75625 9.45875 0 0 0
-2696 1 -58.10375 9.45875 9.45875 0 0 0
-2697 1 -52.69875 6.75625 6.75625 0 0 0
-2698 1 -49.99625 9.45875 6.75625 0 0 0
-2699 1 -49.99625 6.75625 9.45875 0 0 0
-2700 1 -52.69875 9.45875 9.45875 0 0 0
-2701 1 -47.29375 6.75625 6.75625 0 0 0
-2702 1 -44.59125 9.45875 6.75625 0 0 0
-2703 1 -44.59125 6.75625 9.45875 0 0 0
-2704 1 -47.29375 9.45875 9.45875 0 0 0
-2705 1 -41.88875 6.75625 6.75625 0 0 0
-2706 1 -39.18625 9.45875 6.75625 0 0 0
-2707 1 -39.18625 6.75625 9.45875 0 0 0
-2708 1 -41.88875 9.45875 9.45875 0 0 0
-2709 1 -36.48375 6.75625 6.75625 0 0 0
-2710 1 -33.78125 9.45875 6.75625 0 0 0
-2711 1 -33.78125 6.75625 9.45875 0 0 0
-2712 1 -36.48375 9.45875 9.45875 0 0 0
-2713 1 -31.07875 6.75625 6.75625 0 0 0
-2714 1 -28.37625 9.45875 6.75625 0 0 0
-2715 1 -28.37625 6.75625 9.45875 0 0 0
-2716 1 -31.07875 9.45875 9.45875 0 0 0
-2717 1 -25.67375 6.75625 6.75625 0 0 0
-2718 1 -22.97125 9.45875 6.75625 0 0 0
-2719 1 -22.97125 6.75625 9.45875 0 0 0
-2720 1 -25.67375 9.45875 9.45875 0 0 0
-2721 1 -20.26875 6.75625 6.75625 0 0 0
-2722 1 -17.56625 9.45875 6.75625 0 0 0
-2723 1 -17.56625 6.75625 9.45875 0 0 0
-2724 1 -20.26875 9.45875 9.45875 0 0 0
-2725 1 -14.86375 6.75625 6.75625 0 0 0
-2726 1 -12.16125 9.45875 6.75625 0 0 0
-2727 1 -12.16125 6.75625 9.45875 0 0 0
-2728 1 -14.86375 9.45875 9.45875 0 0 0
-2729 1 -9.45875 6.75625 6.75625 0 0 0
-2730 1 -6.75625 9.45875 6.75625 0 0 0
-2731 1 -6.75625 6.75625 9.45875 0 0 0
-2732 1 -9.45875 9.45875 9.45875 0 0 0
-2733 1 -4.05375 6.75625 6.75625 0 0 0
-2734 1 -1.35125 9.45875 6.75625 0 0 0
-2735 1 -1.35125 6.75625 9.45875 0 0 0
-2736 1 -4.05375 9.45875 9.45875 0 0 0
-2737 1 1.35125 6.75625 6.75625 0 0 0
-2738 1 4.05375 9.45875 6.75625 0 0 0
-2739 1 4.05375 6.75625 9.45875 0 0 0
-2740 1 1.35125 9.45875 9.45875 0 0 0
-2741 1 6.75625 6.75625 6.75625 0 0 0
-2742 1 9.45875 9.45875 6.75625 0 0 0
-2743 1 9.45875 6.75625 9.45875 0 0 0
-2744 1 6.75625 9.45875 9.45875 0 0 0
-2745 1 12.16125 6.75625 6.75625 0 0 0
-2746 1 14.86375 9.45875 6.75625 0 0 0
-2747 1 14.86375 6.75625 9.45875 0 0 0
-2748 1 12.16125 9.45875 9.45875 0 0 0
-2749 1 17.56625 6.75625 6.75625 0 0 0
-2750 1 20.26875 9.45875 6.75625 0 0 0
-2751 1 20.26875 6.75625 9.45875 0 0 0
-2752 1 17.56625 9.45875 9.45875 0 0 0
-2753 1 22.97125 6.75625 6.75625 0 0 0
-2754 1 25.67375 9.45875 6.75625 0 0 0
-2755 1 25.67375 6.75625 9.45875 0 0 0
-2756 1 22.97125 9.45875 9.45875 0 0 0
-2757 1 28.37625 6.75625 6.75625 0 0 0
-2758 1 31.07875 9.45875 6.75625 0 0 0
-2759 1 31.07875 6.75625 9.45875 0 0 0
-2760 1 28.37625 9.45875 9.45875 0 0 0
-2761 1 33.78125 6.75625 6.75625 0 0 0
-2762 1 36.48375 9.45875 6.75625 0 0 0
-2763 1 36.48375 6.75625 9.45875 0 0 0
-2764 1 33.78125 9.45875 9.45875 0 0 0
-2765 1 39.18625 6.75625 6.75625 0 0 0
-2766 1 41.88875 9.45875 6.75625 0 0 0
-2767 1 41.88875 6.75625 9.45875 0 0 0
-2768 1 39.18625 9.45875 9.45875 0 0 0
-2769 1 44.59125 6.75625 6.75625 0 0 0
-2770 1 47.29375 9.45875 6.75625 0 0 0
-2771 1 47.29375 6.75625 9.45875 0 0 0
-2772 1 44.59125 9.45875 9.45875 0 0 0
-2773 1 49.99625 6.75625 6.75625 0 0 0
-2774 1 52.69875 9.45875 6.75625 0 0 0
-2775 1 52.69875 6.75625 9.45875 0 0 0
-2776 1 49.99625 9.45875 9.45875 0 0 0
-2777 1 55.40125 6.75625 6.75625 0 0 0
-2778 1 58.10375 9.45875 6.75625 0 0 0
-2779 1 58.10375 6.75625 9.45875 0 0 0
-2780 1 55.40125 9.45875 9.45875 0 0 0
-2781 1 60.80625 6.75625 6.75625 0 0 0
-2782 1 63.50875 9.45875 6.75625 0 0 0
-2783 1 63.50875 6.75625 9.45875 0 0 0
-2784 1 60.80625 9.45875 9.45875 0 0 0
-2785 1 -63.50875 12.16125 6.75625 0 0 0
-2786 1 -60.80625 14.86375 6.75625 0 0 0
-2787 1 -60.80625 12.16125 9.45875 0 0 0
-2788 1 -63.50875 14.86375 9.45875 0 0 0
-2789 1 -58.10375 12.16125 6.75625 0 0 0
-2790 1 -55.40125 14.86375 6.75625 0 0 0
-2791 1 -55.40125 12.16125 9.45875 0 0 0
-2792 1 -58.10375 14.86375 9.45875 0 0 0
-2793 1 -52.69875 12.16125 6.75625 0 0 0
-2794 1 -49.99625 14.86375 6.75625 0 0 0
-2795 1 -49.99625 12.16125 9.45875 0 0 0
-2796 1 -52.69875 14.86375 9.45875 0 0 0
-2797 1 -47.29375 12.16125 6.75625 0 0 0
-2798 1 -44.59125 14.86375 6.75625 0 0 0
-2799 1 -44.59125 12.16125 9.45875 0 0 0
-2800 1 -47.29375 14.86375 9.45875 0 0 0
-2801 1 -41.88875 12.16125 6.75625 0 0 0
-2802 1 -39.18625 14.86375 6.75625 0 0 0
-2803 1 -39.18625 12.16125 9.45875 0 0 0
-2804 1 -41.88875 14.86375 9.45875 0 0 0
-2805 1 -36.48375 12.16125 6.75625 0 0 0
-2806 1 -33.78125 14.86375 6.75625 0 0 0
-2807 1 -33.78125 12.16125 9.45875 0 0 0
-2808 1 -36.48375 14.86375 9.45875 0 0 0
-2809 1 -31.07875 12.16125 6.75625 0 0 0
-2810 1 -28.37625 14.86375 6.75625 0 0 0
-2811 1 -28.37625 12.16125 9.45875 0 0 0
-2812 1 -31.07875 14.86375 9.45875 0 0 0
-2813 1 -25.67375 12.16125 6.75625 0 0 0
-2814 1 -22.97125 14.86375 6.75625 0 0 0
-2815 1 -22.97125 12.16125 9.45875 0 0 0
-2816 1 -25.67375 14.86375 9.45875 0 0 0
-2817 1 -20.26875 12.16125 6.75625 0 0 0
-2818 1 -17.56625 14.86375 6.75625 0 0 0
-2819 1 -17.56625 12.16125 9.45875 0 0 0
-2820 1 -20.26875 14.86375 9.45875 0 0 0
-2821 1 -14.86375 12.16125 6.75625 0 0 0
-2822 1 -12.16125 14.86375 6.75625 0 0 0
-2823 1 -12.16125 12.16125 9.45875 0 0 0
-2824 1 -14.86375 14.86375 9.45875 0 0 0
-2825 1 -9.45875 12.16125 6.75625 0 0 0
-2826 1 -6.75625 14.86375 6.75625 0 0 0
-2827 1 -6.75625 12.16125 9.45875 0 0 0
-2828 1 -9.45875 14.86375 9.45875 0 0 0
-2829 1 -4.05375 12.16125 6.75625 0 0 0
-2830 1 -1.35125 14.86375 6.75625 0 0 0
-2831 1 -1.35125 12.16125 9.45875 0 0 0
-2832 1 -4.05375 14.86375 9.45875 0 0 0
-2833 1 1.35125 12.16125 6.75625 0 0 0
-2834 1 4.05375 14.86375 6.75625 0 0 0
-2835 1 4.05375 12.16125 9.45875 0 0 0
-2836 1 1.35125 14.86375 9.45875 0 0 0
-2837 1 6.75625 12.16125 6.75625 0 0 0
-2838 1 9.45875 14.86375 6.75625 0 0 0
-2839 1 9.45875 12.16125 9.45875 0 0 0
-2840 1 6.75625 14.86375 9.45875 0 0 0
-2841 1 12.16125 12.16125 6.75625 0 0 0
-2842 1 14.86375 14.86375 6.75625 0 0 0
-2843 1 14.86375 12.16125 9.45875 0 0 0
-2844 1 12.16125 14.86375 9.45875 0 0 0
-2845 1 17.56625 12.16125 6.75625 0 0 0
-2846 1 20.26875 14.86375 6.75625 0 0 0
-2847 1 20.26875 12.16125 9.45875 0 0 0
-2848 1 17.56625 14.86375 9.45875 0 0 0
-2849 1 22.97125 12.16125 6.75625 0 0 0
-2850 1 25.67375 14.86375 6.75625 0 0 0
-2851 1 25.67375 12.16125 9.45875 0 0 0
-2852 1 22.97125 14.86375 9.45875 0 0 0
-2853 1 28.37625 12.16125 6.75625 0 0 0
-2854 1 31.07875 14.86375 6.75625 0 0 0
-2855 1 31.07875 12.16125 9.45875 0 0 0
-2856 1 28.37625 14.86375 9.45875 0 0 0
-2857 1 33.78125 12.16125 6.75625 0 0 0
-2858 1 36.48375 14.86375 6.75625 0 0 0
-2859 1 36.48375 12.16125 9.45875 0 0 0
-2860 1 33.78125 14.86375 9.45875 0 0 0
-2861 1 39.18625 12.16125 6.75625 0 0 0
-2862 1 41.88875 14.86375 6.75625 0 0 0
-2863 1 41.88875 12.16125 9.45875 0 0 0
-2864 1 39.18625 14.86375 9.45875 0 0 0
-2865 1 44.59125 12.16125 6.75625 0 0 0
-2866 1 47.29375 14.86375 6.75625 0 0 0
-2867 1 47.29375 12.16125 9.45875 0 0 0
-2868 1 44.59125 14.86375 9.45875 0 0 0
-2869 1 49.99625 12.16125 6.75625 0 0 0
-2870 1 52.69875 14.86375 6.75625 0 0 0
-2871 1 52.69875 12.16125 9.45875 0 0 0
-2872 1 49.99625 14.86375 9.45875 0 0 0
-2873 1 55.40125 12.16125 6.75625 0 0 0
-2874 1 58.10375 14.86375 6.75625 0 0 0
-2875 1 58.10375 12.16125 9.45875 0 0 0
-2876 1 55.40125 14.86375 9.45875 0 0 0
-2877 1 60.80625 12.16125 6.75625 0 0 0
-2878 1 63.50875 14.86375 6.75625 0 0 0
-2879 1 63.50875 12.16125 9.45875 0 0 0
-2880 1 60.80625 14.86375 9.45875 0 0 0
-2881 1 -63.50875 -14.86375 12.16125 0 0 0
-2882 1 -60.80625 -12.16125 12.16125 0 0 0
-2883 1 -60.80625 -14.86375 14.86375 0 0 0
-2884 1 -63.50875 -12.16125 14.86375 0 0 0
-2885 1 -58.10375 -14.86375 12.16125 0 0 0
-2886 1 -55.40125 -12.16125 12.16125 0 0 0
-2887 1 -55.40125 -14.86375 14.86375 0 0 0
-2888 1 -58.10375 -12.16125 14.86375 0 0 0
-2889 1 -52.69875 -14.86375 12.16125 0 0 0
-2890 1 -49.99625 -12.16125 12.16125 0 0 0
-2891 1 -49.99625 -14.86375 14.86375 0 0 0
-2892 1 -52.69875 -12.16125 14.86375 0 0 0
-2893 1 -47.29375 -14.86375 12.16125 0 0 0
-2894 1 -44.59125 -12.16125 12.16125 0 0 0
-2895 1 -44.59125 -14.86375 14.86375 0 0 0
-2896 1 -47.29375 -12.16125 14.86375 0 0 0
-2897 1 -41.88875 -14.86375 12.16125 0 0 0
-2898 1 -39.18625 -12.16125 12.16125 0 0 0
-2899 1 -39.18625 -14.86375 14.86375 0 0 0
-2900 1 -41.88875 -12.16125 14.86375 0 0 0
-2901 1 -36.48375 -14.86375 12.16125 0 0 0
-2902 1 -33.78125 -12.16125 12.16125 0 0 0
-2903 1 -33.78125 -14.86375 14.86375 0 0 0
-2904 1 -36.48375 -12.16125 14.86375 0 0 0
-2905 1 -31.07875 -14.86375 12.16125 0 0 0
-2906 1 -28.37625 -12.16125 12.16125 0 0 0
-2907 1 -28.37625 -14.86375 14.86375 0 0 0
-2908 1 -31.07875 -12.16125 14.86375 0 0 0
-2909 1 -25.67375 -14.86375 12.16125 0 0 0
-2910 1 -22.97125 -12.16125 12.16125 0 0 0
-2911 1 -22.97125 -14.86375 14.86375 0 0 0
-2912 1 -25.67375 -12.16125 14.86375 0 0 0
-2913 1 -20.26875 -14.86375 12.16125 0 0 0
-2914 1 -17.56625 -12.16125 12.16125 0 0 0
-2915 1 -17.56625 -14.86375 14.86375 0 0 0
-2916 1 -20.26875 -12.16125 14.86375 0 0 0
-2917 1 -14.86375 -14.86375 12.16125 0 0 0
-2918 1 -12.16125 -12.16125 12.16125 0 0 0
-2919 1 -12.16125 -14.86375 14.86375 0 0 0
-2920 1 -14.86375 -12.16125 14.86375 0 0 0
-2921 1 -9.45875 -14.86375 12.16125 0 0 0
-2922 1 -6.75625 -12.16125 12.16125 0 0 0
-2923 1 -6.75625 -14.86375 14.86375 0 0 0
-2924 1 -9.45875 -12.16125 14.86375 0 0 0
-2925 1 -4.05375 -14.86375 12.16125 0 0 0
-2926 1 -1.35125 -12.16125 12.16125 0 0 0
-2927 1 -1.35125 -14.86375 14.86375 0 0 0
-2928 1 -4.05375 -12.16125 14.86375 0 0 0
-2929 1 1.35125 -14.86375 12.16125 0 0 0
-2930 1 4.05375 -12.16125 12.16125 0 0 0
-2931 1 4.05375 -14.86375 14.86375 0 0 0
-2932 1 1.35125 -12.16125 14.86375 0 0 0
-2933 1 6.75625 -14.86375 12.16125 0 0 0
-2934 1 9.45875 -12.16125 12.16125 0 0 0
-2935 1 9.45875 -14.86375 14.86375 0 0 0
-2936 1 6.75625 -12.16125 14.86375 0 0 0
-2937 1 12.16125 -14.86375 12.16125 0 0 0
-2938 1 14.86375 -12.16125 12.16125 0 0 0
-2939 1 14.86375 -14.86375 14.86375 0 0 0
-2940 1 12.16125 -12.16125 14.86375 0 0 0
-2941 1 17.56625 -14.86375 12.16125 0 0 0
-2942 1 20.26875 -12.16125 12.16125 0 0 0
-2943 1 20.26875 -14.86375 14.86375 0 0 0
-2944 1 17.56625 -12.16125 14.86375 0 0 0
-2945 1 22.97125 -14.86375 12.16125 0 0 0
-2946 1 25.67375 -12.16125 12.16125 0 0 0
-2947 1 25.67375 -14.86375 14.86375 0 0 0
-2948 1 22.97125 -12.16125 14.86375 0 0 0
-2949 1 28.37625 -14.86375 12.16125 0 0 0
-2950 1 31.07875 -12.16125 12.16125 0 0 0
-2951 1 31.07875 -14.86375 14.86375 0 0 0
-2952 1 28.37625 -12.16125 14.86375 0 0 0
-2953 1 33.78125 -14.86375 12.16125 0 0 0
-2954 1 36.48375 -12.16125 12.16125 0 0 0
-2955 1 36.48375 -14.86375 14.86375 0 0 0
-2956 1 33.78125 -12.16125 14.86375 0 0 0
-2957 1 39.18625 -14.86375 12.16125 0 0 0
-2958 1 41.88875 -12.16125 12.16125 0 0 0
-2959 1 41.88875 -14.86375 14.86375 0 0 0
-2960 1 39.18625 -12.16125 14.86375 0 0 0
-2961 1 44.59125 -14.86375 12.16125 0 0 0
-2962 1 47.29375 -12.16125 12.16125 0 0 0
-2963 1 47.29375 -14.86375 14.86375 0 0 0
-2964 1 44.59125 -12.16125 14.86375 0 0 0
-2965 1 49.99625 -14.86375 12.16125 0 0 0
-2966 1 52.69875 -12.16125 12.16125 0 0 0
-2967 1 52.69875 -14.86375 14.86375 0 0 0
-2968 1 49.99625 -12.16125 14.86375 0 0 0
-2969 1 55.40125 -14.86375 12.16125 0 0 0
-2970 1 58.10375 -12.16125 12.16125 0 0 0
-2971 1 58.10375 -14.86375 14.86375 0 0 0
-2972 1 55.40125 -12.16125 14.86375 0 0 0
-2973 1 60.80625 -14.86375 12.16125 0 0 0
-2974 1 63.50875 -12.16125 12.16125 0 0 0
-2975 1 63.50875 -14.86375 14.86375 0 0 0
-2976 1 60.80625 -12.16125 14.86375 0 0 0
-2977 1 -63.50875 -9.45875 12.16125 0 0 0
-2978 1 -60.80625 -6.75625 12.16125 0 0 0
-2979 1 -60.80625 -9.45875 14.86375 0 0 0
-2980 1 -63.50875 -6.75625 14.86375 0 0 0
-2981 1 -58.10375 -9.45875 12.16125 0 0 0
-2982 1 -55.40125 -6.75625 12.16125 0 0 0
-2983 1 -55.40125 -9.45875 14.86375 0 0 0
-2984 1 -58.10375 -6.75625 14.86375 0 0 0
-2985 1 -52.69875 -9.45875 12.16125 0 0 0
-2986 1 -49.99625 -6.75625 12.16125 0 0 0
-2987 1 -49.99625 -9.45875 14.86375 0 0 0
-2988 1 -52.69875 -6.75625 14.86375 0 0 0
-2989 1 -47.29375 -9.45875 12.16125 0 0 0
-2990 1 -44.59125 -6.75625 12.16125 0 0 0
-2991 1 -44.59125 -9.45875 14.86375 0 0 0
-2992 1 -47.29375 -6.75625 14.86375 0 0 0
-2993 1 -41.88875 -9.45875 12.16125 0 0 0
-2994 1 -39.18625 -6.75625 12.16125 0 0 0
-2995 1 -39.18625 -9.45875 14.86375 0 0 0
-2996 1 -41.88875 -6.75625 14.86375 0 0 0
-2997 1 -36.48375 -9.45875 12.16125 0 0 0
-2998 1 -33.78125 -6.75625 12.16125 0 0 0
-2999 1 -33.78125 -9.45875 14.86375 0 0 0
-3000 1 -36.48375 -6.75625 14.86375 0 0 0
-3001 1 -31.07875 -9.45875 12.16125 0 0 0
-3002 1 -28.37625 -6.75625 12.16125 0 0 0
-3003 1 -28.37625 -9.45875 14.86375 0 0 0
-3004 1 -31.07875 -6.75625 14.86375 0 0 0
-3005 1 -25.67375 -9.45875 12.16125 0 0 0
-3006 1 -22.97125 -6.75625 12.16125 0 0 0
-3007 1 -22.97125 -9.45875 14.86375 0 0 0
-3008 1 -25.67375 -6.75625 14.86375 0 0 0
-3009 1 -20.26875 -9.45875 12.16125 0 0 0
-3010 1 -17.56625 -6.75625 12.16125 0 0 0
-3011 1 -17.56625 -9.45875 14.86375 0 0 0
-3012 1 -20.26875 -6.75625 14.86375 0 0 0
-3013 1 -14.86375 -9.45875 12.16125 0 0 0
-3014 1 -12.16125 -6.75625 12.16125 0 0 0
-3015 1 -12.16125 -9.45875 14.86375 0 0 0
-3016 1 -14.86375 -6.75625 14.86375 0 0 0
-3017 1 -9.45875 -9.45875 12.16125 0 0 0
-3018 1 -6.75625 -6.75625 12.16125 0 0 0
-3019 1 -6.75625 -9.45875 14.86375 0 0 0
-3020 1 -9.45875 -6.75625 14.86375 0 0 0
-3021 1 -4.05375 -9.45875 12.16125 0 0 0
-3022 1 -1.35125 -6.75625 12.16125 0 0 0
-3023 1 -1.35125 -9.45875 14.86375 0 0 0
-3024 1 -4.05375 -6.75625 14.86375 0 0 0
-3025 1 1.35125 -9.45875 12.16125 0 0 0
-3026 1 4.05375 -6.75625 12.16125 0 0 0
-3027 1 4.05375 -9.45875 14.86375 0 0 0
-3028 1 1.35125 -6.75625 14.86375 0 0 0
-3029 1 6.75625 -9.45875 12.16125 0 0 0
-3030 1 9.45875 -6.75625 12.16125 0 0 0
-3031 1 9.45875 -9.45875 14.86375 0 0 0
-3032 1 6.75625 -6.75625 14.86375 0 0 0
-3033 1 12.16125 -9.45875 12.16125 0 0 0
-3034 1 14.86375 -6.75625 12.16125 0 0 0
-3035 1 14.86375 -9.45875 14.86375 0 0 0
-3036 1 12.16125 -6.75625 14.86375 0 0 0
-3037 1 17.56625 -9.45875 12.16125 0 0 0
-3038 1 20.26875 -6.75625 12.16125 0 0 0
-3039 1 20.26875 -9.45875 14.86375 0 0 0
-3040 1 17.56625 -6.75625 14.86375 0 0 0
-3041 1 22.97125 -9.45875 12.16125 0 0 0
-3042 1 25.67375 -6.75625 12.16125 0 0 0
-3043 1 25.67375 -9.45875 14.86375 0 0 0
-3044 1 22.97125 -6.75625 14.86375 0 0 0
-3045 1 28.37625 -9.45875 12.16125 0 0 0
-3046 1 31.07875 -6.75625 12.16125 0 0 0
-3047 1 31.07875 -9.45875 14.86375 0 0 0
-3048 1 28.37625 -6.75625 14.86375 0 0 0
-3049 1 33.78125 -9.45875 12.16125 0 0 0
-3050 1 36.48375 -6.75625 12.16125 0 0 0
-3051 1 36.48375 -9.45875 14.86375 0 0 0
-3052 1 33.78125 -6.75625 14.86375 0 0 0
-3053 1 39.18625 -9.45875 12.16125 0 0 0
-3054 1 41.88875 -6.75625 12.16125 0 0 0
-3055 1 41.88875 -9.45875 14.86375 0 0 0
-3056 1 39.18625 -6.75625 14.86375 0 0 0
-3057 1 44.59125 -9.45875 12.16125 0 0 0
-3058 1 47.29375 -6.75625 12.16125 0 0 0
-3059 1 47.29375 -9.45875 14.86375 0 0 0
-3060 1 44.59125 -6.75625 14.86375 0 0 0
-3061 1 49.99625 -9.45875 12.16125 0 0 0
-3062 1 52.69875 -6.75625 12.16125 0 0 0
-3063 1 52.69875 -9.45875 14.86375 0 0 0
-3064 1 49.99625 -6.75625 14.86375 0 0 0
-3065 1 55.40125 -9.45875 12.16125 0 0 0
-3066 1 58.10375 -6.75625 12.16125 0 0 0
-3067 1 58.10375 -9.45875 14.86375 0 0 0
-3068 1 55.40125 -6.75625 14.86375 0 0 0
-3069 1 60.80625 -9.45875 12.16125 0 0 0
-3070 1 63.50875 -6.75625 12.16125 0 0 0
-3071 1 63.50875 -9.45875 14.86375 0 0 0
-3072 1 60.80625 -6.75625 14.86375 0 0 0
-3073 1 -63.50875 -4.05375 12.16125 0 0 0
-3074 1 -60.80625 -1.35125 12.16125 0 0 0
-3075 1 -60.80625 -4.05375 14.86375 0 0 0
-3076 1 -63.50875 -1.35125 14.86375 0 0 0
-3077 1 -58.10375 -4.05375 12.16125 0 0 0
-3078 1 -55.40125 -1.35125 12.16125 0 0 0
-3079 1 -55.40125 -4.05375 14.86375 0 0 0
-3080 1 -58.10375 -1.35125 14.86375 0 0 0
-3081 1 -52.69875 -4.05375 12.16125 0 0 0
-3082 1 -49.99625 -1.35125 12.16125 0 0 0
-3083 1 -49.99625 -4.05375 14.86375 0 0 0
-3084 1 -52.69875 -1.35125 14.86375 0 0 0
-3085 1 -47.29375 -4.05375 12.16125 0 0 0
-3086 1 -44.59125 -1.35125 12.16125 0 0 0
-3087 1 -44.59125 -4.05375 14.86375 0 0 0
-3088 1 -47.29375 -1.35125 14.86375 0 0 0
-3089 1 -41.88875 -4.05375 12.16125 0 0 0
-3090 1 -39.18625 -1.35125 12.16125 0 0 0
-3091 1 -39.18625 -4.05375 14.86375 0 0 0
-3092 1 -41.88875 -1.35125 14.86375 0 0 0
-3093 1 -36.48375 -4.05375 12.16125 0 0 0
-3094 1 -33.78125 -1.35125 12.16125 0 0 0
-3095 1 -33.78125 -4.05375 14.86375 0 0 0
-3096 1 -36.48375 -1.35125 14.86375 0 0 0
-3097 1 -31.07875 -4.05375 12.16125 0 0 0
-3098 1 -28.37625 -1.35125 12.16125 0 0 0
-3099 1 -28.37625 -4.05375 14.86375 0 0 0
-3100 1 -31.07875 -1.35125 14.86375 0 0 0
-3101 1 -25.67375 -4.05375 12.16125 0 0 0
-3102 1 -22.97125 -1.35125 12.16125 0 0 0
-3103 1 -22.97125 -4.05375 14.86375 0 0 0
-3104 1 -25.67375 -1.35125 14.86375 0 0 0
-3105 1 -20.26875 -4.05375 12.16125 0 0 0
-3106 1 -17.56625 -1.35125 12.16125 0 0 0
-3107 1 -17.56625 -4.05375 14.86375 0 0 0
-3108 1 -20.26875 -1.35125 14.86375 0 0 0
-3109 1 -14.86375 -4.05375 12.16125 0 0 0
-3110 1 -12.16125 -1.35125 12.16125 0 0 0
-3111 1 -12.16125 -4.05375 14.86375 0 0 0
-3112 1 -14.86375 -1.35125 14.86375 0 0 0
-3113 1 -9.45875 -4.05375 12.16125 0 0 0
-3114 1 -6.75625 -1.35125 12.16125 0 0 0
-3115 1 -6.75625 -4.05375 14.86375 0 0 0
-3116 1 -9.45875 -1.35125 14.86375 0 0 0
-3117 1 -4.05375 -4.05375 12.16125 0 0 0
-3118 1 -1.35125 -1.35125 12.16125 0 0 0
-3119 1 -1.35125 -4.05375 14.86375 0 0 0
-3120 1 -4.05375 -1.35125 14.86375 0 0 0
-3121 1 1.35125 -4.05375 12.16125 0 0 0
-3122 1 4.05375 -1.35125 12.16125 0 0 0
-3123 1 4.05375 -4.05375 14.86375 0 0 0
-3124 1 1.35125 -1.35125 14.86375 0 0 0
-3125 1 6.75625 -4.05375 12.16125 0 0 0
-3126 1 9.45875 -1.35125 12.16125 0 0 0
-3127 1 9.45875 -4.05375 14.86375 0 0 0
-3128 1 6.75625 -1.35125 14.86375 0 0 0
-3129 1 12.16125 -4.05375 12.16125 0 0 0
-3130 1 14.86375 -1.35125 12.16125 0 0 0
-3131 1 14.86375 -4.05375 14.86375 0 0 0
-3132 1 12.16125 -1.35125 14.86375 0 0 0
-3133 1 17.56625 -4.05375 12.16125 0 0 0
-3134 1 20.26875 -1.35125 12.16125 0 0 0
-3135 1 20.26875 -4.05375 14.86375 0 0 0
-3136 1 17.56625 -1.35125 14.86375 0 0 0
-3137 1 22.97125 -4.05375 12.16125 0 0 0
-3138 1 25.67375 -1.35125 12.16125 0 0 0
-3139 1 25.67375 -4.05375 14.86375 0 0 0
-3140 1 22.97125 -1.35125 14.86375 0 0 0
-3141 1 28.37625 -4.05375 12.16125 0 0 0
-3142 1 31.07875 -1.35125 12.16125 0 0 0
-3143 1 31.07875 -4.05375 14.86375 0 0 0
-3144 1 28.37625 -1.35125 14.86375 0 0 0
-3145 1 33.78125 -4.05375 12.16125 0 0 0
-3146 1 36.48375 -1.35125 12.16125 0 0 0
-3147 1 36.48375 -4.05375 14.86375 0 0 0
-3148 1 33.78125 -1.35125 14.86375 0 0 0
-3149 1 39.18625 -4.05375 12.16125 0 0 0
-3150 1 41.88875 -1.35125 12.16125 0 0 0
-3151 1 41.88875 -4.05375 14.86375 0 0 0
-3152 1 39.18625 -1.35125 14.86375 0 0 0
-3153 1 44.59125 -4.05375 12.16125 0 0 0
-3154 1 47.29375 -1.35125 12.16125 0 0 0
-3155 1 47.29375 -4.05375 14.86375 0 0 0
-3156 1 44.59125 -1.35125 14.86375 0 0 0
-3157 1 49.99625 -4.05375 12.16125 0 0 0
-3158 1 52.69875 -1.35125 12.16125 0 0 0
-3159 1 52.69875 -4.05375 14.86375 0 0 0
-3160 1 49.99625 -1.35125 14.86375 0 0 0
-3161 1 55.40125 -4.05375 12.16125 0 0 0
-3162 1 58.10375 -1.35125 12.16125 0 0 0
-3163 1 58.10375 -4.05375 14.86375 0 0 0
-3164 1 55.40125 -1.35125 14.86375 0 0 0
-3165 1 60.80625 -4.05375 12.16125 0 0 0
-3166 1 63.50875 -1.35125 12.16125 0 0 0
-3167 1 63.50875 -4.05375 14.86375 0 0 0
-3168 1 60.80625 -1.35125 14.86375 0 0 0
-3169 1 -63.50875 1.35125 12.16125 0 0 0
-3170 1 -60.80625 4.05375 12.16125 0 0 0
-3171 1 -60.80625 1.35125 14.86375 0 0 0
-3172 1 -63.50875 4.05375 14.86375 0 0 0
-3173 1 -58.10375 1.35125 12.16125 0 0 0
-3174 1 -55.40125 4.05375 12.16125 0 0 0
-3175 1 -55.40125 1.35125 14.86375 0 0 0
-3176 1 -58.10375 4.05375 14.86375 0 0 0
-3177 1 -52.69875 1.35125 12.16125 0 0 0
-3178 1 -49.99625 4.05375 12.16125 0 0 0
-3179 1 -49.99625 1.35125 14.86375 0 0 0
-3180 1 -52.69875 4.05375 14.86375 0 0 0
-3181 1 -47.29375 1.35125 12.16125 0 0 0
-3182 1 -44.59125 4.05375 12.16125 0 0 0
-3183 1 -44.59125 1.35125 14.86375 0 0 0
-3184 1 -47.29375 4.05375 14.86375 0 0 0
-3185 1 -41.88875 1.35125 12.16125 0 0 0
-3186 1 -39.18625 4.05375 12.16125 0 0 0
-3187 1 -39.18625 1.35125 14.86375 0 0 0
-3188 1 -41.88875 4.05375 14.86375 0 0 0
-3189 1 -36.48375 1.35125 12.16125 0 0 0
-3190 1 -33.78125 4.05375 12.16125 0 0 0
-3191 1 -33.78125 1.35125 14.86375 0 0 0
-3192 1 -36.48375 4.05375 14.86375 0 0 0
-3193 1 -31.07875 1.35125 12.16125 0 0 0
-3194 1 -28.37625 4.05375 12.16125 0 0 0
-3195 1 -28.37625 1.35125 14.86375 0 0 0
-3196 1 -31.07875 4.05375 14.86375 0 0 0
-3197 1 -25.67375 1.35125 12.16125 0 0 0
-3198 1 -22.97125 4.05375 12.16125 0 0 0
-3199 1 -22.97125 1.35125 14.86375 0 0 0
-3200 1 -25.67375 4.05375 14.86375 0 0 0
-3201 1 -20.26875 1.35125 12.16125 0 0 0
-3202 1 -17.56625 4.05375 12.16125 0 0 0
-3203 1 -17.56625 1.35125 14.86375 0 0 0
-3204 1 -20.26875 4.05375 14.86375 0 0 0
-3205 1 -14.86375 1.35125 12.16125 0 0 0
-3206 1 -12.16125 4.05375 12.16125 0 0 0
-3207 1 -12.16125 1.35125 14.86375 0 0 0
-3208 1 -14.86375 4.05375 14.86375 0 0 0
-3209 1 -9.45875 1.35125 12.16125 0 0 0
-3210 1 -6.75625 4.05375 12.16125 0 0 0
-3211 1 -6.75625 1.35125 14.86375 0 0 0
-3212 1 -9.45875 4.05375 14.86375 0 0 0
-3213 1 -4.05375 1.35125 12.16125 0 0 0
-3214 1 -1.35125 4.05375 12.16125 0 0 0
-3215 1 -1.35125 1.35125 14.86375 0 0 0
-3216 1 -4.05375 4.05375 14.86375 0 0 0
-3217 1 1.35125 1.35125 12.16125 0 0 0
-3218 1 4.05375 4.05375 12.16125 0 0 0
-3219 1 4.05375 1.35125 14.86375 0 0 0
-3220 1 1.35125 4.05375 14.86375 0 0 0
-3221 1 6.75625 1.35125 12.16125 0 0 0
-3222 1 9.45875 4.05375 12.16125 0 0 0
-3223 1 9.45875 1.35125 14.86375 0 0 0
-3224 1 6.75625 4.05375 14.86375 0 0 0
-3225 1 12.16125 1.35125 12.16125 0 0 0
-3226 1 14.86375 4.05375 12.16125 0 0 0
-3227 1 14.86375 1.35125 14.86375 0 0 0
-3228 1 12.16125 4.05375 14.86375 0 0 0
-3229 1 17.56625 1.35125 12.16125 0 0 0
-3230 1 20.26875 4.05375 12.16125 0 0 0
-3231 1 20.26875 1.35125 14.86375 0 0 0
-3232 1 17.56625 4.05375 14.86375 0 0 0
-3233 1 22.97125 1.35125 12.16125 0 0 0
-3234 1 25.67375 4.05375 12.16125 0 0 0
-3235 1 25.67375 1.35125 14.86375 0 0 0
-3236 1 22.97125 4.05375 14.86375 0 0 0
-3237 1 28.37625 1.35125 12.16125 0 0 0
-3238 1 31.07875 4.05375 12.16125 0 0 0
-3239 1 31.07875 1.35125 14.86375 0 0 0
-3240 1 28.37625 4.05375 14.86375 0 0 0
-3241 1 33.78125 1.35125 12.16125 0 0 0
-3242 1 36.48375 4.05375 12.16125 0 0 0
-3243 1 36.48375 1.35125 14.86375 0 0 0
-3244 1 33.78125 4.05375 14.86375 0 0 0
-3245 1 39.18625 1.35125 12.16125 0 0 0
-3246 1 41.88875 4.05375 12.16125 0 0 0
-3247 1 41.88875 1.35125 14.86375 0 0 0
-3248 1 39.18625 4.05375 14.86375 0 0 0
-3249 1 44.59125 1.35125 12.16125 0 0 0
-3250 1 47.29375 4.05375 12.16125 0 0 0
-3251 1 47.29375 1.35125 14.86375 0 0 0
-3252 1 44.59125 4.05375 14.86375 0 0 0
-3253 1 49.99625 1.35125 12.16125 0 0 0
-3254 1 52.69875 4.05375 12.16125 0 0 0
-3255 1 52.69875 1.35125 14.86375 0 0 0
-3256 1 49.99625 4.05375 14.86375 0 0 0
-3257 1 55.40125 1.35125 12.16125 0 0 0
-3258 1 58.10375 4.05375 12.16125 0 0 0
-3259 1 58.10375 1.35125 14.86375 0 0 0
-3260 1 55.40125 4.05375 14.86375 0 0 0
-3261 1 60.80625 1.35125 12.16125 0 0 0
-3262 1 63.50875 4.05375 12.16125 0 0 0
-3263 1 63.50875 1.35125 14.86375 0 0 0
-3264 1 60.80625 4.05375 14.86375 0 0 0
-3265 1 -63.50875 6.75625 12.16125 0 0 0
-3266 1 -60.80625 9.45875 12.16125 0 0 0
-3267 1 -60.80625 6.75625 14.86375 0 0 0
-3268 1 -63.50875 9.45875 14.86375 0 0 0
-3269 1 -58.10375 6.75625 12.16125 0 0 0
-3270 1 -55.40125 9.45875 12.16125 0 0 0
-3271 1 -55.40125 6.75625 14.86375 0 0 0
-3272 1 -58.10375 9.45875 14.86375 0 0 0
-3273 1 -52.69875 6.75625 12.16125 0 0 0
-3274 1 -49.99625 9.45875 12.16125 0 0 0
-3275 1 -49.99625 6.75625 14.86375 0 0 0
-3276 1 -52.69875 9.45875 14.86375 0 0 0
-3277 1 -47.29375 6.75625 12.16125 0 0 0
-3278 1 -44.59125 9.45875 12.16125 0 0 0
-3279 1 -44.59125 6.75625 14.86375 0 0 0
-3280 1 -47.29375 9.45875 14.86375 0 0 0
-3281 1 -41.88875 6.75625 12.16125 0 0 0
-3282 1 -39.18625 9.45875 12.16125 0 0 0
-3283 1 -39.18625 6.75625 14.86375 0 0 0
-3284 1 -41.88875 9.45875 14.86375 0 0 0
-3285 1 -36.48375 6.75625 12.16125 0 0 0
-3286 1 -33.78125 9.45875 12.16125 0 0 0
-3287 1 -33.78125 6.75625 14.86375 0 0 0
-3288 1 -36.48375 9.45875 14.86375 0 0 0
-3289 1 -31.07875 6.75625 12.16125 0 0 0
-3290 1 -28.37625 9.45875 12.16125 0 0 0
-3291 1 -28.37625 6.75625 14.86375 0 0 0
-3292 1 -31.07875 9.45875 14.86375 0 0 0
-3293 1 -25.67375 6.75625 12.16125 0 0 0
-3294 1 -22.97125 9.45875 12.16125 0 0 0
-3295 1 -22.97125 6.75625 14.86375 0 0 0
-3296 1 -25.67375 9.45875 14.86375 0 0 0
-3297 1 -20.26875 6.75625 12.16125 0 0 0
-3298 1 -17.56625 9.45875 12.16125 0 0 0
-3299 1 -17.56625 6.75625 14.86375 0 0 0
-3300 1 -20.26875 9.45875 14.86375 0 0 0
-3301 1 -14.86375 6.75625 12.16125 0 0 0
-3302 1 -12.16125 9.45875 12.16125 0 0 0
-3303 1 -12.16125 6.75625 14.86375 0 0 0
-3304 1 -14.86375 9.45875 14.86375 0 0 0
-3305 1 -9.45875 6.75625 12.16125 0 0 0
-3306 1 -6.75625 9.45875 12.16125 0 0 0
-3307 1 -6.75625 6.75625 14.86375 0 0 0
-3308 1 -9.45875 9.45875 14.86375 0 0 0
-3309 1 -4.05375 6.75625 12.16125 0 0 0
-3310 1 -1.35125 9.45875 12.16125 0 0 0
-3311 1 -1.35125 6.75625 14.86375 0 0 0
-3312 1 -4.05375 9.45875 14.86375 0 0 0
-3313 1 1.35125 6.75625 12.16125 0 0 0
-3314 1 4.05375 9.45875 12.16125 0 0 0
-3315 1 4.05375 6.75625 14.86375 0 0 0
-3316 1 1.35125 9.45875 14.86375 0 0 0
-3317 1 6.75625 6.75625 12.16125 0 0 0
-3318 1 9.45875 9.45875 12.16125 0 0 0
-3319 1 9.45875 6.75625 14.86375 0 0 0
-3320 1 6.75625 9.45875 14.86375 0 0 0
-3321 1 12.16125 6.75625 12.16125 0 0 0
-3322 1 14.86375 9.45875 12.16125 0 0 0
-3323 1 14.86375 6.75625 14.86375 0 0 0
-3324 1 12.16125 9.45875 14.86375 0 0 0
-3325 1 17.56625 6.75625 12.16125 0 0 0
-3326 1 20.26875 9.45875 12.16125 0 0 0
-3327 1 20.26875 6.75625 14.86375 0 0 0
-3328 1 17.56625 9.45875 14.86375 0 0 0
-3329 1 22.97125 6.75625 12.16125 0 0 0
-3330 1 25.67375 9.45875 12.16125 0 0 0
-3331 1 25.67375 6.75625 14.86375 0 0 0
-3332 1 22.97125 9.45875 14.86375 0 0 0
-3333 1 28.37625 6.75625 12.16125 0 0 0
-3334 1 31.07875 9.45875 12.16125 0 0 0
-3335 1 31.07875 6.75625 14.86375 0 0 0
-3336 1 28.37625 9.45875 14.86375 0 0 0
-3337 1 33.78125 6.75625 12.16125 0 0 0
-3338 1 36.48375 9.45875 12.16125 0 0 0
-3339 1 36.48375 6.75625 14.86375 0 0 0
-3340 1 33.78125 9.45875 14.86375 0 0 0
-3341 1 39.18625 6.75625 12.16125 0 0 0
-3342 1 41.88875 9.45875 12.16125 0 0 0
-3343 1 41.88875 6.75625 14.86375 0 0 0
-3344 1 39.18625 9.45875 14.86375 0 0 0
-3345 1 44.59125 6.75625 12.16125 0 0 0
-3346 1 47.29375 9.45875 12.16125 0 0 0
-3347 1 47.29375 6.75625 14.86375 0 0 0
-3348 1 44.59125 9.45875 14.86375 0 0 0
-3349 1 49.99625 6.75625 12.16125 0 0 0
-3350 1 52.69875 9.45875 12.16125 0 0 0
-3351 1 52.69875 6.75625 14.86375 0 0 0
-3352 1 49.99625 9.45875 14.86375 0 0 0
-3353 1 55.40125 6.75625 12.16125 0 0 0
-3354 1 58.10375 9.45875 12.16125 0 0 0
-3355 1 58.10375 6.75625 14.86375 0 0 0
-3356 1 55.40125 9.45875 14.86375 0 0 0
-3357 1 60.80625 6.75625 12.16125 0 0 0
-3358 1 63.50875 9.45875 12.16125 0 0 0
-3359 1 63.50875 6.75625 14.86375 0 0 0
-3360 1 60.80625 9.45875 14.86375 0 0 0
-3361 1 -63.50875 12.16125 12.16125 0 0 0
-3362 1 -60.80625 14.86375 12.16125 0 0 0
-3363 1 -60.80625 12.16125 14.86375 0 0 0
-3364 1 -63.50875 14.86375 14.86375 0 0 0
-3365 1 -58.10375 12.16125 12.16125 0 0 0
-3366 1 -55.40125 14.86375 12.16125 0 0 0
-3367 1 -55.40125 12.16125 14.86375 0 0 0
-3368 1 -58.10375 14.86375 14.86375 0 0 0
-3369 1 -52.69875 12.16125 12.16125 0 0 0
-3370 1 -49.99625 14.86375 12.16125 0 0 0
-3371 1 -49.99625 12.16125 14.86375 0 0 0
-3372 1 -52.69875 14.86375 14.86375 0 0 0
-3373 1 -47.29375 12.16125 12.16125 0 0 0
-3374 1 -44.59125 14.86375 12.16125 0 0 0
-3375 1 -44.59125 12.16125 14.86375 0 0 0
-3376 1 -47.29375 14.86375 14.86375 0 0 0
-3377 1 -41.88875 12.16125 12.16125 0 0 0
-3378 1 -39.18625 14.86375 12.16125 0 0 0
-3379 1 -39.18625 12.16125 14.86375 0 0 0
-3380 1 -41.88875 14.86375 14.86375 0 0 0
-3381 1 -36.48375 12.16125 12.16125 0 0 0
-3382 1 -33.78125 14.86375 12.16125 0 0 0
-3383 1 -33.78125 12.16125 14.86375 0 0 0
-3384 1 -36.48375 14.86375 14.86375 0 0 0
-3385 1 -31.07875 12.16125 12.16125 0 0 0
-3386 1 -28.37625 14.86375 12.16125 0 0 0
-3387 1 -28.37625 12.16125 14.86375 0 0 0
-3388 1 -31.07875 14.86375 14.86375 0 0 0
-3389 1 -25.67375 12.16125 12.16125 0 0 0
-3390 1 -22.97125 14.86375 12.16125 0 0 0
-3391 1 -22.97125 12.16125 14.86375 0 0 0
-3392 1 -25.67375 14.86375 14.86375 0 0 0
-3393 1 -20.26875 12.16125 12.16125 0 0 0
-3394 1 -17.56625 14.86375 12.16125 0 0 0
-3395 1 -17.56625 12.16125 14.86375 0 0 0
-3396 1 -20.26875 14.86375 14.86375 0 0 0
-3397 1 -14.86375 12.16125 12.16125 0 0 0
-3398 1 -12.16125 14.86375 12.16125 0 0 0
-3399 1 -12.16125 12.16125 14.86375 0 0 0
-3400 1 -14.86375 14.86375 14.86375 0 0 0
-3401 1 -9.45875 12.16125 12.16125 0 0 0
-3402 1 -6.75625 14.86375 12.16125 0 0 0
-3403 1 -6.75625 12.16125 14.86375 0 0 0
-3404 1 -9.45875 14.86375 14.86375 0 0 0
-3405 1 -4.05375 12.16125 12.16125 0 0 0
-3406 1 -1.35125 14.86375 12.16125 0 0 0
-3407 1 -1.35125 12.16125 14.86375 0 0 0
-3408 1 -4.05375 14.86375 14.86375 0 0 0
-3409 1 1.35125 12.16125 12.16125 0 0 0
-3410 1 4.05375 14.86375 12.16125 0 0 0
-3411 1 4.05375 12.16125 14.86375 0 0 0
-3412 1 1.35125 14.86375 14.86375 0 0 0
-3413 1 6.75625 12.16125 12.16125 0 0 0
-3414 1 9.45875 14.86375 12.16125 0 0 0
-3415 1 9.45875 12.16125 14.86375 0 0 0
-3416 1 6.75625 14.86375 14.86375 0 0 0
-3417 1 12.16125 12.16125 12.16125 0 0 0
-3418 1 14.86375 14.86375 12.16125 0 0 0
-3419 1 14.86375 12.16125 14.86375 0 0 0
-3420 1 12.16125 14.86375 14.86375 0 0 0
-3421 1 17.56625 12.16125 12.16125 0 0 0
-3422 1 20.26875 14.86375 12.16125 0 0 0
-3423 1 20.26875 12.16125 14.86375 0 0 0
-3424 1 17.56625 14.86375 14.86375 0 0 0
-3425 1 22.97125 12.16125 12.16125 0 0 0
-3426 1 25.67375 14.86375 12.16125 0 0 0
-3427 1 25.67375 12.16125 14.86375 0 0 0
-3428 1 22.97125 14.86375 14.86375 0 0 0
-3429 1 28.37625 12.16125 12.16125 0 0 0
-3430 1 31.07875 14.86375 12.16125 0 0 0
-3431 1 31.07875 12.16125 14.86375 0 0 0
-3432 1 28.37625 14.86375 14.86375 0 0 0
-3433 1 33.78125 12.16125 12.16125 0 0 0
-3434 1 36.48375 14.86375 12.16125 0 0 0
-3435 1 36.48375 12.16125 14.86375 0 0 0
-3436 1 33.78125 14.86375 14.86375 0 0 0
-3437 1 39.18625 12.16125 12.16125 0 0 0
-3438 1 41.88875 14.86375 12.16125 0 0 0
-3439 1 41.88875 12.16125 14.86375 0 0 0
-3440 1 39.18625 14.86375 14.86375 0 0 0
-3441 1 44.59125 12.16125 12.16125 0 0 0
-3442 1 47.29375 14.86375 12.16125 0 0 0
-3443 1 47.29375 12.16125 14.86375 0 0 0
-3444 1 44.59125 14.86375 14.86375 0 0 0
-3445 1 49.99625 12.16125 12.16125 0 0 0
-3446 1 52.69875 14.86375 12.16125 0 0 0
-3447 1 52.69875 12.16125 14.86375 0 0 0
-3448 1 49.99625 14.86375 14.86375 0 0 0
-3449 1 55.40125 12.16125 12.16125 0 0 0
-3450 1 58.10375 14.86375 12.16125 0 0 0
-3451 1 58.10375 12.16125 14.86375 0 0 0
-3452 1 55.40125 14.86375 14.86375 0 0 0
-3453 1 60.80625 12.16125 12.16125 0 0 0
-3454 1 63.50875 14.86375 12.16125 0 0 0
-3455 1 63.50875 12.16125 14.86375 0 0 0
-3456 1 60.80625 14.86375 14.86375 0 0 0
-
-Velocities
-
-1 0.000552201447145 -0.00101701477812 0.0010473834785
-2 -0.000609813144617 0.000420921787864 -0.00156293920418
-3 0.00072993621999 0.00128256089164 0.00139785798265
-4 -0.000657047548921 0.000203852886204 -0.000939948988583
-5 -0.000779326603939 0.000332750301152 -0.000502615879369
-6 -0.00116857538562 0.000320454219184 0.00152639043046
-7 -0.000601591831094 -0.00052963245232 -0.000152141375228
-8 0.00117338282323 0.00155361796548 0.000672010076777
-9 0.00105110376821 -0.00147944304281 0.00110934318599
-10 0.000661854986527 -0.00149173912478 -2.36089274175e-05
-11 -0.0011603540721 -0.000630100021 -0.000224770163826
-12 0.000614620582223 0.0014531503968 0.00059938128818
-13 0.000492341527206 -0.00157991061149 0.00103671439739
-14 -0.000669673064557 -0.000141974045503 -0.00157360828529
-15 0.00067007630005 0.000719665058274 0.00138718890153
-16 -0.000716907468861 -0.000359042947163 -0.000950618069694
-17 -0.000839186523879 -0.000230145532215 -0.000513284960479
-18 -0.00122843530556 -0.000242441614183 0.00151572134935
-19 -0.000661451751034 -0.00109252828569 -0.000162810456339
-20 0.00111352290329 0.00099072213211 0.000661340995667
-21 0.000991243848271 0.00111961954706 0.00109867410488
-22 0.000601995066588 0.00110732346509 -3.42780085279e-05
-23 -0.00122021399204 -0.00119299585437 -0.000235439244936
-24 0.000554760662284 0.000890254563431 0.000588712207069
-25 0.000677404091061 0.000561470071022 -0.00135088631696
-26 -0.00126834191886 -0.000617705503094 -0.000599363653551
-27 -0.000701358364327 -0.0014677921746 0.000884062963999
-28 0.000240920905074 0.000332105087395 0.00130111020846
-29 0.000118641850056 0.000461002502343 -0.00142351510556
-30 0.000562088453295 0.000732059576179 0.00101259541181
-31 -0.00126012060533 -0.00156825974328 0.000811434175401
-32 -0.00109060714601 -0.00148008825657 -0.000248889149411
-33 -0.00121288620103 -0.00135119084162 0.000188443959804
-34 3.32621228973e-06 0.0006315920075 0.000939966623212
-35 0.000570309766818 -0.000218494664005 -0.000738565182472
-36 0.00073982322614 -0.000130323177292 0.00136306991595
-37 0.0013903099812 -0.0014516584103 0.000115815171206
-38 -0.00132820183879 -0.00118060133646 -0.000610032734661
-39 -0.000761218284266 0.00113127041527 0.000873393882889
-40 0.000181060985135 -0.000230790745972 0.00129044112735
-41 5.87819301166e-05 -0.000101893331024 -0.00143418418667
-42 0.000502228533355 0.000169163742813 0.0010019263307
-43 -0.00131998052527 0.00103080284659 0.000800765094291
-44 -0.00115046706595 0.0011189743333 -0.000259558230521
-45 -0.00127274612097 0.00124787174825 0.000177774878694
-46 -5.65337076497e-05 6.86961741331e-05 0.000929297542102
-47 0.000510449846879 -0.000781390497371 -0.000749234263582
-48 0.00145272911628 0.00101850676462 -0.000332187019119
-49 0.00133045006126 0.00114740417957 0.000105146090096
-50 -0.00138806175873 0.00141846125341 -0.000620701815772
-51 -4.83123941266e-05 -0.000881858066051 -0.00082186305218
-52 0.000121201065195 -0.000793686579339 0.00127977204624
-53 -1.07798982286e-06 -0.000664789164391 -0.00144485326778
-54 0.0012151344235 0.00131799368473 -0.00069333060437
-55 -0.00137984044521 0.000467907013222 0.000790096013181
-56 -0.00121032698589 0.000556078499935 -0.000270227311631
-57 -0.00133260604091 0.000684975914882 0.000167105797583
-58 -0.000116393627589 -0.000494199659234 0.000918628460991
-59 0.000450589926939 -0.00134428633074 -0.000759903344693
-60 0.00139286919634 0.000455610931255 -0.000342856100229
-61 0.00127059014132 0.000584508346203 9.44770089856e-05
-62 -0.00144792167867 0.00085556542004 -0.000631370896882
-63 -0.000108172314066 -0.00144475389942 -0.000832532133291
-64 6.13411452557e-05 -0.00135658241271 0.00126910296513
-65 -6.09379097623e-05 -0.00122768499776 -0.00145552234889
-66 0.00115527450356 0.00075509785136 -0.00070399968548
-67 -0.00143970036515 -9.49888201445e-05 0.00077942693207
-68 -0.00127018690583 -6.81733343229e-06 -0.000280896392742
-69 -0.000619700150767 -0.00132815256644 -0.00152815113749
-70 -0.000176253547529 -0.0010570954926 0.000907959379881
-71 0.00116349581708 -0.000195456388824 0.000706798143472
-72 0.0013330092764 -0.000107284902112 -0.00035352518134
-73 -0.000100844523055 0.00155900953656 -0.00040864892855
-74 -0.000490093304739 0.0015467134546 -0.00154160104196
-75 7.68902497896e-05 0.000696626783093 -5.81744244096e-05
-76 -0.000537327709042 0.00132964455294 -0.000918610826363
-77 -0.00065960676406 0.00145854196789 -0.000481277717148
-78 0.00134033706741 -0.000265479889363 7.03580234011e-05
-79 -0.000481871991216 0.000596159214414 -0.000130803213007
-80 0.00129310266311 -0.000482548791023 0.000693348238998
-81 0.00117082360809 -0.000353651376075 0.00113068134821
-82 0.000781574826406 -0.000365947458043 -2.27076519672e-06
-83 0.00134855838093 -0.00121603412955 0.00148115585235
-84 -3.84253879767e-05 0.00086721628825 -0.000856651118875
-85 -0.000160704442995 0.000996113703198 -0.00041931800966
-86 -0.000549953224678 0.000983817621231 -0.00155227012307
-87 0.000789796139929 -0.00131650169823 0.00140852706376
-88 -0.000597187628982 0.000766748719571 -0.000929279907473
-89 -0.000719466684 0.000895646134518 -0.000491946798258
-90 -0.00110871546568 0.000883350052551 0.00153705951157
-91 -0.000541731911155 3.32633810466e-05 -0.000141472294118
-92 0.00123324274317 -0.00104544462439 0.000682679157888
-93 0.00111096368815 -0.000916547209442 0.0011200122671
-94 0.000721714906467 -0.00092884329141 -1.29398463071e-05
-95 0.00128869846099 0.00138302846032 0.00147048677124
-96 -9.82853079161e-05 0.000304320454883 -0.000867320199985
-97 1.15475832365e-05 -0.00031799711317 -0.000400222416718
-98 0.0013966864226 0.00137256418144 -0.000494935053564
-99 0.000189282356081 -0.00118037986664 -4.97479125781e-05
-100 0.00134945201829 0.00115549527978 0.000128055162034
-101 -0.00131998046785 0.0010317679661 0.00121173664864
-102 0.000837924181593 0.00127209661276 -0.000567563842161
-103 -0.001142245695 0.000169385212631 -0.00159974727045
-104 1.79239672097e-05 -0.000656698064179 -0.00142194419584
-105 0.000510449904302 -0.000780425377858 -0.000338262709231
-106 -0.000493603869492 -0.000540096731198 0.0010443952232
-107 0.00146095048723 6.8917643952e-05 0.00148958236418
-108 -0.000540838273795 -0.000757165632858 -0.00149457298444
-109 -4.8312336703e-05 -0.000880892946537 -0.000410891497829
-110 0.00133682650266 0.000809668348075 -0.000505604134674
-111 0.000129422436142 0.00141868272323 -6.04169936885e-05
-112 0.00128959209835 0.000592599446415 0.000117386080923
-113 -0.00137984038779 0.000468872132736 0.00120106756753
-114 0.000778064261653 0.000709200779396 -0.000578232923272
-115 -0.00120210561494 -0.000393510620735 0.00155154207167
-116 -4.19359527297e-05 -0.00121959389755 -0.00143261327695
-117 0.00122335579444 0.000368404564057 0.00112843877893
-118 -0.000553463789431 -0.00110299256457 0.00103372614209
-119 0.00140109056729 -0.000493978189415 0.00147891328307
-120 -0.000600698193735 -0.00132006146622 -0.00150524206555
-121 0.000136750227153 0.00126048773597 0.000363466211052
-122 0.00073815764836 0.000333936890484 0.000468640497066
-123 -0.00124201222824 -0.000768774509647 -0.000563542931224
-124 -0.000914537950945 0.00128374748097 -0.000792844064154
-125 -0.000422012013853 0.00116002016729 0.000290837422454
-126 -0.000593370402724 -0.00147825645348 -0.00108135886081
-127 0.00136118395399 -0.000869242078326 -0.000636171719822
-128 0.000915892421205 -0.000528445862987 0.000819115001206
-129 0.0014084183583 -0.000652173176666 -0.00125916193542
-130 -0.00115213264373 -0.00157872402216 -0.00115398764941
-131 2.96559029095e-05 0.000480523000947 0.000975787345539
-132 -0.000415635629879 0.000821319216286 -0.000730884356667
-133 0.000849656117292 -0.000752640745346 -0.00133179072402
-134 0.000678297728421 -0.000228958942883 0.000457971415956
-135 -0.000529106338096 0.000380055432268 0.000903158556941
-136 -0.000974397870884 0.000720851647606 -0.000803513145265
-137 -0.000481871933792 0.000597124333927 0.000280168341344
-138 -0.000653230322663 0.00112080613639 -0.00109202794192
-139 0.00130132403405 -0.00143213791169 -0.000646840800932
-140 0.000856032501266 -0.00109134169635 0.000808445920096
-141 0.00134855843836 -0.00121506901003 -0.00126983101653
-142 -0.00121199256367 0.00102033856771 -0.00116465673052
-143 -3.02040170299e-05 -8.23728324198e-05 0.000965118264428
-144 0.00029727026026 -0.00119180926503 0.000735817131498
-145 0.000789796197353 -0.00131553657871 -0.00134245980513
-146 0.000618437808481 -0.000791854776249 0.000447302334845
-147 -0.000588966258035 -0.000182840401099 0.000892489475831
-148 -0.00103425779082 0.000157955814239 -0.000814182226375
-149 -0.000541731853731 3.42285005606e-05 0.000269499260234
-150 5.96755674761e-05 -0.000892322344929 0.000374673546247
-151 0.00124146411411 0.00116692467817 -0.000657509882043
-152 0.000796172581326 0.00150772089351 0.000797776838986
-153 -0.00110049409474 -6.62390681189e-05 0.000196870471636
-154 -0.00127185248361 0.000457442734344 -0.00117532581163
-155 -9.00639369694e-05 -0.000645268665787 0.000954449183318
-156 0.000237410340321 0.00140725332483 0.000725148050388
-157 0.000729936277413 0.00128352601115 -0.00135312888624
-158 0.000558577888542 -0.00135475060962 0.000436633253735
-159 -0.000648826177975 -0.000745736234466 0.00088182039472
-160 -0.00109411771076 -0.000404940019127 -0.000824851307486
-161 -0.000601591773671 -0.000528667332806 0.000258830179123
-162 -1.8435246329e-07 -0.0014552181783 0.000364004465137
-163 0.00118160419418 0.000604028844807 -0.000668178963153
-164 0.000736312661387 0.000944825060146 0.000787107757875
-165 -0.00116035401468 -0.000629134901486 0.000186201390525
-166 -0.00133171240355 -0.000105453099022 -0.00118599489274
-167 0.00062284195317 0.000503561276128 -0.000740807751751
-168 0.000177550420382 0.000844357491466 0.000714478969277
-169 -0.000641498386964 -0.000903931221718 0.00130570359946
-170 0.00151640626248 -0.000663602575058 -0.000473596891343
-171 0.00030900219596 -5.45881999081e-05 -2.84097503573e-05
-172 0.00146917185817 -0.000880671476718 0.000149393324254
-173 -0.00120026062797 -0.0010043987904 0.00123307481086
-174 0.000184878211392 0.000686162504215 0.00113836217402
-175 -0.00102252585512 0.00129517687937 -0.00157840910823
-176 0.000137643807089 0.000469093602555 -0.00140060603362
-177 0.000630169744181 0.000345366288876 -0.00031692454701
-178 -0.000373884029613 0.000585694935536 0.00106573338542
-179 0.000807904517026 -0.000517016464596 3.35499571301e-05
-180 -0.001193884244 -0.00134309974141 0.000211353031742
-181 7.14075031759e-05 0.000244898720197 -0.000389553335608
-182 0.00145654634254 -0.00122649840843 -0.000484265972453
-183 0.000249142276021 -0.000617484033275 -3.90788314677e-05
-184 0.00140931193823 -0.00144356731009 0.000138724243144
-185 -0.00126012054791 -0.00156729462376 0.00122240572975
-186 0.000897784101532 -0.0013269659771 -0.000556894761051
-187 -0.00108238577506 0.000732281045998 -0.00158907818934
-188 7.77838871492e-05 -9.38022308117e-05 -0.00141127511473
-189 0.000570309824242 -0.000217529544491 -0.000327593628121
-190 -0.000433743949552 2.27991021686e-05 0.00105506430431
-191 0.000748044597086 -0.00107991229796 2.28808760197e-05
-192 -0.00125374416394 0.00125596284846 0.000200683950631
-193 -0.000605102338424 0.000546480904632 -0.000317131978952
-194 0.000856032558689 -0.00109037657684 0.00121941747445
-195 0.0003453982445 0.00139582392644 0.00151071309446
-196 0.000808798154385 -0.0013074454785 -0.00131955073319
-197 -0.00116386457943 0.000446013335952 -0.00038976076755
-198 0.000297270317684 -0.00119084414552 0.00114678868585
-199 -0.000986129806584 -0.000416369417519 -3.92862634094e-05
-200 -0.000522729896699 4.2319600773e-05 0.000292408332171
-201 0.000666565792721 -0.00136618000801 0.00122219829781
-202 -0.0010342577334 0.000158920933753 -0.000403210672024
-203 0.000844300565566 0.000933395661754 -0.00158928562128
-204 -0.0010814921377 -5.81479679064e-05 0.000219779543573
-205 -0.000664962258363 -1.6414928735e-05 -0.000327801060062
-206 0.00156893844883 5.84533650739e-05 -0.000475839460622
-207 0.000285538324561 0.000832928093075 0.00150004401335
-208 0.000748938234446 0.00129161711137 -0.0013302198143
-209 -0.00122372449937 -0.000116882497414 -0.00040042984866
-210 0.000237410397745 0.00140821844435 0.00113611960474
-211 -0.00104598972652 -0.000979265250886 -4.99553445198e-05
-212 -0.000582589816638 -0.000520576232594 0.000281739251061
-213 0.000606705872782 0.00123288258186 0.0012115292167
-214 -0.00109411765334 -0.000403974899613 -0.000413879753134
-215 0.000784440645626 0.000370499828387 -0.00159995470239
-216 -0.00114135205764 -0.000621043801273 0.000209110462463
-217 0.000292866115571 0.000674733105823 -0.00123803120514
-218 0.000197503784452 0.00103295455544 -0.000978965398157
-219 -0.00108589633982 -0.0013545291398 0.000996918075818
-220 -0.00145519181485 -0.00117919327731 0.000921508463856
-221 -0.000265896125434 0.000574265537144 -0.00131065999374
-222 -0.00113402426663 -0.000779238788525 0.000632993667203
-223 0.00151729984241 -0.00145499670848 0.00092428928722
-224 0.000375238557296 0.000170571801964 -0.000628490894017
-225 0.00156453424672 -0.00123792780682 0.000301299071623
-226 0.0014691719156 -0.000879706357204 0.000560364878606
-227 0.000185771791328 -0.000105231629204 -0.000625710070653
-228 -0.000183523683709 7.01042332847e-05 -0.000701119682615
-229 0.000233006195632 0.000111837272456 -0.00124870028625
-230 0.000137643864512 0.000470058722069 -0.000989634479268
-231 -0.00114575625976 0.00124453345007 0.000986248994708
-232 -0.00151505173479 0.00141986931256 0.000910839382746
-233 -0.000325756045373 1.13697037767e-05 -0.00132132907485
-234 -0.00119388418657 -0.00134213462189 0.000622324586093
-235 0.00145743992247 0.00114406588139 0.00091362020611
-236 0.000315378637357 -0.000392324031403 -0.000639159975127
-237 0.00150467432678 0.00136113478305 0.000290629990513
-238 0.00140931199566 -0.00144260219057 0.000549695797495
-239 0.000125911871389 -0.000668127462571 -0.000636379151764
-240 -0.000243383603648 -0.000492791600082 -0.000711788763725
-241 0.000173146275693 -0.000451058560911 -0.00125936936736
-242 7.77839445728e-05 -9.28371112978e-05 -0.00100030356038
-243 -0.0012056161797 0.000681637616703 0.000975579913597
-244 -0.00157491165473 0.000856973479191 0.000900170301636
-245 -0.000385615965313 -0.00055152612959 -0.00133199815596
-246 -0.000480978296432 -0.000193304679977 -0.00107293234898
-247 0.00139758000253 0.000581170048023 0.000902951124999
-248 0.000255518717418 -0.00095521986477 -0.000649829056238
-249 0.00144481440684 0.000798238949683 0.000279960909402
-250 0.00134945207572 0.0011564603993 0.000539026716385
-251 6.60519514494e-05 -0.00123102329594 -0.000647048232874
-252 -0.000303243523588 -0.00105568743345 -0.000722457844836
-253 0.000886052165832 0.000697771381004 0.000207332120804
-254 1.79240246334e-05 -0.000655732944665 -0.00101097264149
-255 -0.000492710289556 -0.00133149086462 -0.000719677021472
-256 0.00152718684856 0.000294077645824 0.000889501220525
-257 -0.000445475885252 -0.00111442196296 -0.00134266723707
-258 -0.000540838216372 -0.000756200513344 -0.00108360143009
-259 0.00133772008259 1.82742146564e-05 0.000892282043889
-260 0.000968424607557 0.000193610077145 0.000816872431927
-261 0.0013849544869 0.000235343116316 0.000269291828292
-262 0.00128959215578 0.000593564565929 0.000528357635274
-263 6.19203150999e-06 0.00136803929393 -0.000657717313984
-264 -0.000363103443527 0.00154337515642 -0.000733126925946
-265 -0.000485382498545 -0.00148968585187 -0.000295793816731
-266 0.000975752398568 3.54150898933e-05 0.00124075563667
-267 -0.0003076477257 0.000809889817894 5.46806874092e-05
-268 0.000928517994264 -0.000181653811766 -0.00129821257097
-269 0.0013450478736 -0.000139920772595 0.00131616524863
-270 -0.000355775652516 0.00138518016917 -0.000309243721205
-271 -0.000866409966705 0.000709422249214 -1.79481011886e-05
-272 -0.00040301005682 0.00116811126751 0.000313746494392
-273 0.0007862856326 -0.000240388341274 0.00124353646003
-274 -0.000914537893521 0.00128471260049 -0.000381872509803
-275 0.000964020405445 -0.00110277109475 -0.00156794745906
-276 0.00142742031533 -0.000644082076454 -0.00123625286348
-277 -0.000545242418484 0.001109376738 -0.000306462897842
-278 0.000915892478629 -0.000527480743474 0.00123008655556
-279 -0.00036750764564 0.000246993984527 4.40116062988e-05
-280 0.000868658074325 -0.000744549645133 -0.00130888165208
-281 -0.00110400465949 0.00100890916932 -0.000379091686439
-282 0.000357130237623 -0.000627948312153 0.00115745776696
-283 -0.000926269886645 0.000146526415848 -2.8617182299e-05
-284 -0.000462869976759 0.00060521543414 0.000303077413281
-285 0.00072642571266 -0.000803284174641 0.00123286737892
-286 -0.000974397813461 0.00072181676712 -0.000392541590914
-287 0.000904160485505 0.00149629149512 -0.00157861654017
-288 -0.00102163221776 0.00050474786546 0.000230448624684
-289 -0.00114575620233 0.00124549856958 0.00139722054906
-290 0.00101214844711 0.00148582721624 -0.000382079941745
-291 -0.000195255619408 -0.00106711683184 6.31071992407e-05
-292 0.000964914042804 0.00126875831458 0.000240910273852
-293 0.0014574399799 0.0011450310009 0.00132459176046
-294 -0.000319379603976 -0.000326366127718 0.00122987912362
-295 -0.00152678367049 0.000282648247432 -0.00148689215863
-296 -0.00036661400828 -0.000543435029378 -0.00130908908402
-297 0.000125911928812 -0.000667162343057 -0.000225407597412
-298 -0.000878141844981 -0.000426833696397 0.00115725033502
-299 0.000303646701657 -0.00152954509653 0.000125066906728
-300 0.00146381636387 0.000806330049896 0.00030286998134
-301 -0.000432850312193 -0.000767629911736 -0.00029803638601
-302 0.000952288527169 0.000922931382876 -0.000392749022855
-303 -0.000255115539348 0.00153194575803 5.24381181303e-05
-304 0.000905054122865 0.000705862481216 0.000230241192742
-305 0.00139758005996 0.000582135167537 0.00131392267935
-306 0.000393526286163 0.000822463814197 -0.000465377811453
-307 0.0015753148328 -0.000280247585935 -0.00149756123974
-308 -0.000426473928219 -0.00110633086274 -0.00131975816513
-309 6.60520088731e-05 -0.00123005817642 -0.000236076678523
-310 -0.000938001764921 -0.000989729529764 0.00114658125391
-311 0.000243786781718 0.00106951749334 0.000114397825618
-312 -0.000985236169225 -0.00120679843142 -0.00139238695373
-313 -0.000247787748337 0.00137375077077 0.000476321322871
-314 0.00035361967287 0.000447199925285 0.000581495608885
-315 0.00153540821951 -0.000655511474846 -0.000450687819405
-316 0.00109011668672 -0.000314715259507 0.00100459890162
-317 -0.000806549989342 0.0012732832021 0.000403692534273
-318 -0.000977908378214 -0.00136499341868 -0.000968503748989
-319 0.000976645978504 -0.000755979043525 -0.000523316608003
-320 0.000531354445715 -0.000415182828187 0.000931970113025
-321 0.00102388038281 -0.000538910141865 -0.0011463068236
-322 0.000852521993936 -1.52283394022e-05 0.000643455316372
-323 -0.00035488207258 0.000593786035748 0.00108864245736
-324 -0.000800173605369 0.000934582251087 -0.000618029244848
-325 -0.000307647668276 0.000810854937408 0.000465652241761
-326 0.000293759752931 -0.000115695908082 0.000570826527774
-327 0.00147554829957 -0.00121840730821 -0.000461356900516
-328 -0.00135893584637 0.000834114682407 -0.000690658033446
-329 -0.000866409909282 0.000710387368728 0.000393023453163
-330 -0.00103776829815 0.00123406917119 -0.000979172830099
-331 0.000916786058565 -0.00131887487689 -0.000533985689113
-332 0.000471494525776 -0.000978078661553 0.000921301031915
-333 0.000964020462868 -0.00110180597523 -0.00115697590471
-334 0.00156542788408 0.00113360160251 -0.0010518016187
-335 -0.00041474199252 3.08902023811e-05 0.00107797337625
-336 -0.000860033525308 0.00037168641772 -0.000628698325959
-337 0.000405258221863 -0.00120227354391 -0.00122960469331
-338 0.000233899832992 -0.000678591741449 0.000560157446664
-339 0.00141568837963 0.00138065528165 -0.000472025981626
-340 -0.00141879576631 0.00027121884904 -0.000701327114556
-341 -0.000926269829221 0.000147491535361 0.000382354372052
-342 -0.00109762821809 0.000671173337825 -0.000989841911209
-343 0.000856926138625 0.00128018771297 -0.000544654770224
-344 0.000411634605836 -0.00154097449492 0.000910631950804
-345 0.000904160542929 0.00149725661463 -0.00116764498582
-346 0.00150556796414 0.000570705769145 -0.00106247069981
-347 -0.000474601912459 -0.000532005630986 0.00106730429514
-348 -0.000147127635169 0.00152051635963 0.000838003162207
-349 0.000345398301924 0.00139678904596 -0.00124027377442
-350 0.000174039913052 -0.00124148757482 0.000549488365554
-351 -0.00103336415346 -0.000632473199665 0.000994675506539
-352 -0.00147865568625 -0.000291676984327 -0.000711996195667
-353 -0.00098612974916 -0.000415404298005 0.000371685290942
-354 -0.00115748813803 0.000108277504458 -0.00100051099232
-355 0.000797066218686 0.000717291879608 -0.000555323851334
-356 0.000351774685897 0.00105808809495 0.000899962869694
-357 0.000844300622989 0.000934360781268 -0.00117831406693
-358 0.0014457080442 7.8099357784e-06 -0.00107313978092
-359 -0.000534461832398 -0.00109490146435 0.00105663521403
-360 -0.000206987555108 0.000957620526267 0.000827334081096
-361 -0.00102603636245 -0.000790668186917 0.00141855871128
-362 0.00113186828699 -0.000550339540257 -0.000360741779524
-363 -0.000848301589609 0.00150890748285 -0.00139292520781
-364 0.000311868072604 0.000682824206036 -0.0012151221332
-365 0.00157715981978 -0.000891135755596 0.00134592992268
-366 -0.000199659764097 0.000799425539016 0.00125121728584
-367 -0.00140706383061 0.00140843991417 -0.00146555399641
-368 -0.000246894168401 0.000582356637356 -0.0012877509218
-369 0.000245631768691 0.000458629323677 -0.000204069435191
-370 -0.000758422005103 0.000698957970336 0.00117858849724
-371 0.000423366541536 -0.000403753429795 0.000146405068949
-372 -0.00157842221949 -0.0012298367066 0.000324208143561
-373 -0.00108589628239 -0.00135356402028 0.00140788963017
-374 0.00107200836705 -0.00111323537362 -0.000371410860634
-375 -0.000908161509548 0.000946011649479 -0.00140359428892
-376 0.000252008152665 0.000119928372669 -0.00122579121431
-377 0.00151729989984 -0.00145403158896 0.00133526084157
-378 -0.000259519684037 0.000236529705649 0.00124054820473
-379 -0.00146692375055 0.000845544080799 -0.00147622307752
-380 -0.000306754088341 1.94608039892e-05 -0.00129842000291
-381 0.000185771848752 -0.00010426650969 -0.000214738516302
-382 -0.000818281925042 0.00013606213697 0.00116791941613
-383 0.000363506621597 -0.000966649263162 0.000135735987839
-384 0.00152367628381 0.00136922588326 0.00031353906245
-385 0.00147554835699 -0.0012174421887 -5.03853461644e-05
-386 0.000471494583199 -0.00097711354204 0.00133227258627
-387 -0.000735909483317 -0.000368099166889 -0.00138449869598
-388 0.000424260178896 -0.0011941824437 -0.00120669562137
-389 0.000916786115988 -0.00131790975738 -0.000123014134762
-390 -8.72676578057e-05 -0.00107758111072 0.00125964379767
-391 0.00109452088883 0.000981665912384 0.000227460369378
-392 -0.000907267872188 0.000155582635574 0.00040526344399
-393 -0.000414741935096 3.1855321895e-05 0.0014889449306
-394 -0.00141879570889 0.000272183968554 -0.000290355560205
-395 -0.000237007162251 -0.000830527431577 -0.0013225389885
-396 0.000923162499961 0.00150534771485 -0.00114473591388
-397 -0.000973504176101 -6.86122467844e-05 0.001416316142
-398 0.00041163466326 -0.00154000937541 0.00132160350516
-399 -0.000795769403256 -0.000930995000256 -0.00139516777709
-400 0.000364400258956 0.00140488014617 -0.00121736470248
-401 0.000856926196049 0.00128115283249 -0.000133683215873
-402 -0.000147127577745 0.00152148147915 0.00124897471656
-403 0.00103466096889 0.000418770079017 0.000216791288268
-404 -0.000967127792128 -0.000407313197793 0.000394594362879
-405 -0.000474601855035 -0.000531040511472 0.00147827584949
-406 -0.00147865562883 -0.000290711864813 -0.000301024641316
-407 0.000475898727888 0.000318302510338 0.00014416249967
-408 -0.00152589003313 -0.000507780766472 0.000321965574282
-409 -0.000788441612246 -0.00108918998751 -0.000971284572352
-410 -0.000187034191038 0.00114621759024 -0.000866110286338
-411 0.000994754355601 4.35061901058e-05 0.00126366470861
-412 0.00132222863289 -0.00106593024251 0.00103436357568
-413 -0.00134720385325 -0.00118965755619 -0.00104391336095
-414 -0.00151856224212 -0.000665975753724 0.000745848779022
-415 0.000435992114595 -5.69613785736e-05 0.00119103592001
-416 -9.29941819325e-06 0.000283834836765 -0.000515635782198
-417 0.000483226518899 0.000160107523086 0.000568045704411
-418 0.00108463394011 -0.000766443322403 0.000673219990424
-419 -0.000895535936489 0.0012928037007 -0.000358963437866
-420 -0.00134082746928 -0.0015283585072 0.00109632328316
-421 -0.000848301532185 0.00150987260236 -0.000981953653463
-422 -0.000246894110977 0.00058332175687 -0.000876779367449
-423 0.000934894435661 -0.000519389643261 0.0012529956275
-424 0.00126236871295 0.00153313234736 0.00102369449456
-425 -0.00140706377319 0.00140940503368 -0.00105458244206
-426 -0.00157842216206 -0.00122887158709 0.000735179697912
-427 0.000376132194656 -0.000619857211941 0.0011803668389
-428 -6.91593381327e-05 -0.000279060996602 -0.000526304863309
-429 0.00042336659896 -0.000402788310281 0.0005573766233
-430 0.00102477402017 -0.00132933915577 0.000662550909314
-431 -0.000955395856428 0.000729907867333 -0.000369632518976
-432 -0.00140068738922 0.00107070408267 0.00108565420205
-433 -0.000135395642045 -0.00050325587896 0.000484747834702
-434 -0.000306754030917 2.04259235031e-05 -0.000887448448559
-435 -0.00151415809743 0.000629440298653 -0.000442261307574
-436 0.00120250879301 0.000970236513992 0.00101302541345
-437 -0.00146692369313 0.000846509200313 -0.00106525152317
-438 0.00152367634123 0.00137019100278 0.000724510616801
-439 0.000316272274717 -0.00118275304531 0.00116969775779
-440 -0.000129019258072 -0.000841956829969 -0.000536973944419
-441 0.00036350667902 -0.000965684143648 0.00054670754219
-442 0.000964914100228 0.0012697234341 0.000651881828204
-443 -0.00101525577637 0.000167012033966 -0.000380301600086
-444 -0.000687781499077 -0.000942424398648 -0.000609602733017
-445 -0.000195255561985 -0.00106615171233 0.000474078753592
-446 -0.000366613950856 -0.000542469909864 -0.00089811752967
-447 -0.00157401801737 6.65444652864e-05 -0.000452930388684
-448 0.00114264887307 0.000407340680625 0.00100235633234
-449 -0.00152678361307 0.000283613366946 -0.00107592060428
-450 -0.000925376191861 -0.000642937478543 -0.000970746318267
-451 0.000256412354777 0.00141630954456 0.00115902867668
-452 -0.000188879178012 -0.00140485266334 -0.000547643025529
-453 0.000303646759081 -0.00152857997701 0.000536038461079
-454 0.000905054180288 0.00070682760073 0.000641212747093
-455 -0.00107511569631 -0.000395883799401 -0.000390970681197
-456 -0.000747641419017 -0.00150532023202 -0.000620271814127
-457 -0.00156669022636 -9.1650521965e-05 -2.90471839436e-05
-458 0.000591214423078 0.000148678124694 0.00135361074849
-459 -0.00138895545352 -0.000954033275437 0.000321427320197
-460 -0.000228785791304 0.00138184187099 0.000499230394808
-461 0.00103650595587 -0.000192118090644 -0.000101675972541
-462 -0.000740313628006 0.00149844320397 -0.000196388609387
-463 0.00121424072871 -0.00105450084412 0.000248798531599
-464 -0.00078754803231 0.00128137430231 0.000426601606211
-465 -0.000295022095217 0.00115764698863 0.00151028309282
-466 -0.00129907586901 0.00139797563529 -0.000269017397984
-467 -0.000117287322372 0.000295264235157 -0.00130120082627
-468 0.00104288233984 -0.000530819041653 -0.00112339775166
-469 0.00153540827693 -0.000654546355332 -3.9716265054e-05
-470 0.000531354503139 -0.000414217708673 0.00134294166738
-471 -0.000676049563378 0.000194796666478 -0.00137382961487
-472 0.000484120098835 -0.000631286610332 -0.00119602654026
-473 0.000976646035928 -0.000755013924011 -0.000112345053652
-474 -0.000800173547945 0.000935547370601 -0.000207057690497
-475 0.00115438080877 0.00154456174575 0.000238129450489
-476 -0.000847407952249 0.000718478468941 0.0004159325251
-477 -0.000354882015157 0.000594751155262 0.00149961401171
-478 -0.00135893578895 0.000835079801921 -0.000279686479095
-479 -0.000177147242312 -0.00026763159821 -0.00131186990738
-480 0.000983022419901 -0.00109371487502 -0.00113406683277
-481 0.00109285531105 0.00144592598016 -0.000666969049506
-482 -6.9159280709e-05 -0.000278095877088 -0.000115333308957
-483 0.0012705900839 0.000583543226689 -0.000316494545366
-484 -0.000116393685013 -0.000495164778748 0.00050765690664
-485 -0.000238672740031 -0.0003662673638 0.000944990015855
-486 -0.000627921521714 -0.000378563445767 -0.000187962097555
-487 -6.09379671859e-05 -0.00122865011727 0.00129546452
-488 -0.0014479217361 0.000854600300526 -0.00104234245123
-489 -0.00157020079111 0.000983497715473 -0.000605009342019
-490 0.00120250885044 0.000971201633506 0.00142399696781
-491 -0.00139246601827 0.000121114962001 -0.000254534837878
-492 0.00115527444613 0.000754132731846 -0.00111497123983
-493 0.00103299539111 0.000883030146794 -0.000677638130616
-494 -0.000129019200648 -0.000840991710455 -0.000126002390068
-495 0.00121073016396 2.06473933219e-05 -0.000327163626476
-496 -0.000176253604952 -0.00105806061211 0.00049698782553
-497 -0.00029853265997 -0.000929163197167 0.000934320934744
-498 -0.000687781441654 -0.000941459279134 -0.000198631178665
-499 -0.000120797887125 0.0013704124726 0.00128479543888
-500 -0.00150778165604 0.000291704467159 -0.00105301153234
-501 0.00153189771218 0.000420601882106 -0.000615678423129
-502 0.0011426489305 0.000408305800139 0.0014133278867
-503 -0.000679560128131 0.00126994490392 0.00121216665029
-504 0.00109541452619 0.000191236898479 -0.00112564032094
-505 0.00121805795497 -0.00013754759393 9.67195782645e-05
-506 -0.000727688054947 -0.00131672316805 0.000848242241672
-507 -0.000160704500418 0.000995148583684 -0.000830289564012
-508 0.000781574768982 -0.000366912577557 -0.000413242319548
-509 0.000659295713964 -0.000238015162609 2.40907896667e-05
-510 0.0011027423172 3.30419112278e-05 -0.000701757116201
-511 -0.000719466741423 0.000894681015005 -0.000902918352609
-512 -0.000549953282102 0.000982852501717 0.00119871674581
-513 -0.00067223233712 0.00111174991666 -0.00152590856821
-514 0.000543980076198 -6.74256574517e-05 -0.000774385904799
-515 0.00111096363073 -0.000917512328956 0.000709040712751
-516 0.00128047709005 -0.000829340842244 -0.000351282612061
-517 -0.00123099457812 0.00101128234798 -0.0015985373568
-518 -0.000787547974886 0.00128233942182 0.000837573160562
-519 -0.000220564420358 0.000432252750317 -0.000840958645122
-520 0.000721714849043 -0.000929808410923 -0.000423911400658
-521 0.000599435794025 -0.000800910995976 1.34217085563e-05
-522 0.00104288239726 -0.000529853922139 -0.000712426197311
-523 -0.000779326661363 0.000331785181638 -0.00091358743372
-524 -0.000609813202041 0.00041995666835 0.0011880476647
-525 -0.000732092257059 0.000548854083297 -0.00153657764932
-526 0.000484120156259 -0.000630321490819 -0.000785054985909
-527 0.00105110371079 -0.00148040816232 0.000698371631641
-528 0.00122061717011 -0.00139223667561 -0.000361951693171
-529 -0.00129085449806 0.000448386514618 0.00155275198532
-530 -0.000847407894825 0.000719443588455 0.000826904079452
-531 0.000492341469782 -0.001580875731 0.000625742843043
-532 0.000661854929104 -0.00149270424429 -0.000434580481769
-533 0.000539575874086 -0.00136380682934 2.75262744592e-06
-534 0.000983022477325 -0.00109274975551 -0.000723095278422
-535 -0.000839186581302 -0.000231110651729 -0.00092425651483
-536 -0.000669673121981 -0.000142939165017 0.00117737858359
-537 -0.000791952176999 -1.40417500694e-05 -0.00154724673043
-538 0.000424260236319 -0.00119321732419 -0.00079572406702
-539 0.000991243790848 0.00111865442754 0.00068770255053
-540 -0.00122843536299 -0.000243406733697 0.00110474979499
-541 -0.001350714418 -0.000114509318749 0.00154208290421
-542 -0.000907267814765 0.000156547755088 0.000816234998341
-543 0.000432481549842 0.00101818685886 0.000615073761933
-544 0.000601995009164 0.00110635834558 -0.000445249562879
-545 0.000479715954146 0.00123525576052 -7.91645366447e-06
-546 -0.00146603005577 5.60801864084e-05 0.000743606209743
-547 -0.000899046501242 -0.000794006485096 -0.000934925595941
-548 -0.00072953304192 -0.000705834998384 0.00116670950248
-549 -7.9046286859e-05 0.00113478819184 -8.05452422623e-05
-550 0.00036440031638 0.00140584526568 -0.00080639314813
-551 0.000931383870908 0.000555758594177 0.00067703346942
-552 -0.00128829528293 -0.000806302567063 0.00109408071388
-553 0.000439809340853 0.000859991871613 0.00103895696667
-554 5.05605591698e-05 0.000847695789646 -9.39951467364e-05
-555 0.000617544113698 -2.39088185866e-06 0.00138943147081
-556 -0.000769439655213 -0.0010810988873 -0.000948375500415
-557 -0.000118952900152 0.000759524302934 0.000966328178075
-558 -0.00128096749191 -0.000964497554315 0.00151796391862
-559 5.87818726929e-05 -0.000102858450538 0.00131680268222
-560 -0.00132820189622 -0.00118156645597 -0.00102100428901
-561 -0.00145048095124 -0.00105266904103 -0.000583671179798
-562 0.00132222869031 -0.00106496512299 0.00144533513003
-563 -0.00127274617839 0.00124690662874 -0.000233196675657
-564 0.000502228475932 0.000168198623299 0.000590954776348
-565 0.000379949420914 0.000297096038246 0.00102828788556
-566 -9.29936076958e-06 0.000284799956279 -0.000104664227847
-567 0.00133045000384 0.00114643906006 -0.000305825464255
-568 -5.65337650734e-05 6.77310546192e-05 0.00051832598775
-569 -0.000178812820091 0.000196628469567 0.000955659096965
-570 -0.00134082741185 -0.00152739338768 0.00150729483751
-571 -1.07804724652e-06 -0.000665754283905 0.00130613360111
-572 -0.00138806181616 0.00141749613389 -0.00103167337012
-573 -0.00151034087118 0.00154639354884 -0.000594340260908
-574 0.00126236877038 0.00153409746687 0.00143466604892
-575 -0.00133260609833 0.000684010795368 -0.000243865756768
-576 0.000442368555992 -0.000394697210068 0.000580285695238
-577 0.000603863157015 0.000884735046531 -0.000481014051243
-578 0.000214614375332 0.000872438964564 0.00154799225858
-579 0.0013966864226 0.00137256418144 -0.000494935053564
-580 9.70265368668e-06 0.000293856176005 0.000329216398442
-581 -0.000727664894069 -0.000927458297429 0.00113094501412
-582 -0.00111691367575 -0.000939754379397 -2.00709929195e-06
-583 0.000837924181593 0.00127209661276 -0.000567563842161
-584 -0.000549059587318 0.000193388607326 0.000256587609844
-585 -0.00128642713507 -0.00102792586611 0.00105831622552
-586 0.000713516696398 0.000410010699877 -0.00155200645717
-587 -0.000493603869492 -0.000540096731198 0.0010443952232
-588 0.00128137078483 0.0015431536866 -0.00129341174803
-589 0.000544003237076 0.000321839213164 -0.000491683132353
-590 0.000154754455392 0.000309543131197 0.00153732317747
-591 0.00133682650266 0.000809668348075 -0.000505604134674
-592 0.000722608543826 0.00144268611792 -0.00136604053663
-593 -0.000787524814008 -0.0014903541308 0.00112027593301
-594 -0.00117677359569 -0.00150265021276 -1.26761804023e-05
-595 0.000778064261653 0.000709200779396 -0.000578232923272
-596 -0.000608919507258 -0.000369507226041 0.000245918528734
-597 -0.00134628705501 0.00157113672376 0.00104764714441
-598 0.000653656776458 -0.00015288513349 -0.00156267553828
-599 -0.000553463789431 -0.00110299256457 0.00103372614209
-600 0.00122151086489 0.000980257853232 -0.00130408082914
-601 0.00150183161101 0.00101298724772 -0.00140191327743
-602 -0.00121668020898 0.00128404432156 0.00103419723994
-603 0.00073815764836 0.000333936890484 0.000468640497066
-604 0.000907671107682 0.000422108377197 -0.000591682827746
-605 0.000170303559926 -0.000799206096238 0.00021004578793
-606 0.00138651597324 0.00118357675288 0.000961568451338
-607 -0.000593370402724 -0.00147825645348 -0.00108135886081
-608 0.000348908866677 0.000321640808517 -0.000664311616344
-609 -0.000388458681079 -0.000899673664918 0.000137416999332
-610 5.49879221601e-05 -0.000628616591081 -0.000588430906536
-611 -0.00115213264373 -0.00157872402216 -0.00115398764941
-612 -0.000982619184407 -0.00149055253544 0.000947647449017
-613 0.00144197169107 0.000450091414356 -0.00141258235854
-614 -0.00127654012892 0.000721148488192 0.00102352815883
-615 0.000678297728421 -0.000228958942883 0.000457971415956
-616 0.000847811187742 -0.00014078745617 -0.000602351908856
-617 0.000110443639987 -0.00136210192961 0.000199376706819
-618 0.0013266560533 0.000620680919513 0.000950899370227
-619 -0.000653230322663 0.00112080613639 -0.00109202794192
-620 0.000289048946737 -0.00024125502485 -0.000674980697454
-621 -0.000448318601018 -0.00146256949828 0.000126747918222
-622 -4.87199777935e-06 -0.00119151242445 -0.000599099987646
-623 -0.00121199256367 0.00102033856771 -0.00116465673052
-624 -0.00104247910435 0.00110851005442 0.000936978367907
-625 0.00138211177113 -0.000112804419011 -0.00142325143965
-626 -0.00133640004886 0.000158252654825 0.00101285907771
-627 0.000618437808481 -0.000791854776249 0.000447302334845
-628 0.000787951267803 -0.000703683289537 -0.000613020989967
-629 5.05837200475e-05 0.00123696066026 0.000188707625709
-630 0.00126679613337 5.77850861459e-05 0.000940230289117
-631 5.96755674761e-05 -0.000892322344929 0.000374673546247
-632 0.000229189026798 -0.000804150858217 -0.000685649778565
-633 -0.000508178520958 0.00113649309158 0.000116078837111
-634 -6.47319177188e-05 0.00140755016542 -0.000609769068757
-635 -0.00127185248361 0.000457442734344 -0.00117532581163
-636 -0.00110233902429 0.000545614221057 0.000926309286796
-637 0.00132225185119 -0.000675700252378 -0.00143392052076
-638 -0.000623494158724 0.00130708259674 -0.000682397857354
-639 0.000558577888542 -0.00135475060962 0.000436633253735
-640 0.00150085715794 0.000445146652377 0.000853680498198
-641 0.000763489610187 -0.000776167821058 -0.00150654930936
-642 0.00120693621343 -0.000505110747221 0.000929561208006
-643 -1.8435246329e-07 -0.0014552181783 0.000364004465137
-644 0.000169329106858 -0.00136704669158 -0.000696318859675
-645 -0.000568038440897 0.000573597258216 0.000105409756001
-646 -0.000124591837658 0.000844654332052 -0.000620438149867
-647 -0.00133171240355 -0.000105453099022 -0.00118599489274
-648 -0.00116219894423 -1.72816123103e-05 0.000915640205686
-649 0.000723582996894 -0.00115143170997 -0.000459675889022
-650 -0.000438431594868 0.000286504856017 9.19598515266e-05
-651 0.00151640626248 -0.000663602575058 -0.000473596891343
-652 0.000129422493566 0.00141964784274 0.000350554560663
-653 -0.00060794505419 0.000198333369304 0.00115228317634
-654 -0.000997193835873 0.000186037287337 1.93310629288e-05
-655 0.000184878211392 0.000686162504215 0.00113836217402
-656 -0.00120210555752 -0.000392545501222 -0.00119944479721
-657 0.00122248531796 0.00154809844858 -0.000397716181535
-658 0.000833236536276 0.00153580236661 -0.00153066829494
-659 -0.000373884029613 0.000585694935536 0.00106573338542
-660 0.00140109062471 -0.000493013069901 -0.00127207358581
-661 0.000663723076955 0.0014476308799 -0.000470344970133
-662 -0.000498291514808 -0.00027639097735 8.12907704163e-05
-663 0.00145654634254 -0.00122649840843 -0.000484265972453
-664 6.95625736261e-05 0.000856752009372 0.000339885479552
-665 -0.000667804974129 -0.000364562464063 0.00114161409523
-666 -0.00105705375581 -0.00037685854603 8.66198181844e-06
-667 0.000897784101532 -0.0013269659771 -0.000556894761051
-668 -0.000489199667379 0.000756284440693 0.000267256690955
-669 -0.00122656721513 -0.000465030032742 0.00106898530663
-670 0.000773376616337 0.000972906533243 -0.00154133737605
-671 -0.000433743949552 2.27991021686e-05 0.00105506430431
-672 0.00134123070477 -0.00105590890327 -0.00128274266692
-673 6.32092931068e-05 -0.00157820571175 0.00123333847677
-674 -0.000940844480687 -0.00133787706509 -0.000545962014036
-675 0.000856032558689 -0.00109037657684 0.00121941747445
-676 -0.00114575620233 0.00124549856958 0.00139722054906
-677 -0.00126831875798 -0.000228440632478 -0.000316660881105
-678 0.000889585891463 1.18880141815e-05 0.00106599705132
-679 0.000297270317684 -0.00119084414552 0.00114678868585
-680 0.0014574399799 0.0011450310009 0.00132459176046
-681 0.00133487742425 -0.000328908201157 -0.000389289669703
-682 -0.000441942159621 0.00136165309345 -0.000484002306548
-683 -0.0010342577334 0.000158920933753 -0.000403210672024
-684 0.000125911928812 -0.000667162343057 -0.000225407597412
-685 3.34937316738e-06 0.00102085687812 0.00122266939566
-686 -0.00100070440063 0.00126118552478 -0.000556631095146
-687 0.00156893844883 5.84533650739e-05 -0.000475839460622
-688 -0.000432850312193 -0.000767629911736 -0.00029803638601
-689 -0.00132817867792 -0.000791336465845 -0.000327329962216
-690 0.000829725971523 -0.000551007819185 0.00105532797021
-691 0.000237410397745 0.00140821844435 0.00113611960474
-692 0.00139758005996 0.000582135167537 0.00131392267935
-693 0.00127501750431 -0.000891804034524 -0.000399958750814
-694 0.000270963730518 -0.000651475387865 0.000982699181617
-695 -0.00109411765334 -0.000403974899613 -0.000413879753134
-696 6.60520088731e-05 -0.00123005817642 -0.000236076678523
-697 0.000961177747102 -0.00144995351056 0.00031243925058
-698 0.00078981935823 -0.000926271708097 -0.00105975703268
-699 0.000197503784452 0.00103295455544 -0.000978965398157
-700 -0.000247787748337 0.00137375077077 0.000476321322871
-701 -0.000370350303982 -0.000100188431287 -0.00123756010729
-702 0.000231057117225 -0.00102673927678 -0.00113238582128
-703 -0.00113402426663 -0.000779238788525 0.000632993667203
-704 -0.000806549989342 0.0012732832021 0.000403692534273
-705 -0.000929112544987 -0.000200655999966 -0.00131018889589
-706 -0.00110047093386 0.000323025802497 0.000479573244081
-707 0.0014691719156 -0.000879706357204 0.000560364878606
-708 0.00102388038281 -0.000538910141865 -0.0011463068236
-709 0.000901317827163 0.00114910907931 0.000301770169469
-710 0.000729959438291 -0.00148916754146 -0.00107042611379
-711 0.000137643864512 0.000470058722069 -0.000989634479268
-712 -0.000307647668276 0.000810854937408 0.000465652241761
-713 -0.000430210223922 -0.000663084264654 -0.0012482291884
-714 0.000171197197286 0.00157232331309 -0.00114305490239
-715 -0.00119388418657 -0.00134213462189 0.000622324586093
-716 -0.000866409909282 0.000710387368728 0.000393023453163
-717 -0.000988972464927 -0.000763551833333 -0.001320857977
-718 -0.0011603308538 -0.00023987003087 0.000468904162971
-719 0.00140931199566 -0.00144260219057 0.000549695797495
-720 0.000964020462868 -0.00110180597523 -0.00115697590471
-721 0.000841457907223 0.00058621324594 0.000291101088359
-722 0.00144286532843 -0.000340337599549 0.000396275374373
-723 7.77839445728e-05 -9.28371112978e-05 -0.00100030356038
-724 0.000405258221863 -0.00120227354391 -0.00122960469331
-725 -0.000490070143861 -0.00122598009802 -0.00125889826951
-726 0.000111337277346 0.00100942747972 -0.0011537239835
-727 -0.000480978296432 -0.000193304679977 -0.00107293234898
-728 -0.000926269829221 0.000147491535361 0.000382354372052
-729 -0.00104883238487 -0.0013264476667 -0.00133152705811
-730 -0.00122019077374 -0.000802765864237 0.00045823508186
-731 0.00134945207572 0.0011564603993 0.000539026716385
-732 0.000904160542929 0.00149725661463 -0.00116764498582
-733 0.000781597987284 2.33174125734e-05 0.000280432007249
-734 0.00138300540849 -0.000903233432916 0.000385606293263
-735 1.79240246334e-05 -0.000655732944665 -0.00101097264149
-736 0.000345398301924 0.00139678904596 -0.00124027377442
-737 0.000222835746279 -7.71501561061e-05 0.000207803218651
-738 5.1477357407e-05 0.000446531646357 -0.00116439306461
-739 -0.000540838216372 -0.000756200513344 -0.00108360143009
-740 -0.00098612974916 -0.000415404298005 0.000371685290942
-741 -0.00110869230481 0.00127261492317 -0.00134219613922
-742 -0.00128005069368 -0.0013656616976 0.00044756600075
-743 0.00128959215578 0.000593564565929 0.000528357635274
-744 0.000844300622989 0.000934360781268 -0.00117831406693
-745 0.000182929132986 -0.000452414045017 0.00125467663899
-746 0.00156806797235 0.00123814724959 0.00115996400214
-747 0.000975752398568 3.54150898933e-05 0.00124075563667
-748 -0.00102603636245 -0.000790668186917 0.00141855871128
-749 -0.0011485989181 0.000897351034256 -0.000295322718885
-750 0.00100930573134 0.00113767968092 0.00108733521355
-751 -0.000355775652516 0.00138518016917 -0.000309243721205
-752 0.00157715981978 -0.000891135755596 0.00134592992268
-753 0.000681831454051 -0.000914842309705 0.00131663634648
-754 -0.000322222319742 -0.000674513663046 -0.000462664144328
-755 -0.000914537893521 0.00128471260049 -0.000381872509803
-756 0.000245631768691 0.000458629323677 -0.000204069435191
-757 0.000123069213046 -0.00101530987838 0.00124400755788
-758 0.00150820805241 0.000675251416228 0.00114929492103
-759 0.000915892478629 -0.000527480743474 0.00123008655556
-760 -0.00108589628239 -0.00135356402028 0.00140788963017
-761 -0.00120845883804 0.000334455200889 -0.000305991799995
-762 0.000949445811402 0.000574783847548 0.00107666613244
-763 0.000357130237623 -0.000627948312153 0.00115745776696
-764 0.00151729989984 -0.00145403158896 0.00133526084157
-765 0.00139473734419 0.00023398763221 -0.000378620588593
-766 -0.000382082239682 -0.00123740949641 -0.000473333225438
-767 -0.000974397813461 0.00072181676712 -0.000392541590914
-768 0.000185771848752 -0.00010426650969 -0.000214738516302
-769 0.000219325181526 0.000997998081332 -0.000368158939424
-770 -0.0014814983446 -0.00063885940014 0.00116839051397
-771 0.00101214844711 0.00148582721624 -0.000382079941745
-772 0.00147554835699 -0.0012174421887 -5.03853461644e-05
-773 -0.00111220286956 -0.000814195262629 0.00124380012594
-774 0.000348932027554 0.000710905679133 -0.000381608843898
-775 -0.000319379603976 -0.000326366127718 0.00122987912362
-776 0.000916786115988 -0.00131790975738 -0.000123014134762
-777 0.000718227502591 0.000535569816645 -0.000306199231937
-778 -0.00098259602353 -0.00110128766483 0.00123035022146
-779 -0.000878141844981 -0.000426833696397 0.00115725033502
-780 -0.000414741935096 3.1855321895e-05 0.0014889449306
-781 0.000159465261586 0.000435102247965 -0.000378828020535
-782 -0.00154135826453 -0.00120175523351 0.00115772143286
-783 0.000952288527169 0.000922931382876 -0.000392749022855
-784 -0.000973504176101 -6.86122467844e-05 0.001416316142
-785 -0.0011720627895 -0.001377091096 0.00123313104483
-786 0.000289072107615 0.000148009845766 -0.000392277925009
-787 0.000393526286163 0.000822463814197 -0.000465377811453
-788 0.000856926196049 0.00128115283249 -0.000133683215873
-789 0.00143113339273 -0.00147755866467 0.00116050225623
-790 -0.00026969013339 4.75422770868e-05 -0.000464906713607
-791 -0.000938001764921 -0.000989729529764 0.00114658125391
-792 -0.000474601855035 -0.000531040511472 0.00147827584949
-793 0.00111729363552 0.00112625028252 -0.00128905816561
-794 0.000249165494322 -0.000227254043145 0.000654595495329
-795 0.00035361967287 0.000447199925285 0.000581495608885
-796 -0.000788441612246 -0.00108918998751 -0.000971284572352
-797 -0.000214234415563 -0.000685943061437 0.000322900899749
-798 -0.000309596746683 -0.000327721611825 0.000581966706731
-799 -0.000977908378214 -0.00136499341868 -0.000968503748989
-800 -0.00134720385325 -0.00118965755619 -0.00104391336095
-801 -0.00154576246665 0.000663822017836 -0.00122709845812
-802 0.00152083362547 0.00102204346745 -0.000968032651142
-803 0.000852521993936 -1.52283394022e-05 0.000643455316372
-804 0.000483226518899 0.000160107523086 0.000568045704411
-805 0.00105743371558 0.000563354449156 -0.00129972724672
-806 0.000189305574383 -0.000790149876512 0.000643926414219
-807 0.000293759752931 -0.000115695908082 0.000570826527774
-808 -0.000848301532185 0.00150987260236 -0.000981953653463
-809 -0.000274094335503 -0.0012488388948 0.000312231818638
-810 -0.000369456666623 -0.000890617445191 0.000571297625621
-811 -0.00103776829815 0.00123406917119 -0.000979172830099
-812 -0.00140706377319 0.00140940503368 -0.00105458244206
-813 0.00155633603665 0.000100926184469 -0.00123776753924
-814 0.00146097370553 0.000459147634082 -0.000978701732253
-815 0.00156542788408 0.00113360160251 -0.0010518016187
-816 0.00042336659896 -0.000402788310281 0.0005573766233
-817 0.000997573795642 4.58615789525e-07 -0.00131039632783
-818 0.000902211464522 0.000358680065402 -0.00105133052085
-819 0.000233899832992 -0.000678591741449 0.000560157446664
-820 -0.000135395642045 -0.00050325587896 0.000484747834702
-821 -0.000333954255442 0.00135022369506 0.000301562737528
-822 -0.000429316586562 -0.00145351327856 0.00056062854451
-823 -0.00109762821809 0.000671173337825 -0.000989841911209
-824 -0.00146692369313 0.000846509200313 -0.00106525152317
-825 -0.000892716496447 0.00124975612638 0.00022893394893
-826 0.00140111378559 -0.000103748199285 -0.000989370813363
-827 0.00150556796414 0.000570705769145 -0.00106247069981
-828 0.00036350667902 -0.000965684143648 0.00054670754219
-829 0.000937713875703 -0.000562437217577 -0.00132106540894
-830 0.000842351544583 -0.000204215767964 -0.00106199960196
-831 0.000174039913052 -0.00124148757482 0.000549488365554
-832 -0.000195255561985 -0.00106615171233 0.000474078753592
-833 -0.000393814175382 0.000787327861696 0.000290893656417
-834 -0.000489176506501 0.00114554931131 0.0005499594634
-835 -0.00115748813803 0.000108277504458 -0.00100051099232
-836 -0.00152678361307 0.000283613366946 -0.00107592060428
-837 -0.000952576416387 0.000686860293016 0.00021826486782
-838 0.00134125386565 -0.000666644032652 -0.00100003989447
-839 0.0014457080442 7.8099357784e-06 -0.00107313978092
-840 0.000303646759081 -0.00152857997701 0.000536038461079
-841 -0.000433720788675 0.000412063972785 0.00133776707676
-842 0.00102741410844 -0.00122479350869 -0.00028764189308
-843 0.00113186828699 -0.000550339540257 -0.000360741779524
-844 -0.00156669022636 -9.1650521965e-05 -2.90471839436e-05
-845 -0.00099248302968 0.000311596404105 0.00126513828816
-846 0.000468651867433 -0.00132526107737 -0.000360270681678
-847 -0.000199659764097 0.000799425539016 0.00125121728584
-848 0.00103650595587 -0.000192118090644 -0.000101675972541
-849 0.00083794734247 -0.00150059693986 -0.000284861069716
-850 -0.000862876183651 2.45040019062e-05 0.00125168838368
-851 -0.000758422005103 0.000698957970336 0.00117858849724
-852 -0.000295022095217 0.00115764698863 0.00151028309282
-853 0.000279185101465 0.0015608939147 -0.000357489858314
-854 -0.00142163842466 -7.59635667733e-05 0.00117905959509
-855 0.00107200836705 -0.00111323537362 -0.000371410860634
-856 0.00153540827693 -0.000654546355332 -3.9716265054e-05
-857 -0.00105234294962 -0.000251299429262 0.00125446920705
-858 0.000408791947494 0.0012738015125 -0.000370939762788
-859 -0.000259519684037 0.000236529705649 0.00124054820473
-860 0.000976646035928 -0.000755013924011 -0.000112345053652
-861 0.000778087422531 0.00109846565001 -0.000295530150826
-862 -0.00092273610359 -0.000538391831461 0.00124101930257
-863 -0.000818281925042 0.00013606213697 0.00116791941613
-864 -0.000354882015157 0.000594751155262 0.00149961401171
-865 -0.000321328682383 -0.00146494267695 0.00134619358859
-866 0.00106381015698 0.000225618617662 0.00125148095174
-867 0.000471494583199 -0.00097711354204 0.00133227258627
-868 -0.00153029417782 0.00135876160438 0.00151007566088
-869 0.00150910168977 -0.000115177597677 -0.000203805769287
-870 0.000505047915973 0.000125151048982 0.00117885216314
-871 -8.72676578057e-05 -0.00107758111072 0.00125964379767
-872 0.00107290200441 0.00125829403571 0.00143744687228
-873 0.000950339448762 -0.000215645166356 -0.000276434557885
-874 -0.000826480135111 0.00147491612826 -0.00037114719473
-875 -0.00141879570889 0.000272183968554 -0.000290355560205
-876 -0.000258626046677 -0.000553899308256 -0.000112552485593
-877 -0.000381188602322 0.00113411991292 0.00133552450748
-878 -0.00138524237612 0.00137444855958 -0.000443775983327
-879 0.00041163466326 -0.00154000937541 0.00132160350516
-880 0.00157180432547 0.000795865771018 0.00149940657977
-881 0.00144924176983 -0.000678073431044 -0.000214474850397
-882 0.000445187996034 -0.000437744784385 0.00116818308203
-883 -0.000147127577745 0.00152148147915 0.00124897471656
-884 0.00101304208447 0.000695398202338 0.00142677779117
-885 0.000890479528822 -0.000778540999723 -0.000287103638995
-886 -0.00088634005505 0.000912020294889 -0.00038181627584
-887 -0.00147865562883 -0.000290711864813 -0.000301024641316
-888 -0.000318485966617 -0.00111679514162 -0.000123221566704
-889 0.000576639771612 -0.00133669047576 0.000425294362399
-890 0.000405281382741 -0.000813008673296 -0.000946901920863
-891 -0.000187034191038 0.00114621759024 -0.000866110286338
-892 -0.000632325723827 0.00148701380558 0.00058917643469
-893 -0.000754888279472 1.30746035142e-05 -0.00112470499547
-894 -0.000926246668343 0.000536756405978 0.000665057144498
-895 -0.00151856224212 -0.000665975753724 0.000745848779022
-896 0.00119810464832 -0.000325179538385 -0.000960822923184
-897 0.00107554209268 0.00136283968279 0.000487254069886
-898 -0.00148500890935 0.000436288837298 0.0005924283559
-899 0.00108463394011 -0.000766443322403 0.000673219990424
-900 0.000639342407318 -0.000425647107065 -0.00103345171178
-901 0.000516779851673 0.00126237211411 0.000414625281288
-902 0.000345421462801 -0.00137590450666 -0.000957571001973
-903 -0.000246894110977 0.00058332175687 -0.000876779367449
-904 -0.000692185643766 0.000924117972209 0.000578507353579
-905 -0.000814748199411 -0.000549821229853 -0.00113537407659
-906 -0.000213340778204 -0.00147637207534 -0.00103019979057
-907 -0.00157842216206 -0.00122887158709 0.000735179697912
-908 -0.00125094788477 0.000823650403529 0.000505878564981
-909 0.00101568217274 0.000799943849421 0.000476584988776
-910 -0.00154486882929 -0.000126606996069 0.00058175927479
-911 0.00102477402017 -0.00132933915577 0.000662550909314
-912 0.000579482487379 -0.000988542940431 -0.00104412079289
-913 0.000456919931733 0.000699476280741 0.000403956200178
-914 0.000285561542862 0.0012231580832 -0.000968240083084
-915 -0.000306754030917 2.04259235031e-05 -0.000887448448559
-916 -0.000752045563706 0.000361222138842 0.000567838272469
-917 -0.000874608119351 -0.00111271706322 -0.0011460431577
-918 -0.000273200698143 0.00112269051453 -0.00104086887168
-919 0.00152367634123 0.00137019100278 0.000724510616801
-920 -0.00131080780471 0.000260754570162 0.000495209483871
-921 -0.00143337036036 -0.0012131846319 -0.00121867194629
-922 0.00155722967401 -0.000689502829436 0.000571090193679
-923 0.000964914100228 0.0012697234341 0.000651881828204
-924 0.000519622567439 -0.0015514387738 -0.001054789874
-925 0.000397060011794 0.000136580447374 0.000393287119067
-926 0.000225701622923 0.000660262249838 -0.000978909164194
-927 -0.000366613950856 -0.000542469909864 -0.00089811752967
-928 -0.000811905483645 -0.000201673694525 0.000557169191359
-929 -0.00093446803929 0.00148634552665 -0.00115671223881
-930 -0.000333060618083 0.000559794681158 -0.00105153795279
-931 -0.000925376191861 -0.000642937478543 -0.000970746318267
-932 -0.00137066772465 -0.000302141263205 0.000484540402761
-933 -0.0014932302803 0.00138587795797 -0.0012293410274
-934 0.00149736975407 -0.0012523986628 0.000560421112569
-935 0.000905054180288 0.00070682760073 0.000641212747093
-936 0.0004597626475 0.00104762381607 -0.00106545895511
-937 -0.000974374652583 0.00111108163774 -0.000109838818468
-938 0.00118352999686 0.0013514102844 0.00127281911396
-939 0.000591214423078 0.000148678124694 0.00135361074849
-940 -0.00141057433794 -0.000677405152116 0.0015314138231
-941 -0.00153313689359 0.00101061406906 -0.000182467607066
-942 0.000624767755852 0.00125094271572 0.00120019032536
-943 -0.000740313628006 0.00149844320397 -0.000196388609387
-944 0.000419856034207 0.000672359927158 -1.85855347749e-05
-945 0.000297293478562 -0.000801579274904 0.00142949145829
-946 -0.000706760295232 -0.000561250628245 -0.000349809032509
-947 -0.00129907586901 0.00139797563529 -0.000269017397984
-948 -0.000138906206798 0.000571892358478 -9.12143233727e-05
-949 -0.000261468762444 -0.000902046843583 0.0013568626697
-950 0.00112367007692 0.000788514451029 0.00126215003285
-951 0.000531354503139 -0.000414217708673 0.00134294166738
-952 -0.00147043425788 -0.00124030098548 0.00152074474199
-953 0.00156896160971 0.00044771823569 -0.000193136688176
-954 0.000564907835913 0.000688046882349 0.00118952124425
-955 -0.000800173547945 0.000935547370601 -0.000207057690497
-956 0.000359996114267 0.000109464093791 -2.92546158853e-05
-957 0.000237433558622 -0.00136447510827 0.00141882237718
-958 -0.000766620215172 -0.00112414646161 -0.000360478113619
-959 -0.00135893578895 0.000835079801921 -0.000279686479095
-960 -0.000198766126738 8.99652511117e-06 -0.000101883404483
-961 -0.000861982546291 -0.000765925011999 -0.000101412306637
-962 0.00052315629307 0.000924636282613 -0.000196124943482
-963 -6.9159280709e-05 -0.000278095877088 -0.000115333308957
-964 0.0010910103815 -0.0011041791539 6.24697656544e-05
-965 0.000968447825859 0.000583840067275 0.00151054675872
-966 -3.56059479354e-05 0.000824168713934 -0.00026875373208
-967 -0.000627921521714 -0.000378563445767 -0.000187962097555
-968 0.000532248140498 -0.00120464672258 -1.01590229434e-05
-969 0.000409685584853 0.000483372498595 0.00143791797013
-970 -0.00136713399902 -0.000988024630027 0.00134320533328
-971 0.00120250885044 0.000971201633506 0.00142399696781
-972 -0.000799279910586 0.000145118356696 -0.00156015838082
-973 -0.000921842466231 -0.00132882084537 -0.000112081387747
-974 0.00123606218321 -0.00108849219871 0.00127057654468
-975 -0.000129019200648 -0.000840991710455 -0.000126002390068
-976 0.00103115046156 0.00149488343597 5.1800684544e-05
-977 0.000908587905919 2.09442339079e-05 0.00149987767761
-978 -9.54658678748e-05 0.000261272880567 -0.00027942281319
-979 -0.000687781441654 -0.000941459279134 -0.000198631178665
-980 0.000472388220559 0.00139441586729 -2.08281040538e-05
-981 0.000349825664914 -7.95233347716e-05 0.00142724888902
-982 -0.00142699391896 -0.00155092046339 0.00133253625217
-983 0.0011426489305 0.000408305800139 0.0014133278867
-984 -0.000859139830525 -0.000417777476671 -0.00157082746193
-985 3.59859077038e-05 -0.000637672810807 -0.00102231153282
-986 -0.000135372481168 -0.000113991008344 0.000767450607148
-987 -0.000727688054947 -0.00131672316805 0.000848242241672
-988 -0.00117297958774 -0.000975926952707 -0.000858429460534
-989 -0.00129554214338 0.000712092268466 0.000589647532536
-990 -0.00146690053225 0.00123577407093 -0.000782548750726
-991 0.0011027423172 3.30419112278e-05 -0.000701757116201
-992 0.000657450784415 0.000373838126567 0.000753529604827
-993 0.00053488822877 -0.00110010107549 -0.000960351825337
-994 0.00113629564998 0.00113530650225 -0.000855177539323
-995 0.000543980076198 -6.74256574517e-05 -0.000774385904799
-996 9.86885434095e-05 0.000273370557887 0.000680900816229
-997 -2.38740122356e-05 -0.00120056864417 -0.00103298061393
-998 -0.000195232401107 -0.000676886841711 0.000756781526037
-999 -0.000787547974886 0.00128233942182 0.000837573160562
-1000 -0.00123283950767 -0.00153882278607 -0.000869098541644
-1001 -0.00135540206332 0.000149196435099 0.000578978451426
-1002 -0.000753994642112 -0.000777354410391 0.00068415273744
-1003 0.00104288239726 -0.000529853922139 -0.000712426197311
-1004 0.00137035667455 0.00152266806848 -0.000941727330242
-1005 0.00124779411891 4.87288664195e-05 0.000506349662828
-1006 0.00107643573004 0.000572410668883 -0.000865846620434
-1007 0.000484120156259 -0.000630321490819 -0.000785054985909
-1008 3.88286234701e-05 -0.00028952527548 0.000670231735119
-1009 -8.3733932175e-05 0.00139849394569 -0.00104364969505
-1010 -0.000255092321047 -0.00123978267508 0.000746112444927
-1011 -0.000847407894825 0.000719443588455 0.000826904079452
-1012 -0.00129269942761 0.00106023980379 -0.000879767622754
-1013 -0.00141526198326 -0.000413699398268 0.000568309370315
-1014 -0.000813854562052 -0.00134025024376 0.000673483656329
-1015 0.000983022477325 -0.00109274975551 -0.000723095278422
-1016 0.00131049675461 0.000959772235114 -0.000952396411352
-1017 0.00118793419897 -0.000514166966947 0.000495680581718
-1018 0.0010165758101 9.51483551592e-06 -0.000876515701544
-1019 0.000424260236319 -0.00119321732419 -0.00079572406702
-1020 -2.10312964693e-05 -0.000852421108847 0.000659562654009
-1021 -0.000143593852114 0.000835598112326 -0.00105431877616
-1022 -0.000314952240986 0.00135927991479 0.000735443363817
-1023 -0.000907267814765 0.000156547755088 0.000816234998341
-1024 -0.000579793537475 -0.000952888677526 0.000586933865411
-1025 -0.0014751219032 -0.000976595231635 0.000557640289205
-1026 -0.000873714481991 0.00125881234611 0.000662814575219
-1027 -0.00146603005577 5.60801864084e-05 0.000743606209743
-1028 0.00125063683468 0.000396876401747 -0.000963065492463
-1029 0.00112807427903 -0.00107706280031 0.000485011500607
-1030 0.000956715890159 -0.000553380997851 -0.000887184782655
-1031 0.00036440031638 0.00140584526568 -0.00080639314813
-1032 -8.08912164088e-05 -0.00141531694221 0.000648893572898
-1033 -0.000742262706413 0.000359866654735 -8.00741444158e-05
-1034 0.000642876132949 -0.00111153047389 -0.000174786781261
-1035 5.05605591698e-05 0.000847695789646 -9.39951467364e-05
-1036 0.00121073022138 2.16125128359e-05 8.38079278752e-05
-1037 0.00108816766574 -0.00145232668923 0.00153188492094
-1038 8.41138919435e-05 -0.00121199804257 -0.000247415569859
-1039 -0.00128096749191 -0.000964497554315 0.00151796391862
-1040 -0.000120797829702 0.00137137759211 -0.00146619143
-1041 -0.000243360385347 -0.000102561609952 -1.81144369284e-05
-1042 -0.00124741415914 0.000137767036707 0.0013645434955
-1043 0.00132222869031 -0.00106496512299 0.00144533513003
-1044 -0.000679560070707 0.00127091002343 -0.0015388202186
-1045 -0.000802122626352 -0.000203029178632 -9.07432255262e-05
-1046 0.000583016213009 0.00148753211598 -0.000185455862371
-1047 -9.29936076958e-06 0.000284799956279 -0.000104664227847
-1048 0.00115087030144 -0.000541283320531 7.31388467648e-05
-1049 0.0010283077458 0.00114673590064 0.00152121583983
-1050 2.42539720041e-05 0.0013870645473 -0.000258084650969
-1051 -0.00134082741185 -0.00152739338768 0.00150729483751
-1052 -0.000180657749641 0.000808481758742 -0.00147686051111
-1053 -0.000303220305286 -0.000665457443319 -2.87835180388e-05
-1054 -0.00130727407908 -0.00042512879666 0.00135387441439
-1055 0.00126236877038 0.00153409746687 0.00143466604892
-1056 -0.000739419990646 0.000708014190063 -0.00154948929971
-1057 0.00114451702092 0.00018571738158 0.00096659184398
-1058 0.00075526823924 0.000173421299612 -0.000166360269429
-1059 -0.00122461813673 0.00067354651649 0.00095267084166
-1060 0.000550356517595 -0.000405161488946 -0.00138513612957
-1061 -0.00018701103016 0.00153548246085 -0.000583407513893
-1062 -0.000576259811844 0.00152318637889 0.00144559879593
-1063 0.0013785780455 0.000573078947811 0.000880042053062
-1064 -8.40572341002e-06 -0.000505629057626 -0.00145776491817
-1065 -0.000745773271166 0.00143501489217 -0.000656036302491
-1066 0.00125417056031 -0.000289006965075 -0.000104400561942
-1067 4.70499944168e-05 -0.00123911439615 -0.000669957304812
-1068 -0.00133993377449 0.000844136021648 0.000154194147194
-1069 0.00108465710098 -0.000377178451787 0.00095592276287
-1070 0.000695408319301 -0.000389474533755 -0.00017702935054
-1071 -0.00128447805667 0.000110650683123 0.000942001760549
-1072 0.000490496597656 -0.000968057322313 -0.00139580521068
-1073 -0.0002468709501 0.000972586627486 -0.000594076595003
-1074 -0.000636119731783 0.000960290545519 0.00143492971482
-1075 0.00131871812556 1.01831144439e-05 0.000869372971951
-1076 -6.82656433494e-05 -0.00106852489099 -0.00146843399928
-1077 -0.000805633191105 0.000872119058807 -0.000666705383601
-1078 0.00119431064037 -0.000851902798442 -0.000115069643052
-1079 -1.28099255226e-05 0.00135994819372 -0.000680626385922
-1080 -0.00139979369443 0.000281240188281 0.000143525066084
-1081 -0.00111947294832 0.000313969582771 4.56926177923e-05
-1082 -0.000676026345076 0.000585026656608 -0.000680155288075
-1083 0.00127881151227 -0.000365080774467 -0.00124571203094
-1084 0.00144832497159 -0.000276909287755 0.000855923067477
-1085 0.000710957423835 -0.00149822376119 -0.00150430674008
-1086 -0.00123478858608 0.000484559087928 -0.000752784076673
-1087 -5.27165388156e-05 0.000984684304806 0.000366247034416
-1088 0.000889562730585 -0.000377376856435 0.000783294278879
-1089 -0.000620570627249 -0.000148458681917 0.00010765232528
-1090 0.000595641786069 -0.00132763425603 0.000859174988688
-1091 -0.000611478779821 0.000884216736127 0.000293618245818
-1092 -0.000441965320499 0.000972388222839 -0.000766705078994
-1093 -0.00117933286825 -0.000248926250596 3.50235366819e-05
-1094 -0.000735886265016 2.21308232406e-05 -0.000690824369186
-1095 0.00121895159233 -0.000927976607834 -0.00125638111206
-1096 0.00138846505165 -0.000839805121122 0.000845253986367
-1097 0.000651097503895 0.00110083882868 -0.00151497582119
-1098 -0.00129464850602 -7.83367454388e-05 -0.000763453157784
-1099 -0.000112576458755 0.000421788471439 0.000355577953305
-1100 0.000829702810646 -0.000940272689801 0.000772625197769
-1101 9.23352628902e-05 0.00100037126 -0.00158760460979
-1102 0.000535781866129 0.00127142833383 0.000848505907577
-1103 -0.00067133869976 0.00032132090276 0.000282949164708
-1104 -0.000501825240438 0.000409492389472 -0.000777374160104
-1105 -0.00123919278819 -0.000811822083963 2.43544555715e-05
-1106 -0.000795746184955 -0.000540765010126 -0.000701493450296
-1107 0.00115909167239 -0.0014908724412 -0.00126705019317
-1108 0.00132860513171 -0.00140270095449 0.000834584905257
-1109 0.000591237583956 0.00053794299531 -0.0015256449023
-1110 -0.00135450842596 -0.000641232578806 -0.000774122238894
-1111 0.000600329431385 0.00157061841335 -0.00133967898176
-1112 0.000769842890706 -0.00150316852317 0.000761956116659
-1113 3.24753429508e-05 0.000437475426631 -0.0015982736909
-1114 0.00047592194619 0.000708532500468 0.000837836826467
-1115 -0.0007311986197 -0.000241574930607 0.000272280083597
-1116 -0.000561685160378 -0.000153403443895 -0.000788043241215
-1117 -0.00129905270813 -0.00137471791733 1.36853744611e-05
-1118 -8.28402948155e-05 0.000608064931788 0.000765208037869
-1119 0.00109923175245 0.00110819014867 -0.00127771927428
-1120 -0.00112044740138 -0.000253871012575 -0.000860672029812
-1121 0.000531377664017 -2.49528380566e-05 -0.00153631398341
-1122 -0.0014143683459 -0.00120412841217 -0.000784791320004
-1123 0.000540469511445 0.00100772257999 -0.00135034806287
-1124 0.000709982970767 0.0010958940667 0.000751287035548
-1125 -2.73845769886e-05 -0.000125420406736 0.00155301565122
-1126 0.00041606202625 0.000145636667101 0.000827167745356
-1127 -0.000791058539639 -0.000804470763974 0.000261611002487
-1128 -0.000621545080317 -0.000716299277262 -0.000798712322325
-1129 0.0012642368608 0.00131150904831 0.000987930006201
-1130 0.00010222226904 -0.000412512808935 0.00153956574675
-1131 -0.00110489829685 -0.00136262024001 0.00097400900388
-1132 0.000670076357474 0.000720630177788 -0.00136379796735
-1133 -6.72911902816e-05 -0.000500684295647 -0.000562069351672
-1134 -0.000456539971965 -0.000512980377615 0.00146693695815
-1135 0.000725532075301 -1.28551607367e-05 -0.000575990353993
-1136 -0.00066145169361 -0.00109156316617 0.000248161098013
-1137 -0.00139881924137 0.000849080783626 0.00104988971369
-1138 0.00137389040018 0.000836784701659 -8.30623997213e-05
-1139 0.000166769834296 -0.000113322729416 -0.000648619142591
-1140 -0.00122021393462 -0.00119203073485 0.000175532309415
-1141 0.00120437694086 0.000748613214947 0.000977260925091
-1142 4.23623491008e-05 -0.000975408642302 0.00152889666564
-1143 -0.00116475821679 0.00123644234986 0.00096333992277
-1144 0.000610216437535 0.000157734344421 -0.00137446704846
-1145 -0.000127151110221 -0.00106358012901 -0.000572738432783
-1146 -0.000516399891904 -0.00107587621098 0.00145626787704
-1147 0.000665672155361 -0.000575750994104 -0.000586659435103
-1148 5.14541965294e-05 5.72667757412e-05 -0.00144709583706
-1149 -0.00145867916131 0.000286184950259 0.00103922063258
-1150 0.00131403048025 0.000273888868292 -9.37314808317e-05
-1151 0.000106909914356 -0.000676218562783 -0.000659288223701
-1152 -0.00128007385455 0.00140703185501 0.000164863228305
-1153 0.00127061335962 0.000974738336333 0.000788151335782
-1154 0.00088136457794 0.000962442254365 -0.000344800777627
-1155 -0.00101968313936 -0.00151863400854 0.000114134159713
-1156 0.000755291514965 0.000564616409256 0.000938285611719
-1157 0.000711851118618 0.000874270767653 0.000715522547185
-1158 0.000322602336935 0.000861974685686 -0.000417429566225
-1159 -0.00157844538036 0.00154285684601 4.15053711151e-05
-1160 0.00019652927396 0.000464148840577 0.000865656823121
-1161 -0.000619676932466 -0.000937922576307 -0.000834476810689
-1162 -0.00100892571415 -0.000950218658275 0.00119452949914
-1163 0.000251984991787 -0.000269336497947 -0.00150849398676
-1164 -0.00113499877712 -0.00134804450338 -0.000684342534753
-1165 -0.00117843917347 -0.00103839014499 -0.000907105599287
-1166 0.000821504658 0.000399546420999 -0.000355469858738
-1167 -0.0010795430593 0.00108042858133 0.000103465078603
-1168 0.000695431595026 1.72057588936e-06 0.000927616530608
-1169 0.000651991198679 0.000311374934286 0.000704853466074
-1170 0.000262742416995 0.000299078852319 -0.000428098647336
-1171 0.00152365312293 0.000979961012646 3.08362900047e-05
-1172 0.000136669354021 -9.87469927901e-05 0.00085498774201
-1173 -0.000679536852406 -0.00150081840967 -0.000845145891799
-1174 -0.00106878563409 -0.00151311449164 0.00118386041803
-1175 0.000192125071848 -0.000832232331314 -0.00151916306787
-1176 -0.00119485869706 0.00125101808648 -0.000695011615863
-1177 -0.000993376609616 0.00110299053752 -0.000132747890406
-1178 0.000222835803702 -7.61850365921e-05 0.000618774773002
-1179 0.00148374650964 0.000604697123735 0.00107770971034
-1180 -0.00150869845427 0.000692868610447 1.73863855306e-05
-1181 -0.00155213885062 0.00100252296884 -0.000205376679003
-1182 -0.00110869224738 0.00127358004268 -0.000931224584871
-1183 0.000152218458555 -0.00120749622023 -0.000472289647531
-1184 0.00109449772796 0.000592401041768 -5.52424030672e-05
-1185 0.000278291521529 -0.000809670375116 0.00140658238636
-1186 0.00149450393485 0.001173112474 -0.00100385337347
-1187 -0.000406543782451 -0.00130796378891 -0.000544918436129
-1188 -0.000237030323129 -0.00121979230219 0.00155671666229
-1189 -0.00105323652956 0.000540094704157 -0.000143416971516
-1190 0.000162975883763 -0.000639080869959 0.000608105691892
-1191 0.0014238865897 4.18012903683e-05 0.00106704062923
-1192 -0.00156855837421 0.00012997277708 6.71730442021e-06
-1193 0.00154995965267 0.000439627135478 -0.000216045760114
-1194 -0.00116855216732 0.000710684209314 -0.000941893665982
-1195 9.23585386152e-05 0.00139156636964 -0.000482958728641
-1196 0.00103463780802 2.9505208401e-05 -6.59114841776e-05
-1197 0.00021843160159 -0.00137256620848 0.00139591330525
-1198 0.00143464401491 0.000610216640635 -0.00101452245458
-1199 -0.00046640370239 0.00129109880096 -0.000555587517239
-1200 -0.000296890243068 0.00137927028767 0.00154604758118
-1201 -0.000340330639416 -0.00147303377716 0.00132328451665
-1202 0.000103115963823 -0.00120197670333 0.000597436610781
-1203 0.00136402666976 -0.000521094542999 0.00105637154812
-1204 0.00153354012908 -0.000432923056286 -3.95177669019e-06
-1205 0.00149009973273 -0.000123268697889 -0.000226714841224
-1206 -0.00122841208726 0.000147788375947 -0.000952562747092
-1207 0.000805264428755 -0.000621562111678 0.000983742759524
-1208 0.000974777888077 -0.000533390624966 -7.6580565288e-05
-1209 0.00015857168165 0.00122649638138 0.00138524422414
-1210 0.00137478409497 4.73208072679e-05 -0.00102519153569
-1211 -0.000526263622329 0.000728202967595 -0.000566256598349
-1212 -0.000356750163008 0.000816374454307 0.00153537850007
-1213 -0.000400190559355 0.0011260288127 0.00131261543554
-1214 4.3256043884e-05 0.00139708588654 0.000586767529671
-1215 0.00130416674982 -0.00108399037637 0.00104570246701
-1216 -0.000915512404013 0.000715906885628 0.00146274971147
-1217 0.00143023981279 -0.000686164531256 -0.000237383922335
-1218 -0.000515506197121 0.00129661831786 0.000514138741073
-1219 0.000745404508815 -0.00118445794504 0.000973073678414
-1220 0.000914917968137 -0.00109628645833 -8.72496463984e-05
-1221 9.87117617108e-05 0.000663600548017 0.00137457514303
-1222 0.00131492417503 -0.000515575026099 -0.0010358606168
-1223 -0.000586123542269 0.000165307134228 -0.00057692567946
-1224 -0.000416610082947 0.000253478620941 0.00152470941896
-1225 0.0013903331995 -0.00106142842017 0.000809489498003
-1226 0.00100108441782 -0.00107372450213 -0.000323462615407
-1227 -0.000899963299479 -0.000392842341807 0.000135472321934
-1228 0.000875011354844 -0.00147155034724 0.000959623773939
-1229 0.000831570958497 -0.00116189598885 0.000736860709405
-1230 -0.000330443633266 0.000276040577139 0.00128849644995
-1231 0.000930467072671 0.000956922737466 -0.00141452703594
-1232 -0.00045651669624 -0.000121785267971 -0.000590375583934
-1233 -0.000499957092587 0.000187869090426 -0.000813138648468
-1234 -0.000889205874271 0.000175573008459 0.00121586766136
-1235 0.000371704831666 0.000856455168786 -0.00148715582454
-1236 -0.00101527893725 -0.00022225283665 -0.000663004372532
-1237 0.00133047327956 0.0015376341697 0.000798820416893
-1238 0.000941224497879 0.00152533808773 -0.000334131696517
-1239 -0.000959823219418 -0.000955738175174 0.000124803240823
-1240 0.000815151434905 0.00112751224262 0.000948954692829
-1241 0.000771711038557 0.00143716660102 0.000726191628295
-1242 -0.000390303553205 -0.000286855256228 0.00127782736884
-1243 0.000870607152732 0.000394026904099 -0.00142519611705
-1244 0.0002563891939 0.00102704467394 0.000876325904231
-1245 -0.000559817012527 -0.000375026742941 -0.000823807729578
-1246 -0.00094906579421 -0.000387322824908 0.00120519858025
-1247 0.000311844911726 0.000293559335419 -0.00149782490565
-1248 -0.00107513885718 -0.000785148670017 -0.000673673453642
-1249 0.00150272530579 0.000223523353332 0.000817916009835
-1250 -0.000274094278079 -0.00124787377529 0.000723203372989
-1251 -0.00156033700327 -0.00081961634359 -0.00133347173551
-1252 -0.000400167341054 0.00151625880283 -0.0011556686609
-1253 0.00017119725471 0.0015732884326 -0.000732083348039
-1254 -0.000832856519084 -0.00134834134397 0.000650574584392
-1255 0.00104285917896 -0.000920083912269 -0.00140610052411
-1256 -0.000958929582059 0.00141579123415 -0.0012282974495
-1257 -0.00116033079637 -0.000238904911356 0.000879875717322
-1258 0.000997573853066 1.42373530345e-06 -0.000899424773482
-1259 -0.000288668872122 0.000429681167004 0.000205858541253
-1260 0.000871500790091 -0.000396402109806 0.000383661615864
-1261 0.00144286538585 -0.000339372480035 0.000807246928724
-1262 -0.000333954198019 0.00135118881458 0.000712534291879
-1263 0.00154176150003 -0.00138251217696 -0.00134414081662
-1264 0.000312738549086 -0.000496869678485 0.000311032827266
-1265 0.00011133733477 0.00101039259924 -0.000742752429149
-1266 -0.000892716439024 0.0012507212459 0.000639905503281
-1267 0.000982999259023 -0.00148297974564 -0.00141676960522
-1268 -0.001018789502 0.000852895400788 -0.00123896653061
-1269 -0.00122019071631 -0.000801800744723 0.000869206636212
-1270 0.000937713933126 -0.000561472098063 -0.000910093854592
-1271 -0.000348528792061 -0.000133214666363 0.000195189460142
-1272 0.000811640870152 -0.000959297943173 0.000372992534754
-1273 -0.00153403047352 -0.00135995022076 -0.00158035378563
-1274 -0.000932623052317 0.000875457356986 -0.00147517949962
-1275 0.00094309264573 0.00130371478869 -0.000369896184881
-1276 0.000497801112942 -0.00151744741921 0.00108539053615
-1277 0.0010691657087 -0.00146041778944 0.00150897584901
-1278 0.000897807319833 -0.000936735986975 0.000136779565746
-1279 -0.000388435405354 -0.000508478555274 0.00124206288048
-1280 -6.09611280636e-05 0.00154404343535 0.00101276174755
-1281 -0.000262362342379 -0.000110652710165 -4.10235088659e-05
-1282 0.000339045078828 -0.00103720355565 6.41507771479e-05
-1283 -0.000947197646359 -0.000608946123953 0.00116943409188
-1284 -0.00139248917915 -0.000268149908615 -0.000537237610324
-1285 -0.000821124583385 -0.000211120278844 -0.000113652297464
-1286 -0.000992482972256 0.000312561523619 -0.00148584858073
-1287 0.000883232725791 0.00074081895532 -0.000380565265991
-1288 0.000437941193002 0.00108161517066 0.00107472145504
-1289 0.00100930578877 0.00113864480043 0.0014983067679
-1290 0.000837947399894 -0.00149963182034 0.000126110484635
-1291 -0.000448295325293 -0.00107137438864 0.00123139379937
-1292 -0.000120821048003 0.000981147601979 0.00100209266644
-1293 -0.000322222262319 -0.000673548543532 -5.16925899763e-05
-1294 0.000279185158889 0.00156185903421 5.34816960375e-05
-1295 -0.0010070575663 -0.00117184195732 0.00115876501077
-1296 -0.00145234909909 -0.000831045741982 -0.000547906691434
-1297 -0.000880984503324 -0.000774016112211 -0.000124321378574
-1298 -0.0010523428922 -0.000250334309748 -0.00149651766184
-1299 0.000823372805851 0.000177923121953 -0.000391234347102
-1300 0.000378081273063 0.000518719337292 0.00106405237393
-1301 0.000949445868826 0.000575748967062 0.00148763768679
-1302 0.000778087479954 0.00109943076953 0.000115441403525
-1303 0.000264610564846 7.74555532736e-05 -0.000463863135699
-1304 -0.000180680967942 0.000418251768612 0.000991423585329
-1305 -0.000382082182258 -0.0012364443769 -6.23616710867e-05
-1306 0.000219325238949 0.000998963200846 4.28126149271e-05
-1307 -0.00106691748624 0.00142722063255 0.00114809592966
-1308 -0.00151220901903 -0.00139394157535 -0.000558575772544
-1309 -0.000940844423263 -0.00133691194558 -0.000134990459685
-1310 -0.00111220281213 -0.000813230143115 -0.00150718674295
-1311 0.000763512885912 -0.000384972711414 -0.000401903428212
-1312 0.0010909871632 -0.00149440914403 -0.000631204561142
-1313 0.000889585948887 1.28531336954e-05 0.00147696860568
-1314 0.00149099337009 -0.000913697711794 -0.00157981553154
-1315 0.000204750644907 -0.000485440280093 -0.00047453221681
-1316 -0.000240540887882 -0.000144644064755 0.000980754504218
-1317 0.000330823707881 -8.76144349841e-05 0.00140433981708
-1318 0.00015946531901 0.000436067367479 3.21435338167e-05
-1319 -0.00112677740618 0.00086432479918 0.00113742684855
-1320 -0.00157206893897 0.00120512101452 -0.000569244853655
-1321 0.000849679335594 -0.000362410755216 -0.00063811639722
-1322 -0.0001543744382 -0.000122082108557 0.00074454153521
-1323 -0.00144061716339 0.000306175323144 -0.00131213357329
-1324 -0.000280447501175 -0.000519907953666 -0.00113433049868
-1325 0.000290917094588 -0.000462878323895 -0.000710745185818
-1326 -0.00148590248928 0.00122768297072 -0.000805457822663
-1327 0.000389813208762 -0.00150601802082 0.000299825492071
-1328 0.00154998287098 0.000829857125607 0.000477628566683
-1329 -0.0010406109565 0.000886886755378 0.000901213879543
-1330 0.00111729369294 0.00112721540204 -0.000878086611261
-1331 -0.000168949032243 0.00155547283374 0.000227196703473
-1332 0.00099122062997 0.000729389556928 0.000404999778085
-1333 0.000789819415654 -0.000925306588583 -0.000648785478331
-1334 -0.00021423435814 -0.000684977941924 0.0007338724541
-1335 -0.00150047708333 -0.000256720510223 -0.0013228026544
-1336 -0.000340307421114 -0.00108280378703 -0.00114499957979
-1337 0.000231057174649 -0.00102577415726 -0.000721414266928
-1338 -0.00154576240922 0.00066478713735 -0.000816126903773
-1339 0.0011027190989 -0.000357188078902 -0.001395431443
-1340 -0.000899069662119 -0.00118327135571 -0.00121762836839
-1341 -0.00110047087644 0.000323990922011 0.000890544798432
-1342 0.00105743377301 0.00056431956867 -0.000888755692371
-1343 -0.000228808952182 0.000992577000371 0.000216527622363
-1344 0.000931360710031 0.000166493723561 0.000394330696975
-1345 0.000886075384133 0.00108800137113 0.000901006447601
-1346 -0.000814748141988 -0.000548856110339 -0.000724402522234
-1347 -0.00140422111485 -0.00140537097374 0.000226989271532
-1348 -0.000940821204962 -0.000946681955448 0.000558683867112
-1349 0.000327313143128 0.000987533802454 0.000828377659003
-1350 -0.00137351038299 -0.000649323679018 -0.000797031310832
-1351 0.000426209257302 -5.56058944671e-05 -0.00132301008634
-1352 -0.00149958344597 -0.00104714952413 0.000486055078514
-1353 -0.00100421490796 -0.000824659541507 -0.00072162169887
-1354 0.000456919989157 0.000700441400255 0.000814927754529
-1355 -0.000132552983703 -0.000156073463147 -0.00139563887494
-1356 0.000330846926183 0.000302615555146 -0.00106394427936
-1357 0.000826215464194 0.000525105537767 0.000890337366491
-1358 -0.000874608061927 -0.00111175194371 -0.000735071603344
-1359 -0.00146408103479 0.00119369161613 0.000216320190421
-1360 -0.000227915314823 0.000202147986466 -0.00113657306796
-1361 0.000267453223189 0.000424637969087 0.000817708577893
-1362 -0.00143337030293 -0.00121221951239 -0.000807700391942
-1363 0.00113911514744 0.00109322404745 0.000143691401824
-1364 -0.00155944336591 0.00155191306574 0.000475385997404
-1365 -0.0010640748279 -0.00138755537487 -0.00073229077998
-1366 0.000397060069218 0.000137545566888 0.000804258673419
-1367 -0.000192412903642 -0.000718969296513 -0.00140630795605
-1368 0.000270987006243 -0.000260280278221 -0.00107461336047
-1369 -0.00137791458511 0.00121625357232 -1.98927785868e-05
-1370 -0.00147327691623 0.00157447502194 0.000239173028396
-1371 0.00109920853415 0.000717960158536 0.00119056482216
-1372 -4.28527509669e-05 -0.000818429754257 -0.000362215359076
-1373 0.000452515787045 -0.000595939771636 -0.00156989213646
-1374 0.000357153455925 -0.000237718322023 -0.00131082632948
-1375 -0.000232319516935 -0.00109423318542 -0.000359434535712
-1376 -0.000601614991972 -0.000918897322936 -0.000434844147674
-1377 -0.000106246453961 -0.000696407340315 0.00151943749818
-1378 -0.00020160878508 -0.000338185890703 -0.00138345511808
-1379 -0.00156384756802 0.000255531893849 0.00125252452965
-1380 0.00122881538018 0.000430867756337 0.00117711491769
-1381 -0.00143777450504 0.000653357738958 -3.05618596972e-05
-1382 -0.00153313683616 0.00101157918857 0.000228503947285
-1383 0.00103934861421 0.000155064325169 0.00117989574105
-1384 -0.000102712670906 -0.00138132558762 -0.000372884440186
-1385 0.00116542167718 0.000552890170278 -0.000103190648295
-1386 0.000297293535985 -0.00080061415539 -0.00132149541059
-1387 -0.000292179436875 0.00150482940444 -0.000370103616822
-1388 -0.000661474911911 -0.0014817931563 -0.000445513228784
-1389 -0.0001661063739 -0.00125930317368 0.00150876841707
-1390 -0.00026146870502 -0.000901081724069 -0.00139412419919
-1391 -0.00085094167788 0.00140436183576 -0.00044273240542
-1392 0.00116895546024 -0.00013202807703 0.00116644583658
-1393 -0.00149763442498 9.0461905591e-05 -4.12309408076e-05
-1394 0.00156896166713 0.000448683355204 0.000217834866175
-1395 0.00097948869427 -0.000407831508198 0.00116922665994
-1396 0.000610193219233 -0.000232495645709 0.00109381704798
-1397 0.00110556175724 -1.00056630885e-05 -0.000113859729405
-1398 0.00101019942612 0.000348215786524 0.000145206077577
-1399 -0.000352039356814 0.000941933571076 -0.000380772697933
-1400 -0.000721334831851 0.00111726943356 -0.000456182309894
-1401 -0.000225966293839 0.00133975941618 0.00149809933596
-1402 -0.000321328624959 -0.00146397755744 -0.0014047932803
-1403 -0.000910801597819 0.000841466002396 -0.000453401486531
-1404 0.0011090955403 -0.000694923910397 0.00115577675547
-1405 -0.000784728534845 0.00123929184751 0.00142547054736
-1406 0.00150910174719 -0.000114212478163 0.000207165785065
-1407 0.000919628774331 -0.000970727341565 0.00115855757883
-1408 0.000550333299294 -0.000795391479076 0.00108314796687
-1409 0.00104570183731 -0.000572901496455 -0.000124528810516
-1410 0.000950339506185 -0.000214680046842 0.000134536996467
-1411 -0.000411899276753 0.000379037737709 -0.000391441779043
-1412 -0.00078119475179 0.000554373600197 -0.000466851391005
-1413 -0.000285826213779 0.000776863582818 0.00148743025484
-1414 -0.000381188544899 0.00113508503243 -0.00141546236141
-1415 -0.000970661517759 0.000278570169029 -0.000464070567641
-1416 0.00104923562036 -0.00125781974376 0.00114510767436
-1417 0.00100579522401 -0.000948165385367 0.000922344609822
-1418 -0.000695028302109 0.000576935556395 -0.000703064360013
-1419 -0.00128450127497 -0.000279579307007 0.000248327433753
-1420 -0.000821101365083 0.000179109711286 0.000580022029333
-1421 -0.000325732827072 0.000401599693907 -0.000627654748051
-1422 0.00113540207004 -0.00123525778757 0.000908894705348
-1423 0.000545929097181 0.00107018577227 -0.00130167192412
-1424 -0.00137986360609 7.86421426064e-05 0.000507393240735
-1425 -0.000884495068077 0.000301132125227 -0.000700283536649
-1426 0.000576639829036 -0.00133572535625 0.00083626591675
-1427 -1.28331438239e-05 0.000969718203587 -0.00137430071272
-1428 0.000450566766061 0.00142840722188 -0.00104260611714
-1429 0.000945935304073 -0.00151106121873 0.000911675528712
-1430 -0.000754888222048 1.40397230281e-05 -0.000713733441123
-1431 -0.00134436119491 -0.000842475140373 0.000237658352642
-1432 -0.000880961285023 -0.000383786122081 0.000569352948223
-1433 -0.000385592747011 -0.00016129613946 -0.000638323829162
-1434 -0.00131365046305 -8.64278456513e-05 -0.000786362229721
-1435 0.000486069177242 0.0005072899389 -0.00131234100523
-1436 -0.00143972352603 -0.000484253690761 0.000496724159625
-1437 -0.000944354988016 -0.00026176370814 -0.00071095261776
-1438 0.000516779909097 0.00126333723362 0.00082559683564
-1439 -7.26930637633e-05 0.00040682237022 -0.00138496979383
-1440 0.000390706846122 0.000865511388513 -0.00105327519825
-1441 0.000345421520225 -0.00137493938715 -0.000546599447622
-1442 -0.000658632253569 -0.00113461074049 0.000836058484808
-1443 0.00121708344448 -0.000706353308789 -0.00122061662369
-1444 -0.000784705316543 -0.0015324365856 -0.00104281354908
-1445 -0.00021334072078 -0.00147540695583 -0.00061922823622
-1446 0.00117179811858 0.000215154338784 -0.000713940873065
-1447 -0.000114444606606 0.000643411770485 0.000391342441669
-1448 -0.00134346755755 0.00152905426896 -0.00111544233768
-1449 -0.00154486877186 -0.000125641876555 0.000992730829141
-1450 0.000613035877576 0.000114686770104 -0.000786569661663
-1451 -0.000673206847611 0.000542944201805 0.000318713653071
-1452 0.000486962814601 -0.000283139075005 0.000496516727683
-1453 0.000285561600286 0.00122412320272 -0.000557268528733
-1454 -0.000718492173508 0.00146445184938 0.000825389403698
-1455 0.00115722352454 -0.00126924914216 -0.0012312857048
-1456 -0.000844565236483 0.00106662600427 -0.00105348263019
-1457 -0.00027320064072 0.00112365563404 -0.00062989731733
-1458 0.00111193819864 -0.000347741494583 -0.000724609954175
-1459 0.000598461283534 -0.00136971671084 -0.0013039144934
-1460 -0.00140332747749 0.000966158435589 -0.00112611141879
-1461 0.00155722973143 -0.000688537709922 0.00098206174803
-1462 0.000553175957636 -0.000448209063263 -0.000797238742773
-1463 -0.000733066767551 -1.99516315617e-05 0.000308044571961
-1464 0.000427102894662 -0.000846034908372 0.000485847646573
-1465 0.00124338997422 -0.00124668718596 -0.00146749867381
-1466 -0.00131716102781 0.000988720391787 -0.0013623243878
-1467 0.000558554670241 0.00141697782349 -0.000257041073062
-1468 0.000113263137452 -0.00140418438441 0.00119824564797
-1469 0.000684627733215 -0.00134715475464 -0.00154012746241
-1470 0.000513269344344 -0.000823472952174 0.000249634677564
-1471 -0.000772973380844 -0.000395215520473 0.0013549179923
-1472 -0.00121826491363 -5.44193051343e-05 -0.000351753709907
-1473 -0.000646900317869 2.61032463622e-06 7.18316029529e-05
-1474 -0.000818258706741 0.0005262921271 -0.00130036468031
-1475 0.00105745699131 0.0009545495588 -0.000195081365575
-1476 0.0013849312686 -0.000154886873814 -0.000424382498505
-1477 0.00118353005428 0.00135237540391 -0.00147816775492
-1478 -0.00137702094775 0.00042582455842 -0.00137299346891
-1479 0.000498694750301 0.000854081990121 -0.000267710154172
-1480 5.34032175124e-05 0.00119487820546 0.00118757656686
-1481 0.000624767813276 0.00125190783523 -0.00155079654352
-1482 0.000453409424404 -0.00138636878554 0.000238965596454
-1483 -0.000832833300783 -0.00095811135384 0.00134424891119
-1484 -0.00127812483357 -0.000617315138501 -0.000362422791017
-1485 -0.000706760237809 -0.000560285508731 6.11625218425e-05
-1486 -0.00087811862668 -3.66037062674e-05 -0.00131103376142
-1487 -0.00139159554179 -0.00105857892252 0.00127162012259
-1488 0.00132507134866 -0.000717782707181 -0.000435051579615
-1489 0.00112367013434 0.000789479570543 -0.00148883683603
-1490 -0.00143688086769 -0.000137071274947 -0.00138366255002
-1491 0.000438834830362 0.000291186156754 -0.000278379235283
-1492 -6.45670242697e-06 0.000631982372093 0.00117690748575
-1493 0.000564907893336 0.000689012001863 -0.00156146562463
-1494 0.000393549504465 0.00121269380433 0.000228296515344
-1495 -0.000892693220722 -0.00152100718721 0.00133357983008
-1496 -0.000565218943432 0.000531514803413 0.00110427869715
-1497 -0.000766620157748 -0.0011231813421 5.04934407321e-05
-1498 -0.00016521273654 0.00111222623565 0.000155667726746
-1499 -0.00145145546173 0.00154048366735 0.00126095104148
-1500 0.00126521142872 -0.00128067854055 -0.000445720660726
-1501 -0.00132538239875 -0.00122364891078 -2.21353478657e-05
-1502 -0.00149674078762 -0.000699967108314 -0.00139433163113
-1503 0.000378974910422 -0.000271709676613 -0.000289048316393
-1504 -6.63166223664e-05 6.90865387258e-05 0.00116623840464
-1505 0.000505047973397 0.000126116168496 -0.00157213470574
-1506 0.000333689584525 0.00064979797096 0.000217627434233
-1507 -0.000952553140662 0.00107805540266 0.00132291074897
-1508 -0.000625078863372 -3.13810299537e-05 0.00109360961604
-1509 -0.000826480077687 0.00147588124777 3.98243596217e-05
-1510 -0.00022507265648 0.00054933040228 0.000144998645636
-1511 -0.00151131538167 0.000977587833981 0.00125028196037
-1512 0.00120535150878 0.00131838404932 -0.000456389741836
-1513 0.000465141360104 -0.000249147720415 -0.000525261285401
-1514 -0.00053891241369 -8.81907375571e-06 0.000857396647029
-1515 0.00133680328436 0.000419438357945 -0.00119927846147
-1516 -0.000664985476665 -0.000406644918865 -0.00102147538686
-1517 -0.00086638669098 0.00110061735886 0.00108669777996
-1518 0.00129151795846 0.00134094600552 -0.000692602710844
-1519 5.27523327278e-06 -0.00139275498602 0.00041268060389
-1520 0.00116544489549 0.000943120160408 0.000590483678502
-1521 -0.00142514893199 0.00100014979018 0.00101406899136
-1522 -4.00100926243e-05 -0.000471247338443 0.000919356354516
-1523 -0.000553487007732 -0.0014932225547 0.000340051815292
-1524 0.00060668265448 0.000842652591729 0.000517854889904
-1525 0.000405281440164 -0.000812043553782 -0.000535930366512
-1526 -0.000598772333629 -0.000571714907123 0.000846727565919
-1527 0.00127694336442 -0.000143457475422 -0.00120994754258
-1528 -0.000724845396604 -0.000969540752232 -0.00103214446797
-1529 -0.000153480800841 -0.000912511122461 -0.00060855915511
-1530 0.00123165803852 0.000778050172151 -0.000703271791955
-1531 -5.45846866666e-05 0.00120630760385 0.00040201152278
-1532 0.00110558497555 0.000380224327041 0.000579814597391
-1533 -0.00148500885192 0.000437253956812 0.00100339991025
-1534 0.000672895797515 0.000677582603471 -0.000775900580552
-1535 -0.000613346927672 0.00110584003517 0.000329382734182
-1536 0.000546822734541 0.000279756758362 0.000507185808793
-1537 -0.000195232343683 -0.000675921722197 0.00116775308039
-1538 -0.00119928611748 -0.000435593075538 -0.000611547410415
-1539 0.00067642958057 -7.33564383704e-06 0.000493735904319
-1540 -0.00132535918045 -0.000833418920647 0.000671538978931
-1541 -0.000753994584689 -0.000776389290877 0.00109512429179
-1542 0.000631144254673 0.000914172003735 0.00100041165495
-1543 0.000117667339564 -0.000107803212516 0.000421107115722
-1544 0.00127783700178 -0.000933886489327 0.000598910190333
-1545 0.00107643578746 0.000573375788397 -0.000454875066082
-1546 7.23820136674e-05 0.000813704435056 0.000927782866348
-1547 -0.00121386071152 0.00124196186676 -0.00112889224215
-1548 -5.36910493071e-05 0.000415878589947 -0.00095108916754
-1549 0.000517673546456 0.000472908219717 -0.00052750385468
-1550 -0.00125914603742 -0.000998488908905 -0.000622216491525
-1551 0.00061656966063 -0.000570231477204 0.000483066823209
-1552 -0.00138521910039 -0.00139631475401 0.000660869897821
-1553 -0.000813854504628 -0.00133928512424 0.00108445521068
-1554 0.00134405014481 -0.00109895647758 -0.000694845280123
-1555 5.7807419625e-05 -0.000670699045883 0.000410438034611
-1556 0.00121797708184 -0.00149678232269 0.000588241109223
-1557 0.00101657586752 1.04799550298e-05 -0.000465544147193
-1558 1.2522093728e-05 0.000250808601689 0.000917113785238
-1559 -0.00127372063146 0.00067906603339 -0.00113956132326
-1560 -0.000113550969246 -0.00014701724342 -0.000961758248651
-1561 0.000702736110312 -0.000547669521006 0.000246853854201
-1562 0.00130414353152 -0.0014742203665 0.000352028140215
-1563 1.79008063321e-05 -0.00104596293479 0.00145731145495
-1564 -0.000427390726457 -0.000705166719456 -0.000249360247257
-1565 0.000143973869307 -0.000648137089685 0.000174225065603
-1566 -2.7384519565e-05 -0.000124455287222 -0.00119797121766
-1567 -0.00131362724475 0.000303802144479 -9.26879029244e-05
-1568 0.00140303964569 0.000644598359817 0.0013625988181
-1569 -0.00118755418178 0.000701627989588 -0.00137577429227
-1570 -0.00135891257065 0.00122530979205 0.000413987847702
-1571 0.00128956893748 0.000203334575799 -0.000165316691522
-1572 0.000844277404688 0.000544130791138 0.00128997002951
-1573 0.000642876190372 -0.00111056535437 0.00023618477309
-1574 0.00124428361158 0.00112484222337 0.000341359059104
-1575 -4.19591136073e-05 0.00155309965507 0.00144664237384
-1576 -0.000487250646396 -0.00126806255282 -0.000260029328367
-1577 8.41139493671e-05 -0.00121103292305 0.000163555984493
-1578 -8.72444395044e-05 -0.000687351120589 -0.00120864029877
-1579 -0.00137348716469 -0.000259093688888 -0.000103356984035
-1580 -0.0010460128874 -0.0013685301215 -0.000332658116965
-1581 -0.00124741410172 0.000138732156221 -0.00138644337338
-1582 -0.00064600668051 -0.000787818689269 -0.00128126908737
-1583 0.00122970901754 -0.000359561257568 -0.000175985772633
-1584 0.000784417484749 -1.8765042229e-05 0.0012793009484
-1585 0.000583016270433 0.00148849723549 0.00022551569198
-1586 0.00118442369164 0.000561946390005 0.000330689977994
-1587 -0.000101819033547 0.000990203821706 0.00143597329273
-1588 -0.000547110566335 0.00133100003704 -0.000270698409478
-1589 2.42540294277e-05 0.00138802966681 0.000152886903382
-1590 -0.000147104359444 -0.00125024695396 -0.00121930937988
-1591 -0.00143334708463 -0.000821989522255 -0.000114026065145
-1592 -0.00110587280734 0.00123053246836 -0.000343327198076
-1593 -0.00130727402166 -0.000424163677146 -0.00139711245449
-1594 -0.000705866600449 -0.00135071452264 -0.00129193816848
-1595 0.0011698490976 -0.000922457090935 -0.000186654853743
-1596 0.000724557564809 -0.000581660875596 0.00126863186729
-1597 0.00129592216057 -0.000524631245825 -0.00146974124309
-1598 0.0011245637717 -9.49443362088e-07 0.000320020896883
-1599 -0.000161678953486 0.000427307988339 0.00142530421162
-1600 -0.000606970486275 0.000768104203677 -0.000281367490588
-1601 -3.56058905117e-05 0.000825133833448 0.000142217822272
-1602 -0.000206964279383 0.00134881563591 -0.00122997846099
-1603 -0.000720441194491 0.000326840419659 0.00135267542302
-1604 -0.00116573272728 0.000667636634998 -0.000353996279186
-1605 -0.0013671339416 -0.000987059510513 -0.0014077815356
-1606 -0.000765726520388 0.00124834806723 -0.00130260724959
-1607 0.00110998917766 -0.0014853529243 -0.000197323934853
-1608 0.00066469764487 -0.00114455670896 0.00125796278617
-1609 -7.55125038046e-05 0.000449869944537 0.00118909124261
-1610 -0.0010795662776 0.000690198591196 -0.000590209248194
-1611 0.000796149420448 0.0011184560229 0.00051507406654
-1612 -0.00120563934057 0.000292372746087 0.000692877141152
-1613 -0.00140704055489 -0.00136232339942 -0.000360908115264
-1614 0.000750864094551 -0.00112199475276 0.00102174981717
-1615 -0.000535378630636 -0.000693737321064 -0.00103492529133
-1616 0.000624791031577 -0.00151982059787 -0.000857122216722
-1617 0.00119615562734 -0.0014627909681 -0.000433536903862
-1618 0.000192101853546 -0.00122246232144 0.000949121028569
-1619 -0.00109414087164 -0.000794204889743 -0.00110755407993
-1620 6.60287905718e-05 0.00154167025668 -0.000929751005319
-1621 -0.000135372423744 -0.00011302588883 0.0011784221615
-1622 -0.00113942619754 0.000127302757829 -0.000600878329305
-1623 0.000736289500509 0.00055556018953 0.00050440498543
-1624 -0.00126549926051 -0.00027052308728 0.000682208060041
-1625 -0.000694134664749 -0.00021349345751 0.0011057933729
-1626 0.000691004174612 0.0014770678371 0.00101108073606
-1627 -0.000595238550575 -0.00125663315443 -0.00104559437244
-1628 0.000564931111638 0.00107924199199 -0.000867791297832
-1629 0.0011362957074 0.00113627162176 -0.000444205984972
-1630 0.000132241933607 0.00137660026842 0.000938451947458
-1631 -0.00115400079158 -0.00135710072311 -0.00111822316104
-1632 6.16887063234e-06 0.000978774423314 -0.00094042008643
-1633 -0.0013506911997 0.000275720671381 -0.000926201192228
-1634 0.00142201844185 0.000263424589414 0.0011028051176
-1635 -0.000479029275449 0.000944306749741 -0.0016002183683
-1636 0.00129594537887 -0.000134401255695 -0.000776066916292
-1637 0.00125250498253 0.000175253102702 -0.000998829980826
-1638 9.04903907641e-05 -0.00154876875455 -0.000447194240277
-1639 -0.00103779151645 0.000843839181062 0.00148911126634
-1640 0.000737183137869 -0.000234868824375 -0.00084869570489
-1641 -7.90230685577e-05 0.00152501818197 0.000613129084534
-1642 -0.000468271850241 0.00151272210001 -0.000519823028875
-1643 0.000792638855695 -0.000968354162899 -6.0888091535e-05
-1644 -0.000594344913216 0.0011148962549 0.000763263360471
-1645 -0.000637785309563 0.0014245506133 0.000540500295937
-1646 0.00136215852191 -0.000299471243953 0.00109213603649
-1647 -0.000538889195389 0.000381410916374 0.00155107097383
-1648 0.00123608545893 -0.000697297089062 -0.000786735997403
-1649 0.00119264506259 -0.000387642730665 -0.00100949906194
-1650 0.000803396280904 -0.000399938812633 0.00101950724789
-1651 -0.00109765143639 0.000280943347695 0.00147844218523
-1652 0.000677323217929 -0.000797764657742 -0.000859364786
-1653 -0.000138882988497 0.000962122348608 0.000602460003424
-1654 -0.000528131770181 0.000949826266641 -0.000530492109986
-1655 0.000732778935756 -0.00153124999627 -7.15571726454e-05
-1656 -0.000654204833155 0.000552000421532 0.00075259427936
-1657 -0.000452722745707 0.000403972872572 0.00131485800482
-1658 0.000763489667611 -0.000775202701544 -0.00109557775501
-1659 -0.00113755804969 -9.43205412165e-05 -0.000636642817668
-1660 -0.000968044590365 -6.14905450427e-06 0.00146499228075
-1661 -0.00101148498671 0.000303505303893 0.00124222921622
-1662 -0.000568038383473 0.00057456237773 0.000516381310352
-1663 0.000692872322463 0.00125544453806 0.000975316247692
-1664 0.000862385781785 0.00134361602477 -8.50070771195e-05
-1665 0.000818945385438 -0.00150868804007 -0.000307770141654
-1666 0.00126239198868 -0.00123763096623 -0.00103361804752
-1667 0.000134110081458 0.00115497696938 0.000902687459095
-1668 0.00030362354078 0.00124314845609 -0.000157635865717
-1669 -0.000512582665647 -0.000158922960795 0.00130418892371
-1670 0.000703629747671 -0.00133809853491 -0.00110624683612
-1671 -0.00119741796963 -0.000657216374583 -0.000647311898779
-1672 -0.0010279045103 -0.000569044887871 0.00145432319964
-1673 -0.00107134490665 -0.000259390529474 0.00123156013511
-1674 -0.000627898303413 1.16665443626e-05 0.000505712229242
-1675 0.000633012402524 0.00069254870469 0.000964647166582
-1676 0.00157529167192 -0.000669512456551 0.00138169441105
-1677 0.000759085465498 0.0010903745498 -0.000318439222764
-1678 -0.00118666054442 -8.88010243168e-05 0.000433083440644
-1679 7.42501615185e-05 0.00059208113601 0.000892018377984
-1680 0.00024376362084 0.000680252622723 -0.000168304946828
-1681 0.000200323224493 0.00098990698112 -0.000391068011362
-1682 0.000643769827732 0.00126096405496 -0.00111691591723
-1683 -0.00125727788957 -0.00122011220795 -0.000657980979889
-1684 -0.00108776443024 -0.00113194072124 0.00144365411853
-1685 -0.00113120482659 -0.000822286362841 0.001220891054
-1686 -0.000687758223352 -0.000551229289004 0.000495043148131
-1687 0.000573152482584 0.000129652871323 0.000953978085472
-1688 0.00151543175198 -0.00123240828992 0.00137102532994
-1689 0.000699225545559 0.000527478716432 -0.000329108303874
-1690 -0.00124652046436 -0.000651696857684 0.000422414359533
-1691 1.43902415791e-05 2.91853026436e-05 0.000881349296874
-1692 0.000183903700901 0.000117356789356 -0.000178974027938
-1693 0.000140463304554 0.000427011147753 -0.000401737092472
-1694 0.000583909907792 0.00069806822159 -0.00112758499834
-1695 -0.00131713780951 0.00137895038192 -0.000668650061
-1696 -0.000374858540104 1.68892206763e-05 -0.000251602816536
-1697 -0.00119106474653 -0.00138518219621 0.00121022197289
-1698 -0.000747618143292 -0.00111412512237 0.000484374067021
-1699 0.00128605837272 0.00127848281324 -0.000741278849597
-1700 0.00145557183205 0.00136665429995 0.00136035624882
-1701 0.000639365625619 -3.54171169346e-05 -0.000339777384985
-1702 -0.0013063803843 -0.00121459269105 0.000411745278423
-1703 -4.54696783603e-05 -0.000533710530723 0.000870680215763
-1704 0.000124043780961 -0.000445539044011 -0.000189643109048
-1705 -0.00123097135982 0.00140151233811 -0.000904863030008
-1706 0.00154173828173 0.00138921625615 0.00112414327982
-1707 -0.00035930943557 -0.00109186000676 -0.00157888020608
-1708 0.00141566521875 0.000991390411038 -0.000754728754071
-1709 0.00137222482241 0.00130104476944 -0.000977491818606
-1710 0.000210210230643 -0.000422977087813 -0.000425856078057
-1711 0.00147112093658 0.000257905072514 3.30788592836e-05
-1712 8.41371676685e-05 -0.000820802932922 0.000857230311289
-1713 4.06967713212e-05 -0.000511148574525 0.000634467246755
-1714 -0.000348552010362 -0.000523444656493 -0.000498484866654
-1715 0.000912358695574 0.000157437503835 -3.95499293142e-05
-1716 -0.000474625073337 -0.000921270501602 0.000784601522691
-1717 -0.00129083127976 0.000838616504748 -0.000915532111118
-1718 0.00148187836179 0.000826320422781 0.00111347419871
-1719 -0.00041916935551 0.00150720258311 -0.00158954928719
-1720 0.00135580529881 0.000428494577671 -0.000765397835182
-1721 0.00131236490247 0.000738148936069 -0.000988160899716
-1722 0.000150350310704 -0.00098587292118 -0.000436525159167
-1723 0.00141126101664 -0.000304990760853 2.24097781732e-05
-1724 0.000797043057808 0.000328027008992 -0.00083802662378
-1725 -1.91631486182e-05 -0.00107404440789 0.000623798165645
-1726 -0.000408411930302 -0.00108634048986 -0.000509153947765
-1727 0.000852498775635 -0.000405458329532 -5.02190104246e-05
-1728 -0.000534484993276 -0.00148416633497 0.000773932441581
-1729 -0.00114575620233 0.00124549856958 0.00139722054906
-1730 -0.00153500498402 0.00123320248762 0.000264268435649
-1731 -0.000274094278079 -0.00124787377529 0.000723203372989
-1732 0.00150088037624 0.000835376642507 0.001547354825
-1733 0.0014574399799 0.0011450310009 0.00132459176046
-1734 0.000295425388134 -0.000578990856344 -0.00128573092222
-1735 -0.000832856519084 -0.00134834134397 0.000650574584392
-1736 0.000942118135239 0.000734909073828 0.0014747260364
-1737 0.000125911928812 -0.000667162343057 -0.000225407597412
-1738 -0.000263336852871 -0.000679458425024 -0.00135835971082
-1739 0.000997573853066 1.42373530345e-06 -0.000899424773482
-1740 -0.000389409915845 -0.00107728427013 -7.5273321476e-05
-1741 -0.000432850312193 -0.000767629911736 -0.00029803638601
-1742 0.00156709351928 0.000670306654249 0.000253599354539
-1743 -0.000333954198019 0.00135118881458 0.000712534291879
-1744 0.0014410204563 0.00027248080914 0.00153668574388
-1745 0.00139758005996 0.000582135167537 0.00131392267935
-1746 0.00100833127827 0.00056983908557 0.000180970565941
-1747 -0.000892716439024 0.0012507212459 0.000639905503281
-1748 0.000882258215299 0.000172013240461 0.00146405695529
-1749 6.60520088731e-05 -0.00123005817642 -0.000236076678523
-1750 -0.00032319677281 -0.00124235425839 -0.00136902879193
-1751 0.000937713933126 -0.000561472098063 -0.000910093854592
-1752 -0.000449269835785 0.00152177831973 -8.59424025864e-05
-1753 -0.000247787748337 0.00137375077077 0.000476321322871
-1754 0.000968424664981 0.000194575196659 0.00122784398628
-1755 -0.000932623052317 0.000875457356986 -0.00147517949962
-1756 -0.000763109592995 0.000963628843698 0.000626455598807
-1757 -0.000806549989342 0.0012732832021 0.000403692534273
-1758 -0.000363103386103 0.00154434027593 -0.000322155371595
-1759 0.000897807319833 -0.000936735986975 0.000136779565746
-1760 0.00106732077915 -0.000848564500263 -0.000923543759066
-1761 0.00102388038281 -0.000538910141865 -0.0011463068236
-1762 0.00146732698605 -0.000267853068029 0.00128980369377
-1763 0.000339045078828 -0.00103720355565 6.41507771479e-05
-1764 0.00050855853815 -0.000949032068942 -0.000996172547664
-1765 -0.000307647668276 0.000810854937408 0.000465652241761
-1766 0.000908564745041 -0.000368320636708 0.00121717490517
-1767 -0.000992482972256 0.000312561523619 -0.00148584858073
-1768 -0.000822969512934 0.000400733010331 0.000615786517697
-1769 -0.000866409909282 0.000710387368728 0.000393023453163
-1770 -0.000422963306043 0.000981444442565 -0.000332824452705
-1771 0.000837947399894 -0.00149963182034 0.000126110484635
-1772 -0.00138173175394 0.000300265441652 0.000543157729099
-1773 0.000964020462868 -0.00110180597523 -0.00115697590471
-1774 -0.000981725547048 0.000880976873886 -0.000405453241303
-1775 0.000279185158889 0.00156185903421 5.34816960375e-05
-1776 0.00044869861821 -0.00151192790231 -0.00100684162877
-1777 0.000405258221863 -0.00120227354391 -0.00122960469331
-1778 0.000848704825102 -0.000931216470075 0.00120650582406
-1779 -0.0010523428922 -0.000250334309748 -0.00149651766184
-1780 -0.000882829432874 -0.000162162823036 0.000605117436586
-1781 -0.000926269829221 0.000147491535361 0.000382354372052
-1782 -0.000482823225982 0.000418548609198 -0.000343493533815
-1783 0.000778087479954 0.00109943076953 0.000115441403525
-1784 -0.00144159167388 -0.000262630391715 0.000532488647989
-1785 0.000904160542929 0.00149725661463 -0.00116764498582
-1786 -0.00104158546699 0.000318081040519 -0.000416122322413
-1787 0.000219325238949 0.000998963200846 4.28126149271e-05
-1788 0.000388838698271 0.00108713468756 -0.00101751070988
-1789 0.000345398301924 0.00139678904596 -0.00124027377442
-1790 0.000788844905163 -0.00149411230344 0.00119583674295
-1791 -0.00111220281213 -0.000813230143115 -0.00150718674295
-1792 -0.000169923542734 0.000986667118879 -0.00109013949848
-1793 -0.00098612974916 -0.000415404298005 0.000371685290942
-1794 0.000230082664157 0.00156737855111 0.00112320795435
-1795 0.00149099337009 -0.000913697711794 -0.00157981553154
-1796 -0.00150145159382 -0.000825526225082 0.000521819566878
-1797 0.000844300622989 0.000934360781268 -0.00117831406693
-1798 -0.00110144538693 -0.000244814792848 -0.000426791403524
-1799 0.00015946531901 0.000436067367479 3.21435338167e-05
-1800 0.000328978778332 0.000524238854191 -0.001028179791
-1801 -0.00102603636245 -0.000790668186917 0.00141855871128
-1802 -0.00141528514414 -0.000802964268884 0.00028560659787
-1803 -0.0001543744382 -0.000122082108557 0.00074454153521
-1804 -0.00154135820711 -0.00120079011399 -0.00159326543602
-1805 0.00157715981978 -0.000891135755596 0.00134592992268
-1806 0.000415145228013 0.000546800810389 -0.00126439276
-1807 -0.00148590248928 0.00122768297072 -0.000805457822663
-1808 0.000289072165039 0.00014897496528 1.86936293426e-05
-1809 0.000245631768691 0.000458629323677 -0.000204069435191
-1810 -0.000143617012992 0.00044633324171 -0.0013370215486
-1811 0.00111729369294 0.00112721540204 -0.000878086611261
-1812 -0.000269690075967 4.85073966007e-05 -5.39351592552e-05
-1813 -0.00108589628239 -0.00135356402028 0.00140788963017
-1814 -0.00147514506408 -0.00136586010225 0.00027493751676
-1815 -0.00021423435814 -0.000684977941924 0.0007338724541
-1816 0.00156074029618 0.00139827247587 -0.00160393451713
-1817 0.00151729989984 -0.00145403158896 0.00133526084157
-1818 0.000355285308074 -1.60950229775e-05 -0.00127506184111
-1819 -0.00154576240922 0.00066478713735 -0.000816126903773
-1820 0.00100197805518 0.00129780490719 0.00148539511751
-1821 0.000185771848752 -0.00010426650969 -0.000214738516302
-1822 -0.000203476932932 -0.000116562591657 -0.00134769062971
-1823 0.00105743377301 0.00056431956867 -0.000888755692371
-1824 -0.000329549995906 -0.000514388436766 -6.46042403656e-05
-1825 0.00147554835699 -0.0012174421887 -5.03853461644e-05
-1826 0.000471494583199 -0.00097711354204 0.00133227258627
-1827 -0.000814748141988 -0.000548856110339 -0.000724402522234
-1828 0.000345421520225 -0.00137493938715 -0.000546599447622
-1829 0.000916786115988 -0.00131790975738 -0.000123014134762
-1830 -8.72676578057e-05 -0.00107758111072 0.00125964379767
-1831 -0.00137351038299 -0.000649323679018 -0.000797031310832
-1832 -0.00021334072078 -0.00147540695583 -0.00061922823622
-1833 -0.000414741935096 3.1855321895e-05 0.0014889449306
-1834 -0.00141879570889 0.000272183968554 -0.000290355560205
-1835 0.000456919989157 0.000700441400255 0.000814927754529
-1836 -0.00154486877186 -0.000125641876555 0.000992730829141
-1837 -0.000973504176101 -6.86122467844e-05 0.001416316142
-1838 0.00041163466326 -0.00154000937541 0.00132160350516
-1839 -0.000874608061927 -0.00111175194371 -0.000735071603344
-1840 0.000285561600286 0.00122412320272 -0.000557268528733
-1841 0.000856926196049 0.00128115283249 -0.000133683215873
-1842 -0.000147127577745 0.00152148147915 0.00124897471656
-1843 -0.00143337030293 -0.00121221951239 -0.000807700391942
-1844 -0.00027320064072 0.00112365563404 -0.00062989731733
-1845 -0.000474601855035 -0.000531040511472 0.00147827584949
-1846 -0.00147865562883 -0.000290711864813 -0.000301024641316
-1847 0.000397060069218 0.000137545566888 0.000804258673419
-1848 0.00155722973143 -0.000688537709922 0.00098206174803
-1849 -0.000788441612246 -0.00108918998751 -0.000971284572352
-1850 -0.000187034191038 0.00114621759024 -0.000866110286338
-1851 -0.00147327691623 0.00157447502194 0.000239173028396
-1852 0.00124338997422 -0.00124668718596 -0.00146749867381
-1853 -0.00134720385325 -0.00118965755619 -0.00104391336095
-1854 -0.00151856224212 -0.000665975753724 0.000745848779022
-1855 0.000357153455925 -0.000237718322023 -0.00131082632948
-1856 0.000684627733215 -0.00134715475464 -0.00154012746241
-1857 0.000483226518899 0.000160107523086 0.000568045704411
-1858 0.00108463394011 -0.000766443322403 0.000673219990424
-1859 -0.00020160878508 -0.000338185890703 -0.00138345511808
-1860 -0.000646900317869 2.61032463622e-06 7.18316029529e-05
-1861 -0.000848301532185 0.00150987260236 -0.000981953653463
-1862 -0.000246894110977 0.00058332175687 -0.000876779367449
-1863 -0.00153313683616 0.00101157918857 0.000228503947285
-1864 0.00118353005428 0.00135237540391 -0.00147816775492
-1865 -0.00140706377319 0.00140940503368 -0.00105458244206
-1866 -0.00157842216206 -0.00122887158709 0.000735179697912
-1867 0.000297293535985 -0.00080061415539 -0.00132149541059
-1868 0.000624767813276 0.00125190783523 -0.00155079654352
-1869 0.00042336659896 -0.000402788310281 0.0005573766233
-1870 0.00102477402017 -0.00132933915577 0.000662550909314
-1871 -0.00026146870502 -0.000901081724069 -0.00139412419919
-1872 -0.000706760237809 -0.000560285508731 6.11625218425e-05
-1873 -0.000135395642045 -0.00050325587896 0.000484747834702
-1874 -0.000306754030917 2.04259235031e-05 -0.000887448448559
-1875 0.00156896166713 0.000448683355204 0.000217834866175
-1876 0.00112367013434 0.000789479570543 -0.00148883683603
-1877 -0.00146692369313 0.000846509200313 -0.00106525152317
-1878 0.00152367634123 0.00137019100278 0.000724510616801
-1879 0.00101019942612 0.000348215786524 0.000145206077577
-1880 0.000564907893336 0.000689012001863 -0.00156146562463
-1881 0.00036350667902 -0.000965684143648 0.00054670754219
-1882 0.000964914100228 0.0012697234341 0.000651881828204
-1883 -0.000321328624959 -0.00146397755744 -0.0014047932803
-1884 -0.000766620157748 -0.0011231813421 5.04934407321e-05
-1885 -0.000195255561985 -0.00106615171233 0.000474078753592
-1886 -0.000366613950856 -0.000542469909864 -0.00089811752967
-1887 0.00150910174719 -0.000114212478163 0.000207165785065
-1888 -0.00132538239875 -0.00122364891078 -2.21353478657e-05
-1889 -0.00152678361307 0.000283613366946 -0.00107592060428
-1890 -0.000925376191861 -0.000642937478543 -0.000970746318267
-1891 0.000950339506185 -0.000214680046842 0.000134536996467
-1892 0.000505047973397 0.000126116168496 -0.00157213470574
-1893 0.000303646759081 -0.00152857997701 0.000536038461079
-1894 0.000905054180288 0.00070682760073 0.000641212747093
-1895 -0.000381188544899 0.00113508503243 -0.00141546236141
-1896 -0.000826480077687 0.00147588124777 3.98243596217e-05
-1897 -0.00156669022636 -9.1650521965e-05 -2.90471839436e-05
-1898 0.000591214423078 0.000148678124694 0.00135361074849
-1899 -0.000695028302109 0.000576935556395 -0.000703064360013
-1900 0.000465141360104 -0.000249147720415 -0.000525261285401
-1901 0.00103650595587 -0.000192118090644 -0.000101675972541
-1902 -0.000740313628006 0.00149844320397 -0.000196388609387
-1903 0.00113540207004 -0.00123525778757 0.000908894705348
-1904 -0.00086638669098 0.00110061735886 0.00108669777996
-1905 -0.000295022095217 0.00115764698863 0.00151028309282
-1906 -0.00129907586901 0.00139797563529 -0.000269017397984
-1907 0.000576639829036 -0.00133572535625 0.00083626591675
-1908 -0.00142514893199 0.00100014979018 0.00101406899136
-1909 0.00153540827693 -0.000654546355332 -3.9716265054e-05
-1910 0.000531354503139 -0.000414217708673 0.00134294166738
-1911 -0.000754888222048 1.40397230281e-05 -0.000713733441123
-1912 0.000405281440164 -0.000812043553782 -0.000535930366512
-1913 0.000976646035928 -0.000755013924011 -0.000112345053652
-1914 -0.000800173547945 0.000935547370601 -0.000207057690497
-1915 -0.00131365046305 -8.64278456513e-05 -0.000786362229721
-1916 -0.000153480800841 -0.000912511122461 -0.00060855915511
-1917 -0.000354882015157 0.000594751155262 0.00149961401171
-1918 -0.00135893578895 0.000835079801921 -0.000279686479095
-1919 0.000516779909097 0.00126333723362 0.00082559683564
-1920 -0.00148500885192 0.000437253956812 0.00100339991025
-1921 -0.00153029417782 0.00135876160438 0.00151007566088
-1922 -6.9159280709e-05 -0.000278095877088 -0.000115333308957
-1923 -0.000658632253569 -0.00113461074049 0.000836058484808
-1924 -0.000195232343683 -0.000675921722197 0.00116775308039
-1925 0.00107290200441 0.00125829403571 0.00143744687228
-1926 -0.000627921521714 -0.000378563445767 -0.000187962097555
-1927 0.00117179811858 0.000215154338784 -0.000713940873065
-1928 -0.000753994584689 -0.000776389290877 0.00109512429179
-1929 -0.000258626046677 -0.000553899308256 -0.000112552485593
-1930 0.00120250885044 0.000971201633506 0.00142399696781
-1931 0.000613035877576 0.000114686770104 -0.000786569661663
-1932 0.00107643578746 0.000573375788397 -0.000454875066082
-1933 0.00157180432547 0.000795865771018 0.00149940657977
-1934 -0.000129019200648 -0.000840991710455 -0.000126002390068
-1935 -0.000718492173508 0.00146445184938 0.000825389403698
-1936 0.000517673546456 0.000472908219717 -0.00052750385468
-1937 0.00101304208447 0.000695398202338 0.00142677779117
-1938 -0.000687781441654 -0.000941459279134 -0.000198631178665
-1939 0.00111193819864 -0.000347741494583 -0.000724609954175
-1940 -0.000813854504628 -0.00133928512424 0.00108445521068
-1941 -0.000318485966617 -0.00111679514162 -0.000123221566704
-1942 0.0011426489305 0.000408305800139 0.0014133278867
-1943 0.000553175957636 -0.000448209063263 -0.000797238742773
-1944 0.00101657586752 1.04799550298e-05 -0.000465544147193
-1945 -0.000632325723827 0.00148701380558 0.00058917643469
-1946 -0.000727688054947 -0.00131672316805 0.000848242241672
-1947 -0.00131716102781 0.000988720391787 -0.0013623243878
-1948 0.000702736110312 -0.000547669521006 0.000246853854201
-1949 0.00119810464832 -0.000325179538385 -0.000960822923184
-1950 0.0011027423172 3.30419112278e-05 -0.000701757116201
-1951 0.000513269344344 -0.000823472952174 0.000249634677564
-1952 0.000143973869307 -0.000648137089685 0.000174225065603
-1953 0.000639342407318 -0.000425647107065 -0.00103345171178
-1954 0.000543980076198 -6.74256574517e-05 -0.000774385904799
-1955 -0.000818258706741 0.0005262921271 -0.00130036468031
-1956 -0.00118755418178 0.000701627989588 -0.00137577429227
-1957 -0.000692185643766 0.000924117972209 0.000578507353579
-1958 -0.000787547974886 0.00128233942182 0.000837573160562
-1959 -0.00137702094775 0.00042582455842 -0.00137299346891
-1960 0.000642876190372 -0.00111056535437 0.00023618477309
-1961 -0.00125094788477 0.000823650403529 0.000505878564981
-1962 0.00104288239726 -0.000529853922139 -0.000712426197311
-1963 0.000453409424404 -0.00138636878554 0.000238965596454
-1964 8.41139493671e-05 -0.00121103292305 0.000163555984493
-1965 0.000579482487379 -0.000988542940431 -0.00104412079289
-1966 0.000484120156259 -0.000630321490819 -0.000785054985909
-1967 -0.00087811862668 -3.66037062674e-05 -0.00131103376142
-1968 -0.00124741410172 0.000138732156221 -0.00138644337338
-1969 -0.000752045563706 0.000361222138842 0.000567838272469
-1970 -0.000847407894825 0.000719443588455 0.000826904079452
-1971 -0.00143688086769 -0.000137071274947 -0.00138366255002
-1972 0.000583016270433 0.00148849723549 0.00022551569198
-1973 -0.00131080780471 0.000260754570162 0.000495209483871
-1974 0.000983022477325 -0.00109274975551 -0.000723095278422
-1975 0.000393549504465 0.00121269380433 0.000228296515344
-1976 2.42540294277e-05 0.00138802966681 0.000152886903382
-1977 0.000519622567439 -0.0015514387738 -0.001054789874
-1978 0.000424260236319 -0.00119321732419 -0.00079572406702
-1979 -0.00016521273654 0.00111222623565 0.000155667726746
-1980 -0.00130727402166 -0.000424163677146 -0.00139711245449
-1981 -0.000811905483645 -0.000201673694525 0.000557169191359
-1982 -0.000907267814765 0.000156547755088 0.000816234998341
-1983 -0.00149674078762 -0.000699967108314 -0.00139433163113
-1984 0.00129592216057 -0.000524631245825 -0.00146974124309
-1985 -0.00137066772465 -0.000302141263205 0.000484540402761
-1986 -0.00146603005577 5.60801864084e-05 0.000743606209743
-1987 0.000333689584525 0.00064979797096 0.000217627434233
-1988 -3.56058905117e-05 0.000825133833448 0.000142217822272
-1989 0.0004597626475 0.00104762381607 -0.00106545895511
-1990 0.00036440031638 0.00140584526568 -0.00080639314813
-1991 -0.00022507265648 0.00054933040228 0.000144998645636
-1992 -0.0013671339416 -0.000987059510513 -0.0014077815356
-1993 -0.00141057433794 -0.000677405152116 0.0015314138231
-1994 5.05605591698e-05 0.000847695789646 -9.39951467364e-05
-1995 -0.00053891241369 -8.81907375571e-06 0.000857396647029
-1996 -7.55125038046e-05 0.000449869944537 0.00118909124261
-1997 0.000419856034207 0.000672359927158 -1.85855347749e-05
-1998 -0.00128096749191 -0.000964497554315 0.00151796391862
-1999 0.00129151795846 0.00134094600552 -0.000692602710844
-2000 -0.00140704055489 -0.00136232339942 -0.000360908115264
-2001 -0.000138906206798 0.000571892358478 -9.12143233727e-05
-2002 0.00132222869031 -0.00106496512299 0.00144533513003
-2003 -4.00100926243e-05 -0.000471247338443 0.000919356354516
-2004 0.00119615562734 -0.0014627909681 -0.000433536903862
-2005 -0.00147043425788 -0.00124030098548 0.00152074474199
-2006 -9.29936076958e-06 0.000284799956279 -0.000104664227847
-2007 -0.000598772333629 -0.000571714907123 0.000846727565919
-2008 -0.000135372423744 -0.00011302588883 0.0011784221615
-2009 0.000359996114267 0.000109464093791 -2.92546158853e-05
-2010 -0.00134082741185 -0.00152739338768 0.00150729483751
-2011 0.00123165803852 0.000778050172151 -0.000703271791955
-2012 -0.000694134664749 -0.00021349345751 0.0011057933729
-2013 -0.000198766126738 8.99652511117e-06 -0.000101883404483
-2014 0.00126236877038 0.00153409746687 0.00143466604892
-2015 0.000672895797515 0.000677582603471 -0.000775900580552
-2016 0.0011362957074 0.00113627162176 -0.000444205984972
-2017 0.0010910103815 -0.0011041791539 6.24697656544e-05
-2018 8.69566077098e-05 -0.000863850507239 0.00144512769808
-2019 -0.00119928611748 -0.000435593075538 -0.000611547410415
-2020 -3.91164552647e-05 -0.00126167635235 -0.000433744335803
-2021 0.000532248140498 -0.00120464672258 -1.01590229434e-05
-2022 -0.00124457144337 0.000485914572035 -0.000104871659789
-2023 0.000631144254673 0.000914172003735 0.00100041165495
-2024 -0.00137064450635 8.80887269254e-05 0.00117821472956
-2025 -0.000799279910586 0.000145118356696 -0.00156015838082
-2026 0.00135862473885 0.000385447003355 -0.000177500448386
-2027 7.23820136674e-05 0.000813704435056 0.000927782866348
-2028 0.00123255167588 -1.2378841754e-05 0.00110558594096
-2029 0.00103115046156 0.00149488343597 5.1800684544e-05
-2030 2.70966877703e-05 -0.00142674634061 0.00143445861697
-2031 -0.00125914603742 -0.000998488908905 -0.000622216491525
-2032 -9.89763752041e-05 0.00133738623752 -0.000444413416914
-2033 0.000472388220559 0.00139441586729 -2.08281040538e-05
-2034 -0.00130443136331 -7.69812613322e-05 -0.000115540740899
-2035 0.00134405014481 -0.00109895647758 -0.000694845280123
-2036 -0.000657738616209 0.00123691866884 -0.000517042205512
-2037 -0.000859139830525 -0.000417777476671 -0.00157082746193
-2038 0.00129876481892 -0.000177448830012 -0.000188169529497
-2039 1.2522093728e-05 0.000250808601689 0.000917113785238
-2040 0.00117269175594 -0.000575274675121 0.00109491685985
-2041 -0.00117297958774 -0.000975926952707 -0.000858429460534
-2042 -0.000571572166528 0.00125948062504 -0.00075325517452
-2043 0.00130414353152 -0.0014742203665 0.000352028140215
-2044 0.00085885199873 -0.00113342415116 -0.00135464356199
-2045 0.000657450784415 0.000373838126567 0.000753529604827
-2046 0.00125885820562 -0.000552712718923 0.000858703890841
-2047 -2.7384519565e-05 -0.000124455287222 -0.00119797121766
-2048 -0.000472676052354 0.000216340928117 0.000257315503369
-2049 9.86885434095e-05 0.000273370557887 0.000680900816229
-2050 -7.2669845462e-05 0.00079705236035 -0.000691295467032
-2051 -0.00135891257065 0.00122530979205 0.000413987847702
-2052 -0.00103143829336 0.000115873359437 0.000184686714772
-2053 -0.00123283950767 -0.00153882278607 -0.000869098541644
-2054 -0.000631432086467 0.000696584791671 -0.00076392425563
-2055 0.00124428361158 0.00112484222337 0.000341359059104
-2056 0.000798992078791 0.00146563843871 -0.0013653126431
-2057 0.00137035667455 0.00152266806848 -0.000941727330242
-2058 0.00119899828568 -0.00111560855229 0.000848034809731
-2059 -8.72444395044e-05 -0.000687351120589 -0.00120864029877
-2060 -0.000532535972293 -0.00034655490525 0.000246646422259
-2061 3.88286234701e-05 -0.00028952527548 0.000670231735119
-2062 -0.000132529765401 0.000234156526983 -0.000701964548143
-2063 -0.00064600668051 -0.000787818689269 -0.00128126908737
-2064 -0.0010912982133 -0.00044702247393 0.000174017633661
-2065 -0.00129269942761 0.00106023980379 -0.000879767622754
-2066 -0.000691292006407 0.000133688958304 -0.000774593336741
-2067 0.00118442369164 0.000561946390005 0.000330689977994
-2068 0.000739132158852 0.000902742605344 -0.00137598172421
-2069 0.00131049675461 0.000959772235114 -0.000952396411352
-2070 0.00113913836574 0.00148345403758 0.00083736572862
-2071 -0.000147104359444 -0.00125024695396 -0.00121930937988
-2072 0.000180369917846 0.000802275036664 -0.00144861051281
-2073 -2.10312964693e-05 -0.000852421108847 0.000659562654009
-2074 0.000580376124738 0.0013829864689 0.000764736940022
-2075 -0.000705866600449 -0.00135071452264 -0.00129193816848
-2076 -0.00115115813324 -0.0010099183073 0.000163348552551
-2077 -0.000579793537475 -0.000952888677526 0.000586933865411
-2078 -0.000751151926346 -0.000429206875063 -0.000785262417851
-2079 0.0011245637717 -9.49443362088e-07 0.000320020896883
-2080 0.000679272238912 0.000339846771977 -0.00138665080532
-2081 0.00125063683468 0.000396876401747 -0.000963065492463
-2082 0.0010792784458 0.00092055820421 0.00082669664751
-2083 -0.000206964279383 0.00134881563591 -0.00122997846099
-2084 0.000120509997907 0.000239379203297 -0.00145927959392
-2085 -8.08912164088e-05 -0.00141531694221 0.000648893572898
-2086 0.000520516204799 0.000820090635531 0.000754067858912
-2087 -0.000765726520388 0.00124834806723 -0.00130260724959
-2088 -0.00121101805318 -0.00157281414066 0.00015267947144
-2089 0.00121073022138 2.16125128359e-05 8.38079278752e-05
-2090 0.000206676447589 0.000261941159495 0.00146646586031
-2091 -0.0010795662776 0.000690198591196 -0.000590209248194
-2092 8.06033846141e-05 -0.000135884685614 -0.000412406173583
-2093 -0.000120797829702 0.00137137759211 -0.00146619143
-2094 -0.0011248516035 -0.00155025218447 -8.35334975677e-05
-2095 0.000750864094551 -0.00112199475276 0.00102174981717
-2096 -0.00125092466647 0.00121388039366 0.00119955289178
-2097 -0.000679560070707 0.00127091002343 -0.0015388202186
-2098 0.000705578768654 -0.000200487105192 0.00152842556779
-2099 0.000192101853546 -0.00122246232144 0.000949121028569
-2100 0.00135227151576 0.00111341282498 0.00112692410318
-2101 0.00115087030144 -0.000541283320531 7.31388467648e-05
-2102 0.000146816527649 -0.000300954673872 0.0014557967792
-2103 -0.00113942619754 0.000127302757829 -0.000600878329305
-2104 2.07434646747e-05 -0.000698780518981 -0.000423075254693
-2105 -0.000180657749641 0.000808481758742 -0.00147686051111
-2106 -0.00118471152343 0.0010488104054 -9.42025786781e-05
-2107 0.000691004174612 0.0014770678371 0.00101108073606
-2108 -0.00131078458641 0.000650984560292 0.00118888381067
-2109 -0.000739419990646 0.000708014190063 -0.00154948929971
-2110 0.00141848465879 0.000948342836722 -0.000166831367276
-2111 0.000132241933607 0.00137660026842 0.000938451947458
-2112 0.00129241159582 0.000550516991613 0.00111625502207
-2113 0.000550356517595 -0.000405161488946 -0.00138513612957
-2114 -0.000453697256199 -0.000164832842287 -2.47819713842e-06
-2115 0.00142201844185 0.000263424589414 0.0011028051176
-2116 -0.000579770319173 -0.000562658687396 0.00128060819221
-2117 -8.40572341002e-06 -0.000505629057626 -0.00145776491817
-2118 0.00137673311595 0.00118493223699 -0.00155247755501
-2119 9.04903907641e-05 -0.00154876875455 -0.000447194240277
-2120 -0.00113853256018 -0.000663126256076 0.00120797940361
-2121 -0.00133993377449 0.000844136021648 0.000154194147194
-2122 0.000817970874946 0.00108446466831 0.00153685207962
-2123 -0.000468271850241 0.00151272210001 -0.000519823028875
-2124 0.000691897811972 0.000686638823198 -0.000342019954264
-2125 0.000490496597656 -0.000968057322313 -0.00139580521068
-2126 -0.000513557176138 -0.000727728675654 -1.31472782488e-05
-2127 0.00136215852191 -0.000299471243953 0.00109213603649
-2128 -0.000639630239113 -0.00112555452076 0.0012699391111
-2129 -6.82656433494e-05 -0.00106852489099 -0.00146843399928
-2130 0.00131687319601 0.000622036403619 -0.00156314663612
-2131 0.000803396280904 -0.000399938812633 0.00101950724789
-2132 -0.00119839248012 -0.00122602208944 0.0011973103225
-2133 -0.00139979369443 0.000281240188281 0.000143525066084
-2134 0.000758110955007 0.00052156883494 0.00152618299851
-2135 -0.000528131770181 0.000949826266641 -0.000530492109986
-2136 0.000632037892032 0.000123742989831 -0.000352689035374
-2137 0.00144832497159 -0.000276909287755 0.000855923067477
-2138 -0.00111222603044 -0.00120346013324 0.000961097353491
-2139 0.000763489667611 -0.000775202701544 -0.00109557775501
-2140 0.000318198134822 -0.000434406486205 0.00035970896602
-2141 0.000889562730585 -0.000377376856435 0.000783294278879
-2142 0.000718204341714 0.000146304946029 -0.000588902004382
-2143 -0.000568038383473 0.00057456237773 0.000516381310352
-2144 -0.00101332991626 0.000915358593068 -0.00119029039185
-2145 -0.000441965320499 0.000972388222839 -0.000766705078994
-2146 -0.000613323709371 0.0014960700253 0.00102305706098
-2147 0.00126239198868 -0.00123763096623 -0.00103361804752
-2148 -0.00157209215727 0.000814891024389 -0.00126291918045
-2149 0.00138846505165 -0.000839805121122 0.000845253986367
-2150 -0.00117208595038 0.00139560245662 0.000950428272381
-2151 0.000703629747671 -0.00133809853491 -0.00110624683612
-2152 0.000258338214883 -0.000997302319572 0.000349039884909
-2153 0.000829702810646 -0.000940272689801 0.000772625197769
-2154 0.000658344421774 -0.000416590887338 -0.000599571085493
-2155 -0.000627898303413 1.16665443626e-05 0.000505712229242
-2156 -0.000300424026123 -0.00109776988825 0.000276411096311
-2157 -0.000501825240438 0.000409492389472 -0.000777374160104
-2158 -0.00067318362931 0.000933174191935 0.00101238797987
-2159 -0.00118666054442 -8.88010243168e-05 0.000433083440644
-2160 0.00153000634603 0.000251995191022 -0.00127358826156
-2161 0.00132860513171 -0.00140270095449 0.000834584905257
-2162 -0.00123194587032 0.000832706623256 0.00093975919127
-2163 0.000643769827732 0.00126096405496 -0.00111691591723
-2164 0.000198478294943 -0.00156019815294 0.000338370803799
-2165 0.000769842890706 -0.00150316852317 0.000761956116659
-2166 0.000598484501835 -0.000979486720705 -0.000610240166603
-2167 -0.000687758223352 -0.000551229289004 0.000495043148131
-2168 -0.000360283946062 0.00150129270162 0.000265742015201
-2169 -0.000561685160378 -0.000153403443895 -0.000788043241215
-2170 3.97222608297e-05 -0.00107995428938 -0.000682868955201
-2171 -0.00124652046436 -0.000651696857684 0.000422414359533
-2172 0.00147014642609 -0.000310900642345 -0.00128425734267
-2173 -0.00112044740138 -0.000253871012575 -0.000860672029812
-2174 -0.00129180579025 0.000269810789889 0.00092909011016
-2175 0.000583909907792 0.00069806822159 -0.00112758499834
-2176 0.000138618375004 0.00103886443693 0.000327701722688
-2177 0.000709982970767 0.0010958940667 0.000751287035548
-2178 0.000538624581895 -0.00154238255407 -0.000620909247713
-2179 -0.000747618143292 -0.00111412512237 0.000484374067021
-2180 -0.000420143866001 0.000938396868249 0.000255072934091
-2181 -0.000621545080317 -0.000716299277262 -0.000798712322325
-2182 -2.01376591098e-05 0.00151910830048 -0.000693538036311
-2183 -0.0013063803843 -0.00121459269105 0.000411745278423
-2184 0.00141028650615 -0.000873796475712 -0.00129492642378
-2185 0.000670076357474 0.000720630177788 -0.00136379796735
-2186 -0.00033397741632 0.000960958824447 1.88599650824e-05
-2187 0.00154173828173 0.00138921625615 0.00112414327982
-2188 -0.000460050479294 0.000563132979338 0.00130194635443
-2189 -0.00066145169361 -0.00109156316617 0.000248161098013
-2190 0.00149645295583 -0.000851234519514 -0.00153113939279
-2191 0.000210210230643 -0.000422977087813 -0.000425856078057
-2192 0.00137037989286 -0.00124906036462 -0.000248053003445
-2193 -0.00122021393462 -0.00119203073485 0.000175532309415
-2194 0.000164924904746 0.000498530559759 8.08196725698e-05
-2195 -0.000348552010362 -0.000523444656493 -0.000498484866654
-2196 0.00081161765185 -0.0013495279333 -0.000320681792043
-2197 0.000610216437535 0.000157734344421 -0.00137446704846
-2198 -0.000393837336259 0.00039806299108 8.19088397197e-06
-2199 0.00148187836179 0.000826320422781 0.00111347419871
-2200 -0.000519910399234 2.37145970681e-07 0.00129127727332
-2201 5.14541965294e-05 5.72667757412e-05 -0.00144709583706
-2202 0.00143659303589 -0.00141413035288 -0.0015418084739
-2203 0.000150350310704 -0.00098587292118 -0.000436525159167
-2204 0.00131051997292 0.00135000222524 -0.000258722084555
-2205 -0.00128007385455 0.00140703185501 0.000164863228305
-2206 0.000877830794885 -0.00151459792156 0.00154752116073
-2207 -0.000408411930302 -0.00108634048986 -0.000509153947765
-2208 0.000751757731911 0.00124953465656 -0.000331350873153
-2209 -0.000605102338424 0.000546480904632 -0.000317131978952
-2210 -0.000994351120107 0.000534184822665 -0.00145008409236
-2211 0.000266559585829 0.00121506698299 -0.000991149155021
-2212 -0.00112042418308 0.000136358977555 -0.000166997703016
-2213 -0.00116386457943 0.000446013335952 -0.00038976076755
-2214 0.000836079252043 -0.0012780085213 0.000161874972999
-2215 -0.000292202655176 0.00111459941431 -0.00106377794362
-2216 0.00148277199915 3.5891408876e-05 -0.000239626491614
-2217 0.000666565792721 -0.00136618000801 0.00122219829781
-2218 0.000277317011038 -0.00137847608998 8.92461844013e-05
-2219 0.00153822771697 -0.000697593929648 0.000548181121742
-2220 0.000151243948063 0.00138565648815 0.00137233257375
-2221 -0.000664962258363 -1.6414928735e-05 -0.000327801060062
-2222 -0.00105421104005 -2.87110107022e-05 -0.00146075317347
-2223 0.00020669966589 0.000652171149625 -0.00100181823613
-2224 -0.00118028410302 -0.000426536855811 -0.000177666784126
-2225 -0.00122372449937 -0.000116882497414 -0.00040042984866
-2226 0.00154898514218 -0.000129178579382 -0.00153338196207
-2227 -0.000352062575115 0.000551703580946 -0.00107444702473
-2228 0.00142291207921 -0.000527004424491 -0.000250295572724
-2229 0.000606705872782 0.00123288258186 0.0012115292167
-2230 0.000217457091098 0.00122058649989 7.85771032909e-05
-2231 0.00147836779703 -0.00126048976302 0.000537512040631
-2232 9.13840281237e-05 0.000822760654782 0.00136166349264
-2233 0.000292866115571 0.000674733105823 -0.00123803120514
-2234 0.00150907852889 -0.000504442468293 -0.000486508541732
-2235 -0.000391969188408 0.000176439692034 -2.75736043918e-05
-2236 -0.000222455729086 0.000264611178747 -0.0010878969292
-2237 -0.000265896125434 0.000574265537144 -0.00131065999374
-2238 0.000177550477805 0.00084532261098 0.00112545052363
-2239 0.00143846118374 0.00152620477131 -0.00157757296227
-2240 -0.00155398378017 -0.00154758216521 0.000524062136157
-2241 0.00156453424672 -0.00123792780682 0.000301299071623
-2242 -0.00115397757328 -0.00096687073298 -0.000424548834245
-2243 0.000879698942737 0.00142573720263 0.00151175667237
-2244 0.00104921240206 0.00151390868934 0.000451433347559
-2245 0.000233006195632 0.000111837272456 -0.00124870028625
-2246 0.00144921860895 -0.00106733830166 -0.000497177622843
-2247 -0.000451829108348 -0.000386456141333 -3.82426855022e-05
-2248 -0.000282315649026 -0.00029828465462 -0.00109856601031
-2249 -0.000325756045373 1.13697037767e-05 -0.00132132907485
-2250 0.000117690557866 0.000282426777613 0.00111478144252
-2251 0.0013786012638 0.000963308937941 -0.00158824204338
-2252 -0.000841077890031 -0.0003987522233 -0.00117119479891
-2253 0.00150467432678 0.00136113478305 0.000290629990513
-2254 -0.000441071683139 0.000181959208934 0.00104215265392
-2255 0.000819839022797 0.000862841369261 0.00150108759126
-2256 0.000989352482119 0.000951012855974 0.000440764266449
-2257 0.000173146275693 -0.000451058560911 -0.00125936936736
-2258 0.00138935868901 0.00153172428821 -0.000507846703953
-2259 -0.000511689028287 -0.000949351974699 -4.89117666126e-05
-2260 -0.000342175568965 -0.000861180487987 -0.00110923509142
-2261 -0.000385615965313 -0.00055152612959 -0.00133199815596
-2262 5.78306379263e-05 -0.000280469055753 0.00110411236141
-2263 0.00131874134386 0.000400413104574 -0.00159891112449
-2264 -0.00090093780997 -0.000961648056667 -0.00118186388002
-2265 0.00144481440684 0.000798238949683 0.000279960909402
-2266 -0.000500931603079 -0.000380936624433 0.00103148357281
-2267 0.000759979102858 0.000299945535894 0.00149041851015
-2268 0.000929492562179 0.000388117022607 0.000430095185338
-2269 0.000886052165832 0.000697771381004 0.000207332120804
-2270 0.00132949876907 0.00096882845484 -0.000518515785063
-2271 -0.000571548948226 -0.00151224780807 -5.9580847723e-05
-2272 -0.000402035488905 -0.00142407632135 -0.00111990417253
-2273 -0.000445475885252 -0.00111442196296 -0.00134266723707
-2274 -2.02928201307e-06 -0.00084336488912 0.0010934432803
-2275 -0.00113031118923 0.00154924304649 -0.000132209636321
-2276 -0.00096079772991 -0.00152454389003 -0.00119253296113
-2277 0.0013849544869 0.000235343116316 0.000269291828292
-2278 -0.000560791523018 -0.0009438324578 0.0010208144917
-2279 0.000700119182918 -0.000262950297472 0.00147974942904
-2280 0.00086963264224 -0.00017477881076 0.000419426104228
-2281 -0.000485382498545 -0.00148968585187 -0.000295793816731
-2282 -0.000874631280228 -0.00150198193384 -0.00142874593014
-2283 0.000386279425708 -0.000821099773508 -0.000969810992801
-2284 -0.0010007043432 0.00126215064429 -0.000145659540795
-2285 0.0013450478736 -0.000139920772595 0.00131616524863
-2286 0.000955799091922 -0.000152216854562 0.00018321313522
-2287 -0.000945248625376 0.000528665305765 0.00064214807256
-2288 0.000829726028947 -0.000550042699672 0.00146629952457
-2289 0.0007862856326 -0.000240388341274 0.00124353646003
-2290 0.000397036850916 -0.000252684423242 0.000110584346622
-2291 -0.00150401086638 0.000428197737086 0.000569519283962
-2292 0.000270963787942 -0.000650510268351 0.00139367073597
-2293 -0.000545242418484 0.001109376738 -0.000306462897842
-2294 -0.000934491200168 0.00109708065603 -0.00143941501125
-2295 0.000326419505769 -0.00138399560688 -0.000980480073911
-2296 -0.00106056426314 0.000699254810922 -0.000156328621905
-2297 -0.00110400465949 0.00100890916932 -0.000379091686439
-2298 0.000895939171982 -0.000715112687929 0.000172544054109
-2299 -0.00100510854532 -3.42305276019e-05 0.00063147899145
-2300 0.000769866109008 -0.00111293853304 0.00145563044346
-2301 0.00072642571266 -0.000803284174641 0.00123286737892
-2302 0.000337176930977 -0.000815580256609 9.99152655117e-05
-2303 -0.00156387078632 -0.000134698096281 0.000558850202852
-2304 0.000211103868002 -0.00121340610172 0.00138300165486
-2305 -0.000400167341054 0.00151625880283 -0.0011556686609
-2306 -0.000789416122737 0.00150396272087 0.000873337648926
-2307 0.000471494583199 -0.00097711354204 0.00133227258627
-2308 -0.000915489185712 0.00110613687576 -0.00100553438496
-2309 -0.000958929582059 0.00141579123415 -0.0012282974495
-2310 0.00104101424941 -0.000308230623094 -0.000676661708948
-2311 -8.72676578057e-05 -0.00107758111072 0.00125964379767
-2312 -0.00147425142672 0.00100566930708 -0.00107816317356
-2313 0.000871500790091 -0.000396402109806 0.000383661615864
-2314 0.000482252008408 -0.000408698191773 -0.000749290497545
-2315 -0.00141879570889 0.000272183968554 -0.000290355560205
-2316 0.000356178945433 -0.000806524036882 0.000533795891801
-2317 0.000312738549086 -0.000496869678485 0.000311032827266
-2318 -0.000849276042676 0.0009410668875 0.000862668567815
-2319 0.00041163466326 -0.00154000937541 0.00132160350516
-2320 -0.000975349105651 0.000543241042391 -0.00101620346607
-2321 -0.001018789502 0.000852895400788 -0.00123896653061
-2322 -0.00140803828368 0.000840599318821 0.000790039779218
-2323 -0.000147127577745 0.00152148147915 0.00124897471656
-2324 -0.00153411134666 0.000442773473712 -0.00108883225467
-2325 0.000811640870152 -0.000959297943173 0.000372992534754
-2326 0.000422392088468 -0.00097159402514 -0.000759959578656
-2327 -0.00147865562883 -0.000290711864813 -0.000301024641316
-2328 0.000296319025494 -0.00136941987025 0.00052312681069
-2329 0.000497801112942 -0.00151744741921 0.00108539053615
-2330 -0.00144794489697 0.00046533542991 -0.00132504522368
-2331 -0.000187034191038 0.00114621759024 -0.000866110286338
-2332 -1.75207317163e-05 0.00123438907695 0.00123552481208
-2333 -6.09611280636e-05 0.00154404343535 0.00101276174755
-2334 0.000382485475175 -0.00134685791405 0.000286913841682
-2335 -0.00151856224212 -0.000665975753724 0.000745848779022
-2336 -0.0013490487828 -0.000577804267012 -0.00031447454579
-2337 -0.00139248917915 -0.000268149908615 -0.000537237610324
-2338 -0.000949042575909 2.90716522212e-06 -0.00126308551619
-2339 0.00108463394011 -0.000766443322403 0.000673219990424
-2340 0.00125414739943 -0.000678271835691 -0.000387103334387
-2341 0.000437941193002 0.00108161517066 0.00107472145504
-2342 -0.00150780481691 -9.75604034573e-05 -0.00133571430479
-2343 -0.000246894110977 0.00058332175687 -0.000876779367449
-2344 -7.73806516557e-05 0.000671493243582 0.00122485573097
-2345 -0.000120821048003 0.000981147601979 0.00100209266644
-2346 0.000322625555236 0.00125220467582 0.000276244760572
-2347 -0.00157842216206 -0.00122887158709 0.000735179697912
-2348 -0.000636142892661 0.000571025674903 0.00115222694238
-2349 -0.00145234909909 -0.000831045741982 -0.000547906691434
-2350 -0.000236136685769 0.00115173710714 0.000203615971974
-2351 0.00102477402017 -0.00132933915577 0.000662550909314
-2352 0.00119428747949 -0.00124116766906 -0.000397772415498
-2353 0.000378081273063 0.000518719337292 0.00106405237393
-2354 -0.00156766473685 -0.000660456236824 -0.0013463833859
-2355 -0.000306754030917 2.04259235031e-05 -0.000887448448559
-2356 -0.000137240571595 0.000108597410215 0.00121418664986
-2357 -0.000180680967942 0.000418251768612 0.000991423585329
-2358 0.000262765635296 0.000689308842449 0.000265575679461
-2359 0.00152367634123 0.00137019100278 0.000724510616801
-2360 -0.0006960028126 8.12984153585e-06 0.00114155786127
-2361 -0.00151220901903 -0.00139394157535 -0.000558575772544
-2362 -0.000295996605709 0.00058884127377 0.000192946890863
-2363 0.000964914100228 0.0012697234341 0.000651881828204
-2364 0.00113442755955 0.00135789492081 -0.000408441496608
-2365 0.0010909871632 -0.00149440914403 -0.000631204561142
-2366 0.00153443376644 -0.00122335207019 -0.00135705246701
-2367 -0.000366613950856 -0.000542469909864 -0.00089811752967
-2368 -0.000197100491535 -0.000454298423152 0.00120351756875
-2369 -0.000240540887882 -0.000144644064755 0.000980754504218
-2370 0.000202905715357 0.000126413009082 0.000254906598351
-2371 -0.000925376191861 -0.000642937478543 -0.000970746318267
-2372 -0.00075586273254 -0.000554765991831 0.00113088878015
-2373 -0.00157206893897 0.00120512101452 -0.000569244853655
-2374 -0.000355856525648 2.59454404027e-05 0.000182277809753
-2375 0.000905054180288 0.00070682760073 0.000641212747093
-2376 0.00107456763961 0.000794999087442 -0.000419110577719
-2377 -0.000280447501175 -0.000519907953666 -0.00113433049868
-2378 -0.000669696282858 -0.000532204035633 0.000894675811147
-2379 0.000591214423078 0.000148678124694 0.00135361074849
-2380 -0.000795769345833 -0.000930029880742 -0.000984196222742
-2381 0.00154998287098 0.000829857125607 0.000477628566683
-2382 0.00116073408929 0.00081756104364 -0.000655323546727
-2383 -0.000740313628006 0.00149844320397 -0.000196388609387
-2384 0.00103466102632 0.000419735198531 0.000627762842619
-2385 0.00099122062997 0.000729389556928 0.000404999778085
-2386 0.000601971848287 0.000717093474961 -0.000727952335325
-2387 -0.00129907586901 0.00139797563529 -0.000269017397984
-2388 0.000475898785312 0.000319267629852 0.000555134054021
-2389 -0.000340307421114 -0.00108280378703 -0.00114499957979
-2390 -0.000729556202798 -0.001095099869 0.000884006730036
-2391 0.000531354503139 -0.000414217708673 0.00134294166738
-2392 -0.000855629265772 -0.00149292571411 -0.000994865303852
-2393 -0.000899069662119 -0.00118327135571 -0.00121762836839
-2394 0.00110087416935 0.000254665210273 -0.000665992627837
-2395 -0.000800173547945 0.000935547370601 -0.000207057690497
-2396 0.000974801106378 -0.000143160634836 0.000617093761509
-2397 0.000931360710031 0.000166493723561 0.000394330696975
-2398 0.000542111928347 0.000154197641594 -0.000738621416435
-2399 -0.00135893578895 0.000835079801921 -0.000279686479095
-2400 0.000416038865373 -0.000243628203515 0.000544464972911
-2401 -0.000940821204962 -0.000946681955448 0.000558683867112
-2402 0.00121708344448 -0.000706353308789 -0.00122061662369
-2403 -6.9159280709e-05 -0.000278095877088 -0.000115333308957
-2404 0.0010910103815 -0.0011041791539 6.24697656544e-05
-2405 -0.00149958344597 -0.00104714952413 0.000486055078514
-2406 -0.000114444606606 0.000643411770485 0.000391342441669
-2407 -0.000627921521714 -0.000378563445767 -0.000187962097555
-2408 0.000532248140498 -0.00120464672258 -1.01590229434e-05
-2409 0.000330846926183 0.000302615555146 -0.00106394427936
-2410 -0.000673206847611 0.000542944201805 0.000318713653071
-2411 0.00120250885044 0.000971201633506 0.00142399696781
-2412 -0.000799279910586 0.000145118356696 -0.00156015838082
-2413 -0.000227915314823 0.000202147986466 -0.00113657306796
-2414 0.00115722352454 -0.00126924914216 -0.0012312857048
-2415 -0.000129019200648 -0.000840991710455 -0.000126002390068
-2416 0.00103115046156 0.00149488343597 5.1800684544e-05
-2417 -0.00155944336591 0.00155191306574 0.000475385997404
-2418 0.000598461283534 -0.00136971671084 -0.0013039144934
-2419 -0.000687781441654 -0.000941459279134 -0.000198631178665
-2420 0.000472388220559 0.00139441586729 -2.08281040538e-05
-2421 0.000270987006243 -0.000260280278221 -0.00107461336047
-2422 -0.000733066767551 -1.99516315617e-05 0.000308044571961
-2423 0.0011426489305 0.000408305800139 0.0014133278867
-2424 -0.000859139830525 -0.000417777476671 -0.00157082746193
-2425 -4.28527509669e-05 -0.000818429754257 -0.000362215359076
-2426 0.000558554670241 0.00141697782349 -0.000257041073062
-2427 -0.000727688054947 -0.00131672316805 0.000848242241672
-2428 -0.00117297958774 -0.000975926952707 -0.000858429460534
-2429 -0.000601614991972 -0.000918897322936 -0.000434844147674
-2430 -0.000772973380844 -0.000395215520473 0.0013549179923
-2431 0.0011027423172 3.30419112278e-05 -0.000701757116201
-2432 0.000657450784415 0.000373838126567 0.000753529604827
-2433 0.00122881538018 0.000430867756337 0.00117711491769
-2434 0.00105745699131 0.0009545495588 -0.000195081365575
-2435 0.000543980076198 -6.74256574517e-05 -0.000774385904799
-2436 9.86885434095e-05 0.000273370557887 0.000680900816229
-2437 -0.000102712670906 -0.00138132558762 -0.000372884440186
-2438 0.000498694750301 0.000854081990121 -0.000267710154172
-2439 -0.000787547974886 0.00128233942182 0.000837573160562
-2440 -0.00123283950767 -0.00153882278607 -0.000869098541644
-2441 -0.000661474911911 -0.0014817931563 -0.000445513228784
-2442 -0.000832833300783 -0.00095811135384 0.00134424891119
-2443 0.00104288239726 -0.000529853922139 -0.000712426197311
-2444 0.00137035667455 0.00152266806848 -0.000941727330242
-2445 0.00116895546024 -0.00013202807703 0.00116644583658
-2446 -0.00139159554179 -0.00105857892252 0.00127162012259
-2447 0.000484120156259 -0.000630321490819 -0.000785054985909
-2448 3.88286234701e-05 -0.00028952527548 0.000670231735119
-2449 0.000610193219233 -0.000232495645709 0.00109381704798
-2450 0.000438834830362 0.000291186156754 -0.000278379235283
-2451 -0.000847407894825 0.000719443588455 0.000826904079452
-2452 -0.00129269942761 0.00106023980379 -0.000879767622754
-2453 -0.000721334831851 0.00111726943356 -0.000456182309894
-2454 -0.000892693220722 -0.00152100718721 0.00133357983008
-2455 0.000983022477325 -0.00109274975551 -0.000723095278422
-2456 0.00131049675461 0.000959772235114 -0.000952396411352
-2457 0.0011090955403 -0.000694923910397 0.00115577675547
-2458 -0.00145145546173 0.00154048366735 0.00126095104148
-2459 0.000424260236319 -0.00119321732419 -0.00079572406702
-2460 -2.10312964693e-05 -0.000852421108847 0.000659562654009
-2461 0.000550333299294 -0.000795391479076 0.00108314796687
-2462 0.000378974910422 -0.000271709676613 -0.000289048316393
-2463 -0.000907267814765 0.000156547755088 0.000816234998341
-2464 -0.000579793537475 -0.000952888677526 0.000586933865411
-2465 -0.00078119475179 0.000554373600197 -0.000466851391005
-2466 -0.000952553140662 0.00107805540266 0.00132291074897
-2467 -0.00146603005577 5.60801864084e-05 0.000743606209743
-2468 0.00125063683468 0.000396876401747 -0.000963065492463
-2469 0.00104923562036 -0.00125781974376 0.00114510767436
-2470 -0.00151131538167 0.000977587833981 0.00125028196037
-2471 0.00036440031638 0.00140584526568 -0.00080639314813
-2472 -8.08912164088e-05 -0.00141531694221 0.000648893572898
-2473 -0.000821101365083 0.000179109711286 0.000580022029333
-2474 0.00133680328436 0.000419438357945 -0.00119927846147
-2475 5.05605591698e-05 0.000847695789646 -9.39951467364e-05
-2476 0.00121073022138 2.16125128359e-05 8.38079278752e-05
-2477 -0.00137986360609 7.86421426064e-05 0.000507393240735
-2478 5.27523327278e-06 -0.00139275498602 0.00041268060389
-2479 -0.00128096749191 -0.000964497554315 0.00151796391862
-2480 -0.000120797829702 0.00137137759211 -0.00146619143
-2481 0.000450566766061 0.00142840722188 -0.00104260611714
-2482 -0.000553487007732 -0.0014932225547 0.000340051815292
-2483 0.00132222869031 -0.00106496512299 0.00144533513003
-2484 -0.000679560070707 0.00127091002343 -0.0015388202186
-2485 -0.000880961285023 -0.000383786122081 0.000569352948223
-2486 0.00127694336442 -0.000143457475422 -0.00120994754258
-2487 -9.29936076958e-06 0.000284799956279 -0.000104664227847
-2488 0.00115087030144 -0.000541283320531 7.31388467648e-05
-2489 -0.00143972352603 -0.000484253690761 0.000496724159625
-2490 -5.45846866666e-05 0.00120630760385 0.00040201152278
-2491 -0.00134082741185 -0.00152739338768 0.00150729483751
-2492 -0.000180657749641 0.000808481758742 -0.00147686051111
-2493 0.000390706846122 0.000865511388513 -0.00105327519825
-2494 -0.000613346927672 0.00110584003517 0.000329382734182
-2495 0.00126236877038 0.00153409746687 0.00143466604892
-2496 -0.000739419990646 0.000708014190063 -0.00154948929971
-2497 -0.000784705316543 -0.0015324365856 -0.00104281354908
-2498 0.00067642958057 -7.33564383704e-06 0.000493735904319
-2499 8.69566077098e-05 -0.000863850507239 0.00144512769808
-2500 0.000550356517595 -0.000405161488946 -0.00138513612957
-2501 -0.00134346755755 0.00152905426896 -0.00111544233768
-2502 0.000117667339564 -0.000107803212516 0.000421107115722
-2503 -0.00124457144337 0.000485914572035 -0.000104871659789
-2504 -8.40572341002e-06 -0.000505629057626 -0.00145776491817
-2505 0.000486962814601 -0.000283139075005 0.000496516727683
-2506 -0.00121386071152 0.00124196186676 -0.00112889224215
-2507 0.00135862473885 0.000385447003355 -0.000177500448386
-2508 -0.00133993377449 0.000844136021648 0.000154194147194
-2509 -0.000844565236483 0.00106662600427 -0.00105348263019
-2510 0.00061656966063 -0.000570231477204 0.000483066823209
-2511 2.70966877703e-05 -0.00142674634061 0.00143445861697
-2512 0.000490496597656 -0.000968057322313 -0.00139580521068
-2513 -0.00140332747749 0.000966158435589 -0.00112611141879
-2514 5.7807419625e-05 -0.000670699045883 0.000410438034611
-2515 -0.00130443136331 -7.69812613322e-05 -0.000115540740899
-2516 -6.82656433494e-05 -0.00106852489099 -0.00146843399928
-2517 0.000427102894662 -0.000846034908372 0.000485847646573
-2518 -0.00127372063146 0.00067906603339 -0.00113956132326
-2519 0.00129876481892 -0.000177448830012 -0.000188169529497
-2520 -0.00139979369443 0.000281240188281 0.000143525066084
-2521 0.000113263137452 -0.00140418438441 0.00119824564797
-2522 1.79008063321e-05 -0.00104596293479 0.00145731145495
-2523 -0.000571572166528 0.00125948062504 -0.00075325517452
-2524 0.00144832497159 -0.000276909287755 0.000855923067477
-2525 -0.00121826491363 -5.44193051343e-05 -0.000351753709907
-2526 -0.00131362724475 0.000303802144479 -9.26879029244e-05
-2527 0.00125885820562 -0.000552712718923 0.000858703890841
-2528 0.000889562730585 -0.000377376856435 0.000783294278879
-2529 0.0013849312686 -0.000154886873814 -0.000424382498505
-2530 0.00128956893748 0.000203334575799 -0.000165316691522
-2531 -7.2669845462e-05 0.00079705236035 -0.000691295467032
-2532 -0.000441965320499 0.000972388222839 -0.000766705078994
-2533 5.34032175124e-05 0.00119487820546 0.00118757656686
-2534 -4.19591136073e-05 0.00155309965507 0.00144664237384
-2535 -0.000631432086467 0.000696584791671 -0.00076392425563
-2536 0.00138846505165 -0.000839805121122 0.000845253986367
-2537 -0.00127812483357 -0.000617315138501 -0.000362422791017
-2538 -0.00137348716469 -0.000259093688888 -0.000103356984035
-2539 0.00119899828568 -0.00111560855229 0.000848034809731
-2540 0.000829702810646 -0.000940272689801 0.000772625197769
-2541 0.00132507134866 -0.000717782707181 -0.000435051579615
-2542 0.00122970901754 -0.000359561257568 -0.000175985772633
-2543 -0.000132529765401 0.000234156526983 -0.000701964548143
-2544 -0.000501825240438 0.000409492389472 -0.000777374160104
-2545 -6.45670242697e-06 0.000631982372093 0.00117690748575
-2546 -0.000101819033547 0.000990203821706 0.00143597329273
-2547 -0.000691292006407 0.000133688958304 -0.000774593336741
-2548 0.00132860513171 -0.00140270095449 0.000834584905257
-2549 -0.000565218943432 0.000531514803413 0.00110427869715
-2550 -0.00143334708463 -0.000821989522255 -0.000114026065145
-2551 0.00113913836574 0.00148345403758 0.00083736572862
-2552 0.000769842890706 -0.00150316852317 0.000761956116659
-2553 0.00126521142872 -0.00128067854055 -0.000445720660726
-2554 0.0011698490976 -0.000922457090935 -0.000186654853743
-2555 0.000580376124738 0.0013829864689 0.000764736940022
-2556 -0.000561685160378 -0.000153403443895 -0.000788043241215
-2557 -6.63166223664e-05 6.90865387258e-05 0.00116623840464
-2558 -0.000161678953486 0.000427307988339 0.00142530421162
-2559 -0.000751151926346 -0.000429206875063 -0.000785262417851
-2560 -0.00112044740138 -0.000253871012575 -0.000860672029812
-2561 -0.000625078863372 -3.13810299537e-05 0.00109360961604
-2562 -0.000720441194491 0.000326840419659 0.00135267542302
-2563 0.0010792784458 0.00092055820421 0.00082669664751
-2564 0.000709982970767 0.0010958940667 0.000751287035548
-2565 0.00120535150878 0.00131838404932 -0.000456389741836
-2566 0.00110998917766 -0.0014853529243 -0.000197323934853
-2567 0.000520516204799 0.000820090635531 0.000754067858912
-2568 -0.000621545080317 -0.000716299277262 -0.000798712322325
-2569 -0.000664985476665 -0.000406644918865 -0.00102147538686
-2570 0.000796149420448 0.0011184560229 0.00051507406654
-2571 0.000206676447589 0.000261941159495 0.00146646586031
-2572 0.000670076357474 0.000720630177788 -0.00136379796735
-2573 0.00116544489549 0.000943120160408 0.000590483678502
-2574 -0.000535378630636 -0.000693737321064 -0.00103492529133
-2575 -0.0011248516035 -0.00155025218447 -8.35334975677e-05
-2576 -0.00066145169361 -0.00109156316617 0.000248161098013
-2577 0.00060668265448 0.000842652591729 0.000517854889904
-2578 -0.00109414087164 -0.000794204889743 -0.00110755407993
-2579 0.000705578768654 -0.000200487105192 0.00152842556779
-2580 -0.00122021393462 -0.00119203073485 0.000175532309415
-2581 -0.000724845396604 -0.000969540752232 -0.00103214446797
-2582 0.000736289500509 0.00055556018953 0.00050440498543
-2583 0.000146816527649 -0.000300954673872 0.0014557967792
-2584 0.000610216437535 0.000157734344421 -0.00137446704846
-2585 0.00110558497555 0.000380224327041 0.000579814597391
-2586 -0.000595238550575 -0.00125663315443 -0.00104559437244
-2587 -0.00118471152343 0.0010488104054 -9.42025786781e-05
-2588 5.14541965294e-05 5.72667757412e-05 -0.00144709583706
-2589 0.000546822734541 0.000279756758362 0.000507185808793
-2590 -0.00115400079158 -0.00135710072311 -0.00111822316104
-2591 0.00141848465879 0.000948342836722 -0.000166831367276
-2592 -0.00128007385455 0.00140703185501 0.000164863228305
-2593 -0.00132535918045 -0.000833418920647 0.000671538978931
-2594 0.000832545468988 -0.000593090273988 -0.00110776151187
-2595 -0.000453697256199 -0.000164832842287 -2.47819713842e-06
-2596 0.000706472406014 -0.000990916119097 0.000175324877473
-2597 0.00127783700178 -0.000933886489327 0.000598910190333
-2598 -0.000498982582096 0.000756674805286 0.000504197553488
-2599 0.00137673311595 0.00118493223699 -0.00155247755501
-2600 -0.00062505564507 0.000358848960176 -0.0013746744804
-2601 -5.36910493071e-05 0.000415878589947 -0.00095108916754
-2602 -0.0010577448231 0.000656207236606 0.00043156876489
-2603 0.000817970874946 0.00108446466831 0.00153685207962
-2604 -0.00118381788608 0.000258381391497 -0.001447303269
-2605 -0.00138521910039 -0.00139631475401 0.000660869897821
-2606 0.000772685549049 -0.00115598610735 -0.00111843059298
-2607 -0.000513557176138 -0.000727728675654 -1.31472782488e-05
-2608 0.000646612486075 -0.00155381195246 0.000164655796363
-2609 0.00121797708184 -0.00149678232269 0.000588241109223
-2610 -0.000558842502035 0.000193778971919 0.000493528472378
-2611 0.00131687319601 0.000622036403619 -0.00156314663612
-2612 8.78502450693e-05 0.00150767890209 9.2027007765e-05
-2613 -0.000113550969246 -0.00014701724342 -0.000961758248651
-2614 -0.00111760474304 9.33114032392e-05 0.00042089968378
-2615 0.000758110955007 0.00052156883494 0.00152618299851
-2616 -0.00124367780601 -0.00030451444187 -0.00145797235011
-2617 -0.000427390726457 -0.000705166719456 -0.000249360247257
-2618 -0.000598749115328 -0.000181484916993 0.00154040189272
-2619 -0.00111222603044 -0.00120346013324 0.000961097353491
-2620 -0.00155751756322 -0.000862663917906 -0.000745574348715
-2621 0.00140303964569 0.000644598359817 0.0013625988181
-2622 -0.00115751135633 -0.000281952485672 0.00146777310412
-2623 0.000718204341714 0.000146304946029 -0.000588902004382
-2624 0.000272912808925 0.000487101161367 0.000866384716646
-2625 0.000844277404688 0.000544130791138 0.00128997002951
-2626 0.000672919015817 0.0010678125936 -8.22262537557e-05
-2627 -0.000613323709371 0.0014960700253 0.00102305706098
-2628 -0.00028584943208 0.000386633592688 0.000793755928048
-2629 -0.000487250646396 -0.00126806255282 -0.000260029328367
-2630 0.000114156774811 0.000967345024922 -0.000154855042354
-2631 -0.00117208595038 0.00139560245662 0.000950428272381
-2632 0.00154458094007 -0.00142555975127 -0.000756243429825
-2633 -0.0010460128874 -0.0013685301215 -0.000332658116965
-2634 -0.00121737127627 -0.000844848319039 0.00145710402301
-2635 0.000658344421774 -0.000416590887338 -0.000599571085493
-2636 0.000213052888986 -7.57946719995e-05 0.000855715635536
-2637 0.000784417484749 -1.8765042229e-05 0.0012793009484
-2638 0.000613059095877 0.000504916760234 -9.28953348661e-05
-2639 -0.00067318362931 0.000933174191935 0.00101238797987
-2640 -0.00034570935202 -0.000176262240679 0.000783086846938
-2641 -0.000547110566335 0.00133100003704 -0.000270698409478
-2642 5.4296854872e-05 0.000404449191555 -0.000165524123464
-2643 -0.00123194587032 0.000832706623256 0.00093975919127
-2644 0.00148472102013 0.00117350283859 -0.000766912510936
-2645 -0.00110587280734 0.00123053246836 -0.000343327198076
-2646 -0.00127723119621 -0.00140774415241 0.0014464349419
-2647 0.000598484501835 -0.000979486720705 -0.000610240166603
-2648 0.000925958779125 0.00107303526991 -0.000839541299533
-2649 0.000724557564809 -0.000581660875596 0.00126863186729
-2650 0.00132596498602 -0.00150821172109 0.0013738061533
-2651 3.97222608297e-05 -0.00107995428938 -0.000682868955201
-2652 -0.000405569271959 -0.000739158074046 0.000772417765827
-2653 -0.000606970486275 0.000768104203677 -0.000281367490588
-2654 -5.5630650674e-06 -0.000158446641812 -0.000176193204574
-2655 -0.00129180579025 0.000269810789889 0.00092909011016
-2656 0.00142486110019 0.000610607005227 -0.000777581592046
-2657 -0.00116573272728 0.000667636634998 -0.000353996279186
-2658 -0.00133709111615 0.00119131843746 0.00143576586079
-2659 0.000538624581895 -0.00154238255407 -0.000620909247713
-2660 0.000866098859186 0.000510139436548 -0.000850210380644
-2661 0.00066469764487 -0.00114455670896 0.00125796278617
-2662 0.00126610506608 0.00109085086878 0.00136313707219
-2663 -2.01376591098e-05 0.00151910830048 -0.000693538036311
-2664 -0.000465429191898 -0.00130205390741 0.000761748684717
-2665 -0.00120563934057 0.000292372746087 0.000692877141152
-2666 0.000952265308867 0.000532701392746 -0.00108642334965
-2667 -0.00033397741632 0.000960958824447 1.88599650824e-05
-2668 0.000826192245893 0.000134875547637 0.000196663039694
-2669 0.000624791031577 -0.00151982059787 -0.000857122216722
-2670 -0.000379262742217 -0.00127949195121 0.000525535715709
-2671 0.00149645295583 -0.000851234519514 -0.00153113939279
-2672 -0.000505335805191 0.00148464062691 -0.00135333631818
-2673 6.60287905718e-05 0.00154167025668 -0.000929751005319
-2674 0.00145116762993 7.02731280586e-05 -0.00102446364216
-2675 0.000164924904746 0.000498530559759 8.08196725698e-05
-2676 -0.0010640980462 0.00138417305823 -0.00142596510678
-2677 -0.00126549926051 -0.00027052308728 0.000682208060041
-2678 0.000892405388928 -3.01944406209e-05 -0.00109709243076
-2679 -0.000393837336259 0.00039806299108 8.19088397197e-06
-2680 0.000766332325953 -0.00042802028573 0.000185993958584
-2681 0.000564931111638 0.00107924199199 -0.000867791297832
-2682 -0.000439122662156 0.00131957063865 0.000514866634598
-2683 0.00143659303589 -0.00141413035288 -0.0015418084739
-2684 -0.000565195725131 0.000921744793543 -0.00136400539929
-2685 6.16887063234e-06 0.000978774423314 -0.00094042008643
-2686 0.00139130770999 -0.000492622705308 -0.00103513272327
-2687 0.000877830794885 -0.00151459792156 0.00154752116073
-2688 -0.00112395796614 0.000821277224864 -0.00143663418789
-2689 0.00129594537887 -0.000134401255695 -0.000776066916292
-2690 0.00029189160508 0.000105927390964 0.000606591016138
-2691 -0.000994351120107 0.000534184822665 -0.00145008409236
-2692 0.000165818542105 -0.000291898454145 -0.00127228101775
-2693 0.000737183137869 -0.000234868824375 -0.00084869570489
-2694 -0.001039636446 0.00145569247024 -0.000943408341735
-2695 0.000836079252043 -0.0012780085213 0.000161874972999
-2696 -0.00116570950898 0.00105786662513 0.000339678047611
-2697 -0.000594344913216 0.0011148962549 0.000763263360471
-2698 0.00156355973622 0.00135522490156 -0.00101603713033
-2699 0.000277317011038 -0.00137847608998 8.92461844013e-05
-2700 0.00143748667325 0.000957399056449 0.000267049259013
-2701 0.00123608545893 -0.000697297089062 -0.000786735997403
-2702 0.00023203168514 -0.000456968442403 0.000595921935028
-2703 -0.00105421104005 -2.87110107022e-05 -0.00146075317347
-2704 0.000105958622166 -0.000854794287512 -0.00128295009886
-2705 0.000677323217929 -0.000797764657742 -0.000859364786
-2706 -0.00109949636594 0.00089279663687 -0.000954077422846
-2707 0.00154898514218 -0.000129178579382 -0.00153338196207
-2708 -0.000452803618839 -0.000955261856192 -0.00135557888746
-2709 -0.000654204833155 0.000552000421532 0.00075259427936
-2710 0.00150369981629 0.000792329068191 -0.00102670621144
-2711 0.000217457091098 0.00122058649989 7.85771032909e-05
-2712 0.00137762675331 0.000394503223082 0.000256380177903
-2713 -0.000968044590365 -6.14905450427e-06 0.00146499228075
-2714 -0.000366637169158 -0.000932699899994 -0.00159179185647
-2715 0.00150907852889 -0.000504442468293 -0.000486508541732
-2716 0.0010637869961 -0.000163646252954 0.000968778179296
-2717 0.000862385781785 0.00134361602477 -8.50070771195e-05
-2718 0.00146379320299 0.00041706517928 2.01672088943e-05
-2719 0.000177550477805 0.00084532261098 0.00112545052363
-2720 -0.000267741054984 0.00118611882632 -0.000581221178577
-2721 0.00030362354078 0.00124314845609 -0.000157635865717
-2722 0.000132265151908 -0.00139512816468 -0.00152983214898
-2723 -0.00115397757328 -0.00096687073298 -0.000424548834245
-2724 -0.000826503295989 0.00108565125764 -0.000653849967175
-2725 -0.0010279045103 -0.000569044887871 0.00145432319964
-2726 -0.000426497089097 -0.00149559573336 -0.00160246093758
-2727 0.00144921860895 -0.00106733830166 -0.000497177622843
-2728 0.00100392707616 -0.000726542086321 0.000958109098186
-2729 0.00157529167192 -0.000669512456551 0.00138169441105
-2730 0.00140393328305 -0.000145830654087 9.49812778395e-06
-2731 0.000117690557866 0.000282426777613 0.00111478144252
-2732 -0.000327600974923 0.000623222992952 -0.000591890259688
-2733 0.00024376362084 0.000680252622723 -0.000168304946828
-2734 7.24052319687e-05 0.00120393442519 -0.00154050123009
-2735 -0.000441071683139 0.000181959208934 0.00104215265392
-2736 -0.000886363215928 0.000522755424273 -0.000664519048285
-2737 -0.00108776443024 -0.00113194072124 0.00144365411853
-2738 -0.000486357009036 0.00110346685651 0.00154882840455
-2739 0.00138935868901 0.00153172428821 -0.000507846703953
-2740 0.000944067156222 -0.00128943791969 0.000947440017075
-2741 0.00151543175198 -0.00123240828992 0.00137102532994
-2742 0.00134407336311 -0.000708726487454 -1.17095332645e-06
-2743 5.78306379263e-05 -0.000280469055753 0.00110411236141
-2744 0.000385304915217 -0.00138990548837 0.000874811228477
-2745 0.000183903700901 0.000117356789356 -0.000178974027938
-2746 0.000785311122108 -0.000809194056134 -7.37997419243e-05
-2747 -0.000500931603079 -0.000380936624433 0.00103148357281
-2748 -0.000946223135868 -4.01404090942e-05 -0.000675188129396
-2749 -0.000374858540104 1.68892206763e-05 -0.000251602816536
-2750 -0.000546216928976 0.00054057102314 0.00153815932344
-2751 0.00132949876907 0.00096882845484 -0.000518515785063
-2752 0.000884207236282 0.00130962467018 0.000936770935965
-2753 0.00145557183205 0.00136665429995 0.00136035624882
-2754 0.00128421344317 -0.00127162232082 -1.18400344368e-05
-2755 -2.02928201307e-06 -0.00084336488912 0.0010934432803
-2756 0.000325444995277 0.0012091571015 0.000864142147367
-2757 0.000124043780961 -0.000445539044011 -0.000189643109048
-2758 0.000725451202169 -0.0013720898895 -8.44688230347e-05
-2759 -0.000560791523018 -0.0009438324578 0.0010208144917
-2760 -0.00100608305581 -0.000603036242461 -0.000685857210506
-2761 0.00141566521875 0.000991390411038 -0.000754728754071
-2762 0.000411611444959 0.0012317190577 0.000627929178359
-2763 -0.000874631280228 -0.00150198193384 -0.00142874593014
-2764 0.000285538381984 0.000833893212588 -0.00125094285553
-2765 8.41371676685e-05 -0.000820802932922 0.000857230311289
-2766 -0.000919916606125 -0.000580474286263 -0.000922070179514
-2767 0.000955799091922 -0.000152216854562 0.00018321313522
-2768 -0.0010459896691 -0.000978300131372 0.000361016209832
-2769 -0.000474625073337 -0.000921270501602 0.000784601522691
-2770 0.000910513766025 0.00076929079301 0.000689888885846
-2771 0.000397036850916 -0.000252684423242 0.000110584346622
-2772 0.00155720651313 -0.00107876770005 0.000288387421234
-2773 0.00135580529881 0.000428494577671 -0.000765397835182
-2774 0.000351751525019 0.000668823224331 0.000617260097249
-2775 -0.000934491200168 0.00109708065603 -0.00143941501125
-2776 0.000225678462045 0.000270997379222 -0.00126161193664
-2777 0.000797043057808 0.000328027008992 -0.00083802662378
-2778 -0.000979776526065 -0.00114337011963 -0.000932739260625
-2779 0.000895939171982 -0.000715112687929 0.000172544054109
-2780 -0.00110584958904 -0.00154119596474 0.000350347128721
-2781 -0.000534484993276 -0.00148416633497 0.000773932441581
-2782 -0.00153853876707 -0.00124383768831 -0.00100536804922
-2783 0.000337176930977 -0.000815580256609 9.99152655117e-05
-2784 0.00149734659319 0.00152029488982 0.000277718340123
-2785 0.000140486522855 0.000817241137883 0.000291937234325
-2786 -0.000248762258829 0.000804945055916 -0.000841014879085
-2787 0.00101214844711 0.00148582721624 -0.000382079941745
-2788 -0.000374835321803 0.000407119210806 0.000442071510261
-2789 -0.00041827571815 0.000716773569203 0.000219308445727
-2790 -0.00158029030991 -0.00100724828805 0.000770944186276
-2791 -0.000319379603976 -0.000326366127718 0.00122987912362
-2792 -0.000933597562808 0.000306651642127 0.000369442721663
-2793 0.001412154654 -0.00109541977476 -0.00133069091215
-2794 0.00102290587232 -0.00110771585672 0.000698315397678
-2795 -0.000878141844981 -0.000426833696397 0.00115725033502
-2796 0.000896832809342 -0.00150554170183 -0.00118055663621
-2797 8.06266029154e-05 0.000254345304516 0.000281268153214
-2798 -0.000308622178768 0.000242049222549 -0.000851683960196
-2799 0.000952288527169 0.000922931382876 -0.000392749022855
-2800 -0.000434695241742 -0.000155776622561 0.00043140242915
-2801 -0.00047813563809 0.000153877735836 0.000208639364616
-2802 -0.000867384419773 0.000141581653869 -0.000924312748793
-2803 0.000393526286163 0.000822463814197 -0.000465377811453
-2804 -0.000993457482748 -0.00025624419124 0.000358773640553
-2805 0.00135229473406 0.00150364281511 -0.00134135999326
-2806 0.000963045952377 0.00149134673314 0.000687646316567
-2807 -0.000938001764921 -0.000989729529764 0.00114658125391
-2808 0.000836972889402 0.00109352088803 -0.00119122571732
-2809 0.00103845497685 0.000945493339074 -0.000628961991863
-2810 -0.000907291033066 -0.000233682235042 0.000122560671544
-2811 0.00035361967287 0.000447199925285 0.000581495608885
-2812 0.000523133132192 0.000535371411997 -0.000478827715927
-2813 0.000479692735845 0.000845025770394 -0.000701590780461
-2814 0.000923139339084 0.00111608284423 -0.00142743868633
-2815 -0.000977908378214 -0.00136499341868 -0.000968503748989
-2816 -0.000808394918892 -0.00127682193196 0.00113313134943
-2817 -0.000851835315239 -0.000967167573566 0.0009103682849
-2818 -0.000408388712 -0.00069611049973 0.000184520379032
-2819 0.000852521993936 -1.52283394022e-05 0.000643455316372
-2820 -0.0013671571599 -0.00137728950064 0.00106050256084
-2821 0.000978595056911 0.000382597505707 -0.000639631072974
-2822 -0.000967150953006 -0.000796578068409 0.000111891590434
-2823 0.000293759752931 -0.000115695908082 0.000570826527774
-2824 0.000463273212253 -2.75244213695e-05 -0.000489496797038
-2825 0.000419832815905 0.000282129937028 -0.000712259861572
-2826 0.000863279419144 0.000553187010864 -0.00143810776744
-2827 -0.00103776829815 0.00123406917119 -0.000979172830099
-2828 -9.54890287524e-05 -0.000127991990049 -0.000562125585635
-2829 -0.000911695235179 -0.00153006340693 0.000899699203789
-2830 -0.00046824863194 -0.0012590063331 0.000173851297921
-2831 0.00156542788408 0.00113360160251 -0.0010518016187
-2832 -0.00142701707984 0.00122177308922 0.00104983347973
-2833 0.000918735136971 -0.00018029832766 -0.000650300154084
-2834 -0.00102701087294 -0.00135947390178 0.000101222509324
-2835 0.000233899832992 -0.000678591741449 0.000560157446664
-2836 0.000403413292313 -0.000590420254736 -0.000500165878148
-2837 0.000359972895966 -0.000280765896339 -0.000722928942682
-2838 0.000803419499205 -9.70882250258e-06 -0.00144877684855
-2839 -0.00109762821809 0.000671173337825 -0.000989841911209
-2840 -0.000155348948692 -0.000690887823416 -0.000572794666746
-2841 -0.000971555155118 0.00106899918293 0.000889030122679
-2842 0.0002446572582 -0.000110176391182 -0.00152140563715
-2843 0.00150556796414 0.000570705769145 -0.00106247069981
-2844 -0.00148687699978 0.000658877255858 0.00103916439861
-2845 -0.00153031739612 0.000968531614255 0.000816401334081
-2846 -0.00108687079288 0.00123958868809 9.05534282132e-05
-2847 0.000174039913052 -0.00124148757482 0.000549488365554
-2848 0.000343553372374 -0.0011533160881 -0.000510834959258
-2849 0.000300112976027 -0.000843661729706 -0.000733598023792
-2850 0.000743559579266 -0.000572604655869 -0.00145944592966
-2851 -0.00115748813803 0.000108277504458 -0.00100051099232
-2852 -0.000215208868631 -0.00125378365678 -0.000583463747856
-2853 -0.00103141507506 0.000506103349567 0.000878361041568
-2854 0.00018479733826 -0.000673072224549 -0.00153207471826
-2855 0.0014457080442 7.8099357784e-06 -0.00107313978092
-2856 -0.00154673691972 9.59814224906e-05 0.0010284953175
-2857 0.000260206362734 -0.00121892561862 0.000313275396545
-2858 -0.00012904241895 -0.00123122170058 -0.000819676716864
-2859 0.00113186828699 -0.000550339540257 -0.000360741779524
-2860 -0.000255115481924 0.00153291087754 0.000463409672482
-2861 -0.00107132168835 0.000130839460656 -0.00123672396133
-2862 -0.00146057047003 0.000118543378689 0.000792282348496
-2863 -0.000199659764097 0.000799425539016 0.00125121728584
-2864 0.00157531489023 -0.000279282466421 -0.00108658968539
-2865 0.00153187449388 3.03718919764e-05 -0.00130935274993
-2866 0.000369859902116 0.00146830845796 -0.000757717009377
-2867 -0.000758422005103 0.000698957970336 0.00117858849724
-2868 0.00101655264922 -0.0003797500351 -0.00115921847399
-2869 0.000200346442794 0.00138013697125 0.000302606315435
-2870 -0.000188902338889 0.00136784088928 -0.000830345797975
-2871 0.00107200836705 -0.00111323537362 -0.000371410860634
-2872 -0.000314975401864 0.000970015044173 0.000452740591371
-2873 -0.000358415798211 0.00127966940257 0.000229977526837
-2874 -0.00152043038997 -0.000444352454678 0.000781613267386
-2875 -0.000259519684037 0.000236529705649 0.00124054820473
-2876 0.00151545497029 -0.000842178299788 -0.0010972587665
-2877 0.00147201457394 -0.000532523941391 -0.00132002183104
-2878 0.00108276579226 -0.000544820023358 0.000708984478788
-2879 -0.000818281925042 0.00013606213697 0.00116791941613
-2880 0.000956692729281 -0.000942645868467 -0.0011698875551
-2881 0.000345421520225 -0.00137493938715 -0.000546599447622
-2882 -4.38272614584e-05 -0.00138723546912 0.0014824068622
-2883 -9.44912999596e-05 0.00083104371494 0.00144888494312
-2884 -0.00148147506887 -0.000247664290496 -0.000888922028111
-2885 -0.00021334072078 -0.00147540695583 -0.00061922823622
-2886 -0.00137535531254 -3.74703898427e-05 -6.75924956711e-05
-2887 -0.000653253540965 0.000730576146261 0.00137625615452
-2888 0.00112172111336 -0.000348131859176 -0.000961550816709
-2889 -0.00154486877186 -0.000125641876555 0.000992730829141
-2890 0.00122784086969 -0.000137937958522 -0.000140221284269
-2891 0.00117717683119 -0.0010816171977 -0.000173743203354
-2892 -0.000209806937726 0.0010016332201 0.000650408248652
-2893 0.000285561600286 0.00122412320272 -0.000557268528733
-2894 -0.000103687181398 0.00121182712075 0.00147173778109
-2895 0.00061841459018 -0.00118208476638 -0.000246371991952
-2896 -0.000768569178731 0.000901165651418 0.000577779460054
-2897 -0.00027320064072 0.00112365563404 -0.00062989731733
-2898 -0.000662449422403 0.00111135955207 0.00139910899249
-2899 -0.000713113460904 0.000167680312894 0.00136558707341
-2900 0.00106186119342 -0.000911027692543 -0.000972219897819
-2901 0.00155722973143 -0.000688537709922 0.00098206174803
-2902 0.00116798094975 -0.000700833791889 -0.000150890365379
-2903 0.00111731691125 0.00151744539217 -0.000184412284464
-2904 -0.000269666857665 0.000438737386731 0.000639739167541
-2905 0.00124338997422 -0.00124668718596 -0.00146749867381
-2906 -0.000702356035696 0.00073609566316 -0.000715976010402
-2907 -0.000753020074197 -0.000207583576017 -0.000749497929487
-2908 -0.000583506614875 -0.000119412089305 0.00135213716894
-2909 0.000684627733215 -0.00134715475464 -0.00154012746241
-2910 0.00112807433645 -0.0010760976808 0.000895983054958
-2911 0.00107741029795 0.00114218150326 0.000862461135874
-2912 -0.00114226885588 -0.000219879657985 0.00127950838034
-2913 -0.000646900317869 2.61032463622e-06 7.18316029529e-05
-2914 -0.00020345371463 0.000273667398473 -0.000654016302915
-2915 0.000518648056948 0.00104171393458 0.000789832347276
-2916 0.000688161516269 0.00112988542129 -0.000270490977536
-2917 0.00118353005428 0.00135237540391 -0.00147816775492
-2918 -0.000762215955635 0.000173199829794 -0.000726645091513
-2919 -0.000812879994137 -0.000770479409384 -0.000760167010598
-2920 -0.000643366534815 -0.000682307922672 0.00134146808782
-2921 0.000624767813276 0.00125190783523 -0.00155079654352
-2922 0.00106821441651 0.00152296490907 0.000885313973848
-2923 -0.00137164223514 -0.000870946978064 -0.000832795799195
-2924 -0.00120212877582 -0.000782775491352 0.00126883929923
-2925 -0.000706760237809 -0.000560285508731 6.11625218425e-05
-2926 -0.00026331363457 -0.000289228434894 -0.000664685384025
-2927 0.000458788137008 0.00047881810121 0.000779163266165
-2928 0.00062830159633 0.000566989587922 -0.000281160058646
-2929 0.00112367013434 0.000789479570543 -0.00148883683603
-2930 -0.000822075875575 -0.000389696003573 -0.000737314172623
-2931 -0.000872739914076 -0.00133337524275 -0.000770836091708
-2932 6.95393553248e-05 0.000466522019242 -0.000353788847244
-2933 0.000564907893336 0.000689012001863 -0.00156146562463
-2934 0.00100835449658 0.0009600690757 0.000874644892738
-2935 -0.00143150215508 -0.00143384281143 -0.000843464880306
-2936 -0.00126198869576 -0.00134567132472 0.00125817021812
-2937 -0.000766620157748 -0.0011231813421 5.04934407321e-05
-2938 0.00044959225557 0.00085960150702 0.00080201610414
-2939 0.000398928217069 -8.40777321573e-05 0.000768494185055
-2940 0.000568441676391 4.09375455489e-06 -0.000291829139757
-2941 -0.00132538239875 -0.00122364891078 -2.21353478657e-05
-2942 -0.000881935795514 -0.00095259183694 -0.000747983253733
-2943 -0.000932599834015 0.00126568734712 -0.000781505172818
-2944 9.67943538536e-06 -9.63738141246e-05 -0.000364457928355
-2945 0.000505047973397 0.000126116168496 -0.00157213470574
-2946 0.000948494576636 0.000397173242333 0.000863975811627
-2947 -0.00149136207502 0.00116521977844 -0.000854133961416
-2948 -0.0013218486157 0.00125339126515 0.00124750113701
-2949 -0.000826480077687 0.00147588124777 3.98243596217e-05
-2950 0.000389732335631 0.000296705673654 0.000791347023029
-2951 0.000339068297129 -0.000646973565524 0.000757825103945
-2952 0.00128134756653 0.00115292369647 0.00117487234841
-2953 0.000465141360104 -0.000249147720415 -0.000525261285401
-2954 7.58925784204e-05 -0.000261443802382 0.00150374502442
-2955 2.52285399192e-05 -0.00120512304156 0.00147022310534
-2956 -0.00136175522899 0.000878127376237 -0.00086758386589
-2957 -0.00086638669098 0.00110061735886 0.00108669777996
-2958 -0.00125563547266 0.00108832127689 -4.62543334503e-05
-2959 -0.000533533701086 -0.00130559061024 0.00139759431674
-2960 0.00124144095324 0.000777659807558 -0.000940212654488
-2961 -0.00142514893199 0.00100014979018 0.00101406899136
-2962 0.000574794899486 -0.00072387206707 -0.00159625369132
-2963 0.00129689667106 4.41744690338e-05 -0.000152405041133
-2964 -9.0087097847e-05 -0.0010345335364 0.000671746410873
-2965 0.000405281440164 -0.000812043553782 -0.000535930366512
-2966 1.6032658481e-05 -0.000824339635749 0.00149307594331
-2967 -3.46313800202e-05 0.00139393954831 0.00145955402423
-2968 -0.00142161514893 0.000315231542871 -0.000878252947001
-2969 -0.000153480800841 -0.000912511122461 -0.00060855915511
-2970 -0.0013154953926 0.000525425443524 -5.69234145607e-05
-2971 -0.000593393621025 0.00129347197963 0.00138692523563
-2972 0.0011815810333 0.000214763974191 -0.000950881735598
-2973 -0.00148500885192 0.000437253956812 0.00100339991025
-2974 0.00128770078963 0.000424957874845 -0.000129552203158
-2975 0.00123703675112 -0.000518721364333 -0.000163074122243
-2976 -0.000149947017786 0.00156452905346 0.000661077329762
-2977 -0.000195232343683 -0.000675921722197 0.00116775308039
-2978 -0.00119928611748 -0.000435593075538 -0.000611547410415
-2979 -0.000635145163868 0.00153006137989 1.27904789416e-06
-2980 0.00129779030842 -0.000746254544871 -0.00150550573145
-2981 -0.000753994584689 -0.000776389290877 0.00109512429179
-2982 0.000631144254673 0.000914172003735 0.00100041165495
-2983 -0.00119390740487 0.00142959381121 -7.13497407037e-05
-2984 -3.37377426606e-05 0.000603510534402 0.000106453333908
-2985 0.00107643578746 0.000573375788397 -0.000454875066082
-2986 7.23820136674e-05 0.000813704435056 0.000927782866348
-2987 0.000636522967277 -0.000382599532748 0.00154060932466
-2988 -0.00136526579374 -0.00120868280956 -0.00144354602397
-2989 0.000517673546456 0.000472908219717 -0.00052750385468
-2990 -0.00125914603742 -0.000998488908905 -0.000622216491525
-2991 7.77607262715e-05 -0.000483067101428 0.00146798053606
-2992 0.00123793038848 -0.00130915037824 -0.00151617481256
-2993 -0.000813854504628 -0.00133928512424 0.00108445521068
-2994 0.00134405014481 -0.00109895647758 -0.000694845280123
-2995 -0.00125376732481 0.000866697977846 -8.2018821814e-05
-2996 -9.35976626e-05 4.06147010355e-05 9.57842527976e-05
-2997 0.00101657586752 1.04799550298e-05 -0.000465544147193
-2998 1.2522093728e-05 0.000250808601689 0.000917113785238
-2999 0.000576663047337 -0.000945495366115 0.00152994024355
-3000 -0.00142512571368 0.00139037978031 -0.00145421510508
-3001 0.000702736110312 -0.000547669521006 0.000246853854201
-3002 0.00130414353152 -0.0014742203665 0.000352028140215
-3003 -0.00129367393811 0.000491434088934 0.000964854598524
-3004 0.00142299295234 0.000832230304273 -0.000741817103682
-3005 0.000143973869307 -0.000648137089685 0.000174225065603
-3006 -2.7384519565e-05 -0.000124455287222 -0.00119797121766
-3007 0.000536756434044 -0.00132075925503 -0.00058514475935
-3008 0.000864230711335 0.000731762735594 -0.00081444589228
-3009 -0.00118755418178 0.000701627989588 -0.00137577429227
-3010 -0.00135891257065 0.00122530979205 0.000413987847702
-3011 -2.20058069609e-05 -0.00142122682371 -0.000657773547947
-3012 -0.00046729733975 -0.00108043060837 0.000797513173081
-3013 0.000642876190372 -0.00111056535437 0.00023618477309
-3014 0.00124428361158 0.00112484222337 0.000341359059104
-3015 -0.00135353385805 -7.14617444326e-05 0.000954185517413
-3016 -0.00102605958075 -0.00118089817705 0.000724884384483
-3017 8.41139493671e-05 -0.00121103292305 0.000163555984493
-3018 -8.72444395044e-05 -0.000687351120589 -0.00120864029877
-3019 0.00124966232418 -0.000171929313112 0.000881556728816
-3020 0.000804370791395 0.000168866902227 -0.00082511497339
-3021 -0.00124741410172 0.000138732156221 -0.00138644337338
-3022 -0.00064600668051 -0.000787818689269 -0.00128126908737
-3023 -8.18657269003e-05 0.00117783576616 -0.000668442629058
-3024 -0.000527157259689 0.0015186319815 0.00078684409197
-3025 0.000583016270433 0.00148849723549 0.00022551569198
-3026 0.00118442369164 0.000561946390005 0.000330689977994
-3027 -0.00141339377798 -0.0006343575778 0.000943516436303
-3028 -0.00108591950069 0.00141816441282 0.000714215303373
-3029 2.42540294277e-05 0.00138802966681 0.000152886903382
-3030 -0.000147104359444 -0.00125024695396 -0.00121930937988
-3031 0.00118980240424 -0.000734825146479 0.000870887647705
-3032 0.000744510871456 -0.00039402893114 -0.000835784054501
-3033 -0.00130727402166 -0.000424163677146 -0.00139711245449
-3034 -0.000705866600449 -0.00135071452264 -0.00129193816848
-3035 -0.00014172564684 0.000614939932794 -0.000679111710168
-3036 -0.000587017179628 0.000955736148133 0.00077617501086
-3037 0.00129592216057 -0.000524631245825 -0.00146974124309
-3038 0.0011245637717 -9.49443362088e-07 0.000320020896883
-3039 -0.000700487887845 0.000514472364115 -0.000751740498766
-3040 -0.00114577942063 0.000855268579454 0.000703546222262
-3041 -3.56058905117e-05 0.000825133833448 0.000142217822272
-3042 -0.000206964279383 0.00134881563591 -0.00122997846099
-3043 0.00112994248431 -0.00129772097985 0.000860218566595
-3044 0.000684650951516 -0.000956924764507 -0.000846453135611
-3045 -0.0013671339416 -0.000987059510513 -0.0014077815356
-3046 -0.000765726520388 0.00124834806723 -0.00130260724959
-3047 -0.000201585566779 5.20440994275e-05 -0.000689780791279
-3048 0.000125888710511 -0.00105739233319 -0.000919081924209
-3049 -7.55125038046e-05 0.000449869944537 0.00118909124261
-3050 -0.0010795662776 0.000690198591196 -0.000590209248194
-3051 -0.000515425323989 -0.000506105376608 2.26172101149e-05
-3052 0.000644744338223 -0.00133218865342 0.000200420284727
-3053 -0.00140704055489 -0.00136232339942 -0.000360908115264
-3054 0.000750864094551 -0.00112199475276 0.00102174981717
-3055 -0.00107418756499 -0.000606572945288 -5.00115784829e-05
-3056 8.59820972182e-05 -0.0014326562221 0.000127791496129
-3057 0.00119615562734 -0.0014627909681 -0.000433536903862
-3058 0.000192101853546 -0.00122246232144 0.000949121028569
-3059 0.000756242807156 0.000743192133985 -0.00160001093636
-3060 -0.00124554595387 -8.28911428245e-05 -0.00142220786174
-3061 -0.000135372423744 -0.00011302588883 0.0011784221615
-3062 -0.00113942619754 0.000127302757829 -0.000600878329305
-3063 -0.000575285243929 -0.00106900120998 1.19481290046e-05
-3064 0.000584884418284 0.00126687393645 0.000189751203616
-3065 -0.000694134664749 -0.00021349345751 0.0011057933729
-3066 0.000691004174612 0.0014770678371 0.00101108073606
-3067 -0.00113404748493 -0.00116946877865 -6.06806595933e-05
-3068 2.61221772788e-05 0.00116640636777 0.000117122415018
-3069 0.0011362957074 0.00113627162176 -0.000444205984972
-3070 0.000132241933607 0.00137660026842 0.000938451947458
-3071 0.000696382887216 0.000180296300619 0.00155127840577
-3072 -0.00130540587381 -0.000645786976191 -0.00143287694285
-3073 -3.91164552647e-05 -0.00126167635235 -0.000433744335803
-3074 0.00142201844185 0.000263424589414 0.0011028051176
-3075 -0.000479029275449 0.000944306749741 -0.0016002183683
-3076 0.000757136444515 -4.72368799192e-05 0.000208846796558
-3077 -0.00137064450635 8.80887269254e-05 0.00117821472956
-3078 9.04903907641e-05 -0.00154876875455 -0.000447194240277
-3079 -0.00103779151645 0.000843839181062 0.00148911126634
-3080 -0.000574391606569 0.00130252819935 -0.00134115256132
-3081 0.00123255167588 -1.2378841754e-05 0.00110558594096
-3082 -0.000468271850241 0.00151272210001 -0.000519823028875
-3083 0.000792638855695 -0.000968354162899 -6.0888091535e-05
-3084 0.00125603876558 -0.000509665144607 0.000270806504045
-3085 -9.89763752041e-05 0.00133738623752 -0.000444413416914
-3086 0.00136215852191 -0.000299471243953 0.00109213603649
-3087 -0.000538889195389 0.000381410916374 0.00155107097383
-3088 0.000697276524576 -0.000610132713286 0.000198177715448
-3089 -0.000657738616209 0.00123691866884 -0.000517042205512
-3090 0.000803396280904 -0.000399938812633 0.00101950724789
-3091 -0.00109765143639 0.000280943347695 0.00147844218523
-3092 -0.000634251526509 0.000739632365987 -0.00135182164243
-3093 0.00117269175594 -0.000575274675121 0.00109491685985
-3094 -0.000528131770181 0.000949826266641 -0.000530492109986
-3095 0.000732778935756 -0.00153124999627 -7.15571726454e-05
-3096 0.00119617884564 -0.00107256097797 0.000260137422935
-3097 0.00085885199873 -0.00113342415116 -0.00135464356199
-3098 0.000763489667611 -0.000775202701544 -0.00109557775501
-3099 -0.00113755804969 -9.43205412165e-05 -0.000636642817668
-3100 0.000882339088431 0.00153124796922 0.000972535424329
-3101 -0.000472676052354 0.000216340928117 0.000257315503369
-3102 -0.000568038383473 0.00057456237773 0.000516381310352
-3103 0.000692872322463 0.00125544453806 0.000975316247692
-3104 0.000323576847426 0.00143078040055 0.000899906635731
-3105 -0.00103143829336 0.000115873359437 0.000184686714772
-3106 0.00126239198868 -0.00123763096623 -0.00103361804752
-3107 0.000134110081458 0.00115497696938 0.000902687459095
-3108 -0.00100795120366 -0.000381412943416 -0.000650092722142
-3109 0.000798992078791 0.00146563843871 -0.0013653126431
-3110 0.000703629747671 -0.00133809853491 -0.00110624683612
-3111 -0.00119741796963 -0.000657216374583 -0.000647311898779
-3112 -0.00156671344466 -0.000481880512095 -0.00072272151074
-3113 -0.000532535972293 -0.00034655490525 0.000246646422259
-3114 -0.000627898303413 1.16665443626e-05 0.000505712229242
-3115 0.000633012402524 0.00069254870469 0.000964647166582
-3116 0.000263716927487 0.000867884567178 0.00088923755462
-3117 -0.0010912982133 -0.00044702247393 0.000174017633661
-3118 -0.00118666054442 -8.88010243168e-05 0.000433083440644
-3119 7.42501615185e-05 0.00059208113601 0.000892018377984
-3120 -0.0010678111236 -0.000944308776782 -0.000660761803253
-3121 0.000739132158852 0.000902742605344 -0.00137598172421
-3122 0.000643769827732 0.00126096405496 -0.00111691591723
-3123 -0.00125727788957 -0.00122011220795 -0.000657980979889
-3124 0.00153538505863 -0.00104477634546 -0.000733390591851
-3125 0.000180369917846 0.000802275036664 -0.00144861051281
-3126 -0.000687758223352 -0.000551229289004 0.000495043148131
-3127 0.000573152482584 0.000129652871323 0.000953978085472
-3128 0.000203857007547 0.000304988733811 0.00087856847351
-3129 -0.00115115813324 -0.0010099183073 0.000163348552551
-3130 -0.00124652046436 -0.000651696857684 0.000422414359533
-3131 1.43902415791e-05 2.91853026436e-05 0.000881349296874
-3132 -0.00112767104354 -0.00150720461015 -0.000671430884363
-3133 0.000679272238912 0.000339846771977 -0.00138665080532
-3134 0.000583909907792 0.00069806822159 -0.00112758499834
-3135 -0.00131713780951 0.00137895038192 -0.000668650061
-3136 0.00147552513869 0.00155428624441 -0.000744059672961
-3137 0.000120509997907 0.000239379203297 -0.00145927959392
-3138 -0.000747618143292 -0.00111412512237 0.000484374067021
-3139 0.00128605837272 0.00127848281324 -0.000741278849597
-3140 0.000143997087608 -0.000257907099555 0.0008678993924
-3141 -0.00121101805318 -0.00157281414066 0.00015267947144
-3142 -0.0013063803843 -0.00121459269105 0.000411745278423
-3143 -4.54696783603e-05 -0.000533710530723 0.000870680215763
-3144 -0.000414765153397 -0.000358374668235 0.000795270603802
-3145 8.06033846141e-05 -0.000135884685614 -0.000412406173583
-3146 0.00154173828173 0.00138921625615 0.00112414327982
-3147 -0.00035930943557 -0.00109186000676 -0.00157888020608
-3148 0.000104090474315 -0.000633170988467 -0.0012471856105
-3149 -0.00125092466647 0.00121388039366 0.00119955289178
-3150 0.000210210230643 -0.000422977087813 -0.000425856078057
-3151 0.00147112093658 0.000257905072514 3.30788592836e-05
-3152 -0.00045467176669 -0.000733638557146 -0.00131981439909
-3153 0.00135227151576 0.00111341282498 0.00112692410318
-3154 -0.000348552010362 -0.000523444656493 -0.000498484866654
-3155 0.000912358695574 0.000157437503835 -3.95499293142e-05
-3156 0.00137575860546 0.000616126522127 0.000292144666266
-3157 2.07434646747e-05 -0.000698780518981 -0.000423075254693
-3158 0.00148187836179 0.000826320422781 0.00111347419871
-3159 -0.00041916935551 0.00150720258311 -0.00158954928719
-3160 4.42305543755e-05 -0.00119606682183 -0.00125785469161
-3161 -0.00131078458641 0.000650984560292 0.00118888381067
-3162 0.000150350310704 -0.00098587292118 -0.000436525159167
-3163 0.00141126101664 -0.000304990760853 2.24097781732e-05
-3164 -0.00051453168663 -0.00129653439051 -0.0013304834802
-3165 0.00129241159582 0.000550516991613 0.00111625502207
-3166 -0.000408411930302 -0.00108634048986 -0.000509153947765
-3167 0.000852498775635 -0.000405458329532 -5.02190104246e-05
-3168 0.00131589868552 5.32306887602e-05 0.000281475585156
-3169 -0.000579770319173 -0.000562658687396 0.00128060819221
-3170 0.00157813433027 -0.000322330040737 -0.000498692298596
-3171 -0.00101968313936 -0.00151863400854 0.000114134159713
-3172 0.000140486522855 0.000817241137883 0.000291937234325
-3173 -0.00113853256018 -0.000663126256076 0.00120797940361
-3174 0.000246606279183 0.00102743503854 0.00111326676676
-3175 -0.00157844538036 0.00154285684601 4.15053711151e-05
-3176 -0.00041827571815 0.000716773569203 0.000219308445727
-3177 0.000691897811972 0.000686638823198 -0.000342019954264
-3178 -0.000312155961822 0.000926967469857 0.00104063797817
-3179 0.000251984991787 -0.000269336497947 -0.00150849398676
-3180 0.001412154654 -0.00109541977476 -0.00133069091215
-3181 -0.000639630239113 -0.00112555452076 0.0012699391111
-3182 0.00151827441033 -0.000885225874104 -0.000509361379707
-3183 -0.0010795430593 0.00108042858133 0.000103465078603
-3184 8.06266029154e-05 0.000254345304516 0.000281268153214
-3185 -0.00119839248012 -0.00122602208944 0.0011973103225
-3186 0.000186746359243 0.000464539205169 0.00110259768565
-3187 0.00152365312293 0.000979961012646 3.08362900047e-05
-3188 -0.00047813563809 0.000153877735836 0.000208639364616
-3189 0.000632037892032 0.000123742989831 -0.000352689035374
-3190 -0.000372015881762 0.00036407163649 0.00102996889706
-3191 0.000192125071848 -0.000832232331314 -0.00151916306787
-3192 0.00135229473406 0.00150364281511 -0.00134135999326
-3193 0.000318198134822 -0.000434406486205 0.00035970896602
-3194 0.00014683974595 8.92753162582e-05 -0.00101248731724
-3195 0.00148374650964 0.000604697123735 0.00107770971034
-3196 0.00103845497685 0.000945493339074 -0.000628961991863
-3197 -0.00101332991626 0.000915358593068 -0.00119029039185
-3198 -0.000411922495055 -1.11922524213e-05 -0.00108511610584
-3199 0.000152218458555 -0.00120749622023 -0.000472289647531
-3200 0.000479692735845 0.000845025770394 -0.000701590780461
-3201 -0.00157209215727 0.000814891024389 -0.00126291918045
-3202 0.0014185078771 0.00133857282685 0.000526842959521
-3203 -0.000406543782451 -0.00130796378891 -0.000544918436129
-3204 -0.000851835315239 -0.000967167573566 0.0009103682849
-3205 0.000258338214883 -0.000997302319572 0.000349039884909
-3206 0.00085974563609 0.00123810525817 0.000454214170923
-3207 0.0014238865897 4.18012903683e-05 0.00106704062923
-3208 0.000978595056911 0.000382597505707 -0.000639631072974
-3209 -0.000300424026123 -0.00109776988825 0.000276411096311
-3210 -0.000471782414994 -0.000574088085788 -0.00109578518695
-3211 9.23585386152e-05 0.00139156636964 -0.000482958728641
-3212 0.000419832815905 0.000282129937028 -0.000712259861572
-3213 0.00153000634603 0.000251995191022 -0.00127358826156
-3214 0.00135864795716 0.000775676993485 0.00051617387841
-3215 -0.00046640370239 0.00129109880096 -0.000555587517239
-3216 -0.000911695235179 -0.00153006340693 0.000899699203789
-3217 0.000198478294943 -0.00156019815294 0.000338370803799
-3218 0.000799885716151 0.000675209424806 0.000443545089813
-3219 0.00136402666976 -0.000521094542999 0.00105637154812
-3220 0.000918735136971 -0.00018029832766 -0.000650300154084
-3221 -0.000360283946062 0.00150129270162 0.000265742015201
-3222 -0.000531642334934 -0.00113698391916 -0.00110645426806
-3223 0.000805264428755 -0.000621562111678 0.000983742759524
-3224 0.000359972895966 -0.000280765896339 -0.000722928942682
-3225 0.00147014642609 -0.000310900642345 -0.00128425734267
-3226 0.00129878803722 0.000212781160118 0.0005055047973
-3227 -0.000526263622329 0.000728202967595 -0.000566256598349
-3228 -0.000971555155118 0.00106899918293 0.000889030122679
-3229 0.000138618375004 0.00103886443693 0.000327701722688
-3230 0.000740025796211 0.000112313591439 0.000432876008702
-3231 0.00130416674982 -0.00108399037637 0.00104570246701
-3232 -0.00153031739612 0.000968531614255 0.000816401334081
-3233 -0.000420143866001 0.000938396868249 0.000255072934091
-3234 -0.000591502254873 0.00146207867071 -0.00111712334917
-3235 0.000745404508815 -0.00118445794504 0.000973073678414
-3236 0.000300112976027 -0.000843661729706 -0.000733598023792
-3237 0.00141028650615 -0.000873796475712 -0.00129492642378
-3238 -0.00115026449588 0.00136161110203 -0.00118975213777
-3239 -0.000586123542269 0.000165307134228 -0.00057692567946
-3240 -0.00103141507506 0.000506103349567 0.000878361041568
-3241 -0.000460050479294 0.000563132979338 0.00130194635443
-3242 -0.00146410425309 0.000803461625997 -0.000477354136375
-3243 -0.000899963299479 -0.000392842341807 0.000135472321934
-3244 0.000260206362734 -0.00121892561862 0.000313275396545
-3245 0.00137037989286 -0.00124906036462 -0.000248053003445
-3246 0.000366326119062 -0.00100873171796 0.00113460492899
-3247 0.000930467072671 0.000956922737466 -0.00141452703594
-3248 -0.00107132168835 0.000130839460656 -0.00123672396133
-3249 0.00081161765185 -0.0013495279333 -0.000320681792043
-3250 -0.000965201932022 0.000341033361309 -0.000415394428888
-3251 0.000371704831666 0.000856455168786 -0.00148715582454
-3252 0.00153187449388 3.03718919764e-05 -0.00130935274993
-3253 -0.000519910399234 2.37145970681e-07 0.00129127727332
-3254 -0.00152396417303 0.00024056579263 -0.000488023217486
-3255 -0.000959823219418 -0.000955738175174 0.000124803240823
-3256 0.000200346442794 0.00138013697125 0.000302606315435
-3257 0.00131051997292 0.00135000222524 -0.000258722084555
-3258 0.000306466199122 -0.00157162755133 0.00112393584787
-3259 0.000870607152732 0.000394026904099 -0.00142519611705
-3260 -0.000358415798211 0.00127966940257 0.000229977526837
-3261 0.000751757731911 0.00124953465656 -0.000331350873153
-3262 -0.00102506185196 -0.000221862472057 -0.000426063509998
-3263 0.000311844911726 0.000293559335419 -0.00149782490565
-3264 0.00147201457394 -0.000532523941391 -0.00132002183104
-3265 -0.00112042418308 0.000136358977555 -0.000166997703016
-3266 0.00103748046636 0.000376687624215 0.00121566022941
-3267 -0.00156033700327 -0.00081961634359 -0.00133347173551
-3268 -0.000400167341054 0.00151625880283 -0.0011556686609
-3269 0.00148277199915 3.5891408876e-05 -0.000239626491614
-3270 -0.000294047584726 -0.00143550571975 -0.000334339128459
-3271 0.00104285917896 -0.000920083912269 -0.00140610052411
-3272 -0.000958929582059 0.00141579123415 -0.0012282974495
-3273 0.000151243948063 0.00138565648815 0.00137233257375
-3274 -0.000852809825731 -0.00153597328843 -0.000406967917056
-3275 -0.000288668872122 0.000429681167004 0.000205858541253
-3276 0.000871500790091 -0.000396402109806 0.000383661615864
-3277 -0.00118028410302 -0.000426536855811 -0.000177666784126
-3278 0.000977620546419 -0.000186208209152 0.0012049911483
-3279 0.00154176150003 -0.00138251217696 -0.00134414081662
-3280 0.000312738549086 -0.000496869678485 0.000311032827266
-3281 0.00142291207921 -0.000527004424491 -0.000250295572724
-3282 -0.000353907504665 0.00116355687012 -0.000345008209569
-3283 0.000982999259023 -0.00148297974564 -0.00141676960522
-3284 -0.001018789502 0.000852895400788 -0.00123896653061
-3285 9.13840281237e-05 0.000822760654782 0.00136166349264
-3286 -0.00091266974567 0.00106308930144 -0.000417636998167
-3287 -0.000348528792061 -0.000133214666363 0.000195189460142
-3288 0.000811640870152 -0.000959297943173 0.000372992534754
-3289 -0.000222455729086 0.000264611178747 -0.0010878969292
-3290 -0.000393814117958 0.00078829298121 0.000701865210769
-3291 0.00094309264573 0.00130371478869 -0.000369896184881
-3292 0.000497801112942 -0.00151744741921 0.00108539053615
-3293 -0.00155398378017 -0.00154758216521 0.000524062136157
-3294 -0.000952576358963 0.00068782541253 0.000629236422171
-3295 -0.000388435405354 -0.000508478555274 0.00124206288048
-3296 -6.09611280636e-05 0.00154404343535 0.00101276174755
-3297 0.00104921240206 0.00151390868934 0.000451433347559
-3298 0.000877854013187 -0.00112436793143 -0.000920762935702
-3299 -0.000947197646359 -0.000608946123953 0.00116943409188
-3300 -0.00139248917915 -0.000268149908615 -0.000537237610324
-3301 -0.000282315649026 -0.00029828465462 -0.00109856601031
-3302 0.000319091772182 -0.00122483550011 -0.0009933917243
-3303 0.000883232725791 0.00074081895532 -0.000380565265991
-3304 0.000437941193002 0.00108161517066 0.00107472145504
-3305 -0.000841077890031 -0.0003987522233 -0.00117119479891
-3306 -0.0010124362789 0.000124929579164 0.00061856734106
-3307 -0.000448295325293 -0.00107137438864 0.00123139379937
-3308 -0.000120821048003 0.000981147601979 0.00100209266644
-3309 0.000989352482119 0.000951012855974 0.000440764266449
-3310 0.000817994093247 0.00147469465844 -0.000931432016813
-3311 -0.0010070575663 -0.00117184195732 0.00115876501077
-3312 -0.00145234909909 -0.000831045741982 -0.000547906691434
-3313 -0.000342175568965 -0.000861180487987 -0.00110923509142
-3314 0.000259231852242 0.00137422708976 -0.00100406080541
-3315 0.000823372805851 0.000177923121953 -0.000391234347102
-3316 0.000378081273063 0.000518719337292 0.00106405237393
-3317 -0.00090093780997 -0.000961648056667 -0.00118186388002
-3318 -0.00107229619884 -0.000437966254203 0.00060789825995
-3319 0.000264610564846 7.74555532736e-05 -0.000463863135699
-3320 -0.000180680967942 0.000418251768612 0.000991423585329
-3321 0.000929492562179 0.000388117022607 0.000430095185338
-3322 0.00153089998339 -0.000538433822883 0.000535269471352
-3323 -0.00106691748624 0.00142722063255 0.00114809592966
-3324 -0.00151220901903 -0.00139394157535 -0.000558575772544
-3325 -0.000402035488905 -0.00142407632135 -0.00111990417253
-3326 0.000199371932303 0.00081133125639 -0.00101472988652
-3327 0.000763512885912 -0.000384972711414 -0.000401903428212
-3328 0.0010909871632 -0.00149440914403 -0.000631204561142
-3329 -0.00096079772991 -0.00152454389003 -0.00119253296113
-3330 -0.00113215611878 -0.00100086208757 0.00059722917884
-3331 0.000204750644907 -0.000485440280093 -0.00047453221681
-3332 -0.000240540887882 -0.000144644064755 0.000980754504218
-3333 0.00086963264224 -0.00017477881076 0.000419426104228
-3334 0.00147104006345 -0.00110132965625 0.000524600390242
-3335 -0.00112677740618 0.00086432479918 0.00113742684855
-3336 -0.00157206893897 0.00120512101452 -0.000569244853655
-3337 -0.0010007043432 0.00126215064429 -0.000145659540795
-3338 0.00115720030624 0.00150247929095 0.00123699839164
-3339 -0.00144061716339 0.000306175323144 -0.00131213357329
-3340 -0.000280447501175 -0.000519907953666 -0.00113433049868
-3341 0.000829726028947 -0.000550042699672 0.00146629952457
-3342 -0.000174327744847 -0.000309714053012 -0.000313000966238
-3343 0.000389813208762 -0.00150601802082 0.000299825492071
-3344 0.00154998287098 0.000829857125607 0.000477628566683
-3345 0.000270963787942 -0.000650510268351 0.00139367073597
-3346 -0.00150585579593 0.00104005102626 0.00129895809912
-3347 -0.000168949032243 0.00155547283374 0.000227196703473
-3348 0.00099122062997 0.000729389556928 0.000404999778085
-3349 -0.00106056426314 0.000699254810922 -0.000156328621905
-3350 0.0010973403863 0.000939583457582 0.00122632931053
-3351 -0.00150047708333 -0.000256720510223 -0.0013228026544
-3352 -0.000340307421114 -0.00108280378703 -0.00114499957979
-3353 0.000769866109008 -0.00111293853304 0.00145563044346
-3354 -0.000234187664786 -0.000872609886379 -0.000323670047348
-3355 0.0011027190989 -0.000357188078902 -0.001395431443
-3356 -0.000899069662119 -0.00118327135571 -0.00121762836839
-3357 0.000211103868002 -0.00121340610172 0.00138300165486
-3358 -0.00156571571587 0.000477155192894 0.00128828901801
-3359 -0.000228808952182 0.000992577000371 0.000216527622363
-3360 0.000931360710031 0.000166493723561 0.000394330696975
-3361 0.000886075384133 0.00108800137113 0.000901006447601
-3362 0.00049682660245 0.00107570528917 -0.000231945665809
-3363 0.000446162563949 0.000132026049989 -0.000265467584893
-3364 -0.000940821204962 -0.000946681955448 0.000558683867112
-3365 0.000327313143128 0.000987533802454 0.000828377659003
-3366 -0.000834701448634 -0.000736488054794 0.00138001339955
-3367 -0.000112599677056 3.15584813091e-05 -0.000338096373491
-3368 -0.00149958344597 -0.00104714952413 0.000486055078514
-3369 -0.00100421490796 -0.000824659541507 -0.00072162169887
-3370 -0.00139346368964 -0.000836955623474 0.00130738461095
-3371 -0.00144412772814 0.00138132356058 0.00127386269187
-3372 0.000330846926183 0.000302615555146 -0.00106394427936
-3373 0.000826215464194 0.000525105537767 0.000890337366491
-3374 0.000436966682511 0.000512809455799 -0.000242614746919
-3375 0.000386302644009 -0.000430869783378 -0.000276136666004
-3376 -0.000227915314823 0.000202147986466 -0.00113657306796
-3377 0.000267453223189 0.000424637969087 0.000817708577893
-3378 -0.000894561368574 -0.00129938388816 0.00136934431844
-3379 -0.000172459596996 -0.000531337352058 -0.000348765454602
-3380 -0.00155944336591 0.00155191306574 0.000475385997404
-3381 -0.0010640748279 -0.00138755537487 -0.00073229077998
-3382 -0.00145332360958 -0.00139985145684 0.00129671552984
-3383 -0.00150398764808 0.000818427727216 0.00126319361076
-3384 0.000270987006243 -0.000260280278221 -0.00107461336047
-3385 -0.00137791458511 0.00121625357232 -1.98927785868e-05
-3386 -0.000161702171787 3.70779982088e-05 0.000731629884821
-3387 -0.000212366210289 -0.000906601240969 0.000698107965736
-3388 -4.28527509669e-05 -0.000818429754257 -0.000362215359076
-3389 0.000452515787045 -0.000595939771636 -0.00156989213646
-3390 -0.00149323022287 0.00138684307748 -0.000818369473052
-3391 -0.00154389426137 0.000443163838304 -0.000851891392137
-3392 -0.000601614991972 -0.000918897322936 -0.000434844147674
-3393 -0.000106246453961 -0.000696407340315 0.00151943749818
-3394 0.000337200149278 -0.000425350266479 0.000793589592308
-3395 0.00105930192086 0.000342696269625 -0.000924520180735
-3396 0.00122881538018 0.000430867756337 0.00117711491769
-3397 -0.00143777450504 0.000653357738958 -3.05618596972e-05
-3398 -0.000221562091727 -0.000525817835158 0.000720960803711
-3399 -0.000272226130228 -0.00146949707434 0.000687438884626
-3400 -0.000102712670906 -0.00138132558762 -0.000372884440186
-3401 0.00116542167718 0.000552890170278 -0.000103190648295
-3402 -0.00155309014281 0.000823947244115 -0.000829038554163
-3403 0.00155820424192 -0.000119731995063 -0.000862560473248
-3404 -0.000661474911911 -0.0014817931563 -0.000445513228784
-3405 -0.0001661063739 -0.00125930317368 0.00150876841707
-3406 0.000277340229339 -0.000988246099846 0.000782920511198
-3407 0.000999442000917 -0.000220199563742 -0.000935189261845
-3408 0.00116895546024 -0.00013202807703 0.00116644583658
-3409 -0.00149763442498 9.0461905591e-05 -4.12309408076e-05
-3410 -0.000281422011666 -0.00108871366853 0.0007102917226
-3411 -0.000332086050167 0.00112956551553 0.000676769803515
-3412 0.000610193219233 -0.000232495645709 0.00109381704798
-3413 0.00110556175724 -1.00056630885e-05 -0.000113859729405
-3414 0.00154900836048 0.000261051410748 -0.000839707635273
-3415 -0.000890848291173 0.00102909794685 0.000604141014918
-3416 -0.000721334831851 0.00111726943356 -0.000456182309894
-3417 -0.000225966293839 0.00133975941618 0.00149809933596
-3418 0.000990246119478 0.000160583842069 -0.000912336423871
-3419 0.000939582080977 -0.000783095397109 -0.000945858342956
-3420 0.0011090955403 -0.000694923910397 0.00115577675547
-3421 -0.000784728534845 0.00123929184751 0.00142547054736
-3422 -0.000341281931606 0.00151034892134 0.00069962264149
-3423 -0.000391945970107 0.000566669682164 0.000666100722405
-3424 0.000550333299294 -0.000795391479076 0.00108314796687
-3425 0.00104570183731 -0.000572901496455 -0.000124528810516
-3426 0.00148914844054 -0.000301844422619 -0.000850376716384
-3427 -0.000950708211112 0.000466202113485 0.000593471933807
-3428 -0.00078119475179 0.000554373600197 -0.000466851391005
-3429 -0.000285826213779 0.000776863582818 0.00148743025484
-3430 0.000930386199539 -0.000402311991298 -0.000923005504981
-3431 0.000879722161038 -0.00134599123048 -0.000956527424066
-3432 0.00104923562036 -0.00125781974376 0.00114510767436
-3433 0.00100579522401 -0.000948165385367 0.000922344609822
-3434 0.000616546442329 -0.000960461467334 -0.000210607503588
-3435 0.000565882403828 0.00125781771672 -0.000244129422673
-3436 -0.000821101365083 0.000179109711286 0.000580022029333
-3437 -0.000325732827072 0.000401599693907 -0.000627654748051
-3438 -0.000714981608755 0.000389303611939 0.00140135156177
-3439 -0.000765645647256 -0.000554375627238 0.00136782964269
-3440 -0.00137986360609 7.86421426064e-05 0.000507393240735
-3441 -0.000884495068077 0.000301132125227 -0.000700283536649
-3442 0.00111544876339 -0.00142288973202 -0.0001486477961
-3443 -0.00132440788826 -0.000654843195918 0.00129520085409
-3444 0.000450566766061 0.00142840722188 -0.00104260611714
-3445 0.000945935304073 -0.00151106121873 0.000911675528712
-3446 0.000556686522389 -0.0015233573007 -0.000221276584698
-3447 0.000506022483888 0.000694921883355 -0.000254798503783
-3448 -0.000880961285023 -0.000383786122081 0.000569352948223
-3449 -0.000385592747011 -0.00016129613946 -0.000638323829162
-3450 -0.000774841528695 -0.000173592221427 0.00139068248066
-3451 -5.27397571169e-05 0.000594454314676 -0.000327427292381
-3452 -0.00143972352603 -0.000484253690761 0.000496724159625
-3453 -0.000944354988016 -0.00026176370814 -0.00071095261776
-3454 -0.0013336037697 -0.000274059790107 0.00131805369206
-3455 -0.0013842678082 -0.00121773902928 0.00128453177298
-3456 0.000390706846122 0.000865511388513 -0.00105327519825
diff --git a/examples/USER/atc/bar1d_two_temperature/uniform_heating.log b/examples/USER/atc/bar1d_two_temperature/uniform_heating.log
deleted file mode 100644
index cd112bfa7..000000000
--- a/examples/USER/atc/bar1d_two_temperature/uniform_heating.log
+++ /dev/null
@@ -1,91 +0,0 @@
-
-# make thermo output the correct temperature by removing ghost dof
-# variable xdof equal 3*count(ghost)
-# compute_modify thermo_temp extra ${xdof}
-
-# equilibrate MD field
-timestep 5
-run 400
-Memory usage per processor = 12.6012 Mbytes
-Step CPU PotEng TotEng Temp AtC[1] AtC[2]
- 0 0 -4406.6687 -4200.7544 29.995658 206.60693 20
- 100 4.374239 -4258.7421 -4155.7253 15.006513 206.60693 20
- 200 8.7224889 -4317.7651 -4214.7483 15.006513 206.60693 20
- 300 13.107087 -4308.7092 -4205.6924 15.006513 206.60693 20
- 400 17.471487 -4305.0489 -4202.0322 15.006513 206.60693 20
-Loop time of 17.4723 on 1 procs for 400 steps with 2304 atoms
-
-Pair time (%) = 7.26201 (41.563)
-Neigh time (%) = 3.21221 (18.3845)
-Comm time (%) = 0.0692339 (0.396249)
-Outpt time (%) = 0.0033679 (0.0192756)
-Other time (%) = 6.92549 (39.637)
-
-Nlocal: 2304 ave 2304 max 2304 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 8512 ave 8512 max 8512 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 708396 ave 708396 max 708396 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 1.41679e+06 ave 1.41679e+06 max 1.41679e+06 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 1416792
-Ave neighs/atom = 614.927
-Neighbor list builds = 40
-Dangerous builds = 0
-
-# change thermostat
-fix_modify AtC transfer output uniform_heatingFE 100 text
-fix_modify AtC transfer unfix temperature all
-fix_modify AtC transfer thermal control flux
-
-# fix boundary
-fix_modify AtC mesh create_nodeset lbc -6.1 -5.9 -12 12 -12 12
-fix_modify AtC transfer fix temperature lbc 20.
-fix_modify AtC mesh create_nodeset rbc 5.9 6.1 -12 12 -12 12
-fix_modify AtC transfer fix temperature rbc 20.
-
-
-# add source
-fix_modify AtC transfer internal_quadrature on
-#fix_modify AtC transfer source temperature all 0.01
-fix_modify AtC transfer source temperature all 6.3363e-10
-
-# run with FE
-reset_timestep 0
-run 1000
-Memory usage per processor = 12.8301 Mbytes
-Step CPU PotEng TotEng Temp AtC[1] AtC[2]
- 0 0 -4305.0489 -4202.0322 15.006513 206.60693 20
- 100 4.999783 -4284.0298 -4161.843 17.799024 245.0222 23.187441
- 200 10.004533 -4271.7421 -4126.3033 21.186144 291.62708 27.054401
- 300 14.997962 -4252.1549 -4092.7431 23.221608 319.6337 29.378203
- 400 19.994763 -4243.1541 -4066.5034 25.732803 354.18694 32.245199
- 500 24.995776 -4220.6621 -4038.0194 26.605674 366.2029 33.242202
- 600 30.001314 -4216.5541 -4017.5256 28.992598 399.04557 35.967267
- 700 35.011217 -4214.2511 -3996.8157 31.673926 435.9421 39.028694
- 800 40.015315 -4198.8979 -3978.4057 32.119215 442.05328 39.535758
- 900 45.030258 -4186.3755 -3963.2872 32.497398 447.23921 39.966052
- 1000 50.05034 -4182.9374 -3949.4046 34.018854 468.17469 41.703138
-Loop time of 50.0512 on 1 procs for 1000 steps with 2304 atoms
-
-Pair time (%) = 18.1533 (36.2694)
-Neigh time (%) = 8.00558 (15.9948)
-Comm time (%) = 0.15968 (0.319034)
-Outpt time (%) = 0.00851512 (0.0170128)
-Other time (%) = 23.7241 (47.3998)
-
-Nlocal: 2304 ave 2304 max 2304 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 8512 ave 8512 max 8512 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 703501 ave 703501 max 703501 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 1.407e+06 ave 1.407e+06 max 1.407e+06 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 1407002
-Ave neighs/atom = 610.678
-Neighbor list builds = 100
-Dangerous builds = 0
diff --git a/examples/USER/atc/bar1d_two_temperature/uniform_heating_init.data b/examples/USER/atc/bar1d_two_temperature/uniform_heating_init.data
deleted file mode 100644
index 2e58c1043..000000000
--- a/examples/USER/atc/bar1d_two_temperature/uniform_heating_init.data
+++ /dev/null
@@ -1,4631 +0,0 @@
-LAMMPS data file from restart file: timestep = 0, procs = 1
-
-2304 atoms
-
-1 atom types
-
--43.24 43.24 xlo xhi
--16.215 16.215 ylo yhi
--16.215 16.215 zlo zhi
-
-Masses
-
-1 39.95
-
-Pair Coeffs
-
-1 0.238 3.405
-
-Atoms
-
-1 1 -41.88875 -14.86375 -14.86375 0 0 0
-2 1 -39.18625 -12.16125 -14.86375 0 0 0
-3 1 -39.18625 -14.86375 -12.16125 0 0 0
-4 1 -41.88875 -12.16125 -12.16125 0 0 0
-5 1 -36.48375 -14.86375 -14.86375 0 0 0
-6 1 -33.78125 -12.16125 -14.86375 0 0 0
-7 1 -33.78125 -14.86375 -12.16125 0 0 0
-8 1 -36.48375 -12.16125 -12.16125 0 0 0
-9 1 -31.07875 -14.86375 -14.86375 0 0 0
-10 1 -28.37625 -12.16125 -14.86375 0 0 0
-11 1 -28.37625 -14.86375 -12.16125 0 0 0
-12 1 -31.07875 -12.16125 -12.16125 0 0 0
-13 1 -25.67375 -14.86375 -14.86375 0 0 0
-14 1 -22.97125 -12.16125 -14.86375 0 0 0
-15 1 -22.97125 -14.86375 -12.16125 0 0 0
-16 1 -25.67375 -12.16125 -12.16125 0 0 0
-17 1 -20.26875 -14.86375 -14.86375 0 0 0
-18 1 -17.56625 -12.16125 -14.86375 0 0 0
-19 1 -17.56625 -14.86375 -12.16125 0 0 0
-20 1 -20.26875 -12.16125 -12.16125 0 0 0
-21 1 -14.86375 -14.86375 -14.86375 0 0 0
-22 1 -12.16125 -12.16125 -14.86375 0 0 0
-23 1 -12.16125 -14.86375 -12.16125 0 0 0
-24 1 -14.86375 -12.16125 -12.16125 0 0 0
-25 1 -9.45875 -14.86375 -14.86375 0 0 0
-26 1 -6.75625 -12.16125 -14.86375 0 0 0
-27 1 -6.75625 -14.86375 -12.16125 0 0 0
-28 1 -9.45875 -12.16125 -12.16125 0 0 0
-29 1 -4.05375 -14.86375 -14.86375 0 0 0
-30 1 -1.35125 -12.16125 -14.86375 0 0 0
-31 1 -1.35125 -14.86375 -12.16125 0 0 0
-32 1 -4.05375 -12.16125 -12.16125 0 0 0
-33 1 1.35125 -14.86375 -14.86375 0 0 0
-34 1 4.05375 -12.16125 -14.86375 0 0 0
-35 1 4.05375 -14.86375 -12.16125 0 0 0
-36 1 1.35125 -12.16125 -12.16125 0 0 0
-37 1 6.75625 -14.86375 -14.86375 0 0 0
-38 1 9.45875 -12.16125 -14.86375 0 0 0
-39 1 9.45875 -14.86375 -12.16125 0 0 0
-40 1 6.75625 -12.16125 -12.16125 0 0 0
-41 1 12.16125 -14.86375 -14.86375 0 0 0
-42 1 14.86375 -12.16125 -14.86375 0 0 0
-43 1 14.86375 -14.86375 -12.16125 0 0 0
-44 1 12.16125 -12.16125 -12.16125 0 0 0
-45 1 17.56625 -14.86375 -14.86375 0 0 0
-46 1 20.26875 -12.16125 -14.86375 0 0 0
-47 1 20.26875 -14.86375 -12.16125 0 0 0
-48 1 17.56625 -12.16125 -12.16125 0 0 0
-49 1 22.97125 -14.86375 -14.86375 0 0 0
-50 1 25.67375 -12.16125 -14.86375 0 0 0
-51 1 25.67375 -14.86375 -12.16125 0 0 0
-52 1 22.97125 -12.16125 -12.16125 0 0 0
-53 1 28.37625 -14.86375 -14.86375 0 0 0
-54 1 31.07875 -12.16125 -14.86375 0 0 0
-55 1 31.07875 -14.86375 -12.16125 0 0 0
-56 1 28.37625 -12.16125 -12.16125 0 0 0
-57 1 33.78125 -14.86375 -14.86375 0 0 0
-58 1 36.48375 -12.16125 -14.86375 0 0 0
-59 1 36.48375 -14.86375 -12.16125 0 0 0
-60 1 33.78125 -12.16125 -12.16125 0 0 0
-61 1 39.18625 -14.86375 -14.86375 0 0 0
-62 1 41.88875 -12.16125 -14.86375 0 0 0
-63 1 41.88875 -14.86375 -12.16125 0 0 0
-64 1 39.18625 -12.16125 -12.16125 0 0 0
-65 1 -41.88875 -9.45875 -14.86375 0 0 0
-66 1 -39.18625 -6.75625 -14.86375 0 0 0
-67 1 -39.18625 -9.45875 -12.16125 0 0 0
-68 1 -41.88875 -6.75625 -12.16125 0 0 0
-69 1 -36.48375 -9.45875 -14.86375 0 0 0
-70 1 -33.78125 -6.75625 -14.86375 0 0 0
-71 1 -33.78125 -9.45875 -12.16125 0 0 0
-72 1 -36.48375 -6.75625 -12.16125 0 0 0
-73 1 -31.07875 -9.45875 -14.86375 0 0 0
-74 1 -28.37625 -6.75625 -14.86375 0 0 0
-75 1 -28.37625 -9.45875 -12.16125 0 0 0
-76 1 -31.07875 -6.75625 -12.16125 0 0 0
-77 1 -25.67375 -9.45875 -14.86375 0 0 0
-78 1 -22.97125 -6.75625 -14.86375 0 0 0
-79 1 -22.97125 -9.45875 -12.16125 0 0 0
-80 1 -25.67375 -6.75625 -12.16125 0 0 0
-81 1 -20.26875 -9.45875 -14.86375 0 0 0
-82 1 -17.56625 -6.75625 -14.86375 0 0 0
-83 1 -17.56625 -9.45875 -12.16125 0 0 0
-84 1 -20.26875 -6.75625 -12.16125 0 0 0
-85 1 -14.86375 -9.45875 -14.86375 0 0 0
-86 1 -12.16125 -6.75625 -14.86375 0 0 0
-87 1 -12.16125 -9.45875 -12.16125 0 0 0
-88 1 -14.86375 -6.75625 -12.16125 0 0 0
-89 1 -9.45875 -9.45875 -14.86375 0 0 0
-90 1 -6.75625 -6.75625 -14.86375 0 0 0
-91 1 -6.75625 -9.45875 -12.16125 0 0 0
-92 1 -9.45875 -6.75625 -12.16125 0 0 0
-93 1 -4.05375 -9.45875 -14.86375 0 0 0
-94 1 -1.35125 -6.75625 -14.86375 0 0 0
-95 1 -1.35125 -9.45875 -12.16125 0 0 0
-96 1 -4.05375 -6.75625 -12.16125 0 0 0
-97 1 1.35125 -9.45875 -14.86375 0 0 0
-98 1 4.05375 -6.75625 -14.86375 0 0 0
-99 1 4.05375 -9.45875 -12.16125 0 0 0
-100 1 1.35125 -6.75625 -12.16125 0 0 0
-101 1 6.75625 -9.45875 -14.86375 0 0 0
-102 1 9.45875 -6.75625 -14.86375 0 0 0
-103 1 9.45875 -9.45875 -12.16125 0 0 0
-104 1 6.75625 -6.75625 -12.16125 0 0 0
-105 1 12.16125 -9.45875 -14.86375 0 0 0
-106 1 14.86375 -6.75625 -14.86375 0 0 0
-107 1 14.86375 -9.45875 -12.16125 0 0 0
-108 1 12.16125 -6.75625 -12.16125 0 0 0
-109 1 17.56625 -9.45875 -14.86375 0 0 0
-110 1 20.26875 -6.75625 -14.86375 0 0 0
-111 1 20.26875 -9.45875 -12.16125 0 0 0
-112 1 17.56625 -6.75625 -12.16125 0 0 0
-113 1 22.97125 -9.45875 -14.86375 0 0 0
-114 1 25.67375 -6.75625 -14.86375 0 0 0
-115 1 25.67375 -9.45875 -12.16125 0 0 0
-116 1 22.97125 -6.75625 -12.16125 0 0 0
-117 1 28.37625 -9.45875 -14.86375 0 0 0
-118 1 31.07875 -6.75625 -14.86375 0 0 0
-119 1 31.07875 -9.45875 -12.16125 0 0 0
-120 1 28.37625 -6.75625 -12.16125 0 0 0
-121 1 33.78125 -9.45875 -14.86375 0 0 0
-122 1 36.48375 -6.75625 -14.86375 0 0 0
-123 1 36.48375 -9.45875 -12.16125 0 0 0
-124 1 33.78125 -6.75625 -12.16125 0 0 0
-125 1 39.18625 -9.45875 -14.86375 0 0 0
-126 1 41.88875 -6.75625 -14.86375 0 0 0
-127 1 41.88875 -9.45875 -12.16125 0 0 0
-128 1 39.18625 -6.75625 -12.16125 0 0 0
-129 1 -41.88875 -4.05375 -14.86375 0 0 0
-130 1 -39.18625 -1.35125 -14.86375 0 0 0
-131 1 -39.18625 -4.05375 -12.16125 0 0 0
-132 1 -41.88875 -1.35125 -12.16125 0 0 0
-133 1 -36.48375 -4.05375 -14.86375 0 0 0
-134 1 -33.78125 -1.35125 -14.86375 0 0 0
-135 1 -33.78125 -4.05375 -12.16125 0 0 0
-136 1 -36.48375 -1.35125 -12.16125 0 0 0
-137 1 -31.07875 -4.05375 -14.86375 0 0 0
-138 1 -28.37625 -1.35125 -14.86375 0 0 0
-139 1 -28.37625 -4.05375 -12.16125 0 0 0
-140 1 -31.07875 -1.35125 -12.16125 0 0 0
-141 1 -25.67375 -4.05375 -14.86375 0 0 0
-142 1 -22.97125 -1.35125 -14.86375 0 0 0
-143 1 -22.97125 -4.05375 -12.16125 0 0 0
-144 1 -25.67375 -1.35125 -12.16125 0 0 0
-145 1 -20.26875 -4.05375 -14.86375 0 0 0
-146 1 -17.56625 -1.35125 -14.86375 0 0 0
-147 1 -17.56625 -4.05375 -12.16125 0 0 0
-148 1 -20.26875 -1.35125 -12.16125 0 0 0
-149 1 -14.86375 -4.05375 -14.86375 0 0 0
-150 1 -12.16125 -1.35125 -14.86375 0 0 0
-151 1 -12.16125 -4.05375 -12.16125 0 0 0
-152 1 -14.86375 -1.35125 -12.16125 0 0 0
-153 1 -9.45875 -4.05375 -14.86375 0 0 0
-154 1 -6.75625 -1.35125 -14.86375 0 0 0
-155 1 -6.75625 -4.05375 -12.16125 0 0 0
-156 1 -9.45875 -1.35125 -12.16125 0 0 0
-157 1 -4.05375 -4.05375 -14.86375 0 0 0
-158 1 -1.35125 -1.35125 -14.86375 0 0 0
-159 1 -1.35125 -4.05375 -12.16125 0 0 0
-160 1 -4.05375 -1.35125 -12.16125 0 0 0
-161 1 1.35125 -4.05375 -14.86375 0 0 0
-162 1 4.05375 -1.35125 -14.86375 0 0 0
-163 1 4.05375 -4.05375 -12.16125 0 0 0
-164 1 1.35125 -1.35125 -12.16125 0 0 0
-165 1 6.75625 -4.05375 -14.86375 0 0 0
-166 1 9.45875 -1.35125 -14.86375 0 0 0
-167 1 9.45875 -4.05375 -12.16125 0 0 0
-168 1 6.75625 -1.35125 -12.16125 0 0 0
-169 1 12.16125 -4.05375 -14.86375 0 0 0
-170 1 14.86375 -1.35125 -14.86375 0 0 0
-171 1 14.86375 -4.05375 -12.16125 0 0 0
-172 1 12.16125 -1.35125 -12.16125 0 0 0
-173 1 17.56625 -4.05375 -14.86375 0 0 0
-174 1 20.26875 -1.35125 -14.86375 0 0 0
-175 1 20.26875 -4.05375 -12.16125 0 0 0
-176 1 17.56625 -1.35125 -12.16125 0 0 0
-177 1 22.97125 -4.05375 -14.86375 0 0 0
-178 1 25.67375 -1.35125 -14.86375 0 0 0
-179 1 25.67375 -4.05375 -12.16125 0 0 0
-180 1 22.97125 -1.35125 -12.16125 0 0 0
-181 1 28.37625 -4.05375 -14.86375 0 0 0
-182 1 31.07875 -1.35125 -14.86375 0 0 0
-183 1 31.07875 -4.05375 -12.16125 0 0 0
-184 1 28.37625 -1.35125 -12.16125 0 0 0
-185 1 33.78125 -4.05375 -14.86375 0 0 0
-186 1 36.48375 -1.35125 -14.86375 0 0 0
-187 1 36.48375 -4.05375 -12.16125 0 0 0
-188 1 33.78125 -1.35125 -12.16125 0 0 0
-189 1 39.18625 -4.05375 -14.86375 0 0 0
-190 1 41.88875 -1.35125 -14.86375 0 0 0
-191 1 41.88875 -4.05375 -12.16125 0 0 0
-192 1 39.18625 -1.35125 -12.16125 0 0 0
-193 1 -41.88875 1.35125 -14.86375 0 0 0
-194 1 -39.18625 4.05375 -14.86375 0 0 0
-195 1 -39.18625 1.35125 -12.16125 0 0 0
-196 1 -41.88875 4.05375 -12.16125 0 0 0
-197 1 -36.48375 1.35125 -14.86375 0 0 0
-198 1 -33.78125 4.05375 -14.86375 0 0 0
-199 1 -33.78125 1.35125 -12.16125 0 0 0
-200 1 -36.48375 4.05375 -12.16125 0 0 0
-201 1 -31.07875 1.35125 -14.86375 0 0 0
-202 1 -28.37625 4.05375 -14.86375 0 0 0
-203 1 -28.37625 1.35125 -12.16125 0 0 0
-204 1 -31.07875 4.05375 -12.16125 0 0 0
-205 1 -25.67375 1.35125 -14.86375 0 0 0
-206 1 -22.97125 4.05375 -14.86375 0 0 0
-207 1 -22.97125 1.35125 -12.16125 0 0 0
-208 1 -25.67375 4.05375 -12.16125 0 0 0
-209 1 -20.26875 1.35125 -14.86375 0 0 0
-210 1 -17.56625 4.05375 -14.86375 0 0 0
-211 1 -17.56625 1.35125 -12.16125 0 0 0
-212 1 -20.26875 4.05375 -12.16125 0 0 0
-213 1 -14.86375 1.35125 -14.86375 0 0 0
-214 1 -12.16125 4.05375 -14.86375 0 0 0
-215 1 -12.16125 1.35125 -12.16125 0 0 0
-216 1 -14.86375 4.05375 -12.16125 0 0 0
-217 1 -9.45875 1.35125 -14.86375 0 0 0
-218 1 -6.75625 4.05375 -14.86375 0 0 0
-219 1 -6.75625 1.35125 -12.16125 0 0 0
-220 1 -9.45875 4.05375 -12.16125 0 0 0
-221 1 -4.05375 1.35125 -14.86375 0 0 0
-222 1 -1.35125 4.05375 -14.86375 0 0 0
-223 1 -1.35125 1.35125 -12.16125 0 0 0
-224 1 -4.05375 4.05375 -12.16125 0 0 0
-225 1 1.35125 1.35125 -14.86375 0 0 0
-226 1 4.05375 4.05375 -14.86375 0 0 0
-227 1 4.05375 1.35125 -12.16125 0 0 0
-228 1 1.35125 4.05375 -12.16125 0 0 0
-229 1 6.75625 1.35125 -14.86375 0 0 0
-230 1 9.45875 4.05375 -14.86375 0 0 0
-231 1 9.45875 1.35125 -12.16125 0 0 0
-232 1 6.75625 4.05375 -12.16125 0 0 0
-233 1 12.16125 1.35125 -14.86375 0 0 0
-234 1 14.86375 4.05375 -14.86375 0 0 0
-235 1 14.86375 1.35125 -12.16125 0 0 0
-236 1 12.16125 4.05375 -12.16125 0 0 0
-237 1 17.56625 1.35125 -14.86375 0 0 0
-238 1 20.26875 4.05375 -14.86375 0 0 0
-239 1 20.26875 1.35125 -12.16125 0 0 0
-240 1 17.56625 4.05375 -12.16125 0 0 0
-241 1 22.97125 1.35125 -14.86375 0 0 0
-242 1 25.67375 4.05375 -14.86375 0 0 0
-243 1 25.67375 1.35125 -12.16125 0 0 0
-244 1 22.97125 4.05375 -12.16125 0 0 0
-245 1 28.37625 1.35125 -14.86375 0 0 0
-246 1 31.07875 4.05375 -14.86375 0 0 0
-247 1 31.07875 1.35125 -12.16125 0 0 0
-248 1 28.37625 4.05375 -12.16125 0 0 0
-249 1 33.78125 1.35125 -14.86375 0 0 0
-250 1 36.48375 4.05375 -14.86375 0 0 0
-251 1 36.48375 1.35125 -12.16125 0 0 0
-252 1 33.78125 4.05375 -12.16125 0 0 0
-253 1 39.18625 1.35125 -14.86375 0 0 0
-254 1 41.88875 4.05375 -14.86375 0 0 0
-255 1 41.88875 1.35125 -12.16125 0 0 0
-256 1 39.18625 4.05375 -12.16125 0 0 0
-257 1 -41.88875 6.75625 -14.86375 0 0 0
-258 1 -39.18625 9.45875 -14.86375 0 0 0
-259 1 -39.18625 6.75625 -12.16125 0 0 0
-260 1 -41.88875 9.45875 -12.16125 0 0 0
-261 1 -36.48375 6.75625 -14.86375 0 0 0
-262 1 -33.78125 9.45875 -14.86375 0 0 0
-263 1 -33.78125 6.75625 -12.16125 0 0 0
-264 1 -36.48375 9.45875 -12.16125 0 0 0
-265 1 -31.07875 6.75625 -14.86375 0 0 0
-266 1 -28.37625 9.45875 -14.86375 0 0 0
-267 1 -28.37625 6.75625 -12.16125 0 0 0
-268 1 -31.07875 9.45875 -12.16125 0 0 0
-269 1 -25.67375 6.75625 -14.86375 0 0 0
-270 1 -22.97125 9.45875 -14.86375 0 0 0
-271 1 -22.97125 6.75625 -12.16125 0 0 0
-272 1 -25.67375 9.45875 -12.16125 0 0 0
-273 1 -20.26875 6.75625 -14.86375 0 0 0
-274 1 -17.56625 9.45875 -14.86375 0 0 0
-275 1 -17.56625 6.75625 -12.16125 0 0 0
-276 1 -20.26875 9.45875 -12.16125 0 0 0
-277 1 -14.86375 6.75625 -14.86375 0 0 0
-278 1 -12.16125 9.45875 -14.86375 0 0 0
-279 1 -12.16125 6.75625 -12.16125 0 0 0
-280 1 -14.86375 9.45875 -12.16125 0 0 0
-281 1 -9.45875 6.75625 -14.86375 0 0 0
-282 1 -6.75625 9.45875 -14.86375 0 0 0
-283 1 -6.75625 6.75625 -12.16125 0 0 0
-284 1 -9.45875 9.45875 -12.16125 0 0 0
-285 1 -4.05375 6.75625 -14.86375 0 0 0
-286 1 -1.35125 9.45875 -14.86375 0 0 0
-287 1 -1.35125 6.75625 -12.16125 0 0 0
-288 1 -4.05375 9.45875 -12.16125 0 0 0
-289 1 1.35125 6.75625 -14.86375 0 0 0
-290 1 4.05375 9.45875 -14.86375 0 0 0
-291 1 4.05375 6.75625 -12.16125 0 0 0
-292 1 1.35125 9.45875 -12.16125 0 0 0
-293 1 6.75625 6.75625 -14.86375 0 0 0
-294 1 9.45875 9.45875 -14.86375 0 0 0
-295 1 9.45875 6.75625 -12.16125 0 0 0
-296 1 6.75625 9.45875 -12.16125 0 0 0
-297 1 12.16125 6.75625 -14.86375 0 0 0
-298 1 14.86375 9.45875 -14.86375 0 0 0
-299 1 14.86375 6.75625 -12.16125 0 0 0
-300 1 12.16125 9.45875 -12.16125 0 0 0
-301 1 17.56625 6.75625 -14.86375 0 0 0
-302 1 20.26875 9.45875 -14.86375 0 0 0
-303 1 20.26875 6.75625 -12.16125 0 0 0
-304 1 17.56625 9.45875 -12.16125 0 0 0
-305 1 22.97125 6.75625 -14.86375 0 0 0
-306 1 25.67375 9.45875 -14.86375 0 0 0
-307 1 25.67375 6.75625 -12.16125 0 0 0
-308 1 22.97125 9.45875 -12.16125 0 0 0
-309 1 28.37625 6.75625 -14.86375 0 0 0
-310 1 31.07875 9.45875 -14.86375 0 0 0
-311 1 31.07875 6.75625 -12.16125 0 0 0
-312 1 28.37625 9.45875 -12.16125 0 0 0
-313 1 33.78125 6.75625 -14.86375 0 0 0
-314 1 36.48375 9.45875 -14.86375 0 0 0
-315 1 36.48375 6.75625 -12.16125 0 0 0
-316 1 33.78125 9.45875 -12.16125 0 0 0
-317 1 39.18625 6.75625 -14.86375 0 0 0
-318 1 41.88875 9.45875 -14.86375 0 0 0
-319 1 41.88875 6.75625 -12.16125 0 0 0
-320 1 39.18625 9.45875 -12.16125 0 0 0
-321 1 -41.88875 12.16125 -14.86375 0 0 0
-322 1 -39.18625 14.86375 -14.86375 0 0 0
-323 1 -39.18625 12.16125 -12.16125 0 0 0
-324 1 -41.88875 14.86375 -12.16125 0 0 0
-325 1 -36.48375 12.16125 -14.86375 0 0 0
-326 1 -33.78125 14.86375 -14.86375 0 0 0
-327 1 -33.78125 12.16125 -12.16125 0 0 0
-328 1 -36.48375 14.86375 -12.16125 0 0 0
-329 1 -31.07875 12.16125 -14.86375 0 0 0
-330 1 -28.37625 14.86375 -14.86375 0 0 0
-331 1 -28.37625 12.16125 -12.16125 0 0 0
-332 1 -31.07875 14.86375 -12.16125 0 0 0
-333 1 -25.67375 12.16125 -14.86375 0 0 0
-334 1 -22.97125 14.86375 -14.86375 0 0 0
-335 1 -22.97125 12.16125 -12.16125 0 0 0
-336 1 -25.67375 14.86375 -12.16125 0 0 0
-337 1 -20.26875 12.16125 -14.86375 0 0 0
-338 1 -17.56625 14.86375 -14.86375 0 0 0
-339 1 -17.56625 12.16125 -12.16125 0 0 0
-340 1 -20.26875 14.86375 -12.16125 0 0 0
-341 1 -14.86375 12.16125 -14.86375 0 0 0
-342 1 -12.16125 14.86375 -14.86375 0 0 0
-343 1 -12.16125 12.16125 -12.16125 0 0 0
-344 1 -14.86375 14.86375 -12.16125 0 0 0
-345 1 -9.45875 12.16125 -14.86375 0 0 0
-346 1 -6.75625 14.86375 -14.86375 0 0 0
-347 1 -6.75625 12.16125 -12.16125 0 0 0
-348 1 -9.45875 14.86375 -12.16125 0 0 0
-349 1 -4.05375 12.16125 -14.86375 0 0 0
-350 1 -1.35125 14.86375 -14.86375 0 0 0
-351 1 -1.35125 12.16125 -12.16125 0 0 0
-352 1 -4.05375 14.86375 -12.16125 0 0 0
-353 1 1.35125 12.16125 -14.86375 0 0 0
-354 1 4.05375 14.86375 -14.86375 0 0 0
-355 1 4.05375 12.16125 -12.16125 0 0 0
-356 1 1.35125 14.86375 -12.16125 0 0 0
-357 1 6.75625 12.16125 -14.86375 0 0 0
-358 1 9.45875 14.86375 -14.86375 0 0 0
-359 1 9.45875 12.16125 -12.16125 0 0 0
-360 1 6.75625 14.86375 -12.16125 0 0 0
-361 1 12.16125 12.16125 -14.86375 0 0 0
-362 1 14.86375 14.86375 -14.86375 0 0 0
-363 1 14.86375 12.16125 -12.16125 0 0 0
-364 1 12.16125 14.86375 -12.16125 0 0 0
-365 1 17.56625 12.16125 -14.86375 0 0 0
-366 1 20.26875 14.86375 -14.86375 0 0 0
-367 1 20.26875 12.16125 -12.16125 0 0 0
-368 1 17.56625 14.86375 -12.16125 0 0 0
-369 1 22.97125 12.16125 -14.86375 0 0 0
-370 1 25.67375 14.86375 -14.86375 0 0 0
-371 1 25.67375 12.16125 -12.16125 0 0 0
-372 1 22.97125 14.86375 -12.16125 0 0 0
-373 1 28.37625 12.16125 -14.86375 0 0 0
-374 1 31.07875 14.86375 -14.86375 0 0 0
-375 1 31.07875 12.16125 -12.16125 0 0 0
-376 1 28.37625 14.86375 -12.16125 0 0 0
-377 1 33.78125 12.16125 -14.86375 0 0 0
-378 1 36.48375 14.86375 -14.86375 0 0 0
-379 1 36.48375 12.16125 -12.16125 0 0 0
-380 1 33.78125 14.86375 -12.16125 0 0 0
-381 1 39.18625 12.16125 -14.86375 0 0 0
-382 1 41.88875 14.86375 -14.86375 0 0 0
-383 1 41.88875 12.16125 -12.16125 0 0 0
-384 1 39.18625 14.86375 -12.16125 0 0 0
-385 1 -41.88875 -14.86375 -9.45875 0 0 0
-386 1 -39.18625 -12.16125 -9.45875 0 0 0
-387 1 -39.18625 -14.86375 -6.75625 0 0 0
-388 1 -41.88875 -12.16125 -6.75625 0 0 0
-389 1 -36.48375 -14.86375 -9.45875 0 0 0
-390 1 -33.78125 -12.16125 -9.45875 0 0 0
-391 1 -33.78125 -14.86375 -6.75625 0 0 0
-392 1 -36.48375 -12.16125 -6.75625 0 0 0
-393 1 -31.07875 -14.86375 -9.45875 0 0 0
-394 1 -28.37625 -12.16125 -9.45875 0 0 0
-395 1 -28.37625 -14.86375 -6.75625 0 0 0
-396 1 -31.07875 -12.16125 -6.75625 0 0 0
-397 1 -25.67375 -14.86375 -9.45875 0 0 0
-398 1 -22.97125 -12.16125 -9.45875 0 0 0
-399 1 -22.97125 -14.86375 -6.75625 0 0 0
-400 1 -25.67375 -12.16125 -6.75625 0 0 0
-401 1 -20.26875 -14.86375 -9.45875 0 0 0
-402 1 -17.56625 -12.16125 -9.45875 0 0 0
-403 1 -17.56625 -14.86375 -6.75625 0 0 0
-404 1 -20.26875 -12.16125 -6.75625 0 0 0
-405 1 -14.86375 -14.86375 -9.45875 0 0 0
-406 1 -12.16125 -12.16125 -9.45875 0 0 0
-407 1 -12.16125 -14.86375 -6.75625 0 0 0
-408 1 -14.86375 -12.16125 -6.75625 0 0 0
-409 1 -9.45875 -14.86375 -9.45875 0 0 0
-410 1 -6.75625 -12.16125 -9.45875 0 0 0
-411 1 -6.75625 -14.86375 -6.75625 0 0 0
-412 1 -9.45875 -12.16125 -6.75625 0 0 0
-413 1 -4.05375 -14.86375 -9.45875 0 0 0
-414 1 -1.35125 -12.16125 -9.45875 0 0 0
-415 1 -1.35125 -14.86375 -6.75625 0 0 0
-416 1 -4.05375 -12.16125 -6.75625 0 0 0
-417 1 1.35125 -14.86375 -9.45875 0 0 0
-418 1 4.05375 -12.16125 -9.45875 0 0 0
-419 1 4.05375 -14.86375 -6.75625 0 0 0
-420 1 1.35125 -12.16125 -6.75625 0 0 0
-421 1 6.75625 -14.86375 -9.45875 0 0 0
-422 1 9.45875 -12.16125 -9.45875 0 0 0
-423 1 9.45875 -14.86375 -6.75625 0 0 0
-424 1 6.75625 -12.16125 -6.75625 0 0 0
-425 1 12.16125 -14.86375 -9.45875 0 0 0
-426 1 14.86375 -12.16125 -9.45875 0 0 0
-427 1 14.86375 -14.86375 -6.75625 0 0 0
-428 1 12.16125 -12.16125 -6.75625 0 0 0
-429 1 17.56625 -14.86375 -9.45875 0 0 0
-430 1 20.26875 -12.16125 -9.45875 0 0 0
-431 1 20.26875 -14.86375 -6.75625 0 0 0
-432 1 17.56625 -12.16125 -6.75625 0 0 0
-433 1 22.97125 -14.86375 -9.45875 0 0 0
-434 1 25.67375 -12.16125 -9.45875 0 0 0
-435 1 25.67375 -14.86375 -6.75625 0 0 0
-436 1 22.97125 -12.16125 -6.75625 0 0 0
-437 1 28.37625 -14.86375 -9.45875 0 0 0
-438 1 31.07875 -12.16125 -9.45875 0 0 0
-439 1 31.07875 -14.86375 -6.75625 0 0 0
-440 1 28.37625 -12.16125 -6.75625 0 0 0
-441 1 33.78125 -14.86375 -9.45875 0 0 0
-442 1 36.48375 -12.16125 -9.45875 0 0 0
-443 1 36.48375 -14.86375 -6.75625 0 0 0
-444 1 33.78125 -12.16125 -6.75625 0 0 0
-445 1 39.18625 -14.86375 -9.45875 0 0 0
-446 1 41.88875 -12.16125 -9.45875 0 0 0
-447 1 41.88875 -14.86375 -6.75625 0 0 0
-448 1 39.18625 -12.16125 -6.75625 0 0 0
-449 1 -41.88875 -9.45875 -9.45875 0 0 0
-450 1 -39.18625 -6.75625 -9.45875 0 0 0
-451 1 -39.18625 -9.45875 -6.75625 0 0 0
-452 1 -41.88875 -6.75625 -6.75625 0 0 0
-453 1 -36.48375 -9.45875 -9.45875 0 0 0
-454 1 -33.78125 -6.75625 -9.45875 0 0 0
-455 1 -33.78125 -9.45875 -6.75625 0 0 0
-456 1 -36.48375 -6.75625 -6.75625 0 0 0
-457 1 -31.07875 -9.45875 -9.45875 0 0 0
-458 1 -28.37625 -6.75625 -9.45875 0 0 0
-459 1 -28.37625 -9.45875 -6.75625 0 0 0
-460 1 -31.07875 -6.75625 -6.75625 0 0 0
-461 1 -25.67375 -9.45875 -9.45875 0 0 0
-462 1 -22.97125 -6.75625 -9.45875 0 0 0
-463 1 -22.97125 -9.45875 -6.75625 0 0 0
-464 1 -25.67375 -6.75625 -6.75625 0 0 0
-465 1 -20.26875 -9.45875 -9.45875 0 0 0
-466 1 -17.56625 -6.75625 -9.45875 0 0 0
-467 1 -17.56625 -9.45875 -6.75625 0 0 0
-468 1 -20.26875 -6.75625 -6.75625 0 0 0
-469 1 -14.86375 -9.45875 -9.45875 0 0 0
-470 1 -12.16125 -6.75625 -9.45875 0 0 0
-471 1 -12.16125 -9.45875 -6.75625 0 0 0
-472 1 -14.86375 -6.75625 -6.75625 0 0 0
-473 1 -9.45875 -9.45875 -9.45875 0 0 0
-474 1 -6.75625 -6.75625 -9.45875 0 0 0
-475 1 -6.75625 -9.45875 -6.75625 0 0 0
-476 1 -9.45875 -6.75625 -6.75625 0 0 0
-477 1 -4.05375 -9.45875 -9.45875 0 0 0
-478 1 -1.35125 -6.75625 -9.45875 0 0 0
-479 1 -1.35125 -9.45875 -6.75625 0 0 0
-480 1 -4.05375 -6.75625 -6.75625 0 0 0
-481 1 1.35125 -9.45875 -9.45875 0 0 0
-482 1 4.05375 -6.75625 -9.45875 0 0 0
-483 1 4.05375 -9.45875 -6.75625 0 0 0
-484 1 1.35125 -6.75625 -6.75625 0 0 0
-485 1 6.75625 -9.45875 -9.45875 0 0 0
-486 1 9.45875 -6.75625 -9.45875 0 0 0
-487 1 9.45875 -9.45875 -6.75625 0 0 0
-488 1 6.75625 -6.75625 -6.75625 0 0 0
-489 1 12.16125 -9.45875 -9.45875 0 0 0
-490 1 14.86375 -6.75625 -9.45875 0 0 0
-491 1 14.86375 -9.45875 -6.75625 0 0 0
-492 1 12.16125 -6.75625 -6.75625 0 0 0
-493 1 17.56625 -9.45875 -9.45875 0 0 0
-494 1 20.26875 -6.75625 -9.45875 0 0 0
-495 1 20.26875 -9.45875 -6.75625 0 0 0
-496 1 17.56625 -6.75625 -6.75625 0 0 0
-497 1 22.97125 -9.45875 -9.45875 0 0 0
-498 1 25.67375 -6.75625 -9.45875 0 0 0
-499 1 25.67375 -9.45875 -6.75625 0 0 0
-500 1 22.97125 -6.75625 -6.75625 0 0 0
-501 1 28.37625 -9.45875 -9.45875 0 0 0
-502 1 31.07875 -6.75625 -9.45875 0 0 0
-503 1 31.07875 -9.45875 -6.75625 0 0 0
-504 1 28.37625 -6.75625 -6.75625 0 0 0
-505 1 33.78125 -9.45875 -9.45875 0 0 0
-506 1 36.48375 -6.75625 -9.45875 0 0 0
-507 1 36.48375 -9.45875 -6.75625 0 0 0
-508 1 33.78125 -6.75625 -6.75625 0 0 0
-509 1 39.18625 -9.45875 -9.45875 0 0 0
-510 1 41.88875 -6.75625 -9.45875 0 0 0
-511 1 41.88875 -9.45875 -6.75625 0 0 0
-512 1 39.18625 -6.75625 -6.75625 0 0 0
-513 1 -41.88875 -4.05375 -9.45875 0 0 0
-514 1 -39.18625 -1.35125 -9.45875 0 0 0
-515 1 -39.18625 -4.05375 -6.75625 0 0 0
-516 1 -41.88875 -1.35125 -6.75625 0 0 0
-517 1 -36.48375 -4.05375 -9.45875 0 0 0
-518 1 -33.78125 -1.35125 -9.45875 0 0 0
-519 1 -33.78125 -4.05375 -6.75625 0 0 0
-520 1 -36.48375 -1.35125 -6.75625 0 0 0
-521 1 -31.07875 -4.05375 -9.45875 0 0 0
-522 1 -28.37625 -1.35125 -9.45875 0 0 0
-523 1 -28.37625 -4.05375 -6.75625 0 0 0
-524 1 -31.07875 -1.35125 -6.75625 0 0 0
-525 1 -25.67375 -4.05375 -9.45875 0 0 0
-526 1 -22.97125 -1.35125 -9.45875 0 0 0
-527 1 -22.97125 -4.05375 -6.75625 0 0 0
-528 1 -25.67375 -1.35125 -6.75625 0 0 0
-529 1 -20.26875 -4.05375 -9.45875 0 0 0
-530 1 -17.56625 -1.35125 -9.45875 0 0 0
-531 1 -17.56625 -4.05375 -6.75625 0 0 0
-532 1 -20.26875 -1.35125 -6.75625 0 0 0
-533 1 -14.86375 -4.05375 -9.45875 0 0 0
-534 1 -12.16125 -1.35125 -9.45875 0 0 0
-535 1 -12.16125 -4.05375 -6.75625 0 0 0
-536 1 -14.86375 -1.35125 -6.75625 0 0 0
-537 1 -9.45875 -4.05375 -9.45875 0 0 0
-538 1 -6.75625 -1.35125 -9.45875 0 0 0
-539 1 -6.75625 -4.05375 -6.75625 0 0 0
-540 1 -9.45875 -1.35125 -6.75625 0 0 0
-541 1 -4.05375 -4.05375 -9.45875 0 0 0
-542 1 -1.35125 -1.35125 -9.45875 0 0 0
-543 1 -1.35125 -4.05375 -6.75625 0 0 0
-544 1 -4.05375 -1.35125 -6.75625 0 0 0
-545 1 1.35125 -4.05375 -9.45875 0 0 0
-546 1 4.05375 -1.35125 -9.45875 0 0 0
-547 1 4.05375 -4.05375 -6.75625 0 0 0
-548 1 1.35125 -1.35125 -6.75625 0 0 0
-549 1 6.75625 -4.05375 -9.45875 0 0 0
-550 1 9.45875 -1.35125 -9.45875 0 0 0
-551 1 9.45875 -4.05375 -6.75625 0 0 0
-552 1 6.75625 -1.35125 -6.75625 0 0 0
-553 1 12.16125 -4.05375 -9.45875 0 0 0
-554 1 14.86375 -1.35125 -9.45875 0 0 0
-555 1 14.86375 -4.05375 -6.75625 0 0 0
-556 1 12.16125 -1.35125 -6.75625 0 0 0
-557 1 17.56625 -4.05375 -9.45875 0 0 0
-558 1 20.26875 -1.35125 -9.45875 0 0 0
-559 1 20.26875 -4.05375 -6.75625 0 0 0
-560 1 17.56625 -1.35125 -6.75625 0 0 0
-561 1 22.97125 -4.05375 -9.45875 0 0 0
-562 1 25.67375 -1.35125 -9.45875 0 0 0
-563 1 25.67375 -4.05375 -6.75625 0 0 0
-564 1 22.97125 -1.35125 -6.75625 0 0 0
-565 1 28.37625 -4.05375 -9.45875 0 0 0
-566 1 31.07875 -1.35125 -9.45875 0 0 0
-567 1 31.07875 -4.05375 -6.75625 0 0 0
-568 1 28.37625 -1.35125 -6.75625 0 0 0
-569 1 33.78125 -4.05375 -9.45875 0 0 0
-570 1 36.48375 -1.35125 -9.45875 0 0 0
-571 1 36.48375 -4.05375 -6.75625 0 0 0
-572 1 33.78125 -1.35125 -6.75625 0 0 0
-573 1 39.18625 -4.05375 -9.45875 0 0 0
-574 1 41.88875 -1.35125 -9.45875 0 0 0
-575 1 41.88875 -4.05375 -6.75625 0 0 0
-576 1 39.18625 -1.35125 -6.75625 0 0 0
-577 1 -41.88875 1.35125 -9.45875 0 0 0
-578 1 -39.18625 4.05375 -9.45875 0 0 0
-579 1 -39.18625 1.35125 -6.75625 0 0 0
-580 1 -41.88875 4.05375 -6.75625 0 0 0
-581 1 -36.48375 1.35125 -9.45875 0 0 0
-582 1 -33.78125 4.05375 -9.45875 0 0 0
-583 1 -33.78125 1.35125 -6.75625 0 0 0
-584 1 -36.48375 4.05375 -6.75625 0 0 0
-585 1 -31.07875 1.35125 -9.45875 0 0 0
-586 1 -28.37625 4.05375 -9.45875 0 0 0
-587 1 -28.37625 1.35125 -6.75625 0 0 0
-588 1 -31.07875 4.05375 -6.75625 0 0 0
-589 1 -25.67375 1.35125 -9.45875 0 0 0
-590 1 -22.97125 4.05375 -9.45875 0 0 0
-591 1 -22.97125 1.35125 -6.75625 0 0 0
-592 1 -25.67375 4.05375 -6.75625 0 0 0
-593 1 -20.26875 1.35125 -9.45875 0 0 0
-594 1 -17.56625 4.05375 -9.45875 0 0 0
-595 1 -17.56625 1.35125 -6.75625 0 0 0
-596 1 -20.26875 4.05375 -6.75625 0 0 0
-597 1 -14.86375 1.35125 -9.45875 0 0 0
-598 1 -12.16125 4.05375 -9.45875 0 0 0
-599 1 -12.16125 1.35125 -6.75625 0 0 0
-600 1 -14.86375 4.05375 -6.75625 0 0 0
-601 1 -9.45875 1.35125 -9.45875 0 0 0
-602 1 -6.75625 4.05375 -9.45875 0 0 0
-603 1 -6.75625 1.35125 -6.75625 0 0 0
-604 1 -9.45875 4.05375 -6.75625 0 0 0
-605 1 -4.05375 1.35125 -9.45875 0 0 0
-606 1 -1.35125 4.05375 -9.45875 0 0 0
-607 1 -1.35125 1.35125 -6.75625 0 0 0
-608 1 -4.05375 4.05375 -6.75625 0 0 0
-609 1 1.35125 1.35125 -9.45875 0 0 0
-610 1 4.05375 4.05375 -9.45875 0 0 0
-611 1 4.05375 1.35125 -6.75625 0 0 0
-612 1 1.35125 4.05375 -6.75625 0 0 0
-613 1 6.75625 1.35125 -9.45875 0 0 0
-614 1 9.45875 4.05375 -9.45875 0 0 0
-615 1 9.45875 1.35125 -6.75625 0 0 0
-616 1 6.75625 4.05375 -6.75625 0 0 0
-617 1 12.16125 1.35125 -9.45875 0 0 0
-618 1 14.86375 4.05375 -9.45875 0 0 0
-619 1 14.86375 1.35125 -6.75625 0 0 0
-620 1 12.16125 4.05375 -6.75625 0 0 0
-621 1 17.56625 1.35125 -9.45875 0 0 0
-622 1 20.26875 4.05375 -9.45875 0 0 0
-623 1 20.26875 1.35125 -6.75625 0 0 0
-624 1 17.56625 4.05375 -6.75625 0 0 0
-625 1 22.97125 1.35125 -9.45875 0 0 0
-626 1 25.67375 4.05375 -9.45875 0 0 0
-627 1 25.67375 1.35125 -6.75625 0 0 0
-628 1 22.97125 4.05375 -6.75625 0 0 0
-629 1 28.37625 1.35125 -9.45875 0 0 0
-630 1 31.07875 4.05375 -9.45875 0 0 0
-631 1 31.07875 1.35125 -6.75625 0 0 0
-632 1 28.37625 4.05375 -6.75625 0 0 0
-633 1 33.78125 1.35125 -9.45875 0 0 0
-634 1 36.48375 4.05375 -9.45875 0 0 0
-635 1 36.48375 1.35125 -6.75625 0 0 0
-636 1 33.78125 4.05375 -6.75625 0 0 0
-637 1 39.18625 1.35125 -9.45875 0 0 0
-638 1 41.88875 4.05375 -9.45875 0 0 0
-639 1 41.88875 1.35125 -6.75625 0 0 0
-640 1 39.18625 4.05375 -6.75625 0 0 0
-641 1 -41.88875 6.75625 -9.45875 0 0 0
-642 1 -39.18625 9.45875 -9.45875 0 0 0
-643 1 -39.18625 6.75625 -6.75625 0 0 0
-644 1 -41.88875 9.45875 -6.75625 0 0 0
-645 1 -36.48375 6.75625 -9.45875 0 0 0
-646 1 -33.78125 9.45875 -9.45875 0 0 0
-647 1 -33.78125 6.75625 -6.75625 0 0 0
-648 1 -36.48375 9.45875 -6.75625 0 0 0
-649 1 -31.07875 6.75625 -9.45875 0 0 0
-650 1 -28.37625 9.45875 -9.45875 0 0 0
-651 1 -28.37625 6.75625 -6.75625 0 0 0
-652 1 -31.07875 9.45875 -6.75625 0 0 0
-653 1 -25.67375 6.75625 -9.45875 0 0 0
-654 1 -22.97125 9.45875 -9.45875 0 0 0
-655 1 -22.97125 6.75625 -6.75625 0 0 0
-656 1 -25.67375 9.45875 -6.75625 0 0 0
-657 1 -20.26875 6.75625 -9.45875 0 0 0
-658 1 -17.56625 9.45875 -9.45875 0 0 0
-659 1 -17.56625 6.75625 -6.75625 0 0 0
-660 1 -20.26875 9.45875 -6.75625 0 0 0
-661 1 -14.86375 6.75625 -9.45875 0 0 0
-662 1 -12.16125 9.45875 -9.45875 0 0 0
-663 1 -12.16125 6.75625 -6.75625 0 0 0
-664 1 -14.86375 9.45875 -6.75625 0 0 0
-665 1 -9.45875 6.75625 -9.45875 0 0 0
-666 1 -6.75625 9.45875 -9.45875 0 0 0
-667 1 -6.75625 6.75625 -6.75625 0 0 0
-668 1 -9.45875 9.45875 -6.75625 0 0 0
-669 1 -4.05375 6.75625 -9.45875 0 0 0
-670 1 -1.35125 9.45875 -9.45875 0 0 0
-671 1 -1.35125 6.75625 -6.75625 0 0 0
-672 1 -4.05375 9.45875 -6.75625 0 0 0
-673 1 1.35125 6.75625 -9.45875 0 0 0
-674 1 4.05375 9.45875 -9.45875 0 0 0
-675 1 4.05375 6.75625 -6.75625 0 0 0
-676 1 1.35125 9.45875 -6.75625 0 0 0
-677 1 6.75625 6.75625 -9.45875 0 0 0
-678 1 9.45875 9.45875 -9.45875 0 0 0
-679 1 9.45875 6.75625 -6.75625 0 0 0
-680 1 6.75625 9.45875 -6.75625 0 0 0
-681 1 12.16125 6.75625 -9.45875 0 0 0
-682 1 14.86375 9.45875 -9.45875 0 0 0
-683 1 14.86375 6.75625 -6.75625 0 0 0
-684 1 12.16125 9.45875 -6.75625 0 0 0
-685 1 17.56625 6.75625 -9.45875 0 0 0
-686 1 20.26875 9.45875 -9.45875 0 0 0
-687 1 20.26875 6.75625 -6.75625 0 0 0
-688 1 17.56625 9.45875 -6.75625 0 0 0
-689 1 22.97125 6.75625 -9.45875 0 0 0
-690 1 25.67375 9.45875 -9.45875 0 0 0
-691 1 25.67375 6.75625 -6.75625 0 0 0
-692 1 22.97125 9.45875 -6.75625 0 0 0
-693 1 28.37625 6.75625 -9.45875 0 0 0
-694 1 31.07875 9.45875 -9.45875 0 0 0
-695 1 31.07875 6.75625 -6.75625 0 0 0
-696 1 28.37625 9.45875 -6.75625 0 0 0
-697 1 33.78125 6.75625 -9.45875 0 0 0
-698 1 36.48375 9.45875 -9.45875 0 0 0
-699 1 36.48375 6.75625 -6.75625 0 0 0
-700 1 33.78125 9.45875 -6.75625 0 0 0
-701 1 39.18625 6.75625 -9.45875 0 0 0
-702 1 41.88875 9.45875 -9.45875 0 0 0
-703 1 41.88875 6.75625 -6.75625 0 0 0
-704 1 39.18625 9.45875 -6.75625 0 0 0
-705 1 -41.88875 12.16125 -9.45875 0 0 0
-706 1 -39.18625 14.86375 -9.45875 0 0 0
-707 1 -39.18625 12.16125 -6.75625 0 0 0
-708 1 -41.88875 14.86375 -6.75625 0 0 0
-709 1 -36.48375 12.16125 -9.45875 0 0 0
-710 1 -33.78125 14.86375 -9.45875 0 0 0
-711 1 -33.78125 12.16125 -6.75625 0 0 0
-712 1 -36.48375 14.86375 -6.75625 0 0 0
-713 1 -31.07875 12.16125 -9.45875 0 0 0
-714 1 -28.37625 14.86375 -9.45875 0 0 0
-715 1 -28.37625 12.16125 -6.75625 0 0 0
-716 1 -31.07875 14.86375 -6.75625 0 0 0
-717 1 -25.67375 12.16125 -9.45875 0 0 0
-718 1 -22.97125 14.86375 -9.45875 0 0 0
-719 1 -22.97125 12.16125 -6.75625 0 0 0
-720 1 -25.67375 14.86375 -6.75625 0 0 0
-721 1 -20.26875 12.16125 -9.45875 0 0 0
-722 1 -17.56625 14.86375 -9.45875 0 0 0
-723 1 -17.56625 12.16125 -6.75625 0 0 0
-724 1 -20.26875 14.86375 -6.75625 0 0 0
-725 1 -14.86375 12.16125 -9.45875 0 0 0
-726 1 -12.16125 14.86375 -9.45875 0 0 0
-727 1 -12.16125 12.16125 -6.75625 0 0 0
-728 1 -14.86375 14.86375 -6.75625 0 0 0
-729 1 -9.45875 12.16125 -9.45875 0 0 0
-730 1 -6.75625 14.86375 -9.45875 0 0 0
-731 1 -6.75625 12.16125 -6.75625 0 0 0
-732 1 -9.45875 14.86375 -6.75625 0 0 0
-733 1 -4.05375 12.16125 -9.45875 0 0 0
-734 1 -1.35125 14.86375 -9.45875 0 0 0
-735 1 -1.35125 12.16125 -6.75625 0 0 0
-736 1 -4.05375 14.86375 -6.75625 0 0 0
-737 1 1.35125 12.16125 -9.45875 0 0 0
-738 1 4.05375 14.86375 -9.45875 0 0 0
-739 1 4.05375 12.16125 -6.75625 0 0 0
-740 1 1.35125 14.86375 -6.75625 0 0 0
-741 1 6.75625 12.16125 -9.45875 0 0 0
-742 1 9.45875 14.86375 -9.45875 0 0 0
-743 1 9.45875 12.16125 -6.75625 0 0 0
-744 1 6.75625 14.86375 -6.75625 0 0 0
-745 1 12.16125 12.16125 -9.45875 0 0 0
-746 1 14.86375 14.86375 -9.45875 0 0 0
-747 1 14.86375 12.16125 -6.75625 0 0 0
-748 1 12.16125 14.86375 -6.75625 0 0 0
-749 1 17.56625 12.16125 -9.45875 0 0 0
-750 1 20.26875 14.86375 -9.45875 0 0 0
-751 1 20.26875 12.16125 -6.75625 0 0 0
-752 1 17.56625 14.86375 -6.75625 0 0 0
-753 1 22.97125 12.16125 -9.45875 0 0 0
-754 1 25.67375 14.86375 -9.45875 0 0 0
-755 1 25.67375 12.16125 -6.75625 0 0 0
-756 1 22.97125 14.86375 -6.75625 0 0 0
-757 1 28.37625 12.16125 -9.45875 0 0 0
-758 1 31.07875 14.86375 -9.45875 0 0 0
-759 1 31.07875 12.16125 -6.75625 0 0 0
-760 1 28.37625 14.86375 -6.75625 0 0 0
-761 1 33.78125 12.16125 -9.45875 0 0 0
-762 1 36.48375 14.86375 -9.45875 0 0 0
-763 1 36.48375 12.16125 -6.75625 0 0 0
-764 1 33.78125 14.86375 -6.75625 0 0 0
-765 1 39.18625 12.16125 -9.45875 0 0 0
-766 1 41.88875 14.86375 -9.45875 0 0 0
-767 1 41.88875 12.16125 -6.75625 0 0 0
-768 1 39.18625 14.86375 -6.75625 0 0 0
-769 1 -41.88875 -14.86375 -4.05375 0 0 0
-770 1 -39.18625 -12.16125 -4.05375 0 0 0
-771 1 -39.18625 -14.86375 -1.35125 0 0 0
-772 1 -41.88875 -12.16125 -1.35125 0 0 0
-773 1 -36.48375 -14.86375 -4.05375 0 0 0
-774 1 -33.78125 -12.16125 -4.05375 0 0 0
-775 1 -33.78125 -14.86375 -1.35125 0 0 0
-776 1 -36.48375 -12.16125 -1.35125 0 0 0
-777 1 -31.07875 -14.86375 -4.05375 0 0 0
-778 1 -28.37625 -12.16125 -4.05375 0 0 0
-779 1 -28.37625 -14.86375 -1.35125 0 0 0
-780 1 -31.07875 -12.16125 -1.35125 0 0 0
-781 1 -25.67375 -14.86375 -4.05375 0 0 0
-782 1 -22.97125 -12.16125 -4.05375 0 0 0
-783 1 -22.97125 -14.86375 -1.35125 0 0 0
-784 1 -25.67375 -12.16125 -1.35125 0 0 0
-785 1 -20.26875 -14.86375 -4.05375 0 0 0
-786 1 -17.56625 -12.16125 -4.05375 0 0 0
-787 1 -17.56625 -14.86375 -1.35125 0 0 0
-788 1 -20.26875 -12.16125 -1.35125 0 0 0
-789 1 -14.86375 -14.86375 -4.05375 0 0 0
-790 1 -12.16125 -12.16125 -4.05375 0 0 0
-791 1 -12.16125 -14.86375 -1.35125 0 0 0
-792 1 -14.86375 -12.16125 -1.35125 0 0 0
-793 1 -9.45875 -14.86375 -4.05375 0 0 0
-794 1 -6.75625 -12.16125 -4.05375 0 0 0
-795 1 -6.75625 -14.86375 -1.35125 0 0 0
-796 1 -9.45875 -12.16125 -1.35125 0 0 0
-797 1 -4.05375 -14.86375 -4.05375 0 0 0
-798 1 -1.35125 -12.16125 -4.05375 0 0 0
-799 1 -1.35125 -14.86375 -1.35125 0 0 0
-800 1 -4.05375 -12.16125 -1.35125 0 0 0
-801 1 1.35125 -14.86375 -4.05375 0 0 0
-802 1 4.05375 -12.16125 -4.05375 0 0 0
-803 1 4.05375 -14.86375 -1.35125 0 0 0
-804 1 1.35125 -12.16125 -1.35125 0 0 0
-805 1 6.75625 -14.86375 -4.05375 0 0 0
-806 1 9.45875 -12.16125 -4.05375 0 0 0
-807 1 9.45875 -14.86375 -1.35125 0 0 0
-808 1 6.75625 -12.16125 -1.35125 0 0 0
-809 1 12.16125 -14.86375 -4.05375 0 0 0
-810 1 14.86375 -12.16125 -4.05375 0 0 0
-811 1 14.86375 -14.86375 -1.35125 0 0 0
-812 1 12.16125 -12.16125 -1.35125 0 0 0
-813 1 17.56625 -14.86375 -4.05375 0 0 0
-814 1 20.26875 -12.16125 -4.05375 0 0 0
-815 1 20.26875 -14.86375 -1.35125 0 0 0
-816 1 17.56625 -12.16125 -1.35125 0 0 0
-817 1 22.97125 -14.86375 -4.05375 0 0 0
-818 1 25.67375 -12.16125 -4.05375 0 0 0
-819 1 25.67375 -14.86375 -1.35125 0 0 0
-820 1 22.97125 -12.16125 -1.35125 0 0 0
-821 1 28.37625 -14.86375 -4.05375 0 0 0
-822 1 31.07875 -12.16125 -4.05375 0 0 0
-823 1 31.07875 -14.86375 -1.35125 0 0 0
-824 1 28.37625 -12.16125 -1.35125 0 0 0
-825 1 33.78125 -14.86375 -4.05375 0 0 0
-826 1 36.48375 -12.16125 -4.05375 0 0 0
-827 1 36.48375 -14.86375 -1.35125 0 0 0
-828 1 33.78125 -12.16125 -1.35125 0 0 0
-829 1 39.18625 -14.86375 -4.05375 0 0 0
-830 1 41.88875 -12.16125 -4.05375 0 0 0
-831 1 41.88875 -14.86375 -1.35125 0 0 0
-832 1 39.18625 -12.16125 -1.35125 0 0 0
-833 1 -41.88875 -9.45875 -4.05375 0 0 0
-834 1 -39.18625 -6.75625 -4.05375 0 0 0
-835 1 -39.18625 -9.45875 -1.35125 0 0 0
-836 1 -41.88875 -6.75625 -1.35125 0 0 0
-837 1 -36.48375 -9.45875 -4.05375 0 0 0
-838 1 -33.78125 -6.75625 -4.05375 0 0 0
-839 1 -33.78125 -9.45875 -1.35125 0 0 0
-840 1 -36.48375 -6.75625 -1.35125 0 0 0
-841 1 -31.07875 -9.45875 -4.05375 0 0 0
-842 1 -28.37625 -6.75625 -4.05375 0 0 0
-843 1 -28.37625 -9.45875 -1.35125 0 0 0
-844 1 -31.07875 -6.75625 -1.35125 0 0 0
-845 1 -25.67375 -9.45875 -4.05375 0 0 0
-846 1 -22.97125 -6.75625 -4.05375 0 0 0
-847 1 -22.97125 -9.45875 -1.35125 0 0 0
-848 1 -25.67375 -6.75625 -1.35125 0 0 0
-849 1 -20.26875 -9.45875 -4.05375 0 0 0
-850 1 -17.56625 -6.75625 -4.05375 0 0 0
-851 1 -17.56625 -9.45875 -1.35125 0 0 0
-852 1 -20.26875 -6.75625 -1.35125 0 0 0
-853 1 -14.86375 -9.45875 -4.05375 0 0 0
-854 1 -12.16125 -6.75625 -4.05375 0 0 0
-855 1 -12.16125 -9.45875 -1.35125 0 0 0
-856 1 -14.86375 -6.75625 -1.35125 0 0 0
-857 1 -9.45875 -9.45875 -4.05375 0 0 0
-858 1 -6.75625 -6.75625 -4.05375 0 0 0
-859 1 -6.75625 -9.45875 -1.35125 0 0 0
-860 1 -9.45875 -6.75625 -1.35125 0 0 0
-861 1 -4.05375 -9.45875 -4.05375 0 0 0
-862 1 -1.35125 -6.75625 -4.05375 0 0 0
-863 1 -1.35125 -9.45875 -1.35125 0 0 0
-864 1 -4.05375 -6.75625 -1.35125 0 0 0
-865 1 1.35125 -9.45875 -4.05375 0 0 0
-866 1 4.05375 -6.75625 -4.05375 0 0 0
-867 1 4.05375 -9.45875 -1.35125 0 0 0
-868 1 1.35125 -6.75625 -1.35125 0 0 0
-869 1 6.75625 -9.45875 -4.05375 0 0 0
-870 1 9.45875 -6.75625 -4.05375 0 0 0
-871 1 9.45875 -9.45875 -1.35125 0 0 0
-872 1 6.75625 -6.75625 -1.35125 0 0 0
-873 1 12.16125 -9.45875 -4.05375 0 0 0
-874 1 14.86375 -6.75625 -4.05375 0 0 0
-875 1 14.86375 -9.45875 -1.35125 0 0 0
-876 1 12.16125 -6.75625 -1.35125 0 0 0
-877 1 17.56625 -9.45875 -4.05375 0 0 0
-878 1 20.26875 -6.75625 -4.05375 0 0 0
-879 1 20.26875 -9.45875 -1.35125 0 0 0
-880 1 17.56625 -6.75625 -1.35125 0 0 0
-881 1 22.97125 -9.45875 -4.05375 0 0 0
-882 1 25.67375 -6.75625 -4.05375 0 0 0
-883 1 25.67375 -9.45875 -1.35125 0 0 0
-884 1 22.97125 -6.75625 -1.35125 0 0 0
-885 1 28.37625 -9.45875 -4.05375 0 0 0
-886 1 31.07875 -6.75625 -4.05375 0 0 0
-887 1 31.07875 -9.45875 -1.35125 0 0 0
-888 1 28.37625 -6.75625 -1.35125 0 0 0
-889 1 33.78125 -9.45875 -4.05375 0 0 0
-890 1 36.48375 -6.75625 -4.05375 0 0 0
-891 1 36.48375 -9.45875 -1.35125 0 0 0
-892 1 33.78125 -6.75625 -1.35125 0 0 0
-893 1 39.18625 -9.45875 -4.05375 0 0 0
-894 1 41.88875 -6.75625 -4.05375 0 0 0
-895 1 41.88875 -9.45875 -1.35125 0 0 0
-896 1 39.18625 -6.75625 -1.35125 0 0 0
-897 1 -41.88875 -4.05375 -4.05375 0 0 0
-898 1 -39.18625 -1.35125 -4.05375 0 0 0
-899 1 -39.18625 -4.05375 -1.35125 0 0 0
-900 1 -41.88875 -1.35125 -1.35125 0 0 0
-901 1 -36.48375 -4.05375 -4.05375 0 0 0
-902 1 -33.78125 -1.35125 -4.05375 0 0 0
-903 1 -33.78125 -4.05375 -1.35125 0 0 0
-904 1 -36.48375 -1.35125 -1.35125 0 0 0
-905 1 -31.07875 -4.05375 -4.05375 0 0 0
-906 1 -28.37625 -1.35125 -4.05375 0 0 0
-907 1 -28.37625 -4.05375 -1.35125 0 0 0
-908 1 -31.07875 -1.35125 -1.35125 0 0 0
-909 1 -25.67375 -4.05375 -4.05375 0 0 0
-910 1 -22.97125 -1.35125 -4.05375 0 0 0
-911 1 -22.97125 -4.05375 -1.35125 0 0 0
-912 1 -25.67375 -1.35125 -1.35125 0 0 0
-913 1 -20.26875 -4.05375 -4.05375 0 0 0
-914 1 -17.56625 -1.35125 -4.05375 0 0 0
-915 1 -17.56625 -4.05375 -1.35125 0 0 0
-916 1 -20.26875 -1.35125 -1.35125 0 0 0
-917 1 -14.86375 -4.05375 -4.05375 0 0 0
-918 1 -12.16125 -1.35125 -4.05375 0 0 0
-919 1 -12.16125 -4.05375 -1.35125 0 0 0
-920 1 -14.86375 -1.35125 -1.35125 0 0 0
-921 1 -9.45875 -4.05375 -4.05375 0 0 0
-922 1 -6.75625 -1.35125 -4.05375 0 0 0
-923 1 -6.75625 -4.05375 -1.35125 0 0 0
-924 1 -9.45875 -1.35125 -1.35125 0 0 0
-925 1 -4.05375 -4.05375 -4.05375 0 0 0
-926 1 -1.35125 -1.35125 -4.05375 0 0 0
-927 1 -1.35125 -4.05375 -1.35125 0 0 0
-928 1 -4.05375 -1.35125 -1.35125 0 0 0
-929 1 1.35125 -4.05375 -4.05375 0 0 0
-930 1 4.05375 -1.35125 -4.05375 0 0 0
-931 1 4.05375 -4.05375 -1.35125 0 0 0
-932 1 1.35125 -1.35125 -1.35125 0 0 0
-933 1 6.75625 -4.05375 -4.05375 0 0 0
-934 1 9.45875 -1.35125 -4.05375 0 0 0
-935 1 9.45875 -4.05375 -1.35125 0 0 0
-936 1 6.75625 -1.35125 -1.35125 0 0 0
-937 1 12.16125 -4.05375 -4.05375 0 0 0
-938 1 14.86375 -1.35125 -4.05375 0 0 0
-939 1 14.86375 -4.05375 -1.35125 0 0 0
-940 1 12.16125 -1.35125 -1.35125 0 0 0
-941 1 17.56625 -4.05375 -4.05375 0 0 0
-942 1 20.26875 -1.35125 -4.05375 0 0 0
-943 1 20.26875 -4.05375 -1.35125 0 0 0
-944 1 17.56625 -1.35125 -1.35125 0 0 0
-945 1 22.97125 -4.05375 -4.05375 0 0 0
-946 1 25.67375 -1.35125 -4.05375 0 0 0
-947 1 25.67375 -4.05375 -1.35125 0 0 0
-948 1 22.97125 -1.35125 -1.35125 0 0 0
-949 1 28.37625 -4.05375 -4.05375 0 0 0
-950 1 31.07875 -1.35125 -4.05375 0 0 0
-951 1 31.07875 -4.05375 -1.35125 0 0 0
-952 1 28.37625 -1.35125 -1.35125 0 0 0
-953 1 33.78125 -4.05375 -4.05375 0 0 0
-954 1 36.48375 -1.35125 -4.05375 0 0 0
-955 1 36.48375 -4.05375 -1.35125 0 0 0
-956 1 33.78125 -1.35125 -1.35125 0 0 0
-957 1 39.18625 -4.05375 -4.05375 0 0 0
-958 1 41.88875 -1.35125 -4.05375 0 0 0
-959 1 41.88875 -4.05375 -1.35125 0 0 0
-960 1 39.18625 -1.35125 -1.35125 0 0 0
-961 1 -41.88875 1.35125 -4.05375 0 0 0
-962 1 -39.18625 4.05375 -4.05375 0 0 0
-963 1 -39.18625 1.35125 -1.35125 0 0 0
-964 1 -41.88875 4.05375 -1.35125 0 0 0
-965 1 -36.48375 1.35125 -4.05375 0 0 0
-966 1 -33.78125 4.05375 -4.05375 0 0 0
-967 1 -33.78125 1.35125 -1.35125 0 0 0
-968 1 -36.48375 4.05375 -1.35125 0 0 0
-969 1 -31.07875 1.35125 -4.05375 0 0 0
-970 1 -28.37625 4.05375 -4.05375 0 0 0
-971 1 -28.37625 1.35125 -1.35125 0 0 0
-972 1 -31.07875 4.05375 -1.35125 0 0 0
-973 1 -25.67375 1.35125 -4.05375 0 0 0
-974 1 -22.97125 4.05375 -4.05375 0 0 0
-975 1 -22.97125 1.35125 -1.35125 0 0 0
-976 1 -25.67375 4.05375 -1.35125 0 0 0
-977 1 -20.26875 1.35125 -4.05375 0 0 0
-978 1 -17.56625 4.05375 -4.05375 0 0 0
-979 1 -17.56625 1.35125 -1.35125 0 0 0
-980 1 -20.26875 4.05375 -1.35125 0 0 0
-981 1 -14.86375 1.35125 -4.05375 0 0 0
-982 1 -12.16125 4.05375 -4.05375 0 0 0
-983 1 -12.16125 1.35125 -1.35125 0 0 0
-984 1 -14.86375 4.05375 -1.35125 0 0 0
-985 1 -9.45875 1.35125 -4.05375 0 0 0
-986 1 -6.75625 4.05375 -4.05375 0 0 0
-987 1 -6.75625 1.35125 -1.35125 0 0 0
-988 1 -9.45875 4.05375 -1.35125 0 0 0
-989 1 -4.05375 1.35125 -4.05375 0 0 0
-990 1 -1.35125 4.05375 -4.05375 0 0 0
-991 1 -1.35125 1.35125 -1.35125 0 0 0
-992 1 -4.05375 4.05375 -1.35125 0 0 0
-993 1 1.35125 1.35125 -4.05375 0 0 0
-994 1 4.05375 4.05375 -4.05375 0 0 0
-995 1 4.05375 1.35125 -1.35125 0 0 0
-996 1 1.35125 4.05375 -1.35125 0 0 0
-997 1 6.75625 1.35125 -4.05375 0 0 0
-998 1 9.45875 4.05375 -4.05375 0 0 0
-999 1 9.45875 1.35125 -1.35125 0 0 0
-1000 1 6.75625 4.05375 -1.35125 0 0 0
-1001 1 12.16125 1.35125 -4.05375 0 0 0
-1002 1 14.86375 4.05375 -4.05375 0 0 0
-1003 1 14.86375 1.35125 -1.35125 0 0 0
-1004 1 12.16125 4.05375 -1.35125 0 0 0
-1005 1 17.56625 1.35125 -4.05375 0 0 0
-1006 1 20.26875 4.05375 -4.05375 0 0 0
-1007 1 20.26875 1.35125 -1.35125 0 0 0
-1008 1 17.56625 4.05375 -1.35125 0 0 0
-1009 1 22.97125 1.35125 -4.05375 0 0 0
-1010 1 25.67375 4.05375 -4.05375 0 0 0
-1011 1 25.67375 1.35125 -1.35125 0 0 0
-1012 1 22.97125 4.05375 -1.35125 0 0 0
-1013 1 28.37625 1.35125 -4.05375 0 0 0
-1014 1 31.07875 4.05375 -4.05375 0 0 0
-1015 1 31.07875 1.35125 -1.35125 0 0 0
-1016 1 28.37625 4.05375 -1.35125 0 0 0
-1017 1 33.78125 1.35125 -4.05375 0 0 0
-1018 1 36.48375 4.05375 -4.05375 0 0 0
-1019 1 36.48375 1.35125 -1.35125 0 0 0
-1020 1 33.78125 4.05375 -1.35125 0 0 0
-1021 1 39.18625 1.35125 -4.05375 0 0 0
-1022 1 41.88875 4.05375 -4.05375 0 0 0
-1023 1 41.88875 1.35125 -1.35125 0 0 0
-1024 1 39.18625 4.05375 -1.35125 0 0 0
-1025 1 -41.88875 6.75625 -4.05375 0 0 0
-1026 1 -39.18625 9.45875 -4.05375 0 0 0
-1027 1 -39.18625 6.75625 -1.35125 0 0 0
-1028 1 -41.88875 9.45875 -1.35125 0 0 0
-1029 1 -36.48375 6.75625 -4.05375 0 0 0
-1030 1 -33.78125 9.45875 -4.05375 0 0 0
-1031 1 -33.78125 6.75625 -1.35125 0 0 0
-1032 1 -36.48375 9.45875 -1.35125 0 0 0
-1033 1 -31.07875 6.75625 -4.05375 0 0 0
-1034 1 -28.37625 9.45875 -4.05375 0 0 0
-1035 1 -28.37625 6.75625 -1.35125 0 0 0
-1036 1 -31.07875 9.45875 -1.35125 0 0 0
-1037 1 -25.67375 6.75625 -4.05375 0 0 0
-1038 1 -22.97125 9.45875 -4.05375 0 0 0
-1039 1 -22.97125 6.75625 -1.35125 0 0 0
-1040 1 -25.67375 9.45875 -1.35125 0 0 0
-1041 1 -20.26875 6.75625 -4.05375 0 0 0
-1042 1 -17.56625 9.45875 -4.05375 0 0 0
-1043 1 -17.56625 6.75625 -1.35125 0 0 0
-1044 1 -20.26875 9.45875 -1.35125 0 0 0
-1045 1 -14.86375 6.75625 -4.05375 0 0 0
-1046 1 -12.16125 9.45875 -4.05375 0 0 0
-1047 1 -12.16125 6.75625 -1.35125 0 0 0
-1048 1 -14.86375 9.45875 -1.35125 0 0 0
-1049 1 -9.45875 6.75625 -4.05375 0 0 0
-1050 1 -6.75625 9.45875 -4.05375 0 0 0
-1051 1 -6.75625 6.75625 -1.35125 0 0 0
-1052 1 -9.45875 9.45875 -1.35125 0 0 0
-1053 1 -4.05375 6.75625 -4.05375 0 0 0
-1054 1 -1.35125 9.45875 -4.05375 0 0 0
-1055 1 -1.35125 6.75625 -1.35125 0 0 0
-1056 1 -4.05375 9.45875 -1.35125 0 0 0
-1057 1 1.35125 6.75625 -4.05375 0 0 0
-1058 1 4.05375 9.45875 -4.05375 0 0 0
-1059 1 4.05375 6.75625 -1.35125 0 0 0
-1060 1 1.35125 9.45875 -1.35125 0 0 0
-1061 1 6.75625 6.75625 -4.05375 0 0 0
-1062 1 9.45875 9.45875 -4.05375 0 0 0
-1063 1 9.45875 6.75625 -1.35125 0 0 0
-1064 1 6.75625 9.45875 -1.35125 0 0 0
-1065 1 12.16125 6.75625 -4.05375 0 0 0
-1066 1 14.86375 9.45875 -4.05375 0 0 0
-1067 1 14.86375 6.75625 -1.35125 0 0 0
-1068 1 12.16125 9.45875 -1.35125 0 0 0
-1069 1 17.56625 6.75625 -4.05375 0 0 0
-1070 1 20.26875 9.45875 -4.05375 0 0 0
-1071 1 20.26875 6.75625 -1.35125 0 0 0
-1072 1 17.56625 9.45875 -1.35125 0 0 0
-1073 1 22.97125 6.75625 -4.05375 0 0 0
-1074 1 25.67375 9.45875 -4.05375 0 0 0
-1075 1 25.67375 6.75625 -1.35125 0 0 0
-1076 1 22.97125 9.45875 -1.35125 0 0 0
-1077 1 28.37625 6.75625 -4.05375 0 0 0
-1078 1 31.07875 9.45875 -4.05375 0 0 0
-1079 1 31.07875 6.75625 -1.35125 0 0 0
-1080 1 28.37625 9.45875 -1.35125 0 0 0
-1081 1 33.78125 6.75625 -4.05375 0 0 0
-1082 1 36.48375 9.45875 -4.05375 0 0 0
-1083 1 36.48375 6.75625 -1.35125 0 0 0
-1084 1 33.78125 9.45875 -1.35125 0 0 0
-1085 1 39.18625 6.75625 -4.05375 0 0 0
-1086 1 41.88875 9.45875 -4.05375 0 0 0
-1087 1 41.88875 6.75625 -1.35125 0 0 0
-1088 1 39.18625 9.45875 -1.35125 0 0 0
-1089 1 -41.88875 12.16125 -4.05375 0 0 0
-1090 1 -39.18625 14.86375 -4.05375 0 0 0
-1091 1 -39.18625 12.16125 -1.35125 0 0 0
-1092 1 -41.88875 14.86375 -1.35125 0 0 0
-1093 1 -36.48375 12.16125 -4.05375 0 0 0
-1094 1 -33.78125 14.86375 -4.05375 0 0 0
-1095 1 -33.78125 12.16125 -1.35125 0 0 0
-1096 1 -36.48375 14.86375 -1.35125 0 0 0
-1097 1 -31.07875 12.16125 -4.05375 0 0 0
-1098 1 -28.37625 14.86375 -4.05375 0 0 0
-1099 1 -28.37625 12.16125 -1.35125 0 0 0
-1100 1 -31.07875 14.86375 -1.35125 0 0 0
-1101 1 -25.67375 12.16125 -4.05375 0 0 0
-1102 1 -22.97125 14.86375 -4.05375 0 0 0
-1103 1 -22.97125 12.16125 -1.35125 0 0 0
-1104 1 -25.67375 14.86375 -1.35125 0 0 0
-1105 1 -20.26875 12.16125 -4.05375 0 0 0
-1106 1 -17.56625 14.86375 -4.05375 0 0 0
-1107 1 -17.56625 12.16125 -1.35125 0 0 0
-1108 1 -20.26875 14.86375 -1.35125 0 0 0
-1109 1 -14.86375 12.16125 -4.05375 0 0 0
-1110 1 -12.16125 14.86375 -4.05375 0 0 0
-1111 1 -12.16125 12.16125 -1.35125 0 0 0
-1112 1 -14.86375 14.86375 -1.35125 0 0 0
-1113 1 -9.45875 12.16125 -4.05375 0 0 0
-1114 1 -6.75625 14.86375 -4.05375 0 0 0
-1115 1 -6.75625 12.16125 -1.35125 0 0 0
-1116 1 -9.45875 14.86375 -1.35125 0 0 0
-1117 1 -4.05375 12.16125 -4.05375 0 0 0
-1118 1 -1.35125 14.86375 -4.05375 0 0 0
-1119 1 -1.35125 12.16125 -1.35125 0 0 0
-1120 1 -4.05375 14.86375 -1.35125 0 0 0
-1121 1 1.35125 12.16125 -4.05375 0 0 0
-1122 1 4.05375 14.86375 -4.05375 0 0 0
-1123 1 4.05375 12.16125 -1.35125 0 0 0
-1124 1 1.35125 14.86375 -1.35125 0 0 0
-1125 1 6.75625 12.16125 -4.05375 0 0 0
-1126 1 9.45875 14.86375 -4.05375 0 0 0
-1127 1 9.45875 12.16125 -1.35125 0 0 0
-1128 1 6.75625 14.86375 -1.35125 0 0 0
-1129 1 12.16125 12.16125 -4.05375 0 0 0
-1130 1 14.86375 14.86375 -4.05375 0 0 0
-1131 1 14.86375 12.16125 -1.35125 0 0 0
-1132 1 12.16125 14.86375 -1.35125 0 0 0
-1133 1 17.56625 12.16125 -4.05375 0 0 0
-1134 1 20.26875 14.86375 -4.05375 0 0 0
-1135 1 20.26875 12.16125 -1.35125 0 0 0
-1136 1 17.56625 14.86375 -1.35125 0 0 0
-1137 1 22.97125 12.16125 -4.05375 0 0 0
-1138 1 25.67375 14.86375 -4.05375 0 0 0
-1139 1 25.67375 12.16125 -1.35125 0 0 0
-1140 1 22.97125 14.86375 -1.35125 0 0 0
-1141 1 28.37625 12.16125 -4.05375 0 0 0
-1142 1 31.07875 14.86375 -4.05375 0 0 0
-1143 1 31.07875 12.16125 -1.35125 0 0 0
-1144 1 28.37625 14.86375 -1.35125 0 0 0
-1145 1 33.78125 12.16125 -4.05375 0 0 0
-1146 1 36.48375 14.86375 -4.05375 0 0 0
-1147 1 36.48375 12.16125 -1.35125 0 0 0
-1148 1 33.78125 14.86375 -1.35125 0 0 0
-1149 1 39.18625 12.16125 -4.05375 0 0 0
-1150 1 41.88875 14.86375 -4.05375 0 0 0
-1151 1 41.88875 12.16125 -1.35125 0 0 0
-1152 1 39.18625 14.86375 -1.35125 0 0 0
-1153 1 -41.88875 -14.86375 1.35125 0 0 0
-1154 1 -39.18625 -12.16125 1.35125 0 0 0
-1155 1 -39.18625 -14.86375 4.05375 0 0 0
-1156 1 -41.88875 -12.16125 4.05375 0 0 0
-1157 1 -36.48375 -14.86375 1.35125 0 0 0
-1158 1 -33.78125 -12.16125 1.35125 0 0 0
-1159 1 -33.78125 -14.86375 4.05375 0 0 0
-1160 1 -36.48375 -12.16125 4.05375 0 0 0
-1161 1 -31.07875 -14.86375 1.35125 0 0 0
-1162 1 -28.37625 -12.16125 1.35125 0 0 0
-1163 1 -28.37625 -14.86375 4.05375 0 0 0
-1164 1 -31.07875 -12.16125 4.05375 0 0 0
-1165 1 -25.67375 -14.86375 1.35125 0 0 0
-1166 1 -22.97125 -12.16125 1.35125 0 0 0
-1167 1 -22.97125 -14.86375 4.05375 0 0 0
-1168 1 -25.67375 -12.16125 4.05375 0 0 0
-1169 1 -20.26875 -14.86375 1.35125 0 0 0
-1170 1 -17.56625 -12.16125 1.35125 0 0 0
-1171 1 -17.56625 -14.86375 4.05375 0 0 0
-1172 1 -20.26875 -12.16125 4.05375 0 0 0
-1173 1 -14.86375 -14.86375 1.35125 0 0 0
-1174 1 -12.16125 -12.16125 1.35125 0 0 0
-1175 1 -12.16125 -14.86375 4.05375 0 0 0
-1176 1 -14.86375 -12.16125 4.05375 0 0 0
-1177 1 -9.45875 -14.86375 1.35125 0 0 0
-1178 1 -6.75625 -12.16125 1.35125 0 0 0
-1179 1 -6.75625 -14.86375 4.05375 0 0 0
-1180 1 -9.45875 -12.16125 4.05375 0 0 0
-1181 1 -4.05375 -14.86375 1.35125 0 0 0
-1182 1 -1.35125 -12.16125 1.35125 0 0 0
-1183 1 -1.35125 -14.86375 4.05375 0 0 0
-1184 1 -4.05375 -12.16125 4.05375 0 0 0
-1185 1 1.35125 -14.86375 1.35125 0 0 0
-1186 1 4.05375 -12.16125 1.35125 0 0 0
-1187 1 4.05375 -14.86375 4.05375 0 0 0
-1188 1 1.35125 -12.16125 4.05375 0 0 0
-1189 1 6.75625 -14.86375 1.35125 0 0 0
-1190 1 9.45875 -12.16125 1.35125 0 0 0
-1191 1 9.45875 -14.86375 4.05375 0 0 0
-1192 1 6.75625 -12.16125 4.05375 0 0 0
-1193 1 12.16125 -14.86375 1.35125 0 0 0
-1194 1 14.86375 -12.16125 1.35125 0 0 0
-1195 1 14.86375 -14.86375 4.05375 0 0 0
-1196 1 12.16125 -12.16125 4.05375 0 0 0
-1197 1 17.56625 -14.86375 1.35125 0 0 0
-1198 1 20.26875 -12.16125 1.35125 0 0 0
-1199 1 20.26875 -14.86375 4.05375 0 0 0
-1200 1 17.56625 -12.16125 4.05375 0 0 0
-1201 1 22.97125 -14.86375 1.35125 0 0 0
-1202 1 25.67375 -12.16125 1.35125 0 0 0
-1203 1 25.67375 -14.86375 4.05375 0 0 0
-1204 1 22.97125 -12.16125 4.05375 0 0 0
-1205 1 28.37625 -14.86375 1.35125 0 0 0
-1206 1 31.07875 -12.16125 1.35125 0 0 0
-1207 1 31.07875 -14.86375 4.05375 0 0 0
-1208 1 28.37625 -12.16125 4.05375 0 0 0
-1209 1 33.78125 -14.86375 1.35125 0 0 0
-1210 1 36.48375 -12.16125 1.35125 0 0 0
-1211 1 36.48375 -14.86375 4.05375 0 0 0
-1212 1 33.78125 -12.16125 4.05375 0 0 0
-1213 1 39.18625 -14.86375 1.35125 0 0 0
-1214 1 41.88875 -12.16125 1.35125 0 0 0
-1215 1 41.88875 -14.86375 4.05375 0 0 0
-1216 1 39.18625 -12.16125 4.05375 0 0 0
-1217 1 -41.88875 -9.45875 1.35125 0 0 0
-1218 1 -39.18625 -6.75625 1.35125 0 0 0
-1219 1 -39.18625 -9.45875 4.05375 0 0 0
-1220 1 -41.88875 -6.75625 4.05375 0 0 0
-1221 1 -36.48375 -9.45875 1.35125 0 0 0
-1222 1 -33.78125 -6.75625 1.35125 0 0 0
-1223 1 -33.78125 -9.45875 4.05375 0 0 0
-1224 1 -36.48375 -6.75625 4.05375 0 0 0
-1225 1 -31.07875 -9.45875 1.35125 0 0 0
-1226 1 -28.37625 -6.75625 1.35125 0 0 0
-1227 1 -28.37625 -9.45875 4.05375 0 0 0
-1228 1 -31.07875 -6.75625 4.05375 0 0 0
-1229 1 -25.67375 -9.45875 1.35125 0 0 0
-1230 1 -22.97125 -6.75625 1.35125 0 0 0
-1231 1 -22.97125 -9.45875 4.05375 0 0 0
-1232 1 -25.67375 -6.75625 4.05375 0 0 0
-1233 1 -20.26875 -9.45875 1.35125 0 0 0
-1234 1 -17.56625 -6.75625 1.35125 0 0 0
-1235 1 -17.56625 -9.45875 4.05375 0 0 0
-1236 1 -20.26875 -6.75625 4.05375 0 0 0
-1237 1 -14.86375 -9.45875 1.35125 0 0 0
-1238 1 -12.16125 -6.75625 1.35125 0 0 0
-1239 1 -12.16125 -9.45875 4.05375 0 0 0
-1240 1 -14.86375 -6.75625 4.05375 0 0 0
-1241 1 -9.45875 -9.45875 1.35125 0 0 0
-1242 1 -6.75625 -6.75625 1.35125 0 0 0
-1243 1 -6.75625 -9.45875 4.05375 0 0 0
-1244 1 -9.45875 -6.75625 4.05375 0 0 0
-1245 1 -4.05375 -9.45875 1.35125 0 0 0
-1246 1 -1.35125 -6.75625 1.35125 0 0 0
-1247 1 -1.35125 -9.45875 4.05375 0 0 0
-1248 1 -4.05375 -6.75625 4.05375 0 0 0
-1249 1 1.35125 -9.45875 1.35125 0 0 0
-1250 1 4.05375 -6.75625 1.35125 0 0 0
-1251 1 4.05375 -9.45875 4.05375 0 0 0
-1252 1 1.35125 -6.75625 4.05375 0 0 0
-1253 1 6.75625 -9.45875 1.35125 0 0 0
-1254 1 9.45875 -6.75625 1.35125 0 0 0
-1255 1 9.45875 -9.45875 4.05375 0 0 0
-1256 1 6.75625 -6.75625 4.05375 0 0 0
-1257 1 12.16125 -9.45875 1.35125 0 0 0
-1258 1 14.86375 -6.75625 1.35125 0 0 0
-1259 1 14.86375 -9.45875 4.05375 0 0 0
-1260 1 12.16125 -6.75625 4.05375 0 0 0
-1261 1 17.56625 -9.45875 1.35125 0 0 0
-1262 1 20.26875 -6.75625 1.35125 0 0 0
-1263 1 20.26875 -9.45875 4.05375 0 0 0
-1264 1 17.56625 -6.75625 4.05375 0 0 0
-1265 1 22.97125 -9.45875 1.35125 0 0 0
-1266 1 25.67375 -6.75625 1.35125 0 0 0
-1267 1 25.67375 -9.45875 4.05375 0 0 0
-1268 1 22.97125 -6.75625 4.05375 0 0 0
-1269 1 28.37625 -9.45875 1.35125 0 0 0
-1270 1 31.07875 -6.75625 1.35125 0 0 0
-1271 1 31.07875 -9.45875 4.05375 0 0 0
-1272 1 28.37625 -6.75625 4.05375 0 0 0
-1273 1 33.78125 -9.45875 1.35125 0 0 0
-1274 1 36.48375 -6.75625 1.35125 0 0 0
-1275 1 36.48375 -9.45875 4.05375 0 0 0
-1276 1 33.78125 -6.75625 4.05375 0 0 0
-1277 1 39.18625 -9.45875 1.35125 0 0 0
-1278 1 41.88875 -6.75625 1.35125 0 0 0
-1279 1 41.88875 -9.45875 4.05375 0 0 0
-1280 1 39.18625 -6.75625 4.05375 0 0 0
-1281 1 -41.88875 -4.05375 1.35125 0 0 0
-1282 1 -39.18625 -1.35125 1.35125 0 0 0
-1283 1 -39.18625 -4.05375 4.05375 0 0 0
-1284 1 -41.88875 -1.35125 4.05375 0 0 0
-1285 1 -36.48375 -4.05375 1.35125 0 0 0
-1286 1 -33.78125 -1.35125 1.35125 0 0 0
-1287 1 -33.78125 -4.05375 4.05375 0 0 0
-1288 1 -36.48375 -1.35125 4.05375 0 0 0
-1289 1 -31.07875 -4.05375 1.35125 0 0 0
-1290 1 -28.37625 -1.35125 1.35125 0 0 0
-1291 1 -28.37625 -4.05375 4.05375 0 0 0
-1292 1 -31.07875 -1.35125 4.05375 0 0 0
-1293 1 -25.67375 -4.05375 1.35125 0 0 0
-1294 1 -22.97125 -1.35125 1.35125 0 0 0
-1295 1 -22.97125 -4.05375 4.05375 0 0 0
-1296 1 -25.67375 -1.35125 4.05375 0 0 0
-1297 1 -20.26875 -4.05375 1.35125 0 0 0
-1298 1 -17.56625 -1.35125 1.35125 0 0 0
-1299 1 -17.56625 -4.05375 4.05375 0 0 0
-1300 1 -20.26875 -1.35125 4.05375 0 0 0
-1301 1 -14.86375 -4.05375 1.35125 0 0 0
-1302 1 -12.16125 -1.35125 1.35125 0 0 0
-1303 1 -12.16125 -4.05375 4.05375 0 0 0
-1304 1 -14.86375 -1.35125 4.05375 0 0 0
-1305 1 -9.45875 -4.05375 1.35125 0 0 0
-1306 1 -6.75625 -1.35125 1.35125 0 0 0
-1307 1 -6.75625 -4.05375 4.05375 0 0 0
-1308 1 -9.45875 -1.35125 4.05375 0 0 0
-1309 1 -4.05375 -4.05375 1.35125 0 0 0
-1310 1 -1.35125 -1.35125 1.35125 0 0 0
-1311 1 -1.35125 -4.05375 4.05375 0 0 0
-1312 1 -4.05375 -1.35125 4.05375 0 0 0
-1313 1 1.35125 -4.05375 1.35125 0 0 0
-1314 1 4.05375 -1.35125 1.35125 0 0 0
-1315 1 4.05375 -4.05375 4.05375 0 0 0
-1316 1 1.35125 -1.35125 4.05375 0 0 0
-1317 1 6.75625 -4.05375 1.35125 0 0 0
-1318 1 9.45875 -1.35125 1.35125 0 0 0
-1319 1 9.45875 -4.05375 4.05375 0 0 0
-1320 1 6.75625 -1.35125 4.05375 0 0 0
-1321 1 12.16125 -4.05375 1.35125 0 0 0
-1322 1 14.86375 -1.35125 1.35125 0 0 0
-1323 1 14.86375 -4.05375 4.05375 0 0 0
-1324 1 12.16125 -1.35125 4.05375 0 0 0
-1325 1 17.56625 -4.05375 1.35125 0 0 0
-1326 1 20.26875 -1.35125 1.35125 0 0 0
-1327 1 20.26875 -4.05375 4.05375 0 0 0
-1328 1 17.56625 -1.35125 4.05375 0 0 0
-1329 1 22.97125 -4.05375 1.35125 0 0 0
-1330 1 25.67375 -1.35125 1.35125 0 0 0
-1331 1 25.67375 -4.05375 4.05375 0 0 0
-1332 1 22.97125 -1.35125 4.05375 0 0 0
-1333 1 28.37625 -4.05375 1.35125 0 0 0
-1334 1 31.07875 -1.35125 1.35125 0 0 0
-1335 1 31.07875 -4.05375 4.05375 0 0 0
-1336 1 28.37625 -1.35125 4.05375 0 0 0
-1337 1 33.78125 -4.05375 1.35125 0 0 0
-1338 1 36.48375 -1.35125 1.35125 0 0 0
-1339 1 36.48375 -4.05375 4.05375 0 0 0
-1340 1 33.78125 -1.35125 4.05375 0 0 0
-1341 1 39.18625 -4.05375 1.35125 0 0 0
-1342 1 41.88875 -1.35125 1.35125 0 0 0
-1343 1 41.88875 -4.05375 4.05375 0 0 0
-1344 1 39.18625 -1.35125 4.05375 0 0 0
-1345 1 -41.88875 1.35125 1.35125 0 0 0
-1346 1 -39.18625 4.05375 1.35125 0 0 0
-1347 1 -39.18625 1.35125 4.05375 0 0 0
-1348 1 -41.88875 4.05375 4.05375 0 0 0
-1349 1 -36.48375 1.35125 1.35125 0 0 0
-1350 1 -33.78125 4.05375 1.35125 0 0 0
-1351 1 -33.78125 1.35125 4.05375 0 0 0
-1352 1 -36.48375 4.05375 4.05375 0 0 0
-1353 1 -31.07875 1.35125 1.35125 0 0 0
-1354 1 -28.37625 4.05375 1.35125 0 0 0
-1355 1 -28.37625 1.35125 4.05375 0 0 0
-1356 1 -31.07875 4.05375 4.05375 0 0 0
-1357 1 -25.67375 1.35125 1.35125 0 0 0
-1358 1 -22.97125 4.05375 1.35125 0 0 0
-1359 1 -22.97125 1.35125 4.05375 0 0 0
-1360 1 -25.67375 4.05375 4.05375 0 0 0
-1361 1 -20.26875 1.35125 1.35125 0 0 0
-1362 1 -17.56625 4.05375 1.35125 0 0 0
-1363 1 -17.56625 1.35125 4.05375 0 0 0
-1364 1 -20.26875 4.05375 4.05375 0 0 0
-1365 1 -14.86375 1.35125 1.35125 0 0 0
-1366 1 -12.16125 4.05375 1.35125 0 0 0
-1367 1 -12.16125 1.35125 4.05375 0 0 0
-1368 1 -14.86375 4.05375 4.05375 0 0 0
-1369 1 -9.45875 1.35125 1.35125 0 0 0
-1370 1 -6.75625 4.05375 1.35125 0 0 0
-1371 1 -6.75625 1.35125 4.05375 0 0 0
-1372 1 -9.45875 4.05375 4.05375 0 0 0
-1373 1 -4.05375 1.35125 1.35125 0 0 0
-1374 1 -1.35125 4.05375 1.35125 0 0 0
-1375 1 -1.35125 1.35125 4.05375 0 0 0
-1376 1 -4.05375 4.05375 4.05375 0 0 0
-1377 1 1.35125 1.35125 1.35125 0 0 0
-1378 1 4.05375 4.05375 1.35125 0 0 0
-1379 1 4.05375 1.35125 4.05375 0 0 0
-1380 1 1.35125 4.05375 4.05375 0 0 0
-1381 1 6.75625 1.35125 1.35125 0 0 0
-1382 1 9.45875 4.05375 1.35125 0 0 0
-1383 1 9.45875 1.35125 4.05375 0 0 0
-1384 1 6.75625 4.05375 4.05375 0 0 0
-1385 1 12.16125 1.35125 1.35125 0 0 0
-1386 1 14.86375 4.05375 1.35125 0 0 0
-1387 1 14.86375 1.35125 4.05375 0 0 0
-1388 1 12.16125 4.05375 4.05375 0 0 0
-1389 1 17.56625 1.35125 1.35125 0 0 0
-1390 1 20.26875 4.05375 1.35125 0 0 0
-1391 1 20.26875 1.35125 4.05375 0 0 0
-1392 1 17.56625 4.05375 4.05375 0 0 0
-1393 1 22.97125 1.35125 1.35125 0 0 0
-1394 1 25.67375 4.05375 1.35125 0 0 0
-1395 1 25.67375 1.35125 4.05375 0 0 0
-1396 1 22.97125 4.05375 4.05375 0 0 0
-1397 1 28.37625 1.35125 1.35125 0 0 0
-1398 1 31.07875 4.05375 1.35125 0 0 0
-1399 1 31.07875 1.35125 4.05375 0 0 0
-1400 1 28.37625 4.05375 4.05375 0 0 0
-1401 1 33.78125 1.35125 1.35125 0 0 0
-1402 1 36.48375 4.05375 1.35125 0 0 0
-1403 1 36.48375 1.35125 4.05375 0 0 0
-1404 1 33.78125 4.05375 4.05375 0 0 0
-1405 1 39.18625 1.35125 1.35125 0 0 0
-1406 1 41.88875 4.05375 1.35125 0 0 0
-1407 1 41.88875 1.35125 4.05375 0 0 0
-1408 1 39.18625 4.05375 4.05375 0 0 0
-1409 1 -41.88875 6.75625 1.35125 0 0 0
-1410 1 -39.18625 9.45875 1.35125 0 0 0
-1411 1 -39.18625 6.75625 4.05375 0 0 0
-1412 1 -41.88875 9.45875 4.05375 0 0 0
-1413 1 -36.48375 6.75625 1.35125 0 0 0
-1414 1 -33.78125 9.45875 1.35125 0 0 0
-1415 1 -33.78125 6.75625 4.05375 0 0 0
-1416 1 -36.48375 9.45875 4.05375 0 0 0
-1417 1 -31.07875 6.75625 1.35125 0 0 0
-1418 1 -28.37625 9.45875 1.35125 0 0 0
-1419 1 -28.37625 6.75625 4.05375 0 0 0
-1420 1 -31.07875 9.45875 4.05375 0 0 0
-1421 1 -25.67375 6.75625 1.35125 0 0 0
-1422 1 -22.97125 9.45875 1.35125 0 0 0
-1423 1 -22.97125 6.75625 4.05375 0 0 0
-1424 1 -25.67375 9.45875 4.05375 0 0 0
-1425 1 -20.26875 6.75625 1.35125 0 0 0
-1426 1 -17.56625 9.45875 1.35125 0 0 0
-1427 1 -17.56625 6.75625 4.05375 0 0 0
-1428 1 -20.26875 9.45875 4.05375 0 0 0
-1429 1 -14.86375 6.75625 1.35125 0 0 0
-1430 1 -12.16125 9.45875 1.35125 0 0 0
-1431 1 -12.16125 6.75625 4.05375 0 0 0
-1432 1 -14.86375 9.45875 4.05375 0 0 0
-1433 1 -9.45875 6.75625 1.35125 0 0 0
-1434 1 -6.75625 9.45875 1.35125 0 0 0
-1435 1 -6.75625 6.75625 4.05375 0 0 0
-1436 1 -9.45875 9.45875 4.05375 0 0 0
-1437 1 -4.05375 6.75625 1.35125 0 0 0
-1438 1 -1.35125 9.45875 1.35125 0 0 0
-1439 1 -1.35125 6.75625 4.05375 0 0 0
-1440 1 -4.05375 9.45875 4.05375 0 0 0
-1441 1 1.35125 6.75625 1.35125 0 0 0
-1442 1 4.05375 9.45875 1.35125 0 0 0
-1443 1 4.05375 6.75625 4.05375 0 0 0
-1444 1 1.35125 9.45875 4.05375 0 0 0
-1445 1 6.75625 6.75625 1.35125 0 0 0
-1446 1 9.45875 9.45875 1.35125 0 0 0
-1447 1 9.45875 6.75625 4.05375 0 0 0
-1448 1 6.75625 9.45875 4.05375 0 0 0
-1449 1 12.16125 6.75625 1.35125 0 0 0
-1450 1 14.86375 9.45875 1.35125 0 0 0
-1451 1 14.86375 6.75625 4.05375 0 0 0
-1452 1 12.16125 9.45875 4.05375 0 0 0
-1453 1 17.56625 6.75625 1.35125 0 0 0
-1454 1 20.26875 9.45875 1.35125 0 0 0
-1455 1 20.26875 6.75625 4.05375 0 0 0
-1456 1 17.56625 9.45875 4.05375 0 0 0
-1457 1 22.97125 6.75625 1.35125 0 0 0
-1458 1 25.67375 9.45875 1.35125 0 0 0
-1459 1 25.67375 6.75625 4.05375 0 0 0
-1460 1 22.97125 9.45875 4.05375 0 0 0
-1461 1 28.37625 6.75625 1.35125 0 0 0
-1462 1 31.07875 9.45875 1.35125 0 0 0
-1463 1 31.07875 6.75625 4.05375 0 0 0
-1464 1 28.37625 9.45875 4.05375 0 0 0
-1465 1 33.78125 6.75625 1.35125 0 0 0
-1466 1 36.48375 9.45875 1.35125 0 0 0
-1467 1 36.48375 6.75625 4.05375 0 0 0
-1468 1 33.78125 9.45875 4.05375 0 0 0
-1469 1 39.18625 6.75625 1.35125 0 0 0
-1470 1 41.88875 9.45875 1.35125 0 0 0
-1471 1 41.88875 6.75625 4.05375 0 0 0
-1472 1 39.18625 9.45875 4.05375 0 0 0
-1473 1 -41.88875 12.16125 1.35125 0 0 0
-1474 1 -39.18625 14.86375 1.35125 0 0 0
-1475 1 -39.18625 12.16125 4.05375 0 0 0
-1476 1 -41.88875 14.86375 4.05375 0 0 0
-1477 1 -36.48375 12.16125 1.35125 0 0 0
-1478 1 -33.78125 14.86375 1.35125 0 0 0
-1479 1 -33.78125 12.16125 4.05375 0 0 0
-1480 1 -36.48375 14.86375 4.05375 0 0 0
-1481 1 -31.07875 12.16125 1.35125 0 0 0
-1482 1 -28.37625 14.86375 1.35125 0 0 0
-1483 1 -28.37625 12.16125 4.05375 0 0 0
-1484 1 -31.07875 14.86375 4.05375 0 0 0
-1485 1 -25.67375 12.16125 1.35125 0 0 0
-1486 1 -22.97125 14.86375 1.35125 0 0 0
-1487 1 -22.97125 12.16125 4.05375 0 0 0
-1488 1 -25.67375 14.86375 4.05375 0 0 0
-1489 1 -20.26875 12.16125 1.35125 0 0 0
-1490 1 -17.56625 14.86375 1.35125 0 0 0
-1491 1 -17.56625 12.16125 4.05375 0 0 0
-1492 1 -20.26875 14.86375 4.05375 0 0 0
-1493 1 -14.86375 12.16125 1.35125 0 0 0
-1494 1 -12.16125 14.86375 1.35125 0 0 0
-1495 1 -12.16125 12.16125 4.05375 0 0 0
-1496 1 -14.86375 14.86375 4.05375 0 0 0
-1497 1 -9.45875 12.16125 1.35125 0 0 0
-1498 1 -6.75625 14.86375 1.35125 0 0 0
-1499 1 -6.75625 12.16125 4.05375 0 0 0
-1500 1 -9.45875 14.86375 4.05375 0 0 0
-1501 1 -4.05375 12.16125 1.35125 0 0 0
-1502 1 -1.35125 14.86375 1.35125 0 0 0
-1503 1 -1.35125 12.16125 4.05375 0 0 0
-1504 1 -4.05375 14.86375 4.05375 0 0 0
-1505 1 1.35125 12.16125 1.35125 0 0 0
-1506 1 4.05375 14.86375 1.35125 0 0 0
-1507 1 4.05375 12.16125 4.05375 0 0 0
-1508 1 1.35125 14.86375 4.05375 0 0 0
-1509 1 6.75625 12.16125 1.35125 0 0 0
-1510 1 9.45875 14.86375 1.35125 0 0 0
-1511 1 9.45875 12.16125 4.05375 0 0 0
-1512 1 6.75625 14.86375 4.05375 0 0 0
-1513 1 12.16125 12.16125 1.35125 0 0 0
-1514 1 14.86375 14.86375 1.35125 0 0 0
-1515 1 14.86375 12.16125 4.05375 0 0 0
-1516 1 12.16125 14.86375 4.05375 0 0 0
-1517 1 17.56625 12.16125 1.35125 0 0 0
-1518 1 20.26875 14.86375 1.35125 0 0 0
-1519 1 20.26875 12.16125 4.05375 0 0 0
-1520 1 17.56625 14.86375 4.05375 0 0 0
-1521 1 22.97125 12.16125 1.35125 0 0 0
-1522 1 25.67375 14.86375 1.35125 0 0 0
-1523 1 25.67375 12.16125 4.05375 0 0 0
-1524 1 22.97125 14.86375 4.05375 0 0 0
-1525 1 28.37625 12.16125 1.35125 0 0 0
-1526 1 31.07875 14.86375 1.35125 0 0 0
-1527 1 31.07875 12.16125 4.05375 0 0 0
-1528 1 28.37625 14.86375 4.05375 0 0 0
-1529 1 33.78125 12.16125 1.35125 0 0 0
-1530 1 36.48375 14.86375 1.35125 0 0 0
-1531 1 36.48375 12.16125 4.05375 0 0 0
-1532 1 33.78125 14.86375 4.05375 0 0 0
-1533 1 39.18625 12.16125 1.35125 0 0 0
-1534 1 41.88875 14.86375 1.35125 0 0 0
-1535 1 41.88875 12.16125 4.05375 0 0 0
-1536 1 39.18625 14.86375 4.05375 0 0 0
-1537 1 -41.88875 -14.86375 6.75625 0 0 0
-1538 1 -39.18625 -12.16125 6.75625 0 0 0
-1539 1 -39.18625 -14.86375 9.45875 0 0 0
-1540 1 -41.88875 -12.16125 9.45875 0 0 0
-1541 1 -36.48375 -14.86375 6.75625 0 0 0
-1542 1 -33.78125 -12.16125 6.75625 0 0 0
-1543 1 -33.78125 -14.86375 9.45875 0 0 0
-1544 1 -36.48375 -12.16125 9.45875 0 0 0
-1545 1 -31.07875 -14.86375 6.75625 0 0 0
-1546 1 -28.37625 -12.16125 6.75625 0 0 0
-1547 1 -28.37625 -14.86375 9.45875 0 0 0
-1548 1 -31.07875 -12.16125 9.45875 0 0 0
-1549 1 -25.67375 -14.86375 6.75625 0 0 0
-1550 1 -22.97125 -12.16125 6.75625 0 0 0
-1551 1 -22.97125 -14.86375 9.45875 0 0 0
-1552 1 -25.67375 -12.16125 9.45875 0 0 0
-1553 1 -20.26875 -14.86375 6.75625 0 0 0
-1554 1 -17.56625 -12.16125 6.75625 0 0 0
-1555 1 -17.56625 -14.86375 9.45875 0 0 0
-1556 1 -20.26875 -12.16125 9.45875 0 0 0
-1557 1 -14.86375 -14.86375 6.75625 0 0 0
-1558 1 -12.16125 -12.16125 6.75625 0 0 0
-1559 1 -12.16125 -14.86375 9.45875 0 0 0
-1560 1 -14.86375 -12.16125 9.45875 0 0 0
-1561 1 -9.45875 -14.86375 6.75625 0 0 0
-1562 1 -6.75625 -12.16125 6.75625 0 0 0
-1563 1 -6.75625 -14.86375 9.45875 0 0 0
-1564 1 -9.45875 -12.16125 9.45875 0 0 0
-1565 1 -4.05375 -14.86375 6.75625 0 0 0
-1566 1 -1.35125 -12.16125 6.75625 0 0 0
-1567 1 -1.35125 -14.86375 9.45875 0 0 0
-1568 1 -4.05375 -12.16125 9.45875 0 0 0
-1569 1 1.35125 -14.86375 6.75625 0 0 0
-1570 1 4.05375 -12.16125 6.75625 0 0 0
-1571 1 4.05375 -14.86375 9.45875 0 0 0
-1572 1 1.35125 -12.16125 9.45875 0 0 0
-1573 1 6.75625 -14.86375 6.75625 0 0 0
-1574 1 9.45875 -12.16125 6.75625 0 0 0
-1575 1 9.45875 -14.86375 9.45875 0 0 0
-1576 1 6.75625 -12.16125 9.45875 0 0 0
-1577 1 12.16125 -14.86375 6.75625 0 0 0
-1578 1 14.86375 -12.16125 6.75625 0 0 0
-1579 1 14.86375 -14.86375 9.45875 0 0 0
-1580 1 12.16125 -12.16125 9.45875 0 0 0
-1581 1 17.56625 -14.86375 6.75625 0 0 0
-1582 1 20.26875 -12.16125 6.75625 0 0 0
-1583 1 20.26875 -14.86375 9.45875 0 0 0
-1584 1 17.56625 -12.16125 9.45875 0 0 0
-1585 1 22.97125 -14.86375 6.75625 0 0 0
-1586 1 25.67375 -12.16125 6.75625 0 0 0
-1587 1 25.67375 -14.86375 9.45875 0 0 0
-1588 1 22.97125 -12.16125 9.45875 0 0 0
-1589 1 28.37625 -14.86375 6.75625 0 0 0
-1590 1 31.07875 -12.16125 6.75625 0 0 0
-1591 1 31.07875 -14.86375 9.45875 0 0 0
-1592 1 28.37625 -12.16125 9.45875 0 0 0
-1593 1 33.78125 -14.86375 6.75625 0 0 0
-1594 1 36.48375 -12.16125 6.75625 0 0 0
-1595 1 36.48375 -14.86375 9.45875 0 0 0
-1596 1 33.78125 -12.16125 9.45875 0 0 0
-1597 1 39.18625 -14.86375 6.75625 0 0 0
-1598 1 41.88875 -12.16125 6.75625 0 0 0
-1599 1 41.88875 -14.86375 9.45875 0 0 0
-1600 1 39.18625 -12.16125 9.45875 0 0 0
-1601 1 -41.88875 -9.45875 6.75625 0 0 0
-1602 1 -39.18625 -6.75625 6.75625 0 0 0
-1603 1 -39.18625 -9.45875 9.45875 0 0 0
-1604 1 -41.88875 -6.75625 9.45875 0 0 0
-1605 1 -36.48375 -9.45875 6.75625 0 0 0
-1606 1 -33.78125 -6.75625 6.75625 0 0 0
-1607 1 -33.78125 -9.45875 9.45875 0 0 0
-1608 1 -36.48375 -6.75625 9.45875 0 0 0
-1609 1 -31.07875 -9.45875 6.75625 0 0 0
-1610 1 -28.37625 -6.75625 6.75625 0 0 0
-1611 1 -28.37625 -9.45875 9.45875 0 0 0
-1612 1 -31.07875 -6.75625 9.45875 0 0 0
-1613 1 -25.67375 -9.45875 6.75625 0 0 0
-1614 1 -22.97125 -6.75625 6.75625 0 0 0
-1615 1 -22.97125 -9.45875 9.45875 0 0 0
-1616 1 -25.67375 -6.75625 9.45875 0 0 0
-1617 1 -20.26875 -9.45875 6.75625 0 0 0
-1618 1 -17.56625 -6.75625 6.75625 0 0 0
-1619 1 -17.56625 -9.45875 9.45875 0 0 0
-1620 1 -20.26875 -6.75625 9.45875 0 0 0
-1621 1 -14.86375 -9.45875 6.75625 0 0 0
-1622 1 -12.16125 -6.75625 6.75625 0 0 0
-1623 1 -12.16125 -9.45875 9.45875 0 0 0
-1624 1 -14.86375 -6.75625 9.45875 0 0 0
-1625 1 -9.45875 -9.45875 6.75625 0 0 0
-1626 1 -6.75625 -6.75625 6.75625 0 0 0
-1627 1 -6.75625 -9.45875 9.45875 0 0 0
-1628 1 -9.45875 -6.75625 9.45875 0 0 0
-1629 1 -4.05375 -9.45875 6.75625 0 0 0
-1630 1 -1.35125 -6.75625 6.75625 0 0 0
-1631 1 -1.35125 -9.45875 9.45875 0 0 0
-1632 1 -4.05375 -6.75625 9.45875 0 0 0
-1633 1 1.35125 -9.45875 6.75625 0 0 0
-1634 1 4.05375 -6.75625 6.75625 0 0 0
-1635 1 4.05375 -9.45875 9.45875 0 0 0
-1636 1 1.35125 -6.75625 9.45875 0 0 0
-1637 1 6.75625 -9.45875 6.75625 0 0 0
-1638 1 9.45875 -6.75625 6.75625 0 0 0
-1639 1 9.45875 -9.45875 9.45875 0 0 0
-1640 1 6.75625 -6.75625 9.45875 0 0 0
-1641 1 12.16125 -9.45875 6.75625 0 0 0
-1642 1 14.86375 -6.75625 6.75625 0 0 0
-1643 1 14.86375 -9.45875 9.45875 0 0 0
-1644 1 12.16125 -6.75625 9.45875 0 0 0
-1645 1 17.56625 -9.45875 6.75625 0 0 0
-1646 1 20.26875 -6.75625 6.75625 0 0 0
-1647 1 20.26875 -9.45875 9.45875 0 0 0
-1648 1 17.56625 -6.75625 9.45875 0 0 0
-1649 1 22.97125 -9.45875 6.75625 0 0 0
-1650 1 25.67375 -6.75625 6.75625 0 0 0
-1651 1 25.67375 -9.45875 9.45875 0 0 0
-1652 1 22.97125 -6.75625 9.45875 0 0 0
-1653 1 28.37625 -9.45875 6.75625 0 0 0
-1654 1 31.07875 -6.75625 6.75625 0 0 0
-1655 1 31.07875 -9.45875 9.45875 0 0 0
-1656 1 28.37625 -6.75625 9.45875 0 0 0
-1657 1 33.78125 -9.45875 6.75625 0 0 0
-1658 1 36.48375 -6.75625 6.75625 0 0 0
-1659 1 36.48375 -9.45875 9.45875 0 0 0
-1660 1 33.78125 -6.75625 9.45875 0 0 0
-1661 1 39.18625 -9.45875 6.75625 0 0 0
-1662 1 41.88875 -6.75625 6.75625 0 0 0
-1663 1 41.88875 -9.45875 9.45875 0 0 0
-1664 1 39.18625 -6.75625 9.45875 0 0 0
-1665 1 -41.88875 -4.05375 6.75625 0 0 0
-1666 1 -39.18625 -1.35125 6.75625 0 0 0
-1667 1 -39.18625 -4.05375 9.45875 0 0 0
-1668 1 -41.88875 -1.35125 9.45875 0 0 0
-1669 1 -36.48375 -4.05375 6.75625 0 0 0
-1670 1 -33.78125 -1.35125 6.75625 0 0 0
-1671 1 -33.78125 -4.05375 9.45875 0 0 0
-1672 1 -36.48375 -1.35125 9.45875 0 0 0
-1673 1 -31.07875 -4.05375 6.75625 0 0 0
-1674 1 -28.37625 -1.35125 6.75625 0 0 0
-1675 1 -28.37625 -4.05375 9.45875 0 0 0
-1676 1 -31.07875 -1.35125 9.45875 0 0 0
-1677 1 -25.67375 -4.05375 6.75625 0 0 0
-1678 1 -22.97125 -1.35125 6.75625 0 0 0
-1679 1 -22.97125 -4.05375 9.45875 0 0 0
-1680 1 -25.67375 -1.35125 9.45875 0 0 0
-1681 1 -20.26875 -4.05375 6.75625 0 0 0
-1682 1 -17.56625 -1.35125 6.75625 0 0 0
-1683 1 -17.56625 -4.05375 9.45875 0 0 0
-1684 1 -20.26875 -1.35125 9.45875 0 0 0
-1685 1 -14.86375 -4.05375 6.75625 0 0 0
-1686 1 -12.16125 -1.35125 6.75625 0 0 0
-1687 1 -12.16125 -4.05375 9.45875 0 0 0
-1688 1 -14.86375 -1.35125 9.45875 0 0 0
-1689 1 -9.45875 -4.05375 6.75625 0 0 0
-1690 1 -6.75625 -1.35125 6.75625 0 0 0
-1691 1 -6.75625 -4.05375 9.45875 0 0 0
-1692 1 -9.45875 -1.35125 9.45875 0 0 0
-1693 1 -4.05375 -4.05375 6.75625 0 0 0
-1694 1 -1.35125 -1.35125 6.75625 0 0 0
-1695 1 -1.35125 -4.05375 9.45875 0 0 0
-1696 1 -4.05375 -1.35125 9.45875 0 0 0
-1697 1 1.35125 -4.05375 6.75625 0 0 0
-1698 1 4.05375 -1.35125 6.75625 0 0 0
-1699 1 4.05375 -4.05375 9.45875 0 0 0
-1700 1 1.35125 -1.35125 9.45875 0 0 0
-1701 1 6.75625 -4.05375 6.75625 0 0 0
-1702 1 9.45875 -1.35125 6.75625 0 0 0
-1703 1 9.45875 -4.05375 9.45875 0 0 0
-1704 1 6.75625 -1.35125 9.45875 0 0 0
-1705 1 12.16125 -4.05375 6.75625 0 0 0
-1706 1 14.86375 -1.35125 6.75625 0 0 0
-1707 1 14.86375 -4.05375 9.45875 0 0 0
-1708 1 12.16125 -1.35125 9.45875 0 0 0
-1709 1 17.56625 -4.05375 6.75625 0 0 0
-1710 1 20.26875 -1.35125 6.75625 0 0 0
-1711 1 20.26875 -4.05375 9.45875 0 0 0
-1712 1 17.56625 -1.35125 9.45875 0 0 0
-1713 1 22.97125 -4.05375 6.75625 0 0 0
-1714 1 25.67375 -1.35125 6.75625 0 0 0
-1715 1 25.67375 -4.05375 9.45875 0 0 0
-1716 1 22.97125 -1.35125 9.45875 0 0 0
-1717 1 28.37625 -4.05375 6.75625 0 0 0
-1718 1 31.07875 -1.35125 6.75625 0 0 0
-1719 1 31.07875 -4.05375 9.45875 0 0 0
-1720 1 28.37625 -1.35125 9.45875 0 0 0
-1721 1 33.78125 -4.05375 6.75625 0 0 0
-1722 1 36.48375 -1.35125 6.75625 0 0 0
-1723 1 36.48375 -4.05375 9.45875 0 0 0
-1724 1 33.78125 -1.35125 9.45875 0 0 0
-1725 1 39.18625 -4.05375 6.75625 0 0 0
-1726 1 41.88875 -1.35125 6.75625 0 0 0
-1727 1 41.88875 -4.05375 9.45875 0 0 0
-1728 1 39.18625 -1.35125 9.45875 0 0 0
-1729 1 -41.88875 1.35125 6.75625 0 0 0
-1730 1 -39.18625 4.05375 6.75625 0 0 0
-1731 1 -39.18625 1.35125 9.45875 0 0 0
-1732 1 -41.88875 4.05375 9.45875 0 0 0
-1733 1 -36.48375 1.35125 6.75625 0 0 0
-1734 1 -33.78125 4.05375 6.75625 0 0 0
-1735 1 -33.78125 1.35125 9.45875 0 0 0
-1736 1 -36.48375 4.05375 9.45875 0 0 0
-1737 1 -31.07875 1.35125 6.75625 0 0 0
-1738 1 -28.37625 4.05375 6.75625 0 0 0
-1739 1 -28.37625 1.35125 9.45875 0 0 0
-1740 1 -31.07875 4.05375 9.45875 0 0 0
-1741 1 -25.67375 1.35125 6.75625 0 0 0
-1742 1 -22.97125 4.05375 6.75625 0 0 0
-1743 1 -22.97125 1.35125 9.45875 0 0 0
-1744 1 -25.67375 4.05375 9.45875 0 0 0
-1745 1 -20.26875 1.35125 6.75625 0 0 0
-1746 1 -17.56625 4.05375 6.75625 0 0 0
-1747 1 -17.56625 1.35125 9.45875 0 0 0
-1748 1 -20.26875 4.05375 9.45875 0 0 0
-1749 1 -14.86375 1.35125 6.75625 0 0 0
-1750 1 -12.16125 4.05375 6.75625 0 0 0
-1751 1 -12.16125 1.35125 9.45875 0 0 0
-1752 1 -14.86375 4.05375 9.45875 0 0 0
-1753 1 -9.45875 1.35125 6.75625 0 0 0
-1754 1 -6.75625 4.05375 6.75625 0 0 0
-1755 1 -6.75625 1.35125 9.45875 0 0 0
-1756 1 -9.45875 4.05375 9.45875 0 0 0
-1757 1 -4.05375 1.35125 6.75625 0 0 0
-1758 1 -1.35125 4.05375 6.75625 0 0 0
-1759 1 -1.35125 1.35125 9.45875 0 0 0
-1760 1 -4.05375 4.05375 9.45875 0 0 0
-1761 1 1.35125 1.35125 6.75625 0 0 0
-1762 1 4.05375 4.05375 6.75625 0 0 0
-1763 1 4.05375 1.35125 9.45875 0 0 0
-1764 1 1.35125 4.05375 9.45875 0 0 0
-1765 1 6.75625 1.35125 6.75625 0 0 0
-1766 1 9.45875 4.05375 6.75625 0 0 0
-1767 1 9.45875 1.35125 9.45875 0 0 0
-1768 1 6.75625 4.05375 9.45875 0 0 0
-1769 1 12.16125 1.35125 6.75625 0 0 0
-1770 1 14.86375 4.05375 6.75625 0 0 0
-1771 1 14.86375 1.35125 9.45875 0 0 0
-1772 1 12.16125 4.05375 9.45875 0 0 0
-1773 1 17.56625 1.35125 6.75625 0 0 0
-1774 1 20.26875 4.05375 6.75625 0 0 0
-1775 1 20.26875 1.35125 9.45875 0 0 0
-1776 1 17.56625 4.05375 9.45875 0 0 0
-1777 1 22.97125 1.35125 6.75625 0 0 0
-1778 1 25.67375 4.05375 6.75625 0 0 0
-1779 1 25.67375 1.35125 9.45875 0 0 0
-1780 1 22.97125 4.05375 9.45875 0 0 0
-1781 1 28.37625 1.35125 6.75625 0 0 0
-1782 1 31.07875 4.05375 6.75625 0 0 0
-1783 1 31.07875 1.35125 9.45875 0 0 0
-1784 1 28.37625 4.05375 9.45875 0 0 0
-1785 1 33.78125 1.35125 6.75625 0 0 0
-1786 1 36.48375 4.05375 6.75625 0 0 0
-1787 1 36.48375 1.35125 9.45875 0 0 0
-1788 1 33.78125 4.05375 9.45875 0 0 0
-1789 1 39.18625 1.35125 6.75625 0 0 0
-1790 1 41.88875 4.05375 6.75625 0 0 0
-1791 1 41.88875 1.35125 9.45875 0 0 0
-1792 1 39.18625 4.05375 9.45875 0 0 0
-1793 1 -41.88875 6.75625 6.75625 0 0 0
-1794 1 -39.18625 9.45875 6.75625 0 0 0
-1795 1 -39.18625 6.75625 9.45875 0 0 0
-1796 1 -41.88875 9.45875 9.45875 0 0 0
-1797 1 -36.48375 6.75625 6.75625 0 0 0
-1798 1 -33.78125 9.45875 6.75625 0 0 0
-1799 1 -33.78125 6.75625 9.45875 0 0 0
-1800 1 -36.48375 9.45875 9.45875 0 0 0
-1801 1 -31.07875 6.75625 6.75625 0 0 0
-1802 1 -28.37625 9.45875 6.75625 0 0 0
-1803 1 -28.37625 6.75625 9.45875 0 0 0
-1804 1 -31.07875 9.45875 9.45875 0 0 0
-1805 1 -25.67375 6.75625 6.75625 0 0 0
-1806 1 -22.97125 9.45875 6.75625 0 0 0
-1807 1 -22.97125 6.75625 9.45875 0 0 0
-1808 1 -25.67375 9.45875 9.45875 0 0 0
-1809 1 -20.26875 6.75625 6.75625 0 0 0
-1810 1 -17.56625 9.45875 6.75625 0 0 0
-1811 1 -17.56625 6.75625 9.45875 0 0 0
-1812 1 -20.26875 9.45875 9.45875 0 0 0
-1813 1 -14.86375 6.75625 6.75625 0 0 0
-1814 1 -12.16125 9.45875 6.75625 0 0 0
-1815 1 -12.16125 6.75625 9.45875 0 0 0
-1816 1 -14.86375 9.45875 9.45875 0 0 0
-1817 1 -9.45875 6.75625 6.75625 0 0 0
-1818 1 -6.75625 9.45875 6.75625 0 0 0
-1819 1 -6.75625 6.75625 9.45875 0 0 0
-1820 1 -9.45875 9.45875 9.45875 0 0 0
-1821 1 -4.05375 6.75625 6.75625 0 0 0
-1822 1 -1.35125 9.45875 6.75625 0 0 0
-1823 1 -1.35125 6.75625 9.45875 0 0 0
-1824 1 -4.05375 9.45875 9.45875 0 0 0
-1825 1 1.35125 6.75625 6.75625 0 0 0
-1826 1 4.05375 9.45875 6.75625 0 0 0
-1827 1 4.05375 6.75625 9.45875 0 0 0
-1828 1 1.35125 9.45875 9.45875 0 0 0
-1829 1 6.75625 6.75625 6.75625 0 0 0
-1830 1 9.45875 9.45875 6.75625 0 0 0
-1831 1 9.45875 6.75625 9.45875 0 0 0
-1832 1 6.75625 9.45875 9.45875 0 0 0
-1833 1 12.16125 6.75625 6.75625 0 0 0
-1834 1 14.86375 9.45875 6.75625 0 0 0
-1835 1 14.86375 6.75625 9.45875 0 0 0
-1836 1 12.16125 9.45875 9.45875 0 0 0
-1837 1 17.56625 6.75625 6.75625 0 0 0
-1838 1 20.26875 9.45875 6.75625 0 0 0
-1839 1 20.26875 6.75625 9.45875 0 0 0
-1840 1 17.56625 9.45875 9.45875 0 0 0
-1841 1 22.97125 6.75625 6.75625 0 0 0
-1842 1 25.67375 9.45875 6.75625 0 0 0
-1843 1 25.67375 6.75625 9.45875 0 0 0
-1844 1 22.97125 9.45875 9.45875 0 0 0
-1845 1 28.37625 6.75625 6.75625 0 0 0
-1846 1 31.07875 9.45875 6.75625 0 0 0
-1847 1 31.07875 6.75625 9.45875 0 0 0
-1848 1 28.37625 9.45875 9.45875 0 0 0
-1849 1 33.78125 6.75625 6.75625 0 0 0
-1850 1 36.48375 9.45875 6.75625 0 0 0
-1851 1 36.48375 6.75625 9.45875 0 0 0
-1852 1 33.78125 9.45875 9.45875 0 0 0
-1853 1 39.18625 6.75625 6.75625 0 0 0
-1854 1 41.88875 9.45875 6.75625 0 0 0
-1855 1 41.88875 6.75625 9.45875 0 0 0
-1856 1 39.18625 9.45875 9.45875 0 0 0
-1857 1 -41.88875 12.16125 6.75625 0 0 0
-1858 1 -39.18625 14.86375 6.75625 0 0 0
-1859 1 -39.18625 12.16125 9.45875 0 0 0
-1860 1 -41.88875 14.86375 9.45875 0 0 0
-1861 1 -36.48375 12.16125 6.75625 0 0 0
-1862 1 -33.78125 14.86375 6.75625 0 0 0
-1863 1 -33.78125 12.16125 9.45875 0 0 0
-1864 1 -36.48375 14.86375 9.45875 0 0 0
-1865 1 -31.07875 12.16125 6.75625 0 0 0
-1866 1 -28.37625 14.86375 6.75625 0 0 0
-1867 1 -28.37625 12.16125 9.45875 0 0 0
-1868 1 -31.07875 14.86375 9.45875 0 0 0
-1869 1 -25.67375 12.16125 6.75625 0 0 0
-1870 1 -22.97125 14.86375 6.75625 0 0 0
-1871 1 -22.97125 12.16125 9.45875 0 0 0
-1872 1 -25.67375 14.86375 9.45875 0 0 0
-1873 1 -20.26875 12.16125 6.75625 0 0 0
-1874 1 -17.56625 14.86375 6.75625 0 0 0
-1875 1 -17.56625 12.16125 9.45875 0 0 0
-1876 1 -20.26875 14.86375 9.45875 0 0 0
-1877 1 -14.86375 12.16125 6.75625 0 0 0
-1878 1 -12.16125 14.86375 6.75625 0 0 0
-1879 1 -12.16125 12.16125 9.45875 0 0 0
-1880 1 -14.86375 14.86375 9.45875 0 0 0
-1881 1 -9.45875 12.16125 6.75625 0 0 0
-1882 1 -6.75625 14.86375 6.75625 0 0 0
-1883 1 -6.75625 12.16125 9.45875 0 0 0
-1884 1 -9.45875 14.86375 9.45875 0 0 0
-1885 1 -4.05375 12.16125 6.75625 0 0 0
-1886 1 -1.35125 14.86375 6.75625 0 0 0
-1887 1 -1.35125 12.16125 9.45875 0 0 0
-1888 1 -4.05375 14.86375 9.45875 0 0 0
-1889 1 1.35125 12.16125 6.75625 0 0 0
-1890 1 4.05375 14.86375 6.75625 0 0 0
-1891 1 4.05375 12.16125 9.45875 0 0 0
-1892 1 1.35125 14.86375 9.45875 0 0 0
-1893 1 6.75625 12.16125 6.75625 0 0 0
-1894 1 9.45875 14.86375 6.75625 0 0 0
-1895 1 9.45875 12.16125 9.45875 0 0 0
-1896 1 6.75625 14.86375 9.45875 0 0 0
-1897 1 12.16125 12.16125 6.75625 0 0 0
-1898 1 14.86375 14.86375 6.75625 0 0 0
-1899 1 14.86375 12.16125 9.45875 0 0 0
-1900 1 12.16125 14.86375 9.45875 0 0 0
-1901 1 17.56625 12.16125 6.75625 0 0 0
-1902 1 20.26875 14.86375 6.75625 0 0 0
-1903 1 20.26875 12.16125 9.45875 0 0 0
-1904 1 17.56625 14.86375 9.45875 0 0 0
-1905 1 22.97125 12.16125 6.75625 0 0 0
-1906 1 25.67375 14.86375 6.75625 0 0 0
-1907 1 25.67375 12.16125 9.45875 0 0 0
-1908 1 22.97125 14.86375 9.45875 0 0 0
-1909 1 28.37625 12.16125 6.75625 0 0 0
-1910 1 31.07875 14.86375 6.75625 0 0 0
-1911 1 31.07875 12.16125 9.45875 0 0 0
-1912 1 28.37625 14.86375 9.45875 0 0 0
-1913 1 33.78125 12.16125 6.75625 0 0 0
-1914 1 36.48375 14.86375 6.75625 0 0 0
-1915 1 36.48375 12.16125 9.45875 0 0 0
-1916 1 33.78125 14.86375 9.45875 0 0 0
-1917 1 39.18625 12.16125 6.75625 0 0 0
-1918 1 41.88875 14.86375 6.75625 0 0 0
-1919 1 41.88875 12.16125 9.45875 0 0 0
-1920 1 39.18625 14.86375 9.45875 0 0 0
-1921 1 -41.88875 -14.86375 12.16125 0 0 0
-1922 1 -39.18625 -12.16125 12.16125 0 0 0
-1923 1 -39.18625 -14.86375 14.86375 0 0 0
-1924 1 -41.88875 -12.16125 14.86375 0 0 0
-1925 1 -36.48375 -14.86375 12.16125 0 0 0
-1926 1 -33.78125 -12.16125 12.16125 0 0 0
-1927 1 -33.78125 -14.86375 14.86375 0 0 0
-1928 1 -36.48375 -12.16125 14.86375 0 0 0
-1929 1 -31.07875 -14.86375 12.16125 0 0 0
-1930 1 -28.37625 -12.16125 12.16125 0 0 0
-1931 1 -28.37625 -14.86375 14.86375 0 0 0
-1932 1 -31.07875 -12.16125 14.86375 0 0 0
-1933 1 -25.67375 -14.86375 12.16125 0 0 0
-1934 1 -22.97125 -12.16125 12.16125 0 0 0
-1935 1 -22.97125 -14.86375 14.86375 0 0 0
-1936 1 -25.67375 -12.16125 14.86375 0 0 0
-1937 1 -20.26875 -14.86375 12.16125 0 0 0
-1938 1 -17.56625 -12.16125 12.16125 0 0 0
-1939 1 -17.56625 -14.86375 14.86375 0 0 0
-1940 1 -20.26875 -12.16125 14.86375 0 0 0
-1941 1 -14.86375 -14.86375 12.16125 0 0 0
-1942 1 -12.16125 -12.16125 12.16125 0 0 0
-1943 1 -12.16125 -14.86375 14.86375 0 0 0
-1944 1 -14.86375 -12.16125 14.86375 0 0 0
-1945 1 -9.45875 -14.86375 12.16125 0 0 0
-1946 1 -6.75625 -12.16125 12.16125 0 0 0
-1947 1 -6.75625 -14.86375 14.86375 0 0 0
-1948 1 -9.45875 -12.16125 14.86375 0 0 0
-1949 1 -4.05375 -14.86375 12.16125 0 0 0
-1950 1 -1.35125 -12.16125 12.16125 0 0 0
-1951 1 -1.35125 -14.86375 14.86375 0 0 0
-1952 1 -4.05375 -12.16125 14.86375 0 0 0
-1953 1 1.35125 -14.86375 12.16125 0 0 0
-1954 1 4.05375 -12.16125 12.16125 0 0 0
-1955 1 4.05375 -14.86375 14.86375 0 0 0
-1956 1 1.35125 -12.16125 14.86375 0 0 0
-1957 1 6.75625 -14.86375 12.16125 0 0 0
-1958 1 9.45875 -12.16125 12.16125 0 0 0
-1959 1 9.45875 -14.86375 14.86375 0 0 0
-1960 1 6.75625 -12.16125 14.86375 0 0 0
-1961 1 12.16125 -14.86375 12.16125 0 0 0
-1962 1 14.86375 -12.16125 12.16125 0 0 0
-1963 1 14.86375 -14.86375 14.86375 0 0 0
-1964 1 12.16125 -12.16125 14.86375 0 0 0
-1965 1 17.56625 -14.86375 12.16125 0 0 0
-1966 1 20.26875 -12.16125 12.16125 0 0 0
-1967 1 20.26875 -14.86375 14.86375 0 0 0
-1968 1 17.56625 -12.16125 14.86375 0 0 0
-1969 1 22.97125 -14.86375 12.16125 0 0 0
-1970 1 25.67375 -12.16125 12.16125 0 0 0
-1971 1 25.67375 -14.86375 14.86375 0 0 0
-1972 1 22.97125 -12.16125 14.86375 0 0 0
-1973 1 28.37625 -14.86375 12.16125 0 0 0
-1974 1 31.07875 -12.16125 12.16125 0 0 0
-1975 1 31.07875 -14.86375 14.86375 0 0 0
-1976 1 28.37625 -12.16125 14.86375 0 0 0
-1977 1 33.78125 -14.86375 12.16125 0 0 0
-1978 1 36.48375 -12.16125 12.16125 0 0 0
-1979 1 36.48375 -14.86375 14.86375 0 0 0
-1980 1 33.78125 -12.16125 14.86375 0 0 0
-1981 1 39.18625 -14.86375 12.16125 0 0 0
-1982 1 41.88875 -12.16125 12.16125 0 0 0
-1983 1 41.88875 -14.86375 14.86375 0 0 0
-1984 1 39.18625 -12.16125 14.86375 0 0 0
-1985 1 -41.88875 -9.45875 12.16125 0 0 0
-1986 1 -39.18625 -6.75625 12.16125 0 0 0
-1987 1 -39.18625 -9.45875 14.86375 0 0 0
-1988 1 -41.88875 -6.75625 14.86375 0 0 0
-1989 1 -36.48375 -9.45875 12.16125 0 0 0
-1990 1 -33.78125 -6.75625 12.16125 0 0 0
-1991 1 -33.78125 -9.45875 14.86375 0 0 0
-1992 1 -36.48375 -6.75625 14.86375 0 0 0
-1993 1 -31.07875 -9.45875 12.16125 0 0 0
-1994 1 -28.37625 -6.75625 12.16125 0 0 0
-1995 1 -28.37625 -9.45875 14.86375 0 0 0
-1996 1 -31.07875 -6.75625 14.86375 0 0 0
-1997 1 -25.67375 -9.45875 12.16125 0 0 0
-1998 1 -22.97125 -6.75625 12.16125 0 0 0
-1999 1 -22.97125 -9.45875 14.86375 0 0 0
-2000 1 -25.67375 -6.75625 14.86375 0 0 0
-2001 1 -20.26875 -9.45875 12.16125 0 0 0
-2002 1 -17.56625 -6.75625 12.16125 0 0 0
-2003 1 -17.56625 -9.45875 14.86375 0 0 0
-2004 1 -20.26875 -6.75625 14.86375 0 0 0
-2005 1 -14.86375 -9.45875 12.16125 0 0 0
-2006 1 -12.16125 -6.75625 12.16125 0 0 0
-2007 1 -12.16125 -9.45875 14.86375 0 0 0
-2008 1 -14.86375 -6.75625 14.86375 0 0 0
-2009 1 -9.45875 -9.45875 12.16125 0 0 0
-2010 1 -6.75625 -6.75625 12.16125 0 0 0
-2011 1 -6.75625 -9.45875 14.86375 0 0 0
-2012 1 -9.45875 -6.75625 14.86375 0 0 0
-2013 1 -4.05375 -9.45875 12.16125 0 0 0
-2014 1 -1.35125 -6.75625 12.16125 0 0 0
-2015 1 -1.35125 -9.45875 14.86375 0 0 0
-2016 1 -4.05375 -6.75625 14.86375 0 0 0
-2017 1 1.35125 -9.45875 12.16125 0 0 0
-2018 1 4.05375 -6.75625 12.16125 0 0 0
-2019 1 4.05375 -9.45875 14.86375 0 0 0
-2020 1 1.35125 -6.75625 14.86375 0 0 0
-2021 1 6.75625 -9.45875 12.16125 0 0 0
-2022 1 9.45875 -6.75625 12.16125 0 0 0
-2023 1 9.45875 -9.45875 14.86375 0 0 0
-2024 1 6.75625 -6.75625 14.86375 0 0 0
-2025 1 12.16125 -9.45875 12.16125 0 0 0
-2026 1 14.86375 -6.75625 12.16125 0 0 0
-2027 1 14.86375 -9.45875 14.86375 0 0 0
-2028 1 12.16125 -6.75625 14.86375 0 0 0
-2029 1 17.56625 -9.45875 12.16125 0 0 0
-2030 1 20.26875 -6.75625 12.16125 0 0 0
-2031 1 20.26875 -9.45875 14.86375 0 0 0
-2032 1 17.56625 -6.75625 14.86375 0 0 0
-2033 1 22.97125 -9.45875 12.16125 0 0 0
-2034 1 25.67375 -6.75625 12.16125 0 0 0
-2035 1 25.67375 -9.45875 14.86375 0 0 0
-2036 1 22.97125 -6.75625 14.86375 0 0 0
-2037 1 28.37625 -9.45875 12.16125 0 0 0
-2038 1 31.07875 -6.75625 12.16125 0 0 0
-2039 1 31.07875 -9.45875 14.86375 0 0 0
-2040 1 28.37625 -6.75625 14.86375 0 0 0
-2041 1 33.78125 -9.45875 12.16125 0 0 0
-2042 1 36.48375 -6.75625 12.16125 0 0 0
-2043 1 36.48375 -9.45875 14.86375 0 0 0
-2044 1 33.78125 -6.75625 14.86375 0 0 0
-2045 1 39.18625 -9.45875 12.16125 0 0 0
-2046 1 41.88875 -6.75625 12.16125 0 0 0
-2047 1 41.88875 -9.45875 14.86375 0 0 0
-2048 1 39.18625 -6.75625 14.86375 0 0 0
-2049 1 -41.88875 -4.05375 12.16125 0 0 0
-2050 1 -39.18625 -1.35125 12.16125 0 0 0
-2051 1 -39.18625 -4.05375 14.86375 0 0 0
-2052 1 -41.88875 -1.35125 14.86375 0 0 0
-2053 1 -36.48375 -4.05375 12.16125 0 0 0
-2054 1 -33.78125 -1.35125 12.16125 0 0 0
-2055 1 -33.78125 -4.05375 14.86375 0 0 0
-2056 1 -36.48375 -1.35125 14.86375 0 0 0
-2057 1 -31.07875 -4.05375 12.16125 0 0 0
-2058 1 -28.37625 -1.35125 12.16125 0 0 0
-2059 1 -28.37625 -4.05375 14.86375 0 0 0
-2060 1 -31.07875 -1.35125 14.86375 0 0 0
-2061 1 -25.67375 -4.05375 12.16125 0 0 0
-2062 1 -22.97125 -1.35125 12.16125 0 0 0
-2063 1 -22.97125 -4.05375 14.86375 0 0 0
-2064 1 -25.67375 -1.35125 14.86375 0 0 0
-2065 1 -20.26875 -4.05375 12.16125 0 0 0
-2066 1 -17.56625 -1.35125 12.16125 0 0 0
-2067 1 -17.56625 -4.05375 14.86375 0 0 0
-2068 1 -20.26875 -1.35125 14.86375 0 0 0
-2069 1 -14.86375 -4.05375 12.16125 0 0 0
-2070 1 -12.16125 -1.35125 12.16125 0 0 0
-2071 1 -12.16125 -4.05375 14.86375 0 0 0
-2072 1 -14.86375 -1.35125 14.86375 0 0 0
-2073 1 -9.45875 -4.05375 12.16125 0 0 0
-2074 1 -6.75625 -1.35125 12.16125 0 0 0
-2075 1 -6.75625 -4.05375 14.86375 0 0 0
-2076 1 -9.45875 -1.35125 14.86375 0 0 0
-2077 1 -4.05375 -4.05375 12.16125 0 0 0
-2078 1 -1.35125 -1.35125 12.16125 0 0 0
-2079 1 -1.35125 -4.05375 14.86375 0 0 0
-2080 1 -4.05375 -1.35125 14.86375 0 0 0
-2081 1 1.35125 -4.05375 12.16125 0 0 0
-2082 1 4.05375 -1.35125 12.16125 0 0 0
-2083 1 4.05375 -4.05375 14.86375 0 0 0
-2084 1 1.35125 -1.35125 14.86375 0 0 0
-2085 1 6.75625 -4.05375 12.16125 0 0 0
-2086 1 9.45875 -1.35125 12.16125 0 0 0
-2087 1 9.45875 -4.05375 14.86375 0 0 0
-2088 1 6.75625 -1.35125 14.86375 0 0 0
-2089 1 12.16125 -4.05375 12.16125 0 0 0
-2090 1 14.86375 -1.35125 12.16125 0 0 0
-2091 1 14.86375 -4.05375 14.86375 0 0 0
-2092 1 12.16125 -1.35125 14.86375 0 0 0
-2093 1 17.56625 -4.05375 12.16125 0 0 0
-2094 1 20.26875 -1.35125 12.16125 0 0 0
-2095 1 20.26875 -4.05375 14.86375 0 0 0
-2096 1 17.56625 -1.35125 14.86375 0 0 0
-2097 1 22.97125 -4.05375 12.16125 0 0 0
-2098 1 25.67375 -1.35125 12.16125 0 0 0
-2099 1 25.67375 -4.05375 14.86375 0 0 0
-2100 1 22.97125 -1.35125 14.86375 0 0 0
-2101 1 28.37625 -4.05375 12.16125 0 0 0
-2102 1 31.07875 -1.35125 12.16125 0 0 0
-2103 1 31.07875 -4.05375 14.86375 0 0 0
-2104 1 28.37625 -1.35125 14.86375 0 0 0
-2105 1 33.78125 -4.05375 12.16125 0 0 0
-2106 1 36.48375 -1.35125 12.16125 0 0 0
-2107 1 36.48375 -4.05375 14.86375 0 0 0
-2108 1 33.78125 -1.35125 14.86375 0 0 0
-2109 1 39.18625 -4.05375 12.16125 0 0 0
-2110 1 41.88875 -1.35125 12.16125 0 0 0
-2111 1 41.88875 -4.05375 14.86375 0 0 0
-2112 1 39.18625 -1.35125 14.86375 0 0 0
-2113 1 -41.88875 1.35125 12.16125 0 0 0
-2114 1 -39.18625 4.05375 12.16125 0 0 0
-2115 1 -39.18625 1.35125 14.86375 0 0 0
-2116 1 -41.88875 4.05375 14.86375 0 0 0
-2117 1 -36.48375 1.35125 12.16125 0 0 0
-2118 1 -33.78125 4.05375 12.16125 0 0 0
-2119 1 -33.78125 1.35125 14.86375 0 0 0
-2120 1 -36.48375 4.05375 14.86375 0 0 0
-2121 1 -31.07875 1.35125 12.16125 0 0 0
-2122 1 -28.37625 4.05375 12.16125 0 0 0
-2123 1 -28.37625 1.35125 14.86375 0 0 0
-2124 1 -31.07875 4.05375 14.86375 0 0 0
-2125 1 -25.67375 1.35125 12.16125 0 0 0
-2126 1 -22.97125 4.05375 12.16125 0 0 0
-2127 1 -22.97125 1.35125 14.86375 0 0 0
-2128 1 -25.67375 4.05375 14.86375 0 0 0
-2129 1 -20.26875 1.35125 12.16125 0 0 0
-2130 1 -17.56625 4.05375 12.16125 0 0 0
-2131 1 -17.56625 1.35125 14.86375 0 0 0
-2132 1 -20.26875 4.05375 14.86375 0 0 0
-2133 1 -14.86375 1.35125 12.16125 0 0 0
-2134 1 -12.16125 4.05375 12.16125 0 0 0
-2135 1 -12.16125 1.35125 14.86375 0 0 0
-2136 1 -14.86375 4.05375 14.86375 0 0 0
-2137 1 -9.45875 1.35125 12.16125 0 0 0
-2138 1 -6.75625 4.05375 12.16125 0 0 0
-2139 1 -6.75625 1.35125 14.86375 0 0 0
-2140 1 -9.45875 4.05375 14.86375 0 0 0
-2141 1 -4.05375 1.35125 12.16125 0 0 0
-2142 1 -1.35125 4.05375 12.16125 0 0 0
-2143 1 -1.35125 1.35125 14.86375 0 0 0
-2144 1 -4.05375 4.05375 14.86375 0 0 0
-2145 1 1.35125 1.35125 12.16125 0 0 0
-2146 1 4.05375 4.05375 12.16125 0 0 0
-2147 1 4.05375 1.35125 14.86375 0 0 0
-2148 1 1.35125 4.05375 14.86375 0 0 0
-2149 1 6.75625 1.35125 12.16125 0 0 0
-2150 1 9.45875 4.05375 12.16125 0 0 0
-2151 1 9.45875 1.35125 14.86375 0 0 0
-2152 1 6.75625 4.05375 14.86375 0 0 0
-2153 1 12.16125 1.35125 12.16125 0 0 0
-2154 1 14.86375 4.05375 12.16125 0 0 0
-2155 1 14.86375 1.35125 14.86375 0 0 0
-2156 1 12.16125 4.05375 14.86375 0 0 0
-2157 1 17.56625 1.35125 12.16125 0 0 0
-2158 1 20.26875 4.05375 12.16125 0 0 0
-2159 1 20.26875 1.35125 14.86375 0 0 0
-2160 1 17.56625 4.05375 14.86375 0 0 0
-2161 1 22.97125 1.35125 12.16125 0 0 0
-2162 1 25.67375 4.05375 12.16125 0 0 0
-2163 1 25.67375 1.35125 14.86375 0 0 0
-2164 1 22.97125 4.05375 14.86375 0 0 0
-2165 1 28.37625 1.35125 12.16125 0 0 0
-2166 1 31.07875 4.05375 12.16125 0 0 0
-2167 1 31.07875 1.35125 14.86375 0 0 0
-2168 1 28.37625 4.05375 14.86375 0 0 0
-2169 1 33.78125 1.35125 12.16125 0 0 0
-2170 1 36.48375 4.05375 12.16125 0 0 0
-2171 1 36.48375 1.35125 14.86375 0 0 0
-2172 1 33.78125 4.05375 14.86375 0 0 0
-2173 1 39.18625 1.35125 12.16125 0 0 0
-2174 1 41.88875 4.05375 12.16125 0 0 0
-2175 1 41.88875 1.35125 14.86375 0 0 0
-2176 1 39.18625 4.05375 14.86375 0 0 0
-2177 1 -41.88875 6.75625 12.16125 0 0 0
-2178 1 -39.18625 9.45875 12.16125 0 0 0
-2179 1 -39.18625 6.75625 14.86375 0 0 0
-2180 1 -41.88875 9.45875 14.86375 0 0 0
-2181 1 -36.48375 6.75625 12.16125 0 0 0
-2182 1 -33.78125 9.45875 12.16125 0 0 0
-2183 1 -33.78125 6.75625 14.86375 0 0 0
-2184 1 -36.48375 9.45875 14.86375 0 0 0
-2185 1 -31.07875 6.75625 12.16125 0 0 0
-2186 1 -28.37625 9.45875 12.16125 0 0 0
-2187 1 -28.37625 6.75625 14.86375 0 0 0
-2188 1 -31.07875 9.45875 14.86375 0 0 0
-2189 1 -25.67375 6.75625 12.16125 0 0 0
-2190 1 -22.97125 9.45875 12.16125 0 0 0
-2191 1 -22.97125 6.75625 14.86375 0 0 0
-2192 1 -25.67375 9.45875 14.86375 0 0 0
-2193 1 -20.26875 6.75625 12.16125 0 0 0
-2194 1 -17.56625 9.45875 12.16125 0 0 0
-2195 1 -17.56625 6.75625 14.86375 0 0 0
-2196 1 -20.26875 9.45875 14.86375 0 0 0
-2197 1 -14.86375 6.75625 12.16125 0 0 0
-2198 1 -12.16125 9.45875 12.16125 0 0 0
-2199 1 -12.16125 6.75625 14.86375 0 0 0
-2200 1 -14.86375 9.45875 14.86375 0 0 0
-2201 1 -9.45875 6.75625 12.16125 0 0 0
-2202 1 -6.75625 9.45875 12.16125 0 0 0
-2203 1 -6.75625 6.75625 14.86375 0 0 0
-2204 1 -9.45875 9.45875 14.86375 0 0 0
-2205 1 -4.05375 6.75625 12.16125 0 0 0
-2206 1 -1.35125 9.45875 12.16125 0 0 0
-2207 1 -1.35125 6.75625 14.86375 0 0 0
-2208 1 -4.05375 9.45875 14.86375 0 0 0
-2209 1 1.35125 6.75625 12.16125 0 0 0
-2210 1 4.05375 9.45875 12.16125 0 0 0
-2211 1 4.05375 6.75625 14.86375 0 0 0
-2212 1 1.35125 9.45875 14.86375 0 0 0
-2213 1 6.75625 6.75625 12.16125 0 0 0
-2214 1 9.45875 9.45875 12.16125 0 0 0
-2215 1 9.45875 6.75625 14.86375 0 0 0
-2216 1 6.75625 9.45875 14.86375 0 0 0
-2217 1 12.16125 6.75625 12.16125 0 0 0
-2218 1 14.86375 9.45875 12.16125 0 0 0
-2219 1 14.86375 6.75625 14.86375 0 0 0
-2220 1 12.16125 9.45875 14.86375 0 0 0
-2221 1 17.56625 6.75625 12.16125 0 0 0
-2222 1 20.26875 9.45875 12.16125 0 0 0
-2223 1 20.26875 6.75625 14.86375 0 0 0
-2224 1 17.56625 9.45875 14.86375 0 0 0
-2225 1 22.97125 6.75625 12.16125 0 0 0
-2226 1 25.67375 9.45875 12.16125 0 0 0
-2227 1 25.67375 6.75625 14.86375 0 0 0
-2228 1 22.97125 9.45875 14.86375 0 0 0
-2229 1 28.37625 6.75625 12.16125 0 0 0
-2230 1 31.07875 9.45875 12.16125 0 0 0
-2231 1 31.07875 6.75625 14.86375 0 0 0
-2232 1 28.37625 9.45875 14.86375 0 0 0
-2233 1 33.78125 6.75625 12.16125 0 0 0
-2234 1 36.48375 9.45875 12.16125 0 0 0
-2235 1 36.48375 6.75625 14.86375 0 0 0
-2236 1 33.78125 9.45875 14.86375 0 0 0
-2237 1 39.18625 6.75625 12.16125 0 0 0
-2238 1 41.88875 9.45875 12.16125 0 0 0
-2239 1 41.88875 6.75625 14.86375 0 0 0
-2240 1 39.18625 9.45875 14.86375 0 0 0
-2241 1 -41.88875 12.16125 12.16125 0 0 0
-2242 1 -39.18625 14.86375 12.16125 0 0 0
-2243 1 -39.18625 12.16125 14.86375 0 0 0
-2244 1 -41.88875 14.86375 14.86375 0 0 0
-2245 1 -36.48375 12.16125 12.16125 0 0 0
-2246 1 -33.78125 14.86375 12.16125 0 0 0
-2247 1 -33.78125 12.16125 14.86375 0 0 0
-2248 1 -36.48375 14.86375 14.86375 0 0 0
-2249 1 -31.07875 12.16125 12.16125 0 0 0
-2250 1 -28.37625 14.86375 12.16125 0 0 0
-2251 1 -28.37625 12.16125 14.86375 0 0 0
-2252 1 -31.07875 14.86375 14.86375 0 0 0
-2253 1 -25.67375 12.16125 12.16125 0 0 0
-2254 1 -22.97125 14.86375 12.16125 0 0 0
-2255 1 -22.97125 12.16125 14.86375 0 0 0
-2256 1 -25.67375 14.86375 14.86375 0 0 0
-2257 1 -20.26875 12.16125 12.16125 0 0 0
-2258 1 -17.56625 14.86375 12.16125 0 0 0
-2259 1 -17.56625 12.16125 14.86375 0 0 0
-2260 1 -20.26875 14.86375 14.86375 0 0 0
-2261 1 -14.86375 12.16125 12.16125 0 0 0
-2262 1 -12.16125 14.86375 12.16125 0 0 0
-2263 1 -12.16125 12.16125 14.86375 0 0 0
-2264 1 -14.86375 14.86375 14.86375 0 0 0
-2265 1 -9.45875 12.16125 12.16125 0 0 0
-2266 1 -6.75625 14.86375 12.16125 0 0 0
-2267 1 -6.75625 12.16125 14.86375 0 0 0
-2268 1 -9.45875 14.86375 14.86375 0 0 0
-2269 1 -4.05375 12.16125 12.16125 0 0 0
-2270 1 -1.35125 14.86375 12.16125 0 0 0
-2271 1 -1.35125 12.16125 14.86375 0 0 0
-2272 1 -4.05375 14.86375 14.86375 0 0 0
-2273 1 1.35125 12.16125 12.16125 0 0 0
-2274 1 4.05375 14.86375 12.16125 0 0 0
-2275 1 4.05375 12.16125 14.86375 0 0 0
-2276 1 1.35125 14.86375 14.86375 0 0 0
-2277 1 6.75625 12.16125 12.16125 0 0 0
-2278 1 9.45875 14.86375 12.16125 0 0 0
-2279 1 9.45875 12.16125 14.86375 0 0 0
-2280 1 6.75625 14.86375 14.86375 0 0 0
-2281 1 12.16125 12.16125 12.16125 0 0 0
-2282 1 14.86375 14.86375 12.16125 0 0 0
-2283 1 14.86375 12.16125 14.86375 0 0 0
-2284 1 12.16125 14.86375 14.86375 0 0 0
-2285 1 17.56625 12.16125 12.16125 0 0 0
-2286 1 20.26875 14.86375 12.16125 0 0 0
-2287 1 20.26875 12.16125 14.86375 0 0 0
-2288 1 17.56625 14.86375 14.86375 0 0 0
-2289 1 22.97125 12.16125 12.16125 0 0 0
-2290 1 25.67375 14.86375 12.16125 0 0 0
-2291 1 25.67375 12.16125 14.86375 0 0 0
-2292 1 22.97125 14.86375 14.86375 0 0 0
-2293 1 28.37625 12.16125 12.16125 0 0 0
-2294 1 31.07875 14.86375 12.16125 0 0 0
-2295 1 31.07875 12.16125 14.86375 0 0 0
-2296 1 28.37625 14.86375 14.86375 0 0 0
-2297 1 33.78125 12.16125 12.16125 0 0 0
-2298 1 36.48375 14.86375 12.16125 0 0 0
-2299 1 36.48375 12.16125 14.86375 0 0 0
-2300 1 33.78125 14.86375 14.86375 0 0 0
-2301 1 39.18625 12.16125 12.16125 0 0 0
-2302 1 41.88875 14.86375 12.16125 0 0 0
-2303 1 41.88875 12.16125 14.86375 0 0 0
-2304 1 39.18625 14.86375 14.86375 0 0 0
-
-Velocities
-
-1 0 0 0
-2 0 0 0
-3 0 0 0
-4 0 0 0
-5 0 0 0
-6 0 0 0
-7 0 0 0
-8 0 0 0
-9 0.000976353311893 -0.000164188696678 -0.00105567970909
-10 -0.000804278445062 0.00122242481762 0.00145135717481
-11 0.000536486144357 -0.00107963761985 0.00125004350401
-12 0.000539539371085 -0.000393727486711 -0.00156602804185
-13 -0.00105243975103 0.000994543410461 0.000317452591795
-14 -0.00122639373914 0.00121339320378 0.00154603778769
-15 -0.000658980540239 0.000362662360235 -0.00013376596272
-16 0.000901749385038 -0.000948018253047 0.00149296864683
-17 -0.00147455504511 0.00098551179662 0.000412133204679
-18 -9.08323346639e-05 -0.000792229156481 -0.000245184378827
-19 0.000476580864235 0.00152139446737 0.00123936633816
-20 0.000479634090963 -0.000957049866887 -0.00157670520769
-21 -0.00111234503115 0.000431221030284 0.000306775425952
-22 -0.00128629901926 0.000650070823603 0.00153536062185
-23 -0.000718885820361 -0.000200660019941 -0.000144443128563
-24 0.000841844104916 -0.00151134063322 0.00148229148098
-25 -0.00128935224599 -3.58393095349e-05 0.0011870777003
-26 -0.000150737614786 -0.00135555153666 -0.00025586154467
-27 0.000416675584113 0.000958072087197 0.00122868917232
-28 0.000664836890083 0.00118595349436 -0.000801760712069
-29 0.00145288692734 -4.48709233757e-05 0.00128175831318
-30 -0.00134620429938 8.67484434271e-05 0.001524683456
-31 -5.43970996215e-06 0.000949040473356 0.0013233697852
-32 0.000242721596008 0.00117692188052 -0.000707080099186
-33 -0.00134925752611 -0.000599161689711 0.00117640053446
-34 -0.000210642894908 0.00124548055057 -0.000266538710513
-35 0.000356770303991 0.000394749707021 0.00121801200648
-36 0.00137828300048 -0.000828700479745 0.000666052201697
-37 0.00139298164721 -0.000608193303552 0.00127108114734
-38 -0.0014061095795 -0.000476573936749 0.00151400629016
-39 -6.53449900843e-05 0.00038571809318 0.00131269261936
-40 0.000182816315886 0.00061359950034 -0.000717757265029
-41 -0.000635811415711 0.000550538803586 -0.000520141019177
-42 -0.00158311679434 -0.000943634276568 -0.000770045902893
-43 -0.000242352204917 -8.13422466395e-05 -0.000971359573693
-44 0.00131837772036 -0.00139202285992 0.000655375035854
-45 0.00133307636709 -0.00117151568373 0.0012604039815
-46 -0.000447555389863 0.00021509783057 0.00060308639799
-47 0.000119857809036 -0.000635633012975 -0.00107671735242
-48 0.000122911035764 5.02771201633e-05 -0.000728434430872
-49 -0.000695716695833 -1.278357659e-05 -0.000530818185021
-50 0.00152133239294 -0.00150695665674 -0.000780723068737
-51 -0.000302257485039 -0.000644664626816 -0.000982036739536
-52 0.00125847244024 0.0012090092273 0.000644697870011
-53 0.00127317108697 0.00142951640349 0.00124972681565
-54 -0.000507460669985 -0.000348224549606 0.000592409232146
-55 0.000833303919434 0.000514067480323 0.000391095561347
-56 6.30057556415e-05 -0.000513045260013 -0.000739111596716
-57 0 0 0
-58 0 0 0
-59 0 0 0
-60 0 0 0
-61 0 0 0
-62 0 0 0
-63 0 0 0
-64 0 0 0
-65 0 0 0
-66 0 0 0
-67 0 0 0
-68 0 0 0
-69 0 0 0
-70 0 0 0
-71 0 0 0
-72 0 0 0
-73 0.000435289755521 0.000535358664422 0.000659971907596
-74 0.00120374159173 -0.000989566128058 -0.00064418383813
-75 -4.57741201458e-06 -0.00038009025875 -0.000198659346709
-76 -0.000616795059524 0.00055863603501 -0.000497214587382
-77 -0.0015935033074 -0.00147026369584 -0.00113125025892
-78 0.000781626297653 -0.000998597741899 -0.000549503225247
-79 -0.00120004409661 0.00106220972133 -0.00158246881344
-80 -0.000254585045571 4.34526867402e-06 -0.000602572366109
-81 0.00114873586592 -0.00147929530968 -0.00103656964604
-82 -0.00124716676527 0.00016013436524 0.000823629075636
-83 -6.44826921367e-05 -0.000943412638926 -0.000209336512553
-84 -0.000676700339646 -4.68634516678e-06 -0.000507891753226
-85 0.00151094587987 0.00113076839138 -0.00114192742476
-86 0.00072172101753 -0.00156192012207 -0.00056018039109
-87 -0.000486597986212 -0.000952444252767 -0.000114655899669
-88 -0.000314490325693 -0.000558977111502 -0.000613249531953
-89 0.00133393866504 0.000663708051565 -0.000261625150417
-90 -0.00130707204539 -0.000403188014937 0.000812951909793
-91 -0.000124387972259 -0.0015067350191 -0.000220013678396
-92 -0.000491497540526 -0.00102603745132 0.000267052742394
-93 0.000911823370964 0.000654676437724 -0.000166944537533
-94 0.000661815737408 0.00103911196515 -0.000570857556933
-95 -0.000546503266334 -0.00151576663294 -0.000125333065512
-96 -0.000913612834601 -0.00103506906516 0.000361733355277
-97 0.00127403338492 0.000100385671389 -0.00027230231626
-98 -0.00136697732552 -0.000966510395113 0.00080227474395
-99 -0.000184293252381 0.00109429706812 -0.000230690844239
-100 0.000221948569873 0.000123663041976 -0.00142948881124
-101 0.000851918090842 9.13540575478e-05 -0.000177621703377
-102 0.000601910457286 0.000475789584971 -0.000581534722777
-103 -0.000606408546456 0.00108526545428 -0.000136010231356
-104 -0.000973518114723 0.00156596302206 0.000351056189434
-105 -0.00117687497208 0.00125008616469 0.00119551059751
-106 0.000424903242453 8.72924515214e-06 0.00029876755157
-107 -0.000783415761289 0.00061820511446 0.000744292042991
-108 0.000162043289751 -0.0004396593382 -0.00144016597708
-109 0.00079201281072 -0.000471968322629 -0.00018829886922
-110 0.00156046464693 0.00116746135229 -0.00149245461495
-111 -0.000421205747336 6.39143481247e-05 0.000638934264264
-112 -0.00103342339485 0.00100264064188 0.000340379023591
-113 -0.00123678025221 0.00068676378451 0.00118483343166
-114 0.000364997962331 -0.000554593135024 0.000288090385726
-115 -0.000843321041411 5.4882734284e-05 0.000733614877147
-116 0.000102138009629 -0.00100298171838 -0.00145084314293
-117 0.000732107530598 -0.0010352907028 -0.000198976035063
-118 0.0015005593668 0.000604138972114 -0.00150313178079
-119 0.000292240363063 0.00121361484142 -0.00105760728937
-120 -0.00109332867497 0.000439318261708 0.000329701857747
-121 0 0 0
-122 0 0 0
-123 0 0 0
-124 0 0 0
-125 0 0 0
-126 0 0 0
-127 0 0 0
-128 0 0 0
-129 0 0 0
-130 0 0 0
-131 0 0 0
-132 0 0 0
-133 0 0 0
-134 0 0 0
-135 0 0 0
-136 0 0 0
-137 0.000591523944219 -5.08398342986e-05 -0.000942739078803
-138 0.000662678035356 -0.000290018766958 0.00107146777855
-139 0.000151656776683 -0.00096628875747 0.00136298413429
-140 -0.0011578586159 0.00125818339611 0.0012184370293
-141 -0.00143726911871 0.00110789227284 0.00043039322208
-142 0.000240562741281 -0.000299050380799 0.00116614839144
-143 -0.00104380990791 0.000476011222614 -2.08253324359e-05
-144 -0.000795648601943 0.000703892629774 0.00111307925057
-145 0.000531618664096 -0.000614162214475 -0.000953416244647
-146 0.00137612414575 0.00085968172634 -0.000625073775079
-147 9.1751496561e-05 -0.00152961113765 0.00135230696845
-148 -0.00121776389602 0.000694861015933 0.00120775986346
-149 -0.00149717439883 0.000544569892663 0.000419716056236
-150 0.000180657461158 -0.000862372760975 0.00115547122559
-151 -0.00110371518803 -8.73111575624e-05 -3.15024982792e-05
-152 -8.22024915442e-05 -0.00131076134433 -0.000583462303058
-153 0.00149017285374 7.75095528442e-05 0.00130001833058
-154 0.00131621886563 0.000296359346163 -0.000635750940922
-155 3.18462164388e-05 0.00107142094958 0.0013416298026
-156 -0.000259209706377 0.00138653278325 0.000296839971288
-157 0.000294706169141 0.00151980953293 -8.37911361437e-05
-158 0.000120752181036 -0.00142569514115 0.00114479405975
-159 -0.00116362046816 -0.000650633537739 -4.21796641226e-05
-160 -0.00145467639097 -0.000335521704063 -0.00108696949544
-161 0.00143026757362 -0.000485812827332 0.00128934116474
-162 0.00125631358551 -0.000266963034013 -0.000646428106766
-163 -2.80590636833e-05 0.0005080985694 0.00133095263676
-164 -0.000319114986499 0.000823210403076 0.000286162805445
-165 0.00100815227954 -0.000494844441173 0.00138402177762
-166 6.08469009141e-05 0.00117533694607 0.00113411689391
-167 -0.00122352574828 -0.00121395591792 -5.2856829966e-05
-168 -0.0015145816711 -0.000898844084239 -0.00109764666128
-169 0.00137036229349 -0.00104913520751 0.0012786639989
-170 -0.000116160313919 0.000708276606252 -0.00114993529915
-171 -0.000627181572591 3.20066157395e-05 -0.000858418943409
-172 -0.000379020266621 0.000259888022899 0.000275485639602
-173 0.000948246999418 -0.00105816682135 0.00137334461178
-174 0.00101940109056 -0.00129734575401 0.000223197001737
-175 -0.000264971558638 -0.000522284150596 -0.000963776722136
-176 -0.00157448695122 -0.00146216646442 -0.00110832382712
-177 0.00131045701337 0.00155189687971 0.00126798683305
-178 0.00059728579648 -0.00130637736785 0.000317877614621
-179 -0.000687086852714 -0.000531315764437 -0.000869096109252
-180 -0.000438925546743 -0.000303434357277 0.000264808473758
-181 0.000888341719296 0.00154286526587 0.00136266744594
-182 0.000959495810433 0.00130368633321 0.000212519835894
-183 -0.00032487683876 -0.00108560653077 -0.000974453887979
-184 0.00152996223606 0.00113886562281 -0.00111900099297
-185 0 0 0
-186 0 0 0
-187 0 0 0
-188 0 0 0
-189 0 0 0
-190 0 0 0
-191 0 0 0
-192 0 0 0
-193 0 0 0
-194 0 0 0
-195 0 0 0
-196 0 0 0
-197 0 0 0
-198 0 0 0
-199 0 0 0
-200 0 0 0
-201 5.04603878466e-05 0.000648707526801 0.00077291253788
-202 0.000818912224053 -0.000876217265679 -0.000531243207846
-203 -0.000389406779689 -0.000266741396371 -8.57187164249e-05
-204 0.00138937864968 -0.00104103797609 0.00130159043069
-205 0.00118602179232 -0.00135691483346 -0.00101830962864
-206 0.000396796929978 -0.00088524887952 -0.000436562594962
-207 -0.00158487346428 0.00117555858371 -0.00146952818315
-208 -0.000639414413245 0.000117694131053 -0.000489631735825
-209 -9.4448922756e-06 8.53851466249e-05 0.000762235372037
-210 0.000759006943931 -0.00143953964586 -0.000541920373689
-211 -0.000449312059811 -0.000830063776547 -9.63958822683e-05
-212 -0.00106152970732 0.000108662517212 -0.000394951122941
-213 0.0011261165122 0.00124411725376 -0.00102898679448
-214 0.000336891649856 -0.0014485712597 -0.000447239760806
-215 0.00151957572299 0.000612236203537 -0.00148020534899
-216 -0.000699319693367 -0.000445628249123 -0.000500308901668
-217 0.000949109297365 0.000777056913944 -0.000148684520133
-218 0.000699101663809 0.00116149244137 -0.000552597539533
-219 -0.000509217339933 -0.00139338615672 -0.000107073048112
-220 -0.0008763269082 -0.000912688588943 0.000379993372678
-221 0.00052699400329 0.000768025300103 -5.40039072491e-05
-222 0.000276986369734 0.00115246082753 -0.000457916926649
-223 0.00145967044287 4.8913823361e-05 -0.00149088251484
-224 -0.00129844220228 -0.000921720202783 0.000474673985562
-225 0.000889204017243 0.000213734533768 -0.000159361685976
-226 0.00141254777421 -0.000853161532734 0.000915215374234
-227 -0.000569122620055 0.0012076459305 -0.000117750213955
-228 -0.000936232188322 -0.00147601096912 0.000369316206835
-229 0.000467088723168 0.000204702919927 -6.46810730925e-05
-230 0.000217081089612 0.00058913844735 -0.000468594092493
-231 -0.000991237914131 0.00119861431666 -2.30696010714e-05
-232 -0.0013583474824 -0.00148504258296 0.000463996819718
-233 0.000829298737121 -0.000349587846409 -0.000170038851819
-234 4.0073874779e-05 0.000122078107531 0.000411708181854
-235 -0.00116824512896 0.000731553976839 0.000857232673275
-236 -0.000222786077924 -0.000326310475821 -0.0013272253468
-237 0.000407183443046 -0.00035861946025 -7.53582389359e-05
-238 0.00117563527925 0.00128081021467 -0.00137951398466
-239 -0.00080603511501 0.000177263210504 0.000751874894548
-240 -0.00141825276252 0.00111598950426 0.000453319653875
-241 0.000769393456999 -0.000912910226585 -0.000180716017663
-242 -1.98314053431e-05 -0.000441244272645 0.00040103101601
-243 -0.00122815040909 0.000168231596663 0.000846555507432
-244 -0.000282691358046 -0.000889632855998 -0.00133790251264
-245 0.000347278162924 -0.000921941840426 -8.60354047792e-05
-246 0.00111572999913 0.000717487834493 -0.00139019115051
-247 -0.000865940395132 -0.000386059169673 0.000741197728705
-248 -0.00147815804264 0.000552667124087 0.000442642488032
-249 0 0 0
-250 0 0 0
-251 0 0 0
-252 0 0 0
-253 0 0 0
-254 0 0 0
-255 0 0 0
-256 0 0 0
-257 0 0 0
-258 0 0 0
-259 0 0 0
-260 0 0 0
-261 0 0 0
-262 0 0 0
-263 0 0 0
-264 0 0 0
-265 -0.000490603168525 0.0013482548879 -0.000675790312835
-266 0.000277848667682 -0.000176669904579 0.00118440840884
-267 -0.000930470336061 0.000432805964729 -0.00153442156714
-268 0.000848315093308 -0.000341490614986 -0.000147112420024
-269 0.000644958235948 -0.00065736747236 0.000697341988048
-270 -0.000144266626394 -0.00018570151842 0.00127908902172
-271 0.00103841744674 -0.00128924852259 0.000246123433532
-272 -0.00118047796962 0.000817241492153 0.00122601988086
-273 -0.000550508448648 0.000784932507725 -0.000686467478678
-274 0.000217943387559 -0.000739992284755 0.00117373124299
-275 -0.000990375616183 -0.000130516415447 -0.00154509873298
-276 0.00156176120371 0.000808209878312 0.00132070049374
-277 0.000585052955826 -0.00122068985254 0.000686664822205
-278 -0.000204171906516 -0.000749023898596 0.00126841185588
-279 0.00097851216662 0.00131178356464 0.000235446267689
-280 -0.00124038324974 0.000253919111976 0.00121534271502
-281 0.000408045740993 0.00147660427504 -0.00159738737085
-282 0.000931389497958 0.000409708208542 -0.000522810310638
-283 -0.00105028089631 -0.000693838795623 -0.00155577589883
-284 -0.00141739046457 -0.000213141227843 -0.00106870947804
-285 -1.40695530818e-05 0.0014675726612 -0.00150270675796
-286 -0.000264077186638 -0.00131234627877 0.00125773469003
-287 0.000918606886498 0.000748461184461 0.000224769101846
-288 0.00132484870875 -0.000222172841684 -0.000974028865154
-289 0.000348140460871 0.000913281894867 -0.00160806453669
-290 0.000871484217836 -0.000153614171634 -0.000533487476482
-291 -0.00111018617643 -0.0012571611758 -0.00156645306467
-292 -0.00147729574469 -0.000776463608019 -0.00107938664388
-293 -7.3974833204e-05 0.000904250281027 -0.00151338392381
-294 -0.00032398246676 0.00128868580845 0.00124705752419
-295 -0.0015323014705 -0.00126619278964 -0.00147177245179
-296 0.00126494342863 -0.00078549522186 -0.000984706030997
-297 0.000288235180749 0.000349959514691 0.00154561276486
-298 -0.000500989681593 0.000821625468631 -0.00103699466886
-299 0.00145504578206 0.00143110133794 -0.00059147017744
-300 -0.000763849634296 0.000373236885278 0.000388426269886
-301 -0.000133880113326 0.00034092790085 -0.00152406108965
-302 0.000634571722881 -0.00118399689163 0.000336137632021
-303 -0.00134709867138 0.000876810571604 -0.000696827956167
-304 0.00120503814851 -0.00134881760204 -0.00099538319684
-305 0.00100168129115 0.00149966000799 -0.000150928788768
-306 -0.000560894961715 0.000258303088455 -0.0010476718347
-307 0.00139514050194 0.000867778957763 -0.000602147343284
-308 -0.000823754914418 -0.000190085494898 0.000377749104042
-309 -0.000193785393448 -0.000222394479326 -0.00153473825549
-310 0.000574666442759 0.00141703519559 0.000325460466178
-311 -0.0014070039515 0.000313488191427 -0.000707505122011
-312 0.00114513286839 0.00125221448519 -0.00100606036268
-313 0 0 0
-314 0 0 0
-315 0 0 0
-316 0 0 0
-317 0 0 0
-318 0 0 0
-319 0 0 0
-320 0 0 0
-321 0 0 0
-322 0 0 0
-323 0 0 0
-324 0 0 0
-325 0 0 0
-326 0 0 0
-327 0 0 0
-328 0 0 0
-329 0.00151741686826 -0.000863736057777 0.000393023141628
-330 -0.00026321488869 0.000522877456521 -0.000264294441878
-331 0.00107754970073 0.00138516948645 -0.000465608112677
-332 0.00108060292746 -0.00109327484781 -0.00011732519113
-333 -0.00051137619466 0.000294996049361 -0.00139819902489
-334 -0.000685330182766 0.00051384584268 -0.000169613828994
-335 -0.000117916983867 -0.000336885000865 0.001314936888
-336 0.00144281294141 0.00151678885325 -0.000222682969857
-337 0.00145751158814 -0.00142705843795 0.000382345975785
-338 -0.000323120168813 -4.04449236555e-05 -0.000274971607721
-339 0.00101764442061 0.000821847106273 -0.000476285278521
-340 0.00102069764733 0.00150775723941 -0.000128002356973
-341 -0.000571281474783 -0.000268326330815 -0.00140887619073
-342 -0.000745235462888 -4.94765374963e-05 -0.000180290994838
-343 -0.000177822263989 -0.000900207381041 0.00130425972215
-344 0.00138290766129 0.000953466473076 -0.0002333601357
-345 -0.000748288689615 -0.000735386670635 -0.000528573916385
-346 0.000390325941586 0.00110925556964 0.00119284130605
-347 0.000957739140485 0.000258524726097 -0.000486962444364
-348 0.00120590044646 0.000486406133257 0.000646942138646
-349 -0.00117040398369 -0.000744418284475 -0.000433893303502
-350 -0.00080514074301 -0.000612798917673 -0.000190968160681
-351 0.00053562384641 0.000249493112256 -0.00039228183148
-352 0.00078378515238 0.000477374519416 0.00074162275153
-353 -0.000808193969738 -0.00129870905081 -0.000539251082229
-354 0.000330420661464 0.000545933189466 0.0011821641402
-355 0.000897833860363 -0.000304797654079 -0.000497639610207
-356 -0.00124500791055 -0.00152824784084 -0.00104959941499
-357 -0.00123030926381 -0.00130774066465 -0.000444570469345
-358 -0.000865046023132 -0.00117612129785 -0.000201645326524
-359 0.000475718566288 -0.00031382926792 -0.000402958997324
-360 0.000723879872258 -8.59478607601e-05 0.000730945585686
-361 -0.00086809924986 0.00130232303641 -0.000549928248072
-362 -0.00104205323796 0.00152117282973 0.000678656947822
-363 0.000298711351455 -0.000780889607739 0.000477343277022
-364 -0.00130491319067 0.00107278424638 -0.00106027658083
-365 -0.00129021454393 0.00129329142257 -0.000455247635188
-366 9.35081665088e-05 -0.00048444953053 -0.00111256521869
-367 0.000660921365408 -0.00133518037407 0.000371985498295
-368 0.000663974592136 -0.000649270240936 0.000720268419843
-369 -0.000154653139461 -0.00071233093769 0.000917884665695
-370 -0.00110195851809 0.000957850449554 0.000667979781979
-371 0.000238806071333 -0.00134421198792 0.000466666111179
-372 -0.00136481847079 0.000509461866202 -0.00107095374667
-373 -0.00135011982406 0.000729969042395 -0.000465924801032
-374 3.36028863867e-05 -0.00104777191071 -0.00112324238454
-375 0.00137436747581 -0.000185479880777 -0.00132455605534
-376 0.000604069312013 -0.00121259262111 0.000709591254
-377 0 0 0
-378 0 0 0
-379 0 0 0
-380 0 0 0
-381 0 0 0
-382 0 0 0
-383 0 0 0
-384 0 0 0
-385 0 0 0
-386 0 0 0
-387 0 0 0
-388 0 0 0
-389 0 0 0
-390 0 0 0
-391 0 0 0
-392 0 0 0
-393 -0.00136294890731 0.000287670627183 -0.00110674533637
-394 2.07738031358e-05 -0.00149007032592 0.00140029154752
-395 0.00120374159173 -0.000989566128058 -0.00064418383813
-396 0.00120679481846 -0.000303655994919 -0.000295900916583
-397 -0.00100073889335 -0.000266620139152 -0.0012121031151
-398 -0.00117469288146 -4.77703458332e-05 1.64820807955e-05
-399 0.000781626297653 -0.000998597741899 -0.000549503225247
-400 -0.00082199824447 0.000855076112219 0.0010772313843
-401 -0.00142285418743 -0.000275651752993 -0.00111742250221
-402 -3.91314769864e-05 0.00111096176131 0.00138961438168
-403 -0.00124716676527 0.00016013436524 0.000823629075636
-404 0.00114688953833 -0.000866978375096 -0.000306578082426
-405 -0.000287292782956 0.000883080354145 0.000255709798668
-406 -0.00123459816158 -0.00061109272601 5.80491495212e-06
-407 0.00072172101753 -0.00156192012207 -0.00056018039109
-408 -0.000881903524592 0.000291753732043 0.00106655421846
-409 -0.000464299997789 0.000416020014326 0.00113601207301
-410 -9.90367571085e-05 0.000547639381129 0.00137893721584
-411 -0.00130707204539 -0.000403188014937 0.000812951909793
-412 -0.00105891073942 -0.000175306607777 -0.0012174979746
-413 0.00150458778501 -0.00130603447299 -0.000247797393712
-414 -0.0012945034417 -0.00117441510619 -4.87225089126e-06
-415 0.000661815737408 0.00103911196515 -0.000570857556933
-416 0.000909977043378 0.00126699337231 0.000563047026077
-417 -0.000524205277911 -0.00014730236585 0.00112533490717
-418 -0.000158942037231 -1.56829990475e-05 0.00136826004999
-419 -0.00136697732552 -0.000966510395113 0.00080227474395
-420 -0.00111881601955 -0.000738628987953 -0.00122817514044
-421 0.00144468250489 0.00129499761423 -0.000258474559555
-422 -0.000581057331306 -2.47146128883e-05 0.00146294066288
-423 0.000601910457286 0.000475789584971 -0.000581534722777
-424 -0.00154093131362 -0.000747660601794 -0.00113349452756
-425 -0.000584110558034 -0.000710624746027 0.00111465774133
-426 -0.000758064546139 -0.000491774952708 -0.000821111530177
-427 0.000424903242453 8.72924515214e-06 0.00029876755157
-428 -0.00117872129967 -0.00130195136813 -0.00123885230628
-429 0.00138477722477 0.000731675234058 -0.000269151725399
-430 -0.000395854532186 -0.00104606571904 -0.000926469308904
-431 0.00156046464693 0.00116746135229 -0.00149245461495
-432 0.00156351787365 -0.00131098298197 -0.0011441716934
-433 -0.000644015838156 -0.0012739471262 0.00110398057548
-434 -0.000817969826261 -0.00105509733288 -0.000831788696021
-435 0.000364997962331 -0.000554593135024 0.000288090385726
-436 -0.00123862657979 0.00129908071909 -0.00124952947213
-437 0.00132487194465 0.000168352853881 -0.000279828891242
-438 -0.000455759812308 0.00155496636818 -0.000937146474748
-439 0.0015005593668 0.000604138972114 -0.00150313178079
-440 0.00150361259353 0.00129004910525 -0.00115484885924
-441 0 0 0
-442 0 0 0
-443 0 0 0
-444 0 0 0
-445 0 0 0
-446 0 0 0
-447 0 0 0
-448 0 0 0
-449 0 0 0
-450 0 0 0
-451 0 0 0
-452 0 0 0
-453 0 0 0
-454 0 0 0
-455 0 0 0
-456 0 0 0
-457 0.00126034200372 0.000987217988283 0.000608906280312
-458 -0.00113556062747 -0.000537706804197 -0.000695249465414
-459 0.000662678035356 -0.000290018766958 0.00107146777855
-460 5.04603878466e-05 0.000648707526801 0.00077291253788
-461 -0.00154180244973 0.000432927221948 0.000503548501585
-462 0.00083332715533 0.000904593175887 0.00108529553526
-463 0.000240562741281 -0.000299050380799 0.00116614839144
-464 0.00118602179232 -0.00135691483346 -0.00101830962864
-465 0.0012004367236 0.000423895608107 0.000598229114469
-466 -0.0011954659076 -0.00110102918437 -0.000705926631258
-467 0.00137612414575 0.00085968172634 -0.000625073775079
-468 -9.4448922756e-06 8.53851466249e-05 0.000762235372037
-469 -0.000828356339328 -0.00158172675215 -0.00119299305205
-470 0.000773421875208 0.000341270795711 0.00107461836942
-471 0.000180657461158 -0.000862372760975 0.00115547122559
-472 0.0011261165122 0.00124411725376 -0.00102898679448
-473 -0.00100536355416 0.00111556737543 -0.000312690777701
-474 -0.00125537118772 0.00150000290285 -0.000716603797101
-475 0.00131621886563 0.000296359346163 -0.000635750940922
-476 0.000949109297365 0.000777056913944 -0.000148684520133
-477 0.000963524228642 -0.000606487111889 0.00146785422297
-478 0.000713516595086 -0.000222051584465 0.00106394120357
-479 0.000120752181036 -0.00142569514115 0.00114479405975
-480 0.00052699400329 0.000768025300103 -5.40039072491e-05
-481 -0.00106526883428 0.000552244995249 -0.000323367943544
-482 -0.00131527646784 0.000936680522673 -0.000727280962944
-483 0.00125631358551 -0.000266963034013 -0.000646428106766
-484 0.000889204017243 0.000213734533768 -0.000159361685976
-485 0.00090361894852 -0.00116980949207 0.00145717705713
-486 0.00142696270548 0.000927648908832 -0.000632600350061
-487 6.08469009141e-05 0.00117533694607 0.00113411689391
-488 0.000467088723168 0.000204702919927 -6.46810730925e-05
-489 -0.00112517411441 -1.10773849269e-05 -0.000334045109388
-490 0.00124995549065 0.000460588569013 0.000247701924286
-491 -0.000116160313919 0.000708276606252 -0.00114993529915
-492 0.000829298737121 -0.000349587846409 -0.000170038851819
-493 0.000843713668398 0.00143122259516 0.00144649989128
-494 -0.00155218896279 -9.37021973225e-05 0.000142344145559
-495 0.00101940109056 -0.00129734575401 0.000223197001737
-496 0.000407183443046 -0.00035861946025 -7.53582389359e-05
-497 -0.00118507939453 -0.000574399765103 -0.000344722275231
-498 0.00119005021053 -0.000102733811163 0.000237024758442
-499 0.00059728579648 -0.00130637736785 0.000317877614621
-500 0.000769393456999 -0.000912910226585 -0.000180716017663
-501 0.000783808388275 0.000867900214981 0.00143582272544
-502 0.00155226022448 -0.000657024577499 0.000131666979715
-503 0.000959495810433 0.00130368633321 0.000212519835894
-504 0.000347278162924 -0.000921941840426 -8.60354047792e-05
-505 0 0 0
-506 0 0 0
-507 0 0 0
-508 0 0 0
-509 0 0 0
-510 0 0 0
-511 0 0 0
-512 0 0 0
-513 0 0 0
-514 0 0 0
-515 0 0 0
-516 0 0 0
-517 0 0 0
-518 0 0 0
-519 0 0 0
-520 0 0 0
-521 0.000643224801896 -0.00131200338391 0.000692059681702
-522 0.00148773028355 0.000161840556903 0.00102040215127
-523 0.000818912224053 -0.000876217265679 -0.000531243207846
-524 -0.000490603168525 0.0013482548879 -0.000675790312835
-525 -0.00138556826103 -0.000153271276773 -0.00109916248481
-526 0.000292263598958 -0.00156021393041 -0.000363407315457
-527 0.000396796929978 -0.00088524887952 -0.000436562594962
-528 0.000644958235948 -0.00065736747236 0.000697341988048
-529 0.00135667091229 -0.000162302890614 -0.00100448187193
-530 0.00142782500343 -0.000401481823273 0.00100972498543
-531 0.000759006943931 -0.00143953964586 -0.000541920373689
-532 -0.000550508448648 0.000784932507725 -0.000686467478678
-533 -0.00144547354115 -0.00071659365695 -0.00110983965066
-534 0.000232358318836 0.00104081815681 -0.0003740844813
-535 0.000336891649856 -0.0014485712597 -0.000447239760806
-536 0.000585052955826 -0.00122068985254 0.000686664822205
-537 0.00154187371141 -0.00118365399677 -0.000229537376311
-538 0.00136791972331 -0.00096480420345 0.000999047819583
-539 0.000699101663809 0.00116149244137 -0.000552597539533
-540 0.000408045740993 0.00147660427504 -0.00159738737085
-541 0.00111975841734 -0.00119268561061 -0.000134856763428
-542 0.000945804429234 -0.000973835817291 0.00109372843247
-543 0.000276986369734 0.00115246082753 -0.000457916926649
-544 -1.40695530818e-05 0.0014675726612 -0.00150270675796
-545 0.00148196843129 0.00141737809045 -0.000240214542155
-546 0.00130801444319 -0.00152812658363 0.000988370653739
-547 0.00141254777421 -0.000853161532734 0.000915215374234
-548 0.000348140460871 0.000913281894867 -0.00160806453669
-549 0.00105985313722 0.00140834647661 -0.000145533929271
-550 0.000885899149112 -0.00153715819747 0.00108305126662
-551 0.000217081089612 0.00058913844735 -0.000468594092493
-552 -7.3974833204e-05 0.000904250281027 -0.00151338392381
-553 -0.000968939925708 -0.000597275883648 0.00122759837161
-554 0.000708891934279 0.00116013593011 -0.00120100092643
-555 4.0073874779e-05 0.000122078107531 0.000411708181854
-556 0.000288235180749 0.000349959514691 0.00154561276486
-557 0.000999947857095 0.000845024096437 -0.000156211095114
-558 0.00107110194823 0.000605845163777 -0.00130635870516
-559 0.00117563527925 0.00128081021467 -0.00137951398466
-560 -0.000133880113326 0.00034092790085 -0.00152406108965
-561 -0.00102884520583 -0.00116059826382 0.00121692120577
-562 0.000648986654157 0.000596813549936 -0.00121167809227
-563 -1.98314053431e-05 -0.000441244272645 0.00040103101601
-564 0.00100168129115 0.00149966000799 -0.000150928788768
-565 0.000940042576973 0.00028170171626 -0.000166888260958
-566 -0.00137980640877 -0.00140880881032 0.00016145420861
-567 0.00111572999913 0.000717487834493 -0.00139019115051
-568 -0.000193785393448 -0.000222394479326 -0.00153473825549
-569 0 0 0
-570 0 0 0
-571 0 0 0
-572 0 0 0
-573 0 0 0
-574 0 0 0
-575 0 0 0
-576 0 0 0
-577 0 0 0
-578 0 0 0
-579 0 0 0
-580 0 0 0
-581 0 0 0
-582 0 0 0
-583 0 0 0
-584 0 0 0
-585 0.000875512636045 0.00110056685066 0.000721846910596
-586 -0.00152038999515 -0.000424357941818 -0.00058230883513
-587 0.000277848667682 -0.000176669904579 0.00118440840884
-588 -0.000334368979828 0.00076205638918 0.000885853168165
-589 0.00123772265 0.000546276084327 0.000616489131869
-590 0.000448497787656 0.00101794203827 0.00119823616554
-591 -0.000144266626394 -0.00018570151842 0.00127908902172
-592 0.000801192424646 -0.00124356597108 -0.000905368998351
-593 0.000815607355923 0.000537244470486 0.000711169744753
-594 -0.00158029527527 -0.000987680321994 -0.000592986000973
-595 0.000217943387559 -0.000739992284755 0.00117373124299
-596 -0.00039427425995 0.000198734009004 0.000875176002321
-597 0.00117781736988 -1.70462958498e-05 0.000605811966026
-598 0.000388592507534 0.00045461965809 0.0011875589997
-599 -0.000204171906516 -0.000749023898596 0.00126841185588
-600 0.000741287144524 0.00135746611614 -0.000916046164195
-601 0.00100081015504 -0.000484106635669 0.00148611424037
-602 0.00152415391201 -0.00155100270217 -0.000603663166817
-603 0.000931389497958 0.000409708208542 -0.000522810310638
-604 0.000564279929691 0.000890405776323 -3.57438898485e-05
-605 0.000578694860968 -0.00049313824951 -0.00158355961414
-606 0.000328687227411 -0.000108702722086 0.00117688183386
-607 -0.000264077186638 -0.00131234627877 0.00125773469003
-608 -0.000631186754905 -0.000831648710992 -0.00141955335657
-609 -0.00145009820196 0.000665593857628 -0.00021042731326
-610 0.00146424863189 0.00105002938505 -0.00061434033266
-611 0.000871484217836 -0.000153614171634 -0.000533487476482
-612 0.000504374649569 0.000327083396147 -4.64210556919e-05
-613 0.000518789580845 -0.00105646062969 -0.00159423677999
-614 0.000268781947289 -0.000672025102263 0.00116620466801
-615 -0.00032398246676 0.00128868580845 0.00124705752419
-616 -0.000691092035027 -0.00139497109117 -0.00143023052242
-617 -0.00151000348208 0.000102271477452 -0.000221104479103
-618 9.17747324565e-05 -0.00113908544208 -0.00111784752504
-619 -0.000500989681593 0.000821625468631 -0.00103699466886
-620 0.000444469369447 -0.00023623898403 -5.70982215353e-05
-621 0.000458884300723 0.00154457145754 -0.00160491394583
-622 0.00122733613693 1.96466650566e-05 0.000255284775843
-623 0.000634571722881 -0.00118399689163 0.000336137632021
-624 2.23540753716e-05 -0.00024527059787 3.75823913484e-05
-625 -0.0015699087622 -0.000461050902724 -0.000231781644947
-626 0.000805220842855 1.06150512158e-05 0.000349965388726
-627 -0.000560894961715 0.000258303088455 -0.0010476718347
-628 0.000384564089325 -0.000799561364206 -6.77753873786e-05
-629 0.000398979020601 0.00098124907736 0.00154876335573
-630 0.00116743085681 -0.00054367571512 0.000244607609999
-631 0.000574666442759 0.00141703519559 0.000325460466178
-632 -3.75512047506e-05 -0.000808592978047 2.6905225505e-05
-633 0 0 0
-634 0 0 0
-635 0 0 0
-636 0 0 0
-637 0 0 0
-638 0 0 0
-639 0 0 0
-640 0 0 0
-641 0 0 0
-642 0 0 0
-643 0 0 0
-644 0 0 0
-645 0 0 0
-646 0 0 0
-647 0 0 0
-648 0 0 0
-649 0.000334449079673 -0.00136424025564 -0.000726855940119
-650 0.00110290091588 0.000275189419282 0.00113334278155
-651 -0.00026321488869 0.000522877456521 -0.000264294441878
-652 -0.0008754325362 0.00146160375028 -0.000562849682551
-653 0.000696659093626 0.00124582344543 -0.000832213718846
-654 -9.25657687162e-05 -0.00144686506803 -0.000250466685173
-655 -0.000685330182766 0.00051384584268 -0.000169613828994
-656 0.000260128868274 -0.000544018609981 0.000810282618332
-657 0.000274543799551 0.00123679183159 -0.000737533105962
-658 0.00104299563576 -0.000288132960894 0.00112266561571
-659 -0.000323120168813 -4.04449236555e-05 -0.000274971607721
-660 -0.000935337816322 0.000898281370104 -0.000573526848394
-661 0.000636753813504 0.00068250106525 -0.000842890884689
-662 -0.000152471048838 0.00115416701919 -0.000261143851016
-663 -0.000745235462888 -4.94765374963e-05 -0.000180290994838
-664 0.000200223588152 -0.00110734099016 0.000799605452489
-665 0.000459746598671 0.000215440725431 3.74113896569e-05
-666 0.000983090355635 -0.000851455341071 0.00111198844987
-667 0.000390325941586 0.00110925556964 0.00119284130605
-668 2.32163733191e-05 -0.00157440132998 -0.00148444674056
-669 3.76313045956e-05 0.00020640911159 0.000132092002541
-670 -0.000212376328961 0.000590844639014 -0.000271821016859
-671 -0.00080514074301 -0.000612798917673 -0.000190968160681
-672 -0.00117225031128 -0.000132101349892 0.000296098260109
-673 0.00117319270907 0.00136514121873 0.00150522430342
-674 0.000923185075513 -0.00141477772125 0.00110131128402
-675 0.000330420661464 0.000545933189466 0.0011821641402
-676 -3.6688906803e-05 0.00102663075725 -0.00149512390641
-677 -2.22739755265e-05 -0.000356913268586 0.000121414836697
-678 -0.000272281609083 2.75222588373e-05 -0.000282498182703
-679 -0.000865046023132 -0.00117612129785 -0.000201645326524
-680 -0.0012321555914 -0.000695423730068 0.000285421094265
-681 0.00111328742895 0.000801818838552 0.00149454713758
-682 -0.000449288823915 -0.000439538080982 0.000597804091643
-683 -0.00104205323796 0.00152117282973 0.000678656947822
-684 -9.65941869252e-05 0.00046330837707 -0.00150580107225
-685 -8.21792556487e-05 -0.000920235648763 0.000110737670854
-686 0.000686272580558 0.000719194026156 -0.00119341807487
-687 9.35081665088e-05 -0.00048444953053 -0.00111256521869
-688 -0.000518709481 0.000454276763229 -0.00141112045937
-689 0.00105338214883 0.000238496458376 0.00148386997174
-690 0.000264157286483 0.000710162412316 -0.00109873746199
-691 -0.00110195851809 0.000957850449554 0.000667979781979
-692 -0.000156499467047 -0.000100014003106 -0.00151647823809
-693 -0.000142084535771 -0.00148355802894 0.00010006050501
-694 0.000626367300436 0.00015587164598 -0.00120409524072
-695 3.36028863867e-05 -0.00104777191071 -0.00112324238454
-696 -0.000578614761123 -0.000109045616947 -0.00142179762521
-697 0 0 0
-698 0 0 0
-699 0 0 0
-700 0 0 0
-701 0 0 0
-702 0 0 0
-703 0 0 0
-704 0 0 0
-705 0 0 0
-706 0 0 0
-707 0 0 0
-708 0 0 0
-709 0 0 0
-710 0 0 0
-711 0 0 0
-712 0 0 0
-713 -0.000821885350936 -0.000411876733916 0.000341957514344
-714 0.000561837359508 0.000974736780382 -0.000315360069162
-715 -0.0014195493193 0.00147524097824 0.000804519012585
-716 -0.00141649609257 -0.00100320335602 0.00115280193413
-717 -0.000459675336983 -0.000966167500252 0.000236599735617
-718 -0.000633629325088 -0.000747317706933 0.00146518493151
-719 0.00132268985402 0.0014662093644 0.000899199625469
-720 -0.000280934688098 0.000155528751119 -0.000638420232383
-721 -0.000881790631058 -0.000975199114093 0.000331280348501
-722 0.000501932079386 0.000411414400205 -0.000326037235005
-723 -0.000706103208901 -0.00053941299586 -0.000892022541047
-724 -0.00147640137269 -0.0015665257362 0.00114212476829
-725 -0.000519580617105 -0.00152948988043 0.000225922569774
-726 -0.00069353460521 -0.00131064008711 0.00145450776567
-727 0.0012627845739 0.000902886984224 0.000888522459625
-728 -0.00034083996822 -0.000407793629057 -0.000649097398227
-729 -0.000696587831938 0.00116780424715 0.00110622484412
-730 0.000442026799263 -0.000151907979971 -0.000336714400848
-731 -0.000766008489023 -0.00110273537604 -0.000902699706891
-732 -0.000517847183053 -0.000874853968876 0.00023120487612
-733 -0.00111870312601 0.00115877263331 0.001200905457
-734 -0.000753439885332 0.00129039200011 0.00144383059982
-735 0.00120287929378 0.000339564604048 0.000877845293782
-736 0.00145104059975 0.000567446011208 -0.00115260459061
-737 1.68582784605e-05 -0.00084684972695 -0.000590316709512
-738 0.000382121519141 -0.000715230360147 -0.000347391566692
-739 -0.000825913769145 0.00149829671119 -0.000913376872734
-740 -0.000577752463175 -0.00143817634905 0.000220527710276
-741 -0.00117860840614 0.000595450253134 0.00119022829116
-742 -3.9993774934e-05 -0.000724261973988 -0.000252710953808
-743 0.00114297401366 -0.000223757776128 0.000867168127939
-744 -0.00099986775725 -0.00144720796289 0.00031520832316
-745 -4.30470016616e-05 -0.00141017210713 -0.000600993875356
-746 -0.000217000989767 -0.00119132231381 0.000627591320538
-747 0.000965966798825 -0.000690818115948 -0.00141688406511
-748 -0.000637657743297 0.00116285573817 0.000209850544433
-749 -0.00123851368626 3.21278729579e-05 0.00117955112532
-750 0.000145209024186 0.00141874138726 0.000522233541811
-751 -0.0010628262641 0.000467913991191 -4.3751764231e-05
-752 -0.00105977303737 0.00115382412433 0.000304531157317
-753 -0.000102952281784 0.0011908599801 -0.000611671041199
-754 -0.000276906269889 0.00140970977342 0.000616914154695
-755 0.000906061518703 -0.00125414049612 -0.00142756123096
-756 -0.000697563023419 0.000599533357994 0.00019917337859
-757 -0.00129841896638 -0.000531194507218 0.00116887395947
-758 8.53037440641e-05 0.00085541900708 0.000511556375968
-759 -0.00112273154422 -9.54083889856e-05 -5.44289300744e-05
-760 -0.00111967831749 0.000590501744153 0.000293853991473
-761 0 0 0
-762 0 0 0
-763 0 0 0
-764 0 0 0
-765 0 0 0
-766 0 0 0
-767 0 0 0
-768 0 0 0
-769 0 0 0
-770 0 0 0
-771 0 0 0
-772 0 0 0
-773 0 0 0
-774 0 0 0
-775 0 0 0
-776 0 0 0
-777 -0.000695693459938 0.000377742118975 0.000163381788891
-778 0.000688029250506 -0.00139999883413 -0.000493935794615
-779 -0.00121445902789 -0.000718600720231 -3.4653089141e-05
-780 -0.00121140580116 -3.26905870932e-05 0.000313629832407
-781 0.000439867944536 0.00153647422611 0.00153651408977
-782 0.000265913956431 -0.00140903044797 -0.000399255181731
-783 0.00152778014544 -0.000727632334072 6.00275237427e-05
-784 -7.58443966856e-05 0.00112604152005 -0.00147759233411
-785 -0.00075559874006 -0.000185580261201 0.000152704623048
-786 0.000628123970384 0.0012010332531 -0.000504612960458
-787 -0.000501012917488 0.000431099773066 0.00143315982463
-788 -0.00127131108128 -0.000596012967269 0.000302952666563
-789 0.000379962664414 0.000973151845937 0.00152583692393
-790 0.000206008676309 0.00119200163926 -0.000409932347574
-791 0.00146787486531 -0.00129095471425 4.93503578993e-05
-792 -0.000135749676808 0.000562719139869 -0.00148826949995
-793 0.000202955449581 0.000506091506118 -0.000758215269122
-794 0.00134157008078 -0.000813620721005 0.000963199953309
-795 -0.000560918197611 -0.00013222260711 0.00142248265878
-796 -0.000312756891641 9.56588000496e-05 -0.000607967225606
-797 -0.000219159844494 0.000497059892277 -0.000663534656238
-798 0.000146103396187 0.00062867925908 -0.000420609513418
-799 0.00140796958519 0.00131007737297 3.86731920559e-05
-800 -0.00150822357624 0.00153795878013 0.00117257777507
-801 0.000143050169459 -5.72308740587e-05 -0.000768892434965
-802 0.00128166480066 -0.00137694310118 0.000952522787465
-803 -0.000620823477733 -0.000695544987287 0.00141180549294
-804 -0.000372662171763 -0.000467663580127 -0.00061864439145
-805 -0.000279065124616 -6.62624878995e-05 -0.000674211822082
-806 8.61981160644e-05 6.53568789033e-05 -0.000431286679261
-807 0.00134806430507 0.000746754992798 2.79960262125e-05
-808 -0.000794777465838 -0.000476695193968 -0.000523963778566
-809 8.31448893368e-05 -0.000620553254235 -0.000779569600809
-810 -9.08090987684e-05 -0.000401703460916 0.000449015595085
-811 0.00117105709024 0.000279694652978 0.000908298300559
-812 -0.000432567451885 -0.0010309859603 -0.000629321557293
-813 -0.000338970404738 -0.000629584868076 -0.000684888987925
-814 0.00104475230571 0.000757028646222 -0.00134220657143
-815 -0.000857735972688 0.00143842676012 -0.000882923865957
-816 -0.00085468274596 -0.00104001757414 -0.00053464094441
-817 0.000796590999735 0.000529147239063 0.000688243312958
-818 -0.000150714378891 -0.000965025841092 0.000438338429242
-819 0.00111115181012 -0.000283627727198 0.000897621134715
-820 -0.000492472732007 0.00157004612692 -0.000639998723137
-821 -0.000398875684861 -0.00119290724825 -0.000695566153769
-822 0.000984847025583 0.000193706266046 -0.00135288373727
-823 -0.00091764125281 0.00087510437994 -0.000893601031801
-824 -0.000914588026082 0.00156101451308 -0.000545318110253
-825 0 0 0
-826 0 0 0
-827 0 0 0
-828 0 0 0
-829 0 0 0
-830 0 0 0
-831 0 0 0
-832 0 0 0
-833 0 0 0
-834 0 0 0
-835 0 0 0
-836 0 0 0
-837 0 0 0
-838 0 0 0
-839 0 0 0
-840 0 0 0
-841 -0.00123675701631 0.00107728948007 -0.00128532106182
-842 -0.000468305180103 -0.000447635312405 0.000574877659848
-843 0.00140883188314 -1.90533591317e-05 -0.00148335593986
-844 0.000796614235631 0.000919672934627 0.00138244328687
-845 -0.000101195611836 -0.000928332880186 8.78112390586e-05
-846 -0.000890420474178 -0.000456666926246 0.000669558272732
-847 0.000986716589065 -2.80849729725e-05 -0.00138867532697
-848 -0.00123217882729 -0.00108594942563 -0.000408778879646
-849 -0.00129666229643 0.000513967099898 -0.00129599822767
-850 -0.000528210460225 -0.00101095769258 0.000564200494005
-851 -0.00104207647386 0.00113064713417 -1.55430260898e-05
-852 0.000736708955509 0.000356350554451 0.00137176612103
-853 -0.000161100891958 -0.00149165526036 7.71340732153e-05
-854 -0.0009503257543 -0.00101998930642 0.000658881106889
-855 0.000926811308943 -0.000591407353149 -0.00139935249282
-856 -0.00129208410742 0.00151508266159 -0.00041945604549
-857 -0.000338108106791 0.00120563886722 0.000957436347562
-858 0.000185235650174 0.000138742800716 -0.00113234105963
-859 -0.00110198175398 0.000567324753989 -2.62201919331e-05
-860 -0.00146909132225 0.00104802232177 0.000460846228857
-861 -0.000760223400866 0.00119660725338 0.00105211696045
-862 -0.00101023103442 -0.0015833116866 0.000648203941045
-863 0.000866906028821 -0.00115472973333 -0.00141002965866
-864 0.000499796460554 -0.000674032165544 -0.00092296323787
-865 -0.000398013386913 0.000642316487041 0.000946759181718
-866 0.000125330370052 -0.00042457957946 -0.00114301822547
-867 -0.0011618870341 4.00237381316e-06 -3.68973577765e-05
-868 -0.00152899660237 0.000484699941594 0.000450169063013
-869 -0.000820128680988 0.0006332848732 0.0010414397946
-870 -0.00107013631454 0.00101772040062 0.000637526775202
-871 0.000807000748698 0.0014463023539 -0.0014207068245
-872 0.00121324257095 0.000475668327753 0.000544849675897
-873 -0.000457918667035 7.89941068648e-05 0.000936082015875
-874 -0.00124714352938 0.000550660060805 0.00151782904955
-875 0.000629993533866 0.000979242014078 -0.000540404550157
-876 -0.00158890188249 -7.86224385825e-05 0.00043949189717
-877 -0.00088003396111 6.9962493024e-05 0.00103076262876
-878 -0.000111582124903 -0.00145496229946 -0.000273393116968
-879 -0.00139879952906 -0.00102638034618 0.000832727750726
-880 0.00115333729083 -8.76540524233e-05 0.000534172510053
-881 0.000255527443363 0.00122869460016 -0.000760459537758
-882 -0.0013070488095 -1.26623193716e-05 0.0015071518837
-883 0.000570088253743 0.000415919633902 -0.000551081716
-884 0.00151554730478 -0.000641944818759 0.000428814731326
-885 -0.000939939241233 -0.000493359887152 0.00102008546292
-886 -0.000171487405026 0.00114606978777 -0.000284070282811
-887 -0.00145870480918 -0.00158970272636 0.000822050584883
-888 0.00109343201071 -0.0006509764326 0.00052349534421
-889 0 0 0
-890 0 0 0
-891 0 0 0
-892 0 0 0
-893 0 0 0
-894 0 0 0
-895 0 0 0
-896 0 0 0
-897 0 0 0
-898 0 0 0
-899 0 0 0
-900 0 0 0
-901 0 0 0
-902 0 0 0
-903 0 0 0
-904 0 0 0
-905 -0.00108052282761 0.000491090981354 0.000276322419175
-906 -0.00100936873647 0.000251912048695 -0.000873825190867
-907 -0.00159928839556 -0.000605251857852 7.82875411433e-05
-908 0.000255550679259 -0.00154513417167 -6.62595638458e-05
-909 5.50385768618e-05 -0.00151453137891 -0.00151489974734
-910 -0.00143148403055 0.000242880434854 -0.000779144577983
-911 0.00114295077776 -0.000614283471693 0.000172968154027
-912 0.00139111208373 -0.000386402064533 0.00130687273704
-913 -0.00114042810773 -7.22313988224e-05 0.000265645253332
-914 -0.000295922626076 0.00140161254199 0.000593987722899
-915 0.00150516079172 -0.00116857423803 6.76103752999e-05
-916 0.000195645399137 0.00105589791555 -7.69367296892e-05
-917 -4.86670326035e-06 0.00108650070832 -0.00152557691318
-918 -0.00149138931067 -0.000320441945323 -0.000789821743827
-919 0.00108304549764 -0.00117760585187 0.000162290988184
-920 0.00133120680361 -0.00094972444471 0.00129619557119
-921 -0.000181873918093 0.000619440368497 -0.000645274638838
-922 -0.000355827906198 0.000838290161816 0.000583310557056
-923 0.00144525551159 0.00143245784919 5.69332094565e-05
-924 0.00115419958878 -0.00141678478453 -0.000987856621859
-925 -0.00137734060269 -0.00110261411882 0.00113527036183
-926 -0.00155129459079 -0.000883764325499 -0.00080049890967
-927 0.00102314021752 0.00142342623535 0.00015161382234
-928 0.000732084294702 -0.00142581639837 -0.000893176008975
-929 -0.000241779198215 5.61179883204e-05 -0.000655951804681
-930 -0.00041573318632 0.000274967781639 0.000572633391213
-931 -0.00100565284541 -0.000582196124908 0.00152474612322
-932 0.00109429430866 0.00118424730269 -0.000998533787702
-933 -0.00143724588281 0.0014984179684 0.00112459319599
-934 0.00155315459648 -0.00144708670568 -0.000811176075514
-935 0.000963234937396 0.000860103855177 0.000140936656497
-936 0.00067217901458 0.00117521568885 -0.000903853174819
-937 -0.000301684478337 -0.000507204391856 -0.000666628970525
-938 0.00137614738165 0.0012502074219 6.91261988327e-05
-939 0.000786227722563 0.000393043515357 0.00102123893084
-940 0.00103438902853 0.000620924922517 -0.00100921095355
-941 -0.000723799772413 -0.000516236005697 -0.000571948357641
-942 -0.000652645681275 -0.000755414938356 0.00144225849972
-943 -0.00124256534036 0.0015517756225 -0.000769983235673
-944 0.000612273734458 0.000611893308677 -0.000914530340662
-945 -0.00036158975846 -0.00107052677203 -0.000677306136368
-946 0.00131624210153 0.000686885041728 5.84490329893e-05
-947 0.000726322442441 -0.000170278864819 0.001010561765
-948 0.000974483748411 5.7602542341e-05 -0.00101988811939
-949 -0.000783705052535 -0.00107955838587 -0.000582625523484
-950 -0.000712550961398 -0.00131873731853 0.00143158133387
-951 -0.00130247062048 0.000988453242319 -0.000780660401516
-952 0.000552368454336 4.85709285002e-05 -0.000925207506505
-953 0 0 0
-954 0 0 0
-955 0 0 0
-956 0 0 0
-957 0 0 0
-958 0 0 0
-959 0 0 0
-960 0 0 0
-961 0 0 0
-962 0 0 0
-963 0 0 0
-964 0 0 0
-965 0 0 0
-966 0 0 0
-967 0 0 0
-968 0 0 0
-969 0.00154276808342 0.00119063834245 -0.00117238043154
-970 -0.000853134547777 -0.000334286450026 0.000687818290133
-971 0.00102400251547 9.42955032473e-05 -0.00137041530957
-972 0.000411784867957 0.00103302179701 0.00149538391715
-973 -0.00048602497951 -0.000814984017807 0.000200751869343
-974 -0.00127524984185 -0.000343318063867 0.000782498903016
-975 0.000601887221391 8.52638894065e-05 -0.00127573469669
-976 0.00154734627243 -0.000972600563254 -0.000295838249362
-977 0.00148286280329 0.000627315962277 -0.00118305759738
-978 -0.000913039827899 -0.000897608830203 0.000677141124289
-979 0.000964097235344 -0.000469026876929 -0.00138109247542
-980 0.000351879587834 0.00046969941683 0.00148470675131
-981 -0.000545930259632 -0.00137830639798 0.000190074703499
-982 -0.00133515512197 -0.000906640444043 0.000771821737173
-983 0.000541981941268 -0.00047805849077 -0.00128641186253
-984 0.00148744099231 -0.00153592294343 -0.000306515415206
-985 -0.000722937474465 0.0013189877296 0.00107037697785
-986 -0.000972945108021 -0.00146093121038 0.000666463958446
-987 0.000904191955221 -0.00103234925711 -0.00139176964126
-988 0.00131043377748 0.00116137118415 0.000573786859141
-989 0.00124595030834 -0.000403066757718 -0.000313432488881
-990 -0.0013950604021 -0.00146996282422 0.000761144571329
-991 0.000482076661146 -0.00104138087095 -0.00129708902838
-992 0.000114967092879 -0.000560683303165 -0.000810022607586
-993 -0.000782842754587 0.00075566534942 0.001059699812
-994 -0.000259498997623 -0.000311230717081 -0.00103007759519
-995 -0.00154671640178 0.000117351236192 7.60432725077e-05
-996 0.00125052849735 0.000598048803973 0.000563109693297
-997 -0.00120495804866 0.000746633735579 0.00115438042489
-998 -0.00145496568222 0.001131069263 0.000750467405486
-999 0.000422171381024 0.00155965121628 -0.00130776619422
-1000 5.50618127573e-05 -0.00112400568334 -0.000820699773429
-1001 -0.000842748034709 0.000192342969244 0.00104902264616
-1002 0.00153238157035 0.000664008923184 -0.00153358478757
-1003 0.000245164166191 0.00109259087646 -0.000427463919872
-1004 0.00119062321723 3.47264237966e-05 0.000552432527454
-1005 -0.00126486332878 0.000183311355403 0.00114370325904
-1006 -0.000496411492578 -0.00134161343708 -0.000160452486684
-1007 0.00138072557067 -0.000913031483803 0.000945668381011
-1008 0.000768507923156 2.56948099558e-05 0.000647113140338
-1009 -0.000902653314832 -0.000370979410933 0.00103834548032
-1010 0.00147247629023 0.000100686543007 -0.00154426195341
-1011 0.000185258886069 0.000529268496281 -0.000438141085716
-1012 0.00113071793711 -0.00052859595638 0.000541755361611
-1013 -0.00132476860891 -0.000380011024773 0.0011330260932
-1014 -0.0005563167727 0.00125941865015 -0.000171129652527
-1015 0.00132082029054 -0.00147635386398 0.000934991215167
-1016 0.000708602643034 -0.000537627570221 0.000636435974494
-1017 0 0 0
-1018 0 0 0
-1019 0 0 0
-1020 0 0 0
-1021 0 0 0
-1022 0 0 0
-1023 0 0 0
-1024 0 0 0
-1025 0 0 0
-1026 0 0 0
-1027 0 0 0
-1028 0 0 0
-1029 0 0 0
-1030 0 0 0
-1031 0 0 0
-1032 0 0 0
-1033 0.00100170452704 -0.00127416876385 0.000543271185143
-1034 -0.00139419810415 0.000365260911074 -0.000760884560583
-1035 0.000482938959094 0.000793842864347 0.000345236307111
-1036 -0.000129278688415 -0.00143178530929 4.66810664384e-05
-1037 -0.00102708853588 -0.000115436656707 -0.00124795098137
-1038 0.00134804106917 0.000356229297233 -0.000666203947699
-1039 6.08236650186e-05 0.000784811250506 0.000439916919995
-1040 0.00100628271606 -0.000273053202154 0.00141981336732
-1041 0.000941799246921 0.00132686332338 0.0005325940193
-1042 -0.00145410338427 -0.000198061469103 -0.000771561726426
-1043 0.000423033678972 0.000230520484171 0.000334559141268
-1044 -0.000189183968538 0.00116924677793 3.60039005951e-05
-1045 -0.001086993816 -0.000678759036883 -0.00125862814722
-1046 0.00128813578905 -0.000207093082944 -0.000676881113543
-1047 9.18384896451e-07 0.00022148887033 0.000429239754152
-1048 0.000946377435936 -0.000836375582331 0.00140913620148
-1049 -0.00126400103084 -0.0011458193767 -0.00037832587287
-1050 -0.00151400866439 -0.000761383849279 -0.00078223889227
-1051 0.00113647978937 0.00138022097747 -0.00136198241236
-1052 0.000769370221103 -0.00130343592215 -0.000874915991575
-1053 0.000704886751966 0.000296480603382 0.0014022191278
-1054 0.00122823050893 -0.00077041546312 -0.000687558279386
-1055 -5.89868952257e-05 -0.000341833509846 0.000418562588308
-1056 -0.000426096463493 0.000138864057934 0.000905629009098
-1057 -0.00132390631096 0.00145521271052 -0.000389003038713
-1058 -0.000800562553995 0.000388316644018 0.000685574021497
-1059 0.00107657450925 0.000816898597292 -0.00137265957821
-1060 0.000709464940981 0.00129759616507 -0.000885593157418
-1061 0.00141833286236 0.00144618109668 -0.000294322425829
-1062 0.00116832522881 -0.0013337378433 -0.000698235445229
-1063 -0.000118892175348 -0.000905155890023 0.000407885422465
-1064 -0.000486001743615 -0.000424458322242 0.000894951843255
-1065 -0.00138381159108 0.000891890330344 -0.000399680204556
-1066 0.000991318013976 0.00136355628428 0.000182066829117
-1067 -0.000295899390181 -0.00137221622984 0.00128818769681
-1068 0.000649559660859 0.000734273784896 -0.000896270323261
-1069 0.00135842758224 0.000882858716503 -0.000304999591673
-1070 -0.00103747504895 -0.000642066075977 -0.0016091553374
-1071 0.000839662014293 -0.000213484122704 -0.000503034469705
-1072 0.000227444366784 0.000725242171056 -0.000801589710378
-1073 -0.0014437168712 0.000328567950167 -0.0004103573704
-1074 0.000931412733853 0.000800233904107 0.000171389663274
-1075 -0.000355804670303 0.00122881585738 0.00127751053097
-1076 0.000589654380737 0.00017095140472 -0.000906947489105
-1077 0.00129852230212 0.000319536336326 -0.000315676757516
-1078 -0.00109738032907 -0.00120538845615 0.00154452196416
-1079 0.000779756734171 -0.00077680650288 -0.000513711635548
-1080 0.000167539086662 0.000161919790879 -0.000812266876221
-1081 0 0 0
-1082 0 0 0
-1083 0 0 0
-1084 0 0 0
-1085 0 0 0
-1086 0 0 0
-1087 0 0 0
-1088 0 0 0
-1089 0 0 0
-1090 0 0 0
-1091 0 0 0
-1092 0 0 0
-1093 0 0 0
-1094 0 0 0
-1095 0 0 0
-1096 0 0 0
-1097 -0.000154629903566 -0.000321805242125 -0.00155226982779
-1098 0.00122909280688 0.00106480827217 0.000954767056101
-1099 -0.000673395471515 -0.00141814808133 0.00141404976157
-1100 -0.000670342244787 -0.000732237948193 -0.00140202178428
-1101 0.000980931500908 0.000836926865013 -0.00017913752691
-1102 0.000806977512803 0.00105577665833 0.00104944766898
-1103 -0.00109551076559 -0.00142717969517 0.00150873037446
-1104 0.000465219159686 0.000426494158945 -2.8889483394e-05
-1105 -0.000214535183688 -0.000885127622301 -0.00156294699364
-1106 0.00116918752676 0.000501485891997 0.000944089890257
-1107 -0.000733300751637 0.00118288400589 0.00140337259573
-1108 -0.00073024752491 -0.00129556032837 -0.00141269895012
-1109 0.000921026220786 0.000273604484837 -0.000189814692753
-1110 0.000747072232681 0.000492454278156 0.00103877050314
-1111 -0.00115541604571 0.00117385239205 0.00149805320861
-1112 0.000405313879564 -0.000136828221231 -3.95666492374e-05
-1113 0.000744019005953 -0.000193455854982 0.000690487581593
-1114 0.00110928224663 -6.18364881793e-05 0.000933412724414
-1115 -1.98546412386e-05 -0.00083176996821 -0.000293168957901
-1116 0.000228306664731 -0.00060388856105 0.000840735625109
-1117 0.000321903711878 -0.000202487468823 0.000785168194477
-1118 0.000687166952559 -7.08681020201e-05 0.0010280933373
-1119 -0.00121532132583 0.000610530011874 0.00148737604277
-1120 -0.000967160019864 0.000838411419034 -0.000543073841617
-1121 0.000684113725831 -0.000756778235158 0.00067981041575
-1122 -0.00134162611037 0.00108786400512 -0.000763128829218
-1123 -7.97599213608e-05 -0.00139509234839 -0.000303846123745
-1124 0.000168401384609 -0.00116721094123 0.000830058459266
-1125 0.000261998431756 -0.000765809848999 0.000774491028634
-1126 0.000627261672436 -0.000634190482196 0.00101741617145
-1127 -0.00127522660596 4.72076316979e-05 0.00147669887693
-1128 -0.00102706529999 0.000275089038858 -0.000553751007461
-1129 0.000624208445709 -0.00132010061533 0.000669133249907
-1130 0.000450254457604 -0.00110125082202 -0.0012666360216
-1131 -0.00145223382079 -0.000419852708121 -0.000807353316125
-1132 0.000108496104487 0.001433821146 0.000819381293422
-1133 0.000202093151634 -0.00132913222918 0.00076381386279
-1134 -0.00157853860532 5.74812851226e-05 0.000106496279285
-1135 -0.000316672416316 0.000738879399017 0.000565778984758
-1136 -0.000313619189588 0.00142478953216 0.000914061906306
-1137 0.000564303165587 0.00128093147189 0.000658456084063
-1138 0.000390349177481 0.00149978126521 -0.00127731318744
-1139 -0.00151213910091 -0.000983175088298 -0.000818030481968
-1140 4.8590824365e-05 0.00087049876582 0.000808704127579
-1141 0.000142187871511 0.00127189985805 0.000753136696947
-1142 0.00152591058196 -0.000505841095054 9.58191134412e-05
-1143 -0.000376577696438 0.000175557018841 0.000555101818915
-1144 -0.00037352446971 0.000861467151979 0.000903384740462
-1145 0 0 0
-1146 0 0 0
-1147 0 0 0
-1148 0 0 0
-1149 0 0 0
-1150 0 0 0
-1151 0 0 0
-1152 0 0 0
-1153 0 0 0
-1154 0 0 0
-1155 0 0 0
-1156 0 0 0
-1157 0 0 0
-1158 0 0 0
-1159 0 0 0
-1160 0 0 0
-1161 5.04603878466e-05 0.000648707526801 0.00077291253788
-1162 0.00143418309829 -0.0011290334263 0.000115594954375
-1163 -0.000468305180103 -0.000447635312405 0.000574877659848
-1164 -0.000465251953375 0.000238274820733 0.000923160581396
-1165 0.00118602179232 -0.00135691483346 -0.00101830962864
-1166 0.00101206780422 -0.00113806504014 0.000210275567258
-1167 -0.000890420474178 -0.000456666926246 0.000669558272732
-1168 0.000670309451099 0.00139700692787 -0.00086806158512
-1169 -9.4448922756e-06 8.53851466249e-05 0.000762235372037
-1170 0.00137427781817 0.00147199866092 0.000104917788531
-1171 -0.000528210460225 -0.00101095769258 0.000564200494005
-1172 -0.000525157233497 -0.000325047559443 0.000912483415553
-1173 0.0011261165122 0.00124411725376 -0.00102898679448
-1174 0.000952162524093 0.00146296704708 0.000199598401415
-1175 -0.0009503257543 -0.00101998930642 0.000658881106889
-1176 0.000610404170977 0.000833684547695 -0.000878738750963
-1177 0.000949109297365 0.000777056913944 -0.000148684520133
-1178 0.00131437253805 0.000908676280747 9.42406226879e-05
-1179 0.000185235650174 0.000138742800716 -0.00113234105963
-1180 0.000433396956144 0.000366624207876 1.56352338283e-06
-1181 0.00052699400329 0.000768025300103 -5.40039072491e-05
-1182 0.000892257243971 0.000899644666906 0.000188921235571
-1183 -0.00101023103442 -0.0015833116866 0.000648203941045
-1184 -0.000762069728452 -0.00135543027944 -0.00138224594334
-1185 0.000889204017243 0.000213734533768 -0.000159361685976
-1186 -0.00113653581895 -0.00110597769335 -0.00160230093094
-1187 0.000125330370052 -0.00042457957946 -0.00114301822547
-1188 0.000373491676022 -0.0001966981723 -9.11364246054e-06
-1189 0.000467088723168 0.000204702919927 -6.46810730925e-05
-1190 0.000832351963849 0.00033632228673 0.000178244069728
-1191 -0.00107013631454 0.00101772040062 0.000637526775202
-1192 -0.000821975008574 0.00124560180778 -0.00139292310919
-1193 0.000829298737121 -0.000349587846409 -0.000170038851819
-1194 0.000655344749016 -0.00013073805309 0.00105854634407
-1195 -0.00124714352938 0.000550660060805 0.00151782904955
-1196 0.000313586395899 -0.000760020552477 -1.97908083039e-05
-1197 0.000407183443046 -0.00035861946025 -7.53582389359e-05
-1198 -0.00137344831391 0.00102799405405 -0.000732675822442
-1199 -0.000111582124903 -0.00145496229946 -0.000273393116968
-1200 -0.000108528898176 -0.000769052166318 7.48898045797e-05
-1201 0.000769393456999 -0.000912910226585 -0.000180716017663
-1202 0.000595439468894 -0.000694060433266 0.00104786917823
-1203 -0.0013070488095 -1.26623193716e-05 0.0015071518837
-1204 0.000253681115777 -0.00132334293265 -3.04679741473e-05
-1205 0.000347278162924 -0.000921941840426 -8.60354047792e-05
-1206 -0.00143335359403 0.000464671673872 -0.000743352988285
-1207 -0.000171487405026 0.00114606978777 -0.000284070282811
-1208 -0.000168434178298 -0.00133237454649 6.42126387363e-05
-1209 0 0 0
-1210 0 0 0
-1211 0 0 0
-1212 0 0 0
-1213 0 0 0
-1214 0 0 0
-1215 0 0 0
-1216 0 0 0
-1217 0 0 0
-1218 0 0 0
-1219 0 0 0
-1220 0 0 0
-1221 0 0 0
-1222 0 0 0
-1223 0 0 0
-1224 0 0 0
-1225 -0.000490603168525 0.0013482548879 -0.000675790312835
-1226 0.000277848667682 -0.000176669904579 0.00118440840884
-1227 -0.00100936873647 0.000251912048695 -0.000873825190867
-1228 0.00154276808342 0.00119063834245 -0.00117238043154
-1229 0.000644958235948 -0.00065736747236 0.000697341988048
-1230 -0.000144266626394 -0.00018570151842 0.00127908902172
-1231 -0.00143148403055 0.000242880434854 -0.000779144577983
-1232 -0.00048602497951 -0.000814984017807 0.000200751869343
-1233 -0.000550508448648 0.000784932507725 -0.000686467478678
-1234 0.000217943387559 -0.000739992284755 0.00117373124299
-1235 -0.000295922626076 0.00140161254199 0.000593987722899
-1236 0.00148286280329 0.000627315962277 -0.00118305759738
-1237 0.000585052955826 -0.00122068985254 0.000686664822205
-1238 -0.000204171906516 -0.000749023898596 0.00126841185588
-1239 -0.00149138931067 -0.000320441945323 -0.000789821743827
-1240 -0.000545930259632 -0.00137830639798 0.000190074703499
-1241 0.000408045740993 0.00147660427504 -0.00159738737085
-1242 0.000931389497958 0.000409708208542 -0.000522810310638
-1243 -0.000355827906198 0.000838290161816 0.000583310557056
-1244 -0.000722937474465 0.0013189877296 0.00107037697785
-1245 -1.40695530818e-05 0.0014675726612 -0.00150270675796
-1246 -0.000264077186638 -0.00131234627877 0.00125773469003
-1247 -0.00155129459079 -0.000883764325499 -0.00080049890967
-1248 0.00124595030834 -0.000403066757718 -0.000313432488881
-1249 0.000348140460871 0.000913281894867 -0.00160806453669
-1250 0.000871484217836 -0.000153614171634 -0.000533487476482
-1251 -0.00041573318632 0.000274967781639 0.000572633391213
-1252 -0.000782842754587 0.00075566534942 0.001059699812
-1253 -7.3974833204e-05 0.000904250281027 -0.00151338392381
-1254 -0.00032398246676 0.00128868580845 0.00124705752419
-1255 0.00155315459648 -0.00144708670568 -0.000811176075514
-1256 -0.00120495804866 0.000746633735579 0.00115438042489
-1257 0.000288235180749 0.000349959514691 0.00154561276486
-1258 -0.000500989681593 0.000821625468631 -0.00103699466886
-1259 0.00137614738165 0.0012502074219 6.91261988327e-05
-1260 -0.000842748034709 0.000192342969244 0.00104902264616
-1261 -0.000133880113326 0.00034092790085 -0.00152406108965
-1262 0.000634571722881 -0.00118399689163 0.000336137632021
-1263 -0.000652645681275 -0.000755414938356 0.00144225849972
-1264 -0.00126486332878 0.000183311355403 0.00114370325904
-1265 0.00100168129115 0.00149966000799 -0.000150928788768
-1266 -0.000560894961715 0.000258303088455 -0.0010476718347
-1267 0.00131624210153 0.000686885041728 5.84490329893e-05
-1268 -0.000902653314832 -0.000370979410933 0.00103834548032
-1269 -0.000193785393448 -0.000222394479326 -0.00153473825549
-1270 0.000574666442759 0.00141703519559 0.000325460466178
-1271 -0.000712550961398 -0.00131873731853 0.00143158133387
-1272 -0.00132476860891 -0.000380011024773 0.0011330260932
-1273 0 0 0
-1274 0 0 0
-1275 0 0 0
-1276 0 0 0
-1277 0 0 0
-1278 0 0 0
-1279 0 0 0
-1280 0 0 0
-1281 0 0 0
-1282 0 0 0
-1283 0 0 0
-1284 0 0 0
-1285 0 0 0
-1286 0 0 0
-1287 0 0 0
-1288 0 0 0
-1289 -0.000334368979828 0.00076205638918 0.000885853168165
-1290 -0.00026321488869 0.000522877456521 -0.000264294441878
-1291 -0.000853134547777 -0.000334286450026 0.000687818290133
-1292 0.00100170452704 -0.00127416876385 0.000543271185143
-1293 0.000801192424646 -0.00124356597108 -0.000905368998351
-1294 -0.000685330182766 0.00051384584268 -0.000169613828994
-1295 -0.00127524984185 -0.000343318063867 0.000782498903016
-1296 -0.00102708853588 -0.000115436656707 -0.00124795098137
-1297 -0.00039427425995 0.000198734009004 0.000875176002321
-1298 -0.000323120168813 -4.04449236555e-05 -0.000274971607721
-1299 -0.000913039827899 -0.000897608830203 0.000677141124289
-1300 0.000941799246921 0.00132686332338 0.0005325940193
-1301 0.000741287144524 0.00135746611614 -0.000916046164195
-1302 -0.000745235462888 -4.94765374963e-05 -0.000180290994838
-1303 -0.00133515512197 -0.000906640444043 0.000771821737173
-1304 -0.001086993816 -0.000678759036883 -0.00125862814722
-1305 0.000564279929691 0.000890405776323 -3.57438898485e-05
-1306 0.000390325941586 0.00110925556964 0.00119284130605
-1307 -0.000972945108021 -0.00146093121038 0.000666463958446
-1308 -0.00126400103084 -0.0011458193767 -0.00037832587287
-1309 -0.000631186754905 -0.000831648710992 -0.00141955335657
-1310 -0.00080514074301 -0.000612798917673 -0.000190968160681
-1311 -0.0013950604021 -0.00146996282422 0.000761144571329
-1312 0.000704886751966 0.000296480603382 0.0014022191278
-1313 0.000504374649569 0.000327083396147 -4.64210556919e-05
-1314 0.000330420661464 0.000545933189466 0.0011821641402
-1315 -0.000259498997623 -0.000311230717081 -0.00103007759519
-1316 -0.00132390631096 0.00145521271052 -0.000389003038713
-1317 -0.000691092035027 -0.00139497109117 -0.00143023052242
-1318 -0.000865046023132 -0.00117612129785 -0.000201645326524
-1319 -0.00145496568222 0.001131069263 0.000750467405486
-1320 0.00141833286236 0.00144618109668 -0.000294322425829
-1321 0.000444469369447 -0.00023623898403 -5.70982215353e-05
-1322 -0.00104205323796 0.00152117282973 0.000678656947822
-1323 0.00153238157035 0.000664008923184 -0.00153358478757
-1324 -0.00138381159108 0.000891890330344 -0.000399680204556
-1325 2.23540753716e-05 -0.00024527059787 3.75823913484e-05
-1326 9.35081665088e-05 -0.00048444953053 -0.00111256521869
-1327 -0.000496411492578 -0.00134161343708 -0.000160452486684
-1328 0.00135842758224 0.000882858716503 -0.000304999591673
-1329 0.000384564089325 -0.000799561364206 -6.77753873786e-05
-1330 -0.00110195851809 0.000957850449554 0.000667979781979
-1331 0.00147247629023 0.000100686543007 -0.00154426195341
-1332 -0.0014437168712 0.000328567950167 -0.0004103573704
-1333 -3.75512047506e-05 -0.000808592978047 2.6905225505e-05
-1334 3.36028863867e-05 -0.00104777191071 -0.00112324238454
-1335 -0.0005563167727 0.00125941865015 -0.000171129652527
-1336 0.00129852230212 0.000319536336326 -0.000315676757516
-1337 0 0 0
-1338 0 0 0
-1339 0 0 0
-1340 0 0 0
-1341 0 0 0
-1342 0 0 0
-1343 0 0 0
-1344 0 0 0
-1345 0 0 0
-1346 0 0 0
-1347 0 0 0
-1348 0 0 0
-1349 0 0 0
-1350 0 0 0
-1351 0 0 0
-1352 0 0 0
-1353 -0.0008754325362 0.00146160375028 -0.000562849682551
-1354 -0.000106980699993 -6.33210421999e-05 0.00129734903912
-1355 -0.00139419810415 0.000365260911074 -0.000760884560583
-1356 0.00115793871574 0.00130398720483 -0.00105943980126
-1357 0.000260128868274 -0.000544018609981 0.000810282618332
-1358 -0.00130244738459 0.00137897893788 -8.64604276045e-05
-1359 0.00134804106917 0.000356229297233 -0.000666203947699
-1360 -0.000870854347184 -0.000701635155428 0.000313692499627
-1361 -0.000935337816322 0.000898281370104 -0.000573526848394
-1362 -0.000166885980115 -0.000626643422376 0.00128667187328
-1363 -0.00145410338427 -0.000198061469103 -0.000771561726426
-1364 0.00109803343562 0.000740664824656 -0.0010701169671
-1365 0.000200223588152 -0.00110734099016 0.000799605452489
-1366 -0.00058900127419 -0.000635675036217 0.00138135248616
-1367 0.00128813578905 -0.000207093082944 -0.000676881113543
-1368 -0.000930759627307 -0.0012649575356 0.000303015333784
-1369 2.32163733191e-05 -0.00157440132998 -0.00148444674056
-1370 -0.000226791260237 -0.00118996580255 0.00127599470744
-1371 -0.00151400866439 -0.000761383849279 -0.00078223889227
-1372 -0.00110776684214 0.00143233659198 0.00118331760813
-1373 -0.00117225031128 -0.000132101349892 0.000296098260109
-1374 -0.000648906554312 -0.00119899741639 0.00137067532032
-1375 0.00122823050893 -0.00077041546312 -0.000687558279386
-1376 0.000861120940664 -0.000289717895339 -0.000200491858596
-1377 -3.6688906803e-05 0.00102663075725 -0.00149512390641
-1378 -0.000286696540359 0.00141106628467 0.00126531754159
-1379 -0.000800562553995 0.000388316644018 0.000685574021497
-1380 -0.00116767212226 0.000869014211799 0.00117264044229
-1381 -0.0012321555914 -0.000695423730068 0.000285421094265
-1382 -0.000708811834434 0.00140203467083 0.00135999815448
-1383 0.00116832522881 -0.0013337378433 -0.000698235445229
-1384 0.000801215660542 -0.000853040275515 -0.00021116902444
-1385 -9.65941869252e-05 0.00046330837707 -0.00150580107225
-1386 -0.000885819049267 0.00093497433101 -0.000924054038577
-1387 0.000991318013976 0.00136355628428 0.000182066829117
-1388 -0.00122757740238 0.000305691831623 0.00116196327644
-1389 -0.000518709481 0.000454276763229 -0.00141112045937
-1390 0.000249742355207 -0.00107064802925 0.000449078262306
-1391 -0.00103747504895 -0.000642066075977 -0.0016091553374
-1392 0.000741310380419 -0.00141636265569 -0.000221846190283
-1393 -0.000156499467047 -0.000100014003106 -0.00151647823809
-1394 -0.000945724329389 0.000371651950834 -0.000934731204421
-1395 0.000931412733853 0.000800233904107 0.000171389663274
-1396 -0.00128748268251 -0.000257630548553 0.0011512861106
-1397 -0.000578614761123 -0.000109045616947 -0.00142179762521
-1398 0.000189837075084 0.00153038405797 0.000438401096462
-1399 -0.00109738032907 -0.00120538845615 0.00154452196416
-1400 0.00145475649082 -0.000266662162394 0.00124596672348
-1401 0 0 0
-1402 0 0 0
-1403 0 0 0
-1404 0 0 0
-1405 0 0 0
-1406 0 0 0
-1407 0 0 0
-1408 0 0 0
-1409 0 0 0
-1410 0 0 0
-1411 0 0 0
-1412 0 0 0
-1413 0 0 0
-1414 0 0 0
-1415 0 0 0
-1416 0 0 0
-1417 -0.00141649609257 -0.00100320335602 0.00115280193413
-1418 -0.000648044256365 0.0006362263189 -0.000151353811594
-1419 0.00122909280688 0.00106480827217 0.000954767056101
-1420 0.000616875159369 -0.00116081990147 0.000656211815428
-1421 -0.000280934688098 0.000155528751119 -0.000638420232383
-1422 -0.00107015955044 0.000627194705059 -5.667319871e-05
-1423 0.000806977512803 0.00105577665833 0.00104944766898
-1424 -0.00141191790356 -2.0877943281e-06 -0.00113501035109
-1425 -0.00147640137269 -0.0015665257362 0.00114212476829
-1426 -0.000707949536487 7.29039387235e-05 -0.000162030977437
-1427 0.00116918752676 0.000501485891997 0.000944089890257
-1428 0.000556969879247 0.00144021218576 0.000645534649584
-1429 -0.00034083996822 -0.000407793629057 -0.000649097398227
-1430 -0.00113006483056 6.38723248827e-05 -6.73503645533e-05
-1431 0.000747072232681 0.000492454278156 0.00103877050314
-1432 -0.00147182318368 -0.000565410174504 -0.00114568751693
-1433 -0.000517847183053 -0.000874853968876 0.00023120487612
-1434 -0.000767854816609 -0.000490418441453 -0.00017270814328
-1435 0.00110928224663 -6.18364881793e-05 0.000933412724414
-1436 0.00151552406889 -0.00103247051432 -0.000265385242585
-1437 0.00145104059975 0.000567446011208 -0.00115260459061
-1438 -0.00118997011068 -0.000499450055294 -7.80275303967e-05
-1439 0.000687166952559 -7.08681020201e-05 0.0010280933373
-1440 0.000320057384292 0.000409829465761 0.00151515975809
-1441 -0.000577752463175 -0.00143817634905 0.000220527710276
-1442 -5.44087062105e-05 0.000659282051845 0.00129510477049
-1443 -0.00134162611037 0.00108786400512 -0.000763128829218
-1444 0.00145561878877 0.0015685615729 -0.000276062408429
-1445 -0.00099986775725 -0.00144720796289 0.00031520832316
-1446 -0.00124987539081 -0.00106277243547 -8.87046962401e-05
-1447 0.000627261672436 -0.000634190482196 0.00101741617145
-1448 0.00026015210417 -0.000153492914416 0.00150448259224
-1449 -0.000637657743297 0.00116285573817 0.000209850544433
-1450 -0.00142688260564 -0.00152983277529 0.000791597578106
-1451 0.000450254457604 -0.00110125082202 -0.0012666360216
-1452 0.00139571350864 0.00100523919272 -0.000286739574272
-1453 -0.00105977303737 0.00115382412433 0.000304531157317
-1454 -0.000291321201165 -0.000371100668151 -0.00099962458841
-1455 -0.00157853860532 5.74812851226e-05 0.000106496279285
-1456 0.000973598214568 0.000996207578882 -0.000192058961388
-1457 -0.000697563023419 0.000599533357994 0.00019917337859
-1458 -0.00148678788576 0.00107119931193 0.000780920412263
-1459 0.000390349177481 0.00149978126521 -0.00127731318744
-1460 0.00133580822852 0.000441916812546 -0.000297416740115
-1461 -0.00111967831749 0.000590501744153 0.000293853991473
-1462 -0.000351226481288 -0.000934423048327 -0.00101030175425
-1463 0.00152591058196 -0.000505841095054 9.58191134412e-05
-1464 0.000913692934446 0.000432885198705 -0.000202736127232
-1465 0 0 0
-1466 0 0 0
-1467 0 0 0
-1468 0 0 0
-1469 0 0 0
-1470 0 0 0
-1471 0 0 0
-1472 0 0 0
-1473 0 0 0
-1474 0 0 0
-1475 0 0 0
-1476 0 0 0
-1477 0 0 0
-1478 0 0 0
-1479 0 0 0
-1480 0 0 0
-1481 0.000591523944219 -5.08398342986e-05 -0.000942739078803
-1482 -0.00118910781274 0.00133577368 -0.00160005666231
-1483 7.27583762692e-05 -0.0011471826735 -0.00114077395684
-1484 7.58116029969e-05 -0.000461272540367 -0.000792491035288
-1485 -0.00143726911871 0.00110789227284 0.00043039322208
-1486 0.00155313136059 0.00132674206616 -0.00150537604943
-1487 -0.000349356917806 -0.00115621428735 -0.00104609334395
-1488 0.00121137300747 0.000697459566772 0.000580641265595
-1489 0.000531618664096 -0.000614162214475 -0.000953416244647
-1490 -0.00124901309286 0.000772451299823 -0.00161073382815
-1491 1.28530961471e-05 0.00145384941372 -0.00115145112268
-1492 1.59063228747e-05 -0.00102459492054 -0.000803168201131
-1493 -0.00149717439883 0.000544569892663 0.000419716056236
-1494 0.00149322608046 0.000763419685982 -0.00151605321527
-1495 -0.000409262197928 0.00144481779988 -0.0010567705098
-1496 0.00115146772735 0.000134137186595 0.000569964099752
-1497 0.00149017285374 7.75095528442e-05 0.00130001833058
-1498 -0.00130891837298 0.000209128919647 0.0015429434734
-1499 0.000726299206546 -0.000560804560384 0.000316361791088
-1500 0.000974460512516 -0.000332923153224 0.0014502663741
-1501 0.000294706169141 0.00151980953293 -8.37911361437e-05
-1502 0.00143332080034 0.000200097305806 -0.00152673038111
-1503 -0.00046916747805 0.000881495419701 -0.00106744767564
-1504 -0.00022100617208 0.00110937682686 6.64569073719e-05
-1505 0.00143026757362 -0.000485812827332 0.00128934116474
-1506 -0.000595472262582 0.00135882941294 -0.000153598080229
-1507 0.000666393926423 -0.00112412694056 0.000305684625245
-1508 0.000914555232394 -0.0008962455334 0.00143958920825
-1509 0.00100815227954 -0.000494844441173 0.00138402177762
-1510 0.00137341552022 -0.00036322507437 -0.00153740754696
-1511 -0.000529072758172 0.000318173039524 -0.00107812484148
-1512 -0.000280911452202 0.000546054446684 5.57797415285e-05
-1513 0.00137036229349 -0.00104913520751 0.0012786639989
-1514 0.00119640830539 -0.000830285414189 -0.000657105272609
-1515 -0.000706079973005 -0.000148887300295 -0.000197822567135
-1516 0.000854649952271 -0.00145956791358 0.00142891204241
-1517 0.000948246999418 -0.00105816682135 0.00137334461178
-1518 -0.000832384757537 0.000328446692949 0.000716027028274
-1519 0.000429481431469 0.00100984480684 0.00117530973375
-1520 0.000432534658196 -0.00146859952742 0.0015235926553
-1521 0.00131045701337 0.00155189687971 0.00126798683305
-1522 0.00113650302527 -0.00139360779437 -0.000667782438453
-1523 -0.000765985253127 -0.000712209680471 -0.000208499732979
-1524 0.000794744672149 0.00114146417365 0.00141823487657
-1525 0.000888341719296 0.00154286526587 0.00136266744594
-1526 -0.00089229003766 -0.000234875687227 0.00070534986243
-1527 0.000369576151346 0.000446522426667 0.0011646325679
-1528 0.000372629378074 0.00113243255981 0.00151291548945
-1529 0 0 0
-1530 0 0 0
-1531 0 0 0
-1532 0 0 0
-1533 0 0 0
-1534 0 0 0
-1535 0 0 0
-1536 0 0 0
-1537 0 0 0
-1538 0 0 0
-1539 0 0 0
-1540 0 0 0
-1541 0 0 0
-1542 0 0 0
-1543 0 0 0
-1544 0 0 0
-1545 0.000796614235631 0.000919672934627 0.00138244328687
-1546 -0.000984017521324 -0.000858068018473 0.000725125703364
-1547 0.000277848667682 -0.000176669904579 0.00118440840884
-1548 0.000280901894409 0.000509240228559 0.00153269133039
-1549 -0.00123217882729 -0.00108594942563 -0.000408778879646
-1550 -0.0014061328154 -0.000867099632314 0.000819806316247
-1551 -0.000144266626394 -0.00018570151842 0.00127908902172
-1552 0.00141646329888 -0.0014963821317 -0.000258530836131
-1553 0.000736708955509 0.000356350554451 0.00137176612103
-1554 -0.00104392280145 -0.00142139039865 0.00071444853752
-1555 0.000217943387559 -0.000739992284755 0.00117373124299
-1556 0.000220996614287 -5.4082151617e-05 0.00152201416454
-1557 -0.00129208410742 0.00151508266159 -0.00041945604549
-1558 -0.00146603809552 -0.00143042201249 0.000809129150404
-1559 -0.000204171906516 -0.000749023898596 0.00126841185588
-1560 0.00135655801876 0.00110464995552 -0.000269208001974
-1561 -0.00146909132225 0.00104802232177 0.000460846228857
-1562 -0.00110382808157 0.00117964168857 0.000703771371677
-1563 0.000931389497958 0.000409708208542 -0.000522810310638
-1564 0.00117955080393 0.000637589615702 0.000611094272372
-1565 0.000499796460554 -0.000674032165544 -0.00092296323787
-1566 -0.00152594337564 0.00117061007473 0.000798451984561
-1567 -0.000264077186638 -0.00131234627877 0.00125773469003
-1568 -1.59158806679e-05 -0.00108446487161 -0.000772715194354
-1569 -0.00152899660237 0.000484699941594 0.000450169063013
-1570 -0.00039038197117 -0.000835012285528 -0.000992770181955
-1571 0.000871484217836 -0.000153614171634 -0.000533487476482
-1572 0.00111964552381 7.42672355258e-05 0.000600417106529
-1573 0.00121324257095 0.000475668327753 0.000544849675897
-1574 -0.00158584865577 0.000607287694556 0.000787774818717
-1575 -0.00032398246676 0.00128868580845 0.00124705752419
-1576 -7.58211607901e-05 0.00151656721561 -0.000783392360198
-1577 -0.00158890188249 -7.86224385825e-05 0.00043949189717
-1578 0.0014014985968 0.000140227354737 -0.00149627737434
-1579 -0.000500989681593 0.000821625468631 -0.00103699466886
-1580 0.00105974024368 -0.000489055144651 0.000589739940685
-1581 0.00115333729083 -8.76540524233e-05 0.000534172510053
-1582 -0.000627294466125 0.00129895946187 -0.000123145073452
-1583 0.000634571722881 -0.00118399689163 0.000336137632021
-1584 0.000637624949608 -0.000498086758491 0.000684420553569
-1585 0.00151554730478 -0.000641944818759 0.000428814731326
-1586 0.00134159331668 -0.00042309502544 -0.00150695454018
-1587 -0.000560894961715 0.000258303088455 -0.0010476718347
-1588 0.000999834963562 -0.00105237752483 0.000579062774842
-1589 0.00109343201071 -0.0006509764326 0.00052349534421
-1590 -0.000687199746247 0.000735637081699 -0.000133822239296
-1591 0.000574666442759 0.00141703519559 0.000325460466178
-1592 0.000577719669486 -0.00106140913867 0.000673743387726
-1593 0 0 0
-1594 0 0 0
-1595 0 0 0
-1596 0 0 0
-1597 0 0 0
-1598 0 0 0
-1599 0 0 0
-1600 0 0 0
-1601 0 0 0
-1602 0 0 0
-1603 0 0 0
-1604 0 0 0
-1605 0 0 0
-1606 0 0 0
-1607 0 0 0
-1608 0 0 0
-1609 0.000255550679259 -0.00154513417167 -6.62595638458e-05
-1610 0.00102400251547 9.42955032473e-05 -0.00137041530957
-1611 -0.00026321488869 0.000522877456521 -0.000264294441878
-1612 -0.0008754325362 0.00146160375028 -0.000562849682551
-1613 0.00139111208373 -0.000386402064533 0.00130687273704
-1614 0.000601887221391 8.52638894065e-05 -0.00127573469669
-1615 -0.000685330182766 0.00051384584268 -0.000169613828994
-1616 0.000260128868274 -0.000544018609981 0.000810282618332
-1617 0.000195645399137 0.00105589791555 -7.69367296892e-05
-1618 0.000964097235344 -0.000469026876929 -0.00138109247542
-1619 -0.000323120168813 -4.04449236555e-05 -0.000274971607721
-1620 -0.000935337816322 0.000898281370104 -0.000573526848394
-1621 0.00133120680361 -0.00094972444471 0.00129619557119
-1622 0.000541981941268 -0.00047805849077 -0.00128641186253
-1623 -0.000745235462888 -4.94765374963e-05 -0.000180290994838
-1624 0.000200223588152 -0.00110734099016 0.000799605452489
-1625 0.00115419958878 -0.00141678478453 -0.000987856621859
-1626 0.000904191955221 -0.00103234925711 -0.00139176964126
-1627 0.000390325941586 0.00110925556964 0.00119284130605
-1628 2.32163733191e-05 -0.00157440132998 -0.00148444674056
-1629 0.000732084294702 -0.00142581639837 -0.000893176008975
-1630 0.000482076661146 -0.00104138087095 -0.00129708902838
-1631 -0.00080514074301 -0.000612798917673 -0.000190968160681
-1632 -0.00117225031128 -0.000132101349892 0.000296098260109
-1633 0.00109429430866 0.00118424730269 -0.000998533787702
-1634 -0.00154671640178 0.000117351236192 7.60432725077e-05
-1635 0.000330420661464 0.000545933189466 0.0011821641402
-1636 -3.6688906803e-05 0.00102663075725 -0.00149512390641
-1637 0.00067217901458 0.00117521568885 -0.000903853174819
-1638 0.000422171381024 0.00155965121628 -0.00130776619422
-1639 -0.000865046023132 -0.00117612129785 -0.000201645326524
-1640 -0.0012321555914 -0.000695423730068 0.000285421094265
-1641 0.00103438902853 0.000620924922517 -0.00100921095355
-1642 0.000245164166191 0.00109259087646 -0.000427463919872
-1643 -0.00104205323796 0.00152117282973 0.000678656947822
-1644 -9.65941869252e-05 0.00046330837707 -0.00150580107225
-1645 0.000612273734458 0.000611893308677 -0.000914530340662
-1646 0.00138072557067 -0.000913031483803 0.000945668381011
-1647 9.35081665088e-05 -0.00048444953053 -0.00111256521869
-1648 -0.000518709481 0.000454276763229 -0.00141112045937
-1649 0.000974483748411 5.7602542341e-05 -0.00101988811939
-1650 0.000185258886069 0.000529268496281 -0.000438141085716
-1651 -0.00110195851809 0.000957850449554 0.000667979781979
-1652 -0.000156499467047 -0.000100014003106 -0.00151647823809
-1653 0.000552368454336 4.85709285002e-05 -0.000925207506505
-1654 0.00132082029054 -0.00147635386398 0.000934991215167
-1655 3.36028863867e-05 -0.00104777191071 -0.00112324238454
-1656 -0.000578614761123 -0.000109045616947 -0.00142179762521
-1657 0 0 0
-1658 0 0 0
-1659 0 0 0
-1660 0 0 0
-1661 0 0 0
-1662 0 0 0
-1663 0 0 0
-1664 0 0 0
-1665 0 0 0
-1666 0 0 0
-1667 0 0 0
-1668 0 0 0
-1669 0 0 0
-1670 0 0 0
-1671 0 0 0
-1672 0 0 0
-1673 0.000411784867957 0.00103302179701 0.00149538391715
-1674 0.000482938959094 0.000793842864347 0.000345236307111
-1675 -0.000106980699993 -6.33210421999e-05 0.00129734903912
-1676 -0.00141649609257 -0.00100320335602 0.00115280193413
-1677 0.00154734627243 -0.000972600563254 -0.000295838249362
-1678 6.08236650186e-05 0.000784811250506 0.000439916919995
-1679 -0.00130244738459 0.00137897893788 -8.64604276045e-05
-1680 -0.000280934688098 0.000155528751119 -0.000638420232383
-1681 0.000351879587834 0.00046969941683 0.00148470675131
-1682 0.000423033678972 0.000230520484171 0.000334559141268
-1683 -0.000166885980115 -0.000626643422376 0.00128667187328
-1684 -0.00147640137269 -0.0015665257362 0.00114212476829
-1685 0.00148744099231 -0.00153592294343 -0.000306515415206
-1686 9.18384896451e-07 0.00022148887033 0.000429239754152
-1687 -0.00058900127419 -0.000635675036217 0.00138135248616
-1688 -0.00034083996822 -0.000407793629057 -0.000649097398227
-1689 0.00131043377748 0.00116137118415 0.000573786859141
-1690 0.00113647978937 0.00138022097747 -0.00136198241236
-1691 -0.000226791260237 -0.00118996580255 0.00127599470744
-1692 -0.000517847183053 -0.000874853968876 0.00023120487612
-1693 0.000114967092879 -0.000560683303165 -0.000810022607586
-1694 -5.89868952257e-05 -0.000341833509846 0.000418562588308
-1695 -0.000648906554312 -0.00119899741639 0.00137067532032
-1696 0.00145104059975 0.000567446011208 -0.00115260459061
-1697 0.00125052849735 0.000598048803973 0.000563109693297
-1698 0.00107657450925 0.000816898597292 -0.00137265957821
-1699 -0.000286696540359 0.00141106628467 0.00126531754159
-1700 -0.000577752463175 -0.00143817634905 0.000220527710276
-1701 5.50618127573e-05 -0.00112400568334 -0.000820699773429
-1702 -0.000118892175348 -0.000905155890023 0.000407885422465
-1703 -0.000708811834434 0.00140203467083 0.00135999815448
-1704 -0.00099986775725 -0.00144720796289 0.00031520832316
-1705 0.00119062321723 3.47264237966e-05 0.000552432527454
-1706 -0.000295899390181 -0.00137221622984 0.00128818769681
-1707 -0.000885819049267 0.00093497433101 -0.000924054038577
-1708 -0.000637657743297 0.00116285573817 0.000209850544433
-1709 0.000768507923156 2.56948099558e-05 0.000647113140338
-1710 0.000839662014293 -0.000213484122704 -0.000503034469705
-1711 0.000249742355207 -0.00107064802925 0.000449078262306
-1712 -0.00105977303737 0.00115382412433 0.000304531157317
-1713 0.00113071793711 -0.00052859595638 0.000541755361611
-1714 -0.000355804670303 0.00122881585738 0.00127751053097
-1715 -0.000945724329389 0.000371651950834 -0.000934731204421
-1716 -0.000697563023419 0.000599533357994 0.00019917337859
-1717 0.000708602643034 -0.000537627570221 0.000636435974494
-1718 0.000779756734171 -0.00077680650288 -0.000513711635548
-1719 0.000189837075084 0.00153038405797 0.000438401096462
-1720 -0.00111967831749 0.000590501744153 0.000293853991473
-1721 0 0 0
-1722 0 0 0
-1723 0 0 0
-1724 0 0 0
-1725 0 0 0
-1726 0 0 0
-1727 0 0 0
-1728 0 0 0
-1729 0 0 0
-1730 0 0 0
-1731 0 0 0
-1732 0 0 0
-1733 0 0 0
-1734 0 0 0
-1735 0 0 0
-1736 0 0 0
-1737 -0.000129278688415 -0.00143178530929 4.66810664384e-05
-1738 0.000639173147792 0.000207644365626 -0.00125747467929
-1739 -0.000648044256365 0.0006362263189 -0.000151353811594
-1740 -0.00126026190387 -0.00158940185474 -0.000449909052267
-1741 0.00100628271606 -0.000273053202154 0.00141981336732
-1742 -0.000556293536804 -0.00151441012169 0.000523070321385
-1743 -0.00107015955044 0.000627194705059 -5.667319871e-05
-1744 -0.0001247004994 -0.000430669747602 0.000923223248616
-1745 -0.000189183968538 0.00116924677793 3.60039005951e-05
-1746 0.000579267867669 -0.00035567801455 -0.00126815184513
-1747 -0.000707949536487 7.29039387235e-05 -0.000162030977437
-1748 -0.001320167184 0.00101163023248 -0.00046058621811
-1749 0.000946377435936 -0.000836375582331 0.00140913620148
-1750 0.000157152573594 -0.000364709628391 -0.00117347123225
-1751 -0.00113006483056 6.38723248827e-05 -6.73503645533e-05
-1752 -0.000184605779522 -0.000993992127778 0.000912546082773
-1753 0.000769370221103 -0.00130343592215 -0.000874915991575
-1754 0.000519362587547 -0.000919000394726 -0.00127882901097
-1755 -0.000767854816609 -0.000490418441453 -0.00017270814328
-1756 -0.000361612994355 -0.0014610524676 -0.00137150611028
-1757 -0.000426096463493 0.000138864057934 0.000905629009098
-1758 9.7247293472e-05 -0.000928032008567 -0.00118414839809
-1759 -0.00118997011068 -0.000499450055294 -7.80275303967e-05
-1760 -0.00155707967895 -1.87524875129e-05 0.000409038890393
-1761 0.000709464940981 0.00129759616507 -0.000885593157418
-1762 0.000459457307425 -0.0014823227749 -0.00128950617682
-1763 -5.44087062105e-05 0.000659282051845 0.00129510477049
-1764 -0.000421518274477 0.00113997961963 -0.00138218327612
-1765 -0.000486001743615 -0.000424458322242 0.000894951843255
-1766 3.73420133499e-05 -0.00149135438874 -0.00119482556393
-1767 -0.00124987539081 -0.00106277243547 -8.87046962401e-05
-1768 0.00154736950833 -0.000582074867689 0.00039836172455
-1769 0.000649559660859 0.000734273784896 -0.000896270323261
-1770 -0.000139665201483 0.00120593973884 -0.000314523289588
-1771 -0.00142688260564 -0.00152983277529 0.000791597578106
-1772 -0.000481423554599 0.000576657239449 -0.00139286044197
-1773 0.000227444366784 0.000725242171056 -0.000801589710378
-1774 0.000995896202991 -0.000799682621424 0.00105860901129
-1775 -0.000291321201165 -0.000371100668151 -0.00099962458841
-1776 0.0014874642282 -0.00114539724787 0.000387684558706
-1777 0.000589654380737 0.00017095140472 -0.000906947489105
-1778 -0.000199570481605 0.00064261735866 -0.000325200455431
-1779 -0.00148678788576 0.00107119931193 0.000780920412263
-1780 -0.000541328834722 1.33348592728e-05 -0.00140353760781
-1781 0.000167539086662 0.000161919790879 -0.000812266876221
-1782 0.000935990922869 -0.0013630050016 0.00104793184545
-1783 -0.000351226481288 -0.000934423048327 -0.00101030175425
-1784 -0.000963444128797 4.30324543198e-06 -0.00130885699493
-1785 0 0 0
-1786 0 0 0
-1787 0 0 0
-1788 0 0 0
-1789 0 0 0
-1790 0 0 0
-1791 0 0 0
-1792 0 0 0
-1793 0 0 0
-1794 0 0 0
-1795 0 0 0
-1796 0 0 0
-1797 0 0 0
-1798 0 0 0
-1799 0 0 0
-1800 0 0 0
-1801 -0.000670342244787 -0.000732237948193 -0.00140202178428
-1802 9.81095914196e-05 0.000907191726726 0.000458176937396
-1803 -0.00118910781274 0.00133577368 -0.00160005666231
-1804 0.00136302900715 -0.00088985449364 0.00126574256442
-1805 0.000465219159686 0.000426494158945 -2.8889483394e-05
-1806 -0.00109735709318 -0.000814862760589 -0.000925632529331
-1807 0.00155313136059 0.00132674206616 -0.00150537604943
-1808 -0.000665764055772 0.000268877613498 -0.000525479602099
-1809 -0.00073024752491 -0.00129556032837 -0.00141269895012
-1810 3.82043112974e-05 0.00034386934655 0.000447499771552
-1811 -0.00124901309286 0.000772451299823 -0.00161073382815
-1812 0.00130312372703 -0.00145317687382 0.00125506539857
-1813 0.000405313879564 -0.000136828221231 -3.95666492374e-05
-1814 -0.000383910982778 0.000334837732709 0.000542180384436
-1815 0.00149322608046 0.000763419685982 -0.00151605321527
-1816 -0.000725669335894 -0.000294444766678 -0.000536156767942
-1817 0.000228306664731 -0.00060388856105 0.000840735625109
-1818 -2.17009688247e-05 -0.000219453033627 0.000436822605709
-1819 -0.00130891837298 0.000209128919647 0.0015429434734
-1820 -0.000902676550727 -0.000761505106497 0.000344145506404
-1821 -0.000967160019864 0.000838411419034 -0.000543073841617
-1822 -0.0004438162629 -0.000228484647467 0.000531503218593
-1823 0.00143332080034 0.000200097305806 -0.00152673038111
-1824 0.00106621123208 0.000680794873587 -0.00103966396032
-1825 0.000168401384609 -0.00116721094123 0.000830058459266
-1826 -8.16062489469e-05 -0.000782775413803 0.000426145439866
-1827 -0.000595472262582 0.00135882941294 -0.000153598080229
-1828 -0.000962581830849 -0.00132482748667 0.000333468340561
-1829 -0.00102706529999 0.000275089038858 -0.000553751007461
-1830 -0.000503721543022 -0.000791807027644 0.000520826052749
-1831 0.00137341552022 -0.00036322507437 -0.00153740754696
-1832 0.00100630595195 0.000117472493411 -0.00105034112617
-1833 0.000108496104487 0.001433821146 0.000819381293422
-1834 -0.000680728757855 -0.00125886736746 0.0014011283271
-1835 0.00119640830539 -0.000830285414189 -0.000657105272609
-1836 -0.00102248711097 0.00127620460055 0.000322791174717
-1837 -0.000313619189588 0.00142478953216 0.000914061906306
-1838 0.000454832646619 -0.000100135260325 -0.000390093839421
-1839 -0.000832384757537 0.000328446692949 0.000716027028274
-1840 0.000946400671832 -0.000445849886766 -0.00106101829201
-1841 4.8590824365e-05 0.00087049876582 0.000808704127579
-1842 -0.000740634037977 0.00134216471976 0.00139045116125
-1843 0.00113650302527 -0.00139360779437 -0.000667782438453
-1844 -0.00108239239109 0.000712882220373 0.000312114008874
-1845 -0.00037352446971 0.000861467151979 0.000903384740462
-1846 0.000394927366497 -0.000663457640501 -0.000400771005264
-1847 -0.00089229003766 -0.000234875687227 0.00070534986243
-1848 -0.00150450768517 0.000703850606532 0.000406794621757
-1849 0 0 0
-1850 0 0 0
-1851 0 0 0
-1852 0 0 0
-1853 0 0 0
-1854 0 0 0
-1855 0 0 0
-1856 0 0 0
-1857 0 0 0
-1858 0 0 0
-1859 0 0 0
-1860 0 0 0
-1861 0 0 0
-1862 0 0 0
-1863 0 0 0
-1864 0 0 0
-1865 0.001337677792 0.000220125573528 -0.000333208329814
-1866 -0.000442953964952 -0.00155761537957 -0.00099052591332
-1867 0.000818912224053 -0.000876217265679 -0.000531243207846
-1868 0.000821965450781 -0.00019030713254 -0.000182960286298
-1869 -0.000691115270922 0.00137885768067 0.00103992397107
-1870 -0.000865069259028 -0.00156664699341 -0.000895845300436
-1871 0.000396796929978 -0.00088524887952 -0.000436562594962
-1872 -0.00120682761214 0.000968424974598 0.00119017201458
-1873 0.00127777251188 -0.000343196806649 -0.000343885495657
-1874 -0.000502859245075 0.00104341670765 -0.00100120307916
-1875 0.000759006943931 -0.00143953964586 -0.000541920373689
-1876 0.000762060170659 -0.000753629512717 -0.000193637452142
-1877 -0.000751020551045 0.00081553530049 0.00102924680523
-1878 -0.00092497453915 0.00103438509381 -0.000906522466279
-1879 0.000336891649856 -0.0014485712597 -0.000447239760806
-1880 -0.00126673289227 0.000405102594422 0.00117949484874
-1881 -0.000928027765877 0.00034847496067 -0.00125480538783
-1882 -0.000562764525197 0.000480094327473 -0.00101188024501
-1883 0.000699101663809 0.00116149244137 -0.000552597539533
-1884 -0.0014437401071 -6.19577453977e-05 -0.00110455734431
-1885 0.00104086001693 -0.00137357952664 0.000525739612846
-1886 -0.000984879819272 0.000471062713632 -0.000917199632123
-1887 0.000276986369734 0.00115246082753 -0.000457916926649
-1888 0.000525147675704 0.00138034223469 0.000675987656361
-1889 -0.000987933046 -0.000214847419506 -0.00126548255367
-1890 0.000150681585202 -0.00153455964663 0.00045593266876
-1891 0.00141254777421 -0.000853161532734 0.000915215374234
-1892 -0.00150364538722 -0.000625280125574 -0.00111523451015
-1893 -0.00141004834007 -0.000223879033347 -0.00117080194079
-1894 -0.00104478509939 -9.22596665439e-05 -0.000927876797966
-1895 0.000217081089612 0.00058913844735 -0.000468594092493
-1896 0.000465242395582 0.00081701985451 0.000665310490518
-1897 -0.00104783832612 -0.000778169799682 -0.00127615971951
-1898 -0.00122179231423 -0.000559320006363 -4.75745236199e-05
-1899 4.0073874779e-05 0.000122078107531 0.000411708181854
-1900 -0.00156355066734 -0.00118860250575 -0.001125911676
-1901 -0.0014699536202 -0.000787201413523 -0.00118147910663
-1902 -8.62309097531e-05 0.000599412100775 0.00132555777726
-1903 0.00117563527925 0.00128081021467 -0.00137951398466
-1904 0.00117868850598 -0.00119763411959 -0.00103123106311
-1905 -0.00110774360624 -0.00134149217986 -0.00128683688536
-1906 -0.00128169759435 -0.00112264238654 -5.82516894633e-05
-1907 -1.98314053431e-05 -0.000441244272645 0.00040103101601
-1908 0.00154089851993 0.00141242958147 -0.00113658884184
-1909 -0.00152985890032 -0.0013505237937 -0.00119215627247
-1910 -0.000146136189875 3.60897205988e-05 0.00131488061142
-1911 0.00111572999913 0.000717487834493 -0.00139019115051
-1912 0.00111878322586 0.00140339796763 -0.00104190822896
-1913 0 0 0
-1914 0 0 0
-1915 0 0 0
-1916 0 0 0
-1917 0 0 0
-1918 0 0 0
-1919 0 0 0
-1920 0 0 0
-1921 0 0 0
-1922 0 0 0
-1923 0 0 0
-1924 0 0 0
-1925 0 0 0
-1926 0 0 0
-1927 0 0 0
-1928 0 0 0
-1929 0.00154276808342 0.00119063834245 -0.00117238043154
-1930 -0.00023786367354 -0.000587102610647 0.00133465645235
-1931 0.00048478528668 0.000181525929764 -0.000384755256499
-1932 -0.000285512877113 -0.000845586810572 -0.00151496241456
-1933 -0.00048602497951 -0.000814984017807 0.000200751869343
-1934 -0.000659978967615 -0.000596134224488 0.00142933706524
-1935 -0.000710681397916 -0.00154052855755 0.00139578974417
-1936 0.000850048527361 0.000313145296566 -0.000141830113678
-1937 0.00148286280329 0.000627315962277 -0.00118305759738
-1938 -0.000297768953662 -0.00115042499082 0.00132397928651
-1939 0.000424880006558 -0.000381796450413 -0.000395432422342
-1940 -0.000345418157235 -0.00140890919075 -0.0015256395804
-1941 -0.000545930259632 -0.00137830639798 0.000190074703499
-1942 -0.000719884247737 -0.00115945660466 0.00141865989939
-1943 -0.000770586678038 0.00106050352967 0.00138511257833
-1944 0.000790143247238 -0.00025017708361 -0.000152507279522
-1945 -0.000722937474465 0.0013189877296 0.00107037697785
-1946 -0.000357674233784 0.0014506070964 0.00131330212067
-1947 0.000364974726436 -0.000945118830589 -0.000406109588186
-1948 0.000613136032406 -0.000717237423429 0.000727794994825
-1949 0.00124595030834 -0.000403066757718 -0.000313432488881
-1950 -0.00077978952786 0.00144157548256 0.00140798273355
-1951 -0.00083049195816 0.000497181149495 0.00137443541249
-1952 0.00019102073833 -0.00072626903727 0.000822475607708
-1953 -0.000782842754587 0.00075566534942 0.001059699812
-1954 0.000355771876614 -0.000564046877702 -0.000383239432966
-1955 0.000305069446313 -0.00150844121077 -0.000416786754029
-1956 0.000553230752284 -0.00128055980361 0.000717117828981
-1957 -0.00120495804866 0.000746633735579 0.00115438042489
-1958 -0.000839694807982 0.000878253102382 0.00139730556771
-1959 -0.000890397238282 -6.61412306811e-05 0.00136375824664
-1960 0.000131115458208 -0.00128959141745 0.000811798441865
-1961 -0.000842748034709 0.000192342969244 0.00104902264616
-1962 -0.00101670202281 0.000411192762563 -0.000886746625346
-1963 -0.00106740445312 -0.0005332015705 -0.000920293946409
-1964 0.000493325472161 0.00132047228362 0.000706440663138
-1965 -0.00126486332878 0.000183311355403 0.00114370325904
-1966 0.000118859381659 0.0015699248697 0.000486385675537
-1967 6.81569513585e-05 0.000625530536638 0.000452838354474
-1968 7.12101780861e-05 0.00131144066978 0.000801121276022
-1969 -0.000902653314832 -0.000370979410933 0.00103834548032
-1970 -0.00107660730294 -0.000152129617613 -0.000897423791189
-1971 -0.000353958342717 0.000616498922797 0.000547518967358
-1972 0.00120677158256 -0.000694181690484 -0.000990100890494
-1973 -0.00132476860891 -0.000380011024773 0.0011330260932
-1974 5.8954101537e-05 0.00100660248952 0.000475708509694
-1975 8.25167123635e-06 6.22081564616e-05 0.000442161188631
-1976 1.1304897964e-05 0.0007481182896 0.000790444110178
-1977 0 0 0
-1978 0 0 0
-1979 0 0 0
-1980 0 0 0
-1981 0 0 0
-1982 0 0 0
-1983 0 0 0
-1984 0 0 0
-1985 0 0 0
-1986 0 0 0
-1987 0 0 0
-1988 0 0 0
-1989 0 0 0
-1990 0 0 0
-1991 0 0 0
-1992 0 0 0
-1993 0.00100170452704 -0.00127416876385 0.000543271185143
-1994 -0.00139419810415 0.000365260911074 -0.000760884560583
-1995 -5.6278269692e-05 0.000881073290863 0.00133089636018
-1996 -0.00144184730772 0.000106776711149 -0.000446148960098
-1997 -0.00102708853588 -0.000115436656707 -0.00124795098137
-1998 0.00134804106917 0.000356229297233 -0.000666203947699
-1999 -0.00125174495429 -0.000840981196451 -5.29131065416e-05
-2000 -0.000306285903248 0.00126550881829 0.000926983340785
-2001 0.000941799246921 0.00132686332338 0.0005325940193
-2002 -0.00145410338427 -0.000198061469103 -0.000771561726426
-2003 -0.000116183549814 0.000317750910687 0.00132021919434
-2004 -0.00150175258784 -0.000456545669028 -0.000456826125942
-2005 -0.001086993816 -0.000678759036883 -0.00125862814722
-2006 0.00128813578905 -0.000207093082944 -0.000676881113543
-2007 -0.00131165023441 -0.00140430357663 -6.3590272385e-05
-2008 -0.00036619118337 0.000702186438111 0.000916306174941
-2009 -0.00126400103084 -0.0011458193767 -0.00037832587287
-2010 -0.00151400866439 -0.000761383849279 -0.00078223889227
-2011 -0.000176088829936 -0.000245571469489 0.0013095420285
-2012 -0.000543198398203 0.000235126098291 -0.00136774601811
-2013 0.000704886751966 0.000296480603382 0.0014022191278
-2014 0.00122823050893 -0.00077041546312 -0.000687558279386
-2015 -0.00137155551453 0.00119672851059 -7.42674382283e-05
-2016 -0.000965313692278 0.000226094484451 -0.00127306540523
-2017 -0.00132390631096 0.00145521271052 -0.000389003038713
-2018 -0.000800562553995 0.000388316644018 0.000685574021497
-2019 -0.000235994110059 -0.000808893849666 0.00129886486265
-2020 -0.000603103678325 -0.000328196281885 -0.00137842318395
-2021 0.00141833286236 0.00144618109668 -0.000294322425829
-2022 0.00116832522881 -0.0013337378433 -0.000698235445229
-2023 -0.00143146079465 0.000633406130419 -8.49446040717e-05
-2024 -0.0010252189724 -0.000337227895726 -0.00128374257107
-2025 -0.00138381159108 0.000891890330344 -0.000399680204556
-2026 0.000991318013976 0.00136355628428 0.000182066829117
-2027 0.00155588645791 0.000166345790599 0.000795357670275
-2028 -0.000663008958447 -0.000891518662061 -0.0013891003498
-2029 0.00135842758224 0.000882858716503 -0.000304999591673
-2030 -0.00103747504895 -0.000642066075977 -0.0016091553374
-2031 -0.000472906605013 0.00132507789774 -0.000995864496241
-2032 -0.00108512425252 -0.000900550275902 -0.00129441973691
-2033 -0.0014437168712 0.000328567950167 -0.0004103573704
-2034 0.000931412733853 0.000800233904107 0.000171389663274
-2035 -0.000895021899089 0.0013160462839 -0.000901183883358
-2036 5.04371519511e-05 0.000258181831236 7.87125639686e-05
-2037 0.00129852230212 0.000319536336326 -0.000315676757516
-2038 -0.00109738032907 -0.00120538845615 0.00154452196416
-2039 -0.000532811885136 0.000761755517561 -0.00100654166208
-2040 -0.00114502953264 -0.00146387265608 -0.00130509690276
-2041 0 0 0
-2042 0 0 0
-2043 0 0 0
-2044 0 0 0
-2045 0 0 0
-2046 0 0 0
-2047 0 0 0
-2048 0 0 0
-2049 0 0 0
-2050 0 0 0
-2051 0 0 0
-2052 0 0 0
-2053 0 0 0
-2054 0 0 0
-2055 0 0 0
-2056 0 0 0
-2057 0.00115793871574 0.00130398720483 -0.00105943980126
-2058 0.00122909280688 0.00106480827217 0.000954767056101
-2059 -0.000673395471515 -0.00141814808133 0.00141404976157
-2060 0.00118144360331 0.000806324072248 0.00126950265659
-2061 -0.000870854347184 -0.000701635155428 0.000313692499627
-2062 0.000806977512803 0.00105577665833 0.00104944766898
-2063 -0.00109551076559 -0.00142717969517 0.00150873037446
-2064 -0.00084734945962 -0.00119929828801 -0.000521719509931
-2065 0.00109803343562 0.000740664824656 -0.0010701169671
-2066 0.00116918752676 0.000501485891997 0.000944089890257
-2067 -0.000733300751637 0.00118288400589 0.00140337259573
-2068 -0.0012694647537 -0.00120832990185 -0.000427038897047
-2069 -0.000930759627307 -0.0012649575356 0.000303015333784
-2070 0.000747072232681 0.000492454278156 0.00103877050314
-2071 -0.00115541604571 0.00117385239205 0.00149805320861
-2072 -0.000907254739742 0.00140173379921 -0.000532396675774
-2073 -0.00110776684214 0.00143233659198 0.00118331760813
-2074 0.00110928224663 -6.18364881793e-05 0.000933412724414
-2075 -1.98546412386e-05 -0.00083176996821 -0.000293168957901
-2076 -0.00108426195458 0.000934673459391 0.000347905598572
-2077 0.000861120940664 -0.000289717895339 -0.000200491858596
-2078 0.000687166952559 -7.08681020201e-05 0.0010280933373
-2079 -0.00121532132583 0.000610530011874 0.00148737604277
-2080 -0.00150637724865 0.00092564184555 0.000442586211456
-2081 -0.00116767212226 0.000869014211799 0.00117264044229
-2082 -0.00134162611037 0.00108786400512 -0.000763128829218
-2083 -7.97599213608e-05 -0.00139509234839 -0.000303846123745
-2084 -0.0011441672347 0.000371351079215 0.000337228432729
-2085 0.000801215660542 -0.000853040275515 -0.00021116902444
-2086 0.000627261672436 -0.000634190482196 0.00101741617145
-2087 -0.00127522660596 4.72076316979e-05 0.00147669887693
-2088 -0.00156628252877 0.000362319465374 0.000431909045613
-2089 -0.00122757740238 0.000305691831623 0.00116196327644
-2090 0.000450254457604 -0.00110125082202 -0.0012666360216
-2091 -0.00145223382079 -0.000419852708121 -0.000807353316125
-2092 -0.000430721124299 0.00152105157251 -0.0013593131209
-2093 0.000741310380419 -0.00141636265569 -0.000221846190283
-2094 -0.00157853860532 5.74812851226e-05 0.000106496279285
-2095 -0.000316672416316 0.000738879399017 0.000565778984758
-2096 0.0015381666585 -0.000201002914802 0.000421231879769
-2097 -0.00128748268251 -0.000257630548553 0.0011512861106
-2098 0.000390349177481 0.00149978126521 -0.00127731318744
-2099 -0.00151213910091 -0.000983175088298 -0.000818030481968
-2100 -0.000490626404421 0.000957729192336 -0.00136999028675
-2101 0.00145475649082 -0.000266662162394 0.00124596672348
-2102 0.00152591058196 -0.000505841095054 9.58191134412e-05
-2103 -0.000376577696438 0.000175557018841 0.000555101818915
-2104 0.00147826137838 -0.000764325294979 0.000410554713926
-2105 0 0 0
-2106 0 0 0
-2107 0 0 0
-2108 0 0 0
-2109 0 0 0
-2110 0 0 0
-2111 0 0 0
-2112 0 0 0
-2113 0 0 0
-2114 0 0 0
-2115 0 0 0
-2116 0 0 0
-2117 0 0 0
-2118 0 0 0
-2119 0 0 0
-2120 0 0 0
-2121 0.000616875159369 -0.00116081990147 0.000656211815428
-2122 0.00138532699558 0.000478609773453 -0.000647943930299
-2123 -0.00121445902789 -0.000718600720231 -3.4653089141e-05
-2124 0.001337677792 0.000220125573528 -0.000333208329814
-2125 -0.00141191790356 -2.0877943281e-06 -0.00113501035109
-2126 0.00018986031098 -0.00124344471386 0.00113260107037
-2127 0.00152778014544 -0.000727632334072 6.00275237427e-05
-2128 -0.000691115270922 0.00137885768067 0.00103992397107
-2129 0.000556969879247 0.00144021218576 0.000645534649584
-2130 0.00132542171545 -8.47126067237e-05 -0.000658621096142
-2131 -0.000501012917488 0.000431099773066 0.00143315982463
-2132 0.00127777251188 -0.000343196806649 -0.000343885495657
-2133 -0.00147182318368 -0.000565410174504 -0.00114568751693
-2134 0.000903306421378 -9.37442205645e-05 -0.000563940483258
-2135 0.00146787486531 -0.00129095471425 4.93503578993e-05
-2136 -0.000751020551045 0.00081553530049 0.00102924680523
-2137 0.00151552406889 -0.00103247051432 -0.000265385242585
-2138 0.00126551643533 -0.0006480349869 -0.000669298261985
-2139 -0.000560918197611 -0.00013222260711 0.00142248265878
-2140 -0.000928027765877 0.00034847496067 -0.00125480538783
-2141 0.000320057384292 0.000409829465761 0.00151515975809
-2142 0.000843401141256 -0.000657066600741 -0.000574617649102
-2143 0.00140796958519 0.00131007737297 3.86731920559e-05
-2144 0.00104086001693 -0.00137357952664 0.000525739612846
-2145 0.00145561878877 0.0015685615729 -0.000276062408429
-2146 0.00120561115521 -0.00121135736708 -0.000679975427829
-2147 -0.000620823477733 -0.000695544987287 0.00141180549294
-2148 -0.000987933046 -0.000214847419506 -0.00126548255367
-2149 0.00026015210417 -0.000153492914416 0.00150448259224
-2150 0.000783495861134 -0.00122038898092 -0.000585294814945
-2151 0.00134806430507 0.000746754992798 2.79960262125e-05
-2152 -0.00141004834007 -0.000223879033347 -0.00117080194079
-2153 0.00139571350864 0.00100523919272 -0.000286739574272
-2154 0.000606488646301 0.00147690514666 0.000295007459401
-2155 0.00117105709024 0.000279694652978 0.000908298300559
-2156 -0.00104783832612 -0.000778169799682 -0.00127615971951
-2157 0.000973598214568 0.000996207578882 -0.000192058961388
-2158 0.000968698660254 0.000922614380327 0.000189649680674
-2159 -0.000857735972688 0.00143842676012 -0.000882923865957
-2160 -0.0014699536202 -0.000787201413523 -0.00118147910663
-2161 0.00133580822852 0.000441916812546 -0.000297416740115
-2162 0.000546583366179 0.000913582766486 0.000284330293558
-2163 0.00111115181012 -0.000283627727198 0.000897621134715
-2164 -0.00110774360624 -0.00134149217986 -0.00128683688536
-2165 0.000913692934446 0.000432885198705 -0.000202736127232
-2166 -0.00148220969675 -0.00109203959377 -0.00150689187296
-2167 -0.00091764125281 0.00087510437994 -0.000893601031801
-2168 -0.00152985890032 -0.0013505237937 -0.00119215627247
-2169 0 0 0
-2170 0 0 0
-2171 0 0 0
-2172 0 0 0
-2173 0 0 0
-2174 0 0 0
-2175 0 0 0
-2176 0 0 0
-2177 0 0 0
-2178 0 0 0
-2179 0 0 0
-2180 0 0 0
-2181 0 0 0
-2182 0 0 0
-2183 0 0 0
-2184 0 0 0
-2185 7.58116029969e-05 -0.000461272540367 -0.000792491035288
-2186 0.000844263439204 0.00117815713455 0.00106770768638
-2187 0.00140883188314 -1.90533591317e-05 -0.00148335593986
-2188 0.000796614235631 0.000919672934627 0.00138244328687
-2189 0.00121137300747 0.000697459566772 0.000580641265595
-2190 -0.000351203245392 -0.000543897352762 -0.000316101780341
-2191 0.000986716589065 -2.80849729725e-05 -0.00138867532697
-2192 -0.00123217882729 -0.00108594942563 -0.000408778879646
-2193 1.59063228747e-05 -0.00102459492054 -0.000803168201131
-2194 0.000784358159082 0.000614834754376 0.00105703052054
-2195 -0.00104207647386 0.00113064713417 -1.55430260898e-05
-2196 0.000736708955509 0.000356350554451 0.00137176612103
-2197 0.00115146772735 0.000134137186595 0.000569964099752
-2198 0.000362242865006 0.000605803140535 0.00115171113343
-2199 0.000926811308943 -0.000591407353149 -0.00139935249282
-2200 -0.00129208410742 0.00151508266159 -0.00041945604549
-2201 0.000974460512516 -0.000332923153224 0.0014502663741
-2202 0.00072445287896 5.15123741997e-05 0.0010463533547
-2203 -0.00110198175398 0.000567324753989 -2.62201919331e-05
-2204 -0.00146909132225 0.00104802232177 0.000460846228857
-2205 -0.00022100617208 0.00110937682686 6.64569073719e-05
-2206 0.000302337584884 4.24807603589e-05 0.00114103396758
-2207 0.000866906028821 -0.00115472973333 -0.00141002965866
-2208 0.000499796460554 -0.000674032165544 -0.00092296323787
-2209 0.000914555232394 -0.0008962455334 0.00143958920825
-2210 0.000664547598837 -0.000511810005977 0.00103567618885
-2211 -0.0011618870341 4.00237381316e-06 -3.68973577765e-05
-2212 -0.00152899660237 0.000484699941594 0.000450169063013
-2213 -0.000280911452202 0.000546054446684 5.57797415285e-05
-2214 0.000242432304762 -0.000520841619817 0.00113035680174
-2215 0.000807000748698 0.0014463023539 -0.0014207068245
-2216 0.00121324257095 0.000475668327753 0.000544849675897
-2217 0.000854649952271 -0.00145956791358 0.00142891204241
-2218 6.54250899293e-05 -0.000987901959637 -0.00115369539131
-2219 0.000629993533866 0.000979242014078 -0.000540404550157
-2220 -0.00158890188249 -7.86224385825e-05 0.00043949189717
-2221 0.000432534658196 -0.00146859952742 0.0015235926553
-2222 0.0012009864944 0.000170830147502 0.000219436909569
-2223 -0.00139879952906 -0.00102638034618 0.000832727750726
-2224 0.00115333729083 -8.76540524233e-05 0.000534172510053
-2225 0.000794744672149 0.00114146417365 0.00141823487657
-2226 5.51980980719e-06 -0.00155122433981 -0.00116437255716
-2227 0.000570088253743 0.000415919633902 -0.000551081716
-2228 0.00151554730478 -0.000641944818759 0.000428814731326
-2229 0.000372629378074 0.00113243255981 0.00151291548945
-2230 0.00114108121428 -0.000392492232675 0.000208759743725
-2231 -0.00145870480918 -0.00158970272636 0.000822050584883
-2232 0.00109343201071 -0.0006509764326 0.00052349534421
-2233 0 0 0
-2234 0 0 0
-2235 0 0 0
-2236 0 0 0
-2237 0 0 0
-2238 0 0 0
-2239 0 0 0
-2240 0 0 0
-2241 0 0 0
-2242 0 0 0
-2243 0 0 0
-2244 0 0 0
-2245 0 0 0
-2246 0 0 0
-2247 0 0 0
-2248 0 0 0
-2249 -0.00108052282761 0.000491090981354 0.000276322419175
-2250 0.000303199882832 -0.00128664997175 -0.00038099516433
-2251 0.000252497452531 0.000933310162589 -0.000414542485393
-2252 0.000255550679259 -0.00154513417167 -6.62595638458e-05
-2253 5.50385768618e-05 -0.00151453137891 -0.00151489974734
-2254 -0.000892266801764 0.000155650008337 0.00139954983634
-2255 -0.000169617841544 0.000924278548748 -0.00031986187251
-2256 0.00139111208373 -0.000386402064533 0.00130687273704
-2257 -0.00114042810773 -7.22313988224e-05 0.000265645253332
-2258 0.00024329460271 0.00131438211548 -0.000391672330174
-2259 0.00096594356293 -0.00108134381151 0.00105327042837
-2260 0.000195645399137 0.00105589791555 -7.69367296892e-05
-2261 -4.86670326035e-06 0.00108650070832 -0.00152557691318
-2262 -0.000178820691366 0.00130535050164 -0.00029699171729
-2263 -0.000229523121666 0.000360956168572 -0.000330539038353
-2264 0.00133120680361 -0.00094972444471 0.00129619557119
-2265 -0.000181873918093 0.000619440368497 -0.000645274638838
-2266 0.000183389322588 0.000751059735299 -0.000402349496017
-2267 0.000906038282808 0.00151968827571 0.00104259326253
-2268 0.00115419958878 -0.00141678478453 -0.000987856621859
-2269 -0.00137734060269 -0.00110261411882 0.00113527036183
-2270 -0.000238725971488 0.000742028121459 -0.000307668883134
-2271 -0.000289428401788 -0.000202366211605 -0.000341216204197
-2272 0.000732084294702 -0.00142581639837 -0.000893176008975
-2273 -0.000241779198215 5.61179883204e-05 -0.000655951804681
-2274 0.000123484042465 0.000187737355123 -0.000413026661861
-2275 0.000846133002685 0.000956365895534 0.00103191609669
-2276 0.00109429430866 0.00118424730269 -0.000998533787702
-2277 -0.00143724588281 0.0014984179684 0.00112459319599
-2278 -0.00029863125161 0.000178705741282 -0.000318346048977
-2279 -0.00034933368191 -0.000765688591781 -0.00035189337004
-2280 0.00067217901458 0.00117521568885 -0.000903853174819
-2281 -0.000301684478337 -0.000507204391856 -0.000666628970525
-2282 -0.000475638466443 -0.000288354598537 0.000561956225369
-2283 -0.000526340896743 -0.0012327489316 0.000528408904306
-2284 0.00103438902853 0.000620924922517 -0.00100921095355
-2285 -0.000723799772413 -0.000516236005697 -0.000571948357641
-2286 0.000659922938031 0.000870377508601 -0.00122926594115
-2287 0.00060922050773 -7.40168244618e-05 -0.00126281326221
-2288 0.000612273734458 0.000611893308677 -0.000914530340662
-2289 -0.00036158975846 -0.00107052677203 -0.000677306136368
-2290 -0.000535543746565 -0.000851676978713 0.000551279059526
-2291 -0.000586246176865 0.00136828315562 0.000517731738463
-2292 0.000974483748411 5.7602542341e-05 -0.00101988811939
-2293 -0.000783705052535 -0.00107955838587 -0.000582625523484
-2294 0.000600017657909 0.000307055128425 -0.00123994310699
-2295 0.000549315227608 -0.000637339204638 -0.00127349042805
-2296 0.000552368454336 4.85709285002e-05 -0.000925207506505
-2297 0 0 0
-2298 0 0 0
-2299 0 0 0
-2300 0 0 0
-2301 0 0 0
-2302 0 0 0
-2303 0 0 0
-2304 0 0 0
diff --git a/examples/USER/atc/cauchy_born/cb_biaxial.screen b/examples/USER/atc/cauchy_born/cb_biaxial.screen
index 4eae9d703..00b9e62ef 100644
--- a/examples/USER/atc/cauchy_born/cb_biaxial.screen
+++ b/examples/USER/atc/cauchy_born/cb_biaxial.screen
@@ -1,400 +1,402 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable lattice_constant equal 5.256227487
variable c equal 6
variable L equal $c*${lattice_constant}
variable L equal 6*${lattice_constant}
variable L equal 6*5.2562274870000003091
variable d equal 0.005
variable s equal 1.005
variable is equal 1.0/$s
variable is equal 1.0/1.0049999999999998934
variable V0 equal $L*$L*3*${lattice_constant}
variable V0 equal 31.537364922000001854*$L*3*${lattice_constant}
variable V0 equal 31.537364922000001854*31.537364922000001854*3*${lattice_constant}
variable V0 equal 31.537364922000001854*31.537364922000001854*3*5.2562274870000003091
# create system
lattice fcc ${lattice_constant} origin 0.25 0.25 0.25
lattice fcc 5.2562274870000003091 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.25623 5.25623 5.25623
region box block 0 $c 0 $c 0 3
region box block 0 6 0 $c 0 3
region box block 0 6 0 6 0 3
boundary p p p
create_box 1 box
Created orthogonal box = (0 0 0) to (31.5374 31.5374 15.7687)
2 by 2 by 1 MPI processor grid
create_atoms 1 box
Created 432 atoms
mass 1 39.95
group all region box
432 atoms in group all
pair_style lj/cut 13.5
pair_coeff 1 1 0.238 3.405
# ID group atc PhysicsType ParameterFile
fix AtC all atc field Ar_CauchyBorn.mat
ATC: constructing shape function field estimate with parameter file Ar_CauchyBorn.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC mesh create $c $c 1 box p p p
fix_modify AtC mesh create 6 $c 1 box p p p
fix_modify AtC mesh create 6 6 1 box p p p
ATC: created uniform mesh with 98 nodes, 36 unique nodes, and 36 elements
fix_modify AtC fields none
fix_modify AtC fields add displacement
fix_modify AtC fields add internal_energy stress cauchy_born_energy cauchy_born_stress
fix_modify AtC gradients add displacement
+fix_modify AtC set reference_potential_energy 0.
#fix_modify AtC fields add elastic_deformation_gradient
fix_modify AtC output cb_biaxialFE 1 full_text tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
log cb_biaxial.log
thermo 100
variable gamma1 equal 0.0
variable gamma2 equal 0.0
variable dv equal 1.0
variable step equal 0
thermo_style custom step v_step pxx pyy pzz pxy pxz pyz v_gamma1 pe v_dv
timestep 0.0
min_modify line quadratic
timestep 0.0
variable i loop 4
label loop_i
print ">>> step $i ${gamma1} ${gamma2}"
>>> step 1 0 0
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: CB stiffness: 7.56717 Einstein freq: 0.355649
ATC: computing bond matrix ...........done
Memory usage per processor = 23.7277 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma1 PotEng dv
0 0 -4.8909909e-07 -4.8909886e-07 -4.8910238e-07 3.8880943e-13 -1.7762988e-12 -1.6027127e-12 0 -871.99483 1
1 0 -4.8909976e-07 -4.8909976e-07 -4.8910453e-07 5.2088849e-13 -1.9469417e-12 -1.714206e-12 0 -871.99483 1
-Loop time of 0.280059 on 4 procs for 1 steps with 432 atoms
+Loop time of 0.00473368 on 4 procs for 1 steps with 432 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-871.994833749 -871.994833749 -871.994833749
Force two-norm initial, final = 3.34475e-13 2.07006e-13
Force max component initial, final = 1.93109e-14 1.59178e-14
Final line search alpha, max atom move = 1 1.59178e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.0039708 (1.41784)
+Pair time (%) = 0.00394475 (83.3338)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.117534 (41.9677)
+Comm time (%) = 0.000563622 (11.9066)
Outpt time (%) = 0 (0)
-Other time (%) = 0.158554 (56.6145)
+Other time (%) = 0.000225306 (4.75963)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2808 ave 2808 max 2808 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 23112 ave 23112 max 23112 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 46224 ave 46224 max 46224 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 184896
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.0409 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma1 PotEng dv
1 0 -4.8909914e-07 -4.8909896e-07 -4.8910453e-07 -2.1357027e-14 -1.8692798e-12 -1.5977131e-12 0 -871.99483 1
2 0 -4.8909914e-07 -4.8909896e-07 -4.8910453e-07 -2.1357027e-14 -1.8692798e-12 -1.5977131e-12 0 -871.99483 1
-Loop time of 0.235875 on 4 procs for 1 steps with 432 atoms
+Loop time of 0.104706 on 4 procs for 1 steps with 432 atoms
-Pair time (%) = 0.00137603 (0.583373)
+Pair time (%) = 0.00135338 (1.29255)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000292778 (0.124124)
-Outpt time (%) = 0.0005005 (0.212189)
-Other time (%) = 0.233706 (99.0803)
+Comm time (%) = 0.000187695 (0.179258)
+Outpt time (%) = 0.00127697 (1.21957)
+Other time (%) = 0.101888 (97.3086)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2808 ave 2808 max 2808 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 23112 ave 23425 max 22860 min
Histogram: 1 0 1 0 0 1 0 0 0 1
FullNghs: 46224 ave 46224 max 46224 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 184896
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 0+1
change_box all x scale $s y scale ${is} remap
change_box all x scale 1.0049999999999998934 y scale ${is} remap
change_box all x scale 1.0049999999999998934 y scale 0.99502487562189068093 remap
Changing box ...
orthogonal box = (-0.0788434 0 0) to (31.6162 31.5374 15.7687)
orthogonal box = (-0.0788434 0.0784512 0) to (31.6162 31.4589 15.7687)
variable gamma1 equal lx/$L-1.0
variable gamma1 equal lx/31.537364922000001854-1.0
variable gamma2 equal ly/$L-1.0
variable gamma2 equal ly/31.537364922000001854-1.0
variable dv equal vol/${V0}
variable dv equal vol/15683.616509356999813
next i
jump in.cb_biaxial loop_i
print ">>> step $i ${gamma1} ${gamma2}"
>>> step 2 0.0049999999999998934186 -0.0049751243781092080454
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.7277 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma1 PotEng dv
2 1 -91.357902 91.748981 5.9495117 4.4461448e-13 -1.151199e-12 -1.6213907e-12 0.005 -871.8904 1
4 1 -91.357902 91.748981 5.9495117 1.1843442e-13 -1.1753736e-12 2.0631862e-13 0.005 -871.8904 1
-Loop time of 0.275171 on 4 procs for 2 steps with 432 atoms
+Loop time of 0.00777125 on 4 procs for 2 steps with 432 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-871.890401015 -871.890401015 -871.890401015
Force two-norm initial, final = 5.08157e-13 2.70169e-13
Force max component initial, final = 5.63517e-14 1.97412e-14
Final line search alpha, max atom move = 1 1.97412e-14
Iterations, force evaluations = 2 4
-Pair time (%) = 0.00895029 (3.25263)
+Pair time (%) = 0.00634211 (81.6099)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.157368 (57.1892)
+Comm time (%) = 0.000929594 (11.962)
Outpt time (%) = 0 (0)
-Other time (%) = 0.108853 (39.5582)
+Other time (%) = 0.000499547 (6.42813)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2808 ave 2808 max 2808 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 23112 ave 23425 max 22860 min
Histogram: 1 0 1 0 0 1 0 0 0 1
FullNghs: 46224 ave 46224 max 46224 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 184896
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.0409 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma1 PotEng dv
4 1 -91.357902 91.748981 5.9495117 3.2472389e-13 -1.1753736e-12 2.21851e-13 0.005 -871.8904 1
5 1 -91.357902 91.748981 5.9495117 3.2472389e-13 -1.1753736e-12 2.21851e-13 0.005 -871.8904 1
-Loop time of 0.249931 on 4 procs for 1 steps with 432 atoms
+Loop time of 0.1236 on 4 procs for 1 steps with 432 atoms
-Pair time (%) = 0.00142711 (0.571004)
+Pair time (%) = 0.00137663 (1.11378)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000403583 (0.161478)
-Outpt time (%) = 0.00990075 (3.9614)
-Other time (%) = 0.238199 (95.3061)
+Comm time (%) = 0.000247836 (0.200515)
+Outpt time (%) = 0.00379604 (3.07124)
+Other time (%) = 0.118179 (95.6145)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2808 ave 2808 max 2808 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 23112 ave 23233 max 22979 min
Histogram: 1 0 0 1 0 0 0 1 0 1
FullNghs: 46224 ave 46224 max 46224 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 184896
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 1+1
change_box all x scale $s y scale ${is} remap
change_box all x scale 1.0049999999999998934 y scale ${is} remap
change_box all x scale 1.0049999999999998934 y scale 0.99502487562189068093 remap
Changing box ...
orthogonal box = (-0.158081 0.0784512 0) to (31.6954 31.4589 15.7687)
orthogonal box = (-0.158081 0.156512 0) to (31.6954 31.3809 15.7687)
variable gamma1 equal lx/$L-1.0
variable gamma1 equal lx/31.537364922000001854-1.0
variable gamma2 equal ly/$L-1.0
variable gamma2 equal ly/31.537364922000001854-1.0
variable dv equal vol/${V0}
variable dv equal vol/15683.616509356999813
next i
jump in.cb_biaxial loop_i
print ">>> step $i ${gamma1} ${gamma2}"
>>> step 3 0.010024999999999728573 -0.009925496893640972651
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.7277 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma1 PotEng dv
5 2 -171.87971 184.21354 24.007425 2.4269349e-13 3.1283039e-12 2.293625e-12 0.010025 -871.15868 1
7 2 -171.87971 184.21354 24.007425 -1.0629975e-12 1.690591e-12 2.2967994e-12 0.010025 -871.15868 1
-Loop time of 0.510101 on 4 procs for 2 steps with 432 atoms
+Loop time of 0.00748217 on 4 procs for 2 steps with 432 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-871.158684158 -871.158684158 -871.158684158
Force two-norm initial, final = 5.1376e-13 2.56079e-13
Force max component initial, final = 5.97855e-14 2.52853e-14
Final line search alpha, max atom move = 1 2.52853e-14
Iterations, force evaluations = 2 4
-Pair time (%) = 0.0191914 (3.76227)
+Pair time (%) = 0.00619549 (82.8033)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.23774 (46.6064)
+Comm time (%) = 0.000825107 (11.0276)
Outpt time (%) = 0 (0)
-Other time (%) = 0.25317 (49.6313)
+Other time (%) = 0.000461578 (6.16904)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2808 ave 2808 max 2808 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 23112 ave 23234 max 22979 min
Histogram: 1 0 0 1 0 0 0 1 0 1
FullNghs: 46224 ave 46224 max 46224 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 184896
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.0409 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma1 PotEng dv
7 2 -171.87971 184.21354 24.007425 -3.1622962e-13 1.6206953e-12 2.2890332e-12 0.010025 -871.15868 1
8 2 -171.87971 184.21354 24.007425 -3.1622962e-13 1.6206953e-12 2.2890332e-12 0.010025 -871.15868 1
-Loop time of 0.494811 on 4 procs for 1 steps with 432 atoms
+Loop time of 0.11824 on 4 procs for 1 steps with 432 atoms
-Pair time (%) = 0.00385392 (0.778867)
+Pair time (%) = 0.00135481 (1.14582)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0360543 (7.28647)
-Outpt time (%) = 0.0442775 (8.94838)
-Other time (%) = 0.410625 (82.9863)
+Comm time (%) = 0.000240982 (0.203807)
+Outpt time (%) = 0.00395924 (3.34848)
+Other time (%) = 0.112685 (95.3019)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2808 ave 2808 max 2808 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 23112 ave 23314 max 22858 min
Histogram: 1 0 0 0 0 1 0 1 0 1
FullNghs: 46224 ave 46224 max 46224 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 184896
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 2+1
change_box all x scale $s y scale ${is} remap
change_box all x scale 1.0049999999999998934 y scale ${is} remap
change_box all x scale 1.0049999999999998934 y scale 0.99502487562189068093 remap
Changing box ...
orthogonal box = (-0.237715 0.156512 0) to (31.7751 31.3809 15.7687)
orthogonal box = (-0.237715 0.234184 0) to (31.7751 31.3032 15.7687)
variable gamma1 equal lx/$L-1.0
variable gamma1 equal lx/31.537364922000001854-1.0
variable gamma2 equal ly/$L-1.0
variable gamma2 equal ly/31.537364922000001854-1.0
variable dv equal vol/${V0}
variable dv equal vol/15683.616509356999813
next i
jump in.cb_biaxial loop_i
print ">>> step $i ${gamma1} ${gamma2}"
>>> step 4 0.015075124999999633957 -0.014851240690189837501
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.7277 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma1 PotEng dv
8 3 -256.21626 277.50951 57.50796 -1.4695091e-13 4.1657011e-13 7.7445306e-13 0.015075125 -870.22745 1
11 3 -256.21626 277.50951 57.50796 -7.7055184e-13 3.5561707e-14 -1.2297109e-12 0.015075125 -870.22745 1
-Loop time of 0.165426 on 4 procs for 3 steps with 432 atoms
+Loop time of 0.00990748 on 4 procs for 3 steps with 432 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-870.227446396 -870.227446396 -870.227446396
Force two-norm initial, final = 4.73029e-13 2.08011e-13
Force max component initial, final = 4.59355e-14 2.3731e-14
Final line search alpha, max atom move = 1 2.3731e-14
Iterations, force evaluations = 3 6
-Pair time (%) = 0.00856608 (5.17818)
+Pair time (%) = 0.00837588 (84.541)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.116189 (70.2361)
+Comm time (%) = 0.00113231 (11.4288)
Outpt time (%) = 0 (0)
-Other time (%) = 0.0406712 (24.5857)
+Other time (%) = 0.000399292 (4.0302)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2808 ave 2808 max 2808 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 23112 ave 23314 max 22862 min
Histogram: 1 0 0 0 0 1 1 0 0 1
FullNghs: 46224 ave 46224 max 46224 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 184896
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.0409 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma1 PotEng dv
11 3 -256.21626 277.50951 57.50796 -2.5822588e-13 -1.5082689e-13 -1.3384375e-12 0.015075125 -870.22745 1
12 3 -256.21626 277.50951 57.50796 -2.5822588e-13 -1.5082689e-13 -1.3384375e-12 0.015075125 -870.22745 1
-Loop time of 0.687404 on 4 procs for 1 steps with 432 atoms
+Loop time of 0.114536 on 4 procs for 1 steps with 432 atoms
-Pair time (%) = 0.00261223 (0.380014)
+Pair time (%) = 0.00131828 (1.15097)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0127067 (1.8485)
-Outpt time (%) = 0.0149975 (2.18176)
-Other time (%) = 0.657088 (95.5897)
+Comm time (%) = 0.000217319 (0.189737)
+Outpt time (%) = 0.00417405 (3.6443)
+Other time (%) = 0.108827 (95.015)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2808 ave 2808 max 2808 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 23112 ave 23264 max 23042 min
Histogram: 2 0 1 0 0 0 0 0 0 1
FullNghs: 46224 ave 46224 max 46224 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 184896
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 3+1
change_box all x scale $s y scale ${is} remap
change_box all x scale 1.0049999999999998934 y scale ${is} remap
change_box all x scale 1.0049999999999998934 y scale 0.99502487562189068093 remap
Changing box ...
orthogonal box = (-0.317747 0.234184 0) to (31.8551 31.3032 15.7687)
orthogonal box = (-0.317747 0.311471 0) to (31.8551 31.2259 15.7687)
variable gamma1 equal lx/$L-1.0
variable gamma1 equal lx/31.537364922000001854-1.0
variable gamma2 equal ly/$L-1.0
variable gamma2 equal ly/31.537364922000001854-1.0
variable dv equal vol/${V0}
variable dv equal vol/15683.616509356999813
next i
jump in.cb_biaxial loop_i
diff --git a/examples/USER/atc/cauchy_born/cb_shear.screen b/examples/USER/atc/cauchy_born/cb_shear.screen
index 2b4145c4f..81e6a7a8c 100644
--- a/examples/USER/atc/cauchy_born/cb_shear.screen
+++ b/examples/USER/atc/cauchy_born/cb_shear.screen
@@ -1,384 +1,386 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style atomic
variable lattice_constant equal 4.08
variable c equal 6 # minimum size
variable Ly equal $c*${lattice_constant}
variable Ly equal 6*${lattice_constant}
variable Ly equal 6*4.0800000000000000711
variable d equal 0.005
variable V0 equal ($c*${lattice_constant})^3
variable V0 equal (6*${lattice_constant})^3
variable V0 equal (6*4.0800000000000000711)^3
# create system
lattice fcc ${lattice_constant} origin 0.25 0.25 0.25
lattice fcc 4.0800000000000000711 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 4.08 4.08 4.08
# NOTE rect box + lagrangian is necessary to fool ATC's mesh
region rectbox block 0 $c 0 $c 0 3
region rectbox block 0 6 0 $c 0 3
region rectbox block 0 6 0 6 0 3
region box prism 0 $c 0 $c 0 3 0 0 0
region box prism 0 6 0 $c 0 3 0 0 0
region box prism 0 6 0 6 0 3 0 0 0
boundary p p p
create_box 1 box
Created triclinic box = (0 0 0) to (24.48 24.48 12.24) with tilt (0 0 0)
2 by 2 by 1 MPI processor grid
create_atoms 1 region box
Created 432 atoms
mass 1 196.97
group all region box
432 atoms in group all
pair_style lj/smooth/linear 5.456108274435118
pair_coeff * * 0.7242785984051078 2.598146797350056
neighbor 1.0 bin
#neigh_modify delay 1000000
log cb_shear.log
thermo 100
variable gamma equal 0.0
variable step equal 0
thermo_style custom step v_step pxx pyy pzz pxy pxz pyz v_gamma pe xy xz yz
timestep 1.0
fix AtC all atc field Au_CauchyBorn.mat
ATC: constructing shape function field estimate with parameter file Au_CauchyBorn.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC mesh create $c $c 1 rectbox p p p
fix_modify AtC mesh create 6 $c 1 rectbox p p p
fix_modify AtC mesh create 6 6 1 rectbox p p p
ATC: created uniform mesh with 98 nodes, 36 unique nodes, and 36 elements
fix_modify AtC fields add mass_density internal_energy stress
fix_modify AtC fields add displacement
fix_modify AtC fields add cauchy_born_energy cauchy_born_stress
fix_modify AtC gradients add displacement
+fix_modify AtC set reference_potential_energy 0.
#fix_modify AtC fields add elastic_deformation_gradient
fix_modify AtC output cb_shearFE 1 text binary tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
min_modify line quadratic
variable dgamma equal $d/${Ly}
variable dgamma equal 0.0050000000000000001041/${Ly}
variable dgamma equal 0.0050000000000000001041/24.480000000000000426
print "depsilon_12: ${dgamma}"
depsilon_12: 0.00020424836601307190163
timestep 0.0
variable i loop 4
label loop_i
print ">>> step $i"
>>> step 1
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: CB stiffness: 28.7742 Einstein freq: 7394.9
ATC: computing bond matrix ...........done
Memory usage per processor = 23.608 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng Xy Xz Yz
0 0 8.2990138e-10 8.090598e-10 1.2401824e-09 -2.047237e-10 -1.675329e-10 -2.052466e-10 0 -1697.76 0 0 0
2 0 1.4564068e-09 1.4626573e-09 1.5311855e-09 1.91865e-11 2.9536813e-11 -6.2429255e-12 0 -1697.76 0 0 0
-Loop time of 0.00191295 on 4 procs for 2 steps with 432 atoms
+Loop time of 0.00189102 on 4 procs for 2 steps with 432 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-1697.76 -1697.76 -1697.76
Force two-norm initial, final = 7.25089e-13 7.69958e-13
Force max component initial, final = 6.31162e-14 5.59344e-14
Final line search alpha, max atom move = 1 5.59344e-14
Iterations, force evaluations = 2 4
-Pair time (%) = 0.00124657 (65.1648)
+Pair time (%) = 0.00119233 (63.0524)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000366986 (19.1843)
+Comm time (%) = 0.000420868 (22.2562)
Outpt time (%) = 0 (0)
-Other time (%) = 0.000299394 (15.6509)
+Other time (%) = 0.000277817 (14.6914)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 756 ave 756 max 756 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 4212 ave 4212 max 4212 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 8424 ave 8424 max 8424 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 33696
Ave neighs/atom = 78
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 22.9213 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng Xy Xz Yz
2 0 1.1686684e-09 1.1704144e-09 1.1818848e-09 -7.0034742e-11 -2.0734576e-10 -2.246665e-10 0 -1697.76 0 0 0
3 0 1.3913827e-09 1.417767e-09 1.507396e-09 1.3580144e-11 6.6948897e-11 3.137377e-13 0 -1697.76 0 0 0
-Loop time of 0.0460081 on 4 procs for 1 steps with 432 atoms
+Loop time of 0.0196074 on 4 procs for 1 steps with 432 atoms
-Pair time (%) = 0.00277305 (6.0273)
+Pair time (%) = 0.000265002 (1.35154)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.012373 (26.893)
-Outpt time (%) = 0.000219166 (0.476364)
-Other time (%) = 0.0306429 (66.6033)
+Comm time (%) = 0.000140131 (0.714681)
+Outpt time (%) = 0.00020355 (1.03813)
+Other time (%) = 0.0189987 (96.8957)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 756 ave 756 max 756 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 4212 ave 4380 max 4051 min
Histogram: 1 0 0 1 0 1 0 0 0 1
FullNghs: 8424 ave 8424 max 8424 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 33696
Ave neighs/atom = 78
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 0+1
change_box all xy delta $d remap
change_box all xy delta 0.0050000000000000001041 remap
Changing box ...
triclinic box = (0 0 0) to (24.48 24.48 12.24) with tilt (0.0204 0 0)
variable gamma equal $i*${dgamma}
variable gamma equal 1*${dgamma}
variable gamma equal 1*0.00020424836601307190163
next i
jump in.cb_shear loop_i
print ">>> step $i"
>>> step 2
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.608 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng Xy Xz Yz
3 1 6.886337 10.047566 -1.1516625 -2346.5185 -2.2571381e-10 -2.3527902e-10 0.00020424837 -1697.7555 0.0204 0 0
8 1 6.886337 10.047566 -1.1516625 -2346.5185 -2.9823269e-11 1.6162796e-11 0.00020424837 -1697.7555 0.0204 0 0
-Loop time of 0.00391698 on 4 procs for 5 steps with 432 atoms
+Loop time of 0.00381422 on 4 procs for 5 steps with 432 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-1697.75552385 -1697.75552385 -1697.75552385
Force two-norm initial, final = 1.45516e-12 6.75826e-13
Force max component initial, final = 2.43972e-13 6.33382e-14
Final line search alpha, max atom move = 1 6.33382e-14
Iterations, force evaluations = 5 10
-Pair time (%) = 0.00264663 (67.568)
+Pair time (%) = 0.00253272 (66.4021)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000849068 (21.6766)
+Comm time (%) = 0.000786841 (20.6291)
Outpt time (%) = 0 (0)
-Other time (%) = 0.000421286 (10.7554)
+Other time (%) = 0.000494659 (12.9688)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 756 ave 756 max 756 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 4212 ave 4380 max 4051 min
Histogram: 1 0 0 1 0 1 0 0 0 1
FullNghs: 8424 ave 8424 max 8424 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 33696
Ave neighs/atom = 78
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 22.9213 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng Xy Xz Yz
8 1 6.886337 10.047566 -1.1516625 -2346.5185 -1.3329305e-10 -1.817966e-10 0.00020424837 -1697.7555 0.0204 0 0
9 1 6.886337 10.047566 -1.1516625 -2346.5185 -1.153706e-11 6.5233191e-11 0.00020424837 -1697.7555 0.0204 0 0
-Loop time of 0.02672 on 4 procs for 1 steps with 432 atoms
+Loop time of 0.0217959 on 4 procs for 1 steps with 432 atoms
-Pair time (%) = 0.000268936 (1.0065)
+Pair time (%) = 0.000264347 (1.21283)
Neigh time (%) = 0 (0)
-Comm time (%) = 9.2268e-05 (0.345314)
-Outpt time (%) = 0.00226957 (8.49387)
-Other time (%) = 0.0240893 (90.1543)
+Comm time (%) = 7.84993e-05 (0.360156)
+Outpt time (%) = 0.00237393 (10.8916)
+Other time (%) = 0.0190791 (87.5354)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 756 ave 756 max 756 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 4212 ave 4312 max 4085 min
Histogram: 1 0 0 0 0 1 1 0 0 1
FullNghs: 8424 ave 8424 max 8424 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 33696
Ave neighs/atom = 78
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 1+1
change_box all xy delta $d remap
change_box all xy delta 0.0050000000000000001041 remap
Changing box ...
triclinic box = (0 0 0) to (24.48 24.48 12.24) with tilt (0.0408 0 0)
variable gamma equal $i*${dgamma}
variable gamma equal 2*${dgamma}
variable gamma equal 2*0.00020424836601307190163
next i
jump in.cb_shear loop_i
print ">>> step $i"
>>> step 3
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.608 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng Xy Xz Yz
9 2 27.545381 40.190743 -4.6066242 -4693.1379 -1.3165313e-10 -1.7366821e-10 0.00040849673 -1697.7421 0.0408 0 0
13 2 27.545381 40.190743 -4.6066242 -4693.1379 -2.0177729e-11 5.6927478e-11 0.00040849673 -1697.7421 0.0408 0 0
-Loop time of 0.00320572 on 4 procs for 4 steps with 432 atoms
+Loop time of 0.00320196 on 4 procs for 4 steps with 432 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-1697.74209519 -1697.74209519 -1697.74209519
Force two-norm initial, final = 1.45582e-12 6.63859e-13
Force max component initial, final = 2.16244e-13 6.87297e-14
Final line search alpha, max atom move = 1 6.87297e-14
Iterations, force evaluations = 4 8
-Pair time (%) = 0.00217921 (67.9787)
+Pair time (%) = 0.00211853 (66.1634)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000676513 (21.1033)
+Comm time (%) = 0.000697374 (21.7796)
Outpt time (%) = 0 (0)
-Other time (%) = 0.000349998 (10.9179)
+Other time (%) = 0.000386059 (12.057)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 756 ave 756 max 756 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 4212 ave 4312 max 4085 min
Histogram: 1 0 0 0 0 1 1 0 0 1
FullNghs: 8424 ave 8424 max 8424 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 33696
Ave neighs/atom = 78
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 22.9213 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng Xy Xz Yz
13 2 27.545381 40.190743 -4.6066242 -4693.1379 -1.1765618e-10 -1.586376e-10 0.00040849673 -1697.7421 0.0408 0 0
14 2 27.545381 40.190743 -4.6066242 -4693.1379 -3.767429e-11 6.1228867e-11 0.00040849673 -1697.7421 0.0408 0 0
-Loop time of 0.0443209 on 4 procs for 1 steps with 432 atoms
+Loop time of 0.0220199 on 4 procs for 1 steps with 432 atoms
-Pair time (%) = 0.000267744 (0.604103)
+Pair time (%) = 0.00026226 (1.19102)
Neigh time (%) = 0 (0)
-Comm time (%) = 9.21488e-05 (0.207913)
-Outpt time (%) = 0.00152749 (3.44643)
-Other time (%) = 0.0424336 (95.7416)
+Comm time (%) = 7.81417e-05 (0.354869)
+Outpt time (%) = 0.00238746 (10.8423)
+Other time (%) = 0.019292 (87.6118)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 756 ave 756 max 756 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 4212 ave 4347 max 4038 min
Histogram: 1 0 0 0 0 0 2 0 0 1
FullNghs: 8424 ave 8424 max 8424 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 33696
Ave neighs/atom = 78
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 2+1
change_box all xy delta $d remap
change_box all xy delta 0.0050000000000000001041 remap
Changing box ...
triclinic box = (0 0 0) to (24.48 24.48 12.24) with tilt (0.0612 0 0)
variable gamma equal $i*${dgamma}
variable gamma equal 3*${dgamma}
variable gamma equal 3*0.00020424836601307190163
next i
jump in.cb_shear loop_i
print ">>> step $i"
>>> step 4
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.608 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng Xy Xz Yz
14 3 61.977233 90.430962 -10.364808 -7039.9591 -1.4718693e-10 -1.6595966e-10 0.0006127451 -1697.7197 0.0612 0 0
18 3 61.977233 90.430962 -10.364808 -7039.9591 -9.9031986e-12 6.1389525e-11 0.0006127451 -1697.7197 0.0612 0 0
-Loop time of 0.083416 on 4 procs for 4 steps with 432 atoms
+Loop time of 0.00316238 on 4 procs for 4 steps with 432 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-1697.71971345 -1697.71971345 -1697.71971345
Force two-norm initial, final = 1.6934e-12 6.96493e-13
Force max component initial, final = 2.55476e-13 6.86812e-14
Final line search alpha, max atom move = 1 6.86812e-14
Iterations, force evaluations = 4 8
-Pair time (%) = 0.00221682 (2.65754)
+Pair time (%) = 0.00211632 (66.9217)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0704444 (84.4495)
+Comm time (%) = 0.000652134 (20.6216)
Outpt time (%) = 0 (0)
-Other time (%) = 0.0107548 (12.8929)
+Other time (%) = 0.000393927 (12.4566)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 756 ave 756 max 756 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 4212 ave 4347 max 4038 min
Histogram: 1 0 0 0 0 0 2 0 0 1
FullNghs: 8424 ave 8424 max 8424 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 33696
Ave neighs/atom = 78
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 22.9213 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng Xy Xz Yz
18 3 61.977233 90.430962 -10.364808 -7039.9591 -5.2551822e-11 -1.5970613e-10 0.0006127451 -1697.7197 0.0612 0 0
19 3 61.977233 90.430962 -10.364808 -7039.9591 -1.697518e-12 6.6900396e-11 0.0006127451 -1697.7197 0.0612 0 0
-Loop time of 0.178347 on 4 procs for 1 steps with 432 atoms
+Loop time of 0.0216184 on 4 procs for 1 steps with 432 atoms
-Pair time (%) = 0.000270486 (0.151663)
+Pair time (%) = 0.000261009 (1.20735)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0174391 (9.77818)
-Outpt time (%) = 0.0102363 (5.73956)
-Other time (%) = 0.150401 (84.3306)
+Comm time (%) = 6.9797e-05 (0.32286)
+Outpt time (%) = 0.00232249 (10.7432)
+Other time (%) = 0.0189651 (87.7266)
Nlocal: 108 ave 108 max 108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 756 ave 756 max 756 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 4212 ave 4379 max 4068 min
Histogram: 1 0 0 1 0 1 0 0 0 1
FullNghs: 8424 ave 8424 max 8424 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 33696
Ave neighs/atom = 78
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 3+1
change_box all xy delta $d remap
change_box all xy delta 0.0050000000000000001041 remap
Changing box ...
triclinic box = (0 0 0) to (24.48 24.48 12.24) with tilt (0.0816 0 0)
variable gamma equal $i*${dgamma}
variable gamma equal 4*${dgamma}
variable gamma equal 4*0.00020424836601307190163
next i
jump in.cb_shear loop_i
diff --git a/examples/USER/atc/cauchy_born/cb_unistrain.screen b/examples/USER/atc/cauchy_born/cb_unistrain.screen
index 86d7fe8ef..b190cc048 100644
--- a/examples/USER/atc/cauchy_born/cb_unistrain.screen
+++ b/examples/USER/atc/cauchy_born/cb_unistrain.screen
@@ -1,123 +1,124 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# create domain
lattice fcc 5.256227487 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.25623 5.25623 5.25623
region BOX block -8 8 -2 2 -2 2
boundary f p p
create_box 1 BOX
Created orthogonal box = (-42.0498 -10.5125 -10.5125) to (42.0498 10.5125 10.5125)
4 by 1 by 1 MPI processor grid
# create atoms
region MD block -7 7 -2 2 -2 2
create_atoms 1 region MD
Created 896 atoms
mass 1 39.95
# specify interal/ghost atoms
region FREE block -6 6 -2 2 -2 2
group internal region FREE
768 atoms in group internal
# specify inter-atomic potential
pair_style lj/cut 13.5
pair_coeff 1 1 0.238 3.405
# specify neighbor/re-neighboring parameters
neighbor 0.3 bin
neigh_modify every 10 delay 0 check no
# setup thermal output
thermo 10
thermo_style custom step pe ke press lx ly lz
# ID group atc PhysicsType ParameterFile
fix AtC internal atc field Ar_CauchyBorn.mat
ATC: constructing shape function field estimate with parameter file Ar_CauchyBorn.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC mesh create 8 1 1 BOX f p p
-terminate called after throwing an instance of 'terminate called after throwing an instance of 'ATC::ATC_Error'
-terminate called after throwing an instance of 'ATC::ATC_Error'
- ATC: P1, ERROR: elastic_deformation_gradient is not a valid field
- ATC: P3, ERROR: elastic_deformation_gradient is not a valid field
ATC: created uniform mesh with 36 nodes, 9 unique nodes, and 8 elements
fix_modify AtC fields none
fix_modify AtC fields add displacement
fix_modify AtC fields add internal_energy stress cauchy_born_energy cauchy_born_stress
fix_modify AtC gradients add displacement
fix_modify AtC fields add elastic_deformation_gradient
ATC: P0, ERROR: elastic_deformation_gradient is not a valid field
-[pharsalus:35580] *** Process received signal ***
-[pharsalus:35580] Signal: Aborted (6)
-[pharsalus:35580] Signal code: (-6)
-[pharsalus:35582] *** Process received signal ***
-[pharsalus:35582] Signal: Aborted (6)
-[pharsalus:35582] Signal code: (-6)
-ATC::ATC_Error'
-[pharsalus:35579] *** Process received signal ***
-[pharsalus:35579] Signal: Aborted (6)
-[pharsalus:35579] Signal code: (-6)
+ ATC: P1, ERROR: elastic_deformation_gradient is not a valid field
ATC: P2, ERROR: elastic_deformation_gradient is not a valid field
+ ATC: P3, ERROR: elastic_deformation_gradient is not a valid field
+terminate called after throwing an instance of 'terminate called after throwing an instance of 'ATC::ATC_Error'
+[pharsalus:45061] *** Process received signal ***
+[pharsalus:45061] Signal: Aborted (6)
+[pharsalus:45061] Signal code: (-6)
terminate called after throwing an instance of 'ATC::ATC_Error'
-[pharsalus:35581] *** Process received signal ***
-[pharsalus:35581] Signal: Aborted (6)
-[pharsalus:35581] Signal code: (-6)
-[pharsalus:35582] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
-[pharsalus:35582] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
-[pharsalus:35582] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
-[pharsalus:35582] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
-[pharsalus:35582] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
-[pharsalus:35582] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
-[pharsalus:35582] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
-[pharsalus:35579] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
-[pharsalus:35579] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
-[pharsalus:35579] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
-[pharsalus:35579] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
-[pharsalus:35579] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
-[pharsalus:35579] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
-[pharsalus:35579] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
-[pharsalus:35579] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68b090]
-[pharsalus:35579] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b31d9]
-[pharsalus:35579] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x792edb]
-[pharsalus:35579] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7949bc]
-[pharsalus:35579] [11] ../../../lmp_openmpi(main+0x49) [0x7a28f9]
-[pharsalus:35579] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
-[pharsalus:35579] [13] ../../../lmp_openmpi() [0x537209]
-[pharsalus:35579] *** End of error message ***
-[pharsalus:35582] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68b090]
-[pharsalus:35582] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b31d9]
-[pharsalus:35582] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x792edb]
-[pharsalus:35582] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7949bc]
-[pharsalus:35582] [11] ../../../lmp_openmpi(main+0x49) [0x7a28f9]
-[pharsalus:35582] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
-[pharsalus:35582] [13] ../../../lmp_openmpi() [0x537209]
-[pharsalus:35582] *** End of error message ***
-[pharsalus:35581] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
-[pharsalus:35581] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
-[pharsalus:35581] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
-[pharsalus:35581] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
-[pharsalus:35581] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
-[pharsalus:35581] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
-[pharsalus:35581] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
-[pharsalus:35581] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68b090]
-[pharsalus:35581] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b31d9]
-[pharsalus:35581] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x792edb]
-[pharsalus:35581] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7949bc]
-[pharsalus:35581] [11] ../../../lmp_openmpi(main+0x49) [0x7a28f9]
-[pharsalus:35581] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
-[pharsalus:35581] [13] ../../../lmp_openmpi() [0x537209]
-[pharsalus:35581] *** End of error message ***
+[pharsalus:45062] *** Process received signal ***
+[pharsalus:45062] Signal: Aborted (6)
+[pharsalus:45062] Signal code: (-6)
+terminate called after throwing an instance of 'ATC::ATC_Error'
+[pharsalus:45063] *** Process received signal ***
+[pharsalus:45063] Signal: Aborted (6)
+[pharsalus:45063] Signal code: (-6)
+ATC::ATC_Error'
+[pharsalus:45060] *** Process received signal ***
+[pharsalus:45060] Signal: Aborted (6)
+[pharsalus:45060] Signal code: (-6)
+[pharsalus:45063] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:45063] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:45063] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:45063] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:45063] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:45063] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:45063] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:45063] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68e130]
+[pharsalus:45063] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b6279]
+[pharsalus:45063] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x7969eb]
+[pharsalus:45063] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:45063] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:45063] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:45063] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:45063] *** End of error message ***
+[pharsalus:45061] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:45061] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:45061] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:45061] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:45061] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:45061] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:45061] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:45061] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68e130]
+[pharsalus:45061] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b6279]
+[pharsalus:45061] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x7969eb]
+[pharsalus:45061] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:45061] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:45061] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:45061] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:45061] *** End of error message ***
+[pharsalus:45062] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:45062] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:45062] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:45062] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:45062] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:45062] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:45062] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:45060] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:45060] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:45060] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:45060] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:45060] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:45060] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:45060] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:45060] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68e130]
+[pharsalus:45060] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b6279]
+[pharsalus:45060] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x7969eb]
+[pharsalus:45060] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:45060] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:45060] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:45060] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:45060] *** End of error message ***
+[pharsalus:45062] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68e130]
+[pharsalus:45062] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b6279]
+[pharsalus:45062] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x7969eb]
+[pharsalus:45062] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:45062] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:45062] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:45062] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:45062] *** End of error message ***
--------------------------------------------------------------------------
-mpirun noticed that process rank 2 with PID 35581 on node pharsalus exited on signal 6 (Aborted).
+mpirun noticed that process rank 3 with PID 45063 on node pharsalus exited on signal 6 (Aborted).
--------------------------------------------------------------------------
-[pharsalus:35580] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
-[pharsalus:35580] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
-[pharsalus:35580] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
-[pharsalus:35580] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
-[pharsalus:35580] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
-[pharsalus:35580] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
-[pharsalus:35580] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
-[pharsalus:35580] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68b090]
-[pharsalus:35580] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b31d9]
-[pharsalus:35580] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x792edb]
-[pharsalus:35580] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7949bc]
-[pharsalus:35580] [11] ../../../lmp_openmpi(main+0x49) [0x7a28f9]
-[pharsalus:35580] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
-[pharsalus:35580] [13] ../../../lmp_openmpi() [0x537209]
-[pharsalus:35580] *** End of error message ***
diff --git a/examples/USER/atc/cauchy_born/cb_unistrain_eam.screen b/examples/USER/atc/cauchy_born/cb_unistrain_eam.screen
index ac700f0ab..b84ee8133 100644
--- a/examples/USER/atc/cauchy_born/cb_unistrain_eam.screen
+++ b/examples/USER/atc/cauchy_born/cb_unistrain_eam.screen
@@ -1,145 +1,146 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style atomic
# create domain
#lattice fcc 3.615 origin 0.25 0.25 0.25
lattice fcc 3.615 origin 0.01 0.01 0.01
Lattice spacing in x,y,z = 3.615 3.615 3.615
region BOX block -8 8 -2 2 -2 2
boundary f p p
create_box 1 BOX
Created orthogonal box = (-28.92 -7.23 -7.23) to (28.92 7.23 7.23)
4 by 1 by 1 MPI processor grid
# create atoms
region MD block -7 7 -2 2 -2 2
create_atoms 1 region MD
Created 896 atoms
mass 1 63.55
# specify interal/ghost atoms
region FREE block -6 6 -2 2 -2 2
group internal region FREE
768 atoms in group internal
# specify inter-atomic potential
pair_style eam
pair_coeff * * ../../../../potentials/Cu_u3.eam
# specify neighbor/re-neighboring parameters
neighbor 0.3 bin
neigh_modify every 10 delay 0 check no
# setup thermal output
thermo 10
thermo_style custom step pe ke press lx ly lz
# ID group atc PhysicsType ParameterFile
fix AtC internal atc field Cu_CauchyBorn.mat
ATC: constructing shape function field estimate with parameter file Cu_CauchyBorn.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC mesh create 8 1 1 BOX f p p
ATC: created uniform mesh with 36 nodes, 9 unique nodes, and 8 elements
#fix_modify AtC kernel quartic_cylinder 10.0
fix_modify AtC fields none
fix_modify AtC fields add displacement
fix_modify AtC fields add internal_energy stress
fix_modify AtC fields add cauchy_born_energy
fix_modify AtC fields add cauchy_born_stress
fix_modify AtC gradients add displacement
#fix_modify AtC fields add elastic_deformation_gradient
timestep 0.0
fix_modify AtC output cb_unistrain_eamFE 1 text tensor_components binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
log cb_unistrain_eam.log
variable step equal 0
thermo_style custom step v_step pe ke press lx ly lz
run 1
Setting up run ...
ATC: CB stiffness: 12.0537 Einstein freq: 2718.63
ATC: computing bond matrix ...........done
Memory usage per processor = 22.7644 Mbytes
Step step PotEng KinEng Press Lx Ly Lz
0 0 -3138.143 0 -4765.0913 57.84 14.46 14.46
1 0 -3138.143 0 -4765.0913 57.84 14.46 14.46
-Loop time of 0.0273568 on 4 procs for 1 steps with 896 atoms
+Loop time of 0.011871 on 4 procs for 1 steps with 896 atoms
-Pair time (%) = 0.000983477 (3.595)
+Pair time (%) = 0.000987768 (8.32082)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000149012 (0.544697)
-Outpt time (%) = 0.000116587 (0.426171)
-Other time (%) = 0.0261077 (95.4341)
+Comm time (%) = 0.000169516 (1.42798)
+Outpt time (%) = 0.000122964 (1.03583)
+Other time (%) = 0.0105908 (89.2154)
Nlocal: 224 ave 256 max 192 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 684.75 ave 843 max 484 min
Histogram: 1 0 1 0 0 0 0 0 0 2
Neighs: 5808 ave 6912 max 4672 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 11616 ave 13824 max 9408 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 46464
Ave neighs/atom = 51.8571
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 0+1
displace_atoms all ramp x -0.1 0.1 x -100 100
Displacing atoms ...
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 22.7644 Mbytes
Step step PotEng KinEng Press Lx Ly Lz
1 1 -3138.1235 0 -5936.0512 57.84 14.46 14.46
2 1 -3138.1235 0 -5936.0512 57.84 14.46 14.46
-Loop time of 0.0527597 on 4 procs for 1 steps with 896 atoms
+Loop time of 0.0143747 on 4 procs for 1 steps with 896 atoms
-Pair time (%) = 0.000959635 (1.81888)
+Pair time (%) = 0.000934064 (6.49796)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00559711 (10.6087)
-Outpt time (%) = 0.00891805 (16.9031)
-Other time (%) = 0.0372849 (70.6693)
+Comm time (%) = 0.000157475 (1.0955)
+Outpt time (%) = 0.00116545 (8.10763)
+Other time (%) = 0.0121177 (84.2989)
Nlocal: 224 ave 256 max 192 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 684.75 ave 843 max 484 min
Histogram: 1 0 1 0 0 0 0 0 0 2
Neighs: 5808 ave 6912 max 4672 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 11616 ave 13824 max 9408 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 46464
Ave neighs/atom = 51.8571
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 1+1
displace_atoms all ramp x -0.1 0.1 x -100 100
Displacing atoms ...
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 22.7644 Mbytes
Step step PotEng KinEng Press Lx Ly Lz
2 2 -3138.0934 0 -7103.7691 57.84 14.46 14.46
3 2 -3138.0934 0 -7103.7691 57.84 14.46 14.46
-Loop time of 0.317459 on 4 procs for 1 steps with 896 atoms
+Loop time of 0.014045 on 4 procs for 1 steps with 896 atoms
-Pair time (%) = 0.0405899 (12.7859)
+Pair time (%) = 0.000925481 (6.5894)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0319443 (10.0625)
-Outpt time (%) = 0.0423202 (13.3309)
-Other time (%) = 0.202604 (63.8207)
+Comm time (%) = 0.000147581 (1.05077)
+Outpt time (%) = 0.00113273 (8.06498)
+Other time (%) = 0.0118392 (84.2948)
Nlocal: 224 ave 256 max 192 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 684.75 ave 843 max 484 min
Histogram: 1 0 1 0 0 0 0 0 0 2
Neighs: 5808 ave 6912 max 4672 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 11616 ave 13824 max 9408 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 46464
Ave neighs/atom = 51.8571
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/cauchy_born/cb_unistrain_eam_linear.screen b/examples/USER/atc/cauchy_born/cb_unistrain_eam_linear.screen
index 55d6ec727..b50a55d1f 100644
--- a/examples/USER/atc/cauchy_born/cb_unistrain_eam_linear.screen
+++ b/examples/USER/atc/cauchy_born/cb_unistrain_eam_linear.screen
@@ -1,158 +1,160 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# create domain
lattice fcc 4.08 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 4.08 4.08 4.08
region BOX block -8 8 -2 2 -2 2
boundary f p p
create_box 1 BOX
Created orthogonal box = (-32.64 -8.16 -8.16) to (32.64 8.16 8.16)
4 by 1 by 1 MPI processor grid
# create atoms
region MD block -7 7 -2 2 -2 2
create_atoms 1 region MD
Created 896 atoms
pair_style eam
pair_coeff * * Au_u3.eam
mass * 196.97
# specify interal/ghost atoms
region FREE block -6 6 -2 2 -2 2
group internal region FREE
768 atoms in group internal
# specify inter-atomic potential
# specify neighbor/re-neighboring parameters
neighbor 0.3 bin
neigh_modify every 10 delay 0 check no
# setup thermal output
thermo 10
thermo_style custom step pe ke press lx ly lz
# ID group atc PhysicsType ParameterFile
fix PP1 internal atc field Au_eam_linear.mat
ATC: constructing shape function field estimate with parameter file Au_eam_linear.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify PP1 mesh create 8 1 1 BOX f p p
ATC: created uniform mesh with 36 nodes, 9 unique nodes, and 8 elements
fix_modify PP1 fields add displacement
fix_modify PP1 fields add internal_energy stress cauchy_born_energy cauchy_born_stress
fix_modify PP1 gradients add displacement
fix_modify PP1 set reference_potential_energy 0 # correct cb and messes pe
# ID group atc PhysicsType ParameterFile
fix PP2 internal atc field Au_eam.mat
ATC: constructing shape function field estimate with parameter file Au_eam.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify PP2 mesh create 8 1 1 BOX f p p
ATC: created uniform mesh with 36 nodes, 9 unique nodes, and 8 elements
fix_modify PP2 fields add cauchy_born_energy cauchy_born_stress internal_energy
fix_modify PP2 set reference_potential_energy
timestep 0.0
fix_modify PP1 output cb_unistrain_eam_linearFE 1 text tensor_components binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify PP2 output cb_unistrain_eam_refFE 1 text tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
log cb_unistrain_eam_linear.log
variable step equal 0
thermo_style custom step v_step pe ke press lx ly lz
run 1
Setting up run ...
ATC: created cubic stress function:
lammps ATC units
c11=1.14323 0.000478328
c12=0.990885 0.000414586
c44=0.279154 0.000116798
ATC: CB stiffness: 11.5362 Einstein freq: 0.975052
ATC: computing bond matrix ...........done
ATC: CB stiffness: 11.5362 Einstein freq: 0.975052
-Memory usage per processor = 43.4446 Mbytes
+Memory usage per processor = 44.055 Mbytes
Step step PotEng KinEng Press Lx Ly Lz
0 0 -3488.8211 0 -387.61198 65.28 16.32 16.32
1 0 -3488.8211 0 -387.61198 65.28 16.32 16.32
-Loop time of 0.0171664 on 4 procs for 1 steps with 896 atoms
+Loop time of 0.0148683 on 4 procs for 1 steps with 896 atoms
-Pair time (%) = 0.000946522 (5.51381)
+Pair time (%) = 0.000981808 (6.60335)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000137866 (0.803114)
-Outpt time (%) = 8.52942e-05 (0.496868)
-Other time (%) = 0.0159967 (93.1862)
+Comm time (%) = 0.000169516 (1.14011)
+Outpt time (%) = 8.64863e-05 (0.581682)
+Other time (%) = 0.0136305 (91.6749)
Nlocal: 224 ave 256 max 192 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 903 ave 1116 max 690 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 5808 ave 6912 max 4672 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 11616 ave 13824 max 9408 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 46464
Ave neighs/atom = 51.8571
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 0+1
displace_atoms all ramp x -0.1 0.1 x -100 100
Displacing atoms ...
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 43.4446 Mbytes
+Memory usage per processor = 44.055 Mbytes
Step step PotEng KinEng Press Lx Ly Lz
1 1 -3488.7472 0 -447.10849 65.28 16.32 16.32
2 1 -3488.7472 0 -447.10849 65.28 16.32 16.32
-Loop time of 0.0233803 on 4 procs for 1 steps with 896 atoms
+Loop time of 0.0173955 on 4 procs for 1 steps with 896 atoms
-Pair time (%) = 0.000981331 (4.19726)
+Pair time (%) = 0.000986218 (5.66939)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000181496 (0.776279)
-Outpt time (%) = 0.000347793 (1.48755)
-Other time (%) = 0.0218697 (93.5389)
+Comm time (%) = 0.000169992 (0.977221)
+Outpt time (%) = 0.000409067 (2.35157)
+Other time (%) = 0.0158302 (91.0018)
Nlocal: 224 ave 256 max 192 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 903 ave 1116 max 690 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 5808 ave 6912 max 4672 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 11616 ave 13824 max 9408 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 46464
Ave neighs/atom = 51.8571
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 1+1
displace_atoms all ramp x -0.1 0.1 x -100 100
Displacing atoms ...
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 43.4446 Mbytes
+Memory usage per processor = 44.055 Mbytes
Step step PotEng KinEng Press Lx Ly Lz
2 2 -3488.6569 0 -506.40727 65.28 16.32 16.32
3 2 -3488.6569 0 -506.40727 65.28 16.32 16.32
-Loop time of 0.0714502 on 4 procs for 1 steps with 896 atoms
+Loop time of 0.0175592 on 4 procs for 1 steps with 896 atoms
-Pair time (%) = 0.0255377 (35.742)
+Pair time (%) = 0.000983775 (5.60263)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0149598 (20.9374)
-Outpt time (%) = 0.000393927 (0.551331)
-Other time (%) = 0.0305588 (42.7693)
+Comm time (%) = 0.000178218 (1.01496)
+Outpt time (%) = 0.000334024 (1.90228)
+Other time (%) = 0.0160632 (91.4801)
Nlocal: 224 ave 256 max 192 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 903 ave 1116 max 690 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 5808 ave 6912 max 4672 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 11616 ave 13824 max 9408 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 46464
Ave neighs/atom = 51.8571
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/cauchy_born/cb_unistrain_linear.screen b/examples/USER/atc/cauchy_born/cb_unistrain_linear.screen
index a592b0477..16b51063c 100644
--- a/examples/USER/atc/cauchy_born/cb_unistrain_linear.screen
+++ b/examples/USER/atc/cauchy_born/cb_unistrain_linear.screen
@@ -1,161 +1,163 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# create domain
lattice fcc 4.08 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 4.08 4.08 4.08
region BOX block -8 8 -2 2 -2 2
boundary f p p
create_box 1 BOX
Created orthogonal box = (-32.64 -8.16 -8.16) to (32.64 8.16 8.16)
4 by 1 by 1 MPI processor grid
# create atoms
region MD block -7 7 -2 2 -2 2
create_atoms 1 region MD
Created 896 atoms
#pair_style eam
#pair_coeff * * Au_u3.eam
#pair_style lj/cut/smooth 5.456108274435118
pair_style lj/smooth/linear 5.456108274435118
pair_coeff * * 0.7242785984051078 2.598146797350056
mass * 196.97
# specify interal/ghost atoms
region FREE block -6 6 -2 2 -2 2
group internal region FREE
768 atoms in group internal
# specify inter-atomic potential
# specify neighbor/re-neighboring parameters
neighbor 0.3 bin
neigh_modify every 10 delay 0 check no
# setup thermal output
thermo 10
thermo_style custom step pe ke press lx ly lz
# ID group atc PhysicsType ParameterFile
fix PP1 internal atc field Au_CauchyBorn_linear.mat
ATC: constructing shape function field estimate with parameter file Au_CauchyBorn_linear.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify PP1 mesh create 8 1 1 BOX f p p
ATC: created uniform mesh with 36 nodes, 9 unique nodes, and 8 elements
fix_modify PP1 fields add displacement
fix_modify PP1 fields add internal_energy stress cauchy_born_energy cauchy_born_stress
fix_modify PP1 gradients add displacement
fix_modify PP1 set reference_potential_energy 0 # correct cb and messes pe
# ID group atc PhysicsType ParameterFile
fix PP2 internal atc field Au_CauchyBorn.mat
ATC: constructing shape function field estimate with parameter file Au_CauchyBorn.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify PP2 mesh create 8 1 1 BOX f p p
ATC: created uniform mesh with 36 nodes, 9 unique nodes, and 8 elements
fix_modify PP2 fields add cauchy_born_energy cauchy_born_stress internal_energy
fix_modify PP2 set reference_potential_energy
timestep 0.0
fix_modify PP1 output cb_unistrain_linearFE 1 text tensor_components binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify PP2 output cb_unistrain_refFE 1 text tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
log cb_unistrain_linear.log
variable step equal 0
thermo_style custom step v_step pe ke press lx ly lz
run 1
Setting up run ...
ATC: created cubic stress function:
lammps ATC units
c11=3.10501 0.00129914
c12=1.75749 0.000735332
c44=1.75749 0.000735332
ATC: CB stiffness: 28.7742 Einstein freq: 1.53992
ATC: computing bond matrix ...........done
ATC: CB stiffness: 28.7742 Einstein freq: 1.53992
-Memory usage per processor = 43.292 Mbytes
+Memory usage per processor = 43.9024 Mbytes
Step step PotEng KinEng Press Lx Ly Lz
0 0 -3435.8868 0 50.003991 65.28 16.32 16.32
1 0 -3435.8868 0 50.003991 65.28 16.32 16.32
-Loop time of 0.0132832 on 4 procs for 1 steps with 896 atoms
+Loop time of 0.00997448 on 4 procs for 1 steps with 896 atoms
-Pair time (%) = 0.000411749 (3.09977)
+Pair time (%) = 0.000412762 (4.13818)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000149429 (1.12495)
-Outpt time (%) = 8.07047e-05 (0.60757)
-Other time (%) = 0.0126413 (95.1677)
+Comm time (%) = 0.0001719 (1.7234)
+Outpt time (%) = 6.90222e-05 (0.691988)
+Other time (%) = 0.0093208 (93.4464)
Nlocal: 224 ave 256 max 192 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 903 ave 1116 max 690 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 4528 ave 5376 max 3648 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 9056 ave 10752 max 7360 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 36224
Ave neighs/atom = 40.4286
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 0+1
displace_atoms all ramp x -0.1 0.1 x -100 100
Displacing atoms ...
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 43.292 Mbytes
+Memory usage per processor = 43.9024 Mbytes
Step step PotEng KinEng Press Lx Ly Lz
1 1 -3435.904 0 -77.521908 65.28 16.32 16.32
2 1 -3435.904 0 -77.521908 65.28 16.32 16.32
-Loop time of 0.0176127 on 4 procs for 1 steps with 896 atoms
+Loop time of 0.0141003 on 4 procs for 1 steps with 896 atoms
-Pair time (%) = 0.000424206 (2.40853)
+Pair time (%) = 0.000429213 (3.044)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000124991 (0.709664)
-Outpt time (%) = 0.000433266 (2.45997)
-Other time (%) = 0.0166302 (94.4218)
+Comm time (%) = 0.000165761 (1.17558)
+Outpt time (%) = 0.000359297 (2.54815)
+Other time (%) = 0.013146 (93.2323)
Nlocal: 224 ave 256 max 192 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 903 ave 1116 max 690 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 4528 ave 5376 max 3648 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 9056 ave 10752 max 7360 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 36224
Ave neighs/atom = 40.4286
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 1+1
displace_atoms all ramp x -0.1 0.1 x -100 100
Displacing atoms ...
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 43.292 Mbytes
+Memory usage per processor = 43.9024 Mbytes
Step step PotEng KinEng Press Lx Ly Lz
2 2 -3435.8757 0 -203.99195 65.28 16.32 16.32
3 2 -3435.8757 0 -203.99195 65.28 16.32 16.32
-Loop time of 0.0175297 on 4 procs for 1 steps with 896 atoms
+Loop time of 0.0137195 on 4 procs for 1 steps with 896 atoms
-Pair time (%) = 0.00041151 (2.3475)
+Pair time (%) = 0.000422001 (3.07592)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000131011 (0.747365)
-Outpt time (%) = 0.000337481 (1.9252)
-Other time (%) = 0.0166497 (94.9799)
+Comm time (%) = 0.000144958 (1.05659)
+Outpt time (%) = 0.000351846 (2.56457)
+Other time (%) = 0.0128007 (93.3029)
Nlocal: 224 ave 256 max 192 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 903 ave 1116 max 690 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 4528 ave 5376 max 3648 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 9056 ave 10752 max 7360 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 36224
Ave neighs/atom = 40.4286
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/cauchy_born/cb_volumetric.screen b/examples/USER/atc/cauchy_born/cb_volumetric.screen
index 3a98a5b33..63ecf289f 100644
--- a/examples/USER/atc/cauchy_born/cb_volumetric.screen
+++ b/examples/USER/atc/cauchy_born/cb_volumetric.screen
@@ -1,389 +1,391 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable lattice_constant equal 5.256227487
variable c equal 6
variable L equal $c*${lattice_constant}
variable L equal 6*${lattice_constant}
variable L equal 6*5.2562274870000003091
#variable d equal 0.01
variable d equal 0.005
variable s equal 1.005
variable V0 equal ($c*${lattice_constant})^3
variable V0 equal (6*${lattice_constant})^3
variable V0 equal (6*5.2562274870000003091)^3
# create system
lattice fcc ${lattice_constant} origin 0.25 0.25 0.25
lattice fcc 5.2562274870000003091 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.25623 5.25623 5.25623
region box block 0 $c 0 $c 0 $c
region box block 0 6 0 $c 0 $c
region box block 0 6 0 6 0 $c
region box block 0 6 0 6 0 6
boundary p p p
create_box 1 box
Created orthogonal box = (0 0 0) to (31.5374 31.5374 31.5374)
1 by 2 by 2 MPI processor grid
create_atoms 1 box
Created 864 atoms
mass 1 39.95
group all region box
864 atoms in group all
pair_style lj/cut 13.5
pair_coeff 1 1 0.238 3.405
# ID group atc PhysicsType ParameterFile
fix AtC all atc field Ar_CauchyBorn.mat
ATC: constructing shape function field estimate with parameter file Ar_CauchyBorn.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC mesh create $c $c $c box p p p
fix_modify AtC mesh create 6 $c $c box p p p
fix_modify AtC mesh create 6 6 $c box p p p
fix_modify AtC mesh create 6 6 6 box p p p
ATC: created uniform mesh with 343 nodes, 216 unique nodes, and 216 elements
fix_modify AtC fields none
fix_modify AtC fields add displacement
fix_modify AtC fields add internal_energy stress cauchy_born_energy cauchy_born_stress
fix_modify AtC gradients add displacement
+fix_modify AtC set reference_potential_energy 0.
fix_modify AtC output cb_volumetricFE 1 full_text tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
log cb_volumetric.log
thermo 100
variable gamma equal 0.0
variable step equal 0
thermo_style custom step v_step pxx pyy pzz pxy pxz pyz v_gamma pe
timestep 0.0
min_modify line quadratic
timestep 0.0
variable i loop 4
label loop_i
print ">>> step $i"
>>> step 1
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: CB stiffness: 7.56717 Einstein freq: 0.355649
ATC: computing bond matrix ...........done
Memory usage per processor = 23.7542 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng
0 0 -4.8909542e-07 -4.8909515e-07 -4.8909708e-07 3.5104429e-13 -1.4141608e-12 -8.6196267e-13 0 -1743.9897
1 0 -4.8909445e-07 -4.8909445e-07 -4.8909627e-07 2.4570879e-13 -1.3724298e-12 -8.8539776e-13 0 -1743.9897
-Loop time of 0.152578 on 4 procs for 1 steps with 864 atoms
+Loop time of 0.00983393 on 4 procs for 1 steps with 864 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-1743.9896675 -1743.9896675 -1743.9896675
Force two-norm initial, final = 4.7305e-13 3.32302e-13
Force max component initial, final = 1.93665e-14 1.80689e-14
Final line search alpha, max atom move = 1 1.80689e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.00802612 (5.26033)
+Pair time (%) = 0.00797921 (81.1396)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0638427 (41.8426)
+Comm time (%) = 0.00149757 (15.2286)
Outpt time (%) = 0 (0)
-Other time (%) = 0.0807094 (52.8971)
+Other time (%) = 0.000357151 (3.63182)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3672 ave 3672 max 3672 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46224 ave 46224 max 46224 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 92448 ave 92448 max 92448 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 369792
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.0675 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng
1 0 -4.8909426e-07 -4.890941e-07 -4.8909627e-07 1.0203176e-13 -1.3879622e-12 -8.8539776e-13 0 -1743.9897
2 0 -4.8909426e-07 -4.890941e-07 -4.8909627e-07 1.0203176e-13 -1.3879622e-12 -8.8539776e-13 0 -1743.9897
-Loop time of 1.74483 on 4 procs for 1 steps with 864 atoms
+Loop time of 0.575954 on 4 procs for 1 steps with 864 atoms
-Pair time (%) = 0.00266743 (0.152876)
+Pair time (%) = 0.00268799 (0.466703)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0846363 (4.85068)
-Outpt time (%) = 0.0165098 (0.946209)
-Other time (%) = 1.64102 (94.0502)
+Comm time (%) = 0.000530005 (0.0920221)
+Outpt time (%) = 0.00400174 (0.694802)
+Other time (%) = 0.568734 (98.7465)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3672 ave 3672 max 3672 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46224 ave 46289 max 46159 min
Histogram: 1 0 0 0 0 2 0 0 0 1
FullNghs: 92448 ave 92448 max 92448 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 369792
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 0+1
change_box all x scale $s y scale $s z scale $s remap
change_box all x scale 1.0049999999999998934 y scale $s z scale $s remap
change_box all x scale 1.0049999999999998934 y scale 1.0049999999999998934 z scale $s remap
change_box all x scale 1.0049999999999998934 y scale 1.0049999999999998934 z scale 1.0049999999999998934 remap
Changing box ...
orthogonal box = (-0.0788434 0 0) to (31.6162 31.5374 31.5374)
orthogonal box = (-0.0788434 -0.0788434 0) to (31.6162 31.6162 31.5374)
orthogonal box = (-0.0788434 -0.0788434 -0.0788434) to (31.6162 31.6162 31.6162)
variable gamma equal lx/$L-1.0
variable gamma equal lx/31.537364922000001854-1.0
next i
jump in.cb_volumetric loop_i
print ">>> step $i"
>>> step 2
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.7542 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng
2 1 -429.84615 -429.84615 -429.84615 1.6244616e-13 -2.4910642e-13 -7.3535979e-13 0.005 -1742.4738
4 1 -429.84615 -429.84615 -429.84615 -1.2399576e-13 -9.5902644e-13 -1.3896357e-12 0.005 -1742.4738
-Loop time of 1.44839 on 4 procs for 2 steps with 864 atoms
+Loop time of 0.0153523 on 4 procs for 2 steps with 864 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-1742.47382006 -1742.47382006 -1742.47382006
Force two-norm initial, final = 5.8003e-13 4.02116e-13
Force max component initial, final = 2.59532e-14 1.42178e-14
Final line search alpha, max atom move = 1 1.42178e-14
Iterations, force evaluations = 2 4
-Pair time (%) = 0.0205068 (1.41584)
+Pair time (%) = 0.0126073 (82.1197)
Neigh time (%) = 0 (0)
-Comm time (%) = 1.02466 (70.7452)
+Comm time (%) = 0.0022223 (14.4753)
Outpt time (%) = 0 (0)
-Other time (%) = 0.403216 (27.8389)
+Other time (%) = 0.000522733 (3.40491)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3672 ave 3672 max 3672 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46224 ave 46281 max 46167 min
Histogram: 1 0 0 0 0 2 0 0 0 1
FullNghs: 92448 ave 92448 max 92448 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 369792
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.0675 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng
4 1 -429.84615 -429.84615 -429.84615 -9.7213572e-14 -9.5902644e-13 -1.3896357e-12 0.005 -1742.4738
5 1 -429.84615 -429.84615 -429.84615 -9.7213572e-14 -9.5902644e-13 -1.3896357e-12 0.005 -1742.4738
-Loop time of 2.702 on 4 procs for 1 steps with 864 atoms
+Loop time of 0.590406 on 4 procs for 1 steps with 864 atoms
-Pair time (%) = 0.00525749 (0.194578)
+Pair time (%) = 0.00274575 (0.465061)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.154782 (5.72844)
-Outpt time (%) = 0.149323 (5.52637)
-Other time (%) = 2.39264 (88.5506)
+Comm time (%) = 0.00058037 (0.0983003)
+Outpt time (%) = 0.0134678 (2.28111)
+Other time (%) = 0.573612 (97.1555)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3672 ave 3672 max 3672 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46224 ave 46339 max 46109 min
Histogram: 1 0 0 0 0 2 0 0 0 1
FullNghs: 92448 ave 92448 max 92448 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 369792
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 1+1
change_box all x scale $s y scale $s z scale $s remap
change_box all x scale 1.0049999999999998934 y scale $s z scale $s remap
change_box all x scale 1.0049999999999998934 y scale 1.0049999999999998934 z scale $s remap
change_box all x scale 1.0049999999999998934 y scale 1.0049999999999998934 z scale 1.0049999999999998934 remap
Changing box ...
orthogonal box = (-0.158081 -0.0788434 -0.0788434) to (31.6954 31.6162 31.6162)
orthogonal box = (-0.158081 -0.158081 -0.0788434) to (31.6954 31.6954 31.6162)
orthogonal box = (-0.158081 -0.158081 -0.158081) to (31.6954 31.6954 31.6954)
variable gamma equal lx/$L-1.0
variable gamma equal lx/31.537364922000001854-1.0
next i
jump in.cb_volumetric loop_i
print ">>> step $i"
>>> step 3
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.7542 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng
5 2 -778.0092 -778.0092 -778.0092 7.4220526e-13 1.122178e-12 -9.6027588e-13 0.010025 -1730.6001
6 2 -778.0092 -778.0092 -778.0092 2.027045e-13 5.1825031e-13 -9.2993731e-13 0.010025 -1730.6001
-Loop time of 0.637543 on 4 procs for 1 steps with 864 atoms
+Loop time of 0.060119 on 4 procs for 1 steps with 864 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-1730.60014837 -1730.60014837 -1730.60014837
Force two-norm initial, final = 8.6018e-13 3.15291e-13
Force max component initial, final = 4.77673e-14 1.4759e-14
Final line search alpha, max atom move = 1 1.4759e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.00699323 (1.0969)
+Pair time (%) = 0.0116553 (19.387)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.473002 (74.1913)
+Comm time (%) = 0.0277966 (46.2359)
Outpt time (%) = 0 (0)
-Other time (%) = 0.157548 (24.7118)
+Other time (%) = 0.0206672 (34.3771)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3672 ave 3672 max 3672 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46224 ave 46339 max 46109 min
Histogram: 1 0 0 0 0 2 0 0 0 1
FullNghs: 92448 ave 92448 max 92448 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 369792
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.0675 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng
6 2 -778.0092 -778.0092 -778.0092 2.7752314e-13 5.1825031e-13 -9.2993731e-13 0.010025 -1730.6001
7 2 -778.0092 -778.0092 -778.0092 2.7752314e-13 5.1825031e-13 -9.2993731e-13 0.010025 -1730.6001
-Loop time of 2.39483 on 4 procs for 1 steps with 864 atoms
+Loop time of 0.615686 on 4 procs for 1 steps with 864 atoms
-Pair time (%) = 0.00456077 (0.190443)
+Pair time (%) = 0.00230658 (0.374636)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0782377 (3.26694)
-Outpt time (%) = 0.0521472 (2.17749)
-Other time (%) = 2.25988 (94.3651)
+Comm time (%) = 0.000686169 (0.111448)
+Outpt time (%) = 0.014639 (2.37767)
+Other time (%) = 0.598054 (97.1362)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3672 ave 3672 max 3672 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46224 ave 46348 max 46100 min
Histogram: 1 0 0 0 0 2 0 0 0 1
FullNghs: 92448 ave 92448 max 92448 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 369792
Ave neighs/atom = 428
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 2+1
change_box all x scale $s y scale $s z scale $s remap
change_box all x scale 1.0049999999999998934 y scale $s z scale $s remap
change_box all x scale 1.0049999999999998934 y scale 1.0049999999999998934 z scale $s remap
change_box all x scale 1.0049999999999998934 y scale 1.0049999999999998934 z scale 1.0049999999999998934 remap
Changing box ...
orthogonal box = (-0.237715 -0.158081 -0.158081) to (31.7751 31.6954 31.6954)
orthogonal box = (-0.237715 -0.237715 -0.158081) to (31.7751 31.7751 31.6954)
orthogonal box = (-0.237715 -0.237715 -0.237715) to (31.7751 31.7751 31.7751)
variable gamma equal lx/$L-1.0
variable gamma equal lx/31.537364922000001854-1.0
next i
jump in.cb_volumetric loop_i
print ">>> step $i"
>>> step 4
minimize 1.e-20 1.e-20 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ..........done
Memory usage per processor = 23.7542 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng
7 3 -1113.9681 -1113.9681 -1113.9681 -7.697124e-13 -4.3806097e-13 1.4128091e-12 0.015075125 -1723.8495
8 3 -1113.9681 -1113.9681 -1113.9681 6.6266201e-13 4.7186976e-13 2.719048e-12 0.015075125 -1723.8495
-Loop time of 0.00824732 on 4 procs for 1 steps with 864 atoms
+Loop time of 0.0183592 on 4 procs for 1 steps with 864 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-1723.84952404 -1723.84952404 -1723.84952404
Force two-norm initial, final = 8.94607e-13 5.41927e-13
Force max component initial, final = 4.1616e-14 2.31482e-14
Final line search alpha, max atom move = 1 2.31482e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.00639701 (77.5647)
+Pair time (%) = 0.00894445 (48.7191)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00148129 (17.9609)
+Comm time (%) = 0.00900757 (49.0629)
Outpt time (%) = 0 (0)
-Other time (%) = 0.000369012 (4.47433)
+Other time (%) = 0.000407219 (2.21806)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3672 ave 3672 max 3672 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 41040 ave 41099 max 40981 min
Histogram: 1 0 0 0 0 2 0 0 0 1
FullNghs: 82080 ave 82080 max 82080 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 328320
Ave neighs/atom = 380
Neighbor list builds = 0
Dangerous builds = 0
run 1
Setting up run ...
ATC: computing bond matrix ..........done
Memory usage per processor = 23.0675 Mbytes
Step step Pxx Pyy Pzz Pxy Pxz Pyz gamma PotEng
8 3 -1113.9681 -1113.9681 -1113.9681 6.4417311e-13 5.3127209e-13 2.719048e-12 0.015075125 -1723.8495
9 3 -1113.9681 -1113.9681 -1113.9681 6.4417311e-13 5.3127209e-13 2.719048e-12 0.015075125 -1723.8495
-Loop time of 1.98395 on 4 procs for 1 steps with 864 atoms
+Loop time of 0.539399 on 4 procs for 1 steps with 864 atoms
-Pair time (%) = 0.00230694 (0.11628)
+Pair time (%) = 0.00221151 (0.409995)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00056833 (0.0286464)
-Outpt time (%) = 0.050661 (2.55354)
-Other time (%) = 1.93041 (97.3015)
+Comm time (%) = 0.000580788 (0.107673)
+Outpt time (%) = 0.013225 (2.45181)
+Other time (%) = 0.523382 (97.0305)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3672 ave 3672 max 3672 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 41040 ave 41313 max 40767 min
Histogram: 1 0 0 0 0 2 0 0 0 1
FullNghs: 82080 ave 82080 max 82080 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 328320
Ave neighs/atom = 380
Neighbor list builds = 0
Dangerous builds = 0
variable step equal ${step}+1
variable step equal 3+1
change_box all x scale $s y scale $s z scale $s remap
change_box all x scale 1.0049999999999998934 y scale $s z scale $s remap
change_box all x scale 1.0049999999999998934 y scale 1.0049999999999998934 z scale $s remap
change_box all x scale 1.0049999999999998934 y scale 1.0049999999999998934 z scale 1.0049999999999998934 remap
Changing box ...
orthogonal box = (-0.317747 -0.237715 -0.237715) to (31.8551 31.7751 31.7751)
orthogonal box = (-0.317747 -0.317747 -0.237715) to (31.8551 31.8551 31.7751)
orthogonal box = (-0.317747 -0.317747 -0.317747) to (31.8551 31.8551 31.8551)
variable gamma equal lx/$L-1.0
variable gamma equal lx/31.537364922000001854-1.0
next i
jump in.cb_volumetric loop_i
diff --git a/examples/USER/atc/cauchy_born/flying_cube.screen b/examples/USER/atc/cauchy_born/flying_cube.screen
index 4bb47fcb2..96ffeaa72 100644
--- a/examples/USER/atc/cauchy_born/flying_cube.screen
+++ b/examples/USER/atc/cauchy_born/flying_cube.screen
@@ -1,568 +1,569 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
log log.flying_cube
units real
atom_style atomic
variable lattice_constant equal 5.256227487
variable c equal 6
variable L equal (${lattice_constant}*$c)
variable L equal (5.2562274870000003091*$c)
variable L equal (5.2562274870000003091*6)
variable V equal $L*$L*$L
variable V equal 31.537364922000001854*$L*$L
variable V equal 31.537364922000001854*31.537364922000001854*$L
variable V equal 31.537364922000001854*31.537364922000001854*31.537364922000001854
print "Volume : $V"
Volume : 31367.233018713999627
variable s equal 10
variable dt equal 0.1
variable v equal 0.1
variable m equal 39.95
# create system
lattice fcc ${lattice_constant} origin 0.01 0.01 0.01
lattice fcc 5.2562274870000003091 origin 0.01 0.01 0.01
Lattice spacing in x,y,z = 5.25623 5.25623 5.25623
region box block 0 $c 0 $c 0 $c
region box block 0 6 0 $c 0 $c
region box block 0 6 0 6 0 $c
region box block 0 6 0 6 0 6
boundary p p p
# boundary p s s
create_box 1 box
Created orthogonal box = (0 0 0) to (31.5374 31.5374 31.5374)
1 by 2 by 2 MPI processor grid
create_atoms 1 region box
Created 864 atoms
mass 1 $m
mass 1 39.950000000000002842
group all region box
864 atoms in group all
pair_style lj/cut 13.5
pair_coeff 1 1 0.238 3.405
# define region
neighbor 1.0 bin
neigh_modify delay 0 every 200 check no
# neigh_modify delay 0 every $n
reset_timestep 0
thermo $s
thermo 10
compute_modify thermo_temp extra 0
thermo_style custom step temp pxx pyy pzz etotal lx ly lz
timestep ${dt}
timestep 0.10000000000000000555
min_modify line quadratic
minimize 0. 0. 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
Memory usage per processor = 2.90511 Mbytes
Step Temp Pxx Pyy Pzz TotEng Lx Ly Lz
0 0 -4.8909602e-07 -4.8909602e-07 -4.8909727e-07 -1743.9897 31.537365 31.537365 31.537365
10 0 -4.8910206e-07 -4.8910173e-07 -4.891027e-07 -1743.9897 31.537365 31.537365 31.537365
20 0 -4.8910163e-07 -4.8910171e-07 -4.8910289e-07 -1743.9897 31.537365 31.537365 31.537365
30 0 -4.8910045e-07 -4.8910034e-07 -4.8910129e-07 -1743.9897 31.537365 31.537365 31.537365
40 0 -4.8910136e-07 -4.891012e-07 -4.8910284e-07 -1743.9897 31.537365 31.537365 31.537365
50 0 -4.8910093e-07 -4.8910075e-07 -4.8910206e-07 -1743.9897 31.537365 31.537365 31.537365
60 0 -4.8910118e-07 -4.8910068e-07 -4.8910206e-07 -1743.9897 31.537365 31.537365 31.537365
70 0 -4.8910152e-07 -4.891015e-07 -4.8910292e-07 -1743.9897 31.537365 31.537365 31.537365
80 0 -4.8910039e-07 -4.891003e-07 -4.8910152e-07 -1743.9897 31.537365 31.537365 31.537365
90 0 -4.8910067e-07 -4.8910044e-07 -4.891015e-07 -1743.9897 31.537365 31.537365 31.537365
100 0 -4.8910167e-07 -4.8910159e-07 -4.8910289e-07 -1743.9897 31.537365 31.537365 31.537365
110 0 -4.8910086e-07 -4.8910059e-07 -4.8910202e-07 -1743.9897 31.537365 31.537365 31.537365
120 0 -4.8910062e-07 -4.8910061e-07 -4.8910155e-07 -1743.9897 31.537365 31.537365 31.537365
130 0 -4.8910107e-07 -4.8910086e-07 -4.8910219e-07 -1743.9897 31.537365 31.537365 31.537365
140 0 -4.8910086e-07 -4.8910076e-07 -4.8910157e-07 -1743.9897 31.537365 31.537365 31.537365
150 0 -4.8910119e-07 -4.8910116e-07 -4.8910235e-07 -1743.9897 31.537365 31.537365 31.537365
160 0 -4.8910081e-07 -4.8910037e-07 -4.8910204e-07 -1743.9897 31.537365 31.537365 31.537365
170 0 -4.8910074e-07 -4.8910056e-07 -4.891015e-07 -1743.9897 31.537365 31.537365 31.537365
180 0 -4.8910116e-07 -4.8910096e-07 -4.8910206e-07 -1743.9897 31.537365 31.537365 31.537365
190 0 -4.8910145e-07 -4.8910125e-07 -4.8910243e-07 -1743.9897 31.537365 31.537365 31.537365
200 0 -4.891014e-07 -4.8910125e-07 -4.8910228e-07 -1743.9897 31.537365 31.537365 31.537365
210 0 -4.8910087e-07 -4.8910055e-07 -4.8910194e-07 -1743.9897 31.537365 31.537365 31.537365
220 0 -4.8910114e-07 -4.8910114e-07 -4.8910217e-07 -1743.9897 31.537365 31.537365 31.537365
230 0 -4.8910091e-07 -4.8910061e-07 -4.8910186e-07 -1743.9897 31.537365 31.537365 31.537365
240 0 -4.8909998e-07 -4.8909969e-07 -4.8910083e-07 -1743.9897 31.537365 31.537365 31.537365
250 0 -4.8910075e-07 -4.8910067e-07 -4.8910187e-07 -1743.9897 31.537365 31.537365 31.537365
260 0 -4.8910094e-07 -4.8910053e-07 -4.8910199e-07 -1743.9897 31.537365 31.537365 31.537365
270 0 -4.8910052e-07 -4.8910007e-07 -4.8910129e-07 -1743.9897 31.537365 31.537365 31.537365
280 0 -4.8910008e-07 -4.8910018e-07 -4.8910121e-07 -1743.9897 31.537365 31.537365 31.537365
290 0 -4.8910141e-07 -4.8910101e-07 -4.8910247e-07 -1743.9897 31.537365 31.537365 31.537365
300 0 -4.8910129e-07 -4.8910131e-07 -4.8910231e-07 -1743.9897 31.537365 31.537365 31.537365
310 0 -4.8910076e-07 -4.8910049e-07 -4.8910202e-07 -1743.9897 31.537365 31.537365 31.537365
320 0 -4.8910069e-07 -4.8910069e-07 -4.8910182e-07 -1743.9897 31.537365 31.537365 31.537365
330 0 -4.8910161e-07 -4.891015e-07 -4.8910243e-07 -1743.9897 31.537365 31.537365 31.537365
340 0 -4.8910108e-07 -4.8910082e-07 -4.8910234e-07 -1743.9897 31.537365 31.537365 31.537365
350 0 -4.8910041e-07 -4.891003e-07 -4.891015e-07 -1743.9897 31.537365 31.537365 31.537365
360 0 -4.8910112e-07 -4.8910093e-07 -4.8910167e-07 -1743.9897 31.537365 31.537365 31.537365
370 0 -4.8910094e-07 -4.8910056e-07 -4.8910189e-07 -1743.9897 31.537365 31.537365 31.537365
380 0 -4.8910084e-07 -4.8910062e-07 -4.8910171e-07 -1743.9897 31.537365 31.537365 31.537365
390 0 -4.8910136e-07 -4.8910096e-07 -4.8910228e-07 -1743.9897 31.537365 31.537365 31.537365
400 0 -4.8910095e-07 -4.8910088e-07 -4.8910169e-07 -1743.9897 31.537365 31.537365 31.537365
410 0 -4.8910022e-07 -4.8910021e-07 -4.891012e-07 -1743.9897 31.537365 31.537365 31.537365
420 0 -4.8910064e-07 -4.8910021e-07 -4.8910148e-07 -1743.9897 31.537365 31.537365 31.537365
430 0 -4.8910133e-07 -4.8910124e-07 -4.8910259e-07 -1743.9897 31.537365 31.537365 31.537365
440 0 -4.8910157e-07 -4.8910149e-07 -4.8910257e-07 -1743.9897 31.537365 31.537365 31.537365
450 0 -4.8910088e-07 -4.8910081e-07 -4.8910183e-07 -1743.9897 31.537365 31.537365 31.537365
460 0 -4.8910078e-07 -4.8910056e-07 -4.8910168e-07 -1743.9897 31.537365 31.537365 31.537365
470 0 -4.8910048e-07 -4.8910015e-07 -4.8910164e-07 -1743.9897 31.537365 31.537365 31.537365
480 0 -4.8910054e-07 -4.8910048e-07 -4.8910165e-07 -1743.9897 31.537365 31.537365 31.537365
490 0 -4.8910103e-07 -4.8910094e-07 -4.8910185e-07 -1743.9897 31.537365 31.537365 31.537365
500 0 -4.8910081e-07 -4.8910044e-07 -4.891017e-07 -1743.9897 31.537365 31.537365 31.537365
-Loop time of 4.18888 on 4 procs for 500 steps with 864 atoms
+Loop time of 3.9743 on 4 procs for 500 steps with 864 atoms
Minimization stats:
Stopping criterion = max force evaluations
Energy initial, next-to-last, final =
-1743.9896675 -1743.9896675 -1743.9896675
Force two-norm initial, final = 4.69398e-13 3.47977e-13
Force max component initial, final = 2.08236e-14 1.74791e-14
Final line search alpha, max atom move = 1 1.74791e-14
Iterations, force evaluations = 500 1000
-Pair time (%) = 2.3942 (57.1561)
+Pair time (%) = 2.24396 (56.4617)
Neigh time (%) = 0 (0)
-Comm time (%) = 1.44252 (34.4369)
-Outpt time (%) = 0.00359005 (0.0857043)
-Other time (%) = 0.348568 (8.32127)
+Comm time (%) = 1.37063 (34.4873)
+Outpt time (%) = 0.00599617 (0.150873)
+Other time (%) = 0.353717 (8.9001)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3107 ave 3107 max 3107 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 39744 ave 39744 max 39744 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 158976
Ave neighs/atom = 184
Neighbor list builds = 0
Dangerous builds = 0
reset_timestep 0
variable xLO equal xlo
variable xHI equal xhi
variable yLO equal ylo
variable yHI equal yhi
variable zLO equal zlo
variable zHI equal zhi
# region BOX block ${xLO} ${xHI} ${yLO} ${yHI} ${zLO} ${zHI} units box
region BOX block ${xLO} ${xHI} -0.5 31.7 -0.5 31.7 units box
region BOX block 0 ${xHI} -0.5 31.7 -0.5 31.7 units box
region BOX block 0 31.537364922000001854 -0.5 31.7 -0.5 31.7 units box
fix ATC all atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify ATC mesh create 1 1 1 box p p p
ATC: created uniform mesh with 8 nodes, 1 unique nodes, and 1 elements
fix_modify ATC fields add stress velocity displacement
fix_modify ATC fields add temperature kinetic_temperature
fix_modify ATC fields add internal_energy energy
fix_modify ATC output flying_cubeFE $s text binary tensor_components
fix_modify ATC output flying_cubeFE 10 text binary tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
# fix_modify ATC atomic_output flying_cubeMD $m text binary tensor_components
dump dumpfc all atom $s flying_cube.dmp
dump dumpfc all atom 10 flying_cube.dmp
velocity all set $v 0.0 0.0 units box
velocity all set 0.10000000000000000555 0.0 0.0 units box
fix NVE all nve
run 3500
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 23.3621 Mbytes
Step Temp Pxx Pyy Pzz TotEng Lx Ly Lz
0 160162.49 1803377.9 -4.8910028e-07 -4.8910148e-07 410741.67 31.537365 31.537365 31.537365
10 160162.49 1803377.9 -4.891001e-07 -4.8910151e-07 410741.67 31.537365 31.537365 31.537365
20 160162.49 1803377.9 -4.8910035e-07 -4.8910193e-07 410741.67 31.537365 31.537365 31.537365
30 160162.49 1803377.9 -4.8909978e-07 -4.8910135e-07 410741.67 31.537365 31.537365 31.537365
40 160162.49 1803377.9 -4.8910011e-07 -4.8910149e-07 410741.67 31.537365 31.537365 31.537365
50 160162.49 1803377.9 -4.8910063e-07 -4.8910222e-07 410741.67 31.537365 31.537365 31.537365
60 160162.49 1803377.9 -4.8910116e-07 -4.8910273e-07 410741.67 31.537365 31.537365 31.537365
70 160162.49 1803377.9 -4.8909952e-07 -4.8910063e-07 410741.67 31.537365 31.537365 31.537365
80 160162.49 1803377.9 -4.8909944e-07 -4.8910079e-07 410741.67 31.537365 31.537365 31.537365
90 160162.49 1803377.9 -4.8909983e-07 -4.8910138e-07 410741.67 31.537365 31.537365 31.537365
100 160162.49 1803377.9 -4.8910034e-07 -4.8910169e-07 410741.67 31.537365 31.537365 31.537365
110 160162.49 1803377.9 -4.89101e-07 -4.8910251e-07 410741.67 31.537365 31.537365 31.537365
120 160162.49 1803377.9 -4.8910056e-07 -4.8910197e-07 410741.67 31.537365 31.537365 31.537365
130 160162.49 1803377.9 -4.8909949e-07 -4.8910097e-07 410741.67 31.537365 31.537365 31.537365
140 160162.49 1803377.9 -4.8909962e-07 -4.891013e-07 410741.67 31.537365 31.537365 31.537365
150 160162.49 1803377.9 -4.8910071e-07 -4.8910266e-07 410741.67 31.537365 31.537365 31.537365
160 160162.49 1803377.9 -4.8910088e-07 -4.8910202e-07 410741.67 31.537365 31.537365 31.537365
170 160162.49 1803377.9 -4.8910129e-07 -4.8910258e-07 410741.67 31.537365 31.537365 31.537365
180 160162.49 1803377.9 -4.890993e-07 -4.8910071e-07 410741.67 31.537365 31.537365 31.537365
190 160162.49 1803377.9 -4.8909971e-07 -4.8910093e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
200 160162.49 1803377.9 -4.891008e-07 -4.8910283e-07 410741.67 31.537365 31.537365 31.537365
210 160162.49 1803377.9 -4.890997e-07 -4.8910144e-07 410741.67 31.537365 31.537365 31.537365
220 160162.49 1803377.9 -4.8910119e-07 -4.8910291e-07 410741.67 31.537365 31.537365 31.537365
230 160162.49 1803377.9 -4.8909943e-07 -4.8910089e-07 410741.67 31.537365 31.537365 31.537365
240 160162.49 1803377.9 -4.8910063e-07 -4.8910215e-07 410741.67 31.537365 31.537365 31.537365
250 160162.49 1803377.9 -4.8909965e-07 -4.8910022e-07 410741.67 31.537365 31.537365 31.537365
260 160162.49 1803377.9 -4.891006e-07 -4.891015e-07 410741.67 31.537365 31.537365 31.537365
270 160162.49 1803377.9 -4.8909947e-07 -4.8910024e-07 410741.67 31.537365 31.537365 31.537365
280 160162.49 1803377.9 -4.8910084e-07 -4.8910122e-07 410741.67 31.537365 31.537365 31.537365
290 160162.49 1803377.9 -4.8909975e-07 -4.8910054e-07 410741.67 31.537365 31.537365 31.537365
300 160162.49 1803377.9 -4.8910072e-07 -4.8910181e-07 410741.67 31.537365 31.537365 31.537365
310 160162.49 1803377.9 -4.8909944e-07 -4.8910007e-07 410741.67 31.537365 31.537365 31.537365
320 160162.49 1803377.9 -4.8910063e-07 -4.8910138e-07 410741.67 31.537365 31.537365 31.537365
330 160162.49 1803377.9 -4.8909953e-07 -4.8910017e-07 410741.67 31.537365 31.537365 31.537365
340 160162.49 1803377.9 -4.891006e-07 -4.8910125e-07 410741.67 31.537365 31.537365 31.537365
350 160162.49 1803377.9 -4.8909961e-07 -4.8910025e-07 410741.67 31.537365 31.537365 31.537365
360 160162.49 1803377.9 -4.8910103e-07 -4.8910158e-07 410741.67 31.537365 31.537365 31.537365
370 160162.49 1803377.9 -4.8909975e-07 -4.8910072e-07 410741.67 31.537365 31.537365 31.537365
380 160162.49 1803377.9 -4.8910078e-07 -4.8910186e-07 410741.67 31.537365 31.537365 31.537365
390 160162.49 1803377.9 -4.8909978e-07 -4.8910066e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
400 160162.49 1803377.9 -4.8910055e-07 -4.891012e-07 410741.67 31.537365 31.537365 31.537365
410 160162.49 1803377.9 -4.8910124e-07 -4.8910227e-07 410741.67 31.537365 31.537365 31.537365
420 160162.49 1803377.9 -4.8910154e-07 -4.8910257e-07 410741.67 31.537365 31.537365 31.537365
430 160162.49 1803377.9 -4.8909931e-07 -4.8910036e-07 410741.67 31.537365 31.537365 31.537365
440 160162.49 1803377.9 -4.8909944e-07 -4.8910102e-07 410741.67 31.537365 31.537365 31.537365
450 160162.49 1803377.9 -4.8910046e-07 -4.8910127e-07 410741.67 31.537365 31.537365 31.537365
460 160162.49 1803377.9 -4.8910099e-07 -4.8910172e-07 410741.67 31.537365 31.537365 31.537365
470 160162.49 1803377.9 -4.890996e-07 -4.8910061e-07 410741.67 31.537365 31.537365 31.537365
480 160162.49 1803377.9 -4.8910115e-07 -4.8910244e-07 410741.67 31.537365 31.537365 31.537365
490 160162.49 1803377.9 -4.890994e-07 -4.8910022e-07 410741.67 31.537365 31.537365 31.537365
500 160162.49 1803377.9 -4.8910113e-07 -4.8910185e-07 410741.67 31.537365 31.537365 31.537365
510 160162.49 1803377.9 -4.8909993e-07 -4.8910122e-07 410741.67 31.537365 31.537365 31.537365
520 160162.49 1803377.9 -4.8910114e-07 -4.891021e-07 410741.67 31.537365 31.537365 31.537365
530 160162.49 1803377.9 -4.8909951e-07 -4.8910036e-07 410741.67 31.537365 31.537365 31.537365
540 160162.49 1803377.9 -4.8910118e-07 -4.891021e-07 410741.67 31.537365 31.537365 31.537365
550 160162.49 1803377.9 -4.8909977e-07 -4.8910067e-07 410741.67 31.537365 31.537365 31.537365
560 160162.49 1803377.9 -4.891014e-07 -4.8910218e-07 410741.67 31.537365 31.537365 31.537365
570 160162.49 1803377.9 -4.8910006e-07 -4.8910084e-07 410741.67 31.537365 31.537365 31.537365
580 160162.49 1803377.9 -4.8910121e-07 -4.8910187e-07 410741.67 31.537365 31.537365 31.537365
590 160162.49 1803377.9 -4.8910007e-07 -4.8910063e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
600 160162.49 1803377.9 -4.8910068e-07 -4.8910167e-07 410741.67 31.537365 31.537365 31.537365
610 160162.49 1803377.9 -4.8910136e-07 -4.891022e-07 410741.67 31.537365 31.537365 31.537365
620 160162.49 1803377.9 -4.891021e-07 -4.8910323e-07 410741.67 31.537365 31.537365 31.537365
630 160162.49 1803377.9 -4.8910001e-07 -4.8910121e-07 410741.67 31.537365 31.537365 31.537365
640 160162.49 1803377.9 -4.8910029e-07 -4.8910124e-07 410741.67 31.537365 31.537365 31.537365
650 160162.49 1803377.9 -4.8910081e-07 -4.8910162e-07 410741.67 31.537365 31.537365 31.537365
660 160162.49 1803377.9 -4.8910154e-07 -4.8910247e-07 410741.67 31.537365 31.537365 31.537365
670 160162.49 1803377.9 -4.8910161e-07 -4.8910291e-07 410741.67 31.537365 31.537365 31.537365
680 160162.49 1803377.9 -4.8910203e-07 -4.8910281e-07 410741.67 31.537365 31.537365 31.537365
690 160162.49 1803377.9 -4.8910016e-07 -4.8910122e-07 410741.67 31.537365 31.537365 31.537365
700 160162.49 1803377.9 -4.8910066e-07 -4.8910144e-07 410741.67 31.537365 31.537365 31.537365
710 160162.49 1803377.9 -4.891009e-07 -4.8910203e-07 410741.67 31.537365 31.537365 31.537365
720 160162.49 1803377.9 -4.8910149e-07 -4.8910252e-07 410741.67 31.537365 31.537365 31.537365
730 160162.49 1803377.9 -4.8910048e-07 -4.8910151e-07 410741.67 31.537365 31.537365 31.537365
740 160162.49 1803377.9 -4.8910177e-07 -4.8910298e-07 410741.67 31.537365 31.537365 31.537365
750 160162.49 1803377.9 -4.891001e-07 -4.8910128e-07 410741.67 31.537365 31.537365 31.537365
760 160162.49 1803377.9 -4.8910154e-07 -4.8910271e-07 410741.67 31.537365 31.537365 31.537365
770 160162.49 1803377.9 -4.8910033e-07 -4.8910152e-07 410741.67 31.537365 31.537365 31.537365
780 160162.49 1803377.9 -4.8910155e-07 -4.8910272e-07 410741.67 31.537365 31.537365 31.537365
790 160162.49 1803377.9 -4.8910029e-07 -4.89101e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
800 160162.49 1803377.9 -4.8910078e-07 -4.8910154e-07 410741.67 31.537365 31.537365 31.537365
810 160162.49 1803377.9 -4.891018e-07 -4.8910281e-07 410741.67 31.537365 31.537365 31.537365
820 160162.49 1803377.9 -4.891006e-07 -4.8910146e-07 410741.67 31.537365 31.537365 31.537365
830 160162.49 1803377.9 -4.8910022e-07 -4.891007e-07 410741.67 31.537365 31.537365 31.537365
840 160162.49 1803377.9 -4.8910043e-07 -4.891009e-07 410741.67 31.537365 31.537365 31.537365
850 160162.49 1803377.9 -4.8910087e-07 -4.8910142e-07 410741.67 31.537365 31.537365 31.537365
860 160162.49 1803377.9 -4.8910141e-07 -4.8910245e-07 410741.67 31.537365 31.537365 31.537365
870 160162.49 1803377.9 -4.8910209e-07 -4.8910276e-07 410741.67 31.537365 31.537365 31.537365
880 160162.49 1803377.9 -4.891025e-07 -4.8910339e-07 410741.67 31.537365 31.537365 31.537365
890 160162.49 1803377.9 -4.8910017e-07 -4.8910105e-07 410741.67 31.537365 31.537365 31.537365
900 160162.49 1803377.9 -4.8910109e-07 -4.8910178e-07 410741.67 31.537365 31.537365 31.537365
910 160162.49 1803377.9 -4.891016e-07 -4.8910262e-07 410741.67 31.537365 31.537365 31.537365
920 160162.49 1803377.9 -4.8910171e-07 -4.891025e-07 410741.67 31.537365 31.537365 31.537365
930 160162.49 1803377.9 -4.8910262e-07 -4.8910309e-07 410741.67 31.537365 31.537365 31.537365
940 160162.49 1803377.9 -4.8910059e-07 -4.891009e-07 410741.67 31.537365 31.537365 31.537365
950 160162.49 1803377.9 -4.8910111e-07 -4.8910188e-07 410741.67 31.537365 31.537365 31.537365
960 160162.49 1803377.9 -4.8910107e-07 -4.8910157e-07 410741.67 31.537365 31.537365 31.537365
970 160162.49 1803377.9 -4.891018e-07 -4.8910219e-07 410741.67 31.537365 31.537365 31.537365
980 160162.49 1803377.9 -4.8910204e-07 -4.8910243e-07 410741.67 31.537365 31.537365 31.537365
990 160162.49 1803377.9 -4.8910035e-07 -4.8910071e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
1000 160162.49 1803377.9 -4.8910205e-07 -4.8910244e-07 410741.67 31.537365 31.537365 31.537365
1010 160162.49 1803377.9 -4.8910037e-07 -4.8910126e-07 410741.67 31.537365 31.537365 31.537365
1020 160162.49 1803377.9 -4.8910181e-07 -4.8910224e-07 410741.67 31.537365 31.537365 31.537365
1030 160162.49 1803377.9 -4.891006e-07 -4.8910102e-07 410741.67 31.537365 31.537365 31.537365
1040 160162.49 1803377.9 -4.8910185e-07 -4.8910239e-07 410741.67 31.537365 31.537365 31.537365
1050 160162.49 1803377.9 -4.8910046e-07 -4.8910089e-07 410741.67 31.537365 31.537365 31.537365
1060 160162.49 1803377.9 -4.8910166e-07 -4.8910217e-07 410741.67 31.537365 31.537365 31.537365
1070 160162.49 1803377.9 -4.8910042e-07 -4.8910091e-07 410741.67 31.537365 31.537365 31.537365
1080 160162.49 1803377.9 -4.8910181e-07 -4.8910253e-07 410741.67 31.537365 31.537365 31.537365
1090 160162.49 1803377.9 -4.8910038e-07 -4.8910121e-07 410741.67 31.537365 31.537365 31.537365
1100 160162.49 1803377.9 -4.8910188e-07 -4.8910256e-07 410741.67 31.537365 31.537365 31.537365
1110 160162.49 1803377.9 -4.891003e-07 -4.8910088e-07 410741.67 31.537365 31.537365 31.537365
1120 160162.49 1803377.9 -4.8910208e-07 -4.8910255e-07 410741.67 31.537365 31.537365 31.537365
1130 160162.49 1803377.9 -4.8910067e-07 -4.8910136e-07 410741.67 31.537365 31.537365 31.537365
1140 160162.49 1803377.9 -4.8910201e-07 -4.8910268e-07 410741.67 31.537365 31.537365 31.537365
1150 160162.49 1803377.9 -4.8910075e-07 -4.8910121e-07 410741.67 31.537365 31.537365 31.537365
1160 160162.49 1803377.9 -4.8910156e-07 -4.8910235e-07 410741.67 31.537365 31.537365 31.537365
1170 160162.49 1803377.9 -4.8910063e-07 -4.8910163e-07 410741.67 31.537365 31.537365 31.537365
1180 160162.49 1803377.9 -4.8910186e-07 -4.8910287e-07 410741.67 31.537365 31.537365 31.537365
1190 160162.49 1803377.9 -4.8910059e-07 -4.8910133e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
1200 160162.49 1803377.9 -4.8910131e-07 -4.8910218e-07 410741.67 31.537365 31.537365 31.537365
1210 160162.49 1803377.9 -4.8910182e-07 -4.8910275e-07 410741.67 31.537365 31.537365 31.537365
1220 160162.49 1803377.9 -4.8910251e-07 -4.891035e-07 410741.67 31.537365 31.537365 31.537365
1230 160162.49 1803377.9 -4.8910028e-07 -4.8910127e-07 410741.67 31.537365 31.537365 31.537365
1240 160162.49 1803377.9 -4.8910048e-07 -4.8910147e-07 410741.67 31.537365 31.537365 31.537365
1250 160162.49 1803377.9 -4.8910121e-07 -4.8910181e-07 410741.67 31.537365 31.537365 31.537365
1260 160162.49 1803377.9 -4.8909966e-07 -4.8910047e-07 410741.67 31.537365 31.537365 31.537365
1270 160162.49 1803377.9 -4.8910146e-07 -4.8910223e-07 410741.67 31.537365 31.537365 31.537365
1280 160162.49 1803377.9 -4.8909992e-07 -4.8910094e-07 410741.67 31.537365 31.537365 31.537365
1290 160162.49 1803377.9 -4.8910138e-07 -4.891019e-07 410741.67 31.537365 31.537365 31.537365
1300 160162.49 1803377.9 -4.891001e-07 -4.8910051e-07 410741.67 31.537365 31.537365 31.537365
1310 160162.49 1803377.9 -4.8910147e-07 -4.8910247e-07 410741.67 31.537365 31.537365 31.537365
1320 160162.49 1803377.9 -4.8909992e-07 -4.8910037e-07 410741.67 31.537365 31.537365 31.537365
1330 160162.49 1803377.9 -4.891013e-07 -4.8910207e-07 410741.67 31.537365 31.537365 31.537365
1340 160162.49 1803377.9 -4.8910014e-07 -4.8910084e-07 410741.67 31.537365 31.537365 31.537365
1350 160162.49 1803377.9 -4.8910161e-07 -4.891024e-07 410741.67 31.537365 31.537365 31.537365
1360 160162.49 1803377.9 -4.8909974e-07 -4.8910055e-07 410741.67 31.537365 31.537365 31.537365
1370 160162.49 1803377.9 -4.8910123e-07 -4.8910198e-07 410741.67 31.537365 31.537365 31.537365
1380 160162.49 1803377.9 -4.891002e-07 -4.8910066e-07 410741.67 31.537365 31.537365 31.537365
1390 160162.49 1803377.9 -4.8910142e-07 -4.8910185e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
1400 160162.49 1803377.9 -4.8910123e-07 -4.8910178e-07 410741.67 31.537365 31.537365 31.537365
1410 160162.49 1803377.9 -4.8910199e-07 -4.8910214e-07 410741.67 31.537365 31.537365 31.537365
1420 160162.49 1803377.9 -4.8910181e-07 -4.8910242e-07 410741.67 31.537365 31.537365 31.537365
1430 160162.49 1803377.9 -4.8909979e-07 -4.8910018e-07 410741.67 31.537365 31.537365 31.537365
1440 160162.49 1803377.9 -4.8910055e-07 -4.8910117e-07 410741.67 31.537365 31.537365 31.537365
1450 160162.49 1803377.9 -4.8910125e-07 -4.8910179e-07 410741.67 31.537365 31.537365 31.537365
1460 160162.49 1803377.9 -4.8910148e-07 -4.8910232e-07 410741.67 31.537365 31.537365 31.537365
1470 160162.49 1803377.9 -4.8910211e-07 -4.8910265e-07 410741.67 31.537365 31.537365 31.537365
1480 160162.49 1803377.9 -4.8910259e-07 -4.8910328e-07 410741.67 31.537365 31.537365 31.537365
1490 160162.49 1803377.9 -4.8910061e-07 -4.8910073e-07 410741.67 31.537365 31.537365 31.537365
1500 160162.49 1803377.9 -4.8910132e-07 -4.8910159e-07 410741.67 31.537365 31.537365 31.537365
1510 160162.49 1803377.9 -4.8910164e-07 -4.8910222e-07 410741.67 31.537365 31.537365 31.537365
1520 160162.49 1803377.9 -4.8910047e-07 -4.8910077e-07 410741.67 31.537365 31.537365 31.537365
1530 160162.49 1803377.9 -4.8910171e-07 -4.891024e-07 410741.67 31.537365 31.537365 31.537365
1540 160162.49 1803377.9 -4.8910063e-07 -4.8910124e-07 410741.67 31.537365 31.537365 31.537365
1550 160162.49 1803377.9 -4.8910194e-07 -4.8910254e-07 410741.67 31.537365 31.537365 31.537365
1560 160162.49 1803377.9 -4.8910033e-07 -4.891013e-07 410741.67 31.537365 31.537365 31.537365
1570 160162.49 1803377.9 -4.8910162e-07 -4.8910241e-07 410741.67 31.537365 31.537365 31.537365
1580 160162.49 1803377.9 -4.8910061e-07 -4.8910107e-07 410741.67 31.537365 31.537365 31.537365
1590 160162.49 1803377.9 -4.891018e-07 -4.8910259e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
1600 160162.49 1803377.9 -4.8910144e-07 -4.8910146e-07 410741.67 31.537365 31.537365 31.537365
1610 160162.49 1803377.9 -4.8910161e-07 -4.8910185e-07 410741.67 31.537365 31.537365 31.537365
1620 160162.49 1803377.9 -4.8910094e-07 -4.8910177e-07 410741.67 31.537365 31.537365 31.537365
1630 160162.49 1803377.9 -4.8910123e-07 -4.8910162e-07 410741.67 31.537365 31.537365 31.537365
1640 160162.49 1803377.9 -4.8910206e-07 -4.8910241e-07 410741.67 31.537365 31.537365 31.537365
1650 160162.49 1803377.9 -4.8910246e-07 -4.8910282e-07 410741.67 31.537365 31.537365 31.537365
1660 160162.49 1803377.9 -4.891003e-07 -4.8910094e-07 410741.67 31.537365 31.537365 31.537365
1670 160162.49 1803377.9 -4.8910089e-07 -4.8910128e-07 410741.67 31.537365 31.537365 31.537365
1680 160162.49 1803377.9 -4.8910108e-07 -4.8910139e-07 410741.67 31.537365 31.537365 31.537365
1690 160162.49 1803377.9 -4.8910193e-07 -4.8910257e-07 410741.67 31.537365 31.537365 31.537365
1700 160162.49 1803377.9 -4.8910253e-07 -4.89103e-07 410741.67 31.537365 31.537365 31.537365
1710 160162.49 1803377.9 -4.8910023e-07 -4.8910072e-07 410741.67 31.537365 31.537365 31.537365
1720 160162.49 1803377.9 -4.8910078e-07 -4.8910154e-07 410741.67 31.537365 31.537365 31.537365
1730 160162.49 1803377.9 -4.8910159e-07 -4.8910181e-07 410741.67 31.537365 31.537365 31.537365
1740 160162.49 1803377.9 -4.8910166e-07 -4.8910204e-07 410741.67 31.537365 31.537365 31.537365
1750 160162.49 1803377.9 -4.8910241e-07 -4.8910257e-07 410741.67 31.537365 31.537365 31.537365
1760 160162.49 1803377.9 -4.8910319e-07 -4.8910314e-07 410741.67 31.537365 31.537365 31.537365
1770 160162.49 1803377.9 -4.8910061e-07 -4.8910065e-07 410741.67 31.537365 31.537365 31.537365
1780 160162.49 1803377.9 -4.8910212e-07 -4.8910225e-07 410741.67 31.537365 31.537365 31.537365
1790 160162.49 1803377.9 -4.8910003e-07 -4.8910077e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
1800 160162.49 1803377.9 -4.8910129e-07 -4.8910219e-07 410741.67 31.537365 31.537365 31.537365
1810 160162.49 1803377.9 -4.8910037e-07 -4.8910129e-07 410741.67 31.537365 31.537365 31.537365
1820 160162.49 1803377.9 -4.8910138e-07 -4.8910184e-07 410741.67 31.537365 31.537365 31.537365
1830 160162.49 1803377.9 -4.8910012e-07 -4.8910085e-07 410741.67 31.537365 31.537365 31.537365
1840 160162.49 1803377.9 -4.8910138e-07 -4.8910235e-07 410741.67 31.537365 31.537365 31.537365
1850 160162.49 1803377.9 -4.8910015e-07 -4.8910066e-07 410741.67 31.537365 31.537365 31.537365
1860 160162.49 1803377.9 -4.8910204e-07 -4.8910242e-07 410741.67 31.537365 31.537365 31.537365
1870 160162.49 1803377.9 -4.8910022e-07 -4.8910074e-07 410741.67 31.537365 31.537365 31.537365
1880 160162.49 1803377.9 -4.8910147e-07 -4.8910194e-07 410741.67 31.537365 31.537365 31.537365
1890 160162.49 1803377.9 -4.8910029e-07 -4.8910108e-07 410741.67 31.537365 31.537365 31.537365
1900 160162.49 1803377.9 -4.8910167e-07 -4.8910199e-07 410741.67 31.537365 31.537365 31.537365
1910 160162.49 1803377.9 -4.891003e-07 -4.8910093e-07 410741.67 31.537365 31.537365 31.537365
1920 160162.49 1803377.9 -4.8910133e-07 -4.891017e-07 410741.67 31.537365 31.537365 31.537365
1930 160162.49 1803377.9 -4.8910033e-07 -4.8910102e-07 410741.67 31.537365 31.537365 31.537365
1940 160162.49 1803377.9 -4.8910152e-07 -4.8910179e-07 410741.67 31.537365 31.537365 31.537365
1950 160162.49 1803377.9 -4.8910025e-07 -4.8910087e-07 410741.67 31.537365 31.537365 31.537365
1960 160162.49 1803377.9 -4.8910156e-07 -4.8910235e-07 410741.67 31.537365 31.537365 31.537365
1970 160162.49 1803377.9 -4.8910009e-07 -4.8910059e-07 410741.67 31.537365 31.537365 31.537365
1980 160162.49 1803377.9 -4.8910173e-07 -4.8910251e-07 410741.67 31.537365 31.537365 31.537365
1990 160162.49 1803377.9 -4.8910036e-07 -4.8910106e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
2000 160162.49 1803377.9 -4.891014e-07 -4.8910256e-07 410741.67 31.537365 31.537365 31.537365
2010 160162.49 1803377.9 -4.8910159e-07 -4.8910279e-07 410741.67 31.537365 31.537365 31.537365
2020 160162.49 1803377.9 -4.8910238e-07 -4.8910344e-07 410741.67 31.537365 31.537365 31.537365
2030 160162.49 1803377.9 -4.891e-07 -4.8910112e-07 410741.67 31.537365 31.537365 31.537365
2040 160162.49 1803377.9 -4.8910103e-07 -4.89102e-07 410741.67 31.537365 31.537365 31.537365
2050 160162.49 1803377.9 -4.8910276e-07 -4.8910344e-07 410741.67 31.537365 31.537365 31.537365
2060 160162.49 1803377.9 -4.8910112e-07 -4.8910212e-07 410741.67 31.537365 31.537365 31.537365
2070 160162.49 1803377.9 -4.8910247e-07 -4.8910356e-07 410741.67 31.537365 31.537365 31.537365
2080 160162.49 1803377.9 -4.89101e-07 -4.8910239e-07 410741.67 31.537365 31.537365 31.537365
2090 160162.49 1803377.9 -4.8910249e-07 -4.891037e-07 410741.67 31.537365 31.537365 31.537365
2100 160162.49 1803377.9 -4.8910084e-07 -4.8910161e-07 410741.67 31.537365 31.537365 31.537365
2110 160162.49 1803377.9 -4.8910238e-07 -4.8910322e-07 410741.67 31.537365 31.537365 31.537365
2120 160162.49 1803377.9 -4.8910078e-07 -4.8910089e-07 410741.67 31.537365 31.537365 31.537365
2130 160162.49 1803377.9 -4.8910225e-07 -4.8910277e-07 410741.67 31.537365 31.537365 31.537365
2140 160162.49 1803377.9 -4.8910056e-07 -4.891012e-07 410741.67 31.537365 31.537365 31.537365
2150 160162.49 1803377.9 -4.8910213e-07 -4.8910283e-07 410741.67 31.537365 31.537365 31.537365
2160 160162.49 1803377.9 -4.8910045e-07 -4.8910105e-07 410741.67 31.537365 31.537365 31.537365
2170 160162.49 1803377.9 -4.8910228e-07 -4.8910236e-07 410741.67 31.537365 31.537365 31.537365
2180 160162.49 1803377.9 -4.8910033e-07 -4.8910128e-07 410741.67 31.537365 31.537365 31.537365
2190 160162.49 1803377.9 -4.8910193e-07 -4.8910273e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
2200 160162.49 1803377.9 -4.8910067e-07 -4.8910158e-07 410741.67 31.537365 31.537365 31.537365
2210 160162.49 1803377.9 -4.8910082e-07 -4.8910183e-07 410741.67 31.537365 31.537365 31.537365
2220 160162.49 1803377.9 -4.8910178e-07 -4.8910275e-07 410741.67 31.537365 31.537365 31.537365
2230 160162.49 1803377.9 -4.890995e-07 -4.8909947e-07 410741.67 31.537365 31.537365 31.537365
2240 160162.49 1803377.9 -4.8909972e-07 -4.8910015e-07 410741.67 31.537365 31.537365 31.537365
2250 160162.49 1803377.9 -4.8910077e-07 -4.8910141e-07 410741.67 31.537365 31.537365 31.537365
2260 160162.49 1803377.9 -4.8910119e-07 -4.8910189e-07 410741.67 31.537365 31.537365 31.537365
2270 160162.49 1803377.9 -4.8910159e-07 -4.8910229e-07 410741.67 31.537365 31.537365 31.537365
2280 160162.49 1803377.9 -4.8910186e-07 -4.8910267e-07 410741.67 31.537365 31.537365 31.537365
2290 160162.49 1803377.9 -4.8910025e-07 -4.8910102e-07 410741.67 31.537365 31.537365 31.537365
2300 160162.49 1803377.9 -4.8910045e-07 -4.8910163e-07 410741.67 31.537365 31.537365 31.537365
2310 160162.49 1803377.9 -4.8910175e-07 -4.8910306e-07 410741.67 31.537365 31.537365 31.537365
2320 160162.49 1803377.9 -4.8910062e-07 -4.8910178e-07 410741.67 31.537365 31.537365 31.537365
2330 160162.49 1803377.9 -4.8910162e-07 -4.8910281e-07 410741.67 31.537365 31.537365 31.537365
2340 160162.49 1803377.9 -4.891007e-07 -4.8910172e-07 410741.67 31.537365 31.537365 31.537365
2350 160162.49 1803377.9 -4.8910169e-07 -4.8910269e-07 410741.67 31.537365 31.537365 31.537365
2360 160162.49 1803377.9 -4.8910031e-07 -4.8910156e-07 410741.67 31.537365 31.537365 31.537365
2370 160162.49 1803377.9 -4.8910172e-07 -4.8910282e-07 410741.67 31.537365 31.537365 31.537365
2380 160162.49 1803377.9 -4.8910065e-07 -4.8910159e-07 410741.67 31.537365 31.537365 31.537365
2390 160162.49 1803377.9 -4.891016e-07 -4.8910331e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
2400 160162.49 1803377.9 -4.8910081e-07 -4.8910169e-07 410741.67 31.537365 31.537365 31.537365
2410 160162.49 1803377.9 -4.8910149e-07 -4.8910258e-07 410741.67 31.537365 31.537365 31.537365
2420 160162.49 1803377.9 -4.8910171e-07 -4.8910257e-07 410741.67 31.537365 31.537365 31.537365
2430 160162.49 1803377.9 -4.8909949e-07 -4.8910035e-07 410741.67 31.537365 31.537365 31.537365
2440 160162.49 1803377.9 -4.8910033e-07 -4.8910099e-07 410741.67 31.537365 31.537365 31.537365
2450 160162.49 1803377.9 -4.891006e-07 -4.8910124e-07 410741.67 31.537365 31.537365 31.537365
2460 160162.49 1803377.9 -4.8910117e-07 -4.8910191e-07 410741.67 31.537365 31.537365 31.537365
2470 160162.49 1803377.9 -4.8910153e-07 -4.8910231e-07 410741.67 31.537365 31.537365 31.537365
2480 160162.49 1803377.9 -4.8910223e-07 -4.8910317e-07 410741.67 31.537365 31.537365 31.537365
2490 160162.49 1803377.9 -4.8909994e-07 -4.8910083e-07 410741.67 31.537365 31.537365 31.537365
2500 160162.49 1803377.9 -4.8910056e-07 -4.8910138e-07 410741.67 31.537365 31.537365 31.537365
2510 160162.49 1803377.9 -4.8910114e-07 -4.8910212e-07 410741.67 31.537365 31.537365 31.537365
2520 160162.49 1803377.9 -4.8910159e-07 -4.8910264e-07 410741.67 31.537365 31.537365 31.537365
2530 160162.49 1803377.9 -4.89102e-07 -4.8910257e-07 410741.67 31.537365 31.537365 31.537365
2540 160162.49 1803377.9 -4.8910012e-07 -4.8910058e-07 410741.67 31.537365 31.537365 31.537365
2550 160162.49 1803377.9 -4.8910014e-07 -4.8910104e-07 410741.67 31.537365 31.537365 31.537365
2560 160162.49 1803377.9 -4.8910087e-07 -4.8910118e-07 410741.67 31.537365 31.537365 31.537365
2570 160162.49 1803377.9 -4.8909951e-07 -4.8909979e-07 410741.67 31.537365 31.537365 31.537365
2580 160162.49 1803377.9 -4.8910101e-07 -4.8910158e-07 410741.67 31.537365 31.537365 31.537365
2590 160162.49 1803377.9 -4.8910231e-07 -4.8910311e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
2600 160162.49 1803377.9 -4.8910045e-07 -4.891011e-07 410741.67 31.537365 31.537365 31.537365
2610 160162.49 1803377.9 -4.8909927e-07 -4.8910014e-07 410741.67 31.537365 31.537365 31.537365
2620 160162.49 1803377.9 -4.8910087e-07 -4.8910142e-07 410741.67 31.537365 31.537365 31.537365
2630 160162.49 1803377.9 -4.8910236e-07 -4.8910302e-07 410741.67 31.537365 31.537365 31.537365
2640 160162.49 1803377.9 -4.8910086e-07 -4.8910143e-07 410741.67 31.537365 31.537365 31.537365
2650 160162.49 1803377.9 -4.8909943e-07 -4.8909999e-07 410741.67 31.537365 31.537365 31.537365
2660 160162.49 1803377.9 -4.8910109e-07 -4.8910169e-07 410741.67 31.537365 31.537365 31.537365
2670 160162.49 1803377.9 -4.8910245e-07 -4.8910298e-07 410741.67 31.537365 31.537365 31.537365
2680 160162.49 1803377.9 -4.8910079e-07 -4.891017e-07 410741.67 31.537365 31.537365 31.537365
2690 160162.49 1803377.9 -4.8909909e-07 -4.8909976e-07 410741.67 31.537365 31.537365 31.537365
2700 160162.49 1803377.9 -4.8910075e-07 -4.8910167e-07 410741.67 31.537365 31.537365 31.537365
2710 160162.49 1803377.9 -4.8910231e-07 -4.8910315e-07 410741.67 31.537365 31.537365 31.537365
2720 160162.49 1803377.9 -4.8910065e-07 -4.8910118e-07 410741.67 31.537365 31.537365 31.537365
2730 160162.49 1803377.9 -4.890993e-07 -4.8910017e-07 410741.67 31.537365 31.537365 31.537365
2740 160162.49 1803377.9 -4.8910051e-07 -4.8910166e-07 410741.67 31.537365 31.537365 31.537365
2750 160162.49 1803377.9 -4.8910219e-07 -4.8910304e-07 410741.67 31.537365 31.537365 31.537365
2760 160162.49 1803377.9 -4.8910068e-07 -4.8910172e-07 410741.67 31.537365 31.537365 31.537365
2770 160162.49 1803377.9 -4.8909954e-07 -4.8910049e-07 410741.67 31.537365 31.537365 31.537365
2780 160162.49 1803377.9 -4.8910117e-07 -4.8910185e-07 410741.67 31.537365 31.537365 31.537365
2790 160162.49 1803377.9 -4.891023e-07 -4.8910319e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
2800 160162.49 1803377.9 -4.8910068e-07 -4.8910187e-07 410741.67 31.537365 31.537365 31.537365
2810 160162.49 1803377.9 -4.891017e-07 -4.891029e-07 410741.67 31.537365 31.537365 31.537365
2820 160162.49 1803377.9 -4.8910195e-07 -4.8910323e-07 410741.67 31.537365 31.537365 31.537365
2830 160162.49 1803377.9 -4.8909982e-07 -4.8910124e-07 410741.67 31.537365 31.537365 31.537365
2840 160162.49 1803377.9 -4.8910224e-07 -4.8910355e-07 410741.67 31.537365 31.537365 31.537365
2850 160162.49 1803377.9 -4.8910081e-07 -4.8910218e-07 410741.67 31.537365 31.537365 31.537365
2860 160162.49 1803377.9 -4.8910183e-07 -4.8910321e-07 410741.67 31.537365 31.537365 31.537365
2870 160162.49 1803377.9 -4.8910058e-07 -4.8910172e-07 410741.67 31.537365 31.537365 31.537365
2880 160162.49 1803377.9 -4.8910233e-07 -4.8910328e-07 410741.67 31.537365 31.537365 31.537365
2890 160162.49 1803377.9 -4.891007e-07 -4.891017e-07 410741.67 31.537365 31.537365 31.537365
2900 160162.49 1803377.9 -4.8910183e-07 -4.8910275e-07 410741.67 31.537365 31.537365 31.537365
2910 160162.49 1803377.9 -4.8910014e-07 -4.8910128e-07 410741.67 31.537365 31.537365 31.537365
2920 160162.49 1803377.9 -4.8910169e-07 -4.8910278e-07 410741.67 31.537365 31.537365 31.537365
2930 160162.49 1803377.9 -4.8910007e-07 -4.8910125e-07 410741.67 31.537365 31.537365 31.537365
2940 160162.49 1803377.9 -4.8910148e-07 -4.8910266e-07 410741.67 31.537365 31.537365 31.537365
2950 160162.49 1803377.9 -4.8910016e-07 -4.8910167e-07 410741.67 31.537365 31.537365 31.537365
2960 160162.49 1803377.9 -4.8910147e-07 -4.8910314e-07 410741.67 31.537365 31.537365 31.537365
2970 160162.49 1803377.9 -4.8910006e-07 -4.8910153e-07 410741.67 31.537365 31.537365 31.537365
2980 160162.49 1803377.9 -4.8910123e-07 -4.8910287e-07 410741.67 31.537365 31.537365 31.537365
2990 160162.49 1803377.9 -4.8909973e-07 -4.8910132e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
3000 160162.49 1803377.9 -4.8910075e-07 -4.8910221e-07 410741.67 31.537365 31.537365 31.537365
3010 160162.49 1803377.9 -4.8910144e-07 -4.8910237e-07 410741.67 31.537365 31.537365 31.537365
3020 160162.49 1803377.9 -4.8910171e-07 -4.8910255e-07 410741.67 31.537365 31.537365 31.537365
3030 160162.49 1803377.9 -4.8909877e-07 -4.8910042e-07 410741.67 31.537365 31.537365 31.537365
3040 160162.49 1803377.9 -4.8909954e-07 -4.8910108e-07 410741.67 31.537365 31.537365 31.537365
3050 160162.49 1803377.9 -4.8910053e-07 -4.8910155e-07 410741.67 31.537365 31.537365 31.537365
3060 160162.49 1803377.9 -4.8910092e-07 -4.8910213e-07 410741.67 31.537365 31.537365 31.537365
3070 160162.49 1803377.9 -4.8910167e-07 -4.8910266e-07 410741.67 31.537365 31.537365 31.537365
3080 160162.49 1803377.9 -4.8909919e-07 -4.8910041e-07 410741.67 31.537365 31.537365 31.537365
3090 160162.49 1803377.9 -4.8909999e-07 -4.8910152e-07 410741.67 31.537365 31.537365 31.537365
3100 160162.49 1803377.9 -4.8910143e-07 -4.8910247e-07 410741.67 31.537365 31.537365 31.537365
3110 160162.49 1803377.9 -4.8910001e-07 -4.8910126e-07 410741.67 31.537365 31.537365 31.537365
3120 160162.49 1803377.9 -4.8910185e-07 -4.8910299e-07 410741.67 31.537365 31.537365 31.537365
3130 160162.49 1803377.9 -4.8909979e-07 -4.8910147e-07 410741.67 31.537365 31.537365 31.537365
3140 160162.49 1803377.9 -4.8910143e-07 -4.8910276e-07 410741.67 31.537365 31.537365 31.537365
3150 160162.49 1803377.9 -4.8910037e-07 -4.8910137e-07 410741.67 31.537365 31.537365 31.537365
3160 160162.49 1803377.9 -4.8910153e-07 -4.8910266e-07 410741.67 31.537365 31.537365 31.537365
3170 160162.49 1803377.9 -4.8909966e-07 -4.8910099e-07 410741.67 31.537365 31.537365 31.537365
3180 160162.49 1803377.9 -4.8910152e-07 -4.891028e-07 410741.67 31.537365 31.537365 31.537365
3190 160162.49 1803377.9 -4.8909987e-07 -4.8910153e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
3200 160162.49 1803377.9 -4.8910041e-07 -4.8910185e-07 410741.67 31.537365 31.537365 31.537365
3210 160162.49 1803377.9 -4.8910076e-07 -4.8910275e-07 410741.67 31.537365 31.537365 31.537365
3220 160162.49 1803377.9 -4.8910132e-07 -4.89103e-07 410741.67 31.537365 31.537365 31.537365
3230 160162.49 1803377.9 -4.8909954e-07 -4.8910119e-07 410741.67 31.537365 31.537365 31.537365
3240 160162.49 1803377.9 -4.8909979e-07 -4.8910156e-07 410741.67 31.537365 31.537365 31.537365
3250 160162.49 1803377.9 -4.8910039e-07 -4.8910223e-07 410741.67 31.537365 31.537365 31.537365
3260 160162.49 1803377.9 -4.8910064e-07 -4.8910239e-07 410741.67 31.537365 31.537365 31.537365
3270 160162.49 1803377.9 -4.8910155e-07 -4.8910333e-07 410741.67 31.537365 31.537365 31.537365
3280 160162.49 1803377.9 -4.8910184e-07 -4.8910355e-07 410741.67 31.537365 31.537365 31.537365
3290 160162.49 1803377.9 -4.8910006e-07 -4.8910145e-07 410741.67 31.537365 31.537365 31.537365
3300 160162.49 1803377.9 -4.8910003e-07 -4.891019e-07 410741.67 31.537365 31.537365 31.537365
3310 160162.49 1803377.9 -4.8910065e-07 -4.8910258e-07 410741.67 31.537365 31.537365 31.537365
3320 160162.49 1803377.9 -4.8910106e-07 -4.8910298e-07 410741.67 31.537365 31.537365 31.537365
3330 160162.49 1803377.9 -4.8910174e-07 -4.8910364e-07 410741.67 31.537365 31.537365 31.537365
3340 160162.49 1803377.9 -4.8909972e-07 -4.8910113e-07 410741.67 31.537365 31.537365 31.537365
3350 160162.49 1803377.9 -4.8910047e-07 -4.8910163e-07 410741.67 31.537365 31.537365 31.537365
3360 160162.49 1803377.9 -4.891017e-07 -4.8910326e-07 410741.67 31.537365 31.537365 31.537365
3370 160162.49 1803377.9 -4.8910039e-07 -4.8910127e-07 410741.67 31.537365 31.537365 31.537365
3380 160162.49 1803377.9 -4.8910152e-07 -4.8910252e-07 410741.67 31.537365 31.537365 31.537365
3390 160162.49 1803377.9 -4.8910045e-07 -4.8910129e-07 410741.67 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
3400 160162.49 1803377.9 -4.89102e-07 -4.8910296e-07 410741.67 31.537365 31.537365 31.537365
3410 160162.49 1803377.9 -4.8910045e-07 -4.8910141e-07 410741.67 31.537365 31.537365 31.537365
3420 160162.49 1803377.9 -4.8910145e-07 -4.8910301e-07 410741.67 31.537365 31.537365 31.537365
3430 160162.49 1803377.9 -4.8910057e-07 -4.8910173e-07 410741.67 31.537365 31.537365 31.537365
3440 160162.49 1803377.9 -4.8910176e-07 -4.8910303e-07 410741.67 31.537365 31.537365 31.537365
3450 160162.49 1803377.9 -4.8910044e-07 -4.8910165e-07 410741.67 31.537365 31.537365 31.537365
3460 160162.49 1803377.9 -4.8910172e-07 -4.8910311e-07 410741.67 31.537365 31.537365 31.537365
3470 160162.49 1803377.9 -4.8910048e-07 -4.8910158e-07 410741.67 31.537365 31.537365 31.537365
3480 160162.49 1803377.9 -4.8910193e-07 -4.8910309e-07 410741.67 31.537365 31.537365 31.537365
3490 160162.49 1803377.9 -4.8910055e-07 -4.8910166e-07 410741.67 31.537365 31.537365 31.537365
3500 160162.49 1803377.9 -4.8910204e-07 -4.8910346e-07 410741.67 31.537365 31.537365 31.537365
-Loop time of 260.545 on 4 procs for 3500 steps with 864 atoms
+Loop time of 90.1652 on 4 procs for 3500 steps with 864 atoms
-Pair time (%) = 7.82867 (3.00473)
-Neigh time (%) = 0.516552 (0.198258)
-Comm time (%) = 67.7833 (26.016)
-Outpt time (%) = 11.4734 (4.40363)
-Other time (%) = 172.943 (66.3774)
+Pair time (%) = 5.38365 (5.97087)
+Neigh time (%) = 0.103525 (0.114816)
+Comm time (%) = 3.40683 (3.77844)
+Outpt time (%) = 1.42917 (1.58506)
+Other time (%) = 79.8421 (88.5508)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3108 ave 3108 max 3108 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 39744 ave 39850 max 39638 min
Histogram: 1 0 0 0 1 1 0 0 0 1
FullNghs: 79488 ave 79488 max 79488 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 317952
Ave neighs/atom = 368
Neighbor list builds = 17
Dangerous builds = 0
variable c equal 48.88821291*48.88821291/(3.*0.0019872067)
variable T equal $m*$v*$v*$c
variable T equal 39.950000000000002842*$v*$v*$c
variable T equal 39.950000000000002842*0.10000000000000000555*$v*$c
variable T equal 39.950000000000002842*0.10000000000000000555*0.10000000000000000555*$c
variable T equal 39.950000000000002842*0.10000000000000000555*0.10000000000000000555*400907.35763815121027
print "kinetic temperature: $T"
kinetic temperature: 160162.48937644143007
diff --git a/examples/USER/atc/cauchy_born/ftcb_constV.screen b/examples/USER/atc/cauchy_born/ftcb_constV.screen
index bdd45bb0c..edbe13835 100644
--- a/examples/USER/atc/cauchy_born/ftcb_constV.screen
+++ b/examples/USER/atc/cauchy_born/ftcb_constV.screen
@@ -1,300 +1,302 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
log ftcb_constV.log
units real
atom_style atomic
variable lattice_constant equal 5.256227487
variable c equal 6
variable L equal (${lattice_constant}*$c)
variable L equal (5.2562274870000003091*$c)
variable L equal (5.2562274870000003091*6)
variable V equal $L*$L*$L
variable V equal 31.537364922000001854*$L*$L
variable V equal 31.537364922000001854*31.537364922000001854*$L
variable V equal 31.537364922000001854*31.537364922000001854*31.537364922000001854
print "Volume : $V"
Volume : 31367.233018713999627
variable Ti equal 0.0001
variable dT equal 0.2
variable n equal 10000
variable m equal 200
variable dt equal 0.1
# create system
lattice fcc ${lattice_constant}
lattice fcc 5.2562274870000003091
Lattice spacing in x,y,z = 5.25623 5.25623 5.25623
region box block 0 $c 0 $c 0 $c
region box block 0 6 0 $c 0 $c
region box block 0 6 0 6 0 $c
region box block 0 6 0 6 0 6
boundary p p p
pair_style lj/cut 13.5
read_data ftcb_constV_setup.data
Reading data file ...
orthogonal box = (0 0 0) to (31.5374 31.5374 31.5374)
1 by 2 by 2 MPI processor grid
864 atoms
864 velocities
mass 1 39.95
pair_coeff 1 1 0.238 3.405
# define region
neighbor 1.0 bin
neigh_modify delay 0 every 2000 check no
reset_timestep 0
thermo $m
thermo 200
compute_modify thermo_temp extra 0
variable nrepeat equal $n/$m
variable nrepeat equal 10000/$m
variable nrepeat equal 10000/200
variable sxx equal -pxx
variable intenergy equal etotal
fix TDAVE all ave/time $m ${nrepeat} $n c_thermo_temp v_sxx v_intenergy ave one file ftcb_constV.profile
fix TDAVE all ave/time 200 ${nrepeat} $n c_thermo_temp v_sxx v_intenergy ave one file ftcb_constV.profile
fix TDAVE all ave/time 200 50 $n c_thermo_temp v_sxx v_intenergy ave one file ftcb_constV.profile
fix TDAVE all ave/time 200 50 10000 c_thermo_temp v_sxx v_intenergy ave one file ftcb_constV.profile
thermo_style custom step temp press etotal lx ly lz
timestep ${dt}
timestep 0.10000000000000000555
# filtered
fix ATCFILT all atc field Ar_CauchyBorn.mat
ATC: constructing shape function field estimate with parameter file Ar_CauchyBorn.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
#fix_modify ATCFILT reset_atomic_reference_positions ftcb_constV_setup.data
fix_modify ATCFILT mesh create 1 1 1 box p p p
ATC: created uniform mesh with 8 nodes, 1 unique nodes, and 1 elements
fix_modify ATCFILT fields none
fix_modify ATCFILT fields add internal_energy stress cauchy_born_energy cauchy_born_stress
fix_modify ATCFILT fields add temperature displacement
fix_modify ATCFILT gradients add displacement
fix_modify ATCFILT output ftcb_constV_filteredFE $n text binary tensor_components
fix_modify ATCFILT output ftcb_constV_filteredFE 10000 text binary tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify ATCFILT sample_frequency $m
fix_modify ATCFILT sample_frequency 200
variable scale equal $n*${dt}
variable scale equal 10000*${dt}
variable scale equal 10000*0.10000000000000000555
fix_modify ATCFILT filter scale ${scale}
fix_modify ATCFILT filter scale 1000
fix_modify ATCFILT filter on
fix_modify ATCFILT filter type step
# not filtered
fix ATC all atc field Ar_CauchyBorn.mat
ATC: constructing shape function field estimate with parameter file Ar_CauchyBorn.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
#fix_modify ATC reset_atomic_reference_positions ftcb_constV_setup.data
fix_modify ATC mesh create 1 1 1 box p p p
ATC: created uniform mesh with 8 nodes, 1 unique nodes, and 1 elements
fix_modify ATC fields none
fix_modify ATC fields add internal_energy stress cauchy_born_energy cauchy_born_stress
fix_modify ATC fields add temperature displacement
fix_modify ATC gradients add displacement
fix_modify ATC output ftcb_constVFE $m text binary tensor_components
fix_modify ATC output ftcb_constVFE 200 text binary tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
velocity all create ${Ti} 102486 mom yes rot yes dist gaussian
velocity all create 0.00010000000000000000479 102486 mom yes rot yes dist gaussian
# step iu T,V space
variable i loop 1
label loop_i
print ">>> step $i, T: ${Ti}, V: $V"
>>> step 1, T: 0.00010000000000000000479, V: 31367.233018713999627
variable Tf equal ${Ti}+${dT}
variable Tf equal 0.00010000000000000000479+${dT}
variable Tf equal 0.00010000000000000000479+0.2000000000000000111
fix NVT all nvt temp ${Ti} ${Tf} 20 drag 0.5 tchain 1
fix NVT all nvt temp 0.00010000000000000000479 ${Tf} 20 drag 0.5 tchain 1
fix NVT all nvt temp 0.00010000000000000000479 0.20010000000000000009 20 drag 0.5 tchain 1
run $n
run 10000
Setting up run ...
ATC: CB stiffness: 7.56717 Einstein freq: 0.355649
ATC: computing bond matrix ...........done
ATC: CB stiffness: 7.56717 Einstein freq: 0.355649
ATC: computing bond matrix ...........done
Memory usage per processor = 43.8852 Mbytes
Step Temp Press TotEng Lx Ly Lz
0 9.9884259e-05 0.00037439907 -1743.9894 31.537365 31.537365 31.537365
200 0.00018395916 0.0008038753 -1743.9892 31.537365 31.537365 31.537365
400 0.00072207452 0.0035412421 -1743.9877 31.537365 31.537365 31.537365
600 0.0035009087 0.01765789 -1743.9803 31.537365 31.537365 31.537365
800 0.013509969 0.072367846 -1743.953 31.537365 31.537365 31.537365
1000 0.024404761 0.16748542 -1743.9203 31.537365 31.537365 31.537365
1200 0.02269474 0.25683396 -1743.9165 31.537365 31.537365 31.537365
1400 0.020977736 0.37083837 -1743.9105 31.537365 31.537365 31.537365
1600 0.023822771 0.52655981 -1743.8907 31.537365 31.537365 31.537365
1800 0.029504552 0.724909 -1743.8607 31.537365 31.537365 31.537365
ATC: computing bond matrix ..........done
ATC: computing bond matrix ..........done
2000 0.034895124 0.95292512 -1743.8286 31.537365 31.537365 31.537365
2200 0.038474547 1.1919487 -1743.7994 31.537365 31.537365 31.537365
2400 0.041549289 1.4317242 -1743.7711 31.537365 31.537365 31.537365
2600 0.045486492 1.6680358 -1743.741 31.537365 31.537365 31.537365
2800 0.050155213 1.8970903 -1743.7096 31.537365 31.537365 31.537365
3000 0.054672553 2.1168131 -1743.6792 31.537365 31.537365 31.537365
3200 0.058605281 2.3306834 -1743.6507 31.537365 31.537365 31.537365
3400 0.062199376 2.5471875 -1743.6227 31.537365 31.537365 31.537365
3600 0.065809649 2.7748986 -1743.594 31.537365 31.537365 31.537365
3800 0.069568751 3.0179585 -1743.564 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
ATC: computing bond matrix ...........done
4000 0.073508373 3.2739196 -1743.5326 31.537365 31.537365 31.537365
4200 0.077717909 3.5333376 -1743.5006 31.537365 31.537365 31.537365
4400 0.082309308 3.7807471 -1743.469 31.537365 31.537365 31.537365
4600 0.087284711 3.9974133 -1743.4392 31.537365 31.537365 31.537365
4800 0.092475466 4.166069 -1743.413 31.537365 31.537365 31.537365
5000 0.097607659 4.2765824 -1743.3918 31.537365 31.537365 31.537365
5200 0.10242915 4.3301667 -1743.3761 31.537365 31.537365 31.537365
5400 0.10679915 4.3398975 -1743.3649 31.537365 31.537365 31.537365
5600 0.11070065 4.3272641 -1743.3567 31.537365 31.537365 31.537365
5800 0.11420842 4.3165087 -1743.3493 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
ATC: computing bond matrix ...........done
6000 0.11745522 4.3289911 -1743.3405 31.537365 31.537365 31.537365
6200 0.12060841 4.3789965 -1743.3288 31.537365 31.537365 31.537365
6400 0.1238495 4.4714313 -1743.3135 31.537365 31.537365 31.537365
6600 0.12734883 4.6013368 -1743.2946 31.537365 31.537365 31.537365
6800 0.13123277 4.7550795 -1743.2728 31.537365 31.537365 31.537365
7000 0.1355461 4.9131529 -1743.2497 31.537365 31.537365 31.537365
7200 0.14022279 5.0544601 -1743.2271 31.537365 31.537365 31.537365
7400 0.14508669 5.161526 -1743.2068 31.537365 31.537365 31.537365
7600 0.14989701 5.2254132 -1743.19 31.537365 31.537365 31.537365
7800 0.15442502 5.2486878 -1743.1772 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
ATC: computing bond matrix ...........done
8000 0.1585231 5.245194 -1743.1674 31.537365 31.537365 31.537365
8200 0.16215368 5.2366567 -1743.159 31.537365 31.537365 31.537365
8400 0.16537863 5.2473985 -1743.1498 31.537365 31.537365 31.537365
8600 0.16833152 5.2988909 -1743.1379 31.537365 31.537365 31.537365
8800 0.17119053 5.4054221 -1743.1217 31.537365 31.537365 31.537365
9000 0.17415442 5.5714574 -1743.1004 31.537365 31.537365 31.537365
9200 0.17741609 5.7907947 -1743.074 31.537365 31.537365 31.537365
9400 0.18112875 6.0474639 -1743.0437 31.537365 31.537365 31.537365
9600 0.18536621 6.3183401 -1743.011 31.537365 31.537365 31.537365
9800 0.19008819 6.5773705 -1742.9782 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
ATC: computing bond matrix ...........done
10000 0.19513095 6.800965 -1742.9477 31.537365 31.537365 31.537365
-Loop time of 217.59 on 4 procs for 10000 steps with 864 atoms
+Loop time of 63.5403 on 4 procs for 10000 steps with 864 atoms
-Pair time (%) = 22.0583 (10.1375)
-Neigh time (%) = 0.106731 (0.0490514)
-Comm time (%) = 92.9321 (42.7096)
-Outpt time (%) = 0.514863 (0.23662)
-Other time (%) = 101.978 (46.8672)
+Pair time (%) = 13.9658 (21.9794)
+Neigh time (%) = 0.0580555 (0.0913681)
+Comm time (%) = 4.97638 (7.83185)
+Outpt time (%) = 0.00315738 (0.0049691)
+Other time (%) = 44.5369 (70.0924)
Nlocal: 216 ave 223 max 212 min
Histogram: 2 0 0 0 1 0 0 0 0 1
Nghost: 3107 ave 3111 max 3100 min
Histogram: 1 0 0 0 0 1 0 0 0 2
Neighs: 39744 ave 41133 max 38895 min
Histogram: 1 1 0 0 1 0 0 0 0 1
FullNghs: 79488 ave 82064 max 78016 min
Histogram: 2 0 0 0 1 0 0 0 0 1
Total # of neighbors = 317952
Ave neighs/atom = 368
Neighbor list builds = 5
Dangerous builds = 0
unfix NVT
fix NVT all nvt temp ${Tf} ${Tf} 20 drag 0.5 tchain 1
fix NVT all nvt temp 0.20010000000000000009 ${Tf} 20 drag 0.5 tchain 1
fix NVT all nvt temp 0.20010000000000000009 0.20010000000000000009 20 drag 0.5 tchain 1
run $n
run 10000
Setting up run ...
ATC: computing bond matrix ...........done
ATC: computing bond matrix ...........done
Memory usage per processor = 44.3449 Mbytes
Step Temp Press TotEng Lx Ly Lz
10000 0.19513095 6.800965 -1742.9477 31.537365 31.537365 31.537365
10200 0.1942722 6.9478502 -1742.937 31.537365 31.537365 31.537365
10400 0.19883577 7.0539144 -1742.9173 31.537365 31.537365 31.537365
10600 0.20139901 7.1014941 -1742.907 31.537365 31.537365 31.537365
10800 0.20081668 7.1047619 -1742.9075 31.537365 31.537365 31.537365
11000 0.19970238 7.094286 -1742.9103 31.537365 31.537365 31.537365
11200 0.1992728 7.0940423 -1742.9108 31.537365 31.537365 31.537365
11400 0.19903616 7.1168902 -1742.9091 31.537365 31.537365 31.537365
11600 0.1985796 7.1677194 -1742.9056 31.537365 31.537365 31.537365
11800 0.1981405 7.2439973 -1742.9 31.537365 31.537365 31.537365
ATC: computing bond matrix ..........done
ATC: computing bond matrix ..........done
12000 0.19807517 7.3351555 -1742.8924 31.537365 31.537365 31.537365
12200 0.19846191 7.4244524 -1742.884 31.537365 31.537365 31.537365
12400 0.19916212 7.4934365 -1742.8766 31.537365 31.537365 31.537365
12600 0.19999074 7.5270309 -1742.8719 31.537365 31.537365 31.537365
12800 0.20077516 7.5175279 -1742.8707 31.537365 31.537365 31.537365
13000 0.20135496 7.4665953 -1742.8734 31.537365 31.537365 31.537365
13200 0.20160734 7.38492 -1742.8792 31.537365 31.537365 31.537365
13400 0.20148742 7.2895976 -1742.887 31.537365 31.537365 31.537365
13600 0.2010393 7.2000327 -1742.895 31.537365 31.537365 31.537365
13800 0.20037365 7.1335653 -1742.9015 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
ATC: computing bond matrix ...........done
14000 0.19963599 7.1019254 -1742.9054 31.537365 31.537365 31.537365
14200 0.1989806 7.1091181 -1742.9058 31.537365 31.537365 31.537365
14400 0.19854825 7.1508728 -1742.9031 31.537365 31.537365 31.537365
14600 0.1984433 7.2155437 -1742.8978 31.537365 31.537365 31.537365
14800 0.19871156 7.2862513 -1742.8914 31.537365 31.537365 31.537365
15000 0.19932573 7.3439691 -1742.8855 31.537365 31.537365 31.537365
15200 0.20018644 7.371098 -1742.8818 31.537365 31.537365 31.537365
15400 0.20114408 7.3548507 -1742.8818 31.537365 31.537365 31.537365
15600 0.202037 7.2896442 -1742.8862 31.537365 31.537365 31.537365
15800 0.2027327 7.1778389 -1742.8951 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
ATC: computing bond matrix ...........done
16000 0.20315567 7.0286376 -1742.9079 31.537365 31.537365 31.537365
16200 0.20329394 6.8555641 -1742.9235 31.537365 31.537365 31.537365
16400 0.20318777 6.673354 -1742.9405 31.537365 31.537365 31.537365
16600 0.20290989 6.4951258 -1742.9576 31.537365 31.537365 31.537365
16800 0.20254493 6.3304266 -1742.9738 31.537365 31.537365 31.537365
17000 0.20217197 6.1843778 -1742.9884 31.537365 31.537365 31.537365
17200 0.20185124 6.0578536 -1743.0013 31.537365 31.537365 31.537365
17400 0.20161576 5.94845 -1743.0124 31.537365 31.537365 31.537365
17600 0.20146835 5.8519278 -1743.0222 31.537365 31.537365 31.537365
17800 0.20138485 5.7637939 -1743.0311 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
ATC: computing bond matrix ...........done
18000 0.20132247 5.6807023 -1743.0393 31.537365 31.537365 31.537365
18200 0.20123183 5.6014137 -1743.047 31.537365 31.537365 31.537365
18400 0.20106914 5.5271637 -1743.0542 31.537365 31.537365 31.537365
18600 0.20080571 5.4614233 -1743.0607 31.537365 31.537365 31.537365
18800 0.20043268 5.4091822 -1743.0661 31.537365 31.537365 31.537365
19000 0.19996085 5.3759725 -1743.0697 31.537365 31.537365 31.537365
19200 0.1994168 5.3668762 -1743.0712 31.537365 31.537365 31.537365
19400 0.198837 5.3857152 -1743.0701 31.537365 31.537365 31.537365
19600 0.19826151 5.434538 -1743.0662 31.537365 31.537365 31.537365
19800 0.19772836 5.5134332 -1743.0595 31.537365 31.537365 31.537365
ATC: computing bond matrix ...........done
ATC: computing bond matrix ...........done
20000 0.19726939 5.6206257 -1743.0501 31.537365 31.537365 31.537365
-Loop time of 100.792 on 4 procs for 10000 steps with 864 atoms
+Loop time of 64.7984 on 4 procs for 10000 steps with 864 atoms
-Pair time (%) = 15.7625 (15.6386)
-Neigh time (%) = 0.0767966 (0.0761931)
-Comm time (%) = 22.8833 (22.7034)
-Outpt time (%) = 0.135321 (0.134258)
-Other time (%) = 61.9342 (61.4475)
+Pair time (%) = 14.2825 (22.0414)
+Neigh time (%) = 0.0583839 (0.0901009)
+Comm time (%) = 6.29545 (9.71545)
+Outpt time (%) = 0.00295156 (0.004555)
+Other time (%) = 44.1591 (68.1485)
Nlocal: 216 ave 231 max 208 min
Histogram: 1 1 1 0 0 0 0 0 0 1
Nghost: 3107 ave 3115 max 3092 min
Histogram: 1 0 0 0 0 0 0 1 1 1
Neighs: 39744 ave 42595 max 38315 min
Histogram: 1 2 0 0 0 0 0 0 0 1
FullNghs: 79488 ave 85008 max 76544 min
Histogram: 1 1 1 0 0 0 0 0 0 1
Total # of neighbors = 317952
Ave neighs/atom = 368
Neighbor list builds = 5
Dangerous builds = 0
unfix NVT
variable Ti equal ${Tf}
variable Ti equal 0.20010000000000000009
next i
jump in.ftcb_constV loop_i
diff --git a/examples/USER/atc/cauchy_born/in.cb_biaxial b/examples/USER/atc/cauchy_born/in.cb_biaxial
index c873179e9..639706b14 100644
--- a/examples/USER/atc/cauchy_born/in.cb_biaxial
+++ b/examples/USER/atc/cauchy_born/in.cb_biaxial
@@ -1,53 +1,54 @@
# This test compares Hardy and Cauchy-Born metrics of energy density and stress
# for an Ar system subjected to biaxial deformation equivalent to shearing.
echo both
units real
atom_style atomic
variable lattice_constant equal 5.256227487
variable c equal 6
variable L equal $c*${lattice_constant}
variable d equal 0.005
variable s equal 1.005
variable is equal 1.0/$s
variable V0 equal $L*$L*3*${lattice_constant}
# create system
lattice fcc ${lattice_constant} origin 0.25 0.25 0.25
region box block 0 $c 0 $c 0 3
boundary p p p
create_box 1 box
create_atoms 1 box
mass 1 39.95
group all region box
pair_style lj/cut 13.5
pair_coeff 1 1 0.238 3.405
# ID group atc PhysicsType ParameterFile
fix AtC all atc field Ar_CauchyBorn.mat
fix_modify AtC mesh create $c $c 1 box p p p
fix_modify AtC fields none
fix_modify AtC fields add displacement
fix_modify AtC fields add internal_energy stress cauchy_born_energy cauchy_born_stress
fix_modify AtC gradients add displacement
+fix_modify AtC set reference_potential_energy 0.
#fix_modify AtC fields add elastic_deformation_gradient
fix_modify AtC output cb_biaxialFE 1 full_text tensor_components
log cb_biaxial.log
thermo 100
variable gamma1 equal 0.0
variable gamma2 equal 0.0
variable dv equal 1.0
variable step equal 0
thermo_style custom step v_step pxx pyy pzz pxy pxz pyz v_gamma1 pe v_dv
timestep 0.0
min_modify line quadratic
timestep 0.0
variable i loop 4
label loop_i
print ">>> step $i ${gamma1} ${gamma2}"
minimize 1.e-20 1.e-20 1000 1000
run 1
variable step equal ${step}+1
change_box all x scale $s y scale ${is} remap
variable gamma1 equal lx/$L-1.0
variable gamma2 equal ly/$L-1.0
variable dv equal vol/${V0}
next i
jump in.cb_biaxial loop_i
diff --git a/examples/USER/atc/cauchy_born/in.cb_shear b/examples/USER/atc/cauchy_born/in.cb_shear
index 90a9b1717..0e7bdb251 100644
--- a/examples/USER/atc/cauchy_born/in.cb_shear
+++ b/examples/USER/atc/cauchy_born/in.cb_shear
@@ -1,54 +1,55 @@
# This test compares Hardy and Cauchy-Born metrics of energy density and stress
# for an Ar system subjected to shear deformation.
#
# NOTE possible problems with large shear and handling a non-ortho box
echo both
units metal
atom_style atomic
variable lattice_constant equal 4.08
variable c equal 6 # minimum size
variable Ly equal $c*${lattice_constant}
variable d equal 0.005
variable V0 equal ($c*${lattice_constant})^3
# create system
lattice fcc ${lattice_constant} origin 0.25 0.25 0.25
# NOTE rect box + lagrangian is necessary to fool ATC's mesh
region rectbox block 0 $c 0 $c 0 3
region box prism 0 $c 0 $c 0 3 0 0 0
boundary p p p
create_box 1 box
create_atoms 1 region box
mass 1 196.97
group all region box
pair_style lj/smooth/linear 5.456108274435118
pair_coeff * * 0.7242785984051078 2.598146797350056
neighbor 1.0 bin
#neigh_modify delay 1000000
log cb_shear.log
thermo 100
variable gamma equal 0.0
variable step equal 0
thermo_style custom step v_step pxx pyy pzz pxy pxz pyz v_gamma pe xy xz yz
timestep 1.0
fix AtC all atc field Au_CauchyBorn.mat
fix_modify AtC mesh create $c $c 1 rectbox p p p
fix_modify AtC fields add mass_density internal_energy stress
fix_modify AtC fields add displacement
fix_modify AtC fields add cauchy_born_energy cauchy_born_stress
fix_modify AtC gradients add displacement
+fix_modify AtC set reference_potential_energy 0.
#fix_modify AtC fields add elastic_deformation_gradient
fix_modify AtC output cb_shearFE 1 text binary tensor_components
min_modify line quadratic
variable dgamma equal $d/${Ly}
print "depsilon_12: ${dgamma}"
timestep 0.0
variable i loop 4
label loop_i
print ">>> step $i"
minimize 1.e-20 1.e-20 1000 1000
run 1
variable step equal ${step}+1
change_box all xy delta $d remap
variable gamma equal $i*${dgamma}
next i
jump in.cb_shear loop_i
diff --git a/examples/USER/atc/cauchy_born/in.cb_volumetric b/examples/USER/atc/cauchy_born/in.cb_volumetric
index 745945c59..6bbc9cc58 100644
--- a/examples/USER/atc/cauchy_born/in.cb_volumetric
+++ b/examples/USER/atc/cauchy_born/in.cb_volumetric
@@ -1,48 +1,49 @@
# This test compares Hardy and Cauchy-Born metrics of energy density and stress
# for an Ar system subjected to volumetric stretching.
echo both
units real
atom_style atomic
variable lattice_constant equal 5.256227487
variable c equal 6
variable L equal $c*${lattice_constant}
#variable d equal 0.01
variable d equal 0.005
variable s equal 1.005
variable V0 equal ($c*${lattice_constant})^3
# create system
lattice fcc ${lattice_constant} origin 0.25 0.25 0.25
region box block 0 $c 0 $c 0 $c
boundary p p p
create_box 1 box
create_atoms 1 box
mass 1 39.95
group all region box
pair_style lj/cut 13.5
pair_coeff 1 1 0.238 3.405
# ID group atc PhysicsType ParameterFile
fix AtC all atc field Ar_CauchyBorn.mat
fix_modify AtC mesh create $c $c $c box p p p
fix_modify AtC fields none
fix_modify AtC fields add displacement
fix_modify AtC fields add internal_energy stress cauchy_born_energy cauchy_born_stress
fix_modify AtC gradients add displacement
+fix_modify AtC set reference_potential_energy 0.
fix_modify AtC output cb_volumetricFE 1 full_text tensor_components
log cb_volumetric.log
thermo 100
variable gamma equal 0.0
variable step equal 0
thermo_style custom step v_step pxx pyy pzz pxy pxz pyz v_gamma pe
timestep 0.0
min_modify line quadratic
timestep 0.0
variable i loop 4
label loop_i
print ">>> step $i"
minimize 1.e-20 1.e-20 1000 1000
run 1
variable step equal ${step}+1
change_box all x scale $s y scale $s z scale $s remap
variable gamma equal lx/$L-1.0
next i
jump in.cb_volumetric loop_i
diff --git a/examples/USER/atc/cauchy_born/read_xref.screen b/examples/USER/atc/cauchy_born/read_xref.screen
index 393b8af4d..01ac4ad39 100644
--- a/examples/USER/atc/cauchy_born/read_xref.screen
+++ b/examples/USER/atc/cauchy_born/read_xref.screen
@@ -1,83 +1,84 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable lattice_constant equal 5.256227487
variable c equal 4
variable L equal (${lattice_constant}*$c)
variable L equal (5.2562274870000003091*$c)
variable L equal (5.2562274870000003091*4)
# create system
lattice fcc ${lattice_constant}
lattice fcc 5.2562274870000003091
Lattice spacing in x,y,z = 5.25623 5.25623 5.25623
region box block 0 $c 0 $c 0 $c
region box block 0 4 0 $c 0 $c
region box block 0 4 0 4 0 $c
region box block 0 4 0 4 0 4
boundary p p p
# the stretched configuration of the atoms
read_data read_xref_1.data
Reading data file ...
orthogonal box = (-1.05125 -1.05125 -1.05125) to (22.0762 22.0762 22.0762)
1 by 2 by 2 MPI processor grid
256 atoms
256 velocities
mass 1 39.95
pair_style lj/cut 13.5
pair_coeff 1 1 0.238 3.405
# define region
neighbor 1.0 bin
neigh_modify delay 1000000
thermo 1
thermo_style custom step vol etotal
timestep 0
fix ATC all atc field Ar_CauchyBorn.mat
ATC: constructing shape function field estimate with parameter file Ar_CauchyBorn.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
# the original configuration of the atoms
fix_modify ATC reset_atomic_reference_positions read_xref_0.data
# "box" is the original box
fix_modify ATC mesh create 1 1 1 box f f f
ATC: created uniform mesh with 8 nodes, 8 unique nodes, and 1 elements
fix_modify ATC fields none
fix_modify ATC fields add mass_density
fix_modify ATC output read_xrefFE 1 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify ATC output index step
variable u1 atom x-f_ATC[1]
variable u2 atom y-f_ATC[2]
variable u3 atom z-f_ATC[3]
variable rho atom mass*f_ATC[4]
dump CONFIG all custom 1 read_xref.dmp id type x y z v_u1 v_u2 v_u3 v_rho
run 1
Setting up run ...
ATC: P0, found 256 atoms in reference file
ATC: P0, read 256 reference positions
ATC: CB stiffness: 7.56717 Einstein freq: 0.355649
Memory usage per processor = 16.0674 Mbytes
Step Volume TotEng
0 12370.307 -416.09102
1 12370.307 -416.09102
-Loop time of 0.00229579 on 4 procs for 1 steps with 256 atoms
+Loop time of 0.00215995 on 4 procs for 1 steps with 256 atoms
-Pair time (%) = 0.00048399 (21.0816)
+Pair time (%) = 0.000487804 (22.584)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000252604 (11.0029)
-Outpt time (%) = 0.00147229 (64.1301)
-Other time (%) = 8.69036e-05 (3.78534)
+Comm time (%) = 0.000238955 (11.063)
+Outpt time (%) = 0.00136787 (63.3286)
+Other time (%) = 6.53267e-05 (3.02445)
Nlocal: 64 ave 64 max 64 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1700 ave 1700 max 1700 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 7936 ave 7936 max 7936 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 15872 ave 15872 max 15872 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 63488
Ave neighs/atom = 248
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/drift_diffusion/convective_pulse.screen b/examples/USER/atc/drift_diffusion/convective_pulse.screen
index 4bf03d346..fb3682c61 100644
--- a/examples/USER/atc/drift_diffusion/convective_pulse.screen
+++ b/examples/USER/atc/drift_diffusion/convective_pulse.screen
@@ -1,144 +1,145 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
variable V equal 5000.0
variable n0 equal 0.085
variable dn equal 2.0*${n0}
variable dn equal 2.0*0.085000000000000006106
variable dt equal 0.0005
variable s equal 10
timestep ${dt}
timestep 0.00050000000000000001041
atom_style atomic
lattice fcc 1.0
Lattice spacing in x,y,z = 1 1 1
region simRegion block -50 50 0 1 0 1
boundary f p p
create_box 1 simRegion
Created orthogonal box = (-50 0 0) to (50 1 1)
4 by 1 by 1 MPI processor grid
mass 1 1.0 # need to keep this
atom_modify sort 0 1
# ID group atc PhysicsType ParameterFile
fix AtC all atc convective_drift_diffusion Cu_cddm.mat
ATC: constructing convective_drift_diffusion coupling with parameter file Cu_cddm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Cu_cddm.mat
ATC: creating convective_drift_diffusion extrinsic model
ATC: 2 materials defined from Cu_cddm.mat
ATC: 2 materials defined from Cu_cddm.mat
ATC: 2 materials defined from Cu_cddm.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 100 1 1 simRegion f p p
ATC: created uniform mesh with 404 nodes, 101 unique nodes, and 100 elements
fix_modify AtC material all Cu
fix_modify AtC mesh create_nodeset lbc -50.0 -50.0 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 50.0 50.0 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
# fix a temperature
fix_modify AtC initial temperature all 300.0
#fix_modify AtC initial electron_temperature all 300.0
fix_modify AtC fix electron_temperature all 300.
#fix_modify AtC initial electron_temperature all gaussian 0 0 0 1 0 0 5.0 300. 300.
fix_modify AtC initial electron_density all gaussian 0 0 0 1 0 0 5.0 ${dn} ${n0}
fix_modify AtC initial electron_density all gaussian 0 0 0 1 0 0 5.0 0.17000000000000001221 ${n0}
fix_modify AtC initial electron_density all gaussian 0 0 0 1 0 0 5.0 0.17000000000000001221 0.085000000000000006106
#fix_modify AtC fix electron_density all ${n0}
# isolate system:
# diffusion: dn/dx = 0
# drift : n = 0
fix_modify AtC fix electron_density lbc ${n0}
fix_modify AtC fix electron_density lbc 0.085000000000000006106
fix_modify AtC fix electron_density rbc ${n0}
fix_modify AtC fix electron_density rbc 0.085000000000000006106
fix_modify AtC fix temperature lbc 300.0
fix_modify AtC fix temperature rbc 300.0
fix_modify AtC fix electron_temperature lbc 300.0
fix_modify AtC fix electron_temperature rbc 300.0
fix_modify AtC fix electric_potential all 0.
fix_modify AtC extrinsic electron_integration implicit
# electron velocity
fix_modify AtC initial electron_velocity x all 0.
#fix_modify AtC fix electron_velocity x all 0.
fix_modify AtC initial electron_velocity y all 0.
fix_modify AtC fix electron_velocity y all 0
fix_modify AtC initial electron_velocity z all 0.
fix_modify AtC fix electron_velocity z all 0.
# f_AtC:1 thermal energy, 2 avg T, 3 electron energy, 4 avg Te, 5 total n
thermo_style custom step cpu f_AtC[1] f_AtC[2] f_AtC[3] f_AtC[4] f_AtC[5]
thermo_modify format 1 %5i format 2 %7.2g
fix_modify AtC output convective_pulseFE $s text binary
fix_modify AtC output convective_pulseFE 10 text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
thermo $s
thermo 10
#run 100
# free electric field and allow shielding
fix_modify AtC unfix electric_potential all
fix_modify AtC fix electric_potential lbc -$V
fix_modify AtC fix electric_potential lbc -5000
fix_modify AtC fix electric_potential rbc 0
fix_modify AtC source electric_potential all ${n0}
fix_modify AtC source electric_potential all 0.085000000000000006106
fix_modify AtC extrinsic electron_integration implicit 10
run 100
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
ATC: WARNING: all initial conditions for electric_potential have not been defined and the undefined are assumed zero
ATC: WARNING: material: [vacuum] cannot find electron_phonon_exchange
ATC: WARNING: physics model: [convection drift-diffusion], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
ATC: WARNING: material: [vacuum] cannot find electron_flux
ATC: WARNING: physics model: [convection drift-diffusion], material: [vacuum] does not provide all interfaces for <electron_density> physics and will be treated as null
ATC: WARNING: material: [cu] cannot find electron_recombination
ATC: WARNING: physics model: [convection drift-diffusion], material: [cu] does not provide all interfaces for <electron_density> physics and will be treated as null
ATC: WARNING: material: [vacuum] cannot find electron_drag_coefficient
ATC: WARNING: physics model: [convection drift-diffusion], material: [vacuum] does not provide all interfaces for <electron_velocity> physics and will be treated as null
ATC: WARNING: material: [vacuum] cannot find electron_drag_power
ATC: WARNING: physics model: [convection drift-diffusion], material: [vacuum] does not provide all interfaces for <electron_temperature> physics and will be treated as null
Memory usage per processor = 0.432198 Mbytes
Step CPU AtC[1] AtC[2] AtC[3] AtC[4] AtC[5]
0 0 0.65909742 300 0.0054411845 300 10.091586
- 10 3 0.65909742 300 0.0054411845 300 10.091586
- 20 6 0.65909742 300 0.0054411845 300 10.091586
- 30 10 0.65909742 300 0.0054411845 300 10.091586
- 40 14 0.65909742 300 0.0054411845 300 10.091586
- 50 17 0.65909742 300 0.0054411845 300 10.091586
+ 10 3.1 0.65909742 300 0.0054411845 300 10.091586
+ 20 6.1 0.65909742 300 0.0054411845 300 10.091586
+ 30 9.1 0.65909742 300 0.0054411845 300 10.091586
+ 40 13 0.65909742 300 0.0054411845 300 10.091586
+ 50 16 0.65909742 300 0.0054411845 300 10.091586
60 20 0.65909742 300 0.0054411845 300 10.091586
70 23 0.65909742 300 0.0054411845 300 10.091586
- 80 33 0.65909742 300 0.0054411845 300 10.091586
- 90 37 0.65909742 300 0.0054411845 300 10.091586
- 100 40 0.65909742 300 0.0054411845 300 10.091586
-Loop time of 39.7392 on 4 procs for 100 steps with 0 atoms
+ 80 26 0.65909742 300 0.0054411845 300 10.091586
+ 90 29 0.65909742 300 0.0054411845 300 10.091586
+ 100 32 0.65909742 300 0.0054411845 300 10.091586
+Loop time of 31.5941 on 4 procs for 100 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000300825 (0.000756998)
-Outpt time (%) = 0.125219 (0.315103)
-Other time (%) = 39.6136 (99.6841)
+Comm time (%) = 0.000305891 (0.000968189)
+Outpt time (%) = 0.103175 (0.326564)
+Other time (%) = 31.4907 (99.6725)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/drift_diffusion/ddm_schrodinger.screen b/examples/USER/atc/drift_diffusion/ddm_schrodinger.screen
index 5ef5fc8cf..bd4a94a71 100644
--- a/examples/USER/atc/drift_diffusion/ddm_schrodinger.screen
+++ b/examples/USER/atc/drift_diffusion/ddm_schrodinger.screen
@@ -1,78 +1,79 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
variable dt equal 0.0000001
variable s equal 1
variable L equal 10.0
variable N equal 40
variable T equal 30000.0
variable E equal 0.5
timestep ${dt}
timestep 9.9999999999999995475e-08
atom_style atomic
lattice fcc 1.0
Lattice spacing in x,y,z = 1 1 1
region simRegion block 0 $L 0 1 0 1
region simRegion block 0 10 0 1 0 1
boundary f p p
create_box 1 simRegion
Created orthogonal box = (0 0 0) to (10 1 1)
4 by 1 by 1 MPI processor grid
mass 1 1.0 # need to keep this
atom_modify sort 0 1
# ID group atc PhysicsType ParameterFile
fix AtC all atc drift_diffusion-schrodinger Si_ddm_schrodinger.mat
ATC: constructing drift_diffusion-schrodinger coupling with parameter file Si_ddm_schrodinger.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 1 materials defined from Si_ddm_schrodinger.mat
ATC: creating drift_diffusion extrinsic model
ATC: 1 materials defined from Si_ddm_schrodinger.mat
ATC: 1 materials defined from Si_ddm_schrodinger.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create $N 1 1 simRegion f p p
fix_modify AtC mesh create 40 1 1 simRegion f p p
ATC: created uniform mesh with 164 nodes, 41 unique nodes, and 40 elements
variable a equal $L-0.1
variable a equal 10-0.1
variable b equal $L+0.1
variable b equal 10+0.1
fix_modify AtC mesh create_nodeset lbc -0.1 0.1 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc $a $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 9.9000000000000003553 $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 9.9000000000000003553 10.099999999999999645 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
# ics/bcs : density consistent with wave function
fix_modify AtC initial temperature all 300.0
fix_modify AtC fix temperature all 300.0
fix_modify AtC initial electron_temperature all $T
fix_modify AtC initial electron_temperature all 30000
fix_modify AtC fix electron_temperature all $T
fix_modify AtC fix electron_temperature all 30000
fix_modify AtC initial electron_density all 0.0
#fix_modify AtC fix electron_density lbc 0
#fix_modify AtC fix electron_density rbc 0
fix_modify AtC initial electric_potential all 0.0
fix_modify AtC initial electron_wavefunction all 0.0
fix_modify AtC fix electron_wavefunction lbc 0
fix_modify AtC fix electron_wavefunction rbc 0
thermo $s
thermo 1
# f_AtC:1 thermal energy, 2 avg T, 3 electron energy, 4 avg Te, 5 total n
thermo_style custom step cpu f_AtC[1] f_AtC[2] f_AtC[3] f_AtC[4] f_AtC[5]
thermo_modify format 1 %5i format 2 %7.2g
fix_modify AtC output ddm_schrodingerFE $s text
fix_modify AtC output ddm_schrodingerFE 1 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC extrinsic electron_integration implicit 1
fix_modify AtC extrinsic schrodinger_poisson_solver self_consistency 1 # 100
ERROR: Illegal fix_modify command (../fix.cpp:104)
diff --git a/examples/USER/atc/drift_diffusion/finite_well.screen b/examples/USER/atc/drift_diffusion/finite_well.screen
index a59a2ad60..d8a6812a9 100644
--- a/examples/USER/atc/drift_diffusion/finite_well.screen
+++ b/examples/USER/atc/drift_diffusion/finite_well.screen
@@ -1,105 +1,106 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
variable E equal 0.1
variable L equal 10.0
#variable N equal 100
variable N equal 80
variable T equal 1000
variable n0 equal 0.0001
variable dn equal 2.0*${n0}
variable dn equal 2.0*0.00010000000000000000479
variable dt equal 0.0000001
variable s equal 1
timestep ${dt}
timestep 9.9999999999999995475e-08
atom_style atomic
lattice fcc 1.0
Lattice spacing in x,y,z = 1 1 1
variable a equal 0.5*$L
variable a equal 0.5*10
region simRegion block -$a $a 0 1 0 1
region simRegion block -5 $a 0 1 0 1
region simRegion block -5 5 0 1 0 1
boundary f p p
create_box 1 simRegion
Created orthogonal box = (-5 0 0) to (5 1 1)
4 by 1 by 1 MPI processor grid
mass 1 1.0 # need to keep this
atom_modify sort 0 1
# ID group atc PhysicsType ParameterFile
fix AtC all atc drift_diffusion-schrodinger SiGe_ddm_schrodinger.mat
ATC: constructing drift_diffusion-schrodinger coupling with parameter file SiGe_ddm_schrodinger.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from SiGe_ddm_schrodinger.mat
ATC: creating drift_diffusion extrinsic model
ATC: 2 materials defined from SiGe_ddm_schrodinger.mat
ATC: 2 materials defined from SiGe_ddm_schrodinger.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create $N 1 1 simRegion f p p
fix_modify AtC mesh create 80 1 1 simRegion f p p
ATC: created uniform mesh with 324 nodes, 81 unique nodes, and 80 elements
variable a equal 0.2*$L+0.001
variable a equal 0.2*10+0.001
fix_modify AtC mesh create_elementset well -$a $a -INF INF -INF INF
fix_modify AtC mesh create_elementset well -2.0009999999999998899 $a -INF INF -INF INF
fix_modify AtC mesh create_elementset well -2.0009999999999998899 2.0009999999999998899 -INF INF -INF INF
ATC: created elementset well with 32 elements
fix_modify AtC mesh create_nodeset well -$a $a -INF INF -INF INF
fix_modify AtC mesh create_nodeset well -2.0009999999999998899 $a -INF INF -INF INF
fix_modify AtC mesh create_nodeset well -2.0009999999999998899 2.0009999999999998899 -INF INF -INF INF
ATC: created nodeset well with 33 nodes
fix_modify AtC material well Ge
variable b equal $a-0.002
variable b equal 2.0009999999999998899-0.002
fix_modify AtC mesh create_nodeset lbc -$a -$b -INF INF -INF INF
fix_modify AtC mesh create_nodeset lbc -2.0009999999999998899 -$b -INF INF -INF INF
fix_modify AtC mesh create_nodeset lbc -2.0009999999999998899 -1.9989999999999998881 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc $b $a -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 1.9989999999999998881 $a -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 1.9989999999999998881 2.0009999999999998899 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
# ics/bcs
fix_modify AtC initial temperature all 300.0
fix_modify AtC fix temperature all 300.0
#
fix_modify AtC initial electron_temperature all $T
fix_modify AtC initial electron_temperature all 1000
fix_modify AtC fix electron_temperature all $T
fix_modify AtC fix electron_temperature all 1000
#
fix_modify AtC initial electron_density all 0.0
#fix_modify AtC fix electron_density all -0.001
#fix_modify AtC fix electron_density well 0.002
#
fix_modify AtC initial electric_potential all 0.0
#fix_modify AtC fix electric_potential lbc 0.5
#fix_modify AtC fix electric_potential rbc 0.5
fix_modify AtC fix electric_potential lbc 0.0
fix_modify AtC fix electric_potential rbc 0.0
#
fix_modify AtC initial electron_wavefunction all 0.0
fix_modify AtC fix electron_wavefunction lbc 0.0
fix_modify AtC fix electron_wavefunction rbc 0.0
thermo $s
thermo 1
# f_AtC:1 thermal energy, 2 avg T, 3 electron energy, 4 avg Te, 5 total n
thermo_style custom step cpu f_AtC[1] f_AtC[2] f_AtC[3] f_AtC[4] f_AtC[5]
thermo_modify format 1 %5i format 2 %7.2g
fix_modify AtC output finite_wellFE $s text
fix_modify AtC output finite_wellFE 1 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC extrinsic electron_integration implicit 3
fix_modify AtC extrinsic schrodinger_poisson_solver self_consistency 3 # 30
ERROR: Illegal fix_modify command (../fix.cpp:104)
diff --git a/examples/USER/atc/drift_diffusion/no_atoms_ddm.screen b/examples/USER/atc/drift_diffusion/no_atoms_ddm.screen
index fc9561628..b9f157749 100644
--- a/examples/USER/atc/drift_diffusion/no_atoms_ddm.screen
+++ b/examples/USER/atc/drift_diffusion/no_atoms_ddm.screen
@@ -1,142 +1,143 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
variable E equal 10.0
variable n0 equal 0.0001
variable dn equal 2.0*${n0}
variable dn equal 2.0*0.00010000000000000000479
variable dt equal 0.0000001
timestep ${dt}
timestep 9.9999999999999995475e-08
atom_style atomic
lattice fcc 1.0
Lattice spacing in x,y,z = 1 1 1
region simRegion block -50 50 0 1 0 1
boundary f p p
create_box 1 simRegion
Created orthogonal box = (-50 0 0) to (50 1 1)
4 by 1 by 1 MPI processor grid
mass 1 1.0 # need to keep this
atom_modify sort 0 1
# ID group atc PhysicsType ParameterFile
fix AtC all atc drift_diffusion Si_ddm.mat
ATC: constructing drift_diffusion coupling with parameter file Si_ddm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 1 materials defined from Si_ddm.mat
ATC: creating drift_diffusion extrinsic model
ATC: 1 materials defined from Si_ddm.mat
ATC: 1 materials defined from Si_ddm.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 100 1 1 simRegion f p p
ATC: created uniform mesh with 404 nodes, 101 unique nodes, and 100 elements
fix_modify AtC mesh create_nodeset lbc -50.1 -49.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 49.9 50.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
# fix a temperature
fix_modify AtC initial temperature all 300.0
fix_modify AtC initial electron_temperature all 300.0
fix_modify AtC initial electron_density all gaussian 0 0 0 1 0 0 5.0 ${dn} ${n0}
fix_modify AtC initial electron_density all gaussian 0 0 0 1 0 0 5.0 0.00020000000000000000958 ${n0}
fix_modify AtC initial electron_density all gaussian 0 0 0 1 0 0 5.0 0.00020000000000000000958 0.00010000000000000000479
# isolate system:
# diffusion: dn/dx = 0
# drift : n = 0
fix_modify AtC fix electron_density lbc ${n0}
fix_modify AtC fix electron_density lbc 0.00010000000000000000479
fix_modify AtC fix electron_density rbc ${n0}
fix_modify AtC fix electron_density rbc 0.00010000000000000000479
fix_modify AtC fix electric_potential all linear 0 0 0 $E 0 0 1
fix_modify AtC fix electric_potential all linear 0 0 0 10 0 0 1
ATC: created function : 1 + 10(x-0)+0(y-0)+0(z-0)
variable perm equal 0.06
variable nD equal 1.0e-4
fix_modify AtC source electric_potential all ${nD}
fix_modify AtC source electric_potential all 0.00010000000000000000479
variable s equal 10
thermo $s
thermo 10
# f_AtC:1 thermal energy, 2 avg T, 3 electron energy, 4 avg Te, 5 total n
thermo_style custom step cpu f_AtC[1] f_AtC[2] f_AtC[3] f_AtC[4] f_AtC[5]
thermo_modify format 1 %5i format 2 %7.2g
fix_modify AtC output no_atoms_ddmFE $s text
fix_modify AtC output no_atoms_ddmFE 10 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC extrinsic electron_integration implicit
run 40
Setting up run ...
Memory usage per processor = 0.432198 Mbytes
Step CPU AtC[1] AtC[2] AtC[3] AtC[4] AtC[5]
0 0 0.38734836 300 1.0987928e-07 300 0.011872454
- 10 2.3 0.3873484 300.00003 0.42381602 1.1554067e+09 0.011872454
- 20 3.8 0.38734851 300.00011 0.84762424 2.3107922e+09 0.011872453
- 30 4.9 0.38734869 300.00025 1.2714314 3.4661766e+09 0.011872354
- 40 6.2 0.38734894 300.00045 1.6952106 4.6215141e+09 0.011870471
-Loop time of 6.19604 on 4 procs for 40 steps with 0 atoms
+ 10 1.2 0.3873484 300.00003 0.42381602 1.1554067e+09 0.011872454
+ 20 2.3 0.38734851 300.00011 0.84762424 2.3107922e+09 0.011872453
+ 30 3.4 0.38734869 300.00025 1.2714314 3.4661766e+09 0.011872354
+ 40 4.7 0.38734894 300.00045 1.6952106 4.6215141e+09 0.011870471
+Loop time of 4.68728 on 4 procs for 40 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 5.73993e-05 (0.000926387)
-Outpt time (%) = 0.0347454 (0.560768)
-Other time (%) = 6.16123 (99.4383)
+Comm time (%) = 7.98702e-05 (0.00170398)
+Outpt time (%) = 0.0345622 (0.737362)
+Other time (%) = 4.65264 (99.2609)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
# free electric field and allow shielding
fix_modify AtC unfix electric_potential all
fix_modify AtC fix electric_potential lbc linear 0 0 0 $E 0 0 1
fix_modify AtC fix electric_potential lbc linear 0 0 0 10 0 0 1
ATC: created function : 1 + 10(x-0)+0(y-0)+0(z-0)
fix_modify AtC fix electric_potential rbc linear 0 0 0 $E 0 0 1
fix_modify AtC fix electric_potential rbc linear 0 0 0 10 0 0 1
ATC: created function : 1 + 10(x-0)+0(y-0)+0(z-0)
fix_modify AtC extrinsic electron_integration implicit 10
run 40
Setting up run ...
Memory usage per processor = 0.432198 Mbytes
Step CPU AtC[1] AtC[2] AtC[3] AtC[4] AtC[5]
40 0 0.38734894 300.00045 1.6952106 4.6215141e+09 0.011870471
- 50 6.1 0.38734927 300.0007 2.127197 5.798188e+09 0.012062369
- 60 20 0.38734967 300.00101 2.5636712 6.9867833e+09 0.01226417
- 70 26 0.38735014 300.00137 3.0038699 8.1852725e+09 0.01246759
- 80 32 0.38735069 300.0018 3.4468819 9.3912166e+09 0.012666742
-Loop time of 32.1279 on 4 procs for 40 steps with 0 atoms
+ 50 7.1 0.38734927 300.0007 2.127197 5.798188e+09 0.012062369
+ 60 13 0.38734967 300.00101 2.5636712 6.9867833e+09 0.01226417
+ 70 19 0.38735014 300.00137 3.0038699 8.1852725e+09 0.01246759
+ 80 25 0.38735069 300.0018 3.4468819 9.3912166e+09 0.012666742
+Loop time of 25.1053 on 4 procs for 40 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 9.63807e-05 (0.000299991)
-Outpt time (%) = 0.0351226 (0.109321)
-Other time (%) = 32.0926 (99.8904)
+Comm time (%) = 9.38773e-05 (0.000373935)
+Outpt time (%) = 0.0351194 (0.139888)
+Other time (%) = 25.0701 (99.8597)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/drift_diffusion/null_material_ddm.screen b/examples/USER/atc/drift_diffusion/null_material_ddm.screen
index be092412c..dd0fa62eb 100644
--- a/examples/USER/atc/drift_diffusion/null_material_ddm.screen
+++ b/examples/USER/atc/drift_diffusion/null_material_ddm.screen
@@ -1,158 +1,159 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
variable s equal 100
variable T equal 20
variable n equal 0.000004
variable tol equal 0.1
variable W equal 1000
atom_style atomic
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region FE block -8 8 -6 6 0 3
region MD block -7 7 -6 0 0 3
region FREE block -4 4 -6 0 0 3
boundary f f p
# create atoms
create_box 1 FE
Created orthogonal box = (-43.24 -32.43 0) to (43.24 32.43 16.215)
2 by 2 by 1 MPI processor grid
mass 1 39.95
atom_modify sort 0 1
timestep 0.002
thermo $s
thermo 100
# ID group atc PhysicsType ParameterFile
fix AtC all atc drift_diffusion Ar_ddm.mat
ATC: constructing drift_diffusion coupling with parameter file Ar_ddm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: WARNING: material units real do not match lammps
ATC: WARNING: material units real do not match lammps
ATC: 2 materials defined from Ar_ddm.mat
ATC: creating drift_diffusion extrinsic model
ATC: WARNING: material units real do not match lammps
ATC: WARNING: material units real do not match lammps
ATC: 2 materials defined from Ar_ddm.mat
ATC: WARNING: material units real do not match lammps
ATC: WARNING: material units real do not match lammps
ATC: 2 materials defined from Ar_ddm.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 4 4 1 FE f f p
ATC: created uniform mesh with 50 nodes, 25 unique nodes, and 16 elements
variable a equal $W+${tol}
variable a equal 1000+${tol}
variable a equal 1000+0.10000000000000000555
fix_modify AtC mesh create_elementset wire -$a $a -INF ${tol} -INF INF
fix_modify AtC mesh create_elementset wire -1000.1000000000000227 $a -INF ${tol} -INF INF
fix_modify AtC mesh create_elementset wire -1000.1000000000000227 1000.1000000000000227 -INF ${tol} -INF INF
fix_modify AtC mesh create_elementset wire -1000.1000000000000227 1000.1000000000000227 -INF 0.10000000000000000555 -INF INF
ATC: created elementset wire with 8 elements
fix_modify AtC mesh create_elementset gap -$a $a -${tol} INF -INF INF
fix_modify AtC mesh create_elementset gap -1000.1000000000000227 $a -${tol} INF -INF INF
fix_modify AtC mesh create_elementset gap -1000.1000000000000227 1000.1000000000000227 -${tol} INF -INF INF
fix_modify AtC mesh create_elementset gap -1000.1000000000000227 1000.1000000000000227 -0.10000000000000000555 INF -INF INF
ATC: created elementset gap with 8 elements
# void is the complement of the wire nodeset
variable a equal $W-${tol}
variable a equal 1000-${tol}
variable a equal 1000-0.10000000000000000555
fix_modify AtC mesh create_nodeset void -$a $a ${tol} INF -INF INF
fix_modify AtC mesh create_nodeset void -999.89999999999997726 $a ${tol} INF -INF INF
fix_modify AtC mesh create_nodeset void -999.89999999999997726 999.89999999999997726 ${tol} INF -INF INF
fix_modify AtC mesh create_nodeset void -999.89999999999997726 999.89999999999997726 0.10000000000000000555 INF -INF INF
ATC: created nodeset void with 10 nodes
fix_modify AtC mesh output null_material_ddmMESH binary
fix_modify AtC control thermal none
# fix a temperature
fix_modify AtC initial temperature all $T
fix_modify AtC initial temperature all 20
fix_modify AtC initial electron_temperature all $T
fix_modify AtC initial electron_temperature all 20
fix_modify AtC initial electron_density all $n
fix_modify AtC initial electron_density all 3.999999999999999819e-06
fix_modify AtC initial electric_potential all 0.0
fix_modify AtC initial temperature void 0.0
fix_modify AtC initial electron_density void 0.0
fix_modify AtC initial electric_potential void 0.0
# create vacuum
fix_modify AtC material gap Vacuum
thermo_style custom step cpu f_AtC[1] f_AtC[2] f_AtC[3] f_AtC[4]
fix_modify AtC output null_material_ddmFE $s full_text binary
fix_modify AtC output null_material_ddmFE 100 full_text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC extrinsic electron_integration implicit
#
fix_modify AtC mesh create_nodeset lbc -8.1 -7.9 -INF INF -INF INF
ATC: created nodeset lbc with 5 nodes
fix_modify AtC mesh create_nodeset rbc 7.9 8.1 -INF INF -INF INF
ATC: created nodeset rbc with 5 nodes
fix_modify AtC fix electron_temperature lbc $T
fix_modify AtC fix electron_temperature lbc 20
fix_modify AtC fix electron_temperature rbc $T
fix_modify AtC fix electron_temperature rbc 20
fix_modify AtC fix electron_density lbc $n
fix_modify AtC fix electron_density lbc 3.999999999999999819e-06
fix_modify AtC fix electric_potential lbc 0.0
variable m equal $s*10
variable m equal 100*10
run $m
run 1000
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
ATC: WARNING: material: [vacuum] cannot find electron_phonon_exchange
ATC: WARNING: physics model: [drift-diffusion], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
ATC: WARNING: material: [vacuum] cannot find electron_flux
ATC: WARNING: physics model: [drift-diffusion], material: [vacuum] does not provide all interfaces for <electron_density> physics and will be treated as null
ATC: WARNING: material: [vacuum] cannot find electron_heat_capacity
ATC: WARNING: physics model: [drift-diffusion], material: [vacuum] does not provide all interfaces for <electron_temperature> physics and will be treated as null
Memory usage per processor = 0.432121 Mbytes
Step CPU AtC[1] AtC[2] AtC[3] AtC[4]
0 0 94.264519 12 94.264519 20
- 100 1.0169871 94.267978 12.000392 94.299245 20.003477
- 200 1.9957042 94.276498 12.001352 94.329947 20.006513
- 300 2.9752631 94.289291 12.002784 94.363814 20.009841
- 400 3.9508462 94.306379 12.004683 94.403041 20.013675
- 500 4.92396 94.328129 12.007084 94.449527 20.018196
- 600 5.896678 94.355216 12.010055 94.505534 20.023614
- 700 7.0118601 94.388659 12.0137 94.573962 20.030199
- 800 8.0023661 94.429901 12.01817 94.65867 20.03831
- 900 10.193833 94.480951 12.023673 94.764998 20.048448
- 1000 11.610713 94.544631 12.030506 94.900724 20.061365
-Loop time of 11.6118 on 4 procs for 1000 steps with 0 atoms
+ 100 1.019752 94.267978 12.000392 94.299245 20.003477
+ 200 2.0215418 94.276498 12.001352 94.329947 20.006513
+ 300 3.019136 94.289291 12.002784 94.363814 20.009841
+ 400 4.0338819 94.306379 12.004683 94.403041 20.013675
+ 500 5.0431509 94.328129 12.007084 94.449527 20.018196
+ 600 6.056844 94.355216 12.010055 94.505534 20.023614
+ 700 7.069896 94.388659 12.0137 94.573962 20.030199
+ 800 8.0767 94.429901 12.01817 94.65867 20.03831
+ 900 9.083087 94.480951 12.023673 94.764998 20.048448
+ 1000 10.089499 94.544631 12.030506 94.900724 20.061365
+Loop time of 10.0906 on 4 procs for 1000 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00087744 (0.00755644)
-Outpt time (%) = 0.0343485 (0.295807)
-Other time (%) = 11.5766 (99.6966)
+Comm time (%) = 0.0014106 (0.0139794)
+Outpt time (%) = 0.0271637 (0.269199)
+Other time (%) = 10.062 (99.7168)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/drift_diffusion/poisson1d_noatoms.screen b/examples/USER/atc/drift_diffusion/poisson1d_noatoms.screen
index b246c4863..a87874930 100644
--- a/examples/USER/atc/drift_diffusion/poisson1d_noatoms.screen
+++ b/examples/USER/atc/drift_diffusion/poisson1d_noatoms.screen
@@ -1,41 +1,42 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Lattice spacing in x,y,z = 1 1 1
Created orthogonal box = (0 0 0) to (10 1 1)
4 by 1 by 1 MPI processor grid
ATC: constructing drift_diffusion coupling with parameter file Si_ddm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 1 materials defined from Si_ddm.mat
ATC: creating drift_diffusion extrinsic model
ATC: 1 materials defined from Si_ddm.mat
ATC: 1 materials defined from Si_ddm.mat
ATC: created uniform mesh with 164 nodes, 41 unique nodes, and 40 elements
ATC: created nodeset lbc with 1 nodes
ATC: created faceset rbc with 1 faces
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
Memory usage per processor = 0.416939 Mbytes
Step CPU
0 0
- 1 0.12138891
-Loop time of 0.132908 on 4 procs for 1 steps with 0 atoms
+ 1 0.020424843
+Loop time of 0.0204527 on 4 procs for 1 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 2.08616e-06 (0.00156963)
-Outpt time (%) = 0.0033738 (2.53845)
-Other time (%) = 0.129532 (97.46)
+Comm time (%) = 4.52995e-06 (0.0221485)
+Outpt time (%) = 0.00112778 (5.51409)
+Other time (%) = 0.0193204 (94.4638)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/drift_diffusion/poisson2d_noatoms.screen b/examples/USER/atc/drift_diffusion/poisson2d_noatoms.screen
index ee9c31a22..5d0ecf483 100644
--- a/examples/USER/atc/drift_diffusion/poisson2d_noatoms.screen
+++ b/examples/USER/atc/drift_diffusion/poisson2d_noatoms.screen
@@ -1,109 +1,110 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
variable nx equal 80 # 80 # 40
variable ny equal ${nx}
variable ny equal 80
variable nz equal 1
variable h equal 1.0
variable l equal -$h
variable l equal -1
variable u equal $h
variable u equal 1
#variable l equal -$h*${nx}
#variable u equal $h*${nx}
variable T equal 300
variable n0 equal 0.005
variable S equal 1
variable V equal 5.
# STEP THE GATE VOLTAGE UP
atom_style atomic
timestep 0.0
boundary f f f
lattice fcc 1.0
Lattice spacing in x,y,z = 1.5874 1.5874 1.5874
region BOX block $l $u $l $u 0 1
region BOX block -1 $u $l $u 0 1
region BOX block -1 1 $l $u 0 1
region BOX block -1 1 -1 $u 0 1
region BOX block -1 1 -1 1 0 1
create_box 1 BOX
Created orthogonal box = (-1.5874 -1.5874 0) to (1.5874 1.5874 1.5874)
2 by 2 by 1 MPI processor grid
mass * 12.01
atom_modify sort 0 1
# ID group atc PhysicsType ParameterFile
fix AtC all atc drift_diffusion CNT_ddm.mat
ATC: constructing drift_diffusion coupling with parameter file CNT_ddm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from CNT_ddm.mat
ATC: creating drift_diffusion extrinsic model
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from CNT_ddm.mat
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from CNT_ddm.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create ${nx} ${ny} ${nz} BOX f f p
fix_modify AtC mesh create 80 ${ny} ${nz} BOX f f p
fix_modify AtC mesh create 80 80 ${nz} BOX f f p
fix_modify AtC mesh create 80 80 1 BOX f f p
ATC: created uniform mesh with 13122 nodes, 6561 unique nodes, and 6400 elements
#fix_modify AtC extrinsic poisson_solver iterative
# boundary conditions
variable a equal $l-0.1
variable a equal -1-0.1
variable b equal $l+0.1
variable b equal -1+0.1
fix_modify AtC mesh create_nodeset bot -INF INF $a $b -INF INF
fix_modify AtC mesh create_nodeset bot -INF INF -1.1000000000000000888 $b -INF INF
fix_modify AtC mesh create_nodeset bot -INF INF -1.1000000000000000888 -0.9000000000000000222 -INF INF
ATC: created nodeset bot with 324 nodes
fix_modify AtC mesh create_nodeset rbc $a $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc -1.1000000000000000888 $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc -1.1000000000000000888 -0.9000000000000000222 -INF INF -INF INF
ATC: created nodeset rbc with 324 nodes
variable a equal $u-0.1
variable a equal 1-0.1
variable b equal $u+0.1
variable b equal 1+0.1
fix_modify AtC mesh create_nodeset top -INF INF $a $b -INF INF
fix_modify AtC mesh create_nodeset top -INF INF 0.9000000000000000222 $b -INF INF
fix_modify AtC mesh create_nodeset top -INF INF 0.9000000000000000222 1.1000000000000000888 -INF INF
ATC: created nodeset top with 324 nodes
fix_modify AtC mesh create_nodeset lbc $a $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset lbc 0.9000000000000000222 $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset lbc 0.9000000000000000222 1.1000000000000000888 -INF INF -INF INF
ATC: created nodeset lbc with 324 nodes
variable a equal -0.1
variable b equal 0.1
fix_modify AtC mesh create_nodeset origin -INF INF $a $b -INF INF
fix_modify AtC mesh create_nodeset origin -INF INF -0.10000000000000000555 $b -INF INF
fix_modify AtC mesh create_nodeset origin -INF INF -0.10000000000000000555 0.10000000000000000555 -INF INF
ATC: created nodeset origin with 648 nodes
variable a equal -2*$h
variable a equal -2*1
variable b equal 2*$h
variable b equal 2*1
variable a equal -8*$h
variable a equal -8*1
variable b equal 8*$h
variable b equal 8*1
fix_modify AtC mesh create_elementset wire -INF INF $a $b -INF INF
fix_modify AtC mesh create_elementset wire -INF INF -8 $b -INF INF
fix_modify AtC mesh create_elementset wire -INF INF -8 8 -INF INF
ATC: created elementset wire with 6400 elements
fix_modify AtC material wire C
# simplify
fix_modify AtC internal_quadrature off
fix_modify AtC control thermal none
fix_modify AtC extrinsic electron_integration explicit 1
fix_modify AtC extrinsic poisson_solver iterative
ERROR: Illegal fix_modify command (../fix.cpp:104)
diff --git a/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_Jconstraint.screen b/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_Jconstraint.screen
index 93b68c158..caa7dfe06 100644
--- a/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_Jconstraint.screen
+++ b/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_Jconstraint.screen
@@ -1,209 +1,210 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
#variable iter equal 2 # need two for potential to affect density
variable iter1 equal 4 # NOTE <<<<
variable iter2 equal 25 # NOTE <<<<
variable r equal 1
variable nx equal 12 # 30 40 10
variable mx equal 4 # 4 2
#variable ny equal ${nx}
variable ny equal 12 # 30 40
variable my equal 8 # 12 6
variable nz equal 1
variable hx equal 1.0
variable hy equal ${hx}*${nx}/${ny}
variable hy equal 1*${nx}/${ny}
variable hy equal 1*12/${ny}
variable hy equal 1*12/12
variable l equal -${hx}*${nx}
variable l equal -1*${nx}
variable l equal -1*12
variable u equal ${hx}*${nx}
variable u equal 1*${nx}
variable u equal 1*12
variable w equal ${hy}*${my}
variable w equal 1*${my}
variable w equal 1*8
variable q equal ${hx}*${mx}
variable q equal 1*${mx}
variable q equal 1*4
variable y equal ${nx}+1-${mx}
variable y equal 12+1-${mx}
variable y equal 12+1-4
variable T equal 300
variable S equal 1
variable n0 equal 0.00007
variable J0 equal 40.0 # 100.0 40.0
variable Vs equal 1.0
#variable Vg equal 1.0 # 10.0 0.0
variable tol equal 0.01
#################################################
atom_style atomic
timestep 0.001
boundary f f f
lattice fcc 1.0
Lattice spacing in x,y,z = 1.5874 1.5874 1.5874
region BOX block ${l} ${u} ${l} ${u} 0 1
region BOX block -12 ${u} ${l} ${u} 0 1
region BOX block -12 12 ${l} ${u} 0 1
region BOX block -12 12 -12 ${u} 0 1
region BOX block -12 12 -12 12 0 1
create_box 1 BOX
Created orthogonal box = (-19.0488 -19.0488 0) to (19.0488 19.0488 1.5874)
2 by 2 by 1 MPI processor grid
mass * 12.01
atom_modify sort 0 1
# ID group atc PhysicsType ParameterFile
fix AtC all atc drift_diffusion-schrodinger-slice SiVacuum_ddm_schrodinger.mat
Constructing ATC transfer (drift_diffusion-schrodinger-slice) with parameter file SiVacuum_ddm_schrodinger.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from SiVacuum_ddm_schrodinger.mat
ATC: creating drift_diffusion extrinsic model
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from SiVacuum_ddm_schrodinger.mat
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from SiVacuum_ddm_schrodinger.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create ${nx} ${ny} ${nz} BOX f f p
fix_modify AtC mesh create 12 ${ny} ${nz} BOX f f p
fix_modify AtC mesh create 12 12 ${nz} BOX f f p
fix_modify AtC mesh create 12 12 1 BOX f f p
ATC: created uniform mesh with 338 nodes, 169 unique nodes, and 144 elements
# surfaces & regions
variable a equal $l-${tol}
variable a equal -12-${tol}
variable a equal -12-0.010000000000000000208
variable b equal $l+$q+${tol}
variable b equal -12+$q+${tol}
variable b equal -12+4+${tol}
variable b equal -12+4+0.010000000000000000208
variable c equal -$w-${tol}
variable c equal -8-${tol}
variable c equal -8-0.010000000000000000208
variable d equal $w+${tol}
variable d equal 8+${tol}
variable d equal 8+0.010000000000000000208
variable e equal $l+$q-${tol}
variable e equal -12+$q-${tol}
variable e equal -12+4-${tol}
variable e equal -12+4-0.010000000000000000208
fix_modify AtC mesh create_nodeset bot -INF INF $a $b -INF INF
fix_modify AtC mesh create_nodeset bot -INF INF -12.009999999999999787 $b -INF INF
fix_modify AtC mesh create_nodeset bot -INF INF -12.009999999999999787 -7.9900000000000002132 -INF INF
ATC: created nodeset bot with 39 nodes
fix_modify AtC mesh create_nodeset lbc $a $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset lbc -12.009999999999999787 $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset lbc -12.009999999999999787 -7.9900000000000002132 -INF INF -INF INF
ATC: created nodeset lbc with 39 nodes
variable a equal $u-$q-${tol}
variable a equal 12-$q-${tol}
variable a equal 12-4-${tol}
variable a equal 12-4-0.010000000000000000208
variable b equal $u+${tol}
variable b equal 12+${tol}
variable b equal 12+0.010000000000000000208
variable e equal $u-$q+${tol}
variable e equal 12-$q+${tol}
variable e equal 12-4+${tol}
variable e equal 12-4+0.010000000000000000208
fix_modify AtC mesh create_nodeset top -INF INF $a $b -INF INF
fix_modify AtC mesh create_nodeset top -INF INF 7.9900000000000002132 $b -INF INF
fix_modify AtC mesh create_nodeset top -INF INF 7.9900000000000002132 12.009999999999999787 -INF INF
ATC: created nodeset top with 39 nodes
fix_modify AtC mesh create_nodeset rbc $a $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 7.9900000000000002132 $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 7.9900000000000002132 12.009999999999999787 -INF INF -INF INF
ATC: created nodeset rbc with 39 nodes
variable a equal -$w-${tol}
variable a equal -8-${tol}
variable a equal -8-0.010000000000000000208
variable b equal $w+${tol}
variable b equal 8+${tol}
variable b equal 8+0.010000000000000000208
variable c equal $l+$q-${tol}
variable c equal -12+$q-${tol}
variable c equal -12+4-${tol}
variable c equal -12+4-0.010000000000000000208
variable d equal $u-$q+${tol}
variable d equal 12-$q+${tol}
variable d equal 12-4+${tol}
variable d equal 12-4+0.010000000000000000208
fix_modify AtC mesh create_elementset wire $c $d $a $b -INF INF
fix_modify AtC mesh create_elementset wire -8.0099999999999997868 $d $a $b -INF INF
fix_modify AtC mesh create_elementset wire -8.0099999999999997868 8.0099999999999997868 $a $b -INF INF
fix_modify AtC mesh create_elementset wire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_elementset wire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created elementset wire with 64 elements
fix_modify AtC mesh create_nodeset wire $c $d $a $b -INF INF
fix_modify AtC mesh create_nodeset wire -8.0099999999999997868 $d $a $b -INF INF
fix_modify AtC mesh create_nodeset wire -8.0099999999999997868 8.0099999999999997868 $a $b -INF INF
fix_modify AtC mesh create_nodeset wire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_nodeset wire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created nodeset wire with 81 nodes
variable e equal $c+2*${tol}
variable e equal -8.0099999999999997868+2*${tol}
variable e equal -8.0099999999999997868+2*0.010000000000000000208
variable f equal $c+${tol}
variable f equal -8.0099999999999997868+${tol}
variable f equal -8.0099999999999997868+0.010000000000000000208
fix_modify AtC mesh create_nodeset lwire $c $e $a $b -INF INF
fix_modify AtC mesh create_nodeset lwire -8.0099999999999997868 $e $a $b -INF INF
fix_modify AtC mesh create_nodeset lwire -8.0099999999999997868 -7.9900000000000002132 $a $b -INF INF
fix_modify AtC mesh create_nodeset lwire -8.0099999999999997868 -7.9900000000000002132 -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_nodeset lwire -8.0099999999999997868 -7.9900000000000002132 -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created nodeset lwire with 9 nodes
fix_modify AtC mesh create_faceset lwire $f INF $a $b -INF INF
fix_modify AtC mesh create_faceset lwire -8 INF $a $b -INF INF
fix_modify AtC mesh create_faceset lwire -8 INF -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_faceset lwire -8 INF -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created faceset lwire with 8 faces
variable e equal $d-2*${tol}
variable e equal 8.0099999999999997868-2*${tol}
variable e equal 8.0099999999999997868-2*0.010000000000000000208
variable f equal $d-${tol}
variable f equal 8.0099999999999997868-${tol}
variable f equal 8.0099999999999997868-0.010000000000000000208
fix_modify AtC mesh create_nodeset rwire $e $d $a $b -INF INF
fix_modify AtC mesh create_nodeset rwire 7.9900000000000002132 $d $a $b -INF INF
fix_modify AtC mesh create_nodeset rwire 7.9900000000000002132 8.0099999999999997868 $a $b -INF INF
fix_modify AtC mesh create_nodeset rwire 7.9900000000000002132 8.0099999999999997868 -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_nodeset rwire 7.9900000000000002132 8.0099999999999997868 -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created nodeset rwire with 9 nodes
fix_modify AtC mesh create_faceset rwire -INF $f $a $b -INF INF
fix_modify AtC mesh create_faceset rwire -INF 8 $a $b -INF INF
fix_modify AtC mesh create_faceset rwire -INF 8 -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_faceset rwire -INF 8 -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created faceset rwire with 8 faces
variable e equal $a+2*${tol}
variable e equal -8.0099999999999997868+2*${tol}
variable e equal -8.0099999999999997868+2*0.010000000000000000208
fix_modify AtC mesh create_nodeset bwire $c $d $a $e -INF INF
fix_modify AtC mesh create_nodeset bwire -8.0099999999999997868 $d $a $e -INF INF
fix_modify AtC mesh create_nodeset bwire -8.0099999999999997868 8.0099999999999997868 $a $e -INF INF
fix_modify AtC mesh create_nodeset bwire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 $e -INF INF
fix_modify AtC mesh create_nodeset bwire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 -7.9900000000000002132 -INF INF
ATC: created nodeset bwire with 9 nodes
variable e equal $b-2*${tol}
variable e equal 8.0099999999999997868-2*${tol}
variable e equal 8.0099999999999997868-2*0.010000000000000000208
fix_modify AtC mesh create_nodeset twire $c $d $e $b -INF INF
fix_modify AtC mesh create_nodeset twire -8.0099999999999997868 $d $e $b -INF INF
fix_modify AtC mesh create_nodeset twire -8.0099999999999997868 8.0099999999999997868 $e $b -INF INF
fix_modify AtC mesh create_nodeset twire -8.0099999999999997868 8.0099999999999997868 7.9900000000000002132 $b -INF INF
fix_modify AtC mesh create_nodeset twire -8.0099999999999997868 8.0099999999999997868 7.9900000000000002132 8.0099999999999997868 -INF INF
ATC: created nodeset twire with 9 nodes
# new material
fix_modify AtC material wire Si
# simplify
fix_modify AtC extrinsic one_dimensional x wire $y
fix_modify AtC extrinsic one_dimensional x wire 9
ERROR: Illegal fix_modify command (../fix.cpp:104)
diff --git a/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_convective.screen b/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_convective.screen
index ada034426..a82790ad5 100644
--- a/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_convective.screen
+++ b/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_convective.screen
@@ -1,219 +1,220 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
#variable iter equal 2 # need two for potential to affect density
variable iter1 equal 4 # NOTE <<<<
variable iter2 equal 25 # NOTE <<<<
variable r equal 1
variable nx equal 12 # 30 40 10
variable mx equal 4 # 4 2
#variable ny equal ${nx}
variable ny equal 12 # 30 40
variable my equal 8 # 12 6
variable nz equal 1
variable hx equal 1.0
variable hy equal ${hx}*${nx}/${ny}
variable hy equal 1*${nx}/${ny}
variable hy equal 1*12/${ny}
variable hy equal 1*12/12
variable l equal -${hx}*${nx}
variable l equal -1*${nx}
variable l equal -1*12
variable u equal ${hx}*${nx}
variable u equal 1*${nx}
variable u equal 1*12
variable w equal ${hy}*${my}
variable w equal 1*${my}
variable w equal 1*8
variable q equal ${hx}*${mx}
variable q equal 1*${mx}
variable q equal 1*4
variable y equal ${nx}+1-${mx}
variable y equal 12+1-${mx}
variable y equal 12+1-4
variable T equal 300
variable S equal 1
variable n0 equal 0.00007
variable v0 equal 1000.0
variable J0 equal ${n0}*${v0}
variable J0 equal 6.9999999999999993868e-05*${v0}
variable J0 equal 6.9999999999999993868e-05*1000
print "prescribed flux: ${J0}"
prescribed flux: 0.069999999999999992784
variable Vs equal 1.0
#variable Vg equal 1.0 # 10.0 0.0
variable tol equal 0.01
#################################################
atom_style atomic
timestep 0.001
boundary f f f
lattice fcc 1.0
Lattice spacing in x,y,z = 1.5874 1.5874 1.5874
region BOX block ${l} ${u} ${l} ${u} 0 1
region BOX block -12 ${u} ${l} ${u} 0 1
region BOX block -12 12 ${l} ${u} 0 1
region BOX block -12 12 -12 ${u} 0 1
region BOX block -12 12 -12 12 0 1
create_box 1 BOX
Created orthogonal box = (-19.0488 -19.0488 0) to (19.0488 19.0488 1.5874)
2 by 2 by 1 MPI processor grid
mass * 12.01
atom_modify sort 0 1
# ID group atc PhysicsType ParameterFile
fix AtC all atc convective_drift_diffusion-schrodinger SiVacuum_cddm_schrodinger.mat
ATC: constructing convective_drift_diffusion-schrodinger coupling with parameter file SiVacuum_cddm_schrodinger.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from SiVacuum_cddm_schrodinger.mat
ATC: creating convective_drift_diffusion extrinsic model
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from SiVacuum_cddm_schrodinger.mat
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from SiVacuum_cddm_schrodinger.mat
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from SiVacuum_cddm_schrodinger.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create ${nx} ${ny} ${nz} BOX f f p
fix_modify AtC mesh create 12 ${ny} ${nz} BOX f f p
fix_modify AtC mesh create 12 12 ${nz} BOX f f p
fix_modify AtC mesh create 12 12 1 BOX f f p
ATC: created uniform mesh with 338 nodes, 169 unique nodes, and 144 elements
# surfaces & regions
variable a equal $l-${tol}
variable a equal -12-${tol}
variable a equal -12-0.010000000000000000208
variable b equal $l+$q+${tol}
variable b equal -12+$q+${tol}
variable b equal -12+4+${tol}
variable b equal -12+4+0.010000000000000000208
variable c equal -$w-${tol}
variable c equal -8-${tol}
variable c equal -8-0.010000000000000000208
variable d equal $w+${tol}
variable d equal 8+${tol}
variable d equal 8+0.010000000000000000208
variable e equal $l+$q-${tol}
variable e equal -12+$q-${tol}
variable e equal -12+4-${tol}
variable e equal -12+4-0.010000000000000000208
fix_modify AtC mesh create_nodeset bot -INF INF $a $b -INF INF
fix_modify AtC mesh create_nodeset bot -INF INF -12.009999999999999787 $b -INF INF
fix_modify AtC mesh create_nodeset bot -INF INF -12.009999999999999787 -7.9900000000000002132 -INF INF
ATC: created nodeset bot with 39 nodes
fix_modify AtC mesh create_nodeset lbc $a $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset lbc -12.009999999999999787 $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset lbc -12.009999999999999787 -7.9900000000000002132 -INF INF -INF INF
ATC: created nodeset lbc with 39 nodes
variable a equal $u-$q-${tol}
variable a equal 12-$q-${tol}
variable a equal 12-4-${tol}
variable a equal 12-4-0.010000000000000000208
variable b equal $u+${tol}
variable b equal 12+${tol}
variable b equal 12+0.010000000000000000208
variable e equal $u-$q+${tol}
variable e equal 12-$q+${tol}
variable e equal 12-4+${tol}
variable e equal 12-4+0.010000000000000000208
fix_modify AtC mesh create_nodeset top -INF INF $a $b -INF INF
fix_modify AtC mesh create_nodeset top -INF INF 7.9900000000000002132 $b -INF INF
fix_modify AtC mesh create_nodeset top -INF INF 7.9900000000000002132 12.009999999999999787 -INF INF
ATC: created nodeset top with 39 nodes
fix_modify AtC mesh create_nodeset rbc $a $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 7.9900000000000002132 $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 7.9900000000000002132 12.009999999999999787 -INF INF -INF INF
ATC: created nodeset rbc with 39 nodes
variable a equal -$w-${tol}
variable a equal -8-${tol}
variable a equal -8-0.010000000000000000208
variable b equal $w+${tol}
variable b equal 8+${tol}
variable b equal 8+0.010000000000000000208
variable c equal $l+$q-${tol}
variable c equal -12+$q-${tol}
variable c equal -12+4-${tol}
variable c equal -12+4-0.010000000000000000208
variable d equal $u-$q+${tol}
variable d equal 12-$q+${tol}
variable d equal 12-4+${tol}
variable d equal 12-4+0.010000000000000000208
fix_modify AtC mesh create_elementset wire $c $d $a $b -INF INF
fix_modify AtC mesh create_elementset wire -8.0099999999999997868 $d $a $b -INF INF
fix_modify AtC mesh create_elementset wire -8.0099999999999997868 8.0099999999999997868 $a $b -INF INF
fix_modify AtC mesh create_elementset wire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_elementset wire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created elementset wire with 64 elements
fix_modify AtC mesh create_nodeset wire $c $d $a $b -INF INF
fix_modify AtC mesh create_nodeset wire -8.0099999999999997868 $d $a $b -INF INF
fix_modify AtC mesh create_nodeset wire -8.0099999999999997868 8.0099999999999997868 $a $b -INF INF
fix_modify AtC mesh create_nodeset wire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_nodeset wire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created nodeset wire with 81 nodes
variable e equal $c+2*${tol}
variable e equal -8.0099999999999997868+2*${tol}
variable e equal -8.0099999999999997868+2*0.010000000000000000208
variable f equal $c+${tol}
variable f equal -8.0099999999999997868+${tol}
variable f equal -8.0099999999999997868+0.010000000000000000208
fix_modify AtC mesh create_nodeset lwire $c $e $a $b -INF INF
fix_modify AtC mesh create_nodeset lwire -8.0099999999999997868 $e $a $b -INF INF
fix_modify AtC mesh create_nodeset lwire -8.0099999999999997868 -7.9900000000000002132 $a $b -INF INF
fix_modify AtC mesh create_nodeset lwire -8.0099999999999997868 -7.9900000000000002132 -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_nodeset lwire -8.0099999999999997868 -7.9900000000000002132 -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created nodeset lwire with 9 nodes
fix_modify AtC mesh create_faceset lwire $f INF $a $b -INF INF
fix_modify AtC mesh create_faceset lwire -8 INF $a $b -INF INF
fix_modify AtC mesh create_faceset lwire -8 INF -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_faceset lwire -8 INF -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created faceset lwire with 8 faces
variable e equal $d-2*${tol}
variable e equal 8.0099999999999997868-2*${tol}
variable e equal 8.0099999999999997868-2*0.010000000000000000208
variable f equal $d-${tol}
variable f equal 8.0099999999999997868-${tol}
variable f equal 8.0099999999999997868-0.010000000000000000208
fix_modify AtC mesh create_nodeset rwire $e $d $a $b -INF INF
fix_modify AtC mesh create_nodeset rwire 7.9900000000000002132 $d $a $b -INF INF
fix_modify AtC mesh create_nodeset rwire 7.9900000000000002132 8.0099999999999997868 $a $b -INF INF
fix_modify AtC mesh create_nodeset rwire 7.9900000000000002132 8.0099999999999997868 -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_nodeset rwire 7.9900000000000002132 8.0099999999999997868 -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created nodeset rwire with 9 nodes
fix_modify AtC mesh create_faceset rwire -INF $f $a $b -INF INF
fix_modify AtC mesh create_faceset rwire -INF 8 $a $b -INF INF
fix_modify AtC mesh create_faceset rwire -INF 8 -8.0099999999999997868 $b -INF INF
fix_modify AtC mesh create_faceset rwire -INF 8 -8.0099999999999997868 8.0099999999999997868 -INF INF
ATC: created faceset rwire with 8 faces
variable e equal $a+2*${tol}
variable e equal -8.0099999999999997868+2*${tol}
variable e equal -8.0099999999999997868+2*0.010000000000000000208
fix_modify AtC mesh create_nodeset bwire $c $d $a $e -INF INF
fix_modify AtC mesh create_nodeset bwire -8.0099999999999997868 $d $a $e -INF INF
fix_modify AtC mesh create_nodeset bwire -8.0099999999999997868 8.0099999999999997868 $a $e -INF INF
fix_modify AtC mesh create_nodeset bwire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 $e -INF INF
fix_modify AtC mesh create_nodeset bwire -8.0099999999999997868 8.0099999999999997868 -8.0099999999999997868 -7.9900000000000002132 -INF INF
ATC: created nodeset bwire with 9 nodes
variable e equal $b-2*${tol}
variable e equal 8.0099999999999997868-2*${tol}
variable e equal 8.0099999999999997868-2*0.010000000000000000208
fix_modify AtC mesh create_nodeset twire $c $d $e $b -INF INF
fix_modify AtC mesh create_nodeset twire -8.0099999999999997868 $d $e $b -INF INF
fix_modify AtC mesh create_nodeset twire -8.0099999999999997868 8.0099999999999997868 $e $b -INF INF
fix_modify AtC mesh create_nodeset twire -8.0099999999999997868 8.0099999999999997868 7.9900000000000002132 $b -INF INF
fix_modify AtC mesh create_nodeset twire -8.0099999999999997868 8.0099999999999997868 7.9900000000000002132 8.0099999999999997868 -INF INF
ATC: created nodeset twire with 9 nodes
# new material
fix_modify AtC material wire Si
# simplify
fix_modify AtC extrinsic one_dimensional x wire $y
fix_modify AtC extrinsic one_dimensional x wire 9
ERROR: Illegal fix_modify command (../fix.cpp:104)
diff --git a/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_noatoms.screen b/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_noatoms.screen
index a76191f0c..00b2834f1 100644
--- a/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_noatoms.screen
+++ b/examples/USER/atc/drift_diffusion/schrodinger-poisson2d_noatoms.screen
@@ -1,191 +1,192 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
#variable iter equal 2 # need two for potential to affect density
variable iter equal 1 # NOTE <<<<
variable r equal 1
variable nx equal 30 # 30 # 40 10
variable mx equal 4 # 4 2
#variable ny equal ${nx}
variable ny equal 30 # 40
variable my equal 12 # 6
variable nz equal 1
variable hx equal 1.0
variable hy equal ${hx}*${nx}/${ny}
variable hy equal 1*${nx}/${ny}
variable hy equal 1*30/${ny}
variable hy equal 1*30/30
variable l equal -${hx}*${nx}
variable l equal -1*${nx}
variable l equal -1*30
variable u equal ${hx}*${nx}
variable u equal 1*${nx}
variable u equal 1*30
variable w equal ${hy}*${my}
variable w equal 1*${my}
variable w equal 1*12
variable q equal ${hx}*${mx}
variable q equal 1*${mx}
variable q equal 1*4
variable y equal ${nx}+1-${mx}
variable y equal 30+1-${mx}
variable y equal 30+1-4
variable T equal 300
variable E equal 0.1
variable S equal 1
variable n0 equal 0.01
variable V equal 5.
variable tol equal 0.01
#################################################
atom_style atomic
timestep 0.001
boundary f f f
lattice fcc 1.0
Lattice spacing in x,y,z = 1.5874 1.5874 1.5874
region BOX block ${l} ${u} ${l} ${u} 0 1
region BOX block -30 ${u} ${l} ${u} 0 1
region BOX block -30 30 ${l} ${u} 0 1
region BOX block -30 30 -30 ${u} 0 1
region BOX block -30 30 -30 30 0 1
create_box 1 BOX
Created orthogonal box = (-47.622 -47.622 0) to (47.622 47.622 1.5874)
2 by 2 by 1 MPI processor grid
mass * 12.01
atom_modify sort 0 1
# ID group atc PhysicsType ParameterFile
fix AtC all atc drift_diffusion-schrodinger-slice SiVacuum_ddm_schrodinger.mat
Constructing ATC transfer (drift_diffusion-schrodinger-slice) with parameter file SiVacuum_ddm_schrodinger.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from SiVacuum_ddm_schrodinger.mat
ATC: creating drift_diffusion extrinsic model
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from SiVacuum_ddm_schrodinger.mat
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e
ATC: WARNING: material units metal do not match lammps
ATC: 2 materials defined from SiVacuum_ddm_schrodinger.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create ${nx} ${ny} ${nz} BOX f f p
fix_modify AtC mesh create 30 ${ny} ${nz} BOX f f p
fix_modify AtC mesh create 30 30 ${nz} BOX f f p
fix_modify AtC mesh create 30 30 1 BOX f f p
ATC: created uniform mesh with 1922 nodes, 961 unique nodes, and 900 elements
# surfaces & regions
variable a equal $l-${tol}
variable a equal -30-${tol}
variable a equal -30-0.010000000000000000208
variable b equal $l+$q+${tol}
variable b equal -30+$q+${tol}
variable b equal -30+4+${tol}
variable b equal -30+4+0.010000000000000000208
variable c equal -$w-${tol}
variable c equal -12-${tol}
variable c equal -12-0.010000000000000000208
variable d equal $w+${tol}
variable d equal 12+${tol}
variable d equal 12+0.010000000000000000208
variable e equal $l+$q-${tol}
variable e equal -30+$q-${tol}
variable e equal -30+4-${tol}
variable e equal -30+4-0.010000000000000000208
fix_modify AtC mesh create_nodeset bot -INF INF $a $b -INF INF
fix_modify AtC mesh create_nodeset bot -INF INF -30.010000000000001563 $b -INF INF
fix_modify AtC mesh create_nodeset bot -INF INF -30.010000000000001563 -25.989999999999998437 -INF INF
ATC: created nodeset bot with 93 nodes
fix_modify AtC mesh create_nodeset lbc $a $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset lbc -30.010000000000001563 $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset lbc -30.010000000000001563 -25.989999999999998437 -INF INF -INF INF
ATC: created nodeset lbc with 93 nodes
variable a equal $u-$q-${tol}
variable a equal 30-$q-${tol}
variable a equal 30-4-${tol}
variable a equal 30-4-0.010000000000000000208
variable b equal $u+${tol}
variable b equal 30+${tol}
variable b equal 30+0.010000000000000000208
variable e equal $u-$q+${tol}
variable e equal 30-$q+${tol}
variable e equal 30-4+${tol}
variable e equal 30-4+0.010000000000000000208
fix_modify AtC mesh create_nodeset top -INF INF $a $b -INF INF
fix_modify AtC mesh create_nodeset top -INF INF 25.989999999999998437 $b -INF INF
fix_modify AtC mesh create_nodeset top -INF INF 25.989999999999998437 30.010000000000001563 -INF INF
ATC: created nodeset top with 93 nodes
fix_modify AtC mesh create_nodeset rbc $a $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 25.989999999999998437 $b -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 25.989999999999998437 30.010000000000001563 -INF INF -INF INF
ATC: created nodeset rbc with 93 nodes
variable a equal -$w-${tol}
variable a equal -12-${tol}
variable a equal -12-0.010000000000000000208
variable b equal $w+${tol}
variable b equal 12+${tol}
variable b equal 12+0.010000000000000000208
variable c equal $l+$q-${tol}
variable c equal -30+$q-${tol}
variable c equal -30+4-${tol}
variable c equal -30+4-0.010000000000000000208
variable d equal $u-$q+${tol}
variable d equal 30-$q+${tol}
variable d equal 30-4+${tol}
variable d equal 30-4+0.010000000000000000208
fix_modify AtC mesh create_elementset wire $c $d $a $b -INF INF
fix_modify AtC mesh create_elementset wire -26.010000000000001563 $d $a $b -INF INF
fix_modify AtC mesh create_elementset wire -26.010000000000001563 26.010000000000001563 $a $b -INF INF
fix_modify AtC mesh create_elementset wire -26.010000000000001563 26.010000000000001563 -12.009999999999999787 $b -INF INF
fix_modify AtC mesh create_elementset wire -26.010000000000001563 26.010000000000001563 -12.009999999999999787 12.009999999999999787 -INF INF
ATC: created elementset wire with 312 elements
fix_modify AtC mesh create_nodeset wire $c $d $a $b -INF INF
fix_modify AtC mesh create_nodeset wire -26.010000000000001563 $d $a $b -INF INF
fix_modify AtC mesh create_nodeset wire -26.010000000000001563 26.010000000000001563 $a $b -INF INF
fix_modify AtC mesh create_nodeset wire -26.010000000000001563 26.010000000000001563 -12.009999999999999787 $b -INF INF
fix_modify AtC mesh create_nodeset wire -26.010000000000001563 26.010000000000001563 -12.009999999999999787 12.009999999999999787 -INF INF
ATC: created nodeset wire with 351 nodes
variable e equal $c+2*${tol}
variable e equal -26.010000000000001563+2*${tol}
variable e equal -26.010000000000001563+2*0.010000000000000000208
fix_modify AtC mesh create_nodeset lwire $c $e $a $b -INF INF
fix_modify AtC mesh create_nodeset lwire -26.010000000000001563 $e $a $b -INF INF
fix_modify AtC mesh create_nodeset lwire -26.010000000000001563 -25.99000000000000199 $a $b -INF INF
fix_modify AtC mesh create_nodeset lwire -26.010000000000001563 -25.99000000000000199 -12.009999999999999787 $b -INF INF
fix_modify AtC mesh create_nodeset lwire -26.010000000000001563 -25.99000000000000199 -12.009999999999999787 12.009999999999999787 -INF INF
ATC: created nodeset lwire with 13 nodes
variable e equal $d-2*${tol}
variable e equal 26.010000000000001563-2*${tol}
variable e equal 26.010000000000001563-2*0.010000000000000000208
fix_modify AtC mesh create_nodeset rwire $e $d $a $b -INF INF
fix_modify AtC mesh create_nodeset rwire 25.99000000000000199 $d $a $b -INF INF
fix_modify AtC mesh create_nodeset rwire 25.99000000000000199 26.010000000000001563 $a $b -INF INF
fix_modify AtC mesh create_nodeset rwire 25.99000000000000199 26.010000000000001563 -12.009999999999999787 $b -INF INF
fix_modify AtC mesh create_nodeset rwire 25.99000000000000199 26.010000000000001563 -12.009999999999999787 12.009999999999999787 -INF INF
ATC: created nodeset rwire with 13 nodes
variable e equal $a+2*${tol}
variable e equal -12.009999999999999787+2*${tol}
variable e equal -12.009999999999999787+2*0.010000000000000000208
fix_modify AtC mesh create_nodeset bwire $c $d $a $e -INF INF
fix_modify AtC mesh create_nodeset bwire -26.010000000000001563 $d $a $e -INF INF
fix_modify AtC mesh create_nodeset bwire -26.010000000000001563 26.010000000000001563 $a $e -INF INF
fix_modify AtC mesh create_nodeset bwire -26.010000000000001563 26.010000000000001563 -12.009999999999999787 $e -INF INF
fix_modify AtC mesh create_nodeset bwire -26.010000000000001563 26.010000000000001563 -12.009999999999999787 -11.990000000000000213 -INF INF
ATC: created nodeset bwire with 27 nodes
variable e equal $b-2*${tol}
variable e equal 12.009999999999999787-2*${tol}
variable e equal 12.009999999999999787-2*0.010000000000000000208
fix_modify AtC mesh create_nodeset twire $c $d $e $b -INF INF
fix_modify AtC mesh create_nodeset twire -26.010000000000001563 $d $e $b -INF INF
fix_modify AtC mesh create_nodeset twire -26.010000000000001563 26.010000000000001563 $e $b -INF INF
fix_modify AtC mesh create_nodeset twire -26.010000000000001563 26.010000000000001563 11.990000000000000213 $b -INF INF
fix_modify AtC mesh create_nodeset twire -26.010000000000001563 26.010000000000001563 11.990000000000000213 12.009999999999999787 -INF INF
ATC: created nodeset twire with 27 nodes
# new material
fix_modify AtC material wire Si
# simplify
fix_modify AtC extrinsic one_dimensional x wire $y
fix_modify AtC extrinsic one_dimensional x wire 27
ERROR: Illegal fix_modify command (../fix.cpp:104)
diff --git a/examples/USER/atc/elastic/CNT_electrostatic2.mat b/examples/USER/atc/elastic/CNT_electrostatic2.mat
index 86d1a68dc..552edb2f6 100644
--- a/examples/USER/atc/elastic/CNT_electrostatic2.mat
+++ b/examples/USER/atc/elastic/CNT_electrostatic2.mat
@@ -1,20 +1,21 @@
material CNT metal
stress linear
modulus 0.0
possions_ratio 0.25
end
electric_field linear
permittivity 1.0
end
electron_density linear
coefficient -1.e-2 # NOTE will not converge with +0.01, try smaller pos
+ #coefficient 1.e-2 # NOTE will not converge with +0.01, try smaller pos
end
mass_density
#electron_density interpolation
# number_of_points 3
# 0 0 1.e-4
# 1.e0 1.e-4 1.e-4
# 3.e0 3.e-4 1.e-4
#end
body_force
end
diff --git a/examples/USER/atc/elastic/bar1d.screen b/examples/USER/atc/elastic/bar1d.screen
index cbd105b0d..3afb3e886 100644
--- a/examples/USER/atc/elastic/bar1d.screen
+++ b/examples/USER/atc/elastic/bar1d.screen
@@ -1,269 +1,270 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
# create atoms
region simRegion block -12 12 -3 3 -3 3
region atomRegion block -9 9 -3 3 -3 3
region mdRegion block -8 8 -3 3 -3 3
boundary f p p
create_box 1 simRegion
Created orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
4 by 1 by 1 MPI processor grid
create_atoms 1 region mdRegion
Created 2304 atoms
mass 1 39.95
# specify interal/ghost atoms
region mdInternal block -6 6 -3 3 -3 3
region leftghost block -8 -6 -3 3 -3 3
region rightghost block 6 8 -3 3 -3 3
group internal region mdInternal
1728 atoms in group internal
group Lghost region leftghost
288 atoms in group Lghost
group Rghost region rightghost
288 atoms in group Rghost
group ghosts union Lghost Rghost
576 atoms in group ghosts
# velocities have Vcm = 0
#velocity internal create 40. 87287 mom yes loop geom
pair_style lj/cut 13.5
#pair_coeff 1 1 0.010323166 3.405 13.5
pair_coeff 1 1 .238 3.405 13.5
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# define layer
# ID group atc PhysicsType ParameterFile
fix AtC internal atc elastic Ar_elastic.mat
ATC: constructing elastic coupling with parameter file Ar_elastic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 1.01202
ATC: computed mass density : 1.01202
ATC: computed mass density : 1.01202
ATC: 3 materials defined from Ar_elastic.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 12 1 1 simRegion f p p
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
# initial conditions
fix_modify AtC initial displacement x all 0.0
fix_modify AtC initial displacement y all 0.0
fix_modify AtC initial displacement z all 0.0
fix_modify AtC initial velocity x all 0.0
fix_modify AtC initial velocity y all 0.0
fix_modify AtC initial velocity z all 0.0
# set node sets and bcs
# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC fix velocity x rbc 0.00000004
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix velocity x lbc 0.
# specify atom types
#fix_modify AtC boundary Lghost
#fix_modify AtC boundary Rghost
fix_modify AtC boundary ghosts
#fix_modify AtC output follow_ex.fe 50
fix_modify AtC internal_quadrature off
fix_modify AtC control localized_lambda on
fix_modify AtC control momentum glc_velocity
fix_modify AtC filter type exponential
fix_modify AtC filter scale 1000.0
fix_modify AtC filter on
# run to extension
#fix_modify AtC output bar1dFE 50 text
timestep 5
thermo 100
run 1000
Setting up run ...
-Memory usage per processor = 93.2479 Mbytes
+Memory usage per processor = 65.7794 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0 -4406.6687 0 -4406.6687 -1155.1752
100 3.8434911e-14 -4406.6687 0 -4406.6687 -1155.1752
200 2.634669e-11 -4406.6687 0 -4406.6687 -1155.1754
300 6.909135e-10 -4406.6685 0 -4406.6685 -1155.1763
400 3.9413859e-09 -4406.6682 0 -4406.6682 -1155.1783
500 8.5603227e-09 -4406.6676 0 -4406.6676 -1155.181
600 1.0143684e-08 -4406.6671 0 -4406.6671 -1155.1835
700 9.8473676e-09 -4406.6667 0 -4406.6667 -1155.1854
800 9.9628095e-09 -4406.6663 0 -4406.6663 -1155.1871
900 1.1034555e-08 -4406.6659 0 -4406.6659 -1155.189
1000 1.2796459e-08 -4406.6655 0 -4406.6655 -1155.191
-Loop time of 71.7602 on 4 procs for 1000 steps with 2304 atoms
+Loop time of 19.6955 on 4 procs for 1000 steps with 2304 atoms
-Pair time (%) = 8.28353 (11.5433)
-Neigh time (%) = 4.8737 (6.79165)
-Comm time (%) = 23.4869 (32.7296)
-Outpt time (%) = 0.14537 (0.202577)
-Other time (%) = 34.9708 (48.7328)
+Pair time (%) = 5.91161 (30.015)
+Neigh time (%) = 2.56621 (13.0294)
+Comm time (%) = 6.10149 (30.9791)
+Outpt time (%) = 0.00123084 (0.00624931)
+Other time (%) = 5.115 (25.9703)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 288628 max 68417 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 100
Dangerous builds = 0
# change nodes to fixed
fix_modify AtC fix velocity x rbc 0.
fix_modify AtC fix displacement x rbc 0.0002
fix_modify AtC output bar1dFE 500 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
# run to equilibrium
timestep 5
thermo 100
run 10000
Setting up run ...
-Memory usage per processor = 93.2479 Mbytes
+Memory usage per processor = 65.7794 Mbytes
Step Temp E_pair E_mol TotEng Press
1000 1.2796459e-08 -4406.6655 0 -4406.6655 -1155.191
1100 1.3961782e-08 -4406.665 0 -4406.665 -1155.1929
1200 1.4156541e-08 -4406.6646 0 -4406.6646 -1155.1947
1300 1.1743161e-08 -4406.6643 0 -4406.6643 -1155.1961
1400 7.6261191e-09 -4406.6643 0 -4406.6643 -1155.1964
1500 5.4918861e-09 -4406.6644 0 -4406.6644 -1155.1955
1600 3.2067753e-09 -4406.6647 0 -4406.6647 -1155.1942
1700 1.5798693e-09 -4406.6649 0 -4406.6649 -1155.1933
1800 3.4267061e-09 -4406.6649 0 -4406.6649 -1155.1932
1900 5.7984811e-09 -4406.6649 0 -4406.6649 -1155.1934
2000 4.4702416e-09 -4406.6648 0 -4406.6648 -1155.1937
2100 4.110363e-09 -4406.6647 0 -4406.6647 -1155.1943
2200 7.7448231e-09 -4406.6646 0 -4406.6646 -1155.1949
2300 8.9174139e-09 -4406.6645 0 -4406.6645 -1155.1953
2400 4.2475131e-09 -4406.6645 0 -4406.6645 -1155.1951
2500 3.9593952e-09 -4406.6646 0 -4406.6646 -1155.1947
2600 5.0490897e-09 -4406.6646 0 -4406.6646 -1155.1945
2700 3.0091882e-09 -4406.6645 0 -4406.6645 -1155.195
2800 2.8396053e-09 -4406.6644 0 -4406.6644 -1155.1955
2900 3.3590465e-09 -4406.6644 0 -4406.6644 -1155.1957
3000 2.6186659e-09 -4406.6644 0 -4406.6644 -1155.1955
3100 2.8276402e-09 -4406.6645 0 -4406.6645 -1155.1953
3200 3.3651448e-09 -4406.6645 0 -4406.6645 -1155.195
3300 4.8200774e-09 -4406.6647 0 -4406.6647 -1155.1944
3400 2.7178e-09 -4406.6648 0 -4406.6648 -1155.1938
3500 2.8250408e-09 -4406.6648 0 -4406.6648 -1155.1938
3600 4.4426525e-09 -4406.6646 0 -4406.6646 -1155.1946
3700 2.3093452e-09 -4406.6644 0 -4406.6644 -1155.1954
3800 1.0139576e-09 -4406.6644 0 -4406.6644 -1155.1958
3900 3.33486e-09 -4406.6644 0 -4406.6644 -1155.1958
4000 3.6153069e-09 -4406.6644 0 -4406.6644 -1155.1956
4100 4.6993593e-10 -4406.6644 0 -4406.6644 -1155.1954
4200 1.1808552e-09 -4406.6645 0 -4406.6645 -1155.1948
4300 3.1059162e-09 -4406.6647 0 -4406.6647 -1155.1942
4400 2.2356994e-09 -4406.6647 0 -4406.6647 -1155.1942
4500 1.0832e-09 -4406.6646 0 -4406.6646 -1155.1947
4600 3.4691005e-09 -4406.6645 0 -4406.6645 -1155.1954
4700 2.6640925e-09 -4406.6644 0 -4406.6644 -1155.1956
4800 1.8105324e-09 -4406.6644 0 -4406.6644 -1155.1954
4900 3.2865681e-09 -4406.6645 0 -4406.6645 -1155.1951
5000 3.2647654e-09 -4406.6645 0 -4406.6645 -1155.1949
5100 1.9703065e-09 -4406.6646 0 -4406.6646 -1155.1947
5200 1.242015e-09 -4406.6646 0 -4406.6646 -1155.1945
5300 3.0457424e-09 -4406.6646 0 -4406.6646 -1155.1946
5400 1.9560942e-09 -4406.6645 0 -4406.6645 -1155.1951
5500 4.3058633e-10 -4406.6644 0 -4406.6644 -1155.1957
5600 2.3184519e-09 -4406.6644 0 -4406.6644 -1155.1957
5700 3.0207566e-09 -4406.6645 0 -4406.6645 -1155.1953
5800 6.8689369e-10 -4406.6646 0 -4406.6646 -1155.1948
5900 1.5170252e-09 -4406.6646 0 -4406.6646 -1155.1946
6000 3.0629191e-09 -4406.6646 0 -4406.6646 -1155.1946
6100 1.842967e-09 -4406.6646 0 -4406.6646 -1155.1945
6200 6.0033688e-10 -4406.6646 0 -4406.6646 -1155.1946
6300 2.0883931e-09 -4406.6645 0 -4406.6645 -1155.1952
6400 1.8269083e-09 -4406.6644 0 -4406.6644 -1155.1957
6500 5.5810474e-10 -4406.6644 0 -4406.6644 -1155.1957
6600 1.7356452e-09 -4406.6645 0 -4406.6645 -1155.1952
6700 2.6958998e-09 -4406.6646 0 -4406.6646 -1155.1947
6800 8.964107e-10 -4406.6646 0 -4406.6646 -1155.1946
6900 1.1426076e-09 -4406.6646 0 -4406.6646 -1155.1947
7000 2.9188626e-09 -4406.6646 0 -4406.6646 -1155.1947
7100 1.8115562e-09 -4406.6645 0 -4406.6645 -1155.1948
7200 7.4087342e-10 -4406.6645 0 -4406.6645 -1155.1952
7300 1.5779154e-09 -4406.6644 0 -4406.6644 -1155.1956
7400 2.7467977e-09 -4406.6644 0 -4406.6644 -1155.1955
7500 4.2123447e-10 -4406.6645 0 -4406.6645 -1155.195
7600 1.1615418e-09 -4406.6646 0 -4406.6646 -1155.1946
7700 2.5380373e-09 -4406.6646 0 -4406.6646 -1155.1945
7800 1.5068282e-09 -4406.6646 0 -4406.6646 -1155.1948
7900 6.0931799e-10 -4406.6645 0 -4406.6645 -1155.195
8000 2.0802965e-09 -4406.6645 0 -4406.6645 -1155.1951
8100 2.1544428e-09 -4406.6645 0 -4406.6645 -1155.1953
8200 4.4375899e-10 -4406.6644 0 -4406.6644 -1155.1955
8300 1.5879866e-09 -4406.6644 0 -4406.6644 -1155.1954
8400 2.1255967e-09 -4406.6645 0 -4406.6645 -1155.1949
8500 8.5066547e-10 -4406.6646 0 -4406.6646 -1155.1945
8600 4.9764713e-10 -4406.6646 0 -4406.6646 -1155.1945
8700 2.4032931e-09 -4406.6646 0 -4406.6646 -1155.1949
8800 1.5506272e-09 -4406.6645 0 -4406.6645 -1155.1951
8900 2.156996e-10 -4406.6645 0 -4406.6645 -1155.1952
9000 1.5053583e-09 -4406.6645 0 -4406.6645 -1155.1953
9100 2.2313062e-09 -4406.6645 0 -4406.6645 -1155.1954
9200 6.5295769e-10 -4406.6645 0 -4406.6645 -1155.1953
9300 7.1214495e-10 -4406.6646 0 -4406.6646 -1155.1949
9400 2.2525879e-09 -4406.6646 0 -4406.6646 -1155.1945
9500 1.2940878e-09 -4406.6646 0 -4406.6646 -1155.1945
9600 3.7619117e-10 -4406.6645 0 -4406.6645 -1155.195
9700 1.9605412e-09 -4406.6645 0 -4406.6645 -1155.1953
9800 1.7828694e-09 -4406.6645 0 -4406.6645 -1155.1953
9900 5.2324205e-10 -4406.6645 0 -4406.6645 -1155.1952
10000 1.1770899e-09 -4406.6645 0 -4406.6645 -1155.1952
10100 2.0621304e-09 -4406.6645 0 -4406.6645 -1155.1951
10200 9.4046414e-10 -4406.6646 0 -4406.6646 -1155.1948
10300 3.3301061e-10 -4406.6646 0 -4406.6646 -1155.1945
10400 2.2075407e-09 -4406.6646 0 -4406.6646 -1155.1946
10500 1.3556476e-09 -4406.6645 0 -4406.6645 -1155.1951
10600 3.1056944e-10 -4406.6645 0 -4406.6645 -1155.1954
10700 1.2113659e-09 -4406.6645 0 -4406.6645 -1155.1953
10800 2.0914266e-09 -4406.6645 0 -4406.6645 -1155.1951
10900 5.1353017e-10 -4406.6645 0 -4406.6645 -1155.1951
- 11000 5.4707109e-10 -4406.6645 0 -4406.6645 -1155.195
-Loop time of 354.654 on 4 procs for 10000 steps with 2304 atoms
+ 11000 5.470711e-10 -4406.6645 0 -4406.6645 -1155.195
+Loop time of 189.978 on 4 procs for 10000 steps with 2304 atoms
-Pair time (%) = 67.9127 (19.149)
-Neigh time (%) = 31.8455 (8.97932)
-Comm time (%) = 122.402 (34.513)
-Outpt time (%) = 0.360688 (0.101702)
-Other time (%) = 132.133 (37.2569)
+Pair time (%) = 58.7997 (30.9507)
+Neigh time (%) = 25.3649 (13.3514)
+Comm time (%) = 59.8944 (31.5269)
+Outpt time (%) = 0.0364809 (0.0192026)
+Other time (%) = 45.8831 (24.1517)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 178632 ave 289342 max 67274 min
+Neighs: 178632 ave 289022 max 67462 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 1000
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/bar1d_damped.screen b/examples/USER/atc/elastic/bar1d_damped.screen
index bf21b7027..d996c41fa 100644
--- a/examples/USER/atc/elastic/bar1d_damped.screen
+++ b/examples/USER/atc/elastic/bar1d_damped.screen
@@ -1,379 +1,385 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style atomic
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
# create atoms
region simRegion block -12 12 -3 3 -3 3
region atomRegion block -9 9 -3 3 -3 3
region mdRegion block -8 8 -3 3 -3 3
boundary f p p
create_box 2 simRegion
Created orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
4 by 1 by 1 MPI processor grid
create_atoms 1 region mdRegion
Created 2304 atoms
mass * 39.95
# specify interal/ghost atoms
region mdInternal block -6 6 -3 3 -3 3
region leftghost block -8 -6 -3 3 -3 3
region rightghost block 6 8 -3 3 -3 3
group internal region mdInternal
1728 atoms in group internal
group Lghost region leftghost
288 atoms in group Lghost
group Rghost region rightghost
288 atoms in group Rghost
group ghosts union Lghost Rghost
576 atoms in group ghosts
# velocities have Vcm = 0
#velocity internal create 40. 87287 mom yes loop geom
pair_style lj/cut 13.5
#pair_coeff * * .238 3.405 13.5
pair_coeff * * 0.010323166 3.405 13.5
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# define layer
# ID group atc PhysicsType ParameterFile
fix AtC internal atc elastic Ar_damped.mat
ATC: constructing elastic coupling with parameter file Ar_damped.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 3 materials defined from Ar_damped.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 12 1 1 simRegion f p p
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
# initial conditions
fix_modify AtC initial displacement x all 0.0
fix_modify AtC initial displacement y all 0.0
fix_modify AtC initial displacement z all 0.0
fix_modify AtC initial velocity x all 0.0
fix_modify AtC initial velocity y all 0.0
fix_modify AtC initial velocity z all 0.0
variable v equal 0.00000004e3
variable n equal 1000
variable dt equal 0.005
variable u equal $v*$n*${dt}
variable u equal 4.0000000000000003272e-05*$n*${dt}
variable u equal 4.0000000000000003272e-05*1000*${dt}
variable u equal 4.0000000000000003272e-05*1000*0.0050000000000000001041
# set node sets and bcs
# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC fix velocity x rbc $v
fix_modify AtC fix velocity x rbc 4.0000000000000003272e-05
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix velocity x lbc 0.
# specify atom types
fix_modify AtC boundary ghosts
#fix_modify AtC output follow_ex.fe 50
fix_modify AtC internal_quadrature off
fix_modify AtC control localized_lambda on
fix_modify AtC control momentum glc_velocity
#fix_modify AtC filter type exponential
#fix_modify AtC filter scale 1.0
#fix_modify AtC filter on
# run to extension
timestep 0.005
thermo 100
thermo_style custom step cpu ke pe
run 0
Setting up run ...
-Memory usage per processor = 93.2479 Mbytes
+Memory usage per processor = 65.7794 Mbytes
Step CPU KinEng PotEng
0 0 0 -191.1377
-Loop time of 6.3777e-06 on 4 procs for 0 steps with 2304 atoms
+Loop time of 1.12057e-05 on 4 procs for 0 steps with 2304 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
Comm time (%) = 0 (0)
Outpt time (%) = 0 (0)
-Other time (%) = 6.3777e-06 (100)
+Other time (%) = 1.12057e-05 (100)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 288576 max 68400 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 0
Dangerous builds = 0
variable pe0 equal pe
variable pe equal pe-${pe0}
variable pe equal pe--191.13770127444766445
thermo_style custom step cpu ke pe v_pe f_AtC[1] f_AtC[2] f_AtC[4] f_AtC[5]
run $n
run 1000
Setting up run ...
-Memory usage per processor = 93.2479 Mbytes
+Memory usage per processor = 65.7794 Mbytes
Step CPU KinEng PotEng pe AtC[1] AtC[2] AtC[4] AtC[5]
0 0 0 -191.1377 0 0 0 0 0
- 100 8.0390151 1.055851e-16 -191.1377 5.3847288e-08 5.5210093e-10 4.8838395e-10 5.5210086e-10 4.8838395e-10
- 200 11.493128 2.7309802e-13 -191.1377 1.505559e-06 1.1639949e-09 1.2827565e-09 1.1637935e-09 1.2827433e-09
- 300 19.35353 1.7311896e-11 -191.13769 8.8450898e-06 2.0715862e-09 2.022604e-09 2.0579272e-09 2.020558e-09
- 400 28.928974 2.1239086e-10 -191.13768 2.6114181e-05 2.9481123e-09 2.7362141e-09 2.7703215e-09 2.6871501e-09
- 500 33.919009 9.6058596e-10 -191.13765 5.1722206e-05 4.1041211e-09 3.33188e-09 3.253095e-09 2.9376729e-09
- 600 43.879017 2.2037311e-09 -191.13762 8.020941e-05 5.6140713e-09 4.0767895e-09 3.5687157e-09 2.5638486e-09
- 700 53.458615 3.2720323e-09 -191.13759 0.00010864588 6.9461579e-09 5.4103466e-09 3.8327109e-09 1.9736115e-09
- 800 59.149139 3.9667277e-09 -191.13756 0.0001382309 7.930912e-09 7.0706824e-09 4.1286537e-09 1.5663212e-09
- 900 65.676015 4.6276406e-09 -191.13753 0.00016977721 8.7852e-09 8.6120146e-09 4.3243149e-09 1.3090105e-09
- 1000 76.426912 5.4647857e-09 -191.1375 0.00020107009 9.4089083e-09 1.0142471e-08 4.111432e-09 1.1470431e-09
-Loop time of 76.4282 on 4 procs for 1000 steps with 2304 atoms
-
-Pair time (%) = 8.25247 (10.7977)
-Neigh time (%) = 4.72959 (6.18828)
-Comm time (%) = 23.9356 (31.3178)
-Outpt time (%) = 0.304101 (0.397891)
-Other time (%) = 39.2064 (51.2984)
+ 100 2.0183451 1.055851e-16 -191.1377 5.3847288e-08 5.5210093e-10 4.8838395e-10 5.5210086e-10 4.8838395e-10
+ 200 4.2201841 2.7309802e-13 -191.1377 1.505559e-06 1.1639949e-09 1.2827565e-09 1.1637935e-09 1.2827433e-09
+ 300 6.3240101 1.7311896e-11 -191.13769 8.8450898e-06 2.0715862e-09 2.022604e-09 2.0579272e-09 2.020558e-09
+ 400 8.4582031 2.1239086e-10 -191.13768 2.6114181e-05 2.9481123e-09 2.7362141e-09 2.7703215e-09 2.6871501e-09
+ 500 10.312282 9.6058596e-10 -191.13765 5.1722206e-05 4.1041211e-09 3.33188e-09 3.253095e-09 2.9376729e-09
+ 600 12.162319 2.2037311e-09 -191.13762 8.020941e-05 5.6140713e-09 4.0767895e-09 3.5687157e-09 2.5638486e-09
+ 700 15.486717 3.2720323e-09 -191.13759 0.00010864588 6.9461579e-09 5.4103466e-09 3.8327109e-09 1.9736115e-09
+ 800 17.873482 3.9667277e-09 -191.13756 0.0001382309 7.930912e-09 7.0706824e-09 4.1286537e-09 1.5663212e-09
+ 900 19.719214 4.6276406e-09 -191.13753 0.00016977721 8.7852e-09 8.6120146e-09 4.3243149e-09 1.3090105e-09
+ 1000 21.562076 5.4647857e-09 -191.1375 0.00020107009 9.4089083e-09 1.0142471e-08 4.111432e-09 1.1470431e-09
+Loop time of 21.5633 on 4 procs for 1000 steps with 2304 atoms
+
+Pair time (%) = 5.93099 (27.5049)
+Neigh time (%) = 2.56718 (11.9053)
+Comm time (%) = 6.91764 (32.0805)
+Outpt time (%) = 0.0132194 (0.0613047)
+Other time (%) = 6.13433 (28.4479)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 289722 max 67420 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 100
Dangerous builds = 0
fix_modify AtC output bar1d_dampedFE 500 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
dump CONFIG all custom 500 bar1d_damped.dmp id type x y z vx vy vz
# change nodes to fixed
fix_modify AtC fix velocity x rbc 0.
fix_modify AtC fix displacement x rbc $u
fix_modify AtC fix displacement x rbc 0.00020000000000000000958
# run to equilibrium
thermo 100
log bar1d_damped.log
run 2000
Setting up run ...
-Memory usage per processor = 93.4533 Mbytes
+Memory usage per processor = 65.9847 Mbytes
Step CPU KinEng PotEng pe AtC[1] AtC[2] AtC[4] AtC[5]
1000 0 5.4647857e-09 -191.1375 0.00020107009 9.4089083e-09 0 4.111432e-09 -8.9954275e-09
- 1100 3.4263639 6.3421646e-09 -191.13747 0.00022971709 8.75085e-09 1.4153048e-09 2.5767395e-09 -9.3569477e-09
- 1200 10.368947 6.9778939e-09 -191.13745 0.00025458471 8.1727552e-09 3.1204783e-09 1.3697518e-09 -9.4201182e-09
- 1300 14.878477 7.1529752e-09 -191.13743 0.00027170434 7.5897544e-09 4.5095316e-09 6.3357843e-10 -9.4773618e-09
- 1400 24.373178 6.6395813e-09 -191.13743 0.00027466413 6.747478e-09 5.4996207e-09 2.8850325e-10 -9.1651904e-09
- 1500 26.945583 5.6922363e-09 -191.13744 0.00026126097 6.2562137e-09 5.3958429e-09 7.4259589e-10 -8.7642657e-09
- 1600 29.179645 4.7135957e-09 -191.13747 0.00023620822 5.9708984e-09 4.7989197e-09 1.5108282e-09 -8.165151e-09
- 1700 32.158633 3.4710553e-09 -191.1375 0.00020618074 5.3956633e-09 4.5850559e-09 2.1370382e-09 -7.4317528e-09
- 1800 34.59477 2.4145542e-09 -191.13753 0.0001751612 4.4014655e-09 4.6172904e-09 2.1438377e-09 -6.2667582e-09
- 1900 36.481867 2.1438948e-09 -191.13756 0.00014569893 3.408323e-09 4.1360716e-09 1.4726957e-09 -4.5311799e-09
- 2000 38.402959 2.1864605e-09 -191.13758 0.00012155208 2.5555543e-09 3.2626157e-09 6.5555529e-10 -2.5834443e-09
- 2100 40.302963 1.9032904e-09 -191.13759 0.00010654531 2.0211043e-09 2.3634891e-09 3.1602374e-10 -1.1813128e-09
- 2200 42.169921 1.9875147e-09 -191.1376 0.00010189892 2.0066398e-09 1.5638553e-09 1.4805596e-10 -4.8955277e-10
- 2300 44.033215 3.2414453e-09 -191.13759 0.00010629042 3.4949611e-09 6.0884607e-11 3.7071553e-10 -1.2166095e-09
- 2400 45.904622 5.4666452e-09 -191.13758 0.00011815334 6.4739473e-09 -2.0744242e-09 1.1628627e-09 -3.4626277e-09
- 2500 47.797741 7.1143087e-09 -191.13756 0.00013705246 9.1384443e-09 -3.3784529e-09 2.1796903e-09 -5.9902478e-09
- 2600 51.178232 7.1885602e-09 -191.13754 0.00016288238 1.0502632e-08 -3.4468822e-09 3.4466305e-09 -8.0921646e-09
- 2700 53.509233 6.4420688e-09 -191.13751 0.00019390227 1.0708869e-08 -2.5391386e-09 4.4412335e-09 -9.5081141e-09
- 2800 55.372385 5.6029945e-09 -191.13748 0.00022551631 9.3553209e-09 7.5058192e-11 3.8587617e-09 -9.3943471e-09
- 2900 57.239711 5.099105e-09 -191.13745 0.00025162655 6.936034e-09 3.8584367e-09 1.8989273e-09 -7.959387e-09
- 3000 59.118431 4.5349913e-09 -191.13743 0.00026783371 5.1180916e-09 6.6034959e-09 6.6351749e-10 -7.0089177e-09
-Loop time of 59.1197 on 4 procs for 2000 steps with 2304 atoms
-
-Pair time (%) = 13.3157 (22.5233)
-Neigh time (%) = 5.97997 (10.115)
-Comm time (%) = 17.5956 (29.7626)
-Outpt time (%) = 0.0869119 (0.14701)
-Other time (%) = 22.1415 (37.452)
+ 1100 1.861932 6.3421646e-09 -191.13747 0.00022971709 8.75085e-09 1.4153048e-09 2.5767395e-09 -9.3569477e-09
+ 1200 3.7063861 6.9778939e-09 -191.13745 0.00025458471 8.1727552e-09 3.1204783e-09 1.3697518e-09 -9.4201182e-09
+ 1300 5.5506911 7.1529752e-09 -191.13743 0.00027170434 7.5897544e-09 4.5095316e-09 6.3357843e-10 -9.4773618e-09
+ 1400 7.3948052 6.6395813e-09 -191.13743 0.00027466413 6.747478e-09 5.4996207e-09 2.8850325e-10 -9.1651904e-09
+ 1500 9.250102 5.6922363e-09 -191.13744 0.00026126097 6.2562137e-09 5.3958429e-09 7.4259589e-10 -8.7642657e-09
+ 1600 12.320326 4.7135957e-09 -191.13747 0.00023620822 5.9708984e-09 4.7989197e-09 1.5108282e-09 -8.165151e-09
+ 1700 14.562304 3.4710553e-09 -191.1375 0.00020618074 5.3956633e-09 4.5850559e-09 2.1370382e-09 -7.4317528e-09
+ 1800 16.4184 2.4145542e-09 -191.13753 0.0001751612 4.4014655e-09 4.6172904e-09 2.1438377e-09 -6.2667582e-09
+ 1900 18.266514 2.1438948e-09 -191.13756 0.00014569893 3.408323e-09 4.1360716e-09 1.4726957e-09 -4.5311799e-09
+ 2000 20.121058 2.1864605e-09 -191.13758 0.00012155208 2.5555543e-09 3.2626157e-09 6.5555529e-10 -2.5834443e-09
+ 2100 21.963803 1.9032904e-09 -191.13759 0.00010654531 2.0211043e-09 2.3634891e-09 3.1602374e-10 -1.1813128e-09
+ 2200 23.806295 1.9875147e-09 -191.1376 0.00010189892 2.0066398e-09 1.5638553e-09 1.4805596e-10 -4.8955277e-10
+ 2300 25.648038 3.2414453e-09 -191.13759 0.00010629042 3.4949611e-09 6.0884607e-11 3.7071553e-10 -1.2166095e-09
+ 2400 27.491978 5.4666452e-09 -191.13758 0.00011815334 6.4739473e-09 -2.0744242e-09 1.1628627e-09 -3.4626277e-09
+ 2500 29.352091 7.1143087e-09 -191.13756 0.00013705246 9.1384443e-09 -3.3784529e-09 2.1796903e-09 -5.9902478e-09
+ 2600 32.196006 7.1885602e-09 -191.13754 0.00016288238 1.0502632e-08 -3.4468822e-09 3.4466305e-09 -8.0921646e-09
+ 2700 34.33366 6.4420688e-09 -191.13751 0.00019390227 1.0708869e-08 -2.5391386e-09 4.4412335e-09 -9.5081141e-09
+ 2800 36.155468 5.6029945e-09 -191.13748 0.00022551631 9.3553209e-09 7.5058192e-11 3.8587617e-09 -9.3943471e-09
+ 2900 37.977572 5.099105e-09 -191.13745 0.00025162655 6.936034e-09 3.8584367e-09 1.8989273e-09 -7.959387e-09
+ 3000 39.81138 4.5349913e-09 -191.13743 0.00026783371 5.1180916e-09 6.6034959e-09 6.6351749e-10 -7.0089177e-09
+Loop time of 39.8127 on 4 procs for 2000 steps with 2304 atoms
+
+Pair time (%) = 11.79 (29.6136)
+Neigh time (%) = 5.08139 (12.7633)
+Comm time (%) = 11.8914 (29.8683)
+Outpt time (%) = 0.0706764 (0.177523)
+Other time (%) = 10.9792 (27.5773)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 288868 max 65686 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 200
Dangerous builds = 0
fix_modify AtC material all cubic # M damping
run 2000
Setting up run ...
-Memory usage per processor = 93.4533 Mbytes
+Memory usage per processor = 65.9847 Mbytes
Step CPU KinEng PotEng pe AtC[1] AtC[2] AtC[4] AtC[5]
3000 0 4.5349913e-09 -191.13743 0.00026783371 5.1180916e-09 0 6.6351749e-10 -1.3612414e-08
- 3100 1.884902 3.1627635e-09 -191.13743 0.00027166541 3.3508276e-09 1.5163376e-09 2.9822385e-10 -1.3169543e-08
- 3200 3.7543039 2.1305486e-09 -191.13744 0.00026502967 2.292755e-09 1.9348144e-09 2.9322733e-10 -1.2923953e-08
- 3300 6.005461 1.7622321e-09 -191.13745 0.00025028487 2.1709597e-09 1.2092749e-09 5.6848039e-10 -1.3098658e-08
- 3400 16.302727 1.4627886e-09 -191.13747 0.00022947204 2.0542491e-09 2.4241837e-10 7.6881831e-10 -1.3269991e-08
- 3500 18.647849 1.1457596e-09 -191.13749 0.0002071953 1.7022137e-09 -6.8412058e-10 6.5328081e-10 -1.3186597e-08
- 3600 20.526815 1.5322847e-09 -191.13751 0.00018851151 1.9578951e-09 -2.5376549e-09 5.0945853e-10 -1.3161338e-08
- 3700 22.404343 2.7199727e-09 -191.13753 0.00017501297 2.8551124e-09 -5.3147303e-09 3.5995471e-10 -1.317891e-08
- 3800 24.280314 3.8255198e-09 -191.13754 0.00016517255 3.776711e-09 -7.8091811e-09 1.9270828e-10 -1.3125415e-08
- 3900 26.155669 4.7080092e-09 -191.13754 0.00015798858 4.6102461e-09 -9.4550009e-09 1.2287245e-10 -1.3138835e-08
- 4000 28.039841 5.3603485e-09 -191.13755 0.00015424854 5.3157594e-09 -1.0203778e-08 1.5542087e-10 -1.3330611e-08
- 4100 29.917995 5.3407666e-09 -191.13755 0.00015459539 5.6318354e-09 -1.0223896e-08 3.9327183e-10 -1.3777619e-08
- 4200 31.791416 4.5200859e-09 -191.13754 0.000158412 5.2283097e-09 -9.7612848e-09 7.3695415e-10 -1.4260955e-08
- 4300 33.665959 3.248288e-09 -191.13754 0.00016494668 4.2434602e-09 -9.1569844e-09 1.0215962e-09 -1.4755402e-08
- 4400 35.538211 1.9718426e-09 -191.13753 0.00017370613 3.0004575e-09 -8.5412539e-09 1.0485714e-09 -1.5191473e-08
- 4500 37.426718 1.0175326e-09 -191.13752 0.00018301345 1.8277045e-09 -8.0355833e-09 8.1451769e-10 -1.5385018e-08
- 4600 39.941118 4.528091e-10 -191.13751 0.00019011125 8.8800708e-10 -7.698949e-09 4.3848726e-10 -1.5198592e-08
- 4700 41.926014 1.813047e-10 -191.13751 0.00019345531 3.2820899e-10 -7.6270177e-09 1.6240525e-10 -1.4863017e-08
- 4800 43.768896 1.0257178e-10 -191.13751 0.00019385828 1.3812287e-10 -7.7900766e-09 5.3812979e-11 -1.4605952e-08
- 4900 46.766592 1.9853801e-10 -191.13751 0.00019285378 1.955715e-10 -8.0515951e-09 1.5537909e-11 -1.4450335e-08
- 5000 51.661613 4.4499498e-10 -191.13751 0.00019101535 4.6651548e-10 -8.4263349e-09 3.2542828e-11 -1.4479894e-08
-Loop time of 51.6629 on 4 procs for 2000 steps with 2304 atoms
-
-Pair time (%) = 12.642 (24.4702)
-Neigh time (%) = 5.57654 (10.7941)
-Comm time (%) = 15.4191 (29.8455)
-Outpt time (%) = 0.130104 (0.251833)
-Other time (%) = 17.8952 (34.6384)
+ 3100 1.8402469 3.1627635e-09 -191.13743 0.00027166541 3.3508276e-09 1.5163376e-09 2.9822385e-10 -1.3169543e-08
+ 3200 3.665036 2.1305486e-09 -191.13744 0.00026502967 2.292755e-09 1.9348144e-09 2.9322733e-10 -1.2923953e-08
+ 3300 5.4898939 1.7622321e-09 -191.13745 0.00025028487 2.1709597e-09 1.2092749e-09 5.6848039e-10 -1.3098658e-08
+ 3400 7.3130159 1.4627886e-09 -191.13747 0.00022947204 2.0542491e-09 2.4241837e-10 7.6881831e-10 -1.3269991e-08
+ 3500 9.149426 1.1457596e-09 -191.13749 0.0002071953 1.7022137e-09 -6.8412058e-10 6.5328081e-10 -1.3186597e-08
+ 3600 10.971965 1.5322847e-09 -191.13751 0.00018851151 1.9578951e-09 -2.5376549e-09 5.0945853e-10 -1.3161338e-08
+ 3700 12.792719 2.7199727e-09 -191.13753 0.00017501297 2.8551124e-09 -5.3147303e-09 3.5995471e-10 -1.317891e-08
+ 3800 14.613722 3.8255198e-09 -191.13754 0.00016517255 3.776711e-09 -7.8091811e-09 1.9270828e-10 -1.3125415e-08
+ 3900 16.431634 4.7080092e-09 -191.13754 0.00015798858 4.6102461e-09 -9.4550009e-09 1.2287245e-10 -1.3138835e-08
+ 4000 19.101314 5.3603485e-09 -191.13755 0.00015424854 5.3157594e-09 -1.0203778e-08 1.5542087e-10 -1.3330611e-08
+ 4100 21.0605 5.3407666e-09 -191.13755 0.00015459539 5.6318354e-09 -1.0223896e-08 3.9327183e-10 -1.3777619e-08
+ 4200 22.871048 4.5200859e-09 -191.13754 0.000158412 5.2283097e-09 -9.7612848e-09 7.3695415e-10 -1.4260955e-08
+ 4300 24.6822 3.248288e-09 -191.13754 0.00016494668 4.2434602e-09 -9.1569844e-09 1.0215962e-09 -1.4755402e-08
+ 4400 26.49271 1.9718426e-09 -191.13753 0.00017370613 3.0004575e-09 -8.5412539e-09 1.0485714e-09 -1.5191473e-08
+ 4500 28.31319 1.0175326e-09 -191.13752 0.00018301345 1.8277045e-09 -8.0355833e-09 8.1451769e-10 -1.5385018e-08
+ 4600 30.127812 4.528091e-10 -191.13751 0.00019011125 8.8800708e-10 -7.698949e-09 4.3848726e-10 -1.5198592e-08
+ 4700 31.951896 1.813047e-10 -191.13751 0.00019345531 3.2820899e-10 -7.6270177e-09 1.6240525e-10 -1.4863017e-08
+ 4800 33.776651 1.0257178e-10 -191.13751 0.00019385828 1.3812287e-10 -7.7900766e-09 5.3812979e-11 -1.4605952e-08
+ 4900 35.770471 1.9853801e-10 -191.13751 0.00019285378 1.955715e-10 -8.0515951e-09 1.5537909e-11 -1.4450335e-08
+ 5000 37.839591 4.4499498e-10 -191.13751 0.00019101535 4.6651548e-10 -8.4263349e-09 3.2542828e-11 -1.4479894e-08
+Loop time of 37.8409 on 4 procs for 2000 steps with 2304 atoms
+
+Pair time (%) = 11.5431 (30.5044)
+Neigh time (%) = 4.98994 (13.1866)
+Comm time (%) = 11.3067 (29.8797)
+Outpt time (%) = 0.0703517 (0.185915)
+Other time (%) = 9.93075 (26.2434)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 288868 max 65664 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 200
Dangerous builds = 0
fix_modify AtC material all damped # K damping
run 2000
Setting up run ...
-Memory usage per processor = 93.4533 Mbytes
+Memory usage per processor = 65.9847 Mbytes
Step CPU KinEng PotEng pe AtC[1] AtC[2] AtC[4] AtC[5]
5000 0 4.4499498e-10 -191.13751 0.00019101535 4.6651548e-10 0 3.2542828e-11 -6.0535591e-09
- 5100 4.6635571 7.7530221e-10 -191.13751 0.00018808779 8.8219827e-10 -5.1894954e-10 1.1477898e-10 -6.2656816e-09
- 5200 7.9799862 1.0914185e-09 -191.13752 0.00018469909 1.3356438e-09 -1.1167463e-09 2.5090286e-10 -6.5437879e-09
- 5300 9.832078 1.3329143e-09 -191.13752 0.00018160964 1.7365431e-09 -1.6964741e-09 4.0718828e-10 -6.8217529e-09
- 5400 16.735786 1.504171e-09 -191.13752 0.00017917616 1.9911092e-09 -2.1593835e-09 4.9328931e-10 -7.0385998e-09
- 5500 21.043345 1.594802e-09 -191.13752 0.00017766571 2.0494572e-09 -2.4260642e-09 4.6275872e-10 -7.138857e-09
- 5600 23.746816 1.5743105e-09 -191.13752 0.00017717238 1.929034e-09 -2.4892277e-09 3.6487504e-10 -7.1146385e-09
- 5700 25.625748 1.4221294e-09 -191.13752 0.00017729486 1.6665332e-09 -2.3656166e-09 2.5500829e-10 -6.9804167e-09
- 5800 30.389402 1.1720493e-09 -191.13752 0.00017753363 1.3116581e-09 -2.0608866e-09 1.5433624e-10 -6.7800184e-09
- 5900 32.585614 8.6077652e-10 -191.13752 0.00017794528 9.2235699e-10 -1.6102419e-09 7.7989231e-11 -6.5963868e-09
- 6000 35.173423 5.2708656e-10 -191.13752 0.0001789751 5.4942864e-10 -1.0882941e-09 3.5646667e-11 -6.4862104e-09
- 6100 40.119008 2.325476e-10 -191.13752 0.0001807569 2.4150687e-10 -5.8295363e-10 1.6542883e-11 -6.4439488e-09
- 6200 41.993394 4.6103001e-11 -191.13752 0.00018302227 5.3284568e-11 -2.125555e-10 9.264294e-12 -6.4611762e-09
- 6300 45.873721 1.6246443e-11 -191.13752 0.00018541173 2.4386805e-11 -8.566705e-11 9.9387033e-12 -6.5339312e-09
- 6400 49.424723 1.4744476e-10 -191.13751 0.00018750725 1.5460292e-10 -2.1854704e-10 1.2454671e-11 -6.6323029e-09
- 6500 52.764808 4.0670554e-10 -191.13751 0.00018887546 4.1540944e-10 -5.5265965e-10 2.0454523e-11 -6.7446848e-09
- 6600 57.161516 7.1997609e-10 -191.13751 0.00018914788 7.4785363e-10 -9.9312474e-10 4.429436e-11 -6.8751447e-09
- 6700 60.044641 1.011863e-09 -191.13751 0.00018817658 1.080257e-09 -1.4281411e-09 8.7264316e-11 -7.0103089e-09
- 6800 63.731949 1.2214055e-09 -191.13751 0.00018635915 1.3481402e-09 -1.7820613e-09 1.4383303e-10 -7.1419056e-09
- 6900 65.622758 1.3150127e-09 -191.13752 0.00018434046 1.5093341e-09 -2.0332173e-09 2.0695782e-10 -7.2501404e-09
- 7000 67.990237 1.2853182e-09 -191.13752 0.0001825143 1.5377643e-09 -2.1694031e-09 2.6084212e-10 -7.2971336e-09
-Loop time of 67.9915 on 4 procs for 2000 steps with 2304 atoms
-
-Pair time (%) = 13.7916 (20.2843)
-Neigh time (%) = 6.20275 (9.12283)
-Comm time (%) = 22.365 (32.8938)
-Outpt time (%) = 0.24604 (0.361868)
-Other time (%) = 25.3861 (37.3372)
+ 5100 2.015487 7.7530221e-10 -191.13751 0.00018808779 8.8219827e-10 -5.1894954e-10 1.1477898e-10 -6.2656816e-09
+ 5200 3.8598218 1.0914185e-09 -191.13752 0.00018469909 1.3356438e-09 -1.1167463e-09 2.5090286e-10 -6.5437879e-09
+ 5300 5.707531 1.3329143e-09 -191.13752 0.00018160964 1.7365431e-09 -1.6964741e-09 4.0718828e-10 -6.8217529e-09
+ 5400 7.5542469 1.504171e-09 -191.13752 0.00017917616 1.9911092e-09 -2.1593835e-09 4.9328931e-10 -7.0385998e-09
+ 5500 9.395402 1.594802e-09 -191.13752 0.00017766571 2.0494572e-09 -2.4260642e-09 4.6275872e-10 -7.138857e-09
+ 5600 11.223754 1.5743105e-09 -191.13752 0.00017717238 1.929034e-09 -2.4892277e-09 3.6487504e-10 -7.1146385e-09
+ 5700 13.052911 1.4221294e-09 -191.13752 0.00017729486 1.6665332e-09 -2.3656166e-09 2.5500829e-10 -6.9804167e-09
+ 5800 14.880237 1.1720493e-09 -191.13752 0.00017753363 1.3116581e-09 -2.0608866e-09 1.5433624e-10 -6.7800184e-09
+ 5900 17.325101 8.6077652e-10 -191.13752 0.00017794528 9.2235699e-10 -1.6102419e-09 7.7989231e-11 -6.5963868e-09
+ 6000 19.223743 5.2708656e-10 -191.13752 0.0001789751 5.4942864e-10 -1.0882941e-09 3.5646667e-11 -6.4862104e-09
+ 6100 21.068144 2.325476e-10 -191.13752 0.0001807569 2.4150687e-10 -5.8295363e-10 1.6542883e-11 -6.4439488e-09
+ 6200 22.941933 4.6103001e-11 -191.13752 0.00018302227 5.3284568e-11 -2.125555e-10 9.264294e-12 -6.4611762e-09
+ 6300 24.81627 1.6246443e-11 -191.13752 0.00018541173 2.4386805e-11 -8.566705e-11 9.9387033e-12 -6.5339312e-09
+ 6400 26.683148 1.4744476e-10 -191.13751 0.00018750725 1.5460292e-10 -2.1854704e-10 1.2454671e-11 -6.6323029e-09
+ 6500 28.509939 4.0670554e-10 -191.13751 0.00018887546 4.1540944e-10 -5.5265965e-10 2.0454523e-11 -6.7446848e-09
+ 6600 30.326663 7.1997609e-10 -191.13751 0.00018914788 7.4785363e-10 -9.9312474e-10 4.429436e-11 -6.8751447e-09
+ 6700 32.143061 1.011863e-09 -191.13751 0.00018817658 1.080257e-09 -1.4281411e-09 8.7264316e-11 -7.0103089e-09
+ 6800 33.959997 1.2214055e-09 -191.13751 0.00018635915 1.3481402e-09 -1.7820613e-09 1.4383303e-10 -7.1419056e-09
+ 6900 35.781549 1.3150127e-09 -191.13752 0.00018434046 1.5093341e-09 -2.0332173e-09 2.0695782e-10 -7.2501404e-09
+ 7000 37.614166 1.2853182e-09 -191.13752 0.0001825143 1.5377643e-09 -2.1694031e-09 2.6084212e-10 -7.2971336e-09
+Loop time of 37.6155 on 4 procs for 2000 steps with 2304 atoms
+
+Pair time (%) = 11.5713 (30.7621)
+Neigh time (%) = 4.99228 (13.2719)
+Comm time (%) = 11.2439 (29.8916)
+Outpt time (%) = 0.0705782 (0.187631)
+Other time (%) = 9.73741 (25.8867)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 288864 max 65670 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 200
Dangerous builds = 0
# ATC: CB stiffness: 7.56717 Einstein freq: 0.355649 from Ar_CauchyBorn.mat
# real to metal 1 kcal/mol = 0.04336 eV
variable kCal2eV equal 0.04336
-variable k equal 1.e-3 # 7.56717*${kCal2eV} NOTE <<<
-variable g equal 0.75*0.355649e3*${kCal2eV}
-variable g equal 0.75*0.355649e3*0.043360000000000002707
-variable m equal 0.5*39.95
+variable fconv equal 1./0.000103643 # NOTE old routine was doing calculations in lammps units, not atc units, so this conversion is necessary for bmark to pass
+#variable k equal 1.e-3 # 7.56717*${kCal2eV} NOTE <<<
+#variable k equal 0.75*0.355649e3*${kCal2eV}
+variable k equal 0.5*39.95*${fconv} # NOTE it was set to above, should have been 2 above, but there was a bug so this value is here for bmark
+variable k equal 0.5*39.95*9648.5049641558034637
+#variable g equal 0.75*0.355649e3*${kCal2eV}
+variable g equal 1.e-3*${fconv} # NOTE it should be above, but there was a bug so this value is here for bmark
+variable g equal 1.e-3*9648.5049641558034637
+variable m equal 2. #0.5*39.95
fix_modify AtC boundary_dynamics damped_harmonic $k $g $m
-fix_modify AtC boundary_dynamics damped_harmonic 0.0010000000000000000208 $g $m
-fix_modify AtC boundary_dynamics damped_harmonic 0.0010000000000000000208 11.56570548000000187 $m
-fix_modify AtC boundary_dynamics damped_harmonic 0.0010000000000000000208 11.56570548000000187 19.975000000000001421
+fix_modify AtC boundary_dynamics damped_harmonic 192728.8866590121761 $g $m
+fix_modify AtC boundary_dynamics damped_harmonic 192728.8866590121761 9.6485049641558031652 $m
+fix_modify AtC boundary_dynamics damped_harmonic 192728.8866590121761 9.6485049641558031652 2
run 2000
Setting up run ...
-Memory usage per processor = 93.4533 Mbytes
+Memory usage per processor = 67.816 Mbytes
Step CPU KinEng PotEng pe AtC[1] AtC[2] AtC[4] AtC[5]
7000 0 1.2853182e-09 -191.13752 0.0001825143 1.5377643e-09 0 2.6084212e-10 -5.1277305e-09
- 7100 3.8653619 2.8903751e-05 -191.1374 0.00029857456 1.4261761e-09 -1.214748e-11 2.7859112e-10 -5.084773e-09
- 7200 5.7172129 3.8761799e-06 -191.13735 0.00035025356 1.1959825e-09 8.5346682e-11 2.5313036e-10 -4.9584954e-09
- 7300 7.596113 1.8769484e-06 -191.13737 0.0003337536 8.9086284e-10 2.6798239e-10 2.0084283e-10 -4.7692463e-09
- 7400 12.42461 1.245935e-05 -191.13743 0.00026909159 5.6202829e-10 5.0489219e-10 1.2878586e-10 -4.5511096e-09
- 7500 15.114735 1.6301032e-05 -191.13751 0.00018830281 2.7560343e-10 7.5207256e-10 5.694786e-11 -4.362424e-09
- 7600 19.876048 9.4676227e-06 -191.13758 0.00012208357 8.4877207e-11 9.6782588e-10 1.2617604e-11 -4.2488453e-09
- 7700 21.707406 1.6567809e-06 -191.13761 8.9858261e-05 1.0099305e-11 1.1176649e-09 1.4916291e-12 -4.2369828e-09
- 7800 24.205287 3.0391321e-07 -191.13761 9.5611994e-05 5.1427805e-11 1.1674588e-09 1.7611917e-11 -4.3302492e-09
- 7900 27.866901 3.2726602e-06 -191.13757 0.0001295863 1.905123e-10 1.1057791e-09 4.8229373e-11 -4.4960207e-09
- 8000 29.84634 4.7851826e-06 -191.13753 0.00017453181 3.9524144e-10 9.4866146e-10 7.738243e-11 -4.6918777e-09
- 8100 32.731688 3.0560115e-06 -191.13749 0.00021322134 6.2989738e-10 7.2412128e-10 9.7353433e-11 -4.8834384e-09
- 8200 36.727295 6.6407027e-07 -191.13747 0.00023416094 8.5464088e-10 4.6942869e-10 1.1187578e-10 -5.0480909e-09
- 8300 38.564577 3.8165674e-08 -191.13747 0.00023410509 1.0268939e-09 2.3847444e-10 1.2118336e-10 -5.1639054e-09
- 8400 41.031069 8.4495007e-07 -191.13748 0.00021748415 1.1122546e-09 8.8553406e-11 1.2219945e-10 -5.2187642e-09
- 8500 44.303455 1.3915225e-06 -191.13751 0.0001932998 1.0989984e-09 5.0075534e-11 1.2293817e-10 -5.2142527e-09
- 8600 46.136877 9.7448077e-07 -191.13753 0.00017115059 9.8587454e-10 1.1774103e-10 1.2176493e-10 -5.1569143e-09
- 8700 49.565115 2.5400881e-07 -191.13754 0.00015791542 7.9484554e-10 2.5817073e-10 1.1156472e-10 -5.0569238e-09
- 8800 52.407452 2.6471441e-09 -191.13755 0.00015589474 5.6635938e-10 4.2847179e-10 9.4176403e-11 -4.9223096e-09
- 8900 54.820348 2.1367306e-07 -191.13754 0.00016308046 3.4009704e-10 5.9208385e-10 7.0443086e-11 -4.7692236e-09
- 9000 59.598561 4.0089918e-07 -191.13753 0.00017492322 1.5426704e-10 7.172267e-10 4.311796e-11 -4.6253241e-09
-Loop time of 59.5999 on 4 procs for 2000 steps with 2304 atoms
-
-Pair time (%) = 13.6404 (22.8866)
-Neigh time (%) = 5.86772 (9.84519)
-Comm time (%) = 19.3873 (32.5292)
-Outpt time (%) = 0.201972 (0.338879)
-Other time (%) = 20.5024 (34.4001)
+ 7100 2.2708781 2.8900693e-05 -191.1374 0.00029858743 1.4261761e-09 -1.2147479e-11 2.7859112e-10 -5.084773e-09
+ 7200 4.1846969 3.8729132e-06 -191.13735 0.00035026315 1.1959825e-09 8.5346681e-11 2.5313035e-10 -4.9584953e-09
+ 7300 6.0001931 1.8800545e-06 -191.13737 0.00033374421 8.9086282e-10 2.6798238e-10 2.0084282e-10 -4.7692463e-09
+ 7400 7.814976 1.2465603e-05 -191.13743 0.00026905846 5.6202827e-10 5.0489219e-10 1.2878585e-10 -4.5511096e-09
+ 7500 9.642642 1.6302004e-05 -191.13751 0.00018825521 2.7560343e-10 7.5207256e-10 5.6947859e-11 -4.362424e-09
+ 7600 11.458371 9.462492e-06 -191.13758 0.00012203988 8.4877212e-11 9.6782588e-10 1.2617608e-11 -4.2488454e-09
+ 7700 13.27432 1.652815e-06 -191.13761 8.983678e-05 1.0099314e-11 1.1176649e-09 1.4916363e-12 -4.2369828e-09
+ 7800 15.101984 3.0576696e-07 -191.13761 9.5622171e-05 5.1427813e-11 1.1674588e-09 1.7611923e-11 -4.3302492e-09
+ 7900 16.923975 3.2769295e-06 -191.13757 0.00012962457 1.905123e-10 1.1057791e-09 4.8229373e-11 -4.4960207e-09
+ 8000 19.485289 4.7862796e-06 -191.13753 0.00017458341 3.9524144e-10 9.4866146e-10 7.7382429e-11 -4.6918777e-09
+ 8100 21.332776 3.053451e-06 -191.13749 0.0002132668 6.2989738e-10 7.2412128e-10 9.7353436e-11 -4.8834384e-09
+ 8200 23.306073 6.6180189e-07 -191.13747 0.00023418416 8.5464089e-10 4.6942869e-10 1.1187579e-10 -5.0480909e-09
+ 8300 25.131902 3.8749151e-08 -191.13747 0.00023409933 1.0268939e-09 2.3847444e-10 1.2118338e-10 -5.1639054e-09
+ 8400 26.95734 8.4692564e-07 -191.13748 0.0002174539 1.1122547e-09 8.8553407e-11 1.2219947e-10 -5.2187642e-09
+ 8500 28.793713 1.392235e-06 -191.13751 0.00019325807 1.0989984e-09 5.0075535e-11 1.2293818e-10 -5.2142527e-09
+ 8600 30.618852 9.7349899e-07 -191.13753 0.00017111327 9.8587453e-10 1.1774103e-10 1.2176493e-10 -5.1569143e-09
+ 8700 32.445868 2.5296847e-07 -191.13754 0.00015789511 7.9484552e-10 2.5817073e-10 1.115647e-10 -5.0569238e-09
+ 8800 34.270996 2.7539795e-09 -191.13755 0.00015589656 5.6635936e-10 4.2847179e-10 9.4176389e-11 -4.9223096e-09
+ 8900 36.093657 2.1445555e-07 -191.13754 0.00016310107 3.4009702e-10 5.9208385e-10 7.0443075e-11 -4.7692236e-09
+ 9000 38.459683 4.0126555e-07 -191.13753 0.00017495305 1.5426703e-10 7.172267e-10 4.3117956e-11 -4.6253241e-09
+Loop time of 38.461 on 4 procs for 2000 steps with 2304 atoms
+
+Pair time (%) = 11.5949 (30.1471)
+Neigh time (%) = 5.03514 (13.0916)
+Comm time (%) = 11.5027 (29.9074)
+Outpt time (%) = 0.101439 (0.263745)
+Other time (%) = 10.2268 (26.5902)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 178632 ave 288850 max 65677 min
+Neighs: 178632 ave 288850 max 65688 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 200
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/bar1d_flux.screen b/examples/USER/atc/elastic/bar1d_flux.screen
index 259c78a3a..c6710b7f4 100644
--- a/examples/USER/atc/elastic/bar1d_flux.screen
+++ b/examples/USER/atc/elastic/bar1d_flux.screen
@@ -1,280 +1,281 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
lattice fcc 5.2582305 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.25823 5.25823 5.25823
# create atoms
region simRegion block -12 12 -3 3 -3 3
region atomRegion block -9 9 -3 3 -3 3
region mdRegion block -8 8 -3 3 -3 3
boundary f p p
create_box 1 simRegion
Created orthogonal box = (-63.0988 -15.7747 -15.7747) to (63.0988 15.7747 15.7747)
4 by 1 by 1 MPI processor grid
create_atoms 1 region mdRegion
Created 2304 atoms
mass 1 39.95
# specify interal/ghost atoms
region mdInternal block -6 6 -3 3 -3 3
region leftghost block -8 -6 -3 3 -3 3
region rightghost block 6 8 -3 3 -3 3
group internal region mdInternal
1728 atoms in group internal
group Lghost region leftghost
288 atoms in group Lghost
group Rghost region rightghost
288 atoms in group Rghost
group ghosts union Lghost Rghost
576 atoms in group ghosts
# velocities have Vcm = 0
#velocity internal create 40. 87287 mom yes loop geom
pair_style lj/cut 13.
#pair_coeff 1 1 0.010323166 3.405 13.
pair_coeff 1 1 .2381 3.405 13.
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# define layer
# ID group atc PhysicsType ParameterFile
fix AtC internal atc elastic Ar_elastic.mat
ATC: constructing elastic coupling with parameter file Ar_elastic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 1.09915
ATC: computed mass density : 1.09915
ATC: computed mass density : 1.09915
ATC: 3 materials defined from Ar_elastic.mat
#fix_modify AtC boundary Lghost
#fix_modify AtC boundary Rghost
fix_modify AtC boundary ghosts
# ID part keywords nx ny nz region
fix_modify AtC mesh create 12 1 1 simRegion f p p
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
fix_modify AtC mesh create_faceset obndy box -6.0 6.0 -INF INF -INF INF outward
ATC: created faceset obndy with 2 faces
# initial conditions
fix_modify AtC initial displacement x all 0.0
fix_modify AtC initial displacement y all 0.0
fix_modify AtC initial displacement z all 0.0
fix_modify AtC initial velocity x all 0.0
fix_modify AtC initial velocity y all 0.0
fix_modify AtC initial velocity z all 0.0
# set node sets and bcs
# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC fix velocity x rbc 0.00000004
#fix_modify AtC fix velocity x rbc 0.
#fix_modify AtC fix displacement x rbc 0.
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix velocity x lbc 0.
#fix_modify AtC output follow_ex.fe 50
fix_modify AtC internal_quadrature off
#fix_modify AtC control lumped_lambda_solve on
#fix_modify AtC momentum control glc_velocity
#fix_modify AtC momentum control flux faceset obndy
fix_modify AtC control momentum flux interpolate
#fix_modify AtC filter scale 1000.0
# run to extension
compute myTemp internal temp
compute atomStress internal stress/atom
compute avgStress internal reduce sum c_atomStress[1] c_atomStress[2] c_atomStress[3]
variable myPres equal -(c_avgStress[1]+c_avgStress[2]+c_avgStress[3])/(3*vol)
thermo_style custom step c_myTemp v_myPres pe
fix_modify AtC output bar1d_fluxFE 10 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
timestep 5
thermo 100
run 1000
Setting up run ...
-Memory usage per processor = 93.0953 Mbytes
+Memory usage per processor = 65.6268 Mbytes
Step myTemp myPres PotEng
0 0 -0.00072339042 -4509.8851
100 1.7485737e-12 -0.00065677838 -4509.8851
200 2.1209236e-12 -0.00058835409 -4509.8851
300 3.1757662e-11 -0.00088336321 -4509.8851
400 4.4437682e-10 -0.0022808215 -4509.8852
500 2.1276171e-09 -0.0055205162 -4509.8852
600 5.3746766e-09 -0.010513144 -4509.8852
700 9.3752238e-09 -0.016165157 -4509.8852
800 1.3218953e-08 -0.02139071 -4509.8852
900 1.6753544e-08 -0.026203391 -4509.8852
1000 2.0559423e-08 -0.031228823 -4509.8852
-Loop time of 77.9631 on 4 procs for 1000 steps with 2304 atoms
+Loop time of 22.401 on 4 procs for 1000 steps with 2304 atoms
-Pair time (%) = 8.02545 (10.2939)
-Neigh time (%) = 4.56744 (5.85847)
-Comm time (%) = 22.9713 (29.4644)
-Outpt time (%) = 0.286932 (0.368036)
-Other time (%) = 42.1119 (54.0152)
+Pair time (%) = 5.92745 (26.4607)
+Neigh time (%) = 2.61159 (11.6584)
+Comm time (%) = 6.5556 (29.2648)
+Outpt time (%) = 0.0144683 (0.0645879)
+Other time (%) = 7.29186 (32.5515)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 288102 max 69229 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 100
Dangerous builds = 0
# change nodes to fixed
fix_modify AtC fix velocity x rbc 0.
fix_modify AtC fix displacement x rbc 0.0002
fix_modify AtC output bar1d_fluxFE 500 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
# run to equilibrium
timestep 5
thermo 100
run 10000
Setting up run ...
-Memory usage per processor = 93.5532 Mbytes
+Memory usage per processor = 66.0846 Mbytes
Step myTemp myPres PotEng
1000 2.0559423e-08 -0.031228823 -4509.8852
1100 2.4448613e-08 -0.036521719 -4509.8852
1200 2.7029986e-08 -0.040978057 -4509.8852
1300 2.7245337e-08 -0.042998684 -4509.8852
1400 2.5759549e-08 -0.041645718 -4509.8852
1500 2.2667557e-08 -0.037303114 -4509.8852
1600 1.8985753e-08 -0.031463351 -4509.8852
1700 1.6073802e-08 -0.025662764 -4509.8852
1800 1.2763714e-08 -0.020737937 -4509.8852
1900 7.2995795e-09 -0.01675253 -4509.8852
2000 2.1755431e-09 -0.013533314 -4509.8853
2100 1.1934319e-09 -0.011450448 -4509.8853
2200 5.1850465e-09 -0.011687818 -4509.8853
2300 1.1883622e-08 -0.015251299 -4509.8852
2400 1.6266667e-08 -0.021397871 -4509.8852
2500 1.9099042e-08 -0.02792249 -4509.8851
2600 2.184558e-08 -0.033185039 -4509.8852
2700 2.4595817e-08 -0.037175923 -4509.8852
2800 2.6643068e-08 -0.040355693 -4509.8852
2900 2.6394943e-08 -0.042183343 -4509.8852
3000 2.3989422e-08 -0.041411974 -4509.8852
3100 2.0979363e-08 -0.037465063 -4509.8851
3200 1.7427127e-08 -0.031310189 -4509.8852
3300 1.3963242e-08 -0.024887233 -4509.8852
3400 1.0069796e-08 -0.019686777 -4509.8852
3500 4.9395633e-09 -0.01603797 -4509.8853
3600 1.5407167e-09 -0.013620537 -4509.8853
3700 2.5284685e-09 -0.012392513 -4509.8853
3800 7.790979e-09 -0.012777012 -4509.8852
3900 1.3465317e-08 -0.015407232 -4509.8852
4000 1.7796468e-08 -0.02062936 -4509.8852
4100 2.137127e-08 -0.027628973 -4509.8852
4200 2.3606809e-08 -0.034315098 -4509.8852
4300 2.5221837e-08 -0.038703928 -4509.8852
4400 2.6247664e-08 -0.040548555 -4509.8852
4500 2.5017987e-08 -0.040839998 -4509.8852
4600 2.1628404e-08 -0.040012148 -4509.8852
4700 1.7878834e-08 -0.037370745 -4509.8851
4800 1.5934582e-08 -0.032277925 -4509.8851
4900 1.2990149e-08 -0.025549108 -4509.8852
5000 7.8316754e-09 -0.01918358 -4509.8853
5100 3.3266953e-09 -0.014887033 -4509.8853
5200 1.805252e-09 -0.01286358 -4509.8853
5300 4.2912871e-09 -0.012392579 -4509.8852
5400 9.9026848e-09 -0.013257092 -4509.8852
5500 1.6165255e-08 -0.015976619 -4509.8852
5600 2.1206295e-08 -0.020907339 -4509.8852
5700 2.4000025e-08 -0.027469529 -4509.8852
5800 2.5521345e-08 -0.034321126 -4509.8852
5900 2.5894586e-08 -0.039670766 -4509.8852
6000 2.5086791e-08 -0.042046228 -4509.8852
6100 2.360407e-08 -0.041352366 -4509.8852
6200 1.9586346e-08 -0.038824048 -4509.8852
6300 1.6684228e-08 -0.035608606 -4509.8852
6400 1.4893508e-08 -0.031584998 -4509.8852
6500 1.1127507e-08 -0.026164353 -4509.8852
6600 5.9884577e-09 -0.019764802 -4509.8853
6700 2.2391294e-09 -0.014210542 -4509.8853
6800 2.7797654e-09 -0.011431487 -4509.8853
6900 6.7664929e-09 -0.011810438 -4509.8852
7000 1.1980057e-08 -0.014206493 -4509.8852
7100 1.7989445e-08 -0.017536849 -4509.8852
7200 2.3218176e-08 -0.02190877 -4509.8852
7300 2.5628573e-08 -0.027653206 -4509.8852
7400 2.610839e-08 -0.034000347 -4509.8852
7500 2.4944322e-08 -0.039281243 -4509.8852
7600 2.2693765e-08 -0.042058723 -4509.8852
7700 1.9767428e-08 -0.041825858 -4509.8851
7800 1.6504232e-08 -0.039030684 -4509.8851
7900 1.4309561e-08 -0.03485307 -4509.8852
8000 1.3055145e-08 -0.030357952 -4509.8852
8100 9.5625542e-09 -0.025706075 -4509.8852
8200 4.6410355e-09 -0.02054295 -4509.8853
8300 3.2795872e-09 -0.015185677 -4509.8853
8400 5.509246e-09 -0.011181309 -4509.8853
8500 9.2654236e-09 -0.010336847 -4509.8852
8600 1.5169111e-08 -0.013152226 -4509.8852
8700 2.1124719e-08 -0.018237266 -4509.8852
8800 2.5607376e-08 -0.023635507 -4509.8852
8900 2.7829768e-08 -0.028664368 -4509.8853
9000 2.7490864e-08 -0.033752079 -4509.8853
9100 2.4629425e-08 -0.038717883 -4509.8852
9200 1.9856317e-08 -0.042074213 -4509.8851
9300 1.5754223e-08 -0.042397751 -4509.8851
9400 1.4158011e-08 -0.039645985 -4509.8851
9500 1.293562e-08 -0.034905375 -4509.8852
9600 1.0925115e-08 -0.029498287 -4509.8852
9700 8.2117111e-09 -0.024274276 -4509.8853
9800 4.2073503e-09 -0.019498803 -4509.8853
9900 3.6200071e-09 -0.015198764 -4509.8853
10000 7.3205984e-09 -0.011878546 -4509.8852
10100 1.2327605e-08 -0.010695702 -4509.8852
10200 1.7930358e-08 -0.012691556 -4509.8852
10300 2.4534101e-08 -0.017839785 -4509.8852
10400 2.8574489e-08 -0.024561434 -4509.8852
10500 2.944535e-08 -0.030655475 -4509.8852
10600 2.7962098e-08 -0.034958095 -4509.8852
10700 2.3119076e-08 -0.037998711 -4509.8852
10800 1.684499e-08 -0.040493081 -4509.8852
10900 1.2305474e-08 -0.041691151 -4509.8851
11000 1.1330272e-08 -0.040137729 -4509.8851
-Loop time of 371.175 on 4 procs for 10000 steps with 2304 atoms
+Loop time of 209.077 on 4 procs for 10000 steps with 2304 atoms
-Pair time (%) = 66.4286 (17.8968)
-Neigh time (%) = 31.4239 (8.46606)
-Comm time (%) = 117.354 (31.617)
-Outpt time (%) = 0.685033 (0.184558)
-Other time (%) = 155.283 (41.8355)
+Pair time (%) = 58.372 (27.9189)
+Neigh time (%) = 25.3886 (12.1432)
+Comm time (%) = 59.3392 (28.3815)
+Outpt time (%) = 0.11328 (0.0541809)
+Other time (%) = 65.8637 (31.5022)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 178632 ave 289296 max 68184 min
+Neighs: 178632 ave 287569 max 69518 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 1000
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/bar1d_frac_step.screen b/examples/USER/atc/elastic/bar1d_frac_step.screen
index f84c6d0f9..22d10649d 100644
--- a/examples/USER/atc/elastic/bar1d_frac_step.screen
+++ b/examples/USER/atc/elastic/bar1d_frac_step.screen
@@ -1,225 +1,226 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
lattice fcc 5.2582305 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.25823 5.25823 5.25823
# create atoms
region simRegion block -12 12 -3 3 -3 3
region atomRegion block -8 8 -3 3 -3 3
region mdRegion block -6 6 -3 3 -3 3
boundary f p p
create_box 1 simRegion
Created orthogonal box = (-63.0988 -15.7747 -15.7747) to (63.0988 15.7747 15.7747)
4 by 1 by 1 MPI processor grid
create_atoms 1 region atomRegion
Created 2304 atoms
mass 1 39.95
# specify interal/ghost atoms
region mdInternal block -6 6 -3 3 -3 3
region leftghost block -8 -6 -3 3 -3 3
region rightghost block 6 8 -3 3 -3 3
group internal region mdInternal
1728 atoms in group internal
group Lghost region leftghost
288 atoms in group Lghost
group Rghost region rightghost
288 atoms in group Rghost
group ghosts union Lghost Rghost
576 atoms in group ghosts
pair_style lj/cut 13.
#pair_coeff 1 1 0.010323166 3.405 13.5
pair_coeff 1 1 .2381 3.405 13.
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# define layer
# ID group atc PhysicsType ParameterFile
fix AtC internal atc elastic Ar_elastic.mat
ATC: constructing elastic coupling with parameter file Ar_elastic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 1.09915
ATC: computed mass density : 1.09915
ATC: computed mass density : 1.09915
ATC: 3 materials defined from Ar_elastic.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 12 1 1 simRegion f p p
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
# initial conditions
fix_modify AtC initial displacement x all 0.0
fix_modify AtC initial displacement y all 0.0
fix_modify AtC initial displacement z all 0.0
fix_modify AtC initial velocity x all 0.0
fix_modify AtC initial velocity y all 0.0
fix_modify AtC initial velocity z all 0.0
fix_modify AtC time_integration fractional_step
# set node sets and bcs
# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC fix velocity x rbc 0.00000004
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix velocity x lbc 0.
# specify atom types
#fix_modify AtC boundary Lghost
#fix_modify AtC boundary Rghost
fix_modify AtC boundary ghosts
fix_modify AtC internal_quadrature off
fix_modify AtC control localized_lambda on
fix_modify AtC control momentum flux interpolate
#fix_modify AtC control momentum hoover # tested in this mode
#fix_modify AtC filter type exponential
#fix_modify AtC filter scale 1000.0
#fix_modify AtC filter on
# run to extension
#fix_modify AtC output bar1d_frac_step_initFE 50 text binary
#dump D1 all atom 50 bar1d_frac_step_init.dmp
timestep 5
thermo 100
run 1000
Setting up run ...
-Memory usage per processor = 92.6375 Mbytes
+Memory usage per processor = 65.169 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0 -4509.8851 0 -4509.8851 26.948349
100 4.7374019e-13 -4509.8851 0 -4509.8851 26.94834
200 9.7683427e-13 -4509.8851 0 -4509.8851 26.94803
300 1.9565172e-11 -4509.8851 0 -4509.8851 26.946439
400 2.6411547e-10 -4509.8852 0 -4509.8852 26.942798
500 1.351766e-09 -4509.8852 0 -4509.8852 26.93773
600 3.6802148e-09 -4509.8852 0 -4509.8852 26.932648
700 6.6530697e-09 -4509.8852 0 -4509.8852 26.928033
800 9.5474556e-09 -4509.8852 0 -4509.8852 26.923147
900 1.2412323e-08 -4509.8852 0 -4509.8852 26.917542
1000 1.5423223e-08 -4509.8852 0 -4509.8852 26.911973
-Loop time of 69.3748 on 4 procs for 1000 steps with 2304 atoms
+Loop time of 20.9063 on 4 procs for 1000 steps with 2304 atoms
-Pair time (%) = 8.07954 (11.6462)
-Neigh time (%) = 4.407 (6.35245)
-Comm time (%) = 22.0263 (31.7496)
-Outpt time (%) = 0.19482 (0.280822)
-Other time (%) = 34.6672 (49.9709)
+Pair time (%) = 5.92352 (28.3337)
+Neigh time (%) = 2.57525 (12.3181)
+Comm time (%) = 6.14411 (29.3888)
+Outpt time (%) = 0.000962973 (0.00460614)
+Other time (%) = 6.26243 (29.9548)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 288910 max 68513 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 100
Dangerous builds = 0
# reset time
fix_modify AtC reset_time 0.
reset_timestep 0
# change nodes to fixed
fix_modify AtC fix velocity x rbc 0.
fix_modify AtC fix displacement x rbc 0.0002
fix_modify AtC output bar1d_frac_stepFE 500 text #binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
#fix_modify AtC output index step
#undump D1
#dump D1 all atom 500 bar1d_frac_step.dmp
# run to equilibrium
timestep 5
thermo 100
run 5000
Setting up run ...
-Memory usage per processor = 92.6375 Mbytes
+Memory usage per processor = 65.169 Mbytes
Step Temp E_pair E_mol TotEng Press
0 1.5423223e-08 -4509.8852 0 -4509.8852 26.911973
100 1.809994e-08 -4509.8852 0 -4509.8852 26.907429
200 1.9777109e-08 -4509.8852 0 -4509.8852 26.904241
300 2.0275205e-08 -4509.8852 0 -4509.8852 26.902912
400 1.9266773e-08 -4509.8852 0 -4509.8852 26.904281
500 1.6821974e-08 -4509.8851 0 -4509.8851 26.908126
600 1.370661e-08 -4509.8852 0 -4509.8852 26.912761
700 1.0292223e-08 -4509.8852 0 -4509.8852 26.916838
800 6.5498338e-09 -4509.8853 0 -4509.8853 26.920715
900 3.1643856e-09 -4509.8853 0 -4509.8853 26.925094
1000 1.0112513e-09 -4509.8852 0 -4509.8852 26.928958
1100 4.4564547e-10 -4509.8852 0 -4509.8852 26.930177
1200 2.264627e-09 -4509.8852 0 -4509.8852 26.92803
1300 6.3325706e-09 -4509.8853 0 -4509.8853 26.923952
1400 1.1281983e-08 -4509.8853 0 -4509.8853 26.919616
1500 1.5582979e-08 -4509.8852 0 -4509.8852 26.915411
1600 1.8378446e-08 -4509.8852 0 -4509.8852 26.911278
1700 1.9544417e-08 -4509.8852 0 -4509.8852 26.907886
1800 1.993739e-08 -4509.8851 0 -4509.8851 26.905965
1900 1.9956722e-08 -4509.8851 0 -4509.8851 26.905229
2000 1.9225238e-08 -4509.8852 0 -4509.8852 26.905144
2100 1.6580757e-08 -4509.8853 0 -4509.8853 26.906419
2200 1.2058028e-08 -4509.8853 0 -4509.8853 26.910376
2300 7.4549951e-09 -4509.8852 0 -4509.8852 26.916716
2400 4.0264612e-09 -4509.8852 0 -4509.8852 26.923054
2500 1.8321195e-09 -4509.8852 0 -4509.8852 26.92718
2600 5.8894583e-10 -4509.8852 0 -4509.8852 26.92887
2700 1.1822868e-09 -4509.8853 0 -4509.8853 26.928935
2800 4.1199827e-09 -4509.8853 0 -4509.8853 26.927485
2900 8.3401571e-09 -4509.8853 0 -4509.8853 26.924202
3000 1.2795486e-08 -4509.8852 0 -4509.8852 26.91968
3100 1.656454e-08 -4509.8852 0 -4509.8852 26.915184
3200 1.8809835e-08 -4509.8852 0 -4509.8852 26.911167
3300 1.9524689e-08 -4509.8852 0 -4509.8852 26.907277
3400 1.9239653e-08 -4509.8852 0 -4509.8852 26.904028
3500 1.8306513e-08 -4509.8852 0 -4509.8852 26.903155
3600 1.6715381e-08 -4509.8852 0 -4509.8852 26.905573
3700 1.4633381e-08 -4509.8851 0 -4509.8851 26.909896
3800 1.1933216e-08 -4509.8851 0 -4509.8851 26.913983
3900 8.1608505e-09 -4509.8852 0 -4509.8852 26.917338
4000 4.081711e-09 -4509.8853 0 -4509.8853 26.920926
4100 1.5631282e-09 -4509.8853 0 -4509.8853 26.924958
4200 1.2262219e-09 -4509.8853 0 -4509.8853 26.928167
4300 2.985009e-09 -4509.8852 0 -4509.8852 26.929352
4400 6.8933386e-09 -4509.8852 0 -4509.8852 26.928435
4500 1.1278724e-08 -4509.8852 0 -4509.8852 26.925624
4600 1.4438096e-08 -4509.8852 0 -4509.8852 26.920742
4700 1.6779441e-08 -4509.8852 0 -4509.8852 26.914294
4800 1.8690218e-08 -4509.8853 0 -4509.8853 26.908349
4900 1.9317873e-08 -4509.8852 0 -4509.8852 26.905059
5000 1.8273072e-08 -4509.8851 0 -4509.8851 26.904542
-Loop time of 207.618 on 4 procs for 5000 steps with 2304 atoms
+Loop time of 102.163 on 4 procs for 5000 steps with 2304 atoms
-Pair time (%) = 33.494 (16.1325)
-Neigh time (%) = 16.7803 (8.08228)
-Comm time (%) = 59.1908 (28.5094)
-Outpt time (%) = 0.143787 (0.0692554)
-Other time (%) = 98.0096 (47.2066)
+Pair time (%) = 29.2862 (28.6663)
+Neigh time (%) = 12.7956 (12.5247)
+Comm time (%) = 29.5903 (28.964)
+Outpt time (%) = 0.0584463 (0.0572091)
+Other time (%) = 30.432 (29.7878)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 178632 ave 288845 max 67924 min
+Neighs: 178632 ave 288545 max 68120 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 500
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/bar1d_ghost_flux.screen b/examples/USER/atc/elastic/bar1d_ghost_flux.screen
index 0b3f5cac6..2b1149c92 100644
--- a/examples/USER/atc/elastic/bar1d_ghost_flux.screen
+++ b/examples/USER/atc/elastic/bar1d_ghost_flux.screen
@@ -1,208 +1,209 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
lattice fcc 5.2582305 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.25823 5.25823 5.25823
region simRegion block -12 12 -3 3 -3 3
region mdRegion block -8 8 -3 3 -3 3
boundary f p p
create_box 1 simRegion
Created orthogonal box = (-63.0988 -15.7747 -15.7747) to (63.0988 15.7747 15.7747)
4 by 1 by 1 MPI processor grid
create_atoms 1 region mdRegion
Created 2304 atoms
mass 1 39.95
# specify interal/ghost atoms
region mdInternal block -6 6 -3 3 -3 3
region leftghost block -8 -6 -3 3 -3 3
region rightghost block 6 8 -3 3 -3 3
group internal region mdInternal
1728 atoms in group internal
group Lghost region leftghost
288 atoms in group Lghost
group Rghost region rightghost
288 atoms in group Rghost
group ghosts union Lghost Rghost
576 atoms in group ghosts
# velocities have Vcm = 0, NOTE next for lines commented out for restart
pair_style lj/cut 13.
#pair_coeff 1 1 0.010323166 3.405 13.
pair_coeff 1 1 .2381 3.405 13.
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# define layer
# ID group atc PhysicsType ParameterFile
fix AtC internal atc elastic Ar_elastic.mat
ATC: constructing elastic coupling with parameter file Ar_elastic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 1.09915
ATC: computed mass density : 1.09915
ATC: computed mass density : 1.09915
ATC: 3 materials defined from Ar_elastic.mat
fix_modify AtC boundary ghosts
# ID part keywords nx ny nz region
fix_modify AtC mesh create 12 1 1 simRegion f p p
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
fix_modify AtC mesh create_faceset obndy box -6.0 6.0 -INF INF -INF INF outward
ATC: created faceset obndy with 2 faces
fix_modify AtC internal_quadrature off
# initial conditions
fix_modify AtC initial displacement x all 0.0
fix_modify AtC fix displacement y all 0.0
fix_modify AtC fix displacement z all 0.0
fix_modify AtC initial velocity x all 0.0
fix_modify AtC fix velocity y all 0.0
fix_modify AtC fix velocity z all 0.0
# set node sets and bcs
# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
#fix_modify AtC fix velocity x rbc 0.
#fix_modify AtC fix displacement x rbc 0.
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix velocity x lbc 0.
# turn on multiscale
fix_modify AtC control momentum ghost_flux
# new boundary conditions
fix_modify AtC fix velocity x rbc 0.00000004
#fix_modify AtC output follow_ex.fe 50
#fix_modify AtC localized_lambda on
#fix_modify AtC momentum control glc_velocity
#fix_modify AtC momentum control flux faceset obndy
#fix_modify AtC control momentum flux
#fix_modify AtC control momentum ghost_flux
#fix_modify AtC filter scale 1000.0
# run to extension
compute myTemp internal temp
compute atomStress internal stress/atom
compute avgStress internal reduce sum c_atomStress[1] c_atomStress[2] c_atomStress[3]
variable myPres equal -(c_avgStress[1]+c_avgStress[2]+c_avgStress[3])/(3*vol)
thermo_style custom step c_myTemp v_myPres pe
fix_modify AtC output bar1d_ghost_fluxFE 500 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
#dump D1 all atom 100 bar1d_ghost_flux.dmp
timestep 5
thermo 100
run 1000
Setting up run ...
-Memory usage per processor = 93.0953 Mbytes
+Memory usage per processor = 65.6268 Mbytes
Step myTemp myPres PotEng
0 0 -0.00072339042 -4509.8851
100 7.1225566e-14 -0.00069609188 -4509.8851
200 3.7853133e-13 -0.00065829543 -4509.8851
300 1.6363911e-11 -0.00093014878 -4509.8851
400 2.6679578e-10 -0.0022162027 -4509.8852
500 1.616056e-09 -0.0053039586 -4509.8852
600 5.0333459e-09 -0.010270696 -4509.8852
700 9.7370581e-09 -0.016093983 -4509.8852
800 1.3809125e-08 -0.021486202 -4509.8852
900 1.6783957e-08 -0.026147268 -4509.8852
1000 1.9615527e-08 -0.030744945 -4509.8852
-Loop time of 61.3722 on 4 procs for 1000 steps with 2304 atoms
+Loop time of 19.9128 on 4 procs for 1000 steps with 2304 atoms
-Pair time (%) = 8.47621 (13.8112)
-Neigh time (%) = 4.57113 (7.44821)
-Comm time (%) = 21.3849 (34.8445)
-Outpt time (%) = 0.0678592 (0.11057)
-Other time (%) = 26.8721 (43.7855)
+Pair time (%) = 5.9847 (30.0546)
+Neigh time (%) = 2.56854 (12.899)
+Comm time (%) = 6.48197 (32.5518)
+Outpt time (%) = 0.00853121 (0.0428429)
+Other time (%) = 4.86905 (24.4519)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 288581 max 68542 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 100
Dangerous builds = 0
# change nodes to fixed
fix_modify AtC unfix velocity x rbc
#fix_modify AtC fix displacement x rbc 0.0002
#fix_modify AtC output bar1d_fluxFE 500 text binary
# run to equilibrium
timestep 5
thermo 100
run 3000
Setting up run ...
-Memory usage per processor = 93.5532 Mbytes
+Memory usage per processor = 66.0846 Mbytes
Step myTemp myPres PotEng
1000 1.9615527e-08 -0.030744945 -4509.8852
1100 2.3080841e-08 -0.035570103 -4509.8852
1200 2.6803382e-08 -0.039749355 -4509.8852
1300 2.8836885e-08 -0.041881649 -4509.8852
1400 2.7038886e-08 -0.04118176 -4509.8852
1500 2.247439e-08 -0.037776265 -4509.8852
1600 1.8021787e-08 -0.032491325 -4509.8852
1700 1.4774855e-08 -0.026754505 -4509.8852
1800 1.2061023e-08 -0.022034601 -4509.8852
1900 8.5768539e-09 -0.018709001 -4509.8852
2000 3.6373058e-09 -0.016114748 -4509.8852
2100 5.3669536e-10 -0.014163462 -4509.8853
2200 3.2454928e-09 -0.014205399 -4509.8853
2300 1.030702e-08 -0.017492992 -4509.8853
2400 1.6038797e-08 -0.023210717 -4509.8852
2500 1.7061988e-08 -0.029013462 -4509.8851
2600 1.9296258e-08 -0.03339452 -4509.8852
2700 2.2816944e-08 -0.036626152 -4509.8852
2800 2.6944075e-08 -0.039307649 -4509.8852
2900 2.8170813e-08 -0.040972921 -4509.8852
3000 2.7256286e-08 -0.040327211 -4509.8852
3100 2.445985e-08 -0.036617618 -4509.8852
3200 1.8787648e-08 -0.03049195 -4509.8852
3300 1.4750104e-08 -0.023629006 -4509.8852
3400 1.3515772e-08 -0.017473229 -4509.8852
3500 1.157919e-08 -0.012114855 -4509.8851
3600 9.6213234e-09 -0.0064144434 -4509.8851
3700 9.1781574e-09 0.00062376196 -4509.8851
3800 9.0938842e-09 0.0087100206 -4509.885
3900 7.7454581e-09 0.016669158 -4509.885
4000 9.3314606e-09 0.023405906 -4509.885
-Loop time of 109.051 on 4 procs for 3000 steps with 2304 atoms
+Loop time of 57.6519 on 4 procs for 3000 steps with 2304 atoms
-Pair time (%) = 20.2492 (18.5685)
-Neigh time (%) = 9.8419 (9.02501)
-Comm time (%) = 37.2858 (34.191)
-Outpt time (%) = 0.421606 (0.386612)
-Other time (%) = 41.2529 (37.8289)
+Pair time (%) = 17.6452 (30.6064)
+Neigh time (%) = 7.70333 (13.3618)
+Comm time (%) = 18.2327 (31.6256)
+Outpt time (%) = 0.0274211 (0.0475633)
+Other time (%) = 14.0432 (24.3587)
Nlocal: 576 ave 864 max 288 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5170 ave 6910 max 3430 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 288933 max 68141 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 577008 max 137520 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 300
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/bar1d_thermo_elastic.screen b/examples/USER/atc/elastic/bar1d_thermo_elastic.screen
index 23e6d6ba2..1d64e52b5 100644
--- a/examples/USER/atc/elastic/bar1d_thermo_elastic.screen
+++ b/examples/USER/atc/elastic/bar1d_thermo_elastic.screen
@@ -1,112 +1,114 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
lattice fcc 5.2582305 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.25823 5.25823 5.25823
# NOTE following 3 lines added for restart
boundary f p p
pair_style lj/cut 13.
read_data temp.init
Reading data file ...
orthogonal box = (-47.3241 -15.7747 -15.7747) to (47.3241 15.7747 15.7747)
4 by 1 by 1 MPI processor grid
2304 atoms
2304 velocities
region simRegion block -12 12 -3 3 -3 3
# create atoms, NOTE commented out for restart
#region mdRegion block -8 8 -3 3 -3 3
#boundary f p p
#region mdBox block -9 9 -3 3 -3 3
#create_box 1 mdBox
#create_atoms 1 region mdRegion
#mass 1 39.95
# specify interal/ghost atoms
region mdInternal block -6 6 -3 3 -3 3
region leftghost block -8 -6 -3 3 -3 3
region rightghost block 6 8 -3 3 -3 3
group internal region mdInternal
1728 atoms in group internal
group Lghost region leftghost
288 atoms in group Lghost
group Rghost region rightghost
288 atoms in group Rghost
group ghosts union Lghost Rghost
576 atoms in group ghosts
# velocities have Vcm = 0, NOTE next for lines commented out for restart
#velocity internal create 40. 87287 mom yes loop geom
#pair_style lj/cut 13.
##pair_coeff 1 1 0.010323166 3.405 13.
#pair_coeff 1 1 .2381 3.405 13.
neighbor 5. bin
neigh_modify every 10 delay 0 check no
#write_restart tinit.dat
# zero initial momentum
fix AtC internal atc elastic Ar_thermo_elastic.mat
ATC: constructing elastic coupling with parameter file Ar_thermo_elastic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 1.09915
ATC: 1 materials defined from Ar_thermo_elastic.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 12 1 1 simRegion f p p
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
fix_modify AtC mesh create_faceset obndy box -6.0 6.0 -INF INF -INF INF outward
ATC: created faceset obndy with 2 faces
fix_modify AtC internal_quadrature off
fix_modify AtC fix displacement x all 0.
fix_modify AtC fix displacement y all 0.
fix_modify AtC fix displacement z all 0.
fix_modify AtC fix velocity x all 0.
fix_modify AtC fix velocity y all 0.
fix_modify AtC fix velocity z all 0.
fix_modify AtC control momentum glc_velocity
#fix_modify AtC output bar1d_thermo_elastic_initializeFE 1 text #binary
timestep 0
thermo 1
run 1
Setting up run ...
Memory usage per processor = 56.6533 Mbytes
Step Temp E_pair E_mol TotEng Press
0 29.995658 -4509.8851 0 -4303.9707 135.84496
1 29.920966 -4509.8851 0 -4304.4835 135.59617
-Loop time of 0.161032 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0227677 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.013374 (8.3052)
+Pair time (%) = 0.00611377 (26.8528)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00626355 (3.88963)
-Outpt time (%) = 0.027244 (16.9184)
-Other time (%) = 0.11415 (70.8868)
+Comm time (%) = 0.00170422 (7.48523)
+Outpt time (%) = 8.44598e-05 (0.370963)
+Other time (%) = 0.0148653 (65.291)
Nlocal: 576 ave 648 max 504 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 5677 ave 7126 max 4228 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 178632 ave 218376 max 138456 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 357264 ave 436752 max 277776 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1429056
Ave neighs/atom = 620.25
Neighbor list builds = 0
Dangerous builds = 0
unfix AtC
# define layer
# ID group atc PhysicsType ParameterFile
fix AtC internal atc thermo_elastic Ar_thermo_elastic.mat
ATC: constructing thermo-mechanical coupling with parameter file Ar_thermo_elastic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 1.09915
ATC: 1 materials defined from Ar_thermo_elastic.mat
ATC: peratom PE compute created with ID: 3
fix_modify AtC boundary ghosts
ERROR: Illegal fix_modify command (../fix.cpp:104)
diff --git a/examples/USER/atc/elastic/cnt_electrostatic.screen b/examples/USER/atc/elastic/cnt_electrostatic.screen
index 6171d59f6..745ae0ddb 100644
--- a/examples/USER/atc/elastic/cnt_electrostatic.screen
+++ b/examples/USER/atc/elastic/cnt_electrostatic.screen
@@ -1,1212 +1,1213 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style atomic
lattice diamond 3.6
Lattice spacing in x,y,z = 3.6 3.6 3.6
pair_style tersoff
boundary s s f
read_data tube_8_4.data
Reading data file ...
orthogonal box = (-4.34588 -4.34588 0) to (4.34588 4.34588 104.296)
1 by 1 by 4 MPI processor grid
1008 atoms
1008 velocities
# PARAMETERS-----------------------------
variable L equal zhi-zlo
variable R equal 12.1/2
variable xhiFE equal 5.0*$R
variable xhiFE equal 5.0*6.0499999999999998224
variable xloFE equal -${xhiFE}
variable xloFE equal -30.25
variable yhiFE equal $R
variable yhiFE equal 6.0499999999999998224
variable yloFE equal -${xhiFE}
variable yloFE equal -30.25
variable zhiFE equal zhi
variable zloFE equal zlo+10
print "Length $L [${zloFE}, ${zhiFE}]"
Length 104.29551668000000575 [10, 104.29551668000000575]
variable E equal 10.0
print "Electric field $E"
Electric field 10
variable drhodx equal 0.0001
variable s equal 50
# END -----------------------------------
#pair_coeff * * SiC.tersoff C
pair_coeff * * ../../../../potentials/SiC.tersoff C
mass * 12.01
# all atoms simulation
region feRegion block ${xloFE} ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -30.25 ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -30.25 6.0499999999999998224 ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -30.25 6.0499999999999998224 10 ${zhiFE} units box
region feRegion block -30.25 30.25 -30.25 6.0499999999999998224 10 104.29551668000000575 units box
group internal region feRegion
908 atoms in group internal
variable nAll equal count(all)
variable nGhost equal count(all)-count(internal)
print ">>> number of stationary ghosts: ${nGhost} of ${nAll}"
>>> number of stationary ghosts: 100 of 1008
neighbor 5. bin
neigh_modify every 10 delay 0 check no
timestep 0.0005
# coupling
fix AtC internal atc electrostatic CNT_electrostatic.mat
ATC: constructing electrostatic mechanical coupling with parameter file CNT_electrostatic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_electrostatic.mat
ATC: creating electrostatic extrinsic model
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_electrostatic.mat
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_electrostatic.mat
fix_modify AtC internal_quadrature off
fix_modify AtC omit atomic_charge
fix_modify AtC mesh create 5 1 12 feRegion f p f
ATC: created uniform mesh with 156 nodes, 78 unique nodes, and 60 elements
# initial & boundary conditions
fix_modify AtC initial displacement x all 0.0
fix_modify AtC initial displacement y all 0.0
fix_modify AtC initial displacement z all 0.0
fix_modify AtC initial velocity x all 0.0
fix_modify AtC initial velocity y all 0.0
fix_modify AtC initial velocity z all 0.0
fix_modify AtC initial electric_potential all 0.0
variable a equal -$R-0.1
variable a equal -6.0499999999999998224-0.1
variable b equal $R+0.1
variable b equal 6.0499999999999998224+0.1
fix_modify AtC mesh create_nodeset tube $a $b $a $b ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset tube -6.1499999999999994671 $b $a $b ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset tube -6.1499999999999994671 6.1499999999999994671 $a $b ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset tube -6.1499999999999994671 6.1499999999999994671 -6.1499999999999994671 $b ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset tube -6.1499999999999994671 6.1499999999999994671 -6.1499999999999994671 6.1499999999999994671 ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset tube -6.1499999999999994671 6.1499999999999994671 -6.1499999999999994671 6.1499999999999994671 10 ${zhiFE} units box
fix_modify AtC mesh create_nodeset tube -6.1499999999999994671 6.1499999999999994671 -6.1499999999999994671 6.1499999999999994671 10 104.29551668000000575 units box
ATC: created nodeset tube with 26 nodes
variable a equal ${zloFE}-0.1
variable a equal 10-0.1
variable b equal ${zloFE}+0.1
variable b equal 10+0.1
fix_modify AtC mesh create_nodeset lbc ${xloFE} ${xhiFE} ${xloFE} ${xhiFE} $a $b units box
fix_modify AtC mesh create_nodeset lbc -30.25 ${xhiFE} ${xloFE} ${xhiFE} $a $b units box
fix_modify AtC mesh create_nodeset lbc -30.25 30.25 ${xloFE} ${xhiFE} $a $b units box
fix_modify AtC mesh create_nodeset lbc -30.25 30.25 -30.25 ${xhiFE} $a $b units box
fix_modify AtC mesh create_nodeset lbc -30.25 30.25 -30.25 30.25 $a $b units box
fix_modify AtC mesh create_nodeset lbc -30.25 30.25 -30.25 30.25 9.9000000000000003553 $b units box
fix_modify AtC mesh create_nodeset lbc -30.25 30.25 -30.25 30.25 9.9000000000000003553 10.099999999999999645 units box
ATC: created nodeset lbc with 6 nodes
variable a equal ${xhiFE}-0.1
variable a equal 30.25-0.1
variable b equal ${xhiFE}+0.1
variable b equal 30.25+0.1
fix_modify AtC mesh create_nodeset top $a $b ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.149999999999998579 $b ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.149999999999998579 30.350000000000001421 ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.149999999999998579 30.350000000000001421 -30.25 ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.149999999999998579 30.350000000000001421 -30.25 6.0499999999999998224 ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.149999999999998579 30.350000000000001421 -30.25 6.0499999999999998224 10 ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.149999999999998579 30.350000000000001421 -30.25 6.0499999999999998224 10 104.29551668000000575 units box
ATC: created nodeset top with 13 nodes
variable a equal ${xloFE}-0.1
variable a equal -30.25-0.1
variable b equal ${xloFE}+0.1
variable b equal -30.25+0.1
fix_modify AtC mesh create_nodeset bot $a $b ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.350000000000001421 $b ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.350000000000001421 -30.149999999999998579 ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.350000000000001421 -30.149999999999998579 -30.25 ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.350000000000001421 -30.149999999999998579 -30.25 6.0499999999999998224 ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.350000000000001421 -30.149999999999998579 -30.25 6.0499999999999998224 10 ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.350000000000001421 -30.149999999999998579 -30.25 6.0499999999999998224 10 104.29551668000000575 units box
ATC: created nodeset bot with 13 nodes
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix displacement y lbc 0.
fix_modify AtC fix displacement z lbc 0.
fix_modify AtC fix velocity x lbc 0.
fix_modify AtC fix velocity y lbc 0.
fix_modify AtC fix velocity z lbc 0.
fix_modify AtC fix electron_density all 0.0
#fix_modify AtC fix electron_density tube 0.2
fix_modify AtC fix electron_density tube linear 0 0 0 0 0 ${drhodx} 0
fix_modify AtC fix electron_density tube linear 0 0 0 0 0 0.00010000000000000000479 0
ATC: created function : 0 + 0(x-0)+0(y-0)+0.0001(z-0)
fix_modify AtC fix electric_potential all linear 0 0 0 $E 0 0 0 0
fix_modify AtC fix electric_potential all linear 0 0 0 10 0 0 0 0
ATC: created function : 0 + 10(x-0)+0(y-0)+0(z-0)
fix_modify AtC control momentum flux
# run
thermo_style custom step cpu etotal ke
thermo 1#$s
fix_modify AtC output cnt_electrostaticFE $s full_text
fix_modify AtC output cnt_electrostaticFE 50 full_text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC output index step
# NOTE not recognized as vector by paraview
variable uX atom x-f_AtC[1]
variable uY atom y-f_AtC[2]
variable uZ atom z-f_AtC[3]
variable rho atom mass*f_AtC[4]
dump CONFIG all custom $s cnt_electrostatic.dmp id type x y z v_uX v_uY v_uZ v_rho
dump CONFIG all custom 50 cnt_electrostatic.dmp id type x y z v_uX v_uY v_uZ v_rho
log cnt_electrostatic.log
#run 1000
# fixed charge, bc on potential
fix_modify AtC unfix electric_potential all
fix_modify AtC fix electric_potential lbc linear 0 0 0 $E 0 0 0 0
fix_modify AtC fix electric_potential lbc linear 0 0 0 10 0 0 0 0
ATC: created function : 0 + 10(x-0)+0(y-0)+0(z-0)
fix_modify AtC fix electric_potential top linear 0 0 0 $E 0 0 0 0
fix_modify AtC fix electric_potential top linear 0 0 0 10 0 0 0 0
ATC: created function : 0 + 10(x-0)+0(y-0)+0(z-0)
fix_modify AtC fix electric_potential bot linear 0 0 0 $E 0 0 0 0
fix_modify AtC fix electric_potential bot linear 0 0 0 10 0 0 0 0
ATC: created function : 0 + 10(x-0)+0(y-0)+0(z-0)
run 1000
Setting up run ...
ATC: WARNING: material: [cnt] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 53.947 Mbytes
Step CPU TotEng KinEng
0 0 -7315.3918 4.2386027e-06
- 1 0.31967092 -7315.3918 8.3975109e-06
- 2 0.57961583 -7315.3918 1.4120368e-05
- 3 0.73119783 -7315.3918 2.1378868e-05
- 4 0.77118993 -7315.3918 3.0172501e-05
- 5 0.81124997 -7315.3918 4.0500585e-05
- 6 0.85121584 -7315.3918 5.2362272e-05
- 7 0.89118791 -7315.3918 6.5756548e-05
- 8 0.93097782 -7315.3918 8.0682245e-05
- 9 0.97063279 -7315.3918 9.713804e-05
- 10 1.0182109 -7315.3918 0.00011512246
- 11 1.0585999 -7315.3918 0.00013463391
- 12 1.0980539 -7315.3918 0.00015567063
- 13 1.13748 -7315.3918 0.00017823074
- 14 1.177192 -7315.3918 0.00020231225
- 15 1.2165098 -7315.3918 0.00022791303
- 16 1.2559309 -7315.3918 0.00025503085
- 17 1.2955098 -7315.3918 0.00028366338
- 18 1.334971 -7315.3918 0.00031380817
- 19 1.3744769 -7315.3918 0.0003454627
- 20 1.4319949 -7315.3918 0.00037862437
- 21 1.4716878 -7315.3918 0.0004132905
- 22 1.5113468 -7315.3918 0.00044945835
- 23 1.67961 -7315.3918 0.00048712513
- 24 1.718936 -7315.3918 0.00052628798
- 25 1.75843 -7315.3918 0.00056694404
- 26 1.7989509 -7315.3918 0.00060909036
- 27 1.930331 -7315.3918 0.00065272401
- 28 1.9778998 -7315.3918 0.00069784199
- 29 2.0358789 -7315.3917 0.00074444131
- 30 2.0961409 -7315.3917 0.00079251893
- 31 2.3385279 -7315.3917 0.00084207182
- 32 2.636704 -7315.3917 0.00089309691
- 33 2.714483 -7315.3917 0.00094559113
- 34 2.9397018 -7315.3917 0.00099955142
- 35 3.2066698 -7315.3917 0.0010549747
- 36 3.2912428 -7315.3917 0.0011118579
- 37 3.4499469 -7315.3917 0.0011701978
- 38 3.609957 -7315.3917 0.0012299916
- 39 3.694387 -7315.3917 0.001291236
- 40 3.774771 -7315.3917 0.001353928
- 41 3.814693 -7315.3917 0.0014180645
- 42 3.8544669 -7315.3917 0.0014836425
- 43 3.899441 -7315.3917 0.0015506588
- 44 3.9393668 -7315.3917 0.0016191104
- 45 4.1302609 -7315.3917 0.0016889941
- 46 4.2312019 -7315.3917 0.0017603069
- 47 4.3896489 -7315.3917 0.0018330457
- 48 4.4500258 -7315.3917 0.0019072073
- 49 4.5496428 -7315.3916 0.0019827887
- 50 5.0796728 -7315.3916 0.0020597866
- 51 5.3996999 -7315.3916 0.002138198
- 52 5.7496638 -7315.3916 0.0022180196
- 53 6.0696678 -7315.3916 0.0022992484
- 54 6.1538389 -7315.3916 0.0023818813
- 55 6.1931789 -7315.3916 0.0024659149
- 56 6.232445 -7315.3916 0.0025513463
- 57 6.271626 -7315.3916 0.0026381721
- 58 6.3107619 -7315.3916 0.0027263893
- 59 6.350004 -7315.3916 0.0028159946
- 60 6.3956769 -7315.3916 0.0029069848
- 61 6.4278479 -7315.3916 0.0029993569
- 62 6.468123 -7315.3916 0.0030931075
- 63 6.5084469 -7315.3915 0.0031882335
- 64 6.5487828 -7315.3915 0.0032847318
- 65 6.588315 -7315.3915 0.0033825991
- 66 6.628861 -7315.3915 0.0034818323
- 67 6.6681879 -7315.3915 0.0035824284
- 68 6.7083828 -7315.3915 0.0036843841
- 69 6.7478988 -7315.3915 0.0037876964
- 70 6.8052649 -7315.3915 0.0038923623
- 71 6.8364089 -7315.3915 0.0039983787
- 72 6.8688459 -7315.3915 0.0041057427
- 73 6.9038498 -7315.3915 0.0042144511
- 74 6.9437559 -7315.3915 0.0043245012
- 75 6.983357 -7315.3915 0.0044358899
- 76 7.0233488 -7315.3914 0.0045486143
- 77 7.0634668 -7315.3914 0.0046626717
- 78 7.1032989 -7315.3914 0.0047780591
- 79 7.143338 -7315.3914 0.0048947738
- 80 7.2009349 -7315.3914 0.0050128131
- 81 7.2304518 -7315.3914 0.005132174
- 82 7.260041 -7315.3914 0.0052528541
- 83 7.300066 -7315.3914 0.0053748505
- 84 7.3296208 -7315.3914 0.0054981606
- 85 7.3695228 -7315.3914 0.0056227818
- 86 7.409111 -7315.3913 0.0057487114
- 87 7.4488299 -7315.3913 0.0058759467
- 88 7.4784439 -7315.3913 0.0060044851
- 89 7.498029 -7315.3913 0.006134324
- 90 7.5257208 -7315.3913 0.0062654606
- 91 7.5550458 -7315.3913 0.0063978923
- 92 7.5941949 -7315.3913 0.0065316164
- 93 7.6136239 -7315.3913 0.0066666301
- 94 7.6330369 -7315.3913 0.0068029305
- 95 7.652329 -7315.3913 0.006940515
- 96 7.671556 -7315.3912 0.0070793805
- 97 7.6908948 -7315.3912 0.0072195241
- 98 7.7102349 -7315.3912 0.0073609428
- 99 7.7295499 -7315.3912 0.0075036336
- 100 7.8130169 -7315.3912 0.0076475932
- 101 7.8324709 -7315.3912 0.0077928183
- 102 7.852021 -7315.3912 0.0079393056
- 103 7.871295 -7315.3912 0.0080870517
- 104 7.9005089 -7315.3912 0.0082360529
- 105 7.939764 -7315.3911 0.0083863055
- 106 7.9591198 -7315.3911 0.0085378058
- 107 7.9786189 -7315.3911 0.0086905498
- 108 7.998369 -7315.3911 0.0088445335
- 109 8.1596448 -7315.3911 0.0089997527
- 110 8.2999489 -7315.3911 0.0091562032
- 111 8.4596839 -7315.3911 0.0093138804
- 112 8.7796738 -7315.3911 0.00947278
- 113 8.979708 -7315.3911 0.0096328972
- 114 9.179704 -7315.391 0.0097942273
- 115 9.3797159 -7315.391 0.0099567653
- 116 9.5797029 -7315.391 0.010120506
- 117 9.7797039 -7315.391 0.010285445
- 118 10.139666 -7315.391 0.010451576
- 119 10.48775 -7315.391 0.010618895
- 120 10.909639 -7315.391 0.010787395
- 121 11.209625 -7315.391 0.010957072
- 122 11.449644 -7315.3909 0.011127918
- 123 11.689628 -7315.3909 0.01129993
- 124 11.939698 -7315.3909 0.0114731
- 125 12.139709 -7315.3909 0.011647424
- 126 12.3397 -7315.3909 0.011822894
- 127 12.53975 -7315.3909 0.011999506
- 128 12.739698 -7315.3909 0.012177252
- 129 12.959952 -7315.3908 0.012356127
- 130 13.199949 -7315.3908 0.012536125
- 131 13.40965 -7315.3908 0.012717239
- 132 13.649624 -7315.3908 0.012899462
- 133 13.859712 -7315.3908 0.01308279
- 134 14.059702 -7315.3908 0.013267215
- 135 14.259705 -7315.3908 0.01345273
- 136 14.569647 -7315.3908 0.01363933
- 137 14.800963 -7315.3907 0.013827009
- 138 15.186622 -7315.3907 0.014015759
- 139 15.626654 -7315.3907 0.014205574
- 140 15.926937 -7315.3907 0.014396449
- 141 16.141167 -7315.3907 0.014588376
- 142 16.384635 -7315.3907 0.014781349
- 143 16.829641 -7315.3907 0.014975362
- 144 17.14671 -7315.3906 0.015170409
- 145 17.339733 -7315.3906 0.015366482
- 146 17.579739 -7315.3906 0.015563577
- 147 17.779642 -7315.3906 0.015761685
- 148 17.843004 -7315.3906 0.015960802
- 149 17.882239 -7315.3906 0.01616092
- 150 17.967242 -7315.3905 0.016362034
- 151 17.99843 -7315.3905 0.016564137
- 152 18.03849 -7315.3905 0.016767223
- 153 18.077649 -7315.3905 0.016971286
- 154 18.107811 -7315.3905 0.017176319
- 155 18.126918 -7315.3905 0.017382317
- 156 18.146051 -7315.3905 0.017589273
- 157 18.165207 -7315.3904 0.01779718
- 158 18.184314 -7315.3904 0.018006034
- 159 18.203415 -7315.3904 0.018215827
- 160 18.230428 -7315.3904 0.018426554
- 161 18.249539 -7315.3904 0.018638208
- 162 18.268613 -7315.3904 0.018850784
- 163 18.287874 -7315.3903 0.019064276
- 164 18.306925 -7315.3903 0.019278677
- 165 18.326238 -7315.3903 0.019493981
- 166 18.399314 -7315.3903 0.019710184
- 167 18.418596 -7315.3903 0.019927278
- 168 18.437743 -7315.3903 0.020145259
- 169 18.456929 -7315.3902 0.02036412
- 170 18.484008 -7315.3902 0.020583855
- 171 18.503426 -7315.3902 0.02080446
- 172 18.522622 -7315.3902 0.021025928
- 173 18.541824 -7315.3902 0.021248253
- 174 18.561048 -7315.3902 0.021471431
- 175 18.580206 -7315.3901 0.021695456
- 176 18.599349 -7315.3901 0.021920323
- 177 18.618534 -7315.3901 0.022146026
- 178 18.638064 -7315.3901 0.022372559
- 179 18.657386 -7315.3901 0.022599919
- 180 18.684453 -7315.3901 0.0228281
- 181 18.724044 -7315.39 0.023057097
- 182 18.773259 -7315.39 0.023286904
- 183 18.832546 -7315.39 0.023517518
- 184 18.971291 -7315.39 0.023748934
- 185 18.997376 -7315.39 0.023981146
- 186 19.016538 -7315.3899 0.024214151
- 187 19.035734 -7315.3899 0.024447944
- 188 19.054972 -7315.3899 0.024682521
- 189 19.074098 -7315.3899 0.024917876
- 190 19.101161 -7315.3899 0.025154007
- 191 19.12035 -7315.3898 0.025390909
- 192 19.13971 -7315.3898 0.025628577
- 193 19.159221 -7315.3898 0.025867009
- 194 19.178876 -7315.3898 0.026106199
- 195 19.198877 -7315.3898 0.026346144
- 196 19.218139 -7315.3897 0.026586841
- 197 19.237305 -7315.3897 0.026828285
- 198 19.256529 -7315.3897 0.027070473
- 199 19.275746 -7315.3897 0.0273134
- 200 19.320708 -7315.3897 0.027557065
- 201 19.340115 -7315.3896 0.027801461
- 202 19.35955 -7315.3896 0.028046587
- 203 19.37881 -7315.3896 0.028292439
- 204 19.397985 -7315.3896 0.028539012
- 205 19.417365 -7315.3896 0.028786304
- 206 19.436589 -7315.3895 0.02903431
- 207 19.455744 -7315.3895 0.029283027
- 208 19.475087 -7315.3895 0.029532451
- 209 19.49439 -7315.3895 0.029782578
- 210 19.521502 -7315.3895 0.030033406
- 211 19.540793 -7315.3894 0.030284929
- 212 19.560032 -7315.3894 0.030537145
- 213 19.579251 -7315.3894 0.030790049
- 214 19.598373 -7315.3894 0.031043637
- 215 19.627613 -7315.3894 0.031297905
- 216 19.646909 -7315.3893 0.03155285
- 217 19.666108 -7315.3893 0.031808467
- 218 19.685288 -7315.3893 0.032064752
- 219 19.704805 -7315.3893 0.0323217
- 220 19.731995 -7315.3892 0.032579308
- 221 19.751148 -7315.3892 0.032837571
- 222 19.79389 -7315.3892 0.033096484
- 223 19.833547 -7315.3892 0.033356043
- 224 19.919784 -7315.3891 0.033616243
- 225 20.145626 -7315.3891 0.03387708
- 226 20.305699 -7315.3891 0.034138548
- 227 20.734641 -7315.3891 0.034400644
- 228 21.009673 -7315.3891 0.034663362
- 229 21.209665 -7315.389 0.034926696
- 230 21.489666 -7315.389 0.035190644
- 231 21.689671 -7315.389 0.035455198
- 232 21.889662 -7315.389 0.035720354
- 233 22.089666 -7315.3889 0.035986107
- 234 22.309621 -7315.3889 0.036252452
- 235 22.549627 -7315.3889 0.036519384
- 236 22.789619 -7315.3889 0.036786897
- 237 23.02962 -7315.3888 0.037054986
- 238 23.269627 -7315.3888 0.037323645
- 239 23.509621 -7315.3888 0.03759287
- 240 23.789619 -7315.3888 0.037862655
- 241 24.019911 -7315.3887 0.038132995
- 242 24.23991 -7315.3887 0.038403884
- 243 24.459904 -7315.3887 0.038675316
- 244 24.679905 -7315.3887 0.038947288
- 245 24.899904 -7315.3886 0.039219793
- 246 25.139919 -7315.3886 0.039492825
- 247 25.359907 -7315.3886 0.03976638
- 248 25.579905 -7315.3886 0.040040452
- 249 25.799898 -7315.3885 0.040315035
- 250 26.159932 -7315.3885 0.040590125
- 251 26.359918 -7315.3885 0.040865715
- 252 26.579905 -7315.3885 0.041141802
- 253 26.809625 -7315.3884 0.041418378
- 254 27.049629 -7315.3884 0.041695439
- 255 27.289636 -7315.3884 0.04197298
- 256 27.529616 -7315.3883 0.042250995
- 257 27.769632 -7315.3883 0.042529479
- 258 28.009624 -7315.3883 0.042808427
- 259 28.219912 -7315.3883 0.043087833
- 260 28.479907 -7315.3882 0.043367692
- 261 28.699902 -7315.3882 0.043648
- 262 28.764929 -7315.3882 0.04392875
- 263 28.804936 -7315.3882 0.044209938
- 264 28.844235 -7315.3881 0.044491558
- 265 28.8837 -7315.3881 0.044773606
- 266 28.923408 -7315.3881 0.045056076
- 267 28.962609 -7315.388 0.045338964
- 268 28.981743 -7315.388 0.045622264
- 269 29.000846 -7315.388 0.04590597
- 270 29.028243 -7315.388 0.04619008
- 271 29.047423 -7315.3879 0.046474586
- 272 29.066805 -7315.3879 0.046759485
- 273 29.086481 -7315.3879 0.047044772
- 274 29.105688 -7315.3878 0.047330442
- 275 29.124818 -7315.3878 0.047616491
- 276 29.144036 -7315.3878 0.047902912
- 277 29.219292 -7315.3878 0.048189703
- 278 29.258471 -7315.3877 0.048476859
- 279 29.297567 -7315.3877 0.048764375
- 280 29.32458 -7315.3877 0.049052246
- 281 29.353759 -7315.3876 0.049340469
- 282 29.393124 -7315.3876 0.04962904
- 283 29.412232 -7315.3876 0.049917954
- 284 29.431323 -7315.3876 0.050207207
- 285 29.509683 -7315.3875 0.050496795
- 286 29.546047 -7315.3875 0.050786716
- 287 29.585332 -7315.3875 0.051076964
- 288 29.624653 -7315.3874 0.051367536
- 289 29.700685 -7315.3874 0.051658429
- 290 29.727867 -7315.3874 0.05194964
- 291 29.74726 -7315.3873 0.052241165
- 292 29.766538 -7315.3873 0.052533001
- 293 29.785752 -7315.3873 0.052825145
- 294 29.805015 -7315.3873 0.053117594
- 295 29.824485 -7315.3872 0.053410345
- 296 29.843717 -7315.3872 0.053703396
- 297 29.86304 -7315.3872 0.053996744
- 298 29.882525 -7315.3871 0.054290386
- 299 29.989663 -7315.3871 0.05458432
- 300 30.035728 -7315.3871 0.054878543
- 301 30.065163 -7315.387 0.055173054
- 302 30.104649 -7315.387 0.055467851
- 303 30.144015 -7315.387 0.05576293
- 304 30.1837 -7315.3869 0.056058291
- 305 30.223005 -7315.3869 0.056353931
- 306 30.262347 -7315.3869 0.056649849
- 307 30.281636 -7315.3868 0.056946042
- 308 30.300973 -7315.3868 0.057242509
- 309 30.320246 -7315.3868 0.057539248
- 310 30.347548 -7315.3868 0.057836257
- 311 30.36693 -7315.3867 0.058133536
- 312 30.386245 -7315.3867 0.058431082
- 313 30.405417 -7315.3867 0.058728893
- 314 30.42462 -7315.3866 0.059026969
- 315 30.444078 -7315.3866 0.059325307
- 316 30.46337 -7315.3866 0.059623906
- 317 30.609698 -7315.3865 0.059922765
- 318 30.656118 -7315.3865 0.060221881
- 319 30.736012 -7315.3865 0.060521253
- 320 30.793791 -7315.3864 0.06082088
- 321 31.02316 -7315.3864 0.06112076
- 322 31.139724 -7315.3864 0.061420891
- 323 31.406624 -7315.3863 0.061721272
- 324 31.596727 -7315.3863 0.0620219
- 325 31.84973 -7315.3863 0.062322774
- 326 32.18964 -7315.3862 0.062623892
- 327 32.270383 -7315.3862 0.062925252
- 328 32.389704 -7315.3862 0.063226852
- 329 32.609712 -7315.3861 0.06352869
- 330 32.793293 -7315.3861 0.063830765
- 331 32.98971 -7315.3861 0.064133073
- 332 33.110373 -7315.386 0.064435613
- 333 33.198607 -7315.386 0.064738383
- 334 33.369706 -7315.386 0.06504138
- 335 33.577704 -7315.3859 0.065344602
- 336 33.790644 -7315.3859 0.065648047
- 337 33.833484 -7315.3859 0.065951711
- 338 34.089636 -7315.3858 0.066255594
- 339 34.389635 -7315.3858 0.066559692
- 340 34.686619 -7315.3858 0.066864002
- 341 34.919727 -7315.3857 0.067168523
- 342 35.199723 -7315.3857 0.067473251
- 343 35.470033 -7315.3857 0.067778184
- 344 35.539637 -7315.3856 0.068083319
- 345 35.789718 -7315.3856 0.068388653
- 346 36.030664 -7315.3856 0.068694184
- 347 36.276654 -7315.3855 0.068999909
- 348 36.41506 -7315.3855 0.069305825
- 349 36.55661 -7315.3855 0.069611929
- 350 37.037623 -7315.3854 0.069918218
- 351 37.350065 -7315.3854 0.070224689
- 352 37.395187 -7315.3854 0.070531339
- 353 37.709698 -7315.3853 0.070838166
- 354 37.91773 -7315.3853 0.071145166
- 355 38.073934 -7315.3853 0.071452336
- 356 38.236745 -7315.3852 0.071759674
- 357 38.539629 -7315.3852 0.072067176
- 358 38.614048 -7315.3851 0.072374839
- 359 38.957626 -7315.3851 0.072682659
- 360 39.134693 -7315.3851 0.072990635
- 361 39.316641 -7315.385 0.073298762
- 362 39.589719 -7315.385 0.073607038
- 363 39.899654 -7315.385 0.073915459
- 364 39.950069 -7315.3849 0.074224022
- 365 39.990048 -7315.3849 0.074532723
- 366 40.129723 -7315.3849 0.07484156
- 367 40.389621 -7315.3848 0.07515053
- 368 40.589629 -7315.3848 0.075459628
- 369 40.62559 -7315.3848 0.075768851
- 370 40.683151 -7315.3847 0.076078197
- 371 40.702499 -7315.3847 0.076387662
- 372 40.722048 -7315.3846 0.076697242
- 373 40.741258 -7315.3846 0.077006935
- 374 40.760596 -7315.3846 0.077316736
- 375 40.779924 -7315.3845 0.077626643
- 376 40.816819 -7315.3845 0.077936651
- 377 40.896221 -7315.3845 0.078246759
- 378 40.926039 -7315.3844 0.078556961
- 379 40.945766 -7315.3844 0.078867256
- 380 40.972914 -7315.3844 0.079177639
- 381 41.002618 -7315.3843 0.079488107
- 382 41.022402 -7315.3843 0.079798658
- 383 41.042079 -7315.3842 0.080109287
- 384 41.061444 -7315.3842 0.080419992
- 385 41.080729 -7315.3842 0.080730769
- 386 41.099984 -7315.3841 0.081041616
- 387 41.129264 -7315.3841 0.081352529
- 388 41.148534 -7315.3841 0.081663506
- 389 41.167757 -7315.384 0.081974543
- 390 41.20001 -7315.384 0.082285637
- 391 41.219368 -7315.384 0.082596786
- 392 41.238667 -7315.3839 0.082907988
- 393 41.278212 -7315.3839 0.083219239
- 394 41.307794 -7315.3838 0.083530536
- 395 41.326955 -7315.3838 0.083841879
- 396 41.366373 -7315.3838 0.084153263
- 397 41.385798 -7315.3837 0.084464687
- 398 41.404995 -7315.3837 0.084776149
- 399 41.424361 -7315.3837 0.085087647
- 400 41.469504 -7315.3836 0.085399178
- 401 41.489087 -7315.3836 0.085710742
- 402 41.508383 -7315.3835 0.086022335
- 403 41.537814 -7315.3835 0.086333957
- 404 41.583267 -7315.3835 0.086645606
- 405 41.623006 -7315.3834 0.08695728
- 406 41.652587 -7315.3834 0.087268979
- 407 41.671895 -7315.3833 0.0875807
- 408 41.711325 -7315.3833 0.087892443
- 409 41.826703 -7315.3833 0.088204207
- 410 41.883584 -7315.3832 0.08851599
- 411 41.923076 -7315.3832 0.088827792
- 412 41.962238 -7315.3832 0.089139611
- 413 42.001452 -7315.3831 0.089451448
- 414 42.040929 -7315.3831 0.089763301
- 415 42.080273 -7315.383 0.09007517
- 416 42.127296 -7315.383 0.090387053
- 417 42.292024 -7315.383 0.090698951
- 418 42.328261 -7315.3829 0.091010863
- 419 42.358792 -7315.3829 0.091322789
- 420 42.386184 -7315.3828 0.091634727
- 421 42.40557 -7315.3828 0.091946678
- 422 42.445204 -7315.3828 0.092258641
- 423 42.649716 -7315.3827 0.092570616
- 424 42.679214 -7315.3827 0.092882602
- 425 42.718487 -7315.3826 0.093194598
- 426 42.757941 -7315.3826 0.093506606
- 427 42.79756 -7315.3826 0.093818623
- 428 42.838589 -7315.3825 0.09413065
- 429 42.878422 -7315.3825 0.094442686
- 430 42.935864 -7315.3824 0.094754731
- 431 42.975254 -7315.3824 0.095066783
- 432 43.199594 -7315.3824 0.095378844
- 433 43.496629 -7315.3823 0.095690911
- 434 43.737018 -7315.3823 0.096002985
- 435 44.009631 -7315.3822 0.096315065
- 436 44.151492 -7315.3822 0.09662715
- 437 44.191331 -7315.3822 0.09693924
- 438 44.231045 -7315.3821 0.097251333
- 439 44.270599 -7315.3821 0.097563429
- 440 44.549764 -7315.382 0.097875527
- 441 44.84976 -7315.382 0.098187627
- 442 45.071334 -7315.3819 0.098499727
- 443 45.136475 -7315.3819 0.098811826
- 444 45.376644 -7315.3819 0.099123923
- 445 45.416358 -7315.3818 0.099436018
- 446 45.45623 -7315.3818 0.099748109
- 447 45.599597 -7315.3817 0.1000602
- 448 45.896647 -7315.3817 0.10037228
- 449 46.050048 -7315.3817 0.10068435
- 450 46.24962 -7315.3816 0.10099641
- 451 46.374444 -7315.3816 0.10130847
- 452 46.549614 -7315.3815 0.10162051
- 453 46.757012 -7315.3815 0.10193254
- 454 46.878116 -7315.3814 0.10224456
- 455 46.918691 -7315.3814 0.10255656
- 456 46.97136 -7315.3814 0.10286855
- 457 47.01169 -7315.3813 0.10318052
- 458 47.051325 -7315.3813 0.10349247
- 459 47.093829 -7315.3812 0.10380439
- 460 47.409612 -7315.3812 0.1041163
- 461 47.669624 -7315.3811 0.10442818
- 462 47.949601 -7315.3811 0.10474003
- 463 48.239601 -7315.3811 0.10505185
- 464 48.509613 -7315.381 0.10536365
- 465 48.769604 -7315.381 0.10567541
- 466 49.019778 -7315.3809 0.10598714
- 467 49.269609 -7315.3809 0.10629884
- 468 49.509617 -7315.3808 0.1066105
- 469 49.749612 -7315.3808 0.10692211
- 470 50.129612 -7315.3807 0.10723369
- 471 50.409613 -7315.3807 0.10754522
- 472 50.7096 -7315.3807 0.10785671
- 473 50.939617 -7315.3806 0.10816815
- 474 51.169607 -7315.3806 0.10847954
- 475 51.419606 -7315.3805 0.10879088
- 476 51.6596 -7315.3805 0.10910216
- 477 51.899598 -7315.3804 0.10941339
- 478 52.119601 -7315.3804 0.10972455
- 479 52.320007 -7315.3803 0.11003566
- 480 52.367259 -7315.3803 0.11034669
- 481 52.454375 -7315.3802 0.11065767
- 482 52.570992 -7315.3802 0.11096857
- 483 52.590419 -7315.3802 0.1112794
- 484 52.609757 -7315.3801 0.11159016
- 485 52.629046 -7315.3801 0.11190084
- 486 52.648239 -7315.38 0.11221144
- 487 52.677864 -7315.38 0.11252195
- 488 52.717372 -7315.3799 0.11283238
- 489 52.78334 -7315.3799 0.11314273
- 490 52.849096 -7315.3798 0.11345298
- 491 52.888449 -7315.3798 0.11376314
- 492 52.907668 -7315.3797 0.11407321
- 493 52.926853 -7315.3797 0.11438317
- 494 52.956355 -7315.3797 0.11469304
- 495 52.975723 -7315.3796 0.1150028
- 496 53.015788 -7315.3796 0.11531246
- 497 53.055174 -7315.3795 0.11562201
- 498 53.094083 -7315.3795 0.11593145
- 499 53.123943 -7315.3794 0.11624077
- 500 53.189066 -7315.3794 0.11654998
- 501 53.208668 -7315.3793 0.11685908
- 502 53.248271 -7315.3793 0.11716805
- 503 53.285655 -7315.3792 0.1174769
- 504 53.325013 -7315.3792 0.11778563
- 505 53.354476 -7315.3791 0.11809424
- 506 53.373839 -7315.3791 0.11840272
- 507 53.403349 -7315.379 0.11871107
- 508 53.422616 -7315.379 0.11901929
- 509 53.46194 -7315.379 0.11932738
- 510 53.499281 -7315.3789 0.11963533
- 511 53.518761 -7315.3789 0.11994315
- 512 53.537911 -7315.3788 0.12025084
- 513 53.577268 -7315.3788 0.12055839
- 514 53.616799 -7315.3787 0.1208658
- 515 53.656333 -7315.3787 0.12117307
- 516 53.685871 -7315.3786 0.1214802
- 517 53.725091 -7315.3786 0.12178719
- 518 53.764421 -7315.3785 0.12209404
- 519 53.803573 -7315.3785 0.12240075
- 520 53.830649 -7315.3784 0.12270732
- 521 53.849772 -7315.3784 0.12301375
- 522 53.868925 -7315.3783 0.12332003
- 523 53.888083 -7315.3783 0.12362616
- 524 53.989706 -7315.3782 0.12393216
- 525 54.009203 -7315.3782 0.124238
- 526 54.02841 -7315.3781 0.12454371
- 527 54.05794 -7315.3781 0.12484927
- 528 54.097468 -7315.378 0.12515468
- 529 54.127244 -7315.378 0.12545995
- 530 54.154318 -7315.3779 0.12576507
- 531 54.173615 -7315.3779 0.12607005
- 532 54.192945 -7315.3779 0.12637489
- 533 54.212329 -7315.3778 0.12667957
- 534 54.241903 -7315.3778 0.12698412
- 535 54.28139 -7315.3777 0.12728851
- 536 54.321038 -7315.3777 0.12759276
- 537 54.360826 -7315.3776 0.12789687
- 538 54.400339 -7315.3776 0.12820083
- 539 54.439916 -7315.3775 0.12850464
- 540 54.516057 -7315.3775 0.12880831
- 541 54.690668 -7315.3774 0.12911183
- 542 54.859619 -7315.3774 0.1294152
- 543 55.079631 -7315.3773 0.12971843
- 544 55.319619 -7315.3773 0.13002151
- 545 55.559627 -7315.3772 0.13032444
- 546 55.799626 -7315.3772 0.13062723
- 547 56.05975 -7315.3771 0.13092987
- 548 56.339761 -7315.3771 0.13123236
- 549 56.61977 -7315.377 0.1315347
- 550 57.119632 -7315.377 0.1318369
- 551 57.329751 -7315.3769 0.13213894
- 552 57.579623 -7315.3769 0.13244084
- 553 57.819622 -7315.3768 0.13274258
- 554 58.069683 -7315.3768 0.13304418
- 555 58.308255 -7315.3767 0.13334562
- 556 58.556672 -7315.3767 0.13364692
- 557 58.886739 -7315.3766 0.13394806
- 558 59.466623 -7315.3766 0.13424905
- 559 59.916743 -7315.3765 0.13454988
- 560 60.409766 -7315.3765 0.13485056
- 561 60.609967 -7315.3764 0.13515109
- 562 60.828719 -7315.3764 0.13545146
- 563 61.089665 -7315.3763 0.13575167
- 564 61.369677 -7315.3763 0.13605173
- 565 61.629684 -7315.3762 0.13635163
- 566 61.889734 -7315.3762 0.13665136
- 567 61.919157 -7315.3761 0.13695094
- 568 61.958793 -7315.3761 0.13725036
- 569 61.998517 -7315.376 0.13754961
- 570 62.056512 -7315.376 0.1378487
- 571 62.098134 -7315.3759 0.13814762
- 572 62.138718 -7315.3759 0.13844638
- 573 62.178494 -7315.3758 0.13874497
- 574 62.218244 -7315.3758 0.13904339
- 575 62.258858 -7315.3757 0.13934163
- 576 62.298625 -7315.3757 0.13963971
- 577 62.338378 -7315.3756 0.13993761
- 578 62.379238 -7315.3756 0.14023534
- 579 62.418917 -7315.3755 0.14053288
- 580 62.476385 -7315.3755 0.14083025
- 581 62.739654 -7315.3754 0.14112743
- 582 62.832311 -7315.3754 0.14142443
- 583 62.872015 -7315.3753 0.14172125
- 584 62.911656 -7315.3753 0.14201787
- 585 62.951427 -7315.3752 0.14231431
- 586 62.991264 -7315.3752 0.14261055
- 587 63.031277 -7315.3751 0.1429066
- 588 63.071053 -7315.3751 0.14320245
- 589 63.110667 -7315.375 0.1434981
- 590 63.158436 -7315.375 0.14379354
- 591 63.210103 -7315.3749 0.14408878
- 592 63.25009 -7315.3749 0.14438381
- 593 63.279535 -7315.3748 0.14467863
- 594 63.519632 -7315.3748 0.14497324
- 595 63.759628 -7315.3747 0.14526763
- 596 63.930758 -7315.3747 0.1455618
- 597 63.970369 -7315.3746 0.14585575
- 598 64.010089 -7315.3746 0.14614947
- 599 64.039374 -7315.3745 0.14644296
- 600 64.60976 -7315.3745 0.14673623
- 601 64.810922 -7315.3744 0.14702925
- 602 64.850435 -7315.3744 0.14732204
- 603 64.890004 -7315.3743 0.1476146
- 604 64.930371 -7315.3743 0.1479069
- 605 65.010373 -7315.3742 0.14819897
- 606 65.050376 -7315.3742 0.14849078
- 607 65.090334 -7315.3741 0.14878234
- 608 65.130064 -7315.3741 0.14907365
- 609 65.15958 -7315.374 0.1493647
- 610 65.217497 -7315.374 0.14965549
- 611 65.256805 -7315.3739 0.14994602
- 612 65.295939 -7315.3739 0.15023629
- 613 65.335302 -7315.3738 0.15052629
- 614 65.374859 -7315.3738 0.15081602
- 615 65.414263 -7315.3737 0.15110547
- 616 65.453948 -7315.3736 0.15139465
- 617 65.4933 -7315.3736 0.15168356
- 618 65.513502 -7315.3735 0.15197219
- 619 65.532697 -7315.3735 0.15226053
- 620 65.569867 -7315.3734 0.15254859
- 621 65.599034 -7315.3734 0.15283637
- 622 65.638434 -7315.3733 0.15312386
- 623 65.658748 -7315.3733 0.15341107
- 624 65.677952 -7315.3732 0.15369798
- 625 65.697062 -7315.3732 0.1539846
- 626 65.71651 -7315.3731 0.15427093
- 627 65.735698 -7315.3731 0.15455697
- 628 65.84971 -7315.373 0.1548427
- 629 65.976723 -7315.373 0.15512814
- 630 66.01176 -7315.3729 0.15541328
- 631 66.031015 -7315.3729 0.15569812
- 632 66.050277 -7315.3728 0.15598266
- 633 66.069531 -7315.3728 0.1562669
- 634 66.089779 -7315.3727 0.15655083
- 635 66.109155 -7315.3727 0.15683446
- 636 66.128395 -7315.3726 0.15711778
- 637 66.157722 -7315.3726 0.1574008
- 638 66.177032 -7315.3725 0.1576835
- 639 66.196729 -7315.3725 0.1579659
- 640 66.223856 -7315.3724 0.15824799
- 641 66.243114 -7315.3724 0.15852977
- 642 66.262391 -7315.3723 0.15881123
- 643 66.281722 -7315.3722 0.15909238
- 644 66.30097 -7315.3722 0.15937322
- 645 66.32037 -7315.3721 0.15965375
- 646 66.339599 -7315.3721 0.15993396
- 647 66.358844 -7315.372 0.16021385
- 648 66.378217 -7315.372 0.16049342
- 649 66.397355 -7315.3719 0.16077268
- 650 66.44247 -7315.3719 0.16105162
- 651 66.461839 -7315.3718 0.16133024
- 652 66.481334 -7315.3718 0.16160854
- 653 66.500554 -7315.3717 0.16188651
- 654 66.519861 -7315.3717 0.16216417
- 655 66.539149 -7315.3716 0.1624415
- 656 66.558411 -7315.3716 0.16271851
- 657 66.577616 -7315.3715 0.16299519
- 658 66.596899 -7315.3715 0.16327155
- 659 66.616134 -7315.3714 0.16354758
- 660 66.643398 -7315.3713 0.16382329
- 661 66.662725 -7315.3713 0.16409866
- 662 66.681985 -7315.3712 0.16437371
- 663 66.701313 -7315.3712 0.16464842
- 664 66.7205 -7315.3711 0.16492281
- 665 66.739962 -7315.3711 0.16519686
- 666 66.759254 -7315.371 0.16547058
- 667 66.778521 -7315.371 0.16574397
- 668 66.798055 -7315.3709 0.16601702
- 669 66.880773 -7315.3709 0.16628974
- 670 66.988635 -7315.3708 0.16656212
- 671 67.083716 -7315.3708 0.16683416
- 672 67.12347 -7315.3707 0.16710586
- 673 67.163462 -7315.3706 0.16737722
- 674 67.20352 -7315.3706 0.16764824
- 675 67.261688 -7315.3705 0.16791891
- 676 67.47705 -7315.3705 0.16818925
- 677 67.759623 -7315.3704 0.16845923
- 678 68.069602 -7315.3704 0.16872887
- 679 68.31962 -7315.3703 0.16899816
- 680 68.629636 -7315.3703 0.1692671
- 681 68.909623 -7315.3702 0.16953569
- 682 69.1896 -7315.3702 0.16980393
- 683 69.457064 -7315.3701 0.17007181
- 684 69.719621 -7315.37 0.17033933
- 685 70.009652 -7315.37 0.17060649
- 686 70.269623 -7315.3699 0.1708733
- 687 70.536735 -7315.3699 0.17113974
- 688 70.779644 -7315.3698 0.17140581
- 689 71.049619 -7315.3698 0.17167152
- 690 71.389603 -7315.3697 0.17193686
- 691 71.676838 -7315.3697 0.17220183
- 692 71.919831 -7315.3696 0.17246642
- 693 72.206827 -7315.3696 0.17273064
- 694 72.499854 -7315.3695 0.17299447
- 695 72.776826 -7315.3694 0.17325793
- 696 73.029642 -7315.3694 0.173521
- 697 73.3096 -7315.3693 0.17378368
- 698 73.549644 -7315.3693 0.17404597
- 699 73.828631 -7315.3692 0.17430787
- 700 74.399612 -7315.3692 0.17456936
- 701 74.699604 -7315.3691 0.17483046
- 702 74.959844 -7315.3691 0.17509116
- 703 75.239843 -7315.369 0.17535145
- 704 75.499891 -7315.3689 0.17561133
- 705 75.540213 -7315.3689 0.1758708
- 706 75.569614 -7315.3688 0.17612985
- 707 75.609552 -7315.3688 0.17638849
- 708 75.649182 -7315.3687 0.1766467
- 709 75.688872 -7315.3687 0.17690448
- 710 75.75457 -7315.3686 0.17716183
- 711 75.794032 -7315.3686 0.17741876
- 712 75.949805 -7315.3685 0.17767524
- 713 76.08433 -7315.3684 0.17793129
- 714 76.123803 -7315.3684 0.17818689
- 715 76.163185 -7315.3683 0.17844205
- 716 76.202759 -7315.3683 0.17869675
- 717 76.242378 -7315.3682 0.17895101
- 718 76.27204 -7315.3682 0.17920481
- 719 76.291297 -7315.3681 0.17945815
- 720 76.318514 -7315.368 0.17971103
- 721 76.357811 -7315.368 0.17996344
- 722 76.398259 -7315.3679 0.18021538
- 723 76.438011 -7315.3679 0.18046686
- 724 76.477701 -7315.3678 0.18071786
- 725 76.543826 -7315.3678 0.18096838
- 726 76.583139 -7315.3677 0.18121842
- 727 76.602394 -7315.3676 0.18146799
- 728 76.631561 -7315.3676 0.18171706
- 729 76.670888 -7315.3675 0.18196565
- 730 76.718327 -7315.3675 0.18221375
- 731 76.782993 -7315.3674 0.18246136
- 732 76.822309 -7315.3674 0.18270847
- 733 76.861716 -7315.3673 0.18295508
- 734 76.901139 -7315.3672 0.1832012
- 735 76.920377 -7315.3672 0.18344681
- 736 76.949688 -7315.3671 0.18369192
- 737 76.978977 -7315.3671 0.18393653
- 738 76.998118 -7315.367 0.18418062
- 739 77.017284 -7315.367 0.18442421
- 740 77.159664 -7315.3669 0.18466728
- 741 77.236108 -7315.3669 0.18490984
- 742 77.275695 -7315.3668 0.18515188
- 743 77.315086 -7315.3667 0.18539341
- 744 77.354452 -7315.3667 0.18563442
- 745 77.37371 -7315.3666 0.1858749
- 746 77.40273 -7315.3666 0.18611487
- 747 77.441943 -7315.3665 0.1863543
- 748 77.481199 -7315.3664 0.18659321
- 749 77.520389 -7315.3664 0.1868316
- 750 77.565475 -7315.3663 0.18706945
- 751 77.603646 -7315.3663 0.18730677
- 752 77.622943 -7315.3662 0.18754356
- 753 77.642378 -7315.3662 0.18777982
- 754 77.661589 -7315.3661 0.18801554
- 755 77.680786 -7315.366 0.18825072
- 756 77.69993 -7315.366 0.18848536
- 757 77.72924 -7315.3659 0.18871946
- 758 77.768512 -7315.3659 0.18895302
- 759 77.807556 -7315.3658 0.18918604
- 760 77.856493 -7315.3658 0.18941851
- 761 77.913485 -7315.3657 0.18965044
- 762 77.95275 -7315.3656 0.18988182
- 763 77.992018 -7315.3656 0.19011264
- 764 78.031612 -7315.3655 0.19034292
- 765 78.110033 -7315.3655 0.19057265
- 766 78.13958 -7315.3654 0.19080182
- 767 78.190062 -7315.3654 0.19103044
- 768 78.230092 -7315.3653 0.1912585
- 769 78.270059 -7315.3652 0.19148601
- 770 78.318314 -7315.3652 0.19171296
- 771 78.358974 -7315.3651 0.19193934
- 772 78.398864 -7315.3651 0.19216517
- 773 78.4967 -7315.365 0.19239044
- 774 78.78005 -7315.365 0.19261514
- 775 79.020022 -7315.3649 0.19283927
- 776 79.29966 -7315.3648 0.19306284
- 777 79.579653 -7315.3648 0.19328584
- 778 79.828683 -7315.3647 0.19350828
- 779 80.079997 -7315.3647 0.19373014
- 780 80.439666 -7315.3646 0.19395143
- 781 80.689842 -7315.3645 0.19417215
- 782 80.909642 -7315.3645 0.19439229
- 783 81.109823 -7315.3644 0.19461186
- 784 81.329648 -7315.3644 0.19483084
- 785 81.52965 -7315.3643 0.19504925
- 786 81.709851 -7315.3643 0.19526708
- 787 81.92965 -7315.3642 0.19548433
- 788 82.169642 -7315.3641 0.19570099
- 789 82.369645 -7315.3641 0.19591706
- 790 82.729658 -7315.364 0.19613255
- 791 82.98965 -7315.364 0.19634745
- 792 83.269651 -7315.3639 0.19656175
- 793 83.556896 -7315.3639 0.19677546
- 794 83.629297 -7315.3638 0.19698857
- 795 83.682258 -7315.3637 0.19720108
- 796 83.949667 -7315.3637 0.19741299
- 797 84.229675 -7315.3636 0.1976243
- 798 84.48966 -7315.3636 0.197835
- 799 84.749652 -7315.3635 0.19804509
- 800 85.189689 -7315.3635 0.19825457
- 801 85.429696 -7315.3634 0.19846343
- 802 85.689693 -7315.3633 0.19867167
- 803 85.929691 -7315.3633 0.19887929
- 804 86.209659 -7315.3632 0.19908629
- 805 86.469654 -7315.3632 0.19929266
- 806 86.729657 -7315.3631 0.1994984
- 807 86.989625 -7315.3631 0.1997035
- 808 87.099765 -7315.363 0.19990796
- 809 87.139131 -7315.3629 0.20011178
- 810 87.196848 -7315.3629 0.20031496
- 811 87.238139 -7315.3628 0.20051749
- 812 87.278542 -7315.3628 0.20071936
- 813 87.31841 -7315.3627 0.20092058
- 814 87.347841 -7315.3626 0.20112113
- 815 87.366946 -7315.3626 0.20132103
- 816 87.386093 -7315.3625 0.20152025
- 817 87.405234 -7315.3625 0.2017188
- 818 87.4244 -7315.3624 0.20191667
- 819 87.443568 -7315.3624 0.20211386
- 820 87.490676 -7315.3623 0.20231036
- 821 87.529876 -7315.3622 0.20250618
- 822 87.559073 -7315.3622 0.2027013
- 823 87.612097 -7315.3621 0.20289573
- 824 87.789665 -7315.3621 0.20308946
- 825 87.899644 -7315.362 0.20328247
- 826 87.928968 -7315.362 0.20347478
- 827 87.948045 -7315.3619 0.20366638
- 828 87.988036 -7315.3618 0.20385726
- 829 88.028034 -7315.3618 0.20404742
- 830 88.08581 -7315.3617 0.20423685
- 831 88.125531 -7315.3617 0.20442555
- 832 88.154709 -7315.3616 0.20461352
- 833 88.193997 -7315.3616 0.20480075
- 834 88.233258 -7315.3615 0.20498725
- 835 88.272523 -7315.3614 0.205173
- 836 88.317599 -7315.3614 0.205358
- 837 88.399987 -7315.3613 0.20554225
- 838 88.489495 -7315.3613 0.20572574
- 839 88.529125 -7315.3612 0.20590848
- 840 88.587367 -7315.3612 0.20609045
- 841 88.626961 -7315.3611 0.20627166
- 842 88.666546 -7315.361 0.2064521
- 843 88.706301 -7315.361 0.20663177
- 844 88.746187 -7315.3609 0.20681066
- 845 88.765456 -7315.3609 0.20698878
- 846 88.78449 -7315.3608 0.20716611
- 847 88.803856 -7315.3608 0.20734266
- 848 88.823058 -7315.3607 0.20751842
- 849 88.842464 -7315.3606 0.20769339
- 850 88.887519 -7315.3606 0.20786757
- 851 88.906859 -7315.3605 0.20804095
- 852 88.926145 -7315.3605 0.20821353
- 853 88.945593 -7315.3604 0.2083853
- 854 88.964767 -7315.3604 0.20855628
- 855 88.984099 -7315.3603 0.20872644
- 856 89.00342 -7315.3602 0.20889579
- 857 89.022829 -7315.3602 0.20906433
- 858 89.041953 -7315.3601 0.20923205
- 859 89.061383 -7315.3601 0.20939895
- 860 89.088454 -7315.36 0.20956503
- 861 89.107607 -7315.3599 0.20973029
- 862 89.126872 -7315.3599 0.20989472
- 863 89.146377 -7315.3598 0.21005832
- 864 89.165538 -7315.3598 0.21022108
- 865 89.184898 -7315.3597 0.21038301
- 866 89.204106 -7315.3597 0.21054411
- 867 89.251565 -7315.3596 0.21070436
- 868 89.290937 -7315.3595 0.21086378
- 869 89.330265 -7315.3595 0.21102234
- 870 89.377166 -7315.3594 0.21118007
- 871 89.414822 -7315.3594 0.21133694
- 872 89.434192 -7315.3593 0.21149296
- 873 89.453368 -7315.3593 0.21164813
- 874 89.472454 -7315.3592 0.21180245
- 875 89.491571 -7315.3591 0.2119559
- 876 89.510674 -7315.3591 0.2121085
- 877 89.529877 -7315.359 0.21226024
- 878 89.548996 -7315.359 0.21241111
- 879 89.568152 -7315.3589 0.21256112
- 880 89.595252 -7315.3588 0.21271026
- 881 89.6147 -7315.3588 0.21285853
- 882 89.633863 -7315.3587 0.21300594
- 883 89.65326 -7315.3587 0.21315246
- 884 89.672522 -7315.3586 0.21329812
- 885 89.69152 -7315.3586 0.2134429
- 886 89.71067 -7315.3585 0.2135868
- 887 89.729722 -7315.3584 0.21372982
- 888 89.749039 -7315.3584 0.21387196
- 889 89.768394 -7315.3583 0.21401322
- 890 89.796225 -7315.3583 0.21415359
- 891 89.815677 -7315.3582 0.21429308
- 892 89.834924 -7315.3581 0.21443167
- 893 89.854321 -7315.3581 0.21456938
- 894 89.873438 -7315.358 0.2147062
- 895 89.892655 -7315.358 0.21484212
- 896 89.911887 -7315.3579 0.21497714
- 897 89.931091 -7315.3579 0.21511127
- 898 89.950479 -7315.3578 0.2152445
- 899 89.969675 -7315.3577 0.21537683
- 900 90.01472 -7315.3577 0.21550825
- 901 90.034006 -7315.3576 0.21563876
- 902 90.053225 -7315.3576 0.21576837
- 903 90.072657 -7315.3575 0.21589707
- 904 90.09191 -7315.3574 0.21602485
- 905 90.111182 -7315.3574 0.21615172
- 906 90.130546 -7315.3573 0.21627767
- 907 90.149817 -7315.3573 0.2164027
- 908 90.169087 -7315.3572 0.21652681
- 909 90.188325 -7315.3572 0.21664999
- 910 90.215488 -7315.3571 0.21677224
- 911 90.234608 -7315.357 0.21689356
- 912 90.253716 -7315.357 0.21701394
- 913 90.272855 -7315.3569 0.21713339
- 914 90.292016 -7315.3569 0.21725189
- 915 90.311284 -7315.3568 0.21736946
- 916 90.330461 -7315.3567 0.21748607
- 917 90.349858 -7315.3567 0.21760173
- 918 90.369039 -7315.3566 0.21771644
- 919 90.388491 -7315.3566 0.21783019
- 920 90.415598 -7315.3565 0.21794298
- 921 90.434815 -7315.3564 0.2180548
- 922 90.453916 -7315.3564 0.21816566
- 923 90.473219 -7315.3563 0.21827554
- 924 90.492413 -7315.3563 0.21838445
- 925 90.511521 -7315.3562 0.21849238
- 926 90.530687 -7315.3561 0.21859933
- 927 90.549802 -7315.3561 0.21870529
- 928 90.568943 -7315.356 0.21881025
- 929 90.588114 -7315.356 0.21891423
- 930 90.615756 -7315.3559 0.2190172
- 931 90.635455 -7315.3558 0.21911918
- 932 90.654547 -7315.3558 0.21922015
- 933 90.673662 -7315.3557 0.21932011
- 934 90.692953 -7315.3557 0.21941906
- 935 90.722492 -7315.3556 0.21951699
- 936 90.761659 -7315.3556 0.2196139
- 937 90.800898 -7315.3555 0.21970979
- 938 90.842105 -7315.3554 0.21980465
- 939 90.871451 -7315.3554 0.21989848
- 940 90.907429 -7315.3553 0.21999128
- 941 90.926583 -7315.3553 0.22008304
- 942 90.945759 -7315.3552 0.22017376
- 943 90.964868 -7315.3551 0.22026344
- 944 90.984007 -7315.3551 0.22035207
- 945 91.003376 -7315.355 0.22043965
- 946 91.022951 -7315.355 0.22052618
- 947 91.042125 -7315.3549 0.22061165
- 948 91.061277 -7315.3548 0.22069606
- 949 91.080497 -7315.3548 0.22077941
- 950 91.125824 -7315.3547 0.2208617
- 951 91.14565 -7315.3547 0.22094292
- 952 91.164916 -7315.3546 0.22102306
- 953 91.184149 -7315.3545 0.22110214
- 954 91.203654 -7315.3545 0.22118014
- 955 91.222991 -7315.3544 0.22125706
- 956 91.242287 -7315.3544 0.2213329
- 957 91.261574 -7315.3543 0.22140765
- 958 91.280943 -7315.3542 0.22148132
- 959 91.300466 -7315.3542 0.22155391
- 960 91.327772 -7315.3541 0.2216254
- 961 91.347251 -7315.3541 0.2216958
- 962 91.366764 -7315.354 0.2217651
- 963 91.386025 -7315.3539 0.22183331
- 964 91.405696 -7315.3539 0.22190042
- 965 91.444902 -7315.3538 0.22196643
- 966 91.484422 -7315.3538 0.22203133
- 967 91.523745 -7315.3537 0.22209513
- 968 91.542982 -7315.3536 0.22215783
- 969 91.562239 -7315.3536 0.22221941
- 970 91.589686 -7315.3535 0.22227989
- 971 91.608996 -7315.3535 0.22233925
- 972 91.628347 -7315.3534 0.2223975
- 973 91.64762 -7315.3533 0.22245464
- 974 91.687025 -7315.3533 0.22251066
- 975 91.726483 -7315.3532 0.22256556
- 976 91.764825 -7315.3532 0.22261935
- 977 91.794284 -7315.3531 0.22267201
- 978 91.813812 -7315.353 0.22272356
- 979 91.833194 -7315.353 0.22277398
- 980 91.86054 -7315.3529 0.22282328
- 981 91.879813 -7315.3529 0.22287146
- 982 91.909218 -7315.3528 0.22291852
- 983 91.928486 -7315.3527 0.22296445
- 984 91.947786 -7315.3527 0.22300925
- 985 91.967084 -7315.3526 0.22305293
- 986 91.986393 -7315.3526 0.22309548
- 987 92.005611 -7315.3525 0.2231369
- 988 92.034917 -7315.3524 0.2231772
- 989 92.05426 -7315.3524 0.22321637
- 990 92.091415 -7315.3523 0.22325442
- 991 92.110668 -7315.3523 0.22329133
- 992 92.129978 -7315.3522 0.22332712
- 993 92.149484 -7315.3521 0.22336179
- 994 92.178741 -7315.3521 0.22339532
- 995 92.197915 -7315.352 0.22342773
- 996 92.227185 -7315.352 0.22345901
- 997 92.246618 -7315.3519 0.22348916
- 998 92.266071 -7315.3518 0.22351819
- 999 92.285487 -7315.3518 0.22354609
- 1000 92.330713 -7315.3517 0.22357286
-Loop time of 92.3283 on 4 procs for 1000 steps with 1008 atoms
+ 1 0.052476883 -7315.3918 8.3975109e-06
+ 2 0.081619978 -7315.3918 1.4120368e-05
+ 3 0.12056088 -7315.3918 2.1378868e-05
+ 4 0.15457582 -7315.3918 3.0172501e-05
+ 5 0.17366695 -7315.3918 4.0500585e-05
+ 6 0.19266486 -7315.3918 5.2362272e-05
+ 7 0.21173096 -7315.3918 6.5756548e-05
+ 8 0.23075199 -7315.3918 8.0682245e-05
+ 9 0.24963689 -7315.3918 9.713804e-05
+ 10 0.2768569 -7315.3918 0.00011512246
+ 11 0.29579592 -7315.3918 0.00013463391
+ 12 0.31464887 -7315.3918 0.00015567063
+ 13 0.33353496 -7315.3918 0.00017823074
+ 14 0.35241199 -7315.3918 0.00020231225
+ 15 0.371279 -7315.3918 0.00022791303
+ 16 0.3901968 -7315.3918 0.00025503085
+ 17 0.40919089 -7315.3918 0.00028366338
+ 18 0.42810178 -7315.3918 0.00031380817
+ 19 0.44700289 -7315.3918 0.0003454627
+ 20 0.47405195 -7315.3918 0.00037862437
+ 21 0.49306488 -7315.3918 0.0004132905
+ 22 0.51192498 -7315.3918 0.00044945835
+ 23 0.53109884 -7315.3918 0.00048712513
+ 24 0.54997778 -7315.3918 0.00052628798
+ 25 0.56885195 -7315.3918 0.00056694404
+ 26 0.5877068 -7315.3918 0.00060909036
+ 27 0.60656095 -7315.3918 0.00065272401
+ 28 0.62541485 -7315.3918 0.00069784199
+ 29 0.64437795 -7315.3917 0.00074444131
+ 30 0.67126584 -7315.3917 0.00079251893
+ 31 0.69035888 -7315.3917 0.00084207182
+ 32 0.70937085 -7315.3917 0.00089309691
+ 33 0.72819281 -7315.3917 0.00094559113
+ 34 0.747015 -7315.3917 0.00099955142
+ 35 0.76596594 -7315.3917 0.0010549747
+ 36 0.78481793 -7315.3917 0.0011118579
+ 37 0.80371094 -7315.3917 0.0011701978
+ 38 0.82256985 -7315.3917 0.0012299916
+ 39 0.84145594 -7315.3917 0.001291236
+ 40 0.86840796 -7315.3917 0.001353928
+ 41 0.88726687 -7315.3917 0.0014180645
+ 42 0.90615296 -7315.3917 0.0014836425
+ 43 0.92505598 -7315.3917 0.0015506588
+ 44 0.94395494 -7315.3917 0.0016191104
+ 45 0.96285391 -7315.3917 0.0016889941
+ 46 0.98161888 -7315.3917 0.0017603069
+ 47 1.0005348 -7315.3917 0.0018330457
+ 48 1.0193958 -7315.3917 0.0019072073
+ 49 1.0382128 -7315.3916 0.0019827887
+ 50 1.082974 -7315.3916 0.0020597866
+ 51 1.1019349 -7315.3916 0.002138198
+ 52 1.120765 -7315.3916 0.0022180196
+ 53 1.1396518 -7315.3916 0.0022992484
+ 54 1.158561 -7315.3916 0.0023818813
+ 55 1.1826348 -7315.3916 0.0024659149
+ 56 1.2014618 -7315.3916 0.0025513463
+ 57 1.220305 -7315.3916 0.0026381721
+ 58 1.2390778 -7315.3916 0.0027263893
+ 59 1.257957 -7315.3916 0.0028159946
+ 60 1.284894 -7315.3916 0.0029069848
+ 61 1.3037529 -7315.3916 0.0029993569
+ 62 1.3605258 -7315.3916 0.0030931075
+ 63 1.4935169 -7315.3915 0.0031882335
+ 64 1.7227008 -7315.3915 0.0032847318
+ 65 1.9413278 -7315.3915 0.0033825991
+ 66 2.1326869 -7315.3915 0.0034818323
+ 67 2.171103 -7315.3915 0.0035824284
+ 68 2.2098908 -7315.3915 0.0036843841
+ 69 2.2638738 -7315.3915 0.0037876964
+ 70 2.366117 -7315.3915 0.0038923623
+ 71 2.6025259 -7315.3915 0.0039983787
+ 72 2.8625228 -7315.3915 0.0041057427
+ 73 3.0459418 -7315.3915 0.0042144511
+ 74 3.080606 -7315.3915 0.0043245012
+ 75 3.0995009 -7315.3915 0.0044358899
+ 76 3.1183729 -7315.3914 0.0045486143
+ 77 3.1373439 -7315.3914 0.0046626717
+ 78 3.1561818 -7315.3914 0.0047780591
+ 79 3.1750839 -7315.3914 0.0048947738
+ 80 3.2020829 -7315.3914 0.0050128131
+ 81 3.2209868 -7315.3914 0.005132174
+ 82 3.2400718 -7315.3914 0.0052528541
+ 83 3.25913 -7315.3914 0.0053748505
+ 84 3.2781198 -7315.3914 0.0054981606
+ 85 3.2969909 -7315.3914 0.0056227818
+ 86 3.3158269 -7315.3913 0.0057487114
+ 87 3.334698 -7315.3913 0.0058759467
+ 88 3.3535478 -7315.3913 0.0060044851
+ 89 3.3724389 -7315.3913 0.006134324
+ 90 3.3994188 -7315.3913 0.0062654606
+ 91 3.4184108 -7315.3913 0.0063978923
+ 92 3.437408 -7315.3913 0.0065316164
+ 93 3.4565248 -7315.3913 0.0066666301
+ 94 3.4755249 -7315.3913 0.0068029305
+ 95 3.4944348 -7315.3913 0.006940515
+ 96 3.5132258 -7315.3912 0.0070793805
+ 97 3.5320058 -7315.3912 0.0072195241
+ 98 3.5509968 -7315.3912 0.0073609428
+ 99 3.5699439 -7315.3912 0.0075036336
+ 100 3.6148298 -7315.3912 0.0076475932
+ 101 3.6339269 -7315.3912 0.0077928183
+ 102 3.6529388 -7315.3912 0.0079393056
+ 103 3.6718678 -7315.3912 0.0080870517
+ 104 3.6908 -7315.3912 0.0082360529
+ 105 3.7098029 -7315.3911 0.0083863055
+ 106 3.7287269 -7315.3911 0.0085378058
+ 107 3.7476509 -7315.3911 0.0086905498
+ 108 3.7665989 -7315.3911 0.0088445335
+ 109 3.7856789 -7315.3911 0.0089997527
+ 110 3.8129749 -7315.3911 0.0091562032
+ 111 3.832119 -7315.3911 0.0093138804
+ 112 3.851234 -7315.3911 0.00947278
+ 113 3.870286 -7315.3911 0.0096328972
+ 114 3.889251 -7315.391 0.0097942273
+ 115 3.9081199 -7315.391 0.0099567653
+ 116 3.926981 -7315.391 0.010120506
+ 117 3.9458678 -7315.391 0.010285445
+ 118 3.9658039 -7315.391 0.010451576
+ 119 3.9846618 -7315.391 0.010618895
+ 120 4.0114849 -7315.391 0.010787395
+ 121 4.0304799 -7315.391 0.010957072
+ 122 4.0495169 -7315.3909 0.011127918
+ 123 4.0684228 -7315.3909 0.01129993
+ 124 4.0874758 -7315.3909 0.0114731
+ 125 4.1065819 -7315.3909 0.011647424
+ 126 4.1258128 -7315.3909 0.011822894
+ 127 4.1446018 -7315.3909 0.011999506
+ 128 4.1634519 -7315.3909 0.012177252
+ 129 4.1822379 -7315.3908 0.012356127
+ 130 4.2092049 -7315.3908 0.012536125
+ 131 4.2280488 -7315.3908 0.012717239
+ 132 4.2470009 -7315.3908 0.012899462
+ 133 4.2659788 -7315.3908 0.01308279
+ 134 4.2849669 -7315.3908 0.013267215
+ 135 4.3039088 -7315.3908 0.01345273
+ 136 4.3227499 -7315.3908 0.01363933
+ 137 4.3416789 -7315.3907 0.013827009
+ 138 4.3606608 -7315.3907 0.014015759
+ 139 4.3795729 -7315.3907 0.014205574
+ 140 4.4063599 -7315.3907 0.014396449
+ 141 4.4253738 -7315.3907 0.014588376
+ 142 4.444294 -7315.3907 0.014781349
+ 143 4.4632409 -7315.3907 0.014975362
+ 144 4.4821599 -7315.3906 0.015170409
+ 145 4.5010648 -7315.3906 0.015366482
+ 146 4.520021 -7315.3906 0.015563577
+ 147 4.5391059 -7315.3906 0.015761685
+ 148 4.558162 -7315.3906 0.015960802
+ 149 4.5774438 -7315.3906 0.01616092
+ 150 4.6224279 -7315.3905 0.016362034
+ 151 4.6416938 -7315.3905 0.016564137
+ 152 4.6606419 -7315.3905 0.016767223
+ 153 4.6795709 -7315.3905 0.016971286
+ 154 4.69856 -7315.3905 0.017176319
+ 155 4.717443 -7315.3905 0.017382317
+ 156 4.7363939 -7315.3905 0.017589273
+ 157 4.7553709 -7315.3904 0.01779718
+ 158 4.774251 -7315.3904 0.018006034
+ 159 4.793108 -7315.3904 0.018215827
+ 160 4.8201978 -7315.3904 0.018426554
+ 161 4.839345 -7315.3904 0.018638208
+ 162 4.858377 -7315.3904 0.018850784
+ 163 4.8773389 -7315.3903 0.019064276
+ 164 4.896446 -7315.3903 0.019278677
+ 165 4.9156048 -7315.3903 0.019493981
+ 166 4.934588 -7315.3903 0.019710184
+ 167 4.953614 -7315.3903 0.019927278
+ 168 4.9724569 -7315.3903 0.020145259
+ 169 5.0470779 -7315.3902 0.02036412
+ 170 5.2533379 -7315.3902 0.020583855
+ 171 5.4579189 -7315.3902 0.02080446
+ 172 5.4976408 -7315.3902 0.021025928
+ 173 5.5402119 -7315.3902 0.021248253
+ 174 5.5789018 -7315.3902 0.021471431
+ 175 5.6176858 -7315.3901 0.021695456
+ 176 5.664192 -7315.3901 0.021920323
+ 177 5.6834388 -7315.3901 0.022146026
+ 178 5.702482 -7315.3901 0.022372559
+ 179 5.721483 -7315.3901 0.022599919
+ 180 5.7484829 -7315.3901 0.0228281
+ 181 5.767566 -7315.39 0.023057097
+ 182 5.7865479 -7315.39 0.023286904
+ 183 5.8055968 -7315.39 0.023517518
+ 184 5.8246479 -7315.39 0.023748934
+ 185 5.8437119 -7315.39 0.023981146
+ 186 5.8627658 -7315.3899 0.024214151
+ 187 5.882314 -7315.3899 0.024447944
+ 188 5.9015508 -7315.3899 0.024682521
+ 189 5.9211018 -7315.3899 0.024917876
+ 190 5.947989 -7315.3899 0.025154007
+ 191 5.9669349 -7315.3898 0.025390909
+ 192 5.98592 -7315.3898 0.025628577
+ 193 6.0049648 -7315.3898 0.025867009
+ 194 6.0240018 -7315.3898 0.026106199
+ 195 6.0429809 -7315.3898 0.026346144
+ 196 6.0620768 -7315.3897 0.026586841
+ 197 6.0811119 -7315.3897 0.026828285
+ 198 6.1002178 -7315.3897 0.027070473
+ 199 6.11935 -7315.3897 0.0273134
+ 200 6.1647899 -7315.3897 0.027557065
+ 201 6.1839159 -7315.3896 0.027801461
+ 202 6.2028968 -7315.3896 0.028046587
+ 203 6.221911 -7315.3896 0.028292439
+ 204 6.2409518 -7315.3896 0.028539012
+ 205 6.2599778 -7315.3896 0.028786304
+ 206 6.2790399 -7315.3895 0.02903431
+ 207 6.2980938 -7315.3895 0.029283027
+ 208 6.3170619 -7315.3895 0.029532451
+ 209 6.3361609 -7315.3895 0.029782578
+ 210 6.3630569 -7315.3895 0.030033406
+ 211 6.3820848 -7315.3894 0.030284929
+ 212 6.4011319 -7315.3894 0.030537145
+ 213 6.4200339 -7315.3894 0.030790049
+ 214 6.439116 -7315.3894 0.031043637
+ 215 6.4580798 -7315.3894 0.031297905
+ 216 6.4771478 -7315.3893 0.03155285
+ 217 6.4962409 -7315.3893 0.031808467
+ 218 6.515348 -7315.3893 0.032064752
+ 219 6.534405 -7315.3893 0.0323217
+ 220 6.5614288 -7315.3892 0.032579308
+ 221 6.5804698 -7315.3892 0.032837571
+ 222 6.5994258 -7315.3892 0.033096484
+ 223 6.618361 -7315.3892 0.033356043
+ 224 6.6374488 -7315.3891 0.033616243
+ 225 6.6564829 -7315.3891 0.03387708
+ 226 6.675473 -7315.3891 0.034138548
+ 227 6.6944928 -7315.3891 0.034400644
+ 228 6.7135119 -7315.3891 0.034663362
+ 229 6.7325239 -7315.389 0.034926696
+ 230 6.7596169 -7315.389 0.035190644
+ 231 6.7786908 -7315.389 0.035455198
+ 232 6.7976818 -7315.389 0.035720354
+ 233 6.8166678 -7315.3889 0.035986107
+ 234 6.835773 -7315.3889 0.036252452
+ 235 6.8547759 -7315.3889 0.036519384
+ 236 6.8736999 -7315.3889 0.036786897
+ 237 6.8927319 -7315.3888 0.037054986
+ 238 6.9118669 -7315.3888 0.037323645
+ 239 6.9307508 -7315.3888 0.03759287
+ 240 6.957757 -7315.3888 0.037862655
+ 241 6.9767768 -7315.3887 0.038132995
+ 242 6.9958339 -7315.3887 0.038403884
+ 243 7.0147638 -7315.3887 0.038675316
+ 244 7.0337238 -7315.3887 0.038947288
+ 245 7.0526128 -7315.3886 0.039219793
+ 246 7.0714848 -7315.3886 0.039492825
+ 247 7.0903549 -7315.3886 0.03976638
+ 248 7.1094079 -7315.3886 0.040040452
+ 249 7.1283929 -7315.3885 0.040315035
+ 250 7.1732728 -7315.3885 0.040590125
+ 251 7.1923828 -7315.3885 0.040865715
+ 252 7.2114279 -7315.3885 0.041141802
+ 253 7.2303958 -7315.3884 0.041418378
+ 254 7.2493458 -7315.3884 0.041695439
+ 255 7.2684019 -7315.3884 0.04197298
+ 256 7.2873368 -7315.3883 0.042250995
+ 257 7.3063838 -7315.3883 0.042529479
+ 258 7.325485 -7315.3883 0.042808427
+ 259 7.344466 -7315.3883 0.043087833
+ 260 7.371403 -7315.3882 0.043367692
+ 261 7.390435 -7315.3882 0.043648
+ 262 7.4095328 -7315.3882 0.04392875
+ 263 7.4285998 -7315.3882 0.044209938
+ 264 7.4476628 -7315.3881 0.044491558
+ 265 7.466702 -7315.3881 0.044773606
+ 266 7.485734 -7315.3881 0.045056076
+ 267 7.5047648 -7315.388 0.045338964
+ 268 7.5237799 -7315.388 0.045622264
+ 269 7.5428028 -7315.388 0.04590597
+ 270 7.5699649 -7315.388 0.04619008
+ 271 7.5890529 -7315.3879 0.046474586
+ 272 7.6080818 -7315.3879 0.046759485
+ 273 7.6270678 -7315.3879 0.047044772
+ 274 7.6459918 -7315.3878 0.047330442
+ 275 7.664851 -7315.3878 0.047616491
+ 276 7.683764 -7315.3878 0.047902912
+ 277 7.7027118 -7315.3878 0.048189703
+ 278 7.7215929 -7315.3877 0.048476859
+ 279 7.7404869 -7315.3877 0.048764375
+ 280 7.7672579 -7315.3877 0.049052246
+ 281 7.7862709 -7315.3876 0.049340469
+ 282 7.8052769 -7315.3876 0.04962904
+ 283 7.8242178 -7315.3876 0.049917954
+ 284 7.843117 -7315.3876 0.050207207
+ 285 7.862103 -7315.3875 0.050496795
+ 286 7.8809388 -7315.3875 0.050786716
+ 287 7.8999598 -7315.3875 0.051076964
+ 288 7.918798 -7315.3874 0.051367536
+ 289 7.9377048 -7315.3874 0.051658429
+ 290 7.9644458 -7315.3874 0.05194964
+ 291 7.9833908 -7315.3873 0.052241165
+ 292 8.002234 -7315.3873 0.052533001
+ 293 8.0210729 -7315.3873 0.052825145
+ 294 8.0400259 -7315.3873 0.053117594
+ 295 8.0589778 -7315.3872 0.053410345
+ 296 8.0778608 -7315.3872 0.053703396
+ 297 8.096735 -7315.3872 0.053996744
+ 298 8.1156149 -7315.3871 0.054290386
+ 299 8.1344469 -7315.3871 0.05458432
+ 300 8.1790869 -7315.3871 0.054878543
+ 301 8.198164 -7315.387 0.055173054
+ 302 8.217134 -7315.387 0.055467851
+ 303 8.2361238 -7315.387 0.05576293
+ 304 8.2552428 -7315.3869 0.056058291
+ 305 8.2741959 -7315.3869 0.056353931
+ 306 8.293108 -7315.3869 0.056649849
+ 307 8.3120489 -7315.3868 0.056946042
+ 308 8.3309529 -7315.3868 0.057242509
+ 309 8.3500309 -7315.3868 0.057539248
+ 310 8.3769798 -7315.3868 0.057836257
+ 311 8.3960309 -7315.3867 0.058133536
+ 312 8.4150839 -7315.3867 0.058431082
+ 313 8.4339499 -7315.3867 0.058728893
+ 314 8.4529378 -7315.3866 0.059026969
+ 315 8.4718649 -7315.3866 0.059325307
+ 316 8.4908788 -7315.3866 0.059623906
+ 317 8.5098228 -7315.3865 0.059922765
+ 318 8.528821 -7315.3865 0.060221881
+ 319 8.5477579 -7315.3865 0.060521253
+ 320 8.5744159 -7315.3864 0.06082088
+ 321 8.593334 -7315.3864 0.06112076
+ 322 8.612289 -7315.3864 0.061420891
+ 323 8.6312599 -7315.3863 0.061721272
+ 324 8.6502628 -7315.3863 0.0620219
+ 325 8.669168 -7315.3863 0.062322774
+ 326 8.6881168 -7315.3862 0.062623892
+ 327 8.7071638 -7315.3862 0.062925252
+ 328 8.7261078 -7315.3862 0.063226852
+ 329 8.7451749 -7315.3861 0.06352869
+ 330 8.7718208 -7315.3861 0.063830765
+ 331 8.79088 -7315.3861 0.064133073
+ 332 8.8097799 -7315.386 0.064435613
+ 333 8.8289199 -7315.386 0.064738383
+ 334 8.8479078 -7315.386 0.06504138
+ 335 8.866843 -7315.3859 0.065344602
+ 336 8.8858168 -7315.3859 0.065648047
+ 337 8.9047689 -7315.3859 0.065951711
+ 338 8.9237878 -7315.3858 0.066255594
+ 339 8.9426968 -7315.3858 0.066559692
+ 340 8.9714038 -7315.3858 0.066864002
+ 341 8.990371 -7315.3857 0.067168523
+ 342 9.009398 -7315.3857 0.067473251
+ 343 9.028471 -7315.3857 0.067778184
+ 344 9.0473959 -7315.3856 0.068083319
+ 345 9.066335 -7315.3856 0.068388653
+ 346 9.0852878 -7315.3856 0.068694184
+ 347 9.104203 -7315.3855 0.068999909
+ 348 9.1231349 -7315.3855 0.069305825
+ 349 9.1419959 -7315.3855 0.069611929
+ 350 9.1864958 -7315.3854 0.069918218
+ 351 9.2054918 -7315.3854 0.070224689
+ 352 9.2243409 -7315.3854 0.070531339
+ 353 9.2432868 -7315.3853 0.070838166
+ 354 9.2622049 -7315.3853 0.071145166
+ 355 9.281153 -7315.3853 0.071452336
+ 356 9.3000338 -7315.3852 0.071759674
+ 357 9.318929 -7315.3852 0.072067176
+ 358 9.3379009 -7315.3851 0.072374839
+ 359 9.3568399 -7315.3851 0.072682659
+ 360 9.3838129 -7315.3851 0.072990635
+ 361 9.4028578 -7315.385 0.073298762
+ 362 9.4219129 -7315.385 0.073607038
+ 363 9.4408109 -7315.385 0.073915459
+ 364 9.459636 -7315.3849 0.074224022
+ 365 9.4785168 -7315.3849 0.074532723
+ 366 9.4973879 -7315.3849 0.07484156
+ 367 9.516362 -7315.3848 0.07515053
+ 368 9.5352459 -7315.3848 0.075459628
+ 369 9.554107 -7315.3848 0.075768851
+ 370 9.5807748 -7315.3847 0.076078197
+ 371 9.5997338 -7315.3847 0.076387662
+ 372 9.6186199 -7315.3846 0.076697242
+ 373 9.6375999 -7315.3846 0.077006935
+ 374 9.6565268 -7315.3846 0.077316736
+ 375 9.6754079 -7315.3845 0.077626643
+ 376 9.6942749 -7315.3845 0.077936651
+ 377 9.7131188 -7315.3845 0.078246759
+ 378 9.731982 -7315.3844 0.078556961
+ 379 9.7508278 -7315.3844 0.078867256
+ 380 9.7774358 -7315.3844 0.079177639
+ 381 9.7963748 -7315.3843 0.079488107
+ 382 9.8152418 -7315.3843 0.079798658
+ 383 9.8340218 -7315.3842 0.080109287
+ 384 9.8529849 -7315.3842 0.080419992
+ 385 9.8718309 -7315.3842 0.080730769
+ 386 9.890729 -7315.3841 0.081041616
+ 387 9.9096148 -7315.3841 0.081352529
+ 388 9.9285238 -7315.3841 0.081663506
+ 389 9.947444 -7315.384 0.081974543
+ 390 9.9743609 -7315.384 0.082285637
+ 391 9.993361 -7315.384 0.082596786
+ 392 10.012435 -7315.3839 0.082907988
+ 393 10.031375 -7315.3839 0.083219239
+ 394 10.050429 -7315.3838 0.083530536
+ 395 10.06966 -7315.3838 0.083841879
+ 396 10.088797 -7315.3838 0.084153263
+ 397 10.107918 -7315.3837 0.084464687
+ 398 10.127125 -7315.3837 0.084776149
+ 399 10.146294 -7315.3837 0.085087647
+ 400 10.190805 -7315.3836 0.085399178
+ 401 10.209854 -7315.3836 0.085710742
+ 402 10.228764 -7315.3835 0.086022335
+ 403 10.247751 -7315.3835 0.086333957
+ 404 10.266678 -7315.3835 0.086645606
+ 405 10.285652 -7315.3834 0.08695728
+ 406 10.30454 -7315.3834 0.087268979
+ 407 10.323444 -7315.3833 0.0875807
+ 408 10.342207 -7315.3833 0.087892443
+ 409 10.361024 -7315.3833 0.088204207
+ 410 10.38761 -7315.3832 0.08851599
+ 411 10.406594 -7315.3832 0.088827792
+ 412 10.425492 -7315.3832 0.089139611
+ 413 10.444435 -7315.3831 0.089451448
+ 414 10.463399 -7315.3831 0.089763301
+ 415 10.482191 -7315.383 0.09007517
+ 416 10.501105 -7315.383 0.090387053
+ 417 10.520042 -7315.383 0.090698951
+ 418 10.538999 -7315.3829 0.091010863
+ 419 10.557898 -7315.3829 0.091322789
+ 420 10.584581 -7315.3828 0.091634727
+ 421 10.603559 -7315.3828 0.091946678
+ 422 10.62243 -7315.3828 0.092258641
+ 423 10.641274 -7315.3827 0.092570616
+ 424 10.66027 -7315.3827 0.092882602
+ 425 10.67916 -7315.3826 0.093194598
+ 426 10.705294 -7315.3826 0.093506606
+ 427 10.724189 -7315.3826 0.093818623
+ 428 10.743085 -7315.3825 0.09413065
+ 429 10.762008 -7315.3825 0.094442686
+ 430 10.788719 -7315.3824 0.094754731
+ 431 10.807681 -7315.3824 0.095066783
+ 432 10.826634 -7315.3824 0.095378844
+ 433 10.845768 -7315.3823 0.095690911
+ 434 10.864882 -7315.3823 0.096002985
+ 435 10.883901 -7315.3822 0.096315065
+ 436 10.902903 -7315.3822 0.09662715
+ 437 10.922347 -7315.3822 0.09693924
+ 438 10.941338 -7315.3821 0.097251333
+ 439 10.96052 -7315.3821 0.097563429
+ 440 10.987458 -7315.382 0.097875527
+ 441 11.006571 -7315.382 0.098187627
+ 442 11.025611 -7315.3819 0.098499727
+ 443 11.044695 -7315.3819 0.098811826
+ 444 11.063819 -7315.3819 0.099123923
+ 445 11.082845 -7315.3818 0.099436018
+ 446 11.101865 -7315.3818 0.099748109
+ 447 11.120976 -7315.3817 0.1000602
+ 448 11.140004 -7315.3817 0.10037228
+ 449 11.159039 -7315.3817 0.10068435
+ 450 11.203945 -7315.3816 0.10099641
+ 451 11.223261 -7315.3816 0.10130847
+ 452 11.242208 -7315.3815 0.10162051
+ 453 11.261148 -7315.3815 0.10193254
+ 454 11.280003 -7315.3814 0.10224456
+ 455 11.298967 -7315.3814 0.10255656
+ 456 11.31793 -7315.3814 0.10286855
+ 457 11.337075 -7315.3813 0.10318052
+ 458 11.356075 -7315.3813 0.10349247
+ 459 11.375172 -7315.3812 0.10380439
+ 460 11.402232 -7315.3812 0.1041163
+ 461 11.421428 -7315.3811 0.10442818
+ 462 11.440561 -7315.3811 0.10474003
+ 463 11.4596 -7315.3811 0.10505185
+ 464 11.478707 -7315.381 0.10536365
+ 465 11.497784 -7315.381 0.10567541
+ 466 11.51686 -7315.3809 0.10598714
+ 467 11.535956 -7315.3809 0.10629884
+ 468 11.55492 -7315.3808 0.1066105
+ 469 11.573996 -7315.3808 0.10692211
+ 470 11.600923 -7315.3807 0.10723369
+ 471 11.619895 -7315.3807 0.10754522
+ 472 11.638889 -7315.3807 0.10785671
+ 473 11.657852 -7315.3806 0.10816815
+ 474 11.676993 -7315.3806 0.10847954
+ 475 11.696002 -7315.3805 0.10879088
+ 476 11.714977 -7315.3805 0.10910216
+ 477 11.733924 -7315.3804 0.10941339
+ 478 11.752914 -7315.3804 0.10972455
+ 479 11.771851 -7315.3803 0.11003566
+ 480 11.798701 -7315.3803 0.11034669
+ 481 11.817725 -7315.3802 0.11065767
+ 482 11.836748 -7315.3802 0.11096857
+ 483 11.85584 -7315.3802 0.1112794
+ 484 11.87491 -7315.3801 0.11159016
+ 485 11.893899 -7315.3801 0.11190084
+ 486 11.912962 -7315.38 0.11221144
+ 487 11.932057 -7315.38 0.11252195
+ 488 11.951081 -7315.3799 0.11283238
+ 489 11.970124 -7315.3799 0.11314273
+ 490 11.997172 -7315.3798 0.11345298
+ 491 12.016285 -7315.3798 0.11376314
+ 492 12.035289 -7315.3797 0.11407321
+ 493 12.054243 -7315.3797 0.11438317
+ 494 12.07323 -7315.3797 0.11469304
+ 495 12.092234 -7315.3796 0.1150028
+ 496 12.111157 -7315.3796 0.11531246
+ 497 12.130191 -7315.3795 0.11562201
+ 498 12.149207 -7315.3795 0.11593145
+ 499 12.168292 -7315.3794 0.11624077
+ 500 12.213315 -7315.3794 0.11654998
+ 501 12.23253 -7315.3793 0.11685908
+ 502 12.251521 -7315.3793 0.11716805
+ 503 12.270541 -7315.3792 0.1174769
+ 504 12.289536 -7315.3792 0.11778563
+ 505 12.308608 -7315.3791 0.11809424
+ 506 12.327641 -7315.3791 0.11840272
+ 507 12.346906 -7315.379 0.11871107
+ 508 12.366254 -7315.379 0.11901929
+ 509 12.385244 -7315.379 0.11932738
+ 510 12.412047 -7315.3789 0.11963533
+ 511 12.431106 -7315.3789 0.11994315
+ 512 12.450168 -7315.3788 0.12025084
+ 513 12.469241 -7315.3788 0.12055839
+ 514 12.488184 -7315.3787 0.1208658
+ 515 12.50717 -7315.3787 0.12117307
+ 516 12.526283 -7315.3786 0.1214802
+ 517 12.545296 -7315.3786 0.12178719
+ 518 12.56441 -7315.3785 0.12209404
+ 519 12.583427 -7315.3785 0.12240075
+ 520 12.610513 -7315.3784 0.12270732
+ 521 12.629636 -7315.3784 0.12301375
+ 522 12.648668 -7315.3783 0.12332003
+ 523 12.667667 -7315.3783 0.12362616
+ 524 12.68664 -7315.3782 0.12393216
+ 525 12.705797 -7315.3782 0.124238
+ 526 12.724779 -7315.3781 0.12454371
+ 527 12.743769 -7315.3781 0.12484927
+ 528 12.762751 -7315.378 0.12515468
+ 529 12.781767 -7315.378 0.12545995
+ 530 12.808539 -7315.3779 0.12576507
+ 531 12.827528 -7315.3779 0.12607005
+ 532 12.846545 -7315.3779 0.12637489
+ 533 12.865565 -7315.3778 0.12667957
+ 534 12.884553 -7315.3778 0.12698412
+ 535 12.903494 -7315.3777 0.12728851
+ 536 12.922486 -7315.3777 0.12759276
+ 537 12.941363 -7315.3776 0.12789687
+ 538 12.96063 -7315.3776 0.12820083
+ 539 12.979606 -7315.3775 0.12850464
+ 540 13.006537 -7315.3775 0.12880831
+ 541 13.02558 -7315.3774 0.12911183
+ 542 13.044474 -7315.3774 0.1294152
+ 543 13.063391 -7315.3773 0.12971843
+ 544 13.082354 -7315.3773 0.13002151
+ 545 13.101181 -7315.3772 0.13032444
+ 546 13.120074 -7315.3772 0.13062723
+ 547 13.139019 -7315.3771 0.13092987
+ 548 13.157897 -7315.3771 0.13123236
+ 549 13.176841 -7315.377 0.1315347
+ 550 13.22123 -7315.377 0.1318369
+ 551 13.240266 -7315.3769 0.13213894
+ 552 13.259193 -7315.3769 0.13244084
+ 553 13.278306 -7315.3768 0.13274258
+ 554 13.297203 -7315.3768 0.13304418
+ 555 13.316339 -7315.3767 0.13334562
+ 556 13.33532 -7315.3767 0.13364692
+ 557 13.354244 -7315.3766 0.13394806
+ 558 13.373084 -7315.3766 0.13424905
+ 559 13.391917 -7315.3765 0.13454988
+ 560 13.418571 -7315.3765 0.13485056
+ 561 13.437486 -7315.3764 0.13515109
+ 562 13.456345 -7315.3764 0.13545146
+ 563 13.475303 -7315.3763 0.13575167
+ 564 13.494246 -7315.3763 0.13605173
+ 565 13.513152 -7315.3762 0.13635163
+ 566 13.53204 -7315.3762 0.13665136
+ 567 13.550913 -7315.3761 0.13695094
+ 568 13.569953 -7315.3761 0.13725036
+ 569 13.588862 -7315.376 0.13754961
+ 570 13.615555 -7315.376 0.1378487
+ 571 13.634507 -7315.3759 0.13814762
+ 572 13.653601 -7315.3759 0.13844638
+ 573 13.672483 -7315.3758 0.13874497
+ 574 13.691471 -7315.3758 0.13904339
+ 575 13.710443 -7315.3757 0.13934163
+ 576 13.729287 -7315.3757 0.13963971
+ 577 13.748274 -7315.3756 0.13993761
+ 578 13.76727 -7315.3756 0.14023534
+ 579 13.786238 -7315.3755 0.14053288
+ 580 13.813129 -7315.3755 0.14083025
+ 581 13.832064 -7315.3754 0.14112743
+ 582 13.851075 -7315.3754 0.14142443
+ 583 13.870104 -7315.3753 0.14172125
+ 584 13.889009 -7315.3753 0.14201787
+ 585 13.907969 -7315.3752 0.14231431
+ 586 13.926826 -7315.3752 0.14261055
+ 587 13.945757 -7315.3751 0.1429066
+ 588 13.964629 -7315.3751 0.14320245
+ 589 13.98349 -7315.375 0.1434981
+ 590 14.010149 -7315.375 0.14379354
+ 591 14.029057 -7315.3749 0.14408878
+ 592 14.047992 -7315.3749 0.14438381
+ 593 14.066826 -7315.3748 0.14467863
+ 594 14.085745 -7315.3748 0.14497324
+ 595 14.10464 -7315.3747 0.14526763
+ 596 14.123566 -7315.3747 0.1455618
+ 597 14.142445 -7315.3746 0.14585575
+ 598 14.161353 -7315.3746 0.14614947
+ 599 14.180246 -7315.3745 0.14644296
+ 600 14.224863 -7315.3745 0.14673623
+ 601 14.244007 -7315.3744 0.14702925
+ 602 14.263019 -7315.3744 0.14732204
+ 603 14.281954 -7315.3743 0.1476146
+ 604 14.301 -7315.3743 0.1479069
+ 605 14.319993 -7315.3742 0.14819897
+ 606 14.33889 -7315.3742 0.14849078
+ 607 14.357861 -7315.3741 0.14878234
+ 608 14.376722 -7315.3741 0.14907365
+ 609 14.39568 -7315.374 0.1493647
+ 610 14.422387 -7315.374 0.14965549
+ 611 14.441312 -7315.3739 0.14994602
+ 612 14.460206 -7315.3739 0.15023629
+ 613 14.479118 -7315.3738 0.15052629
+ 614 14.498088 -7315.3738 0.15081602
+ 615 14.517069 -7315.3737 0.15110547
+ 616 14.536101 -7315.3736 0.15139465
+ 617 14.555043 -7315.3736 0.15168356
+ 618 14.574151 -7315.3735 0.15197219
+ 619 14.593186 -7315.3735 0.15226053
+ 620 14.620078 -7315.3734 0.15254859
+ 621 14.639009 -7315.3734 0.15283637
+ 622 14.657923 -7315.3733 0.15312386
+ 623 14.676816 -7315.3733 0.15341107
+ 624 14.695755 -7315.3732 0.15369798
+ 625 14.714672 -7315.3732 0.1539846
+ 626 14.733616 -7315.3731 0.15427093
+ 627 14.752499 -7315.3731 0.15455697
+ 628 14.771373 -7315.373 0.1548427
+ 629 14.790337 -7315.373 0.15512814
+ 630 14.81707 -7315.3729 0.15541328
+ 631 14.836027 -7315.3729 0.15569812
+ 632 14.85501 -7315.3728 0.15598266
+ 633 14.873915 -7315.3728 0.1562669
+ 634 14.892788 -7315.3727 0.15655083
+ 635 14.911752 -7315.3727 0.15683446
+ 636 14.930636 -7315.3726 0.15711778
+ 637 14.949782 -7315.3726 0.1574008
+ 638 14.968902 -7315.3725 0.1576835
+ 639 14.987981 -7315.3725 0.1579659
+ 640 15.014762 -7315.3724 0.15824799
+ 641 15.03379 -7315.3724 0.15852977
+ 642 15.052747 -7315.3723 0.15881123
+ 643 15.071843 -7315.3722 0.15909238
+ 644 15.090805 -7315.3722 0.15937322
+ 645 15.109737 -7315.3721 0.15965375
+ 646 15.128664 -7315.3721 0.15993396
+ 647 15.147532 -7315.372 0.16021385
+ 648 15.166446 -7315.372 0.16049342
+ 649 15.185446 -7315.3719 0.16077268
+ 650 15.230109 -7315.3719 0.16105162
+ 651 15.249317 -7315.3718 0.16133024
+ 652 15.26832 -7315.3718 0.16160854
+ 653 15.287319 -7315.3717 0.16188651
+ 654 15.30633 -7315.3717 0.16216417
+ 655 15.32529 -7315.3716 0.1624415
+ 656 15.344239 -7315.3716 0.16271851
+ 657 15.363371 -7315.3715 0.16299519
+ 658 15.382291 -7315.3715 0.16327155
+ 659 15.401273 -7315.3714 0.16354758
+ 660 15.42794 -7315.3713 0.16382329
+ 661 15.446908 -7315.3713 0.16409866
+ 662 15.465884 -7315.3712 0.16437371
+ 663 15.48476 -7315.3712 0.16464842
+ 664 15.50381 -7315.3711 0.16492281
+ 665 15.522707 -7315.3711 0.16519686
+ 666 15.541629 -7315.371 0.16547058
+ 667 15.560529 -7315.371 0.16574397
+ 668 15.579428 -7315.3709 0.16601702
+ 669 15.598249 -7315.3709 0.16628974
+ 670 15.624931 -7315.3708 0.16656212
+ 671 15.643889 -7315.3708 0.16683416
+ 672 15.662897 -7315.3707 0.16710586
+ 673 15.681825 -7315.3706 0.16737722
+ 674 15.700859 -7315.3706 0.16764824
+ 675 15.719932 -7315.3705 0.16791891
+ 676 15.739049 -7315.3705 0.16818925
+ 677 15.758061 -7315.3704 0.16845923
+ 678 15.777224 -7315.3704 0.16872887
+ 679 15.796399 -7315.3703 0.16899816
+ 680 15.823222 -7315.3703 0.1692671
+ 681 15.842183 -7315.3702 0.16953569
+ 682 15.861173 -7315.3702 0.16980393
+ 683 15.880109 -7315.3701 0.17007181
+ 684 15.899103 -7315.37 0.17033933
+ 685 15.91801 -7315.37 0.17060649
+ 686 15.938191 -7315.3699 0.1708733
+ 687 15.957042 -7315.3699 0.17113974
+ 688 15.975859 -7315.3698 0.17140581
+ 689 15.994808 -7315.3698 0.17167152
+ 690 16.021494 -7315.3697 0.17193686
+ 691 16.040488 -7315.3697 0.17220183
+ 692 16.059467 -7315.3696 0.17246642
+ 693 16.078397 -7315.3696 0.17273064
+ 694 16.097333 -7315.3695 0.17299447
+ 695 16.116146 -7315.3694 0.17325793
+ 696 16.134954 -7315.3694 0.173521
+ 697 16.15383 -7315.3693 0.17378368
+ 698 16.172714 -7315.3693 0.17404597
+ 699 16.191608 -7315.3692 0.17430787
+ 700 16.23608 -7315.3692 0.17456936
+ 701 16.255247 -7315.3691 0.17483046
+ 702 16.274322 -7315.3691 0.17509116
+ 703 16.293247 -7315.369 0.17535145
+ 704 16.312159 -7315.3689 0.17561133
+ 705 16.331227 -7315.3689 0.1758708
+ 706 16.350169 -7315.3688 0.17612985
+ 707 16.369077 -7315.3688 0.17638849
+ 708 16.388007 -7315.3687 0.1766467
+ 709 16.406964 -7315.3687 0.17690448
+ 710 16.433788 -7315.3686 0.17716183
+ 711 16.452793 -7315.3686 0.17741876
+ 712 16.471727 -7315.3685 0.17767524
+ 713 16.490675 -7315.3684 0.17793129
+ 714 16.509756 -7315.3684 0.17818689
+ 715 16.528667 -7315.3683 0.17844205
+ 716 16.547662 -7315.3683 0.17869675
+ 717 16.566645 -7315.3682 0.17895101
+ 718 16.585638 -7315.3682 0.17920481
+ 719 16.60459 -7315.3681 0.17945815
+ 720 16.631301 -7315.368 0.17971103
+ 721 16.650222 -7315.368 0.17996344
+ 722 16.669186 -7315.3679 0.18021538
+ 723 16.68812 -7315.3679 0.18046686
+ 724 16.707202 -7315.3678 0.18071786
+ 725 16.7263 -7315.3678 0.18096838
+ 726 16.745424 -7315.3677 0.18121842
+ 727 16.764515 -7315.3676 0.18146799
+ 728 16.78362 -7315.3676 0.18171706
+ 729 16.802673 -7315.3675 0.18196565
+ 730 16.829699 -7315.3675 0.18221375
+ 731 16.848904 -7315.3674 0.18246136
+ 732 16.868195 -7315.3674 0.18270847
+ 733 16.887342 -7315.3673 0.18295508
+ 734 16.906429 -7315.3672 0.1832012
+ 735 16.925494 -7315.3672 0.18344681
+ 736 16.944704 -7315.3671 0.18369192
+ 737 16.963914 -7315.3671 0.18393653
+ 738 16.982954 -7315.367 0.18418062
+ 739 17.001963 -7315.367 0.18442421
+ 740 17.02898 -7315.3669 0.18466728
+ 741 17.048106 -7315.3669 0.18490984
+ 742 17.067287 -7315.3668 0.18515188
+ 743 17.086393 -7315.3667 0.18539341
+ 744 17.105498 -7315.3667 0.18563442
+ 745 17.124595 -7315.3666 0.1858749
+ 746 17.143644 -7315.3666 0.18611487
+ 747 17.162697 -7315.3665 0.1863543
+ 748 17.181646 -7315.3664 0.18659321
+ 749 17.200621 -7315.3664 0.1868316
+ 750 17.245314 -7315.3663 0.18706945
+ 751 17.264538 -7315.3663 0.18730677
+ 752 17.283605 -7315.3662 0.18754356
+ 753 17.302704 -7315.3662 0.18777982
+ 754 17.321779 -7315.3661 0.18801554
+ 755 17.340896 -7315.366 0.18825072
+ 756 17.359905 -7315.366 0.18848536
+ 757 17.378992 -7315.3659 0.18871946
+ 758 17.398109 -7315.3659 0.18895302
+ 759 17.417215 -7315.3658 0.18918604
+ 760 17.444141 -7315.3658 0.18941851
+ 761 17.463203 -7315.3657 0.18965044
+ 762 17.482206 -7315.3656 0.18988182
+ 763 17.501146 -7315.3656 0.19011264
+ 764 17.520148 -7315.3655 0.19034292
+ 765 17.539132 -7315.3655 0.19057265
+ 766 17.558142 -7315.3654 0.19080182
+ 767 17.577182 -7315.3654 0.19103044
+ 768 17.596202 -7315.3653 0.1912585
+ 769 17.61516 -7315.3652 0.19148601
+ 770 17.642031 -7315.3652 0.19171296
+ 771 17.661171 -7315.3651 0.19193934
+ 772 17.680149 -7315.3651 0.19216517
+ 773 17.699091 -7315.365 0.19239044
+ 774 17.718331 -7315.365 0.19261514
+ 775 17.737427 -7315.3649 0.19283927
+ 776 17.756503 -7315.3648 0.19306284
+ 777 17.775606 -7315.3648 0.19328584
+ 778 17.79469 -7315.3647 0.19350828
+ 779 17.813749 -7315.3647 0.19373014
+ 780 17.840895 -7315.3646 0.19395143
+ 781 17.860061 -7315.3645 0.19417215
+ 782 17.879186 -7315.3645 0.19439229
+ 783 17.898259 -7315.3644 0.19461186
+ 784 17.917299 -7315.3644 0.19483084
+ 785 17.936241 -7315.3643 0.19504925
+ 786 17.955234 -7315.3643 0.19526708
+ 787 17.974278 -7315.3642 0.19548433
+ 788 17.993339 -7315.3641 0.19570099
+ 789 18.012415 -7315.3641 0.19591706
+ 790 18.039323 -7315.364 0.19613255
+ 791 18.058433 -7315.364 0.19634745
+ 792 18.077451 -7315.3639 0.19656175
+ 793 18.096502 -7315.3639 0.19677546
+ 794 18.11553 -7315.3638 0.19698857
+ 795 18.134543 -7315.3637 0.19720108
+ 796 18.153576 -7315.3637 0.19741299
+ 797 18.172619 -7315.3636 0.1976243
+ 798 18.191641 -7315.3636 0.197835
+ 799 18.210768 -7315.3635 0.19804509
+ 800 18.255385 -7315.3635 0.19825457
+ 801 18.274419 -7315.3634 0.19846343
+ 802 18.293502 -7315.3633 0.19867167
+ 803 18.31249 -7315.3633 0.19887929
+ 804 18.331477 -7315.3632 0.19908629
+ 805 18.350483 -7315.3632 0.19929266
+ 806 18.369511 -7315.3631 0.1994984
+ 807 18.388528 -7315.3631 0.1997035
+ 808 18.407615 -7315.363 0.19990796
+ 809 18.426743 -7315.3629 0.20011178
+ 810 18.453641 -7315.3629 0.20031496
+ 811 18.472718 -7315.3628 0.20051749
+ 812 18.491765 -7315.3628 0.20071936
+ 813 18.510892 -7315.3627 0.20092058
+ 814 18.530021 -7315.3626 0.20112113
+ 815 18.549058 -7315.3626 0.20132103
+ 816 18.568036 -7315.3625 0.20152025
+ 817 18.587122 -7315.3625 0.2017188
+ 818 18.606098 -7315.3624 0.20191667
+ 819 18.625021 -7315.3624 0.20211386
+ 820 18.651726 -7315.3623 0.20231036
+ 821 18.670734 -7315.3622 0.20250618
+ 822 18.68971 -7315.3622 0.2027013
+ 823 18.708626 -7315.3621 0.20289573
+ 824 18.727744 -7315.3621 0.20308946
+ 825 18.746711 -7315.362 0.20328247
+ 826 18.765671 -7315.362 0.20347478
+ 827 18.78462 -7315.3619 0.20366638
+ 828 18.803577 -7315.3618 0.20385726
+ 829 18.822602 -7315.3618 0.20404742
+ 830 18.849539 -7315.3617 0.20423685
+ 831 18.868687 -7315.3617 0.20442555
+ 832 18.887693 -7315.3616 0.20461352
+ 833 18.906707 -7315.3616 0.20480075
+ 834 18.925724 -7315.3615 0.20498725
+ 835 18.944641 -7315.3614 0.205173
+ 836 18.963648 -7315.3614 0.205358
+ 837 18.982567 -7315.3613 0.20554225
+ 838 19.001495 -7315.3613 0.20572574
+ 839 19.021132 -7315.3612 0.20590848
+ 840 19.047747 -7315.3612 0.20609045
+ 841 19.066703 -7315.3611 0.20627166
+ 842 19.085661 -7315.361 0.2064521
+ 843 19.104651 -7315.361 0.20663177
+ 844 19.12374 -7315.3609 0.20681066
+ 845 19.142759 -7315.3609 0.20698878
+ 846 19.161746 -7315.3608 0.20716611
+ 847 19.180769 -7315.3608 0.20734266
+ 848 19.199737 -7315.3607 0.20751842
+ 849 19.218653 -7315.3606 0.20769339
+ 850 19.26317 -7315.3606 0.20786757
+ 851 19.282135 -7315.3605 0.20804095
+ 852 19.301106 -7315.3605 0.20821353
+ 853 19.319999 -7315.3604 0.2083853
+ 854 19.338916 -7315.3604 0.20855628
+ 855 19.357791 -7315.3603 0.20872644
+ 856 19.376703 -7315.3602 0.20889579
+ 857 19.395673 -7315.3602 0.20906433
+ 858 19.414558 -7315.3601 0.20923205
+ 859 19.433471 -7315.3601 0.20939895
+ 860 19.46011 -7315.36 0.20956503
+ 861 19.479016 -7315.3599 0.20973029
+ 862 19.497875 -7315.3599 0.20989472
+ 863 19.516764 -7315.3598 0.21005832
+ 864 19.535746 -7315.3598 0.21022108
+ 865 19.554725 -7315.3597 0.21038301
+ 866 19.57361 -7315.3597 0.21054411
+ 867 19.592541 -7315.3596 0.21070436
+ 868 19.61148 -7315.3595 0.21086378
+ 869 19.630452 -7315.3595 0.21102234
+ 870 19.657153 -7315.3594 0.21118007
+ 871 19.676267 -7315.3594 0.21133694
+ 872 19.695157 -7315.3593 0.21149296
+ 873 19.714083 -7315.3593 0.21164813
+ 874 19.733065 -7315.3592 0.21180245
+ 875 19.752064 -7315.3591 0.2119559
+ 876 19.771032 -7315.3591 0.2121085
+ 877 19.789993 -7315.359 0.21226024
+ 878 19.808899 -7315.359 0.21241111
+ 879 19.827757 -7315.3589 0.21256112
+ 880 19.854376 -7315.3588 0.21271026
+ 881 19.873263 -7315.3588 0.21285853
+ 882 19.892182 -7315.3587 0.21300594
+ 883 19.911193 -7315.3587 0.21315246
+ 884 19.93017 -7315.3586 0.21329812
+ 885 19.949208 -7315.3586 0.2134429
+ 886 19.968188 -7315.3585 0.2135868
+ 887 19.987239 -7315.3584 0.21372982
+ 888 20.006231 -7315.3584 0.21387196
+ 889 20.025123 -7315.3583 0.21401322
+ 890 20.051774 -7315.3583 0.21415359
+ 891 20.070805 -7315.3582 0.21429308
+ 892 20.089726 -7315.3581 0.21443167
+ 893 20.108651 -7315.3581 0.21456938
+ 894 20.127602 -7315.358 0.2147062
+ 895 20.146634 -7315.358 0.21484212
+ 896 20.165667 -7315.3579 0.21497714
+ 897 20.184613 -7315.3579 0.21511127
+ 898 20.203754 -7315.3578 0.2152445
+ 899 20.222864 -7315.3577 0.21537683
+ 900 20.267447 -7315.3577 0.21550825
+ 901 20.286617 -7315.3576 0.21563876
+ 902 20.305708 -7315.3576 0.21576837
+ 903 20.324854 -7315.3575 0.21589707
+ 904 20.344024 -7315.3574 0.21602485
+ 905 20.363072 -7315.3574 0.21615172
+ 906 20.382092 -7315.3573 0.21627767
+ 907 20.401062 -7315.3573 0.2164027
+ 908 20.420153 -7315.3572 0.21652681
+ 909 20.43911 -7315.3572 0.21664999
+ 910 20.465801 -7315.3571 0.21677224
+ 911 20.484821 -7315.357 0.21689356
+ 912 20.50384 -7315.357 0.21701394
+ 913 20.52275 -7315.3569 0.21713339
+ 914 20.541703 -7315.3569 0.21725189
+ 915 20.56072 -7315.3568 0.21736946
+ 916 20.579674 -7315.3567 0.21748607
+ 917 20.598622 -7315.3567 0.21760173
+ 918 20.617603 -7315.3566 0.21771644
+ 919 20.636576 -7315.3566 0.21783019
+ 920 20.663315 -7315.3565 0.21794298
+ 921 20.682282 -7315.3564 0.2180548
+ 922 20.70654 -7315.3564 0.21816566
+ 923 20.725513 -7315.3563 0.21827554
+ 924 20.74449 -7315.3563 0.21838445
+ 925 20.763508 -7315.3562 0.21849238
+ 926 20.782488 -7315.3561 0.21859933
+ 927 20.801631 -7315.3561 0.21870529
+ 928 20.82058 -7315.356 0.21881025
+ 929 20.839487 -7315.356 0.21891423
+ 930 20.866125 -7315.3559 0.2190172
+ 931 20.885039 -7315.3558 0.21911918
+ 932 20.903956 -7315.3558 0.21922015
+ 933 20.922894 -7315.3557 0.21932011
+ 934 20.942382 -7315.3557 0.21941906
+ 935 20.961498 -7315.3556 0.21951699
+ 936 20.980532 -7315.3556 0.2196139
+ 937 21.000184 -7315.3555 0.21970979
+ 938 21.019062 -7315.3554 0.21980465
+ 939 21.037983 -7315.3554 0.21989848
+ 940 21.064886 -7315.3553 0.21999128
+ 941 21.084159 -7315.3553 0.22008304
+ 942 21.103302 -7315.3552 0.22017376
+ 943 21.122323 -7315.3551 0.22026344
+ 944 21.16113 -7315.3551 0.22035207
+ 945 21.199809 -7315.355 0.22043965
+ 946 21.260737 -7315.355 0.22052618
+ 947 21.340589 -7315.3549 0.22061165
+ 948 21.3995 -7315.3548 0.22069606
+ 949 21.43873 -7315.3548 0.22077941
+ 950 21.582494 -7315.3547 0.2208617
+ 951 21.793692 -7315.3547 0.22094292
+ 952 21.962676 -7315.3546 0.22102306
+ 953 22.202676 -7315.3545 0.22110214
+ 954 22.382995 -7315.3545 0.22118014
+ 955 22.602677 -7315.3544 0.22125706
+ 956 22.639823 -7315.3544 0.2213329
+ 957 22.663705 -7315.3543 0.22140765
+ 958 22.682609 -7315.3542 0.22148132
+ 959 22.701568 -7315.3542 0.22155391
+ 960 22.728795 -7315.3541 0.2216254
+ 961 22.747851 -7315.3541 0.2216958
+ 962 22.76681 -7315.354 0.2217651
+ 963 22.785828 -7315.3539 0.22183331
+ 964 22.804818 -7315.3539 0.22190042
+ 965 22.82372 -7315.3538 0.22196643
+ 966 22.842705 -7315.3538 0.22203133
+ 967 22.861784 -7315.3537 0.22209513
+ 968 22.880756 -7315.3536 0.22215783
+ 969 22.899779 -7315.3536 0.22221941
+ 970 22.926919 -7315.3535 0.22227989
+ 971 22.945984 -7315.3535 0.22233925
+ 972 22.965121 -7315.3534 0.2223975
+ 973 22.98439 -7315.3533 0.22245464
+ 974 23.003614 -7315.3533 0.22251066
+ 975 23.022739 -7315.3532 0.22256556
+ 976 23.041785 -7315.3532 0.22261935
+ 977 23.060875 -7315.3531 0.22267201
+ 978 23.079938 -7315.353 0.22272356
+ 979 23.098936 -7315.353 0.22277398
+ 980 23.126245 -7315.3529 0.22282328
+ 981 23.145234 -7315.3529 0.22287146
+ 982 23.16423 -7315.3528 0.22291852
+ 983 23.183107 -7315.3527 0.22296445
+ 984 23.20206 -7315.3527 0.22300925
+ 985 23.221019 -7315.3526 0.22305293
+ 986 23.240034 -7315.3526 0.22309548
+ 987 23.259107 -7315.3525 0.2231369
+ 988 23.278317 -7315.3524 0.2231772
+ 989 23.29729 -7315.3524 0.22321637
+ 990 23.324356 -7315.3523 0.22325442
+ 991 23.343342 -7315.3523 0.22329133
+ 992 23.362212 -7315.3522 0.22332712
+ 993 23.381156 -7315.3521 0.22336179
+ 994 23.40012 -7315.3521 0.22339532
+ 995 23.419104 -7315.352 0.22342773
+ 996 23.43806 -7315.352 0.22345901
+ 997 23.457105 -7315.3519 0.22348916
+ 998 23.476011 -7315.3518 0.22351819
+ 999 23.494921 -7315.3518 0.22354609
+ 1000 23.540198 -7315.3517 0.22357286
+Loop time of 23.5402 on 4 procs for 1000 steps with 1008 atoms
-Pair time (%) = 4.14521 (4.48965)
-Neigh time (%) = 0.636156 (0.689016)
-Comm time (%) = 6.31341 (6.838)
-Outpt time (%) = 10.2982 (11.1539)
-Other time (%) = 70.9353 (76.8295)
+Pair time (%) = 3.17852 (13.5025)
+Neigh time (%) = 0.161479 (0.685971)
+Comm time (%) = 0.363868 (1.54573)
+Outpt time (%) = 0.774343 (3.28945)
+Other time (%) = 19.062 (80.9763)
Nlocal: 252 ave 256 max 248 min
Histogram: 1 0 0 0 0 2 0 0 0 1
Nghost: 103 ave 140 max 68 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 15183 ave 15624 max 14492 min
Histogram: 1 0 0 0 1 0 0 0 0 2
Total # of neighbors = 60732
Ave neighs/atom = 60.25
Neighbor list builds = 100
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/cnt_electrostatic2.screen b/examples/USER/atc/elastic/cnt_electrostatic2.screen
index ff9170385..5bfa727c0 100644
--- a/examples/USER/atc/elastic/cnt_electrostatic2.screen
+++ b/examples/USER/atc/elastic/cnt_electrostatic2.screen
@@ -1,214 +1,215 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style atomic
lattice diamond 3.6
Lattice spacing in x,y,z = 3.6 3.6 3.6
boundary f f f
#region box block -4.3458792459312239 4.3458792459312328 -4.3458792459312168 4.3458792459312203 0.0 104.29551668 units box
#region box block 0 10 0 10 0 10
#create_box 1 box
#group box region box
#atom_modify sort 0 1
pair_style tersoff
read_data tube_8_4.data
Reading data file ...
orthogonal box = (-4.34588 -4.34588 0) to (4.34588 4.34588 104.296)
1 by 1 by 4 MPI processor grid
1008 atoms
1008 velocities
pair_coeff * * ../../../../potentials/SiC.tersoff C
mass * 12.01
# PARAMETERS-----------------------------
variable L equal zhi-zlo
variable R equal 12.1/2
variable xhiFE equal 5.0*$R
variable xhiFE equal 5.0*6.0499999999999998224
variable xloFE equal -${xhiFE}
variable xloFE equal -30.25
variable yhiFE equal $R
variable yhiFE equal 6.0499999999999998224
variable yloFE equal -${xhiFE}
variable yloFE equal -30.25
variable zhiFE equal zhi
variable zloFE equal zlo+10
print "Length $L [${zloFE}, ${zhiFE}]"
Length 104.29551668000000575 [10, 104.29551668000000575]
variable E equal 0.01 # 1.0 10.0 0.01
variable V equal $E*${zloFE}
variable V equal 0.010000000000000000208*${zloFE}
variable V equal 0.010000000000000000208*10
variable V equal 2
print "Electric field $E ref.voltage $V"
Electric field 0.010000000000000000208 ref.voltage 2
variable s equal 20
# END -----------------------------------
# all atoms simulation
region feRegion block ${xloFE} ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -30.25 ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -30.25 6.0499999999999998224 ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -30.25 6.0499999999999998224 10 ${zhiFE} units box
region feRegion block -30.25 30.25 -30.25 6.0499999999999998224 10 104.29551668000000575 units box
group internal region feRegion
908 atoms in group internal
variable nAll equal count(all)
variable nGhost equal count(all)-count(internal)
print ">>> number of stationary ghosts: ${nGhost} of ${nAll}"
>>> number of stationary ghosts: 100 of 1008
#neighbor 5. bin
#neigh_modify every 10 delay 0 check no
timestep 0.0005
# coupling
fix AtC internal atc electrostatic-equilibrium CNT_electrostatic2.mat
ATC: constructing equilibrium electrostatic coupling with parameter file CNT_electrostatic2.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_electrostatic2.mat
ATC: creating electrostatic extrinsic model
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_electrostatic2.mat
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_electrostatic2.mat
fix_modify AtC omit atomic_charge
#fix_modify AtC internal_quadrature off <<<< ???
variable alat equal 1.42
variable w equal ${alat}*${alat}*3.*sqrt(3.)/4.0
variable w equal 1.4199999999999999289*${alat}*3.*sqrt(3.)/4.0
variable w equal 1.4199999999999999289*1.4199999999999999289*3.*sqrt(3.)/4.0
#variable w equal 10
fix_modify AtC atom_weight constant internal $w
fix_modify AtC atom_weight constant internal 2.6193804362864128166
fix_modify AtC source_integration atom
fix_modify AtC atom_element_map eulerian 1
fix_modify AtC mesh create 5 1 12 feRegion f p f
ATC: created uniform mesh with 156 nodes, 78 unique nodes, and 60 elements
fix_modify AtC control momentum flux
#fix_modify AtC extrinsic poisson_solver max_iterations 5
# initial conditions
fix_modify AtC initial displacement x all 0.0
fix_modify AtC initial displacement y all 0.0
fix_modify AtC initial displacement z all 0.0
fix_modify AtC initial velocity x all 0.0
fix_modify AtC initial velocity y all 0.0
fix_modify AtC initial velocity z all 0.0
#variable a equal -$R-0.1
#variable b equal $R+0.1
#fix_modify AtC mesh create_nodeset tube $a $b $a $b ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset lbc ${xloFE} ${xhiFE} ${xloFE} ${xhiFE} ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc -30.25 ${xhiFE} ${xloFE} ${xhiFE} ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc -30.25 30.25 ${xloFE} ${xhiFE} ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc -30.25 30.25 -30.25 ${xhiFE} ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc -30.25 30.25 -30.25 30.25 ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc -30.25 30.25 -30.25 30.25 10 ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc -30.25 30.25 -30.25 30.25 10 10 units box
ATC: created nodeset lbc with 6 nodes
fix_modify AtC mesh create_nodeset rbc ${xloFE} ${xhiFE} ${xloFE} ${xhiFE} ${zhiFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc -30.25 ${xhiFE} ${xloFE} ${xhiFE} ${zhiFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc -30.25 30.25 ${xloFE} ${xhiFE} ${zhiFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc -30.25 30.25 -30.25 ${xhiFE} ${zhiFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc -30.25 30.25 -30.25 30.25 ${zhiFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc -30.25 30.25 -30.25 30.25 104.29551668000000575 ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc -30.25 30.25 -30.25 30.25 104.29551668000000575 104.29551668000000575 units box
ATC: created nodeset rbc with 6 nodes
fix_modify AtC mesh create_nodeset bot ${xloFE} ${xloFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.25 ${xloFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.25 -30.25 ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.25 -30.25 -30.25 ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.25 -30.25 -30.25 6.0499999999999998224 ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.25 -30.25 -30.25 6.0499999999999998224 10 ${zhiFE} units box
fix_modify AtC mesh create_nodeset bot -30.25 -30.25 -30.25 6.0499999999999998224 10 104.29551668000000575 units box
ATC: created nodeset bot with 13 nodes
fix_modify AtC mesh create_nodeset top ${xhiFE} ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.25 ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.25 30.25 ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.25 30.25 -30.25 ${yhiFE} ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.25 30.25 -30.25 6.0499999999999998224 ${zloFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.25 30.25 -30.25 6.0499999999999998224 10 ${zhiFE} units box
fix_modify AtC mesh create_nodeset top 30.25 30.25 -30.25 6.0499999999999998224 10 104.29551668000000575 units box
ATC: created nodeset top with 13 nodes
# boundary conditions
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix displacement y lbc 0.
fix_modify AtC fix displacement z lbc 0.
fix_modify AtC fix velocity x lbc 0.
fix_modify AtC fix velocity y lbc 0.
fix_modify AtC fix velocity z lbc 0.
fix_modify AtC fix electric_potential lbc linear 0 0 0 $E 0 0 $V
fix_modify AtC fix electric_potential lbc linear 0 0 0 0.010000000000000000208 0 0 $V
fix_modify AtC fix electric_potential lbc linear 0 0 0 0.010000000000000000208 0 0 2
ATC: created function : 2 + 0.01(x-0)+0(y-0)+0(z-0)
#fix_modify AtC fix electric_potential rbc linear 0 0 0 $E 0 0 $V
##fix_modify AtC fix electric_potential top linear 0 0 0 $E 0 0 $V
fix_modify AtC fix electric_potential bot linear 0 0 0 $E 0 0 $V
fix_modify AtC fix electric_potential bot linear 0 0 0 0.010000000000000000208 0 0 $V
fix_modify AtC fix electric_potential bot linear 0 0 0 0.010000000000000000208 0 0 2
ATC: created function : 2 + 0.01(x-0)+0(y-0)+0(z-0)
# run
thermo_style custom step cpu etotal ke
thermo $s
thermo 20
fix_modify AtC output cnt_electrostatic2FE $s full_text # binary
fix_modify AtC output cnt_electrostatic2FE 20 full_text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC output index step
# NOTE not recognized as vector by paraview
variable uX atom x-f_AtC[1]
variable uY atom y-f_AtC[2]
variable uZ atom z-f_AtC[3]
variable rho atom mass*f_AtC[4]
dump CONFIG all custom $s cnt_electrostatic2.dmp id type x y z v_uX v_uY v_uZ v_rho
dump CONFIG all custom 20 cnt_electrostatic2.dmp id type x y z v_uX v_uY v_uZ v_rho
log cnt_electrostatic2.log
#run $s
run 100
Setting up run ...
ATC: WARNING: all initial conditions for electron_density have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for electric_potential have not been defined and the undefined are assumed zero
Memory usage per processor = 53.9593 Mbytes
Step CPU TotEng KinEng
0 0 -7315.3918 4.2386027e-06
- 20 7.0248148 -7315.3918 0.0003453277
- 40 8.5434699 -7315.3918 0.0012274403
- 60 14.682407 -7315.3918 0.0026370119
- 80 21.289801 -7315.3918 0.004552872
- 100 29.208281 -7315.3918 0.0069472253
-Loop time of 29.2009 on 4 procs for 100 steps with 1008 atoms
-
-Pair time (%) = 0.305472 (1.04611)
+ 20 0.77713203 -7315.3918 0.0003453277
+ 40 1.406508 -7315.3918 0.0012274403
+ 60 2.4594879 -7315.3918 0.0026370119
+ 80 3.0469959 -7315.3918 0.004552872
+ 100 3.6344919 -7315.3918 0.0069472253
+Loop time of 3.63452 on 4 procs for 100 steps with 1008 atoms
+
+Pair time (%) = 0.208631 (5.74027)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.435163 (1.49024)
-Outpt time (%) = 0.202401 (0.693134)
-Other time (%) = 28.2578 (96.7705)
+Comm time (%) = 0.0310229 (0.853562)
+Outpt time (%) = 0.0790334 (2.17452)
+Other time (%) = 3.31584 (91.2316)
Nlocal: 252 ave 256 max 248 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 59 ave 80 max 40 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 4456 ave 4608 max 4304 min
Histogram: 1 0 0 0 1 1 0 0 0 1
Total # of neighbors = 17824
Ave neighs/atom = 17.6825
Neighbor list builds = 0
Dangerous builds = 0
# NOTE try fix charge on tip
diff --git a/examples/USER/atc/elastic/cnt_fixed_charge.screen b/examples/USER/atc/elastic/cnt_fixed_charge.screen
index d0cfef099..6416b2090 100644
--- a/examples/USER/atc/elastic/cnt_fixed_charge.screen
+++ b/examples/USER/atc/elastic/cnt_fixed_charge.screen
@@ -1,350 +1,351 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style charge
dielectric 1.
variable type string "_charge"
boundary s s f
# read in CNT
read_data cnt_9_0_100${type}.data
read_data cnt_9_0_100_charge.data
Reading data file ...
orthogonal box = (-7.04598 -7.04598 0) to (7.04598 7.04598 100)
1 by 1 by 4 MPI processor grid
846 atoms
lattice diamond 3.6 # NOTE ???
Lattice spacing in x,y,z = 3.6 3.6 3.6
pair_style airebo 3.0
pair_coeff * * ./CH.airebo C
mass * 12.01
# PARAMETERS-----------------------------
variable dt equal 0.0005
variable L equal zhi-zlo
variable zhi equal zhi
variable zTip equal ${zhi}-2.0
variable zTip equal 100-2.0
variable zFree equal zhi
variable R equal 12.1/2
variable xhiFE equal 5.0*$R
variable xhiFE equal 5.0*6.0499999999999998224
variable xloFE equal -${xhiFE}
variable xloFE equal -30.25
variable yhiFE equal $R
variable yhiFE equal 6.0499999999999998224
variable yloFE equal -${yhiFE}
variable yloFE equal -6.0499999999999998224
variable zloFE equal zlo+10 # create fixed ghosts
variable zhiFE equal zhi+(zhi-${zloFE})/12*2
variable zhiFE equal zhi+(zhi-10)/12*2
variable Lfree equal zhi-${zloFE}
variable Lfree equal zhi-10
variable nx equal 10 # 5
variable nz equal 14 # 12
print "Length $L [${zloFE}, ${zhiFE}] ${zTip}"
Length 100 [10, 115] 98
#variable E equal 0.1 # bias 1.0
variable Vb equal 0.0 # bias
variable Vg equal 0.5 # gate/modulation
print "bias voltage ${Vb}, gate voltage ${Vg}"
bias voltage 0, gate voltage 0.5
variable n equal 100000
variable s equal 250
# END -----------------------------------
# all atoms simulation
region feRegion block ${xloFE} ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 6.0499999999999998224 ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 6.0499999999999998224 10 ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 6.0499999999999998224 10 115 units box
group internal region feRegion
756 atoms in group internal
group fixed subtract all internal
90 atoms in group fixed
fix FIX fixed setforce 0 0 0
thermo 100
#minimize 0 0 1000 1000
#write_restart cnt_in_box0.rst
region TIP block INF INF INF INF ${zTip} INF units box
region TIP block INF INF INF INF 98 INF units box
group TIP region TIP
9 atoms in group TIP
variable nAll equal count(all)
variable nGhost equal count(all)-count(internal)
variable nTip equal count(TIP)
print ">>> number of stationary ghosts: ${nGhost} of ${nAll}"
>>> number of stationary ghosts: 90 of 846
print ">>> number of tip atoms : ${nTip}"
>>> number of tip atoms : 9
neighbor 5. bin
neigh_modify every 10 delay 0 check no
timestep ${dt}
timestep 0.00050000000000000001041
variable tag string "cnt_fixed_charge"
# set charge on tip
variable C equal -0.1 # -0.01 -0.0001102
print "charge $C [e]"
charge -0.10000000000000000555 [e]
variable c equal $C/${nTip}
variable c equal -0.10000000000000000555/${nTip}
variable c equal -0.10000000000000000555/9
set group TIP charge $c
set group TIP charge -0.011111111111111111535
Setting atom values ...
9 settings made for charge
# coupling
fix AtC internal atc electrostatic CNT_id.mat
ATC: constructing electrostatic mechanical coupling with parameter file CNT_id.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_id.mat
ATC: creating electrostatic extrinsic model
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_id.mat
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_id.mat
fix_modify AtC include atomic_charge
fix_modify AtC internal_quadrature off
# note weights don't affect phi or f
fix_modify AtC atom_weight constant internal 1.0
fix_modify AtC extrinsic short_range off
#fix_modify AtC atom_element_map eulerian 1
fix_modify AtC control momentum flux
fix_modify AtC mesh create ${nx} 1 ${nz} feRegion f p f
fix_modify AtC mesh create 10 1 ${nz} feRegion f p f
fix_modify AtC mesh create 10 1 14 feRegion f p f
ATC: created uniform mesh with 330 nodes, 165 unique nodes, and 140 elements
# initial conditions
fix_modify AtC initial displacement x all 0.0
fix_modify AtC initial displacement y all 0.0
fix_modify AtC initial displacement z all 0.0
fix_modify AtC initial velocity x all 0.0
fix_modify AtC initial velocity y all 0.0
fix_modify AtC initial velocity z all 0.0
fix_modify AtC initial electric_potential all 0.0
# node sets
variable t equal 1.1*$R
variable t equal 1.1*6.0499999999999998224
fix_modify AtC mesh create_nodeset tube -$t $t -$t $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 $t -$t $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -$t $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 100 units box
ATC: created nodeset tube with 39 nodes
fix_modify AtC mesh create_nodeset lefttube -$t $t -$t $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 $t -$t $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -$t $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 10 units box
ATC: created nodeset lefttube with 3 nodes
fix_modify AtC mesh create_nodeset rbc INF INF INF INF ${zhiFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc INF INF INF INF 115 ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc INF INF INF INF 115 115 units box
ATC: created nodeset rbc with 11 nodes
fix_modify AtC mesh create_nodeset lbc INF INF INF INF ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc INF INF INF INF 10 ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc INF INF INF INF 10 10 units box
ATC: created nodeset lbc with 11 nodes
fix_modify AtC mesh create_nodeset top ${xhiFE} ${xhiFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset top 30.25 ${xhiFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset top 30.25 30.25 INF INF INF INF units box
ATC: created nodeset top with 15 nodes
fix_modify AtC mesh create_nodeset bot ${xloFE} ${xloFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset bot -30.25 ${xloFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset bot -30.25 -30.25 INF INF INF INF units box
ATC: created nodeset bot with 15 nodes
# boundary conditions
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix displacement y lbc 0.
fix_modify AtC fix displacement z lbc 0.
fix_modify AtC fix velocity x lbc 0.
fix_modify AtC fix velocity y lbc 0.
fix_modify AtC fix velocity z lbc 0.
# ground
fix_modify AtC fix electric_potential lbc 0
# bias
fix_modify AtC fix electric_potential rbc ${Vb}
fix_modify AtC fix electric_potential rbc 0
# gate
fix_modify AtC fix electric_potential bot ${Vg}
fix_modify AtC fix electric_potential bot 0.5
# run
compute CM TIP com
compute q all property/atom q
compute Q all reduce sum c_q
compute FSUM all reduce sum fx fy fz
thermo_style custom step etotal ke c_CM[1] c_CM[2] c_CM[3] c_Q f_AtC[4] f_AtC[5] f_AtC[6] f_AtC[7] f_FIX[1] f_FIX[2] f_FIX[3] f_AtC c_FSUM[1]
thermo $s
thermo 250
log ${tag}.log
log cnt_fixed_charge.log
#run $n
#run $n
thermo 10
timestep 0.0
min_modify line quadratic
minimize 0 0 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: WARNING: all initial conditions for electron_density have not been defined and the undefined are assumed zero
ATC: WARNING: material: [cnt0] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt0] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 54.7522 Mbytes
Step TotEng KinEng CM[1] CM[2] CM[3] Q AtC[4] AtC[5] AtC[6] AtC[7] FIX[1] FIX[2] FIX[3] AtC FSUM[1]
0 -6146.2653 0 -1.2222229e-10 1.1111297e-10 98.69 -0.1 0 0 0 -0.00094915808 9.0465829e-16 -2.9442594e-15 8.5762791 0.26756106 -0.00094915808
10 -6148.5953 0 -2.4439829e-05 -2.2098859e-10 98.493704 -0.1 0 0 0 -0.00094915808 1.2097899e-09 -1.5843514e-09 8.9290595 0.26659976 -0.00094915929
20 -6149.6563 0 -0.0001026377 -1.2280254e-10 98.220511 -0.1 0 0 0 -0.00094915808 -1.2490271e-10 1.3882666e-11 9.0170586 0.26585869 -0.00094915796
30 -6150.5918 0 -0.00018409212 -1.5241986e-10 98.082714 -0.1 0 0 0 -0.00094915808 1.1496787e-09 -5.0626918e-10 8.9773134 0.26549134 -0.00094915923
40 -6151.5228 0 -0.00028729352 -1.255161e-10 97.911408 -0.1 0 0 0 -0.00094915808 -7.0229746e-12 2.277342e-10 8.9692427 0.26498393 -0.00094915808
50 -6152.4762 0 -0.00040932626 -1.3818574e-12 97.725058 -0.1 0 0 0 -0.00094915808 6.9526046e-11 1.9786892e-10 8.9900875 0.26449594 -0.00094915815
60 -6153.4274 0 -0.00055067345 1.805009e-10 97.514368 -0.1 0 0 0 -0.00094915808 -2.4739767e-10 5.8424452e-10 8.9790629 0.26387994 -0.00094915784
70 -6154.3557 0 -0.00070066137 1.0114613e-10 97.330744 -0.1 0 0 0 -0.00094915808 -2.6211632e-10 7.052493e-10 8.9849075 0.26339716 -0.00094915782
80 -6155.267 0 -0.00085596687 -1.0710927e-10 97.147959 -0.1 0 0 0 -0.00094915808 4.4143026e-07 1.6718385e-10 5.3206144 0.26285936 -0.00094959951
90 -6155.4335 0 -0.00088765763 -1.7962733e-11 97.118985 -0.1 0 0 0 -0.00094915808 -3.2852156e-07 -2.142539e-10 1.9421081 0.2627935 -0.00094882956
100 -6155.4688 0 -0.00092338115 4.3179489e-12 97.108467 -0.1 0 0 0 -0.00094915808 2.1921637e-06 3.277627e-10 1.8128583 0.26276227 -0.00095135025
110 -6155.4937 0 -0.0009583995 2.7080132e-11 97.099066 -0.1 0 0 0 -0.00094915808 -6.6593497e-07 3.1466135e-10 1.6760028 0.26273976 -0.00094849215
120 -6155.5192 0 -0.0010096681 7.5495905e-12 97.084131 -0.1 0 0 0 -0.00094915808 4.1925486e-06 -3.3057391e-10 0.84688966 0.26269582 -0.00095335063
130 -6155.5475 0 -0.0010984064 -2.2204658e-11 97.037469 -0.1 0 0 0 -0.00094915808 1.6487881e-05 7.877601e-10 -0.24391523 0.26256701 -0.00096564596
140 -6155.5674 0 -0.0011643139 -5.8625528e-12 96.997016 -0.1 0 0 0 -0.00094915808 1.9922307e-05 2.8145019e-10 0.21107429 0.26245307 -0.00096908039
150 -6155.5802 0 -0.0012261174 1.6615978e-12 96.978462 -0.1 0 0 0 -0.00094915808 2.3564757e-05 -6.1453672e-10 0.34197533 0.26240133 -0.00097272284
160 -6155.5842 0 -0.0012567683 4.1015453e-12 96.969841 -0.1 0 0 0 -0.00094915808 -1.8048071e-05 -7.4358615e-10 0.24350595 0.26237804 -0.00093111001
170 -6155.5848 0 -0.0012749252 3.2100637e-12 96.96678 -0.1 0 0 0 -0.00094915808 -5.8709343e-05 -1.0101609e-10 0.23678759 0.26236915 -0.00089044874
180 -6155.5863 0 -0.0013921995 9.5094171e-12 96.955174 -0.1 0 0 0 -0.00094915808 -0.00026288245 2.257e-09 0.27067485 0.2623373 -0.00068627564
190 -6155.5869 0 -0.001448131 2.9297299e-11 96.95023 -0.1 0 0 0 -0.00094915808 -0.00022357532 -5.3015481e-10 0.25119591 0.26232192 -0.00072558276
200 -6155.5875 0 -0.0015072261 1.2995721e-11 96.946996 -0.1 0 0 0 -0.00094915808 3.676363e-06 -1.6247639e-09 0.14855078 0.26231405 -0.00095283445
210 -6155.5884 0 -0.0016446609 -5.6541246e-11 96.941051 -0.1 0 0 0 -0.00094915808 0.00012779831 5.5608749e-09 0.071556101 0.2622972 -0.0010769564
220 -6155.5885 0 -0.0016649389 -1.4916073e-11 96.940172 -0.1 0 0 0 -0.00094915808 2.8769126e-05 7.3325474e-10 0.072836172 0.26229459 -0.00097792721
230 -6155.5886 0 -0.0016840656 3.0271757e-11 96.93972 -0.1 0 0 0 -0.00094915808 -8.2275147e-05 -3.2732419e-09 0.038242471 0.26229362 -0.00086688294
240 -6155.5886 0 -0.0017104776 1.1844187e-12 96.939312 -0.1 0 0 0 -0.00094915808 1.3323934e-06 4.6833365e-10 0.029894245 0.2622922 -0.00095049048
250 -6155.5886 0 -0.001782375 -5.1737556e-11 96.938585 -0.1 0 0 0 -0.00094915808 0.00010776134 5.532132e-09 0.015593573 0.26229021 -0.0010569194
260 -6155.5886 0 -0.0018325003 1.4170213e-11 96.938021 -0.1 0 0 0 -0.00094915808 -0.00011466701 -1.8404319e-09 0.0074676942 0.26228875 -0.00083449107
270 -6155.5887 0 -0.0018909045 4.5008271e-12 96.93745 -0.1 0 0 0 -0.00094915808 0.00013183246 -4.7505827e-10 0.012466474 0.26228709 -0.0010809905
280 -6155.5887 0 -0.0019654593 -2.0855882e-11 96.936554 -0.1 0 0 0 -0.00094915808 0.000169485 -5.926811e-11 -0.0067531896 0.26228461 -0.0011186431
290 -6155.5887 0 -0.0020221999 -8.6767858e-12 96.935891 -0.1 0 0 0 -0.00094915808 -5.3692915e-05 1.0159278e-09 -0.0018194713 0.26228254 -0.00089546517
300 -6155.5887 0 -0.0020344145 -5.607299e-14 96.935775 -0.1 0 0 0 -0.00094915808 -1.5062541e-05 3.3229655e-10 0.0029236218 0.26228228 -0.00093409554
310 -6155.5887 0 -0.0020565506 -8.9663374e-12 96.935684 -0.1 0 0 0 -0.00094915808 0.00020002046 -1.267435e-09 0.003519094 0.26228199 -0.0011491785
320 -6155.5887 0 -0.0021315555 -1.4536397e-11 96.93549 -0.1 0 0 0 -0.00094915808 0.00011130878 1.691832e-10 0.0035264974 0.26228133 -0.0010604669
330 -6155.5887 0 -0.0021892704 2.8975537e-12 96.935359 -0.1 0 0 0 -0.00094915808 2.1304961e-05 -6.0918033e-10 0.0032239388 0.26228087 -0.00097046304
340 -6155.5887 0 -0.002267819 2.8726725e-12 96.935208 -0.1 0 0 0 -0.00094915808 -0.00012295621 1.4278825e-09 0.0015958494 0.26228031 -0.00082620188
350 -6155.5887 0 -0.0023365018 7.5696565e-12 96.935104 -0.1 0 0 0 -0.00094915808 -3.8319531e-05 2.8702501e-10 -0.00070205167 0.26227999 -0.00091083855
360 -6155.5887 0 -0.00237721 -9.4045843e-12 96.935064 -0.1 0 0 0 -0.00094915808 0.00015892958 -1.1733697e-09 -0.0021409156 0.26227985 -0.0011080877
370 -6155.5887 0 -0.0024126534 -1.8974906e-11 96.935058 -0.1 0 0 0 -0.00094915808 0.00013759568 4.1426828e-10 -0.0021373479 0.26227982 -0.0010867538
380 -6155.5887 0 -0.0024420366 3.1870067e-12 96.93505 -0.1 0 0 0 -0.00094915808 6.0222094e-05 -4.9318939e-10 -0.0021696981 0.26227978 -0.0010093802
390 -6155.5887 0 -0.0024987512 -6.1806174e-12 96.935034 -0.1 0 0 0 -0.00094915808 -2.1228292e-06 2.8515227e-10 -0.0022646942 0.2622797 -0.00094703525
400 -6155.5887 0 -0.002653766 -1.4619372e-11 96.93499 -0.1 0 0 0 -0.00094915808 0.00013021546 1.1233177e-09 -0.0033420787 0.26227949 -0.0010793735
410 -6155.5887 0 -0.0028422882 -1.292254e-11 96.934928 -0.1 0 0 0 -0.00094915808 0.00020536826 -5.0886e-10 -0.0049198922 0.26227921 -0.0011545263
420 -6155.5887 0 -0.0030173435 -1.0655446e-11 96.934865 -0.1 0 0 0 -0.00094915808 0.00011114747 -2.5969168e-10 -0.0048225266 0.2622789 -0.0010603056
430 -6155.5887 0 -0.0032602753 -2.4154772e-11 96.934789 -0.1 0 0 0 -0.00094915808 0.00035483493 1.6053604e-10 -0.0043785731 0.26227846 -0.001303993
440 -6155.5887 0 -0.0036112872 -5.6473718e-11 96.934705 -0.1 0 0 0 -0.00094915808 0.00043425018 1.8745787e-10 -0.0038812537 0.26227785 -0.0013834083
450 -6155.5887 0 -0.0038611908 -1.9242305e-12 96.934666 -0.1 0 0 0 -0.00094915808 0.0001243155 -3.6471408e-10 -0.0050455501 0.26227745 -0.0010734736
460 -6155.5887 0 -0.0042622211 -1.1948937e-11 96.93463 -0.1 0 0 0 -0.00094915808 0.00017733896 -5.9650038e-10 -0.005090118 0.26227685 -0.001126497
470 -6155.5887 0 -0.0051704959 -6.5555834e-11 96.93456 -0.1 0 0 0 -0.00094915808 0.00044796055 2.0162891e-09 -0.0063013863 0.26227558 -0.0013971186
480 -6155.5887 0 -0.0058774787 8.0639107e-12 96.934537 -0.1 0 0 0 -0.00094915808 0.00030232037 -4.1063286e-10 -0.0063827796 0.26227474 -0.0012514785
490 -6155.5887 0 -0.0071402115 -4.9061812e-11 96.934554 -0.1 0 0 0 -0.00094915808 0.00014674646 -1.4276993e-09 -0.0085602294 0.26227356 -0.0010959045
500 -6155.5887 0 -0.0089111607 -5.2606473e-11 96.934565 -0.1 0 0 0 -0.00094915808 0.00062500656 6.8011742e-10 -0.0084420596 0.26227196 -0.0015741646
-Loop time of 106.653 on 4 procs for 500 steps with 846 atoms
+Loop time of 35.8016 on 4 procs for 500 steps with 846 atoms
Minimization stats:
Stopping criterion = max force evaluations
Energy initial, next-to-last, final =
-6146.26527937 -6155.58874802 -6155.58874805
Force two-norm initial, final = 9.08614 0.00211093
Force max component initial, final = 2.35984 0.000212848
Final line search alpha, max atom move = 1 0.000212848
Iterations, force evaluations = 500 1000
-Pair time (%) = 9.67218 (9.06879)
+Pair time (%) = 7.56243 (21.1232)
Neigh time (%) = 0 (0)
-Comm time (%) = 6.7444 (6.32366)
-Outpt time (%) = 2.93299 (2.75002)
-Other time (%) = 87.3039 (81.8575)
+Comm time (%) = 0.909729 (2.54103)
+Outpt time (%) = 0.470353 (1.31378)
+Other time (%) = 26.859 (75.022)
Nlocal: 211.5 ave 216 max 207 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 191.25 ave 261 max 126 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 47313 ave 52056 max 42570 min
Histogram: 1 0 1 0 0 0 0 1 0 1
Total # of neighbors = 189252
Ave neighs/atom = 223.702
Neighbor list builds = 0
Dangerous builds = 0
# u = F L^3 / 3 EI --> EI = F L^3 / 3 u
variable u equal c_CM[1]
variable F equal f_AtC[5]
# [eV/A * A^2] --> [N m]
variable eV2J equal 1.60217646e-19
variable A2m equal 1.e-10
variable EI equal $F*${Lfree}*${Lfree}*${Lfree}/3./$u
variable EI equal 0*${Lfree}*${Lfree}*${Lfree}/3./$u
variable EI equal 0*90*${Lfree}*${Lfree}/3./$u
variable EI equal 0*90*90*${Lfree}/3./$u
variable EI equal 0*90*90*90/3./$u
variable EI equal 0*90*90*90/3./-0.0089111606622158945346
variable EI equal ${EI}*${eV2J}*${A2m}
variable EI equal -0*${eV2J}*${A2m}
variable EI equal -0*1.6021764600000000642e-19*${A2m}
variable EI equal -0*1.6021764600000000642e-19*1.0000000000000000364e-10
print "flexural rigidity ${EI} [Nm^2] NOTE z force"
flexural rigidity -0 [Nm^2] NOTE z force
# flexural rigidity 6.716732985e-25 [Nm^2]
fix_modify AtC output ${tag}FE 1 full_text
fix_modify AtC output cnt_fixed_chargeFE 1 full_text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC output index step
run 1
Setting up run ...
ATC: WARNING: material: [cnt0] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt0] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 54.1206 Mbytes
Step TotEng KinEng CM[1] CM[2] CM[3] Q AtC[4] AtC[5] AtC[6] AtC[7] FIX[1] FIX[2] FIX[3] AtC FSUM[1]
500 -6155.5887 0 -0.0089111607 -5.2606424e-11 96.934565 -0.1 0 0 0 -0.00094915808 0.00062500656 6.8011742e-10 -0.0084420596 0.26227196 -0.0015741646
501 -6155.5887 0 -0.0089111607 -5.2606424e-11 96.934565 -0.1 0 0 0 -0.00094915808 0.00062500656 6.8011742e-10 -0.0084420596 0.26227196 -0.0015741646
-Loop time of 0.0591159 on 4 procs for 1 steps with 846 atoms
+Loop time of 0.0582818 on 4 procs for 1 steps with 846 atoms
-Pair time (%) = 0.00747705 (12.6481)
+Pair time (%) = 0.0074538 (12.7892)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000546396 (0.924278)
-Outpt time (%) = 0.0172972 (29.2598)
-Other time (%) = 0.0337953 (57.1678)
+Comm time (%) = 0.000557423 (0.956426)
+Outpt time (%) = 0.0170317 (29.2229)
+Other time (%) = 0.0332389 (57.0314)
Nlocal: 211.5 ave 216 max 198 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 195.75 ave 261 max 126 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 48199.5 ave 53136 max 41085 min
Histogram: 1 0 0 1 0 0 0 0 0 2
Total # of neighbors = 192798
Ave neighs/atom = 227.894
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/eam_energy.screen b/examples/USER/atc/elastic/eam_energy.screen
index 4f035ca85..55bd96e95 100644
--- a/examples/USER/atc/elastic/eam_energy.screen
+++ b/examples/USER/atc/elastic/eam_energy.screen
@@ -1,333 +1,335 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style atomic
atom_modify map hash
boundary p p p
variable l equal 3
variable l2 equal 0.5*$l
variable l2 equal 0.5*3
variable L equal 10
variable L2 equal 0.5*$L
variable L2 equal 0.5*10
variable h equal $L
variable h equal 10
lattice fcc 4.08 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 4.08 4.08 4.08
region BOX block -${l2} ${l2} -${L2} ${L2} -${l2} ${l2}
region BOX block -1.5 ${l2} -${L2} ${L2} -${l2} ${l2}
region BOX block -1.5 1.5 -${L2} ${L2} -${l2} ${l2}
region BOX block -1.5 1.5 -5 ${L2} -${l2} ${l2}
region BOX block -1.5 1.5 -5 5 -${l2} ${l2}
region BOX block -1.5 1.5 -5 5 -1.5 ${l2}
region BOX block -1.5 1.5 -5 5 -1.5 1.5
create_box 1 BOX
Created orthogonal box = (-6.12 -20.4 -6.12) to (6.12 20.4 6.12)
1 by 4 by 1 MPI processor grid
create_atoms 1 region BOX
Created 360 atoms
pair_style eam
pair_coeff * * Au_u3.eam
mass * 196.97
### NOTE change to CB -linear
fix PP all atc field Au_elastic.mat
ATC: constructing shape function field estimate with parameter file Au_elastic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify PP mesh create 1 $h 1 BOX p f p
fix_modify PP mesh create 1 10 1 BOX p f p
ATC: created uniform mesh with 44 nodes, 11 unique nodes, and 10 elements
fix_modify PP fields add displacement velocity potential_energy cauchy_born_energy # kinetic_energy
fix_modify PP gradients add displacement
fix_modify PP set reference_potential_energy
fix_modify PP output counter step
fix_modify PP output eam_energyPP 1 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix ATC all atc elastic Au_elastic.mat
ATC: constructing elastic coupling with parameter file Au_elastic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 11.6006
ATC: computed mass density : 11.6006
ATC: 2 materials defined from Au_elastic.mat
fix_modify ATC mesh create 1 $h 1 BOX p f p
fix_modify ATC mesh create 1 10 1 BOX p f p
ATC: created uniform mesh with 44 nodes, 11 unique nodes, and 10 elements
fix_modify ATC internal_quadrature off
fix_modify ATC control momentum none
#fix_modify ATC consistent_fe_initialization on
fix_modify ATC output counter step
fix_modify ATC output eam_energyFE 1 text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify ATC material all Au_cubic
dump CONFIG all custom 1 eam_energy.dmp id type x y z
thermo 1
timestep 0 # 1.e-20 # 0
variable e0 equal pe
variable L0 equal ly
run 0
Setting up run ...
ATC: CB stiffness: 11.5362 Einstein freq: 4682.34
ATC: CB stiffness: 11.5362 Einstein freq: 4682.34
ATC: WARNING: all initial conditions for displacement have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for velocity have not been defined and the undefined are assumed zero
-Memory usage per processor = 70.4928 Mbytes
+Memory usage per processor = 41.8034 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0 -1414.8 0 -1414.8 0.022463201
-Loop time of 5.76973e-05 on 4 procs for 0 steps with 360 atoms
+Loop time of 7.51019e-06 on 4 procs for 0 steps with 360 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
Comm time (%) = 0 (0)
Outpt time (%) = 0 (0)
-Other time (%) = 5.76973e-05 (100)
+Other time (%) = 7.51019e-06 (100)
Nlocal: 90 ave 90 max 90 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1184 ave 1184 max 1184 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 3870 ave 3870 max 3870 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 7740 ave 7740 max 7740 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 30960
Ave neighs/atom = 86
Neighbor list builds = 0
Dangerous builds = 0
variable pe equal pe-${e0}
variable pe equal pe--1414.8000000636002369
variable dL equal ly-${L0}
variable dL equal ly-40.799999999999997158
variable strain equal v_dL/${L0}
variable strain equal v_dL/40.799999999999997158
variable x equal y[1]
variable x2 equal y[2]
variable v equal vy[1]
thermo_style custom step etotal v_pe ke f_ATC[1] f_ATC[2] v_x v_v v_x2 ly v_dL v_strain
thermo_modify format 2 %15.8g
###############################################################################
log eam_energy.log
run 1
Setting up run ...
-Memory usage per processor = 70.4928 Mbytes
+Memory usage per processor = 41.8034 Mbytes
Step TotEng pe KinEng ATC[1] ATC[2] x v x2 Ly dL strain
0 -1414.8 0 0 0 0 -19.38 0 -19.38 40.8 0 0
1 -1414.8 0 0 0 0 -19.38 0 -19.38 40.8 0 0
-Loop time of 0.220009 on 4 procs for 1 steps with 360 atoms
+Loop time of 0.00547314 on 4 procs for 1 steps with 360 atoms
-Pair time (%) = 0.010402 (4.72801)
+Pair time (%) = 0.000443518 (8.10355)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0269095 (12.2311)
-Outpt time (%) = 0.0771807 (35.0808)
-Other time (%) = 0.105516 (47.9601)
+Comm time (%) = 0.000166178 (3.03624)
+Outpt time (%) = 0.00193131 (35.2871)
+Other time (%) = 0.00293213 (53.5731)
Nlocal: 90 ave 90 max 90 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1184 ave 1184 max 1184 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 3870 ave 3870 max 3870 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 7740 ave 7740 max 7740 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 30960
Ave neighs/atom = 86
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0.1 0 units box
fix_modify ATC fix velocity y all 0.1
run 1
Setting up run ...
-Memory usage per processor = 70.4928 Mbytes
+Memory usage per processor = 41.8034 Mbytes
Step TotEng pe KinEng ATC[1] ATC[2] x v x2 Ly dL strain
1 -1414.7633 0 0.036746101 0 0 -19.38 0.1 -19.38 40.8 0 0
2 -1414.7633 0 0.036746101 0.036746101 0 -19.38 0.1 -19.38 40.8 0 0
-Loop time of 0.305193 on 4 procs for 1 steps with 360 atoms
+Loop time of 0.00696731 on 4 procs for 1 steps with 360 atoms
-Pair time (%) = 0.0104025 (3.4085)
+Pair time (%) = 0.00049299 (7.07576)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0294241 (9.64114)
-Outpt time (%) = 0.132358 (43.3686)
-Other time (%) = 0.133008 (43.5818)
+Comm time (%) = 7.03335e-05 (1.00948)
+Outpt time (%) = 0.00176466 (25.3277)
+Other time (%) = 0.00463933 (66.5871)
Nlocal: 90 ave 90 max 90 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1184 ave 1184 max 1184 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 3870 ave 3870 max 3870 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 7740 ave 7740 max 7740 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 30960
Ave neighs/atom = 86
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0.2 0 units box
fix_modify ATC fix velocity y all 0.2
run 1
Setting up run ...
-Memory usage per processor = 70.4928 Mbytes
+Memory usage per processor = 41.8034 Mbytes
Step TotEng pe KinEng ATC[1] ATC[2] x v x2 Ly dL strain
2 -1414.653 0 0.1469844 0.036746101 0 -19.38 0.2 -19.38 40.8 0 0
3 -1414.653 0 0.1469844 0.1469844 0 -19.38 0.2 -19.38 40.8 0 0
-Loop time of 0.49256 on 4 procs for 1 steps with 360 atoms
+Loop time of 0.00712591 on 4 procs for 1 steps with 360 atoms
-Pair time (%) = 0.0226828 (4.60508)
+Pair time (%) = 0.000424206 (5.95301)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0572202 (11.6169)
-Outpt time (%) = 0.15985 (32.4529)
-Other time (%) = 0.252807 (51.3251)
+Comm time (%) = 0.000171483 (2.40646)
+Outpt time (%) = 0.00183296 (25.7225)
+Other time (%) = 0.00469726 (65.918)
Nlocal: 90 ave 90 max 90 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1184 ave 1184 max 1184 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 3870 ave 3870 max 3870 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 7740 ave 7740 max 7740 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 30960
Ave neighs/atom = 86
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0.3 0 units box
fix_modify ATC fix velocity y all 0.3
run 1
Setting up run ...
-Memory usage per processor = 70.4928 Mbytes
+Memory usage per processor = 41.8034 Mbytes
Step TotEng pe KinEng ATC[1] ATC[2] x v x2 Ly dL strain
3 -1414.4693 0 0.33071491 0.1469844 0 -19.38 0.3 -19.38 40.8 0 0
4 -1414.4693 0 0.33071491 0.33071491 0 -19.38 0.3 -19.38 40.8 0 0
-Loop time of 0.4925 on 4 procs for 1 steps with 360 atoms
+Loop time of 0.00698376 on 4 procs for 1 steps with 360 atoms
-Pair time (%) = 0.0401872 (8.15985)
+Pair time (%) = 0.000411212 (5.88813)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0840666 (17.0694)
-Outpt time (%) = 0.122344 (24.8415)
-Other time (%) = 0.245902 (49.9293)
+Comm time (%) = 6.28233e-05 (0.899563)
+Outpt time (%) = 0.00179219 (25.6623)
+Other time (%) = 0.00471753 (67.55)
Nlocal: 90 ave 90 max 90 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1184 ave 1184 max 1184 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 3870 ave 3870 max 3870 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 7740 ave 7740 max 7740 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 30960
Ave neighs/atom = 86
Neighbor list builds = 0
Dangerous builds = 0
change_box all y scale 1.01 remap
Changing box ...
orthogonal box = (-6.12 -20.604 -6.12) to (6.12 20.604 6.12)
fix_modify ATC fix displacement y all linear 0 0 0 0 0.01 0 0
ATC: created function : 0 + 0(x-0)+0.01(y-0)+0(z-0)
run 1
Setting up run ...
-Memory usage per processor = 70.4928 Mbytes
+Memory usage per processor = 41.8034 Mbytes
Step TotEng pe KinEng ATC[1] ATC[2] x v x2 Ly dL strain
4 -1414.1262 0.34311553 0.33071491 0.33071491 0 -19.5738 0.3 -19.5738 41.208 0.408 0.01
5 -1414.1262 0.34311553 0.33071491 0.33071491 0.34908704 -19.5738 0.3 -19.5738 41.208 0.408 0.01
-Loop time of 0.406034 on 4 procs for 1 steps with 360 atoms
+Loop time of 0.0069952 on 4 procs for 1 steps with 360 atoms
-Pair time (%) = 0.0312375 (7.69333)
+Pair time (%) = 0.000504553 (7.21285)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0279282 (6.87828)
-Outpt time (%) = 0.107298 (26.4259)
-Other time (%) = 0.23957 (59.0025)
+Comm time (%) = 9.93013e-05 (1.41956)
+Outpt time (%) = 0.00179702 (25.6893)
+Other time (%) = 0.00459433 (65.6783)
Nlocal: 90 ave 90 max 90 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1184 ave 1184 max 1184 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 3870 ave 3870 max 3870 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 7740 ave 7740 max 7740 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 30960
Ave neighs/atom = 86
Neighbor list builds = 0
Dangerous builds = 0
change_box all y scale 1.01 remap
Changing box ...
orthogonal box = (-6.12 -20.81 -6.12) to (6.12 20.81 6.12)
fix_modify ATC fix displacement y all linear 0 0 0 0 0.0201 0 0
ATC: created function : 0 + 0(x-0)+0.0201(y-0)+0(z-0)
run 1
Setting up run ...
-Memory usage per processor = 70.4928 Mbytes
+Memory usage per processor = 41.8034 Mbytes
Step TotEng pe KinEng ATC[1] ATC[2] x v x2 Ly dL strain
5 -1413.1082 1.3610604 0.33071491 0.33071491 0 -19.769538 0.3 -19.769538 41.62008 0.82008 0.0201
6 -1413.1082 1.3610604 0.33071491 0.33071491 1.0612595 -19.769538 0.3 -19.769538 41.62008 0.82008 0.0201
-Loop time of 0.0288442 on 4 procs for 1 steps with 360 atoms
+Loop time of 0.00699663 on 4 procs for 1 steps with 360 atoms
-Pair time (%) = 0.000436962 (1.5149)
+Pair time (%) = 0.000416994 (5.95993)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00012219 (0.423618)
-Outpt time (%) = 0.0219155 (75.9788)
-Other time (%) = 0.00636959 (22.0827)
+Comm time (%) = 9.25064e-05 (1.32216)
+Outpt time (%) = 0.00178832 (25.5597)
+Other time (%) = 0.00469881 (67.1582)
Nlocal: 90 ave 90 max 90 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1184 ave 1184 max 1184 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 3870 ave 3870 max 3870 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 7740 ave 7740 max 7740 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 30960
Ave neighs/atom = 86
Neighbor list builds = 0
Dangerous builds = 0
change_box all y scale 1.01 remap
Changing box ...
orthogonal box = (-6.12 -21.0181 -6.12) to (6.12 21.0181 6.12)
fix_modify ATC fix displacement y all linear 0 0 0 0 0.030301 0 0
ATC: created function : 0 + 0(x-0)+0.030301(y-0)+0(z-0)
run 1
Setting up run ...
-Memory usage per processor = 70.4928 Mbytes
+Memory usage per processor = 41.8034 Mbytes
Step TotEng pe KinEng ATC[1] ATC[2] x v x2 Ly dL strain
6 -1411.4328 3.0364818 0.33071491 0.33071491 0 -19.967233 0.3 -19.967233 42.036281 1.2362808 0.030301
7 -1411.4328 3.0364818 0.33071491 0.33071491 1.7947982 -19.967233 0.3 -19.967233 42.036281 1.2362808 0.030301
-Loop time of 0.0317271 on 4 procs for 1 steps with 360 atoms
+Loop time of 0.00717872 on 4 procs for 1 steps with 360 atoms
-Pair time (%) = 0.00369978 (11.6613)
+Pair time (%) = 0.000523448 (7.29166)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00984788 (31.0394)
-Outpt time (%) = 0.00181496 (5.72054)
-Other time (%) = 0.0163645 (51.5788)
+Comm time (%) = 7.17044e-05 (0.998846)
+Outpt time (%) = 0.00184941 (25.7624)
+Other time (%) = 0.00473416 (65.9471)
Nlocal: 90 ave 90 max 90 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1184 ave 1184 max 1184 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 3870 ave 3870 max 3870 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 7740 ave 7740 max 7740 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 30960
Ave neighs/atom = 86
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/electron_density.screen b/examples/USER/atc/elastic/electron_density.screen
index 0a9e41a71..5d70c2f4b 100644
--- a/examples/USER/atc/elastic/electron_density.screen
+++ b/examples/USER/atc/elastic/electron_density.screen
@@ -1,266 +1,267 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
# PARAMETERS-----------------------------
variable s equal 1
variable L equal 10
variable e equal 4
variable E equal 0.0001
variable V equal $E*$L
variable V equal 0.00010000000000000000479*$L
variable V equal 0.00010000000000000000479*10
# END -----------------------------------
atom_style atomic
lattice diamond 1.0
Lattice spacing in x,y,z = 1 1 1
boundary f p p
region box block -$L $L 0 1 0 1
region box block -10 $L 0 1 0 1
region box block -10 10 0 1 0 1
create_box 1 box
Created orthogonal box = (-10 0 0) to (10 1 1)
4 by 1 by 1 MPI processor grid
group box region box
0 atoms in group box
atom_modify sort 0 1
timestep 0.0
mass * 12.01
# coupling
### NOTE ATC: material cnt does not provide all interfaces for charge_density physics and will be treated as null
fix AtC box atc electrostatic-equilibrium CNT.mat
ATC: constructing equilibrium electrostatic coupling with parameter file CNT.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: 7 materials defined from CNT.mat
ATC: creating electrostatic extrinsic model
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: 7 materials defined from CNT.mat
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: computed mass density : 96.08
ATC: 7 materials defined from CNT.mat
fix_modify AtC internal_quadrature off
#fix_modify AtC atom_weight constant internal 1.0 NOTE penultimate is a group
fix_modify AtC atom_weight constant box 1.0
fix_modify AtC omit atomic_charge
fix_modify AtC mesh create $e 1 1 box f p p
fix_modify AtC mesh create 4 1 1 box f p p
ATC: created uniform mesh with 20 nodes, 5 unique nodes, and 4 elements
#fix_modify AtC control momentum flux
fix_modify AtC mesh create_elementset all -INF INF -INF INF -INF INF
ATC: created elementset all with 4 elements
# bcs/ics conditions
fix_modify AtC fix displacement x all 0.0
fix_modify AtC fix displacement y all 0.0
fix_modify AtC fix displacement z all 0.0
fix_modify AtC fix velocity x all 0.0
fix_modify AtC fix velocity y all 0.0
fix_modify AtC fix velocity z all 0.0
fix_modify AtC mesh create_nodeset lbc -10 -10 INF INF INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 10 10 INF INF INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC fix electric_potential lbc linear 0 0 0 $E 0 0 $V
fix_modify AtC fix electric_potential lbc linear 0 0 0 0.00010000000000000000479 0 0 $V
fix_modify AtC fix electric_potential lbc linear 0 0 0 0.00010000000000000000479 0 0 0.0010000000000000000208
ATC: created function : 0.001 + 0.0001(x-0)+0(y-0)+0(z-0)
fix_modify AtC fix electric_potential rbc linear 0 0 0 $E 0 0 $V
fix_modify AtC fix electric_potential rbc linear 0 0 0 0.00010000000000000000479 0 0 $V
fix_modify AtC fix electric_potential rbc linear 0 0 0 0.00010000000000000000479 0 0 0.0010000000000000000208
ATC: created function : 0.001 + 0.0001(x-0)+0(y-0)+0(z-0)
# run
thermo_style custom step cpu etotal ke
thermo $s
thermo 1
fix_modify AtC output electron_densityFE $s text
fix_modify AtC output electron_densityFE 1 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC output index step
log electron_density.log
# run default material
print "default material - table linear"
default material - table linear
run $s
run 1
Setting up run ...
ATC: WARNING: material: [cnt-exp] cannot find body_force
ATC: WARNING: physics model: [], material: [cnt-exp] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt] cannot find body_force
ATC: WARNING: physics model: [], material: [cnt] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: all initial conditions for electron_density have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for electric_potential have not been defined and the undefined are assumed zero
ATC: WARNING: material: [cnt-exp] cannot find body_force
ATC: WARNING: physics model: [equilibrium electrostatic], material: [cnt-exp] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt] cannot find body_force
ATC: WARNING: physics model: [equilibrium electrostatic], material: [cnt] does not provide all interfaces for <velocity> physics and will be treated as null
Memory usage per processor = 0.432442 Mbytes
Step CPU TotEng KinEng
0 0 0 -0
- 1 0.01880908 0 -0
-Loop time of 0.018833 on 4 procs for 1 steps with 0 atoms
+ 1 0.0019478798 0 -0
+Loop time of 0.00196469 on 4 procs for 1 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 2.5034e-06 (0.0132926)
-Outpt time (%) = 0.017292 (91.8175)
-Other time (%) = 0.00153852 (8.16923)
+Comm time (%) = 4.05312e-06 (0.206298)
+Outpt time (%) = 0.00036931 (18.7974)
+Other time (%) = 0.00159132 (80.9963)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
# run CNT1 material
print "CNT1 material - analytical linear"
CNT1 material - analytical linear
fix_modify AtC material all CNT1
run $s
run 1
Setting up run ...
ATC: WARNING: material: [cnt-exp] cannot find body_force
ATC: WARNING: physics model: [], material: [cnt-exp] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt] cannot find body_force
ATC: WARNING: physics model: [], material: [cnt] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt-exp] cannot find body_force
ATC: WARNING: physics model: [equilibrium electrostatic], material: [cnt-exp] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt] cannot find body_force
ATC: WARNING: physics model: [equilibrium electrostatic], material: [cnt] does not provide all interfaces for <velocity> physics and will be treated as null
Memory usage per processor = 0.432442 Mbytes
Step CPU TotEng KinEng
1 0 0 -0
- 2 0.11045408 0 -0
-Loop time of 0.110485 on 4 procs for 1 steps with 0 atoms
+ 2 0.0016391277 0 -0
+Loop time of 0.00165129 on 4 procs for 1 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 1.54972e-06 (0.00140265)
-Outpt time (%) = 0.00781226 (7.07087)
-Other time (%) = 0.102671 (92.9277)
+Comm time (%) = 1.19209e-06 (0.0721917)
+Outpt time (%) = 0.000236452 (14.3192)
+Other time (%) = 0.00141364 (85.6086)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
# run CNT2 material
print "CNT2 material - analytical exponetial"
CNT2 material - analytical exponetial
fix_modify AtC material all CNT2
run $s
run 1
Setting up run ...
ATC: WARNING: material: [cnt-exp] cannot find body_force
ATC: WARNING: physics model: [], material: [cnt-exp] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt] cannot find body_force
ATC: WARNING: physics model: [], material: [cnt] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt-exp] cannot find body_force
ATC: WARNING: physics model: [equilibrium electrostatic], material: [cnt-exp] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt] cannot find body_force
ATC: WARNING: physics model: [equilibrium electrostatic], material: [cnt] does not provide all interfaces for <velocity> physics and will be treated as null
Memory usage per processor = 0.432442 Mbytes
Step CPU TotEng KinEng
2 0 0 -0
- 3 0.10601687 0 -0
-Loop time of 0.123864 on 4 procs for 1 steps with 0 atoms
+ 3 0.0016679764 0 -0
+Loop time of 0.00168163 on 4 procs for 1 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 2.02656e-06 (0.00163611)
-Outpt time (%) = 0.0475852 (38.4172)
-Other time (%) = 0.0762771 (61.5812)
+Comm time (%) = 1.43051e-06 (0.0850672)
+Outpt time (%) = 0.000220239 (13.0968)
+Other time (%) = 0.00145996 (86.8181)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
# run CNT material
print "CNT material - table DOS"
CNT material - table DOS
fix_modify AtC material all CNT
#variable E equal 10*$E
#fix_modify AtC fix electric_potential lbc linear 0 0 0 $E 0 0 $V
#fix_modify AtC fix electric_potential rbc linear 0 0 0 $E 0 0 $V
run $s
run 1
Setting up run ...
ATC: WARNING: material: [cnt-exp] cannot find body_force
ATC: WARNING: physics model: [], material: [cnt-exp] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt] cannot find body_force
ATC: WARNING: physics model: [], material: [cnt] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt-exp] cannot find body_force
ATC: WARNING: physics model: [equilibrium electrostatic], material: [cnt-exp] does not provide all interfaces for <velocity> physics and will be treated as null
ATC: WARNING: material: [cnt] cannot find body_force
ATC: WARNING: physics model: [equilibrium electrostatic], material: [cnt] does not provide all interfaces for <velocity> physics and will be treated as null
Memory usage per processor = 0.432442 Mbytes
Step CPU TotEng KinEng
3 0 0 -0
- 4 0.0015778542 0 -0
-Loop time of 0.00159025 on 4 procs for 1 steps with 0 atoms
+ 4 0.0016648769 0 -0
+Loop time of 0.00167871 on 4 procs for 1 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 7.15256e-07 (0.0449775)
-Outpt time (%) = 0.00022918 (14.4115)
-Other time (%) = 0.00136036 (85.5435)
+Comm time (%) = 1.66893e-06 (0.0994177)
+Outpt time (%) = 0.000243187 (14.4866)
+Other time (%) = 0.00143385 (85.414)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/electrostatic_bending.screen b/examples/USER/atc/elastic/electrostatic_bending.screen
index 3d584b227..e57a150d4 100644
--- a/examples/USER/atc/elastic/electrostatic_bending.screen
+++ b/examples/USER/atc/elastic/electrostatic_bending.screen
@@ -1,845 +1,846 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style charge
dielectric 1.
variable type string "_charge"
boundary s s f
# read in CNT
read_data cnt_9_0_100${type}.data
read_data cnt_9_0_100_charge.data
Reading data file ...
orthogonal box = (-7.04598 -7.04598 0) to (7.04598 7.04598 100)
1 by 1 by 4 MPI processor grid
846 atoms
lattice diamond 3.6 # NOTE ???
Lattice spacing in x,y,z = 3.6 3.6 3.6
pair_style airebo 3.0
pair_coeff * * ./CH.airebo C
mass * 12.01
# PARAMETERS-----------------------------
variable dt equal 0.0005
variable L equal zhi-zlo
variable zhi equal zhi
variable zTip equal ${zhi}-2.0 # 2 4
variable zTip equal 100-2.0
variable zFree equal zhi
variable R equal 12.1/2
variable xhiFE equal 5.0*$R
variable xhiFE equal 5.0*6.0499999999999998224
variable xloFE equal -${xhiFE}
variable xloFE equal -30.25
variable yhiFE equal $R
variable yhiFE equal 6.0499999999999998224
variable yloFE equal -${yhiFE}
variable yloFE equal -6.0499999999999998224
variable zloFE equal zlo+10 # create fixed ghosts
variable zhiFE equal zhi+(zhi-${zloFE})/12*2
variable zhiFE equal zhi+(zhi-10)/12*2
variable Lfree equal zhi-${zloFE}
variable Lfree equal zhi-10
variable nx equal 10 # 5
variable nz equal 14 # 12
print "Length $L [${zloFE}, ${zhiFE}] ${zTip}"
Length 100 [10, 115] 98
#variable E equal 0.1 # bias 1.0
variable Vb equal 0.1 # 0.1 #0.5 #0.0 # bias
variable Vg equal 0.5 # 1.0 # 5.0 0.5 #50.0 # 0.5 # gate/modulation
print "bias voltage ${Vb}, gate voltage ${Vg}"
bias voltage 0.10000000000000000555, gate voltage 0.5
variable ng equal 20 # 80 # 10
variable nb equal 2 # 3
variable n equal 100000
variable s equal 250
# END -----------------------------------
region TIP block INF INF INF INF ${zTip} INF units box
region TIP block INF INF INF INF 98 INF units box
group TIP region TIP
9 atoms in group TIP
#region FIXED block INF INF INF INF INF ${zLoFE} units box
#group FIXED region FIXED
#group FREE subtract all FIXED
region feRegion block ${xloFE} ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 6.0499999999999998224 ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 6.0499999999999998224 10 ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 6.0499999999999998224 10 115 units box
group internal region feRegion
756 atoms in group internal
group FIXED subtract all internal
90 atoms in group FIXED
fix FIX FIXED setforce 0 0 0
variable nAll equal count(all)
variable nGhost equal count(all)-count(internal)
variable nTip equal count(TIP)
print ">>> number of stationary ghosts: ${nGhost} of ${nAll}"
>>> number of stationary ghosts: 90 of 846
print ">>> number of tip atoms : ${nTip}"
>>> number of tip atoms : 9
neighbor 5. bin
neigh_modify every 10 delay 0 check no
timestep ${dt}
timestep 0.00050000000000000001041
thermo 100
variable tag string "electrostatic_bending"
# set charge on tip
variable C equal -0.025
print "charge $C [e]"
charge -0.025000000000000001388 [e]
variable c equal $C/${nTip}
variable c equal -0.025000000000000001388/${nTip}
variable c equal -0.025000000000000001388/9
set group TIP charge $c
set group TIP charge -0.0027777777777777778838
Setting atom values ...
9 settings made for charge
# coupling
fix AtC internal atc electrostatic CNT_id.mat
ATC: constructing electrostatic mechanical coupling with parameter file CNT_id.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_id.mat
ATC: creating electrostatic extrinsic model
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_id.mat
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_id.mat
fix_modify AtC include atomic_charge
fix_modify AtC internal_quadrature off
# note weights don't affect phi or f
fix_modify AtC atom_weight constant internal 1.0
fix_modify AtC extrinsic short_range off
#fix_modify AtC atom_element_map eulerian 1
fix_modify AtC control momentum flux
fix_modify AtC mesh create ${nx} 1 ${nz} feRegion f p f
fix_modify AtC mesh create 10 1 ${nz} feRegion f p f
fix_modify AtC mesh create 10 1 14 feRegion f p f
ATC: created uniform mesh with 330 nodes, 165 unique nodes, and 140 elements
# initial conditions
fix_modify AtC initial displacement x all 0.0
fix_modify AtC initial displacement y all 0.0
fix_modify AtC initial displacement z all 0.0
fix_modify AtC initial velocity x all 0.0
fix_modify AtC initial velocity y all 0.0
fix_modify AtC initial velocity z all 0.0
fix_modify AtC initial electric_potential all 0.0
# node sets
variable t equal 1.1*$R
variable t equal 1.1*6.0499999999999998224
fix_modify AtC mesh create_nodeset tube -$t $t -$t $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 $t -$t $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -$t $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 100 units box
ATC: created nodeset tube with 39 nodes
fix_modify AtC mesh create_nodeset lefttube -$t $t -$t $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 $t -$t $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -$t $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 10 units box
ATC: created nodeset lefttube with 3 nodes
fix_modify AtC mesh create_nodeset rbc INF INF INF INF ${zhiFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc INF INF INF INF 115 ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc INF INF INF INF 115 115 units box
ATC: created nodeset rbc with 11 nodes
fix_modify AtC mesh create_nodeset lbc INF INF INF INF ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc INF INF INF INF 10 ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc INF INF INF INF 10 10 units box
ATC: created nodeset lbc with 11 nodes
fix_modify AtC mesh create_nodeset top ${xhiFE} ${xhiFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset top 30.25 ${xhiFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset top 30.25 30.25 INF INF INF INF units box
ATC: created nodeset top with 15 nodes
fix_modify AtC mesh create_nodeset bot ${xloFE} ${xloFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset bot -30.25 ${xloFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset bot -30.25 -30.25 INF INF INF INF units box
ATC: created nodeset bot with 15 nodes
# boundary conditions
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix displacement y lbc 0.
fix_modify AtC fix displacement z lbc 0.
fix_modify AtC fix velocity x lbc 0.
fix_modify AtC fix velocity y lbc 0.
fix_modify AtC fix velocity z lbc 0.
# ground
fix_modify AtC fix electric_potential lbc 0
# bias
fix_modify AtC fix electric_potential rbc ${Vb}
fix_modify AtC fix electric_potential rbc 0.10000000000000000555
# gate
fix_modify AtC fix electric_potential bot ${Vg}
fix_modify AtC fix electric_potential bot 0.5
# run
compute CM TIP com
compute q all property/atom q
compute Q all reduce sum c_q
compute FSUM all reduce sum fx fy fz
compute RSUM internal reduce sum fx fy fz
thermo_style custom step etotal ke c_CM[1] c_CM[2] c_CM[3] c_Q f_AtC[4] f_AtC[5] f_AtC[6] f_AtC[7] f_FIX[1] f_FIX[2] f_FIX[3] f_AtC c_FSUM[1] c_RSUM[1]
thermo $s
thermo 250
fix_modify AtC output ${tag}FE 100000000 full_text # $s full_text #binary
fix_modify AtC output electrostatic_bendingFE 100000000 full_text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC output index step
# NOTE not recognized as vector by paraview
variable uX atom x-f_AtC[1]
variable uY atom y-f_AtC[2]
variable uZ atom z-f_AtC[3]
variable rho atom mass*f_AtC[4]
dump CONFIG all custom $s ${tag}.dmp id type x y z v_uX v_uY v_uZ v_rho
dump CONFIG all custom 250 ${tag}.dmp id type x y z v_uX v_uY v_uZ v_rho
dump CONFIG all custom 250 electrostatic_bending.dmp id type x y z v_uX v_uY v_uZ v_rho
reset_timestep 0
log ${tag}.log
log electrostatic_bending.log
# [eV/A * A^2] --> [N m]
variable eV2J equal 1.60217646e-19
variable A2m equal 1.e-10
thermo 10
timestep 0.0
min_modify line quadratic
variable Vg equal 0.1
variable Lx equal 1.0
variable ng equal 4
#compute RSUM FREE reduce sum fx fy fz
#dump CONFIG all custom 10000 ${tag}.dmp id type x y z c_U[1] c_U[2] c_U[3] fx fy fz
variable a equal 0
variable i loop ${ng}
variable i loop 4
label loop_i
variable b equal ($i-1)*${Vg}/(${ng}-1)/${Lx}
variable b equal (1-1)*${Vg}/(${ng}-1)/${Lx}
variable b equal (1-1)*0.10000000000000000555/(${ng}-1)/${Lx}
variable b equal (1-1)*0.10000000000000000555/(4-1)/${Lx}
variable b equal (1-1)*0.10000000000000000555/(4-1)/1
fix_modify AtC fix electric_potential all linear 0 0 0 $b 0 $a 0
fix_modify AtC fix electric_potential all linear 0 0 0 0 0 $a 0
fix_modify AtC fix electric_potential all linear 0 0 0 0 0 0 0
ATC: created function : 0 + 0(x-0)+0(y-0)+0(z-0)
min_style cg
min_modify line quadratic
#minimize 0 0 100000 100000
minimize 0 0 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: WARNING: all initial conditions for electron_density have not been defined and the undefined are assumed zero
ATC: WARNING: material: [cnt0] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt0] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 55.2354 Mbytes
Step TotEng KinEng CM[1] CM[2] CM[3] Q AtC[4] AtC[5] AtC[6] AtC[7] FIX[1] FIX[2] FIX[3] AtC FSUM[1] RSUM[1]
0 -6146.5328 0 -1.2222229e-10 1.1111297e-10 98.69 -0.025 0 0 0 0 9.0465829e-16 -2.9442594e-15 8.5762791 0 6.8998626e-16 6.8998626e-16
10 -6148.8618 0 4.940931e-12 -2.2100035e-10 98.493762 -0.025 0 0 0 0 1.2098779e-09 -1.5844069e-09 8.9290499 0 -1.209881e-09 -1.209881e-09
20 -6149.9222 0 2.3540796e-12 -1.2223531e-10 98.220638 -0.025 0 0 0 0 -1.255241e-10 1.3853794e-11 9.0170496 0 1.2552811e-10 1.2552811e-10
30 -6150.857 0 -5.8780008e-12 -1.5206673e-10 98.082897 -0.025 0 0 0 0 1.1490666e-09 -5.0591806e-10 8.9773205 0 -1.149063e-09 -1.149063e-09
40 -6151.7874 0 6.0788906e-12 -1.2585104e-10 97.911664 -0.025 0 0 0 0 -7.6226226e-12 2.2822122e-10 8.969255 0 7.6276741e-12 7.6276741e-12
50 -6152.7403 0 -8.5868587e-12 -2.1662548e-12 97.725384 -0.025 0 0 0 0 6.8901152e-11 1.9872572e-10 8.9900713 0 -6.8910336e-11 -6.8910336e-11
60 -6153.6909 0 -2.3882229e-11 1.8005686e-10 97.514756 -0.025 0 0 0 0 -2.4792216e-10 5.8505025e-10 8.9790647 0 2.4791056e-10 2.4791056e-10
70 -6154.6186 0 -1.4341604e-11 1.0186267e-10 97.331185 -0.025 0 0 0 0 -2.5377242e-10 7.0580372e-10 8.9849053 0 2.5377634e-10 2.5377634e-10
80 -6155.5294 0 3.317641e-12 -1.0628218e-10 97.148448 -0.025 0 0 0 0 -3.6329208e-10 1.6682668e-10 5.3213166 0 3.6329e-10 3.6329e-10
90 -6155.6958 0 -7.4051845e-13 -1.7958969e-11 97.119481 -0.025 0 0 0 0 -2.6610771e-10 -2.1459841e-10 1.9442496 0 2.6610824e-10 2.6610824e-10
100 -6155.7311 0 -1.7366193e-12 4.0895485e-12 97.108958 -0.025 0 0 0 0 -2.2828441e-12 3.2760579e-10 1.8155088 0 2.2768396e-12 2.2768396e-12
110 -6155.7559 0 -3.7182375e-12 2.7076944e-11 97.099557 -0.025 0 0 0 0 -2.7283076e-10 3.148088e-10 1.6786296 0 2.7283883e-10 2.7283883e-10
120 -6155.7815 0 -1.6001509e-12 7.7718611e-12 97.084625 -0.025 0 0 0 0 -2.3085834e-10 -3.3010689e-10 0.84988485 0 2.3084659e-10 2.3084659e-10
130 -6155.8097 0 6.1918255e-12 -2.2013612e-11 97.037986 -0.025 0 0 0 0 3.8781477e-10 7.8589814e-10 -0.24071684 0 -3.8781011e-10 -3.8781011e-10
140 -6155.8296 0 9.1649429e-13 -5.8772777e-12 96.997528 -0.025 0 0 0 0 -2.9271952e-10 2.8177507e-10 0.21373041 0 2.9272128e-10 2.9272128e-10
150 -6155.8424 0 1.2990133e-12 1.6560103e-12 96.978985 -0.025 0 0 0 0 1.8917465e-10 -6.1365804e-10 0.34484179 0 -1.8917478e-10 -1.8917478e-10
160 -6155.8465 0 -8.7514622e-13 4.204932e-12 96.970352 -0.025 0 0 0 0 5.4505837e-10 -7.430968e-10 0.24626587 0 -5.4506486e-10 -5.4506486e-10
170 -6155.8471 0 -3.1964234e-12 3.3010755e-12 96.967294 -0.025 0 0 0 0 2.2410803e-10 -1.016244e-10 0.23959213 0 -2.2410755e-10 -2.2410755e-10
180 -6155.8485 0 -1.5534979e-11 9.5624334e-12 96.955682 -0.025 0 0 0 0 -2.0043328e-09 2.2585906e-09 0.27363173 0 2.0043342e-09 2.0043342e-09
190 -6155.8492 0 -2.0892941e-11 2.9371598e-11 96.950738 -0.025 0 0 0 0 3.8637701e-10 -5.3578627e-10 0.2536299 0 -3.8637116e-10 -3.8637116e-10
200 -6155.8498 0 -7.8964312e-12 1.3090003e-11 96.947508 -0.025 0 0 0 0 1.5603734e-09 -1.6272208e-09 0.15118948 0 -1.5603738e-09 -1.5603738e-09
210 -6155.8506 0 3.2330911e-11 -5.680355e-11 96.941553 -0.025 0 0 0 0 -5.1954511e-09 5.6107173e-09 0.074902549 0 5.1954505e-09 5.1954505e-09
220 -6155.8508 0 1.291125e-11 -1.4639389e-11 96.940685 -0.025 0 0 0 0 -7.2531212e-10 7.1522033e-10 0.075697866 0 7.253091e-10 7.253091e-10
230 -6155.8508 0 -2.1539062e-11 3.0981675e-11 96.940234 -0.025 0 0 0 0 3.4501174e-09 -3.3448009e-09 0.040836048 0 -3.4501143e-09 -3.4501143e-09
240 -6155.8508 0 -2.6136061e-12 1.0779917e-12 96.939825 -0.025 0 0 0 0 -6.485948e-10 4.904014e-10 0.032769742 0 6.4859596e-10 6.4859596e-10
250 -6155.8509 0 5.4062908e-11 -5.4847092e-11 96.939069 -0.025 0 0 0 0 -6.3245546e-09 5.8679399e-09 0.01865975 0 6.3245566e-09 6.3245566e-09
260 -6155.8509 0 1.9938451e-12 1.3745327e-11 96.938535 -0.025 0 0 0 0 2.8230301e-09 -1.7880768e-09 0.010102843 0 -2.8230281e-09 -2.8230281e-09
270 -6155.8509 0 -1.1673108e-11 7.7225918e-12 96.937968 -0.025 0 0 0 0 4.3671364e-10 -8.0304089e-10 0.01529266 0 -4.3670395e-10 -4.3670395e-10
280 -6155.851 0 3.1090928e-11 -2.3740814e-11 96.93705 -0.025 0 0 0 0 -1.2298254e-09 2.371559e-10 -0.0040591525 0 1.2298302e-09 1.2298302e-09
290 -6155.851 0 6.6834666e-12 -9.0749829e-12 96.936403 -0.025 0 0 0 0 -7.3137352e-10 1.0983283e-09 0.0010075626 0 7.3137798e-10 7.3137798e-10
300 -6155.851 0 9.4443218e-13 5.2069655e-13 96.936293 -0.025 0 0 0 0 4.9924787e-12 3.5018175e-10 0.0057823754 0 -4.9956751e-12 -4.9956751e-12
310 -6155.851 0 4.9457364e-11 -2.183241e-11 96.936135 -0.025 0 0 0 0 5.5646397e-10 -3.1013634e-09 0.0066174421 0 -5.5646838e-10 -5.5646838e-10
320 -6155.851 0 1.1303802e-11 -1.5610116e-11 96.935999 -0.025 0 0 0 0 9.3725597e-11 -2.0834063e-10 0.0066461623 0 -9.3720589e-11 -9.3720589e-11
330 -6155.851 0 -8.7492205e-11 5.0132409e-11 96.935781 -0.025 0 0 0 0 1.5034892e-09 4.8824636e-09 0.0058982085 0 -1.5034817e-09 -1.5034817e-09
340 -6155.851 0 1.4386338e-10 -4.2580912e-11 96.935678 -0.025 0 0 0 0 -4.4942366e-09 -4.8008051e-09 0.0019740498 0 4.4942601e-09 4.4942601e-09
350 -6155.851 0 -1.5770775e-12 -1.5554503e-11 96.935641 -0.025 0 0 0 0 -1.789129e-09 4.3210504e-10 0.0016260173 0 1.7891285e-09 1.7891285e-09
360 -6155.851 0 -1.3297897e-10 5.1630323e-11 96.935622 -0.025 0 0 0 0 9.3219024e-09 5.9535856e-10 0.00082004967 0 -9.3218922e-09 -9.3218922e-09
370 -6155.851 0 5.4333939e-11 -2.6192184e-11 96.935617 -0.025 0 0 0 0 -4.3663676e-10 -5.1620423e-10 0.0012789335 0 4.3664737e-10 4.3664737e-10
380 -6155.851 0 -6.6039258e-12 -7.5609136e-12 96.935612 -0.025 0 0 0 0 -8.3813595e-09 4.7199823e-09 0.0011369214 0 8.3813612e-09 8.3813612e-09
390 -6155.851 0 -1.0040056e-10 8.5325014e-11 96.935587 -0.025 0 0 0 0 1.1171651e-08 -1.0037805e-08 0.00012469127 0 -1.1171646e-08 -1.1171646e-08
400 -6155.851 0 5.0853732e-11 -4.2801835e-11 96.935572 -0.025 0 0 0 0 -1.9340418e-09 1.74979e-09 0.00019466711 0 1.9340627e-09 1.9340627e-09
410 -6155.851 0 1.2049586e-10 -9.9618548e-11 96.935543 -0.025 0 0 0 0 -2.0243059e-08 1.9356236e-08 0.0002523799 0 2.0243046e-08 2.0243046e-08
420 -6155.851 0 1.7899642e-11 3.5995836e-12 96.935531 -0.025 0 0 0 0 3.5620666e-09 -2.7057846e-09 0.00024873544 0 -3.5620556e-09 -3.5620556e-09
430 -6155.851 0 -2.3941392e-11 2.3004815e-11 96.935527 -0.025 0 0 0 0 9.3931782e-09 -8.5349023e-09 0.0001591579 0 -9.3931752e-09 -9.3931752e-09
440 -6155.851 0 1.3054108e-10 -1.2689303e-10 96.935522 -0.025 0 0 0 0 -2.63239e-08 2.3190494e-08 0.00014838156 0 2.6323909e-08 2.6323909e-08
450 -6155.851 0 -3.3583974e-12 2.1841662e-11 96.93552 -0.025 0 0 0 0 7.9211719e-09 -6.7971069e-09 0.00012051248 0 -7.921168e-09 -7.921168e-09
460 -6155.851 0 -6.7930456e-10 6.424851e-10 96.935514 -0.025 0 0 0 0 1.2429227e-07 -1.0630871e-07 0.00014409432 0 -1.2429226e-07 -1.2429226e-07
470 -6155.851 0 5.649524e-10 -5.6453071e-10 96.935512 -0.025 0 0 0 0 -1.0735848e-07 8.9872405e-08 0.00010631061 0 1.0735848e-07 1.0735848e-07
480 -6155.851 0 6.13809e-10 -4.9012022e-10 96.935509 -0.025 0 0 0 0 -5.5839534e-08 4.5710027e-08 8.7271236e-05 0 5.5839543e-08 5.5839543e-08
490 -6155.851 0 -6.1673512e-10 5.8106663e-10 96.935508 -0.025 0 0 0 0 8.9417248e-08 -6.795396e-08 4.2860856e-05 0 -8.941724e-08 -8.941724e-08
500 -6155.851 0 -1.4672717e-11 -1.0669776e-11 96.935508 -0.025 0 0 0 0 -1.9116216e-08 1.6870874e-08 3.2008126e-05 0 1.9116217e-08 1.9116217e-08
-Loop time of 100.289 on 4 procs for 500 steps with 846 atoms
+Loop time of 35.1964 on 4 procs for 500 steps with 846 atoms
Minimization stats:
Stopping criterion = max force evaluations
Energy initial, next-to-last, final =
-6146.53284043 -6155.85100774 -6155.85100774
Force two-norm initial, final = 9.08523 6.13752e-06
Force max component initial, final = 2.35947 4.97842e-07
Final line search alpha, max atom move = 1 4.97842e-07
Iterations, force evaluations = 500 1000
-Pair time (%) = 9.67277 (9.6449)
+Pair time (%) = 7.61761 (21.6432)
Neigh time (%) = 0 (0)
-Comm time (%) = 6.21171 (6.19381)
-Outpt time (%) = 2.68868 (2.68093)
-Other time (%) = 81.7159 (81.4804)
+Comm time (%) = 0.696688 (1.97943)
+Outpt time (%) = 0.495435 (1.40763)
+Other time (%) = 26.3867 (74.9698)
Nlocal: 211.5 ave 216 max 207 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 191.25 ave 261 max 126 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 47313 ave 52056 max 42570 min
Histogram: 1 0 1 0 0 0 0 1 0 1
Total # of neighbors = 189252
Ave neighs/atom = 223.702
Neighbor list builds = 0
Dangerous builds = 0
min_style sd
min_modify line backtrack
#minimize 0 0 100000 100000
minimize 0 0 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: WARNING: material: [cnt0] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt0] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 55.3135 Mbytes
Step TotEng KinEng CM[1] CM[2] CM[3] Q AtC[4] AtC[5] AtC[6] AtC[7] FIX[1] FIX[2] FIX[3] AtC FSUM[1] RSUM[1]
500 -6155.851 0 -1.4672652e-11 -1.0669743e-11 96.935508 -0.025 0 0 0 0 -1.9116216e-08 1.6870874e-08 3.2008126e-05 0 1.9116216e-08 1.9116216e-08
501 -6155.851 0 -1.4672652e-11 -1.0669743e-11 96.935508 -0.025 0 0 0 0 -1.9116216e-08 1.6870874e-08 3.2008126e-05 0 1.9116216e-08 1.9116216e-08
-Loop time of 0.124472 on 4 procs for 1 steps with 846 atoms
+Loop time of 0.122442 on 4 procs for 1 steps with 846 atoms
Minimization stats:
Stopping criterion = linesearch alpha is zero
Energy initial, next-to-last, final =
-6155.85100774 -6155.85100774 -6155.85100774
Force two-norm initial, final = 6.13752e-06 6.13752e-06
Force max component initial, final = 4.97842e-07 4.97842e-07
Final line search alpha, max atom move = 0.5 2.48921e-07
Iterations, force evaluations = 1 2
-Pair time (%) = 0.0223783 (17.9785)
+Pair time (%) = 0.0222604 (18.1804)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00169677 (1.36317)
+Comm time (%) = 0.00161147 (1.31611)
Outpt time (%) = 0 (0)
-Other time (%) = 0.100397 (80.6583)
+Other time (%) = 0.0985701 (80.5035)
Nlocal: 211.5 ave 216 max 198 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 195.75 ave 261 max 126 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 48199.5 ave 53136 max 41085 min
Histogram: 1 0 0 1 0 0 0 0 0 2
Total # of neighbors = 192798
Ave neighs/atom = 227.894
Neighbor list builds = 0
Dangerous builds = 0
fix_modify AtC output now
# u = F L^3 / 3 EI --> EI = F L^3 / 3 u
variable u equal c_CM[1]
variable uz equal c_CM[3]
# variable F equal f_AtC[5]
# variable Fz equal f_AtC[7]
variable F equal c_RSUM[1]
variable Fz equal c_RSUM[3]
variable R equal $F-$C*$b
variable R equal 1.9116216109081213915e-08-$C*$b
variable R equal 1.9116216109081213915e-08--0.025000000000000001388*$b
variable R equal 1.9116216109081213915e-08--0.025000000000000001388*0
variable Rz equal ${Fz}-$C*$a
variable Rz equal -3.2008125606681979403e-05-$C*$a
variable Rz equal -3.2008125606681979403e-05--0.025000000000000001388*$a
variable Rz equal -3.2008125606681979403e-05--0.025000000000000001388*0
variable EI equal $F*${Lfree}*${Lfree}*${Lfree}/3./$u
variable EI equal 1.9116216109081213915e-08*${Lfree}*${Lfree}*${Lfree}/3./$u
variable EI equal 1.9116216109081213915e-08*90*${Lfree}*${Lfree}/3./$u
variable EI equal 1.9116216109081213915e-08*90*90*${Lfree}/3./$u
variable EI equal 1.9116216109081213915e-08*90*90*90/3./$u
variable EI equal 1.9116216109081213915e-08*90*90*90/3./-1.4672651617664272549e-11
variable EI equal ${EI}*${eV2J}*${A2m}
variable EI equal -316591754.20715177059*${eV2J}*${A2m}
variable EI equal -316591754.20715177059*1.6021764600000000642e-19*${A2m}
variable EI equal -316591754.20715177059*1.6021764600000000642e-19*1.0000000000000000364e-10
#print "flexural rigidity ${EI} [Nm^2] NOTE z force"
print ">> V $b $a F $F ${Fz} u $u ${uz} c $c phi 0 EI ${EI} R $R ${Rz}"
>> V 0 0 F 1.9116216109081213915e-08 -3.2008125606681979403e-05 u -1.4672651617664272549e-11 96.935507997738042718 c -0.0027777777777777778838 phi 0 EI -5.072358560208045613e-21 R 1.9116216109081213915e-08 -3.2008125606681979403e-05
next i
jump SELF loop_i
variable b equal ($i-1)*${Vg}/(${ng}-1)/${Lx}
variable b equal (2-1)*${Vg}/(${ng}-1)/${Lx}
variable b equal (2-1)*0.10000000000000000555/(${ng}-1)/${Lx}
variable b equal (2-1)*0.10000000000000000555/(4-1)/${Lx}
variable b equal (2-1)*0.10000000000000000555/(4-1)/1
fix_modify AtC fix electric_potential all linear 0 0 0 $b 0 $a 0
fix_modify AtC fix electric_potential all linear 0 0 0 0.033333333333333332871 0 $a 0
fix_modify AtC fix electric_potential all linear 0 0 0 0.033333333333333332871 0 0 0
ATC: created function : 0 + 0.0333333(x-0)+0(y-0)+0(z-0)
min_style cg
min_modify line quadratic
#minimize 0 0 100000 100000
minimize 0 0 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: WARNING: material: [cnt0] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt0] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 55.3135 Mbytes
Step TotEng KinEng CM[1] CM[2] CM[3] Q AtC[4] AtC[5] AtC[6] AtC[7] FIX[1] FIX[2] FIX[3] AtC FSUM[1] RSUM[1]
501 -6155.851 0 -1.4672652e-11 -1.0669743e-11 96.935508 -0.025 0 0 0 0.00083333333 -1.9116216e-08 1.6870874e-08 3.2008126e-05 1.222715e-14 0.00083335245 0.00083335245
510 -6155.851 0 7.5244067e-05 -1.3502021e-11 96.935508 -0.025 0 0 0 0.00083333333 3.2438701e-08 -3.0416424e-08 -1.4566602e-05 -6.2703389e-08 0.00083330089 0.00083330089
520 -6155.851 0 0.00023596516 2.4216597e-11 96.935508 -0.025 0 0 0 0.00083333333 -9.6655814e-09 1.7834635e-08 3.5959276e-05 -1.9663763e-07 0.000833343 0.000833343
530 -6155.851 0 0.0004521778 -1.8488146e-10 96.935507 -0.025 0 0 0 0.00083333333 -2.8087999e-08 1.4373107e-08 2.6399328e-05 -3.7681483e-07 0.00083336142 0.00083336142
540 -6155.851 0 0.00068686652 2.2560925e-10 96.935506 -0.025 0 0 0 0.00083333333 5.1280851e-08 -4.944283e-08 -2.3516917e-05 -5.7238876e-07 0.00083328205 0.00083328205
550 -6155.851 0 0.00097528387 -6.0249475e-11 96.935505 -0.025 0 0 0 0.00083333333 -3.0869719e-08 4.6053248e-08 -9.2849468e-06 -8.1273656e-07 0.0008333642 0.0008333642
560 -6155.851 0 0.0012888546 -4.7543618e-10 96.935504 -0.025 0 0 0 0.00083333333 -1.4084137e-08 -6.9499793e-09 3.5765609e-05 -1.0740455e-06 0.00083334742 0.00083334742
570 -6155.851 0 0.0016207689 7.8821517e-10 96.935503 -0.025 0 0 0 0.00083333333 2.0767366e-08 -2.5348885e-08 -4.7729297e-05 -1.3506408e-06 0.00083331257 0.00083331257
580 -6155.851 0 0.00198597 -5.3637299e-10 96.935501 -0.025 0 0 0 0.00083333333 -5.4517718e-06 9.2340557e-09 -4.9488581e-05 -1.654975e-06 0.00083878511 0.00083878511
590 -6155.851 0 0.0023856369 -4.1449046e-10 96.9355 -0.025 0 0 0 0.00083333333 -3.8437452e-05 2.7829132e-08 -6.8439705e-05 -1.9880307e-06 0.00087177079 0.00087177079
600 -6155.851 0 0.0028044617 1.0997501e-09 96.935499 -0.025 0 0 0 0.00083333333 2.0036119e-05 -2.8313041e-08 -0.00038373515 -2.3370514e-06 0.00081329721 0.00081329721
610 -6155.851 0 0.0032615703 -9.438232e-10 96.935498 -0.025 0 0 0 0.00083333333 -6.721699e-05 -1.6094486e-08 0.00026852221 -2.7179752e-06 0.00090055032 0.00090055032
620 -6155.851 0 0.0037228155 -9.8658553e-11 96.935498 -0.025 0 0 0 0.00083333333 -5.0356472e-05 6.6220662e-08 -0.00016057488 -3.1023462e-06 0.00088368981 0.00088368981
630 -6155.851 0 0.0042063596 4.5342852e-10 96.935499 -0.025 0 0 0 0.00083333333 -0.00024149697 -6.6311642e-08 -0.00013128121 -3.5052997e-06 0.0010748303 0.0010748303
640 -6155.851 0 0.0047053923 -4.4915583e-12 96.935498 -0.025 0 0 0 0.00083333333 0.00018476866 8.5931516e-09 -1.0920921e-05 -3.9211602e-06 0.00064856468 0.00064856468
650 -6155.851 0 0.0051780729 -5.9267245e-10 96.9355 -0.025 0 0 0 0.00083333333 0.0012250879 4.6153937e-08 0.00016791897 -4.3150607e-06 -0.00039175458 -0.00039175458
660 -6155.851 0 0.005528704 2.0178848e-10 96.935499 -0.025 0 0 0 0.00083333333 0.0023386089 -4.9920568e-08 -0.00030153107 -4.6072533e-06 -0.0015052756 -0.0015052756
670 -6155.851 0 0.0067930159 2.0337825e-09 96.935504 -0.025 0 0 0 0.00083333333 0.00277847 9.6153354e-08 -0.001427071 -5.6608465e-06 -0.0019451367 -0.0019451367
680 -6155.851 0 0.0091353864 -1.2005671e-09 96.935506 -0.025 0 0 0 0.00083333333 -0.00098634606 -5.6084108e-09 -0.0001949811 -7.612822e-06 0.0018196794 0.0018196794
690 -6155.851 0 0.0092720897 -6.6192949e-11 96.935506 -0.025 0 0 0 0.00083333333 -0.0015552585 -8.6270391e-10 9.3688022e-05 -7.7267414e-06 0.0023885919 0.0023885919
699 -6155.851 0 0.0093583676 1.0464746e-09 96.935509 -0.025 0 0 0 0.00083333333 -0.0017464739 2.5209399e-08 7.7398462e-05 -7.7986397e-06 0.0025798072 0.0025798072
-Loop time of 14.1081 on 4 procs for 198 steps with 846 atoms
+Loop time of 13.8117 on 4 procs for 198 steps with 846 atoms
Minimization stats:
Stopping criterion = linesearch alpha is zero
Energy initial, next-to-last, final =
-6155.85100774 -6155.85101159 -6155.85101159
Force two-norm initial, final = 0.000277846 0.0011336
Force max component initial, final = 9.26371e-05 0.00012545
Final line search alpha, max atom move = 0.0078125 9.80074e-07
Iterations, force evaluations = 198 409
-Pair time (%) = 3.19903 (22.6752)
+Pair time (%) = 3.09424 (22.403)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.348575 (2.47075)
-Outpt time (%) = 0.160979 (1.14104)
-Other time (%) = 10.3995 (73.713)
+Comm time (%) = 0.317985 (2.30228)
+Outpt time (%) = 0.173301 (1.25474)
+Other time (%) = 10.2262 (74.04)
Nlocal: 211.5 ave 216 max 198 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 195.75 ave 261 max 126 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 48199.5 ave 53136 max 41085 min
Histogram: 1 0 0 1 0 0 0 0 0 2
Total # of neighbors = 192798
Ave neighs/atom = 227.894
Neighbor list builds = 0
Dangerous builds = 0
min_style sd
min_modify line backtrack
#minimize 0 0 100000 100000
minimize 0 0 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: WARNING: material: [cnt0] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt0] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 55.3135 Mbytes
Step TotEng KinEng CM[1] CM[2] CM[3] Q AtC[4] AtC[5] AtC[6] AtC[7] FIX[1] FIX[2] FIX[3] AtC FSUM[1] RSUM[1]
699 -6155.851 0 0.0093583676 1.0464746e-09 96.935509 -0.025 0 0 0 0.00083333333 -0.0017464739 2.5209399e-08 7.7398462e-05 -7.7986397e-06 0.0025798072 0.0025798072
700 -6155.851 0 0.0093585294 1.0053739e-09 96.935509 -0.025 0 0 0 0.00083333333 -0.0017544129 2.4247674e-08 5.1686313e-05 -7.7987745e-06 0.0025877462 0.0025877462
701 -6155.851 0 0.0093585294 1.0053739e-09 96.935509 -0.025 0 0 0 0.00083333333 -0.0017544129 2.4247674e-08 5.1686313e-05 -7.7987745e-06 0.0025877462 0.0025877462
-Loop time of 0.5394 on 4 procs for 2 steps with 846 atoms
+Loop time of 0.497581 on 4 procs for 2 steps with 846 atoms
Minimization stats:
Stopping criterion = linesearch alpha is zero
Energy initial, next-to-last, final =
-6155.85101159 -6155.8510116 -6155.8510116
Force two-norm initial, final = 0.0011336 0.000872834
Force max component initial, final = 0.00012545 8.10661e-05
Final line search alpha, max atom move = 0.015625 1.26666e-06
Iterations, force evaluations = 2 14
-Pair time (%) = 0.111926 (20.7502)
+Pair time (%) = 0.110527 (22.2128)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0156116 (2.89425)
-Outpt time (%) = 0.0084697 (1.57021)
-Other time (%) = 0.403392 (74.7853)
+Comm time (%) = 0.00821733 (1.65146)
+Outpt time (%) = 0.00871897 (1.75227)
+Other time (%) = 0.370118 (74.3835)
Nlocal: 211.5 ave 216 max 198 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 195.75 ave 261 max 126 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 48199.5 ave 53136 max 41085 min
Histogram: 1 0 0 1 0 0 0 0 0 2
Total # of neighbors = 192798
Ave neighs/atom = 227.894
Neighbor list builds = 0
Dangerous builds = 0
fix_modify AtC output now
# u = F L^3 / 3 EI --> EI = F L^3 / 3 u
variable u equal c_CM[1]
variable uz equal c_CM[3]
# variable F equal f_AtC[5]
# variable Fz equal f_AtC[7]
variable F equal c_RSUM[1]
variable Fz equal c_RSUM[3]
variable R equal $F-$C*$b
variable R equal 0.0025877461923070671154-$C*$b
variable R equal 0.0025877461923070671154--0.025000000000000001388*$b
variable R equal 0.0025877461923070671154--0.025000000000000001388*0.033333333333333332871
variable Rz equal ${Fz}-$C*$a
variable Rz equal -5.16863129458517475e-05-$C*$a
variable Rz equal -5.16863129458517475e-05--0.025000000000000001388*$a
variable Rz equal -5.16863129458517475e-05--0.025000000000000001388*0
variable EI equal $F*${Lfree}*${Lfree}*${Lfree}/3./$u
variable EI equal 0.0025877461923070671154*${Lfree}*${Lfree}*${Lfree}/3./$u
variable EI equal 0.0025877461923070671154*90*${Lfree}*${Lfree}/3./$u
variable EI equal 0.0025877461923070671154*90*90*${Lfree}/3./$u
variable EI equal 0.0025877461923070671154*90*90*90/3./$u
variable EI equal 0.0025877461923070671154*90*90*90/3./0.0093585293597155689432
variable EI equal ${EI}*${eV2J}*${A2m}
variable EI equal 67192.429553881200263*${eV2J}*${A2m}
variable EI equal 67192.429553881200263*1.6021764600000000642e-19*${A2m}
variable EI equal 67192.429553881200263*1.6021764600000000642e-19*1.0000000000000000364e-10
#print "flexural rigidity ${EI} [Nm^2] NOTE z force"
print ">> V $b $a F $F ${Fz} u $u ${uz} c $c phi 0 EI ${EI} R $R ${Rz}"
>> V 0.033333333333333332871 0 F 0.0025877461923070671154 -5.16863129458517475e-05 u 0.0093585293597155689432 96.935509332376838643 c -0.0027777777777777778838 phi 0 EI 1.0765412892143675813e-24 R 0.0034210795256404006107 -5.16863129458517475e-05
next i
jump SELF loop_i
variable b equal ($i-1)*${Vg}/(${ng}-1)/${Lx}
variable b equal (3-1)*${Vg}/(${ng}-1)/${Lx}
variable b equal (3-1)*0.10000000000000000555/(${ng}-1)/${Lx}
variable b equal (3-1)*0.10000000000000000555/(4-1)/${Lx}
variable b equal (3-1)*0.10000000000000000555/(4-1)/1
fix_modify AtC fix electric_potential all linear 0 0 0 $b 0 $a 0
fix_modify AtC fix electric_potential all linear 0 0 0 0.066666666666666665741 0 $a 0
fix_modify AtC fix electric_potential all linear 0 0 0 0.066666666666666665741 0 0 0
ATC: created function : 0 + 0.0666667(x-0)+0(y-0)+0(z-0)
min_style cg
min_modify line quadratic
#minimize 0 0 100000 100000
minimize 0 0 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: WARNING: material: [cnt0] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt0] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 55.3135 Mbytes
Step TotEng KinEng CM[1] CM[2] CM[3] Q AtC[4] AtC[5] AtC[6] AtC[7] FIX[1] FIX[2] FIX[3] AtC FSUM[1] RSUM[1]
701 -6155.851 0 0.0093585294 1.0053739e-09 96.935509 -0.025 0 0 0 0.0016666667 -0.0017544129 2.4247674e-08 5.1686313e-05 -1.5597549e-05 0.0034210795 0.0034210795
710 -6155.851 0 0.0093927498 -5.1805658e-10 96.935509 -0.025 0 0 0 0.0016666667 -0.001496399 -1.5573071e-08 7.0866631e-05 -1.5654583e-05 0.0031630657 0.0031630657
720 -6155.851 0 0.0095888777 -5.6216657e-11 96.935505 -0.025 0 0 0 0.0016666667 -0.0012004213 3.8090266e-08 -0.00014799652 -1.5981463e-05 0.002867088 0.002867088
730 -6155.851 0 0.0099072785 4.4310767e-10 96.935503 -0.025 0 0 0 0.0016666667 -0.0012734816 3.5022383e-09 -0.00014979591 -1.6512131e-05 0.0029401483 0.0029401483
740 -6155.851 0 0.010283518 -1.5173013e-09 96.935504 -0.025 0 0 0 0.0016666667 -0.0010070513 -1.0777316e-07 8.9852513e-05 -1.7139197e-05 0.0026737179 0.0026737179
750 -6155.851 0 0.010683953 1.4747556e-09 96.935501 -0.025 0 0 0 0.0016666667 -0.00089533919 1.3811485e-07 -6.6972671e-05 -1.7806589e-05 0.0025620059 0.0025620059
760 -6155.851 0 0.011131302 -8.2231093e-10 96.9355 -0.025 0 0 0 0.0016666667 -0.00011238797 -3.2303593e-08 -3.3022463e-06 -1.855217e-05 0.0017790546 0.0017790546
770 -6155.851 0 0.011585226 1.1357581e-10 96.9355 -0.025 0 0 0 0.0016666667 -0.0008139296 -1.0279988e-07 7.672706e-05 -1.9308709e-05 0.0024805963 0.0024805963
780 -6155.851 0 0.012015856 -1.7079649e-11 96.935492 -0.025 0 0 0 0.0016666667 -0.00011750039 1.4724756e-07 2.6085857e-05 -2.0026427e-05 0.0017841671 0.0017841671
790 -6155.851 0 0.012432647 -5.7454545e-10 96.935489 -0.025 0 0 0 0.0016666667 -2.6583326e-05 -5.8164597e-08 -0.00024192986 -2.0721078e-05 0.00169325 0.00169325
800 -6155.851 0 0.012864332 1.1612045e-09 96.935494 -0.025 0 0 0 0.0016666667 -0.00013922996 -7.3129958e-08 0.00017322782 -2.1440553e-05 0.0018058966 0.0018058966
810 -6155.851 0 0.013534631 -1.599629e-09 96.935497 -0.025 0 0 0 0.0016666667 0.00021713244 2.0110132e-07 -0.00011691578 -2.2557718e-05 0.0014495342 0.0014495342
820 -6155.851 0 0.014473048 1.4920287e-09 96.935488 -0.025 0 0 0 0.0016666667 0.00072740903 -2.2264896e-07 -0.00025826088 -2.4121746e-05 0.00093925764 0.00093925764
830 -6155.851 0 0.015814165 9.9540852e-10 96.935488 -0.025 0 0 0 0.0016666667 -0.00020150428 -1.4648382e-07 5.1213137e-05 -2.6356941e-05 0.0018681709 0.0018681709
840 -6155.851 0 0.017960316 -3.6691752e-09 96.935483 -0.025 0 0 0 0.0016666667 0.00095321447 6.0691053e-07 0.00078150564 -2.993386e-05 0.0007134522 0.0007134522
850 -6155.851 0 0.020433235 1.5826068e-09 96.935477 -0.025 0 0 0 0.0016666667 0.0035255313 -2.7216094e-07 -0.0011364529 -3.4055392e-05 -0.0018588646 -0.0018588646
860 -6155.851 0 0.023085812 3.1475892e-09 96.935486 -0.025 0 0 0 0.0016666667 0.01015645 -5.3450364e-07 -0.00055909791 -3.8476354e-05 -0.0084897836 -0.0084897836
870 -6155.851 0 0.027552884 -1.0798686e-08 96.935526 -0.025 0 0 0 0.0016666667 0.016481473 2.2189423e-06 0.0016007847 -4.5921473e-05 -0.014814807 -0.014814807
880 -6155.8511 0 0.055457179 -1.535611e-08 96.935606 -0.025 0 0 0 0.0016666667 0.013469024 1.8368724e-06 0.007644777 -9.2428631e-05 -0.011802357 -0.011802357
890 -6155.8511 0 0.070355074 3.8023025e-09 96.93559 -0.025 0 0 0 0.0016666667 0.0045123223 -1.0894883e-06 0.0012650095 -0.00011725846 -0.0028456556 -0.0028456556
900 -6155.8511 0 0.071239511 -9.5003883e-11 96.935566 -0.025 0 0 0 0.0016666667 0.0041482123 5.3052778e-08 0.0013631978 -0.00011873252 -0.0024815456 -0.0024815456
910 -6155.8511 0 0.071770633 1.2925244e-09 96.935508 -0.025 0 0 0 0.0016666667 0.0041066236 3.455464e-07 -4.7637007e-05 -0.00011961772 -0.0024399569 -0.0024399569
920 -6155.8511 0 0.07241886 -3.7163732e-10 96.935444 -0.025 0 0 0 0.0016666667 0.0043614531 -4.0071843e-07 -0.0020847574 -0.0001206981 -0.0026947864 -0.0026947864
930 -6155.8511 0 0.08035653 -8.2019055e-09 96.935169 -0.025 0 0 0 0.0016666667 0.0030840679 -1.6577238e-06 -0.0028722541 -0.00013392755 -0.0014174012 -0.0014174012
940 -6155.8511 0 0.10233759 1.4658533e-09 96.934738 -0.025 0 0 0 0.0016666667 0.0030986023 6.3718151e-07 0.0075147368 -0.00017056265 -0.0014319357 -0.0014319357
950 -6155.8511 0 0.1091589 4.8592844e-10 96.934799 -0.025 0 0 0 0.0016666667 0.0019854702 -1.4318185e-07 0.012415464 -0.00018193149 -0.00031880356 -0.00031880356
960 -6155.8511 0 0.12158268 2.8258211e-09 96.935015 -0.025 0 0 0 0.0016666667 0.0013596908 -1.5767032e-06 0.0030979015 -0.00020263779 0.00030697591 0.00030697591
970 -6155.8511 0 0.12403838 -1.3425882e-09 96.935054 -0.025 0 0 0 0.0016666667 0.0017582125 -2.2550336e-07 -0.0026021546 -0.00020673063 -9.1545869e-05 -9.1545869e-05
972 -6155.8511 0 0.12405405 -2.2177075e-10 96.935054 -0.025 0 0 0 0.0016666667 0.0017724415 -1.7549598e-07 -0.0025842017 -0.00020675674 -0.00010577487 -0.00010577487
-Loop time of 25.365 on 4 procs for 271 steps with 846 atoms
+Loop time of 17.2257 on 4 procs for 271 steps with 846 atoms
Minimization stats:
Stopping criterion = linesearch alpha is zero
Energy initial, next-to-last, final =
-6155.8510194 -6155.85111851 -6155.85111851
Force two-norm initial, final = 0.000910877 0.000855978
Force max component initial, final = 9.24024e-05 8.83791e-05
Final line search alpha, max atom move = 0.015625 1.38092e-06
Iterations, force evaluations = 271 553
-Pair time (%) = 4.51795 (17.8118)
+Pair time (%) = 4.07028 (23.6291)
Neigh time (%) = 0 (0)
-Comm time (%) = 1.02193 (4.0289)
-Outpt time (%) = 0.702078 (2.7679)
-Other time (%) = 19.123 (75.3914)
+Comm time (%) = 0.294476 (1.70952)
+Outpt time (%) = 0.26192 (1.52052)
+Other time (%) = 12.599 (73.1408)
Nlocal: 211.5 ave 216 max 198 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 195.75 ave 261 max 126 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 48199.5 ave 53136 max 41085 min
Histogram: 1 0 0 1 0 0 0 0 0 2
Total # of neighbors = 192798
Ave neighs/atom = 227.894
Neighbor list builds = 0
Dangerous builds = 0
min_style sd
min_modify line backtrack
#minimize 0 0 100000 100000
minimize 0 0 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: WARNING: material: [cnt0] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt0] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 55.3135 Mbytes
Step TotEng KinEng CM[1] CM[2] CM[3] Q AtC[4] AtC[5] AtC[6] AtC[7] FIX[1] FIX[2] FIX[3] AtC FSUM[1] RSUM[1]
972 -6155.8511 0 0.12405405 -2.2177075e-10 96.935054 -0.025 0 0 0 0.0016666667 0.0017724415 -1.7549598e-07 -0.0025842017 -0.00020675674 -0.00010577487 -0.00010577487
973 -6155.8511 0 0.12405405 -2.2177075e-10 96.935054 -0.025 0 0 0 0.0016666667 0.0017724415 -1.7549598e-07 -0.0025842017 -0.00020675674 -0.00010577487 -0.00010577487
-Loop time of 0.277416 on 4 procs for 1 steps with 846 atoms
+Loop time of 0.277707 on 4 procs for 1 steps with 846 atoms
Minimization stats:
Stopping criterion = linesearch alpha is zero
Energy initial, next-to-last, final =
-6155.85111851 -6155.85111851 -6155.85111851
Force two-norm initial, final = 0.000855978 0.000855978
Force max component initial, final = 8.83791e-05 8.83791e-05
Final line search alpha, max atom move = 0.015625 1.38092e-06
Iterations, force evaluations = 1 7
-Pair time (%) = 0.0593559 (21.396)
+Pair time (%) = 0.0594426 (21.4048)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00413132 (1.48921)
+Comm time (%) = 0.00426239 (1.53485)
Outpt time (%) = 0 (0)
-Other time (%) = 0.213929 (77.1148)
+Other time (%) = 0.214002 (77.0604)
Nlocal: 211.5 ave 216 max 198 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 195.75 ave 261 max 126 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 48199.5 ave 53136 max 41085 min
Histogram: 1 0 0 1 0 0 0 0 0 2
Total # of neighbors = 192798
Ave neighs/atom = 227.894
Neighbor list builds = 0
Dangerous builds = 0
fix_modify AtC output now
# u = F L^3 / 3 EI --> EI = F L^3 / 3 u
variable u equal c_CM[1]
variable uz equal c_CM[3]
# variable F equal f_AtC[5]
# variable Fz equal f_AtC[7]
variable F equal c_RSUM[1]
variable Fz equal c_RSUM[3]
variable R equal $F-$C*$b
variable R equal -0.00010577487498249815213-$C*$b
variable R equal -0.00010577487498249815213--0.025000000000000001388*$b
variable R equal -0.00010577487498249815213--0.025000000000000001388*0.066666666666666665741
variable Rz equal ${Fz}-$C*$a
variable Rz equal 0.0025842016931355718881-$C*$a
variable Rz equal 0.0025842016931355718881--0.025000000000000001388*$a
variable Rz equal 0.0025842016931355718881--0.025000000000000001388*0
variable EI equal $F*${Lfree}*${Lfree}*${Lfree}/3./$u
variable EI equal -0.00010577487498249815213*${Lfree}*${Lfree}*${Lfree}/3./$u
variable EI equal -0.00010577487498249815213*90*${Lfree}*${Lfree}/3./$u
variable EI equal -0.00010577487498249815213*90*90*${Lfree}/3./$u
variable EI equal -0.00010577487498249815213*90*90*90/3./$u
variable EI equal -0.00010577487498249815213*90*90*90/3./0.12405404654784669971
variable EI equal ${EI}*${eV2J}*${A2m}
variable EI equal -207.1943264731270915*${eV2J}*${A2m}
variable EI equal -207.1943264731270915*1.6021764600000000642e-19*${A2m}
variable EI equal -207.1943264731270915*1.6021764600000000642e-19*1.0000000000000000364e-10
#print "flexural rigidity ${EI} [Nm^2] NOTE z force"
print ">> V $b $a F $F ${Fz} u $u ${uz} c $c phi 0 EI ${EI} R $R ${Rz}"
>> V 0.066666666666666665741 0 F -0.00010577487498249815213 0.0025842016931355718881 u 0.12405404654784669971 96.935053768033569099 c -0.0027777777777777778838 phi 0 EI -3.3196187252079907596e-27 R 0.0015608917916841685402 0.0025842016931355718881
next i
jump SELF loop_i
variable b equal ($i-1)*${Vg}/(${ng}-1)/${Lx}
variable b equal (4-1)*${Vg}/(${ng}-1)/${Lx}
variable b equal (4-1)*0.10000000000000000555/(${ng}-1)/${Lx}
variable b equal (4-1)*0.10000000000000000555/(4-1)/${Lx}
variable b equal (4-1)*0.10000000000000000555/(4-1)/1
fix_modify AtC fix electric_potential all linear 0 0 0 $b 0 $a 0
fix_modify AtC fix electric_potential all linear 0 0 0 0.10000000000000001943 0 $a 0
fix_modify AtC fix electric_potential all linear 0 0 0 0.10000000000000001943 0 0 0
ATC: created function : 0 + 0.1(x-0)+0(y-0)+0(z-0)
min_style cg
min_modify line quadratic
#minimize 0 0 100000 100000
minimize 0 0 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: WARNING: material: [cnt0] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt0] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 55.3135 Mbytes
Step TotEng KinEng CM[1] CM[2] CM[3] Q AtC[4] AtC[5] AtC[6] AtC[7] FIX[1] FIX[2] FIX[3] AtC FSUM[1] RSUM[1]
973 -6155.8512 0 0.12405405 -2.2177075e-10 96.935054 -0.025 0 0 0 0.0025 0.0017724415 -1.7549598e-07 -0.0025842017 -0.00031013512 0.00072755846 0.00072755846
977 -6155.8512 0 0.12406088 -1.0970139e-09 96.935055 -0.025 0 0 0 0.0025 0.0017262049 -1.3531203e-07 -0.0026622077 -0.0003101522 0.00077379508 0.00077379508
-Loop time of 1.007 on 4 procs for 4 steps with 846 atoms
+Loop time of 1.26332 on 4 procs for 4 steps with 846 atoms
Minimization stats:
Stopping criterion = linesearch alpha is zero
Energy initial, next-to-last, final =
-6155.85122189 -6155.85122188 -6155.85122188
Force two-norm initial, final = 0.000891466 0.000702795
Force max component initial, final = 0.000104825 6.49275e-05
Final line search alpha, max atom move = 0.015625 1.01449e-06
Iterations, force evaluations = 4 19
-Pair time (%) = 0.155607 (15.4525)
+Pair time (%) = 0.146343 (11.5841)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0349094 (3.46666)
+Comm time (%) = 0.0507042 (4.01358)
Outpt time (%) = 0 (0)
-Other time (%) = 0.816487 (81.0808)
+Other time (%) = 1.06627 (84.4024)
Nlocal: 211.5 ave 216 max 198 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 195.75 ave 261 max 126 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 48199.5 ave 53136 max 41085 min
Histogram: 1 0 0 1 0 0 0 0 0 2
Total # of neighbors = 192798
Ave neighs/atom = 227.894
Neighbor list builds = 0
Dangerous builds = 0
min_style sd
min_modify line backtrack
#minimize 0 0 100000 100000
minimize 0 0 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: WARNING: material: [cnt0] cannot find electron_flux
ATC: WARNING: physics model: [electrostatic], material: [cnt0] does not provide all interfaces for <electron_density> physics and will be treated as null
Memory usage per processor = 55.3135 Mbytes
Step TotEng KinEng CM[1] CM[2] CM[3] Q AtC[4] AtC[5] AtC[6] AtC[7] FIX[1] FIX[2] FIX[3] AtC FSUM[1] RSUM[1]
977 -6155.8512 0 0.12406088 -1.0970139e-09 96.935055 -0.025 0 0 0 0.0025 0.0017262049 -1.3531203e-07 -0.0026622077 -0.0003101522 0.00077379508 0.00077379508
978 -6155.8512 0 0.12406088 -1.0970139e-09 96.935055 -0.025 0 0 0 0.0025 0.0017262049 -1.3531203e-07 -0.0026622077 -0.0003101522 0.00077379508 0.00077379508
-Loop time of 0.277741 on 4 procs for 1 steps with 846 atoms
+Loop time of 0.277097 on 4 procs for 1 steps with 846 atoms
Minimization stats:
Stopping criterion = linesearch alpha is zero
Energy initial, next-to-last, final =
-6155.85122188 -6155.85122188 -6155.85122188
Force two-norm initial, final = 0.000702795 0.000702795
Force max component initial, final = 6.49275e-05 6.49275e-05
Final line search alpha, max atom move = 0.015625 1.01449e-06
Iterations, force evaluations = 1 7
-Pair time (%) = 0.0594354 (21.3995)
+Pair time (%) = 0.0593459 (21.417)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00418288 (1.50603)
+Comm time (%) = 0.00436586 (1.57557)
Outpt time (%) = 0 (0)
-Other time (%) = 0.214123 (77.0944)
+Other time (%) = 0.213385 (77.0074)
Nlocal: 211.5 ave 216 max 198 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 195.75 ave 261 max 126 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 48199.5 ave 53136 max 41085 min
Histogram: 1 0 0 1 0 0 0 0 0 2
Total # of neighbors = 192798
Ave neighs/atom = 227.894
Neighbor list builds = 0
Dangerous builds = 0
fix_modify AtC output now
# u = F L^3 / 3 EI --> EI = F L^3 / 3 u
variable u equal c_CM[1]
variable uz equal c_CM[3]
# variable F equal f_AtC[5]
# variable Fz equal f_AtC[7]
variable F equal c_RSUM[1]
variable Fz equal c_RSUM[3]
variable R equal $F-$C*$b
variable R equal 0.00077379508410631867108-$C*$b
variable R equal 0.00077379508410631867108--0.025000000000000001388*$b
variable R equal 0.00077379508410631867108--0.025000000000000001388*0.10000000000000001943
variable Rz equal ${Fz}-$C*$a
variable Rz equal 0.0026622076933775122923-$C*$a
variable Rz equal 0.0026622076933775122923--0.025000000000000001388*$a
variable Rz equal 0.0026622076933775122923--0.025000000000000001388*0
variable EI equal $F*${Lfree}*${Lfree}*${Lfree}/3./$u
variable EI equal 0.00077379508410631867108*${Lfree}*${Lfree}*${Lfree}/3./$u
variable EI equal 0.00077379508410631867108*90*${Lfree}*${Lfree}/3./$u
variable EI equal 0.00077379508410631867108*90*90*${Lfree}/3./$u
variable EI equal 0.00077379508410631867108*90*90*90/3./$u
variable EI equal 0.00077379508410631867108*90*90*90/3./0.12406087903930071437
variable EI equal ${EI}*${eV2J}*${A2m}
variable EI equal 1515.6446326506320474*${eV2J}*${A2m}
variable EI equal 1515.6446326506320474*1.6021764600000000642e-19*${A2m}
variable EI equal 1515.6446326506320474*1.6021764600000000642e-19*1.0000000000000000364e-10
#print "flexural rigidity ${EI} [Nm^2] NOTE z force"
print ">> V $b $a F $F ${Fz} u $u ${uz} c $c phi 0 EI ${EI} R $R ${Rz}"
>> V 0.10000000000000001943 0 F 0.00077379508410631867108 0.0026622076933775122923 u 0.12406087903930071437 96.935055022011525239 c -0.0027777777777777778838 phi 0 EI 2.4283301521581904147e-26 R 0.0032737950841063190484 0.0026622076933775122923
next i
jump SELF loop_i
diff --git a/examples/USER/atc/elastic/electrostatic_bending_dos.screen b/examples/USER/atc/elastic/electrostatic_bending_dos.screen
index 67c07ee0a..53faa12c5 100644
--- a/examples/USER/atc/elastic/electrostatic_bending_dos.screen
+++ b/examples/USER/atc/elastic/electrostatic_bending_dos.screen
@@ -1,632 +1,340 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style charge
dielectric 1.
boundary s s f
# read in CNT
read_data min_CNT_dos.data
Reading data file ...
orthogonal box = (-3.72623 -3.66963 0) to (3.60284 3.66963 100)
1 by 1 by 4 MPI processor grid
846 atoms
846 velocities
set group all charge 0
Setting atom values ...
846 settings made for charge
lattice diamond 3.6
Lattice spacing in x,y,z = 3.6 3.6 3.6
pair_style airebo 3.0
pair_coeff * * ./CH.airebo C
mass * 12.01
compute q all property/atom q
compute Q all reduce sum c_q
# PARAMETERS-----------------------------
# [eV/A * A^2] --> [N m]
variable eV2J equal 1.60217646e-19
variable A2m equal 1.e-10
variable Lx equal xhi-xlo
variable L equal zhi-zlo
variable zTip equal zhi-3.5
variable zFree equal zhi
variable R equal 12.1/2
variable xhiFE equal 5.0*$R
variable xhiFE equal 5.0*6.0499999999999998224
variable xloFE equal -${xhiFE}
variable xloFE equal -30.25
variable yhiFE equal $R
variable yhiFE equal 6.0499999999999998224
variable yloFE equal -${yhiFE}
variable yloFE equal -6.0499999999999998224
variable zloFE equal zlo+10 # create fixed ghosts
variable zhiFE equal zhi+(zhi-${zloFE})/12*2
variable zhiFE equal zhi+(zhi-10)/12*2
variable Lfree equal zhi-${zloFE}
variable Lfree equal zhi-10
variable nx equal 10 # 5
variable nz equal 14 # 12
print "Length $L [${zloFE}, ${zhiFE}] ${zTip}"
Length 100 [10, 115] 96.5
variable Vb equal 0.1
variable Vg equal 0.15
variable V0 equal 1. # 2.
print "bias voltage ${Vb}, gate voltage ${Vg}"
bias voltage 0.10000000000000000555, gate voltage 0.14999999999999999445
variable ng equal 3
variable n equal 100000
variable s equal 250
# END -----------------------------------
region TIP block INF INF INF INF ${zTip} INF units box
region TIP block INF INF INF INF 96.5 INF units box
group TIP region TIP
9 atoms in group TIP
region feRegion block ${xloFE} ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 ${xhiFE} ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 ${yloFE} ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 ${yhiFE} ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 6.0499999999999998224 ${zloFE} ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 6.0499999999999998224 10 ${zhiFE} units box
region feRegion block -30.25 30.25 -6.0499999999999998224 6.0499999999999998224 10 115 units box
group internal region feRegion
756 atoms in group internal
group FIXED subtract all internal
90 atoms in group FIXED
fix FIX FIXED setforce 0 0 0
thermo 10
set group all image 0 0 0
Setting atom values ...
846 settings made for image
compute CM TIP com
thermo_style custom step c_Q etotal c_CM[1] c_CM[3]
#minimize 0 0 1000 1000
#write_restart min_CNT_dos.rst
run 0
Setting up run ...
Memory usage per processor = 2.45103 Mbytes
Step Q TotEng CM[1] CM[3]
0 0 -6155.851 -3752.4867 -51103.063
-Loop time of 0.00996494 on 4 procs for 0 steps with 846 atoms
+Loop time of 1.2219e-05 on 4 procs for 0 steps with 846 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
Comm time (%) = 0 (0)
Outpt time (%) = 0 (0)
-Other time (%) = 0.00996494 (100)
+Other time (%) = 1.2219e-05 (100)
Nlocal: 211.5 ave 216 max 198 min
Histogram: 1 0 0 0 0 0 0 0 0 3
Nghost: 159.75 ave 216 max 108 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 37714.5 ave 40824 max 32904 min
Histogram: 1 0 0 0 1 0 0 0 0 2
Total # of neighbors = 150858
Ave neighs/atom = 178.319
Neighbor list builds = 0
Dangerous builds = 0
#EXIT
variable L equal c_CM[1]
variable Lx equal $L
variable Lx equal -3752.4866657778384251
variable dx equal c_CM[1]-${Lx}
variable dx equal c_CM[1]--3752.4866657778384251
variable L equal c_CM[3]
variable Lz equal $L
variable Lz equal -51103.063299276320322
variable dz equal c_CM[3]-${Lz}
variable dz equal c_CM[3]--51103.063299276320322
print "initial ${Lx} ${Lz} "
initial -3752.4866657778384251 -51103.063299276320322
variable nAll equal count(all)
variable nGhost equal count(all)-count(internal)
print ">>> number of stationary ghosts: ${nGhost} of ${nAll}"
>>> number of stationary ghosts: 90 of 846
neighbor 5. bin
neigh_modify every 10 delay 0 check no
timestep 0
thermo 100
# coupling ............................................................
fix AtC internal atc electrostatic CNT_electrostatic2.mat
ATC: constructing electrostatic mechanical coupling with parameter file CNT_electrostatic2.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 6
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_electrostatic2.mat
ATC: creating electrostatic extrinsic model
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_electrostatic2.mat
ATC: computed mass density : 2.05933
ATC: 1 materials defined from CNT_electrostatic2.mat
fix_modify AtC omit atomic_charge
#fix_modify AtC internal_quadrature off ## NOTE active -> error
# note weights don't affect phi or f i.e. they divide out
fix_modify AtC atom_weight constant internal 1.0
fix_modify AtC extrinsic short_range off
fix_modify AtC source_integration atom
fix_modify AtC atom_element_map eulerian 1
fix_modify AtC control momentum none # flux
fix_modify AtC mesh create ${nx} 1 ${nz} feRegion f p f
fix_modify AtC mesh create 10 1 ${nz} feRegion f p f
fix_modify AtC mesh create 10 1 14 feRegion f p f
ATC: created uniform mesh with 330 nodes, 165 unique nodes, and 140 elements
# node sets ............................................................
variable t equal 1.1*$R
variable t equal 1.1*6.0499999999999998224
fix_modify AtC mesh create_nodeset tube -$t $t -$t $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 $t -$t $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -$t $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 $t ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 ${zloFE} ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 ${zFree} units box
fix_modify AtC mesh create_nodeset tube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 100 units box
ATC: created nodeset tube with 39 nodes
fix_modify AtC mesh create_nodeset lefttube -$t $t -$t $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 $t -$t $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -$t $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 $t ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 ${zloFE} units box
fix_modify AtC mesh create_nodeset lefttube -6.6550000000000002487 6.6550000000000002487 -6.6550000000000002487 6.6550000000000002487 10 10 units box
ATC: created nodeset lefttube with 3 nodes
fix_modify AtC mesh create_nodeset rbc INF INF INF INF ${zhiFE} ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc INF INF INF INF 115 ${zhiFE} units box
fix_modify AtC mesh create_nodeset rbc INF INF INF INF 115 115 units box
ATC: created nodeset rbc with 11 nodes
fix_modify AtC mesh create_nodeset lbc INF INF INF INF ${zloFE} ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc INF INF INF INF 10 ${zloFE} units box
fix_modify AtC mesh create_nodeset lbc INF INF INF INF 10 10 units box
ATC: created nodeset lbc with 11 nodes
fix_modify AtC mesh create_nodeset top ${xhiFE} ${xhiFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset top 30.25 ${xhiFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset top 30.25 30.25 INF INF INF INF units box
ATC: created nodeset top with 15 nodes
fix_modify AtC mesh create_nodeset bot ${xloFE} ${xloFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset bot -30.25 ${xloFE} INF INF INF INF units box
fix_modify AtC mesh create_nodeset bot -30.25 -30.25 INF INF INF INF units box
ATC: created nodeset bot with 15 nodes
# boundary conditions ..................................................
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix displacement y lbc 0.
fix_modify AtC fix displacement z lbc 0.
fix_modify AtC fix velocity x lbc 0.
fix_modify AtC fix velocity y lbc 0.
fix_modify AtC fix velocity z lbc 0.
# minimize .............................................................
compute FSUM all reduce sum fx fy fz
compute RSUM internal reduce sum fx fy fz
thermo $s
thermo 250
fix_modify AtC output electrostatic_bending_dosFE 100000000 full_text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC output index step
# store original (reference) coordinates
fix X all store/state 0 x y z
# NOTE not recognized as vector by paraview - due to dump2ensight
variable uX atom x-f_X[1]
variable uY atom y-f_X[2]
variable uZ atom z-f_X[3]
#variable uX atom x-f_AtC[1]
#variable uY atom y-f_AtC[2]
#variable uZ atom z-f_AtC[3]
variable rho atom mass*f_AtC[4]
dump CONFIG all custom 100000 electrostatic_bending_dos.dmp id type x y z c_q v_uX v_uY v_uZ v_rho
+[pharsalus:46009] *** Process received signal ***
+[pharsalus:46011] *** Process received signal ***
+[pharsalus:46011] Signal: Segmentation fault (11)
+[pharsalus:46011] Signal code: Address not mapped (1)
+[pharsalus:46011] Failing at address: (nil)
+[pharsalus:46012] *** Process received signal ***
+[pharsalus:46012] Signal: Segmentation fault (11)
+[pharsalus:46012] Signal code: Address not mapped (1)
+[pharsalus:46012] Failing at address: (nil)
+[pharsalus:46010] *** Process received signal ***
+[pharsalus:46010] Signal: Segmentation fault (11)
+[pharsalus:46010] Signal code: Address not mapped (1)
+[pharsalus:46010] Failing at address: (nil)
reset_timestep 0
log electrostatic_bending_dos.log
thermo 10 # 1 # 10
min_modify line quadratic
variable a equal 0
variable i loop ${ng}
variable i loop 3
thermo_style custom step c_Q pe v_dx v_dz f_FIX[1] f_FIX[3]
label loop_i
variable b equal ($i-1)*${Vg}/${ng}/${Lz}
variable b equal (1-1)*${Vg}/${ng}/${Lz}
variable b equal (1-1)*0.14999999999999999445/${ng}/${Lz}
variable b equal (1-1)*0.14999999999999999445/3/${Lz}
variable b equal (1-1)*0.14999999999999999445/3/-51103.063299276320322
fix_modify AtC fix electric_potential all linear 0 0 0 $b 0 $a ${V0} # <<<ALL
fix_modify AtC fix electric_potential all linear 0 0 0 -0 0 $a ${V0}
fix_modify AtC fix electric_potential all linear 0 0 0 -0 0 0 ${V0}
fix_modify AtC fix electric_potential all linear 0 0 0 -0 0 0 1
ATC: created function : 1 + -0(x-0)+0(y-0)+0(z-0)
min_style cg
min_modify line quadratic
minimize 0 0 1000 1000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
- ATC: WARNING: all initial conditions for displacement have not been defined and the undefined are assumed zero
- ATC: WARNING: all initial conditions for velocity have not been defined and the undefined are assumed zero
- ATC: WARNING: all initial conditions for electron_density have not been defined and the undefined are assumed zero
- ATC: WARNING: material: [cnt] cannot find electron_flux
- ATC: WARNING: physics model: [electrostatic], material: [cnt] does not provide all interfaces for <electron_density> physics and will be treated as null
-Memory usage per processor = 51.8077 Mbytes
-Step Q PotEng dx dz FIX[1] FIX[3]
- 0 0 -6155.851 0 0 2.2200304e-11 0.010686876
- 10 0 -6155.851 2.7284841e-12 -0.00060946523 5.7770455e-11 0.0091922227
- 20 0 -6155.851 4.0927262e-12 -0.0011905579 -4.4327736e-13 0.0001153156
- 30 0 -6155.851 4.5474735e-12 -0.0011946243 2.1081175e-11 1.3099811e-05
- 40 0 -6155.851 4.5474735e-12 -0.0011946457 2.2032078e-11 6.8020645e-06
- 50 0 -6155.851 5.4569682e-12 -0.0011947265 2.2896851e-11 6.476084e-06
- 60 0 -6155.851 7.730705e-12 -0.0011953427 2.2953812e-11 3.5758304e-06
- 70 0 -6155.851 8.1854523e-12 -0.0011954794 1.9801188e-11 8.3950483e-07
- 80 0 -6155.851 8.1854523e-12 -0.0011954783 1.8441963e-11 2.9804539e-07
- 90 0 -6155.851 7.2759576e-12 -0.0011954747 2.1744013e-11 -3.8789192e-08
- 100 0 -6155.851 7.730705e-12 -0.0011954732 1.9237549e-11 -2.8935894e-09
- 110 0 -6155.851 7.2759576e-12 -0.0011954716 1.9095805e-11 1.6112378e-09
- 120 0 -6155.851 8.1854523e-12 -0.0011954714 1.9817977e-11 4.6976383e-09
- 130 0 -6155.851 7.730705e-12 -0.0011954714 1.7488642e-11 3.2517748e-09
- 140 0 -6155.851 1.0004442e-11 -0.0011954717 1.5207016e-11 2.7887026e-11
- 150 0 -6155.851 1.0459189e-11 -0.0011954718 1.7530141e-11 6.6725403e-11
- 160 0 -6155.851 1.0913936e-11 -0.0011954718 1.7545739e-11 8.9193097e-12
- 170 0 -6155.851 1.0913936e-11 -0.0011954718 1.7562698e-11 8.2844842e-12
- 180 0 -6155.851 1.0913936e-11 -0.0011954718 1.7454236e-11 8.3764107e-12
- 190 0 -6155.851 1.0913936e-11 -0.0011954718 1.7391744e-11 8.3804075e-12
- 200 0 -6155.851 1.0913936e-11 -0.0011954718 1.7363343e-11 8.2092111e-12
- 210 0 -6155.851 1.0913936e-11 -0.0011954718 1.7510129e-11 8.3804075e-12
- 220 0 -6155.851 1.0913936e-11 -0.0011954718 1.7388087e-11 8.3107965e-12
- 230 0 -6155.851 1.0913936e-11 -0.0011954718 1.7328517e-11 8.3658636e-12
- 240 0 -6155.851 1.0913936e-11 -0.0011954718 1.7553941e-11 8.2239771e-12
- 250 0 -6155.851 1.0913936e-11 -0.0011954718 1.7431705e-11 7.9389828e-12
- 260 0 -6155.851 1.0913936e-11 -0.0011954718 1.7440851e-11 8.2803764e-12
- 270 0 -6155.851 1.0913936e-11 -0.0011954718 1.7502551e-11 8.4340313e-12
- 280 0 -6155.851 1.0913936e-11 -0.0011954718 1.7509039e-11 8.2114315e-12
- 290 0 -6155.851 1.0913936e-11 -0.0011954718 1.7563475e-11 8.2074347e-12
- 300 0 -6155.851 1.0913936e-11 -0.0011954718 1.7385805e-11 8.4339202e-12
- 310 0 -6155.851 1.0913936e-11 -0.0011954718 1.7432996e-11 8.3754115e-12
- 320 0 -6155.851 1.0913936e-11 -0.0011954718 1.7523174e-11 8.472778e-12
- 330 0 -6155.851 1.0913936e-11 -0.0011954718 1.7343221e-11 8.1784579e-12
- 340 0 -6155.851 1.0913936e-11 -0.0011954718 1.7426002e-11 8.1481488e-12
- 350 0 -6155.851 1.0913936e-11 -0.0011954718 1.74698e-11 8.3067997e-12
- 360 0 -6155.851 1.0913936e-11 -0.0011954718 1.738067e-11 8.5164098e-12
- 370 0 -6155.851 1.0913936e-11 -0.0011954718 1.753599e-11 8.3784091e-12
- 380 0 -6155.851 1.0913936e-11 -0.0011954718 1.7339446e-11 8.3465457e-12
- 390 0 -6155.851 1.0913936e-11 -0.0011954718 1.7437576e-11 8.5182972e-12
- 400 0 -6155.851 1.0913936e-11 -0.0011954718 1.7300047e-11 8.1350482e-12
- 410 0 -6155.851 1.0913936e-11 -0.0011954718 1.7222838e-11 8.2779339e-12
- 420 0 -6155.851 1.0913936e-11 -0.0011954718 1.7421602e-11 8.0918605e-12
- 430 0 -6155.851 1.0913936e-11 -0.0011954718 1.7416773e-11 8.3816287e-12
- 440 0 -6155.851 1.0913936e-11 -0.0011954718 1.7347863e-11 8.4523499e-12
- 450 0 -6155.851 1.0913936e-11 -0.0011954718 1.7408828e-11 8.1795681e-12
- 460 0 -6155.851 1.0913936e-11 -0.0011954718 1.7534991e-11 8.308576e-12
- 470 0 -6155.851 1.0913936e-11 -0.0011954718 1.7459565e-11 8.2645002e-12
- 480 0 -6155.851 1.0913936e-11 -0.0011954718 1.7273457e-11 8.5179641e-12
- 490 0 -6155.851 1.0913936e-11 -0.0011954718 1.7452029e-11 8.4042773e-12
- 500 0 -6155.851 1.0913936e-11 -0.0011954718 1.7463576e-11 8.1070706e-12
-Loop time of 154.975 on 4 procs for 500 steps with 846 atoms
-
-Minimization stats:
- Stopping criterion = max force evaluations
- Energy initial, next-to-last, final =
- -6155.85097822 -6155.8510078 -6155.8510078
- Force two-norm initial, final = 0.00144775 6.46495e-12
- Force max component initial, final = 0.000150789 6.70891e-13
- Final line search alpha, max atom move = 1 6.70891e-13
- Iterations, force evaluations = 500 1000
-
-Pair time (%) = 10.2259 (6.59839)
-Neigh time (%) = 0 (0)
-Comm time (%) = 7.76684 (5.01167)
-Outpt time (%) = 0.783488 (0.505557)
-Other time (%) = 136.199 (87.8844)
-
-Nlocal: 211.5 ave 216 max 198 min
-Histogram: 1 0 0 0 0 0 0 0 0 3
-Nghost: 195.75 ave 261 max 126 min
-Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 0 ave 0 max 0 min
-Histogram: 4 0 0 0 0 0 0 0 0 0
-FullNghs: 48199.5 ave 53136 max 41085 min
-Histogram: 1 0 0 1 0 0 0 0 0 2
-
-Total # of neighbors = 192798
-Ave neighs/atom = 227.894
-Neighbor list builds = 0
-Dangerous builds = 0
- #min_style sd
- #min_modify line backtrack
- #minimize 0 0 1000 1000
- fix_modify AtC output now
-
- # u = F L^3 / 3 EI --> EI = F L^3 / 3 u
- variable Q equal c_Q
- variable ux equal ${dx}
- variable ux equal 1.0913936421275138855e-11
- variable uz equal ${dz}
- variable uz equal -0.0011954718283959664404
- variable Fx equal f_FIX[1]
- variable Fz equal f_FIX[3]
- variable EI equal ${Fx}*${Lfree}*${Lfree}*${Lfree}/3./${ux}
- variable EI equal 1.7463575724407931489e-11*${Lfree}*${Lfree}*${Lfree}/3./${ux}
- variable EI equal 1.7463575724407931489e-11*90*${Lfree}*${Lfree}/3./${ux}
- variable EI equal 1.7463575724407931489e-11*90*90*${Lfree}/3./${ux}
- variable EI equal 1.7463575724407931489e-11*90*90*90/3./${ux}
- variable EI equal 1.7463575724407931489e-11*90*90*90/3./1.0913936421275138855e-11
- variable EI equal ${EI}*${eV2J}*${A2m}
- variable EI equal 388828.44257354736328*${eV2J}*${A2m}
- variable EI equal 388828.44257354736328*1.6021764600000000642e-19*${A2m}
- variable EI equal 388828.44257354736328*1.6021764600000000642e-19*1.0000000000000000364e-10
- print ">> V $b $a F ${Fx} ${Fz} u ${ux} ${uz} Q $Q EI ${EI}"
->> V -0 0 F 1.7463575724407931489e-11 8.1070705704178180895e-12 u 1.0913936421275138855e-11 -0.0011954718283959664404 Q 0 EI 6.2297177766979946381e-24
-
- next i
-jump SELF loop_i
- variable b equal ($i-1)*${Vg}/${ng}/${Lz}
- variable b equal (2-1)*${Vg}/${ng}/${Lz}
- variable b equal (2-1)*0.14999999999999999445/${ng}/${Lz}
- variable b equal (2-1)*0.14999999999999999445/3/${Lz}
- variable b equal (2-1)*0.14999999999999999445/3/-51103.063299276320322
- fix_modify AtC fix electric_potential all linear 0 0 0 $b 0 $a ${V0} # <<<ALL
- fix_modify AtC fix electric_potential all linear 0 0 0 -9.7841492802855238901e-07 0 $a ${V0}
- fix_modify AtC fix electric_potential all linear 0 0 0 -9.7841492802855238901e-07 0 0 ${V0}
- fix_modify AtC fix electric_potential all linear 0 0 0 -9.7841492802855238901e-07 0 0 1
- ATC: created function : 1 + -9.78415e-07(x-0)+0(y-0)+0(z-0)
- min_style cg
- min_modify line quadratic
- minimize 0 0 1000 1000
-WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
-Setting up minimization ...
- ATC: WARNING: material: [cnt] cannot find electron_flux
- ATC: WARNING: physics model: [electrostatic], material: [cnt] does not provide all interfaces for <electron_density> physics and will be treated as null
-Memory usage per processor = 51.8077 Mbytes
-Step Q PotEng dx dz FIX[1] FIX[3]
- 500 0 -6155.851 0.0003179655 -0.0011954718 1.7463576e-11 8.1070706e-12
- 510 0 -6155.851 0.0003179655 -0.0011954718 1.7251516e-11 8.5466079e-12
- 520 0 -6155.851 0.0003179655 -0.0011954718 1.7276357e-11 8.2207574e-12
- 530 0 -6155.851 0.0003179655 -0.0011954718 1.75636e-11 8.4386942e-12
- 540 0 -6155.851 0.0003179655 -0.0011954718 1.7522834e-11 8.5189633e-12
- 550 0 -6155.851 0.0003179655 -0.0011954718 1.7338121e-11 8.1677998e-12
- 560 0 -6155.851 0.0003179655 -0.0011954718 1.7448248e-11 8.4081631e-12
- 570 0 -6155.851 0.0003179655 -0.0011954718 1.7392986e-11 8.5064178e-12
- 580 0 -6155.851 0.0003179655 -0.0011954718 1.7444438e-11 8.5607077e-12
- 590 0 -6155.851 0.0003179655 -0.0011954718 1.7296425e-11 8.4051655e-12
- 600 0 -6155.851 0.0003179655 -0.0011954718 1.7447616e-11 8.3621998e-12
- 610 0 -6155.851 0.0003179655 -0.0011954718 1.7417904e-11 8.3870688e-12
- 620 0 -6155.851 0.0003179655 -0.0011954718 1.7328212e-11 8.6393115e-12
- 630 0 -6155.851 0.0003179655 -0.0011954718 1.7411971e-11 8.4993124e-12
- 640 0 -6155.851 0.0003179655 -0.0011954718 1.7426383e-11 8.6461949e-12
- 650 0 -6155.851 0.0003179655 -0.0011954718 1.7399009e-11 8.3740792e-12
- 660 0 -6155.851 0.0003179655 -0.0011954718 1.737387e-11 8.4294793e-12
- 670 0 -6155.851 0.0003179655 -0.0011954718 1.7378914e-11 8.7023722e-12
- 680 0 -6155.851 0.0003179655 -0.0011954718 1.734771e-11 8.80096e-12
- 690 0 -6155.851 0.0003179655 -0.0011954718 1.7320447e-11 8.8147267e-12
- 700 0 -6155.851 0.0003179655 -0.0011954718 1.7359548e-11 8.7029273e-12
- 710 0 -6155.851 0.0003179655 -0.0011954718 1.7191474e-11 8.8338226e-12
- 720 0 -6155.851 0.0003179655 -0.0011954718 1.7362872e-11 8.7141405e-12
- 730 0 -6155.851 0.0003179655 -0.0011954718 1.7459898e-11 8.5019769e-12
- 740 0 -6155.851 0.0003179655 -0.0011954718 1.724575e-11 8.7195806e-12
- 750 0 -6155.851 0.0003179655 -0.0011954718 1.7368686e-11 8.9750429e-12
- 760 0 -6155.851 0.0003179655 -0.0011954718 1.7282762e-11 8.5165208e-12
- 770 0 -6155.851 0.0003179655 -0.0011954718 1.7351915e-11 8.6922691e-12
- 780 0 -6155.851 0.0003179655 -0.0011954718 1.7261335e-11 8.8746788e-12
- 790 0 -6155.851 0.0003179655 -0.0011954718 1.7332431e-11 8.4021679e-12
- 800 0 -6155.851 0.0003179655 -0.0011954718 1.7336011e-11 8.6323171e-12
- 810 0 -6155.851 0.0003179655 -0.0011954718 1.7329544e-11 8.656631e-12
- 820 0 -6155.851 0.0003179655 -0.0011954718 1.7118616e-11 8.7636565e-12
- 830 0 -6155.851 0.0003179655 -0.0011954718 1.7304474e-11 8.7291285e-12
- 840 0 -6155.851 0.0003179655 -0.0011954718 1.7398697e-11 8.7205798e-12
- 850 0 -6155.851 0.0003179655 -0.0011954718 1.7366813e-11 8.8165031e-12
- 860 0 -6155.851 0.0003179655 -0.0011954718 1.7268856e-11 8.8138385e-12
- 870 0 -6155.851 0.0003179655 -0.0011954718 1.7315867e-11 9.0394359e-12
- 880 0 -6155.851 0.0003179655 -0.0011954718 1.7205706e-11 8.9996899e-12
- 890 0 -6155.851 0.0003179655 -0.0011954718 1.7218945e-11 9.0571994e-12
- 900 0 -6155.851 0.0003179655 -0.0011954718 1.7313557e-11 8.9475094e-12
- 910 0 -6155.851 0.0003179655 -0.0011954718 1.7205095e-11 8.8882235e-12
- 920 0 -6155.851 0.0003179655 -0.0011954718 1.7258906e-11 8.6174401e-12
- 930 0 -6155.851 0.0003179655 -0.0011954718 1.7300519e-11 9.1007202e-12
- 940 0 -6155.851 0.0003179655 -0.0011954718 1.7295516e-11 8.8616892e-12
- 950 0 -6155.851 0.0003179655 -0.0011954718 1.7298798e-11 8.9259711e-12
- 960 0 -6155.851 0.0003179655 -0.0011954718 1.7154941e-11 8.7637675e-12
- 970 0 -6155.851 0.0003179655 -0.0011954718 1.7201674e-11 9.0283336e-12
- 980 0 -6155.851 0.0003179655 -0.0011954718 1.7269717e-11 8.5640384e-12
- 990 0 -6155.851 0.0003179655 -0.0011954718 1.7215684e-11 8.985479e-12
- 1000 0 -6155.851 0.0003179655 -0.0011954718 1.7359402e-11 9.1016084e-12
-Loop time of 58.7288 on 4 procs for 500 steps with 846 atoms
-
-Minimization stats:
- Stopping criterion = max force evaluations
- Energy initial, next-to-last, final =
- -6155.8510078 -6155.8510078 -6155.8510078
- Force two-norm initial, final = 6.46495e-12 6.71492e-12
- Force max component initial, final = 6.70891e-13 6.69757e-13
- Final line search alpha, max atom move = 1 6.69757e-13
- Iterations, force evaluations = 500 1000
-
-Pair time (%) = 7.65567 (13.0356)
-Neigh time (%) = 0 (0)
-Comm time (%) = 1.17538 (2.00138)
-Outpt time (%) = 0.144858 (0.246656)
-Other time (%) = 49.7529 (84.7163)
-
-Nlocal: 211.5 ave 216 max 198 min
-Histogram: 1 0 0 0 0 0 0 0 0 3
-Nghost: 195.75 ave 261 max 126 min
-Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 0 ave 0 max 0 min
-Histogram: 4 0 0 0 0 0 0 0 0 0
-FullNghs: 48199.5 ave 53136 max 41085 min
-Histogram: 1 0 0 1 0 0 0 0 0 2
-
-Total # of neighbors = 192798
-Ave neighs/atom = 227.894
-Neighbor list builds = 0
-Dangerous builds = 0
- #min_style sd
- #min_modify line backtrack
- #minimize 0 0 1000 1000
- fix_modify AtC output now
-
- # u = F L^3 / 3 EI --> EI = F L^3 / 3 u
- variable Q equal c_Q
- variable ux equal ${dx}
- variable ux equal 0.0003179654981977364514
- variable uz equal ${dz}
- variable uz equal -0.0011954718283959664404
- variable Fx equal f_FIX[1]
- variable Fz equal f_FIX[3]
- variable EI equal ${Fx}*${Lfree}*${Lfree}*${Lfree}/3./${ux}
- variable EI equal 1.7359402110228572269e-11*${Lfree}*${Lfree}*${Lfree}/3./${ux}
- variable EI equal 1.7359402110228572269e-11*90*${Lfree}*${Lfree}/3./${ux}
- variable EI equal 1.7359402110228572269e-11*90*90*${Lfree}/3./${ux}
- variable EI equal 1.7359402110228572269e-11*90*90*90/3./${ux}
- variable EI equal 1.7359402110228572269e-11*90*90*90/3./0.0003179654981977364514
- variable EI equal ${EI}*${eV2J}*${A2m}
- variable EI equal 0.013266642880109728517*${eV2J}*${A2m}
- variable EI equal 0.013266642880109728517*1.6021764600000000642e-19*${A2m}
- variable EI equal 0.013266642880109728517*1.6021764600000000642e-19*1.0000000000000000364e-10
- print ">> V $b $a F ${Fx} ${Fz} u ${ux} ${uz} Q $Q EI ${EI}"
->> V -9.7841492802855238901e-07 0 F 1.7359402110228572269e-11 9.1016083558770333184e-12 u 0.0003179654981977364514 -0.0011954718283959664404 Q 0 EI 2.125550292573840973e-31
-
- next i
-jump SELF loop_i
- variable b equal ($i-1)*${Vg}/${ng}/${Lz}
- variable b equal (3-1)*${Vg}/${ng}/${Lz}
- variable b equal (3-1)*0.14999999999999999445/${ng}/${Lz}
- variable b equal (3-1)*0.14999999999999999445/3/${Lz}
- variable b equal (3-1)*0.14999999999999999445/3/-51103.063299276320322
- fix_modify AtC fix electric_potential all linear 0 0 0 $b 0 $a ${V0} # <<<ALL
- fix_modify AtC fix electric_potential all linear 0 0 0 -1.956829856057104778e-06 0 $a ${V0}
- fix_modify AtC fix electric_potential all linear 0 0 0 -1.956829856057104778e-06 0 0 ${V0}
- fix_modify AtC fix electric_potential all linear 0 0 0 -1.956829856057104778e-06 0 0 1
- ATC: created function : 1 + -1.95683e-06(x-0)+0(y-0)+0(z-0)
- min_style cg
- min_modify line quadratic
- minimize 0 0 1000 1000
-WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
-Setting up minimization ...
- ATC: WARNING: material: [cnt] cannot find electron_flux
- ATC: WARNING: physics model: [electrostatic], material: [cnt] does not provide all interfaces for <electron_density> physics and will be treated as null
-Memory usage per processor = 51.8077 Mbytes
-Step Q PotEng dx dz FIX[1] FIX[3]
- 1000 0 -6155.851 0.00031796548 -0.0011954718 1.7359402e-11 9.1016084e-12
- 1010 0 -6155.851 0.00031796548 -0.0011954718 1.72647e-11 8.9737107e-12
- 1020 0 -6155.851 0.00031796548 -0.0011954718 1.7298243e-11 9.3161034e-12
- 1030 0 -6155.851 0.00031796548 -0.0011954718 1.7292941e-11 8.7504448e-12
- 1040 0 -6155.851 0.00031796548 -0.0011954718 1.7324222e-11 8.9780405e-12
- 1050 0 -6155.851 0.00031796548 -0.0011954718 1.7239831e-11 8.8595797e-12
- 1060 0 -6155.851 0.00031796548 -0.0011954718 1.7318608e-11 8.6920471e-12
- 1070 0 -6155.851 0.00031796548 -0.0011954718 1.7192938e-11 8.8485885e-12
- 1080 0 -6155.851 0.00031796548 -0.0011954718 1.7274428e-11 8.8733465e-12
- 1090 0 -6155.851 0.00031796548 -0.0011954718 1.7129246e-11 9.0292218e-12
- 1100 0 -6155.851 0.00031796548 -0.0011954718 1.7195401e-11 9.1879837e-12
- 1110 0 -6155.851 0.00031796548 -0.0011954718 1.7221478e-11 8.9610541e-12
- 1120 0 -6155.851 0.00031796548 -0.0011954718 1.7302357e-11 9.2608143e-12
- 1130 0 -6155.851 0.00031796548 -0.0011954718 1.7290416e-11 9.0714103e-12
- 1140 0 -6155.851 0.00031796548 -0.0011954718 1.7198343e-11 9.21907e-12
- 1150 0 -6155.851 0.00031796548 -0.0011954718 1.7163059e-11 9.2147401e-12
- 1160 0 -6155.851 0.00031796548 -0.0011954718 1.7186443e-11 9.0759622e-12
- 1170 0 -6155.851 0.00031796548 -0.0011954718 1.7350291e-11 9.0307761e-12
- 1180 0 -6155.851 0.00031796548 -0.0011954718 1.7178033e-11 8.9124264e-12
- 1190 0 -6155.851 0.00031796548 -0.0011954718 1.7142825e-11 9.4578789e-12
- 1200 0 -6155.851 0.00031796548 -0.0011954718 1.7238853e-11 8.9984686e-12
- 1210 0 -6155.851 0.00031796548 -0.0011954718 1.7307909e-11 8.8733465e-12
- 1220 0 -6155.851 0.00031796548 -0.0011954718 1.7251884e-11 9.2414965e-12
- 1230 0 -6155.851 0.00031796548 -0.0011954718 1.7304682e-11 9.1451291e-12
- 1240 0 -6155.851 0.00031796548 -0.0011954718 1.7177992e-11 9.1870955e-12
- 1250 0 -6155.851 0.00031796548 -0.0011954718 1.7087293e-11 9.1605612e-12
- 1260 0 -6155.851 0.00031796548 -0.0011954718 1.7135144e-11 9.0688568e-12
- 1270 0 -6155.851 0.00031796548 -0.0011954718 1.7224919e-11 9.0758512e-12
- 1280 0 -6155.851 0.00031796548 -0.0011954718 1.7203346e-11 9.1016084e-12
- 1290 0 -6155.851 0.00031796548 -0.0011954718 1.7203673e-11 9.2676977e-12
- 1300 0 -6155.851 0.00031796548 -0.0011954718 1.7155246e-11 9.1611163e-12
- 1310 0 -6155.851 0.00031796548 -0.0011954718 1.7048158e-11 9.2623686e-12
- 1320 0 -6155.851 0.00031796548 -0.0011954718 1.7049185e-11 9.2745811e-12
- 1330 0 -6155.851 0.00031796548 -0.0011954718 1.7226918e-11 9.383605e-12
- 1340 0 -6155.851 0.00031796548 -0.0011954718 1.7146114e-11 9.0593089e-12
- 1350 0 -6155.851 0.00031796548 -0.0011954718 1.7130807e-11 9.2582608e-12
- 1360 0 -6155.851 0.00031796548 -0.0011954718 1.7170206e-11 9.4171337e-12
- 1370 0 -6155.851 0.00031796548 -0.0011954718 1.7139155e-11 9.0635277e-12
- 1380 0 -6155.851 0.00031796548 -0.0011954718 1.7048789e-11 9.1849861e-12
- 1390 0 -6155.851 0.00031796548 -0.0011954718 1.7176548e-11 9.2297281e-12
- 1400 0 -6155.851 0.00031796548 -0.0011954718 1.7135373e-11 9.2431618e-12
- 1410 0 -6155.851 0.00031796548 -0.0011954718 1.7186665e-11 9.3181018e-12
- 1420 0 -6155.851 0.00031796548 -0.0011954718 1.7178928e-11 9.4295682e-12
- 1430 0 -6155.851 0.00031796548 -0.0011954718 1.7148834e-11 9.4859676e-12
- 1440 0 -6155.851 0.00031796548 -0.0011954718 1.715662e-11 9.3871577e-12
- 1450 0 -6155.851 0.00031796548 -0.0011954718 1.7190711e-11 9.3713926e-12
- 1460 0 -6155.851 0.00031796548 -0.0011954718 1.7210958e-11 9.5933261e-12
- 1470 0 -6155.851 0.00031796548 -0.0011954718 1.7199183e-11 9.4561026e-12
- 1480 0 -6155.851 0.00031796548 -0.0011954718 1.7054681e-11 9.3104413e-12
- 1490 0 -6155.851 0.00031796548 -0.0011954718 1.722188e-11 9.3294261e-12
- 1500 0 -6155.851 0.00031796548 -0.0011954718 1.7142694e-11 9.3715036e-12
-Loop time of 76.7522 on 4 procs for 500 steps with 846 atoms
-
-Minimization stats:
- Stopping criterion = max force evaluations
- Energy initial, next-to-last, final =
- -6155.8510078 -6155.8510078 -6155.8510078
- Force two-norm initial, final = 6.71492e-12 6.81183e-12
- Force max component initial, final = 6.69757e-13 8.93204e-13
- Final line search alpha, max atom move = 1 8.93204e-13
- Iterations, force evaluations = 500 1000
-
-Pair time (%) = 8.35572 (10.8866)
-Neigh time (%) = 0 (0)
-Comm time (%) = 2.23788 (2.91572)
-Outpt time (%) = 0.0837539 (0.109123)
-Other time (%) = 66.0748 (86.0885)
-
-Nlocal: 211.5 ave 216 max 198 min
-Histogram: 1 0 0 0 0 0 0 0 0 3
-Nghost: 195.75 ave 261 max 126 min
-Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 0 ave 0 max 0 min
-Histogram: 4 0 0 0 0 0 0 0 0 0
-FullNghs: 48199.5 ave 53136 max 41085 min
-Histogram: 1 0 0 1 0 0 0 0 0 2
-
-Total # of neighbors = 192798
-Ave neighs/atom = 227.894
-Neighbor list builds = 0
-Dangerous builds = 0
- #min_style sd
- #min_modify line backtrack
- #minimize 0 0 1000 1000
- fix_modify AtC output now
-
- # u = F L^3 / 3 EI --> EI = F L^3 / 3 u
- variable Q equal c_Q
- variable ux equal ${dx}
- variable ux equal 0.0003179654813720844686
- variable uz equal ${dz}
- variable uz equal -0.0011954718283959664404
- variable Fx equal f_FIX[1]
- variable Fz equal f_FIX[3]
- variable EI equal ${Fx}*${Lfree}*${Lfree}*${Lfree}/3./${ux}
- variable EI equal 1.714269351471564562e-11*${Lfree}*${Lfree}*${Lfree}/3./${ux}
- variable EI equal 1.714269351471564562e-11*90*${Lfree}*${Lfree}/3./${ux}
- variable EI equal 1.714269351471564562e-11*90*90*${Lfree}/3./${ux}
- variable EI equal 1.714269351471564562e-11*90*90*90/3./${ux}
- variable EI equal 1.714269351471564562e-11*90*90*90/3./0.0003179654813720844686
- variable EI equal ${EI}*${eV2J}*${A2m}
- variable EI equal 0.013101027526950992722*${eV2J}*${A2m}
- variable EI equal 0.013101027526950992722*1.6021764600000000642e-19*${A2m}
- variable EI equal 0.013101027526950992722*1.6021764600000000642e-19*1.0000000000000000364e-10
- print ">> V $b $a F ${Fx} ${Fz} u ${ux} ${uz} Q $Q EI ${EI}"
->> V -1.956829856057104778e-06 0 F 1.714269351471564562e-11 9.3715035731634088734e-12 u 0.0003179654813720844686 -0.0011954718283959664404 Q 0 EI 2.0990157905492896479e-31
-
- next i
-jump SELF loop_i
+[pharsalus:46009] Signal: Segmentation fault (11)
+[pharsalus:46009] Signal code: Address not mapped (1)
+[pharsalus:46009] Failing at address: (nil)
+[pharsalus:46012] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:46012] [ 1] ../../../lmp_openmpi(_ZN3ATC12GhostManager12pre_exchangeEv+0x8) [0xaf56de]
+[pharsalus:46012] [ 2] ../../../lmp_openmpi(_ZN3ATC10ATC_Method12pre_exchangeEv+0x3f) [0xa7c7d3]
+[pharsalus:46012] [ 3] ../../../lmp_openmpi(_ZN3ATC12ATC_Coupling12pre_exchangeEv+0x9) [0xb8df15]
+[pharsalus:46012] [ 4] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC22min_setup_pre_exchangeEv+0x1e) [0x68de8e]
+[pharsalus:46011] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:46011] [ 1] ../../../lmp_openmpi(_ZN3ATC12GhostManager12pre_exchangeEv+0x8) [0xaf56de]
+[pharsalus:46011] [ 2] ../../../lmp_openmpi(_ZN3ATC10ATC_Method12pre_exchangeEv+0x3f) [0xa7c7d3]
+[pharsalus:46011] [ 3] ../../../lmp_openmpi(_ZN3ATC12ATC_Coupling12pre_exchangeEv+0x9) [0xb8df15]
+[pharsalus:46011] [ 4] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC22min_setup_pre_exchangeEv+0x1e) [0x68de8e]
+[pharsalus:46011] [ 5] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Modify18setup_pre_exchangeEv+0x67) [0x7c4a67]
+[pharsalus:46011] [ 6] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Min5setupEv+0x283) [0x7adae3]
+[pharsalus:46011] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS8Minimize7commandEiPPc+0x176) [0x7bcf96]
+[pharsalus:46011] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15command_creatorINS_8MinimizeEEEvPNS_6LAMMPSEiPPc+0x33) [0x798c83]
+[pharsalus:46011] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0x7a7) [0x7964e7]
+[pharsalus:46011] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:46011] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:46011] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:46011] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:46011] *** End of error message ***
+[pharsalus:46012] [ 5] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Modify18setup_pre_exchangeEv+0x67) [0x7c4a67]
+[pharsalus:46012] [ 6] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Min5setupEv+0x283) [0x7adae3]
+[pharsalus:46009] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:46009] [ 1] ../../../lmp_openmpi(_ZN3ATC12GhostManager12pre_exchangeEv+0x8) [0xaf56de]
+[pharsalus:46009] [ 2] ../../../lmp_openmpi(_ZN3ATC10ATC_Method12pre_exchangeEv+0x3f) [0xa7c7d3]
+[pharsalus:46012] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS8Minimize7commandEiPPc+0x176) [0x7bcf96]
+[pharsalus:46009] [ 3] ../../../lmp_openmpi(_ZN3ATC12ATC_Coupling12pre_exchangeEv+0x9) [0xb8df15]
+[pharsalus:46009] [ 4] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC22min_setup_pre_exchangeEv+0x1e) [0x68de8e]
+[pharsalus:46009] [ 5] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Modify18setup_pre_exchangeEv+0x67) [0x7c4a67]
+[pharsalus:46009] [ 6] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Min5setupEv+0x283) [0x7adae3]
+[pharsalus:46009] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS8Minimize7commandEiPPc+0x176) [0x7bcf96]
+[pharsalus:46010] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:46010] [ 1] ../../../lmp_openmpi(_ZN3ATC12GhostManager12pre_exchangeEv+0x8) [0xaf56de]
+[pharsalus:46010] [ 2] ../../../lmp_openmpi(_ZN3ATC10ATC_Method12pre_exchangeEv+0x3f) [0xa7c7d3]
+[pharsalus:46010] [ 3] ../../../lmp_openmpi(_ZN3ATC12ATC_Coupling12pre_exchangeEv+0x9) [0xb8df15]
+[pharsalus:46010] [ 4] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC22min_setup_pre_exchangeEv+0x1e) [0x68de8e]
+[pharsalus:46010] [ 5] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Modify18setup_pre_exchangeEv+0x67) [0x7c4a67]
+[pharsalus:46010] [ 6] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Min5setupEv+0x283) [0x7adae3]
+[pharsalus:46009] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15command_creatorINS_8MinimizeEEEvPNS_6LAMMPSEiPPc+0x33) [0x798c83]
+[pharsalus:46009] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0x7a7) [0x7964e7]
+[pharsalus:46009] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:46009] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:46009] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:46009] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:46009] *** End of error message ***
+[pharsalus:46010] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS8Minimize7commandEiPPc+0x176) [0x7bcf96]
+[pharsalus:46010] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15command_creatorINS_8MinimizeEEEvPNS_6LAMMPSEiPPc+0x33) [0x798c83]
+[pharsalus:46010] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0x7a7) [0x7964e7]
+[pharsalus:46010] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:46010] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:46010] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:46010] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:46010] *** End of error message ***
+[pharsalus:46012] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15command_creatorINS_8MinimizeEEEvPNS_6LAMMPSEiPPc+0x33) [0x798c83]
+[pharsalus:46012] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0x7a7) [0x7964e7]
+[pharsalus:46012] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:46012] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:46012] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:46012] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:46012] *** End of error message ***
+--------------------------------------------------------------------------
+mpirun noticed that process rank 2 with PID 46011 on node pharsalus exited on signal 11 (Segmentation fault).
+--------------------------------------------------------------------------
diff --git a/examples/USER/atc/elastic/in.bar1d_damped b/examples/USER/atc/elastic/in.bar1d_damped
index 08263157e..293c3b281 100644
--- a/examples/USER/atc/elastic/in.bar1d_damped
+++ b/examples/USER/atc/elastic/in.bar1d_damped
@@ -1,112 +1,116 @@
# needs description
echo both
units metal
atom_style atomic
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
lattice fcc 5.405 origin 0.25 0.25 0.25
# create atoms
region simRegion block -12 12 -3 3 -3 3
region atomRegion block -9 9 -3 3 -3 3
region mdRegion block -8 8 -3 3 -3 3
boundary f p p
create_box 2 simRegion
create_atoms 1 region mdRegion
mass * 39.95
# specify interal/ghost atoms
region mdInternal block -6 6 -3 3 -3 3
region leftghost block -8 -6 -3 3 -3 3
region rightghost block 6 8 -3 3 -3 3
group internal region mdInternal
group Lghost region leftghost
group Rghost region rightghost
group ghosts union Lghost Rghost
# velocities have Vcm = 0
#velocity internal create 40. 87287 mom yes loop geom
pair_style lj/cut 13.5
#pair_coeff * * .238 3.405 13.5
pair_coeff * * 0.010323166 3.405 13.5
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# define layer
# ID group atc PhysicsType ParameterFile
fix AtC internal atc elastic Ar_damped.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 12 1 1 simRegion f p p
# initial conditions
fix_modify AtC initial displacement x all 0.0
fix_modify AtC initial displacement y all 0.0
fix_modify AtC initial displacement z all 0.0
fix_modify AtC initial velocity x all 0.0
fix_modify AtC initial velocity y all 0.0
fix_modify AtC initial velocity z all 0.0
variable v equal 0.00000004e3
variable n equal 1000
variable dt equal 0.005
variable u equal $v*$n*${dt}
# set node sets and bcs
# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -INF INF -INF INF
fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -INF INF -INF INF
fix_modify AtC fix velocity x rbc $v
fix_modify AtC fix displacement x lbc 0.
fix_modify AtC fix velocity x lbc 0.
# specify atom types
fix_modify AtC boundary ghosts
#fix_modify AtC output follow_ex.fe 50
fix_modify AtC internal_quadrature off
fix_modify AtC control localized_lambda on
fix_modify AtC control momentum glc_velocity
#fix_modify AtC filter type exponential
#fix_modify AtC filter scale 1.0
#fix_modify AtC filter on
# run to extension
timestep 0.005
thermo 100
thermo_style custom step cpu ke pe
run 0
variable pe0 equal pe
variable pe equal pe-${pe0}
thermo_style custom step cpu ke pe v_pe f_AtC[1] f_AtC[2] f_AtC[4] f_AtC[5]
run $n
fix_modify AtC output bar1d_dampedFE 500 text
dump CONFIG all custom 500 bar1d_damped.dmp id type x y z vx vy vz
# change nodes to fixed
fix_modify AtC fix velocity x rbc 0.
fix_modify AtC fix displacement x rbc $u
# run to equilibrium
thermo 100
log bar1d_damped.log
run 2000
fix_modify AtC material all cubic # M damping
run 2000
fix_modify AtC material all damped # K damping
run 2000
# ATC: CB stiffness: 7.56717 Einstein freq: 0.355649 from Ar_CauchyBorn.mat
# real to metal 1 kcal/mol = 0.04336 eV
variable kCal2eV equal 0.04336
-variable k equal 1.e-3 # 7.56717*${kCal2eV} NOTE <<<
-variable g equal 0.75*0.355649e3*${kCal2eV}
-variable m equal 0.5*39.95
+variable fconv equal 1./0.000103643 # NOTE old routine was doing calculations in lammps units, not atc units, so this conversion is necessary for bmark to pass
+#variable k equal 1.e-3 # 7.56717*${kCal2eV} NOTE <<<
+#variable k equal 0.75*0.355649e3*${kCal2eV}
+variable k equal 0.5*39.95*${fconv} # NOTE it was set to above, should have been 2 above, but there was a bug so this value is here for bmark
+#variable g equal 0.75*0.355649e3*${kCal2eV}
+variable g equal 1.e-3*${fconv} # NOTE it should be above, but there was a bug so this value is here for bmark
+variable m equal 2. #0.5*39.95
fix_modify AtC boundary_dynamics damped_harmonic $k $g $m
run 2000
diff --git a/examples/USER/atc/elastic/no_atoms.screen b/examples/USER/atc/elastic/no_atoms.screen
index ccb287b36..77c41b1b6 100644
--- a/examples/USER/atc/elastic/no_atoms.screen
+++ b/examples/USER/atc/elastic/no_atoms.screen
@@ -1,74 +1,75 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Lattice spacing in x,y,z = 5.25623 5.25623 5.25623
Created orthogonal box = (0 0 0) to (525.623 52.5623 52.5623)
4 by 1 by 1 MPI processor grid
ATC: constructing elastic coupling with parameter file Ar_elastic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 1.10041
ATC: computed mass density : 1.10041
ATC: computed mass density : 1.10041
ATC: 3 materials defined from Ar_elastic.mat
ATC: created uniform mesh with 104 nodes, 26 unique nodes, and 25 elements
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc1 with 1 nodes
ATC: created nodeset rbc2 with 1 nodes
ATC: created nodeset rbc3 with 1 nodes
ATC: created nodeset rbc4 with 1 nodes
ATC: created nodeset rbc5 with 1 nodes
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
Memory usage per processor = 0.432442 Mbytes
Step CPU
0 0
- 100 0.28801608
- 200 0.60494804
- 300 1.9659522
- 400 5.8900452
- 500 8.2498631
- 600 8.6479681
- 700 10.04323
- 800 10.456577
- 900 10.742816
- 1000 11.104007
- 1100 11.349205
- 1200 11.689583
- 1300 11.902604
- 1400 12.098199
- 1500 12.934268
- 1600 19.349941
- 1700 22.496211
- 1800 23.167077
- 1900 24.027154
- 2000 24.235364
- 2100 24.432181
- 2200 24.628729
- 2300 25.034703
- 2400 28.890065
- 2500 31.916798
- 2600 33.219873
- 2700 34.139887
- 2800 34.52512
- 2900 34.766055
- 3000 35.032684
-Loop time of 35.0327 on 4 procs for 3000 steps with 0 atoms
+ 100 0.19585419
+ 200 0.39086509
+ 300 0.59599113
+ 400 0.82120609
+ 500 1.0167482
+ 600 1.213465
+ 700 1.4120791
+ 800 1.607903
+ 900 1.8032651
+ 1000 1.9999621
+ 1100 2.19662
+ 1200 2.392972
+ 1300 2.587976
+ 1400 2.7825871
+ 1500 2.977757
+ 1600 3.1720822
+ 1700 3.3665402
+ 1800 3.561393
+ 1900 3.75788
+ 2000 3.9529102
+ 2100 4.1480532
+ 2200 4.3415971
+ 2300 4.5353642
+ 2400 4.729471
+ 2500 4.9241312
+ 2600 5.118058
+ 2700 5.313123
+ 2800 5.506644
+ 2900 5.7003391
+ 3000 5.894887
+Loop time of 5.89491 on 4 procs for 3000 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0106689 (0.030454)
-Outpt time (%) = 0.0495699 (0.141496)
-Other time (%) = 34.9725 (99.828)
+Comm time (%) = 0.00215024 (0.0364762)
+Outpt time (%) = 0.0040859 (0.0693124)
+Other time (%) = 5.88867 (99.8942)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/no_atoms_cb.screen b/examples/USER/atc/elastic/no_atoms_cb.screen
index 2f81c0d72..92103269e 100644
--- a/examples/USER/atc/elastic/no_atoms_cb.screen
+++ b/examples/USER/atc/elastic/no_atoms_cb.screen
@@ -1,77 +1,78 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Lattice spacing in x,y,z = 5.25623 5.25623 5.25623
Created orthogonal box = (0 0 0) to (525.623 52.5623 52.5623)
4 by 1 by 1 MPI processor grid
ATC: constructing elastic coupling with parameter file Ar_CauchyBorn.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
- ATC: computed mass density : 1.10041
- ATC: 1 materials defined from Ar_CauchyBorn.mat
using face quad!
using face quad!
using face quad!
+ ATC: computed mass density : 1.10041
+ ATC: 1 materials defined from Ar_CauchyBorn.mat
ATC: created uniform mesh with 104 nodes, 26 unique nodes, and 25 elements
using face quad!
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc1 with 1 nodes
ATC: created nodeset rbc2 with 1 nodes
ATC: created nodeset rbc3 with 1 nodes
ATC: created nodeset rbc4 with 1 nodes
ATC: created nodeset rbc5 with 1 nodes
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: CB stiffness: 7.56711 Einstein freq: 0.355647
Memory usage per processor = 0.432442 Mbytes
Step CPU
0 0
- 100 5.373224
- 200 13.156875
- 300 17.393315
- 400 23.759932
- 500 28.611823
- 600 36.396029
- 700 40.553676
- 800 47.000228
- 900 51.579739
- 1000 57.538064
- 1100 64.053463
- 1200 71.077067
- 1300 76.430127
- 1400 84.956777
- 1500 88.559395
- 1600 90.649106
- 1700 93.449754
- 1800 95.849976
- 1900 98.488277
- 2000 100.78877
- 2100 102.80799
- 2200 104.88818
- 2300 106.89208
- 2400 108.89542
- 2500 110.89934
- 2600 114.3289
- 2700 116.6514
- 2800 118.66646
- 2900 120.66124
- 3000 122.65321
-Loop time of 122.653 on 4 procs for 3000 steps with 0 atoms
+ 100 2.1487799
+ 200 4.1481848
+ 300 7.412642
+ 400 9.6907878
+ 500 11.643677
+ 600 13.599353
+ 700 15.55519
+ 800 17.510581
+ 900 19.459496
+ 1000 21.414392
+ 1100 23.370743
+ 1200 26.28022
+ 1300 28.605597
+ 1400 30.586462
+ 1500 32.5365
+ 1600 34.481518
+ 1700 36.419934
+ 1800 38.358634
+ 1900 40.29752
+ 2000 42.238558
+ 2100 45.087001
+ 2200 47.32252
+ 2300 49.377443
+ 2400 51.324046
+ 2500 53.267819
+ 2600 55.21533
+ 2700 57.160197
+ 2800 59.10475
+ 2900 61.047967
+ 3000 62.992302
+Loop time of 62.9923 on 4 procs for 3000 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0159223 (0.0129816)
-Outpt time (%) = 0.0753418 (0.0614267)
-Other time (%) = 122.562 (99.9256)
+Comm time (%) = 0.0045175 (0.0071715)
+Outpt time (%) = 0.016863 (0.0267699)
+Other time (%) = 62.9709 (99.9661)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/elastic/no_atoms_cb_linear.screen b/examples/USER/atc/elastic/no_atoms_cb_linear.screen
index f69dff025..582b8dafd 100644
--- a/examples/USER/atc/elastic/no_atoms_cb_linear.screen
+++ b/examples/USER/atc/elastic/no_atoms_cb_linear.screen
@@ -1,78 +1,79 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Lattice spacing in x,y,z = 5.25623 5.25623 5.25623
Created orthogonal box = (0 0 0) to (525.623 52.5623 52.5623)
4 by 1 by 1 MPI processor grid
ATC: constructing elastic coupling with parameter file Ar_CauchyBornLinear.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 1.10041
ATC: 1 materials defined from Ar_CauchyBornLinear.mat
ATC: created uniform mesh with 104 nodes, 26 unique nodes, and 25 elements
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc1 with 1 nodes
ATC: created nodeset rbc2 with 1 nodes
ATC: created nodeset rbc3 with 1 nodes
ATC: created nodeset rbc4 with 1 nodes
ATC: created nodeset rbc5 with 1 nodes
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: created cubic stress function:
lammps ATC units
c11=0.623221 0.000260756
c12=0.355572 0.000148771
c44=0.355572 0.000148771
ATC: CB stiffness: 7.56711 Einstein freq: 0.355647
Memory usage per processor = 0.432442 Mbytes
Step CPU
0 0
- 100 5.2610211
- 200 8.207129
- 300 8.399112
- 400 8.590606
- 500 8.7906051
- 600 8.9944639
- 700 9.2591641
- 800 9.4823501
- 900 9.9786441
- 1000 10.218563
- 1100 10.442493
- 1200 10.63588
- 1300 12.651145
- 1400 17.621
- 1500 21.060829
- 1600 21.253883
- 1700 21.44572
- 1800 24.531154
- 1900 25.631172
- 2000 26.061068
- 2100 27.272422
- 2200 27.740018
- 2300 28.139088
- 2400 28.539013
- 2500 30.439943
- 2600 30.839081
- 2700 31.207394
- 2800 31.400084
- 2900 31.592798
- 3000 31.78627
-Loop time of 31.7863 on 4 procs for 3000 steps with 0 atoms
+ 100 0.24008894
+ 200 0.43171406
+ 300 0.62260008
+ 400 0.82456493
+ 500 1.0165939
+ 600 1.2080688
+ 700 1.3988841
+ 800 1.5905089
+ 900 1.795099
+ 1000 2.6819959
+ 1100 3.2110519
+ 1200 3.402272
+ 1300 3.593389
+ 1400 3.784076
+ 1500 3.975776
+ 1600 4.1671901
+ 1700 4.3586659
+ 1800 4.5500119
+ 1900 4.740973
+ 2000 4.9328279
+ 2100 5.29406
+ 2200 5.761905
+ 2300 5.9892371
+ 2400 6.1819849
+ 2500 6.3752038
+ 2600 6.567533
+ 2700 6.7595909
+ 2800 6.951714
+ 2900 7.1433411
+ 3000 7.3404701
+Loop time of 7.34049 on 4 procs for 3000 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0208905 (0.0657218)
-Outpt time (%) = 0.0490193 (0.154215)
-Other time (%) = 31.7164 (99.7801)
+Comm time (%) = 0.0020436 (0.0278402)
+Outpt time (%) = 0.0107203 (0.146043)
+Other time (%) = 7.32772 (99.8261)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/fluids/bar1d_fluids.screen b/examples/USER/atc/fluids/bar1d_fluids.screen
index 9f8ceb762..7c34d0573 100644
--- a/examples/USER/atc/fluids/bar1d_fluids.screen
+++ b/examples/USER/atc/fluids/bar1d_fluids.screen
@@ -1,164 +1,263 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Reading data file ...
orthogonal box = (-37.835 -16.215 -16.215) to (37.835 16.215 16.215)
4 by 1 by 1 MPI processor grid
1288 atoms
1288 velocities
Lattice spacing in x,y,z = 5.405 5.405 5.405
1000 atoms in group internal
288 atoms in group ghost
Lattice spacing in x,y,z = 5.405 5.405 5.405
ATC: constructing thermal coupling with parameter file Ar_thermal.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 1 materials defined from Ar_thermal.mat
ATC: created uniform mesh with 28 nodes, 7 unique nodes, and 6 elements
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc with 1 nodes
Setting up run ...
-Memory usage per processor = 49.3207 Mbytes
+Memory usage per processor = 18.9868 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -994.32071 -1292.1036 1073.0916 99.9 100
- 200 1 -1039.357 -1337.438 1073.0916 100 100
- 400 1.9 -1063.9771 -1362.0581 1073.0916 100 100
- 600 2.9 -1077.6783 -1375.7593 1073.0916 100 100
- 800 3.8 -1088.068 -1386.149 1073.0916 100 100
- 1000 5.8 -1087.7336 -1385.8146 1073.0916 100 100
- 1200 6.7 -1093.3541 -1391.4351 1073.0916 100 100
- 1400 8 -1092.143 -1390.224 1073.0916 100 100
- 1600 8.9 -1092.6395 -1390.7205 1073.0916 100 100
- 1800 9.9 -1098.4744 -1396.5554 1073.0916 100 100
- 2000 11 -1096.3326 -1394.4136 1073.0916 100 100
-Loop time of 10.7926 on 4 procs for 2000 steps with 1288 atoms
-
-Pair time (%) = 4.54746 (42.1348)
-Neigh time (%) = 1.91457 (17.7396)
-Comm time (%) = 1.38715 (12.8527)
-Outpt time (%) = 0.00288278 (0.0267106)
-Other time (%) = 2.94058 (27.2462)
-
-Nlocal: 322 ave 349 max 294 min
-Histogram: 2 0 0 0 0 0 0 0 0 2
-Nghost: 3306 ave 4004 max 2612 min
-Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 59447.5 ave 61515 max 57250 min
+ 200 1.1 -1039.0541 -1337.1351 1073.0916 100 100
+ 400 2.9 -1063.5946 -1361.6756 1073.0916 100 100
+ 600 3.8 -1074.9626 -1373.0436 1073.0916 100 100
+ 800 4.8 -1081.7626 -1379.8436 1073.0916 100 100
+ 1000 5.8 -1078.0299 -1376.1109 1073.0916 100 100
+ 1200 6.6 -1084.8934 -1382.9744 1073.0916 100 100
+ 1400 7.3 -1082.8007 -1380.8817 1073.0916 100 100
+ 1600 8.1 -1091.2229 -1389.3039 1073.0916 100 100
+ 1800 8.9 -1089.9946 -1388.0756 1073.0916 100 100
+ 2000 9.6 -1090.382 -1388.463 1073.0916 100 100
+Loop time of 9.6297 on 4 procs for 2000 steps with 1288 atoms
+
+Pair time (%) = 4.33154 (44.981)
+Neigh time (%) = 1.95523 (20.3041)
+Comm time (%) = 1.60375 (16.6542)
+Outpt time (%) = 0.00281453 (0.0292276)
+Other time (%) = 1.73637 (18.0314)
+
+Nlocal: 322 ave 348 max 291 min
+Histogram: 1 0 1 0 0 0 0 0 0 2
+Nghost: 3287.5 ave 4022 max 2578 min
Histogram: 2 0 0 0 0 0 0 0 0 2
-FullNghs: 118895 ave 123082 max 114432 min
-Histogram: 1 1 0 0 0 0 0 0 0 2
+Neighs: 59795.5 ave 61368 max 56848 min
+Histogram: 1 0 0 0 0 0 0 1 1 1
+FullNghs: 119591 ave 122807 max 113769 min
+Histogram: 1 0 0 0 0 0 0 1 1 1
-Total # of neighbors = 475580
-Ave neighs/atom = 369.239
+Total # of neighbors = 478364
+Ave neighs/atom = 371.401
Neighbor list builds = 200
Dangerous builds = 0
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
-Memory usage per processor = 56.0218 Mbytes
+Memory usage per processor = 25.6115 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
- 0 0 -1096.3326 -1394.4136 1073.0916 100 100
- 100 0.53 -1097.1297 -1393.4516 1075.1972 99.409862 100.23926
- 200 1 -1096.0757 -1399.305 1075.4399 101.72715 100.33007
- 300 1.6 -1092.2745 -1395.827 1078.6046 101.83557 100.65429
- 400 2.1 -1090.7478 -1387.1617 1078.4832 99.440713 100.71601
- 500 2.6 -1094.2309 -1405.4917 1082.77 104.42152 101.12986
- 600 3.1 -1092.5375 -1398.2596 1088.0437 102.56341 101.62253
- 700 3.7 -1092.1714 -1403.4837 1093.2974 104.43883 102.1136
- 800 4.2 -1088.0883 -1402.5474 1099.5467 105.4945 102.6842
- 900 4.7 -1096.5611 -1407.2614 1106.6337 104.2335 103.32171
- 1000 5.2 -1096.0664 -1410.5711 1107.5876 105.50984 103.46933
- 1100 5.7 -1093.3795 -1398.4056 1109.412 102.32995 103.68648
- 1200 6.9 -1094.9691 -1405.2381 1110.9358 104.08883 103.87963
- 1300 8.4 -1099.21 -1406.5076 1109.7276 103.09197 103.85455
- 1400 9.5 -1096.4599 -1409.163 1112.0859 104.9054 104.11435
- 1500 15 -1093.8693 -1402.2613 1115.3316 103.45912 104.44504
- 1600 16 -1099.7654 -1418.4301 1116.8226 106.90538 104.63556
- 1700 22 -1096.8766 -1410.0213 1122.0201 105.05356 105.12214
- 1800 26 -1097.6888 -1415.4839 1123.5055 106.61369 105.31222
- 1900 29 -1091.0457 -1407.4814 1127.847 106.15762 105.73043
- 2000 29 -1087.88 -1410.9303 1132.576 108.3767 106.17959
-Loop time of 29.4659 on 4 procs for 2000 steps with 1288 atoms
-
-Pair time (%) = 5.39338 (18.3038)
-Neigh time (%) = 2.56404 (8.7017)
-Comm time (%) = 6.58258 (22.3396)
-Outpt time (%) = 0.115528 (0.392073)
-Other time (%) = 14.8104 (50.2628)
-
-Nlocal: 322 ave 357 max 288 min
-Histogram: 1 1 0 0 0 0 0 0 1 1
-Nghost: 3290.75 ave 4029 max 2581 min
+ 0 0 -1090.382 -1388.463 1073.0916 100 100
+ 100 0.44 -1087.5927 -1390.2846 1075.454 101.54684 100.25977
+ 200 0.88 -1081.8609 -1380.2432 1075.0766 100.10105 100.30105
+ 300 1.3 -1076.5286 -1384.5736 1077.5462 103.3427 100.56974
+ 400 1.8 -1078.3503 -1388.7033 1083.8991 104.11699 101.14862
+ 500 2.2 -1074.2004 -1390.3057 1091.383 106.04678 101.81783
+ 600 2.7 -1072.5105 -1390.2059 1098.5161 106.58021 102.45902
+ 700 3.1 -1065.5654 -1373.1988 1105.2316 103.20464 103.06686
+ 800 3.6 -1062.4651 -1386.6034 1110.624 108.74168 103.56901
+ 900 4 -1054.767 -1378.04 1119.5121 108.45141 104.35038
+ 1000 4.5 -1048.6471 -1376.1878 1129.6369 109.88311 105.23054
+ 1100 4.9 -1049.0911 -1378.9232 1137.6524 110.65183 105.94222
+ 1200 5.3 -1048.3472 -1381.7201 1147.7652 111.83972 106.82141
+ 1300 5.8 -1051.0343 -1380.5791 1156.3021 110.55547 107.57474
+ 1400 6.2 -1047.5028 -1377.2009 1162.231 110.60686 108.11974
+ 1500 6.7 -1049.3227 -1379.9459 1168.2617 110.91724 108.67288
+ 1600 7.1 -1044.2411 -1376.4008 1172.3108 111.43272 109.06773
+ 1700 7.6 -1041.3107 -1376.9092 1178.0968 112.58635 109.60132
+ 1800 8.1 -1041.7106 -1387.1043 1185.6231 115.87242 110.27393
+ 1900 8.5 -1032.7907 -1374.3649 1193.8935 114.59107 111.00596
+ 2000 9 -1026.8551 -1378.0117 1201.8627 117.80577 111.71394
+Loop time of 8.97422 on 4 procs for 2000 steps with 1288 atoms
+
+Pair time (%) = 4.15928 (46.347)
+Neigh time (%) = 1.84721 (20.5836)
+Comm time (%) = 0.584319 (6.51108)
+Outpt time (%) = 0.0101258 (0.112832)
+Other time (%) = 2.37328 (26.4455)
+
+Nlocal: 322 ave 342 max 299 min
+Histogram: 1 0 1 0 0 0 0 0 0 2
+Nghost: 3298.25 ave 4012 max 2561 min
Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 59412.5 ave 63932 max 55464 min
-Histogram: 1 0 1 0 0 0 1 0 0 1
-FullNghs: 118825 ave 127926 max 110803 min
-Histogram: 1 0 1 0 0 0 1 0 0 1
+Neighs: 59867 ave 62381 max 58653 min
+Histogram: 2 0 1 0 0 0 0 0 0 1
+FullNghs: 119734 ave 124715 max 117251 min
+Histogram: 1 1 1 0 0 0 0 0 0 1
-Total # of neighbors = 475300
-Ave neighs/atom = 369.022
+Total # of neighbors = 478936
+Ave neighs/atom = 371.845
Neighbor list builds = 200
Dangerous builds = 0
Setting up run ...
-Memory usage per processor = 56.0218 Mbytes
+Memory usage per processor = 25.6115 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
- 2000 0 -1087.88 -1410.9303 1132.576 108.3767 106.17959
- 2100 7.9 -1091.2838 -1411.7447 1136.7596 107.50799 106.51412
- 2200 9.3 -1087.4168 -1410.7195 1140.19 108.46135 106.78813
- 2300 10 -1083.8716 -1416.0271 1148.7049 111.43128 107.46826
- 2400 19 -1091.2629 -1419.2548 1154.945 110.0345 107.9667
- 2500 21 -1085.6579 -1412.5054 1159.6405 109.65056 108.34175
- 2600 22 -1087.4854 -1415.3304 1163.337 109.98522 108.63701
- 2700 23 -1085.9108 -1418.0071 1166.5382 111.4114 108.89271
- 2800 24 -1086.1867 -1409.9525 1170.0101 108.61673 109.17004
- 2900 26 -1087.6424 -1414.342 1170.7793 109.60095 109.23147
- 3000 28 -1086.4899 -1406.3424 1168.9883 107.30389 109.08841
- 3100 33 -1088.2206 -1415.602 1168.5555 109.82968 109.05384
- 3200 34 -1088.1639 -1405.8117 1167.0205 106.56424 108.93124
- 3300 35 -1092.1189 -1412.2062 1164.7511 107.38266 108.74997
- 3400 43 -1089.7001 -1409.1671 1163.2716 107.17456 108.63179
- 3500 45 -1096.5551 -1411.0879 1159.1282 105.51925 108.30083
- 3600 45 -1094.65 -1413.2194 1154.2549 106.87345 107.91157
- 3700 46 -1096.9933 -1406.3656 1150.9523 103.788 107.64778
- 3800 47 -1091.9401 -1404.356 1147.2503 104.80904 107.35207
- 3900 47 -1087.998 -1407.1701 1146.0989 107.07564 107.2601
- 4000 50 -1095.8818 -1411.8326 1144.6278 105.99494 107.1426
- 4100 54 -1097.5819 -1412.4007 1144.1232 105.61516 107.10229
- 4200 56 -1098.6452 -1408.5634 1143.4876 103.97114 107.05152
- 4300 57 -1092.6405 -1406.6538 1140.8735 105.34494 106.84272
- 4400 58 -1093.7564 -1406.7458 1139.2442 105.00146 106.71258
- 4500 58 -1095.6025 -1411.6037 1139.2304 106.01182 106.71148
- 4600 60 -1104.0547 -1417.3245 1140.0447 105.09552 106.77652
- 4700 69 -1099.1767 -1415.132 1138.1578 105.99644 106.6258
- 4800 70 -1104.7266 -1421.7194 1137.6765 106.34453 106.58735
- 4900 71 -1099.3521 -1416.1386 1139.6396 106.27528 106.74416
- 5000 73 -1102.0311 -1422.1342 1140.1617 107.38796 106.78586
- 5100 75 -1099.9553 -1423.0918 1142.2784 108.4056 106.95494
- 5200 80 -1097.3863 -1421.3598 1145.6828 108.68639 107.22687
- 5300 81 -1094.5474 -1415.4736 1148.3123 107.6641 107.4369
- 5400 82 -1101.9624 -1416.5216 1148.1412 105.52807 107.42323
- 5500 83 -1099.6507 -1418.3752 1146.1342 106.92544 107.26292
- 5600 91 -1085.351 -1412.4144 1149.2494 109.72299 107.51175
- 5700 92 -1089.1937 -1408.3714 1151.8951 107.0775 107.72308
- 5800 92 -1098.7444 -1422.1218 1152.7943 108.48641 107.7949
- 5900 94 -1089.3746 -1412.4578 1153.8446 108.3877 107.8788
- 6000 1e+02 -1095.5262 -1420.9521 1156.6272 109.17363 108.10106
-Loop time of 103.93 on 4 procs for 4000 steps with 1288 atoms
-
-Pair time (%) = 12.9055 (12.4175)
-Neigh time (%) = 6.4635 (6.21906)
-Comm time (%) = 23.7367 (22.839)
-Outpt time (%) = 0.16248 (0.156335)
-Other time (%) = 60.6623 (58.3681)
-
-Nlocal: 322 ave 379 max 280 min
-Histogram: 1 1 0 0 0 1 0 0 0 1
-Nghost: 3294 ave 4103 max 2559 min
-Histogram: 2 0 0 0 0 0 0 0 1 1
-Neighs: 59569 ave 71977 max 55076 min
-Histogram: 3 0 0 0 0 0 0 0 0 1
-FullNghs: 119138 ave 143935 max 110133 min
-Histogram: 3 0 0 0 0 0 0 0 0 1
-
-Total # of neighbors = 476552
-Ave neighs/atom = 369.994
-Neighbor list builds = 400
-Dangerous builds = 0
+ 2000 0 -1026.8551 -1378.0117 1201.8627 117.80577 111.71394
+ ATC: P1, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 3.6116e-11
+
+ ATC: P2, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 3.6116e-11
+
+ ATC: P3, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 3.6116e-11
+
+ ATC: P0, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 3.6116e-11
+
+ ATC: P3, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.71428e-06
+
+ ATC: P1, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.71428e-06
+
+ ATC: P2, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.71428e-06
+
+ ATC: P0, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.71428e-06
+
+ ATC: P2, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.71428e-06
+
+ ATC: P3, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.71428e-06
+
+ ATC: P1, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.71428e-06
+
+ ATC: P0, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.71428e-06
+
+ ATC: P1, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 9.10053e-14
+
+ ATC: P2, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 9.10053e-14
+
+ ATC: P3, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 9.10053e-14
+
+ ATC: P0, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 9.10053e-14
+
+ ATC: P3, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.59202e-07
+
+ ATC: P1, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.59202e-07
+
+ ATC: P2, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.59202e-07
+
+ ATC: P0, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 1.59202e-07
+
+ ATC: P2, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 0.0532513
+
+ ATC: P3, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 0.0532513
+
+ ATC: P1, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 0.0532513
+
+ ATC: P0, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 0.0532513
+
+ ATC: P1, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 2.79083
+
+ ATC: P2, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 2.79083
+
+ ATC: P3, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 2.79083
+
+ ATC: P0, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 2.79083
+
+ ATC: P3, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 2.79083
+
+ ATC: P1, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 2.79083
+
+ ATC: P2, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 2.79083
+
+ ATC: P0, Iterative solve for lambda failed to converge after 50 iterations, final tolerance was 2.79083
+
+terminate called after throwing an instance of 'ATC::ATC_Error'
+terminate called after throwing an instance of 'ATC::ATC_Error'
+terminate called after throwing an instance of 'terminate called after throwing an instance of 'ATC::ATC_Error'
+ ATC: P2, ERROR: CG solve did not converge, iterations: 4 residual: -nan
+ ATC: P3, ERROR: CG solve did not converge, iterations: 4 residual: -nan
+ ATC: P1, ERROR: CG solve did not converge, iterations: 4 residual: -nan
+ ATC: P0, ERROR: CG solve did not converge, iterations: 4 residual: -nan
+[pharsalus:45802] *** Process received signal ***
+[pharsalus:45802] Signal: Aborted (6)
+[pharsalus:45802] Signal code: (-6)
+[pharsalus:45804] *** Process received signal ***
+[pharsalus:45804] Signal: Aborted (6)
+[pharsalus:45804] Signal code: (-6)
+[pharsalus:45803] *** Process received signal ***
+[pharsalus:45803] Signal: Aborted (6)
+[pharsalus:45803] Signal code: (-6)
+ATC::ATC_Error'
+[pharsalus:45805] *** Process received signal ***
+[pharsalus:45805] Signal: Aborted (6)
+[pharsalus:45805] Signal code: (-6)
+[pharsalus:45802] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:45804] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:45804] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:45804] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:45804] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:45804] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:45804] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:45804] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:45804] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC15final_integrateEv+0x8b) [0x68dbbb]
+[pharsalus:45804] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Modify15final_integrateEv+0x46) [0x7c4ed6]
+[pharsalus:45804] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Verlet3runEi+0x280) [0xa53c40]
+[pharsalus:45804] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Run7commandEiPPc+0x296) [0xa22c16]
+[pharsalus:45804] [11] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15command_creatorINS_3RunEEEvPNS_6LAMMPSEiPPc+0x33) [0x798a23]
+[pharsalus:45804] [12] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0x7a7) [0x7964e7]
+[pharsalus:45804] [13] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:45804] [14] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:45804] [15] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:45804] [16] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:45804] *** End of error message ***
+[pharsalus:45803] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:45803] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:45803] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:45803] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:45803] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:45803] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:45803] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:45803] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC15final_integrateEv+0x8b) [0x68dbbb]
+[pharsalus:45803] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Modify15final_integrateEv+0x46) [0x7c4ed6]
+[pharsalus:45803] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Verlet3runEi+0x280) [0xa53c40]
+[pharsalus:45803] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Run7commandEiPPc+0x296) [0xa22c16]
+[pharsalus:45803] [11] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15command_creatorINS_3RunEEEvPNS_6LAMMPSEiPPc+0x33) [0x798a23]
+[pharsalus:45803] [12] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0x7a7) [0x7964e7]
+[pharsalus:45803] [13] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:45803] [14] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:45803] [15] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:45803] [16] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:45803] *** End of error message ***
+[pharsalus:45802] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:45802] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:45805] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:45805] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:45805] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:45802] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:45805] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:45805] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:45805] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:45805] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:45805] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC15final_integrateEv+0x8b) [0x68dbbb]
+[pharsalus:45805] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Modify15final_integrateEv+0x46) [0x7c4ed6]
+[pharsalus:45805] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Verlet3runEi+0x280) [0xa53c40]
+[pharsalus:45805] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Run7commandEiPPc+0x296) [0xa22c16]
+[pharsalus:45805] [11] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15command_creatorINS_3RunEEEvPNS_6LAMMPSEiPPc+0x33) [0x798a23]
+[pharsalus:45805] [12] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0x7a7) [0x7964e7]
+[pharsalus:45805] [13] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:45805] [14] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:45805] [15] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:45805] [16] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:45805] *** End of error message ***
+[pharsalus:45802] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:45802] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:45802] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:45802] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC15final_integrateEv+0x8b) [0x68dbbb]
+[pharsalus:45802] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Modify15final_integrateEv+0x46) [0x7c4ed6]
+[pharsalus:45802] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS6Verlet3runEi+0x280) [0xa53c40]
+[pharsalus:45802] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Run7commandEiPPc+0x296) [0xa22c16]
+[pharsalus:45802] [11] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15command_creatorINS_3RunEEEvPNS_6LAMMPSEiPPc+0x33) [0x798a23]
+[pharsalus:45802] [12] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0x7a7) [0x7964e7]
+[pharsalus:45802] [13] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:45802] [14] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:45802] [15] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:45802] [16] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:45802] *** End of error message ***
+--------------------------------------------------------------------------
+mpirun noticed that process rank 1 with PID 45803 on node pharsalus exited on signal 6 (Aborted).
+--------------------------------------------------------------------------
diff --git a/examples/USER/atc/fluids/concentration.screen b/examples/USER/atc/fluids/concentration.screen
index 800cd0a1d..bec86cfd1 100644
--- a/examples/USER/atc/fluids/concentration.screen
+++ b/examples/USER/atc/fluids/concentration.screen
@@ -1,161 +1,169 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style full # charge
### NOTE p p p is required for both lammps & atc since periodic images are employed in ExtrinsicModelElectrostatic::correct_electrostatic_forces
########### BEGIN PARAMETERS ####################################
variable T equal 300
variable a equal 1.0 # 5.719025032
variable i equal 10 # thermo
variable f equal 50 # neighbor & conc interval
variable s equal 100 # 10 # 100 # output
variable n equal 800 # 20 # 200 # 300 # duration
variable x equal 4 # 40 # 2 # 4 # exchanges
variable e equal 100. # 1. # 100. # 10. # energy
variable h equal 5 # nelems
variable dt equal 4. #1. # 0 # 4.0
############## END PARAMETERS #################################
dimension 3
boundary p p p
pair_style lj/cut/coul/cut 13.0
lattice sc $a
lattice sc 1
Lattice spacing in x,y,z = 1 1 1
read_data concentration_init.data
Scanning data file ...
Reading data file ...
orthogonal box = (0 0 0) to (114.381 22.8761 22.8761)
4 by 1 by 1 MPI processor grid
544 atoms
544 velocities
Finding 1-2 1-3 1-4 neighbors ...
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
atom_modify sort 0 1
mass * 39.948
pair_coeff * * 0.2381 3.405
pair_coeff 1 * 0.4 3.405
dielectric 80.0
variable xlo equal xlo
variable xhi equal xhi
variable xmid equal 0.5*(${xhi}+${xlo})
variable xmid equal 0.5*(114.38050064000000816+${xlo})
variable xmid equal 0.5*(114.38050064000000816+0)
print "reservior x ${xmid}:${xhi}"
reservior x 57.190250320000004081:114.38050064000000816
variable ylo equal ylo
variable yhi equal yhi
variable zlo equal zlo
variable zhi equal zhi
region BOX block ${xlo} ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} units box
region BOX block 0 ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} units box
region BOX block 0 114.38050064000000816 ${ylo} ${yhi} ${zlo} ${zhi} units box
region BOX block 0 114.38050064000000816 0 ${yhi} ${zlo} ${zhi} units box
region BOX block 0 114.38050064000000816 0 22.876100128000000922 ${zlo} ${zhi} units box
region BOX block 0 114.38050064000000816 0 22.876100128000000922 0 ${zhi} units box
region BOX block 0 114.38050064000000816 0 22.876100128000000922 0 22.876100128000000922 units box
region FLUID block ${xlo} ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} units box
region FLUID block 0 ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} units box
region FLUID block 0 114.38050064000000816 ${ylo} ${yhi} ${zlo} ${zhi} units box
region FLUID block 0 114.38050064000000816 0 ${yhi} ${zlo} ${zhi} units box
region FLUID block 0 114.38050064000000816 0 22.876100128000000922 ${zlo} ${zhi} units box
region FLUID block 0 114.38050064000000816 0 22.876100128000000922 0 ${zhi} units box
region FLUID block 0 114.38050064000000816 0 22.876100128000000922 0 22.876100128000000922 units box
region R block ${xmid} ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} units box
region R block 57.190250320000004081 ${xhi} ${ylo} ${yhi} ${zlo} ${zhi} units box
region R block 57.190250320000004081 114.38050064000000816 ${ylo} ${yhi} ${zlo} ${zhi} units box
region R block 57.190250320000004081 114.38050064000000816 0 ${yhi} ${zlo} ${zhi} units box
region R block 57.190250320000004081 114.38050064000000816 0 22.876100128000000922 ${zlo} ${zhi} units box
region R block 57.190250320000004081 114.38050064000000816 0 22.876100128000000922 0 ${zhi} units box
region R block 57.190250320000004081 114.38050064000000816 0 22.876100128000000922 0 22.876100128000000922 units box
group SOLID type 1
288 atoms in group SOLID
variable xdof equal 3*count(SOLID)
compute_modify thermo_temp extra ${xdof}
compute_modify thermo_temp extra 864
#set group SOLID charge 0
group NEUTRAL type 2
114 atoms in group NEUTRAL
group FLUID type 2 3 4
256 atoms in group FLUID
group NION type 3
66 atoms in group NION
group PION type 4
76 atoms in group PION
#group tPION type 5 # not dynamic
#group tNION type 6 # not dynamic
#variable typeP atom type[]==5
set group PION charge 1
Setting atom values ...
76 settings made for charge
set group NION charge -1
Setting atom values ...
66 settings made for charge
variable O equal count(NEUTRAL)
variable S equal count(SOLID)
variable F equal count(FLUID)
variable P equal count(PION)
variable N equal count(NION)
variable Pr equal count(PION,R)
variable Nr equal count(NION,R)
#variable tP equal count(tPION)
#variable tN equal count(tNION)
variable V equal vol
variable cO equal v_O/v_V
variable cS equal v_S/v_V
variable cN equal v_N/v_V
variable cP equal v_P/v_V
compute q all property/atom q
compute m all property/atom mass
compute Q all reduce sum c_q
compute M all reduce sum c_m
compute Qf FLUID reduce sum c_q
compute Mf FLUID reduce sum c_m
compute PMIN PION reduce min x
compute PMAX PION reduce max x
compute NMIN NION reduce min x
compute NMAX NION reduce max x
timestep ${dt}
timestep 4
#neighbor 13 bin
neigh_modify every $i check no
neigh_modify every 10 check no
# coulombic interactions
fix ATC FLUID atc species_electrostatic Ar_electrostatic.mat
ATC: constructing electrostatic species coupling with parameter file Ar_electrostatic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 13
ATC: 1 materials defined from Ar_electrostatic.mat
ATC: creating fem_efield extrinsic model
ATC: 1 materials defined from Ar_electrostatic.mat
#fix_modify ATC parallel_consistency off
fix_modify ATC extrinsic short_range off
#fix_modify ATC boundary SOLID
fix_modify ATC atom_element_map eulerian $i
fix_modify ATC atom_element_map eulerian 10
fix_modify ATC internal_quadrature off
fix_modify ATC consistent_fe_initialization on
fix_modify ATC filter type exponential
fix_modify ATC filter scale $i
fix_modify ATC filter scale 10
fix_modify ATC filter equilibrate
# mesh
print "x = ${xlo}:${xhi}"
x = 0:114.38050064000000816
fix_modify ATC mesh create $h 1 1 BOX p p p # f p p ExtrinsicModelElectrostatic::correct_electrostatic_forces iterates through ghosts
fix_modify ATC mesh create 5 1 1 BOX p p p
ATC: created uniform mesh with 24 nodes, 5 unique nodes, and 5 elements
fix_modify ATC mesh create_nodeset LBC ${xlo} ${xlo} -INF INF -INF INF
fix_modify ATC mesh create_nodeset LBC 0 ${xlo} -INF INF -INF INF
fix_modify ATC mesh create_nodeset LBC 0 0 -INF INF -INF INF
ATC: created nodeset LBC with 1 nodes
fix_modify ATC mesh create_elementset FLUID FLUID
ATC: created elementset FLUID with 5 elements
fix_modify ATC mesh create_elementset R R
ATC: created elementset R with 2 elements
fix_modify ATC mesh create_elementset BOX BOX
ATC: created elementset BOX with 5 elements
## NOTE tag instead of type, what about transition tyme
fix_modify ATC mass_matrix fe
fix_modify ATC internal_element_set FLUID
+fix_modify ATC include atomic_charge
+fix_modify ATC add_species N type 3
+fix_modify ATC add_species P type 4
+fix_modify ATC add_species Nt type 5
+fix_modify ATC add_species Pt type 6
+## CC
+fix_modify ATC control concentration N R 0.001 Nt # deletions R
ERROR: Illegal fix_modify command (../fix.cpp:104)
diff --git a/examples/USER/atc/fluids/conducting_interface.screen b/examples/USER/atc/fluids/conducting_interface.screen
index 0ba180cdb..d250c6961 100644
--- a/examples/USER/atc/fluids/conducting_interface.screen
+++ b/examples/USER/atc/fluids/conducting_interface.screen
@@ -1,124 +1,184 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style full
########### BEGIN PARAMETERS ####################################
variable a equal 5.719025032
variable i equal 1
variable s equal 100
variable n equal 1000 # 500 2000
variable dt equal 4.0
variable W equal 4
variable L equal 20
variable Ls equal 4 # surface
variable h equal 10
variable phiInf equal -1. # 0. 10 -10.0
variable R equal 2*$a
variable R equal 2*5.7190250320000002304
############## END PARAMETERS #################################
dimension 3
boundary f p p
pair_style lj/cut 13.0
lattice fcc $a
lattice fcc 5.7190250320000002304
Lattice spacing in x,y,z = 5.71903 5.71903 5.71903
read_data interface_init.data
Scanning data file ...
Reading data file ...
orthogonal box = (0 0 0) to (114.381 22.8761 22.8761)
4 by 1 by 1 MPI processor grid
544 atoms
544 velocities
Finding 1-2 1-3 1-4 neighbors ...
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
atom_modify sort 0 1
mass * 39.948
pair_coeff * * 0.2381 3.405
dielectric 1.0
region BOX block 0 $L 0 $W 0 $W
region BOX block 0 20 0 $W 0 $W
region BOX block 0 20 0 4 0 $W
region BOX block 0 20 0 4 0 4
group SOLID type 1
288 atoms in group SOLID
group FLUID type 2 3 4
256 atoms in group FLUID
group P type 3
66 atoms in group P
group N type 4
76 atoms in group N
set group SOLID charge 0 # use ATC to provide charge to the surface
Setting atom values ...
288 settings made for charge
# charged layer -- NOTE on an element boundary
variable b equal ${Ls}-0.1
variable b equal 4-0.1
variable c equal ${Ls}+0.1
variable c equal 4+0.1
region LAYER block $b $c INF INF INF INF
region LAYER block 3.8999999999999999112 $c INF INF INF INF
region LAYER block 3.8999999999999999112 4.0999999999999996447 INF INF INF INF
group LAYER region LAYER
32 atoms in group LAYER
timestep ${dt}
timestep 4
neigh_modify every $i check no
neigh_modify every 1 check no
fix WALLS all wall/reflect xlo EDGE xhi EDGE
fix PP all atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify PP add_species IONS type 1 2 3 4
fix_modify PP fields add species_concentration mass_density charge_density # temperature
fix_modify PP output volume_integral all mass_density
fix_modify PP output volume_integral all charge_density
fix_modify PP atom_element_map eulerian $s
fix_modify PP atom_element_map eulerian 100
fix_modify PP mesh create $h 1 1 BOX f p p
fix_modify PP mesh create 10 1 1 BOX f p p
ATC: created uniform mesh with 44 nodes, 11 unique nodes, and 10 elements
fix ATC FLUID atc species_electrostatic Ar_electrostatic.mat
ATC: constructing electrostatic species coupling with parameter file Ar_electrostatic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 1 materials defined from Ar_electrostatic.mat
ATC: creating fem_efield extrinsic model
ATC: 1 materials defined from Ar_electrostatic.mat
fix_modify ATC add_species P type 3
fix_modify ATC add_species N type 4
fix_modify ATC boundary SOLID
#fix_modify ATC kernel cell $R $R $W
fix_modify ATC atom_element_map eulerian $i
fix_modify ATC atom_element_map eulerian 1
fix_modify ATC internal_quadrature off # on creates a nasty error (NOTE trap error)
fix_modify ATC mass_matrix fe
fix_modify ATC include atomic_charge
# mesh : 2x2 tosses an atom to infinity and beyond
#fix_modify ATC mesh create $h 4 1 BOX f p p dx piecewise_linear 0 0 0 1 0 0 0.0 1.0 1.0 1.0
#fix_modify ATC mesh create $h 1 1 BOX f p p dx piecewise_linear 0 0 0 1 0 0 # 0.0 1.0 0.2 1.0 0.207812 0.1 1.0 1.0
### >>> node h vs list reepat and scale to box
fix_modify ATC mesh create $h 4 1 BOX f p p dx 2 2 0.5 0.5 0.5 0.5 2 3 4 5
fix_modify ATC mesh create 10 4 1 BOX f p p dx 2 2 0.5 0.5 0.5 0.5 2 3 4 5
ATC: created structured mesh with 110 nodes, 44 unique nodes, and 40 elements
fix_modify ATC mesh create_nodeset lbc 0 0 -INF INF -INF INF
ATC: created nodeset lbc with 4 nodes
fix_modify ATC mesh create_nodeset rbc $L $L -INF INF -INF INF
fix_modify ATC mesh create_nodeset rbc 20 $L -INF INF -INF INF
fix_modify ATC mesh create_nodeset rbc 20 20 -INF INF -INF INF
ATC: created nodeset rbc with 4 nodes
fix_modify ATC mesh create_nodeset wall 0 ${Ls} 0 4 0 4
fix_modify ATC mesh create_nodeset wall 0 4 0 4 0 4
ATC: created nodeset wall with 12 nodes
fix_modify ATC mesh create_elementset wall 0 ${Ls} 0 4 0 4
fix_modify ATC mesh create_elementset wall 0 4 0 4 0 4
ATC: created elementset wall with 8 elements
#fix_modify ATC mesh create_faceset lbc plane x 0
fix_modify ATC mesh create_faceset surface -INF ${Ls} -INF INF -INF INF
fix_modify ATC mesh create_faceset surface -INF 4 -INF INF -INF INF
ATC: created faceset surface with 4 faces
fix_modify ATC mesh create_elementset fluidElts ${Ls} INF -INF INF -INF INF
fix_modify ATC mesh create_elementset fluidElts 4 INF -INF INF -INF INF
ATC: created elementset fluidElts with 32 elements
fix_modify ATC internal_element_set fluidElts
+fix_modify ATC mesh output conducting_interfaceMESH full_text binary
+fix_modify ATC output volume_integral fluidElts mass_density
+fix_modify ATC output volume_integral fluidElts charge_density
+# ic/bcs
+#fix_modify ATC initial charge_density all 0.
+fix_modify ATC initial mass_density all 0.
+fix_modify ATC initial electric_potential all 0.
+# output
+thermo $s
+thermo 100
+variable cFLUID equal count(FLUID)
+compute PAVE P reduce ave x
+compute PMIN P reduce min x
+compute PMAX P reduce max x
+compute NAVE N reduce ave x
+compute NMIN N reduce min x
+compute NMAX N reduce max x
+compute q all property/atom q
+compute Q all reduce sum c_q
+compute Qf FLUID reduce sum c_q
+compute m all property/atom mass
+compute M all reduce sum c_m
+compute Mf FLUID reduce sum c_m
+compute F FLUID reduce sum fx fy fz
+thermo_style custom step temp press etotal pe c_Q c_M c_Qf c_Mf c_PMIN c_PAVE c_PMAX c_NMIN c_NAVE c_NMAX c_F[1] c_F[2] c_F[3]
+compute T FLUID temp
+thermo_modify temp T
+WARNING: Temperature for thermo pressure is not for group all (../thermo.cpp:438)
+thermo_modify flush yes
+log conducting_interface.log
+fix_modify ATC output conducting_interfaceFE $s full_text binary
+fix_modify ATC output conducting_interfaceFE 100 full_text binary
+ ATC: Warning : text output can create _LARGE_ files
+ ATC: output custom names:
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationP
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationN
+species_concentration : species_concentrationP
+species_concentration : species_concentrationN
+
+fix_modify PP output conducting_interfacePP $s full_text binary
+fix_modify PP output conducting_interfacePP 100 full_text binary
+ ATC: Warning : text output can create _LARGE_ files
+ ATC: output custom names:
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationIONS_1
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationIONS_2
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationIONS_3
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationIONS_4
+species_concentration : species_concentrationIONS_1
+species_concentration : species_concentrationIONS_2
+species_concentration : species_concentrationIONS_3
+species_concentration : species_concentrationIONS_4
+
+dump X all custom $s conducting_interface.dmp id type x y z q vx vy vz fx fy fz
+dump X all custom 100 conducting_interface.dmp id type x y z q vx vy vz fx fy fz
+fix_modify ATC fix electric_potential rbc 0.
+# stage 1 : active source controlling far-field shielding
+fix_modify ATC control charge LAYER conductor ${phiInf}
+fix_modify ATC control charge LAYER conductor -1
ERROR: Illegal fix_modify command (../fix.cpp:104)
diff --git a/examples/USER/atc/fluids/dielectric_interface.screen b/examples/USER/atc/fluids/dielectric_interface.screen
index 30b1f734c..584013068 100644
--- a/examples/USER/atc/fluids/dielectric_interface.screen
+++ b/examples/USER/atc/fluids/dielectric_interface.screen
@@ -1,106 +1,184 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style full
########### BEGIN PARAMETERS ####################################
variable a equal 5.719025032
variable i equal 1
variable s equal 100
variable n equal 1000 # 500 2000
variable dt equal 4.0
variable W equal 4
variable L equal 20
variable Ls equal 4 # surface
variable h equal 10
variable phiInf equal -1. # 0. 10 -10.0
variable perm2 equal 2.
variable depth equal 17.1571
# 1 1 0.1 0.1 1 1
variable w1 equal 4/$L # relative wall width
variable w1 equal 4/20
variable w2 equal ${w1}+2/$L # relative wall width
variable w2 equal 0.2000000000000000111+2/$L
variable w2 equal 0.2000000000000000111+2/20
variable w3 equal ${w2}+2/$L
variable w3 equal 0.30000000000000004441+2/$L
variable w3 equal 0.30000000000000004441+2/20
variable w4 equal ${w3}+2/$L
variable w4 equal 0.4000000000000000222+2/$L
variable w4 equal 0.4000000000000000222+2/20
############## END PARAMETERS #################################
dimension 3
boundary f p p
pair_style lj/cut 13.0
lattice fcc $a
lattice fcc 5.7190250320000002304
Lattice spacing in x,y,z = 5.71903 5.71903 5.71903
read_data interface_init.data
Scanning data file ...
Reading data file ...
orthogonal box = (0 0 0) to (114.381 22.8761 22.8761)
4 by 1 by 1 MPI processor grid
544 atoms
544 velocities
Finding 1-2 1-3 1-4 neighbors ...
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
atom_modify sort 0 1
mass * 39.948
pair_coeff * * 0.2381 3.405
dielectric 1.0
region BOX block 0 $L 0 $W 0 $W
region BOX block 0 20 0 $W 0 $W
region BOX block 0 20 0 4 0 $W
region BOX block 0 20 0 4 0 4
group SOLID type 1
288 atoms in group SOLID
group FLUID type 2 3 4
256 atoms in group FLUID
group P type 3
66 atoms in group P
group N type 4
76 atoms in group N
set group SOLID charge 0 # use ATC to provide charge to the surface
Setting atom values ...
288 settings made for charge
timestep ${dt}
timestep 4
neigh_modify every $i check no
neigh_modify every 1 check no
fix WALLS all wall/reflect xlo EDGE xhi EDGE
fix PP all atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify PP add_species IONS type 1 2 3 4
fix_modify PP fields add species_concentration mass_density charge_density
fix_modify PP atom_element_map eulerian $s
fix_modify PP atom_element_map eulerian 100
fix_modify PP mesh create $h 1 1 BOX f p p
fix_modify PP mesh create 10 1 1 BOX f p p
ATC: created uniform mesh with 44 nodes, 11 unique nodes, and 10 elements
fix_modify PP output volume_integral all mass_density
fix_modify PP output volume_integral all charge_density
fix ATC FLUID atc species_electrostatic Ar_electrostatic.mat
ATC: constructing electrostatic species coupling with parameter file Ar_electrostatic.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 1 materials defined from Ar_electrostatic.mat
ATC: creating fem_efield extrinsic model
ATC: 1 materials defined from Ar_electrostatic.mat
fix_modify ATC add_species P type 3
fix_modify ATC add_species N type 4
fix_modify ATC boundary SOLID
fix_modify ATC atom_element_map eulerian $i
fix_modify ATC atom_element_map eulerian 1
fix_modify ATC internal_quadrature off # on creates a nasty error (NOTE trap error)
fix_modify ATC mass_matrix fe
fix_modify ATC include atomic_charge
# mesh
fix_modify ATC mesh create $h 2 2 BOX f p p dx piecewise_linear 0 0 0 1 0 0 0.0 1.0 1.0 1.0
fix_modify ATC mesh create 10 2 2 BOX f p p dx piecewise_linear 0 0 0 1 0 0 0.0 1.0 1.0 1.0
ATC: created structured mesh with 99 nodes, 44 unique nodes, and 40 elements
fix_modify ATC mesh create_elementset fluidElts ${Ls} INF -INF INF -INF INF
fix_modify ATC mesh create_elementset fluidElts 4 INF -INF INF -INF INF
ATC: created elementset fluidElts with 32 elements
fix_modify ATC internal_element_set fluidElts
+fix_modify ATC output volume_integral fluidElts mass_density
+fix_modify ATC output volume_integral fluidElts charge_density
+fix_modify ATC mesh create_nodeset lbc 0 0 -INF INF -INF INF
+ ATC: created nodeset lbc with 4 nodes
+fix_modify ATC mesh create_nodeset rbc $L $L -INF INF -INF INF
+fix_modify ATC mesh create_nodeset rbc 20 $L -INF INF -INF INF
+fix_modify ATC mesh create_nodeset rbc 20 20 -INF INF -INF INF
+ ATC: created nodeset rbc with 4 nodes
+fix_modify ATC mesh create_nodeset wall 0 ${Ls} 0 4 0 4
+fix_modify ATC mesh create_nodeset wall 0 4 0 4 0 4
+ ATC: created nodeset wall with 12 nodes
+fix_modify ATC mesh create_elementset wall 0 ${Ls} 0 4 0 4
+fix_modify ATC mesh create_elementset wall 0 4 0 4 0 4
+ ATC: created elementset wall with 8 elements
+#fix_modify ATC mesh create_faceset lbc plane x 0
+fix_modify ATC mesh create_faceset surface -INF ${Ls} -INF INF -INF INF
+fix_modify ATC mesh create_faceset surface -INF 4 -INF INF -INF INF
+ ATC: created faceset surface with 4 faces
+fix_modify ATC mesh output dielectric_interfaceMESH text binary
+# ic/bcs
+#fix_modify ATC initial charge_density all 0.
+fix_modify ATC initial mass_density all 0.
+fix_modify ATC initial electric_potential all 0.
+# output
+thermo $s
+thermo 100
+variable cFLUID equal count(FLUID)
+compute PAVE P reduce ave x
+compute PMIN P reduce min x
+compute PMAX P reduce max x
+compute NAVE N reduce ave x
+compute NMIN N reduce min x
+compute NMAX N reduce max x
+compute q all property/atom q
+compute Q all reduce sum c_q
+compute m all property/atom mass
+compute M all reduce sum c_m
+compute Qf FLUID reduce sum c_q
+compute Mf FLUID reduce sum c_m
+compute F FLUID reduce sum fx fy fz
+thermo_style custom step temp press etotal pe c_Q c_M c_Qf c_Mf c_PMIN c_PAVE c_PMAX c_NMIN c_NAVE c_NMAX c_F[1] c_F[2] c_F[3]
+compute T FLUID temp
+thermo_modify temp T
+WARNING: Temperature for thermo pressure is not for group all (../thermo.cpp:438)
+thermo_modify flush yes
+log dielectric_interface.log
+fix_modify ATC output dielectric_interfaceFE $s full_text binary
+fix_modify ATC output dielectric_interfaceFE 100 full_text binary
+ ATC: Warning : text output can create _LARGE_ files
+ ATC: output custom names:
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationP
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationN
+species_concentration : species_concentrationP
+species_concentration : species_concentrationN
+
+fix_modify PP output dielectric_interfacePP $s full_text binary
+fix_modify PP output dielectric_interfacePP 100 full_text binary
+ ATC: Warning : text output can create _LARGE_ files
+ ATC: output custom names:
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationIONS_1
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationIONS_2
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationIONS_3
+NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationIONS_4
+species_concentration : species_concentrationIONS_1
+species_concentration : species_concentrationIONS_2
+species_concentration : species_concentrationIONS_3
+species_concentration : species_concentrationIONS_4
+
+dump X all custom $s dielectric_interface.dmp id type x y z q vx vy vz fx fy fz
+dump X all custom 100 dielectric_interface.dmp id type x y z q vx vy vz fx fy fz
+fix_modify ATC fix electric_potential rbc 0.
+# stage 1 : active source controlling far-field shielding
+fix_modify ATC control charge FLUID dielectric ${phiInf} ${perm2} ${depth}
+fix_modify ATC control charge FLUID dielectric -1 ${perm2} ${depth}
+fix_modify ATC control charge FLUID dielectric -1 2 ${depth}
+fix_modify ATC control charge FLUID dielectric -1 2 17.157099999999999795
ERROR: Illegal fix_modify command (../fix.cpp:104)
diff --git a/examples/USER/atc/fluids/double_layer.screen b/examples/USER/atc/fluids/double_layer.screen
index b54c34168..552d13827 100644
--- a/examples/USER/atc/fluids/double_layer.screen
+++ b/examples/USER/atc/fluids/double_layer.screen
@@ -1,202 +1,203 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style full
dimension 3
neighbor 2 bin
neigh_modify every 1 check yes
boundary f f f
timestep 0.0005
thermo 100
dielectric 81.
newton off
pair_style lj/cut 13.000000
pair_modify mix arithmetic
read_data waternve.atm
Scanning data file ...
Reading data file ...
orthogonal box = (-19.38 -19.38 -21.88) to (19.38 19.38 23.94)
1 by 2 by 2 MPI processor grid
1982 atoms
1982 velocities
Finding 1-2 1-3 1-4 neighbors ...
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
reset_timestep 0
variable nsteps equal 1000
variable dumpfreq equal ${nsteps}/10
variable dumpfreq equal 1000/10
variable nx equal 4
variable ny equal 4
variable nz equal 4
variable x_min equal -19.38
variable x_max equal 19.38
variable x_goldmin equal -11.22
variable x_goldmax equal 11.22
variable x_fluidmin equal ${x_goldmin}
variable x_fluidmin equal -11.220000000000000639
variable x_fluidmax equal ${x_goldmax}
variable x_fluidmax equal 11.220000000000000639
variable x_wallmin equal ${x_goldmin}-1.5
variable x_wallmin equal -11.220000000000000639-1.5
variable x_wallmax equal ${x_goldmax}+1.5
variable x_wallmax equal 11.220000000000000639+1.5
variable y_min equal -19.38
variable y_max equal 19.38
variable y_goldmin equal -11.22
variable y_goldmax equal 11.22
variable surface_charge equal -0.3125/(4.08*4.08)
variable y_fluidmin equal ${y_goldmin}
variable y_fluidmin equal -11.220000000000000639
variable y_fluidmax equal ${y_goldmax}
variable y_fluidmax equal 11.220000000000000639
variable y_wallmin equal ${y_goldmin}-1.5
variable y_wallmin equal -11.220000000000000639-1.5
variable y_wallmax equal ${y_goldmax}+1.5
variable y_wallmax equal 11.220000000000000639+1.5
variable downshift equal 2.5
variable zshiftlatt equal 1-${downshift}/4.08
variable zshiftlatt equal 1-2.5/4.08
variable z_min equal -20.4-${downshift}+0.25*4.08
variable z_min equal -20.4-2.5+0.25*4.08
variable z_max equal 22.44+1.5
variable z_goldmin equal -12.24-${downshift}+0.25*4.08
variable z_goldmin equal -12.24-2.5+0.25*4.08
variable z_goldmax equal -${downshift}+0.25*4.08
variable z_goldmax equal -2.5+0.25*4.08
variable z_goldtopmin equal ${z_goldmax}-0.5*4.08
variable z_goldtopmin equal -1.4799999999999999822-0.5*4.08
variable z_goldtopmax equal ${z_goldmax}
variable z_goldtopmax equal -1.4799999999999999822
variable z_fluidmin equal 0.
variable z_fluidmax equal 22.44
variable z_wallmax equal ${z_max}
variable z_wallmax equal 23.940000000000001279
lattice sc 8.16 origin 0 0 0.75
Lattice spacing in x,y,z = 8.16 8.16 8.16
group pos type 4
27 atoms in group pos
group neg type 5
0 atoms in group neg
group allfluid type 3 4 5
177 atoms in group allfluid
compute fluidT allfluid temp
thermo_style custom step epair emol etotal press c_fluidT
fix zhiwall allfluid wall/lj93 zhi ${z_wallmax} 0.0195 3.45 10.000000 units box
fix zhiwall allfluid wall/lj93 zhi 23.940000000000001279 0.0195 3.45 10.000000 units box
fix xlowall allfluid wall/lj93 xlo ${x_wallmin} 0.0195 3.45 10.000000 units box
fix xlowall allfluid wall/lj93 xlo -12.720000000000000639 0.0195 3.45 10.000000 units box
fix xhiwall allfluid wall/lj93 xhi ${x_wallmax} 0.0195 3.45 10.000000 units box
fix xhiwall allfluid wall/lj93 xhi 12.720000000000000639 0.0195 3.45 10.000000 units box
fix ylowall allfluid wall/lj93 ylo ${y_wallmin} 0.0195 3.45 10.000000 units box
fix ylowall allfluid wall/lj93 ylo -12.720000000000000639 0.0195 3.45 10.000000 units box
fix yhiwall allfluid wall/lj93 yhi ${y_wallmax} 0.0195 3.45 10.000000 units box
fix yhiwall allfluid wall/lj93 yhi 12.720000000000000639 0.0195 3.45 10.000000 units box
group solvent type 3
150 atoms in group solvent
fix fluidnvt solvent nvt temp 300.0 300.0 0.100 drag 0.2
##########################################################################
region ATC_BOX block ${x_wallmin} ${x_wallmax} ${y_wallmin} ${y_wallmax} ${z_goldtopmin} ${z_wallmax} units box
region ATC_BOX block -12.720000000000000639 ${x_wallmax} ${y_wallmin} ${y_wallmax} ${z_goldtopmin} ${z_wallmax} units box
region ATC_BOX block -12.720000000000000639 12.720000000000000639 ${y_wallmin} ${y_wallmax} ${z_goldtopmin} ${z_wallmax} units box
region ATC_BOX block -12.720000000000000639 12.720000000000000639 -12.720000000000000639 ${y_wallmax} ${z_goldtopmin} ${z_wallmax} units box
region ATC_BOX block -12.720000000000000639 12.720000000000000639 -12.720000000000000639 12.720000000000000639 ${z_goldtopmin} ${z_wallmax} units box
region ATC_BOX block -12.720000000000000639 12.720000000000000639 -12.720000000000000639 12.720000000000000639 -3.5200000000000000178 ${z_wallmax} units box
region ATC_BOX block -12.720000000000000639 12.720000000000000639 -12.720000000000000639 12.720000000000000639 -3.5200000000000000178 23.940000000000001279 units box
group ATC_ATOMS type 4 5
27 atoms in group ATC_ATOMS
fix ATC ATC_ATOMS atc species_electrostatic Ar_species_dl.mat
ATC: constructing electrostatic species coupling with parameter file Ar_species_dl.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 5
ATC: 1 materials defined from Ar_species_dl.mat
ATC: creating fem_efield extrinsic model
ATC: 1 materials defined from Ar_species_dl.mat
fix_modify ATC add_species P group pos
fix_modify ATC add_species N group neg
fix_modify ATC mesh create ${nx} ${ny} ${nz} ATC_BOX f f f
fix_modify ATC mesh create 4 ${ny} ${nz} ATC_BOX f f f
fix_modify ATC mesh create 4 4 ${nz} ATC_BOX f f f
fix_modify ATC mesh create 4 4 4 ATC_BOX f f f
ATC: created uniform mesh with 125 nodes, 125 unique nodes, and 64 elements
fix_modify ATC atom_element_map eulerian 1
fix_modify ATC internal_quadrature off
fix_modify ATC initial mass_density all 0.
fix_modify ATC mesh create_faceset BOTTOM_FACE -INF INF -INF INF ${z_goldtopmin} INF
fix_modify ATC mesh create_faceset BOTTOM_FACE -INF INF -INF INF -3.5200000000000000178 INF
ATC: created faceset BOTTOM_FACE with 16 faces
## OLD
fix_modify ATC extrinsic fix_charge BOTTOM_FACE ${surface_charge}
fix_modify ATC extrinsic fix_charge BOTTOM_FACE -0.018772827758554402194
## NEW
# ERROR: Poisson solver needs Dirichlet data
#fix_modify ATC control charge conductor ${surface_charge}
#fix_modify ATC control charge effective_charge ATC_ATOMS BOTTOM_FACE
## END
fix_modify ATC output double_layerFE ${dumpfreq} text binary
fix_modify ATC output double_layerFE 100 text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationP
NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationN
species_concentration : species_concentrationP
species_concentration : species_concentrationN
dump chargenve all atom ${dumpfreq} double_layer.dmp
dump chargenve all atom 100 double_layer.dmp
run ${nsteps}
run 1000
Setting up run ...
ATC: WARNING: all initial conditions for charge_density have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for species_concentration have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for electric_potential have not been defined and the undefined are assumed zero
Memory usage per processor = 54.1045 Mbytes
Step E_pair E_mol TotEng Press fluidT
0 -9252.0858 0 -9228.1564 -55763.67 293.65526
- 100 -9252.3247 0 -9228.0784 -55827.581 307.58592
- 200 -9251.4752 0 -9227.7891 -55737.506 282.95787
- 300 -9251.4249 0 -9227.5267 -55707.319 292.28243
- 400 -9251.418 0 -9227.1803 -55676.42 307.20457
- 500 -9251.2317 0 -9226.4518 -55626.477 331.04006
- 600 -9251.0816 0 -9226.0561 -55592.086 341.83069
- 700 -9250.3998 0 -9226.2318 -55560.989 304.13946
- 800 -9251.0058 0 -9226.6944 -55690.148 310.44444
- 900 -9251.0001 0 -9227.2599 -55752.304 285.33992
- 1000 -9250.9076 0 -9227.1099 -55769.609 287.86493
-Loop time of 110.95 on 4 procs for 1000 steps with 1982 atoms
-
-Pair time (%) = 10.3921 (9.36645)
-Bond time (%) = 0.000747621 (0.000673836)
-Neigh time (%) = 0.0807644 (0.0727935)
-Comm time (%) = 7.50919 (6.76808)
-Outpt time (%) = 0.527695 (0.475615)
-Other time (%) = 92.4396 (83.3164)
+ 100 -9252.3246 0 -9228.0767 -55827.604 307.65619
+ 200 -9251.4773 0 -9227.8252 -55739.237 281.46665
+ 300 -9251.4162 0 -9227.6021 -55712.377 288.58631
+ 400 -9251.4192 0 -9227.3092 -55688.538 301.59217
+ 500 -9251.3116 0 -9226.6162 -55652.69 327.32164
+ 600 -9251.1532 0 -9226.2326 -55637.593 337.22358
+ 700 -9250.5037 0 -9226.425 -55610.998 300.21653
+ 800 -9250.72 0 -9226.768 -55686.507 294.64934
+ 900 -9251.0634 0 -9227.1621 -55774.601 292.41664
+ 1000 -9250.8046 0 -9227.0389 -55778.639 286.45437
+Loop time of 32.2267 on 4 procs for 1000 steps with 1982 atoms
+
+Pair time (%) = 6.65709 (20.6571)
+Bond time (%) = 0.000525236 (0.00162982)
+Neigh time (%) = 0.0401824 (0.124687)
+Comm time (%) = 0.252991 (0.785034)
+Outpt time (%) = 0.0763716 (0.236982)
+Other time (%) = 25.1996 (78.1946)
Nlocal: 495.5 ave 976 max 63 min
Histogram: 2 0 0 0 0 0 0 0 1 1
Nghost: 916.5 ave 1083 max 778 min
Histogram: 2 0 0 0 0 0 0 0 1 1
-Neighs: 132325 ave 269946 max 8208 min
+Neighs: 132292 ave 269908 max 8168 min
Histogram: 2 0 0 0 0 0 0 0 1 1
-FullNghs: 219343 ave 455925 max 9588 min
+FullNghs: 219310 ave 455907 max 9552 min
Histogram: 2 0 0 0 0 0 0 0 1 1
-Total # of neighbors = 877372
-Ave neighs/atom = 442.67
+Total # of neighbors = 877238
+Ave neighs/atom = 442.602
Ave special neighs/atom = 0
Neighbor list builds = 4
Dangerous builds = 0
diff --git a/examples/USER/atc/fluids/liquid_electrostatic.screen b/examples/USER/atc/fluids/liquid_electrostatic.screen
index 7489b3146..cd4a0d635 100644
--- a/examples/USER/atc/fluids/liquid_electrostatic.screen
+++ b/examples/USER/atc/fluids/liquid_electrostatic.screen
@@ -1,141 +1,143 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style full
########### BEGIN PARAMETERS ####################################
variable T equal 115.607
print "reference temperature $T [K]"
reference temperature 115.60699999999999932 [K]
variable a equal 5.719025032
variable i equal 1
variable s equal 100
variable dt equal 4.0
############## END PARAMETERS #################################
dimension 3
boundary f p p
pair_style lj/cut 13.0
lattice sc $a
lattice sc 5.7190250320000002304
Lattice spacing in x,y,z = 5.71903 5.71903 5.71903
region BOX block 0 12 0 4 0 4
read_data velocities.init
Scanning data file ...
Reading data file ...
orthogonal box = (0 0 0) to (68.6283 22.8761 22.8761)
4 by 1 by 1 MPI processor grid
192 atoms
192 velocities
Finding 1-2 1-3 1-4 neighbors ...
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
mass * 39.948
pair_coeff * * 0.2381 3.405
set group all charge 0.1
Setting atom values ...
192 settings made for charge
dielectric 80.0
timestep ${dt}
timestep 4
neigh_modify every $i check no
neigh_modify every 1 check no
thermo $s
thermo 100
# ------------- Equilibration and thermalisation ----------------
fix WALL all wall/reflect xlo EDGE xhi EDGE
fix NVT all nvt temp $T $T 10 drag 0.2
fix NVT all nvt temp 115.60699999999999932 $T 10 drag 0.2
fix NVT all nvt temp 115.60699999999999932 115.60699999999999932 10 drag 0.2
thermo_style custom step temp press etotal pe
#run 400
unfix NVT
# ------------- Post processing ---------------------------------
fix PP all atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify PP fields add mass_density charge_density electric_potential velocity
#fix_modify PP mesh create 50 1 1 BOX f p p
fix_modify PP mesh create 25 1 1 BOX f p p
ATC: created uniform mesh with 104 nodes, 26 unique nodes, and 25 elements
#fix_modify PP mesh create 6 1 1 BOX f p p
fix_modify PP atom_element_map eulerian $i
fix_modify PP atom_element_map eulerian 1
# ------------- Coupling ----------------------------------------
fix AtC all atc species_electrostatic Ar_species.mat
ATC: constructing electrostatic species coupling with parameter file Ar_species.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 1 materials defined from Ar_species.mat
ATC: creating fem_efield extrinsic model
ATC: 1 materials defined from Ar_species.mat
fix_modify AtC add_species ALL group all
fix_modify AtC internal_quadrature off
fix_modify AtC mesh create 6 1 1 BOX f p p
ATC: created uniform mesh with 28 nodes, 7 unique nodes, and 6 elements
fix_modify AtC atom_element_map eulerian $i
fix_modify AtC atom_element_map eulerian 1
fix_modify AtC extrinsic short_range off
fix_modify AtC mesh create_nodeset rbc 12. 12. -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC mesh create_nodeset lbc 0. 0. -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
# ------------- run ---------------------------------------------
thermo_style custom step cpu etotal ke
fix_modify AtC output liquid_electrostaticFE $s full_text # binary
fix_modify AtC output liquid_electrostaticFE 100 full_text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationALL
species_concentration : species_concentrationALL
fix_modify PP output liquid_electrostaticPP $s full_text
fix_modify PP output liquid_electrostaticPP 100 full_text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
log liquid_electrostatic.log
fix_modify AtC fix electric_potential lbc linear 0 0 0 0 0 0 0
ATC: created function : 0 + 0(x-0)+0(y-0)+0(z-0)
run 800
Setting up run ...
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
ATC: WARNING: all initial conditions for mass_density have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for charge_density have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for species_concentration have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for electric_potential have not been defined and the undefined are assumed zero
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species electrostatic], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
Memory usage per processor = 63.7188 Mbytes
Step CPU TotEng KinEng
0 0 35.202587 65.819079
- 100 0.24399519 36.014336 73.434063
- 200 0.48565197 40.073896 87.17957
- 300 0.72934318 47.116113 101.60024
- 400 1.039428 56.306233 113.20696
- 500 1.2882581 67.3682 120.18094
- 600 1.5421622 79.678922 137.95847
- 700 1.8119881 93.406523 150.38695
- 800 2.0993671 107.30758 169.35003
-Loop time of 2.0994 on 4 procs for 800 steps with 192 atoms
+ 100 0.12559009 35.132776 72.573174
+ 200 0.24848509 37.926061 85.105883
+ 300 0.37141109 43.306749 97.61592
+ 400 0.49257302 50.460579 107.44276
+ 500 0.61500621 58.987352 111.76417
+ 600 0.73902512 68.996097 125.58655
+ 700 0.86429 79.481129 137.54934
+ 800 0.99429512 89.704034 154.18784
+Loop time of 0.994333 on 4 procs for 800 steps with 192 atoms
-Pair time (%) = 0.0760665 (3.62325)
-Bond time (%) = 0.000117838 (0.00561295)
-Neigh time (%) = 0.0679175 (3.23509)
-Comm time (%) = 0.0478712 (2.28023)
-Outpt time (%) = 0.00402987 (0.191953)
-Other time (%) = 1.9034 (90.6639)
+Pair time (%) = 0.0697992 (7.0197)
+Bond time (%) = 0.000118732 (0.0119409)
+Neigh time (%) = 0.0668936 (6.72749)
+Comm time (%) = 0.0454406 (4.56995)
+Outpt time (%) = 0.0037877 (0.380928)
+Other time (%) = 0.808293 (81.29)
-Nlocal: 48 ave 76 max 34 min
-Histogram: 2 0 1 0 0 0 0 0 0 1
-Nghost: 515 ave 660 max 337 min
+Nlocal: 48 ave 73 max 35 min
+Histogram: 1 1 1 0 0 0 0 0 0 1
+Nghost: 505 ave 641 max 343 min
Histogram: 1 0 0 0 0 1 1 0 0 1
-Neighs: 1680.25 ave 3128 max 827 min
+Neighs: 1650.75 ave 2905 max 855 min
Histogram: 1 0 2 0 0 0 0 0 0 1
-FullNghs: 3360.5 ave 6244 max 1660 min
+FullNghs: 3301.5 ave 5798 max 1724 min
Histogram: 1 0 2 0 0 0 0 0 0 1
-Total # of neighbors = 13442
-Ave neighs/atom = 70.0104
+Total # of neighbors = 13206
+Ave neighs/atom = 68.7812
Ave special neighs/atom = 0
Neighbor list builds = 80
Dangerous builds = 0
diff --git a/examples/USER/atc/fluids/opp_force.screen b/examples/USER/atc/fluids/opp_force.screen
index dee47ac73..be04390b9 100644
--- a/examples/USER/atc/fluids/opp_force.screen
+++ b/examples/USER/atc/fluids/opp_force.screen
@@ -1,145 +1,146 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
variable E equal 20.0
variable nx equal 16
# allow charges
atom_style full
dielectric 1.
dimension 3
boundary p p p
lattice fcc 4.08 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 4.08 4.08 4.08
region BOX block -8 8 0 3 0 3
create_box 3 BOX
Created orthogonal box = (-32.64 0 0) to (32.64 12.24 12.24)
4 by 1 by 1 MPI processor grid
create_atoms 1 region BOX
Created 576 atoms
pair_style lj/cut 10.
#pair_style lj/cut/coul/long 10.
#kspace_style pppm 1.e-4
#kspace_style ewald 1.e-4
pair_coeff * * 0.2381 3.405
mass * 39.948
group real region BOX
576 atoms in group real
region LEFT block -5 -2 INF INF INF INF
region RIGHT block 2 5 INF INF INF INF
set region LEFT type 2
Setting atom values ...
108 settings made for type
set region RIGHT type 3
Setting atom values ...
108 settings made for type
set region LEFT charge -1.
Setting atom values ...
108 settings made for charge
set region RIGHT charge 1.
Setting atom values ...
108 settings made for charge
group NION region LEFT
108 atoms in group NION
group PION region RIGHT
108 atoms in group PION
neighbor 2. bin
###########################################################################
#fix EFIELD all efield $E 0.0 0.0
###########################################################################
fix ATC real atc species_electrostatic Ar_species.mat
ATC: constructing electrostatic species coupling with parameter file Ar_species.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: WARNING: material units real do not match lammps
ATC: 1 materials defined from Ar_species.mat
ATC: creating fem_efield extrinsic model
ATC: WARNING: material units real do not match lammps
ATC: 1 materials defined from Ar_species.mat
fix_modify ATC add_species N group NION
fix_modify ATC add_species P group PION
fix_modify ATC include atomic_charge
fix_modify ATC internal_quadrature off
fix_modify ATC extrinsic short_range off
fix_modify ATC mesh create ${nx} 1 1 BOX p p p
fix_modify ATC mesh create 16 1 1 BOX p p p
ATC: created uniform mesh with 68 nodes, 16 unique nodes, and 16 elements
fix_modify ATC atom_element_map eulerian 1
fix_modify ATC atom_weight multiscale
fix_modify ATC initial mass_density all 0.
#fix_modify ATC initial charge_density all 0.
fix_modify ATC initial electric_potential all 0.
fix_modify ATC mesh create_nodeset left_end -8.01 -7.99 -.1 .1 -.1 .1
ATC: created nodeset left_end with 1 nodes
fix_modify ATC fix electric_potential left_end 0.
#fix_modify ATC mesh create_nodeset right_end 7.99 8.01 -.1 .1 -.1 .1
#fix_modify ATC fix electric_potential right_end 0.
# quick test for charged surfaces
#fix_modify ATC mesh create_faceset left_end box -8 10 -10 10 -10 10 outward
#fix_modify ATC extrinsic fix_charge left_end 0.
fix_modify ATC add_species NION type 2
fix_modify ATC add_species PION type 3
###########################################################################
variable n equal count(real)
print "number of atoms: $n"
number of atoms: 576
timestep 0.0005
thermo 100
compute Fn NION reduce sum fx
compute Fp PION reduce sum fx
thermo_style custom step etotal temp press pe c_Fn c_Fp
# initial thermo line should be:
#0 13699.992 0 12453927 13699.992 880.49388 -880.49388
fix_modify ATC output opp_forceFE 100 text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationNION
NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationPION
NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationN
NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationP
species_concentration : species_concentrationNION
species_concentration : species_concentrationPION
species_concentration : species_concentrationN
species_concentration : species_concentrationP
run 1000
Setting up run ...
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
ATC: WARNING: all initial conditions for charge_density have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for species_concentration have not been defined and the undefined are assumed zero
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species electrostatic], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
Memory usage per processor = 50.4595 Mbytes
Step TotEng Temp Press PotEng Fn Fp
0 13699.992 0 12453927 13699.992 880.49388 -880.49388
- 100 20040.817 16252.426 16202859 18832.862 423.97919 -423.97919
- 200 20169.984 13829.994 16359769 19142.076 -1134.6292 1134.6292
- 300 15287.67 9016.4656 13166399 14617.525 468.63207 -468.63207
- 400 20617.507 12729.152 16757508 19671.418 -1247.489 1247.489
- 500 17500.547 14981.89 14448672 16387.025 -214.58965 214.58965
- 600 16365.011 13836.901 13712389 15336.589 933.06997 -933.06997
- 700 21830.838 6644.0674 17834210 21337.021 -591.66886 591.66886
- 800 16617.582 10242.991 14041573 15856.276 203.78451 -203.78451
- 900 17427.331 10454.594 14592379 16650.298 -1704.6656 1704.6656
- 1000 19974.392 10682.026 16367773 19180.455 -1384.2794 1384.2794
-Loop time of 34.9835 on 4 procs for 1000 steps with 576 atoms
+ 100 18516.206 19920.46 14980264 17035.627 -29.468216 29.468216
+ 200 18590.499 18996.496 15042503 17178.592 74.632418 -74.632418
+ 300 16986.906 22207.446 13773775 15336.347 213.36855 -213.36855
+ 400 17031.316 20483.897 13881842 15508.858 -1030.06 1030.06
+ 500 18393.547 13569.054 15141293 17385.033 -881.32991 881.32991
+ 600 17629.245 22129.326 14228700 15984.492 297.77405 -297.77405
+ 700 17374.698 17398.728 14252085 16081.545 -1458.7112 1458.7112
+ 800 17805.47 15491.378 14643513 16654.08 2644.7457 -2644.7457
+ 900 20614.308 23711.81 16239209 18851.938 218.5282 -218.5282
+ 1000 22067.741 26242.181 17175599 20117.302 -752.00587 752.00587
+Loop time of 3.63361 on 4 procs for 1000 steps with 576 atoms
-Pair time (%) = 2.17131 (6.20667)
-Bond time (%) = 0.0027945 (0.00798806)
-Neigh time (%) = 0.0782308 (0.223622)
-Comm time (%) = 3.05527 (8.73344)
-Outpt time (%) = 0.0930898 (0.266096)
-Other time (%) = 29.5828 (84.5622)
+Pair time (%) = 1.38237 (38.0439)
+Bond time (%) = 0.000235617 (0.00648437)
+Neigh time (%) = 0.0341454 (0.939708)
+Comm time (%) = 0.147869 (4.06947)
+Outpt time (%) = 0.0093652 (0.257738)
+Other time (%) = 2.05963 (56.6827)
Nlocal: 144 ave 144 max 144 min
Histogram: 4 0 0 0 0 0 0 0 0 0
-Nghost: 3177 ave 3258 max 3096 min
+Nghost: 3096 ave 3096 max 3096 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+Neighs: 30906 ave 31490 max 30319 min
Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 30681 ave 31973 max 29028 min
-Histogram: 1 0 0 1 0 0 0 0 0 2
-FullNghs: 61362 ave 63684 max 59040 min
+FullNghs: 61812 ave 62964 max 60660 min
Histogram: 2 0 0 0 0 0 0 0 0 2
-Total # of neighbors = 245448
-Ave neighs/atom = 426.125
+Total # of neighbors = 247248
+Ave neighs/atom = 429.25
Ave special neighs/atom = 0
-Neighbor list builds = 12
+Neighbor list builds = 7
Dangerous builds = 0
diff --git a/examples/USER/atc/fluids/poisson.screen b/examples/USER/atc/fluids/poisson.screen
index d3e324719..6f87c8324 100644
--- a/examples/USER/atc/fluids/poisson.screen
+++ b/examples/USER/atc/fluids/poisson.screen
@@ -1,259 +1,260 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
variable E equal 20.0
variable nx equal 32
# allow charges
atom_style full
dielectric 1.
dimension 3
boundary f p p
lattice fcc 4.08 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 4.08 4.08 4.08
region BOX block 0 16 0 3 0 3
create_box 1 BOX
Created orthogonal box = (0 0 0) to (65.28 12.24 12.24)
4 by 1 by 1 MPI processor grid
create_atoms 1 region BOX
Created 576 atoms
pair_style lj/cut 13.
pair_coeff * * 0.2381 3.405
mass * 39.948
group real region BOX
576 atoms in group real
set group real charge 1
Setting atom values ...
576 settings made for charge
###########################################################################
#fix EFIELD all efield $E 0.0 0.0
###########################################################################
fix ATC real atc species_electrostatic Ar_species.mat
ATC: constructing electrostatic species coupling with parameter file Ar_species.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: WARNING: material units real do not match lammps
ATC: 1 materials defined from Ar_species.mat
ATC: creating fem_efield extrinsic model
ATC: WARNING: material units real do not match lammps
ATC: 1 materials defined from Ar_species.mat
fix_modify ATC add_species ion type 1 ### <<<<<
#fix_modify ATC add_species REAL group real
fix_modify ATC include atomic_charge
fix_modify ATC internal_quadrature off
fix_modify ATC extrinsic short_range off
fix_modify ATC mesh create ${nx} 1 1 BOX f p p
fix_modify ATC mesh create 32 1 1 BOX f p p
ATC: created uniform mesh with 132 nodes, 33 unique nodes, and 32 elements
fix_modify ATC atom_element_map eulerian 1
fix_modify ATC atom_weight multiscale
fix_modify ATC initial mass_density all 0.
#fix_modify ATC initial charge_density all 0.
###########################################################################
variable n equal count(real)
print "number of atoms: $n"
number of atoms: 576
timestep 0.0
thermo 1
compute Fx real reduce sum fx
compute Fy real reduce sum fy
thermo_style custom step etotal temp press pe c_Fx c_Fy
fix_modify ATC output poissonFE 1 text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationion
species_concentration : species_concentrationion
# (1) all fixed
fix_modify ATC fix electric_potential all linear 0 0 0 $E 0 0 0 0
fix_modify ATC fix electric_potential all linear 0 0 0 20 0 0 0 0
ATC: created function : 0 + 20(x-0)+0(y-0)+0(z-0)
run 1
Setting up run ...
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
ATC: WARNING: all initial conditions for charge_density have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for species_concentration have not been defined and the undefined are assumed zero
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species electrostatic], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
Memory usage per processor = 48.9866 Mbytes
Step TotEng Temp Press PotEng Fx Fy
0 13388.811 0 12185513 13388.811 -11520 -5.4091662e-13
1 13388.811 0 12185513 13388.811 -11520 -5.4091662e-13
-Loop time of 0.260963 on 4 procs for 1 steps with 576 atoms
+Loop time of 0.00830519 on 4 procs for 1 steps with 576 atoms
-Pair time (%) = 0.0105038 (4.025)
-Bond time (%) = 1.07288e-06 (0.000411124)
+Pair time (%) = 0.00297707 (35.8459)
+Bond time (%) = 2.38419e-07 (0.00287072)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00655341 (2.51124)
-Outpt time (%) = 0.0322342 (12.352)
-Other time (%) = 0.211671 (81.1114)
+Comm time (%) = 0.000398695 (4.80056)
+Outpt time (%) = 0.00104666 (12.6024)
+Other time (%) = 0.00388253 (46.7482)
Nlocal: 144 ave 144 max 144 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3556 ave 4256 max 2856 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 58212 ave 63792 max 52524 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 116424 ave 127584 max 105264 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 465696
Ave neighs/atom = 808.5
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
# (2) Dirichlet
# NOTE with correct density solution is very close
#fix_modify ATC fix charge_density all 0.0588951459091903
fix_modify ATC unfix electric_potential all
fix_modify ATC mesh create_nodeset lbc 0.0 0.0 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify ATC mesh create_faceset lbc 0.0 INF -INF INF -INF INF
ATC: created faceset lbc with 1 faces
fix_modify ATC mesh create_faceset rbc -INF 16.0 -INF INF -INF INF
ATC: created faceset rbc with 1 faces
fix_modify ATC fix electric_potential lbc 100.0
run 1
Setting up run ...
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species electrostatic], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
Memory usage per processor = 48.9866 Mbytes
Step TotEng Temp Press PotEng Fx Fy
1 13388.811 0 12185513 13388.811 -200361.27 6.719863e-13
2 13388.811 0 12185513 13388.811 -200361.27 6.719863e-13
-Loop time of 0.254081 on 4 procs for 1 steps with 576 atoms
+Loop time of 0.00797027 on 4 procs for 1 steps with 576 atoms
-Pair time (%) = 0.0104072 (4.09602)
-Bond time (%) = 1.07288e-06 (0.00042226)
+Pair time (%) = 0.00295955 (37.1323)
+Bond time (%) = 2.98023e-07 (0.00373918)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0206404 (8.12356)
-Outpt time (%) = 0.0137355 (5.40596)
-Other time (%) = 0.209297 (82.374)
+Comm time (%) = 0.000350654 (4.39952)
+Outpt time (%) = 0.000887036 (11.1293)
+Other time (%) = 0.00377274 (47.3351)
Nlocal: 144 ave 144 max 144 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3556 ave 4256 max 2856 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 58212 ave 63792 max 52524 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 116424 ave 127584 max 105264 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 465696
Ave neighs/atom = 808.5
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
# (3) Neumann
fix_modify ATC fix_flux electric_potential rbc 0.5
run 1
Setting up run ...
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species electrostatic], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
Memory usage per processor = 48.9866 Mbytes
Step TotEng Temp Press PotEng Fx Fy
2 13388.811 0 12185513 13388.811 -252475.24 1.1650611e-12
3 13388.811 0 12185513 13388.811 -252475.24 1.1650611e-12
-Loop time of 0.0918587 on 4 procs for 1 steps with 576 atoms
+Loop time of 0.00816 on 4 procs for 1 steps with 576 atoms
-Pair time (%) = 0.013284 (14.4614)
-Bond time (%) = 1.01328e-06 (0.00110308)
+Pair time (%) = 0.00294703 (36.1156)
+Bond time (%) = 5.36442e-07 (0.00657405)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000460505 (0.501319)
-Outpt time (%) = 0.017328 (18.8638)
-Other time (%) = 0.0607851 (66.1724)
+Comm time (%) = 0.000403166 (4.94076)
+Outpt time (%) = 0.00085324 (10.4564)
+Other time (%) = 0.00395602 (48.4807)
Nlocal: 144 ave 144 max 144 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3556 ave 4256 max 2856 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 58212 ave 63792 max 52524 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 116424 ave 127584 max 105264 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 465696
Ave neighs/atom = 808.5
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
# (4) Robin eps_1 phi'_1 = eps_2/L_2 (phi_{L_2} - phi)
fix_modify ATC unfix_flux electric_potential rbc
fix_modify ATC fix_robin electric_potential rbc 0.5 -0.00001
ATC: created function : 0.5 + -1e-05*u
run 1
Setting up run ...
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species electrostatic], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
Memory usage per processor = 48.9866 Mbytes
Step TotEng Temp Press PotEng Fx Fy
3 13388.811 0 12185513 13388.811 -225709.12 9.1181426e-13
4 13388.811 0 12185513 13388.811 -225709.12 9.1181426e-13
-Loop time of 0.0331933 on 4 procs for 1 steps with 576 atoms
+Loop time of 0.0081799 on 4 procs for 1 steps with 576 atoms
-Pair time (%) = 0.0132439 (39.8992)
-Bond time (%) = 7.15256e-07 (0.00215482)
+Pair time (%) = 0.00293809 (35.9184)
+Bond time (%) = 2.38419e-07 (0.00291469)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000455439 (1.37208)
-Outpt time (%) = 0.00104851 (3.15879)
-Other time (%) = 0.0184448 (55.5678)
+Comm time (%) = 0.000377715 (4.61759)
+Outpt time (%) = 0.000873506 (10.6787)
+Other time (%) = 0.00399035 (48.7824)
Nlocal: 144 ave 144 max 144 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3556 ave 4256 max 2856 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 58212 ave 63792 max 52524 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 116424 ave 127584 max 105264 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 465696
Ave neighs/atom = 808.5
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
# (5) Robins on the left and Robins on the right
fix_modify ATC unfix electric_potential lbc
fix_modify ATC fix_robin electric_potential rbc 0.01 -0.0001
ATC: created function : 0.01 + -0.0001*u
fix_modify ATC fix_robin electric_potential lbc 0.01 -0.0001
ATC: created function : 0.01 + -0.0001*u
run 1
Setting up run ...
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
ATC: WARNING: material: [ar] cannot find mass_density
ATC: WARNING: physics model: [species electrostatic], material: [ar] does not provide all interfaces for <mass_density> physics and will be treated as null
Memory usage per processor = 48.9866 Mbytes
Step TotEng Temp Press PotEng Fx Fy
4 13388.811 0 12185513 13388.811 4.3291948e-09 -1.4571568e-12
5 13388.811 0 12185513 13388.811 4.3364707e-09 -1.4571568e-12
-Loop time of 0.158969 on 4 procs for 1 steps with 576 atoms
+Loop time of 0.00845003 on 4 procs for 1 steps with 576 atoms
-Pair time (%) = 0.00292653 (1.84094)
-Bond time (%) = 2.98023e-07 (0.000187472)
+Pair time (%) = 0.00297916 (35.2562)
+Bond time (%) = 5.36442e-07 (0.0063484)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000340283 (0.214056)
-Outpt time (%) = 0.012237 (7.69773)
-Other time (%) = 0.143465 (90.2471)
+Comm time (%) = 0.000409603 (4.84736)
+Outpt time (%) = 0.000993252 (11.7544)
+Other time (%) = 0.00406748 (48.1357)
Nlocal: 144 ave 144 max 144 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 3556 ave 4256 max 2856 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 58212 ave 63792 max 52524 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 116424 ave 127584 max 105264 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 465696
Ave neighs/atom = 808.5
Ave special neighs/atom = 0
Neighbor list builds = 0
Dangerous builds = 0
#fix_modify ATC fix charge_density all 0.0
#run 1
diff --git a/examples/USER/atc/fluids/shear_flow.screen b/examples/USER/atc/fluids/shear_flow.screen
index b944fb2bb..dc3e6b0e4 100644
--- a/examples/USER/atc/fluids/shear_flow.screen
+++ b/examples/USER/atc/fluids/shear_flow.screen
@@ -1,64 +1,65 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Reading data file ...
orthogonal box = (-37.835 -16.215 -16.215) to (37.835 16.215 16.215)
4 by 1 by 1 MPI processor grid
1288 atoms
1288 velocities
Lattice spacing in x,y,z = 5.405 5.405 5.405
1000 atoms in group internal
288 atoms in group ghost
Lattice spacing in x,y,z = 5.405 5.405 5.405
ATC: constructing viscous/shear coupling with parameter file Ar_viscosity.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 1 materials defined from Ar_viscosity.mat
ATC: created uniform mesh with 28 nodes, 7 unique nodes, and 6 elements
ATC: created elementset rbc with 1 elements
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: WARNING: all initial conditions for velocity have not been defined and the undefined are assumed zero
-Memory usage per processor = 52.4731 Mbytes
+Memory usage per processor = 22.1391 Mbytes
Step CPU TotEng PotEng Temp
0 0 -1119.8507 -1407.9617 96.655262
- 100 3.7 -1119.8301 -1407.8272 96.617051
- 200 11 -1119.8009 -1400.4751 94.160366
- 300 16 -1119.7239 -1410.8865 97.679021
- 400 24 -1119.6576 -1408.2534 96.817907
- 500 28 -1119.6516 -1408.5682 96.925527
- 600 38 -1119.6329 -1408.6306 96.95274
- 700 39 -1119.5365 -1418.9199 100.43692
- 800 41 -1119.4382 -1415.3432 99.270023
- 900 51 -1119.2739 -1417.3965 100.01394
- 1000 58 -1119.1165 -1413.6775 98.8191
- 1100 62 -1118.9778 -1411.4417 98.115594
- 1200 64 -1118.8576 -1421.8226 101.63848
- 1300 68 -1118.7582 -1420.5024 101.22893
- 1400 75 -1118.6322 -1425.0437 102.7947
- 1500 77 -1118.5021 -1425.0965 102.85606
- 1600 86 -1118.4008 -1423.1023 102.22105
- 1700 88 -1118.2811 -1423.5625 102.41555
- 1800 98 -1118.1439 -1423.4533 102.42497
- 1900 99 -1118.0284 -1426.7201 103.55967
- 2000 1.1e+02 -1117.8763 -1428.701 104.27524
-Loop time of 107.637 on 4 procs for 2000 steps with 1288 atoms
+ 100 0.45 -1119.83 -1407.8271 96.617057
+ 200 0.91 -1119.801 -1400.4751 94.160328
+ 300 1.4 -1119.7243 -1410.8861 97.67875
+ 400 2.8 -1119.6585 -1408.2541 96.817832
+ 500 3.5 -1119.6526 -1408.5674 96.92494
+ 600 4 -1119.6342 -1408.633 96.953119
+ 700 4.5 -1119.5363 -1418.9222 100.43776
+ 800 5 -1119.436 -1415.3458 99.271609
+ 900 6 -1119.2691 -1417.3977 100.01597
+ 1000 6.4 -1119.1088 -1413.6621 98.816536
+ 1100 6.9 -1118.9641 -1411.446 98.121631
+ 1200 7.4 -1118.8394 -1421.816 101.64237
+ 1300 7.9 -1118.7366 -1420.5197 101.242
+ 1400 8.4 -1118.6053 -1425.0807 102.81614
+ 1500 8.8 -1118.4749 -1425.0429 102.84719
+ 1600 9.3 -1118.3705 -1423.1478 102.24647
+ 1700 9.8 -1118.2462 -1423.617 102.44557
+ 1800 10 -1118.1114 -1423.039 102.29689
+ 1900 11 -1117.9924 -1426.4671 103.48688
+ 2000 11 -1117.8331 -1428.4478 104.20478
+Loop time of 11.2877 on 4 procs for 2000 steps with 1288 atoms
-Pair time (%) = 6.68767 (6.21315)
-Neigh time (%) = 4.49477 (4.17585)
-Comm time (%) = 24.6344 (22.8864)
-Outpt time (%) = 0.123942 (0.115148)
-Other time (%) = 71.6966 (66.6094)
+Pair time (%) = 4.29776 (38.0746)
+Neigh time (%) = 1.9212 (17.0203)
+Comm time (%) = 2.09242 (18.5371)
+Outpt time (%) = 0.00724876 (0.0642181)
+Other time (%) = 2.9691 (26.3038)
-Nlocal: 322 ave 346 max 306 min
-Histogram: 1 0 1 0 1 0 0 0 0 1
-Nghost: 3368.25 ave 4149 max 2571 min
+Nlocal: 322 ave 345 max 307 min
+Histogram: 1 1 0 1 0 0 0 0 0 1
+Nghost: 3366.75 ave 4147 max 2571 min
Histogram: 2 0 0 0 0 0 0 0 0 2
-Neighs: 60300.2 ave 74700 max 48490 min
+Neighs: 60292 ave 74500 max 48658 min
Histogram: 2 0 0 0 0 0 0 1 0 1
-FullNghs: 120600 ave 149448 max 96908 min
+FullNghs: 120584 ave 149012 max 97293 min
Histogram: 2 0 0 0 0 0 0 1 0 1
-Total # of neighbors = 482402
-Ave neighs/atom = 374.536
+Total # of neighbors = 482336
+Ave neighs/atom = 374.484
Neighbor list builds = 200
Dangerous builds = 0
diff --git a/examples/USER/atc/fluids/shear_no_atoms.screen b/examples/USER/atc/fluids/shear_no_atoms.screen
index a07fe9f02..20061acc0 100644
--- a/examples/USER/atc/fluids/shear_no_atoms.screen
+++ b/examples/USER/atc/fluids/shear_no_atoms.screen
@@ -1,90 +1,91 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Lattice spacing in x,y,z = 1.5874 1.5874 1.5874
Created orthogonal box = (-79.3701 0 0) to (79.3701 1.5874 1.5874)
4 by 1 by 1 MPI processor grid
Lattice spacing in x,y,z = 0.904527 0.904527 0.904527
ATC: constructing viscous/shear coupling with parameter file Ar_visc_no_atoms.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: computed mass density : 215.93
ATC: WARNING: material units real do not match lammps
ATC: 1 materials defined from Ar_visc_no_atoms.mat
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
ATC: created nodeset rbc with 1 nodes
ATC: created nodeset lbc with 1 nodes
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
Memory usage per processor = 0.432259 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0 0 0 0 0
100 0 0 0 0 0
200 0 0 0 0 0
300 0 0 0 0 0
400 0 0 0 0 0
500 0 0 0 0 0
600 0 0 0 0 0
700 0 0 0 0 0
800 0 0 0 0 0
900 0 0 0 0 0
1000 0 0 0 0 0
1100 0 0 0 0 0
1200 0 0 0 0 0
1300 0 0 0 0 0
1400 0 0 0 0 0
1500 0 0 0 0 0
1600 0 0 0 0 0
1700 0 0 0 0 0
1800 0 0 0 0 0
1900 0 0 0 0 0
2000 0 0 0 0 0
2100 0 0 0 0 0
2200 0 0 0 0 0
2300 0 0 0 0 0
2400 0 0 0 0 0
2500 0 0 0 0 0
2600 0 0 0 0 0
2700 0 0 0 0 0
2800 0 0 0 0 0
2900 0 0 0 0 0
3000 0 0 0 0 0
3100 0 0 0 0 0
3200 0 0 0 0 0
3300 0 0 0 0 0
3400 0 0 0 0 0
3500 0 0 0 0 0
3600 0 0 0 0 0
3700 0 0 0 0 0
3800 0 0 0 0 0
3900 0 0 0 0 0
4000 0 0 0 0 0
4100 0 0 0 0 0
4200 0 0 0 0 0
4300 0 0 0 0 0
4400 0 0 0 0 0
4500 0 0 0 0 0
4600 0 0 0 0 0
4700 0 0 0 0 0
4800 0 0 0 0 0
4900 0 0 0 0 0
5000 0 0 0 0 0
-Loop time of 37.3637 on 4 procs for 5000 steps with 0 atoms
+Loop time of 7.59518 on 4 procs for 5000 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0146993 (0.039341)
-Outpt time (%) = 0.24752 (0.662459)
-Other time (%) = 37.1015 (99.2982)
+Comm time (%) = 0.0109366 (0.143994)
+Outpt time (%) = 0.0142687 (0.187865)
+Other time (%) = 7.56998 (99.6681)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/hardy/consistency.screen b/examples/USER/atc/hardy/consistency.screen
index 01d3fd0b4..89b76aefe 100644
--- a/examples/USER/atc/hardy/consistency.screen
+++ b/examples/USER/atc/hardy/consistency.screen
@@ -1,842 +1,843 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style atomic
variable L equal 16
variable E equal 8
# create domain
lattice fcc 3.615 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 3.615 3.615 3.615
region mdRegion block 0 $L -3 3 -3 3
region mdRegion block 0 16 -3 3 -3 3
boundary p p p
create_box 1 mdRegion
Created orthogonal box = (0 -10.845 -10.845) to (57.84 10.845 10.845)
4 by 1 by 1 MPI processor grid
# create atoms
create_atoms 1 region mdRegion
Created 2304 atoms
mass 1 63.550
group internal region mdRegion
2304 atoms in group internal
# specify inter-atomic potential
pair_style eam
pair_coeff * * ../../../../potentials/Cu_u3.eam
# specify neighbor/re-neighboring parameters
neighbor 0.3 bin
#neigh_modify every 10 delay 0 check no
neigh_modify delay 10000 check no
min_modify line quadratic
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
Memory usage per processor = 2.95316 Mbytes
Step Temp E_pair E_mol TotEng Press
0 0 -8156.16 0 -8156.16 -0.027860375
1 0 -8156.16 0 -8156.16 -0.027860375
-Loop time of 0.0612388 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.00702637 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8156.16000524 -8156.16000524 -8156.16000524
Force two-norm initial, final = 8.48911e-13 8.39584e-13
Force max component initial, final = 3.2252e-14 3.01703e-14
Final line search alpha, max atom move = 1 3.01703e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.0362611 (59.2127)
+Pair time (%) = 0.00631368 (89.8569)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00659382 (10.7674)
+Comm time (%) = 0.000439346 (6.25281)
Outpt time (%) = 0 (0)
-Other time (%) = 0.0183838 (30.0199)
+Other time (%) = 0.000273347 (3.8903)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15600 max 15504 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 62208
Ave neighs/atom = 27
Neighbor list builds = 0
Dangerous builds = 0
# ID group atc PhysicsType ParameterFile
fix AtC internal atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC mesh create $E 1 1 mdRegion f p p
fix_modify AtC mesh create 8 1 1 mdRegion f p p
ATC: created uniform mesh with 36 nodes, 9 unique nodes, and 8 elements
fix_modify AtC fields none
fix_modify AtC fields add mass_density displacement stress internal_energy eshelby_stress temperature
fix_modify AtC gradients add displacement
fix_modify AtC set reference_potential_energy
#fix_modify AtC hardy_reset 1
# output
thermo 10
thermo_style custom step pe ke press lx ly lz
fix_modify AtC output consistencyFE 1 text tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
# displace atoms
# NOTE we need to figure out how to output post minimize w/o a "run"
# or try to interface with "dump"
# this is fine, no integrator is being used
timestep 0.0
# initial before minimization?
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
1 -8156.16 0 -0.027860375 57.84 21.69 21.69
2 -8156.16 0 -0.027860375 57.84 21.69 21.69
-Loop time of 0.036861 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0233002 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.00230974 (6.26608)
+Pair time (%) = 0.00231779 (9.94751)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000133157 (0.36124)
-Outpt time (%) = 0.000100911 (0.27376)
-Other time (%) = 0.0343172 (93.0989)
+Comm time (%) = 0.000283718 (1.21767)
+Outpt time (%) = 0.000103652 (0.444857)
+Other time (%) = 0.020595 (88.39)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15678 max 15411 min
Histogram: 1 0 0 0 0 2 0 0 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment
variable n equal 10
variable i loop $n
variable i loop 10
# NOTE this does not generate KE
label loop_i
change_box all x scale 1.001 remap
Changing box ...
orthogonal box = (-0.02892 -10.845 -10.845) to (57.8689 10.845 10.845)
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7835 Mbytes
+Memory usage per processor = 24.3939 Mbytes
Step PotEng KinEng Press Lx Ly Lz
2 -8156.1458 0 -1381.2949 57.89784 21.69 21.69
3 -8156.1458 0 -1381.2949 57.89784 21.69 21.69
-Loop time of 0.587526 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.00737792 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8156.14582163 -8156.14582163 -8156.14582163
Force two-norm initial, final = 1.20171e-12 7.98441e-13
Force max component initial, final = 5.47843e-14 2.98234e-14
Final line search alpha, max atom move = 1 2.98234e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.113327 (19.2888)
+Pair time (%) = 0.00662678 (89.8191)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.244407 (41.5993)
+Comm time (%) = 0.000411451 (5.57678)
Outpt time (%) = 0 (0)
-Other time (%) = 0.229793 (39.1119)
+Other time (%) = 0.000339687 (4.6041)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15597 max 15508 min
Histogram: 1 0 0 0 1 1 0 0 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
3 -8156.1458 0 -1381.2949 57.89784 21.69 21.69
4 -8156.1458 0 -1381.2949 57.89784 21.69 21.69
-Loop time of 0.500844 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0270117 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.0300949 (6.00884)
+Pair time (%) = 0.00238228 (8.81943)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0840541 (16.7825)
-Outpt time (%) = 0.06286 (12.5508)
-Other time (%) = 0.323835 (64.6579)
+Comm time (%) = 0.000152051 (0.56291)
+Outpt time (%) = 0.000537992 (1.9917)
+Other time (%) = 0.0239394 (88.626)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15623 max 15488 min
Histogram: 1 1 0 0 0 0 0 1 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.consistency loop_i
change_box all x scale 1.001 remap
Changing box ...
orthogonal box = (-0.0578689 -10.845 -10.845) to (57.8979 10.845 10.845)
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7835 Mbytes
+Memory usage per processor = 24.3939 Mbytes
Step PotEng KinEng Press Lx Ly Lz
4 -8156.1033 0 -2755.9958 57.955738 21.69 21.69
5 -8156.1033 0 -2755.9958 57.955738 21.69 21.69
-Loop time of 0.402513 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.00779957 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8156.10329875 -8156.10329875 -8156.10329875
Force two-norm initial, final = 1.39476e-12 8.93933e-13
Force max component initial, final = 1.06757e-13 5.59136e-14
Final line search alpha, max atom move = 1 5.59136e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.0815714 (20.2655)
+Pair time (%) = 0.00691861 (88.7051)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.140636 (34.9394)
+Comm time (%) = 0.000525951 (6.74334)
Outpt time (%) = 0 (0)
-Other time (%) = 0.180306 (44.7951)
+Other time (%) = 0.000355005 (4.5516)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15563 max 15540 min
Histogram: 1 1 0 0 0 0 0 0 0 2
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
5 -8156.1033 0 -2755.9958 57.955738 21.69 21.69
6 -8156.1033 0 -2755.9958 57.955738 21.69 21.69
-Loop time of 0.375042 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0264152 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.0312517 (8.33286)
+Pair time (%) = 0.00239342 (9.06078)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0539653 (14.3892)
-Outpt time (%) = 0.0545159 (14.536)
-Other time (%) = 0.235309 (62.742)
+Comm time (%) = 0.000133872 (0.506799)
+Outpt time (%) = 0.000559568 (2.11836)
+Other time (%) = 0.0233284 (88.3141)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15650 max 15466 min
Histogram: 1 0 0 0 2 0 0 0 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.consistency loop_i
change_box all x scale 1.001 remap
Changing box ...
orthogonal box = (-0.0868468 -10.845 -10.845) to (57.9268 10.845 10.845)
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7835 Mbytes
+Memory usage per processor = 24.3939 Mbytes
Step PotEng KinEng Press Lx Ly Lz
6 -8156.0325 0 -4124.1199 58.013694 21.69 21.69
7 -8156.0325 0 -4124.1199 58.013694 21.69 21.69
-Loop time of 0.017836 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0174702 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8156.03247785 -8156.03247785 -8156.03247785
Force two-norm initial, final = 2.13199e-12 8.14844e-13
Force max component initial, final = 1.57712e-13 5.37209e-14
Final line search alpha, max atom move = 1 5.37209e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.0168754 (94.614)
+Pair time (%) = 0.00918466 (52.5732)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000489414 (2.74396)
+Comm time (%) = 0.00793743 (45.434)
Outpt time (%) = 0 (0)
-Other time (%) = 0.000471234 (2.64204)
+Other time (%) = 0.000348151 (1.99282)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15567 max 15532 min
Histogram: 1 0 0 0 0 0 2 0 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
7 -8156.0325 0 -4124.1199 58.013694 21.69 21.69
8 -8156.0325 0 -4124.1199 58.013694 21.69 21.69
-Loop time of 0.359948 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0306931 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.023981 (6.66237)
+Pair time (%) = 0.00241673 (7.87387)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0458988 (12.7515)
-Outpt time (%) = 0.0396805 (11.024)
-Other time (%) = 0.250387 (69.5621)
+Comm time (%) = 0.00014931 (0.486461)
+Outpt time (%) = 0.000558734 (1.82039)
+Other time (%) = 0.0275683 (89.8193)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15659 max 15491 min
Histogram: 2 0 0 1 0 0 0 0 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.consistency loop_i
change_box all x scale 1.001 remap
Changing box ...
orthogonal box = (-0.115854 -10.845 -10.845) to (57.9559 10.845 10.845)
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7835 Mbytes
+Memory usage per processor = 24.3939 Mbytes
Step PotEng KinEng Press Lx Ly Lz
8 -8155.9334 0 -5485.7179 58.071707 21.69 21.69
9 -8155.9334 0 -5485.7179 58.071707 21.69 21.69
-Loop time of 0.0175145 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.00740051 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8155.93340042 -8155.93340042 -8155.93340042
Force two-norm initial, final = 1.09341e-12 6.35419e-13
Force max component initial, final = 5.68295e-14 3.66235e-14
Final line search alpha, max atom move = 1 3.66235e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.0141963 (81.0543)
+Pair time (%) = 0.00672734 (90.9037)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000411749 (2.3509)
+Comm time (%) = 0.000369608 (4.99436)
Outpt time (%) = 0 (0)
-Other time (%) = 0.0029065 (16.5948)
+Other time (%) = 0.000303566 (4.10197)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15569 max 15539 min
Histogram: 1 0 0 1 1 0 0 0 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
9 -8155.9334 0 -5485.7179 58.071707 21.69 21.69
10 -8155.9334 0 -5485.7179 58.071707 21.69 21.69
-Loop time of 0.450115 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0298197 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.0389773 (8.65942)
+Pair time (%) = 0.00230974 (7.74568)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0733666 (16.2995)
-Outpt time (%) = 0.057173 (12.7019)
-Other time (%) = 0.280598 (62.3392)
+Comm time (%) = 0.000127435 (0.42735)
+Outpt time (%) = 0.000543535 (1.82274)
+Other time (%) = 0.026839 (90.0042)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15643 max 15487 min
Histogram: 1 0 0 2 0 0 0 0 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.consistency loop_i
change_box all x scale 1.001 remap
Changing box ...
orthogonal box = (-0.144889 -10.845 -10.845) to (57.9849 10.845 10.845)
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7835 Mbytes
+Memory usage per processor = 24.3939 Mbytes
Step PotEng KinEng Press Lx Ly Lz
10 -8155.8061 0 -6840.8461 58.129779 21.69 21.69
11 -8155.8061 0 -6840.8461 58.129779 21.69 21.69
-Loop time of 0.449937 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.00749213 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8155.80610648 -8155.80610648 -8155.80610648
Force two-norm initial, final = 1.05408e-12 6.84939e-13
Force max component initial, final = 5.43732e-14 3.31436e-14
Final line search alpha, max atom move = 1 3.31436e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.104361 (23.1945)
+Pair time (%) = 0.00674182 (89.9854)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.188499 (41.8945)
+Comm time (%) = 0.000442088 (5.9007)
Outpt time (%) = 0 (0)
-Other time (%) = 0.157078 (34.911)
+Other time (%) = 0.000308216 (4.11386)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15561 max 15539 min
Histogram: 1 0 0 0 0 1 0 1 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
11 -8155.8061 0 -6840.8461 58.129779 21.69 21.69
12 -8155.8061 0 -6840.8461 58.129779 21.69 21.69
-Loop time of 0.307091 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0287906 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.0184542 (6.00937)
+Pair time (%) = 0.00231099 (8.0269)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0285818 (9.30729)
-Outpt time (%) = 0.039631 (12.9053)
-Other time (%) = 0.220424 (71.778)
+Comm time (%) = 0.000124693 (0.433103)
+Outpt time (%) = 0.000560999 (1.94855)
+Other time (%) = 0.0257939 (89.5915)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15606 max 15482 min
Histogram: 1 0 1 0 0 0 0 0 0 2
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.consistency loop_i
change_box all x scale 1.001 remap
Changing box ...
orthogonal box = (-0.173954 -10.845 -10.845) to (58.014 10.845 10.845)
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7835 Mbytes
+Memory usage per processor = 24.3939 Mbytes
Step PotEng KinEng Press Lx Ly Lz
12 -8155.6506 0 -8189.4905 58.187909 21.69 21.69
13 -8155.6506 0 -8189.4905 58.187909 21.69 21.69
-Loop time of 0.00754917 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.00723547 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8155.65063641 -8155.65063641 -8155.65063641
Force two-norm initial, final = 1.14329e-12 6.31554e-13
Force max component initial, final = 7.85249e-14 4.52208e-14
Final line search alpha, max atom move = 1 4.52208e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.00676924 (89.6687)
+Pair time (%) = 0.00668997 (92.4607)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00040102 (5.31211)
+Comm time (%) = 0.000278592 (3.85037)
Outpt time (%) = 0 (0)
-Other time (%) = 0.000378907 (5.01919)
+Other time (%) = 0.00026691 (3.68891)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15560 max 15537 min
Histogram: 1 0 0 0 0 0 1 0 0 2
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
13 -8155.6506 0 -8189.4905 58.187909 21.69 21.69
14 -8155.6506 0 -8189.4905 58.187909 21.69 21.69
-Loop time of 0.280009 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0302983 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.0315212 (11.2572)
+Pair time (%) = 0.00238705 (7.87849)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0258814 (9.24305)
-Outpt time (%) = 0.0120553 (4.30532)
-Other time (%) = 0.210551 (75.1944)
+Comm time (%) = 0.000189543 (0.625589)
+Outpt time (%) = 0.00054127 (1.78647)
+Other time (%) = 0.0271804 (89.7095)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15642 max 15467 min
Histogram: 1 0 1 0 0 0 0 1 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.consistency loop_i
change_box all x scale 1.001 remap
Changing box ...
orthogonal box = (-0.203048 -10.845 -10.845) to (58.043 10.845 10.845)
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7835 Mbytes
+Memory usage per processor = 24.3939 Mbytes
Step PotEng KinEng Press Lx Ly Lz
14 -8155.467 0 -9531.6689 58.246097 21.69 21.69
15 -8155.467 0 -9531.6689 58.246097 21.69 21.69
-Loop time of 0.20262 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.00716096 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8155.46703122 -8155.46703122 -8155.46703122
Force two-norm initial, final = 1.009e-12 7.09731e-13
Force max component initial, final = 5.45874e-14 4.54584e-14
Final line search alpha, max atom move = 1 4.54584e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.0793063 (39.1404)
+Pair time (%) = 0.00665861 (92.9849)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.062916 (31.0512)
+Comm time (%) = 0.000261843 (3.65654)
Outpt time (%) = 0 (0)
-Other time (%) = 0.0603979 (29.8084)
+Other time (%) = 0.000240505 (3.35855)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15572 max 15532 min
Histogram: 1 0 1 0 0 0 0 1 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
15 -8155.467 0 -9531.6689 58.246097 21.69 21.69
16 -8155.467 0 -9531.6689 58.246097 21.69 21.69
-Loop time of 0.163192 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0295026 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.0239644 (14.6848)
+Pair time (%) = 0.00231427 (7.84428)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0332344 (20.3652)
-Outpt time (%) = 0.000598073 (0.366484)
-Other time (%) = 0.105395 (64.5835)
+Comm time (%) = 0.000127256 (0.431338)
+Outpt time (%) = 0.000540674 (1.83263)
+Other time (%) = 0.0265204 (89.8918)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15669 max 15428 min
Histogram: 1 0 0 1 0 0 0 1 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.consistency loop_i
change_box all x scale 1.001 remap
Changing box ...
orthogonal box = (-0.232171 -10.845 -10.845) to (58.0722 10.845 10.845)
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7835 Mbytes
+Memory usage per processor = 24.3939 Mbytes
Step PotEng KinEng Press Lx Ly Lz
16 -8155.2553 0 -10867.404 58.304343 21.69 21.69
17 -8155.2553 0 -10867.404 58.304343 21.69 21.69
-Loop time of 0.250275 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.00729674 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8155.25533188 -8155.25533188 -8155.25533188
Force two-norm initial, final = 1.43358e-12 7.91452e-13
Force max component initial, final = 8.69461e-14 3.39728e-14
Final line search alpha, max atom move = 1 3.39728e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.089587 (35.7955)
+Pair time (%) = 0.00673616 (92.3174)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.111741 (44.6472)
+Comm time (%) = 0.000291467 (3.99448)
Outpt time (%) = 0 (0)
-Other time (%) = 0.0489472 (19.5574)
+Other time (%) = 0.000269115 (3.68815)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15577 max 15529 min
Histogram: 2 0 0 0 0 0 0 0 1 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
17 -8155.2553 0 -10867.404 58.304343 21.69 21.69
18 -8155.2553 0 -10867.404 58.304343 21.69 21.69
-Loop time of 0.283027 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0300701 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.0023123 (0.816991)
+Pair time (%) = 0.00231802 (7.70874)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000139952 (0.0494482)
-Outpt time (%) = 0.039601 (13.992)
-Other time (%) = 0.240974 (85.1416)
+Comm time (%) = 0.000133276 (0.443218)
+Outpt time (%) = 0.000504851 (1.67892)
+Other time (%) = 0.0271139 (90.1691)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15638 max 15446 min
Histogram: 1 0 0 0 1 0 0 1 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.consistency loop_i
change_box all x scale 1.001 remap
Changing box ...
orthogonal box = (-0.261324 -10.845 -10.845) to (58.1013 10.845 10.845)
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7835 Mbytes
+Memory usage per processor = 24.3939 Mbytes
Step PotEng KinEng Press Lx Ly Lz
18 -8155.0156 0 -12196.682 58.362647 21.69 21.69
19 -8155.0156 0 -12196.682 58.362647 21.69 21.69
-Loop time of 0.437147 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.00723267 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8155.01558008 -8155.01558008 -8155.01558008
Force two-norm initial, final = 1.28582e-12 5.73333e-13
Force max component initial, final = 7.8125e-14 4.13116e-14
Final line search alpha, max atom move = 1 4.13116e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.0894799 (20.4691)
+Pair time (%) = 0.00670701 (92.7322)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.162141 (37.0906)
+Comm time (%) = 0.000286102 (3.9557)
Outpt time (%) = 0 (0)
-Other time (%) = 0.185526 (42.4403)
+Other time (%) = 0.000239551 (3.31207)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15592 max 15514 min
Histogram: 1 0 1 0 0 0 0 1 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
19 -8155.0156 0 -12196.682 58.362647 21.69 21.69
20 -8155.0156 0 -12196.682 58.362647 21.69 21.69
-Loop time of 0.0860269 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.029793 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.00462395 (5.375)
+Pair time (%) = 0.00234395 (7.86747)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0131851 (15.3268)
-Outpt time (%) = 0.0006001 (0.697572)
-Other time (%) = 0.0676177 (78.6007)
+Comm time (%) = 0.000127017 (0.426334)
+Outpt time (%) = 0.000502229 (1.68573)
+Other time (%) = 0.0268198 (90.0205)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15677 max 15419 min
Histogram: 1 0 0 1 0 0 1 0 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.consistency loop_i
change_box all x scale 1.001 remap
Changing box ...
orthogonal box = (-0.290505 -10.845 -10.845) to (58.1305 10.845 10.845)
minimize 1.e-10 1.e-10 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7835 Mbytes
+Memory usage per processor = 24.3939 Mbytes
Step PotEng KinEng Press Lx Ly Lz
20 -8154.7478 0 -13519.498 58.42101 21.69 21.69
21 -8154.7478 0 -13519.498 58.42101 21.69 21.69
-Loop time of 0.00747728 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.00742555 on 4 procs for 1 steps with 2304 atoms
Minimization stats:
Stopping criterion = energy tolerance
Energy initial, next-to-last, final =
-8154.74781829 -8154.74781829 -8154.74781829
Force two-norm initial, final = 1.23916e-12 7.54091e-13
Force max component initial, final = 6.14256e-14 4.77318e-14
Final line search alpha, max atom move = 1 4.77318e-14
Iterations, force evaluations = 1 2
-Pair time (%) = 0.00672746 (89.9719)
+Pair time (%) = 0.00676149 (91.0572)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000367939 (4.92076)
+Comm time (%) = 0.000382602 (5.15251)
Outpt time (%) = 0 (0)
-Other time (%) = 0.000381887 (5.1073)
+Other time (%) = 0.000281453 (3.79034)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15601 max 15502 min
Histogram: 1 0 1 0 0 0 0 1 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
velocity all set 0 0 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 22.7915 Mbytes
+Memory usage per processor = 23.4019 Mbytes
Step PotEng KinEng Press Lx Ly Lz
21 -8154.7478 0 -13519.498 58.42101 21.69 21.69
22 -8154.7478 0 -13519.498 58.42101 21.69 21.69
-Loop time of 0.407448 on 4 procs for 1 steps with 2304 atoms
+Loop time of 0.0303462 on 4 procs for 1 steps with 2304 atoms
-Pair time (%) = 0.0466059 (11.4385)
+Pair time (%) = 0.00235575 (7.76294)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0559623 (13.7348)
-Outpt time (%) = 0.0544453 (13.3625)
-Other time (%) = 0.250434 (61.4641)
+Comm time (%) = 0.00017184 (0.566267)
+Outpt time (%) = 0.000523746 (1.72591)
+Other time (%) = 0.0272948 (89.9449)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1692 ave 1692 max 1692 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 15552 ave 15703 max 15408 min
Histogram: 1 0 1 0 0 0 1 0 0 1
FullNghs: 31104 ave 31104 max 31104 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 124416
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.consistency loop_i
diff --git a/examples/USER/atc/hardy/eam_kernel_convergence.screen b/examples/USER/atc/hardy/eam_kernel_convergence.screen
index 4c6898839..006b4f5be 100644
--- a/examples/USER/atc/hardy/eam_kernel_convergence.screen
+++ b/examples/USER/atc/hardy/eam_kernel_convergence.screen
@@ -1,2573 +1,2455 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
log eam_kernel_convergence.log
units metal
dimension 3
boundary p p p
atom_style atomic
# create system
variable a equal 4.08
lattice fcc $a
lattice fcc 4.0800000000000000711
Lattice spacing in x,y,z = 4.08 4.08 4.08
region SYSTEM block -6 6 -6 6 -6 6
create_box 1 SYSTEM
Created orthogonal box = (-24.48 -24.48 -24.48) to (24.48 24.48 24.48)
1 by 2 by 2 MPI processor grid
create_atoms 1 region SYSTEM
Created 6912 atoms
mass 1 196.97
group internal region SYSTEM
6912 atoms in group internal
# n-th shell at sqrt(n/2) * a for FCC
# distances 1:2.9 2:4.1 3:5.1 4:5.8 5:6.5
# counts 1:12:12 2:6:18 3:24:42 4:12:54 5:24:78
pair_style eam
pair_coeff * * ../../../../potentials/Au_u3.eam
# specify neighbor/re-neighboring parameters
neighbor 0.3 bin
neigh_modify delay 1000000
thermo 10
thermo_style custom step ke pe pxx pyy pzz pxy
timestep 0.0
reset_timestep 0
velocity all set 0.0 0.0 0.0 sum no units box
fix ATC internal atc hardy
ATC: constructing kernel field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify ATC mesh create 1 1 1 SYSTEM p p p
ATC: created uniform mesh with 8 nodes, 1 unique nodes, and 1 elements
fix_modify ATC fields none
fix_modify ATC fields add mass_density stress number_density
##fix_modify ATC set reference_potential_energy
fix_modify ATC output eam_kernel_convergenceFE 1 text tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
##fix_modify ATC on_the_fly kernel on ## NOTE HACK REJ 8Jan13 temporary
##fix_modify ATC on_the_fly bond on
# relative to a
variable d equal 0.1
variable n equal 60
variable i loop $n
variable i loop 60
label loop_i
variable R equal $i*$d
variable R equal 1*$d
variable R equal 1*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 0.10000000000000000555*$a
variable Ra equal 0.10000000000000000555*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 0.40800000000000002931
# initial (1)
run 1
Setting up run ...
ATC: computing bond matrix .done
- ATC: kernel matrix bandwidth 0
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
0 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
1 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.300242 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.033035 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0241128 (8.03112)
+Pair time (%) = 0.00650418 (19.6887)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0410731 (13.68)
-Outpt time (%) = 0.0514653 (17.1413)
-Other time (%) = 0.183591 (61.1476)
+Comm time (%) = 0.00039655 (1.20039)
+Outpt time (%) = 0.000133812 (0.405062)
+Other time (%) = 0.0260005 (78.7058)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 2*$d
variable R equal 2*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 0.2000000000000000111*$a
variable Ra equal 0.2000000000000000111*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 0.81600000000000005862
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 0
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
1 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 0
2 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.48248 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0392294 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.084024 (17.415)
+Pair time (%) = 0.00644267 (16.4231)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.118364 (24.5323)
-Outpt time (%) = 0.0659893 (13.6771)
-Other time (%) = 0.214103 (44.3755)
+Comm time (%) = 0.000404775 (1.03182)
+Outpt time (%) = 0.000334024 (0.851465)
+Other time (%) = 0.0320479 (81.6937)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 3*$d
variable R equal 3*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 0.30000000000000004441*$a
variable Ra equal 0.30000000000000004441*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 1.224000000000000199
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 0
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
2 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 0
3 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.545094 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0384309 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.104079 (19.0937)
+Pair time (%) = 0.00651246 (16.9459)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.12345 (22.6474)
-Outpt time (%) = 0.0724639 (13.2938)
-Other time (%) = 0.245102 (44.9651)
+Comm time (%) = 0.000358164 (0.931969)
+Outpt time (%) = 0.000287235 (0.747405)
+Other time (%) = 0.0312731 (81.3747)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 4*$d
variable R equal 4*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 0.4000000000000000222*$a
variable Ra equal 0.4000000000000000222*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 1.6320000000000001172
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 0
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
3 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 0
4 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.386178 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0369787 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0569655 (14.7511)
+Pair time (%) = 0.00647753 (17.5169)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0992606 (25.7033)
-Outpt time (%) = 0.0438565 (11.3566)
-Other time (%) = 0.186095 (48.189)
+Comm time (%) = 0.000436544 (1.18053)
+Outpt time (%) = 0.000283301 (0.766119)
+Other time (%) = 0.0297813 (80.5364)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 5*$d
variable R equal 5*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 0.5*$a
variable Ra equal 0.5*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 2.0400000000000000355
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 0
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
4 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 0
5 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.535095 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0393946 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0920835 (17.2088)
+Pair time (%) = 0.00651276 (16.5321)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.173024 (32.3351)
-Outpt time (%) = 0.0531778 (9.938)
-Other time (%) = 0.21681 (40.5181)
+Comm time (%) = 0.000539005 (1.36822)
+Outpt time (%) = 0.000285983 (0.725945)
+Other time (%) = 0.0320569 (81.3737)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 6*$d
variable R equal 6*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 0.60000000000000008882*$a
variable Ra equal 0.60000000000000008882*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 2.4480000000000003979
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 0
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
5 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 0
6 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.201573 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.037346 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0382269 (18.9643)
+Pair time (%) = 0.0064882 (17.3732)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000640154 (0.317579)
-Outpt time (%) = 0.000263035 (0.130491)
-Other time (%) = 0.162443 (80.5877)
+Comm time (%) = 0.00043124 (1.15471)
+Outpt time (%) = 0.000279486 (0.74837)
+Other time (%) = 0.0301471 (80.7237)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 7*$d
variable R equal 7*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 0.70000000000000006661*$a
variable Ra equal 0.70000000000000006661*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 2.8560000000000003162
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 0
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
6 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 0
7 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.429407 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0372508 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.109139 (25.4161)
+Pair time (%) = 0.00648546 (17.4103)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.155901 (36.3062)
-Outpt time (%) = 0.000292003 (0.0680015)
-Other time (%) = 0.164075 (38.2097)
+Comm time (%) = 0.000456989 (1.22679)
+Outpt time (%) = 0.000291228 (0.781805)
+Other time (%) = 0.0300171 (80.5811)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 8*$d
variable R equal 8*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 0.80000000000000004441*$a
variable Ra equal 0.80000000000000004441*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 3.2640000000000002345
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 47
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
7 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 47
8 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.147352 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.120404 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00983864 (6.67697)
+Pair time (%) = 0.0264624 (21.9781)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00774616 (5.25691)
-Outpt time (%) = 0.000296652 (0.201322)
-Other time (%) = 0.129471 (87.8648)
+Comm time (%) = 0.0135617 (11.2636)
+Outpt time (%) = 0.0042749 (3.55048)
+Other time (%) = 0.0761046 (63.2079)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 9*$d
variable R equal 9*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 0.9000000000000000222*$a
variable Ra equal 0.9000000000000000222*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 3.6720000000000001528
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 47
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
8 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 47
9 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.118696 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.273495 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00697953 (5.88018)
+Pair time (%) = 0.0864977 (31.6268)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000497282 (0.418955)
-Outpt time (%) = 0.000273347 (0.230292)
-Other time (%) = 0.110946 (93.4706)
+Comm time (%) = 0.11316 (41.3756)
+Outpt time (%) = 0.00028652 (0.104762)
+Other time (%) = 0.0735507 (26.8928)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 10*$d
variable R equal 10*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 1*$a
variable Ra equal 1*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 4.0800000000000000711
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 47
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
9 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 47
10 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.402689 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0394507 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0666595 (16.5536)
+Pair time (%) = 0.00646698 (16.3926)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0105869 (2.62905)
-Outpt time (%) = 0.0670815 (16.6584)
-Other time (%) = 0.258361 (64.159)
+Comm time (%) = 0.000455558 (1.15475)
+Outpt time (%) = 0.000291586 (0.739115)
+Other time (%) = 0.0322366 (81.7136)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 11*$d
variable R equal 11*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 1.1000000000000000888*$a
variable Ra equal 1.1000000000000000888*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 4.4880000000000004334
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 288
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
10 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 288
11 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.307537 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0371261 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0362225 (11.7783)
+Pair time (%) = 0.00652719 (17.5811)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0385796 (12.5447)
-Outpt time (%) = 0.000294566 (0.0957824)
-Other time (%) = 0.23244 (75.5813)
+Comm time (%) = 0.000438929 (1.18227)
+Outpt time (%) = 0.000287414 (0.774156)
+Other time (%) = 0.0298725 (80.4624)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 12*$d
variable R equal 12*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 1.2000000000000001776*$a
variable Ra equal 1.2000000000000001776*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 4.8960000000000007958
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 288
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
11 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 288
12 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.3476 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0374072 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0432398 (12.4395)
+Pair time (%) = 0.00652391 (17.4403)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0443696 (12.7646)
-Outpt time (%) = 0.047818 (13.7566)
-Other time (%) = 0.212172 (61.0393)
+Comm time (%) = 0.000443697 (1.18613)
+Outpt time (%) = 0.000281215 (0.751767)
+Other time (%) = 0.0301583 (80.6218)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 13*$d
variable R equal 13*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 1.3000000000000000444*$a
variable Ra equal 1.3000000000000000444*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 5.30400000000000027
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 311
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
12 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 311
13 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.430106 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0368505 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.075536 (17.5622)
+Pair time (%) = 0.0064677 (17.5512)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0911922 (21.2023)
-Outpt time (%) = 0.048534 (11.2842)
-Other time (%) = 0.214844 (49.9513)
+Comm time (%) = 0.000371039 (1.00688)
+Outpt time (%) = 0.000283182 (0.768462)
+Other time (%) = 0.0297285 (80.6735)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 14*$d
variable R equal 14*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 1.4000000000000001332*$a
variable Ra equal 1.4000000000000001332*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 5.7120000000000006324
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 311
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
13 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 311
14 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.284159 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0370417 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0467392 (16.4483)
+Pair time (%) = 0.00647908 (17.4913)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0432881 (15.2337)
-Outpt time (%) = 0.000284493 (0.100118)
-Other time (%) = 0.193847 (68.2179)
+Comm time (%) = 0.000379324 (1.02405)
+Outpt time (%) = 0.00026685 (0.720404)
+Other time (%) = 0.0299165 (80.7642)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 15*$d
variable R equal 15*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 1.5*$a
variable Ra equal 1.5*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 6.1200000000000001066
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 312
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
14 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 312
15 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.352391 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0373898 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0567713 (16.1103)
+Pair time (%) = 0.00645733 (17.2703)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.055818 (15.8398)
-Outpt time (%) = 0.0249187 (7.07134)
-Other time (%) = 0.214883 (60.9785)
+Comm time (%) = 0.000376701 (1.0075)
+Outpt time (%) = 0.000305176 (0.816202)
+Other time (%) = 0.0302505 (80.906)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 16*$d
variable R equal 16*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 1.6000000000000000888*$a
variable Ra equal 1.6000000000000000888*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 6.528000000000000469
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 478
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
15 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 478
16 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.332613 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0384287 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0567642 (17.0661)
+Pair time (%) = 0.00648546 (16.8766)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0283655 (8.52808)
-Outpt time (%) = 0.026697 (8.02646)
-Other time (%) = 0.220786 (66.3793)
+Comm time (%) = 0.000369966 (0.962733)
+Outpt time (%) = 0.000295699 (0.769473)
+Other time (%) = 0.0312776 (81.3912)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 17*$d
variable R equal 17*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 1.7000000000000001776*$a
variable Ra equal 1.7000000000000001776*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 6.9360000000000008313
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 478
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
16 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 478
17 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.400051 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0371521 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0440897 (11.021)
+Pair time (%) = 0.00647396 (17.4256)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0782601 (19.5625)
-Outpt time (%) = 0.0452949 (11.3223)
-Other time (%) = 0.232406 (58.0941)
+Comm time (%) = 0.000393748 (1.05983)
+Outpt time (%) = 0.000291646 (0.785005)
+Other time (%) = 0.0299927 (80.7296)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 18*$d
variable R equal 18*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 1.8000000000000000444*$a
variable Ra equal 1.8000000000000000444*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 7.3440000000000003055
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 478
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
17 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 478
18 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.259991 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0386119 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00655723 (2.5221)
+Pair time (%) = 0.00645721 (16.7234)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0127867 (4.91813)
-Outpt time (%) = 0.0437278 (16.819)
-Other time (%) = 0.196919 (75.7408)
+Comm time (%) = 0.000380099 (0.984409)
+Outpt time (%) = 0.000285566 (0.73958)
+Other time (%) = 0.031489 (81.5526)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 19*$d
variable R equal 19*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 1.9000000000000001332*$a
variable Ra equal 1.9000000000000001332*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 7.7520000000000006679
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 503
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
18 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 503
19 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.310079 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.186472 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0415583 (13.4025)
+Pair time (%) = 0.0751666 (40.3099)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0384805 (12.4099)
-Outpt time (%) = 0.0133858 (4.31692)
-Other time (%) = 0.216654 (69.8707)
+Comm time (%) = 0.038013 (20.3854)
+Outpt time (%) = 0.00339681 (1.82162)
+Other time (%) = 0.0698953 (37.4831)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 20*$d
variable R equal 20*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 2*$a
variable Ra equal 2*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 8.1600000000000001421
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 503
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
19 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 503
20 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.19849 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.037857 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00919574 (4.63284)
+Pair time (%) = 0.00646615 (17.0805)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.011555 (5.82142)
-Outpt time (%) = 0.000275791 (0.138944)
-Other time (%) = 0.177464 (89.4068)
+Comm time (%) = 0.000383317 (1.01254)
+Outpt time (%) = 0.000252604 (0.66726)
+Other time (%) = 0.0307549 (81.2397)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 21*$d
variable R equal 21*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 2.1000000000000000888*$a
variable Ra equal 2.1000000000000000888*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 8.5680000000000013927
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 503
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
20 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 503
21 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.13786 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0382027 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00668496 (4.84911)
+Pair time (%) = 0.00654542 (17.1334)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000468671 (0.339963)
-Outpt time (%) = 0.00025773 (0.186951)
-Other time (%) = 0.130448 (94.624)
+Comm time (%) = 0.000404716 (1.05939)
+Outpt time (%) = 0.000296235 (0.77543)
+Other time (%) = 0.0309563 (81.0318)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 22*$d
variable R equal 22*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 2.2000000000000001776*$a
variable Ra equal 2.2000000000000001776*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 8.9760000000000008669
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 504
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
21 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 504
22 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.107814 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0389788 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00661451 (6.13514)
+Pair time (%) = 0.0065403 (16.7791)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000394523 (0.365931)
-Outpt time (%) = 0.000290513 (0.269459)
-Other time (%) = 0.100514 (93.2295)
+Comm time (%) = 0.000404239 (1.03707)
+Outpt time (%) = 0.000325084 (0.834001)
+Other time (%) = 0.0317092 (81.3498)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 23*$d
variable R equal 23*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 2.3000000000000002665*$a
variable Ra equal 2.3000000000000002665*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 9.3840000000000021174
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 504
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
22 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 504
23 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.108355 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0405288 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00665593 (6.14269)
+Pair time (%) = 0.00649828 (16.0337)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000427246 (0.394301)
-Outpt time (%) = 0.000290215 (0.267837)
-Other time (%) = 0.100982 (93.1952)
+Comm time (%) = 0.000369489 (0.911671)
+Outpt time (%) = 0.000311732 (0.769163)
+Other time (%) = 0.0333493 (82.2854)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 24*$d
variable R equal 24*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 2.4000000000000003553*$a
variable Ra equal 2.4000000000000003553*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 9.7920000000000015916
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 546
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
23 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 546
24 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.108156 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0378535 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00659281 (6.09565)
+Pair time (%) = 0.00653696 (17.2691)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000379384 (0.350774)
-Outpt time (%) = 0.000281692 (0.260449)
-Other time (%) = 0.100902 (93.2931)
+Comm time (%) = 0.000383198 (1.01232)
+Outpt time (%) = 0.00030303 (0.800534)
+Other time (%) = 0.0306303 (80.918)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 25*$d
variable R equal 25*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 2.5*$a
variable Ra equal 2.5*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 10.199999999999999289
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 546
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
24 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 546
25 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.340118 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0379782 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.047267 (13.8972)
+Pair time (%) = 0.00654668 (17.238)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0213372 (6.27346)
-Outpt time (%) = 0.0179818 (5.28692)
-Other time (%) = 0.253532 (74.5424)
+Comm time (%) = 0.000364423 (0.959559)
+Outpt time (%) = 0.000307202 (0.808892)
+Other time (%) = 0.0307599 (80.9936)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 26*$d
variable R equal 26*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 2.6000000000000000888*$a
variable Ra equal 2.6000000000000000888*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 10.60800000000000054
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 743
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
25 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 743
26 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.28821 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0379718 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.019009 (6.59554)
+Pair time (%) = 0.00648707 (17.0839)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000516176 (0.179097)
-Outpt time (%) = 0.0522387 (18.1252)
-Other time (%) = 0.216446 (75.1001)
+Comm time (%) = 0.000367403 (0.967568)
+Outpt time (%) = 0.000303447 (0.799139)
+Other time (%) = 0.0308139 (81.1494)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 27*$d
variable R equal 27*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 2.7000000000000001776*$a
variable Ra equal 2.7000000000000001776*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 11.016000000000001791
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 743
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
26 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 743
27 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.295394 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0380117 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0570537 (19.3145)
+Pair time (%) = 0.00650251 (17.1066)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0329895 (11.168)
-Outpt time (%) = 0.000254452 (0.0861399)
-Other time (%) = 0.205096 (69.4314)
+Comm time (%) = 0.00037688 (0.991484)
+Outpt time (%) = 0.000311494 (0.819468)
+Other time (%) = 0.0308208 (81.0825)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 28*$d
variable R equal 28*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 2.8000000000000002665*$a
variable Ra equal 2.8000000000000002665*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 11.424000000000001265
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 755
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
27 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 755
28 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.394992 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0388156 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0525671 (13.3084)
+Pair time (%) = 0.00649077 (16.7221)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.042494 (10.7582)
-Outpt time (%) = 0.0442644 (11.2064)
-Other time (%) = 0.255667 (64.727)
+Comm time (%) = 0.000387251 (0.997671)
+Outpt time (%) = 0.000288785 (0.743992)
+Other time (%) = 0.0316488 (81.5363)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 29*$d
variable R equal 29*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 2.9000000000000003553*$a
variable Ra equal 2.9000000000000003553*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 11.832000000000002515
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 755
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
28 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 755
29 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.32978 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0383511 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0278023 (8.43057)
+Pair time (%) = 0.00650549 (16.963)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0396687 (12.0288)
-Outpt time (%) = 0.0126302 (3.82989)
-Other time (%) = 0.249679 (75.7107)
+Comm time (%) = 0.000413597 (1.07845)
+Outpt time (%) = 0.000302076 (0.787661)
+Other time (%) = 0.0311299 (81.1709)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 30*$d
variable R equal 30*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 3*$a
variable Ra equal 3*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 12.240000000000000213
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 864
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
29 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 864
30 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.353342 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0388775 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0475768 (13.4648)
+Pair time (%) = 0.00645369 (16.6001)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.023629 (6.68727)
-Outpt time (%) = 0.000285506 (0.0808016)
-Other time (%) = 0.281851 (79.7672)
+Comm time (%) = 0.000415444 (1.0686)
+Outpt time (%) = 0.000338078 (0.869597)
+Other time (%) = 0.0316703 (81.4617)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 31*$d
variable R equal 31*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 3.1000000000000000888*$a
variable Ra equal 3.1000000000000000888*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 12.648000000000001464
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 910
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
30 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 910
31 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.278774 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0392246 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0142775 (5.12152)
+Pair time (%) = 0.00650924 (16.5948)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00300127 (1.0766)
-Outpt time (%) = 0.051642 (18.5247)
-Other time (%) = 0.209853 (75.2772)
+Comm time (%) = 0.000398636 (1.01629)
+Outpt time (%) = 0.00028348 (0.72271)
+Other time (%) = 0.0320332 (81.6662)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 32*$d
variable R equal 32*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 3.2000000000000001776*$a
variable Ra equal 3.2000000000000001776*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 13.056000000000000938
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 912
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
31 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 912
32 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.222321 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.041373 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0169145 (7.60813)
+Pair time (%) = 0.00652206 (15.764)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000565529 (0.254375)
-Outpt time (%) = 0.000303566 (0.136544)
-Other time (%) = 0.204538 (92.001)
+Comm time (%) = 0.000427663 (1.03368)
+Outpt time (%) = 0.000317514 (0.767442)
+Other time (%) = 0.0341058 (82.4348)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 33*$d
variable R equal 33*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 3.3000000000000002665*$a
variable Ra equal 3.3000000000000002665*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 13.464000000000002188
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 912
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
32 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 912
33 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.271986 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0391045 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0168534 (6.19641)
+Pair time (%) = 0.00647622 (16.5613)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000433564 (0.159407)
-Outpt time (%) = 0.0317252 (11.6643)
-Other time (%) = 0.222974 (81.9799)
+Comm time (%) = 0.00040257 (1.02947)
+Outpt time (%) = 0.000288963 (0.738952)
+Other time (%) = 0.0319367 (81.6702)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 34*$d
variable R equal 34*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 3.4000000000000003553*$a
variable Ra equal 3.4000000000000003553*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 13.872000000000001663
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 982
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
33 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 982
34 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.343778 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.039366 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.061799 (17.9764)
+Pair time (%) = 0.00648183 (16.4655)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.078127 (22.726)
-Outpt time (%) = 0.000294745 (0.085737)
-Other time (%) = 0.203557 (59.2119)
+Comm time (%) = 0.00038296 (0.972819)
+Outpt time (%) = 0.000316799 (0.804752)
+Other time (%) = 0.0321844 (81.7569)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 35*$d
variable R equal 35*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 3.5*$a
variable Ra equal 3.5*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 14.280000000000001137
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 982
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
34 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 982
35 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.171309 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0398639 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00657851 (3.84013)
+Pair time (%) = 0.00655723 (16.449)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000591993 (0.34557)
-Outpt time (%) = 0.000343978 (0.200794)
-Other time (%) = 0.163795 (95.6135)
+Comm time (%) = 0.000386298 (0.969042)
+Outpt time (%) = 0.000287056 (0.72009)
+Other time (%) = 0.0326333 (81.8618)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 36*$d
variable R equal 36*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 3.6000000000000000888*$a
variable Ra equal 3.6000000000000000888*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 14.688000000000000611
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 982
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
35 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 982
36 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.15479 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0398003 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0169563 (10.9544)
+Pair time (%) = 0.00647628 (16.2719)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000479996 (0.310095)
-Outpt time (%) = 0.00029999 (0.193804)
-Other time (%) = 0.137054 (88.5418)
+Comm time (%) = 0.00038147 (0.958458)
+Outpt time (%) = 0.000287831 (0.723187)
+Other time (%) = 0.0326548 (82.0464)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 37*$d
variable R equal 37*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 3.7000000000000001776*$a
variable Ra equal 3.7000000000000001776*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 15.096000000000001862
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 982
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
36 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 982
37 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.108144 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0403428 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0065847 (6.08884)
+Pair time (%) = 0.00645649 (16.0041)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000512004 (0.473447)
-Outpt time (%) = 0.000298738 (0.276242)
-Other time (%) = 0.100748 (93.1615)
+Comm time (%) = 0.000403762 (1.00083)
+Outpt time (%) = 0.000293553 (0.727646)
+Other time (%) = 0.033189 (82.2674)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 38*$d
variable R equal 38*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 3.8000000000000002665*$a
variable Ra equal 3.8000000000000002665*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 15.504000000000001336
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 982
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
37 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 982
38 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.365101 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0401198 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0161821 (4.43222)
+Pair time (%) = 0.00653249 (16.2824)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0784575 (21.4893)
-Outpt time (%) = 0.0112433 (3.0795)
-Other time (%) = 0.259218 (70.999)
+Comm time (%) = 0.00039041 (0.973111)
+Outpt time (%) = 0.000307977 (0.767643)
+Other time (%) = 0.0328889 (81.9768)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 39*$d
variable R equal 39*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 3.9000000000000003553*$a
variable Ra equal 3.9000000000000003553*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 15.912000000000002586
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 982
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
38 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 982
39 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.430036 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0405351 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0818088 (19.0237)
+Pair time (%) = 0.00647205 (15.9665)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0706595 (16.431)
-Outpt time (%) = 0.0469042 (10.907)
-Other time (%) = 0.230664 (53.6382)
+Comm time (%) = 0.000407696 (1.00578)
+Outpt time (%) = 0.000314474 (0.775807)
+Other time (%) = 0.0333409 (82.2519)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 40*$d
variable R equal 40*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 4*$a
variable Ra equal 4*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 16.320000000000000284
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1152
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
39 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1152
40 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.207975 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0404704 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00668073 (3.21227)
+Pair time (%) = 0.00648749 (16.0302)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00038588 (0.185542)
-Outpt time (%) = 0.000258744 (0.124411)
-Other time (%) = 0.20065 (96.4778)
+Comm time (%) = 0.000388265 (0.95938)
+Outpt time (%) = 0.000284553 (0.703113)
+Other time (%) = 0.0333101 (82.3073)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 41*$d
variable R equal 41*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 4.1000000000000005329*$a
variable Ra equal 4.1000000000000005329*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 16.728000000000001535
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1175
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
40 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1175
41 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.410035 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0425766 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.07674 (18.7155)
+Pair time (%) = 0.00662249 (15.5543)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0558463 (13.6199)
-Outpt time (%) = 0.0472893 (11.533)
-Other time (%) = 0.230159 (56.1316)
+Comm time (%) = 0.000389457 (0.914721)
+Outpt time (%) = 0.000304043 (0.71411)
+Other time (%) = 0.0352606 (82.8168)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 42*$d
variable R equal 42*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 4.2000000000000001776*$a
variable Ra equal 4.2000000000000001776*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 17.136000000000002785
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1176
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
41 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1176
42 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.569466 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0414016 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0682225 (11.9801)
+Pair time (%) = 0.00649077 (15.6776)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0417059 (7.32369)
-Outpt time (%) = 0.0824587 (14.48)
-Other time (%) = 0.377079 (66.2162)
+Comm time (%) = 0.000381052 (0.920381)
+Outpt time (%) = 0.00030756 (0.742869)
+Other time (%) = 0.0342222 (82.6592)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 43*$d
variable R equal 43*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 4.2999999999999998224*$a
variable Ra equal 4.2999999999999998224*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 17.544000000000000483
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1187
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
42 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1187
43 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.349966 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0421495 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0566317 (16.1821)
+Pair time (%) = 0.0065133 (15.4529)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0434393 (12.4124)
-Outpt time (%) = 0.0316042 (9.03066)
-Other time (%) = 0.218291 (62.3749)
+Comm time (%) = 0.000412405 (0.978433)
+Outpt time (%) = 0.000315487 (0.748496)
+Other time (%) = 0.0349083 (82.8202)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 44*$d
variable R equal 44*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 4.4000000000000003553*$a
variable Ra equal 4.4000000000000003553*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 17.952000000000001734
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1211
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
43 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1211
44 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.392429 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0428472 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0517555 (13.1885)
+Pair time (%) = 0.00656044 (15.3113)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0731887 (18.6502)
-Outpt time (%) = 0.045777 (11.665)
-Other time (%) = 0.221708 (56.4963)
+Comm time (%) = 0.000398517 (0.930089)
+Outpt time (%) = 0.000325501 (0.759679)
+Other time (%) = 0.0355627 (82.999)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 45*$d
variable R equal 45*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 4.5*$a
variable Ra equal 4.5*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 18.359999999999999432
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1211
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
44 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1211
45 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.288743 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0420851 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0428154 (14.8282)
+Pair time (%) = 0.0066309 (15.7559)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0185749 (6.43302)
-Outpt time (%) = 0.0170892 (5.91848)
-Other time (%) = 0.210263 (72.8203)
+Comm time (%) = 0.000450253 (1.06987)
+Outpt time (%) = 0.000315428 (0.749501)
+Other time (%) = 0.0346885 (82.4247)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 46*$d
variable R equal 46*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 4.6000000000000005329*$a
variable Ra equal 4.6000000000000005329*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 18.768000000000004235
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1342
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
45 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1342
46 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.476904 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0420685 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0492818 (10.3337)
+Pair time (%) = 0.00649852 (15.4475)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0432622 (9.07147)
-Outpt time (%) = 0.040977 (8.5923)
-Other time (%) = 0.343383 (72.0025)
+Comm time (%) = 0.000382423 (0.90905)
+Outpt time (%) = 0.000275671 (0.655292)
+Other time (%) = 0.0349119 (82.9882)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 47*$d
variable R equal 47*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 4.7000000000000001776*$a
variable Ra equal 4.7000000000000001776*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 19.176000000000001933
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1367
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
46 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1367
47 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.131054 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0450137 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0091778 (7.00306)
+Pair time (%) = 0.00665849 (14.7922)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00810724 (6.18618)
-Outpt time (%) = 0.000286102 (0.218308)
-Other time (%) = 0.113483 (86.5925)
+Comm time (%) = 0.000468254 (1.04025)
+Outpt time (%) = 0.000276983 (0.61533)
+Other time (%) = 0.0376099 (83.5523)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 48*$d
variable R equal 48*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 4.8000000000000007105*$a
variable Ra equal 4.8000000000000007105*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 19.584000000000003183
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1368
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
47 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1368
48 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.324749 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0446415 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.036183 (11.1418)
+Pair time (%) = 0.0066427 (14.8801)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0234717 (7.22765)
-Outpt time (%) = 0.0480435 (14.7941)
-Other time (%) = 0.217051 (66.8365)
+Comm time (%) = 0.000487983 (1.09312)
+Outpt time (%) = 0.000266016 (0.595893)
+Other time (%) = 0.0372448 (83.4309)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 49*$d
variable R equal 49*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 4.9000000000000003553*$a
variable Ra equal 4.9000000000000003553*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 19.992000000000000881
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1410
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
48 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1410
49 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.36251 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0425613 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0491887 (13.5689)
+Pair time (%) = 0.0065003 (15.2728)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0482228 (13.3025)
-Outpt time (%) = 0.0454938 (12.5497)
-Other time (%) = 0.219605 (60.5789)
+Comm time (%) = 0.000373781 (0.878218)
+Outpt time (%) = 0.000287056 (0.674453)
+Other time (%) = 0.0354002 (83.1745)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 50*$d
variable R equal 50*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 5*$a
variable Ra equal 5*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 20.399999999999998579
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1414
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
49 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1414
50 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.377475 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.042306 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.056691 (15.0185)
+Pair time (%) = 0.00660574 (15.6142)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0432966 (11.4701)
-Outpt time (%) = 0.0455235 (12.06)
-Other time (%) = 0.231963 (61.4514)
+Comm time (%) = 0.000434875 (1.02793)
+Outpt time (%) = 0.000267565 (0.632452)
+Other time (%) = 0.0349978 (82.7254)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 51*$d
variable R equal 51*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 5.1000000000000005329*$a
variable Ra equal 5.1000000000000005329*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 20.808000000000003382
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1414
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
50 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1414
51 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.342563 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.042854 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0467207 (13.6386)
+Pair time (%) = 0.00650024 (15.1683)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0359398 (10.4914)
-Outpt time (%) = 0.0465243 (13.5812)
-Other time (%) = 0.213379 (62.2888)
+Comm time (%) = 0.000383735 (0.895446)
+Outpt time (%) = 0.00028801 (0.672072)
+Other time (%) = 0.035682 (83.2641)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 52*$d
variable R equal 52*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 5.2000000000000001776*$a
variable Ra equal 5.2000000000000001776*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 21.21600000000000108
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1416
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
51 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1416
52 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.360143 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0434695 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0467206 (12.9728)
+Pair time (%) = 0.00649798 (14.9484)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0333865 (9.27036)
-Outpt time (%) = 0.046984 (13.0459)
-Other time (%) = 0.233052 (64.7109)
+Comm time (%) = 0.000384271 (0.884002)
+Outpt time (%) = 0.00029546 (0.679696)
+Other time (%) = 0.0362918 (83.4879)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 53*$d
variable R equal 53*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 5.3000000000000007105*$a
variable Ra equal 5.3000000000000007105*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 21.624000000000002331
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1437
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
52 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1437
53 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.342496 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0440991 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0341545 (9.97222)
+Pair time (%) = 0.00655478 (14.8638)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0283093 (8.26558)
-Outpt time (%) = 0.0456939 (13.3414)
-Other time (%) = 0.234339 (68.4208)
+Comm time (%) = 0.00037545 (0.851377)
+Outpt time (%) = 0.000291467 (0.660936)
+Other time (%) = 0.0368774 (83.6239)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 54*$d
variable R equal 54*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 5.4000000000000003553*$a
variable Ra equal 5.4000000000000003553*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 22.032000000000003581
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1437
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
53 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1437
54 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.350093 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0451357 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0466567 (13.3269)
+Pair time (%) = 0.00653124 (14.4702)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0359852 (10.2788)
-Outpt time (%) = 0.0534886 (15.2784)
-Other time (%) = 0.213963 (61.1159)
+Comm time (%) = 0.000422835 (0.93681)
+Outpt time (%) = 0.000314355 (0.696467)
+Other time (%) = 0.0378672 (83.8965)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 55*$d
variable R equal 55*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 5.5*$a
variable Ra equal 5.5*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 22.440000000000001279
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1486
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
54 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1486
55 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.283023 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0437731 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0466025 (16.466)
+Pair time (%) = 0.00654078 (14.9425)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0382988 (13.5321)
-Outpt time (%) = 0.0156633 (5.53429)
-Other time (%) = 0.182458 (64.4677)
+Comm time (%) = 0.000398755 (0.91096)
+Outpt time (%) = 0.000291765 (0.66654)
+Other time (%) = 0.0365418 (83.48)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 56*$d
variable R equal 56*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 5.6000000000000005329*$a
variable Ra equal 5.6000000000000005329*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 22.84800000000000253
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1607
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
55 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1607
56 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.200101 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0435703 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.00681722 (3.40689)
+Pair time (%) = 0.00649369 (14.9039)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.010536 (5.26532)
-Outpt time (%) = 0.0104398 (5.21724)
-Other time (%) = 0.172308 (86.1106)
+Comm time (%) = 0.000383556 (0.880315)
+Outpt time (%) = 0.000293911 (0.674566)
+Other time (%) = 0.0363991 (83.5412)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 57*$d
variable R equal 57*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 5.7000000000000001776*$a
variable Ra equal 5.7000000000000001776*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 23.256000000000000227
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1619
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
56 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1619
57 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.34729 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0463326 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0140542 (4.04683)
+Pair time (%) = 0.00662327 (14.2951)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00326961 (0.941463)
-Outpt time (%) = 0.0595106 (17.1357)
-Other time (%) = 0.270456 (77.876)
+Comm time (%) = 0.00039655 (0.855876)
+Outpt time (%) = 0.000284076 (0.613123)
+Other time (%) = 0.0390287 (84.236)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 58*$d
variable R equal 58*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 5.8000000000000007105*$a
variable Ra equal 5.8000000000000007105*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 23.664000000000005031
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1641
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
57 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1641
58 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.38494 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.048007 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.05675 (14.7426)
+Pair time (%) = 0.0065155 (13.572)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0333247 (8.6571)
-Outpt time (%) = 0.0447482 (11.6247)
-Other time (%) = 0.250117 (64.9756)
+Comm time (%) = 0.000366092 (0.76258)
+Outpt time (%) = 0.000288963 (0.601919)
+Other time (%) = 0.0408365 (85.0635)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 59*$d
variable R equal 59*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 5.9000000000000003553*$a
variable Ra equal 5.9000000000000003553*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 24.072000000000002728
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1643
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
58 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1643
59 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.412444 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0455515 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0535668 (12.9876)
+Pair time (%) = 0.00648105 (14.228)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0633941 (15.3703)
-Outpt time (%) = 0.0569338 (13.804)
-Other time (%) = 0.23855 (57.838)
+Comm time (%) = 0.0003708 (0.814024)
+Outpt time (%) = 0.000300467 (0.65962)
+Other time (%) = 0.0383992 (84.2984)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
variable R equal $i*$d
variable R equal 60*$d
variable R equal 60*0.10000000000000000555
variable Ra equal $R*$a
variable Ra equal 6*$a
variable Ra equal 6*4.0800000000000000711
fix_modify ATC kernel quartic_sphere ${Ra}
fix_modify ATC kernel quartic_sphere 24.480000000000000426
# initial (1)
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1643
ATC: computing bond matrix .done
Memory usage per processor = 18.2282 Mbytes
Step KinEng PotEng Pxx Pyy Pzz Pxy
59 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
- ATC: kernel matrix bandwidth 1643
60 0 -27164.16 0.0224632 0.0224632 0.0224632 -3.0464385e-13
-Loop time of 0.247306 on 4 procs for 1 steps with 6912 atoms
+Loop time of 0.0462273 on 4 procs for 1 steps with 6912 atoms
-Pair time (%) = 0.0260277 (10.5245)
+Pair time (%) = 0.00654 (14.1475)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000401855 (0.162493)
-Outpt time (%) = 0.00262171 (1.06011)
-Other time (%) = 0.218255 (88.2529)
+Comm time (%) = 0.000392854 (0.849831)
+Outpt time (%) = 0.000321984 (0.696524)
+Other time (%) = 0.0389725 (84.3062)
Nlocal: 1728 ave 1728 max 1728 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2463 ave 2463 max 2463 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46656 ave 46656 max 46656 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 93312 ave 93312 max 93312 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 373248
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
next i
jump in.eam_kernel_convergence loop_i
diff --git a/examples/USER/atc/hardy/eam_unistrain_cell.screen b/examples/USER/atc/hardy/eam_unistrain_cell.screen
index fed2279a3..6281077b6 100644
--- a/examples/USER/atc/hardy/eam_unistrain_cell.screen
+++ b/examples/USER/atc/hardy/eam_unistrain_cell.screen
@@ -1,72 +1,71 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Lattice spacing in x,y,z = 3.615 3.615 3.615
Created orthogonal box = (-65.07 -10.845 -10.845) to (65.07 10.845 10.845)
4 by 1 by 1 MPI processor grid
Created 4896 atoms
4608 atoms in group internal
ATC: constructing kernel field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: created uniform mesh with 40 nodes, 10 unique nodes, and 9 elements
Setting up run ...
ATC: Warning: Using native lammps partitioning
ATC: computing bond matrix ..........done
Memory usage per processor = 34.3603 Mbytes
Step PotEng KinEng Press Lx Ly Lz
0 -17256.022 0 -2117.8338 130.14 21.69 21.69
1 -17256.022 0 -2117.8338 130.14 21.69 21.69
-Loop time of 0.210032 on 4 procs for 1 steps with 4896 atoms
+Loop time of 0.00486255 on 4 procs for 1 steps with 4896 atoms
-Pair time (%) = 0.0401667 (19.1241)
+Pair time (%) = 0.00441444 (90.7845)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.099825 (47.5285)
-Outpt time (%) = 0.0599867 (28.5608)
-Other time (%) = 0.0100535 (4.78663)
+Comm time (%) = 0.000329494 (6.77617)
+Outpt time (%) = 6.47902e-05 (1.33243)
+Other time (%) = 5.3823e-05 (1.10689)
Nlocal: 1224 ave 1296 max 1152 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 2259 ave 2592 max 1926 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 32508 ave 34992 max 29952 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 65016 ave 69984 max 60048 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 260064
Ave neighs/atom = 53.1176
Neighbor list builds = 0
Dangerous builds = 0
Displacing atoms ...
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
- ATC: kernel matrix bandwidth 1005
ATC: Warning: Using native lammps partitioning
ATC: computing bond matrix ..........done
Memory usage per processor = 34.3603 Mbytes
Step PotEng KinEng Press Lx Ly Lz
1 -17252.771 0 -14787.592 130.14 21.69 21.69
- ATC: kernel matrix bandwidth 1005
ATC: Warning: Using native lammps partitioning
2 -17252.771 0 -14787.592 130.14 21.69 21.69
-Loop time of 0.306944 on 4 procs for 1 steps with 4896 atoms
+Loop time of 0.0539712 on 4 procs for 1 steps with 4896 atoms
-Pair time (%) = 0.0369428 (12.0357)
+Pair time (%) = 0.00456005 (8.44905)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0419495 (13.6668)
-Outpt time (%) = 0.000748515 (0.243861)
-Other time (%) = 0.227303 (74.0536)
+Comm time (%) = 0.000343502 (0.636454)
+Outpt time (%) = 0.000622272 (1.15297)
+Other time (%) = 0.0484453 (89.7615)
Nlocal: 1224 ave 1296 max 1152 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 2259 ave 2592 max 1926 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 32508 ave 34992 max 29952 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 65016 ave 69984 max 60048 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 260064
Ave neighs/atom = 53.1176
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/hardy/eam_unistrain_mesh.screen b/examples/USER/atc/hardy/eam_unistrain_mesh.screen
index 08b2d5fc2..b8282fcc2 100644
--- a/examples/USER/atc/hardy/eam_unistrain_mesh.screen
+++ b/examples/USER/atc/hardy/eam_unistrain_mesh.screen
@@ -1,110 +1,111 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
log eam_unistrain_mesh
units metal
atom_style atomic
# create domain
lattice fcc 3.615 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 3.615 3.615 3.615
region simRegion block -18 18 -3 3 -3 3
region feRegion block -18 18 -3 3 -3 3
boundary f p p
create_box 1 simRegion
Created orthogonal box = (-65.07 -10.845 -10.845) to (65.07 10.845 10.845)
4 by 1 by 1 MPI processor grid
# create atoms
region mdRegion block -17 17 -3 3 -3 3
create_atoms 1 region mdRegion
Created 4896 atoms
mass 1 63.550
atom_modify sort 0 1
# specify interal atoms
region mdInternal block -16 16 -3 3 -3 3
group internal region mdInternal
4608 atoms in group internal
# specify inter-atomic potential
pair_style eam
pair_coeff * * ../../../../potentials/Cu_u3.eam
# specify neighbor/re-neighboring parameters
neighbor 0.3 bin
neigh_modify every 10 delay 0 check no
# setup thermal output
thermo 10
thermo_style custom step pe ke press lx ly lz
# ID group atc PhysicsType ParameterFile
fix AtC internal atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
# fix_modify AtC atom_element_map eulerian 1
fix_modify AtC fields none
fix_modify AtC fields add mass_density displacement stress internal_energy
fix_modify AtC gradients add displacement
fix_modify AtC fields add rotation stretch
# fix_modify AtC on_the_fly kernel on
# ID part keywords nx ny nz region
fix_modify AtC mesh create 9 1 1 feRegion f p p
ATC: created uniform mesh with 40 nodes, 10 unique nodes, and 9 elements
#fix_modify AtC mesh data_decomposition
timestep 0.001
reset_timestep 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 22.0758 Mbytes
Step PotEng KinEng Press Lx Ly Lz
0 -17256.022 0 -2117.8338 130.14 21.69 21.69
1 -17256.022 0 -2117.8338 130.14 21.69 21.69
-Loop time of 0.00487894 on 4 procs for 1 steps with 4896 atoms
+Loop time of 0.00506258 on 4 procs for 1 steps with 4896 atoms
-Pair time (%) = 0.00441378 (90.4661)
+Pair time (%) = 0.00451952 (89.2731)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000346899 (7.11013)
-Outpt time (%) = 5.80549e-05 (1.18991)
-Other time (%) = 6.02007e-05 (1.23389)
+Comm time (%) = 0.000392973 (7.76232)
+Outpt time (%) = 6.66976e-05 (1.31746)
+Other time (%) = 8.33869e-05 (1.64712)
Nlocal: 1224 ave 1296 max 1152 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 2259 ave 2592 max 1926 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 32508 ave 34992 max 29952 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 65016 ave 69984 max 60048 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 260064
Ave neighs/atom = 53.1176
Neighbor list builds = 0
Dangerous builds = 0
displace_atoms all ramp x -0.6507 0.6507 x -65.07 65.07
Displacing atoms ...
fix_modify AtC output eam_unistrain_meshFE 1 text tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 22.0758 Mbytes
Step PotEng KinEng Press Lx Ly Lz
1 -17252.771 0 -14787.592 130.14 21.69 21.69
2 -17252.771 0 -14787.592 130.14 21.69 21.69
-Loop time of 0.382469 on 4 procs for 1 steps with 4896 atoms
+Loop time of 0.0604315 on 4 procs for 1 steps with 4896 atoms
-Pair time (%) = 0.0254062 (6.64269)
+Pair time (%) = 0.00473583 (7.83668)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0194529 (5.08613)
-Outpt time (%) = 0.0317523 (8.30192)
-Other time (%) = 0.305858 (79.9693)
+Comm time (%) = 0.000427365 (0.707189)
+Outpt time (%) = 0.000815749 (1.34987)
+Other time (%) = 0.0544526 (90.1063)
Nlocal: 1224 ave 1296 max 1152 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 2259 ave 2592 max 1926 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 32508 ave 34992 max 29952 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 65016 ave 69984 max 60048 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 260064
Ave neighs/atom = 53.1176
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/hardy/eam_unistrain_qcylinder.screen b/examples/USER/atc/hardy/eam_unistrain_qcylinder.screen
index d95189d5a..dcd124df0 100644
--- a/examples/USER/atc/hardy/eam_unistrain_qcylinder.screen
+++ b/examples/USER/atc/hardy/eam_unistrain_qcylinder.screen
@@ -1,69 +1,68 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Lattice spacing in x,y,z = 3.615 3.615 3.615
Created orthogonal box = (-65.07 -10.845 -10.845) to (65.07 10.845 10.845)
4 by 1 by 1 MPI processor grid
Created 4896 atoms
4608 atoms in group internal
ATC: constructing kernel field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: created uniform mesh with 40 nodes, 10 unique nodes, and 9 elements
Setting up run ...
ATC: computing bond matrix ..........done
Memory usage per processor = 34.3603 Mbytes
Step PotEng KinEng Press Lx Ly Lz
0 -17256.022 0 -2117.8338 130.14 21.69 21.69
1 -17256.022 0 -2117.8338 130.14 21.69 21.69
-Loop time of 0.22 on 4 procs for 1 steps with 4896 atoms
+Loop time of 0.00503868 on 4 procs for 1 steps with 4896 atoms
-Pair time (%) = 0.0452225 (20.5557)
+Pair time (%) = 0.00448877 (89.0862)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.107069 (48.6676)
-Outpt time (%) = 0.0576439 (26.2018)
-Other time (%) = 0.0100647 (4.57488)
+Comm time (%) = 0.000422835 (8.39179)
+Outpt time (%) = 5.97835e-05 (1.18649)
+Other time (%) = 6.72936e-05 (1.33554)
Nlocal: 1224 ave 1296 max 1152 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 2259 ave 2592 max 1926 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 32508 ave 34992 max 29952 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 65016 ave 69984 max 60048 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 260064
Ave neighs/atom = 53.1176
Neighbor list builds = 0
Dangerous builds = 0
Displacing atoms ...
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
- ATC: kernel matrix bandwidth 1005
ATC: computing bond matrix ..........done
Memory usage per processor = 34.3603 Mbytes
Step PotEng KinEng Press Lx Ly Lz
1 -17252.771 0 -14787.592 130.14 21.69 21.69
- ATC: kernel matrix bandwidth 1005
2 -17252.771 0 -14787.592 130.14 21.69 21.69
-Loop time of 0.224722 on 4 procs for 1 steps with 4896 atoms
+Loop time of 0.0590639 on 4 procs for 1 steps with 4896 atoms
-Pair time (%) = 0.00557947 (2.48283)
+Pair time (%) = 0.0045597 (7.71994)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00455528 (2.02708)
-Outpt time (%) = 0.000734568 (0.326878)
-Other time (%) = 0.213853 (95.1632)
+Comm time (%) = 0.000361979 (0.61286)
+Outpt time (%) = 0.000646472 (1.09453)
+Other time (%) = 0.0534958 (90.5727)
Nlocal: 1224 ave 1296 max 1152 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 2259 ave 2592 max 1926 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 32508 ave 34992 max 29952 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 65016 ave 69984 max 60048 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 260064
Ave neighs/atom = 53.1176
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/hardy/eam_unistrain_qsphere.screen b/examples/USER/atc/hardy/eam_unistrain_qsphere.screen
index f8befbecf..e0db751d2 100644
--- a/examples/USER/atc/hardy/eam_unistrain_qsphere.screen
+++ b/examples/USER/atc/hardy/eam_unistrain_qsphere.screen
@@ -1,67 +1,68 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Lattice spacing in x,y,z = 3.615 3.615 3.615
Created orthogonal box = (-65.07 -10.845 -10.845) to (65.07 10.845 10.845)
4 by 1 by 1 MPI processor grid
Created 4896 atoms
4608 atoms in group internal
ATC: constructing kernel field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: created uniform mesh with 40 nodes, 10 unique nodes, and 9 elements
Setting up run ...
ATC: computing bond matrix ..........done
Memory usage per processor = 12.3855 Mbytes
Step PotEng KinEng Press Lx Ly Lz
0 -17256.022 0 -2117.8338 130.14 21.69 21.69
1 -17256.022 0 -2117.8338 130.14 21.69 21.69
-Loop time of 0.13748 on 4 procs for 1 steps with 4896 atoms
+Loop time of 0.00496483 on 4 procs for 1 steps with 4896 atoms
-Pair time (%) = 0.0405408 (29.4885)
+Pair time (%) = 0.00444251 (89.4797)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0661281 (48.1002)
-Outpt time (%) = 0.0133058 (9.67834)
-Other time (%) = 0.0175053 (12.733)
+Comm time (%) = 0.000396073 (7.97757)
+Outpt time (%) = 6.84857e-05 (1.37942)
+Other time (%) = 5.77569e-05 (1.16332)
Nlocal: 1224 ave 1296 max 1152 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 2259 ave 2592 max 1926 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 32508 ave 34992 max 29952 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 65016 ave 69984 max 60048 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 260064
Ave neighs/atom = 53.1176
Neighbor list builds = 0
Dangerous builds = 0
Displacing atoms ...
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: computing bond matrix ..........done
Memory usage per processor = 12.3855 Mbytes
Step PotEng KinEng Press Lx Ly Lz
1 -17252.771 0 -14787.592 130.14 21.69 21.69
2 -17252.771 0 -14787.592 130.14 21.69 21.69
-Loop time of 0.444931 on 4 procs for 1 steps with 4896 atoms
+Loop time of 0.0662808 on 4 procs for 1 steps with 4896 atoms
-Pair time (%) = 0.0429311 (9.64893)
+Pair time (%) = 0.00459045 (6.92576)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0753596 (16.9374)
-Outpt time (%) = 0.0446068 (10.0256)
-Other time (%) = 0.282034 (63.3881)
+Comm time (%) = 0.000395298 (0.596399)
+Outpt time (%) = 0.000612199 (0.923644)
+Other time (%) = 0.0606829 (91.5542)
Nlocal: 1224 ave 1296 max 1152 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 2259 ave 2592 max 1926 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 32508 ave 34992 max 29952 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 65016 ave 69984 max 60048 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 260064
Ave neighs/atom = 53.1176
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/hardy/eam_unistrain_step.screen b/examples/USER/atc/hardy/eam_unistrain_step.screen
index 8f922fd5d..d1a5c1c18 100644
--- a/examples/USER/atc/hardy/eam_unistrain_step.screen
+++ b/examples/USER/atc/hardy/eam_unistrain_step.screen
@@ -1,111 +1,110 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style atomic
# create domain
lattice fcc 3.615 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 3.615 3.615 3.615
region simRegion block -18 18 -3 3 -3 3
region feRegion block -18 18 -3 3 -3 3
boundary f p p
create_box 1 simRegion
Created orthogonal box = (-65.07 -10.845 -10.845) to (65.07 10.845 10.845)
4 by 1 by 1 MPI processor grid
# create atoms
region mdRegion block -17 17 -3 3 -3 3
create_atoms 1 region mdRegion
Created 4896 atoms
mass 1 63.550
# specify interal atoms
region mdInternal block -16 16 -3 3 -3 3
group internal region mdInternal
4608 atoms in group internal
# specify inter-atomic potential
pair_style eam
pair_coeff * * ../../../../potentials/Cu_u3.eam
# specify neighbor/re-neighboring parameters
neighbor 0.3 bin
neigh_modify every 10 delay 0 check no
# setup thermal output
thermo 10
thermo_style custom step pe ke press lx ly lz
# ID group atc PhysicsType ParameterFile
fix AtC internal atc hardy
ATC: constructing kernel field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC kernel step 9.0375
# fix_modify AtC atom_element_map eulerian 1
fix_modify AtC fields none
fix_modify AtC fields add mass_density displacement stress internal_energy
fix_modify AtC gradients add displacement
# fix_modify AtC on_the_fly kernel on
# fix_modify AtC on_the_fly bond on
# ID part keywords nx ny nz region
fix_modify AtC mesh create 9 1 1 feRegion f p p
ATC: created uniform mesh with 40 nodes, 10 unique nodes, and 9 elements
# equilibrate MD field
timestep 0.001
reset_timestep 0
run 1
Setting up run ...
ATC: computing bond matrix ..........done
Memory usage per processor = 34.3603 Mbytes
Step PotEng KinEng Press Lx Ly Lz
0 -17256.022 0 -2117.8338 130.14 21.69 21.69
1 -17256.022 0 -2117.8338 130.14 21.69 21.69
-Loop time of 0.172684 on 4 procs for 1 steps with 4896 atoms
+Loop time of 0.00508612 on 4 procs for 1 steps with 4896 atoms
-Pair time (%) = 0.026729 (15.4786)
+Pair time (%) = 0.00453597 (89.1833)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.082336 (47.6802)
-Outpt time (%) = 0.045118 (26.1275)
-Other time (%) = 0.018501 (10.7138)
+Comm time (%) = 0.00039655 (7.7967)
+Outpt time (%) = 7.61747e-05 (1.4977)
+Other time (%) = 7.74264e-05 (1.52231)
Nlocal: 1224 ave 1296 max 1152 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 2259 ave 2592 max 1926 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 32508 ave 34992 max 29952 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 65016 ave 69984 max 60048 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 260064
Ave neighs/atom = 53.1176
Neighbor list builds = 0
Dangerous builds = 0
displace_atoms all ramp x -0.6507 0.6507 x -65.07 65.07
Displacing atoms ...
fix_modify AtC output eam_unistrain_stepFE 1 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
run 1
Setting up run ...
- ATC: kernel matrix bandwidth 1005
ATC: computing bond matrix ..........done
Memory usage per processor = 34.3603 Mbytes
Step PotEng KinEng Press Lx Ly Lz
1 -17252.771 0 -14787.592 130.14 21.69 21.69
- ATC: kernel matrix bandwidth 1005
2 -17252.771 0 -14787.592 130.14 21.69 21.69
-Loop time of 0.30425 on 4 procs for 1 steps with 4896 atoms
+Loop time of 0.0579977 on 4 procs for 1 steps with 4896 atoms
-Pair time (%) = 0.0258307 (8.48995)
+Pair time (%) = 0.00464368 (8.00666)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0273772 (8.99826)
-Outpt time (%) = 0.000741243 (0.243629)
-Other time (%) = 0.250301 (82.2682)
+Comm time (%) = 0.000431299 (0.743649)
+Outpt time (%) = 0.000628054 (1.08289)
+Other time (%) = 0.0522947 (90.1668)
Nlocal: 1224 ave 1296 max 1152 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 2259 ave 2592 max 1926 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 32508 ave 34992 max 29952 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 65016 ave 69984 max 60048 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 260064
Ave neighs/atom = 53.1176
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/hardy/eam_volume_stretch.screen b/examples/USER/atc/hardy/eam_volume_stretch.screen
index d3d36b023..8341a8975 100644
--- a/examples/USER/atc/hardy/eam_volume_stretch.screen
+++ b/examples/USER/atc/hardy/eam_volume_stretch.screen
@@ -1,113 +1,114 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
atom_style atomic
# create domain
lattice fcc 3.615 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 3.615 3.615 3.615
region simRegion block -3 3 -3 3 -3 3
region feRegion block -3 3 -3 3 -3 3
region mdRegion block -3 3 -3 3 -3 3
region mdInternal block -3 3 -3 3 -3 3
boundary p p p
create_box 1 simRegion
Created orthogonal box = (-10.845 -10.845 -10.845) to (10.845 10.845 10.845)
1 by 2 by 2 MPI processor grid
# create atoms
create_atoms 1 region mdRegion
Created 864 atoms
mass 1 63.550
# specify interal atoms
group internal region mdInternal
864 atoms in group internal
# specify inter-atomic potential
pair_style eam
pair_coeff * * ../../../../potentials/Cu_u3.eam
# specify neighbor/re-neighboring parameters
neighbor 0.3 bin
neigh_modify every 10 delay 0 check no
# setup thermal output
thermo 10
thermo_style custom step pe ke press lx ly lz
# time integrator
# fix NVE all nve
# ID group atc PhysicsType ParameterFile
fix AtC internal atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC fields none
fix_modify AtC fields add mass_density
fix_modify AtC fields add internal_energy
fix_modify AtC fields add stress
# ID part keywords nx ny nz region
fix_modify AtC mesh create 2 2 2 feRegion p p p
ATC: created uniform mesh with 27 nodes, 8 unique nodes, and 8 elements
log eam_volume_stretch.log
# equilibrate MD field
timestep 0.0 # 0.001
reset_timestep 0
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 20.2625 Mbytes
Step PotEng KinEng Press Lx Ly Lz
0 -3058.56 0 -0.027860375 21.69 21.69 21.69
1 -3058.56 0 -0.027860375 21.69 21.69 21.69
-Loop time of 0.0294803 on 4 procs for 1 steps with 864 atoms
+Loop time of 0.00121945 on 4 procs for 1 steps with 864 atoms
-Pair time (%) = 0.0104292 (35.3769)
+Pair time (%) = 0.000969291 (79.4858)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0189348 (64.2289)
-Outpt time (%) = 6.9201e-05 (0.234737)
-Other time (%) = 4.70281e-05 (0.159524)
+Comm time (%) = 0.000159681 (13.0945)
+Outpt time (%) = 4.44055e-05 (3.64143)
+Other time (%) = 4.60744e-05 (3.77829)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1080 ave 1080 max 1080 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 5832 ave 5832 max 5832 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 11664 ave 11664 max 11664 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 46656
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
# stretch system
change_box all x scale 1.001 y scale 1.001 z scale 1.001 remap
Changing box ...
orthogonal box = (-10.8558 -10.845 -10.845) to (10.8558 10.845 10.845)
orthogonal box = (-10.8558 -10.8558 -10.845) to (10.8558 10.8558 10.845)
orthogonal box = (-10.8558 -10.8558 -10.8558) to (10.8558 10.8558 10.8558)
fix_modify AtC output eam_volume_stretchFE 1 text tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
run 1
Setting up run ...
ATC: computing bond matrix ...........done
Memory usage per processor = 20.2625 Mbytes
Step PotEng KinEng Press Lx Ly Lz
1 -3058.5204 0 -4126.8763 21.71169 21.71169 21.71169
2 -3058.5204 0 -4126.8763 21.71169 21.71169 21.71169
-Loop time of 0.0434771 on 4 procs for 1 steps with 864 atoms
+Loop time of 0.0388485 on 4 procs for 1 steps with 864 atoms
-Pair time (%) = 0.000937521 (2.15636)
+Pair time (%) = 0.00091958 (2.3671)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000136197 (0.313261)
-Outpt time (%) = 0.000539005 (1.23975)
-Other time (%) = 0.0418643 (96.2906)
+Comm time (%) = 0.000169635 (0.436658)
+Outpt time (%) = 0.000460684 (1.18585)
+Other time (%) = 0.0372986 (96.0104)
Nlocal: 216 ave 216 max 216 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 1080 ave 1080 max 1080 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 5832 ave 5832 max 5832 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 11664 ave 11664 max 11664 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 46656
Ave neighs/atom = 54
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/hardy/eshelby_static.screen b/examples/USER/atc/hardy/eshelby_static.screen
index ae81ed2a1..74d5faca1 100644
--- a/examples/USER/atc/hardy/eshelby_static.screen
+++ b/examples/USER/atc/hardy/eshelby_static.screen
@@ -1,1272 +1,1273 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
log eshelby_static.log
units metal
dimension 3
boundary p p p
atom_style atomic
# create system
#lattice fcc 3.615 orient x 1 0 0 orient y 0 1 0 orient z 0 0 1
#lattice fcc 3.615 origin 0.2 0.2 0.2 orient x 1 0 0 orient y 0 1 0 orient z 0 0 1
lattice fcc 4.08 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 4.08 4.08 4.08
region SYSTEM block -10 10 -10 10 0 3
region UPPER block -10 10 0 10 0 3
region LOWER block -10 0 -10 10 0 3
create_box 1 SYSTEM
Created orthogonal box = (-40.8 -40.8 0) to (40.8 40.8 12.24)
2 by 2 by 1 MPI processor grid
create_atoms 1 region SYSTEM
Created 4800 atoms
mass 1 63.55
group internal region SYSTEM
4800 atoms in group internal
group upper region UPPER
2400 atoms in group upper
group lower region LOWER
2400 atoms in group lower
#pair_style eam
#pair_coeff * * ../../../../potentials/Cu_u3.eam
#pair_style lj/smooth 8.0 10.0
#pair_coeff * * 10.0 1.5
pair_style lj/smooth/linear 5.456108274435118
pair_coeff * * 0.7242785984051078 2.598146797350056
# define region
region abovecrack block -2.01 2.01 0 8 INF INF units lattice
group abovecrack region abovecrack
384 atoms in group abovecrack
region belowcrack block -2.01 2.01 -8 0 INF INF units lattice
group belowcrack region belowcrack
384 atoms in group belowcrack
neighbor 1.0 bin
neigh_modify delay 1000000
neigh_modify exclude group abovecrack belowcrack
thermo 10
compute_modify thermo_temp extra 0
region FORCECHECK block -6 0 6 10 0 3
group FORCECHECK region FORCECHECK
288 atoms in group FORCECHECK
compute fxsum FORCECHECK reduce sum fx
compute fysum FORCECHECK reduce sum fy
compute fzsum FORCECHECK reduce sum fz
thermo_style custom step ke pe press c_fxsum c_fysum c_fzsum
thermo_modify format 1 %4i format 2 %3.1g format 3 %20.16g
timestep 0.0
# (1) minimize the system to get a relaxed configuration
min_modify line quadratic
variable tol equal 1.e-11
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
Memory usage per processor = 2.89514 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
0 0 -18803.88531507588 157.04581 3.4067194e-13 7.5394552e-14 -1.1171619e-15
10 0 -18804.05078386973 -167.23257 0.0038622644 -0.02973841 -2.7822961e-14
20 0 -18804.05398912934 -154.10675 -0.02209957 -0.079098411 -7.7483013e-14
30 0 -18804.05486888189 -133.48818 -0.013415553 0.039069634 1.3330819e-13
40 0 -18804.05508909051 -129.97657 -0.025714944 -0.00039124981 2.825702e-14
50 0 -18804.05511094083 -130.96286 0.00017302887 -0.00041936437 2.8474273e-14
60 0 -18804.05511286108 -130.04134 -8.0562031e-06 0.00040854586 1.4817637e-13
70 0 -18804.05511296557 -129.72642 2.4196188e-05 -8.3754634e-05 -8.2968141e-14
80 0 -18804.05511297355 -129.64952 -2.8214304e-05 0.00016439854 -1.7192415e-13
90 0 -18804.05511297455 -129.62765 -2.763398e-05 -1.3852197e-05 -1.0552489e-13
100 0 -18804.05511297478 -129.61925 -5.0791248e-06 -1.5172318e-05 -1.473598e-13
110 0 -18804.05511297482 -129.61875 -2.3891669e-07 4.3035847e-06 -8.2480275e-14
120 0 -18804.05511297477 -129.61941 4.1478414e-07 -2.9139069e-07 2.8750763e-14
130 0 -18804.05511297506 -129.61928 -8.2070128e-08 -1.155778e-08 1.8408353e-14
140 0 -18804.05511297482 -129.61924 -4.4570566e-08 2.6123951e-08 1.3097633e-13
150 0 -18804.05511297488 -129.61922 -2.699227e-08 2.1606944e-08 -1.1053083e-13
160 0 -18804.055112975 -129.61922 6.8667407e-09 9.0120222e-09 -7.0315769e-14
170 0 -18804.05511297498 -129.61922 3.88537e-09 3.1573261e-09 -1.5273464e-13
180 0 -18804.0551129748 -129.61922 3.7525026e-10 -2.6212562e-10 9.9078408e-14
190 0 -18804.05511297483 -129.61922 5.6720697e-12 8.8140874e-12 -4.9151834e-14
200 0 -18804.05511297479 -129.61922 -5.3396542e-11 3.7182177e-11 1.0315588e-13
210 0 -18804.05511297483 -129.61922 -7.4321343e-12 3.6389846e-12 1.5270715e-13
217 0 -18804.05511297483 -129.61922 -8.7495582e-13 -9.0918848e-13 -1.5813771e-13
-Loop time of 10.6219 on 4 procs for 217 steps with 4800 atoms
+Loop time of 1.19797 on 4 procs for 217 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18803.8853151 -18804.055113 -18804.055113
Force two-norm initial, final = 2.91621 9.94487e-12
Force max component initial, final = 0.331329 4.98176e-13
Final line search alpha, max atom move = 1 4.98176e-13
Iterations, force evaluations = 217 434
-Pair time (%) = 1.4734 (13.8714)
+Pair time (%) = 1.05274 (87.8775)
Neigh time (%) = 0 (0)
-Comm time (%) = 6.48505 (61.0536)
-Outpt time (%) = 0.137212 (1.29179)
-Other time (%) = 2.52624 (23.7833)
+Comm time (%) = 0.0988494 (8.25143)
+Outpt time (%) = 0.00248981 (0.207836)
+Other time (%) = 0.0438839 (3.6632)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46555.5 ave 46908 max 46203 min
Histogram: 1 1 0 0 0 0 0 0 1 1
Total # of neighbors = 186222
Ave neighs/atom = 38.7963
Neighbor list builds = 0
Dangerous builds = 0
write_restart eshelby.restart
System init for write_restart ...
# (2) pull crack apart
reset_timestep 0
fix PK1 internal atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 6
# NOTE tune this relative to lattice size
fix_modify PK1 mesh create 10 10 1 SYSTEM p f p
ATC: created uniform mesh with 242 nodes, 110 unique nodes, and 100 elements
fix_modify PK1 fields none
fix_modify PK1 fields add mass_density internal_energy temperature stress displacement
fix_modify PK1 fields add eshelby_stress transformed_stress
fix_modify PK1 gradients add displacement
fix_modify PK1 set reference_potential_energy
fix_modify PK1 output eshelby_staticFE 1 text binary tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
#fix_modify PK1 on_the_fly
#-- make concentric loops around one/both of the crack tips
#-- & another around undefected material (loop0)
fix_modify PK1 mesh create_faceset loop0 box -6 0 6 10 -INF INF outward
ATC: created faceset loop0 with 10 faces
fix_modify PK1 output boundary_integral eshelby_stress faceset loop0
fix_modify PK1 output boundary_integral stress faceset loop0
fix_modify PK1 output boundary_integral internal_energy faceset loop0
#fix_modify PK1 output boundary_integral displacement_gradient faceset loop0
fix_modify PK1 mesh create_faceset loop1 box -6 0 -2 2 -INF INF outward
ATC: created faceset loop1 with 10 faces
fix_modify PK1 output boundary_integral eshelby_stress faceset loop1
fix_modify PK1 output boundary_integral stress faceset loop1
fix_modify PK1 output boundary_integral internal_energy faceset loop1
#fix_modify PK1 output boundary_integral displacement_gradient faceset loop1
fix_modify PK1 mesh create_faceset loop2 box -8 0 -4 4 -INF INF outward
ATC: created faceset loop2 with 16 faces
fix_modify PK1 output boundary_integral eshelby_stress faceset loop2
fix_modify PK1 output boundary_integral stress faceset loop2
fix_modify PK1 output boundary_integral internal_energy faceset loop2
#fix_modify PK1 output boundary_integral displacement_gradient faceset loop2
fix_modify PK1 mesh create_faceset loop3 box -10 0 -6 6 -INF INF outward
ATC: created faceset loop3 with 22 faces
fix_modify PK1 output boundary_integral eshelby_stress faceset loop3
fix_modify PK1 output boundary_integral stress faceset loop3
fix_modify PK1 output boundary_integral internal_energy faceset loop3
#fix_modify PK1 output boundary_integral displacement_gradient faceset loop3
fix_modify PK1 mesh create_faceset loop4 box 0 8 -6 6 -INF INF outward
ATC: created faceset loop4 with 20 faces
fix_modify PK1 output boundary_integral eshelby_stress faceset loop4
fix_modify PK1 output boundary_integral stress faceset loop4
fix_modify PK1 output boundary_integral internal_energy faceset loop4
#fix_modify PK1 output boundary_integral displacement_gradient faceset loop4
#-- compute across crack jumps in displacement
#fix PK1upper internal atc hardy
#fix_modify PK1upper mesh create 10 5 1 UPPER p f p
#fix_modify PK1upper fields none
#fix_modify PK1upper fields add displacement
#fix PK1lower lower atc hardy
#fix_modify PK1lower mesh create 10 5 1 LOWER p f p
#fix_modify PK1lower fields none
#fix_modify PK1lower fields add displacement
# initial (1)
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.0387 Mbytes
+Memory usage per processor = 23.6491 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
0 0 -18804.05511297483 -129.61922 -8.7410388e-13 -9.0953256e-13 -1.5920078e-13
1 0 -18804.05511297483 -129.61922 -8.7410388e-13 -9.0953256e-13 -1.5920078e-13
-Loop time of 0.317934 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.109823 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.00576746 (1.81405)
+Pair time (%) = 0.00266957 (2.43081)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00962543 (3.0275)
-Outpt time (%) = 0.000138164 (0.0434567)
-Other time (%) = 0.302403 (95.115)
+Comm time (%) = 0.000210464 (0.19164)
+Outpt time (%) = 0.000165522 (0.150718)
+Other time (%) = 0.106777 (97.2268)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 46429.5 ave 46491 max 46397 min
Histogram: 2 0 0 1 0 0 0 0 0 1
FullNghs: 92859 ave 92859 max 92859 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 371436
Ave neighs/atom = 77.3825
Neighbor list builds = 0
Dangerous builds = 0
# increment (2)
variable L equal 20
variable n equal 10
variable i loop $n
variable i loop 10
# NOTE this does not generate KE
# NOTE crack is complete at i =8 / 10
variable s equal 0.08*$L/$n
variable s equal 0.08*20/$n
variable s equal 0.08*20/10
label loop_i
variable strain equal $i*$s
variable strain equal 1*$s
variable strain equal 1*0.16000000000000000333
print ">>> step $i, total strain ${strain}"
>>> step 1, total strain 0.16000000000000000333
change_box all y delta 0 $s remap units lattice
change_box all y delta 0 0.16000000000000000333 remap units lattice
Changing box ...
orthogonal box = (-40.8 -40.8 0) to (40.8 41.4528 12.24)
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7254 Mbytes
+Memory usage per processor = 24.3358 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
1 0 -18796.24699487574 -27029.118 0.0043960333 -0.0014055346 -2.1929333e-13
10 0 -18796.59340724873 -25837.901 0.003228698 -0.0079514347 2.0472166e-13
20 0 -18796.6674229111 -25563.184 -0.41208254 0.60939356 -2.0133201e-14
30 0 -18796.68137488175 -25530.748 -0.10427399 0.046278834 1.8345742e-13
40 0 -18796.68416289275 -25532.787 0.037932219 6.742707e-05 -8.1854662e-14
50 0 -18796.68482000328 -25530.1 -0.017743055 -0.022407353 1.3725132e-13
60 0 -18796.68490342712 -25529.455 -0.0020694891 -0.00021194339 8.87658e-15
70 0 -18796.68490563928 -25529.029 -0.00025956468 0.00076638248 6.737666e-15
80 0 -18796.68490592246 -25528.794 0.00018670711 0.00010345638 2.3358052e-14
90 0 -18796.68490596423 -25528.665 5.7402299e-05 -0.00011112274 3.9048625e-14
100 0 -18796.68490596863 -25528.714 4.3186467e-05 -1.5316686e-05 -1.7127619e-13
110 0 -18796.68490597046 -25528.743 -1.6546701e-05 2.5136036e-06 4.4969237e-14
120 0 -18796.68490597065 -25528.748 -7.9352058e-06 1.4659191e-06 4.516873e-14
130 0 -18796.68490597036 -25528.748 4.8463939e-07 -6.647491e-07 -8.9565508e-14
140 0 -18796.68490597038 -25528.747 1.4258574e-07 2.4166009e-07 -1.0210062e-13
150 0 -18796.6849059704 -25528.746 -1.5186279e-07 3.3560936e-07 4.9280025e-14
160 0 -18796.68490597036 -25528.746 -1.3274959e-07 -7.2180252e-08 -7.3246964e-14
170 0 -18796.6849059705 -25528.746 -2.2715599e-08 -5.7380609e-09 3.1984831e-14
180 0 -18796.68490597034 -25528.746 9.6442526e-09 6.3084056e-09 1.0609569e-14
190 0 -18796.68490597043 -25528.746 -3.5484652e-11 2.9988142e-09 -2.1633736e-14
200 0 -18796.68490597063 -25528.746 -5.2937969e-10 -7.7295492e-10 -5.912458e-14
210 0 -18796.68490597045 -25528.746 3.0338545e-10 4.6398359e-10 3.7685133e-14
220 0 -18796.68490597037 -25528.746 1.5461683e-10 -8.041256e-11 -4.610895e-15
230 0 -18796.6849059705 -25528.746 -9.2570447e-12 -6.5234379e-11 -5.6801785e-14
240 0 -18796.68490597055 -25528.746 -1.9896646e-11 3.3817194e-11 9.6343072e-14
249 0 -18796.68490597057 -25528.746 3.4677051e-13 6.539951e-12 -8.5036145e-15
-Loop time of 8.79155 on 4 procs for 248 steps with 4800 atoms
+Loop time of 1.42848 on 4 procs for 248 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18796.2469949 -18796.684906 -18796.684906
Force two-norm initial, final = 1.3176 9.93035e-12
Force max component initial, final = 0.199684 4.01235e-13
Final line search alpha, max atom move = 1 4.01235e-13
Iterations, force evaluations = 248 496
-Pair time (%) = 2.0681 (23.5237)
+Pair time (%) = 1.17573 (82.3066)
Neigh time (%) = 0 (0)
-Comm time (%) = 4.54814 (51.7331)
-Outpt time (%) = 0.220124 (2.50382)
-Other time (%) = 1.95519 (22.2394)
+Comm time (%) = 0.188164 (13.1723)
+Outpt time (%) = 0.0027706 (0.193954)
+Other time (%) = 0.0618128 (4.32717)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 38613 ave 38650 max 38593 min
Histogram: 1 1 1 0 0 0 0 0 0 1
FullNghs: 77226 ave 77226 max 77226 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 308904
Ave neighs/atom = 64.355
Neighbor list builds = 0
Dangerous builds = 0
# reset_timestep $i
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.0387 Mbytes
+Memory usage per processor = 23.6491 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
249 0 -18796.68490597057 -25528.746 3.4668762e-13 6.5399934e-12 -9.027501e-15
250 0 -18796.68490597057 -25528.746 3.4668762e-13 6.5399934e-12 -9.027501e-15
-Loop time of 0.807379 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.161141 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.00261557 (0.323958)
+Pair time (%) = 0.00257647 (1.59889)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0248603 (3.07913)
-Outpt time (%) = 0.0667176 (8.26348)
-Other time (%) = 0.713185 (88.3334)
+Comm time (%) = 0.000294924 (0.183022)
+Outpt time (%) = 0.00557476 (3.45956)
+Other time (%) = 0.152695 (94.7585)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 39234 ave 39251 max 39210 min
Histogram: 1 0 0 0 0 1 0 1 0 1
FullNghs: 78468 ave 78468 max 78468 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 313872
Ave neighs/atom = 65.39
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.eshelby_static loop_i
variable strain equal $i*$s
variable strain equal 2*$s
variable strain equal 2*0.16000000000000000333
print ">>> step $i, total strain ${strain}"
>>> step 2, total strain 0.32000000000000000666
change_box all y delta 0 $s remap units lattice
change_box all y delta 0 0.16000000000000000333 remap units lattice
Changing box ...
orthogonal box = (-40.8 -40.8 0) to (40.8 42.1056 12.24)
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7254 Mbytes
+Memory usage per processor = 24.3358 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
250 0 -18774.7608425896 -50163.01 0.022793727 -0.0011966205 -6.9763639e-14
260 0 -18775.11815298796 -48920.946 -0.0020464819 0.054982281 -1.2962201e-13
270 0 -18775.18252080679 -48678.889 -0.34679638 0.69588603 -1.2788208e-13
280 0 -18775.19462114314 -48656.554 -0.076015057 0.089569497 -1.744941e-13
290 0 -18775.19691196808 -48656.927 0.035624013 0.00032299188 7.0958864e-14
300 0 -18775.19746441122 -48656.203 -0.017029282 -0.019207942 -1.6668958e-13
310 0 -18775.19753012962 -48655.78 -0.00092746818 -0.00063117528 -4.9509008e-14
320 0 -18775.1975322318 -48655.465 -0.00035233821 0.00035846818 1.1448481e-13
330 0 -18775.19753254089 -48655.282 0.00031000783 4.2978579e-05 4.7592139e-14
340 0 -18775.19753260198 -48655.198 0.00012092645 -0.0001956234 -6.6075617e-14
350 0 -18775.19753260996 -48655.259 8.355958e-05 -6.1522389e-05 -2.3907959e-14
360 0 -18775.19753261247 -48655.294 -3.6272959e-05 -3.2757726e-05 6.0155006e-14
370 0 -18775.19753261278 -48655.307 -1.201859e-06 1.8229791e-06 7.0894679e-14
380 0 -18775.19753261278 -48655.306 3.3337492e-07 -1.4066916e-06 6.4266301e-14
390 0 -18775.19753261297 -48655.305 -1.9304843e-07 3.1853504e-07 -7.5422307e-14
400 0 -18775.1975326128 -48655.305 -4.3810387e-07 3.5975388e-07 -2.9199212e-13
410 0 -18775.19753261264 -48655.305 -7.4599947e-08 -2.1594499e-08 1.7863662e-13
420 0 -18775.19753261279 -48655.305 -9.5193689e-08 -3.6461161e-08 -2.0470257e-13
430 0 -18775.19753261263 -48655.305 4.6607151e-08 8.6445473e-09 9.6754202e-14
440 0 -18775.1975326129 -48655.305 2.4237351e-09 -1.2429845e-09 1.0966575e-13
450 0 -18775.19753261285 -48655.305 8.1342633e-10 -5.063303e-10 -7.5980888e-15
460 0 -18775.19753261275 -48655.305 -1.1228805e-10 1.0966651e-09 -1.9831879e-13
470 0 -18775.1975326128 -48655.305 3.6006653e-10 -4.1751033e-10 7.1487954e-14
480 0 -18775.1975326128 -48655.305 -7.0608855e-11 -7.7232654e-11 1.1836886e-13
490 0 -18775.19753261282 -48655.305 -2.1050048e-11 2.8067392e-11 6.9531186e-14
500 0 -18775.19753261291 -48655.305 -1.3303657e-12 1.0812714e-11 -3.0850322e-14
502 0 -18775.19753261292 -48655.305 -2.2029077e-12 8.0001559e-12 7.7080703e-14
-Loop time of 7.09933 on 4 procs for 252 steps with 4800 atoms
+Loop time of 1.36623 on 4 procs for 252 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18774.7608426 -18775.1975326 -18775.1975326
Force two-norm initial, final = 1.30136 8.69208e-12
Force max component initial, final = 0.197635 3.90715e-13
Final line search alpha, max atom move = 1 3.90715e-13
Iterations, force evaluations = 252 504
-Pair time (%) = 1.53346 (21.6001)
+Pair time (%) = 1.1633 (85.1468)
Neigh time (%) = 0 (0)
-Comm time (%) = 2.79308 (39.3428)
-Outpt time (%) = 0.210507 (2.96517)
-Other time (%) = 2.56228 (36.0919)
+Comm time (%) = 0.141472 (10.355)
+Outpt time (%) = 0.00307858 (0.225334)
+Other time (%) = 0.0583773 (4.27288)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36961.5 ave 36975 max 36946 min
Histogram: 1 0 0 0 0 1 1 0 0 1
FullNghs: 73923 ave 73923 max 73923 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 295692
Ave neighs/atom = 61.6025
Neighbor list builds = 0
Dangerous builds = 0
# reset_timestep $i
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.0387 Mbytes
+Memory usage per processor = 23.6491 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
502 0 -18775.19753261291 -48655.305 -2.2034903e-12 7.9996871e-12 7.6945395e-14
503 0 -18775.19753261291 -48655.305 -2.2034903e-12 7.9996871e-12 7.6945395e-14
-Loop time of 0.487686 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.12795 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.00259829 (0.532778)
+Pair time (%) = 0.00258303 (2.01878)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0105814 (2.16971)
-Outpt time (%) = 0.00929224 (1.90537)
-Other time (%) = 0.465214 (95.3921)
+Comm time (%) = 0.000294745 (0.23036)
+Outpt time (%) = 0.00651443 (5.0914)
+Other time (%) = 0.118558 (92.6595)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 37098 ave 37123 max 37065 min
Histogram: 1 0 0 0 0 0 2 0 0 1
FullNghs: 74196 ave 74196 max 74196 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 296784
Ave neighs/atom = 61.83
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.eshelby_static loop_i
variable strain equal $i*$s
variable strain equal 3*$s
variable strain equal 3*0.16000000000000000333
print ">>> step $i, total strain ${strain}"
>>> step 3, total strain 0.47999999999999998224
change_box all y delta 0 $s remap units lattice
change_box all y delta 0 0.16000000000000000333 remap units lattice
Changing box ...
orthogonal box = (-40.8 -40.8 0) to (40.8 42.7584 12.24)
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7254 Mbytes
+Memory usage per processor = 24.3358 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
503 0 -18740.22094539338 -71179.578 0.042436929 -0.00058766122 5.4461644e-14
510 0 -18740.52574537834 -70113.846 0.019892443 -0.0066976455 -1.2749177e-13
520 0 -18740.63866698476 -69700.828 -0.43415456 0.62751438 1.5471131e-13
530 0 -18740.66253797384 -69635.147 -0.14858913 -0.043191718 4.748632e-14
540 0 -18740.6660230413 -69628.118 0.033003494 0.010684797 4.9816054e-14
550 0 -18740.66684194138 -69631.698 -0.012343376 -0.022846192 -5.7769761e-14
560 0 -18740.66695998782 -69632.27 -0.0038103507 -0.006758347 1.8627461e-14
570 0 -18740.66696771383 -69632.317 0.0010108722 0.00038579232 -3.6953079e-14
580 0 -18740.66696843877 -69632.193 0.00032732592 -0.00057715667 6.4896005e-14
590 0 -18740.66696862285 -69632.144 0.0004393829 -0.00015285667 -1.511534e-13
600 0 -18740.66696865366 -69632.2 0.0002718906 8.0751254e-05 -1.3815338e-14
610 0 -18740.66696866142 -69632.272 -3.6811401e-05 -6.1493862e-05 -4.1636833e-14
620 0 -18740.66696866208 -69632.291 -1.1155812e-05 6.5073211e-06 -5.2661001e-14
630 0 -18740.66696866224 -69632.299 -2.8684447e-06 5.8543601e-07 -3.9829251e-14
640 0 -18740.66696866222 -69632.297 -7.6240734e-07 -7.3536712e-07 6.2965258e-14
650 0 -18740.66696866228 -69632.296 -7.7940189e-07 2.5064706e-06 -1.4706986e-13
660 0 -18740.6669686622 -69632.296 3.8750053e-07 1.4372821e-07 -3.1100122e-14
670 0 -18740.66696866235 -69632.296 -1.8890263e-07 -1.7245331e-07 -7.3170636e-15
680 0 -18740.66696866209 -69632.296 5.9915857e-08 -2.9041318e-08 -7.703907e-14
690 0 -18740.66696866221 -69632.296 1.2799751e-08 -1.6205375e-08 -6.2477801e-14
700 0 -18740.66696866215 -69632.296 5.0774321e-09 2.1777722e-09 -9.9720579e-14
710 0 -18740.66696866214 -69632.296 -1.6058649e-09 4.0847939e-10 1.1093557e-14
720 0 -18740.66696866211 -69632.296 2.5047088e-10 -9.5276707e-10 5.3210908e-14
730 0 -18740.66696866212 -69632.296 1.5784225e-10 -5.5112915e-11 9.522938e-14
740 0 -18740.66696866219 -69632.296 -1.1518922e-10 -2.0835743e-11 1.9975341e-14
750 0 -18740.6669686621 -69632.296 -3.8143832e-11 4.6393645e-11 -6.0802058e-14
760 0 -18740.66696866212 -69632.296 -9.0617494e-12 1.2776108e-11 1.2775718e-13
770 0 -18740.66696866213 -69632.296 -2.5180353e-12 -1.8959756e-12 2.3569688e-14
772 0 -18740.66696866214 -69632.296 -5.2109265e-12 -1.9328798e-12 -1.1258355e-14
-Loop time of 10.4509 on 4 procs for 269 steps with 4800 atoms
+Loop time of 3.06456 on 4 procs for 269 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18740.2209454 -18740.6669687 -18740.6669687
Force two-norm initial, final = 1.28947 9.88499e-12
Force max component initial, final = 0.19586 3.96302e-13
Final line search alpha, max atom move = 1 3.96302e-13
Iterations, force evaluations = 269 538
-Pair time (%) = 1.78253 (17.0562)
+Pair time (%) = 1.28877 (42.0539)
Neigh time (%) = 0 (0)
-Comm time (%) = 6.04586 (57.8501)
-Outpt time (%) = 0.103009 (0.985649)
-Other time (%) = 2.51951 (24.1081)
+Comm time (%) = 1.11343 (36.3324)
+Outpt time (%) = 0.00289124 (0.0943444)
+Other time (%) = 0.659471 (21.5193)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36547.5 ave 36589 max 36503 min
Histogram: 1 0 0 1 0 0 1 0 0 1
FullNghs: 73095 ave 73095 max 73095 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 292380
Ave neighs/atom = 60.9125
Neighbor list builds = 0
Dangerous builds = 0
# reset_timestep $i
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.0387 Mbytes
+Memory usage per processor = 23.6491 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
772 0 -18740.66696866215 -69632.296 -5.2107068e-12 -1.9333735e-12 -1.0859369e-14
773 0 -18740.66696866215 -69632.296 -5.2107068e-12 -1.9333735e-12 -1.0859369e-14
-Loop time of 1.37249 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.117819 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.0025475 (0.185612)
+Pair time (%) = 0.00253028 (2.1476)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.160218 (11.6735)
-Outpt time (%) = 0.0743265 (5.41545)
-Other time (%) = 1.1354 (82.7255)
+Comm time (%) = 0.00026232 (0.222647)
+Outpt time (%) = 0.00626147 (5.31449)
+Other time (%) = 0.108765 (92.3153)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36654 ave 36717 max 36596 min
Histogram: 1 1 0 0 0 0 0 1 0 1
FullNghs: 73308 ave 73308 max 73308 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 293232
Ave neighs/atom = 61.09
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.eshelby_static loop_i
variable strain equal $i*$s
variable strain equal 4*$s
variable strain equal 4*0.16000000000000000333
print ">>> step $i, total strain ${strain}"
>>> step 4, total strain 0.64000000000000001332
change_box all y delta 0 $s remap units lattice
change_box all y delta 0 0.16000000000000000333 remap units lattice
Changing box ...
orthogonal box = (-40.8 -40.8 0) to (40.8 43.4112 12.24)
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7254 Mbytes
+Memory usage per processor = 24.3358 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
773 0 -18693.66587952461 -90194.671 0.063702858 0.00034764707 3.1089714e-14
780 0 -18693.97673971806 -89108.484 0.031180803 -0.0072593906 -1.0696131e-13
790 0 -18694.10178196363 -88649.429 -0.45437346 0.6792836 -5.3984595e-15
800 0 -18694.13014771662 -88567.278 -0.15697662 -0.013106095 -7.2589504e-14
810 0 -18694.13402657088 -88559.997 0.02596227 0.044720917 -5.2988863e-14
820 0 -18694.13485964635 -88563.347 -0.011123094 -0.022007456 -9.397344e-14
830 0 -18694.13498855082 -88564.139 -0.0034872424 -0.0069926492 1.9340432e-14
840 0 -18694.13499960769 -88564.237 0.00071682697 -0.00052543471 -1.3546456e-14
850 0 -18694.13500022692 -88564.177 -0.00018710267 8.8516819e-05 -8.5794219e-14
860 0 -18694.13500035583 -88564.103 0.00030396893 -0.00024100413 -2.134265e-13
870 0 -18694.13500038065 -88564.126 0.00024126745 4.592756e-05 -5.439052e-13
880 0 -18694.13500038689 -88564.176 -1.5490579e-05 -6.8952995e-05 -6.6298703e-13
890 0 -18694.13500038718 -88564.19 -4.6769486e-06 2.1421428e-05 -2.0346971e-12
900 0 -18694.13500038748 -88564.203 -1.9113332e-06 -1.5885822e-07 -2.1443611e-12
910 0 -18694.13500038753 -88564.204 -1.809664e-07 -1.6506767e-06 -3.6864192e-12
920 0 -18694.13500038753 -88564.203 -3.6953839e-07 6.4809133e-07 -5.7557188e-12
930 0 -18694.13500038745 -88564.203 1.5219849e-07 3.1170517e-07 -2.1760104e-11
940 0 -18694.13500038737 -88564.203 -2.2003925e-07 -3.0377181e-08 -1.9391159e-11
950 0 -18694.13500038737 -88564.203 -2.1937908e-09 -6.6808879e-09 -6.9718068e-12
960 0 -18694.13500038756 -88564.203 5.6044285e-09 -1.8903536e-08 -4.7082997e-13
970 0 -18694.1350003873 -88564.203 1.7243584e-09 -3.0105237e-09 -8.1476492e-14
980 0 -18694.13500038745 -88564.203 1.4689015e-09 3.1015348e-10 2.3777855e-14
990 0 -18694.13500038741 -88564.203 -1.966375e-10 -2.0503779e-10 -3.0092248e-14
1000 0 -18694.13500038748 -88564.203 1.3654005e-10 -3.1843256e-10 -6.6578687e-14
1010 0 -18694.13500038744 -88564.203 -3.0276585e-11 1.1110089e-11 -1.2101604e-13
1020 0 -18694.13500038753 -88564.203 -3.0206456e-11 -1.5138533e-11 -1.6674162e-14
1030 0 -18694.13500038753 -88564.203 1.507389e-12 1.1376859e-11 -6.9095771e-14
1032 0 -18694.13500038751 -88564.203 1.2597073e-12 1.0879965e-11 3.8890766e-14
-Loop time of 8.72546 on 4 procs for 259 steps with 4800 atoms
+Loop time of 1.36008 on 4 procs for 259 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18693.6658795 -18694.1350004 -18694.1350004
Force two-norm initial, final = 1.28204 9.41219e-12
Force max component initial, final = 0.194164 4.11711e-13
Final line search alpha, max atom move = 1 4.11711e-13
Iterations, force evaluations = 259 518
-Pair time (%) = 1.68795 (19.3452)
+Pair time (%) = 1.18049 (86.7952)
Neigh time (%) = 0 (0)
-Comm time (%) = 4.65341 (53.3315)
-Outpt time (%) = 0.0229532 (0.26306)
-Other time (%) = 2.36114 (27.0603)
+Comm time (%) = 0.127926 (9.40573)
+Outpt time (%) = 0.00285125 (0.209638)
+Other time (%) = 0.0488199 (3.58948)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36328.5 ave 36381 max 36265 min
Histogram: 1 0 0 1 0 0 0 0 1 1
FullNghs: 72657 ave 72657 max 72657 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 290628
Ave neighs/atom = 60.5475
Neighbor list builds = 0
Dangerous builds = 0
# reset_timestep $i
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.0387 Mbytes
+Memory usage per processor = 23.6491 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
1032 0 -18694.13500038751 -88564.203 1.2597022e-12 1.0880291e-11 3.8668721e-14
1033 0 -18694.13500038751 -88564.203 1.2597022e-12 1.0880291e-11 3.8668721e-14
-Loop time of 1.2401 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.115126 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.00509548 (0.410893)
+Pair time (%) = 0.00251698 (2.18628)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0248823 (2.00648)
-Outpt time (%) = 0.0769173 (6.20251)
-Other time (%) = 1.1332 (91.3801)
+Comm time (%) = 0.000267208 (0.2321)
+Outpt time (%) = 0.00656021 (5.69828)
+Other time (%) = 0.105782 (91.8833)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36369 ave 36391 max 36349 min
Histogram: 1 1 0 0 0 0 0 1 0 1
FullNghs: 72738 ave 72738 max 72738 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 290952
Ave neighs/atom = 60.615
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.eshelby_static loop_i
variable strain equal $i*$s
variable strain equal 5*$s
variable strain equal 5*0.16000000000000000333
print ">>> step $i, total strain ${strain}"
>>> step 5, total strain 0.80000000000000004441
change_box all y delta 0 $s remap units lattice
change_box all y delta 0 0.16000000000000000333 remap units lattice
Changing box ...
orthogonal box = (-40.8 -40.8 0) to (40.8 44.064 12.24)
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7254 Mbytes
+Memory usage per processor = 24.3358 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
1033 0 -18636.11013032917 -107306.84 0.087179197 0.0015874207 5.9226929e-14
1040 0 -18636.43103673087 -106192.36 0.044337741 -0.0066832041 -2.711581e-13
1050 0 -18636.57280297759 -105676.48 -0.48638084 0.8314865 -7.1536527e-14
1060 0 -18636.60771660457 -105569.62 -0.16511159 -0.030767882 5.0612552e-13
1070 0 -18636.61229428169 -105559.38 0.021430043 0.030969805 6.5606374e-14
1080 0 -18636.6131951782 -105561.67 -0.0062332338 -0.016535145 -1.4061989e-12
1090 0 -18636.61336187003 -105564.55 -0.0033479828 -0.0098903018 -2.3661307e-12
1100 0 -18636.61337988257 -105565.01 0.00082221778 -0.0023605315 -7.5842631e-12
1110 0 -18636.61338086593 -105565.22 -0.00041685633 0.00079578125 -1.8850539e-11
1120 0 -18636.61338113123 -105565.3 0.0005607417 -0.00034040033 -1.6063452e-10
1130 0 -18636.61338119124 -105565.4 0.00025131709 1.3912646e-05 -2.1913269e-10
1140 0 -18636.61338120433 -105565.47 -1.6069476e-05 -8.4841428e-06 -1.807068e-09
1150 0 -18636.61338120511 -105565.48 -2.0354865e-05 -9.6508247e-06 -1.6113042e-09
1160 0 -18636.6133812051 -105565.49 -8.4560077e-06 6.3269038e-07 -1.6308327e-10
1170 0 -18636.61338120514 -105565.49 -2.6432899e-07 -1.3205451e-06 -1.4417877e-11
1180 0 -18636.61338120505 -105565.49 -5.2221108e-07 6.0279457e-07 -6.2287736e-12
1190 0 -18636.61338120524 -105565.49 1.2160526e-07 1.4909178e-06 -3.4658057e-11
1200 0 -18636.61338120506 -105565.49 -2.610876e-07 -1.0438531e-07 -5.191389e-12
1210 0 -18636.61338120499 -105565.49 -2.7802297e-08 -3.8082618e-08 -6.6586493e-14
1220 0 -18636.61338120526 -105565.49 1.7558125e-08 -1.2699266e-08 2.385505e-14
1230 0 -18636.61338120508 -105565.49 3.2094906e-10 -2.7796004e-09 1.0958595e-13
1240 0 -18636.61338120509 -105565.49 3.6676946e-09 -7.792043e-10 1.1116975e-13
1250 0 -18636.61338120498 -105565.49 1.3566517e-09 9.0741524e-10 3.6538654e-13
1260 0 -18636.61338120516 -105565.49 1.7336501e-10 -5.0765115e-10 -3.5913113e-14
1270 0 -18636.61338120517 -105565.49 -4.7390856e-11 -8.8615663e-11 -3.1520793e-14
1280 0 -18636.61338120521 -105565.49 -6.1333239e-11 6.4489745e-11 -7.3884475e-14
1290 0 -18636.61338120518 -105565.49 -2.2122047e-11 -7.9136919e-12 -9.8118562e-14
1300 0 -18636.61338120521 -105565.49 1.081791e-11 1.3057743e-11 1.0332013e-14
1305 0 -18636.61338120521 -105565.49 5.0637371e-12 8.1071121e-12 -3.3531337e-14
-Loop time of 6.73875 on 4 procs for 272 steps with 4800 atoms
+Loop time of 2.36427 on 4 procs for 272 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18636.1101303 -18636.6133812 -18636.6133812
Force two-norm initial, final = 1.27885 8.7139e-12
Force max component initial, final = 0.192559 3.94851e-13
Final line search alpha, max atom move = 1 3.94851e-13
Iterations, force evaluations = 272 544
-Pair time (%) = 2.0734 (30.7683)
+Pair time (%) = 1.61708 (68.3966)
Neigh time (%) = 0 (0)
-Comm time (%) = 3.07345 (45.6086)
-Outpt time (%) = 0.112664 (1.67188)
-Other time (%) = 1.47924 (21.9513)
+Comm time (%) = 0.678047 (28.6789)
+Outpt time (%) = 0.00262564 (0.111055)
+Other time (%) = 0.0665182 (2.81347)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36205.5 ave 36236 max 36183 min
Histogram: 1 1 0 0 0 1 0 0 0 1
FullNghs: 72411 ave 72411 max 72411 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 289644
Ave neighs/atom = 60.3425
Neighbor list builds = 0
Dangerous builds = 0
# reset_timestep $i
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.0387 Mbytes
+Memory usage per processor = 23.6491 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
1305 0 -18636.61338120522 -105565.49 5.0642547e-12 8.1072881e-12 -3.333011e-14
1306 0 -18636.61338120522 -105565.49 5.0642547e-12 8.1072881e-12 -3.333011e-14
-Loop time of 0.64154 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.114227 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.002563 (0.399507)
+Pair time (%) = 0.00250477 (2.1928)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0348787 (5.43672)
-Outpt time (%) = 0.014325 (2.23291)
-Other time (%) = 0.589773 (91.9309)
+Comm time (%) = 0.000273049 (0.239041)
+Outpt time (%) = 0.00675231 (5.91131)
+Other time (%) = 0.104697 (91.6568)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36277.5 ave 36294 max 36263 min
Histogram: 1 0 1 0 0 1 0 0 0 1
FullNghs: 72555 ave 72555 max 72555 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 290220
Ave neighs/atom = 60.4625
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.eshelby_static loop_i
variable strain equal $i*$s
variable strain equal 6*$s
variable strain equal 6*0.16000000000000000333
print ">>> step $i, total strain ${strain}"
>>> step 6, total strain 0.95999999999999996447
change_box all y delta 0 $s remap units lattice
change_box all y delta 0 0.16000000000000000333 remap units lattice
Changing box ...
orthogonal box = (-40.8 -40.8 0) to (40.8 44.7168 12.24)
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7254 Mbytes
+Memory usage per processor = 24.3358 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
1306 0 -18568.52876784999 -122625.13 0.11327516 0.0031492485 -6.8263971e-14
1310 0 -18568.74882073336 -121901.81 0.095186133 -0.0011416444 -8.7660781e-14
1320 0 -18569.00454251567 -120950.18 -0.2410968 0.95855071 2.5853018e-13
1330 0 -18569.07349706784 -120727.11 -0.24319965 -0.2912924 2.5074474e-13
1340 0 -18569.08574491055 -120691.34 -0.012980899 0.14967506 -3.1190935e-13
1350 0 -18569.08742093104 -120692.66 0.020268874 -0.022779739 -7.7562089e-14
1360 0 -18569.08784344275 -120694.96 -0.017030722 -0.011207164 -1.9529864e-13
1370 0 -18569.08790197284 -120695.45 -0.00055562662 -0.0042723235 -1.835242e-13
1380 0 -18569.08790491389 -120695.76 -0.0010121555 0.00048878622 -5.4929325e-13
1390 0 -18569.0879053711 -120695.97 0.00033781243 -0.00022074882 -1.9400809e-12
1400 0 -18569.08790544242 -120696.04 0.00023923846 -0.00026303293 -7.7404767e-12
1410 0 -18569.08790546677 -120696.15 0.00020998502 0.0001546831 -1.9456521e-11
1420 0 -18569.08790547033 -120696.18 -1.9687675e-06 -1.5683061e-05 -2.6463075e-11
1430 0 -18569.08790547062 -120696.19 -6.2370159e-06 1.6065939e-06 -5.4179854e-11
1440 0 -18569.08790547075 -120696.2 -4.190645e-06 -4.6222325e-07 -6.4106238e-12
1450 0 -18569.08790547073 -120696.2 5.0919634e-07 -1.0856681e-06 -8.6963423e-14
1460 0 -18569.08790547067 -120696.2 -2.9904815e-07 9.091392e-08 6.2362268e-13
1470 0 -18569.08790547063 -120696.2 2.0150636e-08 6.7285708e-07 2.618978e-12
1480 0 -18569.08790547054 -120696.2 -3.083908e-07 -6.9259129e-08 3.8106879e-12
1490 0 -18569.08790547073 -120696.2 2.6034682e-09 -1.2826672e-08 3.4164425e-13
1500 0 -18569.08790547059 -120696.2 6.7729363e-10 -4.2930907e-09 9.8204431e-14
1510 0 -18569.08790547062 -120696.2 -9.5846333e-10 -1.9455995e-09 4.7516678e-14
1520 0 -18569.08790547062 -120696.2 1.5667016e-09 -6.459461e-11 -1.4132272e-13
1530 0 -18569.08790547058 -120696.2 1.0396352e-09 1.4696064e-10 -3.2439329e-14
1540 0 -18569.08790547059 -120696.2 -1.3541683e-12 -4.5800821e-10 3.0200668e-14
1550 0 -18569.0879054705 -120696.2 -3.8374448e-11 -1.6138199e-11 -4.7493259e-14
1560 0 -18569.08790547055 -120696.2 -3.19902e-11 9.1507895e-12 1.8244087e-14
1570 0 -18569.08790547052 -120696.2 -1.7156297e-11 4.6740893e-12 3.5214887e-16
1575 0 -18569.08790547054 -120696.2 -5.0504343e-12 -3.9081775e-13 6.7177167e-14
-Loop time of 9.25103 on 4 procs for 269 steps with 4800 atoms
+Loop time of 1.33504 on 4 procs for 269 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18568.5287678 -18569.0879055 -18569.0879055
Force two-norm initial, final = 1.27524 9.29525e-12
Force max component initial, final = 0.191046 5.2689e-13
Final line search alpha, max atom move = 1 5.2689e-13
Iterations, force evaluations = 269 538
-Pair time (%) = 1.47668 (15.9624)
+Pair time (%) = 1.20514 (90.2699)
Neigh time (%) = 0 (0)
-Comm time (%) = 3.84872 (41.6032)
-Outpt time (%) = 0.228203 (2.46679)
-Other time (%) = 3.69742 (39.9677)
+Comm time (%) = 0.0785329 (5.88243)
+Outpt time (%) = 0.00285375 (0.213757)
+Other time (%) = 0.0485137 (3.63387)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36160.5 ave 36177 max 36150 min
Histogram: 1 1 0 0 1 0 0 0 0 1
FullNghs: 72321 ave 72321 max 72321 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 289284
Ave neighs/atom = 60.2675
Neighbor list builds = 0
Dangerous builds = 0
# reset_timestep $i
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.0387 Mbytes
+Memory usage per processor = 23.6491 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
1575 0 -18569.08790547054 -120696.2 -5.0503339e-12 -3.9139805e-13 6.7683706e-14
1576 0 -18569.08790547054 -120696.2 -5.0503339e-12 -3.9139805e-13 6.7683706e-14
-Loop time of 0.539415 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.116344 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.00513172 (0.951349)
+Pair time (%) = 0.00250775 (2.15546)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0307288 (5.69668)
-Outpt time (%) = 0.0395864 (7.33877)
-Other time (%) = 0.463968 (86.0132)
+Comm time (%) = 0.000256002 (0.220039)
+Outpt time (%) = 0.00654799 (5.62812)
+Other time (%) = 0.107032 (91.9964)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36175.5 ave 36206 max 36147 min
Histogram: 1 0 1 0 0 0 1 0 0 1
FullNghs: 72351 ave 72351 max 72351 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 289404
Ave neighs/atom = 60.2925
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.eshelby_static loop_i
variable strain equal $i*$s
variable strain equal 7*$s
variable strain equal 7*0.16000000000000000333
print ">>> step $i, total strain ${strain}"
>>> step 7, total strain 1.1200000000000001066
change_box all y delta 0 $s remap units lattice
change_box all y delta 0 0.16000000000000000333 remap units lattice
Changing box ...
orthogonal box = (-40.8 -40.8 0) to (40.8 45.3696 12.24)
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7254 Mbytes
+Memory usage per processor = 24.3358 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
1576 0 -18491.90169921529 -136205.45 0.14307644 0.0051325969 1.0172852e-13
1580 0 -18492.1310576982 -135456.73 0.12095202 0.0011746767 1.4052995e-13
1590 0 -18492.43123925865 -134349.55 -0.24024543 0.9903784 -1.7584198e-13
1600 0 -18492.52677637159 -134029.75 -0.27750893 -0.14147964 -8.1081843e-14
1610 0 -18492.54487664072 -133963.95 -0.026440274 0.078470791 1.7319913e-13
1620 0 -18492.54726511076 -133959.78 0.033197488 -0.011966987 1.1562539e-13
1630 0 -18492.54782232645 -133962.99 -0.022229907 -0.0082739991 1.1270845e-13
1640 0 -18492.54790581508 -133964.99 0.0004273738 -0.0098225601 1.9093147e-13
1650 0 -18492.54791271241 -133965.77 -0.00039139543 0.0001276143 8.4582688e-13
1660 0 -18492.5479137973 -133966.51 0.00060980725 -0.0001052093 1.9350329e-12
1670 0 -18492.54791403718 -133966.85 0.00023817137 -0.00052460153 2.0599427e-11
1680 0 -18492.54791412406 -133967.17 0.00012036401 0.00016590705 3.1029334e-11
1690 0 -18492.54791413136 -133967.22 4.3077888e-05 3.7995289e-05 2.1927101e-10
1700 0 -18492.54791413183 -133967.22 -2.1812294e-05 -2.2334739e-06 5.7539537e-11
1710 0 -18492.54791413153 -133967.22 -6.6937911e-07 2.7960399e-06 1.9197604e-12
1720 0 -18492.5479141317 -133967.22 2.699247e-06 2.5072053e-07 2.4410942e-13
1730 0 -18492.54791413172 -133967.22 5.4986594e-07 -2.6582947e-07 -8.9572447e-15
1740 0 -18492.54791413186 -133967.22 -3.0716408e-07 1.3843207e-06 4.2735693e-13
1750 0 -18492.54791413182 -133967.22 -2.7601617e-07 -9.7796011e-09 2.7825147e-12
1760 0 -18492.54791413178 -133967.22 -7.9591846e-08 -1.0148109e-07 8.6370928e-13
1770 0 -18492.54791413184 -133967.22 1.8878696e-08 -9.8577802e-09 3.5801223e-14
1780 0 -18492.54791413205 -133967.22 -6.1481142e-09 -4.2156327e-09 2.3894775e-13
1790 0 -18492.54791413176 -133967.22 -6.7764872e-10 2.9868985e-10 3.3884354e-14
1800 0 -18492.54791413182 -133967.22 1.4509676e-09 1.2334929e-09 -5.65702e-14
1810 0 -18492.5479141318 -133967.22 8.4658451e-10 -1.3259555e-10 -2.8058285e-14
1820 0 -18492.5479141317 -133967.22 -1.0651127e-10 -8.8667524e-11 6.1565336e-15
1830 0 -18492.54791413185 -133967.22 -4.1737809e-11 8.9127831e-11 -1.167573e-13
1840 0 -18492.54791413181 -133967.22 -5.2870488e-11 1.9493503e-11 -4.1844132e-14
1850 0 -18492.54791413184 -133967.22 -5.6782406e-12 1.2649759e-13 -1.0939426e-13
1860 0 -18492.54791413187 -133967.22 -1.9471408e-12 3.263459e-12 1.1285244e-14
1867 0 -18492.54791413186 -133967.22 6.9845188e-13 6.5521008e-12 -1.1701317e-13
-Loop time of 9.30006 on 4 procs for 291 steps with 4800 atoms
+Loop time of 3.02464 on 4 procs for 291 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18491.9016992 -18492.5479141 -18492.5479141
Force two-norm initial, final = 1.27584 9.73889e-12
Force max component initial, final = 0.189643 4.5029e-13
Final line search alpha, max atom move = 1 4.5029e-13
Iterations, force evaluations = 291 582
-Pair time (%) = 1.95602 (21.0323)
+Pair time (%) = 1.37771 (45.5497)
Neigh time (%) = 0 (0)
-Comm time (%) = 4.05937 (43.6488)
-Outpt time (%) = 0.0457499 (0.491931)
-Other time (%) = 3.23893 (34.8269)
+Comm time (%) = 0.7547 (24.9517)
+Outpt time (%) = 0.0729546 (2.41201)
+Other time (%) = 0.819273 (27.0866)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36079.5 ave 36110 max 36044 min
Histogram: 1 0 0 1 0 0 0 0 1 1
FullNghs: 72159 ave 72159 max 72159 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 288636
Ave neighs/atom = 60.1325
Neighbor list builds = 0
Dangerous builds = 0
# reset_timestep $i
run 1
Setting up run ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.0387 Mbytes
+Memory usage per processor = 23.6491 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
1867 0 -18492.54791413186 -133967.22 6.9777732e-13 6.551863e-12 -1.1686745e-13
1868 0 -18492.54791413186 -133967.22 6.9777732e-13 6.551863e-12 -1.1686745e-13
-Loop time of 0.296894 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.125086 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.00758874 (2.55605)
+Pair time (%) = 0.00307155 (2.45555)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00534135 (1.79908)
-Outpt time (%) = 0.00306052 (1.03085)
-Other time (%) = 0.280903 (94.614)
+Comm time (%) = 0.00186831 (1.49362)
+Outpt time (%) = 0.00662947 (5.29993)
+Other time (%) = 0.113517 (90.7509)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2856 ave 2856 max 2856 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 36094.5 ave 36117 max 36051 min
Histogram: 1 0 0 0 0 0 1 0 0 2
FullNghs: 72189 ave 72189 max 72189 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 288756
Ave neighs/atom = 60.1575
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.eshelby_static loop_i
variable strain equal $i*$s
variable strain equal 8*$s
variable strain equal 8*0.16000000000000000333
print ">>> step $i, total strain ${strain}"
>>> step 8, total strain 1.2800000000000000266
change_box all y delta 0 $s remap units lattice
change_box all y delta 0 0.16000000000000000333 remap units lattice
Changing box ...
orthogonal box = (-40.8 -40.8 0) to (40.8 46.0224 12.24)
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ...........done
-Memory usage per processor = 23.7254 Mbytes
+Memory usage per processor = 24.3358 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
1868 0 -18407.23836455257 -148059.35 0.17824806 0.0077631243 -1.6145679e-13
1870 0 -18407.35825930425 -147753.08 0.17162524 0.0068226839 5.1991397e-14
1880 0 -18407.83559382475 -145851.12 -0.021096249 -0.13180348 2.8685387e-13
1890 0 -18408.2015011047 -144020.77 -0.64909152 1.2116413 1.6853186e-13
1900 0 -18408.59292951682 -141218.96 -0.08302438 -0.47582143 -1.4403756e-13
1910 0 -18409.4765396664 -134179.79 0.81588279 0.52187663 -1.4081618e-14
1920 0 -18413.66102681115 -125476.69 -0.75246577 0.63898014 2.3906745e-13
1930 0 -18416.45369771184 -120852.21 0.62028044 -0.10465531 9.6651246e-13
1940 0 -18421.53975460122 -112486.78 -0.65003602 1.5468217 9.6126319e-13
1950 0 -18427.38266756838 -104240.11 -0.84329602 1.5646833 1.841461e-12
1960 0 -18435.07175167299 -93444.303 -0.37984669 2.2664338 3.4765593e-14
1970 0 -18441.73057718596 -83874.061 0.058480218 1.3986995 1.3299761e-12
1980 0 -18449.28291594671 -71174.024 0.063935535 1.163249 -1.3587948e-13
1990 0 -18456.10248218176 -63369.916 1.0177229 0.74671187 -1.6969395e-12
2000 0 -18464.9998740891 -54232.856 0.75646448 -0.26067276 -6.1633641e-12
2010 0 -18480.88491289675 -45481.647 0.78433604 2.2535262 1.5989705e-12
2020 0 -18500.1431770592 -40030.074 1.0452221 0.88528823 1.7144593e-12
2030 0 -18521.50155145743 -30200.138 2.2932883 2.6095268 4.6325582e-12
2040 0 -18537.85209559528 -16777.734 3.3443628 0.21170446 -1.5426219e-12
2050 0 -18542.89363908397 -9535.43 0.21119377 -0.23199164 -2.3318361e-12
2060 0 -18544.16187127086 -5630.8493 0.27761823 0.17400597 1.1770047e-12
2070 0 -18544.47853257111 -3453.3272 0.0052400191 0.56277282 -5.3569822e-13
2080 0 -18544.55460189864 -2361.9773 -0.034319823 0.11396983 8.0015682e-13
2090 0 -18544.57775090135 -1652.5596 0.063904673 0.020843455 6.1015602e-13
2100 0 -18544.58333280036 -1325.0949 0.0088898695 0.05436218 -3.1974944e-13
2110 0 -18544.58449704061 -1189.9357 -0.0081196536 0.023093202 1.3144347e-13
2120 0 -18544.58489130795 -1090.6528 -0.013334939 -0.00083308441 7.5689455e-14
2130 0 -18544.58499173266 -1051.4974 -0.007217772 0.0061402811 -3.8091058e-14
2140 0 -18544.58501317528 -1033.4783 0.00055171322 0.0007881195 -4.2004594e-14
2150 0 -18544.58501921195 -1024.1479 0.00064646979 0.0012980319 3.2533004e-14
2160 0 -18544.58502058311 -1019.8368 -0.00090273924 0.00044863611 -1.0888686e-13
2170 0 -18544.58502098134 -1017.7954 -0.00056580161 0.0005662624 -6.8519843e-14
2180 0 -18544.58502106684 -1016.9371 -0.00015623361 3.9990029e-05 1.5700288e-13
2190 0 -18544.58502108469 -1016.4696 -2.0813878e-05 8.8730455e-05 1.7381756e-13
2200 0 -18544.5850210904 -1016.2354 8.6129055e-06 -1.7118006e-05 -4.039824e-14
2210 0 -18544.58502109143 -1016.1477 -4.8479759e-06 8.8410543e-06 4.5199955e-14
2220 0 -18544.58502109175 -1016.0882 -1.5290276e-05 1.2769498e-05 1.7888468e-14
2230 0 -18544.58502109184 -1016.0561 -3.3543653e-06 5.4823802e-06 8.233865e-14
2240 0 -18544.58502109185 -1016.0425 -3.2853651e-07 1.3036026e-06 1.2482376e-13
2250 0 -18544.58502109189 -1016.0335 4.7657222e-07 6.1102889e-07 -7.725591e-14
2260 0 -18544.58502109182 -1016.0292 -2.5962662e-07 2.1173209e-07 -3.1006447e-14
2270 0 -18544.58502109182 -1016.0269 -2.5168543e-07 2.1347313e-07 -2.4950528e-14
2280 0 -18544.58502109193 -1016.0257 6.8141159e-08 3.3618215e-08 5.1035565e-14
2290 0 -18544.58502109191 -1016.0252 1.8988043e-08 6.7251267e-08 -1.104429e-13
2300 0 -18544.58502109201 -1016.0248 6.4237605e-08 1.3866362e-10 -1.1696547e-13
2310 0 -18544.58502109178 -1016.0247 1.3031489e-08 5.416356e-09 -9.1763402e-14
2320 0 -18544.58502109178 -1016.0246 -2.0349924e-10 1.2570585e-08 -1.196352e-13
2330 0 -18544.58502109163 -1016.0246 5.7314652e-10 -1.9545557e-09 -1.7981623e-13
2340 0 -18544.58502109184 -1016.0246 2.8219654e-09 4.0619579e-10 -2.5039346e-13
2350 0 -18544.58502109179 -1016.0246 1.2039679e-09 3.8910008e-10 1.2338047e-13
2360 0 -18544.58502109167 -1016.0246 4.8857533e-10 8.2124555e-12 -1.3082417e-13
2370 0 -18544.58502109163 -1016.0246 5.7344183e-11 1.4028061e-11 -7.1036926e-15
2380 0 -18544.58502109162 -1016.0246 6.9331788e-11 1.5899597e-10 1.4037903e-13
2390 0 -18544.58502109099 -1016.0246 1.7919444e-11 3.2794189e-12 1.1836018e-13
2400 0 -18544.58502109086 -1016.0246 4.7017882e-11 2.5658087e-12 -1.9249706e-13
2410 0 -18544.58502109079 -1016.0246 9.0523535e-12 -5.1709692e-12 -8.4116741e-14
2420 0 -18544.58502109054 -1016.0246 2.8651381e-12 8.1466436e-12 1.5645645e-13
2430 0 -18544.58502109047 -1016.0246 9.2212618e-13 -1.7898741e-13 9.6594607e-14
2432 0 -18544.58502109047 -1016.0246 -2.5384753e-13 1.381581e-12 7.1834899e-15
-Loop time of 5.84244 on 4 procs for 564 steps with 4800 atoms
+Loop time of 3.10784 on 4 procs for 564 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18407.2383646 -18544.5850211 -18544.5850211
Force two-norm initial, final = 1.27905 9.63484e-12
Force max component initial, final = 0.188373 4.51583e-13
Final line search alpha, max atom move = 1 4.51583e-13
Iterations, force evaluations = 564 1082
-Pair time (%) = 2.87584 (49.2232)
-Neigh time (%) = 0.265235 (4.53979)
-Comm time (%) = 1.7622 (30.162)
-Outpt time (%) = 0.027319 (0.467596)
-Other time (%) = 0.911857 (15.6075)
+Pair time (%) = 2.44265 (78.5963)
+Neigh time (%) = 0.251019 (8.07696)
+Comm time (%) = 0.192791 (6.20338)
+Outpt time (%) = 0.00628573 (0.202254)
+Other time (%) = 0.215096 (6.92107)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2700 ave 2700 max 2700 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 38596.5 ave 38637 max 38540 min
Histogram: 1 0 0 0 0 0 1 1 0 1
FullNghs: 77193 ave 77193 max 77193 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 308772
Ave neighs/atom = 64.3275
Neighbor list builds = 19
Dangerous builds = 0
# reset_timestep $i
run 1
Setting up run ...
ATC: computing bond matrix ..........done
-Memory usage per processor = 23.0387 Mbytes
+Memory usage per processor = 23.6491 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
2432 0 -18544.58502109047 -1016.0246 -2.5329791e-13 1.381277e-12 7.3534928e-15
2433 0 -18544.58502109047 -1016.0246 -2.5329791e-13 1.381277e-12 7.3534928e-15
-Loop time of 0.1929 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.14654 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.0026933 (1.39621)
+Pair time (%) = 0.00268549 (1.83259)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000305772 (0.158513)
-Outpt time (%) = 0.00638688 (3.31097)
-Other time (%) = 0.183514 (95.1343)
+Comm time (%) = 0.000291169 (0.198695)
+Outpt time (%) = 0.00642931 (4.38741)
+Other time (%) = 0.137134 (93.5813)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2700 ave 2700 max 2700 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 44940 ave 45026 max 44838 min
Histogram: 1 0 1 0 0 0 0 0 0 2
FullNghs: 89880 ave 89880 max 89880 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 359520
Ave neighs/atom = 74.9
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.eshelby_static loop_i
variable strain equal $i*$s
variable strain equal 9*$s
variable strain equal 9*0.16000000000000000333
print ">>> step $i, total strain ${strain}"
>>> step 9, total strain 1.4399999999999999467
change_box all y delta 0 $s remap units lattice
change_box all y delta 0 0.16000000000000000333 remap units lattice
Changing box ...
orthogonal box = (-40.8 -40.8 0) to (40.8 46.6752 12.24)
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ..........done
-Memory usage per processor = 23.7261 Mbytes
+Memory usage per processor = 24.3365 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
2433 0 -18537.76901415941 -24298.948 3.8747523e-13 5.2831402e-12 -6.6347969e-14
2440 0 -18540.01318499379 -16519.475 -3.2208582e-12 -2.7180729e-05 -4.0105939e-13
2450 0 -18543.0953686088 -5752.9757 8.4202206e-12 7.0443093 7.1120193e-14
2460 0 -18544.58421511342 -984.24581 4.48884e-13 0.11138675 -7.4289533e-14
2470 0 -18544.58494424724 -937.76995 -1.4907155e-12 -0.029415925 -1.4615392e-13
2480 0 -18544.58501777505 -1005.2306 -2.5313443e-12 -0.0028072577 4.4010802e-13
2490 0 -18544.58502108903 -1008.4303 -1.2945912e-12 0.00023653818 1.8944256e-12
2500 0 -18544.58502109101 -1008.5152 3.1169104e-13 1.8192203e-05 -3.9932814e-13
2510 0 -18544.58502109143 -1008.4451 -1.4675192e-12 -2.074999e-06 -1.7850652e-13
2520 0 -18544.58502109134 -1008.4422 3.9145238e-13 -1.3068582e-07 6.0760945e-13
2530 0 -18544.58502109258 -1008.4422 6.2648817e-12 -5.3016e-10 4.406718e-14
2540 0 -18544.58502109214 -1008.4423 -1.8432447e-11 2.1091244e-09 2.1755358e-12
2550 0 -18544.58502109095 -1008.4423 -1.588503e-13 3.5010943e-11 1.1601831e-14
2560 0 -18544.58502109056 -1008.4423 1.7819469e-13 1.3868038e-11 6.517703e-14
2570 0 -18544.58502109044 -1008.4423 1.4870776e-12 -1.2270293e-11 9.0609811e-14
2575 0 -18544.58502109047 -1008.4423 -2.3857825e-13 1.0195675e-11 6.0073474e-15
-Loop time of 0.756386 on 4 procs for 142 steps with 4800 atoms
+Loop time of 0.934876 on 4 procs for 142 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18537.7690142 -18544.5850211 -18544.5850211
Force two-norm initial, final = 2.90351 8.35114e-12
Force max component initial, final = 0.18742 4.36984e-13
Final line search alpha, max atom move = 1 4.36984e-13
Iterations, force evaluations = 142 284
-Pair time (%) = 0.661463 (87.4504)
+Pair time (%) = 0.69384 (74.2174)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.066303 (8.76576)
-Outpt time (%) = 0.00166374 (0.21996)
-Other time (%) = 0.0269565 (3.56385)
+Comm time (%) = 0.190337 (20.3596)
+Outpt time (%) = 0.00147843 (0.158142)
+Other time (%) = 0.0492197 (5.26484)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2700 ave 2700 max 2700 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 40500 ave 40568 max 40427 min
Histogram: 1 1 0 0 0 0 0 0 0 2
FullNghs: 81000 ave 81000 max 81000 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 324000
Ave neighs/atom = 67.5
Neighbor list builds = 0
Dangerous builds = 0
# reset_timestep $i
run 1
Setting up run ...
ATC: computing bond matrix ..........done
-Memory usage per processor = 23.0394 Mbytes
+Memory usage per processor = 23.6498 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
2575 0 -18544.58502109042 -1008.4423 -2.3877189e-13 1.0195595e-11 6.0385724e-15
2576 0 -18544.58502109042 -1008.4423 -2.3877189e-13 1.0195595e-11 6.0385724e-15
-Loop time of 0.201727 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.145015 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.00267446 (1.32578)
+Pair time (%) = 0.00267482 (1.84451)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000333369 (0.165258)
-Outpt time (%) = 0.00615078 (3.04907)
-Other time (%) = 0.192568 (95.4599)
+Comm time (%) = 0.000255167 (0.175959)
+Outpt time (%) = 0.00619352 (4.27094)
+Other time (%) = 0.135892 (93.7086)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2700 ave 2700 max 2700 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 44940 ave 45033 max 44832 min
Histogram: 1 1 0 0 0 0 0 0 0 2
FullNghs: 89880 ave 89880 max 89880 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 359520
Ave neighs/atom = 74.9
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.eshelby_static loop_i
variable strain equal $i*$s
variable strain equal 10*$s
variable strain equal 10*0.16000000000000000333
print ">>> step $i, total strain ${strain}"
>>> step 10, total strain 1.6000000000000000888
change_box all y delta 0 $s remap units lattice
change_box all y delta 0 0.16000000000000000333 remap units lattice
Changing box ...
orthogonal box = (-40.8 -40.8 0) to (40.8 47.328 12.24)
minimize 0.0 ${tol} 100000 1000000
minimize 0.0 9.999999999999999395e-12 100000 1000000
WARNING: Resetting reneighboring criteria during minimization (../min.cpp:173)
Setting up minimization ...
ATC: computing bond matrix ..........done
-Memory usage per processor = 23.7261 Mbytes
+Memory usage per processor = 24.3365 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
2576 0 -18537.86919514 -23952.428 -6.3755067e-13 1.8610839e-11 -6.2221062e-14
2580 0 -18539.14079053524 -19773.613 -6.9875621e-12 -2.1231065e-12 -7.5061485e-15
2590 0 -18542.20234735839 -8563.5634 3.3833963e-12 5.0447263 -9.290832e-14
2600 0 -18544.58003335739 -936.09475 -3.8256923e-12 0.15421118 -2.7653921e-13
2610 0 -18544.58488125377 -936.26337 -4.1992287e-13 -0.061485489 -9.5439281e-14
2620 0 -18544.58498734563 -969.47152 -2.7277214e-11 -0.0023912698 -1.5980862e-12
2630 0 -18544.5850210808 -1000.7463 3.2661308e-13 0.0004509302 -9.8292902e-14
2640 0 -18544.58502109149 -1001.032 -7.2744767e-13 -1.2247845e-05 -1.2311333e-14
2650 0 -18544.58502109259 -1000.9825 2.2260383e-12 1.1703007e-05 6.7454722e-13
2660 0 -18544.58502109259 -1000.9724 -5.3904045e-12 9.5787661e-08 1.8519162e-12
2670 0 -18544.58502109156 -1000.9723 -1.0012351e-12 -1.132507e-08 -4.9276555e-14
2680 0 -18544.58502109152 -1000.9723 -4.3052271e-13 9.7475523e-09 -5.7240497e-13
2690 0 -18544.58502109055 -1000.9724 3.8952735e-14 2.8103179e-10 1.3394841e-12
2700 0 -18544.58502109041 -1000.9724 3.6211563e-13 6.3288004e-12 3.3577308e-14
-Loop time of 0.771028 on 4 procs for 124 steps with 4800 atoms
+Loop time of 0.634397 on 4 procs for 124 steps with 4800 atoms
Minimization stats:
Stopping criterion = force tolerance
Energy initial, next-to-last, final =
-18537.8691951 -18544.5850211 -18544.5850211
Force two-norm initial, final = 2.8826 9.42071e-12
Force max component initial, final = 0.18607 4.28359e-13
Final line search alpha, max atom move = 1 4.28359e-13
Iterations, force evaluations = 124 248
-Pair time (%) = 0.602882 (78.192)
+Pair time (%) = 0.569101 (89.7074)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.13337 (17.2977)
-Outpt time (%) = 0.00144494 (0.187404)
-Other time (%) = 0.0333309 (4.32291)
+Comm time (%) = 0.0384364 (6.05872)
+Outpt time (%) = 0.00134099 (0.21138)
+Other time (%) = 0.0255188 (4.02253)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2700 ave 2700 max 2700 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 40500 ave 40577 max 40425 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 81000 ave 81000 max 81000 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 324000
Ave neighs/atom = 67.5
Neighbor list builds = 0
Dangerous builds = 0
# reset_timestep $i
run 1
Setting up run ...
ATC: computing bond matrix ..........done
-Memory usage per processor = 23.0394 Mbytes
+Memory usage per processor = 23.6498 Mbytes
Step KinEng PotEng Press fxsum fysum fzsum
2700 0 -18544.5850210904 -1000.9724 3.6220691e-13 6.3290068e-12 3.3001379e-14
2701 0 -18544.5850210904 -1000.9724 3.6220691e-13 6.3290068e-12 3.3001379e-14
-Loop time of 0.844953 on 4 procs for 1 steps with 4800 atoms
+Loop time of 0.146069 on 4 procs for 1 steps with 4800 atoms
-Pair time (%) = 0.00514245 (0.608608)
+Pair time (%) = 0.00264668 (1.81194)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.114826 (13.5896)
-Outpt time (%) = 0.0676661 (8.00826)
-Other time (%) = 0.657319 (77.7935)
+Comm time (%) = 0.000277281 (0.189828)
+Outpt time (%) = 0.00632149 (4.32773)
+Other time (%) = 0.136824 (93.6705)
Nlocal: 1200 ave 1200 max 1200 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2700 ave 2700 max 2700 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 44940 ave 45075 max 44784 min
Histogram: 1 0 1 0 0 0 0 0 1 1
FullNghs: 89880 ave 89880 max 89880 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 359520
Ave neighs/atom = 74.9
Neighbor list builds = 0
Dangerous builds = 0
next i
jump in.eshelby_static loop_i
diff --git a/examples/USER/atc/hardy/nvt.screen b/examples/USER/atc/hardy/nvt.screen
index cdf62c72e..d6d9392b9 100644
--- a/examples/USER/atc/hardy/nvt.screen
+++ b/examples/USER/atc/hardy/nvt.screen
@@ -1,88 +1,90 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
dimension 3
boundary p p p
lattice fcc 5.376 orient x 1 0 0 orient y 0 1 0 orient z 0 0 1
Lattice spacing in x,y,z = 5.376 5.376 5.376
region box block 0 5 0 5 0 5
read_data nvt.data
Reading data file ...
orthogonal box = (0 0 0) to (26.88 26.88 26.88)
1 by 2 by 2 MPI processor grid
500 atoms
500 velocities
pair_style lj/cut 13.0
pair_coeff 1 1 0.2381 3.405
group internal region box
500 atoms in group internal
fix ATC internal atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify ATC mesh create 1 1 1 box p p p
ATC: created uniform mesh with 8 nodes, 1 unique nodes, and 1 elements
fix_modify ATC atom_element_map eulerian 100
fix_modify ATC fields none
fix_modify ATC fields add mass_density energy stress temperature kinetic_temperature
fix_modify ATC fields add velocity thermal_energy kinetic_energy
fix_modify ATC output nvtFE 100 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix PP internal atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify PP filter type step # defaults to running
fix_modify PP filter on
fix_modify PP mesh create 1 1 1 box p p p
ATC: created uniform mesh with 8 nodes, 1 unique nodes, and 1 elements
fix_modify PP atom_element_map eulerian 100
fix_modify PP fields add mass_density energy stress temperature kinetic_temperature
fix_modify PP fields add velocity thermal_energy kinetic_energy
fix_modify PP output nvtPP 100 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
thermo 100
compute_modify thermo_temp extra 0
thermo_style custom step temp etotal ke pe press vol
timestep 4.0
reset_timestep 0
fix NVT all nvt temp 30 30 10.0 drag 0.2 tchain 1
log nvt.log
run 1000
Setting up run ...
ATC: computing bond matrix ...........done
ATC: computing bond matrix ...........done
Memory usage per processor = 40.9608 Mbytes
Step Temp TotEng KinEng PotEng Press Volume
0 31.104176 -898.55796 46.35782 -944.91578 -584.20571 19421.725
100 29.954062 -903.43223 44.643685 -948.07591 -646.45662 19421.725
200 29.952147 -900.39726 44.640831 -945.03809 -583.44492 19421.725
300 29.91148 -902.38105 44.58022 -946.96127 -626.6874 19421.725
400 29.936718 -900.07678 44.617835 -944.69461 -580.74144 19421.725
500 29.952289 -899.58418 44.641042 -944.22522 -570.0108 19421.725
600 29.980195 -901.64307 44.682633 -946.3257 -614.13849 19421.725
700 29.88447 -901.31686 44.539965 -945.85683 -604.74508 19421.725
800 29.876839 -900.32866 44.528592 -944.85725 -587.67852 19421.725
900 29.966977 -899.86769 44.662933 -944.53062 -581.80498 19421.725
1000 29.907621 -901.57887 44.574469 -946.15334 -613.00908 19421.725
-Loop time of 6.81743 on 4 procs for 1000 steps with 500 atoms
+Loop time of 1.38273 on 4 procs for 1000 steps with 500 atoms
-Pair time (%) = 0.99375 (14.5766)
+Pair time (%) = 0.747143 (54.0337)
Neigh time (%) = 0 (0)
-Comm time (%) = 2.8781 (42.2167)
-Outpt time (%) = 0.115153 (1.6891)
-Other time (%) = 2.83043 (41.5175)
+Comm time (%) = 0.297985 (21.5504)
+Outpt time (%) = 0.000655055 (0.0473739)
+Other time (%) = 0.336952 (24.3685)
Nlocal: 125 ave 129 max 121 min
Histogram: 1 0 0 0 0 2 0 0 0 1
Nghost: 2563 ave 2567 max 2559 min
Histogram: 1 0 0 0 0 2 0 0 0 1
Neighs: 22787.2 ave 23476 max 22083 min
Histogram: 1 0 0 0 0 2 0 0 0 1
FullNghs: 45574.5 ave 47047 max 44066 min
Histogram: 1 0 0 0 0 2 0 0 0 1
Total # of neighbors = 182298
Ave neighs/atom = 364.596
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/mesh/gaussianIC1d_hex.screen b/examples/USER/atc/mesh/gaussianIC1d_hex.screen
index da11d82c5..2805ce555 100644
--- a/examples/USER/atc/mesh/gaussianIC1d_hex.screen
+++ b/examples/USER/atc/mesh/gaussianIC1d_hex.screen
@@ -1,107 +1,108 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region mdRegion block -12 12 -3 3 -3 3
region mdInternal block -10 10 -3 3 -3 3
# create atoms
boundary f p p
create_box 1 mdRegion
Created orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
4 by 1 by 1 MPI processor grid
create_atoms 1 region mdRegion
Created 3456 atoms
mass 1 39.95
pair_style lj/cut 13.5
pair_coeff 1 1 .238 3.405 13.5
# specify interal/ghost atoms
group internal region mdInternal
2880 atoms in group internal
velocity internal create 40 87287 mom yes loop geom # <<< NOTE
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# ID group atc PhysicsType ParameterFile
fix AtC internal atc two_temperature Ar_ttm.mat
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
fix_modify AtC mesh read gaussianIC1d_hex.mesh
ATC: read 44 nodes
ATC: read 10 HEX8 elements
ATC: WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive
# fix a temperature
fix_modify AtC fix temperature all 20.0
fix_modify AtC initial temperature all 20.0
fix_modify AtC initial electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
fix_modify AtC fix electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
# turn on thermostat
fix_modify AtC extrinsic exchange off
fix_modify AtC control thermal rescale 10
# equilibrate MD field
timestep 5.0
thermo 10
#output
fix_modify AtC output gaussianIC1d_hexFE 10 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
# change thermostat
fix_modify AtC unfix temperature all
fix_modify AtC unfix electron_temperature all
fix_modify AtC control thermal flux
fix_modify AtC extrinsic exchange on
fix_modify AtC extrinsic electron_integration explicit 10
# run with FE
thermo_style custom step temp pe f_AtC[2] f_AtC[4]
reset_timestep 0
run 100 # 400
Setting up run ...
Memory usage per processor = 52.9302 Mbytes
Step Temp PotEng AtC[2] AtC[4]
0 33.331404 -6667.7177 20 21.852118
10 29.605914 -6628.8617 15.526061 21.823928
20 20.144352 -6529.8249 4.1452637 21.728037
30 10.661516 -6429.3908 -7.2917185 21.537517
40 7.6716875 -6394.7484 -10.961235 21.28913
50 11.012891 -6425.2214 -7.0020953 21.050343
60 15.276591 -6465.7767 -1.8390571 20.85387
70 17.15209 -6482.1581 0.55215503 20.688207
80 17.028137 -6478.0796 0.55504167 20.530699
90 16.865355 -6473.5664 0.41999569 20.372106
100 17.920474 -6481.673 1.6267665 20.219157
-Loop time of 5.05638 on 4 procs for 100 steps with 3456 atoms
+Loop time of 4.26037 on 4 procs for 100 steps with 3456 atoms
-Pair time (%) = 0.947014 (18.7291)
-Neigh time (%) = 0.418835 (8.2833)
-Comm time (%) = 0.338576 (6.69601)
-Outpt time (%) = 0.024951 (0.493455)
-Other time (%) = 3.327 (65.7981)
+Pair time (%) = 0.909909 (21.3575)
+Neigh time (%) = 0.421105 (9.88424)
+Comm time (%) = 0.215845 (5.06635)
+Outpt time (%) = 0.0073958 (0.173595)
+Other time (%) = 2.70611 (63.5183)
Nlocal: 864 ave 864 max 864 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 6741 ave 7924 max 5558 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 272828 ave 288265 max 257696 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 545657 ave 575527 max 515800 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 2182628
Ave neighs/atom = 631.547
Neighbor list builds = 10
Dangerous builds = 0
diff --git a/examples/USER/atc/mesh/gaussianIC2d_hex.screen b/examples/USER/atc/mesh/gaussianIC2d_hex.screen
index 65c3ef807..8e81dbb48 100644
--- a/examples/USER/atc/mesh/gaussianIC2d_hex.screen
+++ b/examples/USER/atc/mesh/gaussianIC2d_hex.screen
@@ -1,286 +1,287 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable L equal 12
variable l2 equal 6
variable l equal 4
variable w equal 2
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region mdRegion cylinder z 0. 0. ${l2} -$w $w
region mdRegion cylinder z 0. 0. 6 -$w $w
region mdRegion cylinder z 0. 0. 6 -2 $w
region mdRegion cylinder z 0. 0. 6 -2 2
region mdInternal cylinder z 0. 0. $l -$w $w
region mdInternal cylinder z 0. 0. 4 -$w $w
region mdInternal cylinder z 0. 0. 4 -2 $w
region mdInternal cylinder z 0. 0. 4 -2 2
boundary f f f
pair_style lj/cut 13.5
read_data circle_temp.init
Reading data file ...
orthogonal box = (-64.86 -64.86 -10.81) to (64.86 64.86 10.81)
2 by 2 by 1 MPI processor grid
1792 atoms
1792 velocities
fix ZWALLS all wall/reflect zlo EDGE zhi EDGE
mass 1 39.95
pair_coeff 1 1 .238 3.405 13.5
group internal region mdInternal
832 atoms in group internal
group ghost subtract all internal
960 atoms in group ghost
fix AtC internal atc two_temperature Ar_ttm.mat
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
# computational geometry
fix_modify AtC mesh read gaussianIC2d_hex.mesh
ATC: read 388 nodes
ATC: read 173 HEX8 elements
ATC: created nodeset 11 with 22 nodes
ATC: created nodeset 12 with 22 nodes
ATC: WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive
#fix_modify AtC mesh read gaussianIC2d_hex.exo
#fix_modify AtC mesh read gaussianIC2d_hex2.exo
#fix_modify AtC mesh read gaussianIC2d_hex2.mesh
fix_modify AtC mesh write parsed_gaussianIC2d_hex.mesh
fix_modify AtC mesh output gaussianIC2d_hexMESH
fix_modify AtC boundary ghost
# numerical parameters
fix_modify AtC time_integration fractional_step
fix_modify AtC internal_quadrature off
# initial conditions
fix_modify AtC fix temperature all 20.0
# NOTE this is only gaussian in x
fix_modify AtC fix electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
# thermostat
fix_modify AtC control thermal rescale 10
fix_modify AtC extrinsic exchange off
# run to equilibrate
thermo_style custom step temp pe f_AtC[2] f_AtC[4]
timestep 1.0
thermo 10
run 400
Setting up run ...
-Memory usage per processor = 91.5244 Mbytes
+Memory usage per processor = 50.5401 Mbytes
Step Temp PotEng AtC[2] AtC[4]
0 18.559464 -2927.2438 20 22.619065
10 9.2908989 -2926.8636 20 22.619065
20 9.2908989 -2926.1076 20 22.619065
30 9.2908989 -2924.9455 20 22.619065
40 9.2908989 -2923.3809 20 22.619065
50 9.2908989 -2921.4179 20 22.619065
60 9.2908989 -2919.0624 20 22.619065
70 9.2908989 -2916.3227 20 22.619065
80 9.2908989 -2913.2105 20 22.619065
90 9.2908989 -2909.7421 20 22.619065
100 9.2908989 -2905.9396 20 22.619065
110 9.2908989 -2901.8364 20 22.619065
120 9.2908989 -2897.474 20 22.619065
130 9.2908989 -2892.8985 20 22.619065
140 9.2908989 -2888.1815 20 22.619065
150 9.2908989 -2883.3945 20 22.619065
160 9.2908989 -2878.6283 20 22.619065
170 9.2908989 -2873.9874 20 22.619065
180 9.2908989 -2869.5705 20 22.619065
190 9.2908989 -2865.4802 20 22.619065
200 9.2908989 -2861.8004 20 22.619065
210 9.2908989 -2858.6064 20 22.619065
220 9.2908989 -2855.9338 20 22.619065
230 9.2908989 -2853.7842 20 22.619065
240 9.2908989 -2852.155 20 22.619065
250 9.2908989 -2850.9801 20 22.619065
260 9.2908989 -2850.2014 20 22.619065
270 9.2908989 -2849.745 20 22.619065
280 9.2908989 -2849.5468 20 22.619065
290 9.2908989 -2849.5383 20 22.619065
300 9.2908989 -2849.6571 20 22.619065
310 9.2908989 -2849.8648 20 22.619065
320 9.2908989 -2850.1261 20 22.619065
330 9.2908989 -2850.4068 20 22.619065
340 9.2908989 -2850.6989 20 22.619065
350 9.2908989 -2850.9948 20 22.619065
360 9.2908989 -2851.2898 20 22.619065
370 9.2908989 -2851.5911 20 22.619065
380 9.2908989 -2851.9001 20 22.619065
390 9.2908989 -2852.2299 20 22.619065
400 9.2908989 -2852.6005 20 22.619065
-Loop time of 26.8725 on 4 procs for 400 steps with 1792 atoms
+Loop time of 18.4213 on 4 procs for 400 steps with 1792 atoms
-Pair time (%) = 1.1555 (4.29993)
+Pair time (%) = 1.11548 (6.05539)
Neigh time (%) = 0 (0)
-Comm time (%) = 3.3023 (12.2888)
-Outpt time (%) = 0.070357 (0.261817)
-Other time (%) = 22.3444 (83.1495)
+Comm time (%) = 0.398548 (2.16351)
+Outpt time (%) = 0.043588 (0.236617)
+Other time (%) = 16.8637 (91.5445)
Nlocal: 448 ave 448 max 448 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 696 ave 696 max 696 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 51280 ave 52662 max 49886 min
Histogram: 1 1 0 0 0 0 0 0 0 2
FullNghs: 102560 ave 102560 max 102560 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 410240
Ave neighs/atom = 228.929
Neighbor list builds = 0
Dangerous builds = 0
# boundary conditions
fix_modify AtC unfix temperature all
fix_modify AtC unfix electron_temperature all
fix_modify AtC fix temperature 11 20.0
fix_modify AtC fix temperature 12 20.0
# numerical parameters
fix_modify AtC extrinsic electron_integration explicit 10
# thermostat
fix_modify AtC control thermal flux
fix_modify AtC extrinsic exchange on
# output
fix_modify AtC output gaussianIC2d_hexFE 10 full_text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
dump D1 all atom 10 gaussianIC2d_hex.dmp
# relax the system
run 1000
Setting up run ...
-Memory usage per processor = 96.3294 Mbytes
+Memory usage per processor = 55.345 Mbytes
Step Temp PotEng AtC[2] AtC[4]
400 9.2908989 -2852.6005 20 22.619065
410 9.3739709 -2853.0186 20.040932 22.611409
420 9.4777325 -2853.5491 20.093686 22.603893
430 9.603939 -2854.2014 20.159312 22.596534
440 9.7542127 -2854.9791 20.238859 22.589353
450 9.9295278 -2855.9033 20.332984 22.582373
460 10.130063 -2856.9771 20.441869 22.575614
470 10.35505 -2858.1731 20.565152 22.569098
480 10.602677 -2859.5024 20.701879 22.562845
490 10.870017 -2860.9396 20.85048 22.556874
500 11.153033 -2862.4773 21.008778 22.551199
510 11.446646 -2864.0797 21.174034 22.545832
520 11.744908 -2865.7188 21.343051 22.540779
530 12.041263 -2867.364 21.512313 22.53604
540 12.328877 -2868.9829 21.678162 22.531611
550 12.600994 -2870.5197 21.836981 22.527482
560 12.851303 -2871.9663 21.985384 22.523636
570 13.074293 -2873.2785 22.120399 22.520052
580 13.265513 -2874.4253 22.239594 22.516705
590 13.421751 -2875.3914 22.341174 22.513566
600 13.541109 -2876.1789 22.424015 22.510605
610 13.623016 -2876.7775 22.487675 22.507788
620 13.668152 -2877.1854 22.532362 22.505085
630 13.678331 -2877.4076 22.558874 22.502464
640 13.656332 -2877.4627 22.568531 22.499895
650 13.605722 -2877.3683 22.563078 22.497353
660 13.530708 -2877.1524 22.544625 22.494813
670 13.435942 -2876.8175 22.515544 22.492256
680 13.326383 -2876.406 22.478395 22.489667
690 13.207157 -2875.947 22.435845 22.487033
700 13.083403 -2875.4566 22.390572 22.484348
710 12.960144 -2874.9651 22.345189 22.48161
720 12.842152 -2874.501 22.302149 22.478818
730 12.73379 -2874.0887 22.263653 22.47598
740 12.638847 -2873.7524 22.231544 22.473103
750 12.560388 -2873.4976 22.207229 22.470197
760 12.500634 -2873.3389 22.191608 22.467277
770 12.46088 -2873.2928 22.185044 22.464357
780 12.441476 -2873.3551 22.187384 22.46145
790 12.441898 -2873.5323 22.198021 22.458571
800 12.46082 -2873.805 22.215988 22.455733
810 12.49627 -2874.168 22.240082 22.452947
820 12.545761 -2874.6084 22.268974 22.450223
830 12.606442 -2875.1154 22.30132 22.447568
840 12.675209 -2875.662 22.335827 22.444987
850 12.748831 -2876.2487 22.37131 22.442482
860 12.82405 -2876.8458 22.406711 22.440055
870 12.897672 -2877.4308 22.441104 22.437705
880 12.966664 -2877.9918 22.473679 22.435429
890 13.028239 -2878.5162 22.503727 22.433223
900 13.079989 -2878.9972 22.530647 22.431081
910 13.120007 -2879.4076 22.553961 22.428997
920 13.147015 -2879.7527 22.573337 22.426963
930 13.16047 -2880.0242 22.58862 22.424972
940 13.160646 -2880.2274 22.59987 22.423016
950 13.148646 -2880.3654 22.607373 22.421086
960 13.126349 -2880.4343 22.611652 22.419177
970 13.096257 -2880.4731 22.613422 22.417282
980 13.061264 -2880.4808 22.61352 22.415397
990 13.024335 -2880.4734 22.612794 22.413521
1000 12.988154 -2880.4712 22.611974 22.411652
1010 12.954832 -2880.4752 22.61156 22.409791
1020 12.925706 -2880.5039 22.611782 22.407939
1030 12.901268 -2880.5535 22.612583 22.406098
1040 12.88122 -2880.6284 22.613671 22.404269
1050 12.864638 -2880.7185 22.614595 22.402454
1060 12.850161 -2880.8186 22.614818 22.400653
1070 12.836182 -2880.9229 22.613762 22.398864
1080 12.820975 -2881.0195 22.610813 22.397087
1090 12.802812 -2881.1106 22.605315 22.395317
1100 12.780035 -2881.173 22.596564 22.39355
1110 12.751178 -2881.197 22.583861 22.391781
1120 12.715144 -2881.1906 22.566647 22.390003
1130 12.671396 -2881.1397 22.544644 22.388208
1140 12.620084 -2881.0462 22.517962 22.386389
1150 12.562182 -2880.9131 22.487201 22.384538
1160 12.499543 -2880.7564 22.453506 22.382651
1170 12.434887 -2880.5794 22.418573 22.380722
1180 12.371719 -2880.4084 22.384601 22.378752
1190 12.314101 -2880.2706 22.354147 22.376742
1200 12.266306 -2880.174 22.329904 22.374701
1210 12.232344 -2880.154 22.31439 22.372639
1220 12.215387 -2880.2186 22.309572 22.370571
1230 12.217218 -2880.3818 22.316512 22.368514
1240 12.237824 -2880.6446 22.335104 22.366485
1250 12.275283 -2880.9982 22.36402 22.364503
1260 12.325989 -2881.4247 22.400878 22.362581
1270 12.385157 -2881.8965 22.442588 22.360729
1280 12.447441 -2882.39 22.485773 22.358953
1290 12.507528 -2882.8684 22.527171 22.357252
1300 12.560627 -2883.3106 22.563936 22.355622
1310 12.602763 -2883.7013 22.59382 22.354054
1320 12.630896 -2884.014 22.615213 22.352535
1330 12.642918 -2884.2415 22.627102 22.351052
1340 12.63759 -2884.376 22.628986 22.349588
1350 12.614465 -2884.4144 22.620781 22.348128
1360 12.573824 -2884.3577 22.602735 22.346656
1370 12.516666 -2884.2059 22.575396 22.345156
1380 12.444674 -2883.9691 22.539592 22.343613
1390 12.360208 -2883.6693 22.496432 22.342016
1400 12.266237 -2883.307 22.447301 22.340354
-Loop time of 294.852 on 4 procs for 1000 steps with 1792 atoms
+Loop time of 113.07 on 4 procs for 1000 steps with 1792 atoms
-Pair time (%) = 3.79985 (1.28873)
-Neigh time (%) = 0.0335855 (0.0113906)
-Comm time (%) = 18.051 (6.12205)
-Outpt time (%) = 3.2335 (1.09665)
-Other time (%) = 269.734 (91.4812)
+Pair time (%) = 2.80277 (2.4788)
+Neigh time (%) = 0.0123174 (0.0108937)
+Comm time (%) = 0.853601 (0.754934)
+Outpt time (%) = 1.49777 (1.32464)
+Other time (%) = 107.903 (95.4307)
Nlocal: 448 ave 448 max 448 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 696 ave 696 max 696 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 52292.2 ave 52503 max 52099 min
Histogram: 2 0 0 0 0 0 0 0 1 1
FullNghs: 104584 ave 104823 max 104416 min
Histogram: 1 1 0 0 1 0 0 0 0 1
Total # of neighbors = 418338
Ave neighs/atom = 233.448
Neighbor list builds = 2
Dangerous builds = 0
diff --git a/examples/USER/atc/mesh/gaussianIC2d_hex20_uniform.screen b/examples/USER/atc/mesh/gaussianIC2d_hex20_uniform.screen
index 65ddc1924..1a36f415c 100644
--- a/examples/USER/atc/mesh/gaussianIC2d_hex20_uniform.screen
+++ b/examples/USER/atc/mesh/gaussianIC2d_hex20_uniform.screen
@@ -1,106 +1,107 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable L equal 12
variable l2 equal 6
variable l equal 4
variable w equal 2
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region mdInternal block -$l $l -$l $l -$w $w
region mdInternal block -4 $l -$l $l -$w $w
region mdInternal block -4 4 -$l $l -$w $w
region mdInternal block -4 4 -4 $l -$w $w
region mdInternal block -4 4 -4 4 -$w $w
region mdInternal block -4 4 -4 4 -2 $w
region mdInternal block -4 4 -4 4 -2 2
boundary f f f # p
pair_style lj/cut 13.5
read_data temp.init
Reading data file ...
orthogonal box = (-64.86 -64.86 -10.81) to (64.86 64.86 10.81)
2 by 2 by 1 MPI processor grid
2304 atoms
2304 velocities
fix ZWALLS all wall/reflect zlo EDGE zhi EDGE
mass 1 39.95
pair_coeff 1 1 .238 3.405 13.5
group internal region mdInternal
1024 atoms in group internal
fix AtC internal atc two_temperature Ar_ttm.mat
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
fix_modify AtC mesh read gaussianIC2d_hex20_uniform.mesh
ATC: read 803 nodes
ATC: read 100 HEX20 elements
ATC: created nodeset 11 with 53 nodes
ATC: created nodeset 12 with 53 nodes
ATC: WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive
fix_modify AtC output gaussianIC2d_hex20_uniformFE 10 full_text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC initial temperature all 20.0
# NOTE this is only gaussian in x
fix_modify AtC initial electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
fix_modify AtC fix temperature 11 20.0
fix_modify AtC fix temperature 12 20.0
fix_modify AtC control thermal flux
fix_modify AtC extrinsic exchange on
fix_modify AtC extrinsic electron_integration explicit 10
thermo_style custom step temp pe f_AtC[2] f_AtC[4]
timestep 1.0
thermo 10
run 100
Setting up run ...
DiagonalMatrix::inv(): Warning: Matrix is badly scaled. RCOND = -0.1875
DiagonalMatrix::inv(): Warning: Matrix is badly scaled. RCOND = -0.1875
DiagonalMatrix::inv(): Warning: Matrix is badly scaled. RCOND = -0.1875
DiagonalMatrix::inv(): Warning: Matrix is badly scaled. RCOND = -0.1875
DiagonalMatrix::inv(): Warning: Matrix is badly scaled. RCOND = -0.1875
DiagonalMatrix::inv(): Warning: Matrix is badly scaled. RCOND = -0.1875
DiagonalMatrix::inv(): Warning: Matrix is badly scaled. RCOND = -0.1875
DiagonalMatrix::inv(): Warning: Matrix is badly scaled. RCOND = -0.1875
Memory usage per processor = 115.483 Mbytes
Step Temp PotEng AtC[2] AtC[4]
0 9.9496068 -3732.5766 20 21.685336
10 9.9699944 -3732.6743 20.008305 21.694995
20 9.9879237 -3732.7594 20.015777 21.704833
30 10.002475 -3732.8273 20.02158 21.714852
40 10.013007 -3732.8613 20.025464 21.725057
50 10.019238 -3732.8657 20.027325 21.735449
60 10.021286 -3732.8402 20.027223 21.746031
70 10.019648 -3732.7833 20.025372 21.756808
80 10.015134 -3732.7051 20.022115 21.767782
90 10.008795 -3732.612 20.017899 21.778957
100 10.001827 -3732.5177 20.013234 21.790338
-Loop time of 19.9066 on 4 procs for 100 steps with 2304 atoms
+Loop time of 11.1578 on 4 procs for 100 steps with 2304 atoms
-Pair time (%) = 0.396025 (1.98942)
+Pair time (%) = 0.343728 (3.08059)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.421989 (2.11984)
-Outpt time (%) = 0.125925 (0.63258)
-Other time (%) = 18.9627 (95.2582)
+Comm time (%) = 0.0180171 (0.161474)
+Outpt time (%) = 0.115886 (1.03861)
+Other time (%) = 10.6802 (95.7193)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 720 ave 720 max 720 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 67354.5 ave 67632 max 66958 min
Histogram: 1 0 0 0 0 1 0 0 1 1
FullNghs: 134709 ave 134859 max 134422 min
Histogram: 1 0 0 0 0 0 0 1 1 1
Total # of neighbors = 538836
Ave neighs/atom = 233.87
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/mesh/gaussianIC2d_hex27_uniform.screen b/examples/USER/atc/mesh/gaussianIC2d_hex27_uniform.screen
index 38cd4e350..399bb0ef1 100644
--- a/examples/USER/atc/mesh/gaussianIC2d_hex27_uniform.screen
+++ b/examples/USER/atc/mesh/gaussianIC2d_hex27_uniform.screen
@@ -1,98 +1,99 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable L equal 12
variable l2 equal 6
variable l equal 4
variable w equal 2
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region mdInternal block -$l $l -$l $l -$w $w
region mdInternal block -4 $l -$l $l -$w $w
region mdInternal block -4 4 -$l $l -$w $w
region mdInternal block -4 4 -4 $l -$w $w
region mdInternal block -4 4 -4 4 -$w $w
region mdInternal block -4 4 -4 4 -2 $w
region mdInternal block -4 4 -4 4 -2 2
boundary f f f # p
pair_style lj/cut 13.5
read_data temp.init
Reading data file ...
orthogonal box = (-64.86 -64.86 -10.81) to (64.86 64.86 10.81)
2 by 2 by 1 MPI processor grid
2304 atoms
2304 velocities
fix ZWALLS all wall/reflect zlo EDGE zhi EDGE
mass 1 39.95
pair_coeff 1 1 .238 3.405 13.5
group internal region mdInternal
1024 atoms in group internal
fix AtC internal atc two_temperature Ar_ttm.mat
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
fix_modify AtC mesh read gaussianIC2d_hex27_uniform.mesh
ATC: read 1323 nodes
ATC: read 100 HEX27 elements
ATC: created nodeset 11 with 63 nodes
ATC: created nodeset 12 with 63 nodes
ATC: WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive
fix_modify AtC output gaussianIC2d_hex27_uniformFE 10 full_text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC initial temperature all 20.0
# NOTE this is only gaussian in x
fix_modify AtC initial electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
fix_modify AtC fix temperature 11 20.0
fix_modify AtC fix temperature 12 20.0
fix_modify AtC control thermal flux
fix_modify AtC extrinsic exchange on
fix_modify AtC extrinsic electron_integration explicit 10
thermo_style custom step temp pe f_AtC[2] f_AtC[4]
timestep 1.0
thermo 10
run 100
Setting up run ...
Memory usage per processor = 151.827 Mbytes
Step Temp PotEng AtC[2] AtC[4]
0 9.9496068 -3732.5766 20 21.562235
10 9.9699622 -3732.6743 20.007315 21.548252
20 9.9878746 -3732.7599 20.014881 21.535376
30 10.002549 -3732.8288 20.02203 21.523502
40 10.013448 -3732.8655 20.028514 21.512538
50 10.020357 -3732.8733 20.034158 21.502398
60 10.023429 -3732.8538 20.038874 21.493003
70 10.02316 -3732.8028 20.042672 21.484284
80 10.020335 -3732.7341 20.045647 21.476176
90 10.015946 -3732.6496 20.047969 21.468622
100 10.011086 -3732.5676 20.049857 21.461569
-Loop time of 21.8378 on 4 procs for 100 steps with 2304 atoms
+Loop time of 13.9548 on 4 procs for 100 steps with 2304 atoms
-Pair time (%) = 0.387772 (1.77569)
+Pair time (%) = 0.343248 (2.45972)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.458654 (2.10028)
-Outpt time (%) = 0.208197 (0.95338)
-Other time (%) = 20.7831 (95.1706)
+Comm time (%) = 0.0172607 (0.12369)
+Outpt time (%) = 0.189404 (1.35727)
+Other time (%) = 13.4048 (96.0593)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 720 ave 720 max 720 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 67354.5 ave 67632 max 66958 min
Histogram: 1 0 0 0 0 1 0 0 1 1
FullNghs: 134709 ave 134859 max 134422 min
Histogram: 1 0 0 0 0 0 0 1 1 1
Total # of neighbors = 538836
Ave neighs/atom = 233.87
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/mesh/gaussianIC2d_hex_uniform.screen b/examples/USER/atc/mesh/gaussianIC2d_hex_uniform.screen
index 88a053720..ffdb324cb 100644
--- a/examples/USER/atc/mesh/gaussianIC2d_hex_uniform.screen
+++ b/examples/USER/atc/mesh/gaussianIC2d_hex_uniform.screen
@@ -1,124 +1,125 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable L equal 12
variable l2 equal 6
variable l equal 4
variable w equal 2
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region mdInternal block -$l $l -$l $l -$w $w
region mdInternal block -4 $l -$l $l -$w $w
region mdInternal block -4 4 -$l $l -$w $w
region mdInternal block -4 4 -4 $l -$w $w
region mdInternal block -4 4 -4 4 -$w $w
region mdInternal block -4 4 -4 4 -2 $w
region mdInternal block -4 4 -4 4 -2 2
boundary f f f # p
pair_style lj/cut 13.5
read_data temp.init
Reading data file ...
orthogonal box = (-64.86 -64.86 -10.81) to (64.86 64.86 10.81)
2 by 2 by 1 MPI processor grid
2304 atoms
2304 velocities
fix ZWALLS all wall/reflect zlo EDGE zhi EDGE
mass 1 39.95
pair_coeff 1 1 .238 3.405 13.5
group internal region mdInternal
1024 atoms in group internal
fix AtC internal atc two_temperature Ar_ttm.mat
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
-terminate called after throwing an instance of ' ATC: peratom PE compute created with ID: 3
+ ATC: version 2.0
+ ATC: peratom PE compute created with ID: 3
+terminate called after throwing an instance of 'terminate called after throwing an instance of 'ATC::ATC_Error'
+[pharsalus:44875] *** Process received signal ***
+[pharsalus:44875] Signal: Aborted (6)
+[pharsalus:44875] Signal code: (-6)
+terminate called after throwing an instance of 'ATC::ATC_Error'
+[pharsalus:44881] *** Process received signal ***
+[pharsalus:44881] Signal: Aborted (6)
+[pharsalus:44881] Signal code: (-6)
+terminate called after throwing an instance of 'ATC::ATC_Error'
+[pharsalus:44889] *** Process received signal ***
+ ATC: P1, ERROR: mesh file is of unknown type.
+ ATC: P2, ERROR: mesh file is of unknown type.
+ ATC: P3, ERROR: mesh file is of unknown type.
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
#fix_modify AtC mesh read gaussianIC2d_hex_uniform.mesh f f p
fix_modify AtC mesh read gaussianIC2d_hex_uniform.exo f f p
ATC: P0, ERROR: mesh file is of unknown type.
+[pharsalus:44889] Signal: Aborted (6)
+[pharsalus:44889] Signal code: (-6)
ATC::ATC_Error'
-[pharsalus:35393] *** Process received signal ***
-[pharsalus:35393] Signal: Aborted (6)
-[pharsalus:35393] Signal code: (-6)
-[pharsalus:35393] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
-[pharsalus:35393] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
-[pharsalus:35393] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
-[pharsalus:35393] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
-[pharsalus:35393] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
-[pharsalus:35393] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
-[pharsalus:35393] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
-[pharsalus:35393] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68b090]
-[pharsalus:35393] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b31d9]
-[pharsalus:35393] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x792edb]
-[pharsalus:35393] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7949bc]
-[pharsalus:35393] [11] ../../../lmp_openmpi(main+0x49) [0x7a28f9]
-[pharsalus:35393] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
-[pharsalus:35393] [13] ../../../lmp_openmpi() [0x537209]
-[pharsalus:35393] *** End of error message ***
- ATC: P1, ERROR: mesh file is of unknown type.
- ATC: P2, ERROR: mesh file is of unknown type.
-terminate called after throwing an instance of 'ATC::ATC_Error'
-terminate called after throwing an instance of 'ATC::ATC_Error'
-[pharsalus:35404] *** Process received signal ***
-[pharsalus:35404] Signal: Aborted (6)
-[pharsalus:35404] Signal code: (-6)
-[pharsalus:35396] *** Process received signal ***
-[pharsalus:35396] Signal: Aborted (6)
-[pharsalus:35396] Signal code: (-6)
-[pharsalus:35404] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
-[pharsalus:35404] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
-[pharsalus:35404] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
-[pharsalus:35404] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
-[pharsalus:35404] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
-[pharsalus:35404] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
-[pharsalus:35404] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
-[pharsalus:35404] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68b090]
-[pharsalus:35404] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b31d9]
-[pharsalus:35404] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x792edb]
-[pharsalus:35404] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7949bc]
-[pharsalus:35404] [11] ../../../lmp_openmpi(main+0x49) [0x7a28f9]
-[pharsalus:35404] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
-[pharsalus:35404] [13] ../../../lmp_openmpi() [0x537209]
-[pharsalus:35404] *** End of error message ***
-[pharsalus:35396] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
-[pharsalus:35396] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
-[pharsalus:35396] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
-[pharsalus:35396] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
-[pharsalus:35396] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
-[pharsalus:35396] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
-[pharsalus:35396] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
-[pharsalus:35396] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68b090]
-[pharsalus:35396] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b31d9]
-[pharsalus:35396] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x792edb]
-[pharsalus:35396] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7949bc]
-[pharsalus:35396] [11] ../../../lmp_openmpi(main+0x49) [0x7a28f9]
-[pharsalus:35396] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
-[pharsalus:35396] [13] ../../../lmp_openmpi() [0x537209]
-[pharsalus:35396] *** End of error message ***
- ATC: P3, ERROR: mesh file is of unknown type.
-terminate called after throwing an instance of 'ATC::ATC_Error'
-[pharsalus:35408] *** Process received signal ***
-[pharsalus:35408] Signal: Aborted (6)
-[pharsalus:35408] Signal code: (-6)
-[pharsalus:35408] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
-[pharsalus:35408] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
-[pharsalus:35408] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
-[pharsalus:35408] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
-[pharsalus:35408] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
-[pharsalus:35408] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
-[pharsalus:35408] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
-[pharsalus:35408] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68b090]
-[pharsalus:35408] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b31d9]
-[pharsalus:35408] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x792edb]
-[pharsalus:35408] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7949bc]
-[pharsalus:35408] [11] ../../../lmp_openmpi(main+0x49) [0x7a28f9]
-[pharsalus:35408] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
-[pharsalus:35408] [13] ../../../lmp_openmpi() [0x537209]
-[pharsalus:35408] *** End of error message ***
+[pharsalus:44868] *** Process received signal ***
+[pharsalus:44868] Signal: Aborted (6)
+[pharsalus:44868] Signal code: (-6)
+[pharsalus:44875] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:44881] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:44881] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:44881] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:44881] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:44881] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:44881] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:44881] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:44881] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68e130]
+[pharsalus:44881] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b6279]
+[pharsalus:44881] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x7969eb]
+[pharsalus:44881] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:44881] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:44881] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:44881] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:44881] *** End of error message ***
+[pharsalus:44875] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:44889] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:44875] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:44875] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:44875] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:44875] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:44875] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:44875] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68e130]
+[pharsalus:44875] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b6279]
+[pharsalus:44875] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x7969eb]
+[pharsalus:44875] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:44875] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:44875] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:44875] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:44875] *** End of error message ***
+[pharsalus:44889] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:44868] [ 0] /lib64/libpthread.so.0() [0x3e7ce0f500]
+[pharsalus:44868] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x3e7c2328a5]
+[pharsalus:44868] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:44868] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:44868] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:44868] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:44868] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:44868] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68e130]
+[pharsalus:44868] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b6279]
+[pharsalus:44868] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x7969eb]
+[pharsalus:44868] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:44868] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:44868] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:44868] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:44868] *** End of error message ***
+[pharsalus:44889] [ 2] /lib64/libc.so.6(abort+0x175) [0x3e7c234085]
+[pharsalus:44889] [ 3] /usr/lib64/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x12d) [0x3e83ebea5d]
+[pharsalus:44889] [ 4] /usr/lib64/libstdc++.so.6() [0x3e83ebcbe6]
+[pharsalus:44889] [ 5] /usr/lib64/libstdc++.so.6() [0x3e83ebcc13]
+[pharsalus:44889] [ 6] /usr/lib64/libstdc++.so.6(__cxa_rethrow+0x46) [0x3e83ebcc96]
+[pharsalus:44889] [ 7] ../../../lmp_openmpi(_ZN9LAMMPS_NS6FixATC12modify_paramEiPPc+0x70) [0x68e130]
+[pharsalus:44889] [ 8] ../../../lmp_openmpi(_ZN9LAMMPS_NS3Fix13modify_paramsEiPPc+0xb9) [0x6b6279]
+[pharsalus:44889] [ 9] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input15execute_commandEv+0xcab) [0x7969eb]
+[pharsalus:44889] [10] ../../../lmp_openmpi(_ZN9LAMMPS_NS5Input4fileEv+0x63c) [0x7984cc]
+[pharsalus:44889] [11] ../../../lmp_openmpi(main+0x49) [0x7a6409]
+[pharsalus:44889] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x3e7c21ecdd]
+[pharsalus:44889] [13] ../../../lmp_openmpi() [0x538bc9]
+[pharsalus:44889] *** End of error message ***
--------------------------------------------------------------------------
-mpirun noticed that process rank 2 with PID 35404 on node pharsalus exited on signal 6 (Aborted).
+mpirun noticed that process rank 2 with PID 44881 on node pharsalus exited on signal 6 (Aborted).
--------------------------------------------------------------------------
diff --git a/examples/USER/atc/mesh/gaussianIC2d_tet.screen b/examples/USER/atc/mesh/gaussianIC2d_tet.screen
index d63a1529e..4bb31c900 100644
--- a/examples/USER/atc/mesh/gaussianIC2d_tet.screen
+++ b/examples/USER/atc/mesh/gaussianIC2d_tet.screen
@@ -1,101 +1,102 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable L equal 12
variable l2 equal 6
variable l equal 4
variable w equal 2
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region mdInternal block -$l $l -$l $l -$w $w
region mdInternal block -4 $l -$l $l -$w $w
region mdInternal block -4 4 -$l $l -$w $w
region mdInternal block -4 4 -4 $l -$w $w
region mdInternal block -4 4 -4 4 -$w $w
region mdInternal block -4 4 -4 4 -2 $w
region mdInternal block -4 4 -4 4 -2 2
boundary f f f # p
pair_style lj/cut 13.5
read_data temp.init
Reading data file ...
orthogonal box = (-64.86 -64.86 -10.81) to (64.86 64.86 10.81)
2 by 2 by 1 MPI processor grid
2304 atoms
2304 velocities
fix ZWALLS all wall/reflect zlo EDGE zhi EDGE
mass 1 39.95
pair_coeff 1 1 .238 3.405 13.5
group internal region mdInternal
1024 atoms in group internal
fix AtC internal atc two_temperature Ar_ttm.mat
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
fix_modify AtC mesh read gaussianIC2d_tet.mesh
ATC: read 485 nodes
ATC: read 1856 TET4 elements
ATC: created nodeset 11 with 32 nodes
ATC: created nodeset 12 with 32 nodes
ATC: WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive
#fix_modify AtC mesh read gaussianIC2d_tet.exo
fix_modify AtC mesh write parsed_gaussianIC2d_tet.mesh
fix_modify AtC mesh output parsed_gaussianIC2d_tetMESH
fix_modify AtC output gaussianIC2d_tetFE 10 full_text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC initial temperature all 20.0
# NOTE this is only gaussian in x
fix_modify AtC initial electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
fix_modify AtC fix temperature 11 20.0
fix_modify AtC fix temperature 12 20.0
fix_modify AtC control thermal flux
fix_modify AtC extrinsic exchange on
fix_modify AtC extrinsic electron_integration explicit 10
thermo_style custom step temp pe f_AtC[2] f_AtC[4]
timestep 1.0
thermo 10
run 100
Setting up run ...
Memory usage per processor = 32.4132 Mbytes
Step Temp PotEng AtC[2] AtC[4]
0 9.9496068 -3732.5766 20 21.692124
10 9.9724484 -3732.6738 20.007206 21.687471
20 9.9926238 -3732.757 20.013879 21.682923
30 10.009028 -3732.8203 20.019195 21.678475
40 10.02084 -3732.8482 20.022822 21.674117
50 10.027595 -3732.8423 20.02456 21.669843
60 10.029238 -3732.8013 20.024358 21.665645
70 10.026101 -3732.7238 20.022321 21.661517
80 10.018854 -3732.6191 20.018692 21.657452
90 10.008439 -3732.4929 20.013835 21.653444
100 9.995993 -3732.3576 20.008205 21.649488
-Loop time of 62.5354 on 4 procs for 100 steps with 2304 atoms
+Loop time of 39.5297 on 4 procs for 100 steps with 2304 atoms
-Pair time (%) = 0.465697 (0.744692)
+Pair time (%) = 0.352134 (0.89081)
Neigh time (%) = 0 (0)
-Comm time (%) = 1.19777 (1.91534)
-Outpt time (%) = 0.132981 (0.212649)
-Other time (%) = 60.739 (97.1273)
+Comm time (%) = 0.17501 (0.442731)
+Outpt time (%) = 0.0725729 (0.183591)
+Other time (%) = 38.93 (98.4829)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 720 ave 720 max 720 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 67354.5 ave 67632 max 66958 min
Histogram: 1 0 0 0 0 1 0 0 1 1
FullNghs: 134709 ave 134859 max 134422 min
Histogram: 1 0 0 0 0 0 0 1 1 1
Total # of neighbors = 538836
Ave neighs/atom = 233.87
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/mesh/kernel2d_hex.screen b/examples/USER/atc/mesh/kernel2d_hex.screen
index d0d8a225a..6f68d5ac5 100644
--- a/examples/USER/atc/mesh/kernel2d_hex.screen
+++ b/examples/USER/atc/mesh/kernel2d_hex.screen
@@ -1,81 +1,81 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# correct mass density = 1.0120
# NOTE the mesh is not currently periodic, so the density estimate is off by a factor of 2
variable L equal 6
variable w equal 2
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region BOX block -$L $L -$L $L -$w $w
region BOX block -6 $L -$L $L -$w $w
region BOX block -6 6 -$L $L -$w $w
region BOX block -6 6 -6 $L -$w $w
region BOX block -6 6 -6 6 -$w $w
region BOX block -6 6 -6 6 -2 $w
region BOX block -6 6 -6 6 -2 2
boundary f f p
create_box 1 BOX
Created orthogonal box = (-32.43 -32.43 -10.81) to (32.43 32.43 10.81)
2 by 2 by 1 MPI processor grid
create_atoms 1 region BOX
Created 2304 atoms
mass 1 39.95
pair_style lj/cut 13.5
pair_coeff 1 1 .238 3.405 13.5
group internal region BOX
2304 atoms in group internal
fix AtC internal atc hardy
ATC: constructing kernel field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC kernel quartic_cylinder 5.0
fix_modify AtC mesh read gaussianIC2d_hex.mesh
ATC: read 388 nodes
ATC: read 173 HEX8 elements
ATC: created nodeset 11 with 22 nodes
ATC: created nodeset 12 with 22 nodes
ATC: WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive
fix_modify AtC fields add mass_density
fix_modify AtC output kernel2d_hexFE 1 full_text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
#dump CONFIG all custom 1 kernel2d_hexMD.dmp id type x y z
thermo_style custom step cpu temp
timestep 0.0
thermo 1
run 2
Setting up run ...
- ATC: kernel matrix bandwidth 535
Memory usage per processor = 490.313 Mbytes
Step CPU Temp
0 0 0
- 1 0.015694857 0
- 2 0.02523303 0
-Loop time of 0.025247 on 4 procs for 2 steps with 2304 atoms
+ 1 0.0049748421 0
+ 2 0.013383865 0
+Loop time of 0.0133951 on 4 procs for 2 steps with 2304 atoms
-Pair time (%) = 0.00923944 (36.5961)
+Pair time (%) = 0.00893837 (66.7288)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000781298 (3.09461)
-Outpt time (%) = 0.00327528 (12.9729)
-Other time (%) = 0.011951 (47.3364)
+Comm time (%) = 0.000545621 (4.0733)
+Outpt time (%) = 0.00268465 (20.0421)
+Other time (%) = 0.00122643 (9.15579)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2664 ave 2664 max 2664 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 91072 ave 92484 max 89660 min
Histogram: 1 1 0 0 0 0 0 0 1 1
FullNghs: 182144 ave 182144 max 182144 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 728576
Ave neighs/atom = 316.222
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/mesh/kernel2d_tet.screen b/examples/USER/atc/mesh/kernel2d_tet.screen
index d793477f0..8d31fca48 100644
--- a/examples/USER/atc/mesh/kernel2d_tet.screen
+++ b/examples/USER/atc/mesh/kernel2d_tet.screen
@@ -1,77 +1,77 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable L equal 6
variable w equal 2
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region BOX block -$L $L -$L $L -$w $w
region BOX block -6 $L -$L $L -$w $w
region BOX block -6 6 -$L $L -$w $w
region BOX block -6 6 -6 $L -$w $w
region BOX block -6 6 -6 6 -$w $w
region BOX block -6 6 -6 6 -2 $w
region BOX block -6 6 -6 6 -2 2
boundary f f p
create_box 1 BOX
Created orthogonal box = (-32.43 -32.43 -10.81) to (32.43 32.43 10.81)
2 by 2 by 1 MPI processor grid
create_atoms 1 region BOX
Created 2304 atoms
mass 1 39.95
pair_style lj/cut 13.5
pair_coeff 1 1 .238 3.405 13.5
group internal region BOX
2304 atoms in group internal
fix AtC internal atc hardy
ATC: constructing kernel field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC kernel quartic_sphere 5.0
fix_modify AtC mesh read gaussianIC2d_tet.mesh
ATC: read 485 nodes
ATC: read 1856 TET4 elements
ATC: created nodeset 11 with 32 nodes
ATC: created nodeset 12 with 32 nodes
ATC: WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive
fix_modify AtC fields add mass_density
fix_modify AtC output kernel2d_tetFE 1 full_text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
thermo_style custom step cpu temp
timestep 0.0
thermo 1
run 2
Setting up run ...
- ATC: kernel matrix bandwidth 551
Memory usage per processor = 603.85 Mbytes
Step CPU Temp
0 0 0
- 1 0.0049650669 0
- 2 0.014286995 0
-Loop time of 0.0143003 on 4 procs for 2 steps with 2304 atoms
+ 1 0.0049870014 0
+ 2 0.01454401 0
+Loop time of 0.0145637 on 4 procs for 2 steps with 2304 atoms
-Pair time (%) = 0.00910032 (63.6373)
+Pair time (%) = 0.00896931 (61.5866)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00106293 (7.43293)
-Outpt time (%) = 0.00271261 (18.9689)
-Other time (%) = 0.00142443 (9.96086)
+Comm time (%) = 0.000530958 (3.64575)
+Outpt time (%) = 0.00337762 (23.192)
+Other time (%) = 0.00168586 (11.5757)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2664 ave 2664 max 2664 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 91072 ave 92484 max 89660 min
Histogram: 1 1 0 0 0 0 0 0 1 1
FullNghs: 182144 ave 182144 max 182144 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 728576
Ave neighs/atom = 316.222
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/mesh/mesh2d_tet.screen b/examples/USER/atc/mesh/mesh2d_tet.screen
index 7e5dc1d50..e0c858f5f 100644
--- a/examples/USER/atc/mesh/mesh2d_tet.screen
+++ b/examples/USER/atc/mesh/mesh2d_tet.screen
@@ -1,77 +1,78 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable L equal 6
variable w equal 2
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region BOX block -$L $L -$L $L -$w $w
region BOX block -6 $L -$L $L -$w $w
region BOX block -6 6 -$L $L -$w $w
region BOX block -6 6 -6 $L -$w $w
region BOX block -6 6 -6 6 -$w $w
region BOX block -6 6 -6 6 -2 $w
region BOX block -6 6 -6 6 -2 2
boundary f f p
create_box 1 BOX
Created orthogonal box = (-32.43 -32.43 -10.81) to (32.43 32.43 10.81)
2 by 2 by 1 MPI processor grid
create_atoms 1 region BOX
Created 2304 atoms
mass 1 39.95
pair_style lj/cut 13.5
pair_coeff 1 1 .238 3.405 13.5
group internal region BOX
2304 atoms in group internal
fix AtC internal atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
fix_modify AtC mesh read gaussianIC2d_tet.mesh
ATC: read 485 nodes
ATC: read 1856 TET4 elements
ATC: created nodeset 11 with 32 nodes
ATC: created nodeset 12 with 32 nodes
ATC: WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive
fix_modify AtC fields add mass_density
fix_modify AtC output mesh2d_tetFE 1 full_text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
dump CONFIG all custom 10 mesh2d_tet.dmp id type x y z
thermo_style custom step cpu temp
timestep 0.0
thermo 1
run 2
Setting up run ...
Memory usage per processor = 11.9239 Mbytes
Step CPU Temp
0 0 0
- 1 0.0050430298 0
- 2 0.015191078 0
-Loop time of 0.0152113 on 4 procs for 2 steps with 2304 atoms
+ 1 0.0049641132 0
+ 2 0.014424086 0
+Loop time of 0.0144483 on 4 procs for 2 steps with 2304 atoms
-Pair time (%) = 0.00921327 (60.5684)
+Pair time (%) = 0.00890452 (61.63)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00139874 (9.19539)
-Outpt time (%) = 0.00295776 (19.4444)
-Other time (%) = 0.00164157 (10.7918)
+Comm time (%) = 0.000497401 (3.44261)
+Outpt time (%) = 0.00329906 (22.8335)
+Other time (%) = 0.00174737 (12.0939)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 2664 ave 2664 max 2664 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 91072 ave 92484 max 89660 min
Histogram: 1 1 0 0 0 0 0 0 1 1
FullNghs: 182144 ave 182144 max 182144 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 728576
Ave neighs/atom = 316.222
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/mesh/semicircle.screen b/examples/USER/atc/mesh/semicircle.screen
index 2437d3bad..6977d5c09 100644
--- a/examples/USER/atc/mesh/semicircle.screen
+++ b/examples/USER/atc/mesh/semicircle.screen
@@ -1,204 +1,205 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
variable l equal 8
variable g equal 2
variable lg equal $l+$g
variable lg equal 8+$g
variable lg equal 8+2
variable w equal 2
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
boundary f f f
# region to create atoms
region bigCyl cylinder z 0. 0. ${lg} -$w $w
region bigCyl cylinder z 0. 0. 10 -$w $w
region bigCyl cylinder z 0. 0. 10 -2 $w
region bigCyl cylinder z 0. 0. 10 -2 2
region offsetPlane block -${lg} $g -${lg} ${lg} -$w $w
region offsetPlane block -10 $g -${lg} ${lg} -$w $w
region offsetPlane block -10 2 -${lg} ${lg} -$w $w
region offsetPlane block -10 2 -10 ${lg} -$w $w
region offsetPlane block -10 2 -10 10 -$w $w
region offsetPlane block -10 2 -10 10 -2 $w
region offsetPlane block -10 2 -10 10 -2 2
region mdRegion intersect 2 bigCyl offsetPlane
#create_box 1 mdRegion
pair_style lj/cut 13.5
read_data semicircle_init.atm
Reading data file ...
orthogonal box = (-54.05 -54.05 -10.81) to (10.81 54.05 10.81)
2 by 2 by 1 MPI processor grid
3168 atoms
3168 velocities
# region for internal atoms
region mdInternalCyl cylinder z 0. 0. $l -$w $w
region mdInternalCyl cylinder z 0. 0. 8 -$w $w
region mdInternalCyl cylinder z 0. 0. 8 -2 $w
region mdInternalCyl cylinder z 0. 0. 8 -2 2
region leftHalfPlane block INF 0. INF INF INF INF
region mdInternal intersect 2 mdInternalCyl leftHalfPlane
# region for coupling ghosts
region rightHalfPlane block 0. INF INF INF INF INF
region mdGhost union 2 rightHalfPlane mdInternal side out
#create_atoms 1 region mdRegion
#create_atoms 1 region mdInternal
#create_atoms 2 region mdGhost
#region outerGhost intersect 2 rightHalfPlane mdRegion
#create_atoms 3 region outerGhost
#pair_style lj/cut 13.5
fix ZWALLS all wall/reflect zlo EDGE zhi EDGE
#mass 1 39.95
#pair_coeff 1 1 .238 3.405 13.5
group internal region mdInternal
1624 atoms in group internal
group ghost region mdGhost
904 atoms in group ghost
#velocity internal create 40 102486 mom yes rot yes dist gaussian
#write_restart semicircle_init.rst
# ATC commands
fix AtC internal atc thermal Ar_ttm.mat
ATC: constructing thermal coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
fix_modify AtC boundary ghost
fix_modify AtC mesh read semicircle.mesh f f p
- ATC: P1, writing periodicity corrected mesh: periodic_semicircle.mesh
- ATC: P2, writing periodicity corrected mesh: periodic_semicircle.mesh
- ATC: P3, writing periodicity corrected mesh: periodic_semicircle.mesh
ATC: read 398 nodes
ATC: read 176 HEX8 elements
ATC: condensed 199 periodic nodes in the 3 direction
ATC: created nodeset 1 with 44 nodes
ATC: created nodeset 2 with 4 nodes
+ ATC: P1, writing periodicity corrected mesh: periodic_semicircle.mesh
+ ATC: P2, writing periodicity corrected mesh: periodic_semicircle.mesh
+ ATC: P3, writing periodicity corrected mesh: periodic_semicircle.mesh
ATC: WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive
ATC: P0, writing periodicity corrected mesh: periodic_semicircle.mesh
fix_modify AtC mesh nodeset_to_elementset 2 hole min
fix_modify AtC internal_quadrature off
fix_modify AtC time_integration fractional_step
# initial conditions
fix_modify AtC fix temperature all 20.
fix_modify AtC control thermal rescale 10
fix_modify AtC control tolerance 1.e-14 # tolerance needed to produce consistent parallel and serial results
# initial output
#fix_modify AtC mesh output semicircle_mesh
#fix_modify AtC output semicircle_init 100 text binary
#dump D1 all atom 100 semicircle_init.dmp
# run
timestep 5.0
thermo 100
run 500
Setting up run ...
-Memory usage per processor = 94.811 Mbytes
+Memory usage per processor = 52.3462 Mbytes
Step Temp E_pair E_mol TotEng Press
0 20.498895 -5250.6971 0 -5057.1829 -1088.0506
100 10.255763 -5131.7808 0 -5034.9641 -671.92179
200 10.255763 -5194.8934 0 -5098.0766 -664.20614
300 10.255763 -5191.6455 0 -5094.8288 -564.44341
400 10.255763 -5185.5031 0 -5088.6864 -611.34498
500 10.255763 -5185.1021 0 -5088.2853 -686.81479
-Loop time of 15.2128 on 4 procs for 500 steps with 3168 atoms
+Loop time of 8.99855 on 4 procs for 500 steps with 3168 atoms
-Pair time (%) = 2.78663 (18.3176)
-Neigh time (%) = 0.0548139 (0.360314)
-Comm time (%) = 3.63319 (23.8824)
-Outpt time (%) = 0.000398099 (0.00261687)
-Other time (%) = 8.73779 (57.437)
+Pair time (%) = 2.4525 (27.2543)
+Neigh time (%) = 0.0542204 (0.602546)
+Comm time (%) = 0.659509 (7.32906)
+Outpt time (%) = 0.000407517 (0.00452869)
+Other time (%) = 5.83192 (64.8095)
Nlocal: 792 ave 944 max 640 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 860 ave 888 max 832 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 95743.8 ave 114417 max 76793 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 191488 ave 228943 max 153856 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 765950
Ave neighs/atom = 241.777
Neighbor list builds = 5
Dangerous builds = 0
# boundary conditions
fix_modify AtC unfix temperature all
fix_modify AtC fix temperature 1 20.
fix_modify AtC control thermal flux
fix_modify AtC control localized_lambda on
# NOTE appears to be a problem with the temporal ramp function
variable delta_t equal 1000*5.
fix_modify AtC source temperature hole temporal_ramp 0. 0.0000000001 ${delta_t}
fix_modify AtC source temperature hole temporal_ramp 0. 0.0000000001 5000
# equilibrate filter
fix_modify AtC filter type exponential
fix_modify AtC filter scale 1000.
fix_modify AtC filter on
# equilibration output
fix_modify AtC output semicircleFE 100 full_text #binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
#undump D1
#dump D1 all atom 100 semicircle_equil.dmp
# run
fix_modify AtC reset_time 0.
reset_timestep 0
thermo 100
run 1000
Setting up run ...
-Memory usage per processor = 108.386 Mbytes
+Memory usage per processor = 65.9216 Mbytes
Step Temp E_pair E_mol TotEng Press
0 10.255763 -5185.1021 0 -5088.2853 -686.81479
100 9.9160769 -5177.6646 0 -5084.0545 -753.44628
200 10.215779 -5182.5539 0 -5086.1147 -721.64916
300 10.609664 -5183.8798 0 -5083.7222 -672.99308
400 10.754797 -5188.6804 0 -5087.1527 -620.77678
500 10.271869 -5184.1487 0 -5087.18 -643.71337
600 10.214975 -5184.0211 0 -5087.5894 -687.47365
700 10.231487 -5182.315 0 -5085.7274 -719.65308
800 10.245262 -5181.8268 0 -5085.1092 -707.19351
900 10.342331 -5183.9012 0 -5086.2673 -667.21622
1000 10.446039 -5184.9612 0 -5086.3482 -647.13367
-Loop time of 83.0725 on 4 procs for 1000 steps with 3168 atoms
+Loop time of 28.4605 on 4 procs for 1000 steps with 3168 atoms
-Pair time (%) = 6.33517 (7.62607)
-Neigh time (%) = 0.152702 (0.183818)
-Comm time (%) = 8.85507 (10.6595)
-Outpt time (%) = 0.0723367 (0.0870767)
-Other time (%) = 67.6572 (81.4436)
+Pair time (%) = 5.05702 (17.7685)
+Neigh time (%) = 0.12658 (0.444755)
+Comm time (%) = 1.66495 (5.85002)
+Outpt time (%) = 0.0552746 (0.194215)
+Other time (%) = 21.5567 (75.7425)
Nlocal: 792 ave 944 max 640 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 860 ave 888 max 832 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 95600.8 ave 114809 max 76836 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 191202 ave 228917 max 153483 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 764806
Ave neighs/atom = 241.416
Neighbor list builds = 8
Dangerous builds = 0
# heat source
# NOTE second run omitted as it causes diffs in parallel execution after just one timestep, not sure why
#fix_modify AtC source temperature hole 0.0000000001
#fix_modify AtC output semicircleFE 1 full_text #binary
#undump D1
#dump D1 all atom 100 semicircle.dmp
#run 1#000
diff --git a/examples/USER/atc/molecule/harmonic_bonds.screen b/examples/USER/atc/molecule/harmonic_bonds.screen
index a344b0382..dd0e61891 100644
--- a/examples/USER/atc/molecule/harmonic_bonds.screen
+++ b/examples/USER/atc/molecule/harmonic_bonds.screen
@@ -1,122 +1,123 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units lj
lattice sc 1.0
Lattice spacing in x,y,z = 1 1 1
boundary p p p
neighbor 1.0 bin
neigh_modify every 5 delay 0 check yes
atom_style full
bond_style quartic
#angle_style harmonic
pair_style lj/cut 2.5
pair_modify table 0
special_bonds lj 1.0 1.0 1.0
read_data harmonic_bonds.data
Scanning data file ...
6 = max bonds/atom
Reading data file ...
orthogonal box = (-6.54473 -6.54473 -6.54473) to (6.54473 6.54473 6.54473)
1 by 2 by 2 MPI processor grid
2100 atoms
2600 bonds
Finding 1-2 1-3 1-4 neighbors ...
6 = max # of 1-2 neighbors
6 = max # of 1-3 neighbors
16 = max # of 1-4 neighbors
18 = max # of special neighbors
# k b1 b2 rc U0
bond_coeff 1 1434.3 -0.7589 0.00 1.5 67.2234
pair_coeff * * 1.0 1.0 2.5
timestep 0.005
fix 1 all npt temp 0.3 0.3 1.0 iso 0.1 0.1 10.0
thermo_style custom step temp etotal evdwl ebond pxx pyy pzz lz
thermo_modify flush yes
thermo 100
reset_timestep 0
########################################################################
variable l equal xhi
#region MESH block xlo xhi ylo yhi zlo zhi
region MESH block -$l $l -$l $l -$l $l
region MESH block -6.5447300000000003806 $l -$l $l -$l $l
region MESH block -6.5447300000000003806 6.5447300000000003806 -$l $l -$l $l
region MESH block -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 $l -$l $l
region MESH block -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 6.5447300000000003806 -$l $l
region MESH block -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 $l
region MESH block -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 6.5447300000000003806
group MESH region MESH
2100 atoms in group MESH
# ID group atc PhysicsType ParameterFile
fix ATC all atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 5
fix_modify ATC fields add mass_density energy stress heat_flux
# ID part keywords nx ny nz region
fix_modify ATC mesh create 4 4 1 MESH p p p
ATC: created uniform mesh with 50 nodes, 16 unique nodes, and 16 elements
fix_modify ATC bond_interactions on
fix_modify ATC pair_interactions off
fix_modify ATC output nodeset all average energy
fix_modify ATC output nodeset all average stress
fix_modify ATC output harmonic_bondsFE 100 full_text binary tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
########################################################################
dump d1 all custom 1000 config.dmp id type mol x y z ix iy iz
run 1000
Setting up run ...
WARNING: Inconsistent image flags (../domain.cpp:607)
ATC: computing bond matrix ...........done
Memory usage per processor = 22.5059 Mbytes
Step Temp TotEng E_vdwl E_bond Pxx Pyy Pzz Lz
0 0 27.418101 -4.9222297 32.340331 -6.4375188 -5.3652966 -8.8338595 13.08946
ATC: computing bond matrix ...........done
100 2.2145029 25.770666 -4.6618339 27.112327 1.4701161 2.16737 2.7891188 13.107872
ATC: computing bond matrix ...........done
200 1.6441119 24.285276 -4.6100702 26.430353 -0.2111306 0.11829479 -0.34968383 13.21971
ATC: computing bond matrix ...........done
300 1.2519109 23.218023 -4.7073226 26.048373 -0.90980473 -0.55453672 -1.175576 13.280803
ATC: computing bond matrix ...........done
400 1.0087196 22.413664 -4.8800967 25.781401 -0.94622376 -0.72705532 -0.96132435 13.209446
ATC: computing bond matrix ...........done
500 0.85508692 21.781946 -5.1146958 25.614623 -0.25867636 0.45882845 -1.5464988 13.067112
ATC: computing bond matrix ...........done
600 0.72896043 21.277404 -5.3122654 25.496749 -0.23318524 -0.79102184 -0.28592714 12.940731
ATC: computing bond matrix ...........done
700 0.63573201 20.877991 -5.4819279 25.406775 -0.22930105 0.17264694 -0.13977843 12.838254
ATC: computing bond matrix ...........done
800 0.54900117 20.560582 -5.6107452 25.348218 -0.40709766 -0.32952441 -0.39623019 12.765768
ATC: computing bond matrix ...........done
900 0.4864295 20.309827 -5.7089607 25.289491 0.18995702 -0.4389685 0.32204857 12.716563
ATC: computing bond matrix ...........done
1000 0.43059305 20.104384 -5.8079042 25.266707 -0.0082532778 0.34329484 0.20699648 12.673678
-Loop time of 3.13147 on 4 procs for 1000 steps with 2100 atoms
+Loop time of 2.39793 on 4 procs for 1000 steps with 2100 atoms
-Pair time (%) = 1.25995 (40.2352)
-Bond time (%) = 0.115811 (3.69829)
-Neigh time (%) = 0.358909 (11.4614)
-Comm time (%) = 0.819216 (26.1607)
-Outpt time (%) = 0.038662 (1.23463)
-Other time (%) = 0.538919 (17.2098)
+Pair time (%) = 1.16311 (48.5046)
+Bond time (%) = 0.109937 (4.58467)
+Neigh time (%) = 0.31618 (13.1855)
+Comm time (%) = 0.334303 (13.9413)
+Outpt time (%) = 0.020691 (0.86287)
+Other time (%) = 0.453715 (18.9211)
Nlocal: 525 ave 530 max 523 min
Histogram: 2 1 0 0 0 0 0 0 0 1
Nghost: 3067.75 ave 3080 max 3059 min
Histogram: 2 0 0 0 0 1 0 0 0 1
Neighs: 48006.5 ave 48692 max 47634 min
Histogram: 1 1 1 0 0 0 0 0 0 1
FullNghs: 96013 ave 97189 max 95320 min
Histogram: 2 0 0 1 0 0 0 0 0 1
Total # of neighbors = 384052
Ave neighs/atom = 182.882
Ave special neighs/atom = 13.3324
Neighbor list builds = 28
Dangerous builds = 0
diff --git a/examples/USER/atc/molecule/polarize.screen b/examples/USER/atc/molecule/polarize.screen
index 6b70aef64..a22ae5c8f 100644
--- a/examples/USER/atc/molecule/polarize.screen
+++ b/examples/USER/atc/molecule/polarize.screen
@@ -1,26 +1,26 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Scanning data file ...
2 = max bonds/atom
1 = max angles/atom
Reading data file ...
orthogonal box = (-25 -25 -21.8959) to (25 25 21.8959)
2 by 2 by 1 MPI processor grid
9474 atoms
9474 velocities
6316 bonds
3158 angles
Finding 1-2 1-3 1-4 neighbors ...
2 = max # of 1-2 neighbors
1 = max # of 1-3 neighbors
1 = max # of 1-4 neighbors
2 = max # of special neighbors
Lattice spacing in x,y,z = 0.05 0.05 0.05
9474 atoms in group water
6316 atoms in group hyd
3158 atoms in group oxy
Finding 1-2 1-3 1-4 neighbors ...
2 = max # of 1-2 neighbors
1 = max # of 1-3 neighbors
1 = max # of 1-4 neighbors
2 = max # of special neighbors
ERROR: Invalid fix style (../modify.cpp:714)
diff --git a/examples/USER/atc/molecule/quartic_bonds.screen b/examples/USER/atc/molecule/quartic_bonds.screen
index d8c36c688..18eb19916 100644
--- a/examples/USER/atc/molecule/quartic_bonds.screen
+++ b/examples/USER/atc/molecule/quartic_bonds.screen
@@ -1,115 +1,116 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units lj
lattice sc 1.0
Lattice spacing in x,y,z = 1 1 1
boundary p p p
neighbor 1.0 bin
neigh_modify every 5 delay 0 check yes
atom_style full
bond_style harmonic
#angle_style harmonic
pair_style lj/cut 2.5
pair_modify table 0
special_bonds lj 0.0 1.0 1.0
read_data quartic_bonds.data
Scanning data file ...
6 = max bonds/atom
Reading data file ...
orthogonal box = (-6.54473 -6.54473 -6.54473) to (6.54473 6.54473 6.54473)
1 by 2 by 2 MPI processor grid
2100 atoms
2600 bonds
Finding 1-2 1-3 1-4 neighbors ...
6 = max # of 1-2 neighbors
6 = max # of 1-3 neighbors
16 = max # of 1-4 neighbors
18 = max # of special neighbors
special_bonds lj 0.0 1.0 1.0
bond_coeff 1 100.0 1.0
pair_coeff * * 1.0 1.0 2.5
timestep 0.005
fix NPT all npt temp 1.0 1.0 1.0 iso 0.1 0.1 10.0
thermo_style custom step temp etotal evdwl ebond pxx pyy pzz lz
thermo_modify flush yes
thermo 100
########################################################################
variable l equal xhi
region MESH block -$l $l -$l $l -$l $l
region MESH block -6.5447300000000003806 $l -$l $l -$l $l
region MESH block -6.5447300000000003806 6.5447300000000003806 -$l $l -$l $l
region MESH block -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 $l -$l $l
region MESH block -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 6.5447300000000003806 -$l $l
region MESH block -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 $l
region MESH block -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 6.5447300000000003806 -6.5447300000000003806 6.5447300000000003806
group MESH region MESH
2100 atoms in group MESH
# ID group atc PhysicsType ParameterFile
fix ATC MESH atc field
ATC: constructing shape function field estimate
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 5
fix_modify ATC atom_element_map eulerian 100
fix_modify ATC fields add mass_density energy stress
## ID part keywords nx ny nz region
fix_modify ATC mesh create 4 4 1 MESH p p p
ATC: created uniform mesh with 50 nodes, 16 unique nodes, and 16 elements
fix_modify ATC bond_interactions on
fix_modify ATC pair_interactions on
fix_modify ATC output nodeset all average energy
fix_modify ATC output nodeset all average stress
fix_modify ATC output quartic_bondsFE 100 full_text binary tensor_components
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
#########################################################################
reset_timestep 0
dump d1 all custom 10000 config.dmp id type mol x y z ix iy iz
run 400
Setting up run ...
WARNING: Inconsistent image flags (../domain.cpp:607)
ATC: computing bond matrix ..........done
Memory usage per processor = 24.4426 Mbytes
Step Temp TotEng E_vdwl E_bond Pxx Pyy Pzz Lz
0 0 -4.2793581 -4.9222297 0.64287162 -0.122936 -0.43455241 -0.37510432 13.08946
ATC: computing bond matrix ..........done
100 0.51761758 -4.2411444 -5.3350909 0.31788979 -1.8360748 -1.7957803 -1.6501347 13.061394
ATC: computing bond matrix ..........done
200 0.55719016 -4.194575 -5.3921735 0.36221126 -0.83902447 -1.0583266 -0.82924205 12.978287
ATC: computing bond matrix ..........done
300 0.60702877 -4.114999 -5.4634339 0.43832539 -0.05969492 -0.37357729 0.1227012 12.887908
ATC: computing bond matrix ..........done
400 0.67773634 -4.0068285 -5.5021915 0.47924261 0.5562405 0.24275905 0.4181606 12.828709
-Loop time of 27.2369 on 4 procs for 400 steps with 2100 atoms
-
-Pair time (%) = 0.510639 (1.87481)
-Bond time (%) = 0.0195364 (0.0717276)
-Neigh time (%) = 0.107538 (0.394826)
-Comm time (%) = 1.0591 (3.88848)
-Outpt time (%) = 0.088418 (0.324626)
-Other time (%) = 25.4517 (93.4455)
+Loop time of 21.8007 on 4 procs for 400 steps with 2100 atoms
+
+Pair time (%) = 0.500449 (2.29557)
+Bond time (%) = 0.0201066 (0.0922291)
+Neigh time (%) = 0.11078 (0.508151)
+Comm time (%) = 0.334585 (1.53475)
+Outpt time (%) = 0.00405079 (0.0185811)
+Other time (%) = 20.8307 (95.5507)
Nlocal: 525 ave 528 max 522 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 3037 ave 3052 max 3022 min
Histogram: 1 1 0 0 0 0 0 0 0 2
Neighs: 45578.5 ave 45912 max 45191 min
Histogram: 1 0 0 1 0 0 0 0 1 1
FullNghs: 91157 ave 91645 max 90702 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 364628
Ave neighs/atom = 173.632
Ave special neighs/atom = 13.3324
Neighbor list builds = 9
Dangerous builds = 0
diff --git a/examples/USER/atc/molecule/water.screen b/examples/USER/atc/molecule/water.screen
index 55fb7b57f..10ac71dcc 100644
--- a/examples/USER/atc/molecule/water.screen
+++ b/examples/USER/atc/molecule/water.screen
@@ -1,94 +1,95 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Scanning data file ...
2 = max bonds/atom
1 = max angles/atom
Reading data file ...
orthogonal box = (-15 -15 -15) to (15 15 15)
1 by 2 by 2 MPI processor grid
2709 atoms
2709 velocities
1806 bonds
903 angles
Finding 1-2 1-3 1-4 neighbors ...
2 = max # of 1-2 neighbors
1 = max # of 1-3 neighbors
1 = max # of 1-4 neighbors
2 = max # of special neighbors
Lattice spacing in x,y,z = 0.05 0.05 0.05
2709 atoms in group water
1806 atoms in group hyd
903 atoms in group oxy
Finding 1-2 1-3 1-4 neighbors ...
2 = max # of 1-2 neighbors
1 = max # of 1-3 neighbors
1 = max # of 1-4 neighbors
2 = max # of special neighbors
ATC: constructing electrostatic species coupling with parameter file water.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 1 materials defined from water.mat
ATC: creating fem_efield extrinsic model
ATC: 1 materials defined from water.mat
ATC: created uniform mesh with 8 nodes, 1 unique nodes, and 1 elements
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationHyd
NodalAtomicSpeciesConcentration : NodalAtomicSpeciesConcentrationOxy
species_concentration : species_concentrationHyd
species_concentration : species_concentrationOxy
PPPM initialization ...
G vector (1/distance) = 0.297171
grid = 18 18 18
stencil order = 5
estimated absolute RMS force accuracy = 0.00115732
estimated relative force accuracy = 8.03715e-05
using double precision FFTs
3d grid and FFT values/proc = 6400 1620
Setting up run ...
ATC: WARNING: material: [water] cannot find mass_density
ATC: WARNING: physics model: [species], material: [water] does not provide all interfaces for <mass_density> physics and will be treated as null
ATC: WARNING: all initial conditions for mass_density have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for charge_density have not been defined and the undefined are assumed zero
ATC: WARNING: all initial conditions for species_concentration have not been defined and the undefined are assumed zero
ATC: WARNING: material: [water] cannot find mass_density
ATC: WARNING: physics model: [species electrostatic], material: [water] does not provide all interfaces for <mass_density> physics and will be treated as null
Memory usage per processor = 109.05 Mbytes
Step Temp E_pair E_mol TotEng Press
0 197.00275 -442.89515 0.59348399 -373.34352 21627.063
100 829.3047 -532.01992 298.21091 56.477887 47888.516
200 742.78324 -696.73237 968.19413 531.46299 -41757.145
300 1194.0466 -640.77501 416.31161 193.49647 -47297.597
- 400 722.14402 -655.95913 486.9587 83.776312 -117009.94
+ 400 722.14402 -655.95913 486.9587 83.776311 -117009.94
500 856.93093 -774.82666 955.23125 480.36167 -144380.28
600 614.34783 -818.49346 1205.9216 602.47228 -170076.9
700 738.19704 -704.05013 689.90234 244.2481 -138086.85
800 899.87085 -671.8463 565.65986 208.80118 -105587
- 900 906.34219 -708.2316 826.832 435.85322 -84326.935
- 1000 920.33455 -635.04398 592.63924 279.74592 -40120.926
-Loop time of 77.471 on 4 procs for 1000 steps with 2709 atoms
+ 900 906.34218 -708.2316 826.83201 435.85323 -84326.936
+ 1000 920.33455 -635.04397 592.63924 279.74592 -40120.926
+Loop time of 67.1496 on 4 procs for 1000 steps with 2709 atoms
-Pair time (%) = 55.1982 (71.2501)
-Bond time (%) = 0.153222 (0.197779)
-Kspce time (%) = 15.7133 (20.2828)
-Neigh time (%) = 1.59633 (2.06054)
-Comm time (%) = 1.12795 (1.45597)
-Outpt time (%) = 0.117281 (0.151386)
-Other time (%) = 3.56472 (4.60136)
+Pair time (%) = 52.7003 (78.4819)
+Bond time (%) = 0.142409 (0.212077)
+Kspce time (%) = 10.311 (15.3553)
+Neigh time (%) = 1.5854 (2.36099)
+Comm time (%) = 0.648017 (0.965035)
+Outpt time (%) = 0.014302 (0.0212986)
+Other time (%) = 1.74815 (2.60337)
-FFT time (% of Kspce) = 2.53183 (16.1127)
-FFT Gflps 3d (1d only) = 0.399473 3.27799
+FFT time (% of Kspce) = 0.647065 (6.27547)
+FFT Gflps 3d (1d only) = 1.56306 3.46456
Nlocal: 677.25 ave 694 max 650 min
Histogram: 1 0 0 0 0 1 0 0 1 1
Nghost: 11513.2 ave 11662 max 11354 min
Histogram: 1 0 0 1 0 0 1 0 0 1
Neighs: 821091 ave 848197 max 781864 min
Histogram: 1 0 0 0 1 0 0 0 0 2
FullNghs: 963818 ave 999880 max 913538 min
Histogram: 1 0 0 0 1 0 0 0 1 1
Total # of neighbors = 3855272
Ave neighs/atom = 1423.13
Ave special neighs/atom = 2
Neighbor list builds = 23
Dangerous builds = 0
diff --git a/examples/USER/atc/thermal/bar1d.screen b/examples/USER/atc/thermal/bar1d.screen
index 72363cdf1..7ce0199c5 100644
--- a/examples/USER/atc/thermal/bar1d.screen
+++ b/examples/USER/atc/thermal/bar1d.screen
@@ -1,274 +1,275 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
# NOTE following 3 lines added for restart
boundary f p p
pair_style lj/cut 13.5
read_data temp.init
Reading data file ...
orthogonal box = (-27.025 -16.215 -16.215) to (27.025 16.215 16.215)
2 by 1 by 2 MPI processor grid
1440 atoms
1440 velocities
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region simRegion block -12 12 -3 3 -3 3
# create atoms, NOTE commented out for restart
#region mdRegion block -5 5 -3 3 -3 3
#boundary f p p
#create_box 1 mdRegion
#create_atoms 1 region mdRegion
#mass 1 39.95
# specify interal/ghost atoms
region mdInternal block -4 4 -3 3 -3 3
group internal region mdInternal
1152 atoms in group internal
group ghost subtract all internal
288 atoms in group ghost
# velocities have Vcm = 0, NOTE next four lines commented out for restart
#velocity internal create 40. 87287 mom yes loop geom
#pair_style lj/cut 13.5
##pair_coeff 1 1 0.010323166 3.405 13.5
#pair_coeff 1 1 .238 3.405 13.5
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# ID group atc PhysicsType ParameterFile
fix AtC internal atc thermal Ar_thermal.mat
ATC: constructing thermal coupling with parameter file Ar_thermal.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 3 materials defined from Ar_thermal.mat
fix_modify AtC boundary ghost
# ID part keywords nx ny nz region
fix_modify AtC mesh create 12 1 1 simRegion f p p
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
fix_modify AtC internal_quadrature off
# fix a temperature
fix_modify AtC fix temperature all 20.
# turn on thermostat
fix_modify AtC control thermal rescale 10
# equilibrate MD field
#dump D1 all atom 100 dump.bar1d
#fix_modify AtC output bar1dfe 100
timestep 5
variable xdof equal 3*count(ghost)
compute_modify thermo_temp extra ${xdof}
compute_modify thermo_temp extra 864
thermo_style custom step cpu etotal pe f_AtC[1] temp f_AtC[2]
thermo_modify format 1 %6i format 2 %7.2g
thermo 100
run 400
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 92.2171 Mbytes
+Memory usage per processor = 51.6077 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.6428 -2710.8793 412.06718 39.965279 20
- 100 5.9 -2537.6764 -2606.3542 412.06718 20 20
- 200 9.7 -2584.8754 -2653.5532 412.06718 20 20
- 300 14 -2575.3126 -2643.9904 412.06718 20 20
- 400 16 -2573.4199 -2642.0977 412.06718 20 20
-Loop time of 16.4237 on 4 procs for 400 steps with 1440 atoms
+ 100 0.72 -2537.6764 -2606.3542 412.06718 20 20
+ 200 1.4 -2584.8754 -2653.5532 412.06718 20 20
+ 300 3.7 -2575.3126 -2643.9904 412.06718 20 20
+ 400 4.4 -2573.4199 -2642.0977 412.06718 20 20
+Loop time of 4.3669 on 4 procs for 400 steps with 1440 atoms
-Pair time (%) = 2.1238 (12.9313)
-Neigh time (%) = 1.37325 (8.36136)
-Comm time (%) = 8.1983 (49.9174)
-Outpt time (%) = 0.0300894 (0.183207)
-Other time (%) = 4.6983 (28.6068)
+Pair time (%) = 1.44287 (33.0409)
+Neigh time (%) = 0.576843 (13.2094)
+Comm time (%) = 1.09127 (24.9896)
+Outpt time (%) = 0.00163555 (0.0374533)
+Other time (%) = 1.25429 (28.7226)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104865 ave 104966 max 104653 min
Histogram: 1 0 0 0 0 0 0 1 0 2
FullNghs: 209730 ave 209902 max 209521 min
Histogram: 1 0 0 0 1 0 0 1 0 1
Total # of neighbors = 838918
Ave neighs/atom = 582.582
Neighbor list builds = 40
Dangerous builds = 0
# change thermostat to hoover
fix_modify AtC unfix temperature all
fix_modify AtC control thermal hoover
#fix_modify AtC localized_lambda on
fix_modify AtC filter type exponential
fix_modify AtC filter scale 10000.0
fix_modify AtC filter on
# add nodesets
# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC fix temperature lbc 40.
fix_modify AtC fix temperature rbc 20.
# initialize filter
#thermo 1
run 100
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 99.502 Mbytes
+Memory usage per processor = 58.8926 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
400 0 -2573.4199 -2642.0977 412.06718 20 20
- 500 2.4 -2573.7738 -2643.7447 433.14294 20.376549 21.713472
-Loop time of 2.43555 on 4 procs for 100 steps with 1440 atoms
+ 500 1.3 -2573.7738 -2643.7447 433.14294 20.376549 21.713472
+Loop time of 1.28526 on 4 procs for 100 steps with 1440 atoms
-Pair time (%) = 0.425805 (17.4829)
-Neigh time (%) = 0.25075 (10.2954)
-Comm time (%) = 0.707323 (29.0416)
-Outpt time (%) = 0.0401273 (1.64757)
-Other time (%) = 1.01154 (41.5325)
+Pair time (%) = 0.409898 (31.8922)
+Neigh time (%) = 0.178163 (13.862)
+Comm time (%) = 0.179711 (13.9825)
+Outpt time (%) = 0.000410318 (0.0319249)
+Other time (%) = 0.517078 (40.2314)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104765 ave 105086 max 104556 min
Histogram: 2 0 0 0 1 0 0 0 0 1
FullNghs: 209530 ave 209833 max 209326 min
Histogram: 1 0 1 1 0 0 0 0 0 1
Total # of neighbors = 838118
Ave neighs/atom = 582.026
Neighbor list builds = 10
Dangerous builds = 0
# set up output, should be before a "run"
fix_modify AtC output bar1dFE 100 text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
# ouput command
#dump D1 all atom 1000 dump.bar1d
# run with FE
reset_timestep 0
thermo 100
run 10000
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 99.502 Mbytes
+Memory usage per processor = 58.8926 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.7738 -2643.7447 433.14294 20.376549 21.713472
- 100 9.2 -2573.654 -2645.0562 436.6146 20.793359 21.86901
- 200 10 -2574.0035 -2642.057 439.70235 19.818183 22.007349
- 300 13 -2573.5186 -2646.5507 442.73301 21.268004 22.143129
- 400 19 -2573.2662 -2641.032 445.39809 19.734394 22.262531
- 500 24 -2573.5673 -2644.7553 447.93109 20.730998 22.376015
- 600 32 -2572.9368 -2641.5818 450.33706 19.990452 22.483808
- 700 34 -2573.2457 -2642.9406 452.61859 20.296182 22.586025
- 800 35 -2573.215 -2642.7311 454.75264 20.244128 22.681635
- 900 36 -2572.7227 -2643.5215 456.77865 20.617654 22.772405
- 1000 38 -2572.411 -2644.5969 458.68289 21.021605 22.857719
- 1100 42 -2571.4099 -2642.08 460.52888 20.580181 22.940424
- 1200 47 -2570.5495 -2641.7296 462.26173 20.728698 23.01806
- 1300 48 -2570.2491 -2640.8115 463.9083 20.548784 23.09183
- 1400 49 -2570.159 -2641.2853 465.40156 20.713007 23.158731
- 1500 60 -2569.5061 -2642.2055 467.00405 21.171116 23.230527
- 1600 61 -2568.7522 -2639.5247 468.45299 20.609988 23.295442
- 1700 70 -2569.1809 -2642.0975 469.79048 21.23439 23.355365
- 1800 73 -2568.7484 -2643.2103 471.10946 21.684386 23.414458
- 1900 83 -2568.2581 -2641.5017 472.49875 21.329637 23.476701
- 2000 84 -2568.192 -2641.4647 473.7794 21.338078 23.534077
- 2100 85 -2568.0746 -2639.9335 474.99711 20.926347 23.588633
- 2200 92 -2567.2717 -2642.2868 476.13779 21.845489 23.639738
- 2300 96 -2566.7209 -2639.9022 477.31159 21.311461 23.692327
- 2400 1e+02 -2566.6054 -2638.8118 478.44655 21.027558 23.743176
- 2500 1.1e+02 -2565.7629 -2639.6423 479.55196 21.514764 23.792701
- 2600 1.1e+02 -2565.9248 -2642.5794 480.54223 22.322945 23.837067
- 2700 1.1e+02 -2564.9995 -2640.0503 481.61938 21.855895 23.885326
- 2800 1.2e+02 -2565.2468 -2638.033 482.61597 21.196395 23.929975
- 2900 1.2e+02 -2565.0496 -2639.4905 483.63717 21.678286 23.975727
- 3000 1.3e+02 -2565.1382 -2637.5132 484.58683 21.076652 24.018275
- 3100 1.3e+02 -2564.4793 -2636.7861 485.5364 21.056785 24.060817
- 3200 1.3e+02 -2564.1799 -2637.5024 486.53294 21.352561 24.105465
- 3300 1.4e+02 -2564.4531 -2641.3463 487.42873 22.392434 24.145598
- 3400 1.4e+02 -2564.2323 -2641.0072 488.30292 22.357973 24.184764
- 3500 1.4e+02 -2563.378 -2635.3819 489.17087 20.968574 24.22365
- 3600 1.4e+02 -2563.5014 -2637.8324 490.1027 21.646291 24.265398
- 3700 1.4e+02 -2563.4092 -2638.0479 490.92648 21.735889 24.302305
- 3800 1.4e+02 -2563.0307 -2637.5397 491.76937 21.698123 24.340068
- 3900 1.4e+02 -2562.1415 -2637.2704 492.65132 21.878653 24.379582
- 4000 1.4e+02 -2561.9969 -2637.3928 493.4009 21.956415 24.413165
- 4100 1.5e+02 -2560.7688 -2636.0902 494.20978 21.934699 24.449405
- 4200 1.5e+02 -2561.3033 -2638.2324 494.92948 22.402886 24.481649
- 4300 1.5e+02 -2560.9897 -2637.0909 495.72929 22.161791 24.517482
- 4400 1.5e+02 -2561.1677 -2638.5004 496.4863 22.520422 24.551398
- 4500 1.5e+02 -2560.4797 -2637.3716 497.21153 22.392069 24.58389
- 4600 1.5e+02 -2560.5787 -2637.0577 497.94655 22.271795 24.61682
- 4700 1.5e+02 -2560.9645 -2639.5115 498.65048 22.874032 24.648358
- 4800 1.6e+02 -2560.4451 -2637.6681 499.40401 22.488483 24.682118
- 4900 1.6e+02 -2559.5243 -2635.9383 500.10679 22.252874 24.713604
- 5000 1.6e+02 -2559.4948 -2637.7238 500.83953 22.781444 24.746432
- 5100 1.6e+02 -2559.6822 -2636.169 501.53339 22.274071 24.777518
- 5200 1.6e+02 -2559.6398 -2637.3169 502.26381 22.620718 24.810243
- 5300 1.6e+02 -2558.6285 -2634.5293 502.8444 22.103424 24.836255
- 5400 1.6e+02 -2558.6394 -2637.9487 503.59005 23.096025 24.869662
- 5500 1.6e+02 -2558.1403 -2636.176 504.21716 22.725144 24.897757
- 5600 1.6e+02 -2558.0703 -2635.1367 504.9347 22.442865 24.929905
- 5700 1.6e+02 -2558.0656 -2636.7197 505.52087 22.905225 24.956167
- 5800 1.6e+02 -2557.3777 -2634.8266 506.20982 22.554253 24.987033
- 5900 1.7e+02 -2557.2526 -2635.9743 506.86422 22.924918 25.016352
- 6000 1.7e+02 -2557.3833 -2637.2291 507.48018 23.25228 25.043948
- 6100 1.7e+02 -2556.0263 -2633.5407 508.11625 22.573338 25.072446
- 6200 1.7e+02 -2555.7442 -2634.4379 508.74696 22.916758 25.100703
- 6300 1.7e+02 -2555.855 -2635.6232 509.35007 23.229653 25.127723
- 6400 1.7e+02 -2555.9332 -2634.2034 509.90097 22.793416 25.152405
- 6500 1.7e+02 -2555.6529 -2635.6085 510.47402 23.284242 25.178079
- 6600 1.8e+02 -2554.8702 -2633.8042 511.0317 22.986719 25.203064
- 6700 1.8e+02 -2555.4594 -2637.4199 511.60862 23.868095 25.228911
- 6800 1.8e+02 -2555.1345 -2633.0307 512.18015 22.684507 25.254517
- 6900 1.8e+02 -2555.2031 -2635.8935 512.79344 23.498217 25.281994
- 7000 1.9e+02 -2554.4149 -2634.996 513.32816 23.466386 25.305951
- 7100 1.9e+02 -2555.5655 -2636.9961 513.95657 23.713805 25.334105
- 7200 1.9e+02 -2554.6219 -2632.7377 514.567 22.748451 25.361454
- 7300 1.9e+02 -2553.7348 -2633.5176 515.135 23.233924 25.386901
- 7400 1.9e+02 -2553.6835 -2632.7483 515.7035 23.024829 25.412371
- 7500 1.9e+02 -2554.1585 -2634.2224 516.25704 23.315779 25.437171
- 7600 1.9e+02 -2553.7146 -2636.4167 516.79495 24.084074 25.461271
- 7700 1.9e+02 -2553.0976 -2633.1654 517.39991 23.316903 25.488375
- 7800 1.9e+02 -2553.7234 -2633.6408 517.98568 23.273102 25.514618
- 7900 1.9e+02 -2553.1575 -2635.2362 518.49062 23.902519 25.537241
- 8000 2e+02 -2553.0069 -2632.9282 519.06292 23.274267 25.562881
- 8100 2e+02 -2552.2172 -2632.9349 519.57824 23.506176 25.585969
- 8200 2e+02 -2552.6329 -2633.705 520.13682 23.609392 25.610994
- 8300 2e+02 -2553.0514 -2636.5364 520.66438 24.312051 25.63463
- 8400 2e+02 -2551.9158 -2634.5593 521.15401 24.066989 25.656566
- 8500 2e+02 -2551.162 -2632.582 521.69313 23.710703 25.68072
- 8600 2e+02 -2551.323 -2631.8792 522.25824 23.459141 25.706039
- 8700 2e+02 -2551.3995 -2634.1924 522.75555 24.110486 25.728319
- 8800 2e+02 -2551.5524 -2635.9593 523.28139 24.580545 25.751878
- 8900 2e+02 -2550.9859 -2634.5116 523.74996 24.3239 25.772871
- 9000 2e+02 -2550.3986 -2630.9451 524.29066 23.456323 25.797095
- 9100 2.1e+02 -2550.2258 -2632.4852 524.79409 23.955138 25.81965
- 9200 2.1e+02 -2549.7276 -2633.251 525.32924 24.323252 25.843626
- 9300 2.2e+02 -2549.2309 -2632.0111 525.82326 24.1068 25.86576
- 9400 2.2e+02 -2549.1793 -2631.7908 526.23399 24.057681 25.884161
- 9500 2.2e+02 -2549.3234 -2632.8586 526.74802 24.326659 25.907191
- 9600 2.3e+02 -2548.7761 -2630.2005 527.18774 23.711964 25.926891
- 9700 2.3e+02 -2548.5531 -2631.9225 527.62451 24.27839 25.946459
- 9800 2.3e+02 -2548.3632 -2632.4871 528.04194 24.49812 25.965161
- 9900 2.4e+02 -2548.2216 -2631.2195 528.52701 24.170186 25.986893
- 10000 2.4e+02 -2547.7787 -2631.2232 528.97935 24.300246 26.007159
-Loop time of 242.304 on 4 procs for 10000 steps with 1440 atoms
+ 100 0.81 -2573.654 -2645.0562 436.6146 20.793359 21.86901
+ 200 1.6 -2574.0035 -2642.057 439.70235 19.818183 22.007349
+ 300 2.5 -2573.5186 -2646.5507 442.73301 21.268004 22.143129
+ 400 3.3 -2573.2662 -2641.032 445.39809 19.734394 22.262531
+ 500 4.1 -2573.5673 -2644.7553 447.93109 20.730998 22.376015
+ 600 4.9 -2572.9368 -2641.5818 450.33706 19.990452 22.483808
+ 700 5.7 -2573.2457 -2642.9406 452.61859 20.296182 22.586025
+ 800 6.8 -2573.215 -2642.7311 454.75264 20.244128 22.681635
+ 900 7.9 -2572.7227 -2643.5215 456.77865 20.617654 22.772405
+ 1000 9 -2572.411 -2644.5969 458.68289 21.021605 22.857719
+ 1100 10 -2571.4099 -2642.08 460.52888 20.580181 22.940424
+ 1200 11 -2570.5495 -2641.7296 462.26173 20.728698 23.01806
+ 1300 12 -2570.2491 -2640.8115 463.9083 20.548784 23.09183
+ 1400 12 -2570.159 -2641.2853 465.40156 20.713007 23.158731
+ 1500 13 -2569.5061 -2642.2055 467.00405 21.171116 23.230527
+ 1600 14 -2568.7522 -2639.5247 468.45299 20.609988 23.295442
+ 1700 15 -2569.1809 -2642.0975 469.79048 21.23439 23.355365
+ 1800 16 -2568.7484 -2643.2103 471.10946 21.684386 23.414458
+ 1900 18 -2568.2581 -2641.5017 472.49875 21.329637 23.476701
+ 2000 19 -2568.192 -2641.4647 473.7794 21.338078 23.534077
+ 2100 20 -2568.0746 -2639.9335 474.99711 20.926347 23.588633
+ 2200 21 -2567.2717 -2642.2868 476.13779 21.845489 23.639738
+ 2300 22 -2566.7209 -2639.9022 477.31159 21.311461 23.692327
+ 2400 23 -2566.6054 -2638.8118 478.44655 21.027558 23.743176
+ 2500 24 -2565.7629 -2639.6423 479.55196 21.514764 23.792701
+ 2600 25 -2565.9248 -2642.5794 480.54223 22.322945 23.837067
+ 2700 26 -2564.9995 -2640.0503 481.61938 21.855895 23.885326
+ 2800 26 -2565.2468 -2638.033 482.61597 21.196395 23.929975
+ 2900 27 -2565.0496 -2639.4905 483.63717 21.678286 23.975727
+ 3000 28 -2565.1382 -2637.5132 484.58683 21.076652 24.018275
+ 3100 29 -2564.4793 -2636.7861 485.5364 21.056785 24.060817
+ 3200 30 -2564.1799 -2637.5024 486.53294 21.352561 24.105465
+ 3300 31 -2564.4531 -2641.3463 487.42873 22.392434 24.145598
+ 3400 31 -2564.2323 -2641.0072 488.30292 22.357973 24.184764
+ 3500 32 -2563.378 -2635.3819 489.17087 20.968574 24.22365
+ 3600 33 -2563.5014 -2637.8324 490.1027 21.646291 24.265398
+ 3700 34 -2563.4092 -2638.0479 490.92648 21.735889 24.302305
+ 3800 35 -2563.0307 -2637.5397 491.76937 21.698123 24.340068
+ 3900 36 -2562.1415 -2637.2704 492.65132 21.878653 24.379582
+ 4000 36 -2561.9969 -2637.3928 493.4009 21.956415 24.413165
+ 4100 38 -2560.7688 -2636.0902 494.20978 21.934699 24.449405
+ 4200 39 -2561.3033 -2638.2324 494.92948 22.402886 24.481649
+ 4300 41 -2560.9897 -2637.0909 495.72929 22.161791 24.517482
+ 4400 42 -2561.1677 -2638.5004 496.4863 22.520422 24.551398
+ 4500 42 -2560.4797 -2637.3716 497.21153 22.392069 24.58389
+ 4600 43 -2560.5787 -2637.0577 497.94655 22.271795 24.61682
+ 4700 44 -2560.9645 -2639.5115 498.65048 22.874032 24.648358
+ 4800 45 -2560.4451 -2637.6681 499.40401 22.488483 24.682118
+ 4900 46 -2559.5243 -2635.9383 500.10679 22.252874 24.713604
+ 5000 47 -2559.4948 -2637.7238 500.83953 22.781444 24.746432
+ 5100 48 -2559.6822 -2636.169 501.53339 22.274071 24.777518
+ 5200 48 -2559.6398 -2637.3169 502.26381 22.620718 24.810243
+ 5300 49 -2558.6285 -2634.5293 502.8444 22.103424 24.836255
+ 5400 50 -2558.6394 -2637.9487 503.59005 23.096025 24.869662
+ 5500 51 -2558.1403 -2636.176 504.21716 22.725144 24.897757
+ 5600 52 -2558.0703 -2635.1367 504.9347 22.442865 24.929905
+ 5700 53 -2558.0656 -2636.7197 505.52087 22.905225 24.956167
+ 5800 53 -2557.3777 -2634.8266 506.20982 22.554253 24.987033
+ 5900 54 -2557.2526 -2635.9743 506.86422 22.924918 25.016352
+ 6000 55 -2557.3833 -2637.2291 507.48018 23.25228 25.043948
+ 6100 56 -2556.0263 -2633.5407 508.11625 22.573338 25.072446
+ 6200 58 -2555.7442 -2634.4379 508.74696 22.916758 25.100703
+ 6300 59 -2555.855 -2635.6232 509.35007 23.229653 25.127723
+ 6400 60 -2555.9332 -2634.2034 509.90097 22.793416 25.152405
+ 6500 61 -2555.6529 -2635.6085 510.47402 23.284242 25.178079
+ 6600 62 -2554.8702 -2633.8042 511.0317 22.986719 25.203064
+ 6700 63 -2555.4594 -2637.4199 511.60862 23.868095 25.228911
+ 6800 64 -2555.1345 -2633.0307 512.18015 22.684507 25.254517
+ 6900 65 -2555.2031 -2635.8935 512.79344 23.498217 25.281994
+ 7000 65 -2554.4149 -2634.996 513.32816 23.466386 25.305951
+ 7100 66 -2555.5655 -2636.9961 513.95657 23.713805 25.334105
+ 7200 67 -2554.6219 -2632.7377 514.567 22.748451 25.361454
+ 7300 68 -2553.7348 -2633.5176 515.135 23.233924 25.386901
+ 7400 69 -2553.6835 -2632.7483 515.7035 23.024829 25.412371
+ 7500 70 -2554.1585 -2634.2224 516.25704 23.315779 25.437171
+ 7600 70 -2553.7146 -2636.4167 516.79495 24.084074 25.461271
+ 7700 71 -2553.0976 -2633.1654 517.39991 23.316903 25.488375
+ 7800 72 -2553.7234 -2633.6408 517.98568 23.273102 25.514618
+ 7900 73 -2553.1575 -2635.2362 518.49062 23.902519 25.537241
+ 8000 74 -2553.0069 -2632.9282 519.06292 23.274267 25.562881
+ 8100 74 -2552.2172 -2632.9349 519.57824 23.506176 25.585969
+ 8200 75 -2552.6329 -2633.705 520.13682 23.609392 25.610994
+ 8300 76 -2553.0514 -2636.5364 520.66438 24.312051 25.63463
+ 8400 77 -2551.9158 -2634.5593 521.15401 24.066989 25.656566
+ 8500 78 -2551.162 -2632.582 521.69313 23.710703 25.68072
+ 8600 78 -2551.323 -2631.8792 522.25824 23.459141 25.706039
+ 8700 79 -2551.3995 -2634.1924 522.75555 24.110486 25.728319
+ 8800 82 -2551.5524 -2635.9593 523.28139 24.580545 25.751878
+ 8900 82 -2550.9859 -2634.5116 523.74996 24.3239 25.772871
+ 9000 83 -2550.3986 -2630.9451 524.29066 23.456323 25.797095
+ 9100 84 -2550.2258 -2632.4852 524.79409 23.955138 25.81965
+ 9200 85 -2549.7276 -2633.251 525.32924 24.323252 25.843626
+ 9300 86 -2549.2309 -2632.0111 525.82326 24.1068 25.86576
+ 9400 87 -2549.1793 -2631.7908 526.23399 24.057681 25.884161
+ 9500 88 -2549.3234 -2632.8586 526.74802 24.326659 25.907191
+ 9600 88 -2548.7761 -2630.2005 527.18774 23.711964 25.926891
+ 9700 89 -2548.5531 -2631.9225 527.62451 24.27839 25.946459
+ 9800 90 -2548.3632 -2632.4871 528.04194 24.49812 25.965161
+ 9900 91 -2548.2216 -2631.2195 528.52701 24.170186 25.986893
+ 10000 92 -2547.7787 -2631.2232 528.97935 24.300246 26.007159
+Loop time of 91.8001 on 4 procs for 10000 steps with 1440 atoms
-Pair time (%) = 43.3749 (17.9011)
-Neigh time (%) = 22.0746 (9.11032)
-Comm time (%) = 67.2326 (27.7472)
-Outpt time (%) = 0.223967 (0.0924324)
-Other time (%) = 109.398 (45.1489)
+Pair time (%) = 36.4028 (39.6544)
+Neigh time (%) = 15.2663 (16.6299)
+Comm time (%) = 10.2915 (11.2108)
+Outpt time (%) = 0.331995 (0.36165)
+Other time (%) = 29.5075 (32.1432)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104823 ave 104983 max 104416 min
Histogram: 1 0 0 0 0 0 0 0 0 3
FullNghs: 209646 ave 209959 max 209315 min
Histogram: 1 0 1 0 0 0 0 0 1 1
Total # of neighbors = 838584
Ave neighs/atom = 582.35
Neighbor list builds = 1000
Dangerous builds = 0
diff --git a/examples/USER/atc/thermal/bar1d_all_atoms.screen b/examples/USER/atc/thermal/bar1d_all_atoms.screen
index 5aa0e5d6d..30a7eb277 100644
--- a/examples/USER/atc/thermal/bar1d_all_atoms.screen
+++ b/examples/USER/atc/thermal/bar1d_all_atoms.screen
@@ -1,102 +1,103 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Reading data file ...
orthogonal box = (-37.835 -16.215 -16.215) to (37.835 16.215 16.215)
4 by 1 by 1 MPI processor grid
2016 atoms
2016 velocities
Lattice spacing in x,y,z = 5.405 5.405 5.405
1728 atoms in group internal
288 atoms in group ghost
ATC: constructing thermal coupling with parameter file Ar_thermal.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 3 materials defined from Ar_thermal.mat
ATC: created uniform mesh with 28 nodes, 7 unique nodes, and 6 elements
ATC: created faceset obndy with 2 faces
ATC: created faceset lbndy with 1 faces
ATC: created faceset rbndy with 1 faces
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 51.7361 Mbytes
+Memory usage per processor = 20.8162 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -3635.4921 -3841.4065 206.03359 39.976852 20
- 100 2.1 -3585.2592 -3688.276 206.03359 20 20
- 200 3.4 -3649.8412 -3752.858 206.03359 20 20
- 300 4.6 -3638.7879 -3741.8047 206.03359 20 20
- 400 5.7 -3641.387 -3744.4038 206.03359 20 20
-Loop time of 5.67905 on 4 procs for 400 steps with 2016 atoms
+ 100 1.2 -3585.2592 -3688.276 206.03359 20 20
+ 200 2.4 -3649.8412 -3752.858 206.03359 20 20
+ 300 3.8 -3638.7879 -3741.8047 206.03359 20 20
+ 400 5.1 -3641.387 -3744.4038 206.03359 20 20
+Loop time of 5.06833 on 4 procs for 400 steps with 2016 atoms
-Pair time (%) = 2.2389 (39.4237)
-Neigh time (%) = 0.928223 (16.3447)
-Comm time (%) = 1.40274 (24.7002)
-Outpt time (%) = 0.00123483 (0.0217436)
-Other time (%) = 1.10796 (19.5096)
+Pair time (%) = 2.22144 (43.8298)
+Neigh time (%) = 0.925406 (18.2586)
+Comm time (%) = 1.15768 (22.8414)
+Outpt time (%) = 0.00127393 (0.0251351)
+Other time (%) = 0.762533 (15.0451)
Nlocal: 504 ave 504 max 504 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 5411 ave 6594 max 4228 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 152906 ave 168710 max 137650 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 305812 ave 336029 max 275367 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1223248
Ave neighs/atom = 606.77
Neighbor list builds = 40
Dangerous builds = 0
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 53.9738 Mbytes
+Memory usage per processor = 23.0538 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -3641.387 -3744.4038 206.03359 20 20
- 200 3.7 -3641.4558 -3741.6259 200.24916 19.447339 19.248846
- 400 7.2 -3641.3526 -3743.9363 205.0775 19.915921 19.699533
- 600 19 -3641.375 -3743.2251 203.6111 19.773486 19.612208
- 800 21 -3641.3598 -3745.7684 208.72769 20.270195 20.147681
- 1000 23 -3641.3633 -3744.4804 206.14469 20.01948 20.000916
- 1200 25 -3641.3461 -3745.088 207.39643 20.140774 20.048989
- 1400 29 -3641.3142 -3744.8632 207.01063 20.103323 20.101701
- 1600 31 -3641.3156 -3742.7705 202.82111 19.69678 19.661121
- 1800 34 -3641.316 -3743.0731 203.426 19.755441 19.722221
- 2000 36 -3641.3398 -3742.3792 201.99012 19.616091 19.597215
- 2200 38 -3641.3731 -3743.0677 203.30107 19.743306 19.727173
- 2400 48 -3641.2828 -3745.8996 209.14521 20.310613 20.319088
- 2600 58 -3641.3634 -3743.8039 204.79274 19.888105 19.949094
- 2800 64 -3641.3441 -3741.4297 200.08277 19.430931 19.239953
- 3000 75 -3641.3148 -3742.6599 202.602 19.675455 19.709217
- 3200 84 -3641.2859 -3742.6672 202.6744 19.68247 19.589857
- 3400 96 -3641.3698 -3743.1191 203.41009 19.753928 19.61843
- 3600 1.1e+02 -3641.2872 -3742.8149 202.96721 19.710905 19.636161
- 3800 1.1e+02 -3641.3532 -3741.7567 200.71871 19.492661 19.553996
- 4000 1.2e+02 -3641.3678 -3740.8478 198.87111 19.313344 19.20547
- 4200 1.3e+02 -3641.3412 -3743.3077 203.84569 19.79609 19.758581
- 4400 1.4e+02 -3641.2985 -3743.926 205.16703 19.924421 19.682565
- 4600 1.5e+02 -3641.3583 -3741.5377 200.27113 19.449139 19.459934
- 4800 1.6e+02 -3641.3204 -3742.091 201.45376 19.563917 19.472208
- 5000 1.7e+02 -3641.3593 -3745.2374 207.66855 20.167216 20.028789
-Loop time of 171.652 on 4 procs for 5000 steps with 2016 atoms
+ 200 2.2 -3641.4558 -3741.6259 200.24916 19.447339 19.248846
+ 400 4.2 -3641.3526 -3743.9363 205.0775 19.915921 19.699533
+ 600 6.2 -3641.375 -3743.2251 203.6111 19.773486 19.612208
+ 800 8.9 -3641.3598 -3745.7684 208.72769 20.270195 20.147681
+ 1000 12 -3641.3633 -3744.4804 206.14469 20.01948 20.000916
+ 1200 14 -3641.3461 -3745.088 207.39643 20.140774 20.048989
+ 1400 16 -3641.3142 -3744.8632 207.01063 20.103323 20.101701
+ 1600 18 -3641.3156 -3742.7705 202.82111 19.69678 19.661121
+ 1800 20 -3641.316 -3743.0731 203.426 19.755441 19.722221
+ 2000 22 -3641.3398 -3742.3792 201.99012 19.616091 19.597215
+ 2200 24 -3641.3731 -3743.0677 203.30107 19.743306 19.727173
+ 2400 26 -3641.2828 -3745.8996 209.14521 20.310613 20.319088
+ 2600 28 -3641.3634 -3743.8039 204.79274 19.888105 19.949094
+ 2800 30 -3641.3441 -3741.4297 200.08277 19.430931 19.239953
+ 3000 33 -3641.3148 -3742.6599 202.602 19.675455 19.709217
+ 3200 36 -3641.2859 -3742.6672 202.6744 19.68247 19.589857
+ 3400 38 -3641.3698 -3743.1191 203.41009 19.753928 19.61843
+ 3600 40 -3641.2872 -3742.8149 202.96721 19.710905 19.636161
+ 3800 42 -3641.3532 -3741.7567 200.71871 19.492661 19.553996
+ 4000 44 -3641.3678 -3740.8478 198.87111 19.313344 19.20547
+ 4200 46 -3641.3412 -3743.3077 203.84569 19.79609 19.758581
+ 4400 48 -3641.2985 -3743.926 205.16703 19.924421 19.682565
+ 4600 50 -3641.3583 -3741.5377 200.27113 19.449139 19.459934
+ 4800 52 -3641.3204 -3742.091 201.45376 19.563917 19.472208
+ 5000 54 -3641.3593 -3745.2374 207.66855 20.167216 20.028789
+Loop time of 54.2311 on 4 procs for 5000 steps with 2016 atoms
-Pair time (%) = 31.6573 (18.4428)
-Neigh time (%) = 15.4889 (9.02343)
-Comm time (%) = 43.5228 (25.3553)
-Outpt time (%) = 0.171351 (0.0998248)
-Other time (%) = 80.8113 (47.0786)
+Pair time (%) = 25.687 (47.3658)
+Neigh time (%) = 10.8144 (19.9413)
+Comm time (%) = 7.67067 (14.1444)
+Outpt time (%) = 0.0512393 (0.0944833)
+Other time (%) = 10.0078 (18.4541)
Nlocal: 504 ave 504 max 504 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 5411 ave 6594 max 4228 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 152904 ave 169876 max 137279 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 305807 ave 336458 max 275593 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1223228
Ave neighs/atom = 606.76
Neighbor list builds = 500
Dangerous builds = 0
diff --git a/examples/USER/atc/thermal/bar1d_combined.screen b/examples/USER/atc/thermal/bar1d_combined.screen
index a128be2a8..b81824961 100644
--- a/examples/USER/atc/thermal/bar1d_combined.screen
+++ b/examples/USER/atc/thermal/bar1d_combined.screen
@@ -1,164 +1,165 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Reading data file ...
orthogonal box = (-27.025 -16.215 -16.215) to (27.025 16.215 16.215)
2 by 1 by 2 MPI processor grid
1440 atoms
1440 velocities
Lattice spacing in x,y,z = 5.405 5.405 5.405
1152 atoms in group internal
144 atoms in group ghost
ATC: constructing thermal coupling with parameter file Ar_thermal.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 3 materials defined from Ar_thermal.mat
ATC: created uniform mesh with 44 nodes, 11 unique nodes, and 10 elements
ATC: created faceset ibndy with 1 faces
ATC: created faceset obndy with 1 faces
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 91.5825 Mbytes
+Memory usage per processor = 50.9732 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.6428 -2710.8793 343.38932 35.524692 20
- 10 0.79 -2626.7498 -2695.4276 343.38932 17.777778 20
- 20 1.8 -2600.7022 -2669.38 343.38932 17.777778 20
- 30 2.6 -2570.0142 -2638.6921 343.38932 17.777778 20
- 40 2.7 -2548.1494 -2616.8273 343.38932 17.777778 20
- 50 2.8 -2541.6409 -2610.3188 343.38932 17.777778 20
- 60 2.9 -2539.3355 -2608.0134 343.38932 17.777778 20
- 70 3 -2534.3684 -2603.0463 343.38932 17.777778 20
- 80 3.1 -2530.2415 -2598.9194 343.38932 17.777778 20
- 90 3.1 -2531.3411 -2600.019 343.38932 17.777778 20
- 100 3.2 -2537.6764 -2606.3542 343.38932 17.777778 20
- 110 3.3 -2546.506 -2615.1838 343.38932 17.777778 20
- 120 3.4 -2555.0937 -2623.7716 343.38932 17.777778 20
- 130 3.6 -2562.4178 -2631.0957 343.38932 17.777778 20
- 140 3.7 -2568.7827 -2637.4606 343.38932 17.777778 20
- 150 3.9 -2574.6292 -2643.307 343.38932 17.777778 20
- 160 4.1 -2579.7542 -2648.432 343.38932 17.777778 20
- 170 4.4 -2583.6629 -2652.3408 343.38932 17.777778 20
- 180 5.1 -2585.9113 -2654.5892 343.38932 17.777778 20
- 190 5.3 -2586.1786 -2654.8565 343.38932 17.777778 20
- 200 5.6 -2584.8754 -2653.5532 343.38932 17.777778 20
- 210 7.4 -2582.8956 -2651.5734 343.38932 17.777778 20
- 220 7.6 -2580.6882 -2649.366 343.38932 17.777778 20
- 230 7.7 -2578.24 -2646.9179 343.38932 17.777778 20
- 240 9.2 -2575.9058 -2644.5836 343.38932 17.777778 20
- 250 10 -2574.2875 -2642.9654 343.38932 17.777778 20
- 260 13 -2573.8273 -2642.5052 343.38932 17.777778 20
- 270 14 -2574.3017 -2642.9796 343.38932 17.777778 20
- 280 14 -2574.7059 -2643.3838 343.38932 17.777778 20
- 290 15 -2574.7745 -2643.4524 343.38932 17.777778 20
- 300 15 -2575.3126 -2643.9904 343.38932 17.777778 20
- 310 15 -2576.5002 -2645.178 343.38932 17.777778 20
- 320 15 -2577.7411 -2646.419 343.38932 17.777778 20
- 330 16 -2578.2283 -2646.9061 343.38932 17.777778 20
- 340 16 -2577.7485 -2646.4263 343.38932 17.777778 20
- 350 16 -2576.9631 -2645.6409 343.38932 17.777778 20
- 360 16 -2576.0309 -2644.7088 343.38932 17.777778 20
- 370 16 -2574.9309 -2643.6088 343.38932 17.777778 20
- 380 16 -2573.7943 -2642.4721 343.38932 17.777778 20
- 390 16 -2573.0353 -2641.7132 343.38932 17.777778 20
- 400 16 -2573.4199 -2642.0977 343.38932 17.777778 20
-Loop time of 16.4321 on 4 procs for 400 steps with 1440 atoms
+ 10 0.14 -2626.7498 -2695.4276 343.38932 17.777778 20
+ 20 0.21 -2600.7022 -2669.38 343.38932 17.777778 20
+ 30 0.29 -2570.0142 -2638.6921 343.38932 17.777778 20
+ 40 0.42 -2548.1494 -2616.8273 343.38932 17.777778 20
+ 50 0.49 -2541.6409 -2610.3188 343.38932 17.777778 20
+ 60 0.62 -2539.3355 -2608.0134 343.38932 17.777778 20
+ 70 0.74 -2534.3684 -2603.0463 343.38932 17.777778 20
+ 80 0.81 -2530.2415 -2598.9194 343.38932 17.777778 20
+ 90 0.88 -2531.3411 -2600.019 343.38932 17.777778 20
+ 100 0.96 -2537.6764 -2606.3542 343.38932 17.777778 20
+ 110 1 -2546.506 -2615.1838 343.38932 17.777778 20
+ 120 1.1 -2555.0937 -2623.7716 343.38932 17.777778 20
+ 130 1.2 -2562.4178 -2631.0957 343.38932 17.777778 20
+ 140 1.3 -2568.7827 -2637.4606 343.38932 17.777778 20
+ 150 1.4 -2574.6292 -2643.307 343.38932 17.777778 20
+ 160 1.5 -2579.7542 -2648.432 343.38932 17.777778 20
+ 170 1.6 -2583.6629 -2652.3408 343.38932 17.777778 20
+ 180 1.7 -2585.9113 -2654.5892 343.38932 17.777778 20
+ 190 1.7 -2586.1786 -2654.8565 343.38932 17.777778 20
+ 200 1.8 -2584.8754 -2653.5532 343.38932 17.777778 20
+ 210 1.9 -2582.8956 -2651.5734 343.38932 17.777778 20
+ 220 2 -2580.6882 -2649.366 343.38932 17.777778 20
+ 230 2 -2578.24 -2646.9179 343.38932 17.777778 20
+ 240 2.1 -2575.9058 -2644.5836 343.38932 17.777778 20
+ 250 2.2 -2574.2875 -2642.9654 343.38932 17.777778 20
+ 260 2.3 -2573.8273 -2642.5052 343.38932 17.777778 20
+ 270 2.4 -2574.3017 -2642.9796 343.38932 17.777778 20
+ 280 2.4 -2574.7059 -2643.3838 343.38932 17.777778 20
+ 290 2.5 -2574.7745 -2643.4524 343.38932 17.777778 20
+ 300 2.6 -2575.3126 -2643.9904 343.38932 17.777778 20
+ 310 2.6 -2576.5002 -2645.178 343.38932 17.777778 20
+ 320 2.7 -2577.7411 -2646.419 343.38932 17.777778 20
+ 330 2.8 -2578.2283 -2646.9061 343.38932 17.777778 20
+ 340 2.9 -2577.7485 -2646.4263 343.38932 17.777778 20
+ 350 2.9 -2576.9631 -2645.6409 343.38932 17.777778 20
+ 360 3 -2576.0309 -2644.7088 343.38932 17.777778 20
+ 370 3.1 -2574.9309 -2643.6088 343.38932 17.777778 20
+ 380 3.2 -2573.7943 -2642.4721 343.38932 17.777778 20
+ 390 3.2 -2573.0353 -2641.7132 343.38932 17.777778 20
+ 400 3.3 -2573.4199 -2642.0977 343.38932 17.777778 20
+Loop time of 3.32146 on 4 procs for 400 steps with 1440 atoms
-Pair time (%) = 1.87474 (11.409)
-Neigh time (%) = 1.47132 (8.95394)
-Comm time (%) = 7.98522 (48.5952)
-Outpt time (%) = 0.265947 (1.61846)
-Other time (%) = 4.83487 (29.4233)
+Pair time (%) = 1.46537 (44.1183)
+Neigh time (%) = 0.591919 (17.8211)
+Comm time (%) = 0.470118 (14.154)
+Outpt time (%) = 0.0156549 (0.471325)
+Other time (%) = 0.778395 (23.4353)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104865 ave 104966 max 104653 min
Histogram: 1 0 0 0 0 0 0 1 0 2
FullNghs: 209730 ave 209902 max 209521 min
Histogram: 1 0 0 0 1 0 0 1 0 1
Total # of neighbors = 838918
Ave neighs/atom = 582.582
Neighbor list builds = 40
Dangerous builds = 0
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc with 1 nodes
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 104.578 Mbytes
+Memory usage per processor = 63.9688 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.4199 -2642.0977 343.38932 17.777778 20
- 100 11 -2574.1221 -2644.1227 366.86215 18.120179 22.151933
- 200 13 -2574.368 -2645.6588 372.76111 18.454143 22.464272
- 300 23 -2574.5571 -2642.1914 368.54473 17.507654 22.241023
- 400 24 -2573.8831 -2646.3956 381.21405 18.77039 22.91184
- 500 25 -2574.1212 -2641.3392 373.2869 17.399874 22.492112
- 600 33 -2575.6292 -2645.7049 381.45457 18.139627 22.924575
- 700 37 -2574.5398 -2642.276 379.21993 17.534018 22.806254
- 800 48 -2575.7147 -2644.4983 383.4578 17.805128 23.030642
- 900 49 -2575.9679 -2644.264 384.40144 17.678956 23.080605
- 1000 50 -2574.7257 -2644.11 388.41299 17.960637 23.293009
- 1100 59 -2574.3951 -2645.4009 393.54083 18.380392 23.564519
- 1200 62 -2573.4022 -2643.2837 393.1983 18.089328 23.546383
- 1300 73 -2573.1301 -2643.3336 395.59223 18.172701 23.673137
- 1400 75 -2573.6807 -2643.1251 395.65516 17.976194 23.676469
- 1500 85 -2573.941 -2642.7411 396.10118 17.809426 23.700085
- 1600 87 -2572.2731 -2643.4215 402.46406 18.417286 24.036987
- 1700 96 -2571.634 -2640.8286 400.21007 17.911532 23.917643
- 1800 98 -2574.22 -2645.1741 405.32422 18.367004 24.188427
- 1900 1e+02 -2572.1014 -2643.7409 408.29043 18.544436 24.345483
- 2000 1.1e+02 -2572.7805 -2643.7309 408.51237 18.366044 24.357234
- 2100 1.1e+02 -2574.4982 -2645.4058 409.91869 18.354974 24.431696
- 2200 1.2e+02 -2573.6994 -2643.2148 408.43574 17.994584 24.353177
- 2300 1.2e+02 -2572.9286 -2645.0323 414.83736 18.664591 24.69213
- 2400 1.3e+02 -2572.8631 -2643.1356 412.49463 18.190579 24.568087
- 2500 1.3e+02 -2573.1978 -2641.401 409.7314 17.654899 24.421779
- 2600 1.4e+02 -2572.5709 -2642.9318 415.39198 18.213443 24.721496
- 2700 1.5e+02 -2573.8846 -2646.8168 421.79985 18.879037 25.060781
- 2800 1.5e+02 -2572.2696 -2643.6382 419.83482 18.47431 24.956737
- 2900 1.5e+02 -2572.3981 -2641.2173 415.8328 17.814358 24.744837
- 3000 1.5e+02 -2572.0099 -2643.1283 421.40094 18.409529 25.03966
- 3100 1.5e+02 -2573.6747 -2642.5137 417.77509 17.819488 24.847677
- 3200 1.5e+02 -2572.3897 -2640.7218 417.75014 17.688295 24.846356
- 3300 1.5e+02 -2572.4622 -2641.0094 419.22189 17.74395 24.924283
- 3400 1.5e+02 -2574.397 -2645.7327 425.93117 18.465771 25.279527
- 3500 1.5e+02 -2574.1636 -2645.5142 427.08548 18.469627 25.340645
- 3600 1.5e+02 -2573.5119 -2643.5124 425.4481 18.120142 25.253949
- 3700 1.6e+02 -2574.6195 -2641.8713 420.88263 17.408634 25.012216
- 3800 1.6e+02 -2573.6828 -2642.8075 425.44497 17.893448 25.253783
- 3900 1.6e+02 -2575.0132 -2644.4186 426.83652 17.966112 25.327463
- 4000 1.6e+02 -2574.095 -2642.3458 425.44626 17.667234 25.253852
- 4100 1.6e+02 -2573.8305 -2644.7007 431.68177 18.345287 25.58401
- 4200 1.6e+02 -2571.5672 -2641.8797 431.58249 18.200917 25.578753
- 4300 1.6e+02 -2572.9189 -2643.2307 432.52704 18.20073 25.628766
- 4400 1.6e+02 -2571.8961 -2644.0122 437.07886 18.667804 25.869776
- 4500 1.7e+02 -2572.4669 -2641.0876 430.98608 17.762985 25.547174
- 4600 1.7e+02 -2572.9128 -2643.1457 434.95838 18.180311 25.7575
- 4700 1.7e+02 -2572.7779 -2644.3091 438.24406 18.516384 25.931471
- 4800 1.7e+02 -2570.0191 -2640.9336 437.72427 18.356762 25.903949
- 4900 1.7e+02 -2570.9577 -2643.6775 442.01839 18.824052 26.131315
- 5000 1.7e+02 -2570.5553 -2642.7117 441.50654 18.678228 26.104213
-Loop time of 170.264 on 4 procs for 5000 steps with 1440 atoms
+ 100 0.99 -2574.1221 -2644.1227 366.86215 18.120179 22.151933
+ 200 2 -2574.368 -2645.6588 372.76111 18.454143 22.464272
+ 300 2.8 -2574.5571 -2642.1914 368.54473 17.507654 22.241023
+ 400 3.6 -2573.8831 -2646.3956 381.21405 18.77039 22.91184
+ 500 4.5 -2574.1212 -2641.3392 373.2869 17.399874 22.492112
+ 600 5.3 -2575.6292 -2645.7049 381.45457 18.139627 22.924575
+ 700 7.6 -2574.5398 -2642.276 379.21993 17.534018 22.806254
+ 800 8.4 -2575.7147 -2644.4983 383.4578 17.805128 23.030642
+ 900 9.2 -2575.9679 -2644.264 384.40144 17.678956 23.080605
+ 1000 10 -2574.7257 -2644.11 388.41299 17.960637 23.293009
+ 1100 11 -2574.3951 -2645.4009 393.54083 18.380392 23.564519
+ 1200 12 -2573.4022 -2643.2837 393.1983 18.089328 23.546383
+ 1300 13 -2573.1301 -2643.3336 395.59223 18.172701 23.673137
+ 1400 14 -2573.6807 -2643.1251 395.65516 17.976194 23.676469
+ 1500 15 -2573.941 -2642.7411 396.10118 17.809426 23.700085
+ 1600 16 -2572.2731 -2643.4215 402.46406 18.417286 24.036987
+ 1700 18 -2571.634 -2640.8286 400.21007 17.911532 23.917643
+ 1800 18 -2574.22 -2645.1741 405.32422 18.367004 24.188427
+ 1900 19 -2572.1014 -2643.7409 408.29043 18.544436 24.345483
+ 2000 20 -2572.7805 -2643.7309 408.51237 18.366044 24.357234
+ 2100 21 -2574.4982 -2645.4058 409.91869 18.354974 24.431696
+ 2200 22 -2573.6994 -2643.2148 408.43574 17.994584 24.353177
+ 2300 23 -2572.9286 -2645.0323 414.83736 18.664591 24.69213
+ 2400 24 -2572.8631 -2643.1356 412.49463 18.190579 24.568087
+ 2500 25 -2573.1978 -2641.401 409.7314 17.654899 24.421779
+ 2600 25 -2572.5709 -2642.9318 415.39198 18.213443 24.721496
+ 2700 26 -2573.8846 -2646.8168 421.79985 18.879037 25.060781
+ 2800 28 -2572.2696 -2643.6382 419.83482 18.47431 24.956737
+ 2900 29 -2572.3981 -2641.2173 415.8328 17.814358 24.744837
+ 3000 31 -2572.0099 -2643.1283 421.40094 18.409529 25.03966
+ 3100 31 -2573.6747 -2642.5137 417.77509 17.819488 24.847677
+ 3200 32 -2572.3897 -2640.7218 417.75014 17.688295 24.846356
+ 3300 33 -2572.4622 -2641.0094 419.22189 17.74395 24.924283
+ 3400 34 -2574.397 -2645.7327 425.93117 18.465771 25.279527
+ 3500 35 -2574.1636 -2645.5142 427.08548 18.469627 25.340645
+ 3600 36 -2573.5119 -2643.5124 425.4481 18.120142 25.253949
+ 3700 37 -2574.6195 -2641.8713 420.88263 17.408634 25.012216
+ 3800 37 -2573.6828 -2642.8075 425.44497 17.893448 25.253783
+ 3900 38 -2575.0132 -2644.4186 426.83652 17.966112 25.327463
+ 4000 39 -2574.095 -2642.3458 425.44626 17.667234 25.253852
+ 4100 40 -2573.8305 -2644.7007 431.68177 18.345287 25.58401
+ 4200 41 -2571.5672 -2641.8797 431.58249 18.200917 25.578753
+ 4300 42 -2572.9189 -2643.2307 432.52704 18.20073 25.628766
+ 4400 42 -2571.8961 -2644.0122 437.07886 18.667804 25.869776
+ 4500 43 -2572.4669 -2641.0876 430.98608 17.762985 25.547174
+ 4600 44 -2572.9128 -2643.1457 434.95838 18.180311 25.7575
+ 4700 45 -2572.7779 -2644.3091 438.24406 18.516384 25.931471
+ 4800 46 -2570.0191 -2640.9336 437.72427 18.356762 25.903949
+ 4900 47 -2570.9577 -2643.6775 442.01839 18.824052 26.131315
+ 5000 49 -2570.5553 -2642.7117 441.50654 18.678228 26.104213
+Loop time of 48.7128 on 4 procs for 5000 steps with 1440 atoms
-Pair time (%) = 22.2611 (13.0744)
-Neigh time (%) = 11.5912 (6.80777)
-Comm time (%) = 45.8903 (26.9524)
-Outpt time (%) = 0.176552 (0.103693)
-Other time (%) = 90.3452 (53.0617)
+Pair time (%) = 18.1427 (37.2443)
+Neigh time (%) = 7.72091 (15.8499)
+Comm time (%) = 5.3681 (11.0199)
+Outpt time (%) = 0.0359464 (0.0737925)
+Other time (%) = 17.4451 (35.8121)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104894 ave 105161 max 104681 min
Histogram: 1 0 1 0 0 1 0 0 0 1
FullNghs: 209788 ave 209864 max 209694 min
Histogram: 1 0 0 0 0 1 1 0 0 1
Total # of neighbors = 839152
Ave neighs/atom = 582.744
Neighbor list builds = 500
Dangerous builds = 0
diff --git a/examples/USER/atc/thermal/bar1d_flux.screen b/examples/USER/atc/thermal/bar1d_flux.screen
index b74efbd0c..a6b1c75a9 100644
--- a/examples/USER/atc/thermal/bar1d_flux.screen
+++ b/examples/USER/atc/thermal/bar1d_flux.screen
@@ -1,251 +1,252 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Reading data file ...
orthogonal box = (-27.025 -16.215 -16.215) to (27.025 16.215 16.215)
2 by 1 by 2 MPI processor grid
1440 atoms
1440 velocities
Lattice spacing in x,y,z = 5.405 5.405 5.405
1152 atoms in group internal
288 atoms in group ghost
ATC: constructing thermal coupling with parameter file Ar_thermal.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 3 materials defined from Ar_thermal.mat
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
ATC: created faceset ibndy with 2 faces
ATC: created faceset obndy with 2 faces
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 91.5825 Mbytes
+Memory usage per processor = 50.9732 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.6428 -2710.8793 412.06718 39.965279 20
- 10 1.2 -2626.7498 -2695.4276 412.06718 20 20
- 20 2.1 -2600.7022 -2669.38 412.06718 20 20
- 30 2.4 -2570.0142 -2638.6921 412.06718 20 20
- 40 2.5 -2548.1494 -2616.8273 412.06718 20 20
- 50 2.7 -2541.6409 -2610.3188 412.06718 20 20
- 60 2.8 -2539.3355 -2608.0134 412.06718 20 20
- 70 2.9 -2534.3684 -2603.0463 412.06718 20 20
- 80 3.2 -2530.2415 -2598.9194 412.06718 20 20
- 90 3.3 -2531.3411 -2600.019 412.06718 20 20
- 100 3.4 -2537.6764 -2606.3542 412.06718 20 20
- 110 3.6 -2546.506 -2615.1838 412.06718 20 20
- 120 3.7 -2555.0937 -2623.7716 412.06718 20 20
- 130 3.9 -2562.4178 -2631.0957 412.06718 20 20
- 140 6.2 -2568.7827 -2637.4606 412.06718 20 20
- 150 7.4 -2574.6292 -2643.307 412.06718 20 20
- 160 8.1 -2579.7542 -2648.432 412.06718 20 20
- 170 8.3 -2583.6629 -2652.3408 412.06718 20 20
- 180 8.4 -2585.9113 -2654.5892 412.06718 20 20
- 190 8.6 -2586.1786 -2654.8565 412.06718 20 20
- 200 9.7 -2584.8754 -2653.5532 412.06718 20 20
- 210 10 -2582.8956 -2651.5734 412.06718 20 20
- 220 10 -2580.6882 -2649.366 412.06718 20 20
- 230 10 -2578.24 -2646.9179 412.06718 20 20
- 240 11 -2575.9058 -2644.5836 412.06718 20 20
- 250 11 -2574.2875 -2642.9654 412.06718 20 20
- 260 12 -2573.8273 -2642.5052 412.06718 20 20
- 270 12 -2574.3017 -2642.9796 412.06718 20 20
- 280 12 -2574.7059 -2643.3838 412.06718 20 20
- 290 13 -2574.7745 -2643.4524 412.06718 20 20
- 300 13 -2575.3126 -2643.9904 412.06718 20 20
- 310 13 -2576.5002 -2645.178 412.06718 20 20
- 320 13 -2577.7411 -2646.419 412.06718 20 20
- 330 13 -2578.2283 -2646.9061 412.06718 20 20
- 340 13 -2577.7485 -2646.4263 412.06718 20 20
- 350 13 -2576.9631 -2645.6409 412.06718 20 20
- 360 14 -2576.0309 -2644.7088 412.06718 20 20
- 370 14 -2574.9309 -2643.6088 412.06718 20 20
- 380 14 -2573.7943 -2642.4721 412.06718 20 20
- 390 14 -2573.0353 -2641.7132 412.06718 20 20
- 400 14 -2573.4199 -2642.0977 412.06718 20 20
-Loop time of 13.9407 on 4 procs for 400 steps with 1440 atoms
+ 10 0.39 -2626.7498 -2695.4276 412.06718 20 20
+ 20 0.56 -2600.7022 -2669.38 412.06718 20 20
+ 30 0.63 -2570.0142 -2638.6921 412.06718 20 20
+ 40 0.7 -2548.1494 -2616.8273 412.06718 20 20
+ 50 0.78 -2541.6409 -2610.3188 412.06718 20 20
+ 60 0.85 -2539.3355 -2608.0134 412.06718 20 20
+ 70 0.92 -2534.3684 -2603.0463 412.06718 20 20
+ 80 1 -2530.2415 -2598.9194 412.06718 20 20
+ 90 1.1 -2531.3411 -2600.019 412.06718 20 20
+ 100 1.1 -2537.6764 -2606.3542 412.06718 20 20
+ 110 1.2 -2546.506 -2615.1838 412.06718 20 20
+ 120 1.3 -2555.0937 -2623.7716 412.06718 20 20
+ 130 1.4 -2562.4178 -2631.0957 412.06718 20 20
+ 140 1.4 -2568.7827 -2637.4606 412.06718 20 20
+ 150 1.5 -2574.6292 -2643.307 412.06718 20 20
+ 160 1.6 -2579.7542 -2648.432 412.06718 20 20
+ 170 1.7 -2583.6629 -2652.3408 412.06718 20 20
+ 180 1.7 -2585.9113 -2654.5892 412.06718 20 20
+ 190 1.8 -2586.1786 -2654.8565 412.06718 20 20
+ 200 1.9 -2584.8754 -2653.5532 412.06718 20 20
+ 210 2 -2582.8956 -2651.5734 412.06718 20 20
+ 220 2.1 -2580.6882 -2649.366 412.06718 20 20
+ 230 2.1 -2578.24 -2646.9179 412.06718 20 20
+ 240 2.2 -2575.9058 -2644.5836 412.06718 20 20
+ 250 2.3 -2574.2875 -2642.9654 412.06718 20 20
+ 260 2.4 -2573.8273 -2642.5052 412.06718 20 20
+ 270 2.9 -2574.3017 -2642.9796 412.06718 20 20
+ 280 3.2 -2574.7059 -2643.3838 412.06718 20 20
+ 290 3.3 -2574.7745 -2643.4524 412.06718 20 20
+ 300 3.4 -2575.3126 -2643.9904 412.06718 20 20
+ 310 3.5 -2576.5002 -2645.178 412.06718 20 20
+ 320 3.6 -2577.7411 -2646.419 412.06718 20 20
+ 330 3.6 -2578.2283 -2646.9061 412.06718 20 20
+ 340 3.7 -2577.7485 -2646.4263 412.06718 20 20
+ 350 3.8 -2576.9631 -2645.6409 412.06718 20 20
+ 360 3.9 -2576.0309 -2644.7088 412.06718 20 20
+ 370 3.9 -2574.9309 -2643.6088 412.06718 20 20
+ 380 4 -2573.7943 -2642.4721 412.06718 20 20
+ 390 4.1 -2573.0353 -2641.7132 412.06718 20 20
+ 400 4.2 -2573.4199 -2642.0977 412.06718 20 20
+Loop time of 4.1567 on 4 procs for 400 steps with 1440 atoms
-Pair time (%) = 1.92424 (13.803)
-Neigh time (%) = 1.00703 (7.22368)
-Comm time (%) = 7.16062 (51.3648)
-Outpt time (%) = 0.231704 (1.66206)
-Other time (%) = 3.61712 (25.9465)
+Pair time (%) = 1.51993 (36.5657)
+Neigh time (%) = 0.622776 (14.9825)
+Comm time (%) = 0.838943 (20.1829)
+Outpt time (%) = 0.0159447 (0.383589)
+Other time (%) = 1.15911 (27.8854)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104865 ave 104966 max 104653 min
Histogram: 1 0 0 0 0 0 0 1 0 2
FullNghs: 209730 ave 209902 max 209521 min
Histogram: 1 0 0 0 1 0 0 1 0 1
Total # of neighbors = 838918
Ave neighs/atom = 582.582
Neighbor list builds = 40
Dangerous builds = 0
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc with 1 nodes
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 96.3294 Mbytes
+Memory usage per processor = 55.72 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
400 0 -2573.4199 -2642.0977 412.06718 20 20
- 410 0.21 -2573.3989 -2643.8456 433.15262 20.515086 21.713906
- 420 0.41 -2573.4227 -2646.1086 438.04239 21.167211 21.932978
- 430 0.54 -2573.4509 -2647.2056 440.59304 21.478451 22.047254
- 440 0.62 -2573.4593 -2646.2699 439.10407 21.203492 21.980544
- 450 0.72 -2573.477 -2644.3183 435.54519 20.630023 21.821098
- 460 0.81 -2573.492 -2643.0074 433.25785 20.243891 21.71862
- 470 0.93 -2573.4972 -2642.6209 432.83341 20.12985 21.699605
- 480 1 -2573.5082 -2642.5684 433.06695 20.111322 21.710068
- 490 1.1 -2573.5206 -2642.9262 434.12535 20.211932 21.757486
- 500 1.2 -2573.5404 -2643.6737 435.95443 20.42383 21.839434
-Loop time of 1.16692 on 4 procs for 100 steps with 1440 atoms
+ 410 0.14 -2573.3989 -2643.8456 433.15262 20.515086 21.713906
+ 420 0.3 -2573.4227 -2646.1086 438.04239 21.167211 21.932978
+ 430 0.38 -2573.4509 -2647.2056 440.59304 21.478451 22.047254
+ 440 0.47 -2573.4593 -2646.2699 439.10407 21.203492 21.980544
+ 450 0.55 -2573.477 -2644.3183 435.54519 20.630023 21.821098
+ 460 0.63 -2573.492 -2643.0074 433.25785 20.243891 21.71862
+ 470 0.71 -2573.4972 -2642.6209 432.83341 20.12985 21.699605
+ 480 0.8 -2573.5082 -2642.5684 433.06695 20.111322 21.710068
+ 490 0.88 -2573.5206 -2642.9262 434.12535 20.211932 21.757486
+ 500 0.96 -2573.5404 -2643.6737 435.95443 20.42383 21.839434
+Loop time of 0.959478 on 4 procs for 100 steps with 1440 atoms
-Pair time (%) = 0.388731 (33.3126)
-Neigh time (%) = 0.187062 (16.0304)
-Comm time (%) = 0.188758 (16.1757)
-Outpt time (%) = 0.00402528 (0.34495)
-Other time (%) = 0.398342 (34.1363)
+Pair time (%) = 0.361798 (37.7078)
+Neigh time (%) = 0.154118 (16.0626)
+Comm time (%) = 0.134391 (14.0067)
+Outpt time (%) = 0.00400424 (0.417335)
+Other time (%) = 0.305167 (31.8055)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104762 ave 105086 max 104552 min
Histogram: 2 0 0 0 1 0 0 0 0 1
FullNghs: 209524 ave 209826 max 209318 min
Histogram: 1 0 1 1 0 0 0 0 0 1
Total # of neighbors = 838094
Ave neighs/atom = 582.01
Neighbor list builds = 10
Dangerous builds = 0
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 96.3294 Mbytes
+Memory usage per processor = 55.72 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.5404 -2643.6737 435.95443 20.42383 21.839434
- 100 1 -2573.5201 -2644.6896 441.36654 20.725607 22.081908
- 200 2.7 -2573.6986 -2641.8416 438.49489 19.844232 21.953252
- 300 9.2 -2573.8026 -2646.5126 450.6649 21.174221 22.498496
- 400 12 -2574.0076 -2641.6212 443.12147 19.690084 22.160533
- 500 13 -2573.8428 -2644.4381 451.49978 20.558381 22.5359
- 600 19 -2573.9961 -2641.9998 448.70746 19.803677 22.410798
- 700 25 -2573.8774 -2643.3051 453.67192 20.218357 22.633217
- 800 26 -2573.7077 -2642.9004 455.12598 20.149918 22.698362
- 900 36 -2573.659 -2643.8164 458.91706 20.430858 22.868211
- 1000 46 -2573.6515 -2645.0297 463.27029 20.786373 23.063246
- 1100 48 -2573.739 -2643.1888 461.37312 20.224789 22.978248
- 1200 54 -2573.8829 -2643.4916 463.51413 20.271065 23.07417
- 1300 61 -2573.6889 -2642.1642 462.75357 19.941028 23.040095
- 1400 63 -2573.6138 -2643.3131 466.83853 20.297442 23.223111
- 1500 70 -2573.6377 -2644.037 469.86295 20.501291 23.358612
- 1600 73 -2573.7132 -2642.1741 467.56259 19.936825 23.25555
- 1700 77 -2573.6318 -2644.3408 473.44986 20.591494 23.519313
- 1800 85 -2573.5331 -2645.0402 476.4419 20.823916 23.653363
- 1900 95 -2573.4381 -2643.6765 475.25076 20.454439 23.599998
- 2000 97 -2573.2109 -2643.7709 477.03683 20.548116 23.680017
- 2100 99 -2572.7952 -2641.9155 475.13352 20.128847 23.594745
- 2200 1e+02 -2572.3464 -2644.6346 482.39664 21.051379 23.920149
- 2300 1e+02 -2572.1743 -2643.3235 481.25163 20.719688 23.86885
- 2400 1e+02 -2572.003 -2641.285 478.59356 20.175918 23.749762
- 2500 1e+02 -2571.9544 -2642.3789 482.04175 20.508634 23.904249
- 2600 1e+02 -2571.5378 -2645.5591 490.12091 21.556075 24.266214
- 2700 1.1e+02 -2571.194 -2643.2392 487.04142 20.980609 24.128245
- 2800 1.1e+02 -2570.7174 -2640.0345 482.27121 20.186156 23.91453
- 2900 1.1e+02 -2570.1078 -2642.3194 488.64361 21.029079 24.200027
- 3000 1.1e+02 -2569.629 -2639.2966 484.19967 20.288221 24.000929
- 3100 1.1e+02 -2569.2046 -2639.152 485.43842 20.369711 24.056428
- 3200 1.1e+02 -2568.7882 -2639.9226 488.49663 20.715389 24.193442
- 3300 1.1e+02 -2568.3921 -2642.7345 495.61975 21.649606 24.512574
- 3400 1.1e+02 -2567.891 -2642.4061 496.56031 21.699906 24.554713
- 3500 1.1e+02 -2567.427 -2639.0374 491.37897 20.853974 24.322578
- 3600 1.1e+02 -2566.8768 -2638.0079 490.88541 20.714401 24.300465
- 3700 1.2e+02 -2566.2734 -2639.3392 495.18518 21.277842 24.493104
- 3800 1.2e+02 -2565.7852 -2641.3533 500.73283 22.006534 24.741652
- 3900 1.2e+02 -2565.7265 -2638.1821 495.43581 21.100134 24.504333
- 4000 1.2e+02 -2565.6983 -2639.4683 499.03414 21.482923 24.665547
- 4100 1.2e+02 -2565.7639 -2639.2719 499.53281 21.406617 24.687888
- 4200 1.2e+02 -2565.625 -2640.6103 503.37081 21.836828 24.859839
- 4300 1.2e+02 -2565.4337 -2638.9291 501.16899 21.40294 24.761193
- 4400 1.2e+02 -2565.2841 -2638.0978 500.53725 21.204407 24.732889
- 4500 1.2e+02 -2564.9077 -2638.3346 502.30975 21.382989 24.812301
- 4600 1.2e+02 -2564.6232 -2642.1774 511.25728 22.58494 25.213171
- 4700 1.3e+02 -2564.1627 -2641.874 512.04261 22.630698 25.248355
- 4800 1.3e+02 -2563.7451 -2638.6352 506.82273 21.809095 25.014493
- 4900 1.3e+02 -2563.1698 -2638.5762 508.19932 21.959455 25.076167
- 5000 1.3e+02 -2562.7311 -2638.9256 510.23315 22.188955 25.167288
- 5100 1.3e+02 -2562.1789 -2637.2983 508.42366 21.875875 25.086218
- 5200 1.3e+02 -2561.8603 -2638.4362 511.81985 22.300012 25.238375
- 5300 1.3e+02 -2561.4518 -2638.6128 513.46746 22.470413 25.312192
- 5400 1.3e+02 -2561.0887 -2636.5462 510.54177 21.974325 25.181115
- 5500 1.3e+02 -2560.7913 -2637.674 513.91855 22.389358 25.332402
- 5600 1.3e+02 -2560.4293 -2635.6344 511.01724 21.900824 25.202416
- 5700 1.4e+02 -2559.956 -2638.664 518.41982 22.920936 25.534069
- 5800 1.4e+02 -2559.5294 -2636.8718 516.0703 22.523257 25.428805
- 5900 1.5e+02 -2559.2184 -2637.7882 518.98207 22.880675 25.559259
- 6000 1.5e+02 -2558.7839 -2637.881 520.33211 23.034231 25.619744
- 6100 1.5e+02 -2558.2076 -2636.2274 518.42834 22.720496 25.53445
- 6200 1.5e+02 -2557.7055 -2635.5853 518.46629 22.679729 25.536151
- 6300 1.5e+02 -2557.275 -2635.3449 519.15358 22.735109 25.566943
- 6400 1.5e+02 -2556.9861 -2634.0119 517.55898 22.431055 25.495501
- 6500 1.5e+02 -2556.6947 -2636.4319 523.44577 23.220628 25.759242
- 6600 1.5e+02 -2556.3261 -2633.5874 518.88303 22.499641 25.554822
- 6700 1.5e+02 -2556.0983 -2634.3646 521.38252 22.792298 25.666804
- 6800 1.6e+02 -2555.7606 -2632.5328 518.78459 22.357197 25.550411
- 6900 1.6e+02 -2555.2965 -2634.6317 524.15767 23.103559 25.791137
- 7000 1.6e+02 -2554.8934 -2637.194 530.43216 23.967159 26.072249
- 7100 1.6e+02 -2554.5446 -2635.57 528.22644 23.595759 25.973427
- 7200 1.6e+02 -2554.0567 -2631.7969 521.8733 22.639092 25.688792
- 7300 1.6e+02 -2553.516 -2636.3304 532.21316 24.116751 26.152042
- 7400 1.6e+02 -2553.2132 -2631.2954 523.12951 22.738664 25.745074
- 7500 1.6e+02 -2552.826 -2635.2341 532.13047 23.998434 26.148337
- 7600 1.6e+02 -2552.5036 -2632.0088 526.65649 23.153076 25.90309
- 7700 1.6e+02 -2552.022 -2632.2323 528.25595 23.358404 25.97475
- 7800 1.7e+02 -2551.57 -2633.2608 531.44638 23.789544 26.117688
- 7900 1.7e+02 -2551.255 -2632.3043 530.48366 23.602743 26.074556
- 8000 1.7e+02 -2550.8499 -2632.0816 531.11588 23.655854 26.102881
- 8100 1.7e+02 -2550.5837 -2631.3645 530.61796 23.524571 26.080573
- 8200 1.7e+02 -2550.5492 -2631.2585 531.09172 23.503718 26.101798
- 8300 1.8e+02 -2550.571 -2631.4011 532.00391 23.538904 26.142667
- 8400 1.8e+02 -2550.5563 -2634.2103 538.29195 24.361265 26.424385
- 8500 1.9e+02 -2550.3181 -2631.2702 533.28023 23.574444 26.199849
- 8600 1.9e+02 -2549.8887 -2632.7932 537.36071 24.143017 26.382663
- 8700 1.9e+02 -2549.4418 -2631.583 536.05745 23.920729 26.324274
- 8800 2e+02 -2549.0389 -2633.5074 540.85459 24.598449 26.539197
- 8900 2.1e+02 -2548.632 -2630.007 534.9072 23.69757 26.27274
- 9000 2.1e+02 -2548.5009 -2631.2347 538.06423 24.093293 26.414182
- 9100 2.1e+02 -2548.1807 -2629.7776 536.11497 23.762211 26.326851
- 9200 2.2e+02 -2548.013 -2628.7314 534.75002 23.506386 26.265699
- 9300 2.3e+02 -2547.7615 -2630.5208 539.22355 24.100708 26.466123
- 9400 2.3e+02 -2547.3193 -2629.0508 537.3089 23.801401 26.380342
- 9500 2.4e+02 -2546.9048 -2632.3171 544.87205 24.873305 26.719188
- 9600 2.4e+02 -2546.4783 -2631.3151 543.83909 24.705735 26.672909
- 9700 2.4e+02 -2546.0177 -2631.6459 545.58652 24.936195 26.751198
- 9800 2.4e+02 -2545.5995 -2630.0939 543.46879 24.606005 26.656319
- 9900 2.5e+02 -2545.3065 -2628.1317 540.38322 24.119904 26.518079
- 10000 2.5e+02 -2545.0477 -2631.2427 547.46396 25.101238 26.835312
-Loop time of 249.719 on 4 procs for 10000 steps with 1440 atoms
+ 100 0.82 -2573.5201 -2644.6896 441.36654 20.725607 22.081908
+ 200 1.6 -2573.6986 -2641.8416 438.49489 19.844232 21.953252
+ 300 2.6 -2573.8026 -2646.5126 450.6649 21.174221 22.498496
+ 400 3.6 -2574.0076 -2641.6212 443.12147 19.690084 22.160533
+ 500 4.6 -2573.8428 -2644.4381 451.49978 20.558381 22.5359
+ 600 5.8 -2573.9961 -2641.9998 448.70746 19.803677 22.410798
+ 700 6.9 -2573.8774 -2643.3051 453.67192 20.218357 22.633217
+ 800 8 -2573.7077 -2642.9004 455.12598 20.149918 22.698362
+ 900 9 -2573.659 -2643.8164 458.91706 20.430858 22.868211
+ 1000 10 -2573.6515 -2645.0297 463.27029 20.786373 23.063246
+ 1100 11 -2573.739 -2643.1888 461.37312 20.224789 22.978248
+ 1200 12 -2573.8829 -2643.4916 463.51413 20.271065 23.07417
+ 1300 13 -2573.6889 -2642.1642 462.75357 19.941028 23.040095
+ 1400 15 -2573.6138 -2643.3131 466.83853 20.297442 23.223111
+ 1500 16 -2573.6377 -2644.037 469.86295 20.501291 23.358612
+ 1600 17 -2573.7132 -2642.1741 467.56259 19.936825 23.25555
+ 1700 18 -2573.6318 -2644.3408 473.44986 20.591494 23.519313
+ 1800 19 -2573.5331 -2645.0402 476.4419 20.823916 23.653363
+ 1900 20 -2573.4381 -2643.6765 475.25076 20.454439 23.599998
+ 2000 21 -2573.2109 -2643.7709 477.03683 20.548116 23.680017
+ 2100 22 -2572.7952 -2641.9155 475.13352 20.128847 23.594745
+ 2200 23 -2572.3464 -2644.6346 482.39664 21.051379 23.920149
+ 2300 23 -2572.1743 -2643.3235 481.25163 20.719688 23.86885
+ 2400 24 -2572.003 -2641.285 478.59356 20.175918 23.749762
+ 2500 25 -2571.9544 -2642.3789 482.04175 20.508634 23.904249
+ 2600 26 -2571.5378 -2645.5591 490.12091 21.556075 24.266214
+ 2700 26 -2571.194 -2643.2392 487.04142 20.980609 24.128245
+ 2800 28 -2570.7174 -2640.0345 482.27121 20.186156 23.91453
+ 2900 29 -2570.1078 -2642.3194 488.64361 21.029079 24.200027
+ 3000 30 -2569.629 -2639.2966 484.19967 20.288221 24.000929
+ 3100 31 -2569.2046 -2639.152 485.43842 20.369711 24.056428
+ 3200 32 -2568.7882 -2639.9226 488.49663 20.715389 24.193442
+ 3300 33 -2568.3921 -2642.7345 495.61975 21.649606 24.512574
+ 3400 33 -2567.891 -2642.4061 496.56031 21.699906 24.554713
+ 3500 36 -2567.427 -2639.0374 491.37897 20.853974 24.322578
+ 3600 37 -2566.8768 -2638.0079 490.88541 20.714401 24.300465
+ 3700 37 -2566.2734 -2639.3392 495.18518 21.277842 24.493104
+ 3800 39 -2565.7852 -2641.3533 500.73283 22.006534 24.741652
+ 3900 40 -2565.7265 -2638.1821 495.43581 21.100134 24.504333
+ 4000 40 -2565.6983 -2639.4683 499.03414 21.482923 24.665547
+ 4100 41 -2565.7639 -2639.2719 499.53281 21.406617 24.687888
+ 4200 42 -2565.625 -2640.6103 503.37081 21.836828 24.859839
+ 4300 43 -2565.4337 -2638.9291 501.16899 21.40294 24.761193
+ 4400 44 -2565.2841 -2638.0978 500.53725 21.204407 24.732889
+ 4500 44 -2564.9077 -2638.3346 502.30975 21.382989 24.812301
+ 4600 45 -2564.6232 -2642.1774 511.25728 22.58494 25.213171
+ 4700 46 -2564.1627 -2641.874 512.04261 22.630698 25.248355
+ 4800 47 -2563.7451 -2638.6352 506.82273 21.809095 25.014493
+ 4900 48 -2563.1698 -2638.5762 508.19932 21.959455 25.076167
+ 5000 48 -2562.7311 -2638.9256 510.23315 22.188955 25.167288
+ 5100 49 -2562.1789 -2637.2983 508.42366 21.875875 25.086218
+ 5200 50 -2561.8603 -2638.4362 511.81985 22.300012 25.238375
+ 5300 51 -2561.4518 -2638.6128 513.46746 22.470413 25.312192
+ 5400 52 -2561.0887 -2636.5462 510.54177 21.974325 25.181115
+ 5500 53 -2560.7913 -2637.674 513.91855 22.389358 25.332402
+ 5600 53 -2560.4293 -2635.6344 511.01724 21.900824 25.202416
+ 5700 54 -2559.956 -2638.664 518.41982 22.920936 25.534069
+ 5800 55 -2559.5294 -2636.8718 516.0703 22.523257 25.428805
+ 5900 56 -2559.2184 -2637.7882 518.98207 22.880675 25.559259
+ 6000 57 -2558.7839 -2637.881 520.33211 23.034231 25.619744
+ 6100 57 -2558.2076 -2636.2274 518.42834 22.720496 25.53445
+ 6200 60 -2557.7055 -2635.5853 518.46629 22.679729 25.536151
+ 6300 61 -2557.275 -2635.3449 519.15358 22.735109 25.566943
+ 6400 62 -2556.9861 -2634.0119 517.55898 22.431055 25.495501
+ 6500 63 -2556.6947 -2636.4319 523.44577 23.220628 25.759242
+ 6600 63 -2556.3261 -2633.5874 518.88303 22.499641 25.554822
+ 6700 64 -2556.0983 -2634.3646 521.38252 22.792298 25.666804
+ 6800 65 -2555.7606 -2632.5328 518.78459 22.357197 25.550411
+ 6900 66 -2555.2965 -2634.6317 524.15767 23.103559 25.791137
+ 7000 67 -2554.8934 -2637.194 530.43216 23.967159 26.072249
+ 7100 68 -2554.5446 -2635.57 528.22644 23.595759 25.973427
+ 7200 68 -2554.0567 -2631.7969 521.8733 22.639092 25.688792
+ 7300 69 -2553.516 -2636.3304 532.21316 24.116751 26.152042
+ 7400 70 -2553.2132 -2631.2954 523.12951 22.738664 25.745074
+ 7500 71 -2552.826 -2635.2341 532.13047 23.998434 26.148337
+ 7600 72 -2552.5036 -2632.0088 526.65649 23.153076 25.90309
+ 7700 72 -2552.022 -2632.2323 528.25595 23.358404 25.97475
+ 7800 73 -2551.57 -2633.2608 531.44638 23.789544 26.117688
+ 7900 74 -2551.255 -2632.3043 530.48366 23.602743 26.074556
+ 8000 75 -2550.8499 -2632.0816 531.11588 23.655854 26.102881
+ 8100 76 -2550.5837 -2631.3645 530.61796 23.524571 26.080573
+ 8200 76 -2550.5492 -2631.2585 531.09172 23.503718 26.101798
+ 8300 77 -2550.571 -2631.4011 532.00391 23.538904 26.142667
+ 8400 78 -2550.5563 -2634.2103 538.29195 24.361265 26.424385
+ 8500 80 -2550.3181 -2631.2702 533.28023 23.574444 26.199849
+ 8600 81 -2549.8887 -2632.7932 537.36071 24.143017 26.382663
+ 8700 82 -2549.4418 -2631.583 536.05745 23.920729 26.324274
+ 8800 83 -2549.0389 -2633.5074 540.85459 24.598449 26.539197
+ 8900 84 -2548.632 -2630.007 534.9072 23.69757 26.27274
+ 9000 84 -2548.5009 -2631.2347 538.06423 24.093293 26.414182
+ 9100 85 -2548.1807 -2629.7776 536.11497 23.762211 26.326851
+ 9200 86 -2548.013 -2628.7314 534.75002 23.506386 26.265699
+ 9300 87 -2547.7615 -2630.5208 539.22355 24.100708 26.466123
+ 9400 88 -2547.3193 -2629.0508 537.3089 23.801401 26.380342
+ 9500 89 -2546.9048 -2632.3171 544.87205 24.873305 26.719188
+ 9600 90 -2546.4783 -2631.3151 543.83909 24.705735 26.672909
+ 9700 91 -2546.0177 -2631.6459 545.58652 24.936195 26.751198
+ 9800 92 -2545.5995 -2630.0939 543.46879 24.606005 26.656319
+ 9900 94 -2545.3065 -2628.1317 540.38322 24.119904 26.518079
+ 10000 94 -2545.0477 -2631.2427 547.46396 25.101238 26.835312
+Loop time of 94.3615 on 4 procs for 10000 steps with 1440 atoms
-Pair time (%) = 42.983 (17.2126)
-Neigh time (%) = 21.9303 (8.78199)
-Comm time (%) = 74.6241 (29.8832)
-Outpt time (%) = 0.564417 (0.226021)
-Other time (%) = 109.617 (43.8962)
+Pair time (%) = 35.9225 (38.069)
+Neigh time (%) = 15.185 (16.0924)
+Comm time (%) = 10.9149 (11.5672)
+Outpt time (%) = 0.135885 (0.144004)
+Other time (%) = 32.2032 (34.1275)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104819 ave 104912 max 104720 min
Histogram: 1 0 1 0 0 0 0 0 1 1
FullNghs: 209638 ave 210108 max 209134 min
Histogram: 1 1 0 0 0 0 0 0 0 2
Total # of neighbors = 838550
Ave neighs/atom = 582.326
Neighbor list builds = 1000
Dangerous builds = 0
diff --git a/examples/USER/atc/thermal/bar1d_frac_step.screen b/examples/USER/atc/thermal/bar1d_frac_step.screen
index 702a06e07..4df457e25 100644
--- a/examples/USER/atc/thermal/bar1d_frac_step.screen
+++ b/examples/USER/atc/thermal/bar1d_frac_step.screen
@@ -1,176 +1,177 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Reading data file ...
orthogonal box = (-27.025 -16.215 -16.215) to (27.025 16.215 16.215)
2 by 1 by 2 MPI processor grid
1440 atoms
1440 velocities
Lattice spacing in x,y,z = 5.405 5.405 5.405
1152 atoms in group internal
288 atoms in group ghost
ATC: constructing thermal coupling with parameter file Ar_thermal.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 3 materials defined from Ar_thermal.mat
ATC: created uniform mesh with 20 nodes, 5 unique nodes, and 4 elements
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc with 1 nodes
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 50.3386 Mbytes
+Memory usage per processor = 19.8816 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.6428 -2710.8793 154.52519 39.965279 24
- 100 3.6 -2518.1866 -2595.4493 154.52519 22.500023 24
- 200 4.8 -2568.5847 -2645.8474 154.52519 22.500023 24
- 300 5.5 -2559.7999 -2637.0626 154.52519 22.500023 24
- 400 14 -2558.3822 -2635.6449 154.52519 22.500023 24
-Loop time of 13.6329 on 4 procs for 400 steps with 1440 atoms
+ 100 1.2 -2518.1866 -2595.4493 154.52519 22.500023 24
+ 200 2.7 -2568.5847 -2645.8474 154.52519 22.500023 24
+ 300 3.6 -2559.7999 -2637.0626 154.52519 22.500023 24
+ 400 4.4 -2558.3822 -2635.6449 154.52519 22.500023 24
+Loop time of 4.43588 on 4 procs for 400 steps with 1440 atoms
-Pair time (%) = 1.94422 (14.2612)
-Neigh time (%) = 1.12431 (8.24707)
-Comm time (%) = 6.77892 (49.7248)
-Outpt time (%) = 0.000810146 (0.00594259)
-Other time (%) = 3.78462 (27.761)
+Pair time (%) = 1.62212 (36.5683)
+Neigh time (%) = 0.677991 (15.2843)
+Comm time (%) = 1.55124 (34.9704)
+Outpt time (%) = 0.000792623 (0.0178684)
+Other time (%) = 0.583728 (13.1593)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104925 ave 105233 max 104576 min
Histogram: 1 0 0 1 0 0 0 1 0 1
FullNghs: 209850 ave 210159 max 209488 min
Histogram: 1 0 0 0 0 1 1 0 0 1
Total # of neighbors = 839402
Ave neighs/atom = 582.918
Neighbor list builds = 40
Dangerous builds = 0
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 56.989 Mbytes
+Memory usage per processor = 26.532 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2558.3822 -2635.6449 154.52519 22.500023 24
- 100 3.8 -2552.5043 -2632.8749 156.62853 23.405103 24.24501
- 200 14 -2549.8719 -2634.1326 158.91067 24.537953 24.510846
- 300 15 -2545.083 -2628.7145 161.33532 24.354702 24.793283
- 400 17 -2542.0333 -2630.2815 165.63086 25.699172 25.293653
- 500 26 -2539.6855 -2626.4322 168.67671 25.261904 25.648452
- 600 29 -2537.684 -2628.9976 171.74862 26.591857 26.006286
- 700 38 -2534.3129 -2623.8423 174.55244 26.072259 26.332891
- 800 41 -2533.4405 -2621.8368 176.45846 25.742306 26.554915
- 900 42 -2534.1228 -2623.6956 178.22609 26.084904 26.760819
- 1000 46 -2531.8714 -2622.5054 179.14012 26.393948 26.867291
- 1100 52 -2532.8133 -2624.0546 180.82964 26.57081 27.064097
- 1200 59 -2529.4099 -2622.3883 182.33958 27.076676 27.239983
- 1300 63 -2530.8526 -2622.632 183.69362 26.727531 27.39771
- 1400 65 -2524.224 -2618.001 185.22706 27.309211 27.576333
- 1500 76 -2528.5455 -2625.7848 186.81972 28.317519 27.761855
- 1600 80 -2525.517 -2623.0676 188.31399 28.408145 27.935918
- 1700 87 -2525.1661 -2618.5626 188.27434 27.198421 27.931299
- 1800 88 -2524.8789 -2622.1289 189.17398 28.320604 28.036093
- 1900 89 -2521.3182 -2616.9976 189.99006 27.863221 28.131155
- 2000 99 -2524.9482 -2622.0399 191.26094 28.274519 28.279195
- 2100 1.1e+02 -2519.3593 -2615.432 192.0516 27.977779 28.371295
- 2200 1.1e+02 -2520.8632 -2618.5921 192.79971 28.460108 28.45844
- 2300 1.1e+02 -2517.3073 -2615.3736 193.39264 28.55832 28.527508
- 2400 1.1e+02 -2520.0587 -2618.6888 194.56198 28.722533 28.66372
- 2500 1.1e+02 -2523.7628 -2620.4444 193.95494 28.155125 28.593008
- 2600 1.2e+02 -2520.3049 -2616.8463 193.8447 28.114265 28.580167
- 2700 1.2e+02 -2518.6173 -2617.33 194.44248 28.746593 28.649799
- 2800 1.2e+02 -2519.9088 -2619.7533 195.22023 29.076198 28.740396
- 2900 1.2e+02 -2518.2877 -2617.8408 195.71077 28.991324 28.797537
- 3000 1.2e+02 -2519.7894 -2619.1288 196.33228 28.929071 28.869935
- 3100 1.2e+02 -2517.6906 -2618.7609 196.62015 29.433147 28.903467
- 3200 1.2e+02 -2520.7444 -2617.9402 196.13681 28.304817 28.847164
- 3300 1.2e+02 -2519.6307 -2615.5967 196.07965 27.946722 28.840507
- 3400 1.2e+02 -2518.1719 -2616.9329 196.66214 28.76065 28.908359
- 3500 1.2e+02 -2518.6985 -2616.6925 196.59502 28.537311 28.90054
- 3600 1.2e+02 -2519.0042 -2618.7537 197.35088 29.048524 28.988587
- 3700 1.2e+02 -2518.3943 -2616.1502 196.85544 28.467961 28.930875
- 3800 1.3e+02 -2514.9161 -2613.9237 197.35119 28.832463 28.988623
- 3900 1.3e+02 -2518.3393 -2617.5157 197.36535 28.881624 28.990272
- 4000 1.3e+02 -2519.4322 -2618.5633 196.14318 28.868422 28.847906
- 4100 1.3e+02 -2519.058 -2616.3128 196.64923 28.322019 28.906854
- 4200 1.3e+02 -2518.7765 -2621.3015 197.08878 29.856777 28.958056
- 4300 1.3e+02 -2518.2567 -2618.9544 197.14618 29.324669 28.964742
- 4400 1.3e+02 -2514.8229 -2610.4412 198.37372 27.845463 29.107733
- 4500 1.3e+02 -2518.6999 -2621.3277 199.20162 29.886727 29.204172
- 4600 1.3e+02 -2517.9045 -2615.9276 198.4982 28.545758 29.122233
- 4700 1.3e+02 -2516.7228 -2615.8136 198.68483 28.856684 29.143974
- 4800 1.4e+02 -2520.2107 -2619.749 198.0603 28.986989 29.071224
- 4900 1.4e+02 -2517.4831 -2618.4664 198.0633 29.407828 29.071574
- 5000 1.4e+02 -2518.3202 -2618.3372 198.00689 29.126411 29.065003
- 5100 1.4e+02 -2517.7374 -2615.8784 198.14951 28.580106 29.081616
- 5200 1.4e+02 -2519.2208 -2617.7451 197.42033 28.691739 28.996677
- 5300 1.4e+02 -2517.6707 -2617.7618 197.94662 29.147992 29.057983
- 5400 1.4e+02 -2516.8563 -2616.1453 196.81438 28.914436 28.926093
- 5500 1.4e+02 -2518.1049 -2615.5854 196.97376 28.387729 28.944658
- 5600 1.4e+02 -2519.4547 -2617.9107 196.82232 28.67181 28.927017
- 5700 1.4e+02 -2515.4908 -2614.9193 198.10022 28.955028 29.075874
- 5800 1.4e+02 -2517.5156 -2614.7566 199.09678 28.317986 29.19196
- 5900 1.4e+02 -2514.4073 -2611.889 199.59808 28.38812 29.250354
- 6000 1.5e+02 -2515.9884 -2617.0167 199.84825 29.420913 29.279495
- 6100 1.5e+02 -2519.0803 -2616.8917 198.58963 28.484096 29.132884
- 6200 1.5e+02 -2520.7756 -2615.8458 196.59931 27.685828 28.90104
- 6300 1.5e+02 -2523.3359 -2619.8562 195.68645 28.108116 28.794704
- 6400 1.5e+02 -2520.2637 -2618.5459 195.57653 28.621217 28.7819
- 6500 1.5e+02 -2517.5582 -2617.516 196.18102 29.109158 28.852314
- 6600 1.6e+02 -2517.2535 -2616.6764 196.40618 28.953418 28.878542
- 6700 1.6e+02 -2519.3703 -2618.718 197.16334 28.931504 28.966741
- 6800 1.6e+02 -2518.4833 -2615.1878 197.01299 28.161747 28.949228
- 6900 1.7e+02 -2520.6821 -2618.6087 196.52515 28.517655 28.892402
- 7000 1.7e+02 -2520.5353 -2616.7065 195.86855 28.006459 28.815917
- 7100 1.7e+02 -2517.9476 -2620.0888 195.84161 29.745001 28.812778
- 7200 1.7e+02 -2520.3188 -2619.9923 196.29834 29.026379 28.865981
- 7300 1.7e+02 -2520.019 -2617.5856 196.51155 28.412825 28.890817
- 7400 1.7e+02 -2517.3548 -2615.9011 196.63984 28.698129 28.905761
- 7500 1.7e+02 -2519.1854 -2614.7882 197.14349 27.84093 28.964429
- 7600 1.7e+02 -2520.2412 -2618.2459 196.4216 28.540386 28.880339
- 7700 1.7e+02 -2519.5564 -2619.0182 196.41019 28.964734 28.87901
- 7800 1.7e+02 -2515.8187 -2614.3055 196.96013 28.680787 28.94307
- 7900 1.7e+02 -2517.7437 -2618.3389 197.99869 29.294776 29.064048
- 8000 1.7e+02 -2516.1958 -2615.3797 198.1845 28.883784 29.085692
- 8100 1.8e+02 -2512.7208 -2611.2195 199.13814 28.684256 29.196778
- 8200 1.8e+02 -2512.9493 -2612.2569 199.29238 28.91983 29.214744
- 8300 1.8e+02 -2513.7878 -2615.9616 199.93983 29.754506 29.290163
- 8400 1.8e+02 -2513.8883 -2612.4143 200.2124 28.692219 29.321914
- 8500 1.8e+02 -2513.5448 -2613.6577 201.25162 29.154345 29.442968
- 8600 1.8e+02 -2514.0373 -2615.8877 201.30457 29.660325 29.449136
- 8700 1.8e+02 -2516.4725 -2617.5851 202.01401 29.445459 29.531776
- 8800 1.8e+02 -2512.447 -2613.6919 202.6094 29.483999 29.601131
- 8900 1.8e+02 -2511.2282 -2614.8801 203.35526 30.18495 29.688013
- 9000 1.8e+02 -2513.6189 -2614.7829 203.42457 29.460443 29.696086
- 9100 1.8e+02 -2516.2403 -2616.7038 203.00618 29.256458 29.647349
- 9200 1.8e+02 -2513.5758 -2614.8621 202.67684 29.496061 29.608986
- 9300 1.9e+02 -2511.9519 -2611.571 202.93946 29.010549 29.639577
- 9400 1.9e+02 -2512.0828 -2613.4151 202.91769 29.509457 29.637042
- 9500 2e+02 -2513.3277 -2613.1558 203.15617 29.071383 29.664821
- 9600 2e+02 -2511.4011 -2613.9597 203.2571 29.866546 29.676579
- 9700 2e+02 -2512.7013 -2612.2983 202.78084 29.004111 29.621101
- 9800 2.1e+02 -2511.842 -2613.6997 203.42265 29.662439 29.695862
- 9900 2.1e+02 -2514.1908 -2615.9923 202.92404 29.646084 29.637782
- 10000 2.2e+02 -2515.2188 -2615.5109 202.63891 29.206539 29.604568
-Loop time of 218.096 on 4 procs for 10000 steps with 1440 atoms
+ 100 0.66 -2552.5043 -2632.8749 156.62853 23.405103 24.24501
+ 200 1.3 -2549.8719 -2634.1326 158.91067 24.537953 24.510846
+ 300 2 -2545.083 -2628.7145 161.33532 24.354702 24.793283
+ 400 2.6 -2542.0333 -2630.2815 165.63086 25.699172 25.293653
+ 500 3.3 -2539.6855 -2626.4322 168.67671 25.261904 25.648452
+ 600 3.9 -2537.684 -2628.9976 171.74862 26.591857 26.006286
+ 700 4.5 -2534.3129 -2623.8423 174.55244 26.072259 26.332891
+ 800 5.2 -2533.4405 -2621.8368 176.45846 25.742306 26.554915
+ 900 5.8 -2534.1228 -2623.6956 178.22609 26.084904 26.760819
+ 1000 6.5 -2531.8714 -2622.5054 179.14012 26.393948 26.867291
+ 1100 7.1 -2532.8133 -2624.0546 180.82964 26.57081 27.064097
+ 1200 7.8 -2529.4099 -2622.3883 182.33958 27.076676 27.239983
+ 1300 8.4 -2530.8526 -2622.632 183.69362 26.727531 27.39771
+ 1400 9.1 -2524.224 -2618.001 185.22706 27.309211 27.576333
+ 1500 9.7 -2528.5455 -2625.7848 186.81972 28.317519 27.761855
+ 1600 10 -2525.517 -2623.0676 188.31399 28.408145 27.935918
+ 1700 11 -2525.1661 -2618.5626 188.27434 27.198421 27.931299
+ 1800 12 -2524.8789 -2622.1289 189.17398 28.320604 28.036093
+ 1900 12 -2521.3182 -2616.9976 189.99006 27.863221 28.131155
+ 2000 13 -2524.9482 -2622.0399 191.26094 28.274519 28.279195
+ 2100 14 -2519.3593 -2615.432 192.0516 27.977779 28.371295
+ 2200 16 -2520.8632 -2618.5921 192.79971 28.460108 28.45844
+ 2300 19 -2517.3073 -2615.3736 193.39264 28.55832 28.527508
+ 2400 19 -2520.0587 -2618.6888 194.56198 28.722533 28.66372
+ 2500 20 -2523.7628 -2620.4444 193.95494 28.155125 28.593008
+ 2600 20 -2520.3049 -2616.8463 193.8447 28.114265 28.580167
+ 2700 21 -2518.6173 -2617.33 194.44248 28.746593 28.649799
+ 2800 22 -2519.9088 -2619.7533 195.22023 29.076198 28.740396
+ 2900 22 -2518.2877 -2617.8408 195.71077 28.991324 28.797537
+ 3000 23 -2519.7894 -2619.1288 196.33228 28.929071 28.869935
+ 3100 24 -2517.6906 -2618.7609 196.62015 29.433147 28.903467
+ 3200 25 -2520.7444 -2617.9402 196.13681 28.304817 28.847164
+ 3300 26 -2519.6307 -2615.5967 196.07965 27.946722 28.840507
+ 3400 28 -2518.1719 -2616.9329 196.66214 28.76065 28.908359
+ 3500 29 -2518.6985 -2616.6925 196.59502 28.537311 28.90054
+ 3600 30 -2519.0042 -2618.7537 197.35088 29.048524 28.988587
+ 3700 32 -2518.3943 -2616.1502 196.85544 28.467961 28.930875
+ 3800 33 -2514.9161 -2613.9237 197.35119 28.832463 28.988623
+ 3900 34 -2518.3393 -2617.5157 197.36535 28.881624 28.990272
+ 4000 36 -2519.4322 -2618.5633 196.14318 28.868422 28.847906
+ 4100 37 -2519.058 -2616.3128 196.64923 28.322019 28.906854
+ 4200 38 -2518.7765 -2621.3015 197.08878 29.856777 28.958056
+ 4300 39 -2518.2567 -2618.9544 197.14618 29.324669 28.964742
+ 4400 39 -2514.8229 -2610.4412 198.37372 27.845463 29.107733
+ 4500 40 -2518.6999 -2621.3277 199.20162 29.886727 29.204172
+ 4600 41 -2517.9045 -2615.9276 198.4982 28.545758 29.122233
+ 4700 41 -2516.7228 -2615.8136 198.68483 28.856684 29.143974
+ 4800 42 -2520.2107 -2619.749 198.0603 28.986989 29.071224
+ 4900 43 -2517.4831 -2618.4664 198.0633 29.407828 29.071574
+ 5000 43 -2518.3202 -2618.3372 198.00689 29.126411 29.065003
+ 5100 44 -2517.7374 -2615.8784 198.14951 28.580106 29.081616
+ 5200 45 -2519.2208 -2617.7451 197.42033 28.691739 28.996677
+ 5300 45 -2517.6707 -2617.7618 197.94662 29.147992 29.057983
+ 5400 46 -2516.8563 -2616.1453 196.81438 28.914436 28.926093
+ 5500 47 -2518.1049 -2615.5854 196.97376 28.387729 28.944658
+ 5600 47 -2519.4547 -2617.9107 196.82232 28.67181 28.927017
+ 5700 48 -2515.4908 -2614.9193 198.10022 28.955028 29.075874
+ 5800 49 -2517.5156 -2614.7566 199.09678 28.317986 29.19196
+ 5900 49 -2514.4073 -2611.889 199.59808 28.38812 29.250354
+ 6000 50 -2515.9884 -2617.0167 199.84825 29.420913 29.279495
+ 6100 50 -2519.0803 -2616.8917 198.58963 28.484096 29.132884
+ 6200 51 -2520.7756 -2615.8458 196.59931 27.685828 28.90104
+ 6300 52 -2523.3359 -2619.8562 195.68645 28.108116 28.794704
+ 6400 52 -2520.2637 -2618.5459 195.57653 28.621217 28.7819
+ 6500 53 -2517.5582 -2617.516 196.18102 29.109158 28.852314
+ 6600 54 -2517.2535 -2616.6764 196.40618 28.953418 28.878542
+ 6700 55 -2519.3703 -2618.718 197.16334 28.931504 28.966741
+ 6800 56 -2518.4833 -2615.1878 197.01299 28.161747 28.949228
+ 6900 57 -2520.6821 -2618.6087 196.52515 28.517655 28.892402
+ 7000 59 -2520.5353 -2616.7065 195.86855 28.006459 28.815917
+ 7100 59 -2517.9476 -2620.0888 195.84161 29.745001 28.812778
+ 7200 60 -2520.3188 -2619.9923 196.29834 29.026379 28.865981
+ 7300 61 -2520.019 -2617.5856 196.51155 28.412825 28.890817
+ 7400 61 -2517.3548 -2615.9011 196.63984 28.698129 28.905761
+ 7500 62 -2519.1854 -2614.7882 197.14349 27.84093 28.964429
+ 7600 63 -2520.2412 -2618.2459 196.4216 28.540386 28.880339
+ 7700 63 -2519.5564 -2619.0182 196.41019 28.964734 28.87901
+ 7800 64 -2515.8187 -2614.3055 196.96013 28.680787 28.94307
+ 7900 65 -2517.7437 -2618.3389 197.99869 29.294776 29.064048
+ 8000 65 -2516.1958 -2615.3797 198.1845 28.883784 29.085692
+ 8100 66 -2512.7208 -2611.2195 199.13814 28.684256 29.196778
+ 8200 67 -2512.9493 -2612.2569 199.29238 28.91983 29.214744
+ 8300 67 -2513.7878 -2615.9616 199.93983 29.754506 29.290163
+ 8400 68 -2513.8883 -2612.4143 200.2124 28.692219 29.321914
+ 8500 69 -2513.5448 -2613.6577 201.25162 29.154345 29.442968
+ 8600 69 -2514.0373 -2615.8877 201.30457 29.660325 29.449136
+ 8700 70 -2516.4725 -2617.5851 202.01401 29.445459 29.531776
+ 8800 71 -2512.447 -2613.6919 202.6094 29.483999 29.601131
+ 8900 71 -2511.2282 -2614.8801 203.35526 30.18495 29.688013
+ 9000 72 -2513.6189 -2614.7829 203.42457 29.460443 29.696086
+ 9100 73 -2516.2403 -2616.7038 203.00618 29.256458 29.647349
+ 9200 73 -2513.5758 -2614.8621 202.67684 29.496061 29.608986
+ 9300 74 -2511.9519 -2611.571 202.93946 29.010549 29.639577
+ 9400 75 -2512.0828 -2613.4151 202.91769 29.509457 29.637042
+ 9500 75 -2513.3277 -2613.1558 203.15617 29.071383 29.664821
+ 9600 76 -2511.4011 -2613.9597 203.2571 29.866546 29.676579
+ 9700 77 -2512.7013 -2612.2983 202.78084 29.004111 29.621101
+ 9800 77 -2511.842 -2613.6997 203.42265 29.662439 29.695862
+ 9900 80 -2514.1908 -2615.9923 202.92404 29.646084 29.637782
+ 10000 80 -2515.2188 -2615.5109 202.63891 29.206539 29.604568
+Loop time of 80.3557 on 4 procs for 10000 steps with 1440 atoms
-Pair time (%) = 41.8422 (19.1852)
-Neigh time (%) = 20.5497 (9.4223)
-Comm time (%) = 67.489 (30.9446)
-Outpt time (%) = 0.374106 (0.171532)
-Other time (%) = 87.8413 (40.2764)
+Pair time (%) = 35.726 (44.4599)
+Neigh time (%) = 14.7992 (18.4172)
+Comm time (%) = 12.8219 (15.9564)
+Outpt time (%) = 0.029608 (0.0368462)
+Other time (%) = 16.9789 (21.1297)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104570 ave 104913 max 104118 min
Histogram: 1 0 0 0 1 0 0 0 1 1
FullNghs: 209141 ave 210354 max 207940 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 836564
Ave neighs/atom = 580.947
Neighbor list builds = 1000
Dangerous builds = 0
diff --git a/examples/USER/atc/thermal/bar1d_hoover.screen b/examples/USER/atc/thermal/bar1d_hoover.screen
index dbae569b9..fff2ce761 100644
--- a/examples/USER/atc/thermal/bar1d_hoover.screen
+++ b/examples/USER/atc/thermal/bar1d_hoover.screen
@@ -1,129 +1,130 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Reading data file ...
orthogonal box = (-37.835 -16.215 -16.215) to (37.835 16.215 16.215)
4 by 1 by 1 MPI processor grid
2016 atoms
2016 velocities
Lattice spacing in x,y,z = 5.405 5.405 5.405
1728 atoms in group internal
288 atoms in group ghost
ATC: constructing thermal coupling with parameter file Ar_thermal.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 3 materials defined from Ar_thermal.mat
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
ATC: created faceset obndy with 2 faces
ATC: created faceset lbndy with 1 faces
ATC: created faceset rbndy with 1 faces
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc with 1 nodes
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 94.9757 Mbytes
+Memory usage per processor = 53.7491 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -3635.4921 -3841.4065 412.06718 39.976852 20
- 100 1.4 -3633.2821 -3735.9436 412.06718 19.931021 20
- 200 2.5 -3633.7032 -3745.5364 412.06718 21.711641 20
- 300 3.8 -3633.3886 -3737.9656 412.06718 20.30289 20
- 400 4.8 -3633.276 -3743.2469 412.06718 21.350106 20
-Loop time of 4.81586 on 4 procs for 400 steps with 2016 atoms
+ 100 2 -3633.2821 -3735.9436 412.06718 19.931021 20
+ 200 3.1 -3633.7032 -3745.5364 412.06718 21.711641 20
+ 300 4.7 -3633.3886 -3737.9656 412.06718 20.30289 20
+ 400 6.1 -3633.276 -3743.2469 412.06718 21.350106 20
+Loop time of 6.05352 on 4 procs for 400 steps with 2016 atoms
-Pair time (%) = 2.08209 (43.2341)
-Neigh time (%) = 0.873464 (18.1372)
-Comm time (%) = 0.629725 (13.0761)
-Outpt time (%) = 0.00164068 (0.0340682)
-Other time (%) = 1.22894 (25.5186)
+Pair time (%) = 2.52706 (41.7453)
+Neigh time (%) = 1.08239 (17.8804)
+Comm time (%) = 0.914778 (15.1115)
+Outpt time (%) = 0.00159127 (0.0262866)
+Other time (%) = 1.5277 (25.2366)
Nlocal: 504 ave 504 max 504 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 5411 ave 6594 max 4228 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 153096 ave 168828 max 137834 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 306192 ave 336609 max 275767 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1224770
Ave neighs/atom = 607.525
Neighbor list builds = 40
Dangerous builds = 0
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 101.722 Mbytes
+Memory usage per processor = 60.4959 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -3633.276 -3743.2469 412.06718 21.350106 20
- 100 1.2 -3633.0184 -3737.5606 433.0597 20.296137 21.709743
- 200 2.3 -3630.978 -3736.759 437.07782 20.536657 21.889764
- 300 4.5 -3630.2807 -3738.4664 441.08703 21.003524 22.069386
- 400 5.8 -3628.7648 -3738.253 445.01494 21.256382 22.245365
- 500 7.2 -3628.6774 -3736.2098 448.44051 20.876689 22.398838
- 600 8.3 -3629.0146 -3738.7086 451.21751 21.296345 22.523254
- 700 9.5 -3629.4762 -3735.9701 453.6179 20.675069 22.630797
- 800 11 -3628.5517 -3737.9603 455.96852 21.240918 22.73611
- 900 12 -3627.9946 -3734.9525 458.36001 20.765138 22.843254
- 1000 13 -3627.1175 -3734.63 460.8795 20.872814 22.956133
- 1100 14 -3625.5617 -3736.2377 463.50068 21.486986 23.073567
- 1200 15 -3625.1174 -3735.9751 466.03 21.522261 23.186887
- 1300 25 -3623.7322 -3738.0095 468.52626 22.186143 23.298725
- 1400 35 -3622.477 -3733.4261 471.32308 21.540006 23.424029
- 1500 38 -3620.9818 -3734.3366 474.23412 22.007035 23.55445
- 1600 44 -3619.2598 -3731.8302 477.03372 21.854767 23.679878
- 1700 49 -3617.6892 -3731.965 479.84714 22.185839 23.805926
- 1800 59 -3616.4338 -3730.6552 482.89708 22.175296 23.94257
- 1900 60 -3614.9486 -3731.4426 485.8722 22.616502 24.075862
- 2000 62 -3612.9578 -3730.0656 488.82273 22.735673 24.208052
- 2100 72 -3611.6636 -3730.1037 491.71943 22.994329 24.337831
- 2200 74 -3609.638 -3726.0041 494.55968 22.591684 24.465081
- 2300 83 -3607.7636 -3726.2043 497.44291 22.994443 24.594256
- 2400 85 -3606.1931 -3729.5114 500.355 23.9414 24.724724
- 2500 86 -3605.654 -3728.5288 502.92122 23.85529 24.839697
- 2600 96 -3604.6683 -3726.5822 505.03954 23.668739 24.934602
- 2700 97 -3603.4727 -3727.5047 507.08456 24.079967 25.026224
- 2800 1.1e+02 -3601.3844 -3722.0574 509.55631 23.42783 25.136963
- 2900 1.1e+02 -3599.1203 -3724.1692 512.37703 24.277383 25.263338
- 3000 1.2e+02 -3597.4403 -3722.913 515.29334 24.359653 25.393995
- 3100 1.2e+02 -3596.4637 -3721.0822 517.95476 24.193817 25.513233
- 3200 1.3e+02 -3595.7063 -3720.5662 520.17135 24.240706 25.612541
- 3300 1.3e+02 -3594.7208 -3723.5103 522.05786 25.003593 25.697061
- 3400 1.4e+02 -3595.1342 -3723.1049 523.68038 24.844616 25.769754
- 3500 1.5e+02 -3594.1992 -3722.8206 524.96184 24.970947 25.827166
- 3600 1.5e+02 -3592.921 -3718.6757 526.62229 24.414414 25.901558
- 3700 1.5e+02 -3592.0787 -3722.0021 528.37927 25.223739 25.980275
- 3800 1.6e+02 -3591.4326 -3720.3866 529.9943 25.035536 26.052632
- 3900 1.7e+02 -3591.1339 -3719.2518 531.21478 24.873215 26.107312
- 4000 1.7e+02 -3588.7466 -3717.6921 532.70635 25.033882 26.174138
- 4100 1.8e+02 -3586.8667 -3716.2661 534.88978 25.121998 26.27196
- 4200 1.8e+02 -3585.4841 -3715.0705 537.1895 25.158292 26.374993
- 4300 1.9e+02 -3583.4751 -3715.4056 539.48252 25.613395 26.477725
- 4400 2e+02 -3582.8059 -3716.1375 541.63579 25.885404 26.574196
- 4500 2e+02 -3582.2104 -3717.0156 543.25614 26.171504 26.646792
- 4600 2e+02 -3580.8062 -3712.9347 545.04092 25.65184 26.726754
- 4700 2.1e+02 -3579.0105 -3714.252 547.03816 26.256204 26.816235
- 4800 2.1e+02 -3577.652 -3714.1416 549.10337 26.49851 26.908761
- 4900 2.2e+02 -3576.446 -3714.0514 551.00751 26.715137 26.994071
- 5000 2.2e+02 -3574.4655 -3713.6631 553.07998 27.024264 27.086922
-Loop time of 224.114 on 4 procs for 5000 steps with 2016 atoms
+ 100 1.5 -3633.0184 -3737.5606 433.0597 20.296137 21.709743
+ 200 2.7 -3630.978 -3736.759 437.07782 20.536657 21.889764
+ 300 3.8 -3630.2807 -3738.4664 441.08703 21.003524 22.069386
+ 400 5 -3628.7648 -3738.253 445.01494 21.256382 22.245365
+ 500 6.1 -3628.6774 -3736.2098 448.44051 20.876689 22.398838
+ 600 7.3 -3629.0146 -3738.7086 451.21751 21.296345 22.523254
+ 700 8.4 -3629.4762 -3735.9701 453.6179 20.675069 22.630797
+ 800 9.6 -3628.5517 -3737.9603 455.96852 21.240918 22.73611
+ 900 11 -3627.9946 -3734.9525 458.36001 20.765138 22.843254
+ 1000 12 -3627.1175 -3734.63 460.8795 20.872814 22.956133
+ 1100 13 -3625.5617 -3736.2377 463.50068 21.486986 23.073567
+ 1200 14 -3625.1174 -3735.9751 466.03 21.522261 23.186887
+ 1300 15 -3623.7322 -3738.0095 468.52626 22.186143 23.298725
+ 1400 17 -3622.477 -3733.4261 471.32308 21.540006 23.424029
+ 1500 18 -3620.9818 -3734.3366 474.23412 22.007035 23.55445
+ 1600 20 -3619.2598 -3731.8302 477.03372 21.854767 23.679878
+ 1700 22 -3617.6892 -3731.965 479.84714 22.185839 23.805926
+ 1800 23 -3616.4338 -3730.6552 482.89708 22.175296 23.94257
+ 1900 24 -3614.9486 -3731.4426 485.8722 22.616502 24.075862
+ 2000 25 -3612.9578 -3730.0656 488.82273 22.735673 24.208052
+ 2100 26 -3611.6636 -3730.1037 491.71943 22.994329 24.337831
+ 2200 27 -3609.638 -3726.0041 494.55968 22.591684 24.465081
+ 2300 29 -3607.7636 -3726.2043 497.44291 22.994443 24.594256
+ 2400 30 -3606.1931 -3729.5114 500.355 23.9414 24.724724
+ 2500 31 -3605.654 -3728.5288 502.92122 23.85529 24.839697
+ 2600 32 -3604.6683 -3726.5822 505.03954 23.668739 24.934602
+ 2700 33 -3603.4727 -3727.5047 507.08456 24.079967 25.026224
+ 2800 34 -3601.3844 -3722.0574 509.55631 23.42783 25.136963
+ 2900 35 -3599.1203 -3724.1692 512.37703 24.277383 25.263338
+ 3000 37 -3597.4403 -3722.913 515.29334 24.359653 25.393995
+ 3100 38 -3596.4637 -3721.0822 517.95476 24.193817 25.513233
+ 3200 40 -3595.7063 -3720.5662 520.17135 24.240706 25.612541
+ 3300 41 -3594.7208 -3723.5103 522.05786 25.003593 25.697061
+ 3400 43 -3595.1342 -3723.1049 523.68038 24.844616 25.769754
+ 3500 44 -3594.1992 -3722.8206 524.96184 24.970947 25.827166
+ 3600 45 -3592.921 -3718.6757 526.62229 24.414414 25.901558
+ 3700 46 -3592.0787 -3722.0021 528.37927 25.223739 25.980275
+ 3800 47 -3591.4326 -3720.3866 529.9943 25.035536 26.052632
+ 3900 48 -3591.1339 -3719.2518 531.21478 24.873215 26.107312
+ 4000 50 -3588.7466 -3717.6921 532.70635 25.033882 26.174138
+ 4100 51 -3586.8667 -3716.2661 534.88978 25.121998 26.27196
+ 4200 52 -3585.4841 -3715.0705 537.1895 25.158292 26.374993
+ 4300 53 -3583.4751 -3715.4056 539.48252 25.613395 26.477725
+ 4400 54 -3582.8059 -3716.1375 541.63579 25.885404 26.574196
+ 4500 55 -3582.2104 -3717.0156 543.25614 26.171504 26.646792
+ 4600 57 -3580.8062 -3712.9347 545.04092 25.65184 26.726754
+ 4700 59 -3579.0105 -3714.252 547.03816 26.256204 26.816235
+ 4800 61 -3577.652 -3714.1416 549.10337 26.49851 26.908761
+ 4900 62 -3576.446 -3714.0514 551.00751 26.715137 26.994071
+ 5000 63 -3574.4655 -3713.6631 553.07998 27.024264 27.086922
+Loop time of 63.3262 on 4 procs for 5000 steps with 2016 atoms
-Pair time (%) = 32.9838 (14.7175)
-Neigh time (%) = 16.9606 (7.56785)
-Comm time (%) = 45.4395 (20.2752)
-Outpt time (%) = 0.171835 (0.0766732)
-Other time (%) = 128.558 (57.3628)
+Pair time (%) = 26.0017 (41.06)
+Neigh time (%) = 10.9812 (17.3406)
+Comm time (%) = 6.43289 (10.1583)
+Outpt time (%) = 0.0581525 (0.0918301)
+Other time (%) = 19.8522 (31.3492)
Nlocal: 504 ave 504 max 504 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 5411 ave 6594 max 4228 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 152764 ave 169189 max 136700 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 305528 ave 336475 max 273769 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1222110
Ave neighs/atom = 606.205
Neighbor list builds = 500
Dangerous builds = 0
diff --git a/examples/USER/atc/thermal/bar1d_interpolate.screen b/examples/USER/atc/thermal/bar1d_interpolate.screen
index aecb0116b..c13035ce9 100644
--- a/examples/USER/atc/thermal/bar1d_interpolate.screen
+++ b/examples/USER/atc/thermal/bar1d_interpolate.screen
@@ -1,206 +1,207 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Reading data file ...
orthogonal box = (-27.025 -16.215 -16.215) to (27.025 16.215 16.215)
2 by 1 by 2 MPI processor grid
1440 atoms
1440 velocities
Lattice spacing in x,y,z = 5.405 5.405 5.405
1152 atoms in group internal
288 atoms in group ghost
ATC: constructing thermal coupling with parameter file Ar_thermal.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 3 materials defined from Ar_thermal.mat
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
ATC: created faceset ibndy with 2 faces
ATC: created faceset obndy with 2 faces
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 91.5825 Mbytes
+Memory usage per processor = 50.9732 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.6428 -2710.8793 412.06718 39.965279 20
- 100 0.74 -2537.6764 -2606.3542 412.06718 20 20
- 200 1.5 -2584.8754 -2653.5532 412.06718 20 20
+ 100 0.88 -2537.6764 -2606.3542 412.06718 20 20
+ 200 1.6 -2584.8754 -2653.5532 412.06718 20 20
300 2.3 -2575.3126 -2643.9904 412.06718 20 20
- 400 3.2 -2573.4199 -2642.0977 412.06718 20 20
-Loop time of 3.18614 on 4 procs for 400 steps with 1440 atoms
+ 400 3.1 -2573.4199 -2642.0977 412.06718 20 20
+Loop time of 3.06855 on 4 procs for 400 steps with 1440 atoms
-Pair time (%) = 1.44382 (45.3157)
-Neigh time (%) = 0.593548 (18.6291)
-Comm time (%) = 0.384184 (12.058)
-Outpt time (%) = 0.00157028 (0.0492849)
-Other time (%) = 0.763013 (23.9479)
+Pair time (%) = 1.409 (45.9176)
+Neigh time (%) = 0.584351 (19.0433)
+Comm time (%) = 0.296322 (9.65677)
+Outpt time (%) = 0.00154495 (0.050348)
+Other time (%) = 0.777323 (25.332)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104865 ave 104966 max 104653 min
Histogram: 1 0 0 0 0 0 0 1 0 2
FullNghs: 209730 ave 209902 max 209521 min
Histogram: 1 0 0 0 1 0 0 1 0 1
Total # of neighbors = 838918
Ave neighs/atom = 582.582
Neighbor list builds = 40
Dangerous builds = 0
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc with 1 nodes
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 96.3294 Mbytes
+Memory usage per processor = 55.72 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
400 0 -2573.4199 -2642.0977 412.06718 20 20
- 500 1.1 -2573.5342 -2643.6832 433.11971 20.428433 21.712432
-Loop time of 1.09966 on 4 procs for 100 steps with 1440 atoms
+ 500 0.86 -2573.5342 -2643.6832 433.11971 20.428433 21.712432
+Loop time of 0.861384 on 4 procs for 100 steps with 1440 atoms
-Pair time (%) = 0.359811 (32.7203)
-Neigh time (%) = 0.172976 (15.73)
-Comm time (%) = 0.139441 (12.6804)
-Outpt time (%) = 0.000396669 (0.0360721)
-Other time (%) = 0.427031 (38.8331)
+Pair time (%) = 0.347519 (40.3442)
+Neigh time (%) = 0.144495 (16.7747)
+Comm time (%) = 0.0460782 (5.34932)
+Outpt time (%) = 0.000386775 (0.0449015)
+Other time (%) = 0.322906 (37.4868)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104761 ave 105083 max 104555 min
Histogram: 2 0 0 0 1 0 0 0 0 1
FullNghs: 209522 ave 209825 max 209317 min
Histogram: 1 0 1 1 0 0 0 0 0 1
Total # of neighbors = 838088
Ave neighs/atom = 582.006
Neighbor list builds = 10
Dangerous builds = 0
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 96.3294 Mbytes
+Memory usage per processor = 55.72 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.5342 -2643.6832 433.11971 20.428433 21.712432
- 100 0.88 -2573.5097 -2644.702 436.57572 20.732249 21.867268
- 200 1.7 -2573.5112 -2641.7502 439.66841 19.872211 22.005828
- 300 2.6 -2573.3491 -2646.3078 442.69161 21.246649 22.141274
- 400 3.5 -2573.2822 -2641.2514 445.36751 19.793633 22.261161
- 500 4.4 -2572.8845 -2643.9862 447.90976 20.705853 22.375059
+ 100 1 -2573.5097 -2644.702 436.57572 20.732249 21.867268
+ 200 2.1 -2573.5112 -2641.7502 439.66841 19.872211 22.005828
+ 300 3 -2573.3491 -2646.3078 442.69161 21.246649 22.141274
+ 400 4.1 -2573.2822 -2641.2514 445.36751 19.793633 22.261161
+ 500 5.1 -2572.8845 -2643.9862 447.90976 20.705853 22.375059
600 6 -2572.6755 -2641.3224 450.33699 19.990965 22.483804
700 6.8 -2572.2821 -2642.5297 452.633 20.457107 22.586671
800 7.7 -2571.8547 -2641.9891 454.79418 20.424169 22.683497
- 900 8.9 -2571.4933 -2642.7882 456.85387 20.762116 22.775775
- 1000 14 -2571.0496 -2643.7527 458.82574 21.172182 22.86412
- 1100 21 -2570.5809 -2641.69 460.75038 20.708018 22.950348
- 1200 22 -2570.1887 -2641.7751 462.58586 20.847009 23.032581
- 1300 22 -2569.6728 -2640.1746 464.33069 20.531153 23.110754
- 1400 23 -2569.1102 -2641.2988 465.97998 21.022351 23.184646
- 1500 24 -2568.6933 -2641.6758 467.72853 21.25356 23.262985
- 1600 25 -2568.3126 -2639.4799 469.33389 20.724972 23.334908
- 1700 26 -2567.8917 -2641.4173 470.85034 21.411743 23.402849
- 1800 27 -2567.416 -2642.3747 472.3574 21.829085 23.470369
- 1900 28 -2567.0152 -2640.9335 473.92673 21.526078 23.540678
- 2000 28 -2566.5969 -2640.5435 475.40816 21.534312 23.607049
- 2100 31 -2566.1052 -2638.4679 476.80477 21.073068 23.66962
- 2200 31 -2565.5495 -2641.5032 478.14213 22.118844 23.729537
- 2300 32 -2565.1398 -2639.5956 479.53019 21.682594 23.791726
- 2400 33 -2564.732 -2637.9249 480.87877 21.314827 23.852145
- 2500 34 -2564.3944 -2638.6441 482.2304 21.622593 23.912701
- 2600 35 -2563.8222 -2641.7424 483.47432 22.691525 23.968431
- 2700 36 -2563.3329 -2639.2173 484.77559 22.098628 24.026731
- 2800 37 -2562.8806 -2636.6059 486.01573 21.469866 24.082292
- 2900 38 -2562.3465 -2638.8817 487.25366 22.288159 24.137755
- 3000 39 -2561.8757 -2635.0869 488.43148 21.320176 24.190523
- 3100 39 -2561.4471 -2635.1227 489.60154 21.455403 24.242945
- 3200 40 -2561.0263 -2636.215 490.82935 21.896066 24.297953
- 3300 41 -2560.5777 -2639.0266 491.97068 22.845446 24.349088
- 3400 46 -2560.0712 -2638.4176 493.06997 22.815602 24.398338
- 3500 48 -2559.6348 -2634.4135 494.16582 21.776629 24.447435
- 3600 51 -2559.1842 -2635.4811 495.30605 22.218778 24.49852
- 3700 52 -2558.7086 -2636.2754 496.34541 22.588602 24.545086
- 3800 59 -2558.2562 -2636.6903 497.40496 22.841163 24.592556
- 3900 62 -2557.9356 -2635.0878 498.49911 22.467843 24.641576
- 4000 65 -2557.6063 -2635.2544 499.51434 22.612267 24.687061
- 4100 75 -2557.2943 -2635.0249 500.49246 22.636293 24.730882
- 4200 79 -2556.9353 -2635.4961 501.50868 22.878043 24.776412
- 4300 86 -2556.6277 -2635.8313 502.53051 23.065232 24.822192
- 4400 87 -2556.3739 -2632.5904 503.57744 22.195375 24.869096
- 4500 88 -2556.0212 -2633.6191 504.49147 22.59766 24.910047
- 4600 94 -2555.6736 -2637.0356 505.44829 23.693808 24.952915
- 4700 1e+02 -2555.3469 -2635.8282 506.40204 23.437311 24.995645
- 4800 1.1e+02 -2555.0683 -2637.0806 507.39281 23.883194 25.040034
- 4900 1.1e+02 -2554.6933 -2634.0013 508.23979 23.095678 25.07798
- 5000 1.1e+02 -2554.4138 -2634.5914 509.20047 23.34888 25.121021
- 5100 1.2e+02 -2554.0316 -2631.8029 510.10292 22.648143 25.161453
- 5200 1.2e+02 -2553.7548 -2635.4247 511.03731 23.783481 25.203316
- 5300 1.2e+02 -2553.3812 -2634.282 511.87478 23.559504 25.240836
- 5400 1.2e+02 -2553.0678 -2632.9241 512.77374 23.255322 25.281111
- 5500 1.3e+02 -2552.7082 -2634.3549 513.6816 23.776717 25.321786
- 5600 1.4e+02 -2552.3171 -2634.1375 514.44071 23.827315 25.355796
- 5700 1.4e+02 -2551.9607 -2631.5049 515.35773 23.164428 25.39688
- 5800 1.5e+02 -2551.496 -2633.1155 516.19921 23.768789 25.43458
- 5900 1.5e+02 -2551.2035 -2632.1116 517.07471 23.561628 25.473805
- 6000 1.5e+02 -2550.7722 -2637.2148 517.87274 25.173338 25.509558
- 6100 1.6e+02 -2550.3729 -2635.223 518.677 24.709601 25.545591
- 6200 1.6e+02 -2550.0239 -2633.7077 519.50465 24.369948 25.582672
- 6300 1.6e+02 -2549.7022 -2634.9153 520.32051 24.815296 25.619224
- 6400 1.6e+02 -2549.2302 -2630.2767 521.18099 23.601923 25.657775
- 6500 1.7e+02 -2548.7701 -2632.1853 521.991 24.291732 25.694065
- 6600 1.8e+02 -2548.3382 -2629.8213 522.69988 23.729068 25.725825
- 6700 1.8e+02 -2547.9544 -2634.3457 523.47285 25.158407 25.760456
- 6800 1.8e+02 -2547.6099 -2632.3242 524.24129 24.670057 25.794884
- 6900 1.8e+02 -2547.3857 -2630.1042 524.9806 24.088828 25.828006
- 7000 1.9e+02 -2547.1211 -2631.9693 525.7776 24.70903 25.863714
- 7100 1.9e+02 -2546.7539 -2631.6181 526.45984 24.713697 25.89428
- 7200 2e+02 -2546.4777 -2629.7492 527.21059 24.249884 25.927915
- 7300 2e+02 -2546.2406 -2629.7818 528.01912 24.32843 25.964139
- 7400 2e+02 -2545.9694 -2632.4927 528.64586 25.196846 25.992218
- 7500 2.1e+02 -2545.8619 -2630.0613 529.38653 24.520088 26.025402
- 7600 2.2e+02 -2545.7138 -2632.8388 530.16874 25.372085 26.060447
- 7700 2.3e+02 -2545.4529 -2628.921 530.86231 24.307131 26.09152
- 7800 2.3e+02 -2545.166 -2629.3814 531.58154 24.524736 26.123743
- 7900 2.4e+02 -2544.8001 -2625.4882 532.26268 23.497557 26.15426
- 8000 2.4e+02 -2544.4118 -2628.3746 532.9236 24.451192 26.183871
- 8100 2.4e+02 -2544.1166 -2629.2914 533.60356 24.804137 26.214334
- 8200 2.5e+02 -2543.7942 -2627.1091 534.28788 24.262513 26.244994
- 8300 2.5e+02 -2543.4804 -2630.0029 534.94382 25.196642 26.274381
- 8400 2.5e+02 -2543.104 -2632.0263 535.55146 25.895456 26.301605
- 8500 2.6e+02 -2542.7117 -2627.3589 536.21003 24.650511 26.33111
- 8600 2.6e+02 -2542.3628 -2627.7464 536.92095 24.86496 26.362961
- 8700 2.7e+02 -2542.0845 -2628.3592 537.58922 25.124445 26.392901
- 8800 2.7e+02 -2541.7327 -2628.2907 538.11331 25.206956 26.416381
- 8900 2.8e+02 -2541.5205 -2628.8127 538.78583 25.420763 26.446512
- 9000 2.8e+02 -2541.4308 -2628.532 539.48656 25.36513 26.477906
- 9100 2.8e+02 -2541.3427 -2624.8856 540.08761 24.328917 26.504834
- 9200 2.8e+02 -2541.2405 -2626.8739 540.65481 24.937701 26.530246
- 9300 2.8e+02 -2541.1638 -2628.2134 541.35281 25.350118 26.561518
- 9400 2.8e+02 -2541.0394 -2629.2501 541.97029 25.688239 26.589183
- 9500 2.8e+02 -2540.8064 -2629.0064 542.46763 25.685128 26.611465
- 9600 2.8e+02 -2540.6384 -2628.7742 543.13578 25.666436 26.641399
- 9700 2.9e+02 -2540.3957 -2628.1981 543.7668 25.56933 26.669671
- 9800 2.9e+02 -2540.1324 -2627.8582 544.32985 25.547048 26.694896
- 9900 2.9e+02 -2539.8497 -2629.5669 544.90695 26.12696 26.720752
- 10000 2.9e+02 -2539.5955 -2628.0303 545.50615 25.753491 26.747597
-Loop time of 288.276 on 4 procs for 10000 steps with 1440 atoms
+ 900 8.5 -2571.4933 -2642.7882 456.85387 20.762116 22.775775
+ 1000 9.4 -2571.0496 -2643.7527 458.82574 21.172182 22.86412
+ 1100 10 -2570.5809 -2641.69 460.75038 20.708018 22.950348
+ 1200 11 -2570.1887 -2641.7751 462.58586 20.847009 23.032581
+ 1300 12 -2569.6728 -2640.1746 464.33069 20.531153 23.110754
+ 1400 14 -2569.1102 -2641.2988 465.97998 21.022351 23.184646
+ 1500 15 -2568.6933 -2641.6758 467.72853 21.25356 23.262985
+ 1600 17 -2568.3126 -2639.4799 469.33389 20.724972 23.334908
+ 1700 18 -2567.8917 -2641.4173 470.85034 21.411743 23.402849
+ 1800 19 -2567.416 -2642.3747 472.3574 21.829085 23.470369
+ 1900 20 -2567.0152 -2640.9335 473.92673 21.526078 23.540678
+ 2000 21 -2566.5969 -2640.5435 475.40816 21.534312 23.607049
+ 2100 22 -2566.1052 -2638.4679 476.80477 21.073068 23.66962
+ 2200 23 -2565.5495 -2641.5032 478.14213 22.118844 23.729537
+ 2300 24 -2565.1398 -2639.5956 479.53019 21.682594 23.791726
+ 2400 24 -2564.732 -2637.9249 480.87877 21.314827 23.852145
+ 2500 25 -2564.3944 -2638.6441 482.2304 21.622593 23.912701
+ 2600 26 -2563.8222 -2641.7424 483.47432 22.691525 23.968431
+ 2700 27 -2563.3329 -2639.2173 484.77559 22.098628 24.026731
+ 2800 28 -2562.8806 -2636.6059 486.01573 21.469866 24.082292
+ 2900 29 -2562.3465 -2638.8817 487.25366 22.288159 24.137755
+ 3000 30 -2561.8757 -2635.0869 488.43148 21.320176 24.190523
+ 3100 31 -2561.4471 -2635.1227 489.60154 21.455403 24.242945
+ 3200 31 -2561.0263 -2636.215 490.82935 21.896066 24.297953
+ 3300 32 -2560.5777 -2639.0266 491.97068 22.845446 24.349088
+ 3400 33 -2560.0712 -2638.4176 493.06997 22.815602 24.398338
+ 3500 34 -2559.6348 -2634.4135 494.16582 21.776629 24.447435
+ 3600 35 -2559.1842 -2635.4811 495.30605 22.218778 24.49852
+ 3700 37 -2558.7086 -2636.2754 496.34541 22.588602 24.545086
+ 3800 38 -2558.2562 -2636.6903 497.40496 22.841163 24.592556
+ 3900 39 -2557.9356 -2635.0878 498.49911 22.467843 24.641576
+ 4000 40 -2557.6063 -2635.2544 499.51434 22.612267 24.687061
+ 4100 41 -2557.2943 -2635.0249 500.49246 22.636293 24.730882
+ 4200 42 -2556.9353 -2635.4961 501.50868 22.878043 24.776412
+ 4300 43 -2556.6277 -2635.8313 502.53051 23.065232 24.822192
+ 4400 44 -2556.3739 -2632.5904 503.57744 22.195375 24.869096
+ 4500 45 -2556.0212 -2633.6191 504.49147 22.59766 24.910047
+ 4600 46 -2555.6736 -2637.0356 505.44829 23.693808 24.952915
+ 4700 47 -2555.3469 -2635.8282 506.40204 23.437311 24.995645
+ 4800 48 -2555.0683 -2637.0806 507.39281 23.883194 25.040034
+ 4900 49 -2554.6933 -2634.0013 508.23979 23.095678 25.07798
+ 5000 50 -2554.4138 -2634.5914 509.20047 23.34888 25.121021
+ 5100 51 -2554.0316 -2631.8029 510.10292 22.648143 25.161453
+ 5200 51 -2553.7548 -2635.4247 511.03731 23.783481 25.203316
+ 5300 52 -2553.3812 -2634.282 511.87478 23.559504 25.240836
+ 5400 53 -2553.0678 -2632.9241 512.77374 23.255322 25.281111
+ 5500 54 -2552.7082 -2634.3549 513.6816 23.776717 25.321786
+ 5600 55 -2552.3171 -2634.1375 514.44071 23.827315 25.355796
+ 5700 56 -2551.9607 -2631.5049 515.35773 23.164428 25.39688
+ 5800 58 -2551.496 -2633.1155 516.19921 23.768789 25.43458
+ 5900 58 -2551.2035 -2632.1116 517.07471 23.561628 25.473805
+ 6000 60 -2550.7722 -2637.2148 517.87274 25.173338 25.509558
+ 6100 61 -2550.3729 -2635.223 518.677 24.709601 25.545591
+ 6200 62 -2550.0239 -2633.7077 519.50465 24.369948 25.582672
+ 6300 62 -2549.7022 -2634.9153 520.32051 24.815296 25.619224
+ 6400 63 -2549.2302 -2630.2767 521.18099 23.601923 25.657775
+ 6500 64 -2548.7701 -2632.1853 521.991 24.291732 25.694065
+ 6600 65 -2548.3382 -2629.8213 522.69988 23.729068 25.725825
+ 6700 66 -2547.9544 -2634.3457 523.47285 25.158407 25.760456
+ 6800 67 -2547.6099 -2632.3242 524.24129 24.670057 25.794884
+ 6900 68 -2547.3857 -2630.1042 524.9806 24.088828 25.828006
+ 7000 69 -2547.1211 -2631.9693 525.7776 24.70903 25.863714
+ 7100 69 -2546.7539 -2631.6181 526.45984 24.713697 25.89428
+ 7200 70 -2546.4777 -2629.7492 527.21059 24.249884 25.927915
+ 7300 71 -2546.2406 -2629.7818 528.01912 24.32843 25.964139
+ 7400 72 -2545.9694 -2632.4927 528.64586 25.196846 25.992218
+ 7500 73 -2545.8619 -2630.0613 529.38653 24.520088 26.025402
+ 7600 74 -2545.7138 -2632.8388 530.16874 25.372085 26.060447
+ 7700 75 -2545.4529 -2628.921 530.86231 24.307131 26.09152
+ 7800 77 -2545.166 -2629.3814 531.58154 24.524736 26.123743
+ 7900 78 -2544.8001 -2625.4882 532.26268 23.497557 26.15426
+ 8000 79 -2544.4118 -2628.3746 532.9236 24.451192 26.183871
+ 8100 80 -2544.1166 -2629.2914 533.60356 24.804137 26.214334
+ 8200 81 -2543.7942 -2627.1091 534.28788 24.262513 26.244994
+ 8300 82 -2543.4804 -2630.0029 534.94382 25.196642 26.274381
+ 8400 83 -2543.104 -2632.0263 535.55146 25.895456 26.301605
+ 8500 84 -2542.7117 -2627.3589 536.21003 24.650511 26.33111
+ 8600 84 -2542.3628 -2627.7464 536.92095 24.86496 26.362961
+ 8700 85 -2542.0845 -2628.3592 537.58922 25.124445 26.392901
+ 8800 86 -2541.7327 -2628.2907 538.11331 25.206956 26.416381
+ 8900 87 -2541.5205 -2628.8127 538.78583 25.420763 26.446512
+ 9000 88 -2541.4308 -2628.532 539.48656 25.36513 26.477906
+ 9100 89 -2541.3427 -2624.8856 540.08761 24.328917 26.504834
+ 9200 90 -2541.2405 -2626.8739 540.65481 24.937701 26.530246
+ 9300 91 -2541.1638 -2628.2134 541.35281 25.350118 26.561518
+ 9400 91 -2541.0394 -2629.2501 541.97029 25.688239 26.589183
+ 9500 92 -2540.8064 -2629.0064 542.46763 25.685128 26.611465
+ 9600 93 -2540.6384 -2628.7742 543.13578 25.666436 26.641399
+ 9700 94 -2540.3957 -2628.1981 543.7668 25.56933 26.669671
+ 9800 95 -2540.1324 -2627.8582 544.32985 25.547048 26.694896
+ 9900 97 -2539.8497 -2629.5669 544.90695 26.12696 26.720752
+ 10000 98 -2539.5955 -2628.0303 545.50615 25.753491 26.747597
+Loop time of 97.6112 on 4 procs for 10000 steps with 1440 atoms
-Pair time (%) = 43.2003 (14.9858)
-Neigh time (%) = 21.8684 (7.58594)
-Comm time (%) = 65.1973 (22.6163)
-Outpt time (%) = 0.233757 (0.0810881)
-Other time (%) = 157.776 (54.7309)
+Pair time (%) = 35.997 (36.8779)
+Neigh time (%) = 15.2231 (15.5957)
+Comm time (%) = 8.83447 (9.05068)
+Outpt time (%) = 0.0810515 (0.083035)
+Other time (%) = 37.4755 (38.3927)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104778 ave 104928 max 104669 min
Histogram: 1 1 0 0 0 1 0 0 0 1
FullNghs: 209556 ave 210121 max 208975 min
Histogram: 1 1 0 0 0 0 0 0 0 2
Total # of neighbors = 838224
Ave neighs/atom = 582.1
Neighbor list builds = 1000
Dangerous builds = 0
diff --git a/examples/USER/atc/thermal/bar1d_lumped.screen b/examples/USER/atc/thermal/bar1d_lumped.screen
index b5e588cd7..5dfdfb698 100644
--- a/examples/USER/atc/thermal/bar1d_lumped.screen
+++ b/examples/USER/atc/thermal/bar1d_lumped.screen
@@ -1,294 +1,295 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
# NOTE following 3 lines added for restart
boundary f p p
pair_style lj/cut 13.5
read_data temp.init
Reading data file ...
orthogonal box = (-27.025 -16.215 -16.215) to (27.025 16.215 16.215)
2 by 1 by 2 MPI processor grid
1440 atoms
1440 velocities
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region simRegion block -12 12 -3 3 -3 3
# create atoms, NOTE commented out for restart
#region mdRegion block -5 5 -3 3 -3 3
#boundary f p p
#create_box 1 mdRegion
#create_atoms 1 region mdRegion
#mass 1 39.95
# specify interal/ghost atoms
region mdInternal block -4 4 -3 3 -3 3
group internal region mdInternal
1152 atoms in group internal
group ghost subtract all internal
288 atoms in group ghost
# velocities have Vcm = 0, NOTE next three lines commented out for restart
#velocity internal create 40. 87287 mom yes loop geom
#pair_style lj/cut 13.5
#pair_coeff 1 1 .238 3.405 13.5
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# ID group atc PhysicsType ParameterFile
fix AtC internal atc thermal Ar_thermal.mat
ATC: constructing thermal coupling with parameter file Ar_thermal.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 3 materials defined from Ar_thermal.mat
fix_modify AtC boundary ghost
# numerical parameters
fix_modify AtC time_integration fractional_step
fix_modify AtC internal_quadrature off
# ID part keywords nx ny nz region
fix_modify AtC mesh create 12 1 1 simRegion f p p
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
fix_modify AtC mesh create_faceset ibndy box -4.0 4.0 -INF INF -INF INF in
ATC: created faceset ibndy with 2 faces
fix_modify AtC mesh create_faceset obndy box -4.0 4.0 -INF INF -INF INF outward
ATC: created faceset obndy with 2 faces
# fix a temperature
fix_modify AtC fix temperature all 20.
#fix_modify AtC fix temperature all linear 0 0 0 -0.154 0 0 30.
#fix_modify AtC fix temperature all quadratic 0 0 0 -0.154 0 0 30. 0.01 0.0 0.0 0 0 0
# turn on thermostat
fix_modify AtC control thermal rescale 10
# output
thermo 100
variable xdof equal 3*count(ghost)
compute_modify thermo_temp extra ${xdof}
compute_modify thermo_temp extra 864
thermo_style custom step cpu etotal pe f_AtC[1] temp f_AtC[2]
thermo_modify format 1 %6i format 2 %7.2g
# equilibrate MD field
#fix_modify AtC output bar1d_lumped_initFE 1 text
timestep 5
run 400
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 91.5825 Mbytes
+Memory usage per processor = 50.9732 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.6428 -2710.8793 412.06718 39.965279 20
- 100 5.4 -2537.6764 -2606.3542 412.06718 20 20
- 200 13 -2584.8754 -2653.5532 412.06718 20 20
- 300 17 -2575.3126 -2643.9904 412.06718 20 20
- 400 18 -2573.4199 -2642.0977 412.06718 20 20
-Loop time of 18.3995 on 4 procs for 400 steps with 1440 atoms
+ 100 1.1 -2537.6764 -2606.3542 412.06718 20 20
+ 200 1.9 -2584.8754 -2653.5532 412.06718 20 20
+ 300 2.6 -2575.3126 -2643.9904 412.06718 20 20
+ 400 3.3 -2573.4199 -2642.0977 412.06718 20 20
+Loop time of 3.29921 on 4 procs for 400 steps with 1440 atoms
-Pair time (%) = 2.1463 (11.665)
-Neigh time (%) = 1.32344 (7.19278)
-Comm time (%) = 9.14841 (49.721)
-Outpt time (%) = 0.00160271 (0.00871062)
-Other time (%) = 5.77975 (31.4125)
+Pair time (%) = 1.44793 (43.887)
+Neigh time (%) = 0.592822 (17.9686)
+Comm time (%) = 0.52355 (15.8689)
+Outpt time (%) = 0.00160086 (0.0485226)
+Other time (%) = 0.733312 (22.2269)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104865 ave 104966 max 104653 min
Histogram: 1 0 0 0 0 0 0 1 0 2
FullNghs: 209730 ave 209902 max 209521 min
Histogram: 1 0 0 0 1 0 0 1 0 1
Total # of neighbors = 838918
Ave neighs/atom = 582.582
Neighbor list builds = 40
Dangerous builds = 0
#run 100
# change thermostat to hoover
fix_modify AtC unfix temperature all
#fix_modify AtC thermal control flux interpolate
fix_modify AtC control thermal flux faceset obndy
fix_modify AtC control localized_lambda on
fix_modify AtC filter type exponential
fix_modify AtC filter scale 10000.0
fix_modify AtC filter on
# add nodesets
# ID mesh create_nodeset tag xmin xmax ymin ymax zmin zmax
fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC fix temperature lbc 80.
fix_modify AtC fix temperature rbc 80.
# initialize
thermo 10
run 100
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 96.3294 Mbytes
+Memory usage per processor = 55.72 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
400 0 -2573.4199 -2642.0977 412.06718 20 20
- 410 0.089 -2573.3989 -2643.8455 517.30661 20.515089 29.330348
- 420 0.17 -2573.4223 -2646.1083 519.64166 21.16724 29.434964
- 430 0.25 -2573.4498 -2647.2051 521.96898 21.478626 29.539233
- 440 0.34 -2573.4569 -2646.2686 524.27182 21.203839 29.642406
- 450 0.5 -2573.4737 -2644.3159 526.53414 20.63027 29.743762
- 460 2.9 -2573.4879 -2643.0036 528.75499 20.243982 29.843261
- 470 3.1 -2573.4922 -2642.6172 530.94429 20.130226 29.941347
- 480 3.3 -2573.5022 -2642.5663 533.10876 20.112489 30.03832
- 490 3.4 -2573.5141 -2642.9253 535.25201 20.213567 30.134343
- 500 3.6 -2573.5321 -2643.6709 537.37935 20.425453 30.229652
-Loop time of 3.6034 on 4 procs for 100 steps with 1440 atoms
+ 410 0.084 -2573.3989 -2643.8455 517.30661 20.515089 29.330348
+ 420 0.16 -2573.4223 -2646.1083 519.64166 21.16724 29.434964
+ 430 0.24 -2573.4498 -2647.2051 521.96898 21.478626 29.539233
+ 440 0.32 -2573.4569 -2646.2686 524.27182 21.203839 29.642406
+ 450 0.4 -2573.4737 -2644.3159 526.53414 20.63027 29.743762
+ 460 0.48 -2573.4879 -2643.0036 528.75499 20.243982 29.843261
+ 470 0.56 -2573.4922 -2642.6172 530.94429 20.130226 29.941347
+ 480 0.63 -2573.5022 -2642.5663 533.10876 20.112489 30.03832
+ 490 0.71 -2573.5141 -2642.9253 535.25201 20.213567 30.134343
+ 500 0.79 -2573.5321 -2643.6709 537.37935 20.425453 30.229652
+Loop time of 0.790905 on 4 procs for 100 steps with 1440 atoms
-Pair time (%) = 0.532621 (14.7811)
-Neigh time (%) = 0.227121 (6.30295)
-Comm time (%) = 1.37573 (38.1786)
-Outpt time (%) = 0.00399309 (0.110814)
-Other time (%) = 1.46394 (40.6266)
+Pair time (%) = 0.349393 (44.1764)
+Neigh time (%) = 0.144151 (18.2261)
+Comm time (%) = 0.0488155 (6.17212)
+Outpt time (%) = 0.00401592 (0.507763)
+Other time (%) = 0.244529 (30.9177)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104761 ave 105083 max 104555 min
Histogram: 2 0 0 0 1 0 0 0 0 1
FullNghs: 209522 ave 209825 max 209318 min
Histogram: 1 0 1 1 0 0 0 0 0 1
Total # of neighbors = 838090
Ave neighs/atom = 582.007
Neighbor list builds = 10
Dangerous builds = 0
# relax
fix_modify AtC unfix temperature all
# output
fix_modify AtC output bar1d_lumpedFE 100 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
# run with FE
reset_timestep 0
thermo 100
run 10000
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
-Memory usage per processor = 96.3294 Mbytes
+Memory usage per processor = 55.72 Mbytes
Step CPU TotEng PotEng AtC[1] Temp AtC[2]
0 0 -2573.5321 -2643.6709 537.37935 20.425453 30.229652
- 100 8.4 -2573.4714 -2644.6628 537.59712 20.731964 29.437439
- 200 18 -2573.5166 -2641.7664 537.63735 19.875333 28.850231
- 300 19 -2573.3454 -2646.2939 537.8469 21.243688 28.422511
- 400 30 -2573.0942 -2641.1809 537.90867 19.827861 28.095231
- 500 31 -2572.3083 -2643.707 538.005 20.792348 27.845793
- 600 38 -2571.6518 -2640.8182 538.12895 20.142273 27.652618
- 700 42 -2570.5731 -2641.7027 538.24696 20.713971 27.499382
- 800 43 -2569.3231 -2640.7761 538.33555 20.808172 27.374616
- 900 44 -2568.1073 -2641.2144 538.42259 21.289869 27.27217
- 1000 48 -2566.8774 -2641.7627 538.50252 21.807716 27.186491
- 1100 52 -2565.6817 -2639.3847 538.60769 21.463413 27.11518
- 1200 54 -2564.5291 -2639.0021 538.6921 21.687625 27.053351
- 1300 57 -2563.046 -2636.8175 538.75291 21.483334 26.998775
- 1400 66 -2561.7374 -2637.9846 538.75622 22.204304 26.948354
- 1500 67 -2560.5922 -2638.0152 538.92825 22.546707 26.911016
- 1600 68 -2559.5712 -2634.9079 538.98874 21.939138 26.873272
- 1700 69 -2558.4498 -2637.4043 539.01552 22.992706 26.83788
- 1800 71 -2557.3572 -2637.6783 539.06504 23.390689 26.806789
- 1900 71 -2556.3318 -2635.4587 539.21528 23.042919 26.783029
- 2000 72 -2555.2491 -2634.8649 539.3077 23.185278 26.759119
- 2100 74 -2554.0813 -2632.5651 539.34324 22.855611 26.734792
- 2200 75 -2552.9667 -2635.7107 539.36679 24.096274 26.711802
- 2300 76 -2552.2327 -2633.1401 539.45717 23.561421 26.693468
- 2400 76 -2551.6044 -2632.5536 539.53752 23.573606 26.676165
- 2500 77 -2551.1734 -2631.6954 539.62757 23.449169 26.660623
- 2600 78 -2550.381 -2634.669 539.66971 24.545902 26.644129
- 2700 79 -2549.624 -2633.4682 539.75068 24.41666 26.630457
- 2800 80 -2548.8206 -2630.6519 539.80156 23.830481 26.616417
- 2900 81 -2547.8861 -2632.5638 539.88361 24.659393 26.604667
- 3000 83 -2547.084 -2627.427 539.9225 23.397054 26.5918
- 3100 84 -2546.394 -2629.4378 539.94648 24.183576 26.579016
- 3200 86 -2545.7683 -2629.3918 540.06149 24.352372 26.571
- 3300 87 -2545.2615 -2631.3813 540.12465 25.079335 26.5613
- 3400 88 -2544.6024 -2630.0895 540.12814 24.895105 26.549518
- 3500 88 -2543.9337 -2628.4156 540.13502 24.602369 26.53844
- 3600 89 -2543.3099 -2628.0721 540.25751 24.684014 26.533053
- 3700 90 -2542.6958 -2628.8619 540.25488 25.092829 26.522541
- 3800 91 -2542.218 -2630.3008 540.2971 25.651004 26.514488
- 3900 92 -2542.2329 -2626.6554 540.40242 24.585058 26.509685
- 4000 93 -2542.345 -2628.0992 540.4246 24.972878 26.501556
- 4100 93 -2542.444 -2628.9863 540.4438 25.202383 26.493668
- 4200 94 -2542.4625 -2630.9619 540.43077 25.772324 26.484689
- 4300 95 -2542.4932 -2628.6896 540.46659 25.101648 26.47823
- 4400 96 -2542.4649 -2626.3615 540.52486 24.431935 26.473089
- 4500 97 -2542.3848 -2629.9464 540.56942 25.49921 26.467627
- 4600 98 -2542.2156 -2630.1917 540.57345 25.619915 26.460625
- 4700 99 -2542.0968 -2628.4423 540.65789 25.145095 26.457485
- 4800 1e+02 -2541.8766 -2630.6991 540.69403 25.866389 26.452428
- 4900 1e+02 -2541.7652 -2628.337 540.65021 25.210979 26.444021
- 5000 1e+02 -2541.667 -2627.5891 540.75066 25.021773 26.442299
- 5100 1e+02 -2541.4455 -2626.9354 540.74526 24.895894 26.436045
- 5200 1.1e+02 -2541.3524 -2626.9293 540.80011 24.92126 26.432691
- 5300 1.1e+02 -2541.4921 -2627.9353 540.85481 25.173531 26.429523
- 5400 1.2e+02 -2541.4091 -2627.4363 540.77756 25.052378 26.420627
- 5500 1.2e+02 -2541.2364 -2627.0322 540.8409 24.985021 26.418205
- 5600 1.2e+02 -2541.0146 -2626.1809 540.84749 24.801661 26.41341
- 5700 1.2e+02 -2540.7658 -2626.3892 540.83392 24.934789 26.407875
- 5800 1.2e+02 -2540.5557 -2625.5238 540.86784 24.74395 26.404623
- 5900 1.2e+02 -2540.2613 -2628.8094 540.88157 25.7865 26.400618
- 6000 1.2e+02 -2540.023 -2628.3564 540.89421 25.723987 26.39671
- 6100 1.2e+02 -2539.7369 -2626.2678 540.8886 25.199056 26.392126
- 6200 1.2e+02 -2539.4247 -2626.9787 540.88107 25.496996 26.387593
- 6300 1.2e+02 -2539.2795 -2628.1038 540.94239 25.866954 26.386278
- 6400 1.3e+02 -2539.2702 -2625.3721 540.99133 25.07412 26.384539
- 6500 1.3e+02 -2539.0339 -2627.6649 541.01851 25.810661 26.381951
- 6600 1.3e+02 -2538.7604 -2630.2595 540.93819 26.645879 26.37467
- 6700 1.3e+02 -2538.5609 -2627.2764 541.00702 25.835243 26.374189
- 6800 1.3e+02 -2538.4781 -2628.4908 541.04647 26.213023 26.372508
- 6900 1.3e+02 -2538.3363 -2626.3948 541.0421 25.643922 26.368975
- 7000 1.3e+02 -2538.1096 -2624.3062 541.07424 25.101732 26.367185
- 7100 1.3e+02 -2538.1297 -2625.2825 541.13737 25.380157 26.366889
- 7200 1.3e+02 -2537.9558 -2625.6952 541.11622 25.550998 26.362917
- 7300 1.3e+02 -2537.7777 -2623.8467 541.12479 25.064554 26.360375
- 7400 1.4e+02 -2537.691 -2626.362 541.12857 25.822305 26.357713
- 7500 1.4e+02 -2537.6017 -2627.6258 541.11665 26.216328 26.354439
- 7600 1.4e+02 -2537.5881 -2626.5336 541.09525 25.902252 26.350828
- 7700 1.4e+02 -2537.4503 -2626.5011 541.10444 25.932897 26.348674
- 7800 1.4e+02 -2537.4247 -2625.6606 541.16841 25.695575 26.349056
- 7900 1.5e+02 -2537.221 -2626.6494 541.16553 26.042851 26.346524
- 8000 1.5e+02 -2536.9786 -2624.3886 541.16948 25.455068 26.344375
- 8100 1.5e+02 -2537.0091 -2626.1267 541.19675 25.952348 26.343346
- 8200 1.6e+02 -2536.8966 -2626.9415 541.24047 26.222385 26.343126
- 8300 1.6e+02 -2536.7301 -2627.422 541.17563 26.4108 26.338112
- 8400 1.7e+02 -2536.5639 -2626.9772 541.22236 26.329686 26.338165
- 8500 1.7e+02 -2536.2761 -2623.6142 541.20754 25.434125 26.335526
- 8600 1.8e+02 -2536.1413 -2624.8573 541.2923 25.835401 26.337411
- 8700 1.8e+02 -2535.8015 -2627.0616 541.217 26.576282 26.332188
- 8800 1.8e+02 -2535.645 -2625.4677 541.22666 26.157671 26.33083
- 8900 1.9e+02 -2535.5467 -2622.6362 541.21146 25.361737 26.328417
- 9000 1.9e+02 -2535.5706 -2622.2805 541.23307 25.251184 26.32771
- 9100 1.9e+02 -2535.6698 -2627.18 541.28442 26.649119 26.328389
- 9200 2e+02 -2535.6724 -2623.9823 541.29366 25.717136 26.327233
- 9300 2e+02 -2535.4543 -2624.9706 541.21196 26.06848 26.322051
- 9400 2.1e+02 -2535.4415 -2625.439 541.31268 26.20861 26.325088
- 9500 2.1e+02 -2535.4949 -2622.6035 541.29414 25.367306 26.322824
- 9600 2.1e+02 -2535.6083 -2623.7154 541.32785 25.658066 26.322941
- 9700 2.2e+02 -2535.569 -2624.6231 541.28832 25.933859 26.319815
- 9800 2.2e+02 -2535.4348 -2624.787 541.27797 26.020648 26.318031
- 9900 2.2e+02 -2535.3781 -2626.4373 541.30541 26.517775 26.317973
- 10000 2.3e+02 -2535.4286 -2624.7326 541.30648 26.006646 26.316764
-Loop time of 232.78 on 4 procs for 10000 steps with 1440 atoms
+ 100 0.79 -2573.4714 -2644.6628 537.59712 20.731964 29.437439
+ 200 1.6 -2573.5166 -2641.7664 537.63735 19.875333 28.850231
+ 300 2.4 -2573.3454 -2646.2939 537.8469 21.243688 28.422511
+ 400 3.1 -2573.0942 -2641.1809 537.90867 19.827861 28.095231
+ 500 3.9 -2572.3083 -2643.707 538.005 20.792348 27.845793
+ 600 4.7 -2571.6518 -2640.8182 538.12895 20.142273 27.652618
+ 700 5.5 -2570.5731 -2641.7027 538.24696 20.713971 27.499382
+ 800 6.3 -2569.3231 -2640.7761 538.33555 20.808172 27.374616
+ 900 7.1 -2568.1073 -2641.2144 538.42259 21.289869 27.27217
+ 1000 7.9 -2566.8774 -2641.7627 538.50252 21.807716 27.186491
+ 1100 9.8 -2565.6817 -2639.3847 538.60769 21.463413 27.11518
+ 1200 11 -2564.5291 -2639.0021 538.6921 21.687625 27.053351
+ 1300 11 -2563.046 -2636.8175 538.75291 21.483334 26.998775
+ 1400 13 -2561.7374 -2637.9846 538.75622 22.204304 26.948354
+ 1500 13 -2560.5922 -2638.0152 538.92825 22.546707 26.911016
+ 1600 14 -2559.5712 -2634.9079 538.98874 21.939138 26.873272
+ 1700 15 -2558.4498 -2637.4043 539.01552 22.992706 26.83788
+ 1800 16 -2557.3572 -2637.6783 539.06504 23.390689 26.806789
+ 1900 17 -2556.3318 -2635.4587 539.21528 23.042919 26.783029
+ 2000 17 -2555.2491 -2634.8649 539.3077 23.185278 26.759119
+ 2100 18 -2554.0813 -2632.5651 539.34324 22.855611 26.734792
+ 2200 19 -2552.9667 -2635.7107 539.36679 24.096274 26.711802
+ 2300 20 -2552.2327 -2633.1401 539.45717 23.561421 26.693468
+ 2400 20 -2551.6044 -2632.5536 539.53752 23.573606 26.676165
+ 2500 21 -2551.1734 -2631.6954 539.62757 23.449169 26.660623
+ 2600 22 -2550.381 -2634.669 539.66971 24.545902 26.644129
+ 2700 23 -2549.624 -2633.4682 539.75068 24.41666 26.630457
+ 2800 24 -2548.8206 -2630.6519 539.80156 23.830481 26.616417
+ 2900 25 -2547.8861 -2632.5638 539.88361 24.659393 26.604667
+ 3000 26 -2547.084 -2627.427 539.9225 23.397054 26.5918
+ 3100 27 -2546.394 -2629.4378 539.94648 24.183576 26.579016
+ 3200 27 -2545.7683 -2629.3918 540.06149 24.352372 26.571
+ 3300 29 -2545.2615 -2631.3813 540.12465 25.079335 26.5613
+ 3400 30 -2544.6024 -2630.0895 540.12814 24.895105 26.549518
+ 3500 31 -2543.9337 -2628.4156 540.13502 24.602369 26.53844
+ 3600 32 -2543.3099 -2628.0721 540.25751 24.684014 26.533053
+ 3700 33 -2542.6958 -2628.8619 540.25488 25.092829 26.522541
+ 3800 34 -2542.218 -2630.3008 540.2971 25.651004 26.514488
+ 3900 35 -2542.2329 -2626.6554 540.40242 24.585058 26.509685
+ 4000 36 -2542.345 -2628.0992 540.4246 24.972878 26.501556
+ 4100 36 -2542.444 -2628.9863 540.4438 25.202383 26.493668
+ 4200 37 -2542.4625 -2630.9619 540.43077 25.772324 26.484689
+ 4300 38 -2542.4932 -2628.6896 540.46659 25.101648 26.47823
+ 4400 39 -2542.4649 -2626.3615 540.52486 24.431935 26.473089
+ 4500 40 -2542.3848 -2629.9464 540.56942 25.49921 26.467627
+ 4600 40 -2542.2156 -2630.1917 540.57345 25.619915 26.460625
+ 4700 41 -2542.0968 -2628.4423 540.65789 25.145095 26.457485
+ 4800 42 -2541.8766 -2630.6991 540.69403 25.866389 26.452428
+ 4900 43 -2541.7652 -2628.337 540.65021 25.210979 26.444021
+ 5000 43 -2541.667 -2627.5891 540.75066 25.021773 26.442299
+ 5100 44 -2541.4455 -2626.9354 540.74526 24.895894 26.436045
+ 5200 45 -2541.3524 -2626.9293 540.80011 24.92126 26.432691
+ 5300 46 -2541.4921 -2627.9353 540.85481 25.173531 26.429523
+ 5400 47 -2541.4091 -2627.4363 540.77756 25.052378 26.420627
+ 5500 47 -2541.2364 -2627.0322 540.8409 24.985021 26.418205
+ 5600 48 -2541.0146 -2626.1809 540.84749 24.801661 26.41341
+ 5700 49 -2540.7658 -2626.3892 540.83392 24.934789 26.407875
+ 5800 50 -2540.5557 -2625.5238 540.86784 24.74395 26.404623
+ 5900 51 -2540.2613 -2628.8094 540.88157 25.7865 26.400618
+ 6000 52 -2540.023 -2628.3564 540.89421 25.723987 26.39671
+ 6100 54 -2539.7369 -2626.2678 540.8886 25.199056 26.392126
+ 6200 54 -2539.4247 -2626.9787 540.88107 25.496996 26.387593
+ 6300 56 -2539.2795 -2628.1038 540.94239 25.866954 26.386278
+ 6400 57 -2539.2702 -2625.3721 540.99133 25.07412 26.384539
+ 6500 57 -2539.0339 -2627.6649 541.01851 25.810661 26.381951
+ 6600 58 -2538.7604 -2630.2595 540.93819 26.645879 26.37467
+ 6700 59 -2538.5609 -2627.2764 541.00702 25.835243 26.374189
+ 6800 60 -2538.4781 -2628.4908 541.04647 26.213023 26.372508
+ 6900 60 -2538.3363 -2626.3948 541.0421 25.643922 26.368975
+ 7000 61 -2538.1096 -2624.3062 541.07424 25.101732 26.367185
+ 7100 62 -2538.1297 -2625.2825 541.13737 25.380157 26.366889
+ 7200 63 -2537.9558 -2625.6952 541.11622 25.550998 26.362917
+ 7300 64 -2537.7777 -2623.8467 541.12479 25.064554 26.360375
+ 7400 64 -2537.691 -2626.362 541.12857 25.822305 26.357713
+ 7500 65 -2537.6017 -2627.6258 541.11665 26.216328 26.354439
+ 7600 66 -2537.5881 -2626.5336 541.09525 25.902252 26.350828
+ 7700 67 -2537.4503 -2626.5011 541.10444 25.932897 26.348674
+ 7800 68 -2537.4247 -2625.6606 541.16841 25.695575 26.349056
+ 7900 68 -2537.221 -2626.6494 541.16553 26.042851 26.346524
+ 8000 69 -2536.9786 -2624.3886 541.16948 25.455068 26.344375
+ 8100 70 -2537.0091 -2626.1267 541.19675 25.952348 26.343346
+ 8200 71 -2536.8966 -2626.9415 541.24047 26.222385 26.343126
+ 8300 72 -2536.7301 -2627.422 541.17563 26.4108 26.338112
+ 8400 73 -2536.5639 -2626.9772 541.22236 26.329686 26.338165
+ 8500 74 -2536.2761 -2623.6142 541.20754 25.434125 26.335526
+ 8600 75 -2536.1413 -2624.8573 541.2923 25.835401 26.337411
+ 8700 76 -2535.8015 -2627.0616 541.217 26.576282 26.332188
+ 8800 77 -2535.645 -2625.4677 541.22666 26.157671 26.33083
+ 8900 78 -2535.5467 -2622.6362 541.21146 25.361737 26.328417
+ 9000 79 -2535.5706 -2622.2805 541.23307 25.251184 26.32771
+ 9100 79 -2535.6698 -2627.18 541.28442 26.649119 26.328389
+ 9200 80 -2535.6724 -2623.9823 541.29366 25.717136 26.327233
+ 9300 81 -2535.4543 -2624.9706 541.21196 26.06848 26.322051
+ 9400 82 -2535.4415 -2625.439 541.31268 26.20861 26.325088
+ 9500 83 -2535.4949 -2622.6035 541.29414 25.367306 26.322824
+ 9600 84 -2535.6083 -2623.7154 541.32785 25.658066 26.322941
+ 9700 85 -2535.569 -2624.6231 541.28832 25.933859 26.319815
+ 9800 86 -2535.4348 -2624.787 541.27797 26.020648 26.318031
+ 9900 87 -2535.3781 -2626.4373 541.30541 26.517775 26.317973
+ 10000 87 -2535.4286 -2624.7326 541.30648 26.006646 26.316764
+Loop time of 87.3881 on 4 procs for 10000 steps with 1440 atoms
-Pair time (%) = 43.634 (18.7448)
-Neigh time (%) = 20.911 (8.98318)
-Comm time (%) = 68.5468 (29.447)
-Outpt time (%) = 0.2765 (0.118782)
-Other time (%) = 99.4116 (42.7063)
+Pair time (%) = 35.8411 (41.0137)
+Neigh time (%) = 15.0591 (17.2324)
+Comm time (%) = 8.24589 (9.43594)
+Outpt time (%) = 0.0896827 (0.102626)
+Other time (%) = 28.1524 (32.2153)
Nlocal: 360 ave 360 max 360 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 4060 ave 4060 max 4060 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 104746 ave 104843 max 104627 min
Histogram: 1 0 0 0 0 1 1 0 0 1
FullNghs: 209492 ave 209713 max 209341 min
Histogram: 1 1 0 0 1 0 0 0 0 1
Total # of neighbors = 837970
Ave neighs/atom = 581.924
Neighbor list builds = 1000
Dangerous builds = 0
diff --git a/examples/USER/atc/thermal/no_atoms.screen b/examples/USER/atc/thermal/no_atoms.screen
index f33607204..ca18c745e 100644
--- a/examples/USER/atc/thermal/no_atoms.screen
+++ b/examples/USER/atc/thermal/no_atoms.screen
@@ -1,350 +1,351 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region feRegion block -10 10 -1 1 -1 1
boundary f p p
create_box 1 feRegion
Created orthogonal box = (-54.05 -5.405 -5.405) to (54.05 5.405 5.405)
4 by 1 by 1 MPI processor grid
mass 1 39.95 # need to keep this
atom_modify sort 0 1
region dummyRegion block -100 -99 -1 1 -1 1
group dummy region dummyRegion
0 atoms in group dummy
# ID group atc PhysicsType ParameterFile
fix AtC dummy atc thermal Ar_thermal.mat
ATC: constructing thermal coupling with parameter file Ar_thermal.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 3 materials defined from Ar_thermal.mat
timestep 5.0
# ID part keywords nx ny nz region
fix_modify AtC mesh create 10 1 1 feRegion f p p
ATC: created uniform mesh with 44 nodes, 11 unique nodes, and 10 elements
# fix end temperatures and an internal source
fix_modify AtC initial temperature all 20.0
fix_modify AtC source temperature all 0.0000000000632
fix_modify AtC mesh create_nodeset lbc -10.1 -9.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 9.9 10.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC fix temperature lbc 20.
fix_modify AtC fix temperature rbc 20.
fix_modify AtC mesh create_elementset middle -4.1 4.1 -INF INF -INF INF
ATC: created elementset middle with 4 elements
fix_modify AtC material middle Ar2
thermo_style custom step cpu f_AtC[1] f_AtC[2]
fix_modify AtC output no_atomsFE 1000 text binary
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
thermo 100
run 10000
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
Memory usage per processor = 0.432198 Mbytes
Step CPU AtC[1] AtC[2]
0 0 38.154369 20
- 100 0.198596 38.998362 20.402191
- 200 0.33823085 39.827109 20.797116
- 300 0.47814584 40.638112 21.183586
- 400 0.674582 41.432837 21.562299
- 500 0.87166095 42.212497 21.933833
- 600 1.0095859 42.978107 22.298671
- 700 1.1372099 43.730523 22.657222
- 800 1.2767439 44.470481 23.009836
- 900 1.3687179 45.198615 23.356816
- 1000 1.4402959 45.915477 23.698425
- 1100 1.5109999 46.621553 24.034893
- 1200 1.5813069 47.317274 24.366427
- 1300 1.651567 48.003024 24.69321
- 1400 1.7221079 48.679146 25.015404
- 1500 1.7923758 49.345952 25.333159
- 1600 1.8629169 50.003724 25.64661
- 1700 1.933373 50.652719 25.955877
- 1800 2.0037959 51.293174 26.261075
- 1900 2.0746109 51.925305 26.562306
- 2000 2.145087 52.549313 26.859667
- 2100 2.215744 53.165384 27.153245
- 2200 2.2863379 53.773691 27.443124
- 2300 2.3566098 54.374397 27.72938
- 2400 2.4366989 54.967653 28.012086
- 2500 2.5044408 55.553601 28.29131
- 2600 2.5741239 56.132378 28.567116
- 2700 2.6417909 56.70411 28.839565
- 2800 2.7091548 57.268918 29.108715
- 2900 2.7765369 57.826919 29.37462
- 3000 2.8588939 58.37822 29.637334
- 3100 2.9269259 58.922929 29.896906
- 3200 2.9947858 59.461146 30.153384
- 3300 3.0632079 59.992968 30.406815
- 3400 3.131222 60.518488 30.657243
- 3500 3.199235 61.037798 30.90471
- 3600 3.2675898 61.550983 31.14926
- 3700 3.3352199 62.058128 31.390932
- 3800 3.4026849 62.559317 31.629765
- 3900 3.470047 63.054627 31.865797
- 4000 3.5383139 63.544138 32.099064
- 4100 3.606086 64.027924 32.329605
- 4200 3.6737199 64.50606 32.557452
- 4300 3.741308 64.978617 32.782641
- 4400 3.8089309 65.445666 33.005206
- 4500 3.8761919 65.907277 33.225178
- 4600 3.9435189 66.363516 33.442591
- 4700 4.011107 66.814451 33.657477
- 4800 4.0784218 67.260145 33.869865
- 4900 4.1459188 67.700665 34.079787
- 5000 4.2139089 68.136071 34.287272
- 5100 4.2817738 68.566425 34.492351
- 5200 4.3494208 68.99179 34.695051
- 5300 4.4170818 69.412224 34.895401
- 5400 4.4845729 69.827786 35.09343
- 5500 4.612407 70.238534 35.289165
- 5600 4.7415109 70.644525 35.482634
- 5700 4.8686008 71.045816 35.673862
- 5800 5.005605 71.442462 35.862877
- 5900 5.137594 71.834517 36.049704
- 6000 5.275028 72.222037 36.23437
- 6100 5.4125428 72.605073 36.4169
- 6200 5.5497239 72.983679 36.597318
- 6300 5.6767418 73.357906 36.77565
- 6400 5.803622 73.727806 36.951919
- 6500 5.8905358 74.093429 37.12615
- 6600 6.0176079 74.454825 37.298367
- 6700 6.1476219 74.812042 37.468594
- 6800 6.2646389 75.165131 37.636852
- 6900 6.3316889 75.514139 37.803166
- 7000 6.3994029 75.859112 37.967557
- 7100 6.4671588 76.200099 38.130048
- 7200 6.5343359 76.537145 38.290662
- 7300 6.6116469 76.870297 38.44942
- 7400 6.6786668 77.199598 38.606343
- 7500 6.7457249 77.525095 38.761453
- 7600 6.8126168 77.84683 38.91477
- 7700 6.8796759 78.164848 39.066317
- 7800 6.9466639 78.479192 39.216112
- 7900 7.0136268 78.789904 39.364176
- 8000 7.0817449 79.097027 39.51053
- 8100 7.1496539 79.400601 39.655193
- 8200 7.227 79.700668 39.798185
- 8300 7.294349 79.997268 39.939525
- 8400 7.3613229 80.290442 40.079232
- 8500 7.4285059 80.580229 40.217325
- 8600 7.5257459 80.866668 40.353823
- 8700 7.59304 81.149798 40.488744
- 8800 7.6604259 81.429658 40.622106
- 8900 7.727886 81.706285 40.753928
- 9000 7.7962129 81.979716 40.884227
- 9100 7.863817 82.249989 41.013021
- 9200 7.9611189 82.517139 41.140327
- 9300 8.04863 82.781204 41.266162
- 9400 8.116328 83.042218 41.390544
- 9500 8.2232919 83.300217 41.51349
- 9600 8.3302848 83.555236 41.635014
- 9700 8.4073069 83.807309 41.755136
- 9800 8.5042849 84.056471 41.873869
- 9900 8.6116118 84.302754 41.991231
- 10000 8.6993539 84.546192 42.107238
-Loop time of 8.69972 on 4 procs for 10000 steps with 0 atoms
+ 100 0.39788795 38.998362 20.402191
+ 200 0.49715495 39.827109 20.797116
+ 300 0.63614702 40.638112 21.183586
+ 400 0.73500299 41.432837 21.562299
+ 500 0.81400895 42.212497 21.933833
+ 600 0.88282895 42.978107 22.298671
+ 700 0.96159506 43.730523 22.657222
+ 800 1.0302451 44.470481 23.009836
+ 900 1.098789 45.198615 23.356816
+ 1000 1.168026 45.915477 23.698425
+ 1100 1.2364819 46.621553 24.034893
+ 1200 1.3044651 47.317274 24.366427
+ 1300 1.372417 48.003024 24.69321
+ 1400 1.441026 48.679146 25.015404
+ 1500 1.509335 49.345952 25.333159
+ 1600 1.5777409 50.003724 25.64661
+ 1700 1.646153 50.652719 25.955877
+ 1800 1.7149341 51.293174 26.261075
+ 1900 1.7831299 51.925305 26.562306
+ 2000 1.852035 52.549313 26.859667
+ 2100 1.920368 53.165384 27.153245
+ 2200 1.9887819 53.773691 27.443124
+ 2300 2.0572631 54.374397 27.72938
+ 2400 2.125757 54.967653 28.012086
+ 2500 2.194442 55.553601 28.29131
+ 2600 2.3308191 56.132378 28.567116
+ 2700 2.4721711 56.70411 28.839565
+ 2800 2.6192341 57.268918 29.108715
+ 2900 2.9212461 57.826919 29.37462
+ 3000 3.060657 58.37822 29.637334
+ 3100 3.1685159 58.922929 29.896906
+ 3200 3.307039 59.461146 30.153384
+ 3300 3.4198341 59.992968 30.406815
+ 3400 3.4885559 60.518488 30.657243
+ 3500 3.5572281 61.037798 30.90471
+ 3600 3.6255291 61.550983 31.14926
+ 3700 3.6938851 62.058128 31.390932
+ 3800 3.7622211 62.559317 31.629765
+ 3900 3.8303709 63.054627 31.865797
+ 4000 3.899168 63.544138 32.099064
+ 4100 3.9677 64.027924 32.329605
+ 4200 4.036674 64.50606 32.557452
+ 4300 4.10567 64.978617 32.782641
+ 4400 4.174649 65.445666 33.005206
+ 4500 4.2437871 65.907277 33.225178
+ 4600 4.3127871 66.363516 33.442591
+ 4700 4.3814931 66.814451 33.657477
+ 4800 4.450135 67.260145 33.869865
+ 4900 4.5189929 67.700665 34.079787
+ 5000 4.5888259 68.136071 34.287272
+ 5100 4.657429 68.566425 34.492351
+ 5200 4.726038 68.99179 34.695051
+ 5300 4.7942791 69.412224 34.895401
+ 5400 4.8625271 69.827786 35.09343
+ 5500 4.9309821 70.238534 35.289165
+ 5600 4.999454 70.644525 35.482634
+ 5700 5.0681629 71.045816 35.673862
+ 5800 5.1366611 71.442462 35.862877
+ 5900 5.2050209 71.834517 36.049704
+ 6000 5.274147 72.222037 36.23437
+ 6100 5.3424091 72.605073 36.4169
+ 6200 5.4106631 72.983679 36.597318
+ 6300 5.478775 73.357906 36.77565
+ 6400 5.5468211 73.727806 36.951919
+ 6500 5.614938 74.093429 37.12615
+ 6600 5.6830611 74.454825 37.298367
+ 6700 5.751189 74.812042 37.468594
+ 6800 5.8190451 75.165131 37.636852
+ 6900 5.8927989 75.514139 37.803166
+ 7000 5.961446 75.859112 37.967557
+ 7100 6.0310919 76.200099 38.130048
+ 7200 6.09936 76.537145 38.290662
+ 7300 6.167551 76.870297 38.44942
+ 7400 6.2362411 77.199598 38.606343
+ 7500 6.305141 77.525095 38.761453
+ 7600 6.3739901 77.84683 38.91477
+ 7700 6.4428191 78.164848 39.066317
+ 7800 6.511667 78.479192 39.216112
+ 7900 6.5907071 78.789904 39.364176
+ 8000 6.724232 79.097027 39.51053
+ 8100 6.8225391 79.400601 39.655193
+ 8200 6.900687 79.700668 39.798185
+ 8300 6.9988041 79.997268 39.939525
+ 8400 7.0969059 80.290442 40.079232
+ 8500 7.195164 80.580229 40.217325
+ 8600 7.30323 80.866668 40.353823
+ 8700 7.3811481 81.149798 40.488744
+ 8800 7.4793019 81.429658 40.622106
+ 8900 7.5473211 81.706285 40.753928
+ 9000 7.615984 81.979716 40.884227
+ 9100 7.6846321 82.249989 41.013021
+ 9200 7.7531769 82.517139 41.140327
+ 9300 7.821454 82.781204 41.266162
+ 9400 7.889782 83.042218 41.390544
+ 9500 7.958111 83.300217 41.51349
+ 9600 8.0263691 83.555236 41.635014
+ 9700 8.0946791 83.807309 41.755136
+ 9800 8.163152 84.056471 41.873869
+ 9900 8.231528 84.302754 41.991231
+ 10000 8.3004131 84.546192 42.107238
+Loop time of 8.30076 on 4 procs for 10000 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.00606805 (0.0697499)
-Outpt time (%) = 0.0389953 (0.448236)
-Other time (%) = 8.65466 (99.482)
+Comm time (%) = 0.00620985 (0.0748106)
+Outpt time (%) = 0.0488294 (0.588252)
+Other time (%) = 8.24572 (99.3369)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
fix_modify AtC remove_source temperature all
fix_modify AtC unfix temperature rbc
fix_modify AtC fix temperature all 20.
run 1
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
Memory usage per processor = 0.432198 Mbytes
Step CPU AtC[1] AtC[2]
10000 0 84.546192 42.107238
- 10001 0.00071191788 38.154369 20
-Loop time of 0.00105554 on 4 procs for 1 steps with 0 atoms
+ 10001 0.00083208084 38.154369 20
+Loop time of 0.00115949 on 4 procs for 1 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 7.15256e-07 (0.0677622)
-Outpt time (%) = 0.000342309 (32.4298)
-Other time (%) = 0.000712514 (67.5024)
+Comm time (%) = 7.15256e-07 (0.0616871)
+Outpt time (%) = 0.000325739 (28.0934)
+Other time (%) = 0.000833035 (71.845)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
fix_modify AtC unfix temperature all
reset_timestep 0
# fix one end temperature and the a source at the other
fix_modify AtC fix temperature lbc 20.
fix_modify AtC mesh create_faceset rbcFace plane x 10.0
ATC: created faceset rbcFace with 1 faces
fix_modify AtC fix_flux temperature rbcFace 0.000000001
fix_modify AtC output no_atoms_flux_FE 1000 text binary # NOTE not used
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
thermo 100
run 10000
Setting up run ...
ATC: WARNING: material: [vacuum] cannot find heat_flux
ATC: WARNING: physics model: [], material: [vacuum] does not provide all interfaces for <temperature> physics and will be treated as null
Memory usage per processor = 0.432198 Mbytes
Step CPU AtC[1] AtC[2]
0 0 38.154369 20
- 100 0.083673954 38.293317 20.125706
- 200 0.19899392 38.432963 20.241114
- 300 0.29243803 38.57261 20.348568
- 400 0.36600494 38.712256 20.45016
- 500 0.48900485 38.851902 20.547358
- 600 0.56217504 38.991549 20.641205
- 700 0.65521789 39.131195 20.732446
- 800 0.75310206 39.270841 20.821625
- 900 0.89797902 39.410488 20.90914
- 1000 1.0122259 39.550134 20.99529
- 1100 1.1407759 39.68978 21.080301
- 1200 1.214483 39.829426 21.164346
- 1300 1.308712 39.969071 21.247561
- 1400 1.4200881 40.108714 21.330051
- 1500 1.548327 40.248357 21.411904
- 1600 1.67171 40.387997 21.493188
- 1700 1.778965 40.527634 21.57396
- 1800 1.902406 40.667266 21.654269
- 1900 1.9758 40.806892 21.734154
- 2000 2.0998969 40.946511 21.813649
- 2100 2.2233069 41.08612 21.892782
- 2200 2.2966919 41.225716 21.971578
- 2300 2.390126 41.365298 22.050059
- 2400 2.4832549 41.504861 22.128243
- 2500 2.576612 41.644403 22.206146
- 2600 2.6688199 41.78392 22.283782
- 2700 2.7717919 41.923408 22.361164
- 2800 2.8780448 42.062861 22.438302
- 2900 2.9616508 42.202276 22.515205
- 3000 3.0891819 42.341647 22.591883
- 3100 3.1626549 42.480969 22.668342
- 3200 3.289422 42.620236 22.744588
- 3300 4.5723 42.759443 22.820628
- 3400 4.6451941 42.898584 22.896465
- 3500 4.7988889 43.037652 22.972105
- 3600 4.9616499 43.176641 23.047551
- 3700 5.0750909 43.315544 23.122806
- 3800 5.158251 43.454355 23.197872
- 3900 5.2814069 43.593068 23.272753
- 4000 5.365943 43.731674 23.347449
- 4100 5.5499399 43.870169 23.421963
- 4200 5.7134259 44.008544 23.496296
- 4300 5.8402519 44.146792 23.570449
- 4400 5.914254 44.284907 23.644422
- 4500 6.059108 44.422882 23.718217
- 4600 6.173615 44.56071 23.791833
- 4700 6.2584949 44.698385 23.865272
- 4800 6.390687 44.835898 23.938532
- 4900 6.5018079 44.973245 24.011614
- 5000 6.6458249 45.110417 24.084519
- 5100 6.7996399 45.247409 24.157245
- 5200 6.947237 45.384214 24.229793
- 5300 7.065861 45.520826 24.302161
- 5400 7.1804399 45.657238 24.37435
- 5500 7.329967 45.793445 24.44636
- 5600 7.403404 45.92944 24.518189
- 5700 7.532212 46.065217 24.589837
- 5800 7.636107 46.200772 24.661303
- 5900 7.7702749 46.336097 24.732587
- 6000 7.8824019 46.471189 24.803688
- 6100 8.0066459 46.60604 24.874606
- 6200 13.214045 46.740647 24.94534
- 6300 13.892477 46.875004 25.015889
- 6400 14.292473 47.009107 25.086252
- 6500 14.535074 47.14295 25.156429
- 6600 14.988646 47.276528 25.22642
- 6700 15.313997 47.409838 25.296223
- 6800 15.648461 47.542875 25.365838
- 6900 15.970553 47.675634 25.435265
- 7000 16.191319 47.808113 25.504502
- 7100 16.827143 47.940306 25.57355
- 7200 17.610442 48.072209 25.642407
- 7300 18.375779 48.20382 25.711073
- 7400 18.552067 48.335135 25.779548
- 7500 18.625211 48.46615 25.847831
- 7600 18.777196 48.596861 25.915922
- 7700 18.860914 48.727267 25.98382
- 7800 19.056963 48.857363 26.051525
- 7900 19.143181 48.987147 26.119036
- 8000 19.217513 49.116615 26.186353
- 8100 19.291583 49.245766 26.253475
- 8200 19.365672 49.374597 26.320403
- 8300 19.439444 49.503104 26.387136
- 8400 19.513173 49.631286 26.453674
- 8500 19.586943 49.759141 26.520016
- 8600 19.660707 49.886666 26.586162
- 8700 19.734394 50.013859 26.652112
- 8800 19.808109 50.140719 26.717866
- 8900 19.881979 50.267243 26.783423
- 9000 19.9564 50.393429 26.848784
- 9100 20.030697 50.519276 26.913949
- 9200 20.104676 50.644783 26.978916
- 9300 20.178579 50.769947 27.043687
- 9400 20.252333 50.894768 27.10826
- 9500 20.326012 51.019243 27.172637
- 9600 20.399727 51.143372 27.236816
- 9700 20.473378 51.267153 27.300799
- 9800 20.547044 51.390586 27.364584
- 9900 20.620753 51.513669 27.428173
- 10000 20.695237 51.636401 27.491564
-Loop time of 20.6956 on 4 procs for 10000 steps with 0 atoms
+ 100 0.074691057 38.293317 20.125706
+ 200 0.14964104 38.432963 20.241114
+ 300 0.22440195 38.57261 20.348568
+ 400 0.29957914 38.712256 20.45016
+ 500 0.37440896 38.851902 20.547358
+ 600 0.44927001 38.991549 20.641205
+ 700 0.5244031 39.131195 20.732446
+ 800 0.59940791 39.270841 20.821625
+ 900 0.67445707 39.410488 20.90914
+ 1000 0.75037408 39.550134 20.99529
+ 1100 0.82606006 39.68978 21.080301
+ 1200 0.90129113 39.829426 21.164346
+ 1300 0.97653103 39.969071 21.247561
+ 1400 1.0517421 40.108714 21.330051
+ 1500 1.1269631 40.248357 21.411904
+ 1600 1.202002 40.387997 21.493188
+ 1700 1.2770131 40.527634 21.57396
+ 1800 1.352093 40.667266 21.654269
+ 1900 1.427525 40.806892 21.734154
+ 2000 1.5030839 40.946511 21.813649
+ 2100 1.5779941 41.08612 21.892782
+ 2200 1.652709 41.225716 21.971578
+ 2300 1.7274911 41.365298 22.050059
+ 2400 1.802295 41.504861 22.128243
+ 2500 1.8770111 41.644403 22.206146
+ 2600 1.951659 41.78392 22.283782
+ 2700 2.026412 41.923408 22.361164
+ 2800 2.1010699 42.062861 22.438302
+ 2900 2.1756341 42.202276 22.515205
+ 3000 2.251014 42.341647 22.591883
+ 3100 2.326412 42.480969 22.668342
+ 3200 2.401233 42.620236 22.744588
+ 3300 2.4762599 42.759443 22.820628
+ 3400 2.5513301 42.898584 22.896465
+ 3500 2.626359 43.037652 22.972105
+ 3600 2.701442 43.176641 23.047551
+ 3700 2.776989 43.315544 23.122806
+ 3800 2.8522229 43.454355 23.197872
+ 3900 2.9273891 43.593068 23.272753
+ 4000 3.003252 43.731674 23.347449
+ 4100 3.078357 43.870169 23.421963
+ 4200 3.1538751 44.008544 23.496296
+ 4300 3.229089 44.146792 23.570449
+ 4400 3.361537 44.284907 23.644422
+ 4500 3.5169501 44.422882 23.718217
+ 4600 3.6510451 44.56071 23.791833
+ 4700 3.726042 44.698385 23.865272
+ 4800 3.800982 44.835898 23.938532
+ 4900 3.876025 44.973245 24.011614
+ 5000 3.9521041 45.110417 24.084519
+ 5100 4.057178 45.247409 24.157245
+ 5200 4.1521881 45.384214 24.229793
+ 5300 4.2873821 45.520826 24.302161
+ 5400 4.385608 45.657238 24.37435
+ 5500 4.4707391 45.793445 24.44636
+ 5600 4.5758271 45.92944 24.518189
+ 5700 4.6706221 46.065217 24.589837
+ 5800 4.765465 46.200772 24.661303
+ 5900 4.880121 46.336097 24.732587
+ 6000 4.975982 46.471189 24.803688
+ 6100 5.120806 46.60604 24.874606
+ 6200 5.215425 46.740647 24.94534
+ 6300 5.3100591 46.875004 25.015889
+ 6400 5.444972 47.009107 25.086252
+ 6500 5.5396199 47.14295 25.156429
+ 6600 5.6142759 47.276528 25.22642
+ 6700 5.739603 47.409838 25.296223
+ 6800 5.8447909 47.542875 25.365838
+ 6900 5.919903 47.675634 25.435265
+ 7000 6.0255911 47.808113 25.504502
+ 7100 6.15065 47.940306 25.57355
+ 7200 6.2253611 48.072209 25.642407
+ 7300 6.3149979 48.20382 25.711073
+ 7400 6.389462 48.335135 25.779548
+ 7500 6.5141521 48.46615 25.847831
+ 7600 6.6492481 48.596861 25.915922
+ 7700 6.724153 48.727267 25.98382
+ 7800 7.0480061 48.857363 26.051525
+ 7900 7.1936171 48.987147 26.119036
+ 8000 7.355957 49.116615 26.186353
+ 8100 7.5015841 49.245766 26.253475
+ 8200 7.6583509 49.374597 26.320403
+ 8300 7.7631471 49.503104 26.387136
+ 8400 7.8379819 49.631286 26.453674
+ 8500 7.9124291 49.759141 26.520016
+ 8600 7.986696 49.886666 26.586162
+ 8700 8.0611801 50.013859 26.652112
+ 8800 8.165652 50.140719 26.717866
+ 8900 8.2601151 50.267243 26.783423
+ 9000 8.3655519 50.393429 26.848784
+ 9100 8.4629769 50.519276 26.913949
+ 9200 8.5374889 50.644783 26.978916
+ 9300 8.61202 50.769947 27.043687
+ 9400 8.6865401 50.894768 27.10826
+ 9500 8.8111451 51.019243 27.172637
+ 9600 8.8857729 51.143372 27.236816
+ 9700 8.960433 51.267153 27.300799
+ 9800 9.0351319 51.390586 27.364584
+ 9900 9.1097481 51.513669 27.428173
+ 10000 9.18536 51.636401 27.491564
+Loop time of 9.18571 on 4 procs for 10000 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.0139726 (0.0675151)
-Outpt time (%) = 0.0488307 (0.235948)
-Other time (%) = 20.6328 (99.6965)
+Comm time (%) = 0.00622296 (0.0677461)
+Outpt time (%) = 0.0682393 (0.742885)
+Other time (%) = 9.11125 (99.1894)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/two_temperature/bar1d_ttm.screen b/examples/USER/atc/two_temperature/bar1d_ttm.screen
index ce15293d2..b58a527ed 100644
--- a/examples/USER/atc/two_temperature/bar1d_ttm.screen
+++ b/examples/USER/atc/two_temperature/bar1d_ttm.screen
@@ -1,446 +1,447 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Reading data file ...
orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
4 by 1 by 1 MPI processor grid
3456 atoms
3456 velocities
Lattice spacing in x,y,z = 5.405 5.405 5.405
2880 atoms in group internal
576 atoms in group ghost
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
ATC: created uniform mesh with 60 nodes, 15 unique nodes, and 14 elements
ATC: created faceset bndy with 2 faces
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc with 1 nodes
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
-Memory usage per processor = 100.664 Mbytes
+Memory usage per processor = 57.8906 Mbytes
Step Temp E_pair E_mol TotEng Press
0 16.671491 -6505.7593 0 -6334.0647 -1236.2423
10 16.651702 -6505.5537 0 -6334.0628 -1236.063
20 16.530147 -6504.2726 0 -6334.0336 -1232.9375
30 16.484722 -6503.7603 0 -6333.9891 -1231.0693
40 16.543921 -6504.3216 0 -6333.9407 -1231.4896
50 16.594956 -6504.742 0 -6333.8355 -1231.8563
60 16.569017 -6504.3692 0 -6333.7298 -1230.774
70 16.505606 -6503.6167 0 -6333.6304 -1229.192
80 16.499938 -6503.445 0 -6333.5172 -1229.1013
90 16.523216 -6503.6045 0 -6333.4369 -1229.6947
100 16.50815 -6503.3717 0 -6333.3592 -1229.2848
110 16.515727 -6503.3742 0 -6333.2837 -1229.1999
120 16.568227 -6503.8633 0 -6333.2321 -1230.0838
130 16.554875 -6503.6751 0 -6333.1814 -1229.6147
140 16.473418 -6502.736 0 -6333.0812 -1227.7488
150 16.469779 -6502.5515 0 -6332.9342 -1227.6072
160 16.579808 -6503.5343 0 -6332.7839 -1229.6569
170 16.624355 -6503.8397 0 -6332.6305 -1229.6117
180 16.501717 -6502.3771 0 -6332.4309 -1225.3561
190 16.38836 -6500.9674 0 -6332.1886 -1221.4976
200 16.484583 -6501.7505 0 -6331.9808 -1223.1581
210 16.699218 -6503.7793 0 -6331.7991 -1228.2054
220 16.791883 -6504.5481 0 -6331.6135 -1230.5561
230 16.748089 -6503.9202 0 -6331.4366 -1229.2129
240 16.665848 -6502.849 0 -6331.2124 -1226.4068
250 16.621244 -6502.1715 0 -6330.9943 -1224.5035
260 16.658103 -6502.3533 0 -6330.7965 -1224.8892
270 16.73917 -6502.9656 0 -6330.5739 -1226.6044
280 16.804864 -6503.449 0 -6330.3807 -1227.9288
290 16.798754 -6503.1257 0 -6330.1204 -1227.0908
300 16.696317 -6501.801 0 -6329.8507 -1223.5728
310 16.591132 -6500.3983 0 -6329.5312 -1219.6957
320 16.562111 -6499.7683 0 -6329.2001 -1217.6592
330 16.629363 -6500.1642 0 -6328.9034 -1218.1364
340 16.735603 -6500.9663 0 -6328.6114 -1219.8661
350 16.849016 -6501.8915 0 -6328.3686 -1222.1919
360 16.987179 -6503.0918 0 -6328.146 -1225.3559
370 17.069822 -6503.7253 0 -6327.9283 -1227.2178
380 16.971748 -6502.4322 0 -6327.6452 -1224.4888
390 16.743421 -6499.7171 0 -6327.2816 -1218.0665
400 16.574707 -6497.5174 0 -6326.8195 -1212.3609
410 16.567165 -6496.9841 0 -6326.3639 -1210.1955
420 16.671594 -6497.63 0 -6325.9343 -1210.904
430 16.808398 -6498.6163 0 -6325.5117 -1212.8577
440 16.918714 -6499.3848 0 -6325.1441 -1214.747
450 16.998405 -6499.8251 0 -6324.7637 -1216.1874
460 17.10197 -6500.4966 0 -6324.3686 -1217.9781
470 17.199373 -6501.0956 0 -6323.9645 -1219.067
480 17.13357 -6500.0354 0 -6323.5819 -1216.039
490 16.93992 -6497.6895 0 -6323.2304 -1210.2729
500 16.919171 -6497.0726 0 -6322.8272 -1209.112
510 17.178559 -6499.324 0 -6322.4072 -1215.185
520 17.480271 -6502.0281 0 -6322.004 -1222.3709
530 17.559599 -6502.4375 0 -6321.5964 -1223.4721
540 17.389395 -6500.2917 0 -6321.2036 -1217.4915
550 17.142307 -6497.3088 0 -6320.7653 -1209.0976
560 17.016535 -6495.5085 0 -6320.2603 -1204.0875
570 17.15099 -6496.3909 0 -6319.7581 -1206.2345
580 17.393207 -6498.4177 0 -6319.2903 -1211.648
590 17.504872 -6499.1261 0 -6318.8487 -1213.8125
600 17.50042 -6498.6414 0 -6318.4099 -1212.1098
610 17.4061 -6497.2202 0 -6317.9601 -1207.3648
620 17.22091 -6494.8032 0 -6317.4502 -1200.5893
630 17.102413 -6493.0314 0 -6316.8988 -1196.2011
640 17.14837 -6492.9093 0 -6316.3034 -1196.5877
650 17.311633 -6493.9989 0 -6315.7116 -1200.1082
660 17.482989 -6495.2111 0 -6315.159 -1203.3105
670 17.519696 -6495.0677 0 -6314.6376 -1202.497
680 17.457193 -6493.979 0 -6314.1926 -1198.8639
690 17.470926 -6493.6502 0 -6313.7223 -1197.0147
700 17.576201 -6494.2448 0 -6313.2328 -1197.8262
710 17.697946 -6495.0244 0 -6312.7586 -1199.4327
720 17.743103 -6494.9538 0 -6312.223 -1199.244
730 17.699824 -6493.9452 0 -6311.66 -1196.7936
740 17.627913 -6492.6296 0 -6311.0851 -1193.4092
750 17.550189 -6491.2436 0 -6310.4995 -1189.7943
760 17.539131 -6490.5765 0 -6309.9463 -1187.8984
770 17.673403 -6491.4348 0 -6309.4218 -1189.7512
780 17.882198 -6493.0617 0 -6308.8983 -1193.7178
790 18.009723 -6493.8707 0 -6308.394 -1195.7997
800 17.980657 -6493.071 0 -6307.8937 -1193.6838
810 17.825903 -6490.9583 0 -6307.3747 -1188.1001
820 17.692389 -6489.0394 0 -6306.8308 -1183.0274
830 17.710477 -6488.6565 0 -6306.2616 -1181.9361
840 17.808308 -6489.0846 0 -6305.6822 -1183.0439
850 17.829619 -6488.7131 0 -6305.0912 -1182.1869
860 17.771389 -6487.5003 0 -6304.4781 -1179.1196
870 17.820354 -6487.3692 0 -6303.8427 -1178.5734
880 18.063604 -6489.2632 0 -6303.2316 -1183.0647
890 18.369348 -6491.8491 0 -6302.6687 -1189.4257
900 18.525924 -6492.9953 0 -6302.2024 -1192.3397
910 18.472281 -6492.0337 0 -6301.7933 -1190.0789
920 18.37238 -6490.561 0 -6301.3494 -1186.1632
930 18.288209 -6489.215 0 -6300.8703 -1181.9804
940 18.096723 -6486.6626 0 -6300.2899 -1174.8551
950 17.882245 -6483.7851 0 -6299.6213 -1167.0946
960 17.8674 -6482.9258 0 -6298.9148 -1164.4821
970 18.099234 -6484.6335 0 -6298.2349 -1168.6512
980 18.443659 -6487.5719 0 -6297.6262 -1176.2572
990 18.703878 -6489.7033 0 -6297.0776 -1181.8775
1000 18.753373 -6489.681 0 -6296.5456 -1181.8646
1010 18.610912 -6487.6693 0 -6296.0011 -1176.5305
1020 18.393457 -6484.8431 0 -6295.4144 -1168.9309
1030 18.247899 -6482.6927 0 -6294.7631 -1162.9511
1040 18.276615 -6482.3633 0 -6294.1379 -1161.3722
1050 18.418211 -6483.2608 0 -6293.5772 -1163.046
1060 18.5741 -6484.3103 0 -6293.0213 -1165.5673
1070 18.664941 -6484.6974 0 -6292.4728 -1166.7911
1080 18.621684 -6483.6725 0 -6291.8934 -1164.8739
1090 18.539379 -6482.1923 0 -6291.2609 -1161.8634
1100 18.568937 -6481.8626 0 -6290.6267 -1161.2468
1110 18.683899 -6482.4285 0 -6290.0086 -1162.4732
1120 18.808314 -6483.082 0 -6289.3808 -1163.5933
1130 18.885127 -6483.3241 0 -6288.8318 -1163.2805
1140 18.846866 -6482.3949 0 -6288.2967 -1160.2502
1150 18.749156 -6480.8324 0 -6287.7405 -1156.1923
1160 18.760163 -6480.3831 0 -6287.1778 -1155.1058
1170 18.902121 -6481.2877 0 -6286.6205 -1157.2667
1180 19.011404 -6481.8998 0 -6286.1071 -1158.6844
1190 19.040403 -6481.7174 0 -6285.626 -1158.132
1200 19.10627 -6481.8937 0 -6285.124 -1158.2836
1210 19.229447 -6482.6321 0 -6284.5938 -1159.6849
1220 19.239299 -6482.1937 0 -6284.0539 -1158.5989
1230 19.157875 -6480.7862 0 -6283.485 -1155.4462
1240 19.174924 -6480.42 0 -6282.9432 -1154.4872
1250 19.286321 -6481.0795 0 -6282.4555 -1155.5865
1260 19.320224 -6480.9586 0 -6281.9854 -1154.5897
1270 19.190646 -6479.1568 0 -6281.5182 -1149.4077
1280 18.995223 -6476.6094 0 -6280.9833 -1142.597
1290 18.91464 -6475.156 0 -6280.3598 -1138.9782
1300 19.050448 -6475.8736 0 -6279.6788 -1141.1025
1310 19.272838 -6477.5301 0 -6279.045 -1145.5625
1320 19.357725 -6477.7597 0 -6278.4003 -1146.3869
1330 19.266515 -6476.2212 0 -6277.8012 -1142.4053
1340 19.168361 -6474.558 0 -6277.1488 -1137.8241
1350 19.2574 -6474.8131 0 -6276.487 -1137.9029
1360 19.550594 -6477.1993 0 -6275.8536 -1143.4582
1370 19.79703 -6479.1478 0 -6275.2642 -1148.546
1380 19.781693 -6478.4391 0 -6274.7134 -1147.5644
1390 19.631749 -6476.3397 0 -6274.1582 -1142.6964
1400 19.52122 -6474.597 0 -6273.5538 -1138.0152
1410 19.519831 -6473.9594 0 -6272.9306 -1135.757
1420 19.608366 -6474.2536 0 -6272.3129 -1136.0044
1430 19.764735 -6475.2699 0 -6271.7189 -1138.2092
1440 19.912821 -6476.2029 0 -6271.1267 -1140.1679
1450 19.914017 -6475.5988 0 -6270.5103 -1138.3642
1460 19.791825 -6473.6938 0 -6269.8638 -1133.2803
1470 19.71485 -6472.2559 0 -6269.2186 -1129.0501
1480 19.737525 -6471.8431 0 -6268.5722 -1127.3023
1490 19.766337 -6471.5377 0 -6267.9701 -1126.1915
1500 19.769771 -6470.9634 0 -6267.3604 -1124.9011
1510 19.827923 -6470.9004 0 -6266.6985 -1124.9375
1520 19.944718 -6471.4424 0 -6266.0377 -1126.1203
1530 19.9742 -6471.1365 0 -6265.4282 -1125.0473
1540 19.88673 -6469.6287 0 -6264.8212 -1121.0283
1550 19.818644 -6468.3235 0 -6264.2173 -1117.3798
1560 19.839381 -6467.8963 0 -6263.5765 -1115.935
1570 19.921511 -6468.0984 0 -6262.9328 -1116.1692
1580 20.015923 -6468.446 0 -6262.3081 -1116.9031
1590 20.110515 -6468.7879 0 -6261.6758 -1117.853
1600 20.26513 -6469.7327 0 -6261.0282 -1120.2654
1610 20.380624 -6470.3079 0 -6260.414 -1121.7493
1620 20.322395 -6469.1068 0 -6259.8125 -1119.0113
1630 20.232984 -6467.5432 0 -6259.1698 -1115.1571
1640 20.313939 -6467.7383 0 -6258.5312 -1115.2856
1650 20.576213 -6469.832 0 -6257.9238 -1120.091
1660 20.794296 -6471.5193 0 -6257.3651 -1124.1841
1670 20.736338 -6470.3907 0 -6256.8334 -1121.5386
1680 20.445272 -6466.831 0 -6256.2713 -1112.723
1690 20.227033 -6463.9877 0 -6255.6755 -1105.0192
1700 20.275182 -6463.8992 0 -6255.0912 -1103.5914
1710 20.451708 -6465.0914 0 -6254.4654 -1105.883
1720 20.569465 -6465.7061 0 -6253.8674 -1107.7788
1730 20.641974 -6465.8186 0 -6253.2331 -1108.9648
1740 20.728488 -6466.0998 0 -6252.6233 -1110.0083
1750 20.722544 -6465.3696 0 -6251.9543 -1107.8705
1760 20.539022 -6462.7819 0 -6251.2567 -1100.7949
1770 20.356891 -6460.1749 0 -6250.5254 -1093.4779
1780 20.41155 -6460.0578 0 -6249.8454 -1092.0587
1790 20.661559 -6461.9563 0 -6249.1692 -1096.0603
1800 20.953129 -6464.3151 0 -6248.5251 -1101.9398
1810 21.252707 -6466.7876 0 -6247.9124 -1108.1719
1820 21.413681 -6467.8865 0 -6247.3535 -1110.7459
1830 21.265903 -6465.8131 0 -6246.802 -1105.4522
1840 20.905165 -6461.4754 0 -6246.1794 -1094.6237
1850 20.605211 -6457.6976 0 -6245.4908 -1085.1974
1860 20.578162 -6456.6368 0 -6244.7085 -1082.4858
1870 20.792745 -6458.0298 0 -6243.8916 -1085.8902
1880 21.104069 -6460.5316 0 -6243.1871 -1091.8832
1890 21.350048 -6462.4172 0 -6242.5394 -1096.2778
1900 21.425156 -6462.6267 0 -6241.9754 -1096.4844
1910 21.349628 -6461.3047 0 -6241.4313 -1092.9302
1920 21.185352 -6459.1025 0 -6240.921 -1087.3234
1930 21.036227 -6457.0188 0 -6240.3731 -1082.1984
1940 21.024509 -6456.3125 0 -6239.7874 -1080.5316
1950 21.290355 -6458.4064 0 -6239.1435 -1085.3439
1960 21.668042 -6461.6871 0 -6238.5345 -1092.5078
1970 21.746179 -6461.9097 0 -6237.9523 -1092.2379
1980 21.480119 -6458.5491 0 -6237.3319 -1083.5684
1990 21.29344 -6456.0104 0 -6236.7156 -1076.6901
2000 21.280179 -6455.2575 0 -6236.0993 -1074.3096
2010 21.210319 -6453.9178 0 -6235.4791 -1071.2499
2020 21.123484 -6452.335 0 -6234.7906 -1068.0656
2030 21.232258 -6452.7524 0 -6234.0878 -1069.4974
2040 21.509374 -6454.8729 0 -6233.3544 -1074.7419
2050 21.690096 -6456.0708 0 -6232.6911 -1077.5869
2060 21.647304 -6455.0043 0 -6232.0652 -1074.9952
2070 21.596094 -6453.8873 0 -6231.4756 -1072.0493
2080 21.722831 -6454.6389 0 -6230.922 -1073.3389
2090 21.936667 -6456.3188 0 -6230.3997 -1076.674
2100 21.943904 -6455.8636 0 -6229.87 -1075.077
2110 21.710769 -6452.8948 0 -6229.3021 -1067.7255
2120 21.539575 -6450.4324 0 -6228.6028 -1061.7922
2130 21.626074 -6450.5938 0 -6227.8733 -1062.4626
2140 21.960887 -6453.3249 0 -6227.1563 -1069.536
2150 22.311239 -6456.283 0 -6226.5062 -1077.0932
2160 22.44313 -6457.083 0 -6225.9479 -1078.9382
2170 22.307896 -6455.163 0 -6225.4207 -1073.5444
2180 22.019355 -6451.6135 0 -6224.8428 -1063.9897
2190 21.809535 -6448.8251 0 -6224.2152 -1056.4879
2200 21.835015 -6448.4087 0 -6223.5364 -1055.2342
2210 22.053797 -6449.968 0 -6222.8425 -1059.0024
2220 22.21239 -6450.9638 0 -6222.2051 -1061.1552
2230 22.136817 -6449.5172 0 -6221.5368 -1056.9984
2240 21.956678 -6446.9553 0 -6220.8301 -1049.811
2250 21.924024 -6445.8389 0 -6220.0499 -1046.3582
2260 22.155942 -6447.4727 0 -6219.2954 -1050.0773
2270 22.472489 -6450.0917 0 -6218.6544 -1056.6974
2280 22.6257 -6451.0784 0 -6218.0632 -1059.4466
2290 22.543301 -6449.6931 0 -6217.5264 -1055.8551
2300 22.354115 -6447.0947 0 -6216.8764 -1048.8329
2310 22.199985 -6444.8454 0 -6216.2144 -1042.673
2320 22.168493 -6443.859 0 -6215.5523 -1040.26
2330 22.32733 -6444.842 0 -6214.8995 -1043.208
2340 22.619807 -6447.2499 0 -6214.2953 -1049.613
2350 22.842267 -6448.9665 0 -6213.7208 -1053.9952
2360 22.832746 -6448.2859 0 -6213.1383 -1052.3152
2370 22.676721 -6446.091 0 -6212.5503 -1046.8785
2380 22.574305 -6444.4406 0 -6211.9546 -1042.7269
2390 22.583247 -6443.8928 0 -6211.3147 -1041.3216
2400 22.653625 -6443.9554 0 -6210.6525 -1041.3608
2410 22.763975 -6444.4237 0 -6209.9843 -1042.0815
2420 22.873919 -6444.9481 0 -6209.3765 -1042.6283
2430 22.906657 -6444.7401 0 -6208.8313 -1041.4966
2440 22.910597 -6444.2499 0 -6208.3006 -1039.911
2450 23.026514 -6444.9006 0 -6207.7574 -1040.9751
2460 23.150933 -6445.6504 0 -6207.226 -1042.0836
2470 23.033522 -6443.8846 0 -6206.6693 -1037.2797
2480 22.843348 -6441.292 0 -6206.0353 -1030.4225
2490 22.912055 -6441.318 0 -6205.3537 -1029.7048
2500 23.153814 -6443.2109 0 -6204.7568 -1033.8955
2510 23.303174 -6444.2353 0 -6204.243 -1036.581
2520 23.252661 -6443.2163 0 -6203.7442 -1034.4296
2530 23.054103 -6440.6419 0 -6203.2146 -1028.2312
2540 22.849508 -6437.9283 0 -6202.6081 -1021.2719
2550 22.713113 -6435.848 0 -6201.9325 -1015.6399
2560 22.715667 -6435.1406 0 -6201.1988 -1013.3786
2570 22.864536 -6435.9458 0 -6200.4708 -1015.1617
2580 23.148087 -6438.147 0 -6199.7518 -1020.6467
2590 23.497861 -6441.0286 0 -6199.0312 -1027.5979
2600 23.698742 -6442.446 0 -6198.3798 -1030.8127
2610 23.741046 -6442.2753 0 -6197.7734 -1030.0645
2620 23.756307 -6441.8542 0 -6197.1952 -1028.6193
2630 23.699699 -6440.7077 0 -6196.6317 -1025.8387
2640 23.557681 -6438.6375 0 -6196.024 -1021.2222
2650 23.390069 -6436.2654 0 -6195.3781 -1015.7846
2660 23.268489 -6434.3282 0 -6194.693 -1011.0457
2670 23.287946 -6433.8434 0 -6194.0079 -1009.206
2680 23.401423 -6434.3656 0 -6193.3614 -1009.2945
2690 23.417149 -6433.8818 0 -6192.7156 -1007.2565
2700 23.427554 -6433.347 0 -6192.0737 -1005.45
2710 23.635932 -6434.8352 0 -6191.4159 -1008.7456
2720 24.011267 -6438.0992 0 -6190.8144 -1016.3754
2730 24.2348 -6439.8756 0 -6190.2887 -1020.448
2740 24.079415 -6437.7113 0 -6189.7247 -1015.0766
2750 23.67124 -6432.8883 0 -6189.1054 -1003.3539
2760 23.374231 -6429.181 0 -6188.4568 -994.50438
2770 23.483462 -6429.5942 0 -6187.7451 -995.81797
2780 23.872789 -6432.9576 0 -6187.0989 -1004.3102
2790 24.162496 -6435.4321 0 -6186.5898 -1010.2733
2800 24.108994 -6434.4105 0 -6186.1192 -1007.1652
2810 23.814922 -6430.8587 0 -6185.596 -997.57868
2820 23.671862 -6428.7587 0 -6184.9693 -991.49148
2830 23.905206 -6430.4412 0 -6184.2487 -994.87938
2840 24.223025 -6433.0396 0 -6183.574 -1001.3687
2850 24.367058 -6433.912 0 -6182.963 -1004.2636
2860 24.357562 -6433.2565 0 -6182.4053 -1003.0901
2870 24.267707 -6431.841 0 -6181.9152 -999.29814
2880 24.137348 -6429.9589 0 -6181.3756 -994.16839
2890 24.08892 -6428.8857 0 -6180.8012 -991.18873
2900 24.238476 -6429.857 0 -6180.2322 -993.57423
2910 24.53787 -6432.4435 0 -6179.7353 -1000.1396
2920 24.726413 -6433.9516 0 -6179.3017 -1004.2649
2930 24.66711 -6432.9171 0 -6178.878 -1002.0129
2940 24.432311 -6430.0086 0 -6178.3876 -994.88815
2950 24.206528 -6427.1162 0 -6177.8204 -987.58457
2960 24.167256 -6426.0773 0 -6177.1861 -984.55005
2970 24.30592 -6426.8569 0 -6176.5375 -985.74512
2980 24.508448 -6428.3014 0 -6175.8963 -988.47719
2990 24.718187 -6429.8708 0 -6175.3056 -991.32318
3000 24.795476 -6430.1847 0 -6174.8235 -991.35255
3010 24.685228 -6428.5796 0 -6174.3539 -987.36529
3020 24.566807 -6426.8349 0 -6173.8288 -983.12616
3030 24.513909 -6425.7504 0 -6173.2891 -980.27874
3040 24.445959 -6424.4726 0 -6172.711 -977.29872
3050 24.449748 -6423.8898 0 -6172.0892 -976.2945
3060 24.57578 -6424.5347 0 -6171.4361 -978.25206
3070 24.69548 -6425.1316 0 -6170.8002 -979.70392
3080 24.650627 -6424.0707 0 -6170.2013 -976.59917
3090 24.477193 -6421.6145 0 -6169.5313 -969.99551
3100 24.513648 -6421.3475 0 -6168.8888 -968.35
3110 24.822114 -6423.9414 0 -6168.3059 -973.79769
3120 25.101868 -6426.3265 0 -6167.8099 -979.71859
3130 25.271137 -6427.5924 0 -6167.3325 -983.47883
3140 25.404011 -6428.5298 0 -6166.9015 -985.96772
3150 25.398246 -6428.0251 0 -6166.4562 -984.50226
3160 25.129525 -6424.8007 0 -6165.9993 -976.54023
3170 24.798572 -6420.8283 0 -6165.4353 -967.17898
3180 24.863045 -6420.8634 0 -6164.8064 -966.99245
3190 25.218833 -6423.9143 0 -6164.1931 -973.56457
3200 25.33816 -6424.5975 0 -6163.6475 -974.76184
3210 25.108035 -6421.6845 0 -6163.1044 -967.82169
3220 24.899669 -6418.9472 0 -6162.5131 -961.25938
3230 24.957399 -6418.99 0 -6161.9613 -960.87287
3240 25.077387 -6419.7178 0 -6161.4533 -962.12995
3250 25.084455 -6419.2924 0 -6160.9551 -960.86499
3260 25.079993 -6418.6985 0 -6160.4073 -959.25057
3270 25.215185 -6419.4825 0 -6159.7989 -961.00614
3280 25.544514 -6422.3277 0 -6159.2524 -967.69085
3290 25.876103 -6425.2786 0 -6158.7884 -974.71707
3300 25.9043 -6425.1562 0 -6158.3756 -974.54758
3310 25.681739 -6422.4181 0 -6157.9296 -967.78818
3320 25.437365 -6419.4575 0 -6157.4857 -959.91387
3330 25.271921 -6417.21 0 -6156.9421 -953.97172
3340 25.347015 -6417.3828 0 -6156.3415 -953.99214
3350 25.588042 -6419.2939 0 -6155.7704 -958.20335
3360 25.69672 -6419.8655 0 -6155.2227 -959.64648
3370 25.721141 -6419.6143 0 -6154.72 -959.2125
3380 25.879576 -6420.7911 0 -6154.2651 -961.81369
3390 26.038224 -6421.9758 0 -6153.816 -964.44857
3400 25.950329 -6420.6165 0 -6153.3619 -961.20127
3410 25.604901 -6416.4932 0 -6152.7961 -951.49185
3420 25.278418 -6412.5172 0 -6152.1824 -941.86698
3430 25.231006 -6411.4656 0 -6151.6191 -938.81077
3440 25.407599 -6412.7629 0 -6151.0977 -941.38485
3450 25.618 -6414.3905 0 -6150.5584 -944.94008
3460 25.787475 -6415.5597 0 -6149.9822 -947.31569
3470 25.924756 -6416.41 0 -6149.4188 -949.07214
3480 26.120792 -6417.8639 0 -6148.8537 -952.68086
3490 26.219435 -6418.452 0 -6148.4259 -954.66155
3500 26.04907 -6416.2498 0 -6147.9783 -950.14053
3510 25.693781 -6412.0424 0 -6147.4299 -940.40144
3520 25.501108 -6409.4153 0 -6146.7871 -933.41168
3530 25.58851 -6409.6206 0 -6146.0923 -932.73718
3540 25.861349 -6411.7858 0 -6145.4476 -937.1341
3550 26.188925 -6414.5975 0 -6144.8856 -943.84529
3560 26.461368 -6416.9215 0 -6144.4038 -949.85421
3570 26.589909 -6417.7923 0 -6143.9509 -952.4142
3580 26.571701 -6417.1586 0 -6143.5047 -950.91786
3590 26.457553 -6415.5203 0 -6143.0419 -946.15799
3600 26.152924 -6411.8771 0 -6142.536 -936.34287
3610 25.775726 -6407.3369 0 -6141.8804 -924.82687
3620 25.669615 -6405.5446 0 -6141.181 -920.31405
3630 25.979632 -6408.0791 0 -6140.5227 -926.55443
3640 26.566078 -6413.4832 0 -6139.8872 -939.47522
3650 26.909929 -6416.5302 0 -6139.393 -946.35072
3660 26.724759 -6414.1411 0 -6138.9109 -940.38058
3670 26.421956 -6410.488 0 -6138.3762 -931.45156
3680 26.398581 -6409.6852 0 -6137.8142 -929.35818
3690 26.571093 -6410.9147 0 -6137.2671 -932.30065
3700 26.652116 -6411.194 0 -6136.7119 -933.3307
3710 26.591296 -6410.0544 0 -6136.1987 -931.01464
3720 26.536195 -6408.9585 0 -6135.6702 -928.38906
3730 26.508798 -6408.1755 0 -6135.1694 -925.86117
3740 26.462861 -6407.1721 0 -6134.639 -922.36984
3750 26.397047 -6405.9529 0 -6134.0977 -918.40406
3760 26.441038 -6405.7917 0 -6133.4834 -917.5207
3770 26.745497 -6408.2489 0 -6132.805 -923.15559
3780 27.041387 -6410.638 0 -6132.1469 -928.93182
3790 27.003103 -6409.6198 0 -6131.523 -927.08557
3800 26.811297 -6407.0724 0 -6130.9509 -921.49064
3810 26.74993 -6405.8938 0 -6130.4043 -918.72164
3820 26.795927 -6405.8497 0 -6129.8865 -918.36389
3830 26.820327 -6405.6002 0 -6129.3857 -917.30195
3840 26.781033 -6404.61 0 -6128.8002 -914.61209
3850 26.812615 -6404.3012 0 -6128.1661 -913.53658
3860 26.89712 -6404.5103 0 -6127.505 -913.76078
3870 26.922323 -6404.1069 0 -6126.842 -912.84013
3880 27.101213 -6405.3838 0 -6126.2766 -915.25469
3890 27.279626 -6406.7429 0 -6125.7983 -917.5866
3900 27.221817 -6405.6018 0 -6125.2525 -914.50773
3910 27.107351 -6403.8119 0 -6124.6414 -910.05769
3920 27.116841 -6403.2638 0 -6123.9956 -908.36736
3930 27.081747 -6402.2285 0 -6123.3218 -905.83791
3940 26.935403 -6400.0723 0 -6122.6727 -901.12718
3950 26.934802 -6399.4344 0 -6122.041 -899.91808
3960 27.238985 -6401.9825 0 -6121.4564 -905.50671
3970 27.502303 -6404.1848 0 -6120.9469 -910.11508
3980 27.430392 -6402.8753 0 -6120.378 -907.1389
3990 27.280815 -6400.7088 0 -6119.7519 -902.24647
4000 27.271626 -6399.937 0 -6119.0747 -900.07961
-Loop time of 297.534 on 4 procs for 4000 steps with 3456 atoms
+Loop time of 105.478 on 4 procs for 4000 steps with 3456 atoms
-Pair time (%) = 47.024 (15.8045)
-Neigh time (%) = 23.741 (7.97924)
-Comm time (%) = 52.1483 (17.5268)
-Outpt time (%) = 3.25944 (1.09548)
-Other time (%) = 171.362 (57.5939)
+Pair time (%) = 37.2541 (35.3192)
+Neigh time (%) = 16.1295 (15.2918)
+Comm time (%) = 9.43063 (8.94083)
+Outpt time (%) = 0.251205 (0.238158)
+Other time (%) = 42.4128 (40.21)
Nlocal: 864 ave 864 max 864 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 6741 ave 7924 max 5558 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 272272 ave 288060 max 256050 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 544544 ave 574446 max 513814 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 2178178
Ave neighs/atom = 630.26
Neighbor list builds = 400
Dangerous builds = 0
diff --git a/examples/USER/atc/two_temperature/cutout.screen b/examples/USER/atc/two_temperature/cutout.screen
index ac474d840..7a5a42202 100644
--- a/examples/USER/atc/two_temperature/cutout.screen
+++ b/examples/USER/atc/two_temperature/cutout.screen
@@ -1,278 +1,279 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units metal
variable INF equal 1000
variable T equal 20
atom_style atomic
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region FE block -8 8 -6 6 0 3
region MD block -7 7 -6 0 0 3
region FREE block -4 4 -6 0 0 3
boundary f f p
# create atoms
#create_box 1 FE
#create_atoms 1 region MD
#group internal region FREE
#mass 1 39.95
#read_data cutout.data
#pair_coeff * * .238 3.405 13.5
#velocity internal create 40 87287 mom yes loop geom
#fix NVE internal nve
#thermo 100
#dump CONFIG all atom 100 cutout.dump
##run 1000
#unfix NVE
#write_restart cutout.rst
pair_style lj/cut 13.5
read_data cutout.data
Reading data file ...
orthogonal box = (-43.24 -32.43 0) to (43.24 32.43 16.215)
2 by 2 by 1 MPI processor grid
1008 atoms
1008 velocities
group internal region FREE
576 atoms in group internal
group ghost subtract all internal
432 atoms in group ghost
timestep 0.002
thermo 20
# allow initial state to relax
fix NVT internal nvt temp $T $T 10 drag 0.2
fix NVT internal nvt temp 20 $T 10 drag 0.2
fix NVT internal nvt temp 20 20 10 drag 0.2
fix RESCALE internal temp/rescale 25 $T $T 0.05 1.0
fix RESCALE internal temp/rescale 25 20 $T 0.05 1.0
fix RESCALE internal temp/rescale 25 20 20 0.05 1.0
run 200
Setting up run ...
Memory usage per processor = 2.20651 Mbytes
Step Temp E_pair E_mol TotEng Press
0 22.840119 -1789.5949 0 -1786.6219 -15765.333
20 13.566839 -1788.3853 0 -1786.6194 -15277.27
40 33.553913 -1791.7417 0 -1787.3741 -14707.846
60 19.256223 -1794.1032 0 -1791.5967 -14029.132
80 13.368297 -1796.2574 0 -1794.5173 -13523.457
100 11.42006 -1798.2698 0 -1796.7833 -13103.079
120 21.491111 -1799.819 0 -1797.0216 -12688.96
140 16.977999 -1801.1896 0 -1798.9797 -12265.345
160 13.938224 -1802.0525 0 -1800.2382 -11790.033
180 12.23396 -1802.7 0 -1801.1076 -11276.872
200 11.42006 -1803.1286 0 -1801.6421 -10730.804
-Loop time of 8.50337 on 4 procs for 200 steps with 1008 atoms
+Loop time of 0.502778 on 4 procs for 200 steps with 1008 atoms
-Pair time (%) = 0.668509 (7.86169)
+Pair time (%) = 0.237499 (47.2372)
Neigh time (%) = 0 (0)
-Comm time (%) = 4.23724 (49.8301)
-Outpt time (%) = 0.237265 (2.79024)
-Other time (%) = 3.36036 (39.518)
+Comm time (%) = 0.253378 (50.3956)
+Outpt time (%) = 0.000604033 (0.120139)
+Other time (%) = 0.0112978 (2.24707)
Nlocal: 252 ave 504 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 1368 ave 1656 max 1080 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 36492 ave 74116 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 145968
Ave neighs/atom = 144.81
Neighbor list builds = 0
Dangerous builds = 0
unfix RESCALE
run 800
Setting up run ...
Memory usage per processor = 2.20651 Mbytes
Step Temp E_pair E_mol TotEng Press
200 11.42006 -1803.1286 0 -1801.6421 -10730.804
220 12.634668 -1803.4525 0 -1801.8079 -10188.88
240 12.389545 -1803.5125 0 -1801.8998 -9656.8881
260 11.317877 -1803.4182 0 -1801.945 -9236.1616
280 9.7270274 -1803.2416 0 -1801.9754 -8947.2355
300 7.9370805 -1803.0419 0 -1802.0087 -8750.7074
320 6.4067491 -1802.861 0 -1802.027 -8623.9069
340 5.3573492 -1802.7311 0 -1802.0338 -8577.8953
360 4.9188235 -1802.6872 0 -1802.0469 -8637.0036
380 4.8156229 -1802.6667 0 -1802.0399 -8806.2763
400 5.0090105 -1802.6545 0 -1802.0025 -9077.449
420 5.6421616 -1802.6821 0 -1801.9477 -9435.9659
440 6.5180667 -1802.7415 0 -1801.8931 -9843.0718
460 7.8021978 -1802.8463 0 -1801.8307 -10243.525
480 9.1986451 -1802.9578 0 -1801.7604 -10581.685
500 10.560896 -1803.0497 0 -1801.675 -10833.653
520 11.604474 -1803.1302 0 -1801.6197 -11011.347
540 11.844791 -1803.1128 0 -1801.571 -11122.58
560 11.304866 -1803.0402 0 -1801.5687 -11161.742
580 9.8313387 -1802.8722 0 -1801.5925 -11124.258
600 7.7333706 -1802.6641 0 -1801.6575 -11030.299
620 5.3793592 -1802.408 0 -1801.7078 -10901.73
640 3.3272825 -1802.1725 0 -1801.7394 -10761.774
660 2.0314815 -1802.0222 0 -1801.7578 -10622.656
680 2.0077988 -1802.0353 0 -1801.7739 -10487.867
700 3.3843921 -1802.2247 0 -1801.7842 -10372.664
720 5.9780298 -1802.565 0 -1801.7869 -10302.637
740 9.0173322 -1802.9596 0 -1801.7858 -10280.842
760 11.766779 -1803.3181 0 -1801.7865 -10288.676
780 13.733393 -1803.5291 0 -1801.7415 -10302.17
800 14.164962 -1803.566 0 -1801.7222 -10302.618
820 12.863097 -1803.4368 0 -1801.7625 -10272.719
840 10.393884 -1803.1903 0 -1801.8374 -10192.543
860 7.4184997 -1802.8426 0 -1801.877 -10058.512
880 4.3613644 -1802.4882 0 -1801.9205 -9897.1119
900 2.2361845 -1802.2402 0 -1801.9491 -9736.3308
920 1.7719305 -1802.1979 0 -1801.9672 -9590.9833
940 2.9237629 -1802.3563 0 -1801.9757 -9472.0013
960 5.061993 -1802.6395 0 -1801.9806 -9381.0823
980 7.6242849 -1802.9731 0 -1801.9807 -9319.9173
1000 10.04544 -1803.2677 0 -1801.9601 -9298.5324
-Loop time of 3.52358 on 4 procs for 800 steps with 1008 atoms
+Loop time of 2.04672 on 4 procs for 800 steps with 1008 atoms
-Pair time (%) = 1.13774 (32.2892)
+Pair time (%) = 0.97197 (47.4891)
Neigh time (%) = 0 (0)
-Comm time (%) = 1.88566 (53.5154)
-Outpt time (%) = 0.00261962 (0.0743455)
-Other time (%) = 0.497567 (14.1211)
+Comm time (%) = 1.03118 (50.3822)
+Outpt time (%) = 0.00185549 (0.0906569)
+Other time (%) = 0.0417113 (2.03796)
Nlocal: 252 ave 504 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 1368 ave 1656 max 1080 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 37230.2 ave 75593 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 148921
Ave neighs/atom = 147.739
Neighbor list builds = 0
Dangerous builds = 0
unfix NVT
# ID group atc PhysicsType ParameterFile
fix AtC internal atc two_temperature Ar_ttm.mat
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: WARNING: material units real do not match lammps
ATC: WARNING: material units real do not match lammps
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: WARNING: material units real do not match lammps
ATC: WARNING: material units real do not match lammps
ATC: 2 materials defined from Ar_ttm.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 8 6 1 FE f f p
ATC: created uniform mesh with 126 nodes, 63 unique nodes, and 48 elements
fix_modify AtC mesh create_elementset wire -4 4 -INF 0 -INF INF
ATC: created elementset wire with 12 elements
fix_modify AtC mesh create_nodeset gap -4 4 -0 INF -INF INF
ATC: created nodeset gap with 20 nodes
fix_modify AtC mesh create_elementset gap -4 4 -0 INF -INF INF
ATC: created elementset gap with 12 elements
fix_modify AtC mesh delete_elements gap
fix_modify AtC mesh create_faceset bndy box -4 4 -INF 0 -INF INF
ATC: created faceset bndy with 10 faces
fix_modify AtC control thermal flux faceset bndy
# fix a temperature
fix_modify AtC initial temperature all 20.0
fix_modify AtC initial electron_temperature all 30.0
fix_modify AtC initial temperature gap 0.0
# relaxation
thermo_style custom step cpu f_AtC[1] f_AtC[2] f_AtC[3] f_AtC[4]
fix_modify AtC output cutoutFE 10 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC extrinsic electron_integration implicit
# heating
fix_modify AtC mesh create_nodeset lbc -8 -8 -INF INF -INF INF
ATC: created nodeset lbc with 7 nodes
fix_modify AtC mesh create_nodeset rbc 8 8 -INF INF -INF INF
ATC: created nodeset rbc with 7 nodes
fix_modify AtC fix electron_temperature lbc 20.
fix_modify AtC fix electron_temperature rbc 20.
fix_modify AtC source electron_temperature wire 0.001
run 200
Setting up run ...
Memory usage per processor = 52.1308 Mbytes
Step CPU AtC[1] AtC[2] AtC[3] AtC[4]
1000 0 7.5905384e-06 13.650794 1.7918648e-05 30
- 1020 0.42264199 8.0867497e-06 14.386397 0.00011143616 168.06236
- 1040 0.89445806 8.2236256e-06 14.569133 0.00020569969 308.34605
- 1060 1.512279 7.9547417e-06 14.139358 0.00029996263 448.62886
- 1080 2.0000911 7.47106e-06 13.387177 0.00039422497 588.91078
- 1100 2.334769 6.9291851e-06 12.597525 0.00048848671 729.19182
- 1120 2.6742702 6.4666101e-06 11.970788 0.00058274785 869.47196
- 1140 3.0125241 6.1269287e-06 11.536337 0.0006770084 1009.7512
- 1160 3.3478191 5.9463401e-06 11.304155 0.00077126834 1150.0296
- 1180 4.02788 5.7757317e-06 11.035914 0.0008655277 1290.307
- 1200 4.612457 5.6534832e-06 10.819941 0.00095978645 1430.5836
-Loop time of 4.61523 on 4 procs for 200 steps with 1008 atoms
+ 1020 0.33080316 8.0867497e-06 14.386397 0.00011143616 168.06236
+ 1040 0.65827703 8.2236256e-06 14.569133 0.00020569969 308.34605
+ 1060 0.984514 7.9547417e-06 14.139358 0.00029996263 448.62886
+ 1080 1.3105199 7.47106e-06 13.387177 0.00039422497 588.91078
+ 1100 1.637655 6.9291851e-06 12.597525 0.00048848671 729.19182
+ 1120 1.964129 6.4666101e-06 11.970788 0.00058274785 869.47196
+ 1140 2.290158 6.1269287e-06 11.536337 0.0006770084 1009.7512
+ 1160 2.6155221 5.9463401e-06 11.304155 0.00077126834 1150.0296
+ 1180 2.941644 5.7757317e-06 11.035914 0.0008655277 1290.307
+ 1200 3.2674952 5.6534832e-06 10.819941 0.00095978645 1430.5836
+Loop time of 3.27024 on 4 procs for 200 steps with 1008 atoms
-Pair time (%) = 0.437437 (9.47811)
+Pair time (%) = 0.373692 (11.4271)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.583825 (12.65)
-Outpt time (%) = 0.0544528 (1.17985)
-Other time (%) = 3.53952 (76.6921)
+Comm time (%) = 0.390792 (11.9499)
+Outpt time (%) = 0.0358569 (1.09646)
+Other time (%) = 2.4699 (75.5265)
Nlocal: 252 ave 504 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 1368 ave 1656 max 1080 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 37569 ave 75414 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 75138 ave 150278 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 300552
Ave neighs/atom = 298.167
Neighbor list builds = 0
Dangerous builds = 0
# relaxation
fix_modify AtC remove_source electron_temperature wire
run 200
Setting up run ...
Memory usage per processor = 52.1308 Mbytes
Step CPU AtC[1] AtC[2] AtC[3] AtC[4]
1200 0 5.6534832e-06 10.819941 0.00095978645 1430.5836
- 1220 0.39391184 5.6247016e-06 10.745001 0.0009597804 1430.5746
- 1240 0.98758292 5.6705058e-06 10.77004 0.00095977436 1430.5656
- 1260 1.461138 5.9348763e-06 11.132668 0.00095976831 1430.5566
- 1280 1.794466 6.3878919e-06 11.792006 0.00095976227 1430.5477
- 1300 2.124989 6.8588119e-06 12.489994 0.00095975623 1430.5387
- 1320 2.46228 7.3682728e-06 13.289603 0.00095975019 1430.5297
- 1340 2.8012109 7.8680354e-06 14.125224 0.00095974416 1430.5207
- 1360 3.1344459 8.1759187e-06 14.694182 0.00095973813 1430.5117
- 1380 3.47153 8.187909e-06 14.802618 0.0009597321 1430.5028
- 1400 3.8077469 7.7666161e-06 14.187723 0.00095972607 1430.4938
-Loop time of 3.81041 on 4 procs for 200 steps with 1008 atoms
+ 1220 0.33050895 5.6247016e-06 10.745001 0.0009597804 1430.5746
+ 1240 0.65727401 5.6705058e-06 10.77004 0.00095977436 1430.5656
+ 1260 0.98301888 5.9348763e-06 11.132668 0.00095976831 1430.5566
+ 1280 1.308939 6.3878919e-06 11.792006 0.00095976227 1430.5477
+ 1300 1.6347151 6.8588119e-06 12.489994 0.00095975623 1430.5387
+ 1320 1.9612989 7.3682728e-06 13.289603 0.00095975019 1430.5297
+ 1340 2.2869849 7.8680354e-06 14.125224 0.00095974416 1430.5207
+ 1360 2.611145 8.1759187e-06 14.694182 0.00095973813 1430.5117
+ 1380 2.9367969 8.187909e-06 14.802618 0.0009597321 1430.5028
+ 1400 3.2621989 7.7666161e-06 14.187723 0.00095972607 1430.4938
+Loop time of 3.2649 on 4 procs for 200 steps with 1008 atoms
-Pair time (%) = 0.410787 (10.7806)
+Pair time (%) = 0.370451 (11.3465)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.46719 (12.2609)
-Outpt time (%) = 0.0359789 (0.944226)
-Other time (%) = 2.89646 (76.0143)
+Comm time (%) = 0.385387 (11.8039)
+Outpt time (%) = 0.0357532 (1.09508)
+Other time (%) = 2.47331 (75.7545)
Nlocal: 252 ave 504 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Nghost: 1368 ave 1656 max 1080 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 37178.8 ave 74546 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 74357.5 ave 148715 max 0 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 297430
Ave neighs/atom = 295.069
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/two_temperature/gaussianIC_ttm.screen b/examples/USER/atc/two_temperature/gaussianIC_ttm.screen
index 1aecc5610..75c5295c4 100644
--- a/examples/USER/atc/two_temperature/gaussianIC_ttm.screen
+++ b/examples/USER/atc/two_temperature/gaussianIC_ttm.screen
@@ -1,168 +1,169 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3,
# where N = 4 for fcc,
# s = 3.405 A (Wagner)
# a = 5.25 A (Ashcroft & Mermin, p. 70)
# to create restart :
# write_restart temp.bin
# then : restart2data temp.bin temp.init
#if {restart}
boundary f p p
pair_style lj/cut 13.5
read_data temp.init
Reading data file ...
orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
4 by 1 by 1 MPI processor grid
3456 atoms
3456 velocities
#endif
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region feRegion block -10 10 -3 3 -3 3
region mdRegion block -12 12 -3 3 -3 3
region mdInternal block -10 10 -3 3 -3 3
# create atoms, NOTE commented out for restart
#if !{restart}
#boundary f p p
#create_box 1 mdRegion
#create_atoms 1 region mdRegion
#mass 1 39.95
#pair_style lj/cut 13.5
#pair_coeff 1 1 .238 3.405 13.5
#velocity internal create 40 87287 mom yes loop geom
#endif
# specify interal/ghost atoms
group internal region mdInternal
2880 atoms in group internal
# do not define ghosts if outside fe region
#group ghost subtract all internal
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# ID group atc PhysicsType ParameterFile
fix AtC internal atc two_temperature Ar_ttm.mat
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 10 1 1 feRegion f p p
ATC: created uniform mesh with 44 nodes, 11 unique nodes, and 10 elements
# fix a temperature
fix_modify AtC fix temperature all 20.0
fix_modify AtC initial temperature all 20.0
fix_modify AtC initial electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
fix_modify AtC fix electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
# turn on thermostat
fix_modify AtC extrinsic exchange off
fix_modify AtC control thermal rescale 10
# equilibrate MD field
timestep 5.0
#timestep 0.1
thermo 10
#if !{restart}
#run 1000
#endif
# write restart file (for atoms)
#if !{restart}
#write_restart gaussianT0.dat
#endif
#output
fix_modify AtC output gaussianIC_ttmFE 10 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
# change thermostat
fix_modify AtC unfix temperature all
fix_modify AtC unfix electron_temperature all
fix_modify AtC control thermal flux
fix_modify AtC extrinsic exchange on
fix_modify AtC extrinsic electron_integration explicit 10
# run with FE
thermo_style custom step temp pe f_AtC[2] f_AtC[4]
reset_timestep 0
run 400
Setting up run ...
Memory usage per processor = 57.2223 Mbytes
Step Temp PotEng AtC[2] AtC[4]
0 16.671491 -6505.7593 20 21.852118
10 16.677473 -6505.5427 20.002889 21.837729
20 16.576343 -6504.1927 19.867968 21.822852
30 16.542988 -6503.5347 19.830499 21.807341
40 16.606289 -6503.9099 19.949187 21.792289
50 16.657212 -6504.1497 20.064794 21.778216
60 16.632306 -6503.6285 20.04415 21.764548
70 16.575792 -6502.7759 19.922657 21.750393
80 16.582942 -6502.5564 19.85354 21.735697
90 16.619478 -6502.6712 19.841821 21.721009
100 16.61417 -6502.3556 19.821932 21.706419
110 16.630014 -6502.2516 19.867656 21.692093
120 16.693128 -6502.6546 19.982069 21.678641
130 16.690728 -6502.3949 19.998086 21.665838
140 16.614054 -6501.3545 19.912572 21.652659
150 16.610384 -6501.0503 19.92245 21.63913
160 16.722801 -6501.9756 20.080186 21.626412
170 16.770605 -6502.2507 20.171452 21.614843
180 16.650901 -6500.7763 20.054669 21.603093
190 16.541463 -6499.3809 19.906639 21.590191
200 16.645253 -6500.2037 19.963942 21.577114
210 16.869564 -6502.3 20.16097 21.565481
220 16.964432 -6503.0598 20.255544 21.55519
230 16.911666 -6502.3323 20.237187 21.545107
240 16.817088 -6501.156 20.182306 21.534699
250 16.768753 -6500.4538 20.137553 21.523975
260 16.815333 -6500.7346 20.155564 21.51332
270 16.910106 -6501.5013 20.223111 21.503193
280 16.977575 -6502.0376 20.291942 21.49369
290 16.956748 -6501.627 20.290033 21.484478
300 16.835354 -6500.2122 20.163353 21.474677
310 16.719943 -6498.8256 20.003858 21.463706
320 16.691075 -6498.3204 19.931873 21.451971
330 16.761802 -6498.8518 20.011315 21.440557
340 16.869104 -6499.7468 20.168181 21.430357
350 16.984625 -6500.7698 20.339225 21.421572
360 17.123663 -6502.0535 20.526715 21.414273
370 17.19682 -6502.6982 20.622354 21.408133
380 17.078663 -6501.3555 20.478377 21.401648
390 16.828211 -6498.6205 20.179895 21.393129
400 16.644766 -6496.5243 19.968603 21.3825
-Loop time of 18.4436 on 4 procs for 400 steps with 3456 atoms
+Loop time of 9.70202 on 4 procs for 400 steps with 3456 atoms
-Pair time (%) = 3.74164 (20.2869)
-Neigh time (%) = 1.71663 (9.30746)
-Comm time (%) = 2.39567 (12.9891)
-Outpt time (%) = 0.0720797 (0.390811)
-Other time (%) = 10.5176 (57.0257)
+Pair time (%) = 3.57557 (36.8539)
+Neigh time (%) = 1.52964 (15.7662)
+Comm time (%) = 0.507245 (5.22824)
+Outpt time (%) = 0.0138204 (0.142449)
+Other time (%) = 4.07574 (42.0092)
Nlocal: 864 ave 864 max 864 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 6741 ave 7924 max 5558 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 272943 ave 288483 max 257454 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 545886 ave 575873 max 515774 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 2183544
Ave neighs/atom = 631.812
Neighbor list builds = 40
Dangerous builds = 0
diff --git a/examples/USER/atc/two_temperature/no_atoms.screen b/examples/USER/atc/two_temperature/no_atoms.screen
index 6140e4b8c..85b4459f7 100644
--- a/examples/USER/atc/two_temperature/no_atoms.screen
+++ b/examples/USER/atc/two_temperature/no_atoms.screen
@@ -1,202 +1,203 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
#units real
units metal
atom_style atomic
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region simRegion block -14 14 -3 3 -3 3
region feRegion block -12 12 -3 3 -3 3
# need to create atoms or lammps throws an error
region mdRegion block -12 12 -3 3 -3 3
boundary f p p
create_box 1 mdRegion
Created orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
4 by 1 by 1 MPI processor grid
mass 1 39.95 # need to keep this
atom_modify sort 0 1
region dummyRegion block -100 -99 -1 1 -1 1
group dummy region dummyRegion
0 atoms in group dummy
# ID group atc PhysicsType ParameterFile
fix AtC dummy atc two_temperature Cu_ttm.mat
ATC: constructing two_temperature coupling with parameter file Cu_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 1 materials defined from Cu_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 1 materials defined from Cu_ttm.mat
timestep 0.002
thermo 20
# ID part keywords nx ny nz region
fix_modify AtC mesh create 12 1 1 feRegion f p p
ATC: created uniform mesh with 52 nodes, 13 unique nodes, and 12 elements
# fix a temperature
fix_modify AtC initial temperature all 20.0
#fix_modify AtC initial electron_temperature all 30.0
fix_modify AtC initial electron_temperature all gaussian 0 0 0 1 0 0 5 20 20
# relaxation
thermo_style custom step cpu f_AtC[1] f_AtC[2] f_AtC[3] f_AtC[4]
fix_modify AtC output no_atomsFE 10 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
#fix_modify AtC extrinsic electron_integration subcycle 100
fix_modify AtC extrinsic electron_integration implicit
run 400
Setting up run ...
Memory usage per processor = 0.432198 Mbytes
Step CPU AtC[1] AtC[2] AtC[3] AtC[4]
0 0 59.94586 20 1.7847722 21.567177
- 20 0.51286197 59.95972 20.00454 1.770575 21.52456
- 40 3.5349412 59.97247 20.008795 1.7578608 21.370605
- 60 5.626349 59.983888 20.012606 1.7464745 21.232182
- 80 5.8213 59.994113 20.016019 1.7362775 21.108216
- 100 6.004406 60.00327 20.019076 1.7271457 20.997198
- 120 6.1875122 60.01147 20.021814 1.7189676 20.897776
- 140 6.3812881 60.018815 20.024266 1.7116438 20.808739
- 160 7.63975 60.025391 20.026462 1.7050849 20.729002
- 180 8.937978 60.031281 20.028429 1.6992111 20.657594
- 200 9.1152291 60.036556 20.030191 1.6939509 20.593644
- 220 9.2659261 60.04128 20.031768 1.6892401 20.536374
- 240 9.351284 60.045511 20.033181 1.6850213 20.485086
- 260 9.5723131 60.049299 20.034447 1.6812432 20.439154
- 280 9.656342 60.052692 20.035581 1.6778597 20.398021
- 300 9.7407582 60.05573 20.036596 1.6748297 20.361184
- 320 9.8237951 60.058451 20.037506 1.6721161 20.328194
- 340 9.9057951 60.060888 20.03832 1.6696859 20.298651
- 360 9.9871891 60.063071 20.03905 1.6675096 20.272193
- 380 10.070899 60.065025 20.039703 1.6655606 20.248499
- 400 10.151502 60.066775 20.040289 1.6638152 20.227279
-Loop time of 10.1472 on 4 procs for 400 steps with 0 atoms
+ 20 0.093083858 59.95972 20.00454 1.770575 21.52456
+ 40 0.18600297 59.97247 20.008795 1.7578608 21.370605
+ 60 0.27392006 59.983888 20.012606 1.7464745 21.232182
+ 80 0.35980105 59.994113 20.016019 1.7362775 21.108216
+ 100 0.44574904 60.00327 20.019076 1.7271457 20.997198
+ 120 0.53172183 60.01147 20.021814 1.7189676 20.897776
+ 140 0.61740303 60.018815 20.024266 1.7116438 20.808739
+ 160 0.70277095 60.025391 20.026462 1.7050849 20.729002
+ 180 0.78847384 60.031281 20.028429 1.6992111 20.657594
+ 200 0.87403202 60.036556 20.030191 1.6939509 20.593644
+ 220 0.95922804 60.04128 20.031768 1.6892401 20.536374
+ 240 1.0445669 60.045511 20.033181 1.6850213 20.485086
+ 260 1.1309168 60.049299 20.034447 1.6812432 20.439154
+ 280 1.214602 60.052692 20.035581 1.6778597 20.398021
+ 300 1.3014228 60.05573 20.036596 1.6748297 20.361184
+ 320 1.386945 60.058451 20.037506 1.6721161 20.328194
+ 340 1.4716001 60.060888 20.03832 1.6696859 20.298651
+ 360 1.5543559 60.063071 20.03905 1.6675096 20.272193
+ 380 1.6401329 60.065025 20.039703 1.6655606 20.248499
+ 400 1.7226529 60.066775 20.040289 1.6638152 20.227279
+Loop time of 1.72338 on 4 procs for 400 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000468552 (0.00461755)
-Outpt time (%) = 0.038277 (0.377217)
-Other time (%) = 10.1085 (99.6182)
+Comm time (%) = 0.000303209 (0.0175938)
+Outpt time (%) = 0.0183306 (1.06364)
+Other time (%) = 1.70475 (98.9188)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
# heating
fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC mesh create_nodeset rbc 11.9 12.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC fix electron_temperature lbc 20.
fix_modify AtC fix electron_temperature rbc 20.
#fix_modify AtC extrinsic exchange off
#fix_modify AtC fix temperature lbc 20.
#fix_modify AtC fix temperature rbc 20.
#fix_modify AtC extrinsic electron_integration lockstep
#fix_modify AtC source electron_temperature all 1000.0
fix_modify AtC source electron_temperature all 0.521981
run 400
Setting up run ...
Memory usage per processor = 0.432198 Mbytes
Step CPU AtC[1] AtC[2] AtC[3] AtC[4]
400 0 60.066775 20.040289 1.6638152 20.227279
- 420 0.09581995 60.074057 20.042563 1.7526734 21.206964
- 440 0.19161606 60.08642 20.046435 1.7697616 21.398727
- 460 0.28751802 60.099602 20.050578 1.7726213 21.43082
- 480 0.38343 60.112889 20.054768 1.7731138 21.436346
- 500 0.4793241 60.126162 20.058968 1.7732124 21.437452
- 520 0.57561994 60.139402 20.063168 1.7732452 21.437821
- 540 0.67192292 60.152606 20.067367 1.773267 21.438066
- 560 0.76804209 60.165773 20.071564 1.7732869 21.438289
- 580 0.86413407 60.178904 20.075757 1.7733063 21.438507
- 600 0.96042204 60.191997 20.079946 1.7733256 21.438723
- 620 1.0565081 60.205055 20.084131 1.7733447 21.438937
- 640 1.152534 60.218075 20.08831 1.7733637 21.43915
- 660 1.248451 60.23106 20.092484 1.7733825 21.439362
- 680 1.34378 60.244008 20.096653 1.7734013 21.439572
- 700 1.439183 60.256919 20.100815 1.7734199 21.439781
- 720 1.533103 60.269795 20.10497 1.7734384 21.439989
- 740 1.6269159 60.282635 20.109119 1.7734568 21.440195
- 760 1.720458 60.295439 20.11326 1.7734751 21.4404
- 780 1.8143139 60.308207 20.117395 1.7734932 21.440604
- 800 1.9079239 60.320939 20.121522 1.7735113 21.440807
-Loop time of 1.90864 on 4 procs for 400 steps with 0 atoms
+ 420 0.095864058 60.074057 20.042563 1.7526734 21.206964
+ 440 0.19254804 60.08642 20.046435 1.7697616 21.398727
+ 460 0.28919888 60.099602 20.050578 1.7726213 21.43082
+ 480 0.38318396 60.112889 20.054768 1.7731138 21.436346
+ 500 0.47909498 60.126162 20.058968 1.7732124 21.437452
+ 520 0.57548499 60.139402 20.063168 1.7732452 21.437821
+ 540 0.67198586 60.152606 20.067367 1.773267 21.438066
+ 560 0.76845694 60.165773 20.071564 1.7732869 21.438289
+ 580 0.86489606 60.178904 20.075757 1.7733063 21.438507
+ 600 0.95867586 60.191997 20.079946 1.7733256 21.438723
+ 620 1.052397 60.205055 20.084131 1.7733447 21.438937
+ 640 1.1451309 60.218075 20.08831 1.7733637 21.43915
+ 660 1.239929 60.23106 20.092484 1.7733825 21.439362
+ 680 1.336427 60.244008 20.096653 1.7734013 21.439572
+ 700 1.432924 60.256919 20.100815 1.7734199 21.439781
+ 720 1.5294719 60.269795 20.10497 1.7734384 21.439989
+ 740 1.6261199 60.282635 20.109119 1.7734568 21.440195
+ 760 1.7227199 60.295439 20.11326 1.7734751 21.4404
+ 780 1.8193939 60.308207 20.117395 1.7734932 21.440604
+ 800 1.9161029 60.320939 20.121522 1.7735113 21.440807
+Loop time of 1.91684 on 4 procs for 400 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000290334 (0.0152116)
-Outpt time (%) = 0.0181738 (0.952187)
-Other time (%) = 1.89018 (99.0326)
+Comm time (%) = 0.00028652 (0.0149475)
+Outpt time (%) = 0.0183779 (0.958762)
+Other time (%) = 1.89817 (99.0263)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
# relaxation
fix_modify AtC remove_source electron_temperature all
run 400
Setting up run ...
Memory usage per processor = 0.432198 Mbytes
Step CPU AtC[1] AtC[2] AtC[3] AtC[4]
800 0 60.320939 20.121522 1.7735113 21.440807
- 820 0.094663858 60.326208 20.123317 1.6666305 20.24139
- 840 0.19028497 60.326191 20.123452 1.6491438 20.045155
- 860 0.28605103 60.325301 20.123302 1.6462322 20.012481
- 880 0.38183498 60.324267 20.123096 1.6457454 20.007018
- 900 0.47761798 60.323212 20.122873 1.6456621 20.006083
- 920 0.57323003 60.322156 20.122641 1.6456459 20.005902
- 940 0.66837287 60.321102 20.122402 1.645641 20.005846
- 960 0.76329494 60.320051 20.122158 1.645638 20.005813
- 980 0.85846591 60.319003 20.121908 1.6456354 20.005783
- 1000 0.95354199 60.317957 20.121654 1.6456328 20.005754
- 1020 1.0488029 60.316914 20.121396 1.6456303 20.005726
- 1040 1.144012 60.315874 20.121135 1.6456279 20.005699
- 1060 1.2391 60.314837 20.120871 1.6456255 20.005672
- 1080 1.3342969 60.313803 20.120603 1.6456231 20.005645
- 1100 1.429821 60.312771 20.120334 1.6456208 20.005619
- 1120 1.525784 60.311742 20.120061 1.6456185 20.005593
- 1140 1.6198239 60.310716 20.119787 1.6456162 20.005568
- 1160 1.713886 60.309693 20.119511 1.645614 20.005543
- 1180 1.8080029 60.308673 20.119234 1.6456118 20.005519
- 1200 1.9020278 60.307655 20.118954 1.6456097 20.005495
-Loop time of 1.90272 on 4 procs for 400 steps with 0 atoms
+ 820 0.094342947 60.326208 20.123317 1.6666305 20.24139
+ 840 0.18799996 60.326191 20.123452 1.6491438 20.045155
+ 860 0.28284502 60.325301 20.123302 1.6462322 20.012481
+ 880 0.37942195 60.324267 20.123096 1.6457454 20.007018
+ 900 0.47597599 60.323212 20.122873 1.6456621 20.006083
+ 920 0.5715971 60.322156 20.122641 1.6456459 20.005902
+ 940 0.66542196 60.321102 20.122402 1.645641 20.005846
+ 960 0.75967312 60.320051 20.122158 1.645638 20.005813
+ 980 0.85646296 60.319003 20.121908 1.6456354 20.005783
+ 1000 0.95331907 60.317957 20.121654 1.6456328 20.005754
+ 1020 1.049902 60.316914 20.121396 1.6456303 20.005726
+ 1040 1.1454291 60.315874 20.121135 1.6456279 20.005699
+ 1060 1.2420609 60.314837 20.120871 1.6456255 20.005672
+ 1080 1.3387589 60.313803 20.120603 1.6456231 20.005645
+ 1100 1.4359031 60.312771 20.120334 1.6456208 20.005619
+ 1120 1.5327749 60.311742 20.120061 1.6456185 20.005593
+ 1140 1.6294301 60.310716 20.119787 1.6456162 20.005568
+ 1160 1.7249069 60.309693 20.119511 1.645614 20.005543
+ 1180 1.8187959 60.308673 20.119234 1.6456118 20.005519
+ 1200 1.9112771 60.307655 20.118954 1.6456097 20.005495
+Loop time of 1.91197 on 4 procs for 400 steps with 0 atoms
Pair time (%) = 0 (0)
Neigh time (%) = 0 (0)
-Comm time (%) = 0.000293195 (0.0154092)
-Outpt time (%) = 0.0181384 (0.953286)
-Other time (%) = 1.88429 (99.0313)
+Comm time (%) = 0.000288725 (0.0151009)
+Outpt time (%) = 0.0183105 (0.957682)
+Other time (%) = 1.89337 (99.0272)
Nlocal: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 0 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Total # of neighbors = 0
Neighbor list builds = 0
Dangerous builds = 0
diff --git a/examples/USER/atc/two_temperature/restart.screen b/examples/USER/atc/two_temperature/restart.screen
index 89c8a041d..2ae61ab64 100644
--- a/examples/USER/atc/two_temperature/restart.screen
+++ b/examples/USER/atc/two_temperature/restart.screen
@@ -1,158 +1,160 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Reading data file ...
orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
4 by 1 by 1 MPI processor grid
3456 atoms
3456 velocities
Lattice spacing in x,y,z = 5.405 5.405 5.405
2880 atoms in group internal
576 atoms in group ghost
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
ATC: created uniform mesh with 60 nodes, 15 unique nodes, and 14 elements
Setting up run ...
-Memory usage per processor = 97.9907 Mbytes
+Memory usage per processor = 55.2173 Mbytes
Step Temp E_pair E_mol TotEng Press
0 16.671491 -6505.7593 0 -6334.0647 -1236.2423
100 16.671491 -6501.3833 0 -6329.6886 -1223.1536
200 16.671491 -6500.6894 0 -6328.9948 -1219.3362
300 16.671491 -6503.1069 0 -6331.4122 -1227.3602
400 16.671491 -6500.6574 0 -6328.9628 -1220.86
500 16.671491 -6502.4882 0 -6330.7935 -1225.3148
600 16.671491 -6505.0003 0 -6333.3057 -1232.9704
700 16.671491 -6501.3022 0 -6329.6075 -1221.089
800 16.671491 -6503.8814 0 -6332.1868 -1228.9533
900 16.671491 -6505.846 0 -6334.1514 -1235.4657
1000 16.671491 -6504.4261 0 -6332.7314 -1231.2716
-Loop time of 37.7773 on 4 procs for 1000 steps with 3456 atoms
+Loop time of 21.6885 on 4 procs for 1000 steps with 3456 atoms
-Pair time (%) = 10.8992 (28.8511)
-Neigh time (%) = 4.99517 (13.2227)
-Comm time (%) = 6.46988 (17.1264)
-Outpt time (%) = 0.0506067 (0.13396)
-Other time (%) = 15.3625 (40.6659)
+Pair time (%) = 8.96213 (41.3221)
+Neigh time (%) = 3.83331 (17.6744)
+Comm time (%) = 1.81188 (8.35411)
+Outpt time (%) = 0.000838339 (0.00386537)
+Other time (%) = 7.08033 (32.6456)
Nlocal: 864 ave 864 max 864 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 6741 ave 7924 max 5558 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 273177 ave 289116 max 257307 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 546354 ave 576160 max 516664 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 2185418
Ave neighs/atom = 632.355
Neighbor list builds = 100
Dangerous builds = 0
ATC: created faceset bndy with 2 faces
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc with 1 nodes
Setting up run ...
-Memory usage per processor = 102.974 Mbytes
+Memory usage per processor = 60.2008 Mbytes
Step Temp E_pair E_mol TotEng Press
0 16.671491 -6504.4261 0 -6332.7314 -1231.2716
100 16.530548 -6502.2979 0 -6332.0547 -1225.9982
200 16.768382 -6503.3792 0 -6330.6867 -1227.3237
300 16.645261 -6500.2867 0 -6328.8622 -1218.8568
400 16.895022 -6499.7419 0 -6325.7451 -1218.3147
500 17.025324 -6497.5028 0 -6322.1641 -1209.3964
600 17.357415 -6496.5551 0 -6317.7963 -1206.7087
700 17.318832 -6491.6971 0 -6313.3357 -1193.3844
800 17.899936 -6492.264 0 -6307.9179 -1191.1732
900 18.450923 -6492.0033 0 -6301.9828 -1190.2234
1000 18.293629 -6484.9144 0 -6296.5138 -1169.3319
1100 18.566253 -6481.8954 0 -6290.6872 -1161.7547
1200 18.884588 -6479.22 0 -6284.7334 -1152.6827
1300 19.428205 -6477.9973 0 -6277.9121 -1147.8183
1400 19.653142 -6473.9811 0 -6271.5793 -1136.5497
1500 19.9352 -6470.4382 0 -6265.1316 -1122.9541
1600 20.587115 -6470.6124 0 -6258.5919 -1122.3456
1700 20.433936 -6462.792 0 -6252.349 -1100.3298
1800 21.314998 -6465.4549 0 -6245.9382 -1104.9574
1900 21.353208 -6458.9075 0 -6238.9973 -1085.5335
2000 21.394021 -6453.327 0 -6232.9964 -1069.954
-Loop time of 235.783 on 4 procs for 2000 steps with 3456 atoms
+Loop time of 50.0521 on 4 procs for 2000 steps with 3456 atoms
-Pair time (%) = 26.6899 (11.3197)
-Neigh time (%) = 13.9674 (5.92386)
-Comm time (%) = 42.2094 (17.9018)
-Outpt time (%) = 0.572407 (0.242769)
-Other time (%) = 152.344 (64.6118)
+Pair time (%) = 18.3171 (36.5961)
+Neigh time (%) = 7.84265 (15.669)
+Comm time (%) = 3.58356 (7.15965)
+Outpt time (%) = 0.0244664 (0.0488819)
+Other time (%) = 20.2843 (40.5264)
Nlocal: 864 ave 864 max 864 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 6741 ave 7924 max 5558 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 272686 ave 287488 max 257348 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 545372 ave 575305 max 514897 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 2181486
Ave neighs/atom = 631.217
Neighbor list builds = 200
Dangerous builds = 0
System init for write_restart ...
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
ATC: created uniform mesh with 60 nodes, 15 unique nodes, and 14 elements
ATC: created faceset bndy with 2 faces
ATC: created nodeset lbc with 1 nodes
ATC: created nodeset rbc with 1 nodes
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
ATC: P0, found 3456 atoms in reference file
ATC: P0, read 3456 reference positions
-Memory usage per processor = 102.974 Mbytes
+Memory usage per processor = 60.2008 Mbytes
Step Temp E_pair E_mol TotEng Press
0 21.394021 -6453.327 0 -6232.9964 -1069.954
100 21.611528 -6449.5788 0 -6227.0081 -1058.3224
200 21.976031 -6447.3787 0 -6221.0542 -1050.4447
300 22.453535 -6446.5516 0 -6215.3094 -1047.2794
400 23.061538 -6447.4669 0 -6209.9631 -1048.3359
500 23.0435 -6441.8867 0 -6204.5687 -1031.0775
600 23.434674 -6439.8253 0 -6198.4787 -1023.8681
700 23.661242 -6436.051 0 -6192.371 -1012.9536
800 23.855535 -6432.3914 0 -6186.7104 -1002.6094
900 24.57972 -6434.1846 0 -6181.0454 -1005.6096
1000 24.591901 -6427.6437 0 -6174.3791 -986.79755
1100 24.564542 -6420.9496 0 -6167.9668 -967.60512
1200 25.124526 -6420.7193 0 -6161.9694 -965.13516
1300 25.451194 -6418.1572 0 -6156.043 -957.51898
1400 25.392119 -6411.6404 0 -6150.1346 -940.17651
1500 25.941448 -6411.8573 0 -6144.6941 -937.00901
1600 26.068719 -6407.9609 0 -6139.4871 -925.02968
1700 26.556302 -6407.3907 0 -6133.8954 -921.78016
1800 27.343301 -6410.2665 0 -6128.6661 -928.15556
1900 27.586019 -6407.6536 0 -6123.5535 -917.44798
2000 27.450662 -6401.9839 0 -6119.2778 -903.28749
-Loop time of 65.9952 on 4 procs for 2000 steps with 3456 atoms
+Loop time of 52.4423 on 4 procs for 2000 steps with 3456 atoms
-Pair time (%) = 19.756 (29.9355)
-Neigh time (%) = 8.36309 (12.6723)
-Comm time (%) = 7.43406 (11.2645)
-Outpt time (%) = 0.0658885 (0.0998383)
-Other time (%) = 30.3762 (46.0278)
+Pair time (%) = 18.6275 (35.52)
+Neigh time (%) = 7.95142 (15.1622)
+Comm time (%) = 4.52928 (8.6367)
+Outpt time (%) = 0.00900048 (0.0171626)
+Other time (%) = 21.325 (40.6639)
Nlocal: 864 ave 864 max 864 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 6741 ave 7924 max 5558 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 272377 ave 288250 max 256633 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 544754 ave 574451 max 514186 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 2179016
Ave neighs/atom = 630.502
Neighbor list builds = 200
Dangerous builds = 0
diff --git a/examples/USER/atc/two_temperature/uniform_exchange.screen b/examples/USER/atc/two_temperature/uniform_exchange.screen
index 7ea8ac787..eff514a07 100644
--- a/examples/USER/atc/two_temperature/uniform_exchange.screen
+++ b/examples/USER/atc/two_temperature/uniform_exchange.screen
@@ -1,617 +1,618 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
Lattice spacing in x,y,z = 5.405 5.405 5.405
Reading data file ...
orthogonal box = (-64.86 -16.215 -16.215) to (64.86 16.215 16.215)
4 by 1 by 1 MPI processor grid
3456 atoms
3456 velocities
3456 atoms in group internal
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
ATC: created uniform mesh with 20 nodes, 4 unique nodes, and 4 elements
Setting up run ...
Memory usage per processor = 55.3317 Mbytes
Step PotEng Temp AtC[2] AtC[4]
0 -6783.1469 40 20 30
10 -6735.22 35.347373 20 30
20 -6638.0676 13.590854 20 30
30 -6546.9613 16.073857 20 30
40 -6490.431 19.681958 20 30
50 -6479.6344 18.576331 20 30
60 -6478.1607 19.820313 20 30
70 -6466.4024 19.347063 20 30
80 -6460.4965 20.043544 20 30
90 -6475.7847 21.525054 20 30
100 -6506.4571 22.734929 20 30
110 -6537.5028 21.72233 20 30
120 -6560.5557 20.545507 20 30
130 -6574.1125 20.005789 20 30
140 -6580.4816 20.638888 20 30
150 -6583.1325 20.170952 20 30
160 -6585.5219 20.117764 20 30
170 -6590.0974 20.060397 20 30
180 -6596.3875 20.679965 20 30
190 -6600.9942 20.347234 20 30
200 -6601.4311 19.975895 20 30
210 -6598.8067 19.945866 20 30
220 -6595.9852 19.679031 20 30
230 -6595.1077 19.944269 20 30
240 -6595.9943 20.070388 20 30
250 -6596.6556 20.011201 20 30
260 -6595.7678 20.005789 20 30
270 -6593.2664 19.759981 20 30
280 -6589.8904 19.770089 20 30
290 -6586.5561 19.876762 20 30
300 -6583.355 19.976674 20 30
310 -6580.8402 19.728887 20 30
320 -6579.781 19.931828 20 30
330 -6579.6954 20.004298 20 30
340 -6579.3344 19.991891 20 30
350 -6577.9943 19.863213 20 30
360 -6576.2366 19.850666 20 30
370 -6575.6064 19.992817 20 30
380 -6577.2176 20.076185 20 30
390 -6580.379 20.005789 20 30
400 -6584.1107 20.372789 20 30
410 -6587.9805 20.271504 20 30
420 -6590.8266 20.093685 20 30
430 -6591.9592 20.011482 20 30
440 -6592.611 20.077122 20 30
450 -6593.5045 20.07691 20 30
460 -6593.8748 20.010686 20 30
470 -6593.217 19.98456 20 30
480 -6591.7933 19.843386 20 30
490 -6589.9573 19.837677 20 30
500 -6587.2689 19.832888 20 30
-Loop time of 15.8836 on 4 procs for 500 steps with 3456 atoms
+Loop time of 9.58745 on 4 procs for 500 steps with 3456 atoms
-Pair time (%) = 6.08595 (38.316)
-Neigh time (%) = 2.65869 (16.7386)
-Comm time (%) = 1.88057 (11.8397)
-Outpt time (%) = 0.146439 (0.921951)
-Other time (%) = 5.11194 (32.1838)
+Pair time (%) = 4.79318 (49.9943)
+Neigh time (%) = 2.06719 (21.5615)
+Comm time (%) = 0.506811 (5.2862)
+Outpt time (%) = 0.00355291 (0.037058)
+Other time (%) = 2.21671 (23.121)
Nlocal: 864 ave 864 max 864 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 7924 ave 7924 max 7924 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 287824 ave 289277 max 286558 min
Histogram: 1 1 0 0 0 0 0 1 0 1
FullNghs: 575647 ave 575980 max 575238 min
Histogram: 1 0 0 1 0 0 0 0 1 1
Total # of neighbors = 2302588
Ave neighs/atom = 666.258
Neighbor list builds = 50
Dangerous builds = 0
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
Setting up run ...
Memory usage per processor = 57.6419 Mbytes
Step PotEng Temp AtC[2] AtC[4]
500 -6587.2689 19.832888 20 30
510 -6583.6679 19.63388 19.99067 29.921403
520 -6580.4044 19.465899 19.964127 29.843272
530 -6578.0632 19.385556 19.929008 29.765503
540 -6576.7688 19.408521 19.894578 29.688066
550 -6577.5441 19.634385 19.875757 29.611022
560 -6580.0311 20.033796 19.890374 29.53457
570 -6582.692 20.453288 19.943612 29.459004
580 -6584.4988 20.792548 20.027892 29.384591
590 -6584.8106 20.986315 20.129173 29.311509
600 -6583.0642 20.973002 20.22873 29.239803
610 -6579.3187 20.764597 20.306625 29.16936
620 -6575.2098 20.510314 20.35374 29.099949
630 -6571.8246 20.325665 20.375584 29.031339
640 -6569.5494 20.242631 20.383183 28.96337
650 -6568.5339 20.279067 20.388292 28.895976
660 -6569.1807 20.481136 20.404722 28.82919
670 -6571.8804 20.888192 20.449466 28.763169
680 -6575.8853 21.427509 20.536803 28.698198
690 -6578.9633 21.878187 20.664173 28.634605
700 -6578.9118 22.022487 20.807267 28.572603
710 -6575.3783 21.818746 20.931312 28.51215
720 -6570.6353 21.492478 21.01549 28.452979
730 -6567.3963 21.301194 21.066664 28.39478
740 -6566.2643 21.309502 21.105617 28.337373
750 -6566.5396 21.457095 21.149722 28.280738
760 -6567.3538 21.656065 21.206898 28.224948
770 -6568.3366 21.872174 21.278393 28.170108
780 -6569.7079 22.12702 21.365289 28.116326
790 -6571.8911 22.460621 21.472163 28.063731
800 -6573.915 22.778466 21.601239 28.012488
810 -6573.25 22.833553 21.736319 27.962706
820 -6568.3888 22.472517 21.841823 27.914274
830 -6561.7616 21.926654 21.890086 27.866811
840 -6557.7119 21.62264 21.892222 27.81988
850 -6557.6645 21.705712 21.886316 27.773274
860 -6559.1067 21.93811 21.89967 27.727064
870 -6558.3139 21.958481 21.924594 27.681388
880 -6555.286 21.75308 21.935246 27.636218
890 -6553.5069 21.670604 21.929199 27.591405
900 -6554.6754 21.87395 21.931289 27.546912
910 -6557.3535 22.227867 21.961833 27.502902
920 -6559.804 22.562978 22.023052 27.459614
930 -6561.1035 22.790271 22.104812 27.417244
940 -6561.0754 22.886975 22.193563 27.375888
950 -6559.6583 22.843875 22.275637 27.335535
960 -6557.4925 22.726412 22.340854 27.296074
970 -6556.6435 22.73524 22.393663 27.257372
980 -6558.3713 22.994522 22.455738 27.219413
990 -6560.8396 23.32597 22.542517 27.182345
1000 -6561.3932 23.466887 22.643975 27.146328
1010 -6558.92 23.310436 22.733471 27.111357
1020 -6554.7313 22.978867 22.788548 27.077224
1030 -6551.9728 22.778202 22.811405 27.043641
1040 -6552.7121 22.918293 22.830752 27.010464
1050 -6555.4108 23.255183 22.874224 26.977793
1060 -6557.2332 23.507032 22.942583 26.945836
1070 -6557.3475 23.592787 23.019287 26.914715
1080 -6556.597 23.589642 23.091387 26.884426
1090 -6555.4951 23.5485 23.154448 26.854904
1100 -6553.7313 23.441062 23.204214 26.826055
1110 -6551.9517 23.328444 23.237874 26.797754
1120 -6551.0782 23.301201 23.26207 26.769892
1130 -6550.2773 23.281685 23.282808 26.742424
1140 -6549.0221 23.216408 23.297021 26.715309
1150 -6547.9388 23.165836 23.304078 26.688486
1160 -6547.5388 23.179809 23.308483 26.661913
1170 -6549.0771 23.386391 23.322795 26.635614
1180 -6552.9501 23.822462 23.368331 26.609757
1190 -6556.3527 24.216022 23.451529 26.584629
1200 -6556.0233 24.248397 23.546626 26.56043
1210 -6551.6739 23.885281 23.613811 26.53707
1220 -6546.3396 23.413344 23.631352 26.51421
1230 -6543.8694 23.21436 23.6148 26.491499
1240 -6545.2248 23.388954 23.60111 26.468824
1250 -6548.9978 23.804747 23.619657 26.446347
1260 -6552.0331 24.153533 23.675151 26.42436
1270 -6551.2447 24.13061 23.740189 26.403048
1280 -6546.9418 23.761463 23.77674 26.382311
1290 -6543.2503 23.442361 23.773669 26.361846
1300 -6544.0697 23.560895 23.762296 26.341452
1310 -6548.1889 24.004974 23.783494 26.321251
1320 -6550.8691 24.316798 23.840927 26.301545
1330 -6550.16 24.296092 23.904741 26.282495
1340 -6547.5804 24.091394 23.948994 26.264021
1350 -6545.5875 23.937077 23.970706 26.245937
1360 -6545.7935 23.992777 23.986104 26.228124
1370 -6547.9636 24.244838 24.016755 26.210627
1380 -6550.0271 24.487952 24.069589 26.193606
1390 -6550.748 24.602182 24.133807 26.177193
1400 -6549.5567 24.526749 24.193782 26.161407
1410 -6545.7348 24.189057 24.226461 26.146114
1420 -6541.8049 23.835114 24.220739 26.131029
1430 -6539.7085 23.656301 24.190819 26.115899
1440 -6539.9558 23.705239 24.158333 26.100628
1450 -6542.6224 23.996104 24.146799 26.085297
1460 -6546.255 24.38639 24.170746 26.070146
1470 -6548.5015 24.643848 24.224187 26.055442
1480 -6547.7415 24.610745 24.281882 26.04131
1490 -6545.2911 24.406157 24.319952 26.027667
1500 -6544.0033 24.311017 24.33879 26.014338
1510 -6545.1817 24.454182 24.359724 26.001255
1520 -6546.9716 24.656691 24.397463 25.988511
1530 -6547.337 24.722104 24.444177 25.976212
1540 -6546.4396 24.665666 24.485712 25.964361
1550 -6544.6031 24.515493 24.513107 25.952873
1560 -6542.0417 24.28654 24.519007 25.941602
1570 -6539.924 24.098546 24.503746 25.93037
1580 -6539.2427 24.051084 24.479094 25.919055
1590 -6540.47 24.188562 24.461792 25.907656
1600 -6543.5268 24.510003 24.469289 25.896308
1610 -6546.3182 24.810248 24.508235 25.885248
1620 -6544.9543 24.707466 24.552878 25.874633
1630 -6539.6863 24.21364 24.560345 25.864314
1640 -6535.4885 23.822158 24.521524 25.853923
1650 -6535.6525 23.850914 24.471295 25.84323
1660 -6537.9999 24.099212 24.442786 25.83231
1670 -6540.151 24.332666 24.440284 25.821366
1680 -6542.4466 24.5848 24.460451 25.810587
1690 -6544.8542 24.849339 24.503996 25.800154
1700 -6546.292 25.021301 24.564184 25.790224
1710 -6546.4347 25.065676 24.628133 25.780869
1720 -6545.9648 25.0447 24.685966 25.772068
1730 -6545.5871 25.030592 24.73665 25.763758
1740 -6544.4505 24.941939 24.77843 25.755877
1750 -6541.6712 24.688734 24.79902 25.748305
1760 -6539.0289 24.443447 24.7918 25.74083
1770 -6539.3176 24.483551 24.775654 25.733299
1780 -6542.0848 24.765192 24.779816 25.725774
1790 -6543.1928 24.886648 24.805159 25.718447
1800 -6540.1609 24.605258 24.818216 25.711348
1810 -6535.7937 24.18687 24.792665 25.704246
1820 -6534.2421 24.039417 24.741879 25.696869
1830 -6536.6369 24.282841 24.703222 25.689179
1840 -6539.9801 24.624828 24.700101 25.681396
1850 -6540.2477 24.668842 24.715536 25.673753
1860 -6538.3668 24.504142 24.720045 25.666255
1870 -6537.6209 24.445694 24.712456 25.65879
1880 -6538.6438 24.561108 24.709858 25.651336
1890 -6539.466 24.660386 24.719505 25.643975
1900 -6538.9182 24.624177 24.730114 25.636761
1910 -6538.628 24.614153 24.735921 25.629663
1920 -6540.1221 24.775355 24.749034 25.622688
1930 -6542.452 25.023855 24.78218 25.615953
1940 -6543.3433 25.134239 24.830292 25.609607
1950 -6541.5193 24.976984 24.869936 25.603669
1960 -6539.1628 24.760978 24.885117 25.597985
1970 -6539.2823 24.783511 24.889791 25.592402
1980 -6540.7963 24.942945 24.905989 25.586942
1990 -6540.3741 24.914612 24.927471 25.581689
2000 -6538.1889 24.712385 24.933358 25.576588
2010 -6536.9679 24.602662 24.922546 25.571493
2020 -6537.5036 24.661499 24.912017 25.566344
2030 -6538.3282 24.752622 24.910662 25.561191
2040 -6539.0384 24.830602 24.917314 25.556104
2050 -6539.3726 24.877447 24.92958 25.551136
2060 -6538.5177 24.805175 24.939349 25.546301
2070 -6536.9777 24.663063 24.936466 25.541529
2080 -6536.0953 24.583461 24.923169 25.536721
2090 -6535.7139 24.554377 24.906814 25.531831
2100 -6535.4232 24.532482 24.889551 25.526846
2110 -6535.7906 24.576113 24.874652 25.52177
2120 -6537.4405 24.750455 24.871846 25.516662
2130 -6540.6254 25.071775 24.893787 25.51167
2140 -6543.8757 25.408103 24.946696 25.507027
2150 -6544.8455 25.519156 25.016043 25.502922
2160 -6542.465 25.303874 25.07216 25.499358
2170 -6538.0696 24.88173 25.089735 25.496107
2180 -6534.4995 24.537123 25.067709 25.492839
2190 -6533.6382 24.451522 25.028139 25.48933
2200 -6535.3208 24.61732 24.998296 25.485564
2210 -6537.6097 24.846565 24.99231 25.481694
2220 -6538.0545 24.899869 25.000682 25.477883
2230 -6536.3515 24.74022 25.00117 25.474147
2240 -6534.7208 24.587265 24.984641 25.470368
2250 -6535.237 24.647544 24.965847 25.466464
2260 -6537.1641 24.843314 24.96326 25.462507
2270 -6538.6558 24.998814 24.978116 25.45864
2280 -6539.5707 25.09882 25.003003 25.454967
2290 -6540.1337 25.165771 25.033386 25.451545
2300 -6539.6374 25.128311 25.06263 25.448391
2310 -6537.488 24.929214 25.076593 25.445435
2320 -6535.5588 24.74455 25.069274 25.442517
2330 -6535.6453 24.756558 25.054734 25.439519
2340 -6537.6865 24.962281 25.053928 25.436478
2350 -6539.5064 25.147713 25.073602 25.433547
2360 -6538.9785 25.104766 25.097982 25.43083
2370 -6535.9938 24.819539 25.10214 25.428252
2380 -6533.2945 24.560338 25.077546 25.425598
2390 -6533.587 24.593173 25.045104 25.422718
2400 -6536.8933 24.921556 25.035318 25.419686
2410 -6541.0746 25.338335 25.064543 25.416767
2420 -6542.5816 25.499515 25.119582 25.414232
2430 -6540.063 25.264981 25.162836 25.412124
2440 -6536.9576 24.968217 25.172898 25.410228
2450 -6536.951 24.969343 25.168211 25.408342
2460 -6539.4419 25.214923 25.179043 25.406486
2470 -6541.1807 25.392519 25.210842 25.404828
2480 -6540.4123 25.32466 25.243707 25.403453
2490 -6538.0804 25.101895 25.257566 25.402274
2500 -6535.6554 24.86715 25.247508 25.401108
2510 -6534.4717 24.745229 25.221069 25.399792
2520 -6535.4275 24.836527 25.196548 25.398274
2530 -6538.0484 25.091529 25.192681 25.396655
2540 -6539.9593 25.283762 25.212446 25.395127
2550 -6538.2499 25.119891 25.23125 25.393786
2560 -6533.5145 24.658365 25.214545 25.392466
2570 -6530.2956 24.339781 25.159637 25.390847
2580 -6531.6565 24.468596 25.102612 25.38877
2590 -6536.4187 24.93345 25.083292 25.386406
2600 -6540.3305 25.323648 25.109487 25.384115
2610 -6539.7078 25.278655 25.14862 25.382134
2620 -6535.3812 24.864241 25.15787 25.380367
2630 -6531.6571 24.503499 25.126242 25.378503
2640 -6532.1378 24.548058 25.083351 25.376328
2650 -6536.513 24.978715 25.07096 25.373943
2660 -6541.0671 25.432836 25.105063 25.371683
2670 -6542.5346 25.593369 25.164579 25.369841
2680 -6541.3054 25.487925 25.21836 25.368472
2690 -6539.0338 25.274681 25.250359 25.367447
2700 -6536.9319 25.0701 25.258694 25.366576
2710 -6536.337 25.014183 25.253661 25.36571
2720 -6537.5684 25.134736 25.25396 25.364822
2730 -6538.7522 25.254802 25.267149 25.364002
2740 -6538.738 25.257132 25.284427 25.363317
2750 -6538.1195 25.200203 25.296109 25.362752
2760 -6538.4498 25.232578 25.305124 25.362266
2770 -6539.4183 25.327907 25.320942 25.36188
2780 -6539.5018 25.338484 25.340332 25.361643
2790 -6539.179 25.307552 25.355837 25.361546
2800 -6538.7423 25.263216 25.36689 25.361552
2810 -6536.8563 25.077085 25.366095 25.361603
2820 -6533.8446 24.780919 25.340443 25.361545
2830 -6532.5021 24.643626 25.295434 25.36119
2840 -6533.9932 24.78317 25.25683 25.360494
2850 -6536.148 24.990659 25.241027 25.359597
2860 -6536.449 25.019863 25.237977 25.358651
2870 -6535.2997 24.910209 25.22919 25.357671
2880 -6534.3565 24.818337 25.211284 25.356589
2890 -6533.5577 24.737242 25.187117 25.355346
2900 -6533.454 24.730052 25.160421 25.353908
2910 -6535.0653 24.887774 25.144195 25.352305
2920 -6537.6792 25.14913 25.150698 25.350682
2930 -6540.0654 25.391997 25.18162 25.349231
2940 -6540.3661 25.434011 25.223084 25.348094
2950 -6539.3637 25.343504 25.255387 25.34726
2960 -6539.8616 25.396876 25.28256 25.346653
2970 -6540.7425 25.489457 25.316563 25.346293
2980 -6539.5572 25.379368 25.346386 25.346198
2990 -6536.6805 25.103906 25.352834 25.346246
3000 -6534.4652 24.884147 25.333822 25.346228
3010 -6534.1671 24.849993 25.3055 25.346008
3020 -6534.8623 24.914858 25.283047 25.345587
3030 -6535.6612 24.993226 25.26938 25.34503
3040 -6537.6493 25.186591 25.269652 25.344424
3050 -6539.9926 25.420642 25.292463 25.343922
3060 -6539.7826 25.40483 25.323614 25.343656
3070 -6537.5109 25.184226 25.337515 25.343575
3080 -6535.6456 24.998435 25.329887 25.343505
3090 -6534.5985 24.892707 25.309812 25.343317
3100 -6534.1433 24.842633 25.284758 25.342946
3110 -6533.9749 24.823895 25.259178 25.342378
3120 -6534.0254 24.82424 25.235123 25.341619
3130 -6535.3169 24.949858 25.218497 25.3407
3140 -6538.8237 25.296997 25.227751 25.339758
3150 -6541.5395 25.569609 25.268148 25.339038
3160 -6541.2883 25.553388 25.315141 25.338689
3170 -6539.7281 25.407029 25.347478 25.338656
3180 -6538.5967 25.297385 25.364213 25.338806
3190 -6537.7426 25.212902 25.371095 25.339041
3200 -6535.9467 25.035126 25.365116 25.339278
3210 -6533.3 24.773081 25.337727 25.339378
3220 -6530.6338 24.504814 25.287305 25.339161
3230 -6529.1331 24.349644 25.220879 25.338472
3240 -6530.1991 24.446531 25.158679 25.337267
3250 -6534.3024 24.844155 25.127479 25.335701
3260 -6539.5426 25.358508 25.145934 25.334112
3270 -6541.5921 25.569561 25.198132 25.332851
3280 -6539.6223 25.390844 25.243113 25.332003
3290 -6537.2113 25.163678 25.261615 25.3314
3300 -6536.1615 25.065081 25.263657 25.330866
3310 -6535.8385 25.034668 25.260387 25.330326
3320 -6535.6703 25.021271 25.255639 25.329756
3330 -6535.8094 25.033268 25.251101 25.329153
3340 -6536.2748 25.082315 25.250385 25.328534
3350 -6536.6 25.112789 25.253728 25.327932
3360 -6536.7488 25.130726 25.258572 25.327369
3370 -6537.3855 25.194718 25.2668 25.326861
3380 -6538.1563 25.270292 25.281642 25.326449
3390 -6538.3249 25.290402 25.299512 25.326175
3400 -6537.5034 25.213495 25.313082 25.32603
3410 -6535.2381 24.994259 25.310262 25.32593
3420 -6533.2319 24.794826 25.286114 25.325714
3430 -6533.3393 24.798836 25.255413 25.325267
3440 -6535.442 25.00355 25.239243 25.324633
3450 -6537.9943 25.254933 25.248171 25.323985
3460 -6538.7605 25.331473 25.272125 25.323491
3470 -6537.7503 25.233914 25.290465 25.323174
3480 -6537.0843 25.169626 25.298438 25.322956
3490 -6537.1112 25.170227 25.303272 25.322785
3500 -6537.7614 25.234727 25.310985 25.322661
3510 -6538.2408 25.283021 25.324602 25.322626
3520 -6536.8595 25.147215 25.332622 25.322686
3530 -6533.7188 24.836621 25.316807 25.322715
3540 -6530.7734 24.540789 25.272189 25.322492
3550 -6529.7444 24.433841 25.212795 25.321842
3560 -6531.3469 24.584516 25.162556 25.320754
3570 -6534.0578 24.848326 25.13945 25.319392
3580 -6535.2758 24.97031 25.13723 25.317962
3590 -6535.1081 24.963417 25.138825 25.316549
3600 -6534.7802 24.935721 25.138272 25.315152
3610 -6534.3909 24.903612 25.134511 25.313748
3620 -6535.3477 25.002896 25.133519 25.312329
3630 -6538.679 25.334466 25.154688 25.310995
3640 -6541.4791 25.616481 25.20632 25.309976
3650 -6539.778 25.460699 25.258053 25.3094
3660 -6535.1377 25.010002 25.271212 25.309084
3670 -6532.6338 24.765367 25.247769 25.308698
3680 -6534.3079 24.929931 25.225525 25.30811
3690 -6537.9993 25.29482 25.233912 25.307474
3700 -6540.3433 25.529582 25.271624 25.307047
3710 -6539.9411 25.49804 25.313231 25.306954
3720 -6539.2002 25.430004 25.34382 25.307142
3730 -6539.2664 25.43645 25.369625 25.307543
3740 -6538.5567 25.365853 25.39078 25.308129
3750 -6536.2916 25.143206 25.395047 25.308812
3760 -6533.7851 24.8915 25.374724 25.309416
3770 -6532.7643 24.783965 25.339286 25.30978
3780 -6533.4489 24.842154 25.306126 25.309862
3790 -6535.0135 24.99142 25.287313 25.30974
3800 -6535.4923 25.037887 25.280918 25.309533
3810 -6533.585 24.848268 25.266669 25.309259
3820 -6531.8583 24.678118 25.233692 25.30879
3830 -6533.6312 24.850015 25.204527 25.30806
3840 -6538.33 25.310765 25.211531 25.307247
3850 -6542.574 25.736733 25.262559 25.306692
3860 -6542.5857 25.74801 25.329936 25.306642
3870 -6537.0829 25.215821 25.361756 25.307001
3880 -6532.1817 24.735661 25.336047 25.307348
3890 -6534.4809 24.953452 25.302545 25.307409
3900 -6540.4701 25.539895 25.318157 25.307401
3910 -6542.9599 25.792478 25.374045 25.307717
3920 -6540.5413 25.561212 25.421678 25.308463
3930 -6536.3122 25.147313 25.430381 25.309418
3940 -6533.6224 24.879511 25.404882 25.310273
3950 -6533.3474 24.842026 25.369272 25.310862
3960 -6533.7666 24.874339 25.338585 25.311184
3970 -6533.6879 24.86308 25.311849 25.311283
3980 -6533.244 24.816282 25.284336 25.311169
3990 -6533.259 24.815345 25.256556 25.310836
4000 -6534.5517 24.939521 25.237775 25.310319
4010 -6536.0792 25.09199 25.235683 25.30973
4020 -6535.8844 25.078142 25.240132 25.309169
4030 -6535.3555 25.027311 25.238438 25.308623
4040 -6537.1013 25.197763 25.243021 25.308079
4050 -6539.6199 25.449007 25.270042 25.307671
4060 -6540.3986 25.53177 25.310327 25.307547
4070 -6539.5084 25.451783 25.34529 25.307728
4080 -6538.1577 25.324203 25.365895 25.308122
4090 -6537.5593 25.267094 25.37547 25.308621
4100 -6537.8475 25.293 25.383723 25.309181
4110 -6537.8872 25.295677 25.393196 25.309808
4120 -6537.2625 25.231837 25.398449 25.310491
4130 -6536.0501 25.111081 25.394152 25.311171
4140 -6534.4893 24.954587 25.376477 25.311756
4150 -6533.6538 24.868584 25.348298 25.312146
4160 -6534.5523 24.956354 25.323523 25.312315
4170 -6536.6395 25.1572 25.316528 25.312359
4180 -6538.3119 25.32003 25.328083 25.312432
4190 -6538.8911 25.377 25.348712 25.312642
4200 -6537.9572 25.290203 25.365223 25.313004
4210 -6536.7708 25.173773 25.368577 25.313437
4220 -6537.2691 25.220267 25.368688 25.313867
4230 -6538.2886 25.321537 25.377852 25.314331
4240 -6537.9494 25.287647 25.389529 25.314884
4250 -6536.1194 25.109126 25.388466 25.315478
4260 -6534.3985 24.937076 25.3697 25.31598
4270 -6533.652 24.858539 25.341305 25.316282
4280 -6533.8805 24.875389 25.312936 25.316353
4290 -6535.9378 25.072133 25.297538 25.316245
4300 -6539.6662 25.437264 25.312419 25.316139
4310 -6541.739 25.643243 25.355427 25.316286
4320 -6539.0241 25.382743 25.389952 25.316764
4330 -6533.5044 24.842686 25.378465 25.317324
4340 -6529.9373 24.486833 25.323471 25.317585
4350 -6530.4701 24.528733 25.260972 25.317353
4360 -6533.7894 24.84545 25.224513 25.316728
4370 -6537.5181 25.209532 25.225722 25.315986
4380 -6539.6413 25.425422 25.254686 25.31539
4390 -6539.0509 25.374162 25.287811 25.315063
4400 -6536.1206 25.091172 25.299323 25.314919
4410 -6533.9566 24.879579 25.28389 25.314741
4420 -6534.7144 24.951511 25.264894 25.31441
4430 -6536.2656 25.104853 25.261386 25.313996
4440 -6536.1346 25.092335 25.264813 25.313599
4450 -6534.8926 24.974096 25.259499 25.3132
4460 -6535.0571 24.9926 25.249055 25.31273
4470 -6537.3839 25.220725 25.253034 25.312232
4480 -6540.2277 25.503927 25.282587 25.311879
4490 -6541.8456 25.66927 25.331216 25.311852
4500 -6541.0909 25.601422 25.378769 25.312218
4510 -6538.9712 25.396235 25.406706 25.312877
4520 -6537.3013 25.233011 25.413671 25.313655
4530 -6536.8398 25.183692 25.410637 25.31443
4540 -6536.3537 25.132273 25.404732 25.315164
4550 -6534.3097 24.929695 25.386714 25.315802
4560 -6531.8407 24.683304 25.347451 25.316203
4570 -6530.9144 24.583404 25.294813 25.316223
4580 -6532.7912 24.75696 25.252108 25.315855
4590 -6535.7514 25.045268 25.238033 25.315274
4600 -6537.6363 25.22973 25.248103 25.314699
4610 -6537.792 25.251127 25.266171 25.314255
4620 -6536.3985 25.117622 25.276006 25.313929
4630 -6534.5672 24.939852 25.268776 25.313611
4640 -6533.4329 24.828261 25.24834 25.313176
4650 -6533.8105 24.863909 25.226376 25.312567
4660 -6536.1182 25.089609 25.219959 25.311847
4670 -6539.7173 25.446331 25.243392 25.311204
4680 -6542.3279 25.710054 25.29585 25.310885
4690 -6541.4186 25.631482 25.351201 25.311017
4700 -6537.8826 25.288875 25.377927 25.311472
4710 -6534.4499 24.950976 25.368311 25.311974
4720 -6532.1279 24.71549 25.333007 25.312276
4730 -6530.8909 24.581773 25.283964 25.312232
4740 -6531.2701 24.611996 25.234939 25.311792
4750 -6533.3482 24.810094 25.202985 25.311035
4760 -6535.5975 25.031025 25.195284 25.310138
4770 -6536.9532 25.166891 25.204968 25.30927
4780 -6537.7181 25.248618 25.223326 25.308526
4790 -6537.6447 25.247517 25.244094 25.307948
4800 -6536.6574 25.153277 25.256842 25.307508
4810 -6536.8034 25.168744 25.263785 25.307139
4820 -6538.3174 25.317178 25.279721 25.306859
4830 -6538.956 25.381125 25.305443 25.306755
4840 -6537.7898 25.268155 25.325142 25.306839
4850 -6535.7991 25.075016 25.327061 25.307004
4860 -6534.1303 24.911138 25.311503 25.307103
4870 -6532.9987 24.800682 25.284748 25.307027
4880 -6532.8016 24.778235 25.254157 25.306719
4890 -6533.9124 24.885928 25.231314 25.306198
4900 -6535.7463 25.064523 25.225147 25.305571
4910 -6537.8798 25.273809 25.238247 25.304983
4920 -6539.1951 25.406752 25.267582 25.30458
4930 -6537.4521 25.240196 25.291973 25.304408
4940 -6533.9081 24.894587 25.285943 25.304306
4950 -6532.7343 24.778072 25.25729 25.304043
4960 -6534.5235 24.952736 25.23735 25.303576
4970 -6536.2977 25.126321 25.237849 25.303047
4980 -6536.9581 25.194674 25.248843 25.302579
4990 -6537.1579 25.217259 25.262555 25.302215
5000 -6536.8376 25.187789 25.274576 25.301959
5010 -6536.1979 25.125231 25.280363 25.301773
5020 -6535.9038 25.097065 25.281287 25.30161
5030 -6535.5094 25.058248 25.27963 25.301446
5040 -6534.6382 24.970892 25.27155 25.301245
5050 -6534.2083 24.930276 25.257572 25.300953
5060 -6534.8053 24.988155 25.246426 25.300559
5070 -6535.6238 25.068132 25.243857 25.300117
5080 -6535.8714 25.09307 25.246351 25.299685
5090 -6535.9432 25.10127 25.249453 25.299279
5100 -6536.3657 25.142361 25.254857 25.298908
5110 -6536.449 25.153813 25.262674 25.298596
5120 -6536.2916 25.142927 25.268875 25.298342
5130 -6537.05 25.216596 25.277481 25.298143
5140 -6537.9504 25.307292 25.294483 25.298049
5150 -6537.5767 25.271715 25.31233 25.298102
5160 -6536.3151 25.151468 25.319554 25.298254
5170 -6535.9253 25.114159 25.317924 25.298416
5180 -6536.4798 25.167001 25.318871 25.29857
5190 -6536.1179 25.13136 25.321013 25.298741
5200 -6534.9204 25.015115 25.314484 25.298895
5210 -6534.1763 24.937377 25.298689 25.298953
5220 -6534.5267 24.971824 25.282929 25.298879
5230 -6535.3186 25.047097 25.274949 25.298714
5240 -6535.931 25.108109 25.273956 25.298519
5250 -6536.915 25.207033 25.280379 25.298348
5260 -6538.452 25.359021 25.298594 25.298277
5270 -6539.799 25.494657 25.329406 25.298406
5280 -6539.8899 25.507179 25.364409 25.298803
5290 -6538.0806 25.333634 25.38759 25.299432
5300 -6535.0967 25.042437 25.384622 25.300131
5310 -6533.6581 24.896657 25.359623 25.300693
5320 -6535.3135 25.05354 25.339645 25.301057
5330 -6537.5649 25.272889 25.342371 25.301359
5340 -6537.8096 25.296808 25.356372 25.301742
5350 -6535.8768 25.106661 25.35918 25.302196
5360 -6533.9006 24.911221 25.341369 25.302578
5370 -6533.6914 24.885198 25.31523 25.302769
5380 -6535.164 25.024726 25.298244 25.302783
5390 -6536.8589 25.192828 25.299421 25.302741
5400 -6536.3929 25.145908 25.306382 25.30275
5410 -6534.017 24.912722 25.29671 25.302751
5420 -6532.4608 24.759447 25.268065 25.302588
5430 -6533.6554 24.873379 25.240968 25.302189
5440 -6537.273 25.22677 25.241143 25.301685
5450 -6540.5201 25.548408 25.275716 25.301341
5460 -6540.799 25.581769 25.32313 25.301347
5470 -6538.9726 25.411274 25.35642 25.301676
5480 -6538.0259 25.322264 25.372916 25.302183
5490 -6538.1544 25.3361 25.386454 25.302798
5500 -6536.8742 25.212636 25.393996 25.303497
-Loop time of 325.113 on 4 procs for 5000 steps with 3456 atoms
+Loop time of 127.046 on 4 procs for 5000 steps with 3456 atoms
-Pair time (%) = 60.4693 (18.5995)
-Neigh time (%) = 30.21 (9.29214)
-Comm time (%) = 53.3399 (16.4066)
-Outpt time (%) = 1.67016 (0.513718)
-Other time (%) = 179.424 (55.1881)
+Pair time (%) = 50.4994 (39.749)
+Neigh time (%) = 22.1389 (17.4259)
+Comm time (%) = 8.53682 (6.71948)
+Outpt time (%) = 0.271518 (0.213716)
+Other time (%) = 45.5992 (35.8919)
Nlocal: 864 ave 864 max 864 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 7924 ave 7924 max 7924 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Neighs: 287658 ave 288864 max 286341 min
Histogram: 1 0 0 1 0 0 0 1 0 1
FullNghs: 575316 ave 576116 max 574315 min
Histogram: 1 0 0 0 0 1 1 0 0 1
Total # of neighbors = 2301264
Ave neighs/atom = 665.875
Neighbor list builds = 500
Dangerous builds = 0
diff --git a/examples/USER/atc/two_temperature/uniform_heating.screen b/examples/USER/atc/two_temperature/uniform_heating.screen
index 292cf9587..9ea0855c5 100644
--- a/examples/USER/atc/two_temperature/uniform_heating.screen
+++ b/examples/USER/atc/two_temperature/uniform_heating.screen
@@ -1,133 +1,134 @@
-LAMMPS (14 Aug 2013)
+LAMMPS (24 Aug 2013)
units real
atom_style atomic
boundary f p p
# create domain
#lattice type reduced density rho* = 4*(sigma/a)^3, where N=4 for fcc, s = 3.405 A (Wagner) and a = 5.25 A (Ashcroft & Mermin, p. 70)
pair_style lj/cut 13.5
read_data uniform_heating_init.data
Reading data file ...
orthogonal box = (-43.24 -16.215 -16.215) to (43.24 16.215 16.215)
4 by 1 by 1 MPI processor grid
2304 atoms
2304 velocities
lattice fcc 5.405 origin 0.25 0.25 0.25
Lattice spacing in x,y,z = 5.405 5.405 5.405
region mdRegion block -8 8 -3 3 -3 3
region mdInternal block -6 6 -3 3 -3 3
group internal region mdInternal
1728 atoms in group internal
neighbor 5. bin
neigh_modify every 10 delay 0 check no
# ID group atc PhysicsType ParameterFile
fix AtC internal atc two_temperature Ar_ttm.mat
ATC: constructing two_temperature coupling with parameter file Ar_ttm.mat
+ ATC: version 2.0
ATC: peratom PE compute created with ID: 3
ATC: 2 materials defined from Ar_ttm.mat
ATC: creating two_temperature extrinsic model
ATC: 2 materials defined from Ar_ttm.mat
# ID part keywords nx ny nz region
fix_modify AtC mesh create 6 1 1 mdInternal f p p
ATC: created uniform mesh with 28 nodes, 7 unique nodes, and 6 elements
fix_modify AtC internal_quadrature on
# fix a temperature
fix_modify AtC initial temperature all 20.
fix_modify AtC fix temperature all 20.
fix_modify AtC initial electron_temperature all 20.
fix_modify AtC fix electron_temperature all 20.
# turn on thermostat
fix_modify AtC control thermal rescale 10
# output
thermo_style custom step cpu pe etotal temp f_AtC[1] f_AtC[2]
thermo 100
log uniform_heating.log
# make thermo output the correct temperature by removing ghost dof
# variable xdof equal 3*count(ghost)
# compute_modify thermo_temp extra ${xdof}
# equilibrate MD field
timestep 5
run 400
Setting up run ...
Memory usage per processor = 52.5067 Mbytes
Step CPU PotEng TotEng Temp AtC[1] AtC[2]
0 0 -4406.6687 -4200.7544 29.995658 206.60693 20
- 100 7.4800179 -4258.7421 -4155.7253 15.006513 206.60693 20
- 200 10.47899 -4317.7651 -4214.7483 15.006513 206.60693 20
- 300 12.109694 -4308.7092 -4205.6924 15.006513 206.60693 20
- 400 13.610023 -4305.0489 -4202.0322 15.006513 206.60693 20
-Loop time of 13.6154 on 4 procs for 400 steps with 2304 atoms
+ 100 1.3325791 -4258.7421 -4155.7253 15.006513 206.60693 20
+ 200 2.6486051 -4317.7651 -4214.7483 15.006513 206.60693 20
+ 300 3.9597011 -4308.7092 -4205.6924 15.006513 206.60693 20
+ 400 5.2682781 -4305.0489 -4202.0322 15.006513 206.60693 20
+Loop time of 5.26857 on 4 procs for 400 steps with 2304 atoms
-Pair time (%) = 2.90979 (21.3713)
-Neigh time (%) = 1.344 (9.87119)
-Comm time (%) = 2.62009 (19.2435)
-Outpt time (%) = 0.0412001 (0.302599)
-Other time (%) = 6.70033 (49.2114)
+Pair time (%) = 2.31049 (43.8542)
+Neigh time (%) = 0.985664 (18.7084)
+Comm time (%) = 0.475472 (9.02469)
+Outpt time (%) = 0.0012936 (0.0245532)
+Other time (%) = 1.49565 (28.3881)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 5677 ave 6860 max 4494 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 177099 ave 193893 max 161681 min
Histogram: 2 0 0 0 0 0 0 0 1 1
FullNghs: 354198 ave 384150 max 324339 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1416792
Ave neighs/atom = 614.927
Neighbor list builds = 40
Dangerous builds = 0
# change thermostat
fix_modify AtC output uniform_heatingFE 100 text
ATC: Warning : text output can create _LARGE_ files
ATC: output custom names:
fix_modify AtC unfix temperature all
fix_modify AtC control thermal flux
# fix boundary
fix_modify AtC mesh create_nodeset lbc -6.1 -5.9 -INF INF -INF INF
ATC: created nodeset lbc with 1 nodes
fix_modify AtC fix temperature lbc 20.
fix_modify AtC mesh create_nodeset rbc 5.9 6.1 -INF INF -INF INF
ATC: created nodeset rbc with 1 nodes
fix_modify AtC fix temperature rbc 20.
# add source
#fix_modify AtC source temperature all 0.01
fix_modify AtC source temperature all 6.3363e-10
# run with FE
reset_timestep 0
run 1000
Setting up run ...
Memory usage per processor = 54.7588 Mbytes
Step CPU PotEng TotEng Temp AtC[1] AtC[2]
0 0 -4305.0489 -4202.0322 15.006513 206.60693 20
- 100 1.581583 -4284.0298 -4161.843 17.799025 245.0222 23.187441
- 200 3.199868 -4271.7421 -4126.3033 21.186144 291.62707 27.054401
- 300 4.951031 -4252.1549 -4092.7431 23.221609 319.6337 29.378203
- 400 6.5261829 -4243.1541 -4066.5034 25.732803 354.18694 32.245198
- 500 8.1686139 -4220.6621 -4038.0194 26.605675 366.20291 33.242203
- 600 9.6777399 -4216.5541 -4017.5256 28.992598 399.04557 35.967267
- 700 12.2501 -4214.2511 -3996.8158 31.673922 435.9421 39.028693
- 800 14.206697 -4198.8979 -3978.4057 32.119215 442.05328 39.535758
- 900 15.72 -4186.3755 -3963.2872 32.4974 447.23922 39.966052
- 1000 24.377633 -4182.9374 -3949.4046 34.018855 468.17471 41.703139
-Loop time of 24.3779 on 4 procs for 1000 steps with 2304 atoms
+ 100 1.4715371 -4284.0298 -4161.843 17.799025 245.0222 23.187441
+ 200 2.933769 -4271.7421 -4126.3033 21.186144 291.62707 27.054401
+ 300 4.3956921 -4252.1549 -4092.7431 23.221609 319.6337 29.378203
+ 400 6.0637021 -4243.1541 -4066.5034 25.732803 354.18694 32.245198
+ 500 7.543499 -4220.6621 -4038.0194 26.605675 366.20291 33.242203
+ 600 9.032043 -4216.5541 -4017.5256 28.992598 399.04557 35.967267
+ 700 11.389319 -4214.2511 -3996.8158 31.673922 435.9421 39.028693
+ 800 13.271666 -4198.8979 -3978.4057 32.119215 442.05328 39.535758
+ 900 15.191497 -4186.3755 -3963.2872 32.4974 447.23922 39.966052
+ 1000 16.70467 -4182.9374 -3949.4046 34.018855 468.17471 41.703139
+Loop time of 16.705 on 4 procs for 1000 steps with 2304 atoms
-Pair time (%) = 6.42443 (26.3535)
-Neigh time (%) = 2.68509 (11.0145)
-Comm time (%) = 2.88995 (11.8548)
-Outpt time (%) = 0.00563473 (0.0231141)
-Other time (%) = 12.3728 (50.7541)
+Pair time (%) = 5.95934 (35.6741)
+Neigh time (%) = 2.55454 (15.2921)
+Comm time (%) = 1.71944 (10.293)
+Outpt time (%) = 0.0443344 (0.265396)
+Other time (%) = 6.4273 (38.4754)
Nlocal: 576 ave 576 max 576 min
Histogram: 4 0 0 0 0 0 0 0 0 0
Nghost: 5677 ave 6860 max 4494 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Neighs: 175875 ave 189472 max 162330 min
Histogram: 2 0 0 0 0 0 0 0 0 2
FullNghs: 351750 ave 379061 max 324517 min
Histogram: 2 0 0 0 0 0 0 0 0 2
Total # of neighbors = 1407002
Ave neighs/atom = 610.678
Neighbor list builds = 100
Dangerous builds = 0
diff --git a/lib/atc/ATC_Coupling.cpp b/lib/atc/ATC_Coupling.cpp
index d9ca2be87..e9c98612f 100644
--- a/lib/atc/ATC_Coupling.cpp
+++ b/lib/atc/ATC_Coupling.cpp
@@ -1,1711 +1,1895 @@
// ATC headers
#include "ATC_Coupling.h"
#include "FE_Engine.h"
#include "Array.h"
#include "Array2D.h"
#include "ATC_Error.h"
#include "PrescribedDataManager.h"
#include "AtomicRegulator.h"
#include "TimeIntegrator.h"
#include "PhysicsModel.h"
#include "AtomToMoleculeTransfer.h"
#include "MoleculeSet.h"
+#include "FieldManager.h"
+
+using std::string;
+using std::map;
+using std::pair;
+using std::set;
namespace ATC {
//--------------------------------------------------
ATC_Coupling::ATC_Coupling(string groupName, double ** & perAtomArray, LAMMPS_NS::Fix * thisFix) :
ATC_Method(groupName, perAtomArray, thisFix),
consistentInitialization_(false),
equilibriumStart_(false),
useFeMdMassMatrix_(false),
trackCharge_(false),
temperatureDef_(NONE),
prescribedDataMgr_(NULL),
physicsModel_(NULL),
extrinsicModelManager_(this),
atomicRegulator_(NULL),
atomQuadForInternal_(true),
elementMask_(NULL),
+ elementMaskMass_(NULL),
+ elementMaskMassMd_(NULL),
internalToMask_(NULL),
internalElement_(NULL),
ghostElement_(NULL),
nodalGeometryType_(NULL),
bndyIntType_(NO_QUADRATURE),
bndyFaceSet_(NULL),
atomicWeightsMask_(NULL),
shpFcnMask_(NULL),
shpFcnDerivsMask_(NULL),
sourceIntegration_(FULL_DOMAIN)
{
// size the field mask
fieldMask_.reset(NUM_FIELDS,NUM_FLUX);
fieldMask_ = false;
// default: no consistent mass matrices
useConsistentMassMatrix_.reset(NUM_FIELDS);
useConsistentMassMatrix_ = false;
mdMassNormalization_ = true;
// check to see if lammps has any charges
if (lammpsInterface_->atom_charge()) trackCharge_ = true;
+ // default: perform velocity verlet
+ integrateInternalAtoms_ = true;
}
//--------------------------------------------------
ATC_Coupling::~ATC_Coupling()
{
interscaleManager_.clear();
if (feEngine_) { delete feEngine_; feEngine_ = NULL; }
if (physicsModel_) delete physicsModel_;
if (atomicRegulator_) delete atomicRegulator_;
if (prescribedDataMgr_) delete prescribedDataMgr_;
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
delete _tiIt_->second;
}
}
//--------------------------------------------------
// Interactions with LAMMPS fix commands
// parse input command and pass on to finite element engine
// or physics specific transfers if necessary
// revert to physics-specific transfer if no command matches input
// first keyword is unique to particular class
// base class keyword matching must apply to ALL physics
// order: derived, base, owned objects
//--------------------------------------------------
bool ATC_Coupling::modify(int narg, char **arg)
{
FieldName thisField;
int thisIndex;
int argIdx=0;
bool match = false;
// gateways to other modules e.g. extrinsic, control, mesh
// pass off to extrinsic
if (strcmp(arg[argIdx],"extrinsic")==0) {
argIdx++;
match = extrinsicModelManager_.modify(narg-argIdx,&arg[argIdx]);
}
// catch special case
if ((strcmp(arg[argIdx],"control")==0)
&&(strcmp(arg[argIdx+1],"charge")==0)) {
match = extrinsicModelManager_.modify(narg-argIdx,&arg[argIdx]);
}
// parsing handled here
else {
/*! \page man_initial fix_modify AtC initial
\section syntax
fix_modify AtC initial <field> <nodeset> <constant | function>
- <field> = field name valid for type of physics, temperature | electron_temperature
- - <nodeset> = name of set of nodes to apply boundary condition
+ - <nodeset> = name of set of nodes to apply initial condition
- <constant | function> = value or name of function followed by its
parameters
\section examples
<TT> fix_modify atc initial temperature groupNAME 10. </TT>
\section description
Sets the initial values for the specified field at the specified nodes.
\section restrictions
keyword 'all' reserved in nodeset name
- \section related
- see \ref man_internal
\section default
none
*/
// set initial conditions
if (strcmp(arg[argIdx],"initial")==0) {
argIdx++;
parse_field(arg,argIdx,thisField,thisIndex);
string nsetName(arg[argIdx++]);
XT_Function * f = NULL;
// parse constant
if (narg == argIdx+1) {
f = XT_Function_Mgr::instance()->constant_function(atof(arg[argIdx]));
}
// parse function
else {
f = XT_Function_Mgr::instance()->function(&(arg[argIdx]),narg-argIdx);
}
prescribedDataMgr_->fix_initial_field(nsetName,thisField,thisIndex,f);
match = true;
}
/*! \page man_fix_nodes fix_modify AtC fix
\section syntax
fix_modify AtC fix <field> <nodeset> <constant | function>
- <field> = field name valid for type of physics
- <nodeset> = name of set of nodes to apply boundary condition
- <constant | function> = value or name of function followed by its
parameters
\section examples
<TT> fix_modify AtC fix temperature groupNAME 10. </TT> \n
<TT> fix_modify AtC fix temperature groupNAME 0 0 0 10.0 0 0 1.0 </TT> \n
\section description
Creates a constraint on the values of the specified field at specified nodes.
\section restrictions
keyword 'all' reserved in nodeset name
\section related
see \ref man_unfix_nodes
\section default
none
*/
// fix and unfix nodes
else if (strcmp(arg[argIdx],"fix")==0) {
argIdx++;
parse_field(arg,argIdx,thisField,thisIndex);
string nsetName(arg[argIdx++]);
XT_Function * f = NULL;
+ // fix current value
+ if (narg == argIdx) {
+ set<int> nodeSet = (feEngine_->fe_mesh())->nodeset(nsetName);
+ set<int>::const_iterator iset;
+ const DENS_MAT & field =(fields_.find(thisField)->second).quantity();
+ for (iset = nodeSet.begin(); iset != nodeSet.end(); iset++) {
+ int inode = *iset;
+ double v = field(inode,thisIndex);
+ f = XT_Function_Mgr::instance()->constant_function(v);
+ set<int> one; one.insert(inode);
+ prescribedDataMgr_->fix_field(one,thisField,thisIndex,f);
+ }
+ }
// parse constant
- if (narg == argIdx+1) {
+ else if (narg == argIdx+1) {
f = XT_Function_Mgr::instance()->constant_function(atof(arg[argIdx]));
+ prescribedDataMgr_->fix_field(nsetName,thisField,thisIndex,f);
}
// parse function
else {
f = XT_Function_Mgr::instance()->function(&(arg[argIdx]),narg-argIdx);
+ prescribedDataMgr_->fix_field(nsetName,thisField,thisIndex,f);
}
- prescribedDataMgr_->fix_field(nsetName,thisField,thisIndex,f);
match = true;
}
/*! \page man_unfix_nodes fix_modify AtC unfix
\section syntax
fix_modify AtC unfix <field> <nodeset>
- <field> = field name valid for type of physics
- <nodeset> = name of set of nodes
\section examples
<TT> fix_modify AtC unfix temperature groupNAME </TT>
\section description
Removes constraint on field values for specified nodes.
\section restrictions
keyword 'all' reserved in nodeset name
\section related
see \ref man_fix_nodes
\section default
none
*/
else if (strcmp(arg[argIdx],"unfix")==0) {
argIdx++;
parse_field(arg,argIdx,thisField,thisIndex);
string nsetName(arg[argIdx++]);
prescribedDataMgr_->unfix_field(nsetName,thisField,thisIndex);
match = true;
}
/*! \page man_source fix_modify AtC source
\section syntax
fix_modify AtC source <field> <element_set> <value | function>
- <field> = field name valid for type of physics
- <element_set> = name of set of elements
\section examples
<TT> fix_modify atc source temperature middle temporal_ramp 10. 0. </TT>
\section description
Add domain sources to the mesh. The units are consistent with LAMMPS's
units for mass, length and time and are defined by the PDE being solved,
e.g. for thermal transfer the balance equation is for energy and source
is energy per time.
\section restrictions
keyword 'all' reserved in element_set name
\section related
see \ref man_remove_source
\section default
none
*/
else if (strcmp(arg[argIdx],"source")==0) {
argIdx++;
parse_field(arg,argIdx,thisField,thisIndex);
string esetName(arg[argIdx++]);
XT_Function * f = NULL;
// parse constant
if (narg == argIdx+1) {
f = XT_Function_Mgr::instance()->constant_function(atof(arg[argIdx]));
}
// parse function
else {
f = XT_Function_Mgr::instance()->function(&(arg[argIdx]),narg-argIdx);
}
prescribedDataMgr_->fix_source(esetName,thisField,thisIndex,f);
fieldMask_(thisField,PRESCRIBED_SOURCE) = true;
match = true;
}
/*! \page man_remove_source fix_modify AtC remove_source
\section syntax
fix_modify AtC remove_source <field> <element_set>
- <field> = field name valid for type of physics
- <element_set> = name of set of elements
\section examples
<TT> fix_modify atc remove_source temperature groupNAME </TT>
\section description
Remove a domain source.
\section restrictions
keyword 'all' reserved in element_set name
\section related
see \ref man_source
\section default
*/
else if (strcmp(arg[argIdx],"remove_source")==0) {
argIdx++;
parse_field(arg,argIdx,thisField,thisIndex);
string esetName(arg[argIdx++]);
prescribedDataMgr_->unfix_source(esetName,thisField,thisIndex);
fieldMask_(thisField,PRESCRIBED_SOURCE) = false;
match = true;
}
/*! \page man_fix_flux fix_modify AtC fix_flux
\section syntax
fix_modify AtC fix_flux <field> <face_set> <value | function>
- <field> = field name valid for type of physics, temperature | electron_temperature
- <face_set> = name of set of element faces
\section examples
<TT> fix_modify atc fix_flux temperature faceSet 10.0 </TT> \n
\section description
Command for fixing normal fluxes e.g. heat_flux.
This command only prescribes the normal component of the physical flux, e.g. heat (energy) flux.
The units are in AtC units, i.e. derived from the LAMMPS length, time, and mass scales.
\section restrictions
Only normal fluxes (Neumann data) can be prescribed.
\section related
see \ref man_unfix_flux
\section default
*/
else if (strcmp(arg[argIdx],"fix_flux")==0) {
argIdx++;
parse_field(arg,argIdx,thisField,thisIndex);
string fsetName(arg[argIdx++]);
XT_Function * f = NULL;
// parse constant
if (narg == argIdx+1) {
f = XT_Function_Mgr::instance()->constant_function(atof(arg[argIdx]));
}
// parse function
else {
f = XT_Function_Mgr::instance()->function(&(arg[argIdx]),narg-argIdx);
}
prescribedDataMgr_->fix_flux(fsetName,thisField,thisIndex,f);
fieldMask_(thisField,PRESCRIBED_SOURCE) = true;
match = true;
}
/*! \page man_unfix_flux fix_modify AtC unfix_flux
\section syntax
fix_modify AtC fix_flux <field> <face_set> <value | function>
- <field> = field name valid for type of physics, temperature | electron_temperature
- <face_set> = name of set of element faces
\section examples
<TT> fix_modify atc unfix_flux temperature faceSet </TT> \n
\section description
Command for removing prescribed normal fluxes e.g. heat_flux, stress.
\section restrictions
\section related
see \ref man_unfix_flux
\section default
*/
else if (strcmp(arg[argIdx],"unfix_flux")==0) {
argIdx++;
parse_field(arg,argIdx,thisField,thisIndex);
string fsetName(arg[argIdx++]);
prescribedDataMgr_->unfix_flux(fsetName,thisField,thisIndex);
fieldMask_(thisField,PRESCRIBED_SOURCE) = false;
match = true;
}
/*! \page man_fe_md_boundary fix_modify AtC fe_md_boundary
\section syntax
fix_modify AtC fe_md_boundary <faceset | interpolate | no_boundary> [args]
\section examples
<TT> fix_modify atc fe_md_boundary interpolate </TT> \n
\section description
+ Specifies different methods for computing fluxes between between the MD and FE integration regions. Faceset defines a faceset separating the MD and FE regions and uses finite element face quadrature to compute the flux. Interpolate uses a reconstruction scheme to approximate the flux, which is more robust but less accurate if the MD/FE boundary does correspond to a faceset. No boundary results in no fluxes between the systems being computed.
\section restrictions
+ If faceset is used, all the AtC non-boundary atoms must lie within and completely fill the domain enclosed by the faceset.
\section related
+ see \man_boundary_faceset for how to specify the faceset name.
\section default
+ Interpolate.
*/
else if (strcmp(arg[argIdx],"fe_md_boundary")==0) {
bndyIntType_ = FE_INTERPOLATION;// default
if(strcmp(arg[argIdx],"faceset")==0) {
argIdx++;
bndyIntType_ = FE_QUADRATURE;
string name(arg[argIdx++]);
bndyFaceSet_ = & ( (feEngine_->fe_mesh())->faceset(name));
}
else if (strcmp(arg[argIdx],"interpolate")==0) {
argIdx++;
bndyIntType_ = FE_INTERPOLATION;
}
else if (strcmp(arg[argIdx],"no_boundary")==0) {
bndyIntType_ = NO_QUADRATURE;
}
else {
throw ATC_Error("Bad boundary integration type");
}
}
/*! \page man_boundary_faceset fix_modify AtC boundary_faceset
\section syntax
fix_modify AtC boundary_faceset <is | add> [args]
\section examples
fix_modify AtC boundary_faceset is obndy
\section description
- \section restrictions
+ This command species the faceset name when using a faceset to compute the MD/FE boundary fluxes. The faceset must already exist.
+ \section restrictions
+ This is only valid when fe_md_boundary is set to faceset.
\section related
+ \man_fe_md_boundary
\section default
*/
else if (strcmp(arg[argIdx],"boundary_faceset")==0) {
argIdx++;
if (strcmp(arg[argIdx],"is")==0) { // replace existing faceset
argIdx++;
boundaryFaceNames_.clear();
string name(arg[argIdx++]);
boundaryFaceNames_.insert(name);
match = true;
}
else if (strcmp(arg[argIdx],"add")==0) { // add this faceset to list
argIdx++;
string name(arg[argIdx]);
boundaryFaceNames_.insert(name);
match = true;
}
}
/*! \page man_internal_quadrature fix_modify AtC internal_quadrature
\section syntax
fix_modify atc internal_quadrature <on | off> [region]
\section examples
<TT> fix_modify atc internal_quadrature off </TT>
\section description
- Command use or not use atomic quadrature on internal elements
+ Command to use or not use atomic quadrature on internal elements
fully filled with atoms. By turning the internal quadrature off
these elements do not contribute to the governing PDE and the fields
at the internal nodes follow the weighted averages of the atomic data.
\section optional
Optional region tag specifies which finite element nodes will be treated
as being within the MD region. This option is only valid with
internal_quadrature off.
\section restrictions
\section related
\section default
on
*/
else if (strcmp(arg[argIdx],"internal_quadrature")==0) {
if (initialized_) {
throw ATC_Error("Cannot change internal_quadrature method after first run");
}
argIdx++;
if (strcmp(arg[argIdx],"on")==0) {
argIdx++;
atomQuadForInternal_ = true;
match = true;
}
else if (strcmp(arg[argIdx],"off")==0) {
argIdx++;
if (argIdx == narg) {
atomQuadForInternal_ = false;
regionID_ = -1;
match = true;
}
else {
for (regionID_ = 0; regionID_ < lammpsInterface_->nregion(); regionID_++)
if (strcmp(arg[argIdx],lammpsInterface_->region_name(regionID_)) == 0) break;
if (regionID_ < lammpsInterface_->nregion()) {
atomQuadForInternal_ = false;
match = true;
}
else {
throw ATC_Error("Region " + string(arg[argIdx]) + " does not exist");
}
}
}
if (match) {
needReset_ = true;
}
}
else if (strcmp(arg[argIdx],"fix_robin")==0) {
argIdx++;
parse_field(arg,argIdx,thisField,thisIndex);
string fsetName(arg[argIdx++]);
UXT_Function * f = NULL;
// parse linear
if (narg == argIdx+2) {
f = UXT_Function_Mgr::instance()->linear_function(atof(arg[argIdx]),atof(arg[argIdx+1]));
}
// parse function
else {
throw ATC_Error("unimplemented function");
}
prescribedDataMgr_->fix_robin(fsetName,thisField,thisIndex,f);
fieldMask_(thisField,ROBIN_SOURCE) = true;
match = true;
}
else if (strcmp(arg[argIdx],"unfix_robin")==0) {
argIdx++;
parse_field(arg,argIdx,thisField,thisIndex);
string fsetName(arg[argIdx++]);
prescribedDataMgr_->unfix_robin(fsetName,thisField,thisIndex);
fieldMask_(thisField,ROBIN_SOURCE) = false;
match = true;
}
- /*! \page man_atomic_charge fix_modify AtC <include | omit> atomic_charge
+ /*! \page man_atomic_charge fix_modify AtC atomic_charge
+ \section syntax
+ fix_modify AtC <include | omit> atomic_charge
- <include | omit> = switch to activiate/deactiviate inclusion of intrinsic atomic charge in ATC
\section examples
<TT> fix_modify atc compute include atomic_charge </TT>
\section description
Determines whether AtC tracks the total charge as a finite element field
\section restrictions
Required for: electrostatics
\section related
\section default
if the atom charge is defined, default is on, otherwise default is off
*/
else if (strcmp(arg[argIdx],"include")==0) {
argIdx++;
if (strcmp(arg[argIdx],"atomic_charge")==0) {
trackCharge_ = true;
match = true;
needReset_ = true;
}
}
else if (strcmp(arg[argIdx],"omit")==0) {
argIdx++;
if (strcmp(arg[argIdx],"atomic_charge")==0) {
trackCharge_ = false;
match = true;
needReset_ = true;
}
}
- /*! \page man_source_integration fix_modify AtC source_integration < fe | atom>
+ /*! \page man_source_integration fix_modify AtC source_integration
+ \section syntax
+ fix_modify AtC source_integration < fe | atom>
\section examples
<TT> fix_modify atc source_integration atom </TT>
\section description
\section restrictions
\section related
\section default
Default is fe
*/
else if (strcmp(arg[argIdx],"source_integration")==0) {
argIdx++;
if (strcmp(arg[argIdx],"fe")==0) {
sourceIntegration_ = FULL_DOMAIN;
}
else {
sourceIntegration_ = FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE;
}
match = true;
}
- /*! \page man_consistent_fe_initialization fix_modify AtC consistent_fe_initialization <on | off>
- - <include | omit> = switch to activiate/deactiviate the intial setting of FE intrinsic field to match the projected MD field
+ /*! \page man_consistent_fe_initialization fix_modify AtC consistent_fe_initialization
+ \section syntax
+ fix_modify AtC consistent_fe_initialization <on | off>
+ - <on|off> = switch to activiate/deactiviate the intial setting of FE intrinsic field to match the projected MD field
\section examples
- <TT> fix_modify atc compute include atomic_charge </TT>
+ <TT> fix_modify atc consistent_fe_initialization on </TT>
\section description
Determines whether AtC initializes FE intrinsic fields (e.g., temperature) to match the projected MD values. This is particularly useful for fully overlapping simulations.
\section restrictions
- Can be used with: thermal, two_temperature
- Cannot be used with time filtering on
- Does not include boundary nodes
+ Can be used with: thermal, two_temperature.
+ Cannot be used with time filtering on. Does not include boundary nodes.
\section related
\section default
Default is off
*/
else if (strcmp(arg[argIdx],"consistent_fe_initialization")==0) {
argIdx++;
if (strcmp(arg[argIdx],"on")==0) {
if (timeFilterManager_.filter_dynamics())
throw ATC_Error("Consistent FE initialization cannot be used with time filtering");
consistentInitialization_ = true;
match = true;
}
else if (strcmp(arg[argIdx],"off")==0) {
consistentInitialization_ = false;
match = true;
}
}
// switch for equilibrium filtering start
/*! \page man_equilibrium_start fix_modify AtC equilibrium_start
\section syntax
fix_modify AtC equilibrium_start <on|off>
\section examples
<TT> fix_modify atc equilibrium_start on </TT> \n
\section description
Starts filtered calculations assuming they start in equilibrium, i.e. perfect finite element force balance.
\section restrictions
only needed before filtering is begun
\section related
see \ref man_time_filter
\section default
on
*/
else if (strcmp(arg[argIdx],"equilibrium_start")==0) {
argIdx++;
if (strcmp(arg[argIdx],"on")==0) {
equilibriumStart_ = true;
match = true;
}
else if (strcmp(arg[argIdx],"off")==0) {
equilibriumStart_ = false;
match = true;
}
}
- /*! \page man_mass_matrix fix_modify AtC mass_matrix <fe | md_fe>
+ /*! \page man_mass_matrix fix_modify AtC mass_matrix
+ \section syntax
+ fix_modify AtC mass_matrix <fe | md_fe>
- <fe | md_fe> = activiate/deactiviate using the FE mass matrix in the MD region
\section examples
<TT> fix_modify atc mass_matrix fe </TT>
\section description
Determines whether AtC uses the FE mass matrix based on Gaussian quadrature or based on atomic quadrature in the MD region. This is useful for fully overlapping simulations to improve efficiency.
\section restrictions
- Should not be used unless the FE region is contained within the MD region,
- otherwise the method will be unstable and inaccurate
+ Should not be used unless the FE region is contained within the MD region, otherwise the method will be unstable and inaccurate
\section related
\section default
Default is off
*/
else if (strcmp(arg[argIdx],"mass_matrix")==0) {
argIdx++;
if (strcmp(arg[argIdx],"fe")==0) {
useFeMdMassMatrix_ = true;
match = true;
}
else {
useFeMdMassMatrix_ = false;
match = true;
}
if (match) {
needReset_ = true;
}
}
/*! \page man_material fix_modify AtC material
\section syntax
fix_modify AtC material [elementset_name] [material_id] \n
\section examples
<TT> fix_modify AtC material gap_region 2</TT>
\section description
+ Sets the material model in elementset_name to be of type material_id.
\section restrictions
+ The element set must already be created and the material must be specified in the material file given the the atc fix on construction
\section related
\section default
+ All elements default to the first material in the material file.
*/
else if (strcmp(arg[argIdx],"material")==0) {
argIdx++;
string elemsetName(arg[argIdx++]);
int matId = physicsModel_->material_index(arg[argIdx++]);
using std::set;
set<int> elemSet = (feEngine_->fe_mesh())->elementset(elemsetName);
if(elementToMaterialMap_.size() == 0) {
throw ATC_Error("need mesh before material command");
}
// set elementToMaterialMap
set<int>::const_iterator iset;
for (iset = elemSet.begin(); iset != elemSet.end(); iset++) {
int ielem = *iset;
// and the tag a string
elementToMaterialMap_(ielem) = matId;
}
match = true;
needReset_ = true;
}
} // end else
// no match, call base class parser
if (!match) {
match = ATC_Method::modify(narg, arg);
}
return match; // return to FixATC
}
//--------------------------------------------------
/** PDE type */
WeakEquation::PDE_Type ATC_Coupling::pde_type(const FieldName fieldName) const
{
const WeakEquation * weakEq = physicsModel_->weak_equation(fieldName);
if (weakEq == NULL) return WeakEquation::PROJECTION_PDE;
return weakEq->type();
}
//--------------------------------------------------
/** is dynamic PDE */
bool ATC_Coupling::is_dynamic(const FieldName fieldName) const
{
const WeakEquation * weakEq = physicsModel_->weak_equation(fieldName);
if (weakEq == NULL) return false;
return (physicsModel_->weak_equation(fieldName)->type() == WeakEquation::DYNAMIC_PDE);
}
//--------------------------------------------------
/** allow FE_Engine to construct data manager after mesh is constructed */
void ATC_Coupling::construct_prescribed_data_manager (void) {
prescribedDataMgr_ = new PrescribedDataManager(feEngine_,fieldSizes_);
}
//--------------------------------------------------
// pack_fields
// bundle all allocated field matrices into a list
// for output needs
//--------------------------------------------------
void ATC_Coupling::pack_fields(RESTART_LIST & data)
{
ATC_Method::pack_fields(data);
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->pack_fields(data);
}
}
//--------------------------------------------------------------
// create_physics_model
// - method to create physics model
//--------------------------------------------------------------
void ATC_Coupling::create_physics_model(const PhysicsType & physicsType,
string matFileName)
{
if (physicsModel_) {
throw ATC_Error("Attempted to create PhysicsModel multiple times in ATC_Coupling");
}
// Create PhysicsModel based on physicsType
switch (physicsType) {
case NO_PHYSICS :
break;
case THERMAL :
physicsModel_ = new PhysicsModelThermal(matFileName);
break;
case ELASTIC :
physicsModel_ = new PhysicsModelElastic(matFileName);
break;
case SHEAR:
physicsModel_ = new PhysicsModelShear(matFileName);
break;
case SPECIES :
physicsModel_ = new PhysicsModelSpecies(matFileName);
break;
case THERMO_ELASTIC :
physicsModel_ = new PhysicsModelThermoElastic(matFileName);
break;
default:
throw ATC_Error("Unknown physics type in ATC_Coupling::create_physics_model");
}
}
- //--------------------------------------------------------
- void ATC_Coupling::init_integrate_velocity()
- {
- const DENS_MAT & m(atomMasses_->quantity());
- double dt = 0.5 * lammpsInterface_->dt();
-
- _deltaQuantity_ = atomForces_->quantity();
- for (int i = 0; i < nLocal_; i++)
- for (int j = 0; j < nsd_; j ++)
- _deltaQuantity_(i,j) *= dt/m(i,0);
-
- (*atomVelocities_) += _deltaQuantity_;
- }
- //--------------------------------------------------------
- void ATC_Coupling::init_integrate_position()
- {
- double dt = lammpsInterface_->dt();
- _deltaQuantity_ = atomVelocities_->quantity();
- _deltaQuantity_ *= dt;
- (*atomPositions_) += _deltaQuantity_;
- }
- //--------------------------------------------------------
- void ATC_Coupling::final_integrate()
- {
- const DENS_MAT & m(atomMasses_->quantity());
- double dt = 0.5 * lammpsInterface_->dt();
- _deltaQuantity_ = atomForces_->quantity();
- for (int i = 0; i < nLocal_; i++)
- for (int j = 0; j < nsd_; j ++)
- _deltaQuantity_(i,j) *= dt/m(i,0);
-
- (*atomVelocities_) += _deltaQuantity_;
- }
//--------------------------------------------------------
void ATC_Coupling::construct_methods()
{
+ ATC_Method::construct_methods();
+
// construct needed time filters for mass matrices
if (timeFilterManager_.need_reset()) {
init_filter();
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
// fill in mass matrix time filters if needed
if (!massMatTimeFilters_[thisField])
massMatTimeFilters_[thisField] = timeFilterManager_.construct(TimeFilterManager::INSTANTANEOUS);
}
}
}
//-------------------------------------------------------------------
void ATC_Coupling::init_filter()
{
if (timeFilterManager_.need_reset()) {
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
int thisSize = field->second;
(nodalAtomicFieldsRoc_[thisField].set_quantity()).reset(nNodes_,thisSize);
}
}
}
//--------------------------------------------------------
void ATC_Coupling::set_fixed_nodes()
{
// set fields
prescribedDataMgr_->set_fixed_fields(time(),
fields_,dot_fields_,ddot_fields_,dddot_fields_);
// set related data
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
int thisSize = field->second;
DENS_MAT & rhs(rhs_[thisField].set_quantity());
for (int inode = 0; inode < nNodes_ ; ++inode) {
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
if (prescribedDataMgr_->is_fixed(inode,thisField,thisIndex)) {
rhs(inode,thisIndex) = 0.;
}
}
}
}
}
//--------------------------------------------------------
void ATC_Coupling::set_initial_conditions()
{
// set fields
prescribedDataMgr_->set_initial_conditions(time(),
fields_,dot_fields_,ddot_fields_,dddot_fields_);
// set (all) related data
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
int thisSize = field->second;
DENS_MAT & rhs(rhs_[thisField].set_quantity());
for (int inode = 0; inode < nNodes_ ; ++inode) {
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
rhs(inode,thisIndex) = 0.;
}
}
}
}
//--------------------------------------------------------
void ATC_Coupling::set_sources()
{
// set fields
prescribedDataMgr_->set_sources(time(),sources_);
}
//-----------------------------------------------------------------
// this is w_a source_a
void ATC_Coupling::compute_sources_at_atoms(const RHS_MASK & rhsMask,
- const FIELDS & fields,
- const PhysicsModel * physicsModel,
- FIELD_MATS & atomicSources)
+ const FIELDS & fields,
+ const PhysicsModel * physicsModel,
+ FIELD_MATS & atomicSources)
{
+ if (shpFcnMask_) {
feEngine_->compute_source(rhsMask,
fields,
physicsModel,
atomMaterialGroupsMask_,
atomicWeightsMask_->quantity(),
shpFcnMask_->quantity(),
shpFcnDerivsMask_->quantity(),
atomicSources);
-
+ }
+ else {
+ for (FIELDS::const_iterator field = fields.begin();
+ field != fields.end(); field++) {
+ FieldName thisFieldName = field->first;
+ FIELDS::const_iterator fieldItr = fields.find(thisFieldName);
+ const DENS_MAT & field = (fieldItr->second).quantity();
+ atomicSources[thisFieldName].reset(field.nRows(),field.nCols());
+ }
+ }
}
//-----------------------------------------------------------------
void ATC_Coupling::compute_atomic_sources(const RHS_MASK & fieldMask,
const FIELDS & fields,
FIELDS & atomicSources)
{
for (FIELDS::const_iterator field = fields.begin();
field != fields.end(); field++) {
FieldName thisFieldName = field->first;
if (is_intrinsic(thisFieldName)) {
atomicSources[thisFieldName] = 0.;
if (fieldMask(thisFieldName,FLUX)) {
atomicSources[thisFieldName] = boundaryFlux_[thisFieldName];
}
if (fieldMask(thisFieldName,PRESCRIBED_SOURCE)) {
atomicSources[thisFieldName] -= fluxMask_*(sources_[thisFieldName].quantity());
}
// add in sources from extrinsic models
if (fieldMask(thisFieldName,EXTRINSIC_SOURCE))
atomicSources[thisFieldName] -= fluxMask_*(extrinsicSources_[thisFieldName].quantity());
}
}
}
//-----------------------------------------------------------------
+ void ATC_Coupling::masked_atom_domain_rhs_tangent(
+ const pair<FieldName,FieldName> row_col,
+ const RHS_MASK & rhsMask,
+ const FIELDS & fields,
+ SPAR_MAT & stiffness,
+ const PhysicsModel * physicsModel)
+ {
+ if (shpFcnMask_) {
+ feEngine_->compute_tangent_matrix(rhsMask, row_col,
+ fields, physicsModel, atomMaterialGroupsMask_,
+ atomicWeightsMask_->quantity(), shpFcnMask_->quantity(),
+ shpFcnDerivsMask_->quantity(),stiffness);
+ }
+ else {
+ stiffness.reset(nNodes_,nNodes_);
+ }
+ }
+ //-----------------------------------------------------------------
void ATC_Coupling::compute_rhs_tangent(
const pair<FieldName,FieldName> row_col,
const RHS_MASK & rhsMask,
const FIELDS & fields,
SPAR_MAT & stiffness,
const IntegrationDomainType integrationType,
const PhysicsModel * physicsModel)
{
if (integrationType == FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE) {
RHS_MASK rhsMaskFE = rhsMask;
RHS_MASK rhsMaskMD = rhsMask; rhsMaskMD = false;
for (FIELDS::const_iterator field = fields.begin();
field != fields.end(); field++) {
FieldName thisFieldName = field->first;
if ( rhsMaskFE(thisFieldName,SOURCE) ) {
rhsMaskFE(thisFieldName,SOURCE) = false;
rhsMaskMD(thisFieldName,SOURCE) = true;
}
}
feEngine_->compute_tangent_matrix(rhsMaskFE, row_col,
fields , physicsModel, elementToMaterialMap_, stiffness);
- feEngine_->compute_tangent_matrix(rhsMaskMD, row_col,
- fields, physicsModel, atomMaterialGroupsMask_,
- atomicWeightsMask_->quantity(), shpFcnMask_->quantity(),
- shpFcnDerivsMask_->quantity(),stiffnessAtomDomain_);
+ masked_atom_domain_rhs_tangent(row_col,
+ rhsMaskMD,
+ fields,
+ stiffnessAtomDomain_,
+ physicsModel);
stiffness += stiffnessAtomDomain_;
}
else {
feEngine_->compute_tangent_matrix(rhsMask, row_col,
fields , physicsModel, elementToMaterialMap_, stiffness);
}
ROBIN_SURFACE_SOURCE & robinFcn = *(prescribedDataMgr_->robin_functions());
feEngine_->add_robin_tangent(rhsMask, fields, time(), robinFcn, stiffness);
}
//-----------------------------------------------------------------
void ATC_Coupling::compute_rhs_vector(const RHS_MASK & rhsMask,
const FIELDS & fields,
FIELDS & rhs,
const IntegrationDomainType domain,
const PhysicsModel * physicsModel)
{
if (!physicsModel) physicsModel = physicsModel_;
// compute FE contributions
evaluate_rhs_integral(rhsMask,fields,rhs,domain,physicsModel);
for (int n = 0; n < rhsMask.nRows(); n++) {
FieldName thisFieldName = FieldName(n);
if (rhsMask(thisFieldName,PRESCRIBED_SOURCE)) {
if (is_intrinsic(thisFieldName)) {
rhs[thisFieldName] += fluxMaskComplement_*(sources_[thisFieldName].quantity());
}
else {
rhs[thisFieldName] += sources_[thisFieldName].quantity();
}
}
// add in sources from extrinsic models
if (rhsMask(thisFieldName,EXTRINSIC_SOURCE)) {
if (is_intrinsic(thisFieldName)) {
rhs[thisFieldName] += fluxMaskComplement_*(extrinsicSources_[thisFieldName].quantity());
}
else {
rhs[thisFieldName] += extrinsicSources_[thisFieldName].quantity();
}
}
}
ROBIN_SURFACE_SOURCE & robinFcn = *(prescribedDataMgr_->robin_functions());
feEngine_->add_robin_fluxes(rhsMask, fields, time(), robinFcn, rhs);
}
//-----------------------------------------------------------------
+ void ATC_Coupling::masked_atom_domain_rhs_integral(
+ const Array2D<bool> & rhsMask,
+ const FIELDS & fields, FIELDS & rhs,
+ const PhysicsModel * physicsModel)
+ {
+ if (shpFcnMask_) {
+ feEngine_->compute_rhs_vector(rhsMask,
+ fields,
+ physicsModel,
+ atomMaterialGroupsMask_,
+ atomicWeightsMask_->quantity(),
+ shpFcnMask_->quantity(),
+ shpFcnDerivsMask_->quantity(),
+ rhs);
+ }
+ else {
+ for (FIELDS::const_iterator field = fields.begin();
+ field != fields.end(); field++) {
+ FieldName thisFieldName = field->first;
+ FIELDS::const_iterator fieldItr = fields.find(thisFieldName);
+ const DENS_MAT & field = (fieldItr->second).quantity();
+ (rhs[thisFieldName].set_quantity()).reset(field.nRows(),field.nCols());
+ }
+ }
+ }
+ //-----------------------------------------------------------------
void ATC_Coupling::evaluate_rhs_integral(
const Array2D<bool> & rhsMask,
const FIELDS & fields, FIELDS & rhs,
const IntegrationDomainType integrationType,
const PhysicsModel * physicsModel)
{
if (!physicsModel) physicsModel = physicsModel_;
if (integrationType == FE_DOMAIN ) {
feEngine_->compute_rhs_vector(rhsMask,
fields,
physicsModel,
elementToMaterialMap_,
rhs,
&(elementMask_->quantity()));
- feEngine_->compute_rhs_vector(rhsMask,
- fields,
- physicsModel,
- atomMaterialGroupsMask_,
- atomicWeightsMask_->quantity(),
- shpFcnMask_->quantity(),
- shpFcnDerivsMask_->quantity(),
- rhsAtomDomain_);
+ masked_atom_domain_rhs_integral(rhsMask,
+ fields,
+ rhsAtomDomain_,
+ physicsModel);
for (FIELDS::const_iterator field = fields.begin();
field != fields.end(); field++) {
FieldName thisFieldName = field->first;
rhs[thisFieldName] -= rhsAtomDomain_[thisFieldName].quantity();
}
}
else if (integrationType == ATOM_DOMAIN) {
- feEngine_->compute_rhs_vector(rhsMask,
- fields,
- physicsModel,
- atomMaterialGroupsMask_,
- atomicWeightsMask_->quantity(),
- shpFcnMask_->quantity(),
- shpFcnDerivsMask_->quantity(),
- rhs);
+ masked_atom_domain_rhs_integral(rhsMask,
+ fields,
+ rhs,
+ physicsModel);
}
else if (integrationType == FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE) {
RHS_MASK rhsMaskFE = rhsMask;
RHS_MASK rhsMaskMD = rhsMask; rhsMaskMD = false;
for (FIELDS::const_iterator field = fields.begin();
field != fields.end(); field++) {
FieldName thisFieldName = field->first;
if ( rhsMaskFE(thisFieldName,SOURCE) ) {
rhsMaskFE(thisFieldName,SOURCE) = false;
rhsMaskMD(thisFieldName,SOURCE) = true;
}
}
feEngine_->compute_rhs_vector(rhsMaskFE,
fields,
physicsModel,
elementToMaterialMap_,
rhs);
- feEngine_->compute_rhs_vector(rhsMaskMD,
- fields,
- physicsModel,
- atomMaterialGroupsMask_,
- atomicWeightsMask_->quantity(),
- shpFcnMask_->quantity(),
- shpFcnDerivsMask_->quantity(),
- rhsAtomDomain_);
+ masked_atom_domain_rhs_integral(rhsMaskMD,
+ fields,
+ rhsAtomDomain_,
+ physicsModel);
for (FIELDS::const_iterator field = fields.begin();
field != fields.end(); field++) {
FieldName thisFieldName = field->first;
if ( ((rhs[thisFieldName].quantity()).size() > 0)
&& ((rhsAtomDomain_[thisFieldName].quantity()).size() > 0) )
rhs[thisFieldName] += rhsAtomDomain_[thisFieldName].quantity();
}
}
else { // domain == FULL_DOMAIN
feEngine_->compute_rhs_vector(rhsMask,
fields,
physicsModel,
elementToMaterialMap_,
rhs);
}
}
//--------------------------------------------------
void ATC_Coupling::initialize()
{
// initialize physics model
if (physicsModel_) physicsModel_->initialize();
ATC_Method::initialize();
// initialized_ is set to true by derived class initialize()
// STEP 6 - data initialization continued: set initial conditions
if (!initialized_) {
// Apply integration masking and new ICs
// initialize schedule derivatives
try {
set_initial_conditions();
}
catch (ATC::ATC_Error& atcError) {
if (!useRestart_)
throw;
}
}
// initialize and fix computational geometry, this can be changed in the future for Eulerian calculations that fill and empty elements which is why it is outside a !initialized_ guard
internalElement_->unfix_quantity();
if (ghostElement_) ghostElement_->unfix_quantity();
internalElement_->quantity();
if (ghostElement_) ghostElement_->quantity();
nodalGeometryType_->quantity();
internalElement_->fix_quantity();
if (ghostElement_) ghostElement_->fix_quantity();
reset_flux_mask();
// setup grouping of atoms by material
reset_atom_materials();
// reset time filters if needed
if (timeFilterManager_.need_reset()) {
if ((!initialized_) || (atomToElementMapType_ == EULERIAN)) {
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
if (is_intrinsic(thisField) && is_dynamic(thisField)) {
compute_mass_matrix(thisField);
if (!useConsistentMassMatrix_(thisField) && !useFeMdMassMatrix_) {
massMatsMd_[thisField] = massMatsMdInstantaneous_[thisField].quantity();
massMatsAq_[thisField] = massMatsAqInstantaneous_[thisField].quantity();
update_mass_matrix(thisField);
}
}
}
}
}
// prepare computes for first timestep
lammpsInterface_->computes_addstep(lammpsInterface_->ntimestep()+1);
}
//-------------------------------------------------------------------
void ATC_Coupling::construct_time_integration_data()
{
if (!initialized_) {
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
int thisSize = field->second;
// Allocate fields, initialize to default values, set up initial schedule
fields_[thisField].reset(nNodes_,thisSize);
dot_fields_[thisField].reset(nNodes_,thisSize);
ddot_fields_[thisField].reset(nNodes_,thisSize);
dddot_fields_[thisField].reset(nNodes_,thisSize);
// Allocate restricted fields
if (is_intrinsic(thisField)) {
nodalAtomicFields_[thisField].reset(nNodes_,thisSize);
nodalAtomicFieldsRoc_[thisField].reset(nNodes_,thisSize);
}
// Dimension finite element rhs matrix
rhs_[thisField].reset(nNodes_,thisSize);
rhsAtomDomain_[thisField].reset(nNodes_,thisSize);
sources_[thisField].reset(nNodes_,thisSize);
extrinsicSources_[thisField].reset(nNodes_,thisSize);
boundaryFlux_[thisField].reset(nNodes_,thisSize);
if (is_intrinsic(thisField) && is_dynamic(thisField)) {
massMats_[thisField].reset(nNodes_,nNodes_); // PARALLELIZE
massMatsFE_[thisField].reset(nNodes_,nNodes_);
massMatsAq_[thisField].reset(nNodes_,nNodes_);
massMatsMd_[thisField].reset(nNodes_,nNodes_);
massMatsMdInstantaneous_[thisField].reset(nNodes_,nNodes_);
massMatsAqInstantaneous_[thisField].reset(nNodes_,nNodes_);
massMatsInv_[thisField].reset(nNodes_,nNodes_); // PARALLELIZE
massMatsMdInv_[thisField].reset(nNodes_,nNodes_); // PARALLELIZE
}
else {
// no MD mass matrices needed, regular matrices computed in extrinsic model
if (useConsistentMassMatrix_(thisField)) {
// compute FE mass matrix in full domain
consistentMassMats_[thisField].reset(nNodes_,nNodes_); // PARALLELIZE
consistentMassMatsInv_[thisField].reset(nNodes_,nNodes_); // PARALLELIZE
}
else {
massMats_[thisField].reset(nNodes_,nNodes_); // PARALLELIZE
massMatsInv_[thisField].reset(nNodes_,nNodes_); // PARALLELIZE
}
}
}
}
}
//--------------------------------------------------------
+ // create_full_element_mask
+ // constructs element mask which only masks out
+ // null elements
+ //--------------------------------------------------------
+ MatrixDependencyManager<DenseMatrix, bool> * ATC_Coupling::create_full_element_mask()
+ {
+ MatrixDependencyManager<DenseMatrix, bool> * elementMaskMan = new MatrixDependencyManager<DenseMatrix, bool>(feEngine_->num_elements(),1);
+ DenseMatrix<bool> & elementMask(elementMaskMan->set_quantity());
+ elementMask = true;
+
+ const set<int> & nullElements = feEngine_->null_elements();
+ set<int>::const_iterator iset;
+ for (iset = nullElements.begin(); iset != nullElements.end(); iset++) {
+ int ielem = *iset;
+ elementMask(ielem,0) = false;
+ }
+
+ return elementMaskMan;
+ }
+ //--------------------------------------------------------
+ // create_element_set_mask
+ // constructs element mask based on an element set,
+ // uses ints for MPI communication later
+ //--------------------------------------------------------
+ MatrixDependencyManager<DenseMatrix, int> * ATC_Coupling::create_element_set_mask(const string & elementSetName)
+ {
+ MatrixDependencyManager<DenseMatrix, int> * elementMaskMan = new MatrixDependencyManager<DenseMatrix, int>(feEngine_->num_elements(),1);
+ DenseMatrix<int> & elementMask(elementMaskMan->set_quantity());
+ elementMask = false;
+
+ const set<int> & elementSet((feEngine_->fe_mesh())->elementset(elementSetName));
+ set<int>::const_iterator iset;
+ for (iset = elementSet.begin(); iset != elementSet.end(); ++iset) {
+ int ielem = *iset;
+ elementMask(ielem,0) = true;
+ }
+
+ const set<int> & nullElements = feEngine_->null_elements();
+ for (iset = nullElements.begin(); iset != nullElements.end(); iset++) {
+ int ielem = *iset;
+ elementMask(ielem,0) = false;
+ }
+
+ return elementMaskMan;
+ }
+ //--------------------------------------------------------
// set_computational_geometry
// constructs needed transfer operators which define
// hybrid atom/FE computational geometry
//--------------------------------------------------------
void ATC_Coupling::set_computational_geometry()
{
ATC_Method::set_computational_geometry();
+ // does element contain internal atoms
+ if (internalElementSet_.size()) {
+ // set up elements and maps based on prescribed element sets
+ internalElement_ = create_element_set_mask(internalElementSet_);
+ }
+ else {
+ internalElement_ = new AtomTypeElement(this,atomElement_);
+ }
+ interscaleManager_.add_dense_matrix_int(internalElement_,
+ "ElementHasInternal");
+
if (groupbitGhost_) {
atomGhostElement_ = new AtomToElementMap(this,
atomGhostCoarseGrainingPositions_,
GHOST);
interscaleManager_.add_per_atom_int_quantity(atomGhostElement_,
"AtomGhostElement");
- }
-
- // does element contain internal atoms
- internalElement_ = new AtomTypeElement(this,atomElement_);
- interscaleManager_.add_dense_matrix_int(internalElement_,
- "ElementHasInternal");
- // does element contain ghost atoms
- if (atomGhostElement_) {
+
+ // does element contain ghost atoms
ghostElement_ = new AtomTypeElement(this,atomGhostElement_);
interscaleManager_.add_dense_matrix_int(ghostElement_,
"ElementHasGhost");
}
- // element masking for FE quadrature
+
+ // element masking for approximate right-hand side FE atomic quadrature
if (atomQuadForInternal_) {
- elementMask_ = new MatrixDependencyManager<DenseMatrix, bool>(feEngine_->num_elements(),1);
- DenseMatrix<bool> & elementMask(elementMask_->set_quantity());
- elementMask = true;
-
- const set<int> & nullElements = feEngine_->null_elements();
- set<int>::const_iterator iset;
- for (iset = nullElements.begin(); iset != nullElements.end(); iset++) {
- int ielem = *iset;
- elementMask(ielem,0) = false;
- }
+ elementMask_ = create_full_element_mask();
}
else {
- elementMask_ = new ElementMask(this);
+ if (internalElementSet_.size()) {
+ // when geometry is based on elements, there are no mixed elements
+ elementMask_ = new MatrixDependencyManager<DenseMatrix, bool>;
+ (elementMask_->set_quantity()).reset(feEngine_->num_elements(),1,false);
+ }
+ else {
+ elementMask_ = new ElementMask(this);
+ }
internalToMask_ = new AtomToElementset(this,elementMask_);
interscaleManager_.add_per_atom_int_quantity(internalToMask_,
"InternalToMaskMap");
}
interscaleManager_.add_dense_matrix_bool(elementMask_,
- "ElementMask");
- // node type
- nodalGeometryType_ = new NodalGeometryType(this);
+ "ElementMask");
+
+ if (useFeMdMassMatrix_) {
+ if (atomQuadForInternal_) {
+ elementMaskMass_ = elementMask_;
+ }
+ else {
+ elementMaskMass_ = create_full_element_mask();
+ interscaleManager_.add_dense_matrix_bool(elementMaskMass_,
+ "NonNullElementMask");
+ }
+
+ elementMaskMassMd_ = new AtomElementMask(this);
+ interscaleManager_.add_dense_matrix_bool(elementMaskMassMd_,
+ "InternalElementMask");
+ }
+
+ // assign element and node types for computational geometry
+ if (internalElementSet_.size()) {
+ nodalGeometryType_ = new NodalGeometryTypeElementSet(this);
+ }
+ else {
+ nodalGeometryType_ = new NodalGeometryType(this);
+ }
interscaleManager_.add_dense_matrix_int(nodalGeometryType_,
- "NodalGeometryType");
+ "NodalGeometryType");
}
//--------------------------------------------------------
- // construct_transfers
- // constructs needed transfer operators
+ // construct_interpolant
+ // constructs: interpolatn, accumulant, weights, and spatial derivatives
//--------------------------------------------------------
- void ATC_Coupling::construct_transfers()
+ void ATC_Coupling::construct_interpolant()
{
- ATC_Method::construct_transfers();
-
// finite element shape functions for interpolants
PerAtomShapeFunction * atomShapeFunctions = new PerAtomShapeFunction(this);
interscaleManager_.add_per_atom_sparse_matrix(atomShapeFunctions,"Interpolant");
shpFcn_ = atomShapeFunctions;
- if (groupbitGhost_) {
- atomShapeFunctions = new PerAtomShapeFunction(this,
- atomGhostCoarseGrainingPositions_,
- atomGhostElement_,
- GHOST);
- interscaleManager_.add_per_atom_sparse_matrix(atomShapeFunctions,"InterpolantGhost");
- shpFcnGhost_ = atomShapeFunctions;
- }
// use shape functions for accumulants if no kernel function is provided
if (!kernelFunction_) {
accumulant_ = shpFcn_;
}
else {
if (kernelOnTheFly_) throw ATC_Error("ATC_Coupling::construct_transfers - on the fly kernel evaluations not supported");
PerAtomKernelFunction * atomKernelFunctions = new PerAtomKernelFunction(this);
interscaleManager_.add_per_atom_sparse_matrix(atomKernelFunctions,
"Accumulant");
accumulant_ = atomKernelFunctions;
accumulantWeights_ = new AccumulantWeights(accumulant_);
mdMassNormalization_ = false;
}
-
- // add species transfer operators
- map<string,pair<IdType,int> >::const_iterator specid;
- for (specid = speciesIds_.begin(); specid != speciesIds_.end(); specid++) {
- const string specie = specid->first;
- LargeToSmallAtomMap * specieMap;
- if ((specid->second).first == ATOM_TYPE) {
- specieMap = new AtomToType(this,(specid->second).second);
- interscaleManager_.add_per_atom_int_quantity(specieMap,
- "AtomMap"+specie);
+ this->create_atom_volume();
+
+ // masked atom weights
+ if (atomQuadForInternal_) {
+ atomicWeightsMask_ = atomVolume_;
+ }
+ else {
+ atomicWeightsMask_ = new MappedDiagonalMatrix(this,
+ atomVolume_,
+ internalToMask_);
+ interscaleManager_.add_diagonal_matrix(atomicWeightsMask_,
+ "AtomWeightsMask");
+ }
+ // nodal volumes for mass matrix, relies on atomVolumes constructed in base class construct_transfers
+ nodalAtomicVolume_ = new AdmtfShapeFunctionRestriction(this,atomVolume_,shpFcn_);
+ interscaleManager_.add_dense_matrix(nodalAtomicVolume_,"NodalAtomicVolume");
+
+ // shape function derivatives, masked shape function and derivatives if needed for FE quadrature in atomic domain
+ if (atomQuadForInternal_) {
+ shpFcnDerivs_ = new PerAtomShapeFunctionGradient(this);
+ interscaleManager_.add_vector_sparse_matrix(shpFcnDerivs_,
+ "InterpolantGradient");
+
+ shpFcnMask_ = shpFcn_;
+ shpFcnDerivsMask_ = shpFcnDerivs_;
+ }
+ else {
+ bool hasMaskedElt = false;
+ const DenseMatrix<bool> & elementMask(elementMask_->quantity());
+ for (int i = 0; i < elementMask.size(); ++i) {
+ if (elementMask(i,0)) {
+ hasMaskedElt = true;
+ break;
+ }
}
- else { // if ((specie->second).first == ATOM_GROUP)
- specieMap = new AtomToGroup(this,(specid->second).second);
- interscaleManager_.add_per_atom_int_quantity(specieMap,
- "AtomMap"+specie);
+ if (hasMaskedElt) {
+ shpFcnDerivs_ = new PerAtomShapeFunctionGradient(this);
+ interscaleManager_.add_vector_sparse_matrix(shpFcnDerivs_,
+ "InterpolantGradient");
+
+ shpFcnMask_ = new RowMappedSparseMatrix(this,
+ shpFcn_,
+ internalToMask_);
+ interscaleManager_.add_sparse_matrix(shpFcnMask_,
+ "ShapeFunctionMask");
+ shpFcnDerivsMask_ = new RowMappedSparseMatrixVector(this,
+ shpFcnDerivs_,
+ internalToMask_);
+ interscaleManager_.add_vector_sparse_matrix(shpFcnDerivsMask_,"ShapeFunctionGradientMask");
}
- ReducedSparseMatrix * accumulantSpecie = new ReducedSparseMatrix(this,
- accumulant_,
- specieMap);
- interscaleManager_.add_sparse_matrix(accumulantSpecie,"Accumulant"+specie);
}
-
- // add molecule transfer operators
+ }
+ //--------------------------------------------------------
+ // construct_molecule_transfers
+ //--------------------------------------------------------
+ void ATC_Coupling::construct_molecule_transfers()
+ {
map<string,pair<MolSize,int> >::const_iterator molecule;
PerAtomQuantity<double> * atomProcGhostCoarseGrainingPositions = interscaleManager_.per_atom_quantity("AtomicProcGhostCoarseGrainingPositions");
FundamentalAtomQuantity * mass = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
PROC_GHOST);
for (molecule = moleculeIds_.begin(); molecule != moleculeIds_.end(); molecule++) {
const string moleculeName = molecule->first;
int groupbit = (molecule->second).second;
SmallMoleculeSet * smallMoleculeSet = new SmallMoleculeSet(this,groupbit);
smallMoleculeSet->initialize();
interscaleManager_.add_small_molecule_set(smallMoleculeSet,moleculeName);
SmallMoleculeCentroid * moleculeCentroid =
new SmallMoleculeCentroid(this,mass,smallMoleculeSet,atomProcGhostCoarseGrainingPositions);
interscaleManager_.add_dense_matrix(moleculeCentroid,"MoleculeCentroid"+moleculeName);
// shape function at molecular coordinates
PointToElementMap * elementMapMol =
new PointToElementMap(this,moleculeCentroid);
interscaleManager_.add_dense_matrix_int(elementMapMol,
"ElementMap"+moleculeName);
InterpolantSmallMolecule * shpFcnMol = new InterpolantSmallMolecule(this,
elementMapMol, moleculeCentroid, smallMoleculeSet);
interscaleManager_.add_sparse_matrix(shpFcnMol,
"ShapeFunction"+moleculeName);
}
-
-
- this->create_atom_volume();
-
- // masked atom weights
- if (atomQuadForInternal_) {
- atomicWeightsMask_ = atomVolume_;
- }
- else {
- atomicWeightsMask_ = new MappedDiagonalMatrix(this,
- atomVolume_,
- internalToMask_);
- interscaleManager_.add_diagonal_matrix(atomicWeightsMask_,
- "AtomWeightsMask");
- }
+ }
+ //--------------------------------------------------------
+ // construct_transfers
+ // constructs needed transfer operators
+ //--------------------------------------------------------
+ void ATC_Coupling::construct_transfers()
+ {
+ ATC_Method::construct_transfers();
- // shape function derivatives
- PerAtomShapeFunctionGradient * atomShapeFunctionGradients = new PerAtomShapeFunctionGradient(this);
- interscaleManager_.add_vector_sparse_matrix(atomShapeFunctionGradients,
- "InterpolantGradient");
- shpFcnDerivs_ = atomShapeFunctionGradients;
- if (groupbitGhost_) {
- atomShapeFunctionGradients = new PerAtomShapeFunctionGradient(this,
- atomGhostElement_,
- atomGhostCoarseGrainingPositions_,
- "InterpolantGradientGhost",
- GHOST);
- interscaleManager_.add_vector_sparse_matrix(atomShapeFunctionGradients,
- "InterpolantGradientGhost");
- shpFcnDerivsGhost_ = atomShapeFunctionGradients;
- }
- // masked shape function and derivatives
- if (atomQuadForInternal_) {
- shpFcnMask_ = shpFcn_;
- shpFcnDerivsMask_ = shpFcnDerivs_;
- }
- else {
- shpFcnMask_ = new RowMappedSparseMatrix(this,
- shpFcn_,
- internalToMask_);
- interscaleManager_.add_sparse_matrix(shpFcnMask_,
- "ShapeFunctionMask");
- shpFcnDerivsMask_ = new RowMappedSparseMatrixVector(this,
- shpFcnDerivs_,
- internalToMask_);
- interscaleManager_.add_vector_sparse_matrix(shpFcnDerivsMask_,"ShapeFunctionGradientMask");
- }
-
- // nodal volumes for mass matrix, relies on atomVolumes constructed in base class construct_transfers
- nodalAtomicVolume_ = new AdmtfShapeFunctionRestriction(this,atomVolume_,shpFcn_);
- interscaleManager_.add_dense_matrix(nodalAtomicVolume_,"NodalAtomicVolume");
extrinsicModelManager_.construct_transfers();
}
//--------------------------------------------------
void ATC_Coupling::delete_mass_mat_time_filter(FieldName thisField)
{
}
//--------------------------------------------------
void ATC_Coupling::set_mass_mat_time_filter(FieldName thisField,TimeFilterManager::FilterIntegrationType filterIntegrationType)
{
massMatTimeFilters_[thisField] = timeFilterManager_.construct(filterIntegrationType);
}
//--------------------------------------------------------------
/** method to trigger construction of mesh data after mesh construction */
//--------------------------------------------------------------
void ATC_Coupling::initialize_mesh_data(void)
{
int nelts = feEngine_->fe_mesh()->num_elements();
elementToMaterialMap_.reset(nelts);
elementToMaterialMap_ = 0;
construct_prescribed_data_manager();
meshDataInitialized_ = true;
}
//--------------------------------------------------------
void ATC_Coupling::reset_flux_mask(void)
{
int i;
// this is exact only for uniform meshes and certain types of atomic weights
// \int_{\Omega_MD} N_I dV = \sum_\alpha N_I\alpha V_\alpha
fluxMask_.reset((invNodeVolumes_.quantity())
* (nodalAtomicVolume_->quantity()));
DIAG_MAT id(fluxMask_.nRows(),fluxMask_.nCols());
id = 1.0;
fluxMaskComplement_ = id + -1.0*fluxMask_;
// set flux masks for nodes we can tell by geometry
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
for (i = 0; i < nNodes_; ++i) {
if (nodeType(i,0)==MD_ONLY) {
fluxMask_(i,i) = 1.;
fluxMaskComplement_(i,i) = 0.;
}
else if (nodeType(i,0)==FE_ONLY) {
fluxMask_(i,i) = 0.;
fluxMaskComplement_(i,i) = 1.;
}
}
}
//--------------------------------------------------------
void ATC_Coupling::compute_mass_matrix(FieldName thisField, PhysicsModel * physicsModel)
{
if (!physicsModel) physicsModel = physicsModel_;
if (useConsistentMassMatrix_(thisField)) {
// compute FE mass matrix in full domain
Array<FieldName> massMask(1);
massMask(0) = thisField;
feEngine_->compute_mass_matrix(massMask,fields_,physicsModel,
elementToMaterialMap_,consistentMassMats_,
&(elementMask_->quantity()));
// brute force computation of inverse
consistentMassMatsInv_[thisField] = inv((consistentMassMats_[thisField].quantity()).dense_copy());
}
else { // lumped mass matrix
// compute FE mass matrix in full domain
Array<FieldName> massMask(1);
massMask(0) = thisField;
if (useFeMdMassMatrix_) {
feEngine_->compute_lumped_mass_matrix(massMask,fields_,physicsModel,
elementToMaterialMap_,massMats_,
- &(elementMask_->quantity()));
+ &(elementMaskMass_->quantity()));
const DIAG_MAT & myMassMat(massMats_[thisField].quantity());
DIAG_MAT & myMassMatInv(massMatsInv_[thisField].set_quantity());
- DIAG_MAT & myMassMatMDInv(massMatsMdInv_[thisField].set_quantity());
- (massMatsMd_[thisField].set_quantity()) = myMassMat;
+ DIAG_MAT & myMassMatMdInv(massMatsMdInv_[thisField].set_quantity());
+
+ feEngine_->compute_lumped_mass_matrix(massMask,fields_,physicsModel,
+ elementToMaterialMap_,massMatsMd_,
+ &(elementMaskMassMd_->quantity()));
+ const DIAG_MAT & myMassMatMd(massMatsMd_[thisField].quantity());
// compute inverse mass matrices since we're using lumped masses
for (int iNode = 0; iNode < nNodes_; iNode++) {
if (fabs(myMassMat(iNode,iNode))>0)
myMassMatInv(iNode,iNode) = 1./myMassMat(iNode,iNode);
else
myMassMatInv(iNode,iNode) = 0.;
- myMassMatMDInv = myMassMatInv;
+
+ if (fabs(myMassMatMd(iNode,iNode))>0)
+ myMassMatMdInv(iNode,iNode) = 1./myMassMatMd(iNode,iNode);
+ else
+ myMassMatMdInv(iNode,iNode) = 0.;
}
}
else {
feEngine_->compute_lumped_mass_matrix(massMask,fields_,physicsModel,
elementToMaterialMap_,massMatsFE_,
&(elementMask_->quantity()));
// fully remove contributions from internal nodes
DIAG_MAT & myMassMatFE(massMatsFE_[thisField].set_quantity());
if (!atomQuadForInternal_) {
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
for (int iNode = 0; iNode < nNodes_; iNode++)
if (nodeType(iNode,0)==MD_ONLY) {
myMassMatFE(iNode,iNode) = 0.;
}
}
// atomic quadrature for FE mass matrix in atomic domain
-
- feEngine_->compute_lumped_mass_matrix(massMask,fields_,physicsModel,atomMaterialGroupsMask_,
- atomicWeightsMask_->quantity(),shpFcnMask_->quantity(),
- massMatsAqInstantaneous_);
+ if (shpFcnMask_) {
+ feEngine_->compute_lumped_mass_matrix(massMask,fields_,physicsModel,atomMaterialGroupsMask_,
+ atomicWeightsMask_->quantity(),shpFcnMask_->quantity(),
+ massMatsAqInstantaneous_);
+ }
+ else {
+ (massMatsAqInstantaneous_[thisField].set_quantity()).reset(nNodes_,nNodes_);
+ }
// set up mass MD matrices
compute_md_mass_matrix(thisField,massMatsMdInstantaneous_[thisField].set_quantity());
}
}
}
//--------------------------------------------------------
void ATC_Coupling::update_mass_matrix(FieldName thisField)
{
DIAG_MAT & myMassMat(massMats_[thisField].set_quantity());
DIAG_MAT & myMassMatInv(massMatsInv_[thisField].set_quantity());
DIAG_MAT & myMassMatMDInv(massMatsMdInv_[thisField].set_quantity());
const DIAG_MAT & myMassMatMD(massMatsMd_[thisField].quantity());
myMassMat = massMatsFE_[thisField].quantity();
// remove contributions from overlap by approximate quadrature
myMassMat -= massMatsAq_[thisField].quantity();
// add contributions from atomic region
myMassMat += myMassMatMD;
// compute inverse mass matrices since we're using lumped masses
for (int iNode = 0; iNode < nNodes_; iNode++) {
if (fabs(myMassMatMD(iNode,iNode))>0) {
myMassMatMDInv(iNode,iNode) = 1./myMassMatMD(iNode,iNode);
}
else
myMassMatMDInv(iNode,iNode) = 0.;
if (fabs(myMassMat(iNode,iNode))>0) {
myMassMatInv(iNode,iNode) = 1./myMassMat(iNode,iNode);
}
else
myMassMatInv(iNode,iNode) = 0.;
}
}
//--------------------------------------------------------
void ATC_Coupling::reset_atom_materials()
{
int nMaterials = physicsModel_->nMaterials();
atomMaterialGroups_.reset(nMaterials);
atomMaterialGroupsMask_.reset(nMaterials);
for (int i = 0; i < nMaterials; i++) {
atomMaterialGroups_(i).clear();
atomMaterialGroupsMask_(i).clear();
}
const INT_ARRAY & atomToElementMap(atomElement_->quantity());
for (int i = 0; i < nLocal_; i++) {
atomMaterialGroups_(elementToMaterialMap_(atomToElementMap(i,0))).insert(i);
}
if (atomQuadForInternal_) {
for (int i = 0; i < nLocal_; i++) {
atomMaterialGroupsMask_(elementToMaterialMap_(atomToElementMap(i,0))).insert(i);
}
}
else {
const INT_ARRAY & map(internalToMask_->quantity());
for (int i = 0; i < nLocal_; i++) {
int idx = map(i,0);
if (idx > -1) {
atomMaterialGroupsMask_(elementToMaterialMap_(atomToElementMap(i,0))).insert(idx);
}
}
}
}
-//--------------------------------------------------------
+
+ //--------------------------------------------------------
+ // pre_init_integrate
+ // time integration before the lammps atomic
+ // integration of the Verlet step 1
+ //--------------------------------------------------------
+ void ATC_Coupling::pre_init_integrate()
+ {
+ ATC_Method::pre_init_integrate();
+ double dt = lammpsInterface_->dt();
+
+ // Perform any initialization, no actual integration
+ for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
+ (_tiIt_->second)->pre_initial_integrate1(dt);
+ }
+
+ // Apply controllers to atom velocities, if needed
+ atomicRegulator_->apply_pre_predictor(dt,lammpsInterface_->ntimestep());
+
+ // predict nodal fields and time derivatives
+ for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
+ (_tiIt_->second)->pre_initial_integrate2(dt);
+ }
+ extrinsicModelManager_.pre_init_integrate();
+ }
+
+ //--------------------------------------------------------
+ // mid_init_integrate
+ // time integration between the velocity update and
+ // the position lammps update of Verlet step 1
+ //--------------------------------------------------------
+ void ATC_Coupling::mid_init_integrate()
+ {
+ double dt = lammpsInterface_->dt();
+
+ // Compute nodal velocity at n+1/2, if needed
+ for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
+ (_tiIt_->second)->mid_initial_integrate1(dt);
+ }
+
+ atomicRegulator_->apply_mid_predictor(dt,lammpsInterface_->ntimestep());
+
+ extrinsicModelManager_.mid_init_integrate();
+ }
+
+ ///--------------------------------------------------------
+ // post_init_integrate
+ // time integration after the lammps atomic updates of
+ // Verlet step 1
+ //--------------------------------------------------------
void ATC_Coupling::post_init_integrate()
{
+ double dt = lammpsInterface_->dt();
+
+ // Compute nodal velocity at n+1
+ for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
+ (_tiIt_->second)->post_initial_integrate1(dt);
+ }
+
+ // Update kinetostat quantities if displacement is being regulated
+ atomicRegulator_->apply_post_predictor(dt,lammpsInterface_->ntimestep());
+
+ // Update extrisic model
+ extrinsicModelManager_.post_init_integrate();
+
+ // fixed values, non-group bcs handled through FE
+ set_fixed_nodes();
+
+ update_time(0.5);
+
+ // ghost update, if needed
+ ATC_Method::post_init_integrate();
+
// Apply time filtering to mass matrices, if needed
if (timeFilterManager_.filter_dynamics() && !useFeMdMassMatrix_) {
- double dt = lammpsInterface_->dt();
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
if (!useConsistentMassMatrix_(thisField) && is_intrinsic(thisField)) {
massMatTimeFilters_[thisField]->apply_pre_step1(massMatsAq_[thisField].set_quantity(),
massMatsAqInstantaneous_[thisField].quantity(),dt);
massMatTimeFilters_[thisField]->apply_pre_step1(massMatsMd_[thisField].set_quantity(),
massMatsMdInstantaneous_[thisField].quantity(),dt);
}
}
}
}
//--------------------------------------------------------
void ATC_Coupling::pre_neighbor()
{
ATC_Method::pre_neighbor();
reset_atom_materials();
}
//--------------------------------------------------------
void ATC_Coupling::pre_exchange()
{
ATC_Method::pre_exchange();
}
//--------------------------------------------------------
void ATC_Coupling::post_force()
{
ATC_Method::post_force();
if ( (atomToElementMapType_ == EULERIAN) && (step() % atomToElementMapFrequency_ == 0) ) {
reset_atom_materials();
if (!useFeMdMassMatrix_) {
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
if (is_intrinsic(thisField) && is_dynamic(thisField)) {
compute_mass_matrix(thisField);
}
}
}
}
if (atomToElementMapType_ == EULERIAN && !useFeMdMassMatrix_) {
if (timeFilterManager_.filter_dynamics() || (step() % atomToElementMapFrequency_ == 0)) {
double dt = lammpsInterface_->dt();
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
if (is_intrinsic(thisField) && is_dynamic(thisField)) {
massMatTimeFilters_[thisField]->apply_post_step1(massMatsAq_[thisField].set_quantity(),
massMatsAqInstantaneous_[thisField].quantity(),dt);
massMatTimeFilters_[thisField]->apply_post_step1(massMatsMd_[thisField].set_quantity(),
massMatsMdInstantaneous_[thisField].quantity(),dt);
update_mass_matrix(thisField);
}
}
}
}
// apply extrinsic model
extrinsicModelManager_.post_force();
}
//=================================================================
//
//=================================================================
void ATC_Coupling::finish()
{
ATC_Method::finish();
// Time integrator
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->finish();
}
}
//=================================================================
//
//=================================================================
void ATC_Coupling::compute_boundary_flux(const Array2D<bool> & rhsMask,
const FIELDS & fields,
FIELDS & rhs,
const Array< set <int> > atomMaterialGroups,
const VectorDependencyManager<SPAR_MAT * > * shpFcnDerivs,
const SPAR_MAN * shpFcn,
const DIAG_MAN * atomicWeights,
const MatrixDependencyManager<DenseMatrix, bool> * elementMask,
const RegulatedNodes * nodeSet)
{
if (bndyIntType_ == FE_QUADRATURE) {
feEngine_->compute_boundary_flux(rhsMask,
fields,
physicsModel_,
elementToMaterialMap_,
(* bndyFaceSet_),
rhs);
}
else if (bndyIntType_ == FE_INTERPOLATION) {
if (elementMask) {
feEngine_->compute_boundary_flux(rhsMask,
fields,
physicsModel_,
elementToMaterialMap_,
atomMaterialGroups,
atomicWeights->quantity(),
shpFcn->quantity(),
shpFcnDerivs->quantity(),
fluxMask_,
rhs,
&elementMask->quantity(),
&nodeSet->quantity());
}
else {
feEngine_->compute_boundary_flux(rhsMask,
fields,
physicsModel_,
elementToMaterialMap_,
atomMaterialGroups_,
atomVolume_->quantity(),
shpFcn_->quantity(),
shpFcnDerivs_->quantity(),
fluxMask_,
rhs);
}
}
else if (bndyIntType_ == NO_QUADRATURE) {
FIELDS::const_iterator field;
for (field = fields.begin(); field != fields.end(); field++) {
FieldName thisFieldName = field->first;
if (thisFieldName >= rhsMask.nRows()) break;
if (rhsMask(thisFieldName,FLUX)) {
int nrows = (field->second).nRows();
int ncols = (field->second).nCols();
rhs[thisFieldName].reset(nrows,ncols);
}
}
}
}
//-----------------------------------------------------------------
void ATC_Coupling::compute_flux(const Array2D<bool> & rhsMask,
const FIELDS & fields,
GRAD_FIELD_MATS & flux,
const PhysicsModel * physicsModel)
{
if (! physicsModel) { physicsModel = physicsModel_; }
feEngine_->compute_flux(rhsMask,
fields,
physicsModel,
elementToMaterialMap_,
flux);
}
//--------------------------------------------------------
void ATC_Coupling::nodal_projection(const FieldName & fieldName,
const PhysicsModel * physicsModel,
FIELD & field)
{
FIELDS rhs;
rhs[fieldName].reset(nNodes_,field.nCols());
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX);
rhsMask = false;
rhsMask(fieldName,SOURCE) = true;
compute_rhs_vector(rhsMask, fields_, rhs, sourceIntegration_, physicsModel);
const DENS_MAT & B(rhs[fieldName].quantity());
field = (invNodeVolumes_.quantity())*B;
}
// parse_boundary_integration
// parses the boundary integration to determine
// the type of boundary integration being used
//--------------------------------------------------
BoundaryIntegrationType ATC_Coupling::parse_boundary_integration(int narg,
char **arg,
const set< pair<int,int> > * boundaryFaceSet)
{
int argIndex = 0;
BoundaryIntegrationType myBoundaryIntegrationType = FE_INTERPOLATION;// default
if (narg > 0) {
if(strcmp(arg[argIndex],"faceset")==0) {
argIndex++;
myBoundaryIntegrationType = FE_QUADRATURE;
string name(arg[argIndex]);
boundaryFaceSet = & ( (feEngine_->fe_mesh())->faceset(name));
set_boundary_face_set(boundaryFaceSet);
}
else if (strcmp(arg[argIndex],"interpolate")==0) {
myBoundaryIntegrationType = FE_INTERPOLATION;
}
else if (strcmp(arg[argIndex],"no_boundary")==0) {
myBoundaryIntegrationType = NO_QUADRATURE;
}
else {
throw ATC_Error("Bad boundary integration type");
}
}
set_boundary_integration_type(myBoundaryIntegrationType);
return myBoundaryIntegrationType;
}
}; // namespace ATC
diff --git a/lib/atc/ATC_Coupling.h b/lib/atc/ATC_Coupling.h
index a890d9d83..464db3307 100644
--- a/lib/atc/ATC_Coupling.h
+++ b/lib/atc/ATC_Coupling.h
@@ -1,424 +1,439 @@
#ifndef ATC_COUPLING_H
#define ATC_COUPLING_H
+#include <set>
+#include <map>
+#include <string>
+#include <utility>
+
// ATC headers
#include "ATC_Method.h"
#include "ExtrinsicModel.h"
-using namespace std;
-
namespace ATC {
// Forward declarations
class PrescribedDataManager;
class AtomicRegulator;
class TimeIntegrator;
class ReferencePositions;
/**
* @class ATC_Coupling
* @brief Base class for atom-continuum coupling
*/
class ATC_Coupling : public ATC_Method {
public: /** methods */
friend class ExtrinsicModel; // friend is not inherited
friend class ExtrinsicModelTwoTemperature;
friend class ExtrinsicModelDriftDiffusion;
friend class ExtrinsicModelDriftDiffusionConvection;
friend class ExtrinsicModelElectrostatic;
friend class ExtrinsicModelElectrostaticMomentum;
friend class SchrodingerPoissonSolver;
friend class SliceSchrodingerPoissonSolver;
/** constructor */
- ATC_Coupling(string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix);
+ ATC_Coupling(std::string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix);
/** destructor */
virtual ~ATC_Coupling();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** pre neighbor */
virtual void pre_neighbor();
/** pre exchange */
virtual void pre_exchange();
virtual void reset_atoms(){};
/** pre force */
virtual void pre_force() {};
/** post force */
virtual void post_force();
/** pre integration run */
virtual void initialize();
/** post integration run : called at end of run or simulation */
virtual void finish();
- /** Predictor phase, Verlet first step for velocity */
- virtual void init_integrate_velocity();
+ /** first time, before atomic integration */
+ virtual void pre_init_integrate();
/** Predictor phase, executed between velocity and position Verlet */
- virtual void mid_init_integrate(){};
-
- /** Predictor phase, Verlet first step for position */
- virtual void init_integrate_position();
+ virtual void mid_init_integrate();
/** Predictor phase, executed after Verlet */
virtual void post_init_integrate();
/** Corrector phase, executed before Verlet */
virtual void pre_final_integrate(){};
- /** Corrector phase, Verlet second step for velocity */
- virtual void final_integrate();
-
/** Corrector phase, executed after Verlet*/
virtual void post_final_integrate() {lammpsInterface_->computes_addstep(lammpsInterface_->ntimestep()+1);};
/** pre/post atomic force calculation in minimize */
virtual void min_pre_force(){};
virtual void min_post_force(){};
// data access
/** get map general atomic shape function matrix to overlap region */
SPAR_MAT &get_atom_to_overlap_mat() {return atomToOverlapMat_.set_quantity();};
/** get map general atomic shape function matrix to overlap region */
SPAR_MAN &atom_to_overlap_mat() {return atomToOverlapMat_;};
/** check if atomic quadrature is being used for MD_ONLY nodes */
bool atom_quadrature_on(){return atomQuadForInternal_;};
- const set<string> & boundary_face_names() {return boundaryFaceNames_;};
+ const std::set<std::string> & boundary_face_names() {return boundaryFaceNames_;};
/** access to boundary integration method */
int boundary_integration_type() {return bndyIntType_;};
void set_boundary_integration_type(int boundaryIntegrationType)
{bndyIntType_ = boundaryIntegrationType;};
- void set_boundary_face_set(const set< pair<int,int> > * boundaryFaceSet)
+ void set_boundary_face_set(const std::set< std::pair<int,int> > * boundaryFaceSet)
{bndyFaceSet_ = boundaryFaceSet;};
BoundaryIntegrationType parse_boundary_integration
- (int narg, char **arg, const set< pair<int,int> > * boundaryFaceSet);
+ (int narg, char **arg, const std::set< std::pair<int,int> > * boundaryFaceSet);
TemperatureDefType temperature_def() const {return temperatureDef_;};
void set_temperature_def(TemperatureDefType tdef) {temperatureDef_ = tdef;};
//--------------------------------------------------------
/** access to all boundary fluxes */
FIELDS &boundary_fluxes() {return boundaryFlux_;};
/** wrapper for FE_Engine's compute_boundary_flux functions */
void compute_boundary_flux(const Array2D<bool> & rhs_mask,
const FIELDS &fields,
FIELDS &rhs,
- const Array< set <int> > atomMaterialGroups,
+ const Array< std::set <int> > atomMaterialGroups,
const VectorDependencyManager<SPAR_MAT * > * shpFcnDerivs,
const SPAR_MAN * shpFcn = NULL,
const DIAG_MAN * atomicWeights = NULL,
const MatrixDependencyManager<DenseMatrix, bool> * elementMask = NULL,
const RegulatedNodes * nodeSet = NULL);
/** access to full right hand side / forcing vector */
FIELDS &rhs() {return rhs_;};
DENS_MAN &field_rhs(FieldName thisField) { return rhs_[thisField]; };
/** allow FE_Engine to construct ATC structures after mesh is constructed */
virtual void initialize_mesh_data(void);
// public for FieldIntegrator
bool source_atomic_quadrature(FieldName field)
{ return (sourceIntegration_ == FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE); }
ATC::IntegrationDomainType source_integration()
{ return sourceIntegration_; }
/** wrapper for FE_Engine's compute_sources */
void compute_sources_at_atoms(const RHS_MASK & rhsMask,
- const FIELDS & fields,
- const PhysicsModel * physicsModel,
- FIELD_MATS & atomicSources);
-
+ const FIELDS & fields,
+ const PhysicsModel * physicsModel,
+ FIELD_MATS & atomicSources);
+ /** computes tangent matrix using atomic quadrature near FE region */
+ void masked_atom_domain_rhs_tangent(const std::pair<FieldName,FieldName> row_col,
+ const RHS_MASK & rhsMask,
+ const FIELDS & fields,
+ SPAR_MAT & stiffness,
+ const PhysicsModel * physicsModel);
/** wrapper for FE_Engine's compute_rhs_vector functions */
void compute_rhs_vector(const RHS_MASK & rhs_mask,
const FIELDS &fields,
FIELDS &rhs,
const IntegrationDomainType domain, // = FULL_DOMAIN
const PhysicsModel * physicsModel=NULL);
/** wrapper for FE_Engine's compute_tangent_matrix */
- void compute_rhs_tangent(const pair<FieldName,FieldName> row_col,
+ void compute_rhs_tangent(const std::pair<FieldName,FieldName> row_col,
const RHS_MASK & rhsMask,
const FIELDS & fields,
SPAR_MAT & stiffness,
const IntegrationDomainType integrationType,
const PhysicsModel * physicsModel=NULL);
/** PDE type */
WeakEquation::PDE_Type pde_type(const FieldName fieldName) const;
/** is dynamic PDE */
bool is_dynamic(const FieldName fieldName) const;
// public for ImplicitSolveOperator
/** return pointer to PrescribedDataManager */
PrescribedDataManager * prescribed_data_manager()
{ return prescribedDataMgr_; }
// public for Kinetostat
DIAG_MAT &get_mass_mat(FieldName thisField)
{ return massMats_[thisField].set_quantity();};
/** */
DENS_MAN &atomic_source(FieldName thisField){return atomicSources_[thisField];};
//---------------------------------------------------------------
/** \name materials */
//---------------------------------------------------------------
/*@{*/
/** access to element to material map */
Array<int> &element_to_material_map(void){return elementToMaterialMap_;}
/*@}*/
/** check if method is tracking charge */
bool track_charge() {return trackCharge_;};
void set_mass_mat_time_filter(FieldName thisField,TimeFilterManager::FilterIntegrationType filterIntegrationType);
/** return referece to ExtrinsicModelManager */
ExtrinsicModelManager & extrinsic_model_manager()
{ return extrinsicModelManager_; }
/** access to time integrator */
const TimeIntegrator * time_integrator(const FieldName & field) const {
_ctiIt_ = timeIntegrators_.find(field);
if (_ctiIt_ == timeIntegrators_.end()) return NULL;
return _ctiIt_->second;
};
//---------------------------------------------------------------
/** \name managers */
//---------------------------------------------------------------
/*@{*/
/** allow FE_Engine to construct data manager after mesh is constructed */
void construct_prescribed_data_manager (void);
/** method to create physics model */
void create_physics_model(const PhysicsType & physicsType,
- string matFileName);
+ std::string matFileName);
/** access to physics model */
PhysicsModel * physics_model() {return physicsModel_; };
/*@}*/
//---------------------------------------------------------------
/** \name creation */
//---------------------------------------------------------------
/*@{*/
/** set up atom to material identification */
virtual void reset_atom_materials();
/** */
void reset_node_mask();
/** */
void reset_overlap_map();
/*@}*/
//---------------------------------------------------------------
/** \name output/restart */
//---------------------------------------------------------------
/*@{*/
void pack_fields(RESTART_LIST & data);
void output() { ATC_Method::output(); }
/*@}*/
//---------------------------------------------------------------
/** \name initial & boundary conditions */
//---------------------------------------------------------------
/*@{*/
/** mask for computation of fluxes */
void set_fixed_nodes();
/** set initial conditions by changing fields */
void set_initial_conditions();
/*@}*/
//---------------------------------------------------------------
/** \name sources */
//---------------------------------------------------------------
/** calculate and set matrix of sources_ */
void set_sources();
/** assemble various contributions to the heat flux in the atomic region */
void compute_atomic_sources(const Array2D<bool> & rhs_mask,
const FIELDS &fields,
FIELDS &atomicSources);
DENS_MAT &get_source(FieldName thisField){return sources_[thisField].set_quantity();};
DENS_MAN &source(FieldName thisField){return sources_[thisField];};
FIELDS & sources(){return sources_;};
/** access to name atomic source terms */
DENS_MAT &get_atomic_source(FieldName thisField){return atomicSources_[thisField].set_quantity();};
/** access to name extrinsic source terms */
DENS_MAT &get_extrinsic_source(FieldName thisField){return extrinsicSources_[thisField].set_quantity();};
DENS_MAN &extrinsic_source(FieldName thisField){return extrinsicSources_[thisField];};
/** nodal projection of a field through the physics model */
void nodal_projection(const FieldName & fieldName,
const PhysicsModel * physicsModel,
FIELD & field);
/*@}*/
//---------------------------------------------------------------
/** \name fluxes */
//---------------------------------------------------------------
/*@{*/
/** access for field mask */
Array2D<bool> &field_mask() {return fieldMask_;};
/** create field mask */
void reset_flux_mask();
/** wrapper for FE_Engine's compute_flux functions */
void compute_flux(const Array2D<bool> & rhs_mask,
const FIELDS &fields,
GRAD_FIELD_MATS &flux,
const PhysicsModel * physicsModel=NULL);
+ /** evaluate rhs on the atomic domain which is near the FE region */
+ void masked_atom_domain_rhs_integral(const Array2D<bool> & rhs_mask,
+ const FIELDS &fields,
+ FIELDS &rhs,
+ const PhysicsModel * physicsModel);
/** evaluate rhs on a specified domain defined by mask and physics model */
void evaluate_rhs_integral(const Array2D<bool> & rhs_mask,
const FIELDS &fields,
FIELDS &rhs,
const IntegrationDomainType domain,
const PhysicsModel * physicsModel=NULL);
/** access to boundary fluxes */
DENS_MAT &get_boundary_flux(FieldName thisField){return boundaryFlux_[thisField].set_quantity();};
DENS_MAN &boundary_flux(FieldName thisField){return boundaryFlux_[thisField];};
/** access to finite element right-hand side data */
DENS_MAT &get_field_rhs(FieldName thisField)
{ return rhs_[thisField].set_quantity(); };
/*@}*/
//---------------------------------------------------------------
/** \name mass matrices */
//---------------------------------------------------------------
/*@{*/
// atomic field time derivative filtering
virtual void init_filter(void);
// mass matrix filtering
void delete_mass_mat_time_filter(FieldName thisField);
/** compute mass matrix for requested field */
void compute_mass_matrix(FieldName thisField, PhysicsModel * physicsModel = NULL);
/** updates filtering of MD contributions */
void update_mass_matrix(FieldName thisField);
private: /** methods */
ATC_Coupling(); // do not define
protected: /** data */
//---------------------------------------------------------------
/** initialization routines */
//---------------------------------------------------------------
/** sets up all data necessary to define the computational geometry */
virtual void set_computational_geometry();
/** constructs all data which is updated with time integration, i.e. fields */
virtual void construct_time_integration_data();
/** create methods, e.g. time integrators, filters */
virtual void construct_methods();
/** set up data which is dependency managed */
virtual void construct_transfers();
+ /** sets up mol transfers */
+ virtual void construct_molecule_transfers();
+ /** sets up accumulant & interpolant */
+ virtual void construct_interpolant();
//---------------------------------------------------------------
/** status */
//---------------------------------------------------------------
/*@{*/
/** flag on if FE nodes in MD region should be initialized to projected MD values */
bool consistentInitialization_;
bool equilibriumStart_;
bool useFeMdMassMatrix_;
/** flag to determine if charge is tracked */
bool trackCharge_;
/** temperature definition model */
TemperatureDefType temperatureDef_;
/*@}*/
//---------------------------------------------------------------
/** \name managers */
//---------------------------------------------------------------
/*@{*/
/** prescribed data handler */
PrescribedDataManager * prescribedDataMgr_;
/** pointer to physics model */
PhysicsModel * physicsModel_;
/** manager for extrinsic models */
ExtrinsicModelManager extrinsicModelManager_;
/** manager for regulator */
AtomicRegulator * atomicRegulator_;
/** managers for time integrators per field */
- map<FieldName,TimeIntegrator * > timeIntegrators_;
+ std::map<FieldName,TimeIntegrator * > timeIntegrators_;
/** time integrator iterator */
- mutable map<FieldName,TimeIntegrator * >::iterator _tiIt_;
+ mutable std::map<FieldName,TimeIntegrator * >::iterator _tiIt_;
/** time integrator const iterator */
- mutable map<FieldName,TimeIntegrator * >::const_iterator _ctiIt_;
+ mutable std::map<FieldName,TimeIntegrator * >::const_iterator _ctiIt_;
/*@}*/
//---------------------------------------------------------------
/** materials */
//---------------------------------------------------------------
/*@{*/
Array<int> elementToMaterialMap_; // ATOMIC_TAG * elementToMaterialMap_;
/** atomic ATC material tag */
- Array< set <int> > atomMaterialGroups_; // ATOMIC_TAG*atomMaterialGroups_;
- Array< set <int> > atomMaterialGroupsMask_; // ATOMIC_TAG*atomMaterialGroupsMask_;
+ Array< std::set <int> > atomMaterialGroups_; // ATOMIC_TAG*atomMaterialGroups_;
+ Array< std::set <int> > atomMaterialGroupsMask_; // ATOMIC_TAG*atomMaterialGroupsMask_;
/*@}*/
//---------------------------------------------------------------
/** computational geometry */
//---------------------------------------------------------------
/*@{*/
bool atomQuadForInternal_;
MatrixDependencyManager<DenseMatrix, bool> * elementMask_;
+ MatrixDependencyManager<DenseMatrix, bool> * elementMaskMass_;
+ MatrixDependencyManager<DenseMatrix, bool> * elementMaskMassMd_;
+ MatrixDependencyManager<DenseMatrix, bool> * create_full_element_mask();
+ MatrixDependencyManager<DenseMatrix, int> * create_element_set_mask(const std::string & elementSetName);
LargeToSmallAtomMap * internalToMask_;
- AtomTypeElement * internalElement_;
- AtomTypeElement * ghostElement_;
- NodalGeometryType * nodalGeometryType_;
+ MatrixDependencyManager<DenseMatrix, int> * internalElement_;
+ MatrixDependencyManager<DenseMatrix, int> * ghostElement_;
+ DenseMatrixTransfer<int> * nodalGeometryType_;
/*@}*/
/** \name boundary integration */
/*@{*/
/** boundary flux quadrature */
int bndyIntType_;
- const set< pair<int,int> > * bndyFaceSet_;
- set<string> boundaryFaceNames_;
+ const std::set< std::pair<int,int> > * bndyFaceSet_;
+ std::set<std::string> boundaryFaceNames_;
/*@}*/
//----------------------------------------------------------------
/** \name shape function matrices */
//----------------------------------------------------------------
/*@{*/
DIAG_MAN * atomicWeightsMask_;
SPAR_MAN * shpFcnMask_;
VectorDependencyManager<SPAR_MAT * > * shpFcnDerivsMask_;
Array<bool> atomMask_;
SPAR_MAN atomToOverlapMat_;
DIAG_MAN nodalMaskMat_;
/*@}*/
//---------------------------------------------------------------
/** \name PDE data */
//---------------------------------------------------------------
/*@{*/
/** mask for computation of fluxes */
Array2D<bool> fieldMask_;
DIAG_MAT fluxMask_;
DIAG_MAT fluxMaskComplement_;
/** sources */
FIELDS sources_;
FIELDS atomicSources_;
FIELDS extrinsicSources_;
ATC::IntegrationDomainType sourceIntegration_;
SPAR_MAT stiffnessAtomDomain_;
/** rhs/forcing terms */
FIELDS rhs_; // for pde
FIELDS rhsAtomDomain_; // for thermostat
FIELDS boundaryFlux_; // for thermostat & rhs pde
/*@}*/
// workspace variables
mutable DENS_MAT _deltaQuantity_;
};
};
#endif
diff --git a/lib/atc/ATC_CouplingEnergy.cpp b/lib/atc/ATC_CouplingEnergy.cpp
index 5a80620b0..066bf0b43 100644
--- a/lib/atc/ATC_CouplingEnergy.cpp
+++ b/lib/atc/ATC_CouplingEnergy.cpp
@@ -1,728 +1,715 @@
// ATC_Transfer headers
#include "ATC_CouplingEnergy.h"
#include "Thermostat.h"
#include "ATC_Error.h"
#include "PrescribedDataManager.h"
#include "FieldManager.h"
// Other Headers
#include <vector>
#include <set>
#include <utility>
#include <typeinfo>
+using std::string;
+
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class ATC_CouplingEnergy
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ATC_CouplingEnergy::ATC_CouplingEnergy(string groupName,
double ** & perAtomArray,
LAMMPS_NS::Fix * thisFix,
string matParamFile,
ExtrinsicModelType extrinsicModel)
: ATC_Coupling(groupName,perAtomArray,thisFix),
nodalAtomicHeatCapacity_(NULL),
nodalAtomicKineticTemperature_(NULL),
nodalAtomicConfigurationalTemperature_(NULL)
{
// Allocate PhysicsModel
create_physics_model(THERMAL, matParamFile);
// create extrinsic physics model
if (extrinsicModel != NO_MODEL) {
extrinsicModelManager_.create_model(extrinsicModel,matParamFile);
}
// Defaults
set_time();
bndyIntType_ = FE_INTERPOLATION;
// set up field data based on physicsModel
physicsModel_->num_fields(fieldSizes_,fieldMask_);
// set up atomic regulator
atomicRegulator_ = new Thermostat(this);
// set up physics specific time integrator and thermostat
timeIntegrators_[TEMPERATURE] = new ThermalTimeIntegrator(this,TimeIntegrator::GEAR);
// default physics
temperatureDef_ = KINETIC;
// output variable vector info:
// output[1] = total coarse scale thermal energy
// output[2] = average temperature
vectorFlag_ = 1;
sizeVector_ = 2;
scalarVectorFreq_ = 1;
extVector_ = 1;
if (extrinsicModel != NO_MODEL)
sizeVector_ += extrinsicModelManager_.size_vector(sizeVector_);
// create PE per atom ccompute
//lammpsInterface_->create_compute_pe_peratom();
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ATC_CouplingEnergy::~ATC_CouplingEnergy()
{
// clear out all managed memory to avoid conflicts with dependencies on class member data
interscaleManager_.clear();
}
//--------------------------------------------------------
// initialize
// sets up all the necessary data
//--------------------------------------------------------
void ATC_CouplingEnergy::initialize()
{
// Base class initalizations
ATC_Coupling::initialize();
// resetting precedence:
// time integrator -> thermostat -> time filter
// init_filter uses fieldRateNdFiltered which comes from the time integrator,
// which is why the time integrator is initialized first
- // set the reference potential, if necessary, because the nodal energy is needed to initialize the time integrator
- if (!initialized_) {
- if (temperatureDef_==TOTAL) {
- PerAtomQuantity<double> * atomicReferencePotential = interscaleManager_.per_atom_quantity("AtomicReferencePotential");
- PerAtomQuantity<double> * atomicPotentialEnergy = interscaleManager_.per_atom_quantity("AtomicPotentialEnergy");
- atomicReferencePotential->set_quantity() = atomicPotentialEnergy->quantity();
- }
- }
-
// other initializations
if (reset_methods()) {
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->initialize();
}
atomicRegulator_->initialize();
}
extrinsicModelManager_.initialize();
// reset thermostat power for time filter initial conditions for special cases
if (timeFilterManager_.need_reset()) {
init_filter();
}
- timeFilterManager_.initialize(); // clears need for reset
+ // clears need for reset
+ timeFilterManager_.initialize();
+ ghostManager_.initialize();
if (!initialized_) {
// initialize sources based on initial FE temperature
double dt = lammpsInterface_->dt();
prescribedDataMgr_->set_sources(time()+0.5*dt,sources_);
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
atomicRegulator_->compute_boundary_flux(fields_);
compute_atomic_sources(fieldMask_,fields_,atomicSources_);
// read in field data if necessary
if (useRestart_) {
RESTART_LIST data;
read_restart_data(restartFileName_,data);
useRestart_ = false;
}
// set consistent initial conditions, if requested
if (!timeFilterManager_.filter_dynamics()) {
if (consistentInitialization_) {
DENS_MAT & temperature(fields_[TEMPERATURE].set_quantity());
DENS_MAN * nodalAtomicTemperature(interscaleManager_.dense_matrix("NodalAtomicTemperature"));
const DENS_MAT & atomicTemperature(nodalAtomicTemperature->quantity());
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
for (int i = 0; i<nNodes_; ++i) {
if (nodeType(i,0)==MD_ONLY)
temperature(i,0) = atomicTemperature(i,0);
}
}
}
initialized_ = true;
}
// reset integration field mask
temperatureMask_.reset(NUM_FIELDS,NUM_FLUX);
temperatureMask_ = false;
for (int i = 0; i < NUM_FLUX; i++)
temperatureMask_(TEMPERATURE,i) = fieldMask_(TEMPERATURE,i);
}
//--------------------------------------------------------
// construct_methods
// have managers instantiate requested algorithms
// and methods
//--------------------------------------------------------
void ATC_CouplingEnergy::construct_methods()
{
ATC_Coupling::construct_methods();
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->construct_methods();
}
atomicRegulator_->construct_methods();
}
//--------------------------------------------------------
// construct_transfers
// constructs needed transfer operators
//--------------------------------------------------------
void ATC_CouplingEnergy::construct_transfers()
{
ATC_Coupling::construct_transfers();
// always need kinetic energy
AtomicEnergyForTemperature * atomicTwiceKineticEnergy = new TwiceKineticEnergy(this);
AtomicEnergyForTemperature * atomEnergyForTemperature = NULL;
// Appropriate per-atom quantity based on desired temperature definition
if (temperatureDef_==KINETIC) {
atomEnergyForTemperature = atomicTwiceKineticEnergy;
}
else if (temperatureDef_==TOTAL) {
if (timeIntegrators_[TEMPERATURE]->time_integration_type() != TimeIntegrator::FRACTIONAL_STEP)
throw ATC_Error("ATC_CouplingEnergy:construct_transfers() on the fractional step time integrator can be used with non-kinetic defitions of the temperature");
// kinetic energy
interscaleManager_.add_per_atom_quantity(atomicTwiceKineticEnergy,
"AtomicTwiceKineticEnergy");
// atomic potential energy
- //ComputedAtomQuantity * atomicPotentialEnergy = new ComputedAtomQuantity(this,lammpsInterface_->compute_pe_name(), 1./(lammpsInterface_->mvv2e()));
- //interscaleManager_.add_per_atom_quantity(atomicPotentialEnergy,
- // "AtomicPotentialEnergy");
- PerAtomQuantity<double> * atomicPotentialEnergy = interscaleManager_.per_atom_quantity("AtomicPotentialEnergy");
-
-/////////////////////////////////////
- FieldManager fmgr(this);
- fmgr.nodal_atomic_field(REFERENCE_POTENTIAL_ENERGY);
- PerAtomQuantity<double> * atomicReferencePotential =
- interscaleManager_.per_atom_quantity("AtomicReferencePotential");
-/////////////////////////////////////
+ ComputedAtomQuantity * atomicPotentialEnergy = new ComputedAtomQuantity(this,
+ lammpsInterface_->compute_pe_name(),
+ 1./(lammpsInterface_->mvv2e()));
+ interscaleManager_.add_per_atom_quantity(atomicPotentialEnergy,
+ "AtomicPotentialEnergy");
+
+ // reference potential energy
+ AtcAtomQuantity<double> * atomicReferencePotential;
+ if (!initialized_) {
+ atomicReferencePotential = new AtcAtomQuantity<double>(this);
+ interscaleManager_.add_per_atom_quantity(atomicReferencePotential,
+ "AtomicReferencePotential");
+ atomicReferencePotential->set_memory_type(PERSISTENT);
+ }
+ else {
+ atomicReferencePotential = static_cast<AtcAtomQuantity<double> * >(interscaleManager_.per_atom_quantity("AtomicReferencePotential"));
+ }
+ nodalRefPotentialEnergy_ = new AtfShapeFunctionRestriction(this,
+ atomicReferencePotential,
+ shpFcn_);
+ interscaleManager_.add_dense_matrix(nodalRefPotentialEnergy_,
+ "NodalAtomicReferencePotential");
+
// fluctuating potential energy
- AtomicEnergyForTemperature * atomicFluctuatingPotentialEnergy = new FluctuatingPotentialEnergy(this,
- atomicPotentialEnergy,
- atomicReferencePotential);
+ AtomicEnergyForTemperature * atomicFluctuatingPotentialEnergy =
+ new FluctuatingPotentialEnergy(this,
+ atomicPotentialEnergy,
+ atomicReferencePotential);
interscaleManager_.add_per_atom_quantity(atomicFluctuatingPotentialEnergy,
"AtomicFluctuatingPotentialEnergy");
// atomic total energy
atomEnergyForTemperature = new MixedKePeEnergy(this,1,1);
// kinetic temperature measure for post-processing
// nodal restriction of the atomic energy quantity for the temperature definition
AtfShapeFunctionRestriction * nodalAtomicTwiceKineticEnergy = new AtfShapeFunctionRestriction(this,
atomicTwiceKineticEnergy,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicTwiceKineticEnergy,
"NodalAtomicTwiceKineticEnergy");
nodalAtomicKineticTemperature_ = new AtfShapeFunctionMdProjection(this,
nodalAtomicTwiceKineticEnergy,
TEMPERATURE);
interscaleManager_.add_dense_matrix(nodalAtomicKineticTemperature_,
"NodalAtomicKineticTemperature");
// potential temperature measure for post-processing (must multiply by 2 for configurational temperature
// nodal restriction of the atomic energy quantity for the temperature definition
AtfShapeFunctionRestriction * nodalAtomicFluctuatingPotentialEnergy = new AtfShapeFunctionRestriction(this,
atomicFluctuatingPotentialEnergy,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicFluctuatingPotentialEnergy,
"NodalAtomicFluctuatingPotentialEnergy");
nodalAtomicConfigurationalTemperature_ = new AtfShapeFunctionMdProjection(this,
nodalAtomicFluctuatingPotentialEnergy,
TEMPERATURE);
interscaleManager_.add_dense_matrix(nodalAtomicConfigurationalTemperature_,
"NodalAtomicConfigurationalTemperature");
}
// register the per-atom quantity for the temperature definition
interscaleManager_.add_per_atom_quantity(atomEnergyForTemperature,
"AtomicEnergyForTemperature");
// nodal restriction of the atomic energy quantity for the temperature definition
AtfShapeFunctionRestriction * nodalAtomicEnergy = new AtfShapeFunctionRestriction(this,
atomEnergyForTemperature,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicEnergy,
"NodalAtomicEnergy");
// nodal atomic temperature field
AtfShapeFunctionMdProjection * nodalAtomicTemperature = new AtfShapeFunctionMdProjection(this,
nodalAtomicEnergy,
TEMPERATURE);
interscaleManager_.add_dense_matrix(nodalAtomicTemperature,
"NodalAtomicTemperature");
if (!useFeMdMassMatrix_) {
// classical thermodynamic heat capacity of the atoms
HeatCapacity * heatCapacity = new HeatCapacity(this);
interscaleManager_.add_per_atom_quantity(heatCapacity,
"AtomicHeatCapacity");
// atomic thermal mass matrix
nodalAtomicHeatCapacity_ = new AtfShapeFunctionRestriction(this,
heatCapacity,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicHeatCapacity_,
"NodalAtomicHeatCapacity");
}
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->construct_transfers();
}
atomicRegulator_->construct_transfers();
}
//---------------------------------------------------------
// init_filter
// sets up the time filtering operations in all objects
//---------------------------------------------------------
void ATC_CouplingEnergy::init_filter()
{
TimeIntegrator::TimeIntegrationType timeIntegrationType = timeIntegrators_[TEMPERATURE]->time_integration_type();
if (timeFilterManager_.end_equilibrate()) {
if (timeIntegrationType==TimeIntegrator::GEAR) {
if (equilibriumStart_) {
if (atomicRegulator_->regulator_target()==AtomicRegulator::DYNAMICS) { // based on FE equation
DENS_MAT vdotflamMat(-2.*(nodalAtomicFields_[TEMPERATURE].quantity())); // note 2 is for 1/2 vdotflam addition
atomicRegulator_->reset_lambda_contribution(vdotflamMat);
}
else { // based on MD temperature equation
DENS_MAT vdotflamMat(-1.*(nodalAtomicFields_[TEMPERATURE].quantity()));
atomicRegulator_->reset_lambda_contribution(vdotflamMat);
}
}
}
else if (timeIntegrationType==TimeIntegrator::FRACTIONAL_STEP) {
if (equilibriumStart_) {
DENS_MAT powerMat(-1.*(nodalAtomicFields_[TEMPERATURE].quantity()));
atomicRegulator_->reset_lambda_contribution(powerMat);
}
}
}
}
//---------------------------------------------------------
// compute_md_mass_matrix
// compute the mass matrix arising from only atomistic
// quadrature and contributions as a summation
//---------------------------------------------------------
void ATC_CouplingEnergy::compute_md_mass_matrix(FieldName thisField,
DIAG_MAT & massMat)
{
if (thisField == TEMPERATURE)
massMat.reset(nodalAtomicHeatCapacity_->quantity());
}
//--------------------------------------------------------
// finish
// final clean up after a run
//--------------------------------------------------------
void ATC_CouplingEnergy::finish()
{
// base class
ATC_Coupling::finish();
atomicRegulator_->finish();
}
//--------------------------------------------------------
// modify
// parses inputs and modifies state of the filter
//--------------------------------------------------------
bool ATC_CouplingEnergy::modify(int narg, char **arg)
{
bool foundMatch = false;
int argIndx = 0;
// check to see if input is a transfer class command
// check derived class before base class
// pass-through to thermostat
if (strcmp(arg[argIndx],"control")==0) {
argIndx++;
foundMatch = atomicRegulator_->modify(narg-argIndx,&arg[argIndx]);
}
// pass-through to timeIntegrator class
else if (strcmp(arg[argIndx],"time_integration")==0) {
argIndx++;
foundMatch = timeIntegrators_[TEMPERATURE]->modify(narg-argIndx,&arg[argIndx]);
}
// switch for the kind of temperature being used
/*! \page man_temperature_definition fix_modify AtC temperature_definition
\section syntax
fix_modify AtC temperature_definition <kinetic|total>
\section examples
<TT> fix_modify atc temperature_definition kinetic </TT> \n
\section description
Change the definition for the atomic temperature used to create the finite element temperature. The kinetic option is based only on the kinetic energy of the atoms while the total option uses the total energy (kinetic + potential) of an atom.
\section restrictions
This command is only valid when using thermal coupling. Also, while not a formal restriction, the user should ensure that associating a potential energy with each atom makes physical sense for the total option to be meaningful.
\section default
kinetic
*/
else if (strcmp(arg[argIndx],"temperature_definition")==0) {
argIndx++;
string_to_temperature_def(arg[argIndx],temperatureDef_);
+ if (temperatureDef_ == TOTAL) {
+ setRefPE_ = true;
+ }
foundMatch = true;
needReset_ = true;
}
// no match, call base class parser
if (!foundMatch) {
foundMatch = ATC_Coupling::modify(narg, arg);
}
return foundMatch;
}
//--------------------------------------------------
// pack_fields
// bundle all allocated field matrices into a list
// for output needs
//--------------------------------------------------
void ATC_CouplingEnergy::pack_thermal_fields(RESTART_LIST & data)
{
atomicRegulator_->pack_fields(data);
}
//--------------------------------------------------
// write_restart_file
// bundle matrices that need to be saved and call
// fe_engine to write the file
//--------------------------------------------------
void ATC_CouplingEnergy::write_restart_data(string fileName, RESTART_LIST & data)
{
pack_thermal_fields(data);
ATC_Method::write_restart_data(fileName,data);
}
//--------------------------------------------------
// read_restart_file
// bundle matrices that need to be saved and call
// fe_engine to write the file
//--------------------------------------------------
void ATC_CouplingEnergy::read_restart_data(string fileName, RESTART_LIST & data)
{
pack_thermal_fields(data);
ATC_Method::read_restart_data(fileName,data);
}
//--------------------------------------------------
void ATC_CouplingEnergy::reset_nlocal()
{
ATC_Coupling::reset_nlocal();
atomicRegulator_->reset_nlocal();
}
//--------------------------------------------------
// reset_atom_materials
// update the atom materials map
//--------------------------------------------------
void ATC_CouplingEnergy::reset_atom_materials()
{
ATC_Coupling::reset_atom_materials();
atomicRegulator_->reset_atom_materials(elementToMaterialMap_,
atomElement_);
}
- //--------------------------------------------------
- // pre_init_integrate
- // time integration before the lammps atomic
- // integration of the Verlet step 1
- //--------------------------------------------------
- void ATC_CouplingEnergy::pre_init_integrate()
- {
- ATC_Coupling::pre_init_integrate();
- double dt = lammpsInterface_->dt();
-
- // Perform any initialization, no actual integration
- for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
- (_tiIt_->second)->pre_initial_integrate1(dt);
- }
-
- // Apply thermostat force to atom velocities
- atomicRegulator_->apply_pre_predictor(dt,lammpsInterface_->ntimestep());
-
- // Predict nodal temperatures and time derivatives based on FE data
- for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
- (_tiIt_->second)->pre_initial_integrate2(dt);
- }
- extrinsicModelManager_.pre_init_integrate();
- }
-
+#ifdef OBSOLETE
//--------------------------------------------------------
// mid_init_integrate
// time integration between the velocity update and
// the position lammps update of Verlet step 1
//--------------------------------------------------------
void ATC_CouplingEnergy::mid_init_integrate()
{
// CONTINUOUS VELOCITY UPDATE
ATC_Coupling::mid_init_integrate();
double dt = lammpsInterface_->dt();
// Compute nodal velocity at n+1/2
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->mid_initial_integrate1(dt);
}
atomicRegulator_->apply_mid_predictor(dt,lammpsInterface_->ntimestep());
extrinsicModelManager_.mid_init_integrate();
}
//--------------------------------------------------------
// post_init_integrate
// time integration after the lammps atomic updates of
// Verlet step 1
//--------------------------------------------------------
void ATC_CouplingEnergy::post_init_integrate()
{
double dt = lammpsInterface_->dt();
// Compute nodal velocity at n+1
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_initial_integrate1(dt);
}
// Update kinetostat quantities if displacement is being regulated
atomicRegulator_->apply_post_predictor(dt,lammpsInterface_->ntimestep());
// Update extrisic model
extrinsicModelManager_.post_init_integrate();
// fixed values, non-group bcs handled through FE
set_fixed_nodes();
update_time(0.5);
ATC_Coupling::post_init_integrate();
}
-
+#endif
//--------------------------------------------------------
// post_final_integrate
// integration after the second stage lammps atomic
// update of Verlet step 2
//--------------------------------------------------------
void ATC_CouplingEnergy::post_final_integrate()
{
double dt = lammpsInterface_->dt();
// update changes in atomic energy or from atomic work, if needed
// this is here to simplify computing changes in total atomic energy
// even though all the data needed is available by pre_final_integrate
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->pre_final_integrate1(dt);
}
// Set prescribed sources for current time
prescribedDataMgr_->set_sources(time()+0.5*dt,sources_);
// predictor step in extrinsic model
extrinsicModelManager_.pre_final_integrate();
// predict thermostat contributions
// compute sources based on predicted FE temperature
if (timeIntegrators_[TEMPERATURE]->has_final_predictor()) {
// set state-based sources
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
atomicRegulator_->compute_boundary_flux(fields_);
compute_atomic_sources(temperatureMask_,fields_,atomicSources_);
}
// Compute thermostat forces
atomicRegulator_->apply_pre_corrector(dt,lammpsInterface_->ntimestep());
// Determine FE contributions to d theta/dt
// Compute atom-integrated rhs
// parallel communication happens within FE_Engine
// Determine FE contributions to dT/dt-----------------------
compute_rhs_vector(temperatureMask_,fields_,rhs_,FE_DOMAIN);
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->add_to_rhs();
}
// For flux matching, add appropriate fraction of "drag" power
atomicRegulator_->add_to_rhs(rhs_);
// final phase predictor step
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate1(dt);
}
// fix nodes, non-group bcs applied through FE
set_fixed_nodes();
// corrector step extrinsic model
extrinsicModelManager_.post_final_integrate();
// correct thermostat and finish
if (timeIntegrators_[TEMPERATURE]->has_final_corrector()) {
// set state-based sources
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
atomicRegulator_->compute_boundary_flux(fields_);
compute_atomic_sources(temperatureMask_,fields_,atomicSources_);
}
// finish FE temperature update
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate2(dt);
}
// apply corrector phase of thermostat
atomicRegulator_->apply_post_corrector(dt,lammpsInterface_->ntimestep());
// finalalize time filtering
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate3(dt);
}
// Fix nodes, non-group bcs applied through FE
set_fixed_nodes();
update_time(0.5);
output();
ATC_Coupling::post_final_integrate(); // adds next step to computes
}
//--------------------------------------------------------------------
// compute_vector
//--------------------------------------------------------------------
// this is for direct output to lammps thermo
double ATC_CouplingEnergy::compute_vector(int n)
{
// output[1] = total coarse scale thermal energy
// output[2] = average temperature
double mvv2e = lammpsInterface_->mvv2e(); // convert to lammps energy units
if (n == 0) {
Array<FieldName> mask(1);
FIELD_MATS energy;
mask(0) = TEMPERATURE;
feEngine_->compute_energy(mask,
fields_,
physicsModel_,
elementToMaterialMap_,
energy,
&(elementMask_->quantity()));
double phononEnergy = mvv2e * energy[TEMPERATURE].col_sum();
return phononEnergy;
}
else if (n == 1) {
double aveT = (fields_[TEMPERATURE].quantity()).col_sum()/nNodes_;
return aveT;
}
else if (n > 1) {
double extrinsicValue = extrinsicModelManager_.compute_vector(n);
return extrinsicValue;
}
return 0.;
}
//--------------------------------------------------------------------
// output
//--------------------------------------------------------------------
void ATC_CouplingEnergy::output()
{
if (output_now()) {
feEngine_->departition_mesh();
// avoid possible mpi calls
if (nodalAtomicKineticTemperature_)
_keTemp_ = nodalAtomicKineticTemperature_->quantity();
if (nodalAtomicConfigurationalTemperature_)
_peTemp_ = nodalAtomicConfigurationalTemperature_->quantity();
OUTPUT_LIST outputData;
// base class output
ATC_Method::output();
// push atc fields time integrator modifies into output arrays
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_process();
}
// auxilliary data
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->output(outputData);
}
atomicRegulator_->output(outputData);
extrinsicModelManager_.output(outputData);
DENS_MAT & temperature(nodalAtomicFields_[TEMPERATURE].set_quantity());
DENS_MAT & dotTemperature(dot_fields_[TEMPERATURE].set_quantity());
DENS_MAT & ddotTemperature(ddot_fields_[TEMPERATURE].set_quantity());
DENS_MAT & rocTemperature(nodalAtomicFieldsRoc_[TEMPERATURE].set_quantity());
DENS_MAT & fePower(rhs_[TEMPERATURE].set_quantity());
if (lammpsInterface_->rank_zero()) {
// global data
double T_mean = (fields_[TEMPERATURE].quantity()).col_sum(0)/nNodes_;
feEngine_->add_global("temperature_mean", T_mean);
double T_stddev = (fields_[TEMPERATURE].quantity()).col_stdev(0);
feEngine_->add_global("temperature_std_dev", T_stddev);
double Ta_mean = (nodalAtomicFields_[TEMPERATURE].quantity()).col_sum(0)/nNodes_;
feEngine_->add_global("atomic_temperature_mean", Ta_mean);
double Ta_stddev = (nodalAtomicFields_[TEMPERATURE].quantity()).col_stdev(0);
feEngine_->add_global("atomic_temperature_std_dev", Ta_stddev);
// different temperature measures, if appropriate
if (nodalAtomicKineticTemperature_)
outputData["kinetic_temperature"] = & _keTemp_;
if (nodalAtomicConfigurationalTemperature_) {
_peTemp_ *= 2; // account for full temperature
outputData["configurational_temperature"] = & _peTemp_;
}
// mesh data
outputData["NodalAtomicTemperature"] = &temperature;
outputData["dot_temperature"] = &dotTemperature;
outputData["ddot_temperature"] = &ddotTemperature;
outputData["NodalAtomicPower"] = &rocTemperature;
outputData["fePower"] = &fePower;
// write data
feEngine_->write_data(output_index(), fields_, & outputData);
}
feEngine_->partition_mesh();
}
}
};
diff --git a/lib/atc/ATC_CouplingEnergy.h b/lib/atc/ATC_CouplingEnergy.h
index 6866cd051..ba2696118 100644
--- a/lib/atc/ATC_CouplingEnergy.h
+++ b/lib/atc/ATC_CouplingEnergy.h
@@ -1,127 +1,127 @@
#ifndef ATC_COUPLING_ENERGY_H
#define ATC_COUPLING_ENERGY_H
// ATC headers
#include "ATC_Coupling.h"
#include "ThermalTimeIntegrator.h"
//TEMP_JAT - remove when needs_reset is moved to base class
#include "AtomicRegulator.h"
// Other headers
#include <map>
+#include <string>
namespace ATC {
class AtfShapeFunctionRestriction;
class AtfShapeFunctionMdProjection;
/**
* @class ATC_CouplingEnergy
* @brief A class for atom-continuum transfers & control involving heat transport
* (owned field/s: TEMPERATURE)
*/
class ATC_CouplingEnergy : public ATC_Coupling {
public:
// constructor
ATC_CouplingEnergy(std::string groupName,
double ** & perAtomArray,
LAMMPS_NS::Fix * thisFix,
std::string matParamFile,
ExtrinsicModelType extrinsic = NO_MODEL);
// destructor
virtual ~ATC_CouplingEnergy();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** pre time integration */
virtual void initialize();
/** flags whether a methods reset is required */
virtual bool reset_methods() const {
bool resetMethods = ATC_Method::reset_methods() || atomicRegulator_->need_reset();
_ctiIt_ = timeIntegrators_.find(TEMPERATURE);
if (_ctiIt_ == timeIntegrators_.end()) return resetMethods;
return resetMethods || (_ctiIt_->second)->need_reset();
};
/** post time integration */
virtual void finish();
+#ifdef OBSOLETE
- /** first time substep routines */
- virtual void pre_init_integrate();
/** first time, after atomic velocity but before position integration */
virtual void mid_init_integrate();
/** first time, after atomic integration */
virtual void post_init_integrate();
-
+#endif
/** second time substep routine */
virtual void post_final_integrate();
/** compute vector for output */
virtual double compute_vector(int n);
/** output */
virtual void output();
/** set up atom to material identification */
virtual void reset_atom_materials();
protected:
//---------------------------------------------------------------
/** initialization routines */
//---------------------------------------------------------------
/** constructs all data which is updated with time integration, i.e. fields */
//virtual void construct_time_integration_data();
/** create methods, e.g. time integrators, filters */
virtual void construct_methods();
/** set up data which is dependency managed */
virtual void construct_transfers();
/** sets the position/velocity of the ghost atoms */
virtual void set_ghost_atoms(){};
/** adds resetting of any thermostat arrays associated with local atom count */
virtual void reset_nlocal();
/** compute the mass matrix components coming from MD integration */
virtual void compute_md_mass_matrix(FieldName thisField,
DIAG_MAT & massMats);
/** operator to compute mass matrix from MD */
AtfShapeFunctionRestriction * nodalAtomicHeatCapacity_;
/** physics specific filter initialization */
void init_filter();
/** field mask for velocity integration */
Array2D<bool> temperatureMask_;
double compute_lambda_power(int gid);
/** kinetic temperature for post-processing */
AtfShapeFunctionMdProjection * nodalAtomicKineticTemperature_;
/** configurational temperature for post-processing */
AtfShapeFunctionMdProjection * nodalAtomicConfigurationalTemperature_;
/** workspace matrices for output */
DENS_MAT _keTemp_, _peTemp_;
// Add in fields for restarting
- virtual void read_restart_data(string fileName_, RESTART_LIST & data);
- virtual void write_restart_data(string fileName_, RESTART_LIST & data);
+ virtual void read_restart_data(std::string fileName_, RESTART_LIST & data);
+ virtual void write_restart_data(std::string fileName_, RESTART_LIST & data);
void pack_thermal_fields(RESTART_LIST & data);
};
};
#endif
diff --git a/lib/atc/ATC_CouplingMass.cpp b/lib/atc/ATC_CouplingMass.cpp
index dd586d59c..54fb06541 100644
--- a/lib/atc/ATC_CouplingMass.cpp
+++ b/lib/atc/ATC_CouplingMass.cpp
@@ -1,544 +1,517 @@
// ATC_Transfer headers
#include "ATC_CouplingMass.h"
#include "ATC_Error.h"
#include "FE_Engine.h"
#include "SpeciesTimeIntegrator.h"
#include "PrescribedDataManager.h"
#include "ExtrinsicModelElectrostatic.h"
#include "PoissonSolver.h"
#include "ChargeRegulator.h"
#include "ConcentrationRegulator.h"
#include "PerAtomQuantityLibrary.h"
#include "TransferOperator.h"
#include "AtomToMoleculeTransfer.h"
#include "MoleculeSet.h"
#include "FieldManager.h"
// Other Headers
#include <vector>
-#include <map>
#include <set>
#include <utility>
+using ATC_Utility::to_string;
+using std::map;
+using std::string;
+using std::pair;
+
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class ATC_CouplingMass
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ATC_CouplingMass::ATC_CouplingMass(string groupName,
double **& perAtomArray,
LAMMPS_NS::Fix * thisFix,
string matParamFile,
ExtrinsicModelType extrinsicModel)
: ATC_Coupling(groupName,perAtomArray,thisFix),
resetNlocal_(false)
{
// Allocate PhysicsModel
create_physics_model(SPECIES, matParamFile);
// create extrinsic physics model
if (extrinsicModel != NO_MODEL) {
extrinsicModelManager_.create_model(extrinsicModel,matParamFile);
}
// Defaults
set_time();
bndyIntType_ = NO_QUADRATURE;
// set up field data based on physicsModel
physicsModel_->num_fields(fieldSizes_,fieldMask_);
// regulator
atomicRegulator_ = new ConcentrationRegulator(this);
// set up physics specific time integrator
//WIP_JAT should be species concentration
timeIntegrators_[MASS_DENSITY] = new SpeciesTimeIntegrator(this,TimeIntegrator::FRACTIONAL_STEP);
// output variable vector info:
// output[1] = system mass density
vectorFlag_ = 1;
sizeVector_ = 0;
scalarVectorFreq_ = 1;
extVector_ = 1;
if (extrinsicModel != NO_MODEL)
sizeVector_ += extrinsicModelManager_.size_vector(sizeVector_);
sizeVector_ += atomicRegulator_->size_vector(sizeVector_);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ATC_CouplingMass::~ATC_CouplingMass()
{
interscaleManager_.clear();
}
//--------------------------------------------------------
// modify
// parses inputs and modifies state
//--------------------------------------------------------
bool ATC_CouplingMass::modify(int narg, char **arg)
{
bool match = false;
// check to see if it is a transfer class command
// check derived class before base class
int argIndex = 0;
// pass-through to concentration regulator
if (strcmp(arg[argIndex],"control")==0) {
argIndex++;
if (strcmp(arg[argIndex],"concentration")==0) {
argIndex++;
match = atomicRegulator_->modify(narg-argIndex,&arg[argIndex]);
}
}
// no match, call base class parser
if (!match) {
match = ATC_Coupling::modify(narg, arg);
}
return match;
}
//--------------------------------------------------------
// initialize
// sets up all the necessary data
//--------------------------------------------------------
void ATC_CouplingMass::initialize()
{
- fieldSizes_[SPECIES_CONCENTRATION] = speciesIds_.size();
+ fieldSizes_[SPECIES_CONCENTRATION] = ntracked();
// Base class initalizations
ATC_Coupling::initialize();
// check that only all atoms
if (bndyIntType_ != NO_QUADRATURE) throw ATC_Error("ATC_CouplingMass: only all atoms simulations are supported");
// set consistent initial conditions, if requested
if (!timeFilterManager_.filter_dynamics()) {
if (consistentInitialization_) {
DENS_MAT & massDensity(fields_[MASS_DENSITY].set_quantity());
- const DENS_MAT & atomicMassDensity(nodalAtomicFields_[MASS_DENSITY].quantity());
+ const DENS_MAT & atomicMassDensity(atomicFields_[MASS_DENSITY]->quantity());
DENS_MAT & speciesConcentration(fields_[SPECIES_CONCENTRATION].set_quantity());
- //const DENS_MAT & atomicSpeciesConcentration(nodalAtomicFields_[SPECIES_CONCENTRATION].quantity());
const DENS_MAT & atomicSpeciesConcentration(atomicFields_[SPECIES_CONCENTRATION]->quantity());
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
for (int i = 0; i<nNodes_; ++i) {
if (nodeType(i,0)==MD_ONLY) {
massDensity(i,0) = atomicMassDensity(i,0);
for (int j = 0; j < atomicSpeciesConcentration.nCols(); ++j) {
speciesConcentration(i,j) = atomicSpeciesConcentration(i,j);
}
}
}
}
}
+
+
// other initializatifields_[SPECIES_CONCENTRATION].quantity()ons
if (reset_methods()) {
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->initialize();
}
}
extrinsicModelManager_.initialize(); // always needed to construct new Poisson solver
- if (timeFilterManager_.need_reset()) { init_filter(); }
- timeFilterManager_.initialize(); // clears need for reset
+ if (timeFilterManager_.need_reset()) {
+ init_filter();
+ }
+ // clears need for reset
+ timeFilterManager_.initialize();
atomicRegulator_->initialize();
+ ghostManager_.initialize();
if (!initialized_) {
// initialize sources based on initial FE temperature
double dt = lammpsInterface_->dt();
// set sources
prescribedDataMgr_->set_sources(time()+0.5*dt,sources_);
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
compute_atomic_sources(fieldMask_,fields_,atomicSources_);
// read in field data if necessary
if (useRestart_) {
RESTART_LIST data;
read_restart_data(restartFileName_,data);
useRestart_ = false;
}
initialized_ = true;
}
// reset integration field mask
speciesMask_.reset(NUM_FIELDS,NUM_FLUX);
speciesMask_ = false;
}
//--------------------------------------------------------
// construct_methods
// have managers instantiate requested algorithms
// and methods
//--------------------------------------------------------
void ATC_CouplingMass::construct_methods()
{
ATC_Coupling::construct_methods();
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->construct_methods();
}
atomicRegulator_->construct_methods();
}
void ATC_CouplingMass::construct_transfers()
{
ATC_Coupling::construct_transfers();
FieldManager fmgr(this);
atomicFields_[MASS_DENSITY] = fmgr.nodal_atomic_field(MASS_DENSITY, field_to_intrinsic_name(MASS_DENSITY));
if (has_tracked_species()) {
atomicFields_[SPECIES_CONCENTRATION] = fmgr.nodal_atomic_field(SPECIES_CONCENTRATION, field_to_intrinsic_name(SPECIES_CONCENTRATION));
//if (atomicRegulator_->needs_temperature()) {
atomicFields_[TEMPERATURE] = fmgr.nodal_atomic_field(KINETIC_TEMPERATURE, field_to_intrinsic_name(TEMPERATURE));
//atomicFields_[TEMPERATURE] = fmgr.nodal_atomic_field(TEMPERATURE, field_to_intrinsic_name(TEMPERATURE));
field(TEMPERATURE) = atomicFields_[TEMPERATURE]->quantity();
//}
}
else {
throw ATC_Error("ATC_CouplingMass: no tracked species");
}
//==========================================================================
// add molecule mass density transfer operators
//==========================================================================
map<string,pair<MolSize,int> >::const_iterator molecule;
FundamentalAtomQuantity * mass = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
PROC_GHOST);
for (molecule = moleculeIds_.begin(); molecule != moleculeIds_.end(); molecule++) {
const string moleculeName = molecule->first;
SmallMoleculeSet * smallMoleculeSet = interscaleManager_.small_molecule_set(moleculeName);
SPAR_MAN * shpFcnMol = interscaleManager_.sparse_matrix("ShapeFunction"+moleculeName);
AtomToSmallMoleculeTransfer<double> * moleculeMass =
new AtomToSmallMoleculeTransfer<double>(this,mass,smallMoleculeSet);
interscaleManager_.add_dense_matrix(moleculeMass,"MoleculeMass"+moleculeName);
MotfShapeFunctionRestriction * nodalAtomicMoleculeMass =
new MotfShapeFunctionRestriction(moleculeMass,shpFcnMol);
interscaleManager_.add_dense_matrix(nodalAtomicMoleculeMass,"NodalMoleculeMass"+moleculeName);
AtfShapeFunctionMdProjection * nodalAtomicMoleculeMassDensity =
new AtfShapeFunctionMdProjection(this,nodalAtomicMoleculeMass,MASS_DENSITY);
interscaleManager_.add_dense_matrix(nodalAtomicMoleculeMassDensity,"NodalMoleculeMassDensity"+moleculeName);
}
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->construct_transfers();
}
}
void ATC_CouplingMass::init_filter()
{
ATC_Coupling::init_filter();
}
void ATC_CouplingMass::compute_md_mass_matrix(FieldName thisField,
DIAG_MAT & massMat)
{
if (thisField == MASS_DENSITY ||
thisField == SPECIES_CONCENTRATION) {
massMat.reset(nodalAtomicVolume_->quantity());
}
}
- //--------------------------------------------------
- // pack_fields
- // bundle all allocated field matrices into a list
- // for output needs
- //--------------------------------------------------
-
- void ATC_CouplingMass::pack_species_fields(RESTART_LIST & data)
- {
- }
-
//--------------------------------------------------
// write_restart_file
// bundle matrices that need to be saved and call
// fe_engine to write the file
//--------------------------------------------------
void ATC_CouplingMass::write_restart_data(string fileName, RESTART_LIST & data)
{
- pack_species_fields(data);
ATC_Method::write_restart_data(fileName,data);
}
//--------------------------------------------------
// write_restart_file
// bundle matrices that need to be saved and call
// fe_engine to write the file
//--------------------------------------------------
void ATC_CouplingMass::read_restart_data(string fileName, RESTART_LIST & data)
{
-
- pack_species_fields(data);
ATC_Method::read_restart_data(fileName,data);
}
//--------------------------------------------------------
// pre_force
// prior to calculation of forces
//--------------------------------------------------------
void ATC_CouplingMass::pre_force()
{
ATC_Coupling::pre_force();
atomicRegulator_->pre_force();
}
//--------------------------------------------------------
// pre_exchange
// prior to exchange of atoms
//--------------------------------------------------------
void ATC_CouplingMass::pre_exchange()
{
ATC_Coupling::pre_exchange();
//if (atomicRegulator_->needs_temperature()) {
field(TEMPERATURE) = atomicFields_[TEMPERATURE]->quantity();
///}
atomicRegulator_->pre_exchange();
if (resetNlocal_) {
this->reset_nlocal();
resetNlocal_ = false;
}
}
- //--------------------------------------------------------
- // pre_init_integrate
- // time integration before the lammps atomic
- // integration of the Verlet step 1
- //--------------------------------------------------------
- void ATC_CouplingMass::pre_init_integrate()
- {
- ATC_Coupling::pre_init_integrate();
- double dt = lammpsInterface_->dt();
- for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
- (_tiIt_->second)->pre_initial_integrate1(dt);
- }
-
- // Apply thermostat force to atom velocities
- atomicRegulator_->apply_pre_predictor(dt,lammpsInterface_->ntimestep());
-
- // Predict nodal temperatures and time derivatives based on FE data
- for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
- (_tiIt_->second)->pre_initial_integrate2(dt);
- }
- extrinsicModelManager_.pre_init_integrate();
- }
-
+#ifdef OBSOLETE
//--------------------------------------------------------
// mid_init_integrate
// time integration between the velocity update and
// the position lammps update of Verlet step 1
//--------------------------------------------------------
void ATC_CouplingMass::mid_init_integrate()
{
ATC_Coupling::mid_init_integrate();
double dt = lammpsInterface_->dt();
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->mid_initial_integrate1(dt);
}
atomicRegulator_->apply_mid_predictor(dt,lammpsInterface_->ntimestep());
extrinsicModelManager_.mid_init_integrate();
}
//--------------------------------------------------------
// post_init_integrate
// time integration after the lammps atomic updates of
// Verlet step 1
//--------------------------------------------------------
void ATC_CouplingMass::post_init_integrate()
{
double dt = lammpsInterface_->dt();
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_initial_integrate1(dt);
}
atomicRegulator_->apply_post_predictor(dt,lammpsInterface_->ntimestep());
extrinsicModelManager_.post_init_integrate();
set_fixed_nodes();
update_time(0.5); // half step
ATC_Coupling::post_init_integrate();
}
-
+#endif
//--------------------------------------------------------
// post_final_integrate
// integration after the second stage lammps atomic
// update of Verlet step 2
//--------------------------------------------------------
void ATC_CouplingMass::post_final_integrate()
{
double dt = lammpsInterface_->dt();
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->pre_final_integrate1(dt);
}
prescribedDataMgr_->set_sources(time()+0.5*dt,sources_);
extrinsicModelManager_.pre_final_integrate();
if (timeIntegrators_[MASS_DENSITY]->has_final_predictor()) {
// set state-based sources
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
compute_atomic_sources(speciesMask_,fields_,atomicSources_);
}
// set state-based RHS
// Determine FE contributions to dv/dt-----------------------
// Compute atom-integrated rhs
// parallel communication happens within FE_Engine
compute_rhs_vector(speciesMask_,fields_,rhs_,FE_DOMAIN);
// Compute and add atomic contributions to FE equations
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->add_to_rhs();
}
atomicRegulator_->add_to_rhs(rhs_);
// final phase predictor step
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate1(dt);
}
set_fixed_nodes();
// corrector step extrinsic model
extrinsicModelManager_.post_final_integrate();
if (timeIntegrators_[MASS_DENSITY]->has_final_corrector()) {
// set state-based sources
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
compute_atomic_sources(speciesMask_,fields_,atomicSources_);
}
// finish FE temperature update
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate2(dt);
}
// apply corrector phase of thermostat
atomicRegulator_->apply_post_corrector(dt,lammpsInterface_->ntimestep());
// finalize time integration
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate3(dt);
}
// Fix nodes, non-group bcs applied through FE
set_fixed_nodes();
update_time(0.5);
output();
ATC_Coupling::post_final_integrate(); // addstep for computes
}
//--------------------------------------------------------
// output
// does post-processing steps and outputs data
//--------------------------------------------------------
void ATC_CouplingMass::output()
{
if (output_now()) {
feEngine_->departition_mesh();
OUTPUT_LIST outputData;
// base class output
ATC_Coupling::output();
// push atc fields time integrator modifies into output arrays
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_process();
}
// auxilliary data
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->output(outputData);
}
extrinsicModelManager_.output(outputData);
atomicRegulator_->output(outputData);
FIELD_POINTERS::iterator itr;
for (itr=atomicFields_.begin(); itr!=atomicFields_.end();itr++) {
FieldName name = itr->first;
const DENS_MAT & data = (itr->second)->quantity();
outputData[field_to_intrinsic_name(name)] = & data;
}
// compute partial forces
int * type =lammpsInterface_->atom_type();
double ** f =lammpsInterface_->fatom();
for (unsigned int j = 0; j < typeList_.size(); j++) {
string speciesName = typeNames_[j];
int sType = typeList_[j];
double localF[3] = {0,0,0}, F[3] = {0,0,0};
for (int i = 0; i < nLocal_; i++) {
int a = internalToAtom_(i);
if (sType == type[a]) {
double * fa = f[a];
localF[0] += fa[0];
localF[1] += fa[1];
localF[2] += fa[2];
}
}
lammpsInterface_->allsum(localF,F,3);
if (lammpsInterface_->rank_zero()) {
for (int i = 0; i < 3; ++i) {
feEngine_->add_global(speciesName+"_F"+to_string(i+1), F[i]);
}
}
}
if (lammpsInterface_->rank_zero()) {
- // tagged data
-
+ // tagged data --only for molecule
map<string,DENS_MAN>::iterator densMan;
for (densMan = taggedDensMan_.begin(); densMan != taggedDensMan_.end(); densMan++) {
outputData[densMan->first] = & (densMan->second).set_quantity();
}
feEngine_->write_data(output_index(), fields_, & outputData);
}
// force reset of tagged data to keep in sync
map<string,DENS_MAN>::iterator densMan;
for (densMan = taggedDensMan_.begin(); densMan != taggedDensMan_.end(); densMan++)
(densMan->second).force_reset();
feEngine_->partition_mesh();
}
}
//--------------------------------------------------------------------
// compute_vector
//--------------------------------------------------------------------
// this is for direct output to lammps thermo
double ATC_CouplingMass::compute_vector(int n)
{
return atomicRegulator_->compute_vector(n);
}
};
diff --git a/lib/atc/ATC_CouplingMass.h b/lib/atc/ATC_CouplingMass.h
index aa22cc512..38535b147 100644
--- a/lib/atc/ATC_CouplingMass.h
+++ b/lib/atc/ATC_CouplingMass.h
@@ -1,114 +1,115 @@
#ifndef ATC_COUPLING_MASS_H
#define ATC_COUPLING_MASS_H
/** owned field/s: MASS_DENSITY */
// ATC headers
#include "ATC_Coupling.h"
// Other headers
#include <map>
+#include <string>
namespace ATC {
// Forward declarations
class FE_Engine;
class SpeciesTimeIntegrator;
class ChargeRegulator;
class ConcentrationRegulator;
/**
* @class ATC_CouplingMass
* @brief A class for atom-continuum transfers & control for species transport
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class ATC_CouplingMass
//--------------------------------------------------------
//--------------------------------------------------------
class ATC_CouplingMass : public ATC_Coupling {
public:
// constructor
ATC_CouplingMass(std::string groupName,
double **& perAtomArray,
LAMMPS_NS::Fix * thisFix,
std::string matParamFile,
ExtrinsicModelType extrinsic = NO_MODEL);
// destructor
virtual ~ATC_CouplingMass();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** pre time integration */
virtual void initialize();
/** prior to force */
virtual void pre_force();
/** prior to exchange */
virtual void pre_exchange();
virtual void reset_atoms() { resetNlocal_=true;}
- /** first time, before atomic integration */
- virtual void pre_init_integrate();
+#ifdef OBSOLETE
+
/** first time, after atomic velocity but before position integration */
virtual void mid_init_integrate();
/** first time, after atomic integration */
virtual void post_init_integrate();
+#endif
/** second time, after atomic integration */
virtual void post_final_integrate();
/** compute vector for output */
virtual double compute_vector(int n);
/** output routines */
virtual void output();
protected:
// functions
//---------------------------------------------------------------
/** initialization routines */
//---------------------------------------------------------------
/** constructs all data which is updated with time integration, i.e. fields */
//virtual void construct_time_integration_data();
/** create methods, e.g. time integrators, filters */
virtual void construct_methods();
/** set up data which is dependency managed */
virtual void construct_transfers();
/** sets the position/velocity of the ghost atoms */
virtual void set_ghost_atoms(){};
/** compute the mass matrix components coming from MD integration */
virtual void compute_md_mass_matrix(FieldName thisField,
DIAG_MAT & massMats);
/** physics specific filter initialization */
void init_filter();
/** field mask for velocity integration */
Array2D<bool> speciesMask_;
// Add in fields for restarting
- virtual void read_restart_data(string fileName_, RESTART_LIST & data);
- virtual void write_restart_data(string fileName_, RESTART_LIST & data);
- void pack_species_fields(RESTART_LIST & data);
+ virtual void read_restart_data(std::string fileName_, RESTART_LIST & data);
+ virtual void write_restart_data(std::string fileName_, RESTART_LIST & data);
// DATA structures for tracking individual species and molecules
FIELD_POINTERS atomicFields_;
bool resetNlocal_;
// i.e. we only need the correct shape function matrix for restriction
};
};
#endif
diff --git a/lib/atc/ATC_CouplingMomentum.cpp b/lib/atc/ATC_CouplingMomentum.cpp
index 53819529d..f81c6ec62 100644
--- a/lib/atc/ATC_CouplingMomentum.cpp
+++ b/lib/atc/ATC_CouplingMomentum.cpp
@@ -1,978 +1,789 @@
// ATC headers
#include "ATC_CouplingMomentum.h"
#include "ATC_Error.h"
#include "LammpsInterface.h"
#include "PrescribedDataManager.h"
#include "PerAtomQuantity.h"
#include "TransferOperator.h"
// Other Headers
#include <vector>
#include <map>
#include <set>
#include <utility>
+#include <iostream>
+
+using std::string;
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class ATC_CouplingMomentum
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ATC_CouplingMomentum::ATC_CouplingMomentum(string groupName,
double **& perAtomArray,
LAMMPS_NS::Fix * thisFix,
string matParamFile,
PhysicsType intrinsicModel,
ExtrinsicModelType extrinsicModel)
: ATC_Coupling(groupName,perAtomArray,thisFix),
nodalAtomicMass_(NULL),
nodalAtomicCount_(NULL),
- boundaryDynamics_(PRESCRIBED),
- gamma_(0),mu_(1),kappa_(1),
refPE_(0)
{
// Allocate PhysicsModel
create_physics_model(intrinsicModel, matParamFile);
// create extrinsic physics model
if (extrinsicModel != NO_MODEL) {
extrinsicModelManager_.create_model(extrinsicModel,matParamFile);
}
// set up field data based on physicsModel
physicsModel_->num_fields(fieldSizes_,fieldMask_);
// Defaults
set_time();
bndyIntType_ = FE_INTERPOLATION;
trackCharge_ = false;
// use a kinetostat
atomicRegulator_ = new Kinetostat(this);
// set time integrator and change any defaults based on model type
if (intrinsicModel == ELASTIC) {
trackDisplacement_ = true;
fieldSizes_[DISPLACEMENT] = fieldSizes_[VELOCITY];
timeIntegrators_[VELOCITY] = new MomentumTimeIntegrator(this,TimeIntegrator::VERLET);
+ ghostManager_.set_boundary_dynamics(GhostManager::PRESCRIBED);
}
else if (intrinsicModel == SHEAR) {
atomToElementMapType_ = EULERIAN;
atomToElementMapFrequency_ = 1;
timeIntegrators_[VELOCITY] = new MomentumTimeIntegrator(this,TimeIntegrator::GEAR);
+ ghostManager_.set_boundary_dynamics(GhostManager::NO_BOUNDARY_DYNAMICS);
}
// output variable vector info:
// output[1] = total coarse scale kinetic energy
// output[2] = total coarse scale potential energy
// output[3] = total coarse scale energy
scalarFlag_ = 1;
vectorFlag_ = 1;
sizeVector_ = 5;
scalarVectorFreq_ = 1;
extVector_ = 1;
thermoEnergyFlag_ = 1;
if (extrinsicModel != NO_MODEL)
sizeVector_ += extrinsicModelManager_.size_vector(sizeVector_);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ATC_CouplingMomentum::~ATC_CouplingMomentum()
{
interscaleManager_.clear();
}
//--------------------------------------------------------
// initialize
// sets up all the necessary data
//--------------------------------------------------------
void ATC_CouplingMomentum::initialize()
{
// clear displacement entries if requested
if (!trackDisplacement_) {
fieldSizes_.erase(DISPLACEMENT);
for (int i = 0; i < NUM_FLUX; i++)
fieldMask_(DISPLACEMENT,i) = false;
}
// Base class initalizations
ATC_Coupling::initialize();
// check resetting precedence:
// time integrator -> kinetostat -> time filter
// other initializations
if (reset_methods()) {
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->initialize();
}
atomicRegulator_->initialize();
}
extrinsicModelManager_.initialize();
if (timeFilterManager_.need_reset()) { // reset kinetostat power
init_filter();
}
- timeFilterManager_.initialize(); // clears need for reset
+ // clears need for reset
+ timeFilterManager_.initialize();
+ ghostManager_.initialize();
if (!initialized_) {
// initialize sources based on initial FE temperature
double dt = lammpsInterface_->dt();
prescribedDataMgr_->set_sources(time()+0.5*dt,sources_);
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
atomicRegulator_->compute_boundary_flux(fields_);
compute_atomic_sources(fieldMask_,fields_,atomicSources_);
// read in field data if necessary
if (useRestart_) {
RESTART_LIST data;
read_restart_data(restartFileName_,data);
useRestart_ = false;
}
// set consistent initial conditions, if requested
if (!timeFilterManager_.filter_dynamics()) {
if (consistentInitialization_) {
DENS_MAT & velocity(fields_[VELOCITY].set_quantity());
DENS_MAN * nodalAtomicVelocity(interscaleManager_.dense_matrix("NodalAtomicVelocity"));
const DENS_MAT & atomicVelocity(nodalAtomicVelocity->quantity());
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
for (int i = 0; i<nNodes_; ++i) {
if (nodeType(i,0)==MD_ONLY) {
for (int j = 0; j < nsd_; j++) {
velocity(i,j) = atomicVelocity(i,j);
}
}
}
if (trackDisplacement_) {
DENS_MAT & displacement(fields_[DISPLACEMENT].set_quantity());
DENS_MAN * nodalAtomicDisplacement(interscaleManager_.dense_matrix("NodalAtomicDisplacement"));
const DENS_MAT & atomicDisplacement(nodalAtomicDisplacement->quantity());
for (int i = 0; i<nNodes_; ++i) {
if (nodeType(i,0)==MD_ONLY) {
for (int j = 0; j < nsd_; j++) {
displacement(i,j) = atomicDisplacement(i,j);
}
}
}
}
}
}
initialized_ = true;
}
// reset integration field mask
velocityMask_.reset(NUM_FIELDS,NUM_FLUX);
velocityMask_ = false;
for (int i = 0; i < NUM_FLUX; i++)
velocityMask_(VELOCITY,i) = fieldMask_(VELOCITY,i);
refPE_=0;
refPE_=potential_energy();
}
//--------------------------------------------------------
// construct_methods
// have managers instantiate requested algorithms
// and methods
//--------------------------------------------------------
void ATC_CouplingMomentum::construct_methods()
{
ATC_Coupling::construct_methods();
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->construct_methods();
}
atomicRegulator_->construct_methods();
}
//--------------------------------------------------------
// construct_transfers
// constructs needed transfer operators
//--------------------------------------------------------
void ATC_CouplingMomentum::construct_transfers()
{
ATC_Coupling::construct_transfers();
// momentum of each atom
AtomicMomentum * atomicMomentum = new AtomicMomentum(this);
interscaleManager_.add_per_atom_quantity(atomicMomentum,
"AtomicMomentum");
// nodal momentum for RHS
AtfShapeFunctionRestriction * nodalAtomicMomentum = new AtfShapeFunctionRestriction(this,
atomicMomentum,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicMomentum,
"NodalAtomicMomentum");
// nodal forces
FundamentalAtomQuantity * atomicForce = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE);
AtfShapeFunctionRestriction * nodalAtomicForce = new AtfShapeFunctionRestriction(this,
atomicForce,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicForce,
"NodalAtomicForce");
// nodal velocity derived only from atoms
AtfShapeFunctionMdProjection * nodalAtomicVelocity = new AtfShapeFunctionMdProjection(this,
nodalAtomicMomentum,
VELOCITY);
interscaleManager_.add_dense_matrix(nodalAtomicVelocity,
"NodalAtomicVelocity");
if (trackDisplacement_) {
// mass-weighted (center-of-mass) displacement of each atom
AtomicMassWeightedDisplacement * atomicMassWeightedDisplacement;
if (needXrefProcessorGhosts_ || groupbitGhost_) { // explicit construction on internal group
PerAtomQuantity<double> * atomReferencePositions = interscaleManager_.per_atom_quantity("AtomicInternalReferencePositions");
atomicMassWeightedDisplacement = new AtomicMassWeightedDisplacement(this,atomPositions_,
atomMasses_,
atomReferencePositions,
INTERNAL);
}
else
atomicMassWeightedDisplacement = new AtomicMassWeightedDisplacement(this);
interscaleManager_.add_per_atom_quantity(atomicMassWeightedDisplacement,
"AtomicMassWeightedDisplacement");
// nodal (RHS) mass-weighted displacement
AtfShapeFunctionRestriction * nodalAtomicMassWeightedDisplacement = new AtfShapeFunctionRestriction(this,
atomicMassWeightedDisplacement,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicMassWeightedDisplacement,
"NodalAtomicMassWeightedDisplacement");
// nodal displacement derived only from atoms
AtfShapeFunctionMdProjection * nodalAtomicDisplacement = new AtfShapeFunctionMdProjection(this,
nodalAtomicMassWeightedDisplacement,
VELOCITY);
interscaleManager_.add_dense_matrix(nodalAtomicDisplacement,
"NodalAtomicDisplacement");
}
// atomic mass matrix data
if (!useFeMdMassMatrix_) {
// atomic momentum mass matrix
FundamentalAtomQuantity * atomicMass = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS);
nodalAtomicMass_ = new AtfShapeFunctionRestriction(this,
atomicMass,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicMass_,
"AtomicMomentumMassMat");
// atomic dimensionless mass matrix
ConstantQuantity<double> * atomicOnes = new ConstantQuantity<double>(this,1);
interscaleManager_.add_per_atom_quantity(atomicOnes,"AtomicOnes");
nodalAtomicCount_ = new AtfShapeFunctionRestriction(this,
atomicOnes,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicCount_,
"AtomicDimensionlessMassMat");
}
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->construct_transfers();
}
atomicRegulator_->construct_transfers();
}
//---------------------------------------------------------
// init_filter
// sets up the time filtering operations in all objects
//---------------------------------------------------------
void ATC_CouplingMomentum::init_filter()
{
ATC_Coupling::init_filter();
if (timeFilterManager_.end_equilibrate() && equilibriumStart_) // set up correct initial lambda forces to enforce initial accerlation
if (atomicRegulator_->coupling_mode()==AtomicRegulator::FLUX || atomicRegulator_->coupling_mode()==AtomicRegulator::GHOST_FLUX)
// nothing needed in other cases since kinetostat force is balanced by boundary flux in FE equations
atomicRegulator_->reset_lambda_contribution(nodalAtomicFieldsRoc_[VELOCITY].quantity());
}
//---------------------------------------------------------
// compute_md_mass_matrix
// compute the mass matrix arising from only atomistic
// quadrature and contributions as a summation
//---------------------------------------------------------
void ATC_CouplingMomentum::compute_md_mass_matrix(FieldName thisField,
DIAG_MAT & massMat)
{
if (thisField == DISPLACEMENT || thisField == VELOCITY)
massMat.reset(nodalAtomicMass_->quantity());
else if (thisField == MASS_DENSITY) { // dimensionless mass matrix
massMat.reset(nodalAtomicCount_->quantity());
}
}
//--------------------------------------------------------
// finish
// final clean up after a run
//--------------------------------------------------------
void ATC_CouplingMomentum::finish()
{
// base class
ATC_Coupling::finish();
atomicRegulator_->finish();
}
//--------------------------------------------------------
// modify
// parses inputs and modifies state of the filter
//--------------------------------------------------------
bool ATC_CouplingMomentum::modify(int narg, char **arg)
{
bool foundMatch = false;
int argIndex = 0;
// check to see if it is a transfer class command
// check derived class before base class
// pass-through to kinetostat
if (strcmp(arg[argIndex],"control")==0) {
argIndex++;
foundMatch = atomicRegulator_->modify(narg-argIndex,&arg[argIndex]);
}
// pass-through to timeIntegrator class
else if (strcmp(arg[argIndex],"time_integration")==0) {
argIndex++;
foundMatch = timeIntegrators_[VELOCITY]->modify(narg-argIndex,&arg[argIndex]);
}
// switch for if displacement is tracked or not
- /*! \page man_disp_control fix_modify AtC transfer track_displacement
+ /*! \page man_track_displacement fix_modify AtC track_displacement
\section syntax
- fix_modify AtC transfer track_displacement <on/off> \n
+ fix_modify AtC track_displacement <on/off> \n
+ \section examples
+ <TT> fix_modify atc track_displacement on </TT> \n
\section description
Determines whether displacement is tracked or not. For solids problems this is a useful quantity, but for fluids it is not relevant.
\section restrictions
Some constitutive models require the displacement field
\section default
on
*/
else if (strcmp(arg[argIndex],"track_displacement")==0) {
argIndex++;
if (strcmp(arg[argIndex],"on")==0) {
trackDisplacement_ = true;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"off")==0) {
trackDisplacement_ = false;
foundMatch = true;
}
if (foundMatch) {
needReset_ = true;
}
}
- /*! \page man_boundary_dynamics fix_modify AtC transfer boundary_dynamics
- \section syntax
- fix_modify AtC transfer boundary_dynamics <type> \n
- \section description
- \section restrictions
- \section default
- on
- */
+
else if (strcmp(arg[argIndex],"boundary_dynamics")==0) {
argIndex++;
- gamma_ = 0;
- kappa_ = 0;
- mu_ = 0;
- if (strcmp(arg[argIndex],"damped_harmonic")==0) {
- argIndex++;
- gamma_ = atof(arg[argIndex++]);
- kappa_ = atof(arg[argIndex++]);
- mu_ = atof(arg[argIndex++]);
- boundaryDynamics_ = DAMPED_HARMONIC;
- foundMatch = true;
- }
- else if (strcmp(arg[argIndex],"prescribed")==0) {
- boundaryDynamics_ = PRESCRIBED;
- foundMatch = true;
- }
- else if (strcmp(arg[argIndex],"coupled")==0) {
- boundaryDynamics_ = COUPLED;
- foundMatch = true;
- }
- else if (strcmp(arg[argIndex],"none")==0) {
- boundaryDynamics_ = NO_BOUNDARY_DYNAMICS;
- foundMatch = true;
- }
+ foundMatch = ghostManager_.modify(narg-argIndex,&arg[argIndex]);
}
// no match, call base class parser
if (!foundMatch) {
foundMatch = ATC_Coupling::modify(narg, arg);
}
return foundMatch;
}
//--------------------------------------------------
// pack_fields
// bundle all allocated field matrices into a list
// for output needs
//--------------------------------------------------
void ATC_CouplingMomentum::pack_elastic_fields(RESTART_LIST & data)
{
atomicRegulator_->pack_fields(data);
}
//--------------------------------------------------
// write_restart_file
// bundle matrices that need to be saved and call
// fe_engine to write the file
//--------------------------------------------------
void ATC_CouplingMomentum::write_restart_data(string fileName, RESTART_LIST & data)
{
pack_elastic_fields(data);
ATC_Method::write_restart_data(fileName,data);
}
//--------------------------------------------------
// write_restart_file
// bundle matrices that need to be saved and call
// fe_engine to write the file
//--------------------------------------------------
void ATC_CouplingMomentum::read_restart_data(string fileName, RESTART_LIST & data)
{
pack_elastic_fields(data);
ATC_Method::read_restart_data(fileName,data);
}
//--------------------------------------------------------
void ATC_CouplingMomentum::reset_nlocal()
{
ATC_Coupling::reset_nlocal();
atomicRegulator_->reset_nlocal();
}
//--------------------------------------------------
// reset_atom_materials
// update the atom materials map
//--------------------------------------------------
void ATC_CouplingMomentum::reset_atom_materials()
{
ATC_Coupling::reset_atom_materials();
atomicRegulator_->reset_atom_materials(elementToMaterialMap_,
atomElement_);
}
- //--------------------------------------------------------
- // pre_init_integrate
- // time integration before the lammps atomic
- // integration of the Verlet step 1
- //--------------------------------------------------------
- void ATC_CouplingMomentum::pre_init_integrate()
- {
- ATC_Coupling::pre_init_integrate();
- double dt = lammpsInterface_->dt();
-
- // get any initial data before its modified
- for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
- (_tiIt_->second)->pre_initial_integrate1(dt);
- }
-
- // apply kinetostat force, if needed
- atomicRegulator_->apply_pre_predictor(dt,lammpsInterface_->ntimestep());
-
- // predict nodal velocities
- for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
- (_tiIt_->second)->pre_initial_integrate2(dt);
- }
- extrinsicModelManager_.pre_init_integrate();
- }
-
+#ifdef OBSOLETE
//--------------------------------------------------------
// mid_init_integrate
// time integration between the velocity update and
// the position lammps update of Verlet step 1
//--------------------------------------------------------
void ATC_CouplingMomentum::mid_init_integrate()
{
// CONTINUOUS VELOCITY UPDATE
ATC_Coupling::mid_init_integrate();
double dt = lammpsInterface_->dt();
// Compute nodal velocity at n+1/2
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->mid_initial_integrate1(dt);
}
atomicRegulator_->apply_mid_predictor(dt,lammpsInterface_->ntimestep());
extrinsicModelManager_.mid_init_integrate();
}
//--------------------------------------------------------
// post_init_integrate
// time integration after the lammps atomic updates of
// Verlet step 1
//--------------------------------------------------------
void ATC_CouplingMomentum::post_init_integrate()
{
// CONTINUOUS DISPLACEMENT UPDATE
double dt = lammpsInterface_->dt();
// Compute nodal velocity at n+1
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_initial_integrate1(dt);
}
// Update kinetostat quantities if displacement is being regulated
atomicRegulator_->apply_post_predictor(dt,lammpsInterface_->ntimestep());
// Update extrisic model
extrinsicModelManager_.post_init_integrate();
// fixed values, non-group bcs handled through FE
set_fixed_nodes();
-
-
- // enforce atomic boundary conditions
- if (boundaryDynamics_==PRESCRIBED) set_ghost_atoms();
- else if (boundaryDynamics_==DAMPED_HARMONIC) initial_integrate_ghost();
- else if (boundaryDynamics_==COUPLED) initial_integrate_ghost();
// update time by a half dt
update_time(0.5);
ATC_Coupling::post_init_integrate();
}
-
+#endif
//--------------------------------------------------------
// pre_final_integrate
// integration before the second stage lammps atomic
// update of Verlet step 2
//--------------------------------------------------------
void ATC_CouplingMomentum::pre_final_integrate()
{
ATC_Coupling::pre_final_integrate();
-
- if (boundaryDynamics_==DAMPED_HARMONIC) {
- apply_ghost_forces();
- final_integrate_ghost();
- }
- else if (boundaryDynamics_==COUPLED) {
- add_ghost_forces();
- final_integrate_ghost();
- }
}
//--------------------------------------------------------
// post_final_integrate
// integration after the second stage lammps atomic
// update of Verlet step 2
//--------------------------------------------------------
void ATC_CouplingMomentum::post_final_integrate()
{
// COMPUTE FORCES FOR FE VELOCITY RHS
double dt = lammpsInterface_->dt();
// updating of data based on atomic forces
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->pre_final_integrate1(dt);
}
// Set prescribed sources for current time
prescribedDataMgr_->set_sources(time()+0.5*dt,sources_);
// predictor step in extrinsic model
extrinsicModelManager_.pre_final_integrate();
if (timeIntegrators_[VELOCITY]->has_final_predictor()) {
// set state-based sources
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
atomicRegulator_->compute_boundary_flux(fields_);
compute_atomic_sources(velocityMask_,fields_,atomicSources_);
}
// Compute kinetostat forces and add kinetostat contributions to FE equations
atomicRegulator_->apply_pre_corrector(dt,lammpsInterface_->ntimestep()); // computes but does not apply kstat, and only for StressFlux
// set state-based RHS
// Determine FE contributions to dv/dt-----------------------
// Compute atom-integrated rhs
// parallel communication happens within FE_Engine
compute_rhs_vector(velocityMask_,fields_,rhs_,FE_DOMAIN);
// Compute and add atomic contributions to FE equations
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->add_to_rhs();
}
// add in kinetostat contributions to FE equations
atomicRegulator_->add_to_rhs(rhs_);
// final phase predictor step
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate1(dt);
}
// fix nodes, non-group bcs applied through FE
set_fixed_nodes();
// CONTINUOUS VELOCITY RHS UPDATE
// corrector step extrinsic model
extrinsicModelManager_.post_final_integrate();
if (timeIntegrators_[VELOCITY]->has_final_corrector()) {
// set state-based sources
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
atomicRegulator_->compute_boundary_flux(fields_);
compute_atomic_sources(velocityMask_,fields_,atomicSources_);
}
// Finish update of FE velocity
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate2(dt);
}
// Apply kinetostat to atoms
atomicRegulator_->apply_post_corrector(dt,lammpsInterface_->ntimestep());
// finalize time integration
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate3(dt);
}
// Fix nodes, non-group bcs applied through FE
set_fixed_nodes();
// update time by a half dt
update_time(0.5);
output();
ATC_Coupling::post_final_integrate(); // addstep for computes
}
//--------------------------------------------------------
// min_pre_force
// add to interatomic forces for minimize
//--------------------------------------------------------
void ATC_CouplingMomentum::min_pre_force()
{
}
//--------------------------------------------------------
// min_post_force
// add to interatomic forces for minimize
// this determines the search direction
//--------------------------------------------------------
void ATC_CouplingMomentum::min_post_force()
{
// reset positions and shape functions
ATC_Method::min_post_force();
// Set sources
prescribedDataMgr_->set_sources(time(),sources_);
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
extrinsicModelManager_.pre_final_integrate();
if (outputNow_) {
update_time(1.0);
update_step();
output();
outputNow_ = false;
}
localStep_ += 1;
}
//--------------------------------------------------------
// output
// does post-processing steps and outputs data
//--------------------------------------------------------
void ATC_CouplingMomentum::output()
{
if (output_now()) {
feEngine_->departition_mesh();
OUTPUT_LIST outputData;
// base class output
ATC_Method::output();
// push atc fields time integrator modifies into output arrays
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_process();
}
// auxilliary data
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->output(outputData);
}
atomicRegulator_->output(outputData);
extrinsicModelManager_.output(outputData);
DENS_MAT & velocity(nodalAtomicFields_[VELOCITY].set_quantity());
DENS_MAT & rhs(rhs_[VELOCITY].set_quantity());
if (lammpsInterface_->rank_zero()) {
// mesh data
outputData["NodalAtomicVelocity"] = &velocity;
outputData["FE_Force"] = &rhs;
if (trackDisplacement_) {
outputData["NodalAtomicDisplacement"] = & nodalAtomicFields_[DISPLACEMENT].set_quantity();
}
feEngine_->write_data(output_index(), fields_, & outputData);
}
// force optional variables to reset to keep in sync
if (trackDisplacement_) {
nodalAtomicFields_[DISPLACEMENT].force_reset();
}
feEngine_->partition_mesh();
}
}
- //--------------------------------------------------------
- // set_ghost_atoms
- // sets ghost atom positions to finite element
- // displacements based on shape functions
- //--------------------------------------------------------
- void ATC_CouplingMomentum::set_ghost_atoms()
- {
- // set atomic displacements based on FE displacements
- double ** x = lammpsInterface_->xatom();
- // prolong
- DenseMatrix<double> ghostAtomData(nLocalGhost_,nsd_);
- if (nLocalGhost_>0)
- ghostAtomData = (shpFcnGhost_->quantity())*(fields_[DISPLACEMENT].quantity());
-
- for (int i = 0; i < nLocalGhost_; ++i)
- for (int j = 0; j < nsd_; ++j)
- x[ghostToAtom_(i)][j] = ghostAtomData(i,j)+xref_[ghostToAtom_(i)][j];
-
-
- }
-
- //--------------------------------------------------------
- // add_ghost_forces
- // add forces to dynamic ghosts
- //--------------------------------------------------------
- void ATC_CouplingMomentum::add_ghost_forces()
- {
- double **x = lammpsInterface_->xatom();
- double **v = lammpsInterface_->vatom();
- double **f = lammpsInterface_->fatom();
-
- // add forces
- DENS_MAT coarseDisp(nLocalGhost_,nsd_);
- DENS_MAT coarseVel(nLocalGhost_,nsd_);
- if (nLocalGhost_>0) {
- coarseDisp = (shpFcnGhost_->quantity())*(fields_[DISPLACEMENT].quantity());
- coarseVel = (shpFcnGhost_->quantity())*(fields_[VELOCITY].quantity());
- }
- // dynamics one-way coupled to real atoms in a well tied to coarse scale
- for (int i = 0; i < nLocalGhost_; ++i) {
- for (int j = 0; j < nsd_; ++j) {
- double du = coarseDisp(i,j)+xref_[ghostToAtom_(i)][j]-x[ghostToAtom_(i)][j];
- double dv = coarseVel(i,j)-v[ghostToAtom_(i)][j];
- f[ghostToAtom_(i)][j] += mu_*du + gamma_*dv;
-
- }
- }
- }
-
- void ATC_CouplingMomentum::apply_ghost_forces()
- {
- double **x = lammpsInterface_->xatom();
- double **v = lammpsInterface_->vatom();
- double **f = lammpsInterface_->fatom();
-
- // add forces
- DENS_MAT coarseDisp(nLocalGhost_,nsd_);
- DENS_MAT coarseVel(nLocalGhost_,nsd_);
- if (nLocalGhost_>0) {
- coarseDisp = (shpFcnGhost_->quantity())*(fields_[DISPLACEMENT].quantity());
- coarseVel = (shpFcnGhost_->quantity())*(fields_[VELOCITY].quantity());
- }
- // dynamics one-way coupled to real atoms in a well tied to coarse scale
- for (int i = 0; i < nLocalGhost_; ++i) {
- for (int j = 0; j < nsd_; ++j) {
- double du = coarseDisp(i,j)+xref_[ghostToAtom_(i)][j]-x[ghostToAtom_(i)][j];
- double dv = coarseVel(i,j)-v[ghostToAtom_(i)][j];
- f[ghostToAtom_(i)][j] = mu_*du + gamma_*dv;
-
- }
- }
- }
-
- //--------------------------------------------------------
- // initial_integrate_ghost
- // does the first step of the Verlet integration for
- // ghost atoms, to be used with non-reflecting BCs
- //--------------------------------------------------------
- void ATC_CouplingMomentum::initial_integrate_ghost()
- {
- double dtfm;
-
- double **x = lammpsInterface_->xatom();
- double **v = lammpsInterface_->vatom();
- double **f = lammpsInterface_->fatom();
- const int *mask = lammpsInterface_->atom_mask();
- int nlocal = lammpsInterface_->nlocal();
- double dtv = lammpsInterface_->dt();
- double dtf = 0.5 * lammpsInterface_->dt() * lammpsInterface_->ftm2v();
-
- for (int i = 0; i < nlocal; i++) {
- if (mask[i] & groupbitGhost_) {
- dtfm = dtf / mu_;
- v[i][0] += dtfm * f[i][0];
- v[i][1] += dtfm * f[i][1];
- v[i][2] += dtfm * f[i][2];
- x[i][0] += dtv * v[i][0];
- x[i][1] += dtv * v[i][1];
- x[i][2] += dtv * v[i][2];
- }
- }
- }
-
- //--------------------------------------------------------
- // final_integrate_ghost
- // does the second step of the Verlet integration for
- // ghost atoms, to be used with non-reflecting BCs
- //--------------------------------------------------------
- void ATC_CouplingMomentum::final_integrate_ghost()
- {
- double dtfm;
-
- double **v = lammpsInterface_->vatom();
- double **f = lammpsInterface_->fatom();
- const int *mask = lammpsInterface_->atom_mask();
- int nlocal = lammpsInterface_->nlocal();
- double dtf = 0.5 * lammpsInterface_->dt() * lammpsInterface_->ftm2v();
-
- for (int i = 0; i < nlocal; i++) {
- if (mask[i] & groupbitGhost_) {
- dtfm = dtf / mu_;
- v[i][0] += dtfm * f[i][0];
- v[i][1] += dtfm * f[i][1];
- v[i][2] += dtfm * f[i][2];
- }
- }
- }
-
//--------------------------------------------------------------------
// compute_scalar : added energy
// this is used in the line search
//--------------------------------------------------------------------
double ATC_CouplingMomentum::compute_scalar(void)
{
double energy = extrinsicModelManager_.compute_scalar();
return energy;
}
//--------------------------------------------------------------------
// kinetic energy
//--------------------------------------------------------------------
double ATC_CouplingMomentum::kinetic_energy(const IntegrationDomainType domain) // const
{
const MATRIX & M = massMats_[VELOCITY].quantity();
const DENS_MAT & velocity(fields_[VELOCITY].quantity());
double kineticEnergy = 0;
for (int j = 0; j < nsd_; j++) {
CLON_VEC v = column(velocity,j);
kineticEnergy += v.dot(M*v);
}
if (domain == FE_DOMAIN) {
Array<FieldName> massMask(1);
massMask(0) = VELOCITY;
feEngine_->compute_lumped_mass_matrix(massMask,fields_,physicsModel_,atomMaterialGroups_,
atomVolume_->quantity(),shpFcn_->quantity(),
Ma_);
const MATRIX & Ma = Ma_[VELOCITY].quantity();
for (int j = 0; j < nsd_; j++) {
CLON_VEC v = column(velocity,j);
kineticEnergy -= v.dot(Ma*v);
}
}
double mvv2e = lammpsInterface_->mvv2e();
kineticEnergy *= 0.5*mvv2e; // convert to LAMMPS units
return kineticEnergy;
}
//--------------------------------------------------------------------
// potential/strain energy
//--------------------------------------------------------------------
double ATC_CouplingMomentum::potential_energy(const IntegrationDomainType domain) const
{
Array<FieldName> mask(1);
mask(0) = VELOCITY;
FIELD_MATS energy;
feEngine_->compute_energy(mask,
fields_,
physicsModel_,
elementToMaterialMap_,
energy,
&(elementMask_->quantity()),
domain);
double potentialEnergy = energy[VELOCITY].col_sum();
double mvv2e = lammpsInterface_->mvv2e();
potentialEnergy *= mvv2e; // convert to LAMMPS units
return potentialEnergy-refPE_;
}
//--------------------------------------------------------------------
// compute_vector
//--------------------------------------------------------------------
// this is for direct output to lammps thermo
double ATC_CouplingMomentum::compute_vector(int n)
{
// output[1] = total coarse scale kinetic energy
// output[2] = total coarse scale potential energy
// output[3] = total coarse scale energy
// output[4] = fe-only coarse scale kinetic energy
// output[5] = fe-only coarse scale potential energy
if (n == 0) {
return kinetic_energy();
}
else if (n == 1) {
return potential_energy();
}
else if (n == 2) {
return kinetic_energy()+potential_energy();
}
else if (n == 3) {
return kinetic_energy(FE_DOMAIN);
}
else if (n == 4) {
return potential_energy(FE_DOMAIN);
}
else if (n > 4) {
double extrinsicValue = extrinsicModelManager_.compute_vector(n);
return extrinsicValue;
}
return 0.;
}
};
diff --git a/lib/atc/ATC_CouplingMomentum.h b/lib/atc/ATC_CouplingMomentum.h
index 7ded389f2..8f83f527f 100644
--- a/lib/atc/ATC_CouplingMomentum.h
+++ b/lib/atc/ATC_CouplingMomentum.h
@@ -1,149 +1,134 @@
#ifndef ATC_COUPLING_MOMENTUM_H
#define ATC_COUPLING_MOMENTUM_H
/** owned field/s: DISPLACEMENT, VELOCITY */
// ATC headers
#include "ATC_Coupling.h"
#include "Kinetostat.h"
#include "ElasticTimeIntegrator.h"
// Other headers
-#include <map>
+#include <string>
namespace ATC {
// Forward declarations
class AtfShapeFunctionRestriction;
class AtfShapeFunctionMdProjection;
/**
* @class ATC_CouplingMomentum
* @brief A class for atom-continuum transfers & control involving mechanical motion
* (owned field/s: DISPLACEMENT, VELOCITY)
*/
class ATC_CouplingMomentum : public ATC_Coupling {
public:
// constructor
ATC_CouplingMomentum(std::string groupName,
double **& perAtomArray,
LAMMPS_NS::Fix * thisFix,
std::string matParamFile,
PhysicsType intrinsicModel,
ExtrinsicModelType extrinsicModel = NO_MODEL);
// destructor
virtual ~ATC_CouplingMomentum();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** pre time integration */
virtual void initialize();
/** flags whether a methods reset is required */
virtual bool reset_methods() const {
bool resetMethods = ATC_Method::reset_methods() ||atomicRegulator_->need_reset();
_ctiIt_ = timeIntegrators_.find(VELOCITY);
if (_ctiIt_ == timeIntegrators_.end()) return resetMethods;
return resetMethods || (_ctiIt_->second)->need_reset();
};
/** post time integration */
virtual void finish();
+#ifdef OBSOLETE
+
- /** first time, before atomic integration */
- virtual void pre_init_integrate();
/** first time, after atomic velocity but before position integration */
virtual void mid_init_integrate();
/** first time, after atomic integration */
virtual void post_init_integrate();
-
+#endif
/** second time, before atomic integration */
virtual void pre_final_integrate();
/** second time, after atomic integration */
virtual void post_final_integrate();
/** pre/post atomic force calculation in minimize */
virtual void min_pre_force();
virtual void min_post_force();
/** compute scalar for output - added energy */
virtual double compute_scalar(void);
/** compute vector for output */
virtual double compute_vector(int n);
double kinetic_energy(const IntegrationDomainType domain=FULL_DOMAIN); // const;
double potential_energy(const IntegrationDomainType domain=FULL_DOMAIN) const;
/** output routines */
virtual void output(void);
/** set up atom to material identification */
virtual void reset_atom_materials();
protected:
//---------------------------------------------------------------
/** initialization routines */
//---------------------------------------------------------------
/** constructs all data which is updated with time integration, i.e. fields */
//virtual void construct_time_integration_data();
/** create methods, e.g. time integrators, filters */
virtual void construct_methods();
/** set up data which is dependency managed */
virtual void construct_transfers();
- // ghost atom routines
- /** set ghost function positions based on FE state */
- virtual void set_ghost_atoms();
- /** analagous to FixATC initial_integrate applied to ghosts */
- void initial_integrate_ghost();
- /** analagous to FixATC final_integrate applied to ghosts */
- void final_integrate_ghost();
- /** forces on dynamic ghosts */
- void add_ghost_forces();
- void apply_ghost_forces();
-
/** adds resetting of any kinetostat arrays associated with local atom count */
virtual void reset_nlocal();
/** compute the mass matrix components coming from MD integration */
virtual void compute_md_mass_matrix(FieldName thisField,
DIAG_MAT & massMats);
/** operator to compute the mass matrix for the momentum equation from MD integration */
AtfShapeFunctionRestriction * nodalAtomicMass_;
/** operator to compute the dimensionless mass matrix from MD integration */
AtfShapeFunctionRestriction * nodalAtomicCount_;
/** physics specific filter initialization */
void init_filter();
/** field mask for velocity integration */
Array2D<bool> velocityMask_;
// Add in fields for restarting
- virtual void read_restart_data(string fileName_, RESTART_LIST & data);
- virtual void write_restart_data(string fileName_, RESTART_LIST & data);
+ virtual void read_restart_data(std::string fileName_, RESTART_LIST & data);
+ virtual void write_restart_data(std::string fileName_, RESTART_LIST & data);
void pack_elastic_fields(RESTART_LIST & data);
- // boundary dynamics
- BoundaryDynamicsType boundaryDynamics_;
- double gamma_, mu_, kappa_;
-
// data
double refPE_;
/** mass matrix computed with atomic quadrature for KE output */
MASS_MATS Ma_;
};
};
#endif
diff --git a/lib/atc/ATC_CouplingMomentumEnergy.cpp b/lib/atc/ATC_CouplingMomentumEnergy.cpp
index e7ed73d4b..c82ecffb4 100644
--- a/lib/atc/ATC_CouplingMomentumEnergy.cpp
+++ b/lib/atc/ATC_CouplingMomentumEnergy.cpp
@@ -1,1061 +1,857 @@
// ATC headers
#include "ATC_CouplingMomentumEnergy.h"
#include "KinetoThermostat.h"
#include "ATC_Error.h"
#include "PrescribedDataManager.h"
// Other Headers
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <typeinfo>
+#include <iostream>
+
+using std::string;
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class ATC_CouplingMomentumEnergy
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ATC_CouplingMomentumEnergy::ATC_CouplingMomentumEnergy(string groupName,
double ** & perAtomArray,
LAMMPS_NS::Fix * thisFix,
string matParamFile,
ExtrinsicModelType extrinsicModel)
: ATC_Coupling(groupName,perAtomArray,thisFix),
nodalAtomicMass_(NULL),
nodalAtomicCount_(NULL),
nodalAtomicHeatCapacity_(NULL),
nodalAtomicKineticTemperature_(NULL),
nodalAtomicConfigurationalTemperature_(NULL),
- boundaryDynamics_(PRESCRIBED),
- gamma_(0),mu_(1),kappa_(1),
refPE_(0)
{
// Allocate PhysicsModel
create_physics_model(THERMO_ELASTIC, matParamFile);
// create extrinsic physics model
if (extrinsicModel != NO_MODEL) {
extrinsicModelManager_.create_model(extrinsicModel,matParamFile);
}
+ // set up field data based on physicsModel
+ physicsModel_->num_fields(fieldSizes_,fieldMask_);
+
// Defaults
set_time();
bndyIntType_ = FE_INTERPOLATION;
- trackDisplacement_ = true;
-
- // set up field data based on physicsModel
- physicsModel_->num_fields(fieldSizes_,fieldMask_);
- fieldSizes_[DISPLACEMENT] = fieldSizes_[VELOCITY];
+ trackCharge_ = false;
// set up atomic regulator
atomicRegulator_ = new KinetoThermostat(this);
- // default to not track charge
- trackCharge_ = false;
-
// set up physics specific time integrator and thermostat
+ trackDisplacement_ = true;
+ fieldSizes_[DISPLACEMENT] = fieldSizes_[VELOCITY];
timeIntegrators_[VELOCITY] = new MomentumTimeIntegrator(this,TimeIntegrator::FRACTIONAL_STEP);
timeIntegrators_[TEMPERATURE] = new ThermalTimeIntegrator(this,TimeIntegrator::FRACTIONAL_STEP);
+ ghostManager_.set_boundary_dynamics(GhostManager::PRESCRIBED);
// default physics
temperatureDef_ = KINETIC;
// output variable vector info:
// output[1] = total coarse scale mechanical kinetic energy
// output[2] = total coarse scale mechanical potential energy
// output[3] = total coarse scale mechanical energy
// output[1] = total coarse scale thermal energy
// output[2] = average temperature
scalarFlag_ = 1;
vectorFlag_ = 1;
sizeVector_ = 5;
scalarVectorFreq_ = 1;
extVector_ = 1;
if (extrinsicModel != NO_MODEL)
sizeVector_ += extrinsicModelManager_.size_vector(sizeVector_);
// create PE per atom ccompute
lammpsInterface_->create_compute_pe_peratom();
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ATC_CouplingMomentumEnergy::~ATC_CouplingMomentumEnergy()
{
// clear out all managed memory to avoid conflicts with dependencies on class member data
interscaleManager_.clear();
}
//--------------------------------------------------------
// initialize
// sets up all the necessary data
//--------------------------------------------------------
void ATC_CouplingMomentumEnergy::initialize()
{
// clear displacement entries if requested
if (!trackDisplacement_) {
fieldSizes_.erase(DISPLACEMENT);
for (int i = 0; i < NUM_FLUX; i++)
fieldMask_(DISPLACEMENT,i) = false;
}
// Base class initalizations
ATC_Coupling::initialize();
// resetting precedence:
// time integrator -> kinetostat/thermostat -> time filter
// init_filter uses fieldRateNdFiltered which comes from the time integrator,
// which is why the time integrator is initialized first
- // set the reference potential, if necessary, because the nodal energy is needed to initialize the time integrator
- if (!initialized_) {
- if (temperatureDef_==TOTAL) {
- PerAtomQuantity<double> * atomicReferencePotential = interscaleManager_.per_atom_quantity("AtomicReferencePotential");
- PerAtomQuantity<double> * atomicPotentialEnergy = interscaleManager_.per_atom_quantity("AtomicPotentialEnergy");
- atomicReferencePotential->set_quantity() = atomicPotentialEnergy->quantity();
- }
- }
-
// other initializations
if (reset_methods()) {
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->force_reset();
}
atomicRegulator_->force_reset();
}
if (reset_methods()) {
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->initialize();
}
atomicRegulator_->initialize();
extrinsicModelManager_.initialize();
}
- if (timeFilterManager_.need_reset()) // reset thermostat power
+ if (timeFilterManager_.need_reset()) {// reset thermostat power
init_filter();
- timeFilterManager_.initialize(); // clears need for reset
+ }
+ // clears need for reset
+ timeFilterManager_.initialize();
+ ghostManager_.initialize();
if (!initialized_) {
// initialize sources based on initial FE temperature
double dt = lammpsInterface_->dt();
prescribedDataMgr_->set_sources(time()+0.5*dt,sources_);
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
atomicRegulator_->compute_boundary_flux(fields_);
compute_atomic_sources(fieldMask_,fields_,atomicSources_);
// read in field data if necessary
if (useRestart_) {
RESTART_LIST data;
read_restart_data(restartFileName_,data);
useRestart_ = false;
}
// set consistent initial conditions, if requested
if (!timeFilterManager_.filter_dynamics()) {
if (consistentInitialization_) {
DENS_MAT & velocity(fields_[VELOCITY].set_quantity());
DENS_MAN * nodalAtomicVelocity(interscaleManager_.dense_matrix("NodalAtomicVelocity"));
const DENS_MAT & atomicVelocity(nodalAtomicVelocity->quantity());
DENS_MAT & temperature(fields_[TEMPERATURE].set_quantity());
DENS_MAN * nodalAtomicTemperature(interscaleManager_.dense_matrix("NodalAtomicTemperature"));
const DENS_MAT & atomicTemperature(nodalAtomicTemperature->quantity());
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
for (int i = 0; i<nNodes_; ++i) {
if (nodeType(i,0)==MD_ONLY) {
for (int j = 0; j < nsd_; j++) {
velocity(i,j) = atomicVelocity(i,j);
}
temperature(i,0) = atomicTemperature(i,0);
}
}
if (trackDisplacement_) {
DENS_MAT & displacement(fields_[DISPLACEMENT].set_quantity());
DENS_MAN * nodalAtomicDisplacement(interscaleManager_.dense_matrix("NodalAtomicDisplacement"));
const DENS_MAT & atomicDisplacement(nodalAtomicDisplacement->quantity());
for (int i = 0; i<nNodes_; ++i) {
if (nodeType(i,0)==MD_ONLY) {
for (int j = 0; j < nsd_; j++) {
displacement(i,j) = atomicDisplacement(i,j);
}
}
}
}
}
}
initialized_ = true;
}
// reset integration field mask
velocityMask_.reset(NUM_FIELDS,NUM_FLUX);
velocityMask_ = false;
for (int i = 0; i < NUM_FLUX; i++)
velocityMask_(VELOCITY,i) = fieldMask_(VELOCITY,i);
temperatureMask_.reset(NUM_FIELDS,NUM_FLUX);
temperatureMask_ = false;
for (int i = 0; i < NUM_FLUX; i++)
temperatureMask_(TEMPERATURE,i) = fieldMask_(TEMPERATURE,i);
refPE_=0;
refPE_=potential_energy();
}
//--------------------------------------------------------
// construct_methods
// have managers instantiate requested algorithms
// and methods
//--------------------------------------------------------
void ATC_CouplingMomentumEnergy::construct_methods()
{
ATC_Coupling::construct_methods();
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->construct_methods();
}
atomicRegulator_->construct_methods();
}
//--------------------------------------------------------
// construct_transfers
// constructs needed transfer operators
//--------------------------------------------------------
void ATC_CouplingMomentumEnergy::construct_transfers()
{
ATC_Coupling::construct_transfers();
// momentum of each atom
AtomicMomentum * atomicMomentum = new AtomicMomentum(this);
interscaleManager_.add_per_atom_quantity(atomicMomentum,
"AtomicMomentum");
// nodal momentum for RHS
AtfShapeFunctionRestriction * nodalAtomicMomentum = new AtfShapeFunctionRestriction(this,
atomicMomentum,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicMomentum,
"NodalAtomicMomentum");
// nodal forces
FundamentalAtomQuantity * atomicForce = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE);
AtfShapeFunctionRestriction * nodalAtomicForce = new AtfShapeFunctionRestriction(this,
atomicForce,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicForce,
"NodalAtomicForce");
// nodal velocity derived only from atoms
AtfShapeFunctionMdProjection * nodalAtomicVelocity = new AtfShapeFunctionMdProjection(this,
nodalAtomicMomentum,
VELOCITY);
interscaleManager_.add_dense_matrix(nodalAtomicVelocity,
"NodalAtomicVelocity");
if (trackDisplacement_) {
// mass-weighted (center-of-mass) displacement of each atom
AtomicMassWeightedDisplacement * atomicMassWeightedDisplacement;
if (needXrefProcessorGhosts_ || groupbitGhost_) { // explicit construction on internal group
PerAtomQuantity<double> * atomReferencePositions = interscaleManager_.per_atom_quantity("AtomicInternalReferencePositions");
atomicMassWeightedDisplacement = new AtomicMassWeightedDisplacement(this,atomPositions_,
atomMasses_,
atomReferencePositions,
INTERNAL);
}
else
atomicMassWeightedDisplacement = new AtomicMassWeightedDisplacement(this);
interscaleManager_.add_per_atom_quantity(atomicMassWeightedDisplacement,
"AtomicMassWeightedDisplacement");
// nodal (RHS) mass-weighted displacement
AtfShapeFunctionRestriction * nodalAtomicMassWeightedDisplacement = new AtfShapeFunctionRestriction(this,
atomicMassWeightedDisplacement,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicMassWeightedDisplacement,
"NodalAtomicMassWeightedDisplacement");
// nodal displacement derived only from atoms
AtfShapeFunctionMdProjection * nodalAtomicDisplacement = new AtfShapeFunctionMdProjection(this,
nodalAtomicMassWeightedDisplacement,
VELOCITY);
interscaleManager_.add_dense_matrix(nodalAtomicDisplacement,
"NodalAtomicDisplacement");
}
// always need kinetic energy
FtaShapeFunctionProlongation * atomicMeanVelocity = new FtaShapeFunctionProlongation(this,&fields_[VELOCITY],shpFcn_);
interscaleManager_.add_per_atom_quantity(atomicMeanVelocity,
"AtomicMeanVelocity");
AtomicEnergyForTemperature * atomicTwiceKineticEnergy = new TwiceFluctuatingKineticEnergy(this);
AtomicEnergyForTemperature * atomEnergyForTemperature = NULL;
// Appropriate per-atom quantity based on desired temperature definition
if (temperatureDef_==KINETIC) {
atomEnergyForTemperature = atomicTwiceKineticEnergy;
}
else if (temperatureDef_==TOTAL) {
if (timeIntegrators_[TEMPERATURE]->time_integration_type() != TimeIntegrator::FRACTIONAL_STEP)
throw ATC_Error("ATC_CouplingMomentumEnergy:construct_transfers() on the fractional step time integrator can be used with non-kinetic defitions of the temperature");
// kinetic energy
interscaleManager_.add_per_atom_quantity(atomicTwiceKineticEnergy,
"AtomicTwiceKineticEnergy");
// atomic potential energy
ComputedAtomQuantity * atomicPotentialEnergy = new ComputedAtomQuantity(this,lammpsInterface_->compute_pe_name(),
1./(lammpsInterface_->mvv2e()));
interscaleManager_.add_per_atom_quantity(atomicPotentialEnergy,
"AtomicPotentialEnergy");
// reference potential energy
AtcAtomQuantity<double> * atomicReferencePotential;
if (!initialized_) {
atomicReferencePotential = new AtcAtomQuantity<double>(this);
interscaleManager_.add_per_atom_quantity(atomicReferencePotential,
"AtomicReferencePotential");
atomicReferencePotential->set_memory_type(PERSISTENT);
}
else {
atomicReferencePotential = static_cast<AtcAtomQuantity<double> * >(interscaleManager_.per_atom_quantity("AtomicReferencePotential"));
}
- AtfShapeFunctionRestriction * nodalAtomicReferencePotential = new AtfShapeFunctionRestriction(this,
- atomicReferencePotential,
- shpFcn_);
- interscaleManager_.add_dense_matrix(nodalAtomicReferencePotential,
- "NodalAtomicReferencePotential");
+ nodalRefPotentialEnergy_ = new AtfShapeFunctionRestriction(this,
+ atomicReferencePotential,
+ shpFcn_);
+ interscaleManager_.add_dense_matrix(nodalRefPotentialEnergy_,
+ "NodalAtomicReferencePotential");
// fluctuating potential energy
AtomicEnergyForTemperature * atomicFluctuatingPotentialEnergy = new FluctuatingPotentialEnergy(this,
atomicPotentialEnergy,
atomicReferencePotential);
interscaleManager_.add_per_atom_quantity(atomicFluctuatingPotentialEnergy,
"AtomicFluctuatingPotentialEnergy");
// atomic total energy
atomEnergyForTemperature = new MixedKePeEnergy(this,1,1);
// kinetic temperature measure for post-processing
// nodal restriction of the atomic energy quantity for the temperature definition
AtfShapeFunctionRestriction * nodalAtomicTwiceKineticEnergy = new AtfShapeFunctionRestriction(this,
atomicTwiceKineticEnergy,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicTwiceKineticEnergy,
"NodalAtomicTwiceKineticEnergy");
nodalAtomicKineticTemperature_ = new AtfShapeFunctionMdProjection(this,
nodalAtomicTwiceKineticEnergy,
TEMPERATURE);
interscaleManager_.add_dense_matrix(nodalAtomicKineticTemperature_,
"NodalAtomicKineticTemperature");
// potential temperature measure for post-processing (must multiply by 2 for configurational temperature
// nodal restriction of the atomic energy quantity for the temperature definition
AtfShapeFunctionRestriction * nodalAtomicFluctuatingPotentialEnergy = new AtfShapeFunctionRestriction(this,
atomicFluctuatingPotentialEnergy,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicFluctuatingPotentialEnergy,
"NodalAtomicFluctuatingPotentialEnergy");
nodalAtomicConfigurationalTemperature_ = new AtfShapeFunctionMdProjection(this,
nodalAtomicFluctuatingPotentialEnergy,
TEMPERATURE);
interscaleManager_.add_dense_matrix(nodalAtomicConfigurationalTemperature_,
"NodalAtomicConfigurationalTemperature");
}
// register the per-atom quantity for the temperature definition
interscaleManager_.add_per_atom_quantity(atomEnergyForTemperature,
"AtomicEnergyForTemperature");
// nodal restriction of the atomic energy quantity for the temperature definition
AtfShapeFunctionRestriction * nodalAtomicEnergy = new AtfShapeFunctionRestriction(this,
atomEnergyForTemperature,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicEnergy,
"NodalAtomicEnergy");
// nodal atomic temperature field
AtfShapeFunctionMdProjection * nodalAtomicTemperature = new AtfShapeFunctionMdProjection(this,
nodalAtomicEnergy,
TEMPERATURE);
interscaleManager_.add_dense_matrix(nodalAtomicTemperature,
"NodalAtomicTemperature");
if (!useFeMdMassMatrix_) {
// atomic momentum mass matrix
FundamentalAtomQuantity * atomicMass = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS);
nodalAtomicMass_ = new AtfShapeFunctionRestriction(this,
atomicMass,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicMass_,
"AtomicMomentumMassMat");
// atomic dimensionless mass matrix
ConstantQuantity<double> * atomicOnes = new ConstantQuantity<double>(this,1);
interscaleManager_.add_per_atom_quantity(atomicOnes,"AtomicOnes");
nodalAtomicCount_ = new AtfShapeFunctionRestriction(this,
atomicOnes,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicCount_,
"AtomicDimensionlessMassMat");
// classical thermodynamic heat capacity of the atoms
HeatCapacity * heatCapacity = new HeatCapacity(this);
interscaleManager_.add_per_atom_quantity(heatCapacity,
"AtomicHeatCapacity");
// atomic thermal mass matrix
nodalAtomicHeatCapacity_ = new AtfShapeFunctionRestriction(this,
heatCapacity,
shpFcn_);
interscaleManager_.add_dense_matrix(nodalAtomicHeatCapacity_,
"NodalAtomicHeatCapacity");
}
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->construct_transfers();
}
atomicRegulator_->construct_transfers();
}
//---------------------------------------------------------
// init_filter
// sets up the time filtering operations in all objects
//---------------------------------------------------------
void ATC_CouplingMomentumEnergy::init_filter()
{
if (timeIntegrators_[TEMPERATURE]->time_integration_type() != TimeIntegrator::FRACTIONAL_STEP) {
throw ATC_Error("ATC_CouplingMomentumEnergy::initialize - method only valid with fractional step time integration");
}
ATC_Coupling::init_filter();
if (timeFilterManager_.end_equilibrate() && equilibriumStart_) {
if (atomicRegulator_->coupling_mode(VELOCITY)==AtomicRegulator::FLUX || atomicRegulator_->coupling_mode(VELOCITY)==AtomicRegulator::GHOST_FLUX)
// nothing needed in other cases since kinetostat force is balanced by boundary flux in FE equations
atomicRegulator_->reset_lambda_contribution(nodalAtomicFieldsRoc_[VELOCITY].quantity(),VELOCITY);
DENS_MAT powerMat(-1.*(nodalAtomicFields_[TEMPERATURE].quantity()));
atomicRegulator_->reset_lambda_contribution(powerMat,TEMPERATURE);
}
}
//---------------------------------------------------------
// compute_md_mass_matrix
// compute the mass matrix arising from only atomistic
// quadrature and contributions as a summation
//---------------------------------------------------------
void ATC_CouplingMomentumEnergy::compute_md_mass_matrix(FieldName thisField,
DIAG_MAT & massMat)
{
if (thisField == DISPLACEMENT || thisField == VELOCITY) {
massMat.reset(nodalAtomicMass_->quantity());
}
else if (thisField == MASS_DENSITY) { // dimensionless mass matrix
massMat.reset(nodalAtomicCount_->quantity());
}
else if (thisField == TEMPERATURE) {
massMat.reset(nodalAtomicHeatCapacity_->quantity());
}
}
//--------------------------------------------------------
// finish
// final clean up after a run
//--------------------------------------------------------
void ATC_CouplingMomentumEnergy::finish()
{
// base class
ATC_Coupling::finish();
atomicRegulator_->finish();
}
//--------------------------------------------------------
// modify
// parses inputs and modifies state of the filter
//--------------------------------------------------------
bool ATC_CouplingMomentumEnergy::modify(int narg, char **arg)
{
bool foundMatch = false;
int argIndex = 0;
return foundMatch;
}
//--------------------------------------------------
// pack_fields
// bundle all allocated field matrices into a list
// for output needs
//--------------------------------------------------
void ATC_CouplingMomentumEnergy::pack_quantity_fields(RESTART_LIST & data)
{
atomicRegulator_->pack_fields(data);
}
//--------------------------------------------------
// write_restart_file
// bundle matrices that need to be saved and call
// fe_engine to write the file
//--------------------------------------------------
void ATC_CouplingMomentumEnergy::write_restart_data(string fileName, RESTART_LIST & data)
{
pack_quantity_fields(data);
ATC_Method::write_restart_data(fileName,data);
}
//--------------------------------------------------
// write_restart_file
// bundle matrices that need to be saved and call
// fe_engine to write the file
//--------------------------------------------------
void ATC_CouplingMomentumEnergy::read_restart_data(string fileName, RESTART_LIST & data)
{
pack_quantity_fields(data);
ATC_Method::read_restart_data(fileName,data);
}
//--------------------------------------------------
void ATC_CouplingMomentumEnergy::reset_nlocal()
{
ATC_Coupling::reset_nlocal();
atomicRegulator_->reset_nlocal();
}
//--------------------------------------------------
// reset_atom_materials
// update the atom materials map
//--------------------------------------------------
void ATC_CouplingMomentumEnergy::reset_atom_materials()
{
ATC_Coupling::reset_atom_materials();
atomicRegulator_->reset_atom_materials(elementToMaterialMap_,
atomElement_);
}
- //--------------------------------------------------
- void ATC_CouplingMomentumEnergy::pre_init_integrate()
- {
- ATC_Coupling::pre_init_integrate();
- double dt = lammpsInterface_->dt();
-
- // Perform any initialization, no actual integration
- for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
- (_tiIt_->second)->pre_initial_integrate1(dt);
- }
-
- // Apply controllers to atom velocities, if needed
- atomicRegulator_->apply_pre_predictor(dt,lammpsInterface_->ntimestep());
-
- // Predict nodal temperatures and time derivatives based on FE data
- // predict nodal velocities
- for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
- (_tiIt_->second)->pre_initial_integrate2(dt);
- }
- extrinsicModelManager_.pre_init_integrate();
- }
-
+#ifdef OBSOLETE
//--------------------------------------------------------
// mid_init_integrate
// time integration between the velocity update and
// the position lammps update of Verlet step 1
//--------------------------------------------------------
void ATC_CouplingMomentumEnergy::mid_init_integrate()
{
// CONTINUOUS VELOCITY UPDATE
ATC_Coupling::mid_init_integrate();
double dt = lammpsInterface_->dt();
// Compute nodal velocity at n+1/2
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->mid_initial_integrate1(dt);
}
atomicRegulator_->apply_mid_predictor(dt,lammpsInterface_->ntimestep());
extrinsicModelManager_.mid_init_integrate();
}
//--------------------------------------------------------
// post_init_integrate
// time integration after the lammps atomic updates of
// Verlet step 1
//--------------------------------------------------------
void ATC_CouplingMomentumEnergy::post_init_integrate()
{
// CONTINUOUS DISPLACEMENT UPDATE
double dt = lammpsInterface_->dt();
// Compute nodal velocity at n+1
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_initial_integrate1(dt);
}
// Update kinetostat quantities if displacement is being regulated
atomicRegulator_->apply_post_predictor(dt,lammpsInterface_->ntimestep());
// Update extrisic model
extrinsicModelManager_.post_init_integrate();
// fixed values, non-group bcs handled through FE
set_fixed_nodes();
-
-
- // enforce atomic boundary conditions
- if (boundaryDynamics_==PRESCRIBED) set_ghost_atoms();
- else if (boundaryDynamics_==DAMPED_HARMONIC) initial_integrate_ghost();
- else if (boundaryDynamics_==COUPLED) initial_integrate_ghost();
// update time by a half dt
update_time(0.5);
ATC_Coupling::post_init_integrate();
}
-
+#endif
//--------------------------------------------------------
// pre_final_integrate
// integration before the second stage lammps atomic
// update of Verlet step 2
//--------------------------------------------------------
void ATC_CouplingMomentumEnergy::pre_final_integrate()
{
ATC_Coupling::pre_final_integrate();
-
- if (boundaryDynamics_==DAMPED_HARMONIC) {
- apply_ghost_forces();
- final_integrate_ghost();
- }
- else if (boundaryDynamics_==COUPLED) {
- add_ghost_forces();
- final_integrate_ghost();
- }
}
//--------------------------------------------------
void ATC_CouplingMomentumEnergy::post_final_integrate()
{
// CONTINUOUS VELOCITY RHS UPDATE
double dt = lammpsInterface_->dt();
// update of atomic contributions for fractional step methods
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->pre_final_integrate1(dt);
}
// Set sources
prescribedDataMgr_->set_sources(time()+0.5*dt,sources_);
extrinsicModelManager_.pre_final_integrate();
if (timeIntegrators_[TEMPERATURE]->has_final_predictor() || timeIntegrators_[MOMENTUM]->has_final_predictor()) {
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
atomicRegulator_->compute_boundary_flux(fields_);
compute_atomic_sources(velocityMask_,fields_,atomicSources_);
}
atomicRegulator_->apply_pre_corrector(dt,lammpsInterface_->ntimestep());
// Compute atom-integrated rhs
// parallel communication happens within FE_Engine
compute_rhs_vector(velocityMask_,fields_,rhs_,FE_DOMAIN);
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->add_to_rhs();
}
atomicRegulator_->add_to_rhs(rhs_);
// Compute and add atomic contributions to FE equations
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate1(dt);
}
// fix nodes, non-group bcs applied through FE
set_fixed_nodes();
// corrector step extrinsic model
extrinsicModelManager_.post_final_integrate();
if (timeIntegrators_[TEMPERATURE]->has_final_corrector() || timeIntegrators_[MOMENTUM]->has_final_corrector()) {
// set state-based sources
extrinsicModelManager_.set_sources(fields_,extrinsicSources_);
atomicRegulator_->compute_boundary_flux(fields_);
compute_atomic_sources(velocityMask_,fields_,atomicSources_);
}
// Finish update of FE velocity
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate2(dt);
}
// apply corrector phase of thermostat
atomicRegulator_->apply_post_corrector(dt,lammpsInterface_->ntimestep());
// final phase of time integration
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_final_integrate3(dt);
}
// Fix nodes, non-group bcs applied through FE
set_fixed_nodes();
update_time(0.5);
output();
ATC_Coupling::post_final_integrate(); // adds next step to computes
}
//--------------------------------------------------------------------
// compute_scalar : added energy
//--------------------------------------------------------------------
double ATC_CouplingMomentumEnergy::compute_scalar(void)
{
double energy = 0.0;
energy += extrinsicModelManager_.compute_scalar();
return energy;
}
//--------------------------------------------------------------------
// total kinetic energy
//--------------------------------------------------------------------
double ATC_CouplingMomentumEnergy::kinetic_energy(void)
{
const MATRIX & M = massMats_[VELOCITY].quantity();
const DENS_MAT & velocity(fields_[VELOCITY].quantity());
double mvv2e = lammpsInterface_->mvv2e();
double kineticEnergy = 0;
DENS_VEC velocitySquared(nNodes_);
for (int i = 0; i < nNodes_; i++)
for (int j = 0; j < nsd_; j++)
velocitySquared(i) += velocity(i,j)*velocity(i,j);
kineticEnergy = (M*velocitySquared).sum();
kineticEnergy *= mvv2e; // convert to LAMMPS units
return kineticEnergy;
}
//--------------------------------------------------------------------
// total potential energy
//--------------------------------------------------------------------
double ATC_CouplingMomentumEnergy::potential_energy(void)
{
Array<FieldName> mask(1);
mask(0) = VELOCITY;
FIELD_MATS energy;
feEngine_->compute_energy(mask,
fields_,
physicsModel_,
elementToMaterialMap_,
energy,
&(elementMask_->quantity()));
double potentialEnergy = energy[VELOCITY].col_sum();
double mvv2e = lammpsInterface_->mvv2e();
potentialEnergy *= mvv2e; // convert to LAMMPS units
return potentialEnergy-refPE_;
}
//--------------------------------------------------------------------
// compute_vector
//--------------------------------------------------------------------
// this is for direct output to lammps thermo
double ATC_CouplingMomentumEnergy::compute_vector(int n)
{
// output[1] = total coarse scale kinetic energy
// output[2] = total coarse scale potential energy
// output[3] = total coarse scale energy
// output[4] = total coarse scale thermal energy
// output[5] = average temperature
double mvv2e = lammpsInterface_->mvv2e(); // convert to lammps energy units
if (n == 0) {
return kinetic_energy();
}
else if (n == 1) {
return potential_energy();
}
else if (n == 2) {
return kinetic_energy()+potential_energy();
}
else if (n == 4) {
Array<FieldName> mask(1);
FIELD_MATS energy;
mask(0) = TEMPERATURE;
feEngine_->compute_energy(mask,
fields_,
physicsModel_,
elementToMaterialMap_,
energy,
&(elementMask_->quantity()));
double phononEnergy = mvv2e * energy[TEMPERATURE].col_sum();
return phononEnergy;
}
else if (n == 5) {
double aveT = (fields_[TEMPERATURE].quantity()).col_sum()/nNodes_;
return aveT;
}
else if (n > 5) {
double extrinsicValue = extrinsicModelManager_.compute_vector(n);
return extrinsicValue;
}
return 0.;
}
//--------------------------------------------------------------------
// output
//--------------------------------------------------------------------
void ATC_CouplingMomentumEnergy::output()
{
if (output_now()) {
feEngine_->departition_mesh();
// avoid possible mpi calls
if (nodalAtomicKineticTemperature_)
_keTemp_ = nodalAtomicKineticTemperature_->quantity();
if (nodalAtomicConfigurationalTemperature_)
_peTemp_ = nodalAtomicConfigurationalTemperature_->quantity();
OUTPUT_LIST outputData;
// base class output
ATC_Method::output();
// push atc fields time integrator modifies into output arrays
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->post_process();
}
// auxilliary data
for (_tiIt_ = timeIntegrators_.begin(); _tiIt_ != timeIntegrators_.end(); ++_tiIt_) {
(_tiIt_->second)->output(outputData);
}
atomicRegulator_->output(outputData);
extrinsicModelManager_.output(outputData);
DENS_MAT & velocity(nodalAtomicFields_[VELOCITY].set_quantity());
DENS_MAT & rhs(rhs_[VELOCITY].set_quantity());
DENS_MAT & temperature(nodalAtomicFields_[TEMPERATURE].set_quantity());
DENS_MAT & dotTemperature(dot_fields_[TEMPERATURE].set_quantity());
DENS_MAT & ddotTemperature(ddot_fields_[TEMPERATURE].set_quantity());
DENS_MAT & rocTemperature(nodalAtomicFieldsRoc_[TEMPERATURE].set_quantity());
DENS_MAT & fePower(rhs_[TEMPERATURE].set_quantity());
if (lammpsInterface_->rank_zero()) {
// global data
double T_mean = (fields_[TEMPERATURE].quantity()).col_sum(0)/nNodes_;
feEngine_->add_global("temperature_mean", T_mean);
double T_stddev = (fields_[TEMPERATURE].quantity()).col_stdev(0);
feEngine_->add_global("temperature_std_dev", T_stddev);
double Ta_mean = (nodalAtomicFields_[TEMPERATURE].quantity()).col_sum(0)/nNodes_;
feEngine_->add_global("atomic_temperature_mean", Ta_mean);
double Ta_stddev = (nodalAtomicFields_[TEMPERATURE].quantity()).col_stdev(0);
feEngine_->add_global("atomic_temperature_std_dev", Ta_stddev);
// different temperature measures, if appropriate
if (nodalAtomicKineticTemperature_)
outputData["kinetic_temperature"] = & _keTemp_;
if (nodalAtomicConfigurationalTemperature_) {
_peTemp_ *= 2; // account for full temperature
outputData["configurational_temperature"] = & _peTemp_;
}
// mesh data
outputData["NodalAtomicVelocity"] = &velocity;
outputData["FE_Force"] = &rhs;
if (trackDisplacement_)
outputData["NodalAtomicDisplacement"] = & nodalAtomicFields_[DISPLACEMENT].set_quantity();
outputData["NodalAtomicTemperature"] = &temperature;
outputData["dot_temperature"] = &dotTemperature;
outputData["ddot_temperature"] = &ddotTemperature;
outputData["NodalAtomicPower"] = &rocTemperature;
outputData["fePower"] = &fePower;
feEngine_->write_data(output_index(), fields_, & outputData);
}
// hence propagation is performed on proc 0 but not others.
// The real fix is to have const data in the output list
// force optional variables to reset to keep in sync
if (trackDisplacement_) {
nodalAtomicFields_[DISPLACEMENT].force_reset();
}
fields_[VELOCITY].propagate_reset();
feEngine_->partition_mesh();
}
}
- //--------------------------------------------------------
- // set_ghost_atoms
- // sets ghost atom positions to finite element
- // displacements based on shape functions
- //--------------------------------------------------------
- void ATC_CouplingMomentumEnergy::set_ghost_atoms()
- {
- // set atomic displacements based on FE displacements
- double ** x = lammpsInterface_->xatom();
- // prolong
- DenseMatrix<double> ghostAtomData(nLocalGhost_,nsd_);
- if (nLocalGhost_>0)
- ghostAtomData = (shpFcnGhost_->quantity())*(fields_[DISPLACEMENT].quantity());
-
- for (int i = 0; i < nLocalGhost_; ++i)
- for (int j = 0; j < nsd_; ++j)
- x[ghostToAtom_(i)][j] = ghostAtomData(i,j)+xref_[ghostToAtom_(i)][j];
-
-
- }
-
- //--------------------------------------------------------
- // add_ghost_forces
- // add forces to dynamic ghosts
- //--------------------------------------------------------
- void ATC_CouplingMomentumEnergy::add_ghost_forces()
- {
- double **x = lammpsInterface_->xatom();
- double **v = lammpsInterface_->vatom();
- double **f = lammpsInterface_->fatom();
-
- // add forces
- DENS_MAT coarseDisp(nLocalGhost_,nsd_);
- DENS_MAT coarseVel(nLocalGhost_,nsd_);
- if (nLocalGhost_>0) {
- coarseDisp = (shpFcnGhost_->quantity())*(fields_[DISPLACEMENT].quantity());
- coarseVel = (shpFcnGhost_->quantity())*(fields_[VELOCITY].quantity());
- }
- // dynamics one-way coupled to real atoms in a well tied to coarse scale
- for (int i = 0; i < nLocalGhost_; ++i) {
- for (int j = 0; j < nsd_; ++j) {
- double du = coarseDisp(i,j)+xref_[ghostToAtom_(i)][j]-x[ghostToAtom_(i)][j];
- double dv = coarseVel(i,j)-v[ghostToAtom_(i)][j];
- f[ghostToAtom_(i)][j] += mu_*du + gamma_*dv;
-
- }
- }
- }
-
- void ATC_CouplingMomentumEnergy::apply_ghost_forces()
- {
- double **x = lammpsInterface_->xatom();
- double **v = lammpsInterface_->vatom();
- double **f = lammpsInterface_->fatom();
-
- // add forces
- DENS_MAT coarseDisp(nLocalGhost_,nsd_);
- DENS_MAT coarseVel(nLocalGhost_,nsd_);
- if (nLocalGhost_>0) {
- coarseDisp = (shpFcnGhost_->quantity())*(fields_[DISPLACEMENT].quantity());
- coarseVel = (shpFcnGhost_->quantity())*(fields_[VELOCITY].quantity());
- }
- // dynamics one-way coupled to real atoms in a well tied to coarse scale
- for (int i = 0; i < nLocalGhost_; ++i) {
- for (int j = 0; j < nsd_; ++j) {
- double du = coarseDisp(i,j)+xref_[ghostToAtom_(i)][j]-x[ghostToAtom_(i)][j];
- double dv = coarseVel(i,j)-v[ghostToAtom_(i)][j];
- f[ghostToAtom_(i)][j] = mu_*du + gamma_*dv;
-
- }
- }
- }
-
- //--------------------------------------------------------
- // initial_integrate_ghost
- // does the first step of the Verlet integration for
- // ghost atoms, to be used with non-reflecting BCs
- //--------------------------------------------------------
- void ATC_CouplingMomentumEnergy::initial_integrate_ghost()
- {
- double dtfm;
-
- double **x = lammpsInterface_->xatom();
- double **v = lammpsInterface_->vatom();
- double **f = lammpsInterface_->fatom();
- int *type = lammpsInterface_->atom_type();
- const int *mask = lammpsInterface_->atom_mask();
- int nlocal = lammpsInterface_->nlocal();
- double dtv = lammpsInterface_->dt();
- double dtf = 0.5 * lammpsInterface_->dt() * lammpsInterface_->ftm2v();
- double *mass = lammpsInterface_->atom_mass();
-
- if (mass) {
- for (int i = 0; i < nlocal; i++) {
- if (mask[i] & groupbitGhost_) {
- dtfm = dtf / mass[type[i]];
- v[i][0] += dtfm * f[i][0];
- v[i][1] += dtfm * f[i][1];
- v[i][2] += dtfm * f[i][2];
- x[i][0] += dtv * v[i][0];
- x[i][1] += dtv * v[i][1];
- x[i][2] += dtv * v[i][2];
- }
- }
-
- } else {
- double *rmass = lammpsInterface_->atom_rmass();
- for (int i = 0; i < nlocal; i++) {
- if (mask[i] & groupbitGhost_) {
- dtfm = dtf / rmass[i];
- v[i][0] += dtfm * f[i][0];
- v[i][1] += dtfm * f[i][1];
- v[i][2] += dtfm * f[i][2];
- x[i][0] += dtv * v[i][0];
- x[i][1] += dtv * v[i][1];
- x[i][2] += dtv * v[i][2];
- }
- }
- }
-
- }
-
- //--------------------------------------------------------
- // final_integrate_ghost
- // does the second step of the Verlet integration for
- // ghost atoms, to be used with non-reflecting BCs
- //--------------------------------------------------------
- void ATC_CouplingMomentumEnergy::final_integrate_ghost()
- {
- double dtfm;
-
- double **v = lammpsInterface_->vatom();
- double **f = lammpsInterface_->fatom();
- int *type = lammpsInterface_->atom_type();
- const int *mask = lammpsInterface_->atom_mask();
- int nlocal = lammpsInterface_->nlocal();
- double dtf = 0.5 * lammpsInterface_->dt() * lammpsInterface_->ftm2v();
-
- double *mass = lammpsInterface_->atom_mass();
- if (mass) {
- for (int i = 0; i < nlocal; i++) {
- if (mask[i] & groupbitGhost_) {
- dtfm = dtf / mass[type[i]];
- v[i][0] += dtfm * f[i][0];
- v[i][1] += dtfm * f[i][1];
- v[i][2] += dtfm * f[i][2];
- }
- }
-
- } else {
- double *rmass = lammpsInterface_->atom_rmass();
- for (int i = 0; i < nlocal; i++) {
- if (mask[i] & groupbitGhost_) {
- dtfm = dtf / rmass[i];
- v[i][0] += dtfm * f[i][0];
- v[i][1] += dtfm * f[i][1];
- v[i][2] += dtfm * f[i][2];
- }
- }
- }
-
- }
};
diff --git a/lib/atc/ATC_CouplingMomentumEnergy.h b/lib/atc/ATC_CouplingMomentumEnergy.h
index dd107295d..60410e75d 100644
--- a/lib/atc/ATC_CouplingMomentumEnergy.h
+++ b/lib/atc/ATC_CouplingMomentumEnergy.h
@@ -1,156 +1,142 @@
#ifndef ATC_COUPLING_MOMENTUM_ENERGY_H
#define ATC_COUPLING_MOMENTUM_ENERGY_H
// ATC headers
#include "ATC_Coupling.h"
#include "Kinetostat.h"
#include "Thermostat.h"
#include "ElasticTimeIntegrator.h"
#include "ThermalTimeIntegrator.h"
// Other headers
-#include <map>
+#include <string>
namespace ATC {
class AtfShapeFunctionRestriction;
class AtfShapeFunctionMdProjection;
/**
* @class ATC_CouplingMomentumEnergy
* @brief A class for atom-continuum transfers & control involving momentum and heat transport
* (owned field/s: DISPLACEMENT, VELOCITY, TEMPERATURE)
*/
class ATC_CouplingMomentumEnergy : public ATC_Coupling {
public:
// constructor
ATC_CouplingMomentumEnergy(std::string groupName,
double ** & perAtomArray,
LAMMPS_NS::Fix * thisFix,
std::string matParamFile,
ExtrinsicModelType extrinsic = NO_MODEL);
// destructor
virtual ~ATC_CouplingMomentumEnergy();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** pre time integration */
virtual void initialize();
/** flags whether a methods reset is required */
virtual bool reset_methods() const {
bool resetMethods = ATC_Method::reset_methods() || atomicRegulator_->need_reset();
for (_ctiIt_ = timeIntegrators_.begin(); _ctiIt_ != timeIntegrators_.end(); ++_ctiIt_) {
resetMethods |= (_ctiIt_->second)->need_reset();
}
return resetMethods;
};
/** post time integration */
virtual void finish();
+#ifdef OBSOLETE
+
- /** first time, before atomic integration */
- virtual void pre_init_integrate();
/** first time, after atomic velocity but before position integration */
virtual void mid_init_integrate();
/** first time, after atomic integration */
virtual void post_init_integrate();
-
+#endif
/** second time, before atomic integration */
virtual void pre_final_integrate();
/** second time, after atomic integration */
virtual void post_final_integrate();
/** compute scalar for output - added energy */
virtual double compute_scalar(void);
/** compute vector for output */
virtual double compute_vector(int n);
double kinetic_energy();
double potential_energy();
/** output */
virtual void output();
/** set up atom to material identification */
virtual void reset_atom_materials();
protected:
//---------------------------------------------------------------
/** initialization routines */
//---------------------------------------------------------------
/** constructs all data which is updated with time integration, i.e. fields */
//virtual void construct_time_integration_data();
/** create methods, e.g. time integrators, filters */
virtual void construct_methods();
/** set up data which is dependency managed */
virtual void construct_transfers();
- /** sets the position/velocity of the ghost atoms */
- virtual void set_ghost_atoms();
- /** analagous to FixATC initial_integrate applied to ghosts */
- void initial_integrate_ghost();
- /** analagous to FixATC final_integrate applied to ghosts */
- void final_integrate_ghost();
- /** forces on dynamic ghosts */
- void add_ghost_forces();
- void apply_ghost_forces();
-
/** adds resetting of any kinetostat/thermostat arrays associated with local atom count */
virtual void reset_nlocal();
/** compute the mass matrix components coming from MD integration */
virtual void compute_md_mass_matrix(FieldName thisField,
DIAG_MAT & massMats);
/** operator to compute the mass matrix for the momentum equation from MD integration */
AtfShapeFunctionRestriction * nodalAtomicMass_;
/** operator to compute the dimensionless mass matrix from MD integration */
AtfShapeFunctionRestriction * nodalAtomicCount_;
/** operator to compute mass matrix from MD */
AtfShapeFunctionRestriction * nodalAtomicHeatCapacity_;
/** physics specific filter initialization */
void init_filter();
/** field mask for velocity integration */
Array2D<bool> velocityMask_;
/** field mask for temperature integration */
Array2D<bool> temperatureMask_;
/** kinetic temperature for post-processing */
AtfShapeFunctionMdProjection * nodalAtomicKineticTemperature_;
/** configurational temperature for post-processing */
AtfShapeFunctionMdProjection * nodalAtomicConfigurationalTemperature_;
/** workspace matrices for output */
DENS_MAT _keTemp_, _peTemp_;
// Add in fields for restarting
- virtual void read_restart_data(string fileName_, RESTART_LIST & data);
- virtual void write_restart_data(string fileName_, RESTART_LIST & data);
+ virtual void read_restart_data(std::string fileName_, RESTART_LIST & data);
+ virtual void write_restart_data(std::string fileName_, RESTART_LIST & data);
void pack_quantity_fields(RESTART_LIST & data);
- // boundary dynamics
- BoundaryDynamicsType boundaryDynamics_;
- double gamma_, mu_, kappa_;
-
// data
double refPE_;
};
};
#endif
diff --git a/lib/atc/ATC_Error.h b/lib/atc/ATC_Error.h
index 08a9bf0ec..fc356dbec 100644
--- a/lib/atc/ATC_Error.h
+++ b/lib/atc/ATC_Error.h
@@ -1,56 +1,52 @@
// ATC_Error : a base class for atom-continuum errors
#ifndef ATC_ERROR
#define ATC_ERROR
#include <string>
// the following two convert __LINE__ to a string
#define STRING2(x) #x
#define STRING(x) STRING2(x)
// prints file and line number for error messages
#define ERROR(x) __FILE__":"STRING(__LINE__)" "x
//#define FILELINE __FILE__+to_string(__LINE__)
#define FILELINE __FILE__
#define ERROR_FOR_BACKTRACE
#define HACK(l,m)
-
-
-
-
namespace ATC {
/**
* @class ATC_Error
* @brief Base class for throwing run-time errors with descriptions
*/
class ATC_Error {
public:
// constructor
ATC_Error(std::string errorDescription)
{
errorDescription_ = "ERROR: " + errorDescription;
ERROR_FOR_BACKTRACE
};
ATC_Error(std::string location, std::string errorDescription)
{
errorDescription_ = "ERROR: " + location + ": "+ errorDescription;
ERROR_FOR_BACKTRACE
};
std::string error_description() {
return errorDescription_;
};
private:
// string describing the type of error
std::string errorDescription_;
};
}
#endif
diff --git a/lib/atc/ATC_Method.cpp b/lib/atc/ATC_Method.cpp
index 7adc2ec7c..90d29f853 100644
--- a/lib/atc/ATC_Method.cpp
+++ b/lib/atc/ATC_Method.cpp
@@ -1,2194 +1,2306 @@
// ATC headers
#include "ATC_Method.h"
#include "LammpsInterface.h"
#include "FE_Engine.h"
#include "Array.h"
#include "Array2D.h"
#include "ATC_Error.h"
#include "Function.h"
#include "PrescribedDataManager.h"
#include "TimeIntegrator.h"
#include "PhysicsModel.h"
#include "PerAtomQuantityLibrary.h"
#include "TransferLibrary.h"
#include "KernelFunction.h"
#include "Utility.h"
+#include "FieldManager.h"
#include <fstream>
#include <sstream>
+#include <iostream>
using ATC_Utility::sgn;
+using ATC_Utility::to_string;
+using ATC_Utility::is_dbl;
+
+using std::stringstream;
+using std::ifstream;
+using std::ofstream;
+using std::string;
+using std::map;
+using std::set;
+using std::vector;
+using std::pair;
namespace ATC {
ATC_Method::ATC_Method(string groupName, double ** & perAtomArray, LAMMPS_NS::Fix * thisFix) :
nodalAtomicVolume_(NULL),
needReset_(true),
lammpsInterface_(LammpsInterface::instance()),
interscaleManager_(this),
timeFilterManager_(this),
+ integrateInternalAtoms_(false),
+ atomTimeIntegrator_(NULL),
+ ghostManager_(this),
feEngine_(NULL),
initialized_(false),
meshDataInitialized_(false),
localStep_(0),
sizeComm_(8), // 3 positions + 1 material id * 2 for output
atomCoarseGrainingPositions_(NULL),
atomGhostCoarseGrainingPositions_(NULL),
atomProcGhostCoarseGrainingPositions_(NULL),
atomReferencePositions_(NULL),
nsd_(lammpsInterface_->dimension()),
-#ifdef EXTENDED_ERROR_CHECKING
- atomSwitch_(false),
-#endif
xref_(NULL),
readXref_(false),
needXrefProcessorGhosts_(false),
trackDisplacement_(false),
needsAtomToElementMap_(true),
atomElement_(NULL),
atomGhostElement_(NULL),
+ internalElementSet_(""),
atomMasses_(NULL),
atomPositions_(NULL),
atomVelocities_(NULL),
atomForces_(NULL),
parallelConsistency_(true),
outputNow_(false),
outputTime_(true),
outputFrequency_(0),
sampleFrequency_(0),
sampleCounter_(0),
peScale_(1./(lammpsInterface_->mvv2e())),
keScale_(1.),
scalarFlag_(0),
vectorFlag_(0),
sizeVector_(0),
scalarVectorFreq_(0),
sizePerAtomCols_(4),
perAtomOutput_(NULL),
perAtomArray_(perAtomArray),
extScalar_(0),
extVector_(0),
extList_(NULL),
thermoEnergyFlag_(0),
atomVolume_(NULL),
atomicWeightsWriteFlag_(false),
atomicWeightsWriteFrequency_(0),
atomWeightType_(LATTICE),
domainDecomposition_(REPLICATED_MEMORY),
groupbit_(0),
groupbitGhost_(0),
needProcGhost_(false),
groupTag_(groupName),
nLocal_(0),
nLocalTotal_(0),
nLocalGhost_(0),
- nInternal_(0),
- nGhost_(0),
atomToElementMapType_(LAGRANGIAN),
atomToElementMapFrequency_(0),
regionID_(-1),
mdMassNormalization_(false),
kernelBased_(false),
kernelOnTheFly_(false),
kernelFunction_(NULL),
bondOnTheFly_(false),
accumulant_(NULL),
accumulantMol_(NULL),
accumulantMolGrad_(NULL),
accumulantWeights_(NULL),
accumulantInverseVolumes_(&invNodeVolumes_),
+ accumulantBandwidth_(0),
useRestart_(false),
hasRefPE_(false),
setRefPE_(false),
setRefPEvalue_(false),
refPEvalue_(0.),
readRefPE_(false),
+ nodalRefPotentialEnergy_(NULL),
simTime_(0.0),
stepCounter_(0)
{
+ lammpsInterface_->print_msg_once("version "+version());
lammpsInterface_->set_fix_pointer(thisFix);
interscaleManager_.set_lammps_data_prefix();
grow_arrays(lammpsInterface_->nmax());
feEngine_ = new FE_Engine(lammpsInterface_->world());
lammpsInterface_->create_compute_pe_peratom();
}
ATC_Method::~ATC_Method()
{
lammpsInterface_->destroy_2d_double_array(xref_);
lammpsInterface_->destroy_2d_double_array(perAtomOutput_);
+ if (atomTimeIntegrator_) delete atomTimeIntegrator_;
if (feEngine_) delete feEngine_;
}
//--------------------------------------------------
// pack_fields
// bundle all allocated field matrices into a list
// for output needs
//--------------------------------------------------
void ATC_Method::pack_fields(RESTART_LIST & data)
{
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
string fieldName = field_to_string(thisField);
string matrixName;
// copy all fields from ATC_Method.h
matrixName = "fields_" + fieldName;
data[matrixName] = & fields_[thisField].set_quantity();
matrixName = "dot_fields_" + fieldName;
data[matrixName] = & dot_fields_[thisField].set_quantity();
matrixName = "ddot_fields_" + fieldName;
data[matrixName] = & ddot_fields_[thisField].set_quantity();
matrixName = "dddot_fields_" + fieldName;
data[matrixName] = & dddot_fields_[thisField].set_quantity();
matrixName = "NodalAtomicFieldsRoc_" + fieldName;
data[matrixName] = & nodalAtomicFieldsRoc_[thisField].set_quantity();
}
}
//--------------------------------------------------
// write_restart_file
// bundle matrices that need to be saved and call
// fe_engine to write the file
//--------------------------------------------------
void ATC_Method::write_restart_data(string fileName, RESTART_LIST & data)
{
pack_fields(data);
feEngine_->write_restart_file(fileName,&data);
}
//--------------------------------------------------
// read_restart_file
// bundle matrices that need to be saved and call
// fe_engine to write the file
//--------------------------------------------------
void ATC_Method::read_restart_data(string fileName, RESTART_LIST & data)
{
pack_fields(data);
feEngine_->read_restart_file(fileName,&data);
}
//--------------------------------------------------
// Interactions with LAMMPS fix commands
// parse input command and pass on to finite element engine
// or physics specific transfers if necessary
// revert to physics-specific transfer if no command matches input
// first keyword is unique to particular class
// base class keyword matching must apply to ALL physics
// order: derived, base, owned objects
//--------------------------------------------------
bool ATC_Method::modify(int narg, char **arg)
{
int argIdx=0;
bool match = false;
// gateways to other modules e.g. extrinsic, control, mesh
// pass off to fe engine
if (strcmp(arg[argIdx],"mesh")==0) {
match = feEngine_->modify(narg, arg);
if (feEngine_->has_mesh() && !meshDataInitialized_)
this->initialize_mesh_data();
}
// pass off to time filter
else if (strcmp(arg[argIdx],"filter")==0) {
argIdx++;
match = timeFilterManager_.modify(narg-argIdx,&arg[argIdx]);
// consistentInitialization_ = false;
}
// pass off to kernel function manager
else if (strcmp(arg[argIdx],"kernel")==0) {
argIdx++;
if (kernelFunction_) {
//delete kernelFunction_;
//resetKernelFunction_ = true;
}
kernelFunction_ = KernelFunctionMgr::instance()->function(&arg[argIdx],narg-argIdx);
if (kernelFunction_) match = true;
else ATC_Error("no matching kernel found");
feEngine_->set_kernel(kernelFunction_);
accumulantMol_=&kernelAccumulantMol_; // KKM add
accumulantMolGrad_=&kernelAccumulantMolGrad_; // KKM add
}
+ // pass off to ghost manager
+ else if (strcmp(arg[argIdx],"boundary_dynamics")==0) {
+ argIdx++;
+ match = ghostManager_.modify(narg-argIdx,&arg[argIdx]);
+ }
// parsing handled here
else {
if (strcmp(arg[argIdx],"parallel_consistency")==0) {
argIdx++;
//if (!kernelFunction_) { throw ATC_Error("on_the_fly requires a kernel function"); }
if (strcmp(arg[argIdx],"off")==0) parallelConsistency_ = false;
else parallelConsistency_ = true;
match = true;
}
/*! \page man_hardy_on_the_fly fix_modify AtC on_the_fly
\section syntax
fix_modify AtC on_the_fly <bond | kernel> <optional on | off> \n - bond | kernel (keyword) = specifies on-the-fly calculation of bond or
kernel matrix elements \n
- on | off (keyword) = activate or discontinue on-the-fly mode \n
\section examples
<TT> fix_modify AtC on_the_fly bond on </TT> \n <TT> fix_modify AtC on_the_fly kernel </TT> \n
<TT> fix_modify AtC on_the_fly kernel off </TT> \n
\section description
Overrides normal mode of pre-calculating and storing bond pair-to-node a
nd
kernel atom-to-node matrices. If activated, will calculate elements of t
hese
matrices during repeated calls of field computations (i.e. "on-the-fly") and not store them for
future use. \n on flag is optional - if omitted, on_the_fly will be activated for the s
pecified
matrix. Can be deactivated using off flag. \n
\section restrictions
Must be used with the hardy/field type of AtC fix
( see \ref man_fix_atc )
\section related
\section default
- By default, on-the-fly calculation is not active (i.e. off). However, co
-de does a memory allocation
- check to determine if it can store all needed bond and kernel matrix ele
-ments. If this allocation fails, on-the-fly is activated. \n
+ By default, on-the-fly calculation is not active (i.e. off). However, code does a memory allocation check to determine if it can store all needed bond and kernel matrix ele ments. If this allocation fails, on-the-fly is activated. \n
*/
else if (strcmp(arg[argIdx],"on_the_fly")==0) {
argIdx++;
//if (!kernelFunction_) { throw ATC_Error("on_the_fly requires a kernel function"); }
if (strcmp(arg[argIdx],"bond")==0) {
argIdx++;
bondOnTheFly_ = true;
if (narg > argIdx && strcmp(arg[argIdx],"off")==0) bondOnTheFly_ = false;
}
else if (strcmp(arg[argIdx],"kernel")==0) {
argIdx++;
kernelOnTheFly_ = true;
if (narg > argIdx && strcmp(arg[argIdx],"off")==0) kernelOnTheFly_ = false;
}
else { throw ATC_Error("unsupported on_the_fly type"); }
match = true;
}
/*! \page man_output fix_modify AtC output
\section syntax
fix_modify AtC output <filename_prefix> <frequency>
[text | full_text | binary | vector_components | tensor_components ]
fix_modify AtC output index [step | time ]
- filename_prefix (string) = prefix for data files
- frequency (integer) = frequency of output in time-steps
- options (keyword/s): \n
text = creates text output of index, step and nodal variable values for unique nodes \n
full_text = creates text output index, nodal id, step, nodal coordinates and nodal variable values for unique and image nodes \n
binary = creates binary Ensight output \n
vector_components = outputs vectors as scalar components \n
tensor_components = outputs tensor as scalar components
(use this for Paraview)\n
\section examples
<TT> fix_modify AtC output heatFE 100 </TT> \n
<TT> fix_modify AtC output hardyFE 1 text tensor_components </TT> \n
<TT> fix_modify AtC output hardyFE 10 text binary tensor_components </TT> \n
<TT> fix_modify AtC output index step </TT> \n
\section description
Creates text and/or binary (Ensight, "gold" format) output of nodal/mesh data
which is transfer/physics specific. Output indexed by step or time is possible.
\section restrictions
\section related
see \ref man_fix_atc
\section default
+ no default format
output indexed by time
*/
else if (strcmp(arg[argIdx],"output")==0) {
argIdx++;
- /*! \page man_output_nodeset fix_modify AtC output
+ /*! \page man_output_nodeset fix_modify AtC output nodeset
\section syntax
fix_modify AtC output nodeset <nodeset_name> <operation>
- nodeset_name (string) = name of nodeset to be operated on
- operation (keyword/s): \n
sum = creates nodal sum over nodes in specified nodeset \n
\section examples
<TT> fix_modify AtC output nodeset nset1 sum </TT> \n
\section description
Performs operation over the nodes belonging to specified nodeset
and outputs resulting variable values to GLOBALS file.
\section restrictions
\section related
see \ref man_fix_atc
\section default
none
*/
if (strcmp(arg[argIdx],"nodeset")==0) {
argIdx++;
string nset = arg[argIdx++];
if (strcmp(arg[argIdx],"sum")==0) {
argIdx++;
string field = arg[argIdx];
pair < string, FieldName > id(nset,string_to_field(field));
nsetData_[id] = NODESET_SUM;
match = true;
}
else if (strcmp(arg[argIdx],"average")==0) {
argIdx++;
string field = arg[argIdx];
pair < string, FieldName > id(nset,string_to_field(field));
nsetData_[id] = NODESET_AVERAGE;
match = true;
}
}
- /*! \page man_boundary_integral fix_modify AtC boundary_integral
+ /*! \page man_boundary_integral fix_modify AtC output boundary_integral
\section syntax
- fix_modify AtC boundary_integral [field] faceset [name]
+ fix_modify AtC output boundary_integral [field] faceset [name]
- field (string) : name of hardy field
- name (string) : name of faceset
\section examples
- <TT> fix_modify AtC boundary_integral stress faceset loop1 </TT> \n
+ <TT> fix_modify AtC output boundary_integral stress faceset loop1 </TT> \n
\section description
Calculates a surface integral of the given field dotted with the
outward normal of the faces and puts output in the "GLOBALS" file
\section restrictions
Must be used with the hardy/field type of AtC fix
( see \ref man_fix_atc )
\section related
\section default
none
*/
- /*! \page man_contour_integral fix_modify AtC contour_integral
+ /*! \page man_contour_integral fix_modify AtC output contour_integral
\section syntax
fix_modify AtC output contour_integral [field] faceset [name] <axis [x | y | z
]>
- field (string) : name of hardy field
- name (string) : name of faceset
- axis (string) : x or y or z
\section examples
- <TT> fix_modify AtC contour_integral stress faceset loop1 </TT> \n
+ <TT> fix_modify AtC output contour_integral stress faceset loop1 </TT> \n
\section description
Calculates a surface integral of the given field dotted with the
outward normal of the faces and puts output in the "GLOBALS" file
\section restrictions
Must be used with the hardy/field type of AtC fix
( see \ref man_fix_atc )
\section related
\section default
none
*/
else if ( (strcmp(arg[argIdx],"boundary_integral")==0)
|| (strcmp(arg[argIdx],"contour_integral")==0) ) {
FacesetIntegralType type = BOUNDARY_INTEGRAL;
if (strcmp(arg[argIdx],"contour_integral")==0)
type = CONTOUR_INTEGRAL;
argIdx++;
string field(arg[argIdx++]);
if(strcmp(arg[argIdx],"faceset")==0) {
argIdx++;
string name(arg[argIdx++]);
pair <string,string> pair_name(name,field);
fsetData_[pair_name] = type;
match = true;
}
} // end "boundary_integral" || "contour_integral"
- /*! \page man_output_elementset fix_modify AtC output
+ /*! \page man_output_elementset fix_modify AtC output elementset
\section syntax
fix_modify AtC output volume_integral <eset_name> <field> {`
- set_name (string) = name of elementset to be integrated over
- fieldname (string) = name of field to integrate
csum = creates nodal sum over nodes in specified nodeset \n
\section examples
<TT> fix_modify AtC output eset1 mass_density </TT> \n
\section description
Performs volume integration of specified field over elementset
and outputs resulting variable values to GLOBALS file.
\section restrictions
\section related
see \ref man_fix_atc
\section default
none
*/
else if ( (strcmp(arg[argIdx],"volume_integral")==0) ) {
argIdx++;
string name(arg[argIdx++]);
string field(arg[argIdx++]);
pair <string,FieldName> pair_name(name,string_to_field(field));
if (++argIdx < narg) { // keyword average
esetData_[pair_name] = ELEMENTSET_AVERAGE;
}
else {
esetData_[pair_name] = ELEMENTSET_TOTAL;
}
match = true;
}
else if (strcmp(arg[argIdx],"now")==0) {
argIdx++;
double dt = 1.0;
if (argIdx < narg) {
dt = atof(arg[argIdx++]);
}
update_time(dt);
update_step();
outputNow_ = true;
this->output();
outputNow_ = false;
match = true;
}
else
if (strcmp(arg[argIdx],"index")==0) {
argIdx++;
if (strcmp(arg[argIdx],"step")==0) { outputTime_ = false; }
else { outputTime_ = true; }
match = true;
}
else {
outputPrefix_ = arg[argIdx++];
outputFrequency_ = atoi(arg[argIdx++]);
bool ensight_output = false, full_text_output = false;
bool text_output = false, vect_comp = false, tensor_comp = false;
int rank = lammpsInterface_->comm_rank();
for (int i = argIdx; i<narg; ++i) {
if (strcmp(arg[i],"full_text")==0) full_text_output = true;
else if (strcmp(arg[i],"text")==0) text_output = true;
else if (strcmp(arg[i],"binary")==0) ensight_output = true;
else if (strcmp(arg[i],"vector_components")==0) vect_comp = true;
else if (strcmp(arg[i],"tensor_components")==0) tensor_comp = true;
else { throw ATC_Error(" output: unknown keyword "); }
}
if (outputFrequency_>0) {
set<int> otypes;
if (full_text_output || text_output) {
lammpsInterface_->print_msg_once("Warning : text output can create _LARGE_ files");
}
if (full_text_output) otypes.insert(FULL_GNUPLOT);
if (text_output) otypes.insert(GNUPLOT);
if (ensight_output) otypes.insert(ENSIGHT);
if (ntracked() > 0) {
string fstem = field_to_string(SPECIES_CONCENTRATION);
string istem = field_to_intrinsic_name(SPECIES_CONCENTRATION);
vector<string> tnames = tracked_names();
vector<string> fnames;
vector<string> inames;
for (unsigned int i = 0; i < tnames.size(); i++) {
fnames.push_back(fstem+tnames[i]);
inames.push_back(istem+tnames[i]);
}
feEngine_->add_field_names(fstem,fnames);
feEngine_->add_field_names(istem,inames);
}
feEngine_->initialize_output(rank,outputPrefix_,otypes);
if (vect_comp)
feEngine_->output_manager()
->set_option(OUTPUT_VECTOR_COMPONENTS,true);
if (tensor_comp)
feEngine_->output_manager()
->set_option(OUTPUT_TENSOR_COMPONENTS,true);
}
match = true;
}
}
// add a species for tracking
- /*! \page man_mass_control fix_modify AtC add_species <TAG> group|type <ID>
+ /*! \page man_add_species fix_modify AtC add_species
\section syntax
- fix_modify_AtC add_species <TAG> group|type <ID> \n
-
+ fix_modify_AtC add_species <TAG> <group|type> <ID> \n
- <TAG> = tag for tracking a species \n
- group|type = LAMMPS defined group or type of atoms \n
+ - <ID> = name of group or type number \n
\section examples
<TT> fix_modify AtC add_species gold type 1 </TT> \n
<TT> group GOLDGROUP type 1 </TT> \n
<TT> fix_modify AtC add_species gold group GOLDGROUP </TT>
\section description
Associates a tag with all atoms of a specified type or within a specified group. \n
\section restrictions
\section related
\section default
No defaults for this command.
*/
else if (strcmp(arg[argIdx],"add_species")==0) {
argIdx++;
string speciesTag = arg[argIdx];
string tag = arg[argIdx];
argIdx++;
- IdType idType;
if (strcmp(arg[argIdx],"group")==0) {
- idType = ATOM_GROUP;
if (narg-argIdx == 2) {
string name = arg[++argIdx];
int id = lammpsInterface_->group_bit(name);
groupList_.push_back(id);
groupNames_.push_back(tag);
-
- speciesIds_[speciesTag] = pair<IdType,int>(idType,id); // OBSOLETE
}
else {
while (++argIdx < narg) {
string name = arg[argIdx];
int id = lammpsInterface_->group_bit(name);
string tag = speciesTag+"-"+name;
groupList_.push_back(id);
groupNames_.push_back(tag);
- speciesIds_[speciesTag] = pair<IdType,int>(idType,id); // OBSOLETE
}
}
}
else if (strcmp(arg[argIdx],"type")==0) {
- idType = ATOM_TYPE;
if (narg-argIdx == 2) {
int id = atoi(arg[++argIdx]);
typeList_.push_back(id);
typeNames_.push_back(tag);
- speciesIds_[speciesTag] = pair<IdType,int>(idType,id); // OBSOLETE
}
else {
while (++argIdx < narg) {
int id = atoi(arg[argIdx]);
string tag = speciesTag+"_"+to_string(id);
typeList_.push_back(id);
typeNames_.push_back(tag);
- speciesIds_[speciesTag] = pair<IdType,int>(idType,id); // OBSOLETE
}
}
}
else {
- throw ATC_Error("ATC_Method: only groups or types for add_species"); }
+ throw ATC_Error("ATC_Method: add_species only handles groups or types"); }
match = true;
}
// remove species from tracking
- /*! \page man_disp_control fix_modify AtC remove_species <TAG>
+ /*! \page man_remove_species fix_modify AtC remove_species
\section syntax
- fix_modify_AtC remove_species <TAG> \n
+ fix_modify_AtC delete_species <TAG> \n
- <TAG> = tag for tracking a species \n
\section examples
<TT> fix_modify AtC remove_species gold </TT> \n
\section description
Removes tag designated for tracking a specified species. \n
\section restrictions
\section related
\section default
No defaults for this command.
*/
- else if (strcmp(arg[argIdx],"remove_species")==0) {
+ else if (strcmp(arg[argIdx],"delete_species")==0) {
argIdx++;
- string speciesTag = arg[argIdx];
- speciesIds_.erase(speciesTag);
- taggedDensMan_.erase(speciesTag);
-
+ string tag = arg[argIdx++];
+ if (strcmp(arg[argIdx],"group")==0) {
+ for (unsigned int j = 0; j < groupList_.size(); j++) {
+ if (tag == groupNames_[j]) {
+ groupList_.erase(groupList_.begin()+j);
+ groupNames_.erase(groupNames_.begin()+j);
+ break;
+ }
+ }
+ }
+ else if (strcmp(arg[argIdx],"type")==0) {
+ for (unsigned int j = 0; j < typeList_.size(); j++) {
+ if (tag == typeNames_[j]) {
+ typeList_.erase(typeList_.begin()+j);
+ typeNames_.erase(typeNames_.begin()+j);
+ break;
+ }
+ }
+ }
+ else {
+ throw ATC_Error("ATC_Method: delete_species only handles groups or types"); }
+ match = true;
}
// add a molecule for tracking
- /*! \page man_mass_control fix_modify AtC add_molecule small|large <TAG> <GROUP_NAME>
+ /*! \page man_add_molecule fix_modify AtC add_molecule
\section syntax
- fix_modify_AtC add_molecule small|large <TAG> <GROUP_NAME> \n
+ fix_modify_AtC add_molecule <small|large> <TAG> <GROUP_NAME> \n
- - <TAG> = tag for tracking a species \n
- small|large = can be small if molecule size < cutoff radius, must be large otherwise \n
+ - <TAG> = tag for tracking a species \n
+ - <GROUP_NAME> = name of group that tracking will be applied to \n
\section examples
<TT> group WATERGROUP type 1 2 </TT> \n
<TT> fix_modify AtC add_molecule small water WATERGROUP </TT> \n
\section description
Associates a tag with all molecules corresponding to a specified group. \n
\section restrictions
\section related
\section default
No defaults for this command.
*/
else if (strcmp(arg[argIdx],"add_molecule")==0) {
argIdx++;
MolSize size;
if (strcmp(arg[argIdx],"small")==0) {
size = MOL_SMALL;
//needXrefProcessorGhosts_ = true;
needProcGhost_ = true;
}
else
throw ATC_Error("ATC_CouplingMass: Bad molecule size in add_molecule");
argIdx++;
string moleculeTag = arg[argIdx];
argIdx++;
int groupBit = lammpsInterface_->group_bit(arg[argIdx]);
moleculeIds_[moleculeTag] = pair<MolSize,int>(size,groupBit);
match = true;
}
// remove molecule from tracking
- /*! \page man_disp_control fix_modify AtC remove_molecule <TAG>
+ /*! \page man_remove_molecule fix_modify AtC remove_molecule
\section syntax
fix_modify_AtC remove_molecule <TAG> \n
- <TAG> = tag for tracking a molecule type \n
\section examples
<TT> fix_modify AtC remove_molecule water </TT> \n
\section description
Removes tag designated for tracking a specified set of molecules. \n
\section restrictions
\section related
\section default
No defaults for this command.
*/
else if (strcmp(arg[argIdx],"remove_molecule")==0) {
argIdx++;
string moleculeTag = arg[argIdx];
moleculeIds_.erase(moleculeTag);
taggedDensMan_.erase(moleculeTag);
}
/*! \page man_boundary fix_modify AtC boundary
\section syntax
fix_modify AtC boundary type <atom-type-id>
- <atom-type-id> = type id for atoms that represent a ficticious
boundary internal to the FE mesh
\section examples
<TT> fix_modify AtC boundary type ghost_atoms </TT>
\section description
Command to define the atoms that represent the ficticious
boundary internal to the FE mesh. For fully overlapped MD/FE
domains with periodic boundary conditions no boundary atoms should
be defined.
\section restrictions
- \section related
- see \ref man_internal
\section default
none
*/
else if (strcmp(arg[argIdx],"boundary")==0) {
argIdx++;
groupTagGhost_ = arg[argIdx++];
match = true;
}
+ /*! \page man_internal_atom_integrate fix_modify AtC internal_atom_integrate
+ \section syntax
+ fix_modify AtC internal_atom_integrate <on | off>
+ <TT> fix_modify AtC internal_atom_integrate on </TT>
+ \section description
+ Has AtC perform time integration for the atoms in the group on which it operates. This does not include boundary atoms.
+ \section default
+ on for coupling methods, off for post-processors
+ off
+ */
+ else if (strcmp(arg[argIdx],"internal_atom_integrate")==0) {
+ argIdx++;
+ if (strcmp(arg[argIdx],"off")==0) {
+ integrateInternalAtoms_ = false;
+ match = true;
+ }
+ else {
+ integrateInternalAtoms_ = true;
+ match = true;
+ }
+ }
+
+ /*! \page man_internal_element_set fix_modify AtC internal_element_set
+ \section syntax
+ fix_modify AtC internal_element_set <element-set-name>
+ - <element-set-name> = name of element set defining internal region, or off
+ \section examples
+ <TT> fix_modify AtC internal_element_set myElementSet </TT>
+ <TT> fix_modify AtC internal_element_set off </TT>
+ \section description
+ Enables AtC to base the region for internal atoms to be an element set.
+ If no ghost atoms are used, all the AtC atoms must be constrained to remain
+ in this element set by the user, e.g., with walls. If boundary atoms are
+ used in conjunction with Eulerian atom maps
+ AtC will partition all atoms of a boundary or internal type to be of type internal
+ if they are in the internal region or to be of type boundary otherwise.
+ \section restrictions
+ If boundary atoms are used in conjunction with Eulerian atom maps, the Eulerian
+ reset frequency must be an integer multiple of the Lammps reneighbor frequency
+ \section related
+ see \ref atom_element_map_type and \ref boundary
+ \section default
+ off
+ */
+ else if (strcmp(arg[argIdx],"internal_element_set")==0) {
+ argIdx++;
+ if (strcmp(arg[argIdx],"off")==0) {
+ internalElementSet_ = "";
+ match = true;
+ }
+ else {
+ internalElementSet_ = string(arg[argIdx]);
+ const set<int> & elementSet((feEngine_->fe_mesh())->elementset(internalElementSet_)); // check it exists and is not trivial
+ if (elementSet.size()==0) throw ATC_Error("internal_element_set - element set " + internalElementSet_ + " has no elements");
+ match = true;
+ }
+ }
+
/*! \page man_atom_weight fix_modify AtC atom_weight
\section syntax
fix_modify AtC atom_weight <method> <arguments>
- <method> = \n
value: atoms in specified group assigned constant value given \n
lattice: volume per atom for specified lattice type (e.g. fcc) and parameter \n
element: element volume divided among atoms within element \n
- region: \n
- group: \n
+ region: volume per atom determined based on the atom count in the MD regions and their volumes. Note: meaningful only if atoms completely fill all the regions. \n
+ group: volume per atom determined based on the atom count in a group and its volume\n
read_in: list of values for atoms are read-in from specified file \n
\section examples
<TT> fix_modify atc atom_weight constant myatoms 11.8 </TT> \n
<TT> fix_modify atc atom_weight lattice </TT> \n
<TT> fix_modify atc atom_weight read-in atm_wt_file.txt </TT> \n
\section description
Command for assigning the value of atomic weights used for atomic integration in
atom-continuum coupled simulations.
\section restrictions
Use of lattice option requires a lattice type and parameter is already specified.
\section related
\section default
lattice
*/
else if (strcmp(arg[argIdx],"atom_weight")==0) {
argIdx++;
if (strcmp(arg[argIdx],"constant")==0) {
argIdx++;
atomWeightType_ = USER;
int groupbit = -1;
if (strcmp(arg[argIdx],"all")==0) {
}
else {
groupbit = lammpsInterface_->group_bit(arg[argIdx]);
}
argIdx++;
double value = atof(arg[argIdx]);
Valpha_[groupbit] = value;
match = true;
}
else if (strcmp(arg[argIdx],"lattice")==0) {
atomWeightType_ = LATTICE;
match = true;
}
else if (strcmp(arg[argIdx],"element")==0) {
atomWeightType_ = ELEMENT;
match = true;
}
else if (strcmp(arg[argIdx],"region")==0) {
atomWeightType_ = REGION;
match = true;
}
else if (strcmp(arg[argIdx],"group")==0) {
atomWeightType_ = GROUP;
match = true;
}
else if (strcmp(arg[argIdx],"multiscale")==0) {
atomWeightType_ = MULTISCALE;
match = true;
}
else if (strcmp(arg[argIdx],"node")==0) {
atomWeightType_ = NODE;
match = true;
}
else if (strcmp(arg[argIdx],"node_element")==0) {
atomWeightType_ = NODE_ELEMENT;
match = true;
}
else if (strcmp(arg[argIdx],"read_in")==0) {
atomWeightType_ = READ_IN;
argIdx++;
atomicWeightsFile_ = arg[argIdx];
match = true;
}
if (match) {
needReset_ = true;
}
}
/*! \page man_decomposition fix_modify AtC decomposition
\section syntax
fix_modify AtC decomposition <type>
- <type> = \n
replicated_memory: nodal information replicated on each processor \n
distributed_memory: only owned nodal information on processor \n
\section examples
<TT> fix_modify atc decomposition distributed_memory </TT> \n
\section description
Command for assigning the distribution of work and memory for parallel runs.
\section restrictions
replicated_memory is appropriate for simulations were the number of nodes << number of atoms
\section related
\section default
replicated_memory
*/
else if (strcmp(arg[argIdx],"decomposition")==0) {
argIdx++;
if (strcmp(arg[argIdx],"replicated_memory")==0) {
domainDecomposition_ = REPLICATED_MEMORY;
match = true;
}
else if (strcmp(arg[argIdx],"distributed_memory")==0) {
domainDecomposition_ = DISTRIBUTED_MEMORY;
match = true;
}
}
/*! \page man_write_atom_weights fix_modify AtC write_atom_weights
\section syntax
fix_modify AtC write_atom_weights <filename> <frequency>
- <filename> = name of file that atomic weights are written to \n
- <frequency> = how often writes will occur \n
\section examples
<TT> fix_modify atc write_atom_weights atm_wt_file.txt 10 </TT> \n
\section description
Command for writing the values of atomic weights to a specified file.
\section restrictions
\section related
\section default
*/
else if (strcmp(arg[argIdx],"write_atom_weights")==0) {
argIdx++;
atomicWeightsFile_ = arg[argIdx];
argIdx++;
atomicWeightsWriteFrequency_ = atoi(arg[argIdx]);
atomicWeightsWriteFlag_ = true;
match = true;
}
- /*! \page man_initial_atomic fix_modify AtC initial_atomic
- \section syntax
- \section examples
- \section description
- \section restrictions
- \section related
- \section default
- */
- // set initial atomic displacements/velocities
- /** Example commmand for initial atomic displacements/velocities
- fix_modify atc initial_atomic displacement x all function gaussian */
- else if (strcmp(arg[argIdx],"initial_atomic")==0) {
- XT_Function* function = NULL;
- argIdx = 3;
- if (strcmp(arg[argIdx],"all")==0) {
-
- if (strcmp(arg[argIdx+1],"function")==0) {
- string fName = arg[argIdx+2];
- int nargs = narg - 3 - argIdx;
- double argF[nargs];
- for (int i = 0; i < nargs; ++i) argF[i] = atof(arg[3+argIdx+i]);
- function = XT_Function_Mgr::instance()->function(fName,nargs,argF);
- }
- }
- if (function) {
- argIdx--;
- string sdim = arg[argIdx--];
- int idim = 0;
- double **x = lammpsInterface_->xatom();
- double **v = lammpsInterface_->vatom();
- if (string_to_index(sdim,idim)) {
- if (strcmp(arg[argIdx],"displacement")==0) {
- for (int i = 0; i < lammpsInterface_->nlocal(); ++i) {
- x[i][idim] += function->f(x[i],0);
- }
- }
- else if (strcmp(arg[argIdx],"velocity")==0) {
- for (int i = 0; i < lammpsInterface_->nlocal(); ++i) {
- v[i][idim] = function->f(x[i],0);
- }
- }
- }
- match = true;
- }
- }
-
/*! \page man_reset_time fix_modify AtC reset_time
\section syntax
fix_modify AtC reset_time <value>
\section examples
<TT> fix_modify atc reset_time 0.0 </TT> \n
\section description
Resets the simulation time counter.
\section restrictions
\section related
\section default
*/
else if (strcmp(arg[argIdx],"reset_time")==0) {
argIdx++;
set_time();
if (narg > argIdx) {
double time = atof(arg[argIdx]);
set_time(time);
}
match = true;
}
+ /*! \page man_reset_time fix_modify AtC kernel_bandwidth
+ \section syntax
+ fix_modify AtC kernel_bandwidth <value>
+ \section examples
+ <TT> fix_modify atc reset_time 8 </TT> \n
+ \section description
+ Sets a maximum parallel bandwidth for the kernel functions during parallel communication. If the command is not issued, the default will be to assume the bandwidth of the kernel matrix corresponds to the number of sampling locations.
+ \section restrictions
+ Only is used if kernel functions are being used.
+ \section related
+ \section default
+ Number of sample locations.
+ */
+ else if (strcmp(arg[argIdx],"kernel_bandwidth")==0) {
+ argIdx++;
+ accumulantBandwidth_ = atoi(arg[argIdx]);
+ match = true;
+ }
+
/*! \page man_reset_atomic_reference_positions fix_modify AtC reset_atomic_reference_positions
\section syntax
fix_modify AtC reset_atomic_reference_positions
\section examples
<TT> fix_modify atc reset_atomic_reference_positions
\section description
Resets the atomic positions ATC uses to perform point to field operations.
In can be used to use perfect lattice sites in ATC but a thermalized or
deformed lattice in LAMMPS.
\section restrictions
\section related
\section default
Default is off
*/
else if (strcmp(arg[argIdx],"reset_atomic_reference_positions")==0) {
argIdx++;
xRefFile_ = arg[argIdx];
readXref_ = true;
match = true;
}
/*! \page man_set fix_modify AtC set
\section syntax
- fix_modify AtC set reference_potential_energy <value>
- - value (double) : optional user specified zero point for PE in native LAMMPS energy units
+ fix_modify AtC set reference_potential_energy <value_or_filename(optional)>
+ - value (double) : optional user specified zero point for PE in native LAMMPS energy units \n
+ - filename (string) : optional user specified string for file of nodal PE values to be read-in
\section examples
<TT> fix_modify AtC set reference_potential_energy </TT> \n
<TT> fix_modify AtC set reference_potential_energy -0.05 </TT> \n
+ <TT> fix_modify AtC set reference_potential_energy myPEvalues </TT> \n
\section description
Used to set various quantities for the post-processing algorithms.
- Currently it only
- sets the zero point for the potential energy density using
+ It sets the zero point for the potential energy density using
the value provided for all nodes, or from the current
- configuration of the lattice if no value is provided
+ configuration of the lattice if no value is provided, or
+ values provided within the specified filename.
\section restrictions
Must be used with the hardy/field type of AtC fix
( see \ref man_fix_atc )
\section related
\section default
Defaults to lammps zero point i.e. isolated atoms
*/
else if (strcmp(arg[argIdx],"set")==0) {
argIdx++;
if (strcmp(arg[argIdx],"reference_potential_energy")==0) {
argIdx++;
setRefPE_ = true;
if (narg > argIdx) {
string a(arg[argIdx]);
if (is_dbl(a)) {
double value = atof(arg[argIdx]);
refPEvalue_ = value;
setRefPEvalue_ = true;
}
else {
nodalRefPEfile_ = arg[argIdx];
readRefPE_ = true;
}
}
match = true;
}
} // end "set"
/*! \page man_atom_element_map fix_modify AtC atom_element_map
\section syntax
fix_modify AtC atom_element_map <eulerian|lagrangian> <frequency> \n
- frequency (int) : frequency of updating atom-to-continuum maps based on the
current configuration - only for eulerian
\section examples
<TT> fix_modify atc atom_element_map eulerian 100 </TT>
\section description
Changes frame of reference from eulerian to lagrangian and sets the
frequency for which the map from atoms to elements is reformed and
all the attendant data is recalculated.
\section restrictions
Cannot change map type after initialization.
\section related
\section default
lagrangian
*/
else if (strcmp(arg[argIdx],"atom_element_map")==0) {
argIdx++;
if (strcmp(arg[argIdx],"eulerian")==0) {
atomToElementMapType_ = EULERIAN;
argIdx++;
atomToElementMapFrequency_ = atoi(arg[argIdx]);
}
else {
atomToElementMapType_ = LAGRANGIAN;
atomToElementMapFrequency_ = 0;
}
match = true;
needReset_ = true;
}
/*! \page man_read_restart fix_modify AtC read_restart
\section syntax
fix_modify AtC read_restart [file_name] \n
\section examples
<TT> fix_modify AtC read_restart ATC_state </TT> \n
\section description
Reads the current state of the fields from a named text-based restart
file.
\section restrictions
The restart file only contains fields and their time derivatives.
The reference positions of the atoms and the commands that initialize
the fix are not saved e.g. an identical mesh containing the same atoms
will have to be recreated.
\section related
see write_restart \ref man_write_restart
\section default
none
*/
else if (strcmp(arg[argIdx],"read_restart")==0) {
argIdx++;
restartFileName_ = arg[argIdx];
useRestart_ = true;
match = true;
}
/*! \page man_write_restart fix_modify AtC write_restart
\section syntax
fix_modify AtC write_restart [file_name] \n
\section examples
<TT> fix_modify AtC write_restart restart.mydata </TT> \n
\section description
Dumps the current state of the fields to a named text-based restart file.
This done when the command is invoked and not repeated, unlike the
similar lammps command.
\section restrictions
The restart file only contains fields and their time derivatives.
The reference positions of the atoms and the commands that initialize
the fix are not saved e.g. an identical mesh containing the same atoms
will have to be recreated.
\section related
see read_restart \ref man_read_restart
\section default
none
*/
else if (strcmp(arg[argIdx],"write_restart")==0) {
argIdx++;
string restartFileName(arg[argIdx]);
RESTART_LIST data;
write_restart_data(restartFileName,data);
match = true;
}
} // end else
return match; // return to FixATC
}
//--------------------------------------------------
// helper function for parser
// handles : "displacement x" and "temperature" by indexing argIdx
// for fluxes : only normal fluxes can be prescribed
//--------------------------------------------------
void ATC_Method::parse_field(/*const*/ char ** args, int & argIdx,
FieldName & thisField, int & thisIndex)
{
string thisName = args[argIdx++];
if (args[argIdx] == NULL) {
throw ATC_Error("Need to give field '"+thisName+"' more args");
}
thisField = string_to_field(thisName);
map<FieldName,int>::const_iterator iter = fieldSizes_.find(thisField);
if (iter == fieldSizes_.end()) {
throw ATC_Error("Bad field name: "+thisName);
}
string thisDim = args[argIdx];
thisIndex = 0;
if (string_to_index(thisDim,thisIndex)) {
if ( !( thisIndex < fieldSizes_[thisField]) ) {
throw ATC_Error("Bad field dimension "+thisDim);
}
argIdx++;
}
}
//-------------------------------------------------------------------
// this sets the peratom output
void ATC_Method::update_peratom_output()
{
perAtomArray_ = perAtomOutput_;
// copy values
for (int i = 0; i < lammpsInterface_->nlocal(); i++) {
for (int j = 0; j < nsd_; j++) {
perAtomOutput_[i][j] = xref_[i][j];
}
for (int j = nsd_; j < sizePerAtomCols_; j++) {
perAtomOutput_[i][j] = 0;
}
}
int indx = nsd_;
if (atomVolume_->nRows() > 0) { // kernel Hardy does not compute these
const DIAG_MAT & myAtomicWeights(atomVolume_->quantity());
for (int i = 0; i < nLocal_; i++) {
double wg = myAtomicWeights(i,i);
if (wg > 0) {
int ii = internalToAtom_(i);
perAtomOutput_[ii][indx] = 1./wg;
}
}
}
}
void ATC_Method::adjust_xref_pbc()
{
int nlocal = lammpsInterface_->nlocal();
int xperiodic = lammpsInterface_->xperiodic();
int yperiodic = lammpsInterface_->yperiodic();
int zperiodic = lammpsInterface_->zperiodic();
double **x = lammpsInterface_->xatom();
double boxxlo,boxxhi;
double boxylo,boxyhi;
double boxzlo,boxzhi;
lammpsInterface_->box_bounds(boxxlo,boxxhi,
boxylo,boxyhi,
boxzlo,boxzhi);
// bool changed = false;
for (int i = 0; i < nlocal; i++) {
if (xperiodic) {
if (x[i][0] < boxxlo) {
xref_[i][0] += Xprd_;
// changed = true;
}
if (x[i][0] >= boxxhi) {
xref_[i][0] -= Xprd_;
// changed = true;
}
}
if (yperiodic) {
if (x[i][1] < boxylo) {
xref_[i][1] += Yprd_;
// changed = true;
}
if (x[i][1] >= boxyhi) {
xref_[i][1] -= Yprd_;
// changed = true;
}
}
if (zperiodic) {
if (x[i][2] < boxzlo) {
xref_[i][2] += Zprd_;
// changed = true;
}
if (x[i][2] >= boxzhi) {
xref_[i][2] -= Zprd_;
// changed = true;
}
}
}
// propagate reset if needed
if (atomToElementMapType_ == LAGRANGIAN) {
if (atomCoarseGrainingPositions_) {
atomCoarseGrainingPositions_->force_reset();
}
}
else if (atomReferencePositions_) {
atomReferencePositions_->force_reset();
}
}
//-------------------------------------------------------------------
void ATC_Method::initialize()
{
feEngine_->partition_mesh();
// initialized_ is set to true by derived class initialize()
// localStep_ is a counter within a run or minimize
localStep_ = 0;
// STEP 1) get basic information data from Lammps/fix
// 1a) group ids for all internal atoms
groupbit_ = lammpsInterface_->group_bit(groupTag_);
// 1b) group ids for ghost atoms
groupbitGhost_ = 0;
if (!groupTagGhost_.empty()) {
groupbitGhost_ = lammpsInterface_->group_bit(groupTagGhost_);
}
// 1c) periodicity and box bounds/lengths
if (!initialized_) {
lammpsInterface_->box_periodicity(periodicity[0],
periodicity[1],
periodicity[2]);
lammpsInterface_->box_bounds(box_bounds[0][0],box_bounds[1][0],
box_bounds[0][1],box_bounds[1][1],
box_bounds[0][2],box_bounds[1][2]);
for (int k = 0; k < nsd_; k++) {
box_length[k] = box_bounds[1][k] - box_bounds[0][k];
}
lammpsInterface_->set_reference_box();
// get periodicity data from lammps for parallel exchange to adjust for periodicity
Xprd_ = lammpsInterface_->domain_xprd();
Yprd_ = lammpsInterface_->domain_yprd();
Zprd_ = lammpsInterface_->domain_zprd();
// box_length[0] = Xprd_;
// box_length[1] = Yprd_;
// box_length[2] = Zprd_;
XY_ = lammpsInterface_->domain_xy();
XZ_ = lammpsInterface_->domain_xz();
YZ_ = lammpsInterface_->domain_yz();
}
// STEP 2 computational geometry
// 2a) get basic information from continuum/FE
this->set_continuum_data();
// STEP 2b) set up data structures for computational geometry
if (this->reset_methods()) {
// clear memory manager
interscaleManager_.clear_temporary_data();
atomVolume_ = NULL;
// reference positions and energy
if (!initialized_) {
double **x = lammpsInterface_->xatom();
for (int i = 0; i < lammpsInterface_->nmax(); i++) {
for (int j = 0; j < nsd_; j++) {
xref_[i][j] = x[i][j];
}
}
// re-write non-ghosts' xref with values from a file
if (readXref_) {
bool success = read_atomic_ref_positions(xRefFile_.c_str());
if (!success)
throw ATC_Error("Error reading atomic reference positions");
readXref_ = false;
}
// set up maps from lammps to atc indexing
reset_nlocal();
}
this->set_computational_geometry();
}
// 2c) basic data regarding atomic system, e.g. atom coordinates
if (atomToElementMapType_ == EULERIAN) {
reset_coordinates();
}
// STEP 3) set up variables which will be integrated in time
this->construct_time_integration_data();
// STEP 4) instantiate all the various specific algorithms and methods
this->construct_methods();
// STEP 5) construct dependency-managed data
// 5b) all other transfer operators
// needs to be done before every run in case options have changed or the atoms have been changed by the user
if (this->reset_methods()) {
// construct all the needed data structures
this->construct_transfers();
// allocate all space needed for lammps arrays
interscaleManager_.grow_arrays(lammpsInterface_->nmax());
}
// reset all computes invoked flags and lammps data
interscaleManager_.lammps_force_reset();
// STEP 6) initialize data
// 6b) size quantities which use pack_comm
interscaleManager_.size_comm_quantities();
// 6c) set coarse-graining functions and atomic weights
if (!initialized_) {
// FE_Engine allocates all required memory
// assume initial atomic position is the reference position for now
// \int_\Omega N_I dV : static if the mesh is
NodeVolumes_.reset(nNodes_,nNodes_);
invNodeVolumes_.reset(nNodes_,nNodes_);
feEngine_->compute_lumped_mass_matrix(NodeVolumes_);
invNodeVolumes_.set_quantity() = NodeVolumes_.inv();
}
atomVolume_->set_reset();
- //
+ // 6d) reference values
this->set_reference_potential_energy();
- // 6d) atomic output for 0th step
+ // 6e) atomic output for 0th step
update_peratom_output();
// clear need for resets
needReset_ = false;
}
//-------------------------------------------------------------------
void ATC_Method::set_continuum_data()
{
// initialize finite element engine and get basic properties
if (!initialized_) {
feEngine_->initialize();
if (nsd_!=feEngine_->nsd()) {
throw ATC_Error("Spatial dimensions inconsistent between LAMMPS and ATC");
}
nNodes_ = feEngine_->num_nodes();
}
}
//-------------------------------------------------------------------
void ATC_Method::set_computational_geometry()
{
// set positions used for coarse-graining operators
if (!initialized_) {
if (atomToElementMapType_ == EULERIAN) {
FundamentalAtomQuantity * atomPositionsAll = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION,ALL);
ClonedAtomQuantity<double> * myAtomPositions =
new ClonedAtomQuantity<double>(this,atomPositionsAll,INTERNAL);
atomCoarseGrainingPositions_ = myAtomPositions;
interscaleManager_.add_per_atom_quantity(myAtomPositions,
"AtomicCoarseGrainingPositions");
if (trackDisplacement_) {
XrefWrapper * myAtomReferencePositions = new XrefWrapper(this);
atomReferencePositions_ = myAtomReferencePositions;
interscaleManager_.add_per_atom_quantity(myAtomReferencePositions,
"AtomicReferencePositions");
atomReferencePositions_->set_memory_type(PERSISTENT);
}
if (groupbitGhost_) {
myAtomPositions = new ClonedAtomQuantity<double>(this,atomPositionsAll,GHOST);
atomGhostCoarseGrainingPositions_ = myAtomPositions;
interscaleManager_.add_per_atom_quantity(myAtomPositions,
"AtomicGhostCoarseGrainingPositions");
}
if(needProcGhost_){
FundamentalAtomQuantity * atomPositionsAll = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION,PROC_GHOST);
ClonedAtomQuantity<double> * myAtomPositions =
new ClonedAtomQuantity<double>(this,atomPositionsAll,PROC_GHOST);
atomProcGhostCoarseGrainingPositions_ = myAtomPositions;
interscaleManager_.add_per_atom_quantity(myAtomPositions,
"AtomicProcGhostCoarseGrainingPositions");
}
}
else {
XrefWrapper * myAtomPositions = new XrefWrapper(this);
atomCoarseGrainingPositions_ = myAtomPositions;
interscaleManager_.add_per_atom_quantity(myAtomPositions,
"AtomicCoarseGrainingPositions");
atomReferencePositions_ = atomCoarseGrainingPositions_;
if (groupbitGhost_) {
myAtomPositions = new XrefWrapper(this,GHOST);
atomGhostCoarseGrainingPositions_ = myAtomPositions;
interscaleManager_.add_per_atom_quantity(myAtomPositions,
"AtomicGhostCoarseGrainingPositions");
}
if (needProcGhost_) {
XrefWrapper * myAtomPositions = new XrefWrapper(this);
atomProcGhostCoarseGrainingPositions_ = myAtomPositions;
interscaleManager_.add_per_atom_quantity(myAtomPositions,
"AtomicProcGhostCoarseGrainingPositions");
}
}
atomCoarseGrainingPositions_->set_memory_type(PERSISTENT);
if (atomGhostCoarseGrainingPositions_) atomGhostCoarseGrainingPositions_->set_memory_type(PERSISTENT);
if (atomProcGhostCoarseGrainingPositions_) atomProcGhostCoarseGrainingPositions_->set_memory_type(PERSISTENT);
}
// Add in atom to element map if using shape functions
if (needsAtomToElementMap_) {
atomElement_ = new AtomToElementMap(this);
interscaleManager_.add_per_atom_int_quantity(atomElement_,"AtomElement");
}
}
//-------------------------------------------------------------------
- void ATC_Method::construct_transfers()
+ void ATC_Method::construct_methods()
{
- // per-atom quantities from lammps
- atomMasses_ = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS);
- atomPositions_ = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION);
- atomVelocities_ = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY);
- atomForces_ = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE);
- ComputedAtomQuantity * atomicPotentialEnergy = new ComputedAtomQuantity(this,lammpsInterface_->compute_pe_name(), peScale_);
- interscaleManager_.add_per_atom_quantity(atomicPotentialEnergy,
- "AtomicPotentialEnergy");
+ if (this->reset_methods()) {
+ if (atomTimeIntegrator_) delete atomTimeIntegrator_;
+ if (integrateInternalAtoms_) {
+ atomTimeIntegrator_ = new AtomTimeIntegratorType(this,INTERNAL);
+ }
+ else {
+ atomTimeIntegrator_ = new AtomTimeIntegrator();
+ }
+
+ // set up integration schemes for ghosts
+ ghostManager_.construct_methods();
+ }
+ }
+
+ //-------------------------------------------------------------------
+ void ATC_Method::construct_transfers()
+ {
+ this->construct_interpolant();
+
+ this->construct_molecule_transfers();
+
+ atomTimeIntegrator_->construct_transfers();
+ ghostManager_.construct_transfers();
+
+
+
}
//-------------------------------------------------------------------
PerAtomDiagonalMatrix<double> * ATC_Method::create_atom_volume()
{
- // WIP_JAT have check for reset to see if we should freshen atomVolume_
if (atomVolume_) {
return atomVolume_;
}
else {
// set variables to compute atomic weights
DENS_MAN * nodalVolume(NULL);
switch (atomWeightType_) {
case USER:
atomVolume_ = new AtomVolumeUser(this,Valpha_);
break;
case LATTICE:
atomVolume_ = new AtomVolumeLattice(this);
break;
case ELEMENT:
atomVolume_ = new AtomVolumeElement(this);
break;
case REGION:
atomVolume_ = new AtomVolumeRegion(this);
break;
case GROUP:
atomVolume_ = new AtomVolumeGroup(this,Valpha_);
break;
case MULTISCALE:
if (!shpFcn_) {
throw ATC_Error("ATC_Method::create_atom_volume - Multiscale algorithm requires an interpolant");
}
nodalVolume = new NodalAtomVolume(this,shpFcn_);
interscaleManager_.add_dense_matrix(nodalVolume,"NodalAtomVolume");
atomVolume_ = new FtaShapeFunctionProlongationDiagonalMatrix(this,nodalVolume,shpFcn_);
break;
case NODE:
if (!shpFcn_) {
throw ATC_Error("ATC_Method::create_atom_volume - Node algorithm requires an interpolant");
}
nodalVolume = new NodalVolume(this,shpFcn_);
interscaleManager_.add_dense_matrix(nodalVolume,"NodalVolume");
atomVolume_ = new FtaShapeFunctionProlongationDiagonalMatrix(this,nodalVolume,shpFcn_);
break;
case NODE_ELEMENT:
if (!shpFcn_) {
throw ATC_Error("ATC_Method::create_atom_volume - Node-Element algorithm requires an interpolant");
}
nodalVolume = new NodalAtomVolumeElement(this,shpFcn_);
interscaleManager_.add_dense_matrix(nodalVolume,"NodalAtomVolumeElement");
atomVolume_ = new FtaShapeFunctionProlongationDiagonalMatrix(this,nodalVolume,shpFcn_);
break;
case READ_IN:
atomVolume_ = new AtomVolumeFile(this,atomicWeightsFile_);
break;
}
if (atomVolume_) {
interscaleManager_.add_per_atom_diagonal_matrix(atomVolume_,"AtomVolume");
}
else {
throw ATC_Error("ATC_Method::create_atom_volume - bad option for atom volume algorithm");
}
return atomVolume_;
}
}
+ //--------------------------------------------------------
+ void ATC_Method::init_integrate_velocity()
+ {
+ atomTimeIntegrator_->init_integrate_velocity(dt());
+ ghostManager_.init_integrate_velocity(dt());
+ }
+ //--------------------------------------------------------
+ void ATC_Method::init_integrate_position()
+ {
+ atomTimeIntegrator_->init_integrate_position(dt());
+ ghostManager_.init_integrate_position(dt());
+ }
+ //-------------------------------------------------------------------
+ void ATC_Method::post_init_integrate()
+ {
+ ghostManager_.post_init_integrate();
+ }
//-------------------------------------------------------------------
void ATC_Method::pre_exchange()
{
adjust_xref_pbc();
// call interscale manager to sync atc per-atom data with lammps array ahead of parallel communication
interscaleManager_.prepare_exchange();
+
+ // change types based on moving from internal region to ghost region
+ if ((atomToElementMapType_ == EULERIAN) && (step() % atomToElementMapFrequency_ == 0)) {
+ ghostManager_.pre_exchange();
+ }
}
//-------------------------------------------------------------------
void ATC_Method::setup_pre_exchange()
{
adjust_xref_pbc();
// call interscale manager to sync atc per-atom data with lammps array ahead of parallel communication
interscaleManager_.prepare_exchange();
}
//-------------------------------------------------------------------
void ATC_Method::pre_neighbor()
{
-#ifdef EXTENDED_ERROR_CHECKING
- if (atomSwitch_) {
- lammpsInterface_->print_msg("Atoms left this processor");
- atomSwitch_ = false;
- }
-#endif
// reset quantities arising from atom exchange
reset_nlocal();
interscaleManager_.post_exchange();
// forward_comm should go here
}
//-------------------------------------------------------------------
void ATC_Method::min_post_force()
{
post_force();
}
//-------------------------------------------------------------------
void ATC_Method::post_force()
{
// this resets allow for the possibility of other fixes modifying positions and velocities, e.g. walls, but reduces efficiency
interscaleManager_.lammps_force_reset();
- if ((atomToElementMapType_ == EULERIAN) && (step() % atomToElementMapFrequency_ == 0)) {
- reset_coordinates();
- }
+ }
+ //--------------------------------------------------------
+ void ATC_Method::final_integrate()
+ {
+ atomTimeIntegrator_->final_integrate(dt());
+ ghostManager_.final_integrate(dt());
}
//-------------------------------------------------------------------
void ATC_Method::post_final_integrate()
{
if (atomicWeightsWriteFlag_ && (step() % atomicWeightsWriteFrequency_ == 0)) {
write_atomic_weights(atomicWeightsFile_,atomVolume_->quantity());
}
}
//-------------------------------------------------------------------
void ATC_Method::end_of_step()
{
localStep_ += 1;
}
//--------------------------------------------------------------
void ATC_Method::finish()
{
// FE Engine
if (feEngine_) feEngine_->finish();
feEngine_->departition_mesh();
}
//--------------------------------------------------------------
/** method to add new fields to the included list */
//--------------------------------------------------------------
void ATC_Method::add_fields(map<FieldName,int> & newFieldSizes)
{
map<FieldName,int>::const_iterator field;
for (field = newFieldSizes.begin(); field!=newFieldSizes.end(); field++) {
FieldName thisField = field->first;
int thisSize = field->second;
if (fieldSizes_.find(thisField)==fieldSizes_.end()) {
fieldSizes_[thisField] = thisSize;
}
}
}
//-------------------------------------------------------------------
void ATC_Method::set_reference_potential_energy(void)
{
- // set the reference value for nodal PE
if (setRefPE_) {
if (setRefPEvalue_) {
- nodalRefPotentialEnergy_ = refPEvalue_;
+ nodalRefPotentialEnergy_->set_quantity() = refPEvalue_;
setRefPEvalue_ = false;
}
else if (readRefPE_) {
if (LammpsInterface::instance()->rank_zero()) {
stringstream ss;
ss << "reading reference potential energy from " << nodalRefPEfile_;
LammpsInterface::instance()->print_msg(ss.str());
}
- nodalRefPotentialEnergy_.from_file(nodalRefPEfile_);
+ (nodalRefPotentialEnergy_->set_quantity()).from_file(nodalRefPEfile_);
readRefPE_ = false;
}
else {
- /* NOTE const */ PerAtomQuantity<double> * atomicPotentialEnergy
-
-
-
-
-
- =interscaleManager_.per_atom_quantity("AtomicPotentialEnergy");
- AtfProjection * pe = new AtfProjection(this, atomicPotentialEnergy,
- accumulant_, accumulantInverseVolumes_);
- nodalRefPotentialEnergy_ = pe->quantity();
- delete pe;
+ hasRefPE_ = false;
+ SPAR_MAN * referenceAccumulant = interscaleManager_.sparse_matrix("ReferenceAccumulant");
+ if (referenceAccumulant) {
+ referenceAccumulant->set_quantity() = accumulant_->quantity();
+ }
+ DIAG_MAN * referenceAccumulantInverseVolumes = interscaleManager_.diagonal_matrix("ReferenceAccumulantInverseVolumes");
+ if (referenceAccumulantInverseVolumes) {
+ referenceAccumulantInverseVolumes->set_quantity() = accumulantInverseVolumes_->quantity();
+ }
+ PAQ * atomicRefPe = interscaleManager_.per_atom_quantity("AtomicReferencePotential");
+ if (!atomicRefPe) {
+ throw ATC_Error("ATC_Method::set_reference_potential_energy - atomic reference PE object was not created during construct_transfers");
+ }
+ PAQ* pe = interscaleManager_.per_atom_quantity("AtomicPotentialEnergy");
+ if (!pe) {
+ throw ATC_Error("ATC_Method::set_reference_potential_energy - atomic PE object was not created during construct_transfers");
+ }
+ atomicRefPe->set_quantity() = pe->quantity();
+ atomicRefPe->fix_quantity();
}
setRefPE_ = false;
hasRefPE_ = true;
}
}
//-------------------------------------------------------------------
//=================================================================
// memory management and processor information exchange
//=================================================================
+
+ //-----------------------------------------------------------------
+ // number of doubles
+ //-----------------------------------------------------------------
+ int ATC_Method::doubles_per_atom() const
+ {
+
+ int doubles = 4;
+ doubles += interscaleManager_.memory_usage();
+ return doubles;
+ }
+
//-----------------------------------------------------------------
// memory usage of local atom-based arrays
//-----------------------------------------------------------------
int ATC_Method::memory_usage()
{
-
- int bytes = 4;
- bytes += interscaleManager_.memory_usage();
+ int bytes = doubles_per_atom();
bytes *= lammpsInterface_->nmax() * sizeof(double);
return bytes;
}
//-----------------------------------------------------------------
// allocate local atom-based arrays
//-----------------------------------------------------------------
void ATC_Method::grow_arrays(int nmax)
{
xref_ =
lammpsInterface_->grow_2d_double_array(xref_,nmax,3,"fix_atc:xref");
perAtomOutput_ =
lammpsInterface_->grow_2d_double_array(perAtomOutput_,nmax,sizePerAtomCols_,"fix_atc:perAtomOutput");
interscaleManager_.grow_arrays(nmax);
}
//-----------------------------------------------------------------
// copy values within local atom-based arrays
//-----------------------------------------------------------------
void ATC_Method::copy_arrays(int i, int j)
{
xref_[j][0] = xref_[i][0];
xref_[j][1] = xref_[i][1];
xref_[j][2] = xref_[i][2];
for (int ii = 0 ; ii < sizePerAtomCols_ ; ii++ ) {
perAtomOutput_[j][ii] = perAtomOutput_[i][ii];
}
interscaleManager_.copy_arrays(i,j);
}
//-----------------------------------------------------------------
// pack values in local atom-based arrays for exchange with another proc
//-----------------------------------------------------------------
int ATC_Method::pack_exchange(int i, double *buf)
{
-#ifdef EXTENDED_ERROR_CHECKING
- atomSwitch_ = true;
-#endif
buf[0] = xref_[i][0];
buf[1] = xref_[i][1];
buf[2] = xref_[i][2];
int j = 4;
for (int ii = 0 ; ii < sizePerAtomCols_ ; ii++ ) {
buf[j++] = perAtomOutput_[i][ii];
}
int interscaleSizeComm = interscaleManager_.pack_exchange(i,&buf[j]);
return sizeComm_ + interscaleSizeComm;
}
//-----------------------------------------------------------------
// unpack values in local atom-based arrays from exchange with another proc
//-----------------------------------------------------------------
int ATC_Method::unpack_exchange(int nlocal, double *buf)
{
xref_[nlocal][0] = buf[0];
xref_[nlocal][1] = buf[1];
xref_[nlocal][2] = buf[2];
int j = 4;
for (int ii = 0 ; ii < sizePerAtomCols_ ; ii++ ) {
perAtomOutput_[nlocal][ii] = buf[j++];
}
int interscaleSizeComm = interscaleManager_.unpack_exchange(nlocal,&buf[j]);
return sizeComm_ + interscaleSizeComm;
}
//-----------------------------------------------------------------
// pack values in local atom-based arrays from exchange with another proc
//-----------------------------------------------------------------
int ATC_Method::pack_comm(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
double dx = 0,dy = 0,dz = 0;
int * num_bond = lammpsInterface_->num_bond();
int ** bond_atom = lammpsInterface_->bond_atom();
m = 0;
if (pbc_flag == 0) {
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = xref_[j][0];
buf[m++] = xref_[j][1];
buf[m++] = xref_[j][2];
if (num_bond) {
buf[m++] = num_bond[j];
for (int ii = 0; ii < lammpsInterface_->bond_per_atom(); ii++) {
buf[m++] = bond_atom[j][ii];
}
}
}
}
else {
if (lammpsInterface_->domain_triclinic() == 0) {
dx = pbc[0]*Xprd_;
dy = pbc[1]*Yprd_;
dz = pbc[2]*Zprd_;
}
else {
dx = pbc[0]*Xprd_ + pbc[5]*XY_ + pbc[4]*XZ_;
dy = pbc[1]*Yprd_ + pbc[3]*YZ_;
dz = pbc[2]*Zprd_;
}
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = xref_[j][0] + dx;
buf[m++] = xref_[j][1] + dy;
buf[m++] = xref_[j][2] + dz;
if (num_bond) {
buf[m++] = num_bond[j];
for (int ii = 0; ii < lammpsInterface_->bond_per_atom(); ii++) {
buf[m++] = bond_atom[j][ii];
}
}
}
}
int mySize = 3;
if (num_bond)
mySize += 1 + lammpsInterface_->bond_per_atom();
return mySize;
}
//-----------------------------------------------------------------
// unpack values in local atom-based arrays from exchange with another proc
//-----------------------------------------------------------------
void ATC_Method::unpack_comm(int n, int first, double *buf)
{
int i,m,last;
int * num_bond = lammpsInterface_->num_bond();
int ** bond_atom = lammpsInterface_->bond_atom();
m = 0;
last = first + n;
for (i = first; i < last; i++) {
xref_[i][0] = buf[m++];
xref_[i][1] = buf[m++];
xref_[i][2] = buf[m++];
if (num_bond) {
num_bond[i] = static_cast<int>(buf[m++]);
for (int ii = 0; ii < lammpsInterface_->bond_per_atom(); ii++) {
bond_atom[i][ii] = static_cast<int>(buf[m++]);
}
}
}
}
//-----------------------------------------------------------------
//
//-----------------------------------------------------------------
void ATC_Method::reset_nlocal()
{
nLocalTotal_ = lammpsInterface_->nlocal();
const int * mask = lammpsInterface_->atom_mask();
nLocal_ = 0;
- nLocalGhost_ = 0;
+ nLocalGhost_ = 0;
+
for (int i = 0; i < nLocalTotal_; ++i) {
if (mask[i] & groupbit_) nLocal_++;
if (mask[i] & groupbitGhost_) nLocalGhost_++;
}
- int local_data[2] = {nLocal_, nLocalGhost_};
- int data[2] = {0, 0};
- lammpsInterface_->int_allsum(local_data,data,2);
- nInternal_ = data[0];
- nGhost_ = data[1];
- // set up internal & ghost maps & coordinates
+ // set up internal & ghost maps
if (nLocal_>0) {
// set map
- internalToAtom_.reset(nLocal_);
+ internalToAtom_.resize(nLocal_);
int j = 0;
// construct internalToAtom map
// : internal index -> local lammps atom index
for (int i = 0; i < nLocalTotal_; ++i) {
if (mask[i] & groupbit_) internalToAtom_(j++) = i;
}
+#ifdef EXTENDED_ERROR_CHECKING
+ stringstream ss;
+ ss << "Nlocal = " << nLocal_ << " but only found " << j << "atoms";
+ if (j!=nLocal_) throw ATC_Error(ss.str());
+#endif
// construct reverse map
atomToInternal_.clear();
for (int i = 0; i < nLocal_; ++i) {
atomToInternal_[internalToAtom_(i)] = i;
}
}
if (nLocalGhost_>0) {
// set map
- ghostToAtom_.reset(nLocalGhost_);
+ ghostToAtom_.resize(nLocalGhost_);
int j = 0;
for (int i = 0; i < nLocalTotal_; ++i) {
if (mask[i] & groupbitGhost_) ghostToAtom_(j++) = i;
}
}
//WIP_JAT this should not be needed at all, but a memory problem with sparse matrices requires them to be reset (possibly related to note in SparseMatrix-inl.h::_delete())
interscaleManager_.reset_nlocal();
}
//-------------------------------------------------------------------
void ATC_Method::reset_coordinates()
{
// update coarse graining positions for internal and ghost atoms
atomCoarseGrainingPositions_->unfix_quantity();
atomCoarseGrainingPositions_->quantity();
atomCoarseGrainingPositions_->fix_quantity();
if (atomGhostCoarseGrainingPositions_) {
atomGhostCoarseGrainingPositions_->unfix_quantity();
atomGhostCoarseGrainingPositions_->quantity();
atomGhostCoarseGrainingPositions_->fix_quantity();
}
if (atomProcGhostCoarseGrainingPositions_) {
atomProcGhostCoarseGrainingPositions_->unfix_quantity();
atomProcGhostCoarseGrainingPositions_->quantity();
atomProcGhostCoarseGrainingPositions_->fix_quantity();
}
}
//-----------------------------------------------------------------
//
//-----------------------------------------------------------------
void ATC_Method::write_atomic_weights(const string filename, const DIAG_MAT & atomicVolumeMatrix)
{
int nlocal = lammpsInterface_->nlocal();
int nlocalmax;
LammpsInterface::instance()->int_allmax(&nlocal,&nlocalmax);
int natoms = int(lammpsInterface_->natoms());
ofstream out;
const char* fname = &filename[0];
// create tag to local id map for this processor
map <int,int> id2tag;
map <int,int>::const_iterator itr;
int * atom_tag = lammpsInterface_->atom_tag();
for (int i = 0; i < nlocal; ++i) {
id2tag[i] = atom_tag[i];
}
int comm_rank = LammpsInterface::instance()->comm_rank();
int nprocs;
LammpsInterface::instance()->int_allmax(&comm_rank,&nprocs);
nprocs += 1;
if (comm_rank == 0) {
out.open(fname);
// print header lines
out << "Atomic Weights for LAMMPS/atc analysis\n";
out << " \n";
out << natoms << " Atoms in system\n";
out << " \n";
// print atomic weights from proc 0
for(int i = 0; i < nlocal; i++) {
out << id2tag[i] << " " << atomicVolumeMatrix(i,i) << "\n";
}
}
if (nprocs > 1) {
int max_size,send_size;
send_size = nlocal;
LammpsInterface::instance()->int_allmax(&send_size,&max_size);
if (comm_rank == 0) {
int intbuf[max_size];
double buf[max_size];
for (int iproc = 1; iproc < nprocs; iproc++) {
LammpsInterface::instance()->int_recv(intbuf,max_size,iproc);
LammpsInterface::instance()->recv(buf,max_size,iproc);
for (int i = 0; i < max_size; i++) {
out << intbuf[i] << " " << buf[i] << "\n";
}
}
} else {
int intbuf[send_size];
double buf[send_size];
for (int i = 0; i < send_size; i++) {
intbuf[i] = id2tag[i];
buf[i] = atomicVolumeMatrix(i,i);
}
LammpsInterface::instance()->int_send(intbuf,send_size);
LammpsInterface::instance()->send(buf,send_size);
}
}
if (comm_rank == 0) {
out.close();
}
}
//-----------------------------------------------------------------
//
//-----------------------------------------------------------------
void ATC_Method::compute_consistent_md_mass_matrix(const SPAR_MAT & shapeFunctionMatrix,
SPAR_MAT & mdMassMatrix) const
{
int nCols = shapeFunctionMatrix.nCols();
DENS_MAT massMatrixLocal(nCols,nCols);
DENS_MAT denseMdMassMatrix(nCols,nCols);
if (nLocal_>0)
massMatrixLocal = shapeFunctionMatrix.transMat(shapeFunctionMatrix);
lammpsInterface_->allsum(massMatrixLocal.ptr(),
denseMdMassMatrix.ptr(),
denseMdMassMatrix.size());
mdMassMatrix.reset(denseMdMassMatrix,1.e-10);
}
//=================================================================
// Interscale operators
//=================================================================
// in the spirit of the current design of ATC: atoms local, nodes global
bool ATC_Method::nodal_influence(const int groupbit,
set<int> & nset, set<int> & aset, double tol)
{
int nghost = nodal_influence(groupbit,nset,aset,true,tol);
int local_nghost = nghost;
lammpsInterface_->int_allsum(&local_nghost,&nghost);
if (nghost == 0) {
nodal_influence(groupbit,nset,aset,false,tol);
}
return (nghost > 0);
}
int ATC_Method::nodal_influence(const int groupbit,
set<int> & nset, set<int> & aset, bool ghost, double tol)
{
Array<int> & amap = (ghost) ? ghostToAtom_ : internalToAtom_;
int natoms = (ghost) ? nLocalGhost_ : nLocal_;
DENS_MAT influence(nNodes_,1);
DENS_MAT atomInfluence(natoms,1);
const int *mask = lammpsInterface_->atom_mask();
for (int i = 0; i < natoms; i++) {
if (mask[amap(i)] & groupbit) {
atomInfluence(i,0) = 1;
aset.insert(i);
}
}
// relies on shape functions
if (ghost) {
- restrict_volumetric_quantity(atomInfluence,influence,shpFcnGhost_->quantity());
+ restrict_volumetric_quantity(atomInfluence,influence,(interscaleManager_.per_atom_sparse_matrix("InterpolantGhost"))->quantity());
}
else {
restrict_volumetric_quantity(atomInfluence,influence);
}
DENS_MAT localInfluence = influence;
lammpsInterface_->allsum(localInfluence.ptr(),
influence.ptr(),
influence.size());
for (int i = 0; i < nNodes_; i++) {
if (fabs(influence(i,0)) > tol) { nset.insert(i); }
}
return aset.size();
}
//--------------------------------------------------------
void ATC_Method::restrict_volumetric_quantity(const MATRIX & atomData,
MATRIX & nodeData,
const SPAR_MAT & shpFcn)
{
// computes nodeData = N*DeltaVAtom*atomData where N are the shape functions
DENS_MAT workNodeArray(nodeData.nRows(),nodeData.nCols());
//DENS_MAT workNodeArray;
if (atomData.nRows() > 0) { // or shpFcn_???
workNodeArray = shpFcn.transMat(atomData);
}
int count = nodeData.nRows()*nodeData.nCols();
lammpsInterface_->allsum(workNodeArray.ptr(),nodeData.ptr(),count);
return;
}
//--------------------------------------------------------
void ATC_Method::restrict_volumetric_quantity(const MATRIX & atomData,
MATRIX & nodeData)
{
restrict_volumetric_quantity(atomData,nodeData,shpFcn_->quantity());
return;
}
//--------------------------------------------------------
void ATC_Method::prolong(const MATRIX & nodeData,
MATRIX & atomData)
{
// computes the finite element interpolation at atoms atomData = N*nodeData
if (nLocal_>0) {
atomData = (shpFcn_->quantity())*nodeData;
}
return;
}
//========================================================
// FE functions
//========================================================
//--------------------------------------------------------
void ATC_Method::output()
{
// if (lammpsInterface_->comm_rank() == 0) {
compute_nodeset_output();
compute_faceset_output();
compute_elementset_output();
// }
}
//--------------------------------------------------------
void ATC_Method::compute_nodeset_output(void)
{
map< pair <string, FieldName>, NodesetOperationType >::const_iterator iter;
for (iter = nsetData_.begin(); iter != nsetData_.end();iter++){
pair <string, FieldName> id = iter->first;
string nsetName = id.first;
FieldName field = id.second;
double sum = 0.0;
const set<int> nset = feEngine_->fe_mesh()->nodeset(nsetName);
const DENS_MAT & thisField = (fields_.find(field)->second).quantity();
set< int >::const_iterator itr;
for (itr = nset.begin(); itr != nset.end();itr++){
int node = *itr;
sum += thisField(node,0);
}
string name = nsetName + "_" + field_to_string(field);
if (iter->second == NODESET_AVERAGE) {
sum /= nset.size();
name = "average_"+name;
}
feEngine_->add_global(name, sum);
}
}
//--------------------------------------------------------
void ATC_Method::compute_faceset_output(void)
{
map < pair<string,string>, FacesetIntegralType >::const_iterator iter;
DENS_MAT values;
for (iter = fsetData_.begin(); iter != fsetData_.end(); iter++) {
string bndyName = (iter->first).first;
string fieldName = (iter->first).second;
const set< PAIR > & faceSet = (feEngine_->fe_mesh())->faceset(bndyName);
ATOMIC_DATA::iterator data_iter = filteredData_.find(fieldName);
if (data_iter == filteredData_.end()) {
string msg = "Specified fieldName "+fieldName+
" not found in filteredData_ while attempting surface integration";
throw ATC_Error(msg);
}
const DENS_MAT & data = ((data_iter->second).quantity());
string stem = bndyName + "_" + fieldName + "_";
bool tf = false;
if (iter->second == CONTOUR_INTEGRAL) {
stem = "contour_"+stem;
tf = true;
}
feEngine_->field_surface_flux(data,faceSet,values,tf);
for (int i = 0; i < values.nRows() ; ++i ) {
string name = stem + to_string(i+1);
feEngine_->add_global(name, values(i,0));
}
}
}
//--------------------------------------------------------
void ATC_Method::compute_elementset_output(void)
{
map< pair <string, FieldName>, ElementsetOperationType >::const_iterator iter;
for (iter = esetData_.begin(); iter != esetData_.end();iter++){
pair <string, FieldName> id = iter->first;
string esetName = id.first;
FieldName field = id.second;
const ESET eset = feEngine_->fe_mesh()->elementset(esetName);
const DENS_MAT & thisField = (fields_.find(field)->second).quantity();
DENS_VEC total = feEngine_->integrate(thisField,eset);
string name = esetName + "_" + field_to_string(field);
if (iter->second == ELEMENTSET_AVERAGE) {
DENS_MAT ones(nNodes_,0); ones = 1;
DENS_VEC V = feEngine_->integrate(ones,eset);
total /= V[0];
name = "average_"+name;
}
if (total.size() == 1) {
feEngine_->add_global(name, total[0]);
}
else {
for (int i = 0; i < total.size(); i++) {
feEngine_->add_global(name+to_string(i), total[i]);
}
}
}
}
//=================================================================
//
//=================================================================
//--------------------------------------------------------
bool ATC_Method::read_atomic_ref_positions(const char * filename)
{
int nlocal = lammpsInterface_->nlocal();
ifstream in;
const int lineSize = 256;
char line[lineSize];
// create tag to local id map for this processor
map <int,int> tag2id;
map <int,int>::const_iterator itr;
int * atom_tag = lammpsInterface_->atom_tag();
for (int i = 0; i < nlocal; ++i) {
tag2id[atom_tag[i]] = i;
}
// get number of atoms
int natoms = 0;
if (LammpsInterface::instance()->rank_zero()) {
in.open(filename);
string msg;
string name = filename;
msg = "no "+name+" reference file found";
if (! in.good()) throw ATC_Error(msg);
in.getline(line,lineSize); // header
in.getline(line,lineSize); // blank line
in >> natoms;
in.close();
stringstream ss;
ss << "found " << natoms << " atoms in reference file";
LammpsInterface::instance()->print_msg(ss.str());
}
LammpsInterface::instance()->int_broadcast(&natoms);
// read atoms and assign
if (LammpsInterface::instance()->rank_zero()) {
in.open(filename);
while(in.good()) {
in.getline(line,lineSize);
string str(line);
int pos = str.find("Atoms");
if (pos > -1) {
in.getline(line,lineSize); // blank line
break;
}
}
}
int nread = 0,type = -1, tag = -1, count = 0;
double x[3]={0,0,0};
while (nread < natoms) {
if (LammpsInterface::instance()->rank_zero()) {
in.getline(line,lineSize);
stringstream ss (line,stringstream::in | stringstream::out);
ss >> tag >> type >> x[0] >> x[1] >> x[2];
nread++;
}
LammpsInterface::instance()->int_broadcast(&nread);
LammpsInterface::instance()->int_broadcast(&tag);
LammpsInterface::instance()->broadcast(x,3);
itr = tag2id.find(tag);
if (itr != tag2id.end()) {
int iatom = itr->second;
xref_[iatom][0] = x[0];
xref_[iatom][1] = x[1];
xref_[iatom][2] = x[2];
count++;
}
}
if (LammpsInterface::instance()->rank_zero()) {
in.close();
stringstream ss;
ss << "read " << natoms << " reference positions";
LammpsInterface::instance()->print_msg(ss.str());
}
if (count != nlocal)
throw ATC_Error("reset "+to_string(count)+" atoms vs "+to_string(nlocal));
return true;
}
//--------------------------------------------------------
void ATC_Method::remap_ghost_ref_positions(void)
{
int nlocal = lammpsInterface_->nlocal();
int nghost = lammpsInterface_->nghost();
double box_bounds[2][3];
lammpsInterface_->box_bounds(box_bounds[0][0],box_bounds[1][0],
box_bounds[0][1],box_bounds[1][1],
box_bounds[0][2],box_bounds[1][2]);
double xlo = box_bounds[0][0], xhi = box_bounds[1][0];
double ylo = box_bounds[0][1], yhi = box_bounds[1][1];
double zlo = box_bounds[0][2], zhi = box_bounds[1][2];
double box_length[3];
for (int k = 0; k < 3; k++) {
box_length[k] = box_bounds[1][k] - box_bounds[0][k];
}
double Lx = box_length[0], Ly = box_length[1], Lz = box_length[2];
// create tag to local id map for this processor
map <int,int> tag2id;
map <int,int>::const_iterator itr;
int * atom_tag = lammpsInterface_->atom_tag();
for (int i = 0; i < nlocal; ++i) {
tag2id[atom_tag[i]] = i;
}
// loop over ghosts
double ** x = lammpsInterface_->xatom();
for (int j = nlocal; j < nlocal + nghost; j++) {
int tag = atom_tag[j];
int i = tag2id[tag];
//itr = tag2id.find(tag);
//if (itr != tag2id.end())
double* xj = x[j];
double* Xj = xref_[j];
//double Xj[3];
double* Xi = xref_[i];
// the assumption is that xref_[j] has been shuffled
// so make an image of xref_[i] that is close to x[j]
if (xj[0] <= xlo) Xj[0] = Xi[0] -Lx;
if (xj[0] >= xhi) Xj[0] = Xi[0] +Lx;
if (xj[1] <= ylo) Xj[1] = Xi[1] -Ly;
if (xj[1] >= yhi) Xj[1] = Xi[1] +Ly;
if (xj[2] <= zlo) Xj[2] = Xi[2] -Lz;
if (xj[2] >= zhi) Xj[2] = Xi[2] +Lz;
}
}
};
diff --git a/lib/atc/ATC_Method.h b/lib/atc/ATC_Method.h
index 79d00f54c..17cd859dc 100644
--- a/lib/atc/ATC_Method.h
+++ b/lib/atc/ATC_Method.h
@@ -1,854 +1,869 @@
#ifndef ATC_METHOD_H
#define ATC_METHOD_H
// ATC_Method headers
#include "ATC_TypeDefs.h"
#include "PhysicsModel.h"
#include "MatrixLibrary.h"
#include "Array.h"
#include "Array2D.h"
#include "OutputManager.h"
#include "Function.h"
#include "FE_Element.h"
#include "TimeFilter.h"
#include "LammpsInterface.h"
#include "FE_Engine.h"
#include "ExtrinsicModel.h"
#include "InterscaleOperators.h"
#include "TransferLibrary.h"
+#include "GhostManager.h"
// Other headers
#include <vector>
#include <set>
+#include <utility>
+#include <string>
+#include <map>
-using namespace std;
-
-using LAMMPS_NS::Fix;
-
namespace ATC {
+ // forward declarations
+ class AtomTimeIntegrator;
+
/**
* @class ATC_Method
* @brief Base class for atom-continuum coupling or transfer operators
*/
class ATC_Method {
public: /** methods */
/** constructor */
- ATC_Method(string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix);
+ ATC_Method(std::string groupName, double **& perAtomArray, LAMMPS_NS::Fix * thisFix);
/** destructor */
virtual ~ATC_Method();
- string version() {return "2.0";}
+ std::string version() {return "2.0";}
/** parser/modifier */
virtual bool modify(int narg, char **arg);
void parse_field(/*const*/ char ** args, int &argIndex,
FieldName &thisField, int &thisIndex);
/** initialize any computes that will be needed prior to the first timestep */
virtual void init_computes() {
lammpsInterface_->computes_addstep(lammpsInterface_->ntimestep());
};
/** pre integration run */
virtual void initialize();
/** Predictor phase, executed before Verlet */
virtual void pre_init_integrate() {
feEngine_->partition_mesh();
update_step();
};
/** Predictor phase, Verlet first step for velocity */
- virtual void init_integrate_velocity(){};
+ virtual void init_integrate_velocity();
/** Predictor phase, executed between velocity and position Verlet */
virtual void mid_init_integrate(){};
/** Predictor phase, Verlet first step for position */
- virtual void init_integrate_position(){};
+ virtual void init_integrate_position();
/** Predictor phase, executed after Verlet */
- virtual void post_init_integrate(){};
+ virtual void post_init_integrate();
/** Corrector phase, executed before Verlet */
virtual void pre_final_integrate(){};
/** Corrector phase, Verlet second step for velocity */
- virtual void final_integrate(){};
+ virtual void final_integrate();
/** Corrector phase, executed after Verlet*/
virtual void post_final_integrate();
/** post integration run : called at end of run or simulation */
virtual void finish();
/** pre/post atomic force calculation */
virtual void pre_force(){};
/** pre/post atomic force calculation in minimize */
virtual void min_pre_force(){};
virtual void min_post_force();
/** called at end of step for run or minimize */
virtual void end_of_step();
//---------------------------------------------------------------
/** \name memory management and processor information exchange */
//---------------------------------------------------------------
/*@{*/
/** pre_exchange is our indicator that atoms have moved across processors */
virtual void pre_exchange();
void setup_pre_exchange();
virtual void pre_neighbor();
virtual void post_force();
+ int doubles_per_atom() const;
virtual int memory_usage();
virtual void grow_arrays(int);
void copy_arrays(int, int);
int pack_exchange(int, double *);
int unpack_exchange(int, double *);
int comm_forward(void) {return sizeComm_;}
int pack_comm(int , int *, double *, int, int *);
void unpack_comm(int, int, double *);
/*@}*/
//---------------------------------------------------------------
/** \name managers */
//---------------------------------------------------------------
/*@{*/
/** access to FE engine */
const FE_Engine * fe_engine() const {return feEngine_;};
/** access to interscale manager */
InterscaleManager & interscale_manager() {return interscaleManager_;};
/** access to lammps interface */
LammpsInterface const * lammps_interface() const {return lammpsInterface_;};
/** access to time filter */
TimeFilterManager * time_filter_manager() {return &timeFilterManager_;};
/*@}*/
//---------------------------------------------------------------
/** \name access methods for output computation data */
//---------------------------------------------------------------
/*@{*/
/** compute scalar for output */
virtual double compute_scalar() {return 0.;}
/** compute vector for output */
virtual double compute_vector(int n) {return 0.;}
/** compute vector for output */
virtual double compute_array(int irow, int icol) {return 0.;};
int scalar_flag() const {return scalarFlag_;}
int vector_flag() const {return vectorFlag_;}
int size_vector() const {return sizeVector_;}
int peratom_flag() const {return sizePerAtomCols_ > 0;}
int size_peratom_cols() const {return sizePerAtomCols_;}
int peratom_freq() const {return 1;}
void set_peratom_pointer(double ** & ptr) { ptr = perAtomOutput_; }
int global_freq() const {return scalarVectorFreq_;};
int extscalar() const {return extScalar_;};
int extvector() const {return extVector_;};
int * extlist() {return extList_;};
int thermo_energy_flag() const {return thermoEnergyFlag_;};
bool parallel_consistency() const {return parallelConsistency_;};
/** access to step number */
int step() const {return stepCounter_;};
double time() const {return simTime_;};
double dt() const {return lammpsInterface_->dt();}
/** time/step functions */
bool sample_now(void) const
{
int s = step();
bool now = ( (sampleFrequency_ > 0) && (s % sampleFrequency_ == 0));
return now;
}
bool output_now(void) const
{
int s = step();
bool now = ( (outputFrequency_ > 0) && (s == 1 || s % outputFrequency_ == 0) );
now = now || outputNow_;
return now;
}
double output_index(void) const
{
if (outputTime_) return time();
else return step();
}
/** print tracked types and groups */
int print_tracked() const
{
- string msg = "species:\n";
+ std::string msg = "species:\n";
for(unsigned int i = 0; i < typeList_.size(); i++) {
- msg+=" type:"+to_string(typeList_[i])+" name: "+ typeNames_[i]+"\n"; }
+ msg+=" type:"+ATC_Utility::to_string(typeList_[i])+" name: "+ typeNames_[i]+"\n"; }
for(unsigned int i = 0; i < groupList_.size(); i++) {
- msg+=" group (bit):"+to_string(groupList_[i])+" name: "+ groupNames_[i]+"\n";
+ msg+=" group (bit):"+ATC_Utility::to_string(groupList_[i])+" name: "+ groupNames_[i]+"\n";
}
ATC::LammpsInterface::instance()->print_msg_once(msg);
return typeList_.size()+groupList_.size();
}
- vector<string> tracked_names() const
+ std::vector<std::string> tracked_names() const
{
- vector<string> names(typeList_.size()+groupList_.size());
+ std::vector<std::string> names(typeList_.size()+groupList_.size());
int j = 0;
for(unsigned int i = 0; i < typeList_.size(); i++) {
names[j++] = typeNames_[i];
}
for(unsigned int i = 0; i < groupList_.size(); i++) {
names[j++] = groupNames_[i];
}
return names;
}
- int tag_to_type(string tag) const {
+ int tag_to_type(std::string tag) const {
for(unsigned int i = 0; i < typeList_.size(); i++) {
if (tag == typeNames_[i]) return typeList_[i];
}
return -1;
}
int type_index(int t) const {
for(unsigned int i = 0; i < typeList_.size(); i++) {
if (t == typeList_[i]) return i;
}
return -1;
}
/*@}*/
//---------------------------------------------------------------
/** \name Access methods for sizes */
//---------------------------------------------------------------
/*@{*/
/** get number of unique FE nodes */
int num_nodes() const {return nNodes_;};
/** get number of spatial dimensions */
int nsd() const {return nsd_;};
/** get number of ATC internal atoms on this processor */
int nlocal() const {return nLocal_;};
/** get total number of LAMMPS atoms on this processor */
int nlocal_total() const {return nLocalTotal_;};
/** get number of ATC ghost atoms on this processor */
int nlocal_ghost() const {return nLocalGhost_;};
/** get the number of all LAMMPS real and parallel ghost atoms on this processor */
int nproc_ghost() const {return nLocalTotal_ + lammpsInterface_->nghost();};
- /** get number of ATC internal atoms */
- int ninternal() const {return nInternal_;}
- /** get number of ATC ghost atoms */
- int nghost() const {return nGhost_;};
/** match group bits */
bool is_ghost_group(int grpbit) { return (grpbit == groupbitGhost_); }
bool is_internal_group(int grpbit) { return (grpbit == groupbit_); }
unsigned int ntracked() { return typeList_.size()+groupList_.size(); }
bool has_tracked_species() { return typeList_.size()+groupList_.size() > 0; }
/*@}*/
virtual void initialize_mesh_data(void){meshDataInitialized_=true;}
//---------------------------------------------------------------
/** \name Access methods for data used by various methods */
//---------------------------------------------------------------
/*@{*/
/** access to name FE fields */
DENS_MAN &field(FieldName thisField){return fields_[thisField];};
/** access to FE field time derivatives */
DENS_MAT &get_dot_field(FieldName thisField){return dot_fields_[thisField].set_quantity();};
DENS_MAN &dot_field(FieldName thisField){return dot_fields_[thisField];};
/** access to nodal fields of atomic variables */
DENS_MAT &get_atomic_field(FieldName thisField)
{ return nodalAtomicFields_[thisField].set_quantity(); };
DENS_MAN &nodal_atomic_field(FieldName thisField)
{ return nodalAtomicFields_[thisField]; };
/** access to all fields */
FIELDS &fields() {return fields_;};
/** access to all fields rates of change (roc) */
FIELDS &fields_roc() {return dot_fields_;};
/** add a new field */
- void add_fields(map<FieldName,int> & newFieldSizes);
+ void add_fields(std::map<FieldName,int> & newFieldSizes);
/** access FE rate of change */
DENS_MAT &get_field_roc(FieldName thisField)
{ return dot_fields_[thisField].set_quantity(); };
DENS_MAN &field_roc(FieldName thisField)
{ return dot_fields_[thisField]; };
/** access atomic rate of change contributions to finite element equation */
DENS_MAT &get_nodal_atomic_field_roc(FieldName thisField)
{ return nodalAtomicFieldsRoc_[thisField].set_quantity(); };
DENS_MAN &nodal_atomic_field_roc(FieldName thisField)
{ return nodalAtomicFieldsRoc_[thisField]; };
/** access to second time derivative (2roc) */
DENS_MAT &get_field_2roc(FieldName thisField)
{ return ddot_fields_[thisField].set_quantity(); };
DENS_MAN &field_2roc(FieldName thisField)
{ return ddot_fields_[thisField]; };
/** access to third time derivative (3roc) */
DENS_MAT &get_field_3roc(FieldName thisField)
{ return dddot_fields_[thisField].set_quantity(); };
DENS_MAN &field_3roc(FieldName thisField)
{ return dddot_fields_[thisField]; };
/** group bit */
int groupbit() {return groupbit_;};
/** group bit for ghosts */
int groupbit_ghost() {return groupbitGhost_;};
/** internal atom to global map */
const Array<int> &internal_to_atom_map() {return internalToAtom_;};
/** ghost atom to global map */
const Array<int> &ghost_to_atom_map() {return ghostToAtom_;};
- const map<int,int> & atom_to_internal_map() {return atomToInternal_;};
+ const std::map<int,int> & atom_to_internal_map() {return atomToInternal_;};
/** access to xref */
double ** xref() {return xref_;};
/** access to faceset names */
- const set<PAIR> &faceset(const string & name) const {return (feEngine_->fe_mesh())->faceset(name);};
+ const std::set<PAIR> &faceset(const std::string & name) const {return (feEngine_->fe_mesh())->faceset(name);};
DENS_VEC copy_nodal_coordinates(int i) const { return feEngine_->fe_mesh()->nodal_coordinates(i); }
/** access to set of DENS_MANs accessed by tagging */
- DENS_MAN & tagged_dens_man(const string & tag) {return taggedDensMan_[tag];};
+
+ DENS_MAN & tagged_dens_man(const std::string & tag) {return taggedDensMan_[tag];};
/** access to atom to element type map */
AtomToElementMapType atom_to_element_map_type() {return atomToElementMapType_;};
/** access to atom to element update frequency */
int atom_to_element_map_frequency() {return atomToElementMapFrequency_;};
/** flag on whether atc is initialized */
bool is_initialized() const {return initialized_;};
/** step number within a run or minimize */
int local_step() const {return localStep_;};
/** flags whether a methods reset is required */
- virtual bool reset_methods() const {return (!initialized_) || timeFilterManager_.need_reset() || timeFilterManager_.end_equilibrate();};
+ virtual bool reset_methods() const {return (!initialized_) || timeFilterManager_.need_reset() || timeFilterManager_.end_equilibrate() || ghostManager_.need_reset();};
/** sizes of each field being considered */
- const map<FieldName,int> & field_sizes() {return fieldSizes_;};
+ const std::map<FieldName,int> & field_sizes() {return fieldSizes_;};
/*@}*/
/** compute the consistent MD mass matrix */
void compute_consistent_md_mass_matrix(const SPAR_MAT & shapeFunctionMatrix,
SPAR_MAT & mdMassMatrix) const;
- /** access to species ids */
- const map<string,pair<IdType,int> > & species_ids() const {return speciesIds_;};
/** access to molecule ids */
- const map<string,pair<MolSize,int> > & molecule_ids() const {return moleculeIds_;};
+ const std::map<std::string,std::pair<MolSize,int> > & molecule_ids() const {return moleculeIds_;};
+ /** access to internal element set */
+ const std::string & internal_element_set() {return internalElementSet_;};
+
//----------------------------------------------------------------
/** \name mass matrix operations */
//----------------------------------------------------------------
// inverted using GMRES
void apply_inverse_mass_matrix(MATRIX & data, FieldName thisField)
{
if (useConsistentMassMatrix_(thisField)) {
//data = consistentMassInverse_*data;
data = (consistentMassMatsInv_[thisField].quantity())*data;
return;
}
data = (massMatsInv_[thisField].quantity())*data;
};
/** multiply inverse mass matrix times given data and return result */
void apply_inverse_mass_matrix(const MATRIX & data_in, MATRIX & data_out,
FieldName thisField)
{
if (useConsistentMassMatrix_(thisField)) {
//data_out = consistentMassInverse_*data_in;
data_out = (consistentMassMatsInv_[thisField].quantity())*data_in;
return;
}
data_out = (massMatsInv_[thisField].quantity())*data_in;
};
void apply_inverse_md_mass_matrix(const MATRIX & data_in, MATRIX & data_out,
FieldName thisField)
{ data_out = (massMatsMdInv_[thisField].quantity())*data_in; };
DIAG_MAN &mass_mat(FieldName thisField)
{ return massMats_[thisField];};
//---------------------------------------------------------------
/** \name mass matrices */
//---------------------------------------------------------------
/*@{*/
/** access to mass matrices */
/** access to inverse mass matrices */
DIAG_MAT &get_mass_mat_inv(FieldName thisField)
{ return massMatsInv_[thisField].set_quantity();};
DIAG_MAN &mass_mat_inv(FieldName thisField)
{ return massMatsInv_[thisField];};
/** nodal volumes associated with the atoms, used for the atomic mass matrix */
AdmtfShapeFunctionRestriction * nodalAtomicVolume_;
void register_mass_matrix_dependency(DependencyManager * dependent,
FieldName thisField)
{
if (useConsistentMassMatrix_(thisField)) {
consistentMassMatsInv_[thisField].register_dependence(dependent);
return;
}
massMatsInv_[thisField].register_dependence(dependent);
};
void apply_inverse_md_mass_matrix(MATRIX & data, FieldName thisField)
{ data = (massMatsMdInv_[thisField].quantity())*data; };
void register_md_mass_matrix_dependency(DependencyManager * dependent,
FieldName thisField)
{massMatsMdInv_[thisField].register_dependence(dependent);}
// /** determine weighting method for atomic integration */
// void compute_consistent_md_mass_matrix(const SPAR_MAT & shapeFunctionMatrix,
// SPAR_MAT & mdMassMatrix);
virtual void compute_md_mass_matrix(FieldName thisField,
DIAG_MAT & massMat) {};
/** access to md mass matrices */
DIAG_MAN &mass_mat_md_inv(FieldName thisField)
{ return massMatsMdInv_[thisField];};
DIAG_MAN &set_mass_mat_md(FieldName thisField)
{ return massMatsMd_[thisField]; };
const DIAG_MAN &mass_mat_md(FieldName thisField) const
{
MASS_MATS::const_iterator man = massMatsMd_.find(thisField);
if (man == massMatsMd_.end() ) {
- string msg = " MD mass for " + field_to_string(thisField) + " does not exist";
+ std::string msg = " MD mass for " + field_to_string(thisField) + " does not exist";
throw ATC_Error(msg);
}
return man->second;
};
/*@}*/
//----------------------------------------------------------------
/** \name Interscale operators */
//----------------------------------------------------------------
bool use_md_mass_normalization() const { return mdMassNormalization_;}
bool kernel_based() { return kernelBased_; }
bool kernel_on_the_fly() const { return kernelOnTheFly_;}
bool has_kernel_function() { return kernelFunction_ != NULL; }
KernelFunction * kernel_function() { return kernelFunction_; }
- vector<int> & type_list() { return typeList_; }
- vector<int> & group_list() { return groupList_; }
+ std::vector<int> & type_list() { return typeList_; }
+ std::vector<int> & group_list() { return groupList_; }
SPAR_MAN* interpolant() { return shpFcn_; }
SPAR_MAN* accumulant() { return accumulant_; }
DIAG_MAN* accumulant_weights() { return accumulantWeights_;}
DIAG_MAN* accumulant_inverse_volumes() { return accumulantInverseVolumes_; }
+ int accumulant_bandwidth() const { if (accumulantBandwidth_) return accumulantBandwidth_; else return feEngine_->num_nodes(); };
+
PerAtomQuantity<double> * atom_coarsegraining_positions() { return atomCoarseGrainingPositions_; }
PerAtomQuantity<double> * atom_reference_positions() { return atomReferencePositions_; }
PerAtomQuantity<int> * atom_to_element_map() { return atomElement_;}
double ke_scale() { return keScale_; }
double pe_scale() { return peScale_; }
/** from a atom group, find the nodes that have non-zero shape function contributions */
- bool nodal_influence(const int groupbit, set<int>& nset, set<int>& aset, double tol =1.e-8);
- int nodal_influence(const int groupbit, set<int>& nset, set<int>& aset,
+ bool nodal_influence(const int groupbit, std::set<int>& nset, std::set<int>& aset, double tol =1.e-8);
+ int nodal_influence(const int groupbit, std::set<int>& nset, std::set<int>& aset,
bool ghost,
double tol =1.e-8);
/*@{*/
/** Restrict based on atomic volume integration for volumetric quantities : given w_\alpha, w_I = \sum_\alpha N_{I\alpha} w_\alpha */
void restrict_volumetric_quantity(const MATRIX &atomData,
MATRIX &nodeData);
void restrict_volumetric_quantity(const MATRIX &atomData,
MATRIX &nodeData,
const SPAR_MAT & shpFcn);
/** Prolong : given w_I, w_\alpha = \sum_I N_{I\alpha} w_I */
void prolong(const MATRIX &nodeData, MATRIX &atomData);
//---------------------------------------------------------------
/** \name quadrature weights */
//---------------------------------------------------------------
PerAtomDiagonalMatrix<double> * create_atom_volume();
//---------------------------------------------------------------
/** \name access to potential energy reference */
//---------------------------------------------------------------
/*@{*/
- bool has_ref_pe(void) const { return hasRefPE_; }
- const DENS_MAT * nodal_ref_potential_energy(void) { return &nodalRefPotentialEnergy_; }
+ DENS_MAN * nodal_ref_potential_energy(void) { return nodalRefPotentialEnergy_; }
protected: /** methods */
/** time functions */
void set_time(double t=0) {simTime_=t;};
void update_time(double alpha = 1.0)
{
double dt = lammpsInterface_->dt();
simTime_ += alpha*dt;
if (dt == 0.0) simTime_ = stepCounter_;
}
// note step counter different than lammps step e.g. min
void update_step(void) { ++stepCounter_; }
//---------------------------------------------------------------
/** initialization routines */
//---------------------------------------------------------------
/** gets baseline data from continuum model */
virtual void set_continuum_data();
/** sets up all data necessary to define the computational geometry */
virtual void set_computational_geometry();
/** constructs all data which is updated with time integration, i.e. fields */
virtual void construct_time_integration_data() = 0;
/** create methods, e.g. time integrators, filters */
- virtual void construct_methods() = 0;
+ virtual void construct_methods();
/** set up data which is dependency managed */
virtual void construct_transfers();
+ /** sets up accumulant & interpolant */
+ virtual void construct_interpolant()=0;
+ /** sets up mol transfers */
+ virtual void construct_molecule_transfers()=0;
/** update the peratom output pointers */
void update_peratom_output(void);
- virtual void read_restart_data(string fileName_, RESTART_LIST & data);
- virtual void write_restart_data(string fileName_, RESTART_LIST & data);
+ virtual void read_restart_data(std::string fileName_, RESTART_LIST & data);
+ virtual void write_restart_data(std::string fileName_, RESTART_LIST & data);
void pack_fields(RESTART_LIST & data);
/** mass matrices */
MASS_MATS massMats_;
MASS_MATS massMatsInv_;
MASS_MATS massMatsMd_;
MASS_MATS massMatsMdInstantaneous_;
MASS_MATS massMatsMdInv_;
MASS_MATS massMatsFE_;
MASS_MATS massMatsAq_;
MASS_MATS massMatsAqInstantaneous_;
Array<bool> useConsistentMassMatrix_;
- map<FieldName,SPAR_MAN> consistentMassMats_;
- map<FieldName,DENS_MAN> consistentMassMatsInv_;
- map<FieldName,TimeFilter * > massMatTimeFilters_;
+ std::map<FieldName,SPAR_MAN> consistentMassMats_;
+ std::map<FieldName,DENS_MAN> consistentMassMatsInv_;
+ std::map<FieldName,TimeFilter * > massMatTimeFilters_;
//---------------------------------------------------------------
/** \name quadrature weight function */
//---------------------------------------------------------------
/*@{*/
- void write_atomic_weights(const string filename,const DIAG_MAT & atomicVolumeMatrix);
+ void write_atomic_weights(const std::string filename,const DIAG_MAT & atomicVolumeMatrix);
/** resets shape function matrices based on atoms on this processor */
virtual void reset_nlocal();
virtual void reset_coordinates();
/*@}*/
/** re-read reference positions */
bool read_atomic_ref_positions(const char * filename);
void remap_ghost_ref_positions(void);
void adjust_xref_pbc();
//---------------------------------------------------------------
/** \name output functions */
//---------------------------------------------------------------
/*@{*/
virtual void output();
void compute_nodeset_output(void);
void compute_faceset_output(void);
void compute_elementset_output(void);
/*@}*/
//---------------------------------------------------------------
/** \name types, groups, and molecules */
//---------------------------------------------------------------
/*@{*/
/** map from species string tag to LAMMPS type id or group bit */
- map<string,pair<IdType,int> > speciesIds_; // OBSOLETE
- map<string,pair<MolSize,int> > moleculeIds_;
+ std::map<std::string,std::pair<MolSize,int> > moleculeIds_;
/** a list of lammps types & groups ATC tracks */
- vector<string> typeNames_;
- vector<string> groupNames_;
- vector<int> typeList_;
- vector<int> groupList_;
+ std::vector<std::string> typeNames_;
+ std::vector<std::string> groupNames_;
+ std::vector<int> typeList_;
+ std::vector<int> groupList_;
/*@}*/
void reset_fields();
private: /** methods */
ATC_Method(); // do not define
protected: /** data */
/* parsed input requires changes */
bool needReset_;
// managers
/** pointer to lammps interface class */
LammpsInterface * lammpsInterface_;
/** manager for atomic quantities and interscale operations */
InterscaleManager interscaleManager_;
TimeFilterManager timeFilterManager_;
+ /** check to see if we are integrating the atoms */
+ bool integrateInternalAtoms_;
+ /** object which integrates atoms */
+ AtomTimeIntegrator * atomTimeIntegrator_;
+ /** objects which handles integration and modification of ghost atoms */
+ GhostManager ghostManager_;
+
/** finite element handler */
FE_Engine * feEngine_;
// status flags
/** flag on if initialization has been performed */
bool initialized_;
bool meshDataInitialized_;
/** counter for steps of a run or minimize */
int localStep_;
// sizes
/** size of per atom communication */
int sizeComm_;
/** atomic coordinates for coarse graining */
PerAtomQuantity<double> * atomCoarseGrainingPositions_;
PerAtomQuantity<double> * atomGhostCoarseGrainingPositions_;
PerAtomQuantity<double> * atomProcGhostCoarseGrainingPositions_;
PerAtomQuantity<double> * atomReferencePositions_;
/** number of unique FE nodes */
int nNodes_;
/** Number of Spatial Dimensions */
int nsd_;
+
#ifdef EXTENDED_ERROR_CHECKING
/** data for handling atoms crossing processors */
bool atomSwitch_;
#endif
+
/** reference position of the atoms */
double ** xref_;
bool readXref_;
bool needXrefProcessorGhosts_;
- string xRefFile_;
+ std::string xRefFile_;
/** flag for tracking displacements or not, depending on physics */
bool trackDisplacement_;
/** map from reference positions to element id, pointer is to internal only */
bool needsAtomToElementMap_;
PerAtomQuantity<int> * atomElement_;
PerAtomQuantity<int> * atomGhostElement_;
+
+ /* use element sets to define internal and/or ghost regions */
+ std::string internalElementSet_;
/** atomic ATC material tag */
double Xprd_,Yprd_,Zprd_; // lengths of periodic box in reference frame
double XY_,YZ_,XZ_;
double boxXlo_,boxXhi_; // lo/hi bounds of periodic box in reference frame
double boxYlo_,boxYhi_; // lo/hi bounds of periodic box in reference frame
double boxZlo_,boxZhi_; // lo/hi bounds of periodic box in reference frame
// next data members are for consistency with existing ATC_Transfer, but are redundant and do not
// conform to naming standards, and should be accessible through the mesh
/** periodicity flags and lengths */
int periodicity[3];
double box_bounds[2][3];
double box_length[3];
/** pointers to needed atom quantities and transfers */
FundamentalAtomQuantity * atomMasses_;
FundamentalAtomQuantity * atomPositions_;
FundamentalAtomQuantity * atomVelocities_;
FundamentalAtomQuantity * atomForces_;
//---------------------------------------------------------------
/** \name output data */
//---------------------------------------------------------------
/*@{*/
//private:
bool parallelConsistency_;
/** base name for output files */
- string outputPrefix_;
+ std::string outputPrefix_;
/** output flag */
bool outputNow_;
/** output time or step (for lammps compatibility) */
bool outputTime_;
/** output frequency */
int outputFrequency_;
/** sample frequency */
int sampleFrequency_;
/** sample counter */
int sampleCounter_;
TAG_FIELDS filteredData_;
double peScale_,keScale_;
//protected:
/*@}*/
//---------------------------------------------------------------
/** \name member data related to compute_scalar() and compute_vector() */
//---------------------------------------------------------------
/*@{*/
int scalarFlag_; // 0/1 if compute_scalar() function exists
int vectorFlag_; // 0/1 if compute_vector() function exists
int sizeVector_; // N = size of global vector
int scalarVectorFreq_; // frequency compute s/v data is available at
int sizePerAtomCols_; // N = size of per atom vector to dump
double **perAtomOutput_; // per atom data
double **&perAtomArray_; // per atom data
int extScalar_; // 0/1 if scalar is intensive/extensive
int extVector_; // 0/1/-1 if vector is all int/ext/extlist
int *extList_; // list of 0/1 int/ext for each vec component
int thermoEnergyFlag_; // 0/1 if fix adds to overall energy
/*@}*/
//---------------------------------------------------------------
/** \name fields and necessary data for FEM */
//---------------------------------------------------------------
/*@{*/
- map<FieldName,int> fieldSizes_;
+ std::map<FieldName,int> fieldSizes_;
FIELDS fields_;
/*@}*/
//---------------------------------------------------------------
/** \name time integration and filtering fields */
//---------------------------------------------------------------
/*@{*/
FIELDS dot_fields_;
FIELDS ddot_fields_;
FIELDS dddot_fields_;
/** Restricted Fields */
FIELDS nodalAtomicFields_; // replaces fieldNdFiltered_
FIELDS nodalAtomicFieldsRoc_;
/*@}*/
//---------------------------------------------------------------
/** \name quadrature weights */
//---------------------------------------------------------------
/*@{*/
DIAG_MAT NodeVolumes_;
DIAG_MAN invNodeVolumes_;
/** atomic quadrature integration weights (V_\alpha) */
ProtectedAtomDiagonalMatrix<double> * atomVolume_;
- string atomicWeightsFile_;
+ std::string atomicWeightsFile_;
bool atomicWeightsWriteFlag_;
int atomicWeightsWriteFrequency_;
double atomicVolume_; // global atomic volume for homogeneous set of atoms
- map<int,double> Valpha_;
+ std::map<int,double> Valpha_;
AtomicWeightType atomWeightType_;
/*@}*/
//---------------------------------------------------------------
/** \name domain decomposition */
//---------------------------------------------------------------
/*@{*/
DomainDecompositionType domainDecomposition_;
/*@}*/
//---------------------------------------------------------------
/** \name atom data */
//---------------------------------------------------------------
/*@{*/
/** bitwise comparisons for boundary (ghost) atoms */
int groupbit_;
int groupbitGhost_;
bool needProcGhost_;
- string groupTag_;
- string groupTagGhost_;
+ std::string groupTag_;
+ std::string groupTagGhost_;
/** number of atoms of correct type,
ghosts are atoms outside our domain of interest
boundary are atoms contributing to boundary flux terms */
/** Number of "internal" atoms on this processor */
int nLocal_;
/** Number of atoms on this processor */
int nLocalTotal_;
int nLocalGhost_;
- int nInternal_;
- int nGhost_;
Array<int> internalToAtom_;
std::map<int,int> atomToInternal_;
Array<int> ghostToAtom_;
/*@}*/
//----------------------------------------------------------------
/** \name maps and masks */
//----------------------------------------------------------------
/*@{*/
AtomToElementMapType atomToElementMapType_;
int atomToElementMapFrequency_;
int regionID_;
/*@}*/
//----------------------------------------------------------------
/** \name shape function matrices */
//----------------------------------------------------------------
/*@{*/
// sparse matrix where columns correspond to global node numbering
SPAR_MAN * shpFcn_;
VectorDependencyManager<SPAR_MAT * > * shpFcnDerivs_;
- SPAR_MAN * shpFcnGhost_;
- VectorDependencyManager<SPAR_MAT * > * shpFcnDerivsGhost_;
- /** map from species string tag to the species density */
- map<string,DENS_MAN> taggedDensMan_;
+ /** map from species std::string tag to the species density */
+ std::map<std::string,DENS_MAN> taggedDensMan_;
/** weighted shape function matrices at overlap nodes
for use with thermostats */
SPAR_MAN NhatOverlap_;
/*@}*/
//----------------------------------------------------------------
/** \name accumulant matrices */
//----------------------------------------------------------------
/*@{*/
/** compute kernel shape functions on-the-fly w/o storing N_Ia */
bool mdMassNormalization_;
bool kernelBased_;
bool kernelOnTheFly_;
class KernelFunction * kernelFunction_;
bool bondOnTheFly_;
SPAR_MAN* accumulant_;
SPAR_MAN* accumulantMol_; // KKM add
SPAR_MAN* accumulantMolGrad_; // KKM add
SPAR_MAN kernelAccumulantMol_; // KKM add
SPAR_MAN kernelAccumulantMolGrad_; // KKM add
DIAG_MAN* accumulantWeights_;
DIAG_MAN* accumulantInverseVolumes_;
+ int accumulantBandwidth_;
/*@}*/
//---------------------------------------------------------------
/** \name restart procedures */
//---------------------------------------------------------------
bool useRestart_;
- string restartFileName_;
+ std::string restartFileName_;
//---------------------------------------------------------------
/** \name data specific to node/faceset for global output */
//---------------------------------------------------------------
/** group computes : type, group_id -> value */
- map< pair < string, FieldName > , NodesetOperationType> nsetData_;
- map < pair<string,string>, FacesetIntegralType > fsetData_;
- map < pair<string, FieldName>,ElementsetOperationType > esetData_;
+ std::map< std::pair<std::string, FieldName > , NodesetOperationType> nsetData_;
+ std::map< std::pair<std::string,std::string>, FacesetIntegralType > fsetData_;
+ std::map< std::pair<std::string, FieldName>,ElementsetOperationType > esetData_;
//---------------------------------------------------------------
/** \name reference data */
//---------------------------------------------------------------
bool hasRefPE_;
bool setRefPE_;
bool setRefPEvalue_;
double refPEvalue_;
bool readRefPE_;
- string nodalRefPEfile_;
- DENS_MAT nodalRefPotentialEnergy_;
+ std::string nodalRefPEfile_;
+ DENS_MAN* nodalRefPotentialEnergy_;
void set_reference_potential_energy(void);
private: /** data */
/** current time in simulation */
double simTime_;
/** step counter */
int stepCounter_;
};
};
#endif
diff --git a/lib/atc/ATC_Transfer.cpp b/lib/atc/ATC_Transfer.cpp
index 01e9f9066..0e47d5fc1 100644
--- a/lib/atc/ATC_Transfer.cpp
+++ b/lib/atc/ATC_Transfer.cpp
@@ -1,2064 +1,2009 @@
// ATC_Transfer headers
#include "ATC_Transfer.h"
#include "ATC_Error.h"
#include "FE_Engine.h"
#include "LammpsInterface.h"
#include "Quadrature.h"
#include "VoigtOperations.h"
#include "TransferLibrary.h"
#include "Stress.h"
#include "KernelFunction.h"
#include "PerPairQuantity.h"
#include "FieldManager.h"
#define ESHELBY_VIRIAL
#include "LinearSolver.h"
// Other Headers
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <fstream>
#include <sstream>
#include <exception>
// PLAN:
//* energies
//* filters - make filterFields class
//* output directly
//* enum, tagged, computes, mat(field to field) functions
//* grads & rates
//* on-the-fly
// * remove derived classes
using namespace std;
using namespace ATC_Utility;
using namespace voigt3;
-//using ATC_Utility::to_string;
-//using voigt3::vector_to_matrix;
-//using voigt3::vector_to_symm_matrix;
-//using voigt3::matrix_to_vector;
-//using voigt3::symm_matrix_to_vector;
namespace ATC {
- const int numFields_ = 16;
+ const int numFields_ = 17;
FieldName indices_[numFields_] = {
CHARGE_DENSITY,
MASS_DENSITY,
SPECIES_CONCENTRATION,
NUMBER_DENSITY,
MOMENTUM,
VELOCITY,
PROJECTED_VELOCITY,
DISPLACEMENT,
POTENTIAL_ENERGY,
KINETIC_ENERGY,
KINETIC_TEMPERATURE,
TEMPERATURE,
CHARGE_FLUX,
SPECIES_FLUX,
- THERMAL_ENERGY};
+ THERMAL_ENERGY,
+ ENERGY,
+ INTERNAL_ENERGY
+ };
+ //KINETIC_STRESS;
//ELECTRIC_POTENTIAL};
ATC_Transfer::ATC_Transfer(string groupName,
double ** & perAtomArray,
LAMMPS_NS::Fix * thisFix,
string matParamFile)
: ATC_Method(groupName,perAtomArray,thisFix),
xPointer_(NULL),
outputStepZero_(true),
neighborReset_(false),
pairMap_(NULL),
bondMatrix_(NULL),
pairVirial_(NULL),
pairHeatFlux_(NULL),
nComputes_(0),
hasPairs_(true),
hasBonds_(false),
resetKernelFunction_(false),
dxaExactMode_(true),
cauchyBornStress_(NULL)
{
nTypes_ = lammpsInterface_->ntypes();
peScale_=1.;
keScale_= lammpsInterface_->mvv2e();
// if surrogate model of md (no physics model created)
if (matParamFile != "none") {
fstream fileId(matParamFile.c_str(), std::ios::in);
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
CbData cb;
LammpsInterface *lmp = LammpsInterface::instance();
lmp->lattice(cb.cell_vectors, cb.basis_vectors);
cb.inv_atom_volume = 1.0 / lmp->volume_per_atom();
cb.e2mvv = 1.0 / lmp->mvv2e();
cb.atom_mass = lmp->atom_mass(1);
cb.boltzmann = lmp->boltz();
cb.hbar = lmp->hbar();
cauchyBornStress_ = new StressCauchyBorn(fileId, cb);
}
// Defaults
set_time();
outputFlags_.reset(NUM_TOTAL_FIELDS);
outputFlags_ = false;
fieldFlags_.reset(NUM_TOTAL_FIELDS);
fieldFlags_ = false;
gradFlags_.reset(NUM_TOTAL_FIELDS);
gradFlags_ = false;
rateFlags_.reset(NUM_TOTAL_FIELDS);
rateFlags_ = false;
outputFields_.resize(NUM_TOTAL_FIELDS);
for (int i = 0; i < NUM_TOTAL_FIELDS; i++) { outputFields_[i] = NULL; }
// Hardy requires ref positions for processor ghosts for bond list
//needXrefProcessorGhosts_ = true;
}
//-------------------------------------------------------------------
ATC_Transfer::~ATC_Transfer()
{
interscaleManager_.clear();
if (cauchyBornStress_) delete cauchyBornStress_;
}
//-------------------------------------------------------------------
// called before the beginning of a "run"
void ATC_Transfer::initialize()
{
+ if (kernelOnTheFly_ && !readRefPE_ && !setRefPEvalue_) {
+ if (setRefPE_) {
+ stringstream ss;
+ ss << "WARNING: Reference PE requested from atoms, but not yet implemented for on-the-fly, ignoring";
+ lammpsInterface_->print_msg_once(ss.str());
+ setRefPE_ = false;
+ }
+ }
+
ATC_Method::initialize();
if (!initialized_) {
if (cauchyBornStress_) cauchyBornStress_->initialize();
}
if (!initialized_ || ATC::LammpsInterface::instance()->atoms_sorted() || resetKernelFunction_) {
// initialize kernel funciton matrix N_Ia
if (! kernelOnTheFly_) {
try{
if (!moleculeIds_.empty()) compute_kernel_matrix_molecule(); //KKM add
}
catch(bad_alloc&) {
ATC::LammpsInterface::instance()->print_msg("kernel will be computed on-the-fly");
kernelOnTheFly_ = true;
}
}
resetKernelFunction_ = false;
}
+ // clears need for reset
+ ghostManager_.initialize();
// initialize bond matrix B_Iab
if ((! bondOnTheFly_)
&& ( ( fieldFlags_(STRESS)
|| fieldFlags_(ESHELBY_STRESS)
|| fieldFlags_(HEAT_FLUX) ) ) ) {
try {
compute_bond_matrix();
}
catch(bad_alloc&) {
ATC::LammpsInterface::instance()->print_msg("stress/heat_flux will be computed on-the-fly");
bondOnTheFly_ = true;
}
}
// set sample frequency to output if sample has not be specified
if (sampleFrequency_ == 0) sampleFrequency_ = outputFrequency_;
// output for step 0
if (!initialized_) {
if (outputFrequency_ > 0) {
// initialize filtered data
compute_fields();
for(int index=0; index < NUM_TOTAL_FIELDS; ++index) {
if(fieldFlags_(index)) {
string name = field_to_string((FieldName) index);
filteredData_[name] = hardyData_[name];
timeFilters_(index)->initialize(filteredData_[name].quantity());
}
if (rateFlags_(index)) {
string name = field_to_string((FieldName) index);
string rate_field = name + "_rate";
filteredData_[rate_field] = hardyData_[rate_field];
}
if (gradFlags_(index)) {
string name = field_to_string((FieldName) index);
string grad_field = name + "_gradient";
filteredData_[grad_field] = hardyData_[grad_field];
}
}
int index = NUM_TOTAL_FIELDS;
map <string,int>::const_iterator iter;
for (iter = computes_.begin(); iter != computes_.end(); iter++) {
string tag = iter->first;
filteredData_[tag] = hardyData_[tag];
timeFilters_(index)->initialize(filteredData_[tag].quantity());
#ifdef ESHELBY_VIRIAL
if (tag == "virial" && fieldFlags_(ESHELBY_STRESS)) {
filteredData_["eshelby_virial"] = hardyData_["eshelby_virial"];
}
#endif
index++;
}
output();
}
}
initialized_ = true;
lammpsInterface_->computes_addstep(lammpsInterface_->ntimestep()+sampleFrequency_);
//remap_ghost_ref_positions();
update_peratom_output();
}
//-------------------------------------------------------------------
void ATC_Transfer::set_continuum_data()
{
ATC_Method::set_continuum_data();
if (!initialized_) {
nNodesGlobal_ = feEngine_->fe_mesh()->num_nodes();
}
}
//-------------------------------------------------------------------
void ATC_Transfer::construct_time_integration_data()
{
if (!initialized_) {
- // ground state for PE
- nodalRefPotentialEnergy_.reset(nNodes_,1);
// size arrays for requested/required fields
for(int index=0; index < NUM_TOTAL_FIELDS; ++index) {
if (fieldFlags_(index)) {
int size = FieldSizes[index];
if (atomToElementMapType_ == EULERIAN) {
if (index == STRESS) size=6;
if (index == CAUCHY_BORN_STRESS) size=6;
}
if (size == 0) {
if (index == SPECIES_CONCENTRATION) size=typeList_.size()+groupList_.size();
}
string name = field_to_string((FieldName) index);
hardyData_ [name].reset(nNodes_,size);
filteredData_[name].reset(nNodes_,size);
}
}
// size arrays for projected compute fields
map <string,int>::const_iterator iter;
for (iter = computes_.begin(); iter != computes_.end(); iter++) {
string tag = iter->first;
COMPUTE_POINTER cmpt = lammpsInterface_->compute_pointer(tag);
int ncols = lammpsInterface_->compute_ncols_peratom(cmpt);
hardyData_ [tag].reset(nNodes_,ncols);
filteredData_[tag].reset(nNodes_,ncols);
#ifdef ESHELBY_VIRIAL
if (tag == "virial" && fieldFlags_(ESHELBY_STRESS)) {
string esh = "eshelby_virial";
int size = FieldSizes[ESHELBY_STRESS];
hardyData_ [esh].reset(nNodes_,size);
filteredData_[esh].reset(nNodes_,size);
}
#endif
}
}
}
//--------------------------------------------------------
// set_computational_geometry
// constructs needed transfer operators which define
// hybrid atom/FE computational geometry
//--------------------------------------------------------
void ATC_Transfer::set_computational_geometry()
{
ATC_Method::set_computational_geometry();
}
//-------------------------------------------------------------------
- // constructs quantities
- void ATC_Transfer::construct_transfers()
+ // construct_interpolant
+ // constructs: interpolatn, accumulant, weights, and spatial derivatives
+ //--------------------------------------------------------
+ void ATC_Transfer::construct_interpolant()
{
-
- // set pointer to positions
- // REFACTOR use method's handling of xref/xpointer
- set_xPointer();
-
- ATC_Method::construct_transfers();
-
+ // interpolant
if (!(kernelOnTheFly_)) {
// finite element shape functions for interpolants
PerAtomShapeFunction * atomShapeFunctions = new PerAtomShapeFunction(this);
interscaleManager_.add_per_atom_sparse_matrix(atomShapeFunctions,"Interpolant");
shpFcn_ = atomShapeFunctions;
}
-
+ // accummulant and weights
this->create_atom_volume();
-
// accumulants
if (kernelFunction_) {
// kernel-based accumulants
if (kernelOnTheFly_) {
ConstantQuantity<double> * atomCount = new ConstantQuantity<double>(this,1.);
interscaleManager_.add_per_atom_quantity(atomCount,"AtomCount");
OnTheFlyKernelAccumulation * myWeights
= new OnTheFlyKernelAccumulation(this,
atomCount, kernelFunction_, atomCoarseGrainingPositions_);
interscaleManager_.add_dense_matrix(myWeights,
"KernelInverseWeights");
accumulantWeights_ = new OnTheFlyKernelWeights(myWeights);
}
else {
PerAtomKernelFunction * atomKernelFunctions = new PerAtomKernelFunction(this);
interscaleManager_.add_per_atom_sparse_matrix(atomKernelFunctions,
"Accumulant");
accumulant_ = atomKernelFunctions;
accumulantWeights_ = new AccumulantWeights(accumulant_);
}
accumulantInverseVolumes_ = new KernelInverseVolumes(this,kernelFunction_);
interscaleManager_.add_diagonal_matrix(accumulantInverseVolumes_,
"AccumulantInverseVolumes");
interscaleManager_.add_diagonal_matrix(accumulantWeights_,
"AccumulantWeights");
}
else {
// mesh-based accumulants
if (kernelOnTheFly_) {
ConstantQuantity<double> * atomCount = new ConstantQuantity<double>(this,1.);
interscaleManager_.add_per_atom_quantity(atomCount,"AtomCount");
OnTheFlyMeshAccumulation * myWeights
= new OnTheFlyMeshAccumulation(this,
atomCount, atomCoarseGrainingPositions_);
interscaleManager_.add_dense_matrix(myWeights,
"KernelInverseWeights");
accumulantWeights_ = new OnTheFlyKernelWeights(myWeights);
} else {
accumulant_ = shpFcn_;
accumulantWeights_ = new AccumulantWeights(accumulant_);
interscaleManager_.add_diagonal_matrix(accumulantWeights_,
"AccumulantWeights");
}
}
+ // gradient matrix
+ if (gradFlags_.has_member(true)) {
+ NativeShapeFunctionGradient * gradientMatrix = new NativeShapeFunctionGradient(this);
+ interscaleManager_.add_vector_sparse_matrix(gradientMatrix,"GradientMatrix");
+ gradientMatrix_ = gradientMatrix;
+ }
+ }
+ //-------------------------------------------------------------------
+ void ATC_Transfer::construct_molecule_transfers()
+ {
+ // molecule centroid, molecule charge, dipole moment and quadrupole moment calculations KKM add
+ if (!moleculeIds_.empty()) {
+ map<string,pair<MolSize,int> >::const_iterator molecule;
+ InterscaleManager & interscaleManager = this->interscale_manager(); // KKM add, may be we do not need this as interscaleManager_ already exists.
+ PerAtomQuantity<double> * atomProcGhostCoarseGrainingPositions_ = interscaleManager.per_atom_quantity("AtomicProcGhostCoarseGrainingPositions");
+ FundamentalAtomQuantity * mass = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,PROC_GHOST);
+ molecule = moleculeIds_.begin();
+ int groupbit = (molecule->second).second;
+ smallMoleculeSet_ = new SmallMoleculeSet(this,groupbit);
+ smallMoleculeSet_->initialize(); // KKM add, why should we?
+ interscaleManager_.add_small_molecule_set(smallMoleculeSet_,"MoleculeSet");
+ moleculeCentroid_ = new SmallMoleculeCentroid(this,mass,smallMoleculeSet_,atomProcGhostCoarseGrainingPositions_);
+ interscaleManager_.add_dense_matrix(moleculeCentroid_,"MoleculeCentroid");
+ AtomToSmallMoleculeTransfer<double> * moleculeMass =
+ new AtomToSmallMoleculeTransfer<double>(this,mass,smallMoleculeSet_);
+ interscaleManager_.add_dense_matrix(moleculeMass,"MoleculeMass");
+ FundamentalAtomQuantity * atomicCharge = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE,PROC_GHOST);
+ AtomToSmallMoleculeTransfer<double> * moleculeCharge =
+ new AtomToSmallMoleculeTransfer<double>(this,atomicCharge,smallMoleculeSet_);
+ interscaleManager_.add_dense_matrix(moleculeCharge,"MoleculeCharge");
+ dipoleMoment_ = new SmallMoleculeDipoleMoment(this,atomicCharge,smallMoleculeSet_,atomProcGhostCoarseGrainingPositions_,moleculeCentroid_);
+ interscaleManager_.add_dense_matrix(dipoleMoment_,"DipoleMoment");
+ quadrupoleMoment_ = new SmallMoleculeQuadrupoleMoment(this,atomicCharge,smallMoleculeSet_,atomProcGhostCoarseGrainingPositions_,moleculeCentroid_);
+ interscaleManager_.add_dense_matrix(quadrupoleMoment_,"QuadrupoleMoment");
+ }
+ }
+ //----------------------------------------------------------------------
+ // constructs quantities
+ void ATC_Transfer::construct_transfers()
+ {
+
+ // set pointer to positions
+ // REFACTOR use method's handling of xref/xpointer
+ set_xPointer();
+
+ ATC_Method::construct_transfers();
+
+ // reference potential energy
+ if (setRefPE_) {
+ if (!setRefPEvalue_ && !readRefPE_) {
+ FieldManager fmgr(this);
+ nodalRefPotentialEnergy_ = fmgr.nodal_atomic_field(REFERENCE_POTENTIAL_ENERGY);
+ }
+ else {
+ nodalRefPotentialEnergy_ = new DENS_MAN(nNodes_,1);
+ nodalRefPotentialEnergy_->set_memory_type(PERSISTENT);
+ interscaleManager_.add_dense_matrix(nodalRefPotentialEnergy_,
+ field_to_string(REFERENCE_POTENTIAL_ENERGY));
+ }
+ }
+ // for hardy-based fluxes
bool needsBondMatrix = (! bondOnTheFly_ ) &&
(fieldFlags_(STRESS)
|| fieldFlags_(ESHELBY_STRESS)
|| fieldFlags_(HEAT_FLUX));
if (needsBondMatrix) {
if (hasPairs_ && hasBonds_) {
pairMap_ = new PairMapBoth(lammpsInterface_,groupbit_);
}
else if (hasBonds_) {
pairMap_ = new PairMapBond(lammpsInterface_,groupbit_);
}
else if (hasPairs_) {
pairMap_ = new PairMapNeighbor(lammpsInterface_,groupbit_);
}
}
if (pairMap_) interscaleManager_.add_pair_map(pairMap_,"PairMap");
- //if (pairMap_ && !initialized_) interscaleManager_.add_pair_map(pairMap_,"PairMap");
-
- //const PerAtomQuantity<double> * x0= interscaleManager_.per_atom_quantity("AtomicReferencePositions");
- //const PerAtomQuantity<double> * x0= interscaleManager_.per_atom_quantity("AtomicCoarseGrainingPositions");
- //const PerAtomQuantity<double> * x0= interscaleManager_.per_atom_quantity("AtomicReferencePositions");
-
if ( fieldFlags_(STRESS) || fieldFlags_(ESHELBY_STRESS) || fieldFlags_(HEAT_FLUX) ) {
const FE_Mesh * fe_mesh = feEngine_->fe_mesh();
if (!kernelBased_) {
bondMatrix_ = new BondMatrixPartitionOfUnity(lammpsInterface_,*pairMap_,xPointer_,fe_mesh,accumulantInverseVolumes_);
}
else {
bondMatrix_ = new BondMatrixKernel(lammpsInterface_,*pairMap_,xPointer_,fe_mesh,kernelFunction_);
}
}
if (bondMatrix_) interscaleManager_.add_sparse_matrix(bondMatrix_,"BondMatrix");
if ( fieldFlags_(STRESS) || fieldFlags_(ESHELBY_STRESS) ) {
if (atomToElementMapType_ == LAGRANGIAN) {
-// pairVirial_ = new PairVirialLagrangian(lammpsInterface_,*pairMap_,x0);
pairVirial_ = new PairVirialLagrangian(lammpsInterface_,*pairMap_,xref_);
}
else if (atomToElementMapType_ == EULERIAN) {
pairVirial_ = new PairVirialEulerian(lammpsInterface_,*pairMap_);
}
else {
throw ATC_Error("no atom to element map specified");
}
}
if (pairVirial_) interscaleManager_.add_dense_matrix(pairVirial_,"PairVirial");
if ( fieldFlags_(HEAT_FLUX) ) {
if (atomToElementMapType_ == LAGRANGIAN) {
pairHeatFlux_ = new PairPotentialHeatFluxLagrangian(lammpsInterface_,*pairMap_,xref_);
}
else if (atomToElementMapType_ == EULERIAN) {
pairHeatFlux_ = new PairPotentialHeatFluxEulerian(lammpsInterface_,*pairMap_);
}
else {
throw ATC_Error("no atom to element map specified");
}
}
if (pairHeatFlux_) interscaleManager_.add_dense_matrix(pairHeatFlux_,"PairHeatFlux");
- // gradient matrix
- if (gradFlags_.has_member(true)) {
- NativeShapeFunctionGradient * gradientMatrix = new NativeShapeFunctionGradient(this);
- interscaleManager_.add_vector_sparse_matrix(gradientMatrix,"GradientMatrix");
- gradientMatrix_ = gradientMatrix;
- }
-
- // molecule centroid, molecule charge, dipole moment and quadrupole moment calculations KKM add
- if (!moleculeIds_.empty()) {
- map<string,pair<MolSize,int> >::const_iterator molecule;
- InterscaleManager & interscaleManager = this->interscale_manager(); // KKM add, may be we do not need this as interscaleManager_ already exists.
- PerAtomQuantity<double> * atomProcGhostCoarseGrainingPositions_ = interscaleManager.per_atom_quantity("AtomicProcGhostCoarseGrainingPositions");
- FundamentalAtomQuantity * mass = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,PROC_GHOST);
- molecule = moleculeIds_.begin();
- int groupbit = (molecule->second).second;
- smallMoleculeSet_ = new SmallMoleculeSet(this,groupbit);
- smallMoleculeSet_->initialize(); // KKM add, why should we?
- interscaleManager_.add_small_molecule_set(smallMoleculeSet_,"MoleculeSet");
- moleculeCentroid_ = new SmallMoleculeCentroid(this,mass,smallMoleculeSet_,atomProcGhostCoarseGrainingPositions_);
- interscaleManager_.add_dense_matrix(moleculeCentroid_,"MoleculeCentroid");
- AtomToSmallMoleculeTransfer<double> * moleculeMass =
- new AtomToSmallMoleculeTransfer<double>(this,mass,smallMoleculeSet_);
- interscaleManager_.add_dense_matrix(moleculeMass,"MoleculeMass");
- FundamentalAtomQuantity * atomicCharge = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE,PROC_GHOST);
- AtomToSmallMoleculeTransfer<double> * moleculeCharge =
- new AtomToSmallMoleculeTransfer<double>(this,atomicCharge,smallMoleculeSet_);
- interscaleManager_.add_dense_matrix(moleculeCharge,"MoleculeCharge");
- dipoleMoment_ = new SmallMoleculeDipoleMoment(this,atomicCharge,smallMoleculeSet_,atomProcGhostCoarseGrainingPositions_,moleculeCentroid_);
- interscaleManager_.add_dense_matrix(dipoleMoment_,"DipoleMoment");
- quadrupoleMoment_ = new SmallMoleculeQuadrupoleMoment(this,atomicCharge,smallMoleculeSet_,atomProcGhostCoarseGrainingPositions_,moleculeCentroid_);
- interscaleManager_.add_dense_matrix(quadrupoleMoment_,"QuadrupoleMoment");
- }
-
FieldManager fmgr(this);
// for(int index=0; index < NUM_TOTAL_FIELDS; ++index)
for(int i=0; i < numFields_; ++i) {
FieldName index = indices_[i];
if (fieldFlags_(index)) {
outputFields_[index] = fmgr.nodal_atomic_field(index);
}
}
-// WIP REJ
+// WIP REJ - move to fmgr
if (fieldFlags_(ELECTRIC_POTENTIAL)) {
- restrictedCharge_ = fmgr.restricted_atom_quantity(CHARGE_DENSITY);
+ PerAtomQuantity<double> * atomCharge = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE);
+ restrictedCharge_ = fmgr.restricted_atom_quantity(CHARGE_DENSITY,"default",atomCharge);
}
// computes
map <string,int>::const_iterator iter;
for (iter = computes_.begin(); iter != computes_.end(); iter++) {
string tag = iter->first;
ComputedAtomQuantity * c = new ComputedAtomQuantity(this, tag);
interscaleManager_.add_per_atom_quantity(c,tag);
int projection = iter->second;
DIAG_MAN * w = NULL;
if (projection == VOLUME_NORMALIZATION )
{ w = accumulantInverseVolumes_; }
else if (projection == NUMBER_NORMALIZATION )
{ w = accumulantWeights_; }
if (kernelFunction_ && kernelOnTheFly_) {
OnTheFlyKernelAccumulationNormalized * C = new OnTheFlyKernelAccumulationNormalized(this, c, kernelFunction_, atomCoarseGrainingPositions_, w);
interscaleManager_.add_dense_matrix(C,tag);
outputFieldsTagged_[tag] = C;
}
else {
AtfProjection * C = new AtfProjection(this, c, accumulant_, w);
interscaleManager_.add_dense_matrix(C,tag);
outputFieldsTagged_[tag] = C;
}
}
}
//-------------------------------------------------------------------
// sets initial values of filtered quantities
void ATC_Transfer::construct_methods()
{
+ ATC_Method::construct_methods();
+
if ((!initialized_) || timeFilterManager_.need_reset()) {
timeFilters_.reset(NUM_TOTAL_FIELDS+nComputes_);
sampleCounter_ = 0;
// for filtered fields
for(int index=0; index < NUM_TOTAL_FIELDS; ++index) {
if (fieldFlags_(index)) {
string name = field_to_string((FieldName) index);
filteredData_[name] = 0.0;
timeFilters_(index) = timeFilterManager_.construct();
}
}
// for filtered projected computes
// lists/accessing of fields ( & computes)
map <string,int>::const_iterator iter;
int index = NUM_TOTAL_FIELDS;
for (iter = computes_.begin(); iter != computes_.end(); iter++) {
string tag = iter->first;
filteredData_[tag] = 0.0;
timeFilters_(index) = timeFilterManager_.construct();
index++;
}
}
}
//-------------------------------------------------------------------
// called after the end of a "run"
void ATC_Transfer::finish()
{
// base class
ATC_Method::finish();
}
//-------------------------------------------------------------------
// this is the parser
bool ATC_Transfer::modify(int narg, char **arg)
{
bool match = false;
int argIdx = 0;
// check to see if it is a transfer class command
/*! \page man_hardy_fields fix_modify AtC fields
\section syntax
fix_modify AtC fields <all | none> \n
fix_modify AtC fields <add | delete> <list_of_fields> \n
- all | none (keyword) = output all or no fields \n
- add | delete (keyword) = add or delete the listed output fields \n
- fields (keyword) = \n
density : mass per unit volume \n
displacement : displacement vector \n
momentum : momentum per unit volume \n
velocity : defined by momentum divided by density \n
projected_velocity : simple kernel estimation of atomic velocities \n
temperature : temperature derived from the relative atomic kinetic energy (as done by ) \n
kinetic_temperature : temperature derived from the full kinetic energy \n
number_density : simple kernel estimation of number of atoms per unit volume \n
stress :
Cauchy stress tensor for eulerian analysis (atom_element_map), or
1st Piola-Kirchhoff stress tensor for lagrangian analysis \n
transformed_stress :
1st Piola-Kirchhoff stress tensor for eulerian analysis (atom_element_map), or
Cauchy stress tensor for lagrangian analysis \n
heat_flux : spatial heat flux vector for eulerian,
or referential heat flux vector for lagrangian \n
potential_energy : potential energy per unit volume \n
kinetic_energy : kinetic energy per unit volume \n
thermal_energy : thermal energy (kinetic energy - continuum kinetic energy) per unit volume \n
internal_energy : total internal energy (potential + thermal) per unit volume \n
energy : total energy (potential + kinetic) per unit volume \n
number_density : number of atoms per unit volume \n
eshelby_stress: configurational stress (energy-momentum) tensor defined by Eshelby
[References: Philos. Trans. Royal Soc. London A, Math. Phys. Sci., Vol. 244,
No. 877 (1951) pp. 87-112; J. Elasticity, Vol. 5, Nos. 3-4 (1975) pp. 321-335] \n
vacancy_concentration: volume fraction of vacancy content \n
type_concentration: volume fraction of a specific atom type \n
\section examples
<TT> fix_modify AtC fields add velocity temperature </TT>
\section description
Allows modification of the fields calculated and output by the
transfer class. The commands are cumulative, e.g.\n
<TT> fix_modify AtC fields none </TT> \n
followed by \n
<TT> fix_modify AtC fields add velocity temperature </TT> \n
will only output the velocity and temperature fields.
\section restrictions
Must be used with the hardy/field type of AtC fix, see \ref man_fix_atc.
Currently, the stress and heat flux formulas are only correct for
central force potentials, e.g. Lennard-Jones and EAM
but not Stillinger-Weber.
\section related
See \ref man_hardy_gradients , \ref man_hardy_rates and \ref man_hardy_computes
\section default
By default, no fields are output
*/
if (strcmp(arg[argIdx],"fields")==0) {
argIdx++;
if (strcmp(arg[argIdx],"all")==0) {
outputFlags_ = true;
match = true;
}
else if (strcmp(arg[argIdx],"none")==0) {
outputFlags_ = false;
match = true;
}
else if (strcmp(arg[argIdx],"add")==0) {
argIdx++;
for (int i = argIdx; i < narg; ++i) {
FieldName field_name = string_to_field(arg[i]);
outputFlags_(field_name) = true;
}
match = true;
}
else if (strcmp(arg[argIdx],"delete")==0) {
argIdx++;
for (int i = argIdx; i < narg; ++i) {
FieldName field_name = string_to_field(arg[i]);
outputFlags_(field_name) = false;
}
match = true;
}
check_field_dependencies();
if (fieldFlags_(DISPLACEMENT)) { trackDisplacement_ = true; }
}
/*! \page man_hardy_gradients fix_modify AtC gradients
\section syntax
fix_modify AtC gradients <add | delete> <list_of_fields> \n
- add | delete (keyword) = add or delete the calculation of gradients for the listed output fields \n
- fields (keyword) = \n
gradients can be calculated for all fields listed in \ref man_hardy_fields
\section examples
<TT> fix_modify AtC gradients add temperature velocity stress </TT> \n
<TT> fix_modify AtC gradients delete velocity </TT> \n
\section description
Requests calculation and ouput of gradients of the fields from the
transfer class. These gradients will be with regard to spatial or material
coordinate for eulerian or lagrangian analysis, respectively, as specified by
atom_element_map (see \ref man_atom_element_map )
\section restrictions
Must be used with the hardy/field type of AtC fix
( see \ref man_fix_atc )
\section related
\section default
No gradients are calculated by default
*/
else if (strcmp(arg[argIdx],"gradients")==0) {
argIdx++;
if (strcmp(arg[argIdx],"add")==0) {
argIdx++;
FieldName field_name;
for (int i = argIdx; i < narg; ++i) {
field_name = string_to_field(arg[i]);
gradFlags_(field_name) = true;
}
match = true;
}
else if (strcmp(arg[argIdx],"delete")==0) {
argIdx++;
FieldName field_name;
for (int i = argIdx; i < narg; ++i) {
field_name = string_to_field(arg[i]);
gradFlags_(field_name) = false;
}
match = true;
}
}
/*! \page man_hardy_rates fix_modify AtC rates
\section syntax
fix_modify AtC rates <add | delete> <list_of_fields> \n
- add | delete (keyword) = add or delete the calculation of rates (time derivatives) for the listed output fields \n
- fields (keyword) = \n
rates can be calculated for all fields listed in \ref man_hardy_fields
\section examples
<TT> fix_modify AtC rates add temperature velocity stress </TT> \n
<TT> fix_modify AtC rates delete stress </TT> \n
\section description
Requests calculation and ouput of rates (time derivatives) of the fields from the
transfer class. For eulerian analysis (see \ref man_atom_element_map ), these rates
are the partial time derivatives of the nodal fields, not the full (material) time
derivatives. \n
\section restrictions
Must be used with the hardy/field type of AtC fix
( see \ref man_fix_atc )
\section related
\section default
No rates are calculated by default
*/
else if (strcmp(arg[argIdx],"rates")==0) {
argIdx++;
if (strcmp(arg[argIdx],"add")==0) {
argIdx++;
FieldName field_name;
for (int i = argIdx; i < narg; ++i) {
field_name = string_to_field(arg[i]);
rateFlags_(field_name) = true;
}
match = true;
}
else if (strcmp(arg[argIdx],"delete")==0) {
argIdx++;
FieldName field_name;
for (int i = argIdx; i < narg; ++i) {
field_name = string_to_field(arg[i]);
rateFlags_(field_name) = false;
}
match = true;
}
}
- /*! \page man_pair_interactions fix_modify AtC pair_interactions on|off
+ /*! \page man_pair_interactions fix_modify AtC pair_interactions/bond_interactions
\section syntax
- fix_modify AtC pair_interactions on|off \n
- fix_modify AtC bond_interactions on|off \n
+ fix_modify AtC pair_interactions <on|off> \n
+ fix_modify AtC bond_interactions <on|off> \n
\section examples
<TT> fix_modify AtC bond_interactions on </TT> \n
\section description
include bonds and/or pairs in the stress and heat flux computations
\section restrictions
\section related
\section default
pair interactions: on, bond interactions: off
*/
if (strcmp(arg[argIdx],"pair_interactions")==0) { // default true
argIdx++;
if (strcmp(arg[argIdx],"on")==0) { hasPairs_ = true; }
else { hasPairs_ = false;}
match = true;
}
if (strcmp(arg[argIdx],"bond_interactions")==0) { // default false
argIdx++;
if (strcmp(arg[argIdx],"on")==0) { hasBonds_ = true; }
else { hasBonds_ = false;}
match = true;
}
/*! \page man_hardy_computes fix_modify AtC computes
\section syntax
fix_modify AtC computes <add | delete> [per-atom compute id] <volume | number> \n
- add | delete (keyword) = add or delete the calculation of an equivalent continuum field
for the specified per-atom compute as volume or number density quantity \n
- per-atom compute id = name/id for per-atom compute,
fields can be calculated for all per-atom computes available from LAMMPS \n
- volume | number (keyword) = field created is a per-unit-volume quantity
or a per-atom quantity as weighted by kernel functions \n
\section examples
<TT> compute virial all stress/atom </TT> \n
<TT> fix_modify AtC computes add virial volume </TT> \n
<TT> fix_modify AtC computes delete virial </TT> \n
\n
<TT> compute centrosymmetry all centro/atom </TT> \n
<TT> fix_modify AtC computes add centrosymmetry number </TT> \n
\section description
Calculates continuum fields corresponding to specified per-atom computes created by LAMMPS \n
\section restrictions
Must be used with the hardy/field type of AtC fix ( see \ref man_fix_atc ) \n
Per-atom compute must be specified before corresponding continuum field can be requested \n
\section related
See manual page for compute
\section default
No defaults exist for this command
*/
else if (strcmp(arg[argIdx],"computes")==0) {
argIdx++;
if (strcmp(arg[argIdx],"add")==0) {
argIdx++;
string tag(arg[argIdx++]);
int normalization = NO_NORMALIZATION;
if (narg > argIdx) {
if (strcmp(arg[argIdx],"volume")==0) {
normalization = VOLUME_NORMALIZATION;
}
else if (strcmp(arg[argIdx],"number")==0) {
normalization = NUMBER_NORMALIZATION;
}
else if (strcmp(arg[argIdx],"mass")==0) {
normalization = MASS_NORMALIZATION;
throw ATC_Error("mass normalized not implemented");
}
}
computes_[tag] = normalization;
nComputes_++;
match = true;
}
else if (strcmp(arg[argIdx],"delete")==0) {
argIdx++;
string tag(arg[argIdx]);
if (computes_.find(tag) != computes_.end()) {
computes_.erase(tag);
nComputes_--;
}
else {
throw ATC_Error(tag+" compute is not in list");
}
match = true;
}
}
- /*! \page man_hardy_dxa_exact_mode fix_modify AtC dxa_exact_mode
- \section syntax
- fix_modify AtC dxa_exact_mode <optional on | off> \n
- - on | off (keyword) = use "exact"/serial mode for DXA-based
- calculation of dislocation density, or not \n
-
- \section examples
- <TT> fix_modify AtC dxa_exact_mode </TT> \n
- <TT> fix_modify AtC dxa_exact_mode on</TT> \n
- <TT> fix_modify AtC dxa_exact_mode off</TT> \n
- \section description
- Overrides normal "exact"/serial mode for DXA code to extract dislocation segments,
- as opposed to an "inexact" mode that's more efficient for parallel computation of
- large systems. \n
- \section restrictions
- Must be used with the hardy/field type of AtC fix
- ( see \ref man_fix_atc )
- \section related
- \section default
- By default, the DXA "exact"/serial mode is used (i.e. on). \n
- */
- else if (strcmp(arg[argIdx],"dxa_exact_mode")==0) {
- argIdx++;
- dxaExactMode_ = true;
- if (narg > argIdx && strcmp(arg[argIdx],"off")==0) dxaExactMode_ = false;
- match = true;
- }
-
/*! \page man_sample_frequency fix_modify AtC sample_frequency
\section syntax
fix_modify AtC sample_frequency [freq]
- freq (int) : frequency to sample field in number of steps
\section examples
<TT> fix_modify AtC sample_frequency 10
\section description
- Calculates a surface integral of the given field dotted with the
- outward normal of the faces and puts output in the "GLOBALS" file
+ Specifies a frequency at which fields are computed for the case
+ where time filters are being applied.
\section restrictions
Must be used with the hardy/field AtC fix ( see \ref man_fix_atc )
and is only relevant when time filters are being used.
\section related
\section default
none
*/
else if (strcmp(arg[argIdx],"sample_frequency")==0) {
argIdx++;
int value = outputFrequency_; // default to output frequency
if (narg > 1) {
if (atoi(arg[argIdx]) > 0) value = atoi(arg[argIdx]);
}
sampleFrequency_ = value;
match = true;
} // end "sample_frequency"
// no match, call base class parser
if (!match) {
match = ATC_Method::modify(narg, arg);
}
return match;
}
//-------------------------------------------------------------------
// called at the beginning of a timestep
void ATC_Transfer::pre_init_integrate()
{
ATC_Method::pre_init_integrate();
}
//-------------------------------------------------------------------
// called at the begining of second half timestep
// REFACTOR move this to post_neighbor
void ATC_Transfer::pre_final_integrate()
{
// update time
update_time(); // time uses step if dt = 0
if ( neighborReset_ && sample_now() ) {
if (! kernelOnTheFly_ ) {
if (!moleculeIds_.empty()) compute_kernel_matrix_molecule(); //KKM add
}
neighborReset_ = false;
}
}
//-------------------------------------------------------------------
// called at the end of second half timestep
void ATC_Transfer::post_final_integrate()
{
// compute spatially smoothed quantities
double dt = lammpsInterface_->dt();
if ( sample_now() ) {
bool needsBond = (! bondOnTheFly_ ) &&
(fieldFlags_(STRESS)
|| fieldFlags_(ESHELBY_STRESS)
|| fieldFlags_(HEAT_FLUX));
if ( needsBond ) {
if (pairMap_->need_reset()) {
// ATC::LammpsInterface::instance()->print_msg("Recomputing bond matrix due to atomReset_ value");
compute_bond_matrix();
}
}
time_filter_pre (dt);
compute_fields();
time_filter_post(dt);
lammpsInterface_->computes_addstep(lammpsInterface_->ntimestep()+sampleFrequency_);
}
// output
if ( output_now() && !outputStepZero_ ) output();
outputStepZero_ = false;
}
//-------------------------------------------------------------------
void ATC_Transfer::compute_bond_matrix(void)
{
bondMatrix_->reset();
}
//-------------------------------------------------------------------
void ATC_Transfer::compute_fields(void)
{
// keep per-atom computes fresh. JAZ and REJ not sure why;
// need to confer with JAT. (JAZ, 4/5/12)
interscaleManager_.lammps_force_reset();
// (1) direct quantities
for(int i=0; i < numFields_; ++i) {
FieldName index = indices_[i];
if (fieldFlags_(index)) {
- hardyData_[field_to_string(index)].set_quantity()
- = (outputFields_[index])->quantity();
+ DENS_MAT & data(hardyData_[field_to_string(index)].set_quantity());
+ data = (outputFields_[index])->quantity();
}
}
- if (fieldFlags_(INTERNAL_ENERGY))
- compute_internal_energy(hardyData_["internal_energy"].set_quantity());
- if (fieldFlags_(ENERGY))
- compute_energy(hardyData_["energy"].set_quantity());
+
if (fieldFlags_(STRESS))
compute_stress(hardyData_["stress"].set_quantity());
if (fieldFlags_(HEAT_FLUX))
compute_heatflux(hardyData_["heat_flux"].set_quantity());
// molecule data
if (fieldFlags_(DIPOLE_MOMENT))
compute_dipole_moment(hardyData_["dipole_moment"].set_quantity());
if (fieldFlags_(QUADRUPOLE_MOMENT))
compute_quadrupole_moment(hardyData_["quadrupole_moment"].set_quantity());
if (fieldFlags_(DISLOCATION_DENSITY))
compute_dislocation_density(hardyData_["dislocation_density"].set_quantity());
// (2) derived quantities
// compute: gradients
if (gradFlags_.has_member(true)) {
for(int index=0; index < NUM_TOTAL_FIELDS; ++index) {
if (gradFlags_(index)) {
string field= field_to_string((FieldName) index);
string grad_field = field + "_gradient";
if (hardyData_.find(field) == hardyData_.end() ) {
throw ATC_Error("field " + field + " needs to be defined for gradient");
}
gradient_compute(hardyData_[field].quantity(), hardyData_[grad_field].set_quantity());
}
}
}
// compute: eshelby stress
if (fieldFlags_(ESHELBY_STRESS)) {
{
compute_eshelby_stress(hardyData_["eshelby_stress"].set_quantity(),
hardyData_["internal_energy"].quantity(),
hardyData_["stress"].quantity(),
hardyData_["displacement_gradient"].quantity());
}
}
if (fieldFlags_(CAUCHY_BORN_ESHELBY_STRESS)) {
DENS_MAT & H = hardyData_["displacement_gradient"].set_quantity();
DENS_MAT E(H.nRows(),1);
ATOMIC_DATA::const_iterator tfield = hardyData_.find("temperature");
const DENS_MAT *temp = tfield==hardyData_.end() ? NULL : &((tfield->second).quantity());
//DENS_MAT & T = hardyData_["temperature"];
//cauchy_born_entropic_energy(H,E,T); E += hardyData_["internal_energy"];
cauchy_born_energy(H, E, temp);
- E -= nodalRefPotentialEnergy_;
compute_eshelby_stress(hardyData_["cauchy_born_eshelby_stress"].set_quantity(),
E,hardyData_["stress"].quantity(),
hardyData_["displacement_gradient"].quantity());
}
// compute: cauchy born stress
if (fieldFlags_(CAUCHY_BORN_STRESS)) {
ATOMIC_DATA::const_iterator tfield = hardyData_.find("temperature");
const DENS_MAT *temp = tfield==hardyData_.end() ? NULL : &((tfield->second).quantity());
cauchy_born_stress(hardyData_["displacement_gradient"].quantity(),
hardyData_["cauchy_born_stress"].set_quantity(), temp);
}
// compute: cauchy born energy
if (fieldFlags_(CAUCHY_BORN_ENERGY)) {
ATOMIC_DATA::const_iterator tfield = hardyData_.find("temperature");
const DENS_MAT *temp = tfield==hardyData_.end() ? NULL : &((tfield->second).quantity());
cauchy_born_energy(hardyData_["displacement_gradient"].quantity(),
hardyData_["cauchy_born_energy"].set_quantity(), temp);
}
// 1st PK transformed to cauchy (lag) or cauchy transformed to 1st PK (eul)
if (fieldFlags_(TRANSFORMED_STRESS)) {
compute_transformed_stress(hardyData_["transformed_stress"].set_quantity(),
hardyData_["stress"].quantity(),
hardyData_["displacement_gradient"].quantity());
}
if (fieldFlags_(VACANCY_CONCENTRATION)) {
compute_vacancy_concentration(hardyData_["vacancy_concentration"].set_quantity(),
hardyData_["displacement_gradient"].quantity(),
hardyData_["number_density"].quantity());
}
if (fieldFlags_(ELECTRIC_POTENTIAL)) {
compute_electric_potential(
hardyData_[field_to_string(ELECTRIC_POTENTIAL)].set_quantity());
}
// compute: rotation and/or stretch from deformation gradient
if (fieldFlags_(ROTATION) || fieldFlags_(STRETCH)) {
compute_polar_decomposition(hardyData_["rotation"].set_quantity(),
hardyData_["stretch"].set_quantity(),
hardyData_["displacement_gradient"].quantity());
}
// compute: rotation and/or stretch from deformation gradient
if (fieldFlags_(CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT)) {
compute_elastic_deformation_gradient2(hardyData_["elastic_deformation_gradient"].set_quantity(),
hardyData_["stress"].quantity(),
hardyData_["displacement_gradient"].quantity());
}
// (3) computes
lammpsInterface_->computes_clearstep();
map <string,int>::const_iterator iter;
for (iter = computes_.begin(); iter != computes_.end(); iter++) {
string tag = iter->first;
COMPUTE_POINTER cmpt = lammpsInterface_->compute_pointer(tag);
int projection = iter->second;
int ncols = lammpsInterface_->compute_ncols_peratom(cmpt);;
DENS_MAT atomicData(nLocal_,ncols);
if (ncols == 1) {
double * atomData = lammpsInterface_->compute_vector_peratom(cmpt);
for (int i = 0; i < nLocal_; i++) {
int atomIdx = internalToAtom_(i);
atomicData(i,0) = atomData[atomIdx];
}
}
else {
double ** atomData = lammpsInterface_->compute_array_peratom(cmpt);
for (int i = 0; i < nLocal_; i++) {
int atomIdx = internalToAtom_(i);
for (int k = 0; k < ncols; k++) {
atomicData(i,k) = atomData[atomIdx][k];
}
}
}
// REFACTOR -- make dep manage
if (projection == NO_NORMALIZATION) {
project(atomicData,hardyData_[tag].set_quantity());
}
else if (projection == VOLUME_NORMALIZATION) {
project_volume_normalized(atomicData,hardyData_[tag].set_quantity());
}
else if (projection == NUMBER_NORMALIZATION) {
project_count_normalized(atomicData,hardyData_[tag].set_quantity());
}
else if (projection == MASS_NORMALIZATION) {
throw ATC_Error("unimplemented normalization");
}
else {
throw ATC_Error("unimplemented normalization");
}
#ifdef ESHELBY_VIRIAL
if (tag == "virial" && fieldFlags_(ESHELBY_STRESS)) {
if (atomToElementMapType_ == LAGRANGIAN) {
DENS_MAT tmp = hardyData_[tag].quantity();
DENS_MAT & myData(hardyData_[tag].set_quantity());
myData.reset(nNodes_,FieldSizes[STRESS]);
DENS_MAT F(3,3),FT(3,3),FTINV(3,3),CAUCHY(3,3),PK1(3,3);
const DENS_MAT& H(hardyData_["displacement_gradient"].quantity());
for (int k = 0; k < nNodes_; k++ ) {
vector_to_symm_matrix(k,tmp,CAUCHY);
vector_to_matrix(k,H,F);
F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0;
FT = F.transpose();
FTINV = inv(FT);
// volumes are already reference volumes.
PK1 = CAUCHY*FTINV;
matrix_to_vector(k,PK1,myData);
}
}
compute_eshelby_stress(hardyData_["eshelby_virial"].set_quantity(),
hardyData_["internal_energy"].quantity(),hardyData_[tag].quantity(),
hardyData_["displacement_gradient"].quantity());
}
#endif
}
}// end of compute_fields routine
//-------------------------------------------------------------------
void ATC_Transfer::time_filter_pre(double dt)
{
sampleCounter_++;
string name;
double delta_t = dt*sampleFrequency_;
for(int index=0; index < NUM_TOTAL_FIELDS; ++index) {
if (fieldFlags_(index)) {
name = field_to_string((FieldName) index);
timeFilters_(index)->apply_pre_step1(filteredData_[name].set_quantity(),
hardyData_[name].quantity(), delta_t);
}
}
map <string,int>::const_iterator iter;
int index = NUM_TOTAL_FIELDS;
for (iter = computes_.begin(); iter != computes_.end(); iter++) {
string tag = iter->first;
timeFilters_(index)->apply_pre_step1(filteredData_[tag].set_quantity(),
hardyData_[tag].quantity(), delta_t);
index++;
}
}
//-------------------------------------------------------------------
void ATC_Transfer::time_filter_post(double dt)
{
sampleCounter_++;
string name;
double delta_t = dt*sampleFrequency_;
for(int index=0; index < NUM_TOTAL_FIELDS; ++index) {
if (fieldFlags_(index)) {
name = field_to_string((FieldName) index);
timeFilters_(index)->apply_post_step2(filteredData_[name].set_quantity(),
hardyData_[name].quantity(), delta_t);
}
}
if (rateFlags_.has_member(true)) {
for(int index=0; index < NUM_TOTAL_FIELDS; ++index) {
if (rateFlags_(index)) {
string field= field_to_string((FieldName) index);
string rate_field = field + "_rate";
timeFilters_(index)->rate(hardyData_[rate_field].set_quantity(),
filteredData_[field].quantity(),
hardyData_[field].quantity(), delta_t);
}
}
}
for(int index=0; index < NUM_TOTAL_FIELDS; ++index) {
if (rateFlags_(index)) {
name = field_to_string((FieldName) index);
string rate_field = name + "_rate";
filteredData_[rate_field] = hardyData_[rate_field];
}
if (gradFlags_(index)) {
name = field_to_string((FieldName) index);
string grad_field = name + "_gradient";
filteredData_[grad_field] = hardyData_[grad_field];
}
}
// lists/accessing of fields ( & computes)
map <string,int>::const_iterator iter;
int index = NUM_TOTAL_FIELDS;
for (iter = computes_.begin(); iter != computes_.end(); iter++) {
string tag = iter->first;
timeFilters_(index)->apply_post_step2(filteredData_[tag].set_quantity(),
hardyData_[tag].quantity(), delta_t);
#ifdef ESHELBY_VIRIAL
if (tag == "virial" && fieldFlags_(ESHELBY_STRESS)) {
filteredData_["eshelby_virial"] = hardyData_["eshelby_virial"];
}
#endif
index++;
}
}
//-------------------------------------------------------------------
void ATC_Transfer::output()
{
feEngine_->departition_mesh();
for(int index=0; index < NUM_TOTAL_FIELDS; ++index) {
if (outputFlags_(index)) {
FieldName fName = (FieldName) index;
string name= field_to_string(fName);
fields_[fName] = filteredData_[name];
}
}
ATC_Method::output();
if (lammpsInterface_->comm_rank() == 0) {
// data
OUTPUT_LIST output_data;
#ifdef REFERENCE_PE_OUTPUT
- output_data["reference_potential_energy"] = & nodalRefPotentialEnergy_;
+ output_data["reference_potential_energy"] = nodalRefPotentialEnergy_->quantity();
#endif
for(int index=0; index < NUM_TOTAL_FIELDS; ++index) {
if (outputFlags_(index)) {
string name= field_to_string((FieldName) index);
output_data[name] = & ( filteredData_[name].set_quantity());
}
if (rateFlags_(index)) {
string name= field_to_string((FieldName) index);
string rate_name = name + "_rate";
output_data[rate_name] = & ( filteredData_[rate_name].set_quantity());
}
if (gradFlags_(index)) {
string name= field_to_string((FieldName) index);
string grad_name = name + "_gradient";
output_data[grad_name] = & ( filteredData_[grad_name].set_quantity());
}
}
// lists/accessing of fields ( & computes)
map <string,int>::const_iterator iter;
for (iter = computes_.begin(); iter != computes_.end(); iter++) {
string tag = iter->first;
output_data[tag] = & ( filteredData_[tag].set_quantity());
#ifdef ESHELBY_VIRIAL
if (tag == "virial" && fieldFlags_(ESHELBY_STRESS)) {
output_data["eshelby_virial"] = & ( filteredData_["eshelby_virial"].set_quantity() );
}
#endif
}
+ DENS_MAT nodalInverseVolumes = CLON_VEC(accumulantInverseVolumes_->quantity());
+ output_data["NodalInverseVolumes"] = &nodalInverseVolumes;
+
// output
feEngine_->write_data(output_index(), & output_data);
}
feEngine_->partition_mesh();
}
/////// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/////// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//-------------------------------------------------------------------
// computes nodeData = N*atomData
void ATC_Transfer::project(const DENS_MAT & atomData,
DENS_MAT & nodeData)
{
if (! kernelOnTheFly_ ) {
nodeData.reset(nNodes_,atomData.nCols(),true);
DENS_MAT workNodeArray(nodeData.nRows(),nodeData.nCols());
if (nLocal_>0) workNodeArray = (accumulant_->quantity()).transMat(atomData);
int count = nodeData.nRows()*nodeData.nCols();
lammpsInterface_->allsum(workNodeArray.ptr(),nodeData.ptr(),count);
}
else {
compute_projection(atomData,nodeData);
}
}
//-------------------------------------------------------------------
// computes nodeData = N*molData specially for molecules
void ATC_Transfer::project_molecule(const DENS_MAT & molData,
DENS_MAT & nodeData)
{
if (! kernelOnTheFly_ ) {
nodeData.reset(nNodes_,molData.nCols(),true);
DENS_MAT workNodeArray(nodeData.nRows(),nodeData.nCols());
if (nLocal_>0) workNodeArray = (accumulantMol_->quantity()).transMat(molData);
int count = nodeData.nRows()*nodeData.nCols();
lammpsInterface_->allsum(workNodeArray.ptr(),nodeData.ptr(),count);
}
else {
compute_projection(molData,nodeData);
}
}
//-------------------------------------------------------------------
// computes nodeData = gradient of N*molData specially for molecules
void ATC_Transfer::project_molecule_gradient(const DENS_MAT & molData,
DENS_MAT & nodeData)
{
if (! kernelOnTheFly_ ) {
nodeData.reset(nNodes_,molData.nCols(),true);
DENS_MAT workNodeArray(nodeData.nRows(),nodeData.nCols());
if (nLocal_>0) workNodeArray = (accumulantMolGrad_->quantity()).transMat(molData);
int count = nodeData.nRows()*nodeData.nCols();
lammpsInterface_->allsum(workNodeArray.ptr(),nodeData.ptr(),count);
}
else {
compute_projection(molData,nodeData);
}
}
//-------------------------------------------------------------------
// count normalized
void ATC_Transfer::project_count_normalized(const DENS_MAT & atomData,
DENS_MAT & nodeData)
{
DENS_MAT tmp;
project(atomData,tmp);
nodeData = (accumulantWeights_->quantity())*tmp;
}
//-------------------------------------------------------------------
// volume normalized
void ATC_Transfer::project_volume_normalized(const DENS_MAT & atomData,
DENS_MAT & nodeData)
{
DENS_MAT tmp;
project(atomData,tmp);
nodeData = (accumulantInverseVolumes_->quantity())*tmp;
}
//-------------------------------------------------------------------
// volume normalized molecule
void ATC_Transfer::project_volume_normalized_molecule(const DENS_MAT & molData,
DENS_MAT & nodeData)
{
DENS_MAT tmp;
project_molecule(molData,tmp);
nodeData = (accumulantInverseVolumes_->quantity())*tmp;
}
//-------------------------------------------------------------------
// volume normalized molecule_gradient
void ATC_Transfer::project_volume_normalized_molecule_gradient(const DENS_MAT & molData,
DENS_MAT & nodeData)
{
DENS_MAT tmp;
project_molecule_gradient(molData,tmp);
nodeData = (accumulantInverseVolumes_->quantity())*tmp;
}
//-------------------------------------------------------------------
void ATC_Transfer::gradient_compute(const DENS_MAT & inNodeData,
DENS_MAT & outNodeData)
{
int nrows = inNodeData.nRows();
int ncols = inNodeData.nCols();
outNodeData.reset(nrows,ncols*nsd_);
int index = 0;
for (int n = 0; n < ncols; n++) { //output v1,1 v1,2 v1,3 ...
for (int m = 0; m < nsd_; m++) {
CLON_VEC inData(inNodeData,CLONE_COL,n);
CLON_VEC outData(outNodeData,CLONE_COL,index);
outData = (*((gradientMatrix_->quantity())[m]))*inData;
++index;
}
}
}
//-------------------------------------------------------------------
void ATC_Transfer::compute_force_matrix()
{
atomicForceMatrix_ = pairVirial_->quantity();
}
//-------------------------------------------------------------------
// computes "virial" part of heat flux
// This is correct ONLY for pair potentials.
void ATC_Transfer::compute_heat_matrix()
{
atomicHeatMatrix_ = pairHeatFlux_->quantity();
}
//-------------------------------------------------------------------
// set xPointer_ to xref or xatom depending on Lagrangian/Eulerian analysis
void ATC_Transfer::set_xPointer()
{
xPointer_ = xref_;
if (atomToElementMapType_ == EULERIAN) {
xPointer_ = lammpsInterface_->xatom();
}
}
//-------------------------------------------------------------------
// SOON TO BE OBSOLETE
// check consistency of fieldFlags_
void ATC_Transfer::check_field_dependencies()
{
fieldFlags_ = outputFlags_;
if (fieldFlags_(TRANSFORMED_STRESS)) {
fieldFlags_(STRESS) = true;
fieldFlags_(DISPLACEMENT) = true;
}
if (fieldFlags_(ESHELBY_STRESS)) {
fieldFlags_(STRESS) = true;
fieldFlags_(INTERNAL_ENERGY) = true;
fieldFlags_(DISPLACEMENT) = true;
}
if (fieldFlags_(CAUCHY_BORN_STRESS)
|| fieldFlags_(CAUCHY_BORN_ENERGY)
|| fieldFlags_(CAUCHY_BORN_ESHELBY_STRESS)
|| fieldFlags_(CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT)) {
if (! (cauchyBornStress_) ) {
throw ATC_Error("can't compute cauchy-born stress w/o cauchy born model");
}
}
if (fieldFlags_(CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT)) {
fieldFlags_(STRESS) = true;
}
if (fieldFlags_(CAUCHY_BORN_STRESS)
|| fieldFlags_(CAUCHY_BORN_ENERGY)) {
fieldFlags_(TEMPERATURE) = true;
fieldFlags_(DISPLACEMENT) = true;
}
if (fieldFlags_(CAUCHY_BORN_ESHELBY_STRESS)) {
fieldFlags_(TEMPERATURE) = true;
fieldFlags_(DISPLACEMENT) = true;
fieldFlags_(STRESS) = true;
}
if (fieldFlags_(VACANCY_CONCENTRATION)) {
fieldFlags_(DISPLACEMENT) = true;
fieldFlags_(NUMBER_DENSITY) = true;
}
if (fieldFlags_(INTERNAL_ENERGY)) {
fieldFlags_(POTENTIAL_ENERGY) = true;
fieldFlags_(THERMAL_ENERGY) = true;
}
if (fieldFlags_(ENERGY)) {
fieldFlags_(POTENTIAL_ENERGY) = true;
fieldFlags_(KINETIC_ENERGY) = true;
}
if (fieldFlags_(TEMPERATURE) || fieldFlags_(HEAT_FLUX) ||
fieldFlags_(KINETIC_ENERGY) || fieldFlags_(THERMAL_ENERGY) ||
fieldFlags_(ENERGY) || fieldFlags_(INTERNAL_ENERGY) ||
fieldFlags_(KINETIC_ENERGY) || (fieldFlags_(STRESS) &&
atomToElementMapType_ == EULERIAN) ) {
fieldFlags_(VELOCITY) = true;
fieldFlags_(MASS_DENSITY) = true;
}
if (fieldFlags_(VELOCITY)) {
fieldFlags_(MASS_DENSITY) = true;
fieldFlags_(MOMENTUM) = true;
}
if (fieldFlags_(DISPLACEMENT)) {
fieldFlags_(MASS_DENSITY) = true;
}
if (fieldFlags_(TEMPERATURE) ) {
fieldFlags_(NUMBER_DENSITY) = true;
}
if (fieldFlags_(ROTATION) ||
fieldFlags_(STRETCH)) {
fieldFlags_(DISPLACEMENT) = true;
}
if (fieldFlags_(ESHELBY_STRESS)
|| fieldFlags_(CAUCHY_BORN_STRESS)
|| fieldFlags_(CAUCHY_BORN_ENERGY)
|| fieldFlags_(CAUCHY_BORN_ESHELBY_STRESS)
|| fieldFlags_(CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT)
|| fieldFlags_(VACANCY_CONCENTRATION)
|| fieldFlags_(ROTATION)
|| fieldFlags_(STRETCH) ) {
gradFlags_(DISPLACEMENT) = true;
}
// check whether single_enable==0 for stress/heat flux calculation
if (fieldFlags_(STRESS) || fieldFlags_(HEAT_FLUX)) {
if (lammpsInterface_->single_enable()==0) {
throw ATC_Error("Calculation of stress field not possible with selected pair type.");
}
}
}
//============== THIN WRAPPERS ====================================
// OBSOLETE
// HARDY COMPUTES
// ***************UNCONVERTED**************************
- //-------------------------------------------------------------------
- // total energy
-
- void ATC_Transfer::compute_energy(DENS_MAT & energy)
- {
- PerAtomQuantity<double> * atomicPotentialEnergy = interscaleManager_.per_atom_quantity("AtomicPotentialEnergy");
- atomicScalar_=atomicPotentialEnergy->quantity();
- double mvv2e = lammpsInterface_->mvv2e();
- int * type = lammpsInterface_->atom_type();
- double * mass = lammpsInterface_->atom_mass();
- double * rmass = lammpsInterface_->atom_rmass();
- double ** vatom = lammpsInterface_->vatom();
- for (int i = 0; i < nLocal_; i++) {
- int atomIdx = internalToAtom_(i);
- double ma = mass ? mass[type[atomIdx]]: rmass[atomIdx];
- ma *= mvv2e; // convert mass to appropriate units
- // compute kinetic energy per atom
- double* v = vatom[atomIdx];
- double atomKE = 0.0;
- for (int k = 0; k < nsd_; k++) { atomKE += v[k]*v[k]; }
- atomKE *= 0.5*ma;
- // add up total energy per atom
- atomicScalar_(i,0) += atomKE;
- }
- project_volume_normalized(atomicScalar_, energy);
- }
- // internal energy
-
- void ATC_Transfer::compute_internal_energy(DENS_MAT & energy)
- {
- PerAtomQuantity<double> * atomicPotentialEnergy = interscaleManager_.per_atom_quantity("AtomicPotentialEnergy");
- PerAtomQuantity<double> * atomicProlongedVelocity = interscaleManager_.per_atom_quantity("ProlongedVelocity");
- atomicScalar_=atomicPotentialEnergy->quantity();
- atomicVector_=atomicProlongedVelocity->quantity();
- double mvv2e = lammpsInterface_->mvv2e();
- int * type = lammpsInterface_->atom_type();
- double * mass = lammpsInterface_->atom_mass();
- double * rmass = lammpsInterface_->atom_rmass();
- double ** vatom = lammpsInterface_->vatom();
- for (int i = 0; i < nLocal_; i++) {
- int atomIdx = internalToAtom_(i);
- double ma = mass ? mass[type[atomIdx]]: rmass[atomIdx];
- ma *= mvv2e; // convert mass to appropriate units
- // compute kinetic energy per atom
- double* v = vatom[atomIdx];
- double atomKE = 0.0;
- for (int k = 0; k < nsd_; k++) {
- atomKE += (v[k]-atomicVector_(i,k))*(v[k]-atomicVector_(i,k));
- }
- atomKE *= 0.5*ma;
- // add up total energy per atom
- atomicScalar_(i,0) += atomKE;
- }
- project_volume_normalized(atomicScalar_, energy);
- }
//-------------------------------------------------------------------
// MOLECULE
//-------------------------------------------------------------------
void ATC_Transfer::compute_dipole_moment(DENS_MAT & dipole_moment)
{
const DENS_MAT & molecularVector(dipoleMoment_->quantity());
project_volume_normalized_molecule(molecularVector,dipole_moment); // KKM add
//
}
//-------------------------------------------------------------------
void ATC_Transfer::compute_quadrupole_moment(DENS_MAT & quadrupole_moment)
{
const DENS_MAT & molecularVector(quadrupoleMoment_->quantity());
project_volume_normalized_molecule_gradient(molecularVector,quadrupole_moment); // KKM add
//
}
//-------------------------------------------------------------------
void ATC_Transfer::compute_stress(DENS_MAT & stress)
{
// table of bond functions already calculated in initialize function
// get conversion factor for nktV to p units
double nktv2p = lammpsInterface_->nktv2p();
// calculate kinetic energy tensor part of stress for Eulerian analysis
if (atomToElementMapType_ == EULERIAN && nLocal_>0) {
compute_kinetic_stress(stress);
}
else {
// zero stress table for Lagrangian analysis or if nLocal_ = 0
stress.zero();
}
// add-in potential part of stress tensor
int nrows = stress.nRows();
int ncols = stress.nCols();
DENS_MAT local_potential_hardy_stress(nrows,ncols);
if (nLocal_>0) {
if (bondOnTheFly_) {
compute_potential_stress(local_potential_hardy_stress);
}
else {
// compute table of force & position dyad
compute_force_matrix();
// calculate force part of stress tensor
local_potential_hardy_stress = atomicBondMatrix_*atomicForceMatrix_;
local_potential_hardy_stress *= 0.5;
}
}
// global summation of potential part of stress tensor
DENS_MAT potential_hardy_stress(nrows,ncols);
int count = nrows*ncols;
lammpsInterface_->allsum(local_potential_hardy_stress.ptr(),
potential_hardy_stress.ptr(), count);
stress += potential_hardy_stress;
stress = nktv2p*stress;
}
//-------------------------------------------------------------------
// kinetic energy portion of stress
void ATC_Transfer::compute_kinetic_stress(DENS_MAT& stress)
{
const DENS_MAT& density = hardyData_["mass_density"].quantity();
const DENS_MAT& velocity = hardyData_["velocity"].quantity();
int * type = lammpsInterface_->atom_type();
double * mass = lammpsInterface_->atom_mass();
double * rmass = lammpsInterface_->atom_rmass();
double ** vatom = lammpsInterface_->vatom();
double mvv2e = lammpsInterface_->mvv2e(); // [MV^2]-->[Energy]
atomicTensor_.reset(nLocal_,6);
for (int i = 0; i < nLocal_; i++) {
int atomIdx = internalToAtom_(i);
double ma = mass ? mass[type[atomIdx]]: rmass[atomIdx];
ma *= mvv2e; // convert mass to appropriate units
double* v = vatom[atomIdx];
atomicTensor_(i,0) -= ma*v[0]*v[0];
atomicTensor_(i,1) -= ma*v[1]*v[1];
atomicTensor_(i,2) -= ma*v[2]*v[2];
atomicTensor_(i,3) -= ma*v[0]*v[1];
atomicTensor_(i,4) -= ma*v[0]*v[2];
atomicTensor_(i,5) -= ma*v[1]*v[2];
}
project_volume_normalized(atomicTensor_, stress);
for (int i = 0; i < nNodes_; i++) {
double rho_i = mvv2e*density(i,0);
stress(i,0) += rho_i*velocity(i,0)*velocity(i,0);
stress(i,1) += rho_i*velocity(i,1)*velocity(i,1);
stress(i,2) += rho_i*velocity(i,2)*velocity(i,2);
stress(i,3) += rho_i*velocity(i,0)*velocity(i,1);
stress(i,4) += rho_i*velocity(i,0)*velocity(i,2);
stress(i,5) += rho_i*velocity(i,1)*velocity(i,2);
}
}
//-------------------------------------------------------------------
void ATC_Transfer::compute_heatflux(DENS_MAT & flux)
{
// calculate kinetic part of heat flux
if (atomToElementMapType_ == EULERIAN && nLocal_>0) {
compute_kinetic_heatflux(flux);
}
else {
flux.zero(); // zero stress table for Lagrangian analysis
}
// add potential part of heat flux vector
int nrows = flux.nRows();
int ncols = flux.nCols();
DENS_MAT local_hardy_heat(nrows,ncols);
if (nLocal_>0) {
if (bondOnTheFly_) {
compute_potential_heatflux(local_hardy_heat);
}
else {
// calculate force/potential-derivative part of heat flux
compute_heat_matrix();
local_hardy_heat = atomicBondMatrix_*atomicHeatMatrix_;
}
}
// global summation of potential part of heat flux vector
DENS_MAT hardy_heat(nrows,ncols);
int count = nrows*ncols;
lammpsInterface_->allsum(local_hardy_heat.ptr(),
hardy_heat.ptr(), count);
flux += hardy_heat;
}
//-------------------------------------------------------------------
// compute kinetic part of heat flux
void ATC_Transfer::compute_kinetic_heatflux(DENS_MAT& flux)
{
const DENS_MAT& velocity = hardyData_["velocity"].quantity();
const DENS_MAT& energy = hardyData_["mass_density"].quantity();
const DENS_MAT& stress = hardyData_["stress"].quantity();
int * type = lammpsInterface_->atom_type();
double * mass = lammpsInterface_->atom_mass();
double * rmass = lammpsInterface_->atom_rmass();
double ** vatom = lammpsInterface_->vatom();
double mvv2e = lammpsInterface_->mvv2e();
double * atomPE = lammpsInterface_->compute_pe_peratom();
double atomKE, atomEnergy;
atomicVector_.reset(nLocal_,3);
for (int i = 0; i < nLocal_; i++) {
int atomIdx = internalToAtom_(i);
double ma = mass ? mass[type[atomIdx]]: rmass[atomIdx];
ma *= mvv2e; // convert mass to appropriate units
double* v = vatom[atomIdx];
atomKE = 0.0;
for (int k = 0; k < nsd_; k++) { atomKE += v[k]*v[k]; }
atomKE *= 0.5*ma;
atomEnergy = atomKE + atomPE[atomIdx];
for (int j = 0; j < nsd_; j++) {
atomicVector_(i,j) += atomEnergy*v[j];
}
}
project_volume_normalized(atomicVector_,flux);
// - e^0_I v_I + \sigma^T_I v_I
for (int i = 0; i < nNodes_; i++) {
double e_i = energy(i,0);
flux(i,0) += (e_i + stress(i,0))*velocity(i,0)
+ stress(i,3)*velocity(i,1)+ stress(i,4)*velocity(i,2);
flux(i,1) += (e_i + stress(i,1))*velocity(i,1)
+ stress(i,3)*velocity(i,0)+ stress(i,5)*velocity(i,2);
flux(i,2) += (e_i + stress(i,2))*velocity(i,2)
+ stress(i,4)*velocity(i,0)+ stress(i,5)*velocity(i,1);
}
}
//--------------------------------------------------------------------
void ATC_Transfer::compute_electric_potential(DENS_MAT & phi)
{
// Poisson solve with insulating bcs
const DENS_MAT & rho = (restrictedCharge_->quantity());
SPAR_MAT K;
feEngine_->stiffness_matrix(K);
double permittivity = lammpsInterface_->dielectric();
permittivity *= LammpsInterface::instance()->epsilon0();
K *= permittivity;
BC_SET bcs;
bcs.insert(pair<int,int>(0,0));
LinearSolver solver(K,bcs);
CLON_VEC x = column(phi,0);
CLON_VEC b = column(rho,0);
solver.solve(x,b);
//x.print("x:phi");
//b.print("b:rho");
//LinearSolver solver(K,AUTO_SOLVE,true);
}
//--------------------------------------------------------------------
void ATC_Transfer::compute_vacancy_concentration(DENS_MAT & Cv,
const DENS_MAT & H, const DENS_MAT & rhoN)
{
int * type = lammpsInterface_->atom_type();
DENS_MAT new_rho(nNodes_,1);
DENS_MAT atomCnt(nLocal_,1);
double atomic_weight_sum = 0.0;
double site_weight_sum = 0.0;
int number_atoms = 0;
const DIAG_MAT & myAtomicWeights(atomVolume_->quantity());
for (int i = 0; i < nLocal_; i++) {
int atomIdx = internalToAtom_(i);
if (type[atomIdx] != 13) {
atomCnt(i,0) = myAtomicWeights(i,i);
atomic_weight_sum += myAtomicWeights(i,i);
number_atoms++;
}
site_weight_sum += myAtomicWeights(i,i);
}
project_volume_normalized(atomCnt, new_rho);
DENS_MAT F(3,3);
for (int i = 0; i < nNodes_; i++) {
if (atomToElementMapType_ == EULERIAN) {
// for Eulerian analysis: F = (1-H)^{-1}
DENS_MAT G(3,3);
vector_to_matrix(i,H,G);
G *= -1.;
G(0,0) += 1.0; G(1,1) += 1.0; G(2,2) += 1.0;
F = inv(G);
}
else if (atomToElementMapType_ == LAGRANGIAN) {
// for Lagrangian analysis: F = (1+H)
vector_to_matrix(i,H,F);
F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0;
}
double J = det(F);
+ double volume_per_atom = lammpsInterface_->volume_per_atom();
+ J *= volume_per_atom;
Cv(i,0) = 1.0 - J*new_rho(i,0);
}
}
//--------------------------------------------------------------------
void ATC_Transfer::compute_eshelby_stress(DENS_MAT & M,
const DENS_MAT & E, const DENS_MAT & S, const DENS_MAT & H)
{
// eshelby stress:M, energy:E, stress:S, displacement gradient: H
// eshelby stress = W I - F^T.P = W I - C.S [energy]
// symmetric if isotropic S = a_0 I + a_1 C + a_2 C^2
M.reset(nNodes_,FieldSizes[ESHELBY_STRESS]);
double nktv2p = lammpsInterface_->nktv2p();
DENS_MAT P(3,3),F(3,3),FT(3,3),FTP(3,3),ESH(3,3);
for (int i = 0; i < nNodes_; i++) {
double W = E(i,0);
ESH.identity();
ESH *= W;
// copy to local
if (atomToElementMapType_ == LAGRANGIAN) {
// Stress notation convention:: 0:11 1:12 2:13 3:21 4:22 5:23 6:31 7:32 8:33
vector_to_matrix(i,S,P);
vector_to_matrix(i,H,F);
#ifndef H_BASED
F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0;
#endif
FT = F.transpose();
}
else if (atomToElementMapType_ == EULERIAN) {
vector_to_symm_matrix(i,S,P);
vector_to_matrix(i,H,F);
FT = F.transpose();
}
FTP = (1.0/nktv2p)*FT*P;
ESH -= FTP;
if (atomToElementMapType_ == EULERIAN) {
// For Eulerian analysis, M = F^T*(w-H^T.CauchyStress)
DENS_MAT Q(3,3);
Q.identity();
// Q stores (1-H)
Q -= FT.transpose();
DENS_MAT F(3,3);
F = inv(Q);
FT = F.transpose();
ESH = FT*ESH;
}
// copy to global
matrix_to_vector(i,ESH,M);
}
}
//---------------------------------------------------------------------------
// Computes the Cauchy Born stress tensor, T given displacement gradient, H
// and optional temperature argument (passed by pointer), TEMP
//---------------------------------------------------------------------------
void ATC_Transfer::cauchy_born_stress(const DENS_MAT &H, DENS_MAT &T, const DENS_MAT *temp)
{
FIELD_MATS uField; // uField should contain temperature.
DENS_MAT_VEC tField;
GRAD_FIELD_MATS hField;
DENS_MAT_VEC &h = hField[DISPLACEMENT];
h.assign(nsd_, DENS_MAT(nNodes_,nsd_));
tField.assign(nsd_, DENS_MAT(nNodes_,nsd_));
// each row is the CB stress at a node stored in voigt form
T.reset(nNodes_,FieldSizes[CAUCHY_BORN_STRESS]);
const double nktv2p = lammpsInterface_->nktv2p();
const double fact = -lammpsInterface_->mvv2e()*nktv2p;
// reshape H (#nodes,9) into h [3](#nodes,3) displacement gradient
vector_to_dens_mat_vec(H,h);
// if temperature is provided, then set it
if (temp) uField[TEMPERATURE] = *temp;
// Computes the stress at each node.
cauchyBornStress_->stress(uField, hField, tField);
// reshapes the stress, T to a (#node,6) DenseMatrix.
DENS_MAT S(nNodes_,6);
symm_dens_mat_vec_to_vector(tField,S);
S *= fact;
// tField/S holds the 2nd P-K stress tensor. Transform to
// Cauchy for EULERIAN analysis, transform to 1st P-K
// for LAGRANGIAN analysis.
DENS_MAT PK2(3,3),G(3,3),F(3,3),FT(3,3),STRESS(3,3);
for (int i = 0; i < nNodes_; i++) {
vector_to_symm_matrix(i,S,PK2);
if (atomToElementMapType_ == EULERIAN) {
// for Eulerian analysis: F = (1-H)^{-1}
vector_to_matrix(i,H,G);
G *= -1.;
G(0,0) += 1.0; G(1,1) += 1.0; G(2,2) += 1.0;
F = inv(G);
FT = transpose(F);
double J = det(F);
STRESS = F*PK2*FT;
STRESS *= 1/J;
symm_matrix_to_vector(i,STRESS,T);
}
else{
// for Lagrangian analysis: F = 1 + H
vector_to_matrix(i,H,F);
F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0;
STRESS = F*PK2;
matrix_to_vector(i,STRESS,T);
}
}
}
//---------------------------------------------------------------------------
// Computes the Cauchy Born energy density, E given displacement gradient, H
// and optional temperature argument (passed by pointer), TEMP
//---------------------------------------------------------------------------
void ATC_Transfer::cauchy_born_energy(const DENS_MAT &H, DENS_MAT &E, const DENS_MAT *temp)
{
FIELD_MATS uField; // uField should contain temperature.
GRAD_FIELD_MATS hField;
DENS_MAT_VEC &h = hField[DISPLACEMENT];
h.assign(nsd_, DENS_MAT(nNodes_,nsd_));
// reshape H (#nodes,9) into h [3](#nodes,3) displacement gradient
vector_to_dens_mat_vec(H,h);
// if temperature is provided, then set it
if (temp) uField[TEMPERATURE] = *temp;
// Computes the free/potential energy at each node.
cauchyBornStress_->elastic_energy(uField, hField, E);
// convert back to energy units for ( ATC coupling uses MLT units)
double mvv2e = lammpsInterface_->mvv2e(); // [MV^2]-->[Energy]
E *= mvv2e;
// for Eulerian analysis, convert energy density to per-unit deformed volume
if (atomToElementMapType_ == EULERIAN) {
DENS_MAT G(3,3),F(3,3);
for (int i = 0; i < nNodes_; i++) {
// for Eulerian analysis: F = (1-H)^{-1}
vector_to_matrix(i,H,G);
G *= -1.;
G(0,0) += 1.0; G(1,1) += 1.0; G(2,2) += 1.0;
F = inv(G);
double J = det(F);
E(i,0) *= 1/J;
}
}
-
// subtract zero point energy
- E -= nodalRefPotentialEnergy_;
+ if (nodalRefPotentialEnergy_)
+ E -= nodalRefPotentialEnergy_->quantity();
}
//---------------------------------------------------------------------------
// Computes the M/LH entropic energy density
//---------------------------------------------------------------------------
void ATC_Transfer::cauchy_born_entropic_energy(const DENS_MAT &H, DENS_MAT &E, const DENS_MAT &T)
{
FIELD_MATS uField; // uField should contain temperature.
uField[TEMPERATURE] = T;
GRAD_FIELD_MATS hField;
DENS_MAT_VEC &h = hField[DISPLACEMENT];
h.assign(nsd_, DENS_MAT(nNodes_,nsd_));
// reshape H (#nodes,9) into h [3](#nodes,3) displacement gradient
vector_to_dens_mat_vec(H,h);
// Computes the free/potential energy at each node.
cauchyBornStress_->entropic_energy(uField, hField, E);
// convert back to energy units for ( ATC coupling uses MLT units)
double mvv2e = lammpsInterface_->mvv2e(); // [MV^2]-->[Energy]
E *= mvv2e;
// for Eulerian analysis, convert energy density to per-unit deformed volume
if (atomToElementMapType_ == EULERIAN) {
DENS_MAT G(3,3),F(3,3);
for (int i = 0; i < nNodes_; i++) {
// for Eulerian analysis: F = (1-H)^{-1}
vector_to_matrix(i,H,G);
G *= -1.;
G(0,0) += 1.0; G(1,1) += 1.0; G(2,2) += 1.0;
F = inv(G);
double J = det(F);
E(i,0) *= 1/J;
}
}
}
//--------------------------------------------------------------------
void ATC_Transfer::compute_transformed_stress(DENS_MAT & stress,
const DENS_MAT & T, const DENS_MAT & H)
{
stress.reset(nNodes_,FieldSizes[TRANSFORMED_STRESS]);
DENS_MAT S(3,3),FT(3,3),P(3,3);
for (int i = 0; i < nNodes_; i++) {
if (atomToElementMapType_ == EULERIAN) {
vector_to_symm_matrix(i,T,P);
// for Eulerian analysis: F^T = (1-H)^{-T}
DENS_MAT G(3,3);
vector_to_matrix(i,H,G);
G *= -1.;
G(0,0) += 1.0; G(1,1) += 1.0; G(2,2) += 1.0;
FT = inv(G.transpose());
}
else{
vector_to_matrix(i,T,P);
// for Lagrangian analysis: F^T = (1+H)^T
DENS_MAT F(3,3);
vector_to_matrix(i,H,F);
F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0;
FT = F.transpose();
}
//
double J = det(FT);
FT *= 1/J;
if (atomToElementMapType_ == EULERIAN) {
FT = inv(FT);
}
S = P*FT;
matrix_to_vector(i,S,stress);
}
}
//--------------------------------------------------------------------
void ATC_Transfer::compute_polar_decomposition(DENS_MAT & rotation,
DENS_MAT & stretch, const DENS_MAT & H)
{
DENS_MAT F(3,3),R(3,3),U(3,3);
for (int i = 0; i < nNodes_; i++) {
vector_to_matrix(i,H,F);
F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0;
if (atomToElementMapType_ == EULERIAN) {
polar_decomposition(F,R,U,false); } // F = V R
else {
polar_decomposition(F,R,U); } // F = R U
// copy to local
if ( fieldFlags_(ROTATION) ) {
matrix_to_vector(i,R,rotation);
}
if ( fieldFlags_(STRETCH) ) {
matrix_to_vector(i,U,stretch);
}
}
}
//--------------------------------------------------------------------
void ATC_Transfer::compute_elastic_deformation_gradient(DENS_MAT & Fe,
const DENS_MAT & P, const DENS_MAT & H)
{
// calculate Fe for every node
const double nktv2p = lammpsInterface_->nktv2p();
const double fact = 1.0/ ( lammpsInterface_->mvv2e()*nktv2p );
for (int i = 0; i < nNodes_; i++) {
DENS_VEC Pv = global_vector_to_vector(i,P);
Pv *= fact;
CBElasticTangentOperator tangent(cauchyBornStress_, Pv);
NonLinearSolver solver(&tangent);
DENS_VEC Fv = global_vector_to_vector(i,H); // pass in initial guess
add_identity_voigt_unsymmetric(Fv);
solver.solve(Fv);
vector_to_global_vector(i,Fv,Fe);
}
}
//--------------------------------------------------------------------
void ATC_Transfer::compute_elastic_deformation_gradient2(DENS_MAT & Fe,
const DENS_MAT & P, const DENS_MAT & H)
{
// calculate Fe for every node
const double nktv2p = lammpsInterface_->nktv2p();
const double fact = 1.0/ ( lammpsInterface_->mvv2e()*nktv2p );
DENS_MAT F(3,3),R(3,3),U(3,3),PP(3,3),S(3,3);
for (int i = 0; i < nNodes_; i++) {
// get F = RU
vector_to_matrix(i,H,F);
F(0,0) += 1.0; F(1,1) += 1.0; F(2,2) += 1.0;
if (atomToElementMapType_ == EULERIAN) {
polar_decomposition(F,R,U,false); } // F = V R
else {
polar_decomposition(F,R,U); } // F = R U
// get S
vector_to_matrix(i,P,PP);
//S = PP*transpose(F);
S = inv(F)*PP;
S += S.transpose(); S *= 0.5; // symmetrize
DENS_VEC Sv = to_voigt(S);
Sv *= fact;
// solve min_U || S - S_CB(U) ||
CB2ndElasticTangentOperator tangent(cauchyBornStress_, Sv);
NonLinearSolver solver(&tangent);
//DENS_VEC Uv = to_voigt_unsymmetric(U); // pass in initial guess
DENS_VEC Uv = to_voigt(U); // pass in initial guess
//DENS_VEC Uv(6); Uv(0)=1;Uv(1)=1;Uv(2)=1;Uv(3)=0;Uv(4)=0;Uv(5)=0;
solver.solve(Uv);
DENS_MAT Ue = from_voigt(Uv);
DENS_MAT FFe = R*Ue;
matrix_to_vector(i,FFe,Fe);
}
}
// =========== Analytical solutions ==========================
} // end namespace ATC
diff --git a/lib/atc/ATC_Transfer.h b/lib/atc/ATC_Transfer.h
index 4b12c7354..8f4753bab 100644
--- a/lib/atc/ATC_Transfer.h
+++ b/lib/atc/ATC_Transfer.h
@@ -1,253 +1,257 @@
/** ATC_Transfer : coarse-graining methods */
#ifndef ATC_TRANSFER_H
#define ATC_TRANSFER_H
// ATC headers
#include "ATC_Method.h"
#include "MoleculeSet.h"
#include "AtomToMoleculeTransfer.h"
// Other headers
#include <map>
-#include <list>
-using std::list;
+#include <string>
+#include <vector>
namespace ATC {
// Forward declarations
class FE_Engine;
class StressCauchyBorn;
class TimeFilter;
class ATC_Transfer : public ATC_Method {
public:
// constructor
ATC_Transfer(std::string groupName,
double **& perAtomArray,
LAMMPS_NS::Fix * thisFix,
std::string matParamFile = "none");
// destructor
virtual ~ATC_Transfer();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** pre time integration */
virtual void initialize();
/** post time integration */
virtual void finish();
/** first time substep routines */
virtual void pre_init_integrate();
/** second time substep routine */
virtual void pre_final_integrate();
//virtual void final_integrate(){};
virtual void post_final_integrate();
/** communication routines */
virtual void pre_neighbor() {ATC_Method::pre_neighbor(); neighborReset_ = true;};
/** output function */
virtual void output();
/** external access to hardy data and other information*/
- const DENS_MAT * hardy_data(string field) { return &hardyData_[field].quantity(); }
+ const DENS_MAT * hardy_data(std::string field) { return &hardyData_[field].quantity(); }
protected:
/** pointer to position data : either x_reference or x_current */
double ** xPointer_;
/** data */
TAG_FIELDS hardyData_;
SmallMoleculeSet * smallMoleculeSet_; // KKM add
SmallMoleculeCentroid * moleculeCentroid_; // KKM add
SmallMoleculeDipoleMoment * dipoleMoment_; // KKM add
SmallMoleculeQuadrupoleMoment * quadrupoleMoment_; // KKM add
/** container for dependency managed data */
- vector < DENS_MAN * > outputFields_;
+ std::vector < DENS_MAN * > outputFields_;
- map < string, DENS_MAN * > outputFieldsTagged_;
+ std::map < std::string, DENS_MAN * > outputFieldsTagged_;
DENS_MAN * restrictedCharge_; // WIP/TEMP
/** work space */
DENS_MAT atomicScalar_;
DENS_MAT atomicVector_;
DENS_MAT atomicTensor_;
/** calculation flags */
Array<bool> fieldFlags_;
Array<bool> outputFlags_;
Array<bool> gradFlags_;
Array<bool> rateFlags_;
- map<string,int> computes_;
+ std::map<std::string,int> computes_;
bool outputStepZero_;
/** check whether atoms have shifted box or element or neighbors changed */
bool neighborReset_;
//---------------------------------------------------------------
/** initialization routines */
//---------------------------------------------------------------
/** gets baseline data from continuum model */
virtual void set_continuum_data();
/** sets up all data necessary to define the computational geometry */
virtual void set_computational_geometry();
+ /** sets up accumulant & interpolant */
+ virtual void construct_interpolant();
/** constructs all data which is updated with time integration, i.e. fields */
virtual void construct_time_integration_data();
/** create methods, e.g. time integrators, filters */
virtual void construct_methods();
/** set up data which is dependency managed */
virtual void construct_transfers();
+ /** sets up mol transfers */
+ virtual void construct_molecule_transfers();
/** compute atom to nodal quantities */
// OBSOLETE
void compute_energy(DENS_MAT & energy);
void compute_internal_energy(DENS_MAT & energy);
void compute_stress(DENS_MAT & stress);
void compute_heatflux(DENS_MAT & flux);
/** derived quantities: compute nodal to nodal quantities */
void compute_eshelby_stress(DENS_MAT & eshebly_stress,
const DENS_MAT & energy, const DENS_MAT & stress,
const DENS_MAT & displacement_gradient);
void cauchy_born_stress(const DENS_MAT &dudx, DENS_MAT &T, const DENS_MAT *temp=0);
void cauchy_born_energy(const DENS_MAT &dudx, DENS_MAT &T, const DENS_MAT *temp=0);
void cauchy_born_entropic_energy(const DENS_MAT &dudx, DENS_MAT &E, const DENS_MAT & T);
void compute_transformed_stress(DENS_MAT & stress,
const DENS_MAT & T, const DENS_MAT & displacement_gradient);
void compute_polar_decomposition(DENS_MAT & rotation,
DENS_MAT & stretch, const DENS_MAT & displacement_gradient);
void compute_elastic_deformation_gradient(DENS_MAT & elastic_def_grad,
const DENS_MAT & stress, const DENS_MAT & displacement_gradient);
void compute_elastic_deformation_gradient2(DENS_MAT & elastic_def_grad,
const DENS_MAT & stress, const DENS_MAT & displacement_gradient);
/** hybrid computes? */
void compute_electric_potential(DENS_MAT & electric_potential);
void compute_vacancy_concentration(DENS_MAT & vacancy_concentration,
const DENS_MAT & displacement_gradient,
const DENS_MAT & number_density);
/** calculate kinetic part of stress */
virtual void compute_kinetic_stress(DENS_MAT& stress);
/** calculate stress on-the-fly */
virtual void compute_potential_stress(DENS_MAT& stress) = 0;
/** calculate kinetic part of heat flux */
virtual void compute_kinetic_heatflux(DENS_MAT& flux);
/** calculate force part of the heat flux on-the-fly */
virtual void compute_potential_heatflux(DENS_MAT& flux) = 0;
/** compute molecule to nodal quantities */
void compute_dipole_moment(DENS_MAT & dipole_moment);
void compute_quadrupole_moment(DENS_MAT & quadrupole_moment);
/** calculate dislocation density tensor from DXA output */
virtual void compute_dislocation_density(DENS_MAT & dislocation_density) = 0;
/** compute smooth fields */
void compute_fields(void);
void time_filter_pre (double dt);
void time_filter_post(double dt);
/** mapping of atomic pairs to pair index value */
class PairMap * pairMap_;
class BondMatrix * bondMatrix_;
class PairVirial * pairVirial_;
class PairPotentialHeatFlux * pairHeatFlux_;
/** routine to calculate matrix of force & position dyads */
void compute_force_matrix();
/** routine to calculate matrix of heat flux vector components */
void compute_heat_matrix();
/** routine to calculate matrix of kernel functions */
virtual void compute_kernel_matrix_molecule() = 0; //KKM add
/** calculate projection on the fly*/
// REFACTOR use AtfKernelFunctionRestriction and derivatives
virtual void compute_projection(const DENS_MAT & atomData,
DENS_MAT & nodeData) = 0;
/** routine to calculate matrix of bond functions */
virtual void compute_bond_matrix();
/** routine to set xPointer to xref or xatom */
void set_xPointer();
/** number of atom types */
int nTypes_;
/** project : given w_\alpha,
w_I = \sum_\alpha N_{I\alpha} w_\alpha */
// REFACTOR AtfShapeFunctionRestriction
void project(const DENS_MAT & atomData,
DENS_MAT & nodeData);
void project_molecule(const DENS_MAT & molData,
DENS_MAT & nodeData); //KKM add
void project_molecule_gradient(const DENS_MAT & molData,
DENS_MAT & nodeData); //KKM add
/** project (number density): given w_\alpha,
w_I = \sum_\alpha N_{I\alpha} w_\alpha */
// REFACTOR AtfNodeWeightedShapeFunctionRestriction
void project_count_normalized(const DENS_MAT & atomData,
DENS_MAT & nodeData);
/** hardy_project (volume density): given w_\alpha,
w_I = 1/\Omega_I \sum_\alpha N_{I\alpha} w_\alpha
where \Omega_I = \int_{support region of node I} N_{I} dV */
// REFACTOR AtfNodeWeightedShapeFunctionRestriction
void project_volume_normalized(const DENS_MAT & atomData,
DENS_MAT & nodeData);
void project_volume_normalized_molecule(const DENS_MAT & molData,
DENS_MAT & nodeData); // KKM add
void project_volume_normalized_molecule_gradient(const DENS_MAT & molData,
DENS_MAT & nodeData); // KKM add
/** gradient_compute: given w_I,
w_J = \sum_I N_I'{xJ} \dyad w_I
where N_I'{xJ} is the gradient of the normalized
shape function of node I evaluated at node J */
// REFACTOR MatToGradBySparse
void gradient_compute(const DENS_MAT & inNodeData,
DENS_MAT & outNodeData);
int nNodesGlobal_;
int nComputes_;
/** workset data */
VectorDependencyManager<SPAR_MAT * > * gradientMatrix_;
SPAR_MAT atomicBondMatrix_;
DENS_MAT atomicForceMatrix_;
DENS_MAT atomicHeatMatrix_;
/** use pair/bond forces */
bool hasPairs_;
bool hasBonds_;
/** need to reset kernel function and bond matrix */
bool resetKernelFunction_;
/** use "exact" serial mode when using DXA to compute dislocation densities */
bool dxaExactMode_;
/** a continuum model to compare to and/or estimate quantities */
StressCauchyBorn * cauchyBornStress_;
Array<TimeFilter *> timeFilters_;
/** check consistency of fieldFlags_ */
void check_field_dependencies();
};
};
#endif
diff --git a/lib/atc/ATC_TransferKernel.cpp b/lib/atc/ATC_TransferKernel.cpp
index c4e2a2928..a4d592ba6 100644
--- a/lib/atc/ATC_TransferKernel.cpp
+++ b/lib/atc/ATC_TransferKernel.cpp
@@ -1,484 +1,485 @@
// ATC headers
#include "ATC_TransferKernel.h"
#include "ATC_Error.h"
#include "FE_Engine.h"
#include "KernelFunction.h"
#include "LammpsInterface.h"
#include "Quadrature.h"
#include "PerPairQuantity.h"
#include "Stress.h"
#ifdef HAS_DXA
#include "DislocationExtractor.h"
#endif
// Other Headers
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <fstream>
#include <exception>
using namespace std;
namespace ATC {
using ATC_Utility::to_string;
ATC_TransferKernel::ATC_TransferKernel(string groupName,
double **& perAtomArray,
LAMMPS_NS::Fix * thisFix,
string matParamFile)
: ATC_Transfer(groupName,perAtomArray,thisFix,matParamFile)
{
kernelBased_ = true;
}
//-------------------------------------------------------------------
ATC_TransferKernel::~ATC_TransferKernel()
{
}
//-------------------------------------------------------------------
bool ATC_TransferKernel::modify(int narg, char **arg)
{
bool match = false;
/*! \page man_hardy_kernel fix_modify AtC kernel
\section syntax
fix_modify AtC kernel <type> <parameters>
- type (keyword) = step, cell, cubic_bar, cubic_cylinder, cubic_sphere,
quartic_bar, quartic_cylinder, quartic_sphere \n
- parameters :\n
step = radius (double) \n
cell = hx, hy, hz (double) or h (double) \n
cubic_bar = half-width (double) \n
cubic_cylinder = radius (double) \n
cubic_sphere = radius (double) \n
quartic_bar = half-width (double) \n
quartic_cylinder = radius (double) \n
quartic_sphere = radius (double) \n
\section examples
- fix_modify AtC kernel cell 1.0 1.0 1.0
- fix_modify AtC kernel quartic_sphere 10.0
+ <TT> fix_modify AtC kernel cell 1.0 1.0 1.0 </TT> \n
+ <TT> fix_modify AtC kernel quartic_sphere 10.0 </TT>
\section description
\section restrictions
Must be used with the hardy AtC fix \n
For bar kernel types, half-width oriented along x-direction \n
For cylinder kernel types, cylindrical axis is assumed to be in z-direction \n
( see \ref man_fix_atc )
\section related
\section default
No default
*/
// no match, call base class parser
if (!match) {
match = ATC_Transfer::modify(narg, arg);
}
return match;
}
//-------------------------------------------------------------------
void ATC_TransferKernel::compute_kernel_matrix_molecule(void) // KKM add
{
int nLocalMol = smallMoleculeSet_->local_molecule_count();
if (nLocal_>0) {
SPAR_MAT & N(kernelAccumulantMol_.set_quantity());
N.reset(nLocalMol,nNodes_);
SPAR_MAT & dN(kernelAccumulantMolGrad_.set_quantity());
dN.reset(nLocalMol,nNodes_);
DENS_VEC derivKer(nsd_);
DENS_VEC xI(nsd_),xm(nsd_),xmI(nsd_);
const DENS_MAT & centroidMolMatrix(moleculeCentroid_->quantity());
ATC::LammpsInterface::instance()->stream_msg_once("computing kernel matrix molecule ",true,false);
int heartbeatFreq = (nNodes_ <= 10 ? 1 : (int) nNodes_ / 10);
for (int i = 0; i < nNodes_; i++) {
if (i % heartbeatFreq == 0 ) {
ATC::LammpsInterface::instance()->stream_msg_once(".",false,false);
}
xI = (feEngine_->fe_mesh())->nodal_coordinates(i);
for (int j = 0; j < nLocalMol; j++) {
for (int k = 0; k < nsd_; k++) {
xm(k) = centroidMolMatrix(j,k);
}
xmI = xm - xI;
lammpsInterface_->periodicity_correction(xmI.ptr());
double val = kernelFunction_->value(xmI);
if (val > 0) N.add(j,i,val);
kernelFunction_->derivative(xmI,derivKer);
double val_grad = derivKer(2);
if (val_grad!= 0) dN.add(j,i,val_grad);
}
}
// reset kernelShpFunctions with the weights of molecules on processors
DENS_VEC fractions(N.nRows());
DENS_VEC fractions_deriv(dN.nRows());
for (int i = 0; i < nLocalMol; i++) {
fractions(i) = smallMoleculeSet_->local_fraction(i);
}
N.row_scale(fractions);
N.compress();
dN.row_scale(fractions);
dN.compress();
if (lammpsInterface_->rank_zero()) {
ATC::LammpsInterface::instance()->stream_msg_once("done",false,true);
}
}
}
//-------------------------------------------------------------------
void ATC_TransferKernel::compute_projection(const DENS_MAT & atomData,
DENS_MAT & nodeData)
{
DENS_MAT workNodeArray(nNodes_, atomData.nCols());
workNodeArray.zero();
nodeData.reset(workNodeArray.nRows(),workNodeArray.nCols());
nodeData.zero();
if (nLocal_>0) {
+ set_xPointer();
DENS_VEC xI(nsd_),xa(nsd_),xaI(nsd_);
double val;
for (int i = 0; i < nNodes_; i++) {
xI = (feEngine_->fe_mesh())->nodal_coordinates(i);
for (int j = 0; j < nLocal_; j++) {
int lammps_j = internalToAtom_(j);
xa.copy(xPointer_[lammps_j],3);
xaI = xa - xI;
lammpsInterface_->periodicity_correction(xaI.ptr());
val = kernelFunction_->value(xaI);
if (val > 0) {
for (int k=0; k < atomData.nCols(); k++) {
workNodeArray(i,k) += val*atomData(j,k);
}
}
}
}
}
// accumulate across processors
int count = workNodeArray.nRows()*workNodeArray.nCols();
lammpsInterface_->allsum(workNodeArray.ptr(),nodeData.ptr(),count);
}
//-------------------------------------------------------------------
void ATC_TransferKernel::compute_bond_matrix()
{
atomicBondMatrix_=bondMatrix_->quantity();
}
//-------------------------------------------------------------------
// on-the-fly calculation of stress
void ATC_TransferKernel::compute_potential_stress(DENS_MAT& stress)
{
set_xPointer();
stress.zero();
// neighbor lists
int *numneigh = lammpsInterface_->neighbor_list_numneigh();
int **firstneigh = lammpsInterface_->neighbor_list_firstneigh();
double ** xatom = lammpsInterface_->xatom();
double lam1,lam2;
double bond_value;
// process differently for mesh vs translation-invariant kernels
ATC::LammpsInterface::instance()->stream_msg_once("computing potential stress: ",true,false);
int heartbeatFreq = (nNodes_ <= 10 ? 1 : (int) nNodes_ / 10);
// "normal" kernel functions
DENS_VEC xa(nsd_),xI(nsd_),xaI(nsd_),xb(nsd_),xbI(nsd_),xba(nsd_);
double kernel_inv_vol = kernelFunction_->inv_vol();
for (int i = 0; i < nNodes_; i++) {
if (i % heartbeatFreq == 0 ) {
ATC::LammpsInterface::instance()->stream_msg_once(".",false,false);
}
// point
xI = (feEngine_->fe_mesh())->nodal_coordinates(i);
if (!kernelFunction_->node_contributes(xI)) {
continue;
}
int inode = i;
for (int j = 0; j < nLocal_; j++) {
// second (neighbor) atom location
int lammps_j = internalToAtom_(j);
xa.copy(xPointer_[lammps_j],3);
// difference vector
xaI = xa - xI;
lammpsInterface_->periodicity_correction(xaI.ptr());
for (int k = 0; k < numneigh[lammps_j]; ++k) {
int lammps_k = firstneigh[lammps_j][k];
// first atom location
xb.copy(xPointer_[lammps_k],3);
// difference vector
xba = xb - xa;
xbI = xba + xaI;
kernelFunction_->bond_intercepts(xaI,xbI,lam1,lam2);
// compute virial
if (lam1 < lam2) {
bond_value
= kernel_inv_vol*(kernelFunction_->bond(xaI,xbI,lam1,lam2));
double delx = xatom[lammps_j][0] - xatom[lammps_k][0];
double dely = xatom[lammps_j][1] - xatom[lammps_k][1];
double delz = xatom[lammps_j][2] - xatom[lammps_k][2];
double rsq = delx*delx + dely*dely + delz*delz;
double fforce = 0;
lammpsInterface_->pair_force(lammps_j,lammps_k,rsq,fforce);
fforce *= 0.5; // dbl count
if (atomToElementMapType_ == LAGRANGIAN) {
double delX = xref_[lammps_j][0] - xref_[lammps_k][0];
double delY = xref_[lammps_j][1] - xref_[lammps_k][1];
double delZ = xref_[lammps_j][2] - xref_[lammps_k][2];
stress(inode,0) +=-delx*fforce*delX*bond_value;
stress(inode,1) +=-delx*fforce*delY*bond_value;
stress(inode,2) +=-delx*fforce*delZ*bond_value;
stress(inode,3) +=-dely*fforce*delX*bond_value;
stress(inode,4) +=-dely*fforce*delY*bond_value;
stress(inode,5) +=-dely*fforce*delZ*bond_value;
stress(inode,6) +=-delz*fforce*delX*bond_value;
stress(inode,7) +=-delz*fforce*delY*bond_value;
stress(inode,8) +=-delz*fforce*delZ*bond_value;
}
else { //EULERIAN
stress(inode,0) +=-delx*delx*fforce*bond_value;
stress(inode,1) +=-dely*dely*fforce*bond_value;
stress(inode,2) +=-delz*delz*fforce*bond_value;
stress(inode,3) +=-delx*dely*fforce*bond_value;
stress(inode,4) +=-delx*delz*fforce*bond_value;
stress(inode,5) +=-dely*delz*fforce*bond_value;
}
}
}
}
}
ATC::LammpsInterface::instance()->stream_msg_once("done",false,true);
}
//-------------------------------------------------------------------
// on-the-fly calculation of the heat flux
void ATC_TransferKernel::compute_potential_heatflux(DENS_MAT& flux)
{
set_xPointer();
flux.zero();
// neighbor lists
int *numneigh = lammpsInterface_->neighbor_list_numneigh();
int **firstneigh = lammpsInterface_->neighbor_list_firstneigh();
double ** xatom = lammpsInterface_->xatom();
double ** vatom = lammpsInterface_->vatom();
double lam1,lam2;
double bond_value;
// process differently for mesh vs translation-invariant kernels
// "normal" kernel functions
DENS_VEC xa(nsd_),xI(nsd_),xaI(nsd_),xb(nsd_),xbI(nsd_),xba(nsd_);
double kernel_inv_vol = kernelFunction_->inv_vol();
for (int i = 0; i < nNodes_; i++) {
int inode = i;
// point
xI = (feEngine_->fe_mesh())->nodal_coordinates(i);
if (!kernelFunction_->node_contributes(xI)) {
continue;
}
for (int j = 0; j < nLocal_; j++) {
int lammps_j = internalToAtom_(j);
xa.copy(xPointer_[lammps_j],3);
// difference vector
xaI = xa - xI;
lammpsInterface_->periodicity_correction(xaI.ptr());
for (int k = 0; k < numneigh[lammps_j]; ++k) {
int lammps_k = firstneigh[lammps_j][k];
// first atom location
xb.copy(xPointer_[lammps_k],3);
// difference vector
xba = xb - xa;
xbI = xba + xaI;
kernelFunction_->bond_intercepts(xaI,xbI,lam1,lam2);
// compute virial
if (lam1 < lam2) {
bond_value
= kernel_inv_vol*(kernelFunction_->bond(xaI,xbI,lam1,lam2));
double delx = xatom[lammps_j][0] - xatom[lammps_k][0];
double dely = xatom[lammps_j][1] - xatom[lammps_k][1];
double delz = xatom[lammps_j][2] - xatom[lammps_k][2];
double rsq = delx*delx + dely*dely + delz*delz;
double fforce = 0;
lammpsInterface_->pair_force(lammps_j,lammps_k,rsq,fforce);
fforce *= 0.5; // dbl count
double * v = vatom[lammps_j];
fforce *= (delx*v[0] + dely*v[1] + delz*v[2]);
if (atomToElementMapType_ == LAGRANGIAN) {
double delX = xref_[lammps_j][0] - xref_[lammps_k][0];
double delY = xref_[lammps_j][1] - xref_[lammps_k][1];
double delZ = xref_[lammps_j][2] - xref_[lammps_k][2];
flux(inode,0) +=fforce*delX*bond_value;
flux(inode,1) +=fforce*delY*bond_value;
flux(inode,2) +=fforce*delZ*bond_value;
}
else { // EULERIAN
flux(inode,0) +=fforce*delx*bond_value;
flux(inode,1) +=fforce*dely*bond_value;
flux(inode,2) +=fforce*delz*bond_value;
}
}
}
}
}
}
//-------------------------------------------------------------------
// calculation of the dislocation density tensor
void ATC_TransferKernel::compute_dislocation_density(DENS_MAT & A)
{
A.reset(nNodes_,9);
#ifdef HAS_DXA
double cnaCutoff = lammpsInterface_->near_neighbor_cutoff();
// Extract dislocation lines within the processor's domain.
DXADislocationExtractor extractor(lammpsInterface_->lammps_pointer(),dxaExactMode_);
extractor.extractDislocations(lammpsInterface_->neighbor_list(), cnaCutoff);
// Calculate scalar dislocation density and density tensor.
double dislocationDensity = 0.0;
double dislocationDensityTensor[9] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
const std::vector<DislocationSegment*>& segments = extractor.getSegments();
int localNumberLines = (int) segments.size();
int totalNumberLines;
lammpsInterface_->int_allsum(&localNumberLines,&totalNumberLines,1);
if (totalNumberLines == 0) {
ATC::LammpsInterface::instance()->print_msg_once("no dislocation lines found");
return;
}
// for output
int nPt = 0, nSeg = 0;
for(unsigned segmentIndex = 0; segmentIndex < segments.size(); segmentIndex++) {
DislocationSegment* segment = segments[segmentIndex];
const std::deque<Point3>& line = segment->line;
nPt += line.size();
nSeg += line.size()-1;
}
DENS_MAT segCoor(3,nPt);
Array2D<int> segConn(2,nSeg);
DENS_MAT segBurg(nPt,3);
DENS_MAT local_A(nNodes_,9);
local_A.zero();
DENS_VEC xa(nsd_),xI(nsd_),xaI(nsd_),xb(nsd_),xbI(nsd_),xba(nsd_);
double kernel_inv_vol = kernelFunction_->inv_vol();
int iPt = 0, iSeg= 0;
for(unsigned segmentIndex = 0; segmentIndex < segments.size(); segmentIndex++) {
DislocationSegment* segment = segments[segmentIndex];
const std::deque<Point3>& line = segment->line;
Vector3 burgers = segment->burgersVectorWorld;
Point3 x1, x2;
for(std::deque<Point3>::const_iterator p1 = line.begin(), p2 = line.begin() + 1; p2 < line.end(); ++p1, ++p2) {
x1 = (*p1);
x2 = (*p2);
Vector3 delta = x2 - x1;
// totals
dislocationDensity += Length(delta);
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
dislocationDensityTensor[3*j+i] += delta[i] * burgers[j];
}
}
// nodal partition
for(int k = 0; k < 3; k++) {
xa(k) = x1[k];
xb(k) = x2[k];
xba(k) = delta[k];
}
for (int I = 0; I < nNodes_; I++) {
xI = (feEngine_->fe_mesh())->nodal_coordinates(I);
if (!kernelFunction_->node_contributes(xI)) {
continue;
}
xaI = xa - xI;
lammpsInterface_->periodicity_correction(xaI.ptr());
xbI = xba + xaI;
double lam1=0,lam2=0;
kernelFunction_->bond_intercepts(xaI,xbI,lam1,lam2);
if (lam1 < lam2) {
double bond_value
= kernel_inv_vol*(kernelFunction_->bond(xaI,xbI,lam1,lam2));
local_A(I,0) += xba(0)*burgers[0]*bond_value;
local_A(I,1) += xba(0)*burgers[1]*bond_value;
local_A(I,2) += xba(0)*burgers[2]*bond_value;
local_A(I,3) += xba(1)*burgers[0]*bond_value;
local_A(I,4) += xba(1)*burgers[1]*bond_value;
local_A(I,5) += xba(1)*burgers[2]*bond_value;
local_A(I,6) += xba(2)*burgers[0]*bond_value;
local_A(I,7) += xba(2)*burgers[1]*bond_value;
local_A(I,8) += xba(2)*burgers[2]*bond_value;
}
}
segCoor(0,iPt) = x1[0];
segCoor(1,iPt) = x1[1];
segCoor(2,iPt) = x1[2];
segBurg(iPt,0) = burgers[0];
segBurg(iPt,1) = burgers[1];
segBurg(iPt,2) = burgers[2];
segConn(0,iSeg) = iPt;
segConn(1,iSeg) = iPt+1;
iPt++;
iSeg++;
}
segCoor(0,iPt) = x2[0];
segCoor(1,iPt) = x2[1];
segCoor(2,iPt) = x2[2];
segBurg(iPt,0) = burgers[0];
segBurg(iPt,1) = burgers[1];
segBurg(iPt,2) = burgers[2];
iPt++;
}
int count = nNodes_*9;
lammpsInterface_->allsum(local_A.ptr(),A.ptr(),count);
double totalDislocationDensity;
lammpsInterface_->allsum(&dislocationDensity,&totalDislocationDensity,1);
double totalDislocationDensityTensor[9];
lammpsInterface_->allsum(dislocationDensityTensor,totalDislocationDensityTensor,9);
int totalNumberSegments;
lammpsInterface_->int_allsum(&nSeg,&totalNumberSegments,1);
// output
double volume = lammpsInterface_->domain_volume();
stringstream ss;
ss << "total dislocation line length = " << totalDislocationDensity;
ss << " lines = " << totalNumberLines << " segments = " << totalNumberSegments;
ss << "\n ";
ss << "total dislocation density tensor = \n";
for(int i = 0; i < 3; i++) {
ss << " ";
for(int j = 0; j < 3; j++) {
totalDislocationDensityTensor[3*j+i] /= volume;
ss << totalDislocationDensityTensor[3*j+i] << " ";
}
ss << "\n";
}
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
if (nSeg > 0) {
set<int> otypes;
otypes.insert(VTK);
otypes.insert(FULL_GNUPLOT);
string name = "dislocation_segments_step=" ;
name += to_string(output_index());
OutputManager segOutput(name,otypes);
segOutput.write_geometry(&segCoor,&segConn);
OUTPUT_LIST segOut;
segOut["burgers_vector"] = &segBurg;
segOutput.write_data(0,&segOut);
}
#else
throw ATC_Error("unimplemented function compute_dislocation_density (DXA support not included");
#endif
}
} // end namespace ATC
diff --git a/lib/atc/ATC_TypeDefs.h b/lib/atc/ATC_TypeDefs.h
index e3e5f794c..ab24a8a22 100644
--- a/lib/atc/ATC_TypeDefs.h
+++ b/lib/atc/ATC_TypeDefs.h
@@ -1,622 +1,626 @@
#ifndef ATC_TYPEDEFS_H
#define ATC_TYPEDEFS_H
#include <set>
-using std::pair;
-using std::set;
+#include <vector>
+#include <map>
+#include <utility>
+#include <string>
#ifdef NEW_LAMMPS
#include "lmptype.h"
#endif
#include "Array.h"
#include "Array2D.h"
-using namespace ATC_matrix;
-
#include "MatrixLibrary.h"
#include "DependencyManager.h"
namespace ATC
{
/** physical constants */
static const double kBeV_ = 8.617343e-5;// [eV/K]
/** unsigned ints, when needed */
typedef int INDEX;
/** elementset integral */
enum ElementsetOperationType {
ELEMENTSET_TOTAL=0,
ELEMENTSET_AVERAGE
};
/** faceset integral */
enum FacesetIntegralType {
BOUNDARY_INTEGRAL=0,
CONTOUR_INTEGRAL
};
/** nodeset operation */
enum NodesetOperationType {
NODESET_SUM=0,
NODESET_AVERAGE
};
/** boundary integration */
enum BoundaryIntegrationType {
NO_QUADRATURE=0,
FE_QUADRATURE,
FE_INTERPOLATION
};
/** domain integration */
enum IntegrationDomainType {
FULL_DOMAIN=0,
ATOM_DOMAIN,
FE_DOMAIN,
FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE
};
/** domain decomposition */
enum DomainDecompositionType {
REPLICATED_MEMORY=0,
DISTRIBUTED_MEMORY
};
/** atomic weight specification */
enum AtomicWeightType {
USER=0,
LATTICE,
ELEMENT,
REGION,
GROUP,
MULTISCALE,
NODE,
NODE_ELEMENT,
READ_IN
};
/** geometry location with respect to MD domain */
enum GeometryType {
FE_ONLY = 0,
MD_ONLY,
BOUNDARY
};
/** enumerated type for atomic reference frame */
enum AtomToElementMapType {
LAGRANGIAN=0,
EULERIAN
};
/* enumerated type for coupling matrix structure */
enum MatrixStructure {
FULL=0, // contributions from all nodes
LOCALIZED, // contributions only from nodes with sources
LUMPED // row-sum lumped version of full matrix
};
/* enumerated type for distinguishing ghost from internal atoms */
enum AtomType {
INTERNAL=0,
GHOST,
ALL,
PROC_GHOST,
NO_ATOMS,
NUM_ATOM_TYPES
};
/** field types */
enum FieldName {
TIME=-2,
POSITION=-1,
TEMPERATURE=0, // Intrinsic Fields
DISPLACEMENT,
VELOCITY,
MASS_DENSITY,
CHARGE_DENSITY,
SPECIES_CONCENTRATION,
ELECTRON_DENSITY, // Extrinsic Fields
ELECTRON_VELOCITY,
ELECTRON_TEMPERATURE,
ELECTRIC_POTENTIAL,
ELECTRON_WAVEFUNCTION,
ELECTRON_WAVEFUNCTIONS,
ELECTRON_WAVEFUNCTION_ENERGIES,
FERMI_ENERGY,
MOMENTUM,
PROJECTED_VELOCITY,
KINETIC_TEMPERATURE,
THERMAL_ENERGY,
KINETIC_ENERGY,
STRESS,
+ KINETIC_STRESS,
HEAT_FLUX,
CHARGE_FLUX,
SPECIES_FLUX,
INTERNAL_ENERGY,
REFERENCE_POTENTIAL_ENERGY,
POTENTIAL_ENERGY,
ENERGY,
NUMBER_DENSITY,
ESHELBY_STRESS,
CAUCHY_BORN_STRESS,
CAUCHY_BORN_ENERGY,
CAUCHY_BORN_ESHELBY_STRESS,
TRANSFORMED_STRESS,
VACANCY_CONCENTRATION,
ROTATION,
STRETCH,
DIPOLE_MOMENT,
QUADRUPOLE_MOMENT,
CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT,
DISLOCATION_DENSITY,
NUM_TOTAL_FIELDS
};
const int NUM_FIELDS = ELECTRON_WAVEFUNCTION+1;
#define NDIM 3
static const int FieldSizes[NUM_TOTAL_FIELDS] = {
1, // TEMPERATURE
NDIM, // DISPLACEMENT
NDIM, // VELOCITY
1, // MASS_DENSITY
1, // CHARGE_DENSITY
0, // SPECIES_CONCENTRATION - VARIABLE
1, // ELECTRON_DENSITY
NDIM, // ELECTRON_VELOCITY
1, // ELECTRON_TEMPERATURE
1, // ELECTRIC_POTENTIAL
1, // ELECTRON_WAVEFUNCTION ?
0, // ELECTRON_WAVEFUNCTIONS - VARIABLE
0, // ELECTRON_WAVEFUNCTION_ENERGIES - VARIABLE
1, // FERMI_ENERGY
NDIM, // MOMENTUM
NDIM, // PROJECTED_VELOCITY
1, // KINETIC_TEMPERATURE
1, // THERMAL_ENERGY
1, // KINETIC_ENERGY
NDIM*NDIM, // STRESS
+ NDIM*NDIM, // KINETIC_STRESS
NDIM, // HEAT_FLUX
NDIM, // CHARGE_FLUX
0, // SPECIES_FLUX - VARIABLE
1, // INTERNAL_ENERGY
1, // REFERENCE_POTENTIAL_ENERGY
1, // POTENTIAL_ENERGY
1, // ENERGY
1, // NUMBER_DENSITY
NDIM*NDIM, // ESHELBY_STRESS
NDIM*NDIM, // CAUCHY_BORN_STRESS,
1, // CAUCHY_BORN_ENERGY,
NDIM*NDIM, // CAUCHY_BORN_ESHELBY_STRESS,
NDIM*NDIM, // TRANSFORMED_STRESS,
1, // VACANCY_CONCENTRATION,
NDIM*NDIM, // ROTATION,
NDIM*NDIM, // STRETCH,
NDIM, // DIPOLE_MOMENT,
NDIM, // QUADRUPOLE_MOMENT,
NDIM*NDIM, // CAUCHY_BORN_ELASTIC_DEFORMATION_GRADIENT,
NDIM*NDIM // DISLOCATION_DENSITY
};
- enum hardyNormalization {
+ enum NodalAtomicFieldNormalization {
NO_NORMALIZATION=0,
- VOLUME_NORMALIZATION, NUMBER_NORMALIZATION, MASS_NORMALIZATION
+ VOLUME_NORMALIZATION, NUMBER_NORMALIZATION, MASS_NORMALIZATION,
+ MASS_MATRIX
};
+ inline FieldName use_mass_matrix(FieldName in) {
+ if (in == TEMPERATURE) return in;
+ else return MASS_DENSITY;
+ }
+
/** enums for FE Element and Interpolate classes */
enum FeEltGeometry {HEXA, TETRA};
enum FeIntQuadrature {NODAL, GAUSS1, GAUSS2, GAUSS3, FACE};
/** field name enum to string */
- inline FeIntQuadrature string_to_FIQ(const string &str)
+ inline FeIntQuadrature string_to_FIQ(const std::string &str)
{
if (str == "nodal")
return NODAL;
else if (str == "gauss1")
return GAUSS1;
else if (str == "gauss2")
return GAUSS2;
else if (str == "gauss3")
return GAUSS3;
else if (str == "face")
return FACE;
else
throw ATC_Error("Bad quadrature input" + str + ".");
}
/** field name enum to string */
- inline string field_to_string(const FieldName index)
+ inline std::string field_to_string(const FieldName index)
{
switch (index) {
case TEMPERATURE:
return "temperature";
case DISPLACEMENT:
return "displacement";
case VELOCITY:
return "velocity";
case MASS_DENSITY:
return "mass_density";
case CHARGE_DENSITY:
return "charge_density";
case ELECTRON_DENSITY:
return "electron_density";
case ELECTRON_VELOCITY:
return "electron_velocity";
case ELECTRON_TEMPERATURE:
return "electron_temperature";
case ELECTRIC_POTENTIAL:
return "electric_potential";
case ELECTRON_WAVEFUNCTION:
return "electron_wavefunction";
case ELECTRON_WAVEFUNCTIONS:
return "electron_wavefunctions";
case ELECTRON_WAVEFUNCTION_ENERGIES:
return "electron_wavefunction_energies";
case FERMI_ENERGY:
return "fermi_energy";
case MOMENTUM:
return "momentum";
case PROJECTED_VELOCITY:
return "projected_velocity";
case KINETIC_TEMPERATURE:
return "kinetic_temperature";
case THERMAL_ENERGY:
return "thermal_energy";
case KINETIC_ENERGY:
return "kinetic_energy";
case STRESS:
return "stress";
+ case KINETIC_STRESS:
+ return "kinetic_stress";
case ESHELBY_STRESS:
return "eshelby_stress";
case CAUCHY_BORN_STRESS:
return "cauchy_born_stress";
case CAUCHY_BORN_ENERGY:
return "cauchy_born_energy";
case CAUCHY_BORN_ESHELBY_STRESS:
return "cauchy_born_eshelby_stress";
case HEAT_FLUX:
return "heat_flux";
case CHARGE_FLUX:
return "charge_flux";
case SPECIES_FLUX:
return "species_flux";
case INTERNAL_ENERGY:
return "internal_energy";
case POTENTIAL_ENERGY:
return "potential_energy";
case REFERENCE_POTENTIAL_ENERGY:
return "reference_potential_energy";
case ENERGY:
return "energy";
case NUMBER_DENSITY:
return "number_density";
case TRANSFORMED_STRESS:
return "transformed_stress";
case VACANCY_CONCENTRATION:
return "vacancy_concentration";
case SPECIES_CONCENTRATION:
return "species_concentration";
case ROTATION:
return "rotation";
case STRETCH:
return "stretch";
case DIPOLE_MOMENT:
return "dipole_moment";
case QUADRUPOLE_MOMENT:
return "quadrupole_moment";
default:
throw ATC_Error("field not found in field_to_string");
}
};
/** string to field enum */
- inline FieldName string_to_field(const string & name)
+ inline FieldName string_to_field(const std::string & name)
{
if (name=="temperature")
return TEMPERATURE;
else if (name=="displacement")
return DISPLACEMENT;
else if (name=="velocity")
return VELOCITY;
else if (name=="mass_density")
return MASS_DENSITY;
else if (name=="charge_density")
return CHARGE_DENSITY;
else if (name=="electron_density")
return ELECTRON_DENSITY;
else if (name=="electron_velocity")
return ELECTRON_VELOCITY;
else if (name=="electron_temperature")
return ELECTRON_TEMPERATURE;
else if (name=="electric_potential")
return ELECTRIC_POTENTIAL;
else if (name=="electron_wavefunction")
return ELECTRON_WAVEFUNCTION;
else if (name=="electron_wavefunctions")
return ELECTRON_WAVEFUNCTIONS;
else if (name=="electron_wavefunction_energies")
return ELECTRON_WAVEFUNCTION_ENERGIES;
else if (name=="fermi_energy")
return FERMI_ENERGY;
else if (name=="momentum")
return MOMENTUM;
else if (name=="projected_velocity")
return PROJECTED_VELOCITY;
else if (name=="kinetic_temperature")
return KINETIC_TEMPERATURE; // temperature from total KE
else if (name=="thermal_energy")
return THERMAL_ENERGY;
else if (name=="kinetic_energy")
return KINETIC_ENERGY;
else if (name=="stress")
return STRESS;
+ else if (name=="kinetic_stress")
+ return KINETIC_STRESS;
else if (name=="eshelby_stress")
return ESHELBY_STRESS;
else if (name=="cauchy_born_stress")
return CAUCHY_BORN_STRESS;
else if (name=="cauchy_born_energy")
return CAUCHY_BORN_ENERGY;
else if (name=="cauchy_born_eshelby_stress")
return CAUCHY_BORN_ESHELBY_STRESS;
else if (name=="heat_flux")
return HEAT_FLUX;
else if (name=="charge_flux")
return CHARGE_FLUX;
else if (name=="species_flux")
return SPECIES_FLUX;
else if (name=="internal_energy")
return INTERNAL_ENERGY;
else if (name=="reference_potential_energy")
return REFERENCE_POTENTIAL_ENERGY;
else if (name=="potential_energy")
return POTENTIAL_ENERGY;
else if (name=="energy")
return ENERGY;
else if (name=="number_density")
return NUMBER_DENSITY;
else if (name=="transformed_stress")
return TRANSFORMED_STRESS;
else if (name=="vacancy_concentration")
return VACANCY_CONCENTRATION;
else if (name=="species_concentration")
return SPECIES_CONCENTRATION;
else if (name=="rotation")
return ROTATION;
else if (name=="stretch")
return STRETCH;
else if (name=="dipole_moment")
return DIPOLE_MOMENT;
else if (name=="quadrupole_moment")
return QUADRUPOLE_MOMENT;
else
throw ATC_Error(name + " is not a valid field");
};
inline bool is_intrinsic(const FieldName & field_enum)
{
if (field_enum==TEMPERATURE
|| field_enum==DISPLACEMENT
|| field_enum==VELOCITY
|| field_enum==MASS_DENSITY
|| field_enum==CHARGE_DENSITY
|| field_enum==SPECIES_CONCENTRATION
|| field_enum==KINETIC_TEMPERATURE
|| field_enum==POTENTIAL_ENERGY
|| field_enum==REFERENCE_POTENTIAL_ENERGY
) return true;
else return false;
};
- inline string field_to_intrinsic_name(const FieldName index)
+ inline std::string field_to_intrinsic_name(const FieldName index)
{
if (is_intrinsic(index)) {
return "NodalAtomic"+ATC_Utility::to_cap(field_to_string(index));
}
else {
throw ATC_Error("field "+field_to_string(index)+" is not an intrinsic field");
}
}
- inline string field_to_restriction_name(const FieldName index)
+ inline std::string field_to_restriction_name(const FieldName index)
{
if (is_intrinsic(index)) {
return "Restricted"+ATC_Utility::to_cap(field_to_string(index));
}
else {
throw ATC_Error("field "+field_to_string(index)+" is not an intrinsic field");
}
}
- inline string field_to_prolongation_name(const FieldName index)
+ inline std::string field_to_prolongation_name(const FieldName index)
{
return "Prolonged"+ATC_Utility::to_cap(field_to_string(index));
}
/** types of temperature definitions */
enum TemperatureDefType {
NONE = 0,
KINETIC,
TOTAL
};
- /** types of ghost boundary conditions in momentum */
- enum BoundaryDynamicsType {
- NO_BOUNDARY_DYNAMICS=0,
- PRESCRIBED,
- DAMPED_HARMONIC,
- COUPLED
- };
-
/** string to temperature definition enum */
- inline bool string_to_temperature_def(const string & name, TemperatureDefType & index) {
+ inline bool string_to_temperature_def(const std::string & name, TemperatureDefType & index) {
if (name=="none")
index = NONE;
else if (name=="kinetic")
index = KINETIC;
else if (name=="total")
index = TOTAL;
else {
throw ATC_Error("temperature operator type "+name+" not valid");
return false;
}
return true;
};
/** solver types */
enum SolverType { DIRECT=0, ITERATIVE};
enum DirichletType {DIRICHLET_PENALTY=0, DIRICHLET_CONDENSE};
/** physics types */
enum PhysicsType
{
NO_PHYSICS=0, // for post-processing only
THERMAL,
ELASTIC,
SHEAR,
THERMO_ELASTIC,
SPECIES // aka Mass
};
/** rhs types */
enum FluxType
{
FLUX = 0, // has a source weighted by gradient of shape function
SOURCE, // has a source term weighted by the shape function
PRESCRIBED_SOURCE, // has a prescribed source term
ROBIN_SOURCE, // has a Robin source term
EXTRINSIC_SOURCE, // has an extrinsic source term
NUM_FLUX
};
/** stiffness/ derivative of rhs types */
enum StiffnessType
{
BB_STIFFNESS = 0,
NN_STIFFNESS,
BN_STIFFNESS,
NB_STIFFNESS,
NUM_STIFFNESS
};
/** LAMMPS atom type identifiers */
enum IdType {
ATOM_TYPE=0,
ATOM_GROUP
};
/** molecule size identifiers */
enum MolSize {
MOL_SMALL=0,
MOL_LARGE
};
/** basic */
- typedef pair<int, int> PAIR;
+ typedef std::pair<int, int> PAIR;
/** typedefs for compact set of bc values */
- typedef set < pair < int, double> > BC_SET; // node, value
- typedef vector< BC_SET > BCS; // dof (node, value)
- typedef set<int> NSET; // nodeset
- typedef set<PAIR> FSET; // faceset
- typedef set<int> ESET; // elementset
+ typedef std::set < std::pair < int, double> > BC_SET; // node, value
+ typedef std::vector< BC_SET > BCS; // dof (node, value)
+ typedef std::set<int> NSET; // nodeset
+ typedef std::set<PAIR> FSET; // faceset
+ typedef std::set<int> ESET; // elementset
/** typedefs for N and B integrand functions */
- typedef set<FieldName> ARG_NAMES;
- typedef map<FieldName, DenseMatrix<double> > ARGS;
- typedef MatrixDependencyManager<DenseMatrix, double> FIELD;
- typedef vector<MatrixDependencyManager<DenseMatrix, double> > GRAD_FIELD;
- typedef map<FieldName, MatrixDependencyManager<DenseMatrix, double> > FIELDS;
- typedef map<FieldName, MatrixDependencyManager<DenseMatrix, double> * > FIELD_POINTERS;
- typedef map<FieldName, DenseMatrix<double> > FIELD_MATS;
- typedef map<string, MatrixDependencyManager<DenseMatrix, double> > TAG_FIELDS;
- typedef map<FieldName, vector<MatrixDependencyManager<DenseMatrix, double> > > GRAD_FIELDS;
- typedef map<FieldName, vector<DenseMatrix<double> > > GRAD_FIELD_MATS;
- typedef map<FieldName, MatrixDependencyManager<DiagonalMatrix, double> > MASS_MATS;
- typedef map<FieldName, MatrixDependencyManager<SparseMatrix, double> > CON_MASS_MATS;
- typedef MatrixDependencyManager<DenseMatrix, double> DENS_MAN;
- typedef MatrixDependencyManager<SparseMatrix, double> SPAR_MAN;
- typedef MatrixDependencyManager<ParSparseMatrix, double> PAR_SPAR_MAN;
- typedef MatrixDependencyManager<DiagonalMatrix, double> DIAG_MAN;
- typedef MatrixDependencyManager<ParDiagonalMatrix, double> PAR_DIAG_MAN;
+ typedef std::set<FieldName> ARG_NAMES;
+ typedef std::map<FieldName, ATC_matrix::DenseMatrix<double> > ARGS;
+ typedef ATC::MatrixDependencyManager<ATC_matrix::DenseMatrix, double> FIELD;
+ typedef std::vector<ATC::MatrixDependencyManager<ATC_matrix::DenseMatrix, double> > GRAD_FIELD;
+ typedef std::map<FieldName, ATC::MatrixDependencyManager<ATC_matrix::DenseMatrix, double> > FIELDS;
+ typedef std::map<FieldName, ATC::MatrixDependencyManager<ATC_matrix::DenseMatrix, double> * > FIELD_POINTERS;
+ typedef std::map<FieldName, ATC_matrix::DenseMatrix<double> > FIELD_MATS;
+ typedef std::map<std::string, ATC::MatrixDependencyManager<ATC_matrix::DenseMatrix, double> > TAG_FIELDS;
+ typedef std::map<FieldName, std::vector<ATC::MatrixDependencyManager<ATC_matrix::DenseMatrix, double> > > GRAD_FIELDS;
+ typedef std::map<FieldName, std::vector<ATC_matrix::DenseMatrix<double> > > GRAD_FIELD_MATS;
+ typedef std::map<FieldName, ATC::MatrixDependencyManager<DiagonalMatrix, double> > MASS_MATS;
+ typedef std::map<FieldName, ATC::MatrixDependencyManager<SparseMatrix, double> > CON_MASS_MATS;
+ typedef ATC::MatrixDependencyManager<ATC_matrix::DenseMatrix, double> DENS_MAN;
+ typedef ATC::MatrixDependencyManager<SparseMatrix, double> SPAR_MAN;
+ typedef ATC::MatrixDependencyManager<ParSparseMatrix, double> PAR_SPAR_MAN;
+ typedef ATC::MatrixDependencyManager<DiagonalMatrix, double> DIAG_MAN;
+ typedef ATC::MatrixDependencyManager<ParDiagonalMatrix, double> PAR_DIAG_MAN;
/** typedefs for WeakEquation evaluation */
typedef Array2D<bool> RHS_MASK;
/** typedefs for input/output */
- typedef map<string, const Matrix<double>*> OUTPUT_LIST;
- typedef map<string, Matrix<double>*> RESTART_LIST;
+ typedef std::map<std::string, const ATC_matrix::Matrix<double>*> OUTPUT_LIST;
+ typedef std::map<std::string, ATC_matrix::Matrix<double>*> RESTART_LIST;
- typedef pair<int, int> ID_PAIR;
- typedef vector< pair<int, int> > ID_LIST;
+ typedef std::pair<int, int> ID_PAIR;
+ typedef std::vector< std::pair<int, int> > ID_LIST;
/** misc typedefs */
class XT_Function;
class UXT_Function;
- typedef map<FieldName, map<PAIR, Array<XT_Function*> > > SURFACE_SOURCE;
- typedef map<FieldName, map<PAIR, Array<UXT_Function*> > > ROBIN_SURFACE_SOURCE;
- typedef map<FieldName, Array2D<XT_Function *> > VOLUME_SOURCE;
- typedef map<string, MatrixDependencyManager<DenseMatrix, double> > ATOMIC_DATA;
+ typedef std::map<FieldName, std::map<PAIR, Array<XT_Function*> > > SURFACE_SOURCE;
+ typedef std::map<FieldName, std::map<PAIR, Array<UXT_Function*> > > ROBIN_SURFACE_SOURCE;
+ typedef std::map<FieldName, Array2D<XT_Function *> > VOLUME_SOURCE;
+ typedef std::map<std::string, ATC::MatrixDependencyManager<ATC_matrix::DenseMatrix, double> > ATOMIC_DATA;
/** typedefs for FE_Mesh */
- typedef map<string, set<int > > NODE_SET_MAP;
- typedef map<string, set<int > > ELEMENT_SET_MAP;
- typedef map<string, set<PAIR> > FACE_SET_MAP;
+ typedef std::map<std::string, std::set<int > > NODE_SET_MAP;
+ typedef std::map<std::string, std::set<int > > ELEMENT_SET_MAP;
+ typedef std::map<std::string, std::set<PAIR> > FACE_SET_MAP;
/** string to index */
// inline vs. static is used to avoid compiler warnings that the function isn't used
// the compiler seems to just check if static functions are used in the file they're
// declared in rather than all the files that include the header,
// same for arrays (but not primitives, e.g. ints) hopefully this also speeds up the code
- inline bool string_to_index(const string & dim, int & index, int & sgn)
+ inline bool string_to_index(const std::string & dim, int & index, int & sgn)
{
char dir;
if (dim.empty()) return false;
sgn = (dim[0] == '-') ? -1 : 1;
dir = dim[dim.size()-1]; // dir is last character
if (dir == 'x') index = 0;
else if (dir == 'y') index = 1;
else if (dir == 'z') index = 2;
else return false;
return true;
};
/** string to index */
- inline string index_to_string(const int &index)
+ inline std::string index_to_string(const int &index)
{
if (index==0) return "x";
else if (index==1) return "y";
else if (index==2) return "z";
return "unknown";
};
/** string to index */
- inline bool string_to_index(const string &dim, int &index)
+ inline bool string_to_index(const std::string &dim, int &index)
{
if (dim=="x")
index = 0;
else if (dim=="y")
index = 1;
else if (dim=="z")
index = 2;
else
return false;
return true;
};
- inline string print_mask(const Array2D<bool> & rhsMask)
+ inline std::string print_mask(const Array2D<bool> & rhsMask)
{
- string msg;
+ std::string msg;
for (int i = 0; i < NUM_FIELDS; i++) {
FieldName field = (FieldName) i;
- string name = field_to_string(field);
+ std::string name = field_to_string(field);
if (rhsMask(field,FLUX)
|| rhsMask(field,SOURCE)
|| rhsMask(field,PRESCRIBED_SOURCE)
|| rhsMask(field,ROBIN_SOURCE)
|| rhsMask(field,EXTRINSIC_SOURCE)) {
msg = "RHS_MASK: " + name;
if (rhsMask(field,FLUX)) msg += " flux";
if (rhsMask(field,SOURCE)) msg += " source";
if (rhsMask(field,PRESCRIBED_SOURCE)) msg += " prescribed_src";
if (rhsMask(field,ROBIN_SOURCE)) msg += " robin_src";
if (rhsMask(field,EXTRINSIC_SOURCE)) msg += " extrinsic_src";
}
}
return msg;
}
}
#endif
diff --git a/lib/atc/AtomToMoleculeTransfer.cpp b/lib/atc/AtomToMoleculeTransfer.cpp
index 6cb139e2a..21293967b 100644
--- a/lib/atc/AtomToMoleculeTransfer.cpp
+++ b/lib/atc/AtomToMoleculeTransfer.cpp
@@ -1,223 +1,225 @@
// ATC headers
#include "AtomToMoleculeTransfer.h"
#include "ATC_Method.h"
+using std::set;
+
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class SmallMoleculeCentroid
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
SmallMoleculeCentroid::SmallMoleculeCentroid(ATC_Method * atc, PerAtomQuantity<double> * source, SmallMoleculeSet * smallMoleculeSet, PerAtomQuantity<double> * atomPositions) : AtomToSmallMoleculeTransfer<double>(atc, source, smallMoleculeSet), atomPositions_(atomPositions)
{
atomPositions_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
SmallMoleculeCentroid::~SmallMoleculeCentroid()
{
atomPositions_->remove_dependence(this);
}
//--------------------------------------------------------
// Quantity
//--------------------------------------------------------
void SmallMoleculeCentroid::reset_quantity() const
{
const LammpsInterface * lammps(atc_->lammps_interface());
const DENS_MAT & sourceMatrix(source_->quantity()); // source is always a scalar quantity here \sum m_i \x_i
double xi[3], xj[3], xjImage[3];
const DENS_MAT & atomPosMatrix(atomPositions_->quantity());
int nLocalMol = smallMoleculeSet_->local_molecule_count();
quantity_.reset(nLocalMol,atc_->nsd());
for (int i = 0; i < nLocalMol; i++) {
const set<int> & atomsLocalMolArray = smallMoleculeSet_->atoms_by_local_molecule(i);
set<int>::const_iterator atomsLocalMolID;
double totalSourceMol = 0.0; // for total source
for (atomsLocalMolID = atomsLocalMolArray.begin(); atomsLocalMolID != atomsLocalMolArray.end(); atomsLocalMolID++) {
totalSourceMol += sourceMatrix(*atomsLocalMolID,0);
} // compute total source
atomsLocalMolID = atomsLocalMolArray.begin();
for (int j = 0; j < atc_->nsd(); j++) {
xi[j] = atomPosMatrix(*atomsLocalMolID,j);
}
for (atomsLocalMolID = atomsLocalMolArray.begin(); atomsLocalMolID != atomsLocalMolArray.end(); atomsLocalMolID++) {
for (int j = 0; j < atc_->nsd(); j++){
xj[j] = atomPosMatrix(*atomsLocalMolID,j);
}
lammps->closest_image(xi,xj,xjImage);
for (int j = 0; j < atc_->nsd() ; j++) {
quantity_(i,j) += sourceMatrix(*atomsLocalMolID,0) * xjImage[j]/totalSourceMol;
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class SmallMoleculeDipoleMoment
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
SmallMoleculeDipoleMoment::SmallMoleculeDipoleMoment(ATC_Method * atc, PerAtomQuantity<double> * source, SmallMoleculeSet * smallMoleculeSet, PerAtomQuantity<double> * atomPositions, SmallMoleculeCentroid * centroid) : SmallMoleculeCentroid(atc, source, smallMoleculeSet, atomPositions), centroid_(centroid) //check here
{
centroid_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
SmallMoleculeDipoleMoment::~SmallMoleculeDipoleMoment()
{
centroid_->remove_dependence(this);
}
//--------------------------------------------------------
// Quantity
//--------------------------------------------------------
void SmallMoleculeDipoleMoment::reset_quantity() const
{
const LammpsInterface * lammps(atc_->lammps_interface());
const DENS_MAT & sourceMatrix(source_->quantity()); // source is always a scalar quantity here \sum m_i
const DENS_MAT & atomPosMatrix(atomPositions_->quantity());
int nLocalMol = smallMoleculeSet_->local_molecule_count();
int nsd = atc_->nsd();
quantity_.reset(nLocalMol,nsd);
double dx[3];
//call the SmallMoleculeCentroid here to find Centroid ....
const DENS_MAT & centroidMolMatrix(centroid_->quantity());
for (int i = 0; i < nLocalMol; i++) {
const set<int> & atomsLocalMolArray = smallMoleculeSet_->atoms_by_local_molecule(i);
set<int>::const_iterator atomsLocalMolID;;
for (atomsLocalMolID = atomsLocalMolArray.begin(); atomsLocalMolID != atomsLocalMolArray.end();atomsLocalMolID++) {
for (int j = 0; j < nsd; j++) {
dx[j] = atomPosMatrix(*atomsLocalMolID,j) - centroidMolMatrix(i,j);
}
lammps->minimum_image(dx[0], dx[1], dx[2]);
for(int j = 0; j < nsd; j++) {
quantity_(i,j) += sourceMatrix(*atomsLocalMolID,0) * dx[j];
}
}
}
}
//--------------------------------------------------------
// Class SmallMoleculeQuadrupoleMoment
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
SmallMoleculeQuadrupoleMoment::SmallMoleculeQuadrupoleMoment(ATC_Method * atc, PerAtomQuantity<double> * source, SmallMoleculeSet * smallMoleculeSet, PerAtomQuantity<double> * atomPositions, SmallMoleculeCentroid * centroid) : SmallMoleculeCentroid(atc, source, smallMoleculeSet, atomPositions), centroid_(centroid)
{
centroid_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
SmallMoleculeQuadrupoleMoment::~SmallMoleculeQuadrupoleMoment()
{
centroid_->remove_dependence(this);
}
//--------------------------------------------------------
// Quantity
//--------------------------------------------------------
void SmallMoleculeQuadrupoleMoment::reset_quantity() const
{
const LammpsInterface * lammps(atc_->lammps_interface());
const DENS_MAT & sourceMatrix(source_->quantity()); // source is always a scalar quantity here \sum m_i
const DENS_MAT & atomPosMatrix(atomPositions_->quantity());
int nLocalMol = smallMoleculeSet_->local_molecule_count();
int nsd = atc_->nsd();
quantity_.reset(nLocalMol,nsd);
double dx[3];
//call the SmallMoleculeCentroid here to find Centroid ....
const DENS_MAT & centroidMolMatrix(centroid_->quantity());
for (int i = 0; i < nLocalMol; i++) {
const set<int> & atomsLocalMolArray = smallMoleculeSet_->atoms_by_local_molecule(i);
set<int>::const_iterator atomsLocalMolID;;
for (atomsLocalMolID = atomsLocalMolArray.begin(); atomsLocalMolID != atomsLocalMolArray.end();atomsLocalMolID++) {
for (int j = 0; j < nsd; j++) {
dx[j] = atomPosMatrix(*atomsLocalMolID,j) - centroidMolMatrix(i,j);
}
lammps->minimum_image(dx[0], dx[1], dx[2]);
for(int j = 0; j < nsd; j++) {
quantity_(i,j) += 0.5*sourceMatrix(*atomsLocalMolID,0) * dx[j] * dx[2];
/* quantity_(i,3*j) += 0.5*sourceMatrix(*atomsLocalMolID,0) * dx[j]*dx[0];
quantity_(i,3*j+1) += 0.5*sourceMatrix(*atomsLocalMolID,0) * dx[j]*dx[1];
quantity_(i,3*j+2) += 0.5*sourceMatrix(*atomsLocalMolID,0) * dx[j]*dx[2]; */
}
}
}
}
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
MotfShapeFunctionRestriction::MotfShapeFunctionRestriction(PerMoleculeQuantity<double> * source,
SPAR_MAN * shapeFunction) :
MatToMatTransfer<double>(source),
shapeFunction_(shapeFunction)
{
shapeFunction_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
MotfShapeFunctionRestriction::~MotfShapeFunctionRestriction()
{
shapeFunction_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void MotfShapeFunctionRestriction::reset_quantity() const
{
// computes nodeData = N*atomData where N are the shape functions
const DENS_MAT & sourceMatrix(source_->quantity());
// reallocate memory only if sizing has changed
const SPAR_MAT & shapeFunctionMatrix(shapeFunction_->quantity());
quantity_.resize(shapeFunctionMatrix.nCols(),sourceMatrix.nCols());
local_restriction(sourceMatrix,shapeFunctionMatrix);
// communicate for total restriction
int count = quantity_.nRows()*quantity_.nCols();
lammpsInterface_->allsum(_workspace_.ptr(),quantity_.ptr(),count);
}
//--------------------------------------------------------
// local_restriction
//--------------------------------------------------------
void MotfShapeFunctionRestriction::local_restriction(const DENS_MAT & sourceMatrix,
const SPAR_MAT & shapeFunctionMatrix) const
{
if (sourceMatrix.nRows() > 0)
_workspace_ = shapeFunctionMatrix.transMat(sourceMatrix);
else
_workspace_.reset(quantity_.nRows(),quantity_.nCols());
}
} // end namespace
diff --git a/lib/atc/AtomToMoleculeTransfer.h b/lib/atc/AtomToMoleculeTransfer.h
index 95cf61fe9..c6523137a 100644
--- a/lib/atc/AtomToMoleculeTransfer.h
+++ b/lib/atc/AtomToMoleculeTransfer.h
@@ -1,239 +1,239 @@
// A class for defining transfer operations molecular centers of mass (centroid), dipole moments, quadrupole moments
#ifndef ATOM_TO_MOLECULE_TRANSFER_H
#define ATOM_TO_MOLECULE_TRANSFER_H
+#include <set>
+
// ATC_Method headers
#include "TransferOperator.h"
#include "MoleculeSet.h"
#include "PaqAtcUtility.h"
-using namespace std;
-
namespace ATC {
// forward declarations
class ATC_Method;
/**
* @class PerMoleculeQuantity
*
*/
template <typename T>
class PerMoleculeQuantity : public DenseMatrixTransfer<T> {
public:
PerMoleculeQuantity(ATC_Method * atc):DenseMatrixTransfer<T>(), atc_(atc) {};
virtual ~PerMoleculeQuantity() {};
protected:
/** utility object for atc information */
ATC_Method * atc_;
private:
//do not define
PerMoleculeQuantity();
};
/**
* @class AtomtoSmallMoleculeTransfer
* @brief Class for defining objects to transfer total mass or charge of a molecule
*/
template <typename T>
class AtomToSmallMoleculeTransfer : public PerMoleculeQuantity<T> {
public:
//constructor
// had to define all functions in header, not sure why (JAT, 12/14/11)
AtomToSmallMoleculeTransfer(ATC_Method * atc, PerAtomQuantity<T> * source, SmallMoleculeSet * smallMoleculeSet) :
PerMoleculeQuantity<T>(atc),
source_(source),
smallMoleculeSet_(smallMoleculeSet)
{
source_->register_dependence(this);
smallMoleculeSet_->register_dependence(this);
};
//destructor
virtual ~AtomToSmallMoleculeTransfer()
{
source_->remove_dependence(this);
smallMoleculeSet_->remove_dependence(this);
};
// apply transfer operator
void reset_quantity() const
{
const DenseMatrix<T> & sourceMatrix(source_->quantity());
int nLocalMol = smallMoleculeSet_->local_molecule_count();
(this->quantity_).reset(nLocalMol,sourceMatrix.nCols());
for (int i = 0; i < nLocalMol ; i++) {
- const set<int> & atomsLocalMolArray = smallMoleculeSet_->atoms_by_local_molecule(i);
- set<int>::const_iterator atomsLocalMolID;
+ const std::set<int> & atomsLocalMolArray = smallMoleculeSet_->atoms_by_local_molecule(i);
+ std::set<int>::const_iterator atomsLocalMolID;
for (atomsLocalMolID = atomsLocalMolArray.begin(); atomsLocalMolID!= atomsLocalMolArray.end();atomsLocalMolID++) {
for (int j = 0; j < sourceMatrix.nCols(); j++){
(this->quantity_)(i,j) += sourceMatrix(*atomsLocalMolID,j);
}
}
}
};
protected:
// pointer to source atomic quantity data
PerAtomQuantity<T> * source_;
// pointer to molecule data
SmallMoleculeSet * smallMoleculeSet_;
private:
// do not define
AtomToSmallMoleculeTransfer();
};
/**
* @class SmallMoleculeCentroid
* @brief Class for defining objects to transfer molecular centroid (center of mass)
*/
class SmallMoleculeCentroid : public AtomToSmallMoleculeTransfer<double> {
public:
//constructor
SmallMoleculeCentroid(ATC_Method * atc, PerAtomQuantity<double> * source, SmallMoleculeSet * smallMoleculeSet, PerAtomQuantity<double> * atomPositions);
//destructor
virtual ~SmallMoleculeCentroid();
// apply transfer operator
virtual void reset_quantity() const;
protected:
// pointer to source atomic quantity date : positions of atoms in a molecule
PerAtomQuantity<double> * atomPositions_;
private:
//do not define
SmallMoleculeCentroid();
};
/**
* @class SmallMoleculeDipoleMoment
* @brief Class for defining objects to transfer molecular dipole moments
*/
class SmallMoleculeDipoleMoment : public SmallMoleculeCentroid {
public:
//constructor
SmallMoleculeDipoleMoment(ATC_Method * atc, PerAtomQuantity<double> * source, SmallMoleculeSet * smallMoleculeSet, PerAtomQuantity<double> * atomPositions, SmallMoleculeCentroid * centroid);
//destructor
virtual ~SmallMoleculeDipoleMoment();
// apply transfer operator
virtual void reset_quantity() const;
protected:
//pointer to the centroid data
SmallMoleculeCentroid * centroid_;
private:
//do not define
SmallMoleculeDipoleMoment();
};
/**
* @class AtomToFeTransfer
* @brief Class for defining objects to transfer molecular quadrupole moments
*/
class SmallMoleculeQuadrupoleMoment : public SmallMoleculeCentroid {
public:
//constructor
SmallMoleculeQuadrupoleMoment(ATC_Method * atc, PerAtomQuantity<double> * source, SmallMoleculeSet * smallMoleculeSet, PerAtomQuantity<double> * atomPositions, SmallMoleculeCentroid * centroid);
//destructor
virtual ~SmallMoleculeQuadrupoleMoment();
//apply transfer operator
virtual void reset_quantity() const;
protected:
//pointer to the centroid data
SmallMoleculeCentroid * centroid_;
private:
//do not define
SmallMoleculeQuadrupoleMoment();
};
/**
* @class MotfShapeFunctionRestriction
* @brief Class for defining objects that transfer atomistic quantities to FE using shape functions
* (implements restrict_volumetric_quantity)
*/
class MotfShapeFunctionRestriction : public MatToMatTransfer<double> {
public:
// constructor
MotfShapeFunctionRestriction(PerMoleculeQuantity<double> * source,
SPAR_MAN * shapeFunction);
// destructor
virtual ~MotfShapeFunctionRestriction();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** reference to shape function matrix */
SPAR_MAN * shapeFunction_;
/** persistant workspace */
mutable DENS_MAT _workspace_;
/** applies restriction operation on this processor */
virtual void local_restriction(const DENS_MAT & sourceMatrix,
const SPAR_MAT & shapeFunctionMatrix) const;
private:
// do not define
MotfShapeFunctionRestriction();
};
}
#endif
diff --git a/lib/atc/AtomicRegulator.cpp b/lib/atc/AtomicRegulator.cpp
index f353d0e4e..ec04b8556 100644
--- a/lib/atc/AtomicRegulator.cpp
+++ b/lib/atc/AtomicRegulator.cpp
@@ -1,976 +1,987 @@
// ATC Headers
#include "AtomicRegulator.h"
#include "ATC_Error.h"
#include "ATC_Coupling.h"
#include "PrescribedDataManager.h"
#include "TimeIntegrator.h"
#include "LinearSolver.h"
+using std::map;
+using std::string;
+using std::set;
+using std::pair;
+
namespace ATC {
// only one regulator method at time, i.e. fixed & flux, thermo & elastic
// regulator manages lambda variables, creates new ones when requested with dimensions and zero ics (map of tag to lambda)
// regulator keeps track of which lambda are being used, unused lambdas deleted (map of tag to bool), all tags set to unused on start of initialization
// method requests needed lambda from regulator
// method sets up all needed linear solvers, null linear solver does nothing
// regulator adds nodes to fixed or fluxed lists it owns, based on localization and type
// method gets lists of fixed nodes and fluxed nodes
// method lumps fluxed lambdas and truncates fixed lambdas based on single localized bool in regulator
// inherited methods should be fixed, fluxed, combined
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomicRegulator
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomicRegulator::AtomicRegulator(ATC_Coupling * atc,
const string & regulatorPrefix) :
atc_(atc),
howOften_(1),
needReset_(true),
maxIterations_(myMaxIterations),
tolerance_(myTolerance),
regulatorTarget_(NONE),
couplingMode_(UNCOUPLED),
nNodes_(0),
nsd_(atc_->nsd()),
nLocal_(0),
useLocalizedLambda_(false),
useLumpedLambda_(false),
timeFilter_(NULL),
regulatorMethod_(NULL),
boundaryIntegrationType_(NO_QUADRATURE),
regulatorPrefix_(regulatorPrefix)
{
applyInDirection_.resize(atc_->nsd(),true);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtomicRegulator::~AtomicRegulator()
{
delete_method();
set_all_data_to_unused();
delete_unused_data();
}
//--------------------------------------------------------
// delete_method:
// deletes the method
//--------------------------------------------------------
void AtomicRegulator::delete_method()
{
if (regulatorMethod_)
delete regulatorMethod_;
}
//--------------------------------------------------------
// delete_unused_data:
// deletes all data that is currently not in use
//--------------------------------------------------------
void AtomicRegulator::delete_unused_data()
{
map<string, pair<bool,DENS_MAN * > >::iterator it;
for (it = regulatorData_.begin(); it != regulatorData_.end(); it++) {
if (((it->second).first)) {
delete (it->second).second;
regulatorData_.erase(it);
}
}
}
//--------------------------------------------------------
// get_regulator_data:
// gets a pointer to the requested data, is crated if
// if doesn't exist
//--------------------------------------------------------
DENS_MAN * AtomicRegulator::regulator_data(const string tag, int nCols)
{
DENS_MAN * data(NULL);
map<string, pair<bool,DENS_MAN * > >::iterator it = regulatorData_.find(tag);
if (it == regulatorData_.end()) {
data = new DENS_MAN(nNodes_,nCols);
regulatorData_.insert(pair<string, pair<bool,DENS_MAN * > >(tag,pair<bool,DENS_MAN * >(false,data)));
}
else {
data = (it->second).second;
if ((data->nRows() != nNodes_) || (data->nCols() != nCols)) {
data->reset(nNodes_,nCols);
}
(it->second).first = false;
}
return data;
}
//--------------------------------------------------------
// get_regulator_data:
// gets a pointer to the requested data, or NULL if
// if doesn't exist
//--------------------------------------------------------
const DENS_MAN * AtomicRegulator::regulator_data(const string tag) const
{
map<string, pair<bool,DENS_MAN * > >::const_iterator it = regulatorData_.find(tag);
if (it == regulatorData_.end()) {
return NULL;
}
else {
return const_cast<DENS_MAN * >((it->second).second);
}
}
//--------------------------------------------------------
// set_all_data_to_unused:
// sets bool such that all data is unused
//--------------------------------------------------------
void AtomicRegulator::set_all_data_to_unused()
{
map<string, pair<bool,DENS_MAN * > >::iterator it;
for (it = regulatorData_.begin(); it != regulatorData_.end(); it++) {
(it->second).first = true;
}
}
//--------------------------------------------------------
// set_all_data_to_used:
// sets bool such that all data is used
//--------------------------------------------------------
void AtomicRegulator::set_all_data_to_used()
{
map<string, pair<bool,DENS_MAN * > >::iterator it;
for (it = regulatorData_.begin(); it != regulatorData_.end(); it++) {
(it->second).first = false;
}
}
//--------------------------------------------------------
// modify:
// parses and adjusts controller state based on
// user input, in the style of LAMMPS user input
//--------------------------------------------------------
bool AtomicRegulator::modify(int narg, char **arg)
{
bool foundMatch = false;
// set parameters for numerical matrix solutions
- /*! \page man_control fix_modify AtC control <physics_type>
+ /*! \page man_control fix_modify AtC control
\section syntax
fix_modify AtC control <physics_type> <solution_parameter> <value>\n
- physics_type (string) = thermal | momentum\n
- solution_parameter (string) = max_iterations | tolerance\n
fix_modify AtC transfer <physics_type> control max_iterations <max_iterations>\n
- max_iterations (int) = maximum number of iterations that will be used by iterative matrix solvers\n
fix_modify AtC transfer <physics_type> control tolerance <tolerance> \n
- tolerance (float) = relative tolerance to which matrix equations will be solved\n
\section examples
<TT> fix_modify AtC control thermal max_iterations 10 </TT> \n
<TT> fix_modify AtC control momentum tolerance 1.e-5 </TT> \n
\section description
Sets the numerical parameters for the matrix solvers used in the specified control algorithm. Many solution approaches require iterative solvers, and these methods enable users to provide the maximum number of iterations and the relative tolerance.
\section restrictions
only for be used with specific controllers :
thermal, momentum \n
They are ignored if a lumped solution is requested
\section related
\section default
max_iterations is the number of rows in the matrix\n
tolerance is 1.e-10
*/
int argIndex = 0;
if (strcmp(arg[argIndex],"max_iterations")==0) {
argIndex++;
maxIterations_ = atoi(arg[argIndex]);
if (maxIterations_ < 1) {
throw ATC_Error("Bad maximum iteration count");
}
needReset_ = true;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"tolerance")==0) {
argIndex++;
tolerance_ = atof(arg[argIndex]);
if (tolerance_ < 0.) {
throw ATC_Error("Bad tolerance value");
}
needReset_ = true;
foundMatch = true;
}
/*! \page man_localized_lambda fix_modify AtC control localized_lambda
\section syntax
fix_modify AtC control localized_lambda <on|off>
\section examples
<TT> fix_modify atc control localized_lambda on </TT> \n
\section description
Turns on localization algorithms for control algorithms to restrict the influence of FE coupling or boundary conditions to a region near the boundary of the MD region. Control algorithms will not affect atoms in elements not possessing faces on the boundary of the region. Flux-based control is localized via row-sum lumping while quantity control is done by solving a truncated matrix equation.
\section restrictions
\section related
\section default
Default is off.
*/
else if (strcmp(arg[argIndex],"localized_lambda")==0) {
argIndex++;
if (strcmp(arg[argIndex],"on")==0) {
useLocalizedLambda_ = true;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"off")==0) {
useLocalizedLambda_ = false;
foundMatch = true;
}
}
/*! \page man_lumped_lambda_solve fix_modify AtC control lumped_lambda_solve
\section syntax
fix_modify AtC control lumped_lambda_solve <on|off>
\section examples
<TT> fix_modify atc control lumped_lambda_solve on </TT> \n
\section description
- Command use or not use lumped matrix for lambda solve
+ Command to use or not use lumped matrix for lambda solve
\section restrictions
\section related
\section default
*/
else if (strcmp(arg[argIndex],"lumped_lambda_solve")==0) {
argIndex++;
if (strcmp(arg[argIndex],"on")==0) {
useLumpedLambda_ = true;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"off")==0) {
useLumpedLambda_ = false;
foundMatch = true;
}
}
/*! \page man_mask_direction fix_modify AtC control mask_direction
\section syntax
fix_modify AtC control mask_direction <direction> <on|off>
\section examples
<TT> fix_modify atc control mask_direction 0 on </TT> \n
\section description
Command to mask out certain dimensions from the atomic regulator
\section restrictions
\section related
\section default
*/
else if (strcmp(arg[argIndex],"mask_direction")==0) {
argIndex++;
int dir = atoi(arg[argIndex]);
argIndex++;
if (strcmp(arg[argIndex],"on")==0) {
applyInDirection_[dir] = false;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"off")==0) {
applyInDirection_[dir] = true;
foundMatch = true;
}
}
return foundMatch;
}
//--------------------------------------------------------
// reset_nlocal:
// resizes lambda force if necessary
//--------------------------------------------------------
void AtomicRegulator::reset_nlocal()
{
nLocal_ = atc_->nlocal();
if (regulatorMethod_)
regulatorMethod_->reset_nlocal();
}
//--------------------------------------------------------
// reset_atom_materials:
// resets the localized atom to material map
//--------------------------------------------------------
void AtomicRegulator::reset_atom_materials(const Array<int> & elementToMaterialMap,
const MatrixDependencyManager<DenseMatrix, int> * atomElement)
{
if (regulatorMethod_)
regulatorMethod_->reset_atom_materials(elementToMaterialMap,
atomElement);
}
//--------------------------------------------------------
// reset_method:
// sets up methods, if necessary
//--------------------------------------------------------
void AtomicRegulator::reset_method()
{
// set up defaults for anything that didn't get set
if (!regulatorMethod_)
regulatorMethod_ = new RegulatorMethod(this);
if (!timeFilter_)
timeFilter_ = (atc_->time_filter_manager())->construct();
}
//--------------------------------------------------------
// md_fixed_nodes:
// determines if any fixed nodes overlap the MD region
//--------------------------------------------------------
bool AtomicRegulator::md_fixed_nodes(FieldName fieldName) const
{
FixedNodes fixedNodes(atc_,fieldName);
const set<int> & myNodes(fixedNodes.quantity());
if (myNodes.size() == 0) {
return false;
}
else {
return true;
}
}
//--------------------------------------------------------
// md_flux_nodes:
// determines if any nodes with fluxes overlap the MD region
//--------------------------------------------------------
bool AtomicRegulator::md_flux_nodes(FieldName fieldName) const
{
FluxNodes fluxNodes(atc_,fieldName);
const set<int> & myNodes(fluxNodes.quantity());
if (myNodes.size() == 0) {
return false;
}
else {
return true;
}
}
//--------------------------------------------------------
// construct_methods:
// sets up methods before a run
//--------------------------------------------------------
void AtomicRegulator::construct_methods()
{
// get base-line data that was set in stages 1 & 2 of ATC_Method::initialize
// computational geometry
nNodes_ = atc_->num_nodes();
// make sure consistent boundary integration is being used
atc_->set_boundary_integration_type(boundaryIntegrationType_);
}
//--------------------------------------------------------
// construct_transfers:
// pass through to appropriate transfer constuctors
//--------------------------------------------------------
void AtomicRegulator::construct_transfers()
{
regulatorMethod_->construct_transfers();
}
//--------------------------------------------------------
// initialize:
// sets up methods before a run
//--------------------------------------------------------
void AtomicRegulator::initialize()
{
regulatorMethod_->initialize();
needReset_ = false;
}
//--------------------------------------------------------
// output:
// pass through to appropriate output methods
//--------------------------------------------------------
void AtomicRegulator::output(OUTPUT_LIST & outputData) const
{
regulatorMethod_->output(outputData);
}
//--------------------------------------------------------
// finish:
// pass through to appropriate end-of-run methods
//--------------------------------------------------------
void AtomicRegulator::finish()
{
regulatorMethod_->finish();
set_all_data_to_unused();
}
//--------------------------------------------------------
// apply_pre_predictor:
// applies the controller in the pre-predictor
// phase of the time integrator
//--------------------------------------------------------
void AtomicRegulator::apply_pre_predictor(double dt, int timeStep)
{
if (timeStep % howOften_==0) // apply full integration scheme, including filter
regulatorMethod_->apply_pre_predictor(dt);
}
//--------------------------------------------------------
// apply_mid_predictor:
// applies the controller in the mid-predictor
// phase of the time integrator
//--------------------------------------------------------
void AtomicRegulator::apply_mid_predictor(double dt, int timeStep)
{
if (timeStep % howOften_==0) // apply full integration scheme, including filter
regulatorMethod_->apply_mid_predictor(dt);
}
//--------------------------------------------------------
// apply_post_predictor:
// applies the controller in the post-predictor
// phase of the time integrator
//--------------------------------------------------------
void AtomicRegulator::apply_post_predictor(double dt, int timeStep)
{
if (timeStep % howOften_==0) // apply full integration scheme, including filter
regulatorMethod_->apply_post_predictor(dt);
}
//--------------------------------------------------------
// apply_pre_corrector:
// applies the controller in the pre-corrector phase
// of the time integrator
//--------------------------------------------------------
void AtomicRegulator::apply_pre_corrector(double dt, int timeStep)
{
if (timeStep % howOften_==0) // apply full integration scheme, including filter
regulatorMethod_->apply_pre_corrector(dt);
}
//--------------------------------------------------------
// apply_post_corrector:
// applies the controller in the post-corrector phase
// of the time integrator
//--------------------------------------------------------
void AtomicRegulator::apply_post_corrector(double dt, int timeStep)
{
if (timeStep % howOften_==0) // apply full integration scheme, including filter
regulatorMethod_->apply_post_corrector(dt);
}
//--------------------------------------------------------
// pre_exchange
//--------------------------------------------------------
void AtomicRegulator::pre_exchange()
{
regulatorMethod_->pre_exchange();
}
//--------------------------------------------------------
// pre_force
//--------------------------------------------------------
void AtomicRegulator::pre_force()
{
regulatorMethod_->post_exchange();
}
//--------------------------------------------------
// pack_fields
// bundle all allocated field matrices into a list
// for output needs
//--------------------------------------------------
void AtomicRegulator::pack_fields(RESTART_LIST & data)
{
map<string, pair<bool,DENS_MAN * > >::iterator it;
for (it = regulatorData_.begin(); it != regulatorData_.end(); it++) {
data[(it->first)] = &(((it->second).second)->set_quantity());
}
}
//--------------------------------------------------------
// compute_boundary_flux:
// computes the boundary flux to be consistent with
// the controller
//--------------------------------------------------------
void AtomicRegulator::compute_boundary_flux(FIELDS & fields)
{
regulatorMethod_->compute_boundary_flux(fields);
}
//--------------------------------------------------------
// add_to_rhs:
// adds any controller contributions to the FE rhs
//--------------------------------------------------------
void AtomicRegulator::add_to_rhs(FIELDS & rhs)
{
regulatorMethod_->add_to_rhs(rhs);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class RegulatorMethod
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
RegulatorMethod::RegulatorMethod(AtomicRegulator * atomicRegulator,
const string & regulatorPrefix) :
atomicRegulator_(atomicRegulator),
atc_(atomicRegulator_->atc_transfer()),
boundaryFlux_(atc_->boundary_fluxes()),
fieldMask_(NUM_FIELDS,NUM_FLUX),
nNodes_(atomicRegulator_->num_nodes()),
regulatorPrefix_(atomicRegulator->regulator_prefix()+regulatorPrefix),
shpFcnDerivs_(NULL)
{
fieldMask_ = false;
}
//--------------------------------------------------------
// compute_boundary_flux
// default computation of boundary flux based on
// finite
//--------------------------------------------------------
void RegulatorMethod::compute_boundary_flux(FIELDS & fields)
{
atc_->compute_boundary_flux(fieldMask_,
fields,
boundaryFlux_,
atomMaterialGroups_,
shpFcnDerivs_);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class RegulatorShapeFunction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
RegulatorShapeFunction::RegulatorShapeFunction(AtomicRegulator * atomicRegulator,
const string & regulatorPrefix) :
RegulatorMethod(atomicRegulator,regulatorPrefix),
lambda_(NULL),
atomLambdas_(NULL),
shapeFunctionMatrix_(NULL),
linearSolverType_(AtomicRegulator::NO_SOLVE),
maxIterations_(atomicRegulator->max_iterations()),
tolerance_(atomicRegulator->tolerance()),
matrixSolver_(NULL),
regulatedNodes_(NULL),
applicationNodes_(NULL),
boundaryNodes_(NULL),
shpFcn_(NULL),
atomicWeights_(NULL),
elementMask_(NULL),
lambdaAtomMap_(NULL),
weights_(NULL),
nsd_(atomicRegulator_->nsd()),
nLocal_(atomicRegulator_->nlocal())
{
// do nothing
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
RegulatorShapeFunction::~RegulatorShapeFunction()
{
if (matrixSolver_)
delete matrixSolver_;
}
//--------------------------------------------------------
// create_node_maps
// - creates the node mappings between all nodes and the
// subset which are regulated
//--------------------------------------------------------
void RegulatorShapeFunction::create_node_maps()
{
this->construct_regulated_nodes();
InterscaleManager & interscaleManager(atc_->interscale_manager());
nodeToOverlapMap_ = static_cast<NodeToSubset * >(interscaleManager.dense_matrix_int("NodeToOverlapMap"));
if (!nodeToOverlapMap_) {
nodeToOverlapMap_ = new NodeToSubset(atc_,regulatedNodes_);
interscaleManager.add_dense_matrix_int(nodeToOverlapMap_,
regulatorPrefix_+"NodeToOverlapMap");
}
overlapToNodeMap_ = static_cast<SubsetToNode * >(interscaleManager.dense_matrix_int("OverlapToNodeMap"));
if (!overlapToNodeMap_) {
overlapToNodeMap_ = new SubsetToNode(nodeToOverlapMap_);
interscaleManager.add_dense_matrix_int(overlapToNodeMap_,
regulatorPrefix_+"OverlapToNodeMap");
}
}
//--------------------------------------------------------
// construct_transfers
// - create all the needed transfer operators, in this
// case weights for the lambda matrix
//--------------------------------------------------------
void RegulatorShapeFunction::construct_transfers()
{
this->set_weights(); // construct specific weighting matrix transfer
// specialized quantities for boundary flux integration if the lambda atom map exists
if (lambdaAtomMap_ && (atomicRegulator_->boundary_integration_type() == FE_INTERPOLATION)) {
InterscaleManager & interscaleManager(atc_->interscale_manager());
// atomic weights
PerAtomDiagonalMatrix<double> * atomWeights(interscaleManager.per_atom_diagonal_matrix("AtomVolume"));
atomicWeights_ = new MappedDiagonalMatrix(atc_,
atomWeights,
lambdaAtomMap_);
interscaleManager.add_diagonal_matrix(atomicWeights_,
regulatorPrefix_+"RegulatorAtomWeights");
// shape function
shpFcn_ = new RowMappedSparseMatrix(atc_,
interscaleManager.per_atom_sparse_matrix("Interpolant"),
lambdaAtomMap_);
interscaleManager.add_sparse_matrix(shpFcn_,
regulatorPrefix_+"RegulatorShapeFunction");
// shape function derivatives
+ VectorDependencyManager<SPAR_MAT * > * interpolantGradient = interscaleManager.vector_sparse_matrix("InterpolantGradient");
+ if (!interpolantGradient) {
+ interpolantGradient = new PerAtomShapeFunctionGradient(atc_);
+ interscaleManager.add_vector_sparse_matrix(interpolantGradient,
+ "InterpolantGradient");
+ }
shpFcnDerivs_ = new RowMappedSparseMatrixVector(atc_,
- interscaleManager.vector_sparse_matrix("InterpolantGradient"),
+ interpolantGradient,
lambdaAtomMap_);
interscaleManager.add_vector_sparse_matrix(shpFcnDerivs_,
regulatorPrefix_+"RegulatorShapeFunctionGradient");
}
}
//--------------------------------------------------------
// initialize
// - pre-run work, in this cases constructs the linear
// solver
//--------------------------------------------------------
void RegulatorShapeFunction::initialize()
{
if (!shapeFunctionMatrix_) {
throw ATC_Error("RegulatorShapeFunction::initialize - shapeFunctionMatrix_ must be created before the initialize phase");
}
if (matrixSolver_)
delete matrixSolver_;
if (linearSolverType_ == AtomicRegulator::RSL_SOLVE) {
matrixSolver_ = new LambdaMatrixSolverLumped(matrixTemplate_,
shapeFunctionMatrix_,
maxIterations_,
tolerance_,
applicationNodes_,
nodeToOverlapMap_);
}
else if (linearSolverType_ == AtomicRegulator::CG_SOLVE) {
matrixSolver_ = new LambdaMatrixSolverCg(matrixTemplate_,
shapeFunctionMatrix_,
maxIterations_,
tolerance_);
}
else {
throw ATC_Error("RegulatorShapeFunction::initialize - unsupported solver type");
}
compute_sparsity();
}
//--------------------------------------------------------
// compute_sparsity
// - creates sparsity template
//--------------------------------------------------------
void RegulatorShapeFunction::compute_sparsity(void)
{
// first get local pattern from N N^T
int nNodeOverlap = nodeToOverlapMap_->size();
DENS_MAT tmpLocal(nNodeOverlap,nNodeOverlap);
DENS_MAT tmp(nNodeOverlap,nNodeOverlap);
const SPAR_MAT & myShapeFunctionMatrix(shapeFunctionMatrix_->quantity());
if (myShapeFunctionMatrix.nRows() > 0) {
tmpLocal = myShapeFunctionMatrix.transMat(myShapeFunctionMatrix);
}
// second accumulate total pattern across processors
LammpsInterface::instance()->allsum(tmpLocal.ptr(), tmp.ptr(), tmp.size());
// third extract non-zero entries & construct sparse template
SPAR_MAT & myMatrixTemplate(matrixTemplate_.set_quantity());
myMatrixTemplate.reset(nNodeOverlap,nNodeOverlap);
for (int i = 0; i < nNodeOverlap; i++) {
for (int j = 0; j < nNodeOverlap; j++) {
if (abs(tmp(i,j))>0) {
myMatrixTemplate.add(i,j,0.);
}
}
}
myMatrixTemplate.compress();
}
//--------------------------------------------------------
// solve_for_lambda
// solves matrix equation for lambda using given rhs
//--------------------------------------------------------
void RegulatorShapeFunction::solve_for_lambda(const DENS_MAT & rhs,
DENS_MAT & lambda)
{
// assemble N^T W N with appropriate weighting matrix
DIAG_MAT weights;
if (shapeFunctionMatrix_->nRows() > 0) {
weights.reset(weights_->quantity());
}
matrixSolver_->assemble_matrix(weights);
// solve on overlap nodes
int nNodeOverlap = nodeToOverlapMap_->size();
DENS_MAT rhsOverlap(nNodeOverlap,rhs.nCols());
map_unique_to_overlap(rhs, rhsOverlap);
DENS_MAT lambdaOverlap(nNodeOverlap,lambda.nCols());
for (int i = 0; i < rhs.nCols(); i++) {
CLON_VEC tempLambda(lambdaOverlap,CLONE_COL,i);
if (atomicRegulator_->apply_in_direction(i)) {
CLON_VEC tempRHS(rhsOverlap,CLONE_COL,i);
matrixSolver_->execute(tempRHS,tempLambda);
}
else {
tempLambda = 0.;
}
}
// map solution back to all nodes
map_overlap_to_unique(lambdaOverlap,lambda);
}
//--------------------------------------------------------
// reset_nlocal:
// resets data dependent on local atom count
//--------------------------------------------------------
void RegulatorShapeFunction::reset_nlocal()
{
RegulatorMethod::reset_nlocal();
nLocal_ = atomicRegulator_->nlocal();
//compute_sparsity();
}
//--------------------------------------------------------
// reset_atom_materials:
// resets the localized atom to material map
//--------------------------------------------------------
void RegulatorShapeFunction::reset_atom_materials(const Array<int> & elementToMaterialMap,
const MatrixDependencyManager<DenseMatrix, int> * atomElement)
{
// specialized quantities for boundary flux integration if the lambda atom map exists
if (lambdaAtomMap_ && (atomicRegulator_->boundary_integration_type() == FE_INTERPOLATION)) {
int nMaterials = (atc_->physics_model())->nMaterials();
atomMaterialGroups_.reset(nMaterials);
const INT_ARRAY & atomToElementMap(atomElement->quantity());
const INT_ARRAY & map(lambdaAtomMap_->quantity());
int idx;
for (int i = 0; i < nLocal_; i++) {
idx = map(i,0);
if (idx > -1) {
atomMaterialGroups_(elementToMaterialMap(atomToElementMap(i,0))).insert(idx);
}
}
}
}
//--------------------------------------------------------
// map_unique_to_overlap:
// maps unique node data to overlap node data
//--------------------------------------------------------
void RegulatorShapeFunction::map_unique_to_overlap(const MATRIX & uniqueData,
MATRIX & overlapData)
{
const INT_ARRAY & nodeToOverlapMap(nodeToOverlapMap_->quantity());
for (int i = 0; i < nNodes_; i++) {
if (nodeToOverlapMap(i,0) > -1) {
for (int j = 0; j < uniqueData.nCols(); j++) {
overlapData(nodeToOverlapMap(i,0),j) = uniqueData(i,j);
}
}
}
}
//--------------------------------------------------------
// map_overlap_to_unique:
// maps overlap node data to unique node data
//--------------------------------------------------------
void RegulatorShapeFunction::map_overlap_to_unique(const MATRIX & overlapData,
MATRIX & uniqueData)
{
const INT_ARRAY & overlapToNodeMap(overlapToNodeMap_->quantity());
uniqueData.resize(nNodes_,overlapData.nCols());
for (int i = 0; i < overlapToNodeMap.size(); i++) {
for (int j = 0; j < overlapData.nCols(); j++) {
uniqueData(overlapToNodeMap(i,0),j) = overlapData(i,j);
}
}
}
//--------------------------------------------------------
// construct_regulated_nodes:
// constructs the set of nodes being regulated
//--------------------------------------------------------
void RegulatorShapeFunction::construct_regulated_nodes()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
regulatedNodes_ = static_cast<RegulatedNodes *>(interscaleManager.set_int("RegulatedNodes"));
if (!regulatedNodes_) {
if (!(atomicRegulator_->use_localized_lambda())) {
regulatedNodes_ = new RegulatedNodes(atc_);
}
else {
regulatedNodes_ = new AllRegulatedNodes(atc_);
}
interscaleManager.add_set_int(regulatedNodes_,
regulatorPrefix_+"RegulatedNodes");
}
// application and regulated are same, unless specified
applicationNodes_ = regulatedNodes_;
// boundary and regulated nodes are same, unless specified
boundaryNodes_ = regulatedNodes_;
// special set of boundary elements
if (atomicRegulator_->use_localized_lambda()) {
elementMask_ = new ElementMaskNodeSet(atc_,boundaryNodes_);
interscaleManager.add_dense_matrix_bool(elementMask_,
regulatorPrefix_+"BoundaryElementMask");
}
}
//--------------------------------------------------------
// compute_boundary_flux
// default computation of boundary flux based on
// finite
//--------------------------------------------------------
void RegulatorShapeFunction::compute_boundary_flux(FIELDS & fields)
{
atc_->compute_boundary_flux(fieldMask_,
fields,
boundaryFlux_,
atomMaterialGroups_,
shpFcnDerivs_,
shpFcn_,
atomicWeights_,
elementMask_,
boundaryNodes_);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class LambdaMatrixSolver
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to necessary data
//--------------------------------------------------------
LambdaMatrixSolver::LambdaMatrixSolver(SPAR_MAN & matrixTemplate, SPAR_MAN * shapeFunctionMatrix, int maxIterations, double tolerance) :
matrixTemplate_(matrixTemplate),
shapeFunctionMatrix_(shapeFunctionMatrix),
maxIterations_(maxIterations),
tolerance_(tolerance)
{
// do nothing
}
//--------------------------------------------------------
// assemble_matrix
// Assemble the matrix using the shape function
// matrices and weights. This improves efficiency
// when multiple solves or iterations are required.
//--------------------------------------------------------
void LambdaMatrixSolver::assemble_matrix(DIAG_MAT & weights)
{
// form matrix : sum_a N_Ia * W_a * N_Ja
SPAR_MAT lambdaMatrixLocal(matrixTemplate_.quantity());
if (weights.nRows()>0)
lambdaMatrixLocal.weighted_least_squares(shapeFunctionMatrix_->quantity(),weights);
// swap contributions
lambdaMatrix_ = matrixTemplate_.quantity();
LammpsInterface::instance()->allsum(lambdaMatrixLocal.ptr(),
lambdaMatrix_.ptr(), lambdaMatrix_.size());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class LambdaMatrixSolverLumped
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to necessary data
//--------------------------------------------------------
LambdaMatrixSolverLumped::LambdaMatrixSolverLumped(SPAR_MAN & matrixTemplate, SPAR_MAN * shapeFunctionMatrix, int maxIterations, double tolerance, const RegulatedNodes * applicationNodes, const NodeToSubset * nodeToOverlapMap) :
LambdaMatrixSolver(matrixTemplate,shapeFunctionMatrix,maxIterations,tolerance),
applicationNodes_(applicationNodes),
nodeToOverlapMap_(nodeToOverlapMap)
{
// do nothing
}
//--------------------------------------------------------
// assemble_matrix
// Assemble the matrix using the shape function
// matrices and weights. This improves efficiency
// when multiple solves or iterations are required.
//--------------------------------------------------------
void LambdaMatrixSolverLumped::assemble_matrix(DIAG_MAT & weights)
{
LambdaMatrixSolver::assemble_matrix(weights);
lumpedMatrix_ = lambdaMatrix_.row_sum_lump();
}
void LambdaMatrixSolverLumped::execute(VECTOR & rhs, VECTOR & lambda)
{
// solve lumped equation
const set<int> & applicationNodes(applicationNodes_->quantity());
const INT_ARRAY & nodeToOverlapMap(nodeToOverlapMap_->quantity());
lambda = 0.;
set<int>::const_iterator iset;
for (iset = applicationNodes.begin(); iset != applicationNodes.end(); iset++) {
int node = nodeToOverlapMap(*iset,0);
lambda(node) = rhs(node)/lumpedMatrix_(node,node);
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class LambdaMatrixSolverCg
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to necessary data
//--------------------------------------------------------
LambdaMatrixSolverCg::LambdaMatrixSolverCg(SPAR_MAN & matrixTemplate, SPAR_MAN * shapeFunctionMatrix, int maxIterations, double tolerance) :
LambdaMatrixSolver(matrixTemplate,shapeFunctionMatrix,maxIterations,tolerance)
{
// do nothing
}
void LambdaMatrixSolverCg::execute(VECTOR & rhs, VECTOR & lambda)
{
if (lambdaMatrix_.size()<1)
throw ATC_Error("solver given zero size matrix in LambdaMatrixSolverCg::execute()");
LinearSolver solver(lambdaMatrix_, ATC::LinearSolver::ITERATIVE_SOLVE_SYMMETRIC, true);
int myMaxIt = maxIterations_ > 0 ? maxIterations_ : 2*lambdaMatrix_.nRows();
solver.set_max_iterations(myMaxIt);
solver.set_tolerance(tolerance_);
solver.solve(lambda,rhs);
}
};
diff --git a/lib/atc/AtomicRegulator.h b/lib/atc/AtomicRegulator.h
index 74d719537..eadfce66d 100644
--- a/lib/atc/AtomicRegulator.h
+++ b/lib/atc/AtomicRegulator.h
@@ -1,625 +1,625 @@
/** Atomic Regulator : a base class class for atom-continuum control */
#ifndef ATOMICREGULATOR_H
#define ATOMICREGULATOR_H
-// ATC headers
#include "ATC_TypeDefs.h"
-
-// other headers
#include <map>
#include <set>
#include <vector>
+#include <utility>
+#include <string>
namespace ATC {
static const int myMaxIterations = 0;
static const double myTolerance = 1.e-10;
// forward declarations
class TimeFilter;
class RegulatorMethod;
class LambdaMatrixSolver;
class ATC_Coupling;
class NodeToSubset;
class SubsetToNode;
class RegulatedNodes;
class ElementMaskNodeSet;
class LargeToSmallAtomMap;
template <typename T>
class PerAtomQuantity;
template <typename T>
class ProtectedAtomQuantity;
template <typename T>
class PerAtomSparseMatrix;
/**
* @class AtomicRegulator
* @brief Base class for atom-continuum control
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomicRegulator
//--------------------------------------------------------
//--------------------------------------------------------
class AtomicRegulator {
public:
/** linear solver types */
enum LinearSolverType {
NO_SOLVE=0,
CG_SOLVE, // conjugate gradient
RSL_SOLVE // row-sum lumping solution
};
/** regulator target variable */
enum RegulatorTargetType {
NONE=0,
FIELD,
DERIVATIVE,
DYNAMICS
};
enum RegulatorCouplingType {
UNCOUPLED=0,
FLUX,
GHOST_FLUX,
FIXED
};
// constructor
AtomicRegulator(ATC_Coupling * atc,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
// destructor
virtual ~AtomicRegulator();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** instantiate up the desired method(s) */
virtual void construct_methods() = 0;
/** method(s) create all necessary transfer operators */
virtual void construct_transfers();
/** initialization of method data */
virtual void initialize();
/** add output information */
virtual void output(OUTPUT_LIST & outputData) const;
virtual double compute_vector(int n) const {return 0;}
/** final work at the end of a run */
virtual void finish();
/** reset number of local atoms, as well as atomic data */
virtual void reset_nlocal();
/** set up atom to material identification */
virtual void reset_atom_materials(const Array<int> & elementToMaterialMap,
const MatrixDependencyManager<DenseMatrix, int> * atomElement);
// application steps
/** apply the regulator in the pre-predictor phase */
virtual void apply_pre_predictor(double dt, int timeStep);
/** apply the regulator in the mid-predictor phase */
virtual void apply_mid_predictor(double dt, int timeStep);
/** apply the regulator in the post-predictor phase */
virtual void apply_post_predictor(double dt, int timeStep);
/** apply the regulator in the pre-correction phase */
virtual void apply_pre_corrector(double dt, int timeStep);
/** apply the regulator in the post-correction phase */
virtual void apply_post_corrector(double dt, int timeStep);
/** prior to exchanges */
virtual void pre_force();
/** prior to exchanges */
virtual void pre_exchange();
/** pack fields for restart */
virtual void pack_fields(RESTART_LIST & data);
/** thermo output */
virtual int size_vector(int s) const {return 0;};
// coupling to FE state
/** FE state variable regulator is applied to */
virtual RegulatorTargetType regulator_target() const {return regulatorTarget_;};
/** type of boundary coupling */
//TEMP_JAT field variable should be removed
virtual RegulatorCouplingType coupling_mode(const FieldName field=NUM_TOTAL_FIELDS) const {return couplingMode_;};
/** compute the thermal boundary flux, must be consistent with regulator */
virtual void compute_boundary_flux(FIELDS & fields);
/** add contributions (if any) to the finite element right-hand side */
virtual void add_to_rhs(FIELDS & rhs);
// data access, intended for method objects
/** returns a pointer to the DENS_MAN associated with the tag, creates a new data member if necessary */
- DENS_MAN * regulator_data(const string tag, int nCols);
+ DENS_MAN * regulator_data(const std::string tag, int nCols);
/** can externally set regulator dynamic contributions */
virtual void reset_lambda_contribution(const DENS_MAT & target, const FieldName field=NUM_TOTAL_FIELDS) {};
/** returns a const pointer to the DENS_MAN associated with the tag, or NULL */
- const DENS_MAN * regulator_data(const string tag) const;
+ const DENS_MAN * regulator_data(const std::string tag) const;
/** return the maximum number of iterations */
int max_iterations() {return maxIterations_;};
/** return the solver tolerance */
double tolerance() {return tolerance_;};
/** access for ATC transfer */
ATC_Coupling * atc_transfer() {return atc_;};
/** access for time filter */
TimeFilter * time_filter() {return timeFilter_;};
/** access for number of nodes */
int num_nodes() {return nNodes_;};
/** access for number of spatial dimensions */
int nsd() {return nsd_;};
/** access for number of local atoms */
int nlocal() {return nLocal_;};
/** access for boundary integration methods */
BoundaryIntegrationType boundary_integration_type()
{return boundaryIntegrationType_;};
/** access for boundary face sets */
- const set< pair<int,int> > * face_sets()
+ const std::set< std::pair<int,int> > * face_sets()
{ return boundaryFaceSet_;};
/** access for needing a reset */
bool need_reset() const {return needReset_;};
/** force a reset to occur */
void force_reset() {needReset_ = true;};
/** check if lambda is localized */
bool use_localized_lambda() const {return useLocalizedLambda_;};
/** check if matrix should be lumpted for lambda solve */
bool use_lumped_lambda_solve() const {return useLumpedLambda_;};
/** check to see if this direction is being used */
bool apply_in_direction(int i) const {return applyInDirection_[i];};
/** checks if there are any fixed nodes in the MD region */
bool md_fixed_nodes(FieldName fieldName = NUM_TOTAL_FIELDS) const;
/** checks if there are any flux nodes in the MD region */
bool md_flux_nodes(FieldName fieldName = NUM_TOTAL_FIELDS) const;
/** returns prefix tag for regulator */
- const string & regulator_prefix() const {return regulatorPrefix_;};
+ const std::string & regulator_prefix() const {return regulatorPrefix_;};
protected:
// methods
/** deletes the current regulator method */
void delete_method();
/** deletes all unused data */
void delete_unused_data();
/** sets all data to be unused */
void set_all_data_to_unused();
/** sets all data to be used */
void set_all_data_to_used();
// data
/** point to atc_transfer object */
ATC_Coupling * atc_;
/** how often in number of time steps regulator is applied */
int howOften_;
// reset/reinitialize flags
/** flag to reset data */
bool needReset_;
/** reinitialize method */
void reset_method();
// regulator data
/** container for all data, string is tag, bool is false if currently in use */
- map<string, pair<bool,DENS_MAN * > > regulatorData_;
+ std::map<std::string, std::pair<bool,DENS_MAN * > > regulatorData_;
+
/** maximum number of iterations used in solving for lambda */
int maxIterations_;
/** tolerance used in solving for lambda */
double tolerance_;
/** regulator target flag */
RegulatorTargetType regulatorTarget_;
/** regulator fe coupling type flag */
RegulatorCouplingType couplingMode_;
/** number of nodes */
int nNodes_;
/** number of spatial dimensions */
int nsd_;
/** number of local atoms */
int nLocal_;
/** use of localization techniques */
bool useLocalizedLambda_;
bool useLumpedLambda_;
/** restrict application in certain directions */
- vector<bool> applyInDirection_;
+ std::vector<bool> applyInDirection_;
// method pointers
/** time filtering object */
TimeFilter * timeFilter_;
/** sets up and solves the regulator equations */
RegulatorMethod * regulatorMethod_;
// boundary flux information
BoundaryIntegrationType boundaryIntegrationType_;
- const set< pair<int,int> > * boundaryFaceSet_;
+ const std::set< std::pair<int,int> > * boundaryFaceSet_;
/** prefix string for registering data */
- const string regulatorPrefix_;
+ const std::string regulatorPrefix_;
private:
// DO NOT define this
AtomicRegulator();
};
/**
* @class RegulatorMethod
* @brief Base class for implementation of control algorithms
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class RegulatorMethod
//--------------------------------------------------------
//--------------------------------------------------------
class RegulatorMethod {
public:
RegulatorMethod(AtomicRegulator * atomicRegulator,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~RegulatorMethod(){};
/** instantiate all needed data */
virtual void construct_transfers(){};
/** pre-"run" initialization */
virtual void initialize(){};
/** reset number of local atoms, as well as atomic data */
virtual void reset_nlocal(){};
/** set up atom to material identification */
virtual void reset_atom_materials(const Array<int> & elementToMaterialMap,
const MatrixDependencyManager<DenseMatrix, int> * atomElement){};
/** applies regulator to atoms in the pre-predictor phase */
virtual void apply_pre_predictor(double dt){};
/** applies regulator to atoms in the mid-predictor phase */
virtual void apply_mid_predictor(double dt){};
/** applies regulator to atoms in the post-predictor phase */
virtual void apply_post_predictor(double dt){};
/** applies regulator to atoms in the pre-corrector phase */
virtual void apply_pre_corrector(double dt){};
/** applies regulator to atoms in the post-corrector phase */
virtual void apply_post_corrector(double dt){};
/** applies regulator to atoms in the pre-corrector phase */
virtual void apply_pre_force(double dt){};
/** applies regulator to atoms in the post-corrector phase */
virtual void apply_post_force(double dt){};
/** applies regulator in pre-force phase */
virtual void pre_force(){};
/** applies regulator in pre-exchange phase */
virtual void pre_exchange(){};
/** applies regulator in post-exchange phase */
virtual void post_exchange(){};
/** compute boundary flux, requires regulator input since it is part of the coupling scheme */
virtual void compute_boundary_flux(FIELDS & fields);
/** add contributions (if any) to the finite element right-hand side */
virtual void add_to_rhs(FIELDS & rhs){};
/** get data for output */
virtual void output(OUTPUT_LIST & outputData){};
virtual double compute_vector(int n) const {return 0;}
/** final work at the end of a run */
virtual void finish(){};
/** pack fields for restart */
virtual void pack_fields(RESTART_LIST & data){};
protected:
//data
/** pointer to atomic regulator object for data */
AtomicRegulator * atomicRegulator_;
/** pointer to ATC_transfer object */
ATC_Coupling * atc_;
/** boundary flux */
FIELDS & boundaryFlux_;
/** field mask for specifying boundary flux */
Array2D<bool> fieldMask_;
/** number of nodes */
int nNodes_;
/** prefix string for registering data */
- const string regulatorPrefix_;
+ const std::string regulatorPrefix_;
/** mapping for atom materials for atomic FE quadrature */
- Array<set<int> > atomMaterialGroups_;
+ Array<std::set<int> > atomMaterialGroups_;
/** shape function derivative matrices for boundary atoms */
VectorDependencyManager<SPAR_MAT * > * shpFcnDerivs_;
private:
// DO NOT define this
RegulatorMethod();
};
/**
* @class RegulatorShapeFunction
* @brief Base class for implementation of regulation algorithms using the shape function matrices
*/
// DESIGN each regulator handles only one lambda, but solvers and data are added later
// add a new function to set the linear solver based on enum CG_SOLVE or RSL_SOLVE and shape function matrix
// followed by call to compute sparsity pattern
//--------------------------------------------------------
//--------------------------------------------------------
// Class RegulatorShapeFunction
// base class for all regulators of general form
// of N^T w N lambda = rhs
//--------------------------------------------------------
//--------------------------------------------------------
class RegulatorShapeFunction : public RegulatorMethod {
public:
RegulatorShapeFunction(AtomicRegulator * atomicRegulator,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~RegulatorShapeFunction();
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-"run" initialization */
virtual void initialize();
/** reset number of local atoms, as well as atomic data */
virtual void reset_nlocal();
/** set up atom to material identification */
virtual void reset_atom_materials(const Array<int> & elementToMaterialMap,
const MatrixDependencyManager<DenseMatrix, int> * atomElement);
/** compute boundary flux, requires regulator input since it is part of the coupling scheme */
virtual void compute_boundary_flux(FIELDS & fields);
/** determine if local shape function matrices are needed */
virtual bool use_local_shape_functions() const {return false;};
protected:
// methods
/** compute sparsity for matrix */
void compute_sparsity(void);
/** solve matrix equation */
void solve_for_lambda(const DENS_MAT & rhs,
DENS_MAT & lambda);
/** set weighting factor for in matrix Nhat^T * weights * Nhat */
virtual void set_weights() = 0;
/** Mapping between unique nodes and nodes overlapping MD region */
void map_unique_to_overlap(const MATRIX & uniqueData,
MATRIX & overlapData);
/** Mapping between nodes overlapping MD region to unique nodes */
void map_overlap_to_unique(const MATRIX & overlapData,
MATRIX & uniqueData);
/** sets up the transfer which is the set of nodes being regulated */
virtual void construct_regulated_nodes();
/** creates data structure needed for all to regulated node maps */
virtual void create_node_maps();
// member data
/** lambda coupling parameter */
DENS_MAN * lambda_;
/** lambda at atomic locations */
ProtectedAtomQuantity<double> * atomLambdas_;
/** shape function matrix for use in GLC solve */
PerAtomSparseMatrix<double> * shapeFunctionMatrix_;
/** algorithm being used for the linear solver */
AtomicRegulator::LinearSolverType linearSolverType_;
/** pre-templated sparsity pattern for N^T * T * N */
SPAR_MAN matrixTemplate_;
/** maximum number of iterations used in solving for lambda */
int maxIterations_;
/** tolerance used in solving for lambda */
double tolerance_;
/** matrix solver object */
LambdaMatrixSolver * matrixSolver_;
/** set of nodes used to construct matrix */
RegulatedNodes * regulatedNodes_;
/** set of nodes on which lambda is non-zero */
RegulatedNodes * applicationNodes_;
/** set of nodes needed for localized boundary quadrature */
RegulatedNodes * boundaryNodes_;
/** mapping from all nodes to overlap nodes: -1 is no overlap, otherwise entry is overlap index */
NodeToSubset * nodeToOverlapMap_;
/** mapping from overlap nodes to unique nodes */
SubsetToNode * overlapToNodeMap_;
/** shape function matrix for boundary atoms */
SPAR_MAN * shpFcn_;
/** atomic weights for boundary atoms */
DIAG_MAN * atomicWeights_;
/** element mask for boundary elements corresponding to nodeToOverlapMap_ */
ElementMaskNodeSet * elementMask_;
/** maps atoms from atc indexing to regulator indexing */
LargeToSmallAtomMap * lambdaAtomMap_;
/** weight per-atom transfer */
PerAtomQuantity<double> * weights_;
/** number of spatial dimensions */
int nsd_;
/** number of ATC internal atoms on this processor */
int nLocal_;
private:
// DO NOT define this
RegulatorShapeFunction();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class LambdaMatrixSolver
//--------------------------------------------------------
//--------------------------------------------------------
class LambdaMatrixSolver {
public:
LambdaMatrixSolver(SPAR_MAN & matrixTemplate, SPAR_MAN * shapeFunctionMatrix, int maxIterations, double tolerance);
virtual ~LambdaMatrixSolver(){};
/** assemble the matrix */
virtual void assemble_matrix(DIAG_MAT & weights);
/** execute the solver */
virtual void execute(VECTOR & rhs, VECTOR & lambda)=0;
protected:
/** sparse template for the matrix */
SPAR_MAN & matrixTemplate_;
/** non-symmetric part of the matrix */
SPAR_MAN * shapeFunctionMatrix_;
/** matrix used to solve for lambda */
SPAR_MAT lambdaMatrix_;
/** maximum number of iterations */
int maxIterations_;
/** relative tolerance to solve to */
double tolerance_;
private:
// DO NOT define this
LambdaMatrixSolver();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class LambdaMatrixSolverLumped
//--------------------------------------------------------
//--------------------------------------------------------
class LambdaMatrixSolverLumped : public LambdaMatrixSolver {
public:
LambdaMatrixSolverLumped(SPAR_MAN & matrixTemplate, SPAR_MAN * shapeFunctionMatrix, int maxIterations, double tolerance, const RegulatedNodes * applicationNodes, const NodeToSubset * nodeToOverlapMap);
virtual ~LambdaMatrixSolverLumped(){};
/** assemble the matrix */
virtual void assemble_matrix(DIAG_MAT & weights);
/** execute the solver */
virtual void execute(VECTOR & rhs, VECTOR & lambda);
protected:
/** lumped version of the matrix governing lamda */
DIAG_MAT lumpedMatrix_;
/** set of regulated nodes */
const RegulatedNodes * applicationNodes_;
/** mapping from all nodes to overlap nodes: -1 is no overlap, otherwise entry is overlap index */
const NodeToSubset * nodeToOverlapMap_;
private:
// DO NOT define this
LambdaMatrixSolverLumped();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class LambdaMatrixSolverCg
//--------------------------------------------------------
//--------------------------------------------------------
class LambdaMatrixSolverCg : public LambdaMatrixSolver {
public:
LambdaMatrixSolverCg(SPAR_MAN & matrixTemplate, SPAR_MAN * shapeFunctionMatrix, int maxIterations, double tolerance);
virtual ~LambdaMatrixSolverCg(){};
/** execute the solver */
virtual void execute(VECTOR & rhs, VECTOR & lambda);
protected:
private:
// DO NOT define this
LambdaMatrixSolverCg();
};
};
#endif
diff --git a/lib/atc/BodyForce.cpp b/lib/atc/BodyForce.cpp
index 8bc76f2c5..ecef3749b 100644
--- a/lib/atc/BodyForce.cpp
+++ b/lib/atc/BodyForce.cpp
@@ -1,32 +1,37 @@
#include "BodyForce.h"
#include "ATC_Error.h"
#include <iostream>
#include <fstream>
+#include <vector>
using ATC_Utility::command_line;
using ATC_Utility::str2dbl;
using ATC_Utility::str2int;
+using std::fstream;
+using std::string;
+using std::map;
+using std::vector;
namespace ATC {
BodyForceViscous::BodyForceViscous(
- fstream &fileId, map<string,double> & parameters)
+ fstream &fileId, std::map<std::string,double> & parameters)
: BodyForce(), gamma_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
- vector<string> line;
+ std::vector<std::string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
double value = str2dbl(line[1]);
if (line[0] == "gamma") {
gamma_ = value;
parameters["gamma"] = gamma_;
}
}
}
}
diff --git a/lib/atc/BodyForce.h b/lib/atc/BodyForce.h
index 4e312f172..eef5df03b 100644
--- a/lib/atc/BodyForce.h
+++ b/lib/atc/BodyForce.h
@@ -1,72 +1,68 @@
#ifndef BODY_FORCE_H
#define BODY_FORCE_H
#include <map>
#include <string>
-
-using std::map;
-using std::string;
-
#include "ATC_TypeDefs.h"
#include "Function.h"
namespace ATC {
/**
* @class BodyForce
* @brief Base class for models of body forces in the momentum eqn
*/
class BodyForce
{
public:
BodyForce() {};
virtual ~BodyForce() {};
virtual bool body_force(const FIELD_MATS &fields,
DENS_MAT &flux) const { return false; };
};
/**
* @class BodyForceViscous
* @brief viscous body forces
*/
class BodyForceViscous : public BodyForce
{
public:
- BodyForceViscous(fstream &matfile,map<string,double> & parameters);
+ BodyForceViscous(std::fstream &matfile,std::map<std::string,double> & parameters);
virtual ~BodyForceViscous() {};
virtual bool body_force(const FIELD_MATS &fields,
DENS_MAT &flux) const
{
FIELD_MATS::const_iterator v_field = fields.find(VELOCITY);
const DENS_MAT & v = v_field->second;
flux = -gamma_*v;
return true;
}
protected:
double gamma_;
};
/**
* @class BodyForceElectricField
* @brief electric field body forces
*/
class BodyForceElectricField : public BodyForce
{
public:
- BodyForceElectricField(fstream &matfile,map<string,double> & parameters)
+ BodyForceElectricField(std::fstream &matfile,std::map<std::string,double> & parameters)
{ throw ATC_Error("unimplemented due to issues with accessing electric field"); }
virtual ~BodyForceElectricField() {};
virtual bool body_force(const FIELD_MATS &fields,
DENS_MAT &flux) const
{
FIELD_MATS::const_iterator v_field = fields.find(VELOCITY);
const DENS_MAT & v = v_field->second;
int nNodes = v.nRows();
flux.reset(nNodes,1);
return true;
}
};
}
#endif
diff --git a/lib/atc/CBLattice.cpp b/lib/atc/CBLattice.cpp
index 67c2cf6be..c50b8eb3d 100644
--- a/lib/atc/CBLattice.cpp
+++ b/lib/atc/CBLattice.cpp
@@ -1,202 +1,204 @@
#include "CBLattice.h"
#include "CbPotential.h"
+#include <fstream>
+
namespace ATC {
// removes any overlapping atoms (avoid calling because it scales n^2.)
INDEX AtomCluster::remove_overlap()
{
INDEX removed_count = 0;
std::vector<double>::iterator r(cur_bond_len_.begin());
std::vector<DENS_VEC>::iterator R(ref_coords_.begin()), Rp;
const double TOL = 1.0e-6 * R->dot(*R);
for (; R!=ref_coords_.end(); R++, r++) {
for (Rp=R+1; Rp!=ref_coords_.end(); Rp++) {
if (sum_difference_squared(*Rp, *R) < TOL) {
ref_coords_.erase(R--);
cur_bond_len_.erase(r--);
++removed_count;
break;
}
}
}
return removed_count;
}
//=========================================================================
// writes cluster to 3 column data format
//=========================================================================
void AtomCluster::write_to_dat(std::string path, bool current_config)
{
const int npts = int(ref_coords_.size());
if (path.substr(path.size()-5,4) != ".dat") path += ".dat";
- fstream fid(path.c_str(), std::ios::out);
+ std::fstream fid(path.c_str(), std::ios::out);
for (int i=0; i<npts; i++) {
DENS_VEC x (current_config ? r(i):R(i));
for (INDEX j=0; j<x.size(); j++) fid << x(j) << " ";
fid << " " << x.norm() << "\n";
}
}
//=========================================================================
// writes cluster to vtk format, (in either reference or current config)
//=========================================================================
void AtomCluster::write_to_vtk(std::string path, bool current_config)
{
const int npts = int(ref_coords_.size());
if (path.substr(path.size()-5,4) != ".vtk") path += ".vtk";
- fstream fid(path.c_str(), std::ios::out);
+ std::fstream fid(path.c_str(), std::ios::out);
// write header
fid << "# vtk DataFile Version 2.0\nWritten from FE-LAMMPS\n";
fid << "ASCII\nDATASET UNSTRUCTURED_GRID\n";
fid << "POINTS " << npts << " float\n";
for (int i=0; i<npts; i++) {
DENS_VEC x (current_config ? r(i):R(i));
for (INDEX j=0; j<x.size(); j++) fid << x(j) << " ";
fid << ((i+1)%3==0 ? "\n" : " ");
}
fid << "\nCELLS "<<npts<<" "<<2*npts<<"\n";
for (int i=0; i<npts; i++) fid << "1" << " " << i << "\n";
fid << "CELL_TYPES " << npts << "\n";
for (int i=0; i<npts; i++) fid << "1" << "\n";
}
//===========================================================================
// constructor
// @param N 3x3 DenseMatrix with each column as a base vector
// @param B 3xn DenseMatrix with each column being a basis vector
// @param R vector of 3D bond Vectors to representative atom in ref config
// @param r vector of bond lengths to representative atom in current config
// @param RC cutoff radius of bond potential
//===========================================================================
CBLattice::CBLattice(const MATRIX &N, const MATRIX &B)
: n_(N), b_(B), N_(N), B_(B)
{
// builds the default queue
for (int a=-1; a<2; a++)
for (int b=-1; b<2; b++)
for (int c=-1; c<2; c++)
if ( a!=0 || b!=0 || c!=0) queue0_.push(hash(a,b,c));
}
//=============================================================================
// writes out default lattice parameters
//=============================================================================
std::ostream & operator<<(std::ostream& o, const CBLattice& lattice)
{
o<<"cutoff radius = "<<sqrt(lattice.RC2_)<<"\n";
lattice.N_.print("Reference base vectors");
lattice.B_.print("Reference basis vectors");
return o;
}
//===========================================================================
// Constructs the virtual atom cluster of neighbors within cutoff
// @param F the deformation gradient tensor
//===========================================================================
void CBLattice::atom_cluster(const MATRIX &F, double cutoff, AtomCluster &v)
{
RC2_ = cutoff*cutoff;
// compute new base and basis vectors
v.clear();
v.F_ = F;
n_ = F*N_;
b_ = F*B_;
// add basis from the center cell (not including representative atom)
for (int i=1; i<B_.nCols(); i++) {
v.cur_bond_len_.push_back(b_.col_norm(i));
v.ref_coords_.push_back(column(B_,i));
}
_FindAtomsInCutoff(v);
}
//=============================================================================
// Computes forces on central atom, with atom I displaced by u.
//=============================================================================
DENS_VEC AtomCluster::perturbed_force(const CbPotential *p, int I, DENS_VEC *u) const
{
DENS_VEC f(3);
for (INDEX i=0; i<size(); i++) {
DENS_VEC ri = r(i);
if (u && i+1==I) ri += *u;
if (u && I==0) ri -= *u;
const double d = ri.norm();
f.add_scaled(ri, -p->phi_r(d)/d);
}
return f;
}
//=============================================================================
// Computes the force constant matrix between atoms I and 0.
//=============================================================================
DENS_MAT AtomCluster::force_constants(INDEX I, const CbPotential *p) const
{
DENS_MAT D(3,3);
for (INDEX i=0; i<3; i++) {
DENS_VEC du(3);
du(i) = 1.0e-6; // take central difference
row(D,i) = perturbed_force(p, I, &du);
du(i) = -du(i);
row(D,i) -= perturbed_force(p, I, &du);
}
D *= 0.5e6;
return D;
}
//=============================================================================
// performs an iterative search for all neighbors within cutoff
//=============================================================================
void CBLattice::_FindAtomsInCutoff(AtomCluster &v)
{
static const int dir[2] = {-1, 1};
int a, b, c, abc;
std::stack<int> queue(queue0_);
std::set<int> done;
// search in each direction
while (!queue.empty()) {
abc = queue.top();
queue.pop();
if (done.find(abc) == done.end()) { // value not in set
unhash(abc,a,b,c); // convert abc to a,b,c
if (_CheckUnitCell(a, b, c, v)) {
done.insert(abc);
// add direct 'outward' neighbors to queue
queue.push(hash(a+dir[a>0], b, c));
queue.push(hash(a, b+dir[b>0], c));
queue.push(hash(a, b, c+dir[c>0]));
}
}
}
}
//===========================================================================
// Computes \f$r^2 = \Vert a n_1 + b n_2 +c n_3 + b_d \Vert^2 \f$
// and adds atom (a,b,c,d) if \f$r^2 < r_{cutoff}^2 \f$
// @param a cell x-index
// @param b cell y-index
// @param c cell z-index
//===========================================================================
bool CBLattice::_CheckUnitCell(char a, char b, char c, AtomCluster &v)
{
const int nsd = n_.nRows(); // number of spatial dimensions
const double A=double(a), B=double(b), C=double(c);
bool found=false;
DENS_VEC r0(nsd,false), R0(nsd,false), Rd(nsd,false); // don't initialize
for (int i=0; i<nsd; i++) { // precompute locations of cell
R0(i) = A*N_(0,i) + B*N_(1,i) + C*N_(2,i); // reference
}
r0 = v.F_*R0; // deformed
for (int d=0; d<b_.nCols(); d++) {
double ri = r0(0) + b_(0,d);
double r2 = ri*ri;
for (int i=1; i<nsd; i++) {
ri = r0(i) + b_(i,d);
r2 += ri*ri;
}
if (r2 <= RC2_) {
v.ref_coords_.push_back(R0);
v.ref_coords_.back() += column(B_,d); // position is R0 + B_[d]
v.cur_bond_len_.push_back(sqrt(r2));
found = true;
}
}
return found;
}
} // end ATC
diff --git a/lib/atc/CBLattice.h b/lib/atc/CBLattice.h
index eddb83515..6082d80d6 100644
--- a/lib/atc/CBLattice.h
+++ b/lib/atc/CBLattice.h
@@ -1,98 +1,97 @@
#ifndef CBLATTICE_H
#define CBLATTICE_H
#include <set>
#include <vector>
#include <stack>
#include "MatrixLibrary.h"
#include "ATC_TypeDefs.h"
-using std::vector;
namespace ATC
{
class CbPotential; // forward definition for potentials.
class StressArgs;
/**
* @class AtomCluster
* @brief Base class for a container for a cluster of atoms around an atom at the origin
* (which is not included in the lists).
* Provides routines for outputting the atoms in the cluster to a vtk file,
* and checking for any overlapping atoms (which should not happen).
*/
class AtomCluster
{
friend class CBLattice;
friend DENS_MAT_VEC compute_dynamical_derivative(StressArgs &args);
friend int test_FCB(const StressArgs &args);
public:
//* Returns the number of atoms in the cluster.
INDEX size() const { return cur_bond_len_.size(); }
//* removes all atoms from the cluster
void clear() { cur_bond_len_.clear(), ref_coords_.clear(); }
//* Removes any overlapping atoms (if they exist).
INDEX remove_overlap();
//* Writes the atom positions of the cluster to a dat file.
void write_to_dat(std::string path, bool current_config=true);
//* Writes the atom positions of the cluster to a vtk file.
void write_to_vtk(std::string path, bool current_config=true);
//* Returns an atom coordinate in the reference configuration.
const DENS_VEC &R(INDEX i) const { return ref_coords_[i]; }
//* Returns an atom coordinate in the current configuration.
DENS_VEC r(INDEX i) const { return F_*R(i); }
//* Returns the ith atoms bond length to the central atom.
double bond_length(INDEX i) const { return cur_bond_len_[i]; }
//* Returns a reference to the deformation gradient tensor.
const DENS_MAT& deformation_gradient() const { return F_; }
//* Computes forces on central atom, with atom I displaced by u.
DENS_VEC perturbed_force(const CbPotential *p, int I, DENS_VEC *u) const;
//* Computes the force constant matrix between atoms I and 0.
DENS_MAT force_constants(INDEX I, const CbPotential *p) const;
private:
std::vector<double> cur_bond_len_; //*> Bond lengths (current)
std::vector<DENS_VEC> ref_coords_; //*> Atom coordinates (ref)
DENS_MAT F_; //*> Deformation gradient
};
/**
* @class CBLattice
* @brief Base class that generates a virtual atom clusters given a lattice and
* a deformation gradient.
*/
class CBLattice
{
protected:
double RC2_; //*> cutoff radius^2
std::stack<int> queue0_; //*> cell nghbrs of representative cell
DENS_MAT n_, b_; //*> cols are def base and basis vectors
const MATRIX &N_, &B_; //*> cols are ref base and basis vectors
public:
//* Operator that outputs the lattice and basis to a stream.
friend std::ostream& operator<<(std::ostream& o, const CBLattice& lattice);
CBLattice(const MATRIX &N, const MATRIX &B);
//* generates the virtual atom cluster
void atom_cluster(const MATRIX &F, double cutoff, AtomCluster &v);
protected:
void _FindAtomsInCutoff(AtomCluster &v);
bool _CheckUnitCell(char a, char b, char c, AtomCluster &v);
};
// hash functions: a, b, c must in range [-128, 127]
inline int hash(int a,int b,int c) {return(a+128)|((b+128)<<8)|((c+128)<<16);}
inline void unhash(int r, int &a, int &b, int &c)
{
a = (r&0xFF) - 128;
b = ((r>>8)&0xFF) - 128;
c = ((r>>16)&0xFF) - 128;
}
}
#endif
diff --git a/lib/atc/CbEam.h b/lib/atc/CbEam.h
index 0feed514b..542aec9fa 100644
--- a/lib/atc/CbEam.h
+++ b/lib/atc/CbEam.h
@@ -1,212 +1,212 @@
#ifndef CBEAM_H
#define CBEAM_H
#include <iostream>
#include <cstdlib>
#include "CbPotential.h"
#include "LammpsInterface.h"
#include "MANYBODY/pair_eam.h"
-//#define MIN(a,b) ((a) < (b) ? (a) : (b))
-//#define MAX(a,b) ((a) > (b) ? (a) : (b))
-
namespace ATC
{
+ // forward declares
+ class LAMMPS_NS::PairEAM;
+
/**
* @class CbEam
* @brief Class for computing Cauchy-Born quantities for an Embeded-Atom Method material
* (A factor of one-half is already included to split the
* bond energy between atoms)
*/
class CbEam : public CbPotential
{
public:
//! Constructor
CbEam(void) : CbPotential(Interactions(PAIRWISE,EAM)) {
// get pointer to lammps' pair_eam object
lammps_eam = ATC::LammpsInterface::instance()->pair_eam();
nrho = &lammps_eam->nrho;
nr = &lammps_eam->nr;
nfrho = &lammps_eam->nfrho;
nrhor = &lammps_eam->nrhor;
nz2r = &lammps_eam->nz2r;
type2frho = lammps_eam->type2frho;
type2rhor = lammps_eam->type2rhor;
type2z2r = lammps_eam->type2z2r;
dr = &lammps_eam->dr;
rdr = &lammps_eam->rdr;
drho = &lammps_eam->drho;
rdrho = &lammps_eam->rdrho;
rhor_spline = &lammps_eam->rhor_spline;
frho_spline = &lammps_eam->frho_spline;
z2r_spline = &lammps_eam->z2r_spline;
cutmax = &lammps_eam->cutmax;
}
//! Returns the cutoff readius of the EAM potential functions rho and z2r.
double cutoff_radius() const { return *cutmax; }
//! Returns the EAM pair energy
double phi(const double &r) const
{
double p = r*(*rdr) + 1.0;
int m = static_cast<int> (p);
m = MIN(m,(*nr)-1);
p -= m;
p = MIN(p,1.0);
// for now, assume itype = jtype = 1
double *coeff = (*z2r_spline)[type2z2r[1][1]][m];
double z2 = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6];
return z2/r;
}
//! Returns the first derivative of the pair energy.
double phi_r(const double &r) const
{
double p = r*(*rdr) + 1.0;
int m = static_cast<int> (p);
m = MIN(m,(*nr)-1);
p -= m;
p = MIN(p,1.0);
// for now, assume itype = jtype = 1
double *coeff = (*z2r_spline)[type2z2r[1][1]][m];
double z2 = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6];
double z2p = (coeff[0]*p + coeff[1])*p + coeff[2];
return (1.0/r)*(z2p-z2/r);
}
//! Returns the second derivative of the pair energy.
double phi_rr(const double &r) const
{
double p = r*(*rdr) + 1.0;
int m = static_cast<int> (p);
m = MIN(m,(*nr)-1);
p -= m;
p = MIN(p,1.0);
// for now, assume itype = jtype = 1
double *coeff = (*z2r_spline)[type2z2r[1][1]][m];
double z2 = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6];
double z2p = (coeff[0]*p + coeff[1])*p + coeff[2];
double z2pp = (*rdr)*(2.0*coeff[0]*p + coeff[1]);
return (1.0/r)*(z2pp-2.0*z2p/r+2.0*z2/(r*r));
}
//! Returns the third derivative of the pair energy.
double phi_rrr(const double &r) const
{
double p = r*(*rdr) + 1.0;
int m = static_cast<int> (p);
m = MIN(m,(*nr)-1);
p -= m;
p = MIN(p,1.0);
// for now, assume itype = jtype = 1
double *coeff = (*z2r_spline)[type2z2r[1][1]][m];
double z2 = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6];
double z2p = (coeff[0]*p + coeff[1])*p + coeff[2];
double z2pp = (*rdr)*(2.0*coeff[0]*p + coeff[1]);
double z2ppp = (*rdr)*(*rdr)*2.0*coeff[0];
return (1.0/r)*(z2ppp-3.0*z2pp/r+6.0*z2p/(r*r)-6.0*z2/(r*r*r));
}
//! Returns the EAM atomic charge density.
double rho(const double &r) const
{
double p = r*(*rdr) + 1.0;
int m = static_cast<int> (p);
m = MIN(m,(*nr)-1);
p -= m;
p = MIN(p,1.0);
// for now, assume itype = jtype = 1
double *coeff = (*rhor_spline)[type2rhor[1][1]][m];
return (((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]);
}
//! Returns the first derivative of the atomic charge density.
double rho_r(const double &r) const
{
double p = r*(*rdr) + 1.0;
int m = static_cast<int> (p);
m = MIN(m,(*nr)-1);
p -= m;
p = MIN(p,1.0);
// for now, assume itype = jtype = 1
double *coeff = (*rhor_spline)[type2rhor[1][1]][m];
return ((coeff[0]*p + coeff[1])*p + coeff[2]);
}
//! Returns the second derivative of the atomic charge density.
double rho_rr(const double &r) const
{
double p = r*(*rdr) + 1.0;
int m = static_cast<int> (p);
m = MIN(m,(*nr)-1);
p -= m;
p = MIN(p,1.0);
// for now, assume itype = jtype = 1
double *coeff = (*rhor_spline)[type2rhor[1][1]][m];
return ((*rdr)*(2.0*coeff[0]*p + coeff[1]));
}
//! Returns the third derivative of the atomic charge density.
double rho_rrr(const double &r) const
{
double p = r*(*rdr) + 1.0;
int m = static_cast<int> (p);
m = MIN(m,(*nr)-1);
p -= m;
p = MIN(p,1.0);
// for now, assume itype = jtype = 1
double *coeff = (*rhor_spline)[type2rhor[1][1]][m];
return ((*rdr)*(*rdr)*2.0*coeff[0]);
}
//! Returns the EAM embedding energy.
double F(const double &p) const
{
double q = p*(*rdrho) + 1.0;
int m = static_cast<int> (q);
m = MIN(m,(*nrho)-1);
q -= m;
q = MIN(q,1.0);
// for now, assume itype = 1
double *coeff = (*frho_spline)[type2frho[1]][m];
return (((coeff[3]*q + coeff[4])*q + coeff[5])*q + coeff[6]);
}
//! Returns the first derivative of the embedding energy.
double F_p(const double &p) const
{
double q = p*(*rdrho) + 1.0;
int m = static_cast<int> (q);
m = MIN(m,(*nrho)-1);
q -= m;
q = MIN(q,1.0);
// for now, assume itype = 1
double *coeff = (*frho_spline)[type2frho[1]][m];
return ((coeff[0]*q + coeff[1])*q + coeff[2]);
}
//! Returns the second derivative of the atomic charge density.
double F_pp(const double &p) const
{
double q = p*(*rdrho) + 1.0;
int m = static_cast<int> (q);
m = MIN(m,(*nrho)-1);
q -= m;
q = MIN(q,1.0);
// for now, assume itype = 1
double *coeff = (*frho_spline)[type2frho[1]][m];
return ((*rdrho)*(2.0*coeff[0]*q + coeff[1]));
}
//! Returns the third derivative of the atomic charge density.
double F_ppp(const double &p) const
{
double q = p*(*rdrho) + 1.0;
int m = static_cast<int> (q);
m = MIN(m,(*nrho)-1);
q -= m;
q = MIN(q,1.0);
// for now, assume itype = 1
double *coeff = (*frho_spline)[type2frho[1]][m];
return ((*rdrho)*(*rdrho)*2.0*coeff[0]);
}
int *nrho,*nr,*nfrho,*nrhor,*nz2r;
int *type2frho,**type2rhor,**type2z2r;
double *cutmax;
double *dr,*rdr,*drho,*rdrho;
double ****rhor_spline,****frho_spline,****z2r_spline;
LAMMPS_NS::PairEAM* lammps_eam;
};
}
#endif
diff --git a/lib/atc/ChargeRegulator.cpp b/lib/atc/ChargeRegulator.cpp
index dacafebc5..c2f54b27b 100644
--- a/lib/atc/ChargeRegulator.cpp
+++ b/lib/atc/ChargeRegulator.cpp
@@ -1,705 +1,735 @@
#include "ChargeRegulator.h"
#include "PoissonSolver.h"
#include "LammpsInterface.h"
#include "ATC_Coupling.h"
#include "ATC_Error.h"
#include "Function.h"
#include "PrescribedDataManager.h"
+#include <sstream>
+#include <string>
+#include <vector>
+#include <utility>
+#include <set>
+
+using ATC_Utility::to_string;
+using std::stringstream;
+using std::map;
+using std::vector;
+using std::set;
+using std::pair;
+using std::string;
namespace ATC {
//========================================================
// Class ChargeRegulator
//========================================================
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ChargeRegulator::ChargeRegulator(ATC_Coupling * atc) :
AtomicRegulator(atc)
{
// do nothing
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ChargeRegulator::~ChargeRegulator()
{
map<string,ChargeRegulatorMethod *>::iterator it;
for (it = regulators_.begin(); it != regulators_.end(); it++) {
if (it->second) delete it->second;
}
}
//--------------------------------------------------------
// modify:
// parses and adjusts charge regulator state based on
// user input, in the style of LAMMPS user input
//--------------------------------------------------------
bool ChargeRegulator::modify(int narg, char **arg)
{
bool foundMatch = false;
return foundMatch;
}
//--------------------------------------------------------
// construct methods
//--------------------------------------------------------
void ChargeRegulator::construct_methods()
{
AtomicRegulator::construct_methods();
if (atc_->reset_methods()) {
// eliminate existing methods
delete_method();
// consruct new ones
map<string, ChargeRegulatorParameters>::iterator itr;
for (itr = parameters_.begin();
itr != parameters_.end(); itr++) {
string tag = itr->first;
if (regulators_.find(tag) != regulators_.end()) delete regulators_[tag];
ChargeRegulatorParameters & p = itr->second;
LammpsInterface * lammpsInterface = LammpsInterface::instance();
p.groupBit = lammpsInterface->group_bit(tag);
if (! p.groupBit)
throw ATC_Error("ChargeRegulator::initialize group not found");
switch (p.method) {
case NONE: {
regulators_[tag] = new ChargeRegulatorMethod(this,p);
break;
}
case FEEDBACK: {
regulators_[tag] = new ChargeRegulatorMethodFeedback(this,p);
break;
}
case IMAGE_CHARGE: {
regulators_[tag] = new ChargeRegulatorMethodImageCharge(this,p);
break;
}
case EFFECTIVE_CHARGE: {
regulators_[tag] = new ChargeRegulatorMethodEffectiveCharge(this,p);
break;
}
default:
throw ATC_Error("ChargeRegulator::construct_method unknown charge regulator type");
}
}
}
}
//--------------------------------------------------------
// initialize:
//--------------------------------------------------------
void ChargeRegulator::initialize()
{
map<string, ChargeRegulatorMethod *>::iterator itr;
for (itr = regulators_.begin();
itr != regulators_.end(); itr++) { itr->second->initialize(); }
atc_->set_boundary_integration_type(boundaryIntegrationType_);
AtomicRegulator::reset_nlocal();
AtomicRegulator::delete_unused_data();
needReset_ = false;
}
//--------------------------------------------------------
// apply pre force
//--------------------------------------------------------
void ChargeRegulator::apply_pre_force(double dt)
{
map<string, ChargeRegulatorMethod *>::iterator itr;
for (itr = regulators_.begin();
itr != regulators_.end(); itr++) { itr->second->apply_pre_force(dt);}
}
//--------------------------------------------------------
// apply post force
//--------------------------------------------------------
void ChargeRegulator::apply_post_force(double dt)
{
map<string, ChargeRegulatorMethod *>::iterator itr;
for (itr = regulators_.begin();
itr != regulators_.end(); itr++) { itr->second->apply_post_force(dt);}
}
//--------------------------------------------------------
// output
//--------------------------------------------------------
void ChargeRegulator::output(OUTPUT_LIST & outputData)
{
map<string, ChargeRegulatorMethod *>::iterator itr;
for (itr = regulators_.begin();
itr != regulators_.end(); itr++) { itr->second->output(outputData);}
}
//========================================================
// Class ChargeRegulatorMethod
//========================================================
//--------------------------------------------------------
// Constructor
// Grab references to ATC and ChargeRegulator
//--------------------------------------------------------
ChargeRegulatorMethod::ChargeRegulatorMethod
(ChargeRegulator *chargeRegulator,
ChargeRegulator::ChargeRegulatorParameters & p)
: RegulatorShapeFunction(chargeRegulator),
chargeRegulator_(chargeRegulator),
lammpsInterface_(LammpsInterface::instance()),
rC_(0), rCsq_(0),
targetValue_(NULL),
targetPhi_(p.value),
surface_(p.faceset),
atomGroupBit_(p.groupBit),
boundary_(false),
depth_(p.depth),
surfaceType_(p.surfaceType),
permittivity_(p.permittivity),
initialized_(false)
{
const FE_Mesh * feMesh = atc_->fe_engine()->fe_mesh();
feMesh->faceset_to_nodeset(surface_,nodes_);
// assume flat get normal and primary coord
PAIR face = *(surface_.begin());
normal_.reset(nsd_);
feMesh->face_normal(face,0,normal_);
DENS_MAT faceCoords;
feMesh->face_coordinates(face,faceCoords);
point_.reset(nsd_);
for (int i=0; i < nsd_; i++) { point_(i) = faceCoords(i,0); }
#ifdef ATC_VERBOSE
stringstream ss; ss << "point: (" << point_(0) << "," << point_(1) << "," << point_(2) << ") normal: (" << normal_(0) << "," << normal_(1) << "," << normal_(2) << ") depth: " << depth_;
lammpsInterface_->print_msg_once(ss.str());
#endif
sum_.reset(nsd_);
}
//--------------------------------------------------------
// Initialize
//--------------------------------------------------------
// nomenclature might be a bit backwark: control --> nodes that exert the control, & influence --> atoms that feel the influence
void ChargeRegulatorMethod::initialize(void)
{
interscaleManager_ = &(atc_->interscale_manager());
poissonSolver_ =chargeRegulator_->poisson_solver();
if (! poissonSolver_) throw ATC_Error("need a poisson solver to initialize charge regulator");
// atomic vectors
// nodal information
nNodes_ = atc_->num_nodes();
// constants
rC_ = lammpsInterface_->pair_cutoff();
rCsq_ = rC_*rC_;
qV2e_ = lammpsInterface_->qv2e();
qqrd2e_ = lammpsInterface_->qqrd2e();
// note derived method set intialized to true
}
int ChargeRegulatorMethod::nlocal() { return atc_->nlocal(); }
void ChargeRegulatorMethod::set_greens_functions(void)
{
// set up Green's function per node
for (int i = 0; i < nNodes_; i++) {
set<int> localNodes;
for (int j = 0; j < nNodes_; j++)
localNodes.insert(j);
// call Poisson solver to get Green's function for node i
DENS_VEC globalGreensFunction;
poissonSolver_->greens_function(i,globalGreensFunction);
// store green's functions as sparse vectors only on local nodes
set<int>::const_iterator thisNode;
SparseVector<double> sparseGreensFunction(nNodes_);
for (thisNode = localNodes.begin(); thisNode != localNodes.end(); thisNode++)
sparseGreensFunction(*thisNode) = globalGreensFunction(*thisNode);
greensFunctions_.push_back(sparseGreensFunction);
}
}
//--------------------------------------------------------
// output
//--------------------------------------------------------
void ChargeRegulatorMethod::output(OUTPUT_LIST & outputData)
{
//vector<double> localSum(sum_.size());
//lammpsInteface_->allsum(localSum.pointer,sum_.pointer,sum_.size());
DENS_VEC localSum(sum_.size());
lammpsInterface_->allsum(localSum.ptr(),sum_.ptr(),sum_.size());
for (int i = 0; i < sum_.size(); i++) {
string name = "charge_regulator_influence_"+to_string(i);
// atc_->fe_engine()->add_global(name,sum_[i]);
}
}
//========================================================
// Class ChargeRegulatorMethodFeedback
//========================================================
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ChargeRegulatorMethodFeedback::ChargeRegulatorMethodFeedback
(ChargeRegulator *chargeRegulator,
ChargeRegulator::ChargeRegulatorParameters & p)
: ChargeRegulatorMethod (chargeRegulator, p),
controlNodes_(nodes_),
influenceGroupBit_(p.groupBit)
{
nControlNodes_ = controlNodes_.size();
sum_.resize(1);
}
//--------------------------------------------------------
// Initialize
//--------------------------------------------------------
void ChargeRegulatorMethodFeedback::initialize(void)
{
ChargeRegulatorMethod::initialize();
if (surfaceType_ != ChargeRegulator::CONDUCTOR)
throw ATC_Error("currently charge feedback can only mimic a conductor");
set_influence();
set_influence_matrix();
initialized_ = true;
}
//--------------------------------------------------------
+ // Initialize
+ //--------------------------------------------------------
+ void ChargeRegulatorMethodFeedback::construct_transfers(void)
+ {
+ ChargeRegulatorMethod::construct_transfers();
+
+ InterscaleManager & interscaleManager((atomicRegulator_->atc_transfer())->interscale_manager());
+ PerAtomSparseMatrix<double> * atomShapeFunctions = interscaleManager.per_atom_sparse_matrix("InterpolantGhost");
+ if (!atomShapeFunctions) {
+ atomShapeFunctions = new PerAtomShapeFunction(atomicRegulator_->atc_transfer(),
+ interscaleManager.per_atom_quantity("AtomicGhostCoarseGrainingPositions"),
+ interscaleManager.per_atom_int_quantity("AtomGhostElement"),
+ GHOST);
+ interscaleManager.add_per_atom_sparse_matrix(atomShapeFunctions,"InterpolantGhost");
+ }
+ }
+ //--------------------------------------------------------
// find measurement atoms and nodes
//--------------------------------------------------------
void ChargeRegulatorMethodFeedback::set_influence(void)
{
// get nodes that overlap influence atoms & compact list of influence atoms
boundary_ =
atc_->nodal_influence(influenceGroupBit_,influenceNodes_,influenceAtoms_);
nInfluenceAtoms_ = influenceAtoms_.size(); // local
nInfluenceNodes_ = influenceNodes_.size(); // global
stringstream ss; ss << "control nodes: " << nControlNodes_ << " influence nodes: " << nInfluenceNodes_ << " local influence atoms: " << nInfluenceAtoms_ ;
lammpsInterface_->print_msg(ss.str());
if (nInfluenceNodes_ == 0) throw ATC_Error("no influence nodes");
const Array<int> & map = (boundary_) ? atc_->ghost_to_atom_map() : atc_->internal_to_atom_map();
for (set<int>::const_iterator itr = influenceAtoms_.begin(); itr != influenceAtoms_.end(); itr++) {
influenceAtomsIds_.insert(map(*itr));
}
}
//--------------------------------------------------------
// constuct a Green's submatrix
//--------------------------------------------------------
void ChargeRegulatorMethodFeedback::set_influence_matrix(void)
{
// construct control-influence matrix bar{G}^-1: ds{p} = G{p,m}^-1 dphi{m}
//
if (nInfluenceNodes_ < nControlNodes_) throw ATC_Error(" least square not implmented ");
if (nInfluenceNodes_ > nControlNodes_) throw ATC_Error(" solve not possible ");
DENS_MAT G(nInfluenceNodes_,nControlNodes_);
DENS_VEC G_I;
set<int>::const_iterator itr,itr2,itr3;
const Array<int> & nmap = atc_->fe_engine()->fe_mesh()->global_to_unique_map();
int i = 0;
for (itr = influenceNodes_.begin(); itr != influenceNodes_.end(); itr++) {
poissonSolver_->greens_function(*itr, G_I);
int j = 0;
for (itr2 = controlNodes_.begin(); itr2 != controlNodes_.end(); itr2++) {
int jnode = nmap(*itr2);
G(i,j++) = G_I(jnode);
}
i++;
}
invG_ = inv(G);
// construct the prolong-restrict projector N N^T for influence nodes only
InterscaleManager & interscaleManager(atc_->interscale_manager());
const SPAR_MAT & N_Ia = (boundary_) ?
(interscaleManager.per_atom_sparse_matrix("InterpolantGhost"))->quantity():
(interscaleManager.per_atom_sparse_matrix("Interpolant"))->quantity();
NT_.reset(nInfluenceAtoms_,nInfluenceNodes_);
DENS_MAT NNT(nInfluenceNodes_,nInfluenceNodes_);
int k = 0;
for (itr3 = influenceAtoms_.begin(); itr3 != influenceAtoms_.end(); itr3++) {
int katom = *itr3;
int i = 0;
for (itr = influenceNodes_.begin(); itr != influenceNodes_.end(); itr++) {
int Inode = *itr;
int j = 0;
NT_(k,i) = N_Ia(katom,Inode);
for (itr2 = influenceNodes_.begin(); itr2 != influenceNodes_.end(); itr2++) {
int Jnode = *itr2;
NNT(i,j++) += N_Ia(katom,Inode)*N_Ia(katom,Jnode);
}
i++;
}
k++;
}
// swap contributions across processors
DENS_MAT localNNT = NNT;
int count = NNT.nRows()*NNT.nCols();
lammpsInterface_->allsum(localNNT.ptr(),NNT.ptr(),count);
invNNT_ = inv(NNT);
// total influence matrix
if (nInfluenceAtoms_ > 0) { NTinvNNTinvG_ = NT_*invNNT_*invG_; }
}
//--------------------------------------------------------
// change potential/charge pre-force calculation
//--------------------------------------------------------
void ChargeRegulatorMethodFeedback::apply_pre_force(double dt)
{
sum_ = 0;
if (nInfluenceAtoms_ == 0) return; // nothing to do
apply_feedback_charges();
}
//--------------------------------------------------------
// apply feedback charges to atoms
//--------------------------------------------------------
void ChargeRegulatorMethodFeedback::apply_feedback_charges()
{
double * q = lammpsInterface_->atom_charge();
// calculate error in potential on the control nodes
const DENS_MAT & phiField = (atc_->field(ELECTRIC_POTENTIAL)).quantity();
DENS_MAT dphi(nControlNodes_,1);
int i = 0;
set<int>::const_iterator itr;
for (itr = controlNodes_.begin(); itr != controlNodes_.end(); itr++) {
dphi(i++,0) = targetPhi_ - phiField(*itr,0);
}
// construct the atomic charges consistent with the correction
DENS_MAT dq = NTinvNNTinvG_*dphi;
i = 0;
for (itr = influenceAtomsIds_.begin(); itr != influenceAtomsIds_.end(); itr++) {
sum_(0) += dq(i,0);
q[*itr] += dq(i++,0);
}
(interscaleManager_->fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE))->force_reset();
(interscaleManager_->fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE, GHOST))->force_reset();
}
//========================================================
// Class ChargeRegulatorMethodImageCharge
//========================================================
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ChargeRegulatorMethodImageCharge::ChargeRegulatorMethodImageCharge
(ChargeRegulator *chargeRegulator,
ChargeRegulator::ChargeRegulatorParameters & p)
: ChargeRegulatorMethod (chargeRegulator, p),
imageNodes_(nodes_)
{
}
//--------------------------------------------------------
// Initialize
//--------------------------------------------------------
void ChargeRegulatorMethodImageCharge::initialize(void)
{
ChargeRegulatorMethod::initialize();
if (surfaceType_ != ChargeRegulator::DIELECTRIC) throw ATC_Error("currently image charge can only mimic a dielectric");
double eps1 = permittivity_;// dielectric
double eps2 = lammpsInterface_->dielectric();// ambient
permittivityRatio_ = (eps2-eps1)/(eps2+eps1);
#ifdef ATC_VERBOSE
stringstream ss; ss << "permittivity ratio: " << permittivityRatio_;
lammpsInterface_->print_msg_once(ss.str());
#endif
set_greens_functions();
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
initialized_ = true;
}
//--------------------------------------------------------
// change potential/charge post-force calculation
//--------------------------------------------------------
void ChargeRegulatorMethodImageCharge::apply_post_force(double dt)
{
sum_ = 0;
apply_local_forces();
//correct_forces();
}
//--------------------------------------------------------
// apply local coulomb forces
// -- due to image charges
//--------------------------------------------------------
void ChargeRegulatorMethodImageCharge::apply_local_forces()
{
int inum = lammpsInterface_->neighbor_list_inum();
int * ilist = lammpsInterface_->neighbor_list_ilist();
int * numneigh = lammpsInterface_->neighbor_list_numneigh();
int ** firstneigh = lammpsInterface_->neighbor_list_firstneigh();
const int *mask = lammpsInterface_->atom_mask();
///..............................................
double ** x = lammpsInterface_->xatom();
double ** f = lammpsInterface_->fatom();
double * q = lammpsInterface_->atom_charge();
// loop over neighbor list
for (int ii = 0; ii < inum; ii++) {
int i = ilist[ii];
double qi = q[i];
if ((mask[i] & atomGroupBit_) && qi != 0.) {
double* fi = f[i];
DENS_VEC xi(x[i],nsd_);
// distance to surface
double dn = reflect(xi);
// all ions near the interface/wall
// (a) self image
if (dn < rC_) { // close enough to wall to have explicit image charges
double factor_coul = 1;
double dx = 2.*dn; // distance to image charge
double fn = factor_coul*qi*qi*permittivityRatio_/dx;
fi[0] += fn*normal_[0];
fi[1] += fn*normal_[1];
fi[2] += fn*normal_[2];
sum_ += fn*normal_;
// (b) neighbor images
int * jlist = firstneigh[i];
int jnum = numneigh[i];
for (int jj = 0; jj < jnum; jj++) {
int j = jlist[jj];
// this changes j
double factor_coul = lammpsInterface_->coulomb_factor(j);
double qj = q[j];
if (qj != 0.) { // all charged neighbors
DENS_VEC xj(x[j],nsd_);
dn = reflect(xj);
DENS_VEC dx = xi-xj;
double r2 = dx.norm_sq();
// neighbor image j' inside cutoff from i
if (r2 < rCsq_) {
double fm = factor_coul*qi*qj*permittivityRatio_/r2;
fi[0] += fm*dx(0);
fi[1] += fm*dx(1);
fi[2] += fm*dx(2);
sum_ += fm*dx;
}
}
}
} // end i < rC if
}
}
// update managed data
(interscaleManager_->fundamental_atom_quantity(LammpsInterface::ATOM_FORCE))->force_reset();
}
//--------------------------------------------------------
// correct charge densities
// - to reflect image charges
//--------------------------------------------------------
void ChargeRegulatorMethodImageCharge::correct_charge_densities()
{
}
//--------------------------------------------------------
// correct_forces
// - due to image charge density used in short-range solution
//--------------------------------------------------------
void ChargeRegulatorMethodImageCharge::correct_forces()
{
}
//========================================================
// Class ChargeRegulatorMethodEffectiveCharge
//========================================================
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ChargeRegulatorMethodEffectiveCharge::ChargeRegulatorMethodEffectiveCharge(
ChargeRegulator *chargeRegulator,
ChargeRegulator::ChargeRegulatorParameters & p)
: ChargeRegulatorMethod (chargeRegulator, p),
chargeDensity_(p.value),
useSlab_(false)
{
}
//--------------------------------------------------------
// add_charged_surface
//--------------------------------------------------------
void ChargeRegulatorMethodEffectiveCharge::initialize( )
{
ChargeRegulatorMethod::initialize();
boundary_ = atc_->is_ghost_group(atomGroupBit_);
// set face sources to all point at unit function for use in integration
SURFACE_SOURCE faceSources;
map<PAIR, Array<XT_Function*> > & fs(faceSources[ELECTRIC_POTENTIAL]);
XT_Function * f = XT_Function_Mgr::instance()->constant_function(1.);
set< PAIR >::const_iterator fsItr;
for (fsItr = surface_.begin(); fsItr != surface_.end(); fsItr++) {
Array < XT_Function * > & dof = fs[*fsItr];
dof.reset(1);
dof(0) = f;
}
// computed integrals of nodal shape functions on face
FIELDS nodalFaceWeights;
Array<bool> fieldMask(NUM_FIELDS); fieldMask(ELECTRIC_POTENTIAL) = true;
(atc_->fe_engine())->compute_fluxes(fieldMask,0.,faceSources,nodalFaceWeights);
const DENS_MAT & w = (nodalFaceWeights[ELECTRIC_POTENTIAL].quantity());
// Get coordinates of each node in face set
for (set<int>::const_iterator n =nodes_.begin(); n != nodes_.end(); n++) {
DENS_VEC x = atc_->fe_engine()->fe_mesh()->nodal_coordinates(*n);
// compute effective charge at each node I
// multiply charge density by integral of N_I over face
double v = w(*n,0)*chargeDensity_;
pair<DENS_VEC,double> p(x,v);
nodeXFMap_[*n] = p;
}
// set up data structure holding charged faceset information
FIELDS sources;
double k = lammpsInterface_->coulomb_constant();
string fname = "radial_power";
double xtArgs[8];
xtArgs[0] = 0; xtArgs[1] = 0; xtArgs[2] = 0;
xtArgs[3] = 1; xtArgs[4] = 1; xtArgs[5] = 1;
xtArgs[6] = k*chargeDensity_;
xtArgs[7] = -1.;
const DENS_MAT & s(sources[ELECTRIC_POTENTIAL].quantity());
NODE_TO_XF_MAP::iterator XFitr;
for (XFitr = nodeXFMap_.begin(); XFitr != nodeXFMap_.end(); XFitr++) {
// evaluate voltage at each node I
// set up X_T function for integration: k*chargeDensity_/||x_I - x_s||
// integral is approximated in two parts:
// 1) near part with all faces within r < rcrit evaluated as 2 * pi * rcrit * k sigma A/A0, A is area of this region and A0 = pi * rcrit^2, so 2 k sigma A / rcrit
// 2) far part evaluated using Gaussian quadrature on faceset
DENS_VEC x((XFitr->second).first);
xtArgs[0] = x(0); xtArgs[1] = x(1); xtArgs[2] = x(2);
f = XT_Function_Mgr::instance()->function(fname,8,xtArgs);
for (fsItr = surface_.begin(); fsItr != surface_.end(); fsItr++) {
fs[*fsItr] = f;
}
// perform integration to get quantities at nodes on facesets
// V_J' = int_S N_J k*sigma/|x_I - x_s| dS
(atc_->fe_engine())->compute_fluxes(fieldMask,0.,faceSources,sources);
// sum over all nodes in faceset to get total potential:
// V_I = sum_J VJ'
int node = XFitr->first;
nodalChargePotential_[node] = s(node,0);
double totalPotential = 0.;
for (set<int>::const_iterator n =nodes_.begin(); n != nodes_.end(); n++) {
totalPotential += s(*n,0); }
// assign an XT function per each node and
// then call the prescribed data manager and fix each node individually.
f = XT_Function_Mgr::instance()->constant_function(totalPotential);
(atc_->prescribed_data_manager())->fix_field(node,ELECTRIC_POTENTIAL,0,f);
}
initialized_ = true;
}
//--------------------------------------------------------
// add effective forces post LAMMPS force call
//--------------------------------------------------------
void ChargeRegulatorMethodEffectiveCharge::apply_post_force(double dt)
{
apply_local_forces();
}
//--------------------------------------------------------
// apply_charged_surfaces
//--------------------------------------------------------
void ChargeRegulatorMethodEffectiveCharge::apply_local_forces()
{
double * q = lammpsInterface_->atom_charge();
_atomElectricalForce_.resize(nlocal(),nsd_);
double penalty = poissonSolver_->penalty_coefficient();
if (penalty <= 0.0) throw ATC_Error("ExtrinsicModelElectrostatic::apply_charged_surfaces expecting non zero penalty");
double dx[3];
const DENS_MAT & xa((interscaleManager_->per_atom_quantity("AtomicCoarseGrainingPositions"))->quantity());
// WORKSPACE - most are static
SparseVector<double> dv(nNodes_);
vector<SparseVector<double> > derivativeVectors;
derivativeVectors.reserve(nsd_);
const SPAR_MAT_VEC & shapeFunctionDerivatives((interscaleManager_->vector_sparse_matrix("InterpolateGradient"))->quantity());
DenseVector<INDEX> nodeIndices;
DENS_VEC nodeValues;
NODE_TO_XF_MAP::const_iterator inode;
for (inode = nodeXFMap_.begin(); inode != nodeXFMap_.end(); inode++) {
int node = inode->first;
DENS_VEC xI = (inode->second).first;
double qI = (inode->second).second;
double phiI = nodalChargePotential_[node];
for (int i = 0; i < nlocal(); i++) {
int atom = (atc_->internal_to_atom_map())(i);
double qa = q[atom];
if (qa != 0) {
double dxSq = 0.;
for (int j = 0; j < nsd_; j++) {
dx[j] = xa(i,j) - xI(j);
dxSq += dx[j]*dx[j];
}
if (dxSq < rCsq_) {
// first apply pairwise coulombic interaction
if (!useSlab_) {
double coulForce = qqrd2e_*qI*qa/(dxSq*sqrtf(dxSq));
for (int j = 0; j < nsd_; j++) {
_atomElectricalForce_(i,j) += dx[j]*coulForce; }
}
// second correct for FE potential induced by BCs
// determine shape function derivatives at atomic location
// and construct sparse vectors to store derivative data
for (int j = 0; j < nsd_; j++) {
shapeFunctionDerivatives[j]->row(i,nodeValues,nodeIndices);
derivativeVectors.push_back(dv);
for (int k = 0; k < nodeIndices.size(); k++) {
derivativeVectors[j](nodeIndices(k)) = nodeValues(k); }
}
// compute greens function from charge quadrature
SparseVector<double> shortFePotential(nNodes_);
shortFePotential.add_scaled(greensFunctions_[node],penalty*phiI);
// compute electric field induced by charge
DENS_VEC efield(nsd_);
for (int j = 0; j < nsd_; j++) {
efield(j) = -.1*dot(derivativeVectors[j],shortFePotential); }
// apply correction in atomic forces
double c = qV2e_*qa;
for (int j = 0; j < nsd_; j++) {
if ((!useSlab_) || (j==nsd_)) {
_atomElectricalForce_(i,j) -= c*efield(j);
}
}
}
}
}
}
}
}; // end namespace
diff --git a/lib/atc/ChargeRegulator.h b/lib/atc/ChargeRegulator.h
index 515ffd450..046a9f515 100644
--- a/lib/atc/ChargeRegulator.h
+++ b/lib/atc/ChargeRegulator.h
@@ -1,281 +1,282 @@
#ifndef CHARGE_REGULATOR_H
#define CHARGE_REGULATOR_H
-// ATC headers
#include "AtomicRegulator.h"
-
-//class PoissonSolver;
#include "PoissonSolver.h"
-
-// other headers
#include <map>
+#include <utility>
+#include <string>
+#include <vector>
namespace ATC {
/**
* @class ChargeRegulator
* @brief Manager class for atom-continuum control of charge and potential
*/
class ChargeRegulatorMethod;
class ChargeRegulator : public AtomicRegulator {
public:
/** charge regulator types */
enum ChargeRegulatorType {
NONE=0,
FEEDBACK,
IMAGE_CHARGE,
EFFECTIVE_CHARGE
};
enum ChargedSurfaceType {
INSULATOR=0,
DIELECTRIC,
CONDUCTOR
};
/** parser data */
struct ChargeRegulatorParameters {
ChargeRegulatorParameters():
method(NONE),
value(0),
groupBit(0),
depth(0),
permittivity(0),
surfaceType(INSULATOR) { };
ChargeRegulatorType method;
double value;
int groupBit;
- string groupTag;
+ std::string groupTag;
double depth;
double permittivity;
ChargedSurfaceType surfaceType;
FSET faceset;
};
/** constructor */
ChargeRegulator(ATC_Coupling *atc);
/** destructor */
~ChargeRegulator();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
virtual void construct_methods();
virtual void initialize();
virtual void apply_pre_force(double dt);
virtual void apply_post_force(double dt);
virtual void output(OUTPUT_LIST & outputData);
virtual double compute_vector(int n) {return 0;} // TODO
void assign_poisson_solver(PoissonSolver * solver) { poissonSolver_ = solver;}
PoissonSolver * poisson_solver(void) { return poissonSolver_;}
protected:
/** poisson solver */
PoissonSolver * poissonSolver_;
/** registry charge regulators */
- map<string,ChargeRegulatorMethod *> regulators_;
- map<string,ChargeRegulatorParameters> parameters_;
+ std::map<std::string,ChargeRegulatorMethod *> regulators_;
+ std::map<std::string,ChargeRegulatorParameters> parameters_;
private:
ChargeRegulator(); // DO NOT define this
};
/**
* @class ChargeRegulatorMethod
* @brief Base class for implementation of ChargeRegulator algorithms
*/
class ChargeRegulatorMethod : public RegulatorShapeFunction {
public:
ChargeRegulatorMethod(ChargeRegulator *chargeRegulator,
ChargeRegulator::ChargeRegulatorParameters & parameters);
~ChargeRegulatorMethod(){};
virtual void initialize(void);
void set_greens_functions();
virtual void apply_pre_force(double dt){};
virtual void apply_post_force(double dt){};
virtual void set_weights() {};
const DENS_VEC & total_influence() const { return sum_;}
virtual void output(OUTPUT_LIST & outputData);
protected:
int nlocal();
/** pointer to charge regulator object for data */
ChargeRegulator * chargeRegulator_;
/** interscale manager */
class InterscaleManager * interscaleManager_;
/** direct interface to lammps */
class LammpsInterface * lammpsInterface_;
/** poisson solver */
PoissonSolver * poissonSolver_;
/** (subset) of Green's functions */
- vector<SparseVector<double> > greensFunctions_;
+ std::vector<SparseVector<double> > greensFunctions_;
/** cutoff radius */
double rC_,rCsq_;
/** conversion constants */
double qV2e_, qqrd2e_;
/** member data */
XT_Function * targetValue_;
double targetPhi_;
// controlling
FSET surface_;
NSET nodes_;
int atomGroupBit_;
bool boundary_; // atoms on boundary
DENS_VEC point_;
DENS_VEC normal_;
double depth_;
ChargeRegulator::ChargedSurfaceType surfaceType_;
double permittivity_;
bool initialized_;
DENS_VEC sum_;
/** workspace */
mutable DENS_MAT _atomElectricalForce_;
private:
ChargeRegulatorMethod(); // DO NOT define this
};
/**
* @class ChargeRegulatorMethodFeedback
* @brief ChargeRegulator with feedback and ad hoc positions
* can be used for conductor (1 charged sheet) or insulator (2 sheets)
*/
class ChargeRegulatorMethodFeedback : public ChargeRegulatorMethod {
public:
/** constructor */
ChargeRegulatorMethodFeedback(ChargeRegulator *chargeRegulator,
ChargeRegulator::ChargeRegulatorParameters & parameters);
/** destructor */
~ChargeRegulatorMethodFeedback(){};
+ /** instantiate all needed data */
+ virtual void construct_transfers();
+
/** initialize */
virtual void initialize(void);
/** set influence nodes and atoms */
void set_influence();
void set_influence_matrix(void);
/** post first verlet step */
virtual void apply_pre_force(double dt);
void apply_feedback_charges();
protected:
int nControlNodes_;
NSET & controlNodes_;
// measurement/controlled
int influenceGroupBit_;
int nInfluenceAtoms_;
NSET influenceAtoms_, influenceAtomsIds_;
int nInfluenceNodes_;
NSET influenceNodes_;
DENS_MAT invG_;
DENS_MAT invNNT_;
DENS_MAT NT_;
DENS_MAT NTinvNNTinvG_;
private:
ChargeRegulatorMethodFeedback(); // DO NOT define this
};
/**
* @class ChargeRegulatorMethodImageCharge
* @brief ChargeRegulator with image charges
*/
class ChargeRegulatorMethodImageCharge : public ChargeRegulatorMethod {
public:
/** constructor */
ChargeRegulatorMethodImageCharge(ChargeRegulator *chargeRegulator,
ChargeRegulator::ChargeRegulatorParameters & parameters);
/** destructor */
~ChargeRegulatorMethodImageCharge(){};
/** initialize */
virtual void initialize(void);
/** post first verlet step */
virtual void apply_post_force(double dt);
protected:
double reflect(DENS_VEC & x) const {
double dn = (x-point_).dot(normal_);
x -= 2*dn*normal_;
return dn;
}
// internal functions
void apply_local_forces();
void correct_charge_densities();
void correct_forces();
double layerDepth_;
double permittivityRatio_;
NSET & imageNodes_;
DENS_MAT imageTransferOp_;
private:
ChargeRegulatorMethodImageCharge(); // DO NOT define this
};
/**
* @class ChargeRegulatorMethodEffectiveCharge
* @brief ChargeRegulator with effective charges at FE quadrature pts
*/
class ChargeRegulatorMethodEffectiveCharge : public ChargeRegulatorMethod {
- typedef map<int,pair<DENS_VEC,double> > NODE_TO_XF_MAP;
+ typedef std::map<int,std::pair<DENS_VEC,double> > NODE_TO_XF_MAP;
public:
/** constructor */
ChargeRegulatorMethodEffectiveCharge(ChargeRegulator *chargeRegulator,
ChargeRegulator::ChargeRegulatorParameters & parameters);
/** destructor */
~ChargeRegulatorMethodEffectiveCharge(){};
/** initialize */
virtual void initialize(void);
/** post first verlet step */
virtual void apply_post_force(double dt);
protected:
// internal functions
void apply_local_forces();
// member data
double chargeDensity_;
- map<int,double> nodalChargePotential_;
+ std::map<int,double> nodalChargePotential_;
NODE_TO_XF_MAP nodeXFMap_;
bool useSlab_;
private:
ChargeRegulatorMethodEffectiveCharge(); // DO NOT define this
};
};
#endif
diff --git a/lib/atc/CloneVector.h b/lib/atc/CloneVector.h
index 5f747012f..0c3bef8c5 100644
--- a/lib/atc/CloneVector.h
+++ b/lib/atc/CloneVector.h
@@ -1,253 +1,253 @@
#ifndef CLONEVECTOR_H
#define CLONEVECTOR_H
#include "Vector.h"
+#include <algorithm>
namespace ATC_matrix {
/**
* @class CloneVector
* @brief Class for creating objects that wrap matrix data for manipulation through vector operations
*/
template<typename T>
class CloneVector : public Vector<T>
{
public:
CloneVector(); // do not implement
CloneVector(const Vector<T> &c);
CloneVector(const Matrix<T> &c, int dim, INDEX idx=0);
CloneVector(const DiagonalMatrix<T> &c, INDEX idx=0);
// overloaded virtual functions
T& operator[](INDEX i);
T operator[](INDEX i) const;
T operator()(INDEX i, INDEX j=0) const;
T& operator()(INDEX i, INDEX j=0);
INDEX nRows() const;
CloneVector<T>& operator=(const T &v);
CloneVector<T>& operator=(const CloneVector<T> &C);
CloneVector<T>& operator=(const Matrix<T> &C);
virtual bool memory_contiguous() const;
T* ptr() const;
void resize(INDEX nRows, INDEX nCols=0, bool copy=false);
void reset(INDEX nRows, INDEX nCols=0, bool zero=true);
void copy(const T * ptr, INDEX nRows, INDEX nCols=0);
private:
void _resize(INDEX nRows, INDEX nCols, bool copy, bool zero);
Vector<T> * const _baseV; // ptr to a base vector
Matrix<T> * const _baseM; // ptr to a base matrix
int _clone_type; // what to clone (see enum CLONE_TYPE)
INDEX _idx; // index of matrix dimension to clone
};
///////////////////////////////////////////////////////////////////////////////
// Template definitions ///////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
// Construct from another vector
//-----------------------------------------------------------------------------
template<typename T>
CloneVector<T>::CloneVector(const Vector<T> &c)
: Vector<T>(), _baseV(const_cast<Vector<T>*>(&c)), _baseM(NULL)
{}
//-----------------------------------------------------------------------------
// Construct from a matrix, the const_cast isn't pretty
/* CloneVector(const Matrix<T> &c, int dim, INDEX idx)
/ attaches to a slice of a matrix
/ Arguments: c = pointer to the matrix
/ dim = type of slice CLONE_ROW, CLONE_COL, CLONE_DIAG
/ idx = index of row or column (no effect on diag currently)
*/
//-----------------------------------------------------------------------------
template<typename T>
CloneVector<T>::CloneVector(const Matrix<T> &c, int dim, INDEX idx)
: Vector<T>(), _baseV(NULL), _baseM(const_cast<Matrix<T>*>(&c))
, _clone_type(dim), _idx(idx)
{}
//-----------------------------------------------------------------------------
// Construct from a DiagonalMatrix
//-----------------------------------------------------------------------------
template<typename T>
CloneVector<T>::CloneVector(const DiagonalMatrix<T> &c, INDEX idx)
: Vector<T>(), _baseV(NULL), _baseM(const_cast<DiagonalMatrix<T>*>(&c))
, _clone_type(CLONE_DIAG), _idx(0)
{}
//-----------------------------------------------------------------------------
// value (const) indexing operator
//-----------------------------------------------------------------------------
template<typename T>
T CloneVector<T>::operator()(INDEX i, INDEX j) const
{
return (*this)[i];
}
//-----------------------------------------------------------------------------
// reference index operator
//-----------------------------------------------------------------------------
template<typename T>
T& CloneVector<T>::operator()(INDEX i, INDEX j)
{
return (*this)[i];
}
//-----------------------------------------------------------------------------
// Indexes the cloned vector either from another vector or a matrix
//-----------------------------------------------------------------------------
template<typename T>
T CloneVector<T>::operator[](INDEX i) const
{
if (_baseV) return (*_baseV)(i);
if (_clone_type == CLONE_ROW) return (*_baseM)(_idx, i);
else if (_clone_type == CLONE_COL) return (*_baseM)(i,_idx);
else if (_clone_type == CLONE_DIAG) return (*_baseM)(i,i);
return 0;
}
//-----------------------------------------------------------------------------
// Indexes the cloned vector either from another vector or a matrix
//-----------------------------------------------------------------------------
template<typename T>
T& CloneVector<T>::operator[](INDEX i)
{
if (_baseV) return (*_baseV)(i);
if (_clone_type == CLONE_ROW) return (*_baseM)(_idx, i);
if (_clone_type == CLONE_COL) return (*_baseM)(i,_idx);
if (_clone_type == CLONE_DIAG) return (*_baseM)(i,i);
return (*_baseV)(i);
}
//-----------------------------------------------------------------------------
// Returns the size of the base vector or of the row/col of the base matrix
//-----------------------------------------------------------------------------
template<typename T>
INDEX CloneVector<T>::nRows() const
{
- using std::min;
if (_baseV) return _baseV->size();
if (_clone_type == CLONE_ROW) return _baseM->nCols();
if (_clone_type == CLONE_COL) return _baseM->nRows();
- if (_clone_type == CLONE_DIAG) return min(_baseM->nRows(), _baseM->nCols());
+ if (_clone_type == CLONE_DIAG) return std::min(_baseM->nRows(), _baseM->nCols());
return 0;
}
//-----------------------------------------------------------------------------
// assigns all elements to a constant
//-----------------------------------------------------------------------------
template<typename T>
CloneVector<T>& CloneVector<T>::operator=(const T &v)
{
this->set_all_elements_to(v);
return *this;
}
//-----------------------------------------------------------------------------
// assigns all elements to the corresponding elements in C
//-----------------------------------------------------------------------------
template<typename T>
CloneVector<T>& CloneVector<T>::operator=(const CloneVector<T> &C)
{
GCK(*this, C, this->size()!=C.size(), "Error in CloneVector:operator=");
int sz = this->size();
for (INDEX i = 0; i < sz; i++) (*this)[i] = C[i];
return *this;
}
//-----------------------------------------------------------------------------
// assigns all elements to the corresponding elements in C
//-----------------------------------------------------------------------------
template<typename T>
CloneVector<T>& CloneVector<T>::operator=(const Matrix<T> &C)
{
GCK(*this, C, this->size()!=C.size(), "Error in CloneVector:operator=");
int sz = this->size();
for (INDEX i = 0; i < sz; i++) (*this)[i] = C[i];
return *this;
}
//-----------------------------------------------------------------------------
// returns true only if its guaranteed memory is contiguous
//-----------------------------------------------------------------------------
template<typename T>
bool CloneVector<T>::memory_contiguous() const
{
// drill down through clone of clones
if (_baseV) return _baseV->memory_contiguous();
// could be okay if DiagonalMatrix, but can't guarantee this
if (_clone_type == CLONE_DIAG) return false;
#ifdef ROW_STORAGE
return _clone_type == CLONE_ROW;
#else
return _clone_type == CLONE_COL;
#endif
}
//-----------------------------------------------------------------------------
// Returns a pointer to the data unless the data is a column of a matrix
//-----------------------------------------------------------------------------
template<typename T>
T* CloneVector<T>::ptr() const
{
if (_baseV) return _baseV->ptr();
#ifdef ROW_STORAGE
if (_clone_type == CLONE_ROW) return _baseM->ptr() + this->size()*_idx;
if (_clone_type == CLONE_COL) return _baseM->ptr() + this->size();
if (_clone_type == CLONE_DIAG) return _baseM->ptr();
#else
if (_clone_type == CLONE_COL) return _baseM->ptr() + this->size()*_idx;
if (_clone_type == CLONE_ROW) return _baseM->ptr() + this->size();
if (_clone_type == CLONE_DIAG) return _baseM->ptr();
#endif
return 0;
}
//-----------------------------------------------------------------------------
// general resize function, can handle parents that are matrices or vectors
//-----------------------------------------------------------------------------
template<typename T>
void CloneVector<T>::_resize(INDEX nRows, INDEX nCols, bool copy, bool zero)
{
if (_baseV)
{
if (copy) _baseV->resize(nRows, nCols, copy);
else _baseV->reset (nRows, nCols, zero);
return;
}
// parent is a matrix, need to decide what the Vector is cloning
switch (_clone_type)
{
case CLONE_ROW: // now the leading dimension is rows
nCols = nCols ? nCols : _baseM->nCols();
break;
case CLONE_COL: // now the leading dimension is columns
nCols = nCols ? nCols : _baseM->nRows();
ATC_Utility::swap(nRows, nCols);
break;
case CLONE_DIAG: // lets just hope you knew what you were doing
break;
default:
return;
}
if (zero) _baseM->reset(nRows, nCols, zero); // zero overrides copy
else _baseM->resize(nRows, nCols, copy);
}
//-----------------------------------------------------------------------------
// resizes the matrix and optionally copies what fits
//-----------------------------------------------------------------------------
template<typename T>
void CloneVector<T>::resize(INDEX nRows, INDEX nCols, bool copy)
{
_resize(nRows, nCols, copy, false);
}
//-----------------------------------------------------------------------------
// resizes the matrix and optionally zeros it out
//-----------------------------------------------------------------------------
template<typename T>
void CloneVector<T>::reset(INDEX nRows, INDEX nCols, bool zero)
{
_resize(nRows, nCols, false, zero);
}
//-----------------------------------------------------------------------------
// resizes the matrix and copies data
//-----------------------------------------------------------------------------
template<typename T>
void CloneVector<T>::copy(const T * ptr, INDEX nRows, INDEX nCols)
{
_resize(nRows, nCols, false, false);
memcpy(this->ptr(), ptr, this->size()*sizeof(T));
}
} // end namespace
#endif
diff --git a/lib/atc/ConcentrationRegulator.cpp b/lib/atc/ConcentrationRegulator.cpp
index 47f80cf92..86b5763fb 100644
--- a/lib/atc/ConcentrationRegulator.cpp
+++ b/lib/atc/ConcentrationRegulator.cpp
@@ -1,617 +1,625 @@
#include "ConcentrationRegulator.h"
#include "LammpsInterface.h"
#include "ATC_Coupling.h"
#include "ATC_Error.h"
+using ATC_Utility::to_string;
+using ATC_Utility::rnd;
+using std::map;
+using std::string;
+using std::pair;
+using std::min;
+using std::max;
+
namespace ATC {
const double kMinScale_ = 10000.;
//========================================================
// Class ConcentrationRegulator
//========================================================
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ConcentrationRegulator::ConcentrationRegulator(ATC_Coupling * atc) :
AtomicRegulator(atc)
{
// do nothing
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ConcentrationRegulator::~ConcentrationRegulator()
{
if (regulators_.size()) {
map<string,ConcentrationRegulatorMethod *>::iterator it;
for (it = regulators_.begin(); it != regulators_.end(); ++it) {
delete it->second;
}
regulators_.clear();
}
if (parameters_.size()) parameters_.clear();
}
//--------------------------------------------------------
// modify:
// parses and adjusts charge regulator state based on
// user input, in the style of LAMMPS user input
//--------------------------------------------------------
bool ConcentrationRegulator::modify(int narg, char **arg)
{
bool foundMatch = false;
return foundMatch;
}
//--------------------------------------------------------
// construct_methods:
//--------------------------------------------------------
void ConcentrationRegulator::construct_methods()
{
AtomicRegulator::construct_methods();
if (atc_->reset_methods()) {
// eliminate existing methods
delete_method();
// consruct new ones
map<string, ConcentrationRegulatorParameters>::iterator itr;
for (itr = parameters_.begin();
itr != parameters_.end(); itr++) {
string tag = itr->first;
if (regulators_.find(tag) != regulators_.end()) delete regulators_[tag];
ConcentrationRegulatorParameters & p = itr->second;
switch (p.method) {
case NONE: {
regulators_[tag] = new ConcentrationRegulatorMethod(this);
break;
}
case TRANSITION: {
p.type = atc_->tag_to_type(tag);
p.groupbit = LammpsInterface::instance()->type_to_groupbit(p.type);
p.transitionType = atc_->tag_to_type(p.transitionTag);
regulators_[tag] = new ConcentrationRegulatorMethodTransition(this,p);
break;
}
default:
throw ATC_Error("ConcentrationRegulator::initialize unknown concentration regulator type");
}
}
}
}
//--------------------------------------------------------
// initialize:
//--------------------------------------------------------
void ConcentrationRegulator::initialize()
{
map<string, ConcentrationRegulatorMethod *>::iterator itr;
for (itr = regulators_.begin();
itr != regulators_.end(); itr++) { itr->second->initialize(); }
atc_->set_boundary_integration_type(boundaryIntegrationType_);
AtomicRegulator::reset_nlocal();
AtomicRegulator::delete_unused_data();
needReset_ = false;
}
//--------------------------------------------------------
// pre_exchange
//--------------------------------------------------------
void ConcentrationRegulator::pre_exchange()
{
map<string, ConcentrationRegulatorMethod *>::iterator itr;
for (itr = regulators_.begin();
itr != regulators_.end(); itr++) { itr->second->pre_exchange();}
}
//--------------------------------------------------------
// pre_force
//--------------------------------------------------------
void ConcentrationRegulator::pre_force()
{
map<string, ConcentrationRegulatorMethod *>::iterator itr;
for (itr = regulators_.begin();
itr != regulators_.end(); itr++) { itr->second->pre_force();}
}
//--------------------------------------------------------
// output
//--------------------------------------------------------
void ConcentrationRegulator::output(OUTPUT_LIST & outputData) const
{
map<string, ConcentrationRegulatorMethod *>::const_iterator itr;
for (itr = regulators_.begin();
itr != regulators_.end(); itr++) { itr->second->output(outputData);}
}
//--------------------------------------------------------
// compute vector
//--------------------------------------------------------
double ConcentrationRegulator::compute_vector(int n) const
{
int s = regulators_.size();
if (s == 0) return 0;
int m = n / s;
n = n % s;
int c = 0;
map<string, ConcentrationRegulatorMethod *>::const_iterator itr;
for (itr = regulators_.begin();
itr != regulators_.end(); itr++) {
if (c++ == n) { return itr->second->compute_vector(m); }
}
return 0.;
}
//--------------------------------------------------------
// size vector
//--------------------------------------------------------
int ConcentrationRegulator::size_vector(int i) const
{
int n = (regulators_.size())*5;
if (n==0) n = 20;
return n;
}
//========================================================
// Class ConcentrationRegulatorMethodTransition
//========================================================
//--------------------------------------------------------
// Constructor
// Grab references to ATC and ConcentrationRegulator
//--------------------------------------------------------
ConcentrationRegulatorMethodTransition::ConcentrationRegulatorMethodTransition
(ConcentrationRegulator *concReg,
ConcentrationRegulator::ConcentrationRegulatorParameters & p)
: ConcentrationRegulatorMethod(concReg),
concentrationRegulator_(concReg),
interscaleManager_(NULL),
lammpsInterface_(LammpsInterface::instance()),
list_(NULL),
targetConcentration_(p.value),
targetCount_(0),
elemset_(p.elemset),
p_(NULL),
randomNumberGenerator_(NULL),
q0_(0),
controlType_(p.type),
controlIndex_(0),
transitionType_(p.transitionType),
transitionInterval_(p.transitionInterval),
transitionCounter_(0),
nInTransition_(0),
transitionFactor_(0),
controlMask_(p.groupbit),
frequency_(p.frequency),
maxEnergy_(p.maxEnergy),
maxExchanges_(p.maxExchanges),
maxAttempts_(p.maxAttempts),
nexchanges_(0),
initialized_(false),
_rngUniformCounter_(0),
_rngNormalCounter_(0)
{
controlIndex_ = atc_->type_index(controlType_);
LammpsInterface * li = LammpsInterface::instance();
q0_ = li->type_to_charge(controlType_);
double kB = (li->boltz())/(li->mvv2e()); // E/T*m*v^2/E = m v^2/T
double m = li->atom_mass(controlType_);
sigma_ = sqrt(kB/m); // v / sqrt(T)
randomNumberGenerator_ = li->random_number_generator();
}
//--------------------------------------------------------
// Initialize
//--------------------------------------------------------
void ConcentrationRegulatorMethodTransition::initialize(void)
{
#ifdef ATC_VERBOSE
lammpsInterface_->print_msg_once(
"\ncontrol type: "+to_string(controlType_)+
"\ntransistion type:"+to_string(transitionType_)+
"\ncontrol mask:"+to_string(controlMask_)+
"\nfrequency:"+to_string(frequency_)+
"\nmax exchanges:"+to_string(maxExchanges_)+
"\nmax attempts:"+to_string(maxAttempts_)+
"\nmax energy:"+to_string(maxEnergy_)
);
#endif
interscaleManager_ = &(atc_->interscale_manager());
PerAtomQuantity<int> * a2el = atc_->atom_to_element_map();
list_ = new AtomInElementSet(atc_,a2el,elemset_,controlType_);
nNodes_ = atc_->num_nodes();
DENS_MAT conc(nNodes_,1); conc = targetConcentration_;
DENS_VEC integral = atc_->fe_engine()->integrate(conc,elemset_);
targetCount_ = rnd(integral(0)) ;
volumes_.resize(elemset_.size());
ESET::const_iterator itr;
int i = 0;
DENS_MAT c(nNodes_,1); c = 1;
V_ = 0.;
for (itr = elemset_.begin(); itr != elemset_.end(); itr++, i++) {
ESET e; e.insert(*itr);
DENS_VEC v = atc_->fe_engine()->integrate(c,e);
volumes_(i) = v(0);
V_ += v(0);
}
volumes_ *= 1./V_;
for (int i = 1; i < volumes_.size(); i++) {
volumes_(i) += volumes_(i-1);
}
// record orginal energetic properties
int ntypes = lammpsInterface_->ntypes();
epsilon0_.reset(ntypes);
p_ = lammpsInterface_->potential();
lammpsInterface_->epsilons(controlType_,p_,epsilon0_.ptr());
#ifdef ATC_VERBOSE
string msg = "type "+to_string(controlType_)+" target count " + to_string(targetCount_);
msg += " volume " + to_string(V_);
msg += " current count " + to_string(count());
ATC::LammpsInterface::instance()->print_msg_once(msg);
msg = "WARNING: ensure neighboring happens at least every "+to_string(frequency_);
ATC::LammpsInterface::instance()->print_msg_once(msg);
#endif
}
double ConcentrationRegulatorMethodTransition::uniform() const {
_rngUniformCounter_++;
return lammpsInterface_->random_uniform(randomNumberGenerator_);
}
double ConcentrationRegulatorMethodTransition::normal() const {
_rngNormalCounter_++;
return lammpsInterface_->random_normal(randomNumberGenerator_);
}
//--------------------------------------------------------
// pre exchange
//--------------------------------------------------------
void ConcentrationRegulatorMethodTransition::pre_exchange(void)
{
// return if should not be called on this timestep
if ( ! lammpsInterface_->now(frequency_)) return;
nexchanges_ = excess();
int n = abs(nexchanges_);
bool success = false;
if (nexchanges_ > 0) { success = delete_atoms(n); }
else if (nexchanges_ < 0) { success = insert_atoms(n); }
else return;
if (!success) throw ATC_Error("insertions/deletions did not succeed");
if (nexchanges_ !=0) {
nInTransition_ = -nexchanges_;
lammpsInterface_->reset_ghosts(-nexchanges_);
atc_->reset_atoms();
}
transitionCounter_=0;
transition();
}
//--------------------------------------------------------
// pre force
//--------------------------------------------------------
void ConcentrationRegulatorMethodTransition::pre_force(void)
{
transition();
}
//--------------------------------------------------------
// accept
//--------------------------------------------------------
bool ConcentrationRegulatorMethodTransition::accept(double energy, double T) const
{
#ifdef ATC_VERBOSE2
if (energy < maxEnergy_) lammpsInterface_->print_msg(" energy "+to_string(energy)+" "+to_string(rngCounter_));
#endif
return (energy < maxEnergy_);
}
//--------------------------------------------------------
// energy
//--------------------------------------------------------
double ConcentrationRegulatorMethodTransition::energy(int id) const
{
double e = lammpsInterface_->shortrange_energy(id,maxEnergy_);
#ifdef ATC_VERBOSE
{
int * tag = lammpsInterface_->atom_tag();
lammpsInterface_->print_msg(to_string(controlType_)+" deletion energy "+to_string(e)+" id "+to_string(tag[id])+" "+to_string(_rngUniformCounter_)+":"+to_string(_rngNormalCounter_));
}
#endif
return e;
}
double ConcentrationRegulatorMethodTransition::energy(double * x) const
{
double e = lammpsInterface_->shortrange_energy(x,controlType_,maxEnergy_);
#ifdef ATC_VERBOSE
{
lammpsInterface_->print_msg(to_string(controlType_)+" insertion energy "+to_string(e)+" x "+to_string(x[0])+","+to_string(x[1])+","+to_string(x[2])+" "+to_string(_rngUniformCounter_)+":"+to_string(_rngNormalCounter_));
}
#endif
return e;
}
//--------------------------------------------------------
// excess
//--------------------------------------------------------
int ConcentrationRegulatorMethodTransition::excess(void) const
{
int nexcess = count()-targetCount_;
nexcess = max(min(nexcess,maxExchanges_),-maxExchanges_);
return nexcess;
}
//--------------------------------------------------------
// count
//--------------------------------------------------------
int ConcentrationRegulatorMethodTransition::count(void) const
{
// integrate concentration over region
const DENS_MAT & c = (atc_->field(SPECIES_CONCENTRATION)).quantity();
DENS_VEC integral = atc_->fe_engine()->integrate(c,elemset_);
return rnd(integral(controlIndex_)) ;
}
//--------------------------------------------------------
// delete atoms
//--------------------------------------------------------
bool ConcentrationRegulatorMethodTransition::delete_atoms(int n)
{
ID_PAIR idPair;
deletionIds_.clear();
int deletions = 0;
int attempts = 0;
while(deletions < n && attempts < maxAttempts_){
if(accept(deletion_id(idPair))) {
deletionIds_.push_back(idPair);
deletions += 1;
}
deletions = lammpsInterface_->int_allmax(deletions);
attempts++;
}
ID_LIST::iterator itr;
for (itr = deletionIds_.begin(); itr != deletionIds_.end(); itr++) {
lammpsInterface_->delete_atom(itr->second);
}
#ifdef ATC_VERBOSE
string c = to_string(controlType_);
lammpsInterface_->all_print(attempts, c+"-attempts ");
lammpsInterface_->all_print(deletions,c+" deletions ");
lammpsInterface_->all_print(_rngUniformCounter_,c+" RNG-uniform ");
lammpsInterface_->all_print(_rngNormalCounter_,c+" RNG-normal ");
// lammpsInterface_->all_print(uniform()," RANDOM ");
#endif
return (n == deletions); // success
}
//--------------------------------------------------------
// pick id
//--------------------------------------------------------
double ConcentrationRegulatorMethodTransition::deletion_id(ID_PAIR & id) const
{
if (atc_->parallel_consistency()) return deletion_id_consistent(id);
else return deletion_id_free(id);
}
double ConcentrationRegulatorMethodTransition::deletion_id_consistent(ID_PAIR & id) const
{
id.first = -1;
id.second = -1;
int ntotal = lammpsInterface_->natoms();
double r = uniform();
r *= ntotal;
const ID_LIST & list = list_->quantity();
ID_LIST::const_iterator itr;
int i=0, idx = -1;
double min = ntotal;
int * tag = lammpsInterface_->atom_tag();
for (itr = list.begin(); itr != list.end(); itr++) {
int atag = tag[itr->second];
double d = abs(atag-r);
if (d < min) {
min = d;
idx = i;
}
i++;
}
int imin = kMinScale_*min;
if(imin == lammpsInterface_->int_allmin(imin)) {
if (idx < 0) throw ATC_Error("deletion_id failed to find a suitable atom");
id = list_->item(idx);
// avoid repeats
ID_LIST & l = list_->set_quantity();
l.erase(l.begin()+idx);
return energy(id.second);
}
else {
return maxEnergy_;
}
}
double ConcentrationRegulatorMethodTransition::deletion_id_free(ID_PAIR & id) const
{
id.first = -1;
id.second = -1;
int n = list_->size();
double nrank = lammpsInterface_->int_scansum(n);
int ntotal = lammpsInterface_->int_allsum(n);
if (ntotal == 0) throw ATC_Error("control type "+to_string(controlType_)+" is depleted");
double r = uniform();
r *= ntotal;
if ( (r >= nrank-n) && (r < nrank)) { // pick processor
r = uniform();
int idx = rnd(r*(n-1));
id = list_->item(idx);
// avoid repeats
ID_LIST & l = list_->set_quantity();
l.erase(l.begin()+idx);
return energy(id.second);
}
else {
return maxEnergy_;
}
}
//--------------------------------------------------------
// insert atoms
//--------------------------------------------------------
bool ConcentrationRegulatorMethodTransition::insert_atoms(int n)
{
insertionIds_.clear();
DENS_VEC x(3); x = 0;
DENS_VEC v(3); v = 0;
const DENS_MAN & T = atc_->field(TEMPERATURE);
int additions = 0;
int attempts = 0;
while(additions < n && attempts < maxAttempts_){
if(accept(insertion_location(x))) {
DENS_VEC Tv = atc_->fe_engine()->interpolate_field(x,T);
Tv(0) = 300.;
pick_velocity(v,Tv(0)); // 3 normal
int nlocal = lammpsInterface_->insert_atom(transitionType_,controlMask_,x.ptr(),v.ptr()); // no charge
insertionIds_.push_back(pair<int,int>(-1,nlocal)); // atc id unknown
additions += 1;
#ifdef ATC_VERBOSE2
lammpsInterface_->print_msg(">>> insert x:"+to_string(x(0))+" "+to_string(x(1))+" "+to_string(x(2))+" v:"+to_string(v(0))+" "+to_string(v(1))+" "+to_string(v(2))+" "+to_string(rngCounter_));
#endif
}
attempts++;
//lammpsInterface_->barrier();
additions = lammpsInterface_->int_allmax(additions);
#ifdef ATC_VERBOSE
{
string c = to_string(controlType_);
lammpsInterface_->all_print(_rngUniformCounter_,c+" rng-uniform ");
lammpsInterface_->all_print(_rngNormalCounter_,c+" rng-normal ");
// lammpsInterface_->all_print(uniform()," random ");
}
#endif
if (atc_->parallel_consistency()) { sync_random_number_generators(); }
#ifdef ATC_VERBOSE2
lammpsInterface_->print_msg("attempts: "+to_string(attempts)+" additions "+to_string(additions)+" : "+to_string(rngCounter_));
#endif
#ifdef ATC_VERBOSE
{
string c = to_string(controlType_);
lammpsInterface_->all_print(attempts, c+"+attempts ");
lammpsInterface_->all_print(additions,c+" additions ");
lammpsInterface_->all_print(_rngUniformCounter_,c+" RNG-uniform ");
lammpsInterface_->all_print(_rngNormalCounter_,c+" RNG-normal ");
// lammpsInterface_->all_print(uniform()," RANDOM ");
}
#endif
}
return (n == additions); // success
}
//--------------------------------------------------------
// sync random number generators
//--------------------------------------------------------
void ConcentrationRegulatorMethodTransition::sync_random_number_generators() const
{
// normal
int n = lammpsInterface_->int_allmax(_rngNormalCounter_);
int dn = n - _rngNormalCounter_;
lammpsInterface_->advance_random_normal(randomNumberGenerator_,dn);
_rngNormalCounter_ = n;
// uniform
int u = lammpsInterface_->int_allmax(_rngUniformCounter_);
int du = u - _rngUniformCounter_;
lammpsInterface_->advance_random_uniform(randomNumberGenerator_,du);
_rngUniformCounter_ = u;
}
//--------------------------------------------------------
// pick location
//--------------------------------------------------------
double ConcentrationRegulatorMethodTransition::insertion_location(DENS_VEC & x) const
{
// pick random element
int elem = pick_element(); // 1 uniform
// pick random local coordinate
DENS_VEC xi(3);
pick_coordinates(elem,xi,x); // 3 uniform
// if (! lammpsInterface_->in_box(x.ptr())) { throw ATC_Error("new atom is not in box");}
if (lammpsInterface_->in_my_processor_box(x.ptr())) {
#ifdef ATC_VERBOSE2
lammpsInterface_->print_msg(">>> insertion_location e:" +to_string(elem)+" xi:"+to_string(xi(0))+" "+to_string(xi(1))+" "+to_string(xi(2))+" x:"+to_string(x(0))+" "+to_string(x(1))+" "+to_string(x(2))+ " energy "+to_string(energy(x.ptr()))+" "+true_false(accept(energy(x.ptr())))+" "+to_string(rngUniformCounter_));
#endif
return energy(x.ptr());
}
else {
return maxEnergy_;
}
}
//--------------------------------------------------------
// pick element
//--------------------------------------------------------
int ConcentrationRegulatorMethodTransition::pick_element() const
{
double r = uniform();
ESET::iterator itr = elemset_.begin(); // global?
for (int i = 0; i < volumes_.size() ; ++i) {
if (r < volumes_(i)) return *itr;
itr++;
}
return *itr;
}
//--------------------------------------------------------
// pick coordinates
//--------------------------------------------------------
void ConcentrationRegulatorMethodTransition::pick_coordinates(const int elem,
DENS_VEC & xi,
DENS_VEC & x) const
{
xi.reset(3);
xi(0) = 2.*uniform()-1.;
xi(1) = 2.*uniform()-1.;
xi(2) = 2.*uniform()-1.;
atc_->fe_engine()->fe_mesh()->position(elem,xi,x);
}
//--------------------------------------------------------
// pick velocity
//--------------------------------------------------------
void ConcentrationRegulatorMethodTransition::pick_velocity(DENS_VEC & v,double T) const
{
double s = sigma_*sqrt(T);
v(0) = s*normal();
v(1) = s*normal();
v(2) = s*normal();
//v = 0;
}
//--------------------------------------------------------
// transition
//--------------------------------------------------------
void ConcentrationRegulatorMethodTransition::transition()
{
transitionCounter_++;
//if (insertionIds_.size() == 0) return; //
if (transitionCounter_> transitionInterval_) {
nInTransition_ = 0;
return;
}
else if (transitionCounter_==transitionInterval_) {
nInTransition_ -= lammpsInterface_->change_type(transitionType_,controlType_);
}
else {
transitionFactor_ = insertion_factor(transitionCounter_);
if (nInTransition_ < 0) transitionFactor_ = 1-transitionFactor_;
double q = 0;
lammpsInterface_->set_charge(transitionType_,q);
DENS_VEC eps = epsilon0_;
lammpsInterface_->set_epsilons(transitionType_,p_,eps.ptr());
lammpsInterface_->pair_reinit(); // epsilon
}
}
//--------------------------------------------------------
// diagnostics
//--------------------------------------------------------
double ConcentrationRegulatorMethodTransition::compute_vector(int n) const
{
if (n==0) return count() - targetCount_;
else if (n==1) return count()/V_;
else if (n==2) return (1.-transitionFactor_)*nInTransition_;
else if (n==3) return _rngUniformCounter_;
else if (n==4) return _rngNormalCounter_;
else if (n==5) return lammpsInterface_->random_state(randomNumberGenerator_);
else return 0;
}
}; // end namespace
diff --git a/lib/atc/ConcentrationRegulator.h b/lib/atc/ConcentrationRegulator.h
index 147f85496..f5acf46fb 100644
--- a/lib/atc/ConcentrationRegulator.h
+++ b/lib/atc/ConcentrationRegulator.h
@@ -1,212 +1,213 @@
#ifndef CONCENTRATION_REGULATOR_H
#define CONCENTRATION_REGULATOR_H
-// ATC headers
+#include <map>
+#include <string>
+
#include "AtomicRegulator.h"
#include "LammpsInterface.h"
-
namespace ATC {
/**
* @class ConcentrationRegulator
* @brief Manager class for atom-continuum control of charge and potential
*/
class ConcentrationRegulatorMethod;
class ConcentrationRegulator : public AtomicRegulator {
public:
enum ConcentrationRegulatorType {NONE=0,TRANSITION};
/** parser data */
struct ConcentrationRegulatorParameters {
ConcentrationRegulatorParameters():
method(NONE),
type(0),
groupbit(0),
transitionType(0),
value(0),
frequency(0),
transitionInterval(0),
maxEnergy(0),
maxExchanges(0),
maxAttempts(0) { };
ConcentrationRegulatorType method;
int type;
int groupbit;
int transitionType;
double value;
int frequency;
int transitionInterval;
double maxEnergy;
int maxExchanges;
int maxAttempts;
- string transitionTag;
+ std::string transitionTag;
ESET elemset;
};
/** constructor */
ConcentrationRegulator(ATC_Coupling *atc);
/** destructor */
~ConcentrationRegulator();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** construct methods */
virtual void construct_methods();
/** pre time integration */
virtual void initialize();
//WIP_JAT need a nicer way to consistently handle sets of regulators, not sure how yet
// application steps
/** apply the regulator in the pre-predictor phase */
virtual void apply_pre_predictor(double dt, int timeStep){};
/** apply the regulator in the mid-predictor phase */
virtual void apply_mid_predictor(double dt, int timeStep){};
/** apply the regulator in the post-predictor phase */
virtual void apply_post_predictor(double dt, int timeStep){};
/** apply the regulator in the pre-correction phase */
virtual void apply_pre_corrector(double dt, int timeStep){};
/** apply the regulator in the post-correction phase */
virtual void apply_post_corrector(double dt, int timeStep){};
/** compute the thermal boundary flux, must be consistent with regulator */
virtual void compute_boundary_flux(FIELDS & fields){};
/** add contributions (if any) to the finite element right-hand side */
virtual void add_to_rhs(FIELDS & rhs){};
/** prior to exchanges */
virtual void pre_force();
/** prior to exchanges */
virtual void pre_exchange();
/** ATC output */
virtual void output(OUTPUT_LIST & outputData) const;
/** scalar output */
virtual double compute_vector(int n) const;
virtual int size_vector(int s) const;
bool needs_temperature() { return regulators_.size() > 0; }
protected:
/** registry charge regulators */
- map<string,ConcentrationRegulatorMethod *> regulators_;
- map<string,ConcentrationRegulatorParameters> parameters_;
+ std::map<std::string,ConcentrationRegulatorMethod *> regulators_;
+ std::map<std::string,ConcentrationRegulatorParameters> parameters_;
private:
ConcentrationRegulator(); // DO NOT define this
};
/**
* @class ConcentrationRegulatorMethod
* @brief Base class for ConcentrationRegulator algorithms
*/
class ConcentrationRegulatorMethod : public RegulatorShapeFunction {
public:
ConcentrationRegulatorMethod(ConcentrationRegulator *c)
: RegulatorShapeFunction(c) {};
~ConcentrationRegulatorMethod() {};
void initialize(void) {};
virtual void pre_force() {};
virtual void pre_exchange() {};
virtual void set_weights() {};
virtual double compute_vector(int n) const { return 0;}
virtual void output(OUTPUT_LIST & outputData){};
private:
ConcentrationRegulatorMethod(); // DO NOT define this
};
/**
* @class ConcentrationRegulatorMethodTransition
* @brief GCMC + thermodynamic integration
*/
class ConcentrationRegulatorMethodTransition : public ConcentrationRegulatorMethod {
public:
/** constructor */
ConcentrationRegulatorMethodTransition(
ConcentrationRegulator *concentrationRegulator,
ConcentrationRegulator::ConcentrationRegulatorParameters & parameters);
/** destructor */
~ConcentrationRegulatorMethodTransition(){
if (randomNumberGenerator_) delete randomNumberGenerator_;
}
/** initialize */
void initialize(void);
/** prior to force evaluation */
virtual void pre_force();
/** prior to exchanges */
virtual void pre_exchange();
/** "thermo" output */
virtual double compute_vector(int n) const;
protected:
/** set transition state: epsilon and charge */
int mask(int type, int groupbit) {return 0;}
int count(void) const;
int excess(void) const;
double energy(int id) const;
double energy(double * x) const;
double insertion_location(DENS_VEC & x) const;
double deletion_id(ID_PAIR & id) const ;
double deletion_id_consistent(ID_PAIR & id) const ;
double deletion_id_free(ID_PAIR & id) const ;
double insertion_factor(int c) const // a ramp
{
if (c < transitionInterval_) return ((double) c)/transitionInterval_;
else return 1.0;
}
void transition();
bool accept(double energy, double T = 0) const;
bool delete_atoms(int n);
bool insert_atoms(int n);
int pick_element() const;
void pick_coordinates(const int elem, DENS_VEC & xi, DENS_VEC& x ) const;
void pick_velocity(DENS_VEC & v, const double T ) const;
double uniform() const;
double normal() const;
/** pointer to conc regulator object for data */
ConcentrationRegulator * concentrationRegulator_;
/** interscale manager */
class InterscaleManager * interscaleManager_;
/** interscale manager */
class LammpsInterface * lammpsInterface_;
/** member data */
class AtomInElementSet * list_;
double targetConcentration_;
double targetCount_;
ESET elemset_;
POTENTIAL p_;
RNG_POINTER randomNumberGenerator_;
DENS_VEC volumes_;
double V_;
double q0_;
int controlType_;
int controlIndex_;
int transitionType_;
int transitionInterval_;;
int transitionCounter_;
int nInTransition_;
double transitionFactor_;
DENS_VEC epsilon0_;
ID_LIST deletionIds_, insertionIds_;
int controlMask_;
int frequency_;
double maxEnergy_;
int maxExchanges_;
int maxAttempts_;
int nexchanges_;
bool initialized_;
double sigma_;
void sync_random_number_generators() const;
mutable int _rngUniformCounter_; // for parallel consistency
mutable int _rngNormalCounter_; // for parallel consistency
private:
ConcentrationRegulatorMethodTransition(); // DO NOT define this
};
};
#endif
diff --git a/lib/atc/DenseMatrix.h b/lib/atc/DenseMatrix.h
index bbd6e04b5..39e267081 100644
--- a/lib/atc/DenseMatrix.h
+++ b/lib/atc/DenseMatrix.h
@@ -1,417 +1,417 @@
#ifndef DENSEMATRIX_H
#define DENSEMATRIX_H
#include "Matrix.h"
#include <iostream>
namespace ATC_matrix {
/**
* @class DenseMatrix
* @brief Class for storing data in a "dense" matrix form
*/
template <typename T>
class DenseMatrix : public Matrix<T>
{
public:
DenseMatrix(INDEX rows=0, INDEX cols=0, bool z=1) { _create(rows, cols, z); }
DenseMatrix(const DenseMatrix<T>& c) : _data(NULL){ _copy(c); }
DenseMatrix(const SparseMatrix<T>& c): _data(NULL){ c.dense_copy(*this);}
DenseMatrix(const Matrix<T>& c) : _data(NULL){ _copy(c); }
// const SparseMatrix<T> * p = sparse_cast(&c);
// (p) ? p->dense_copy(*this) : _copy(c); }
~DenseMatrix() { _delete();}
void reset (INDEX rows, INDEX cols, bool zero=true);
void resize(INDEX rows, INDEX cols, bool copy=false);
void copy (const T * ptr, INDEX rows, INDEX cols);
/** returns transpose(this) * B */
DenseMatrix<T> transMat(const DenseMatrix<T>& B) const;
/** returns by element multiply A_ij = this_ij * B_ij */
DenseMatrix<T> mult_by_element(const DenseMatrix<T>& B) const;
/** returns by element multiply A_ij = this_ij / B_ij */
DenseMatrix<T> div_by_element(const DenseMatrix<T>& B) const;
/** overloaded virtual functions */
//T& operator()(INDEX i, INDEX j) { MICK(i,j) return DATA(i,j); }
T& operator()(INDEX i, INDEX j) { MICK(i,j) return DATA(i,j); }
T operator()(INDEX i, INDEX j) const { MICK(i,j) return DATA(i,j); }
T operator[](INDEX i) const { VICK(i) return _data[i]; }
T& operator[](INDEX i) { VICK(i) return _data[i]; }
INDEX nRows() const { return _nRows; }
INDEX nCols() const { return _nCols; }
T * ptr() const { return _data; }
void write_restart(FILE *f) const;
- void from_file(string & name);
+ void from_file(std::string & name);
void set_all_elements_to(const T &v);
DiagonalMatrix<T> diag() const;
DenseMatrix<T>& operator=(const T &v);
DenseMatrix<T>& operator=(const Matrix<T> &c);
DenseMatrix<T>& operator=(const DenseMatrix<T> &c);
DenseMatrix<T>& operator=(const SparseMatrix<T> &c);
//* checks if all values are within the prescribed range
virtual bool check_range(T min, T max) const;
protected:
void _delete();
void _create(INDEX rows, INDEX cols, bool zero=false);
void _copy(const Matrix<T> &c);
T *_data;
INDEX _nRows, _nCols;
};
//! Computes the cofactor matrix of A.
template<typename T>
DenseMatrix<T> adjugate(const Matrix<T> &A, bool symmetric=false);
//! Returns a the tensor product of two vectors
template<typename T>
DenseMatrix<T> tensor_product(const Vector<T> &a, const Vector<T> &b);
//----------------------------------------------------------------------------
// Returns an identity matrix, defaults to 3x3.
//----------------------------------------------------------------------------
template<typename T>
DenseMatrix<T> eye(INDEX rows=3, INDEX cols=3)
{
const double dij[] = {0.0, 1.0};
DENS_MAT I(rows, cols, false); // do not need to pre-zero
for (INDEX j=0; j<cols; j++)
for (INDEX i=0; i<rows; i++)
I(i,j) = dij[i==j];
return I;
}
//----------------------------------------------------------------------------
// resizes the matrix and optionally zeros it out (default - zero)
//----------------------------------------------------------------------------
template <typename T>
void DenseMatrix<T>::reset(INDEX rows, INDEX cols, bool zero)
{
if (!this->is_size(rows, cols))
{
_delete();
_create(rows, cols);
}
if (zero) this->zero();
}
//----------------------------------------------------------------------------
// resizes the matrix and optionally copies over what still fits
//----------------------------------------------------------------------------
template <typename T>
void DenseMatrix<T>::resize(INDEX rows, INDEX cols, bool copy)
{
if (this->is_size(rows, cols)) return; // if is correct size, done
if (!copy)
{
_delete();
_create(rows, cols);
return;
}
DenseMatrix<T> temp(*this);
_delete();
_create(rows, cols);
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
(*this)(i,j) = temp.in_range(i,j) ? temp(i,j) : T(0);
}
//----------------------------------------------------------------------------
// resizes the matrix and copies data
//----------------------------------------------------------------------------
template <typename T>
void DenseMatrix<T>::copy(const T * ptr, INDEX rows, INDEX cols)
{
resize(rows, cols, false);
memcpy(_data, ptr, this->size()*sizeof(T));
}
//----------------------------------------------------------------------------
// returns transpose(this) * B
//----------------------------------------------------------------------------
template <typename T>
DenseMatrix<T> DenseMatrix<T>::transMat(const DenseMatrix<T>& B) const
{
DenseMatrix C;
MultAB(*this, B, C, true);
return C;
}
//----------------------------------------------------------------------------
// returns this_ij * B_ij
//----------------------------------------------------------------------------
template <typename T>
DenseMatrix<T> DenseMatrix<T>::mult_by_element(const DenseMatrix<T>& B) const
{
DenseMatrix C;
C.reset(_nRows,_nCols);
if (B.nCols() == _nCols) {
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
C(i,j) = (*this)(i,j)*B(i,j);
}
else if (B.nCols() == 1) {
- cout << "MULTIPLYING\n";
+ std::cout << "MULTIPLYING\n";
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
C(i,j) = (*this)(i,j)*B(i,0);
}
else {
SSCK(B, *this, "DenseMatrix::mult_by_element");
}
return C;
}
//----------------------------------------------------------------------------
// returns this_ij / B_ij
//----------------------------------------------------------------------------
template <typename T>
DenseMatrix<T> DenseMatrix<T>::div_by_element(const DenseMatrix<T>& B) const
{
DenseMatrix C;
C.reset(_nRows,_nCols);
if (B.nCols() == _nCols) {
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
C(i,j) = (*this)(i,j)/B(i,j);
}
else if (B.nCols() == 1) {
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
C(i,j) = (*this)(i,j)/B(i,0);
}
else {
SSCK(B, *this, "DenseMatrix::div_by_element");
}
return C;
}
//----------------------------------------------------------------------------
// writes the matrix data to a file
//----------------------------------------------------------------------------
template <typename T>
void DenseMatrix<T>::write_restart(FILE *f) const
{
fwrite(&_nRows, sizeof(INDEX),1,f);
fwrite(&_nCols, sizeof(INDEX),1,f);
if (this->size()) fwrite(_data, sizeof(T), this->size(), f);
}
//----------------------------------------------------------------------------
// reads matrix from text file (matrix needs to be sized)
//----------------------------------------------------------------------------
template <typename T>
-void DenseMatrix<T>::from_file(string & name)
+void DenseMatrix<T>::from_file(std::string & name)
{
GCHK(_nRows == 0,"from_file needs nRows > 0");
GCHK(_nCols == 0,"from_file needs nCols > 0");
std::ifstream in(name.c_str(),std::ifstream::in);
const int lineSize = 256;
char line[lineSize];
if (! in.good()) gerror(name+" is not available");
in.getline(line,lineSize); // header
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
in >> (*this)(i,j);
}
//----------------------------------------------------------------------------
// sets all elements to a value (optimized)
//----------------------------------------------------------------------------
template <typename T>
inline void DenseMatrix<T>::set_all_elements_to(const T &v)
{
int sz = this->size();
for (INDEX i = 0; i < sz; i++) _data[i] = v;
}
//-----------------------------------------------------------------------------
// Return a diagonal matrix containing the diagonal entries of this matrix
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T> DenseMatrix<T>::diag() const
{
DiagonalMatrix<T> D(nRows(), true); // initialized to zero
INDEX i;
for (i=0; i<nRows(); i++)
{
D(i,i) = DATA(i,i);
}
return D;
}
//----------------------------------------------------------------------------
// clears allocated memory
//----------------------------------------------------------------------------
template <typename T>
void DenseMatrix<T>::_delete()
{
_nRows = _nCols = 0;
if (_data){
delete [] _data;
}
}
//----------------------------------------------------------------------------
// allocates memory for an rows by cols DenseMatrix
//----------------------------------------------------------------------------
template <typename T>
void DenseMatrix<T>::_create(INDEX rows, INDEX cols, bool zero)
{
_nRows=rows;
_nCols=cols;
_data = (this->size() ? new T [_nCols*_nRows] : NULL);
if (zero) this->zero();
}
//----------------------------------------------------------------------------
// creates a deep memory copy from a general matrix
//----------------------------------------------------------------------------
template <typename T>
void DenseMatrix<T>::_copy(const Matrix<T> &c)
{
if (!_data || this->size()!=c.size())
{
_delete();
_create(c.nRows(), c.nCols());
}
else
{
_nRows = c.nRows();
_nCols = c.nCols();
}
memcpy(_data, c.ptr(), c.size()*sizeof(T));
}
//----------------------------------------------------------------------------
// sets all elements to a constant
//----------------------------------------------------------------------------
template <typename T>
DenseMatrix<T>& DenseMatrix<T>::operator=(const T &v)
{
this->set_all_elements_to(v);
return *this;
}
//----------------------------------------------------------------------------
// copys c with a deep copy
//----------------------------------------------------------------------------
template <typename T>
DenseMatrix<T>& DenseMatrix<T>::operator=(const Matrix<T> &c)
{
_copy(c);
return *this;
}
//----------------------------------------------------------------------------
// copys c with a deep copy
//----------------------------------------------------------------------------
template <typename T>
DenseMatrix<T>& DenseMatrix<T>::operator=(const DenseMatrix<T> &c)
{
_copy(c);
return *this;
}
//-----------------------------------------------------------------------------
// copys c with a deep copy, including zeros
//-----------------------------------------------------------------------------
template <typename T>
DenseMatrix<T>& DenseMatrix<T>::operator=(const SparseMatrix<T> &c)
{
_delete();
_create(c.nRows(), c.nCols(), true);
SparseMatrix<T>::compress(c);
for (INDEX i=0; i<c.size(); i++)
{
TRIPLET<T> x = c.triplet(i);
- cout << "x.i: "<< x.i << "\nx.j: "<< x.j << "\nv.j: "<< x.v << std::endl << std::endl;
+ std::cout << "x.i: "<< x.i << "\nx.j: "<< x.j << "\nv.j: "<< x.v << std::endl << std::endl;
(*this)(x.i, x.j) = x.v;
}
return *this;
}
//* Returns the transpose of the cofactor matrix of A.
//* see http://en.wikipedia.org/wiki/Adjugate_matrix
//* symmetric flag only affects cases N>3
template<typename T>
DenseMatrix<T> adjugate(const Matrix<T> &A, bool symmetric)
{
if (!A.is_square()) gerror("adjugate can only be computed for square matrices.");
DenseMatrix<T> C(A.nRows(), A.nRows());
switch (A.nRows()) {
case 1:
gerror("adjugate must be computed for matrixes of size greater than 1");
case 2:
C(0,0) = A(1,1); C(0,1) =-A(0,1);
C(1,0) =-A(1,0); C(1,1) = A(0,0);
break;
case 3: // 3x3 case was tested vs matlab
C(0,0) = A(1,1)*A(2,2)-A(1,2)*A(2,1);
C(1,0) =-A(1,0)*A(2,2)+A(1,2)*A(2,0); // i+j is odd (reverse sign)
C(2,0) = A(1,0)*A(2,1)-A(1,1)*A(2,0);
C(0,1) =-A(0,1)*A(2,2)+A(0,2)*A(2,1); // i+j is odd
C(1,1) = A(0,0)*A(2,2)-A(0,2)*A(2,0);
C(2,1) =-A(0,0)*A(2,1)+A(0,1)*A(2,0); // i+j is odd
C(0,2) = A(0,1)*A(1,2)-A(0,2)*A(1,1);
C(1,2) =-A(0,0)*A(1,2)+A(0,2)*A(1,0); // i+j is odd
C(2,2) = A(0,0)*A(1,1)-A(0,1)*A(1,0);
break;
default:
// this feature is neither tested nor optimal - use at your own risk!!!
DenseMatrix<T> m(A.nRows()-1, A.nRows()-1);
double sign[] = {1.0, -1.0};
for (INDEX j=0; j<A.nCols(); j++) {
for (INDEX i=0; i<A.nRows(); i++) {
for (INDEX mj=0; mj<m.nCols(); mj++) {
for (INDEX mi=0; mi<m.nRows(); mi++) {
m(mi, mj) = A(mi+(mi>=i), mj+(mj>=j)); // skip row i and col j
}
}
if (!symmetric) C(j,i)=det(m)*sign[(i+j)&1];
if (symmetric && i>=j) C(i,j)=C(j,i)=det(m)*sign[(i+j)&1];
}
}
}
return C;
}
// Returns a the tensor product of two vectors
template<typename T>
DenseMatrix<T> tensor_product(const Vector<T> &a, const Vector<T> &b)
{
DenseMatrix<T> ab(a.size(), b.size(),false);
for (INDEX j=0; j<b.size(); j++)
for (INDEX i=0; i<a.size(); i++)
ab(i,j) = a[i]*b[j];
return ab;
}
//* Returns a DenseMatrix with random values (like matlab rand(m,n)
template<typename T>
DenseMatrix<T> rand(INDEX rows, INDEX cols, int seed=1234)
{
srand(seed);
const double rand_max_inv = 1.0 / double(RAND_MAX);
DenseMatrix<T> R(rows, cols, false);
for (INDEX i=0; i<R.size(); i++) R[i]=double(::rand())*rand_max_inv;
return R;
}
//-----------------------------------------------------------------------------
//* returns true if no value is outside of the range
template<typename T>
inline bool DenseMatrix<T>::check_range(T min, T max) const
{
for (INDEX i = 0; i < this->size(); i++)
if ( (_data[i] > max) || (_data[i] < min) ) return false;
return true;
}
} // end namespace
#endif
diff --git a/lib/atc/DependencyManager.h b/lib/atc/DependencyManager.h
index 9cadf829b..13e33b55f 100644
--- a/lib/atc/DependencyManager.h
+++ b/lib/atc/DependencyManager.h
@@ -1,328 +1,326 @@
// A class for wrapping matrix operations with dependency information to speed up execution
#ifndef DEPENDENCY_MANAGER_H
#define DEPENDENCY_MANAGER_H
#include "ATC_TypeDefs.h"
#include "MatrixLibrary.h"
#include "ATC_Error.h"
#include "MPI_Wrappers.h"
-using namespace MPI_Wrappers;
-
namespace ATC {
class InterscaleManager;
/** memory type */
enum MemoryType
{
TEMPORARY = 0,
PERSISTENT
};
/**
* @class DependencyManager
* @brief Base class for defining objects that manage the dependencies of various objects
*/
class DependencyManager {
public:
// used as a friend so it can perform a depth-first search to have safe deletions of managed dependencies
friend class InterscaleManager;
// constructor
DependencyManager() : needReset_(true), isFixed_(false), memoryType_(TEMPORARY), dfsFound_(false) {};
// destructor
virtual ~DependencyManager() {};
/** registration by other PerAtomQuantity objects */
void register_dependence(DependencyManager * dependentQuantity)
{dependentQuantities_.insert(dependentQuantity);};
/** removes dependencies from the set */
void remove_dependence(DependencyManager * dependentQuantity)
{dependentQuantities_.erase(dependentQuantity);};
/** check if a reset is required */
bool need_reset() const {return needReset_ && !isFixed_;};
/** propagate need to reset to to dependencies */
void propagate_reset()
{
if (!isFixed_) {
- set<DependencyManager *>::iterator it;
+ std::set<DependencyManager *>::iterator it;
for (it = dependentQuantities_.begin(); it != dependentQuantities_.end(); it++)
(*it)->force_reset();
}
};
/** actions associated with indicating this quantity requires a reset */
void set_reset()
{
needReset_ = true;
}
/** flip this object to needing a reset, and get dependencies */
void force_reset()
{
set_reset();
propagate_reset();
}
/** force quantity to be held fixed, enables dependent quantity to be used as persistent storage */
void fix_quantity() {isFixed_ = true;};
/** unfix the quantity */
void unfix_quantity()
{
if (isFixed_) {
isFixed_ = false;
if (needReset_) propagate_reset();
}
};
/** check on the memory type of the quantity */
MemoryType memory_type() const {return memoryType_;};
/** set the memory type of the quantity */
void set_memory_type(MemoryType memoryType) {memoryType_ = memoryType;};
protected:
/** list of dependent atomic quantities */
- set<DependencyManager * > dependentQuantities_;
+ std::set<DependencyManager * > dependentQuantities_;
/** flag for needing a recent */
// mutable is applied because there can be internal updates because we update when needed rather than when pushed
mutable bool needReset_;
/** flag for if quantity is being held fixed */
bool isFixed_;
/** flag for if the quantity is temporary (per-run) */
MemoryType memoryType_;
/** flag for if the node has been found in depth-first search */
bool dfsFound_;
};
/**
* @class MatrixDependencyManager
* @brief Class for defining objects that manage the dependencies of matrices
*/
// Matrix class T, underlying type U
template <template <typename> class T, typename U>
class MatrixDependencyManager : public DependencyManager {
public:
MatrixDependencyManager() {};
MatrixDependencyManager(int nRows, int nCols) : quantity_(nRows,nCols) {};
virtual ~MatrixDependencyManager() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual T<U> & set_quantity() {propagate_reset(); return get_quantity();};
/** access to a constant dense matrix of the quantity, indexed by AtC atom counts */
virtual const T<U> & quantity() const {return get_quantity();};
/** number of rows in quantity */
virtual int nRows() const {return (this->quantity()).nRows();};
/** number of columns in quantity */
virtual int nCols() const {return (this->quantity()).nCols();};
/** size of the matrix */
virtual int size() const {return (this->quantity()).size();};
/** reset the quantities size */
void reset(INDEX nRows, INDEX nCols) {get_quantity().reset(nRows,nCols); propagate_reset();};
/** resize the quantities size */
void resize(INDEX nRows, INDEX nCols) {get_quantity().resize(nRows,nCols); propagate_reset();};
/** sets the quantity to a given value */
virtual void operator=(const T<U> & target) {get_quantity()=target; propagate_reset();};
/** sets the quantity to a given constant value */
virtual void operator=(U target) {get_quantity()=target; propagate_reset();};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const T<U> & addition) {get_quantity()+=addition; propagate_reset();};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(U addition) {get_quantity()+=addition; propagate_reset();};
/** adds the given data to the Lammps quantity */
virtual void operator-=(const T<U> & subtraction) {get_quantity()-=subtraction; propagate_reset();};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator-=(U subtraction) {get_quantity()-=subtraction; propagate_reset();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const T<U> & multiplier) {get_quantity()*=multiplier; propagate_reset();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(U multiplier) {get_quantity()*=multiplier; propagate_reset();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const T<U> & divisor) {get_quantity()/=divisor; propagate_reset();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(U divisor) {get_quantity()/=divisor; propagate_reset();};
// I have no idea why these won't compile (JAT, 04/07/11)
/** adds the given data to the Lammps quantity */
virtual void operator+=(const MatrixDependencyManager<T,U> & addition) {get_quantity()+=addition.quantity(); propagate_reset();};
/** adds the given data to the Lammps quantity */
virtual void operator-=(const MatrixDependencyManager<T,U> & subtraction) {get_quantity()-=subtraction.quantity(); propagate_reset();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const MatrixDependencyManager<T,U> & multiplier) {get_quantity()*=multiplier.quantity(); propagate_reset();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const MatrixDependencyManager<T,U> & divisor) {get_quantity()/=divisor.quantity(); propagate_reset();};
/** execute the matrix print command */
- virtual void const print(const string &name) {get_quantity().print(name);};
+ virtual void const print(const std::string &name) {get_quantity().print(name);};
protected:
// This getter can be overridden by derived classes if they need e.g. a
// differently-constructed quantity, but would like to use the same operators.
virtual T<U> &get_quantity() const { return quantity_; }
/** matrix */
// mutable is applied because there can be internal updates because we update when needed rather than when pushed
mutable T<U> quantity_;
};
/**
* @class MatrixDependencyManager<ParSparseMatrix, T>
* @brief Class for defining objects that manage the dependencies of parallelized sparse matrices
*/
template<typename T>
class MatrixDependencyManager<ParSparseMatrix, T> :
public MatrixDependencyManager<SparseMatrix, T>
{
public:
MatrixDependencyManager(MPI_Comm comm) :
MatrixDependencyManager<SparseMatrix, T>(), quantity_(comm) {};
MatrixDependencyManager(MPI_Comm comm, int nRows, int nCols) :
MatrixDependencyManager<SparseMatrix, T>(), quantity_(comm, nRows, nCols) {};
virtual ~MatrixDependencyManager() {};
protected:
// Let the superclass's operators work on our ParSparseMatrix.
virtual ParSparseMatrix<T> &get_quantity() const { return quantity_; }
mutable ParSparseMatrix<T> quantity_;
};
/**
* @class MatrixDependencyManager<ParDiagonalMatrix, T>
* @brief Class for defining objects that manage the dependencies of parallelized diagonal matrices
*/
template<typename T>
class MatrixDependencyManager<ParDiagonalMatrix, T> :
public MatrixDependencyManager<DiagonalMatrix, T>
{
public:
MatrixDependencyManager(MPI_Comm comm) :
MatrixDependencyManager<DiagonalMatrix, T>(), quantity_(comm) {};
MatrixDependencyManager(MPI_Comm comm, int nRows, int nCols) :
MatrixDependencyManager<DiagonalMatrix, T>(), quantity_(comm, nRows, nCols) {};
virtual ~MatrixDependencyManager() {};
protected:
// Let the superclass's operators work on our ParDiagonalMatrix.
virtual ParDiagonalMatrix<T> &get_quantity() const { return quantity_; }
mutable ParDiagonalMatrix<T> quantity_;
};
/**
* @class SetDependencyManager
* @brief Class for defining objects that manage the dependencies of standard library sets
*/
template <typename T>
class SetDependencyManager : public DependencyManager {
public:
// constructor
SetDependencyManager() :
DependencyManager(), quantity_() {};
// destructor
virtual ~SetDependencyManager() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
- virtual set<T> & set_quantity() {propagate_reset(); return quantity_;};
+ virtual std::set<T> & set_quantity() {propagate_reset(); return quantity_;};
/** access to a constant dense matrix of the quantity, indexed by AtC atom counts */
- virtual const set<T> & quantity() const {return quantity_;};
+ virtual const std::set<T> & quantity() const {return quantity_;};
/** size of the set */
virtual int size() const {return (this->quantity()).size();};
protected:
/** underlying set */
// mutable is applied because there can be internal updates because we update when needed rather than when pushed
- mutable set<T> quantity_;
+ mutable std::set<T> quantity_;
};
/**
* @class VectorDependencyManager
* @brief Class for defining objects that manage the dependencies of standard library vectors
*/
template <typename T>
class VectorDependencyManager : public DependencyManager {
public:
// constructor
VectorDependencyManager() :
DependencyManager(), quantity_() {};
// destructor
virtual ~VectorDependencyManager() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
- virtual vector<T> & set_quantity() {propagate_reset(); return quantity_;};
+ virtual std::vector<T> & set_quantity() {propagate_reset(); return quantity_;};
/** access to a constant dense matrix of the quantity, indexed by AtC atom counts */
- virtual const vector<T> & quantity() const {return quantity_;};
+ virtual const std::vector<T> & quantity() const {return quantity_;};
/** size of the set */
virtual int size() const {return (this->quantity()).size();};
protected:
/** underlying set */
// mutable is applied because there can be internal updates because we update when needed rather than when pushed
- mutable vector<T> quantity_;
+ mutable std::vector<T> quantity_;
};
};
#endif
diff --git a/lib/atc/DiagonalMatrix.h b/lib/atc/DiagonalMatrix.h
index 90c4bf193..662941bac 100644
--- a/lib/atc/DiagonalMatrix.h
+++ b/lib/atc/DiagonalMatrix.h
@@ -1,495 +1,495 @@
#ifndef DIAGONALMATRIX_H
#define DIAGONALMATRIX_H
#include "MatrixDef.h"
namespace ATC_matrix {
/**
* @class DiagonalMatrix
* @brief Class for storing data as a diagonal matrix
*/
template<typename T>
class DiagonalMatrix : public Matrix<T>
{
public:
explicit DiagonalMatrix(INDEX nRows=0, bool zero=0);
DiagonalMatrix(const DiagonalMatrix<T>& c);
DiagonalMatrix(const Vector<T>& v);
virtual ~DiagonalMatrix();
//* resizes the matrix, ignores nCols, optionally zeros
void reset(INDEX rows, INDEX cols=0, bool zero=true);
//* resizes the matrix, ignores nCols, optionally copies what fits
void resize(INDEX rows, INDEX cols=0, bool copy=false);
//* resets based on full copy of vector v
void reset(const Vector<T>& v);
//* resets based on full copy of a DiagonalMatrix
void reset(const DiagonalMatrix<T>& v);
//* resets based on a one column DenseMatrix
void reset(const DenseMatrix<T>& c);
//* resizes the matrix, ignores nCols, optionally copies what fits
void copy(const T * ptr, INDEX rows, INDEX cols=0);
//* resets based on a "shallow" copy of a vector
void shallowreset(const Vector<T> &v);
//* resets based on a "shallow" copy of a DiagonalMatrix
void shallowreset(const DiagonalMatrix<T> &c);
T& operator()(INDEX i, INDEX j);
T operator()(INDEX i, INDEX j) const;
T& operator[](INDEX i);
T operator[](INDEX i) const;
INDEX nRows() const;
INDEX nCols() const;
T* ptr() const;
void write_restart(FILE *f) const;
// Dump matrix contents to screen (not defined for all datatypes)
- string to_string() const { return _data->to_string(); }
+ std::string to_string() const { return _data->to_string(); }
using Matrix<T>::matlab;
- void matlab(ostream &o, const string &s="D") const;
+ void matlab(std::ostream &o, const std::string &s="D") const;
// overloaded operators
DiagonalMatrix<T>& operator=(const T s);
DiagonalMatrix<T>& operator=(const DiagonalMatrix<T> &C);
//DiagonalMatrix<T>& operator=(const Vector<T> &C);
INDEX size() const { return _data->size(); }
//* computes the inverse of this matrix
DiagonalMatrix<T>& inv_this();
//* returns a copy of the inverse of this matrix
DiagonalMatrix<T> inv() const;
// DiagonalMatrix-matrix multiplication function
virtual void MultAB(const Matrix<T>& B, DenseMatrix<T>& C) const
{
GCK(*this, B, this->nCols()!=B.nRows(), "DiagonalMatrix-Matrix multiplication");
for (INDEX i=0; i<C.nRows(); i++) {
T value = (*this)[i];
for (INDEX j=0; j<C.nCols(); j++)
C(i,j) = B(i,j) * value;
}
}
protected:
void _set_equal(const Matrix<T> &r);
DiagonalMatrix& operator=(const Vector<T> &c) {}
DiagonalMatrix& operator=(const Matrix<T> &c) {}
private:
void _delete();
Vector<T> *_data;
};
//-----------------------------------------------------------------------------
// DiagonalMatrix-DiagonalMatrix multiplication
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T> operator*(const DiagonalMatrix<T>& A, const DiagonalMatrix<T>& B)
{
SSCK(A, B, "DiagonalMatrix-DiagonalMatrix multiplication");
DiagonalMatrix<T> R(A);
for (INDEX i=0; i<R.nRows(); i++) R[i] *= B[i];
return R;
}
//-----------------------------------------------------------------------------
// DiagonalMatrix-matrix multiplication
//-----------------------------------------------------------------------------
template<typename T>
DenseMatrix<T> operator*(const DiagonalMatrix<T>& A, const Matrix<T> &B)
{
DenseMatrix<T> C(A.nRows(), B.nCols(), true);
A.MultAB(B, C);
return C;
}
//-----------------------------------------------------------------------------
// matrix-DiagonalMatrix multiplication
//-----------------------------------------------------------------------------
template<typename T>
DenseMatrix<T> operator*(const Matrix<T> &B, const DiagonalMatrix<T>& A)
{
GCK(B, A, B.nCols()!=A.nRows(), "Matrix-DiagonalMatrix multiplication");
DenseMatrix<T> R(B); // makes a copy of r to return
for (INDEX j=0; j<R.nCols(); j++)
for (INDEX i=0; i<R.nRows(); i++)
R(i,j) *= A[j];
return R;
}
//-----------------------------------------------------------------------------
// DiagonalMatrix-vector multiplication
//-----------------------------------------------------------------------------
template<typename T>
DenseVector<T> operator*(const DiagonalMatrix<T>& A, const Vector<T> &b)
{
GCK(A, b, A.nCols()!=b.size(), "DiagonalMatrix-Vector multiplication");
DenseVector<T> r(b); // makes a copy of r to return
for (INDEX i=0; i<r.size(); i++)
r[i] *= A[i];
return r;
}
//-----------------------------------------------------------------------------
// vector-DiagonalMatrix multiplication
//-----------------------------------------------------------------------------
template<typename T>
DenseVector<T> operator*(const Vector<T> &b, const DiagonalMatrix<T>& A)
{
GCK(b, A, b.size()!=A.nRows(), "Matrix-DiagonalMatrix multiplication");
DenseVector<T> r(b); // makes a copy of r to return
for (INDEX i=0; i<r.size(); i++)
r[i] *= A[i];
return r;
}
//-----------------------------------------------------------------------------
// DiagonalMatrix-SparseMatrix multiplication
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T> operator*(const DiagonalMatrix<T> &A, const SparseMatrix<T>& B)
{
GCK(A, B, A.nCols()!=B.nRows() ,"DiagonalMatrix-SparseMatrix multiplication");
SparseMatrix<T> R(B);
CloneVector<T> d(A);
R.row_scale(d);
return R;
}
//-----------------------------------------------------------------------------
// DiagonalMatrix-scalar multiplication
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T> operator*(DiagonalMatrix<T> &A, const T s)
{
DiagonalMatrix<T> R(A);
R *= s;
return R;
}
//-----------------------------------------------------------------------------
// Commute with DiagonalMatrix * double
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T> operator*(const T s, const DiagonalMatrix<T>& A)
{
DiagonalMatrix<T> R(A);
R *= s;
return R;
}
//-----------------------------------------------------------------------------
// DiagonalMatrix addition
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T> operator+(const DiagonalMatrix<T> &A, const DiagonalMatrix<T> &B)
{
DiagonalMatrix<T> R(A);
R+=B;
return R;
}
//-----------------------------------------------------------------------------
// DiagonalMatrix subtraction
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T> operator-(const DiagonalMatrix<T> &A, const DiagonalMatrix<T> &B)
{
DiagonalMatrix<T> R(A);
return R-=B;
}
//-----------------------------------------------------------------------------
// template member definitions
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Default constructor - optionally zeros the matrix
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T>::DiagonalMatrix(INDEX rows, bool zero)
: _data(NULL)
{
reset(rows, zero);
}
//-----------------------------------------------------------------------------
// copy constructor - makes a full copy
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T>::DiagonalMatrix(const DiagonalMatrix<T>& c)
: _data(NULL)
{
reset(c);
}
//-----------------------------------------------------------------------------
// copy constructor from vector
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T>::DiagonalMatrix(const Vector<T>& v)
: _data(NULL)
{
reset(v);
}
//-----------------------------------------------------------------------------
// destructor
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T>::~DiagonalMatrix()
{
_delete();
}
//-----------------------------------------------------------------------------
// deletes the data stored by this matrix
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::_delete()
{
if (_data) delete _data;
}
//-----------------------------------------------------------------------------
// resizes the matrix, ignores nCols, optionally zeros
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::reset(INDEX rows, INDEX cols, bool zero)
{
_delete();
_data = new DenseVector<T>(rows, zero);
}
//-----------------------------------------------------------------------------
// resizes the matrix, ignores nCols, optionally copies what fits
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::resize(INDEX rows, INDEX cols, bool copy)
{
_data->resize(rows, copy);
}
//-----------------------------------------------------------------------------
// changes the diagonal of the matrix to a vector v (makes a copy)
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::reset(const Vector<T>& v)
{
if (&v == _data) return; // check for self-reset
_delete();
_data = new DenseVector<T>(v);
}
//-----------------------------------------------------------------------------
// copys from another DiagonalMatrix
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::reset(const DiagonalMatrix<T>& c)
{
reset(*(c._data));
}
//-----------------------------------------------------------------------------
// copys from a single column matrix
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::reset(const DenseMatrix<T>& c)
{
GCHK(c.nCols()!=1,"DiagonalMatrix reset from DenseMatrix");
copy(c.ptr(),c.nRows(),c.nRows());
}
//-----------------------------------------------------------------------------
// resizes the matrix and copies data
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::copy(const T * ptr, INDEX rows, INDEX cols)
{
if (_data) _data->reset(rows, false);
else _data = new DenseVector<T>(rows, false);
_data->copy(ptr,rows,cols);
}
//-----------------------------------------------------------------------------
// shallow reset from another DiagonalMatrix
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::shallowreset(const DiagonalMatrix<T> &c)
{
_delete();
_data = new CloneVector<T>(*(c._data));
}
//-----------------------------------------------------------------------------
// shallow reset from Vector
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::shallowreset(const Vector<T> &v)
{
_delete();
_data = new CloneVector<T>(v);
}
//-----------------------------------------------------------------------------
// reference indexing operator - must throw an error if i!=j
//-----------------------------------------------------------------------------
template<typename T>
T& DiagonalMatrix<T>::operator()(INDEX i, INDEX j)
{
GCK(*this,*this,i!=j,"DiagonalMatrix: tried to index off diagonal");
return (*this)[i];
}
//-----------------------------------------------------------------------------
// value indexing operator - returns 0 if i!=j
//-----------------------------------------------------------------------------
template<typename T>
T DiagonalMatrix<T>::operator()(INDEX i, INDEX j) const
{
return (i==j) ? (*_data)(i) : (T)0;
}
//-----------------------------------------------------------------------------
// flat reference indexing operator
//-----------------------------------------------------------------------------
template<typename T>
T& DiagonalMatrix<T>::operator[](INDEX i)
{
return (*_data)(i);
}
//-----------------------------------------------------------------------------
// flat value indexing operator
//-----------------------------------------------------------------------------
template<typename T>
T DiagonalMatrix<T>::operator[](INDEX i) const
{
return (*_data)(i);
}
//-----------------------------------------------------------------------------
// returns the number of rows
//-----------------------------------------------------------------------------
template<typename T>
INDEX DiagonalMatrix<T>::nRows() const
{
return _data->size();
}
//-----------------------------------------------------------------------------
// returns the number of columns (same as nCols())
//-----------------------------------------------------------------------------
template<typename T>
INDEX DiagonalMatrix<T>::nCols() const
{
return _data->size();
}
//-----------------------------------------------------------------------------
// returns a pointer to the diagonal values, dangerous!
//-----------------------------------------------------------------------------
template<typename T>
T* DiagonalMatrix<T>::ptr() const
{
return _data->ptr();
}
//-----------------------------------------------------------------------------
// writes the diagonal to a binary data restart file
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::write_restart(FILE *f) const
{
_data->write_restart(f);
}
//-----------------------------------------------------------------------------
// sets the diagonal to a constant
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T>& DiagonalMatrix<T>::operator=(const T v)
{
this->set_all_elements_to(v);
return *this;
}
//-----------------------------------------------------------------------------
// assignment operator with another diagonal matrix
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T>& DiagonalMatrix<T>::operator=(const DiagonalMatrix<T>& C)
{
reset(C);
return *this;
}
//-----------------------------------------------------------------------------
// writes a matlab command to duplicate this sparse matrix
//-----------------------------------------------------------------------------
template<typename T>
-void DiagonalMatrix<T>::matlab(ostream &o, const string &s) const
+void DiagonalMatrix<T>::matlab(std::ostream &o, const std::string &s) const
{
_data->matlab(o, s);
o << s <<"=diag("<<s<<",0);\n";
}
//-----------------------------------------------------------------------------
// inverts this matrix, returns a reference
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T>& DiagonalMatrix<T>::inv_this()
{
for(INDEX i=0; i<nRows(); i++)
{
if ((*this)[i]!=T(0)) (*this)[i] = 1.0/(*this)[i];
else
{
- cout<<"DiagonalMatrix::inv(): ("<<i<<","<<i<<")=0\n";
+ std::cout<<"DiagonalMatrix::inv(): ("<<i<<","<<i<<")=0\n";
ERROR_FOR_BACKTRACE
exit(EXIT_FAILURE);
}
}
// Error check info
const double min_max = _data->minabs() / _data->maxabs();
if (min_max > 1e-14) return *this;
- cout << "DiagonalMatrix::inv_this(): Warning: Matrix is badly scaled.";
- cout << " RCOND = "<<min_max<<"\n";
+ std::cout << "DiagonalMatrix::inv_this(): Warning: Matrix is badly scaled.";
+ std::cout << " RCOND = "<<min_max<<"\n";
return *this;
}
//-----------------------------------------------------------------------------
// returns the inverse of this matrix
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T> DiagonalMatrix<T>::inv() const
{
DiagonalMatrix<T> invA(*this); // Make copy of A to invert
for(INDEX i=0; i<invA.nRows(); i++)
{
if ((*this)[i]!=T(0)) invA[i]=1.0/(*this)[i];
else
{
- cout<<"DiagonalMatrix::inv(): ("<<i<<","<<i<<")=0\n";
+ std::cout<<"DiagonalMatrix::inv(): ("<<i<<","<<i<<")=0\n";
ERROR_FOR_BACKTRACE
exit(EXIT_FAILURE);
}
}
// Error check info
const double min_max = _data->minabs() / _data->maxabs();
if (min_max > 1e-14) return invA;
- cout << "DiagonalMatrix::inv(): Warning: Matrix is badly scaled.";
- cout << " RCOND = "<<min_max<<"\n";
+ std::cout << "DiagonalMatrix::inv(): Warning: Matrix is badly scaled.";
+ std::cout << " RCOND = "<<min_max<<"\n";
return invA;
}
//-----------------------------------------------------------------------------
// computes a matrix inverse
//-----------------------------------------------------------------------------
inline DiagonalMatrix<double> inv(const DiagonalMatrix<double>& A)
{
return A.inv();
}
//-----------------------------------------------------------------------------
// general diagonalmatrix assigment
//-----------------------------------------------------------------------------
template<typename T>
void DiagonalMatrix<T>::_set_equal(const Matrix<T> &r)
{
this->resize(r.nRows(), r.nCols());
const Matrix<T> *pr = &r;
const SparseMatrix<T> *ps = dynamic_cast<const SparseMatrix<T>*> (pr);
const DiagonalMatrix<T> *pd = dynamic_cast<const DiagonalMatrix<T>*> (pr);
const Vector<T> *pv = dynamic_cast<const Vector<T>*> (pr);
if (ps) this->reset(ps->diag());
else if (pd) this->reset(*pd);
else if (pv) this->reset(*pv);
else
{
- cout <<"Error in general sparse matrix assignment\n";
+ std::cout <<"Error in general sparse matrix assignment\n";
exit(1);
}
}
//-----------------------------------------------------------------------------
// casts a generic matrix pointer into a DiagonalMatrix pointer - null if fail
//-----------------------------------------------------------------------------
template<typename T>
const DiagonalMatrix<T> *diag_cast(const Matrix<T> *m)
{
return dynamic_cast<const DiagonalMatrix<T>*>(m);
}
} // end namespace
#endif
diff --git a/lib/atc/ElasticTimeIntegrator.cpp b/lib/atc/ElasticTimeIntegrator.cpp
index 7748bff90..b8058192e 100644
--- a/lib/atc/ElasticTimeIntegrator.cpp
+++ b/lib/atc/ElasticTimeIntegrator.cpp
@@ -1,853 +1,851 @@
// ATC transfer headers
#include "ElasticTimeIntegrator.h"
#include "ATC_Coupling.h"
#include "TimeFilter.h"
#include "ATC_Error.h"
#include "PerAtomQuantityLibrary.h"
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class MomentumTimeIntegrator
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
MomentumTimeIntegrator::MomentumTimeIntegrator(ATC_Coupling * atc,
TimeIntegrationType timeIntegrationType) :
TimeIntegrator(atc, timeIntegrationType)
{
// do nothing
}
//--------------------------------------------------------
// modify
// parses inputs and modifies state of the integrator
//--------------------------------------------------------
bool MomentumTimeIntegrator::modify(int narg, char **arg)
{
bool foundMatch = false;
int argIndex = 0;
// time integration scheme
- /*! \page man_time_integration fix_modify AtC time_integration
+ /*! \page man_momentum_time_integration fix_modify AtC time_integration (momentum)
\section syntax
fix_modify AtC time_integration <descriptor> \n
- descriptor (string) = time integration type \n
various time integration methods for the finite elements\n
\section description
- Verlet - atomic velocity update with 2nd order Verlet \n
- nodal temperature update with 2nd order Verlet \n
- kinetostats based on controlling force \n
- FRACTIONAL_STEP - atomic velocity update with 2nd order Verlet \n
- mixed nodal momentum update, 2nd order Verlet for continuum and exact 2nd order Verlet for atomic contributions\n
- kinetostats based on controlling discrete momentum changes\n
+ verlet - atomic velocity update with 2nd order Verlet, nodal temperature update with 2nd order Verlet, kinetostats based on controlling force \n
+ fractional_step - atomic velocity update with 2nd order Verlet, mixed nodal momentum update, 2nd order Verlet for continuum and exact 2nd order Verlet for atomic contributions, kinetostats based on controlling discrete momentum changes\n
+ gear - atomic velocity update with 2nd order Verlet, nodal temperature update with 3rd or 4th order Gear, kinetostats based on controlling power \n
\section examples
<TT> fix_modify atc time_integration verlet </TT> \n
<TT> fix_modify atc time_integration fractional_step </TT> \n
\section description
\section related
+ see \ref man_fix_atc
\section default
- Gear
+ none
*/
if (strcmp(arg[argIndex],"verlet")==0) {
timeIntegrationType_ = VERLET;
needReset_ = true;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"fractional_step")==0) {
timeIntegrationType_ = FRACTIONAL_STEP;
needReset_ = true;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"gear")==0) {
timeIntegrationType_ = GEAR;
needReset_ = true;
foundMatch = true;
}
return foundMatch;
}
//--------------------------------------------------------
// construct_methods
// creates algorithm objects
//--------------------------------------------------------
void MomentumTimeIntegrator::construct_methods()
{
if (atc_->reset_methods()) {
if (timeIntegrationMethod_)
delete timeIntegrationMethod_;
if (timeFilterManager_->need_reset()) {
switch (timeIntegrationType_) {
case VERLET:
timeFilter_ = timeFilterManager_->construct(TimeFilterManager::IMPLICIT);
atc_->set_mass_mat_time_filter(MOMENTUM,TimeFilterManager::IMPLICIT);
break;
case FRACTIONAL_STEP:
case GEAR:
timeFilter_ = timeFilterManager_->construct(TimeFilterManager::EXPLICIT_IMPLICIT);
atc_->set_mass_mat_time_filter(MOMENTUM,TimeFilterManager::EXPLICIT_IMPLICIT);
break;
default:
throw ATC_Error("Uknown time integration type in ThermalTimeIntegrator::Initialize()");
}
}
if (timeFilterManager_->filter_dynamics()) {
switch (timeIntegrationType_) {
case VERLET: {
timeIntegrationMethod_ = new ElasticTimeIntegratorVerletFiltered(this);
break;
}
default:
throw ATC_Error("Uknown time integration type in MomentumTimeIntegrator::Initialize()");
}
}
else {
switch (timeIntegrationType_) {
case VERLET: {
timeIntegrationMethod_ = new ElasticTimeIntegratorVerlet(this);
break;
}
case FRACTIONAL_STEP: {
timeIntegrationMethod_ = new ElasticTimeIntegratorFractionalStep(this);
break;
}
case GEAR: {
timeIntegrationMethod_ = new FluidsTimeIntegratorGear(this);
break;
}
default:
throw ATC_Error("Uknown time integration type in MomentumTimeIntegrator::Initialize()");
}
}
}
}
//--------------------------------------------------------
// pack_fields
// add persistent variables to data list
//--------------------------------------------------------
void MomentumTimeIntegrator::pack_fields(RESTART_LIST & data)
{
data["NodalAtomicForceFiltered"] = & nodalAtomicForceFiltered_.set_quantity();
data["NodalAtomicMomentumFiltered"] = & nodalAtomicMomentumFiltered_.set_quantity();
TimeIntegrator::pack_fields(data);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class MomentumIntegrationMethod
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab data from ATC
//--------------------------------------------------------
MomentumIntegrationMethod::MomentumIntegrationMethod(MomentumTimeIntegrator * momentumTimeIntegrator) :
TimeIntegrationMethod(momentumTimeIntegrator),
timeFilter_(timeIntegrator_->time_filter()),
velocity_(atc_->field(VELOCITY)),
acceleration_(atc_->field_roc(VELOCITY)),
nodalAtomicVelocityOut_(atc_->nodal_atomic_field(VELOCITY)),
velocityRhs_(atc_->field_rhs(VELOCITY)),
nodalAtomicForceOut_(atc_->nodal_atomic_field_roc(VELOCITY))
{
// do nothing
}
//--------------------------------------------------------
// construct_transfers
// Grab existing managed quantities,
// create the rest
//--------------------------------------------------------
void MomentumIntegrationMethod::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
nodalAtomicVelocity_ = interscaleManager.dense_matrix("NodalAtomicVelocity");
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ElasticTimeIntegratorVerlet
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ElasticTimeIntegratorVerlet::ElasticTimeIntegratorVerlet(MomentumTimeIntegrator * momentumTimeIntegrator) :
MomentumIntegrationMethod(momentumTimeIntegrator),
displacement_(atc_->field(DISPLACEMENT)),
nodalAtomicDisplacementOut_(atc_->nodal_atomic_field(DISPLACEMENT)),
nodalAtomicForceFiltered_(momentumTimeIntegrator->nodal_atomic_force_filtered()),
nodalAtomicDisplacement_(NULL),
nodalAtomicForce_(NULL)
{
// do nothing
}
//--------------------------------------------------------
// construct_transfers
// Grab existing managed quantities,
// create the rest
//--------------------------------------------------------
void ElasticTimeIntegratorVerlet::construct_transfers()
{
MomentumIntegrationMethod::construct_transfers();
InterscaleManager & interscaleManager = atc_->interscale_manager();
nodalAtomicDisplacement_ = interscaleManager.dense_matrix("NodalAtomicDisplacement");
nodalAtomicForce_ = interscaleManager.dense_matrix("NodalAtomicForce");
}
//--------------------------------------------------------
// initialize
// initialize all data
//--------------------------------------------------------
void ElasticTimeIntegratorVerlet::initialize()
{
MomentumIntegrationMethod::initialize();
// sets up time filter for cases where variables temporally filtered
// this time integrator should use an implicit filter
TimeFilterManager * timeFilterManager = (timeIntegrator_->atc())->time_filter_manager();
if (timeFilterManager->need_reset()) {
timeFilter_->initialize(nodalAtomicForce_->quantity());
}
if (!(timeFilterManager->end_equilibrate())) {
nodalAtomicForceFiltered_.reset(atc_->num_nodes(),atc_->nsd());
}
if (!(timeFilterManager->filter_dynamics())){
//post_process();
//compute_nodal_forces(velocityRhs_.set_quantity());
velocityRhs_ = nodalAtomicForce_->quantity();
}
}
//--------------------------------------------------------
// mid_initial_integrate1
// time integration at the mid-point of Verlet step 1
//--------------------------------------------------------
void ElasticTimeIntegratorVerlet::mid_initial_integrate1(double dt)
{
explicit_1(velocity_.set_quantity(),acceleration_.quantity(),.5*dt);
}
//--------------------------------------------------------
// post_initial_integrate1
// time integration after Verlet step 1
//--------------------------------------------------------
void ElasticTimeIntegratorVerlet::post_initial_integrate1(double dt)
{
// for improved accuracy, but this would be inconsistent with
// the atomic integration scheme
explicit_1(displacement_.set_quantity(),velocity_.quantity(),dt);
}
//--------------------------------------------------------
// pre_final_integrate1
// first time integration computations
// before Verlet step 2
//--------------------------------------------------------
void ElasticTimeIntegratorVerlet::pre_final_integrate1(double dt)
{
// integrate filtered atomic force
timeFilter_->apply_post_step2(nodalAtomicForceFiltered_.set_quantity(),
nodalAtomicForce_->quantity(),dt);
}
//--------------------------------------------------------
// post_final_integrate2
// second time integration computations
// after Verlet step 2
//--------------------------------------------------------
void ElasticTimeIntegratorVerlet::post_final_integrate2(double dt)
{
atc_->apply_inverse_mass_matrix(velocityRhs_.quantity(),
acceleration_.set_quantity(),
VELOCITY);
explicit_1(velocity_.set_quantity(),acceleration_.quantity(),.5*dt);
}
//--------------------------------------------------------
// add_to_rhs
// add integrated atomic force contributions
//--------------------------------------------------------
void ElasticTimeIntegratorVerlet::add_to_rhs()
{
// Compute MD contribution to FEM equation
velocityRhs_ += nodalAtomicForce_->quantity();
}
//--------------------------------------------------------
// post_process
// post processing of variables before output
//--------------------------------------------------------
void ElasticTimeIntegratorVerlet::post_process()
{
nodalAtomicDisplacementOut_ = nodalAtomicDisplacement_->quantity();
nodalAtomicVelocityOut_ = nodalAtomicVelocity_->quantity();
}
//--------------------------------------------------------
// output
// add variables to output list
//--------------------------------------------------------
void ElasticTimeIntegratorVerlet::output(OUTPUT_LIST & outputData)
{
DENS_MAT & nodalAtomicForce(nodalAtomicForce_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData["NodalAtomicForce"] = &nodalAtomicForce;
}
}
//--------------------------------------------------------
// finish
// finalize state of nodal atomic quantities
//--------------------------------------------------------
void ElasticTimeIntegratorVerlet::finish()
{
post_process();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ElasticTimeIntegratorVerletFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ElasticTimeIntegratorVerletFiltered::ElasticTimeIntegratorVerletFiltered(MomentumTimeIntegrator * momentumTimeIntegrator) :
ElasticTimeIntegratorVerlet(momentumTimeIntegrator),
nodalAtomicAcceleration_(atc_->nodal_atomic_field_roc(VELOCITY))
{
// do nothing
}
//--------------------------------------------------------
// mid_initial_integrate1
// time integration at the mid-point of Verlet step 1
//--------------------------------------------------------
void ElasticTimeIntegratorVerletFiltered::mid_initial_integrate1(double dt)
{
explicit_1(velocity_.set_quantity(),acceleration_.quantity(),.5*dt);
explicit_1(nodalAtomicVelocityOut_.set_quantity(),nodalAtomicAcceleration_.quantity(),.5*dt);
}
//--------------------------------------------------------
// post_initial_integrate1
// time integration after Verlet step 1
//--------------------------------------------------------
void ElasticTimeIntegratorVerletFiltered::post_initial_integrate1(double dt)
{
// for improved accuracy, but this would be inconsistent with
// the atomic integration scheme
explicit_1(displacement_.set_quantity(),velocity_.quantity(),dt);
explicit_1(nodalAtomicDisplacementOut_.set_quantity(),nodalAtomicVelocityOut_.quantity(),dt);
}
//--------------------------------------------------------
// post_final_integrate2
// second time integration after Verlet step 2
//--------------------------------------------------------
void ElasticTimeIntegratorVerletFiltered::post_final_integrate2(double dt)
{
DENS_MAT velocityRoc(velocityRhs_.nRows(),velocityRhs_.nCols());
atc_->apply_inverse_mass_matrix(velocityRhs_.quantity(),
acceleration_.set_quantity(),
VELOCITY);
explicit_1(velocity_.set_quantity(),acceleration_.quantity(),.5*dt);
atc_->apply_inverse_md_mass_matrix(nodalAtomicForceFiltered_.quantity(),
nodalAtomicAcceleration_.set_quantity(),
VELOCITY);
explicit_1(nodalAtomicVelocityOut_.set_quantity(),nodalAtomicAcceleration_.quantity(),.5*dt);
}
//--------------------------------------------------------
// add_to_rhs
// add integrated atomic force contributions
//--------------------------------------------------------
void ElasticTimeIntegratorVerletFiltered::add_to_rhs()
{
// MD contributions to FE equations
velocityRhs_ += nodalAtomicForceFiltered_.set_quantity();
}
//--------------------------------------------------------
// output
// add variables to output list
//--------------------------------------------------------
void ElasticTimeIntegratorVerletFiltered::output(OUTPUT_LIST & outputData)
{
DENS_MAT & nodalAtomicForce(nodalAtomicForceFiltered_.set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData["NodalAtomicForce"] = &nodalAtomicForce;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ElasticTimeIntegratorFractionalStep
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ElasticTimeIntegratorFractionalStep::ElasticTimeIntegratorFractionalStep(MomentumTimeIntegrator * momentumTimeIntegrator) :
MomentumIntegrationMethod(momentumTimeIntegrator),
displacement_(atc_->field(DISPLACEMENT)),
nodalAtomicDisplacementOut_(atc_->nodal_atomic_field(DISPLACEMENT)),
nodalAtomicForceFiltered_(momentumTimeIntegrator->nodal_atomic_force_filtered()),
nodalAtomicMomentum_(NULL),
nodalAtomicMomentumFiltered_(momentumTimeIntegrator->nodal_atomic_momentum_filtered()),
nodalAtomicDisplacement_(NULL),
nodalAtomicMomentumOld_(atc_->num_nodes(),atc_->nsd()),
nodalAtomicVelocityOld_(atc_->num_nodes(),atc_->nsd())
{
// do nothing
}
//--------------------------------------------------------
// construct_transfers
// Grab existing managed quantities,
// create the rest
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::construct_transfers()
{
MomentumIntegrationMethod::construct_transfers();
InterscaleManager & interscaleManager = atc_->interscale_manager();
nodalAtomicMomentum_ = interscaleManager.dense_matrix("NodalAtomicMomentum");
nodalAtomicDisplacement_ = interscaleManager.dense_matrix("NodalAtomicDisplacement");
}
//--------------------------------------------------------
// initialize
// initialize all data
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::initialize()
{
MomentumIntegrationMethod::initialize();
// initial force to zero
nodalAtomicForce_.reset(atc_->num_nodes(),atc_->nsd());
// sets up time filter for cases where variables temporally filtered
// this time integrator should use Crank-Nicholson filter for 2nd order accuracy
TimeFilterManager * timeFilterManager = (timeIntegrator_->atc())->time_filter_manager();
if (timeFilterManager->need_reset()) {
// the form of this integrator implies no time filters that require history data can be used
timeFilter_->initialize();
}
// sets up time filter for post-processing the filtered power
// this time integrator should use an explicit-implicit filter
// to mirror the 2nd order Verlet integration scheme
// It requires no history information so initial value just sizes arrays
if (!(timeFilterManager->end_equilibrate())) {
// implies an initial condition of the instantaneous atomic energy
nodalAtomicMomentumFiltered_ = nodalAtomicMomentum_->quantity();
nodalAtomicForceFiltered_.reset(atc_->num_nodes(),atc_->nsd());
}
}
//--------------------------------------------------------
// pre_initial_integrate1
// time integration before Verlet step 1, used to
// provide the baseline momentum and displacement to
// quantify the change over the timestep
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::pre_initial_integrate1(double dt)
{
// initialize changes in momentum
const DENS_MAT & myNodalAtomicMomentum(nodalAtomicMomentum_->quantity());
// updated filtered energy using explicit-implicit scheme
timeFilter_->apply_pre_step1(nodalAtomicMomentumFiltered_.set_quantity(),
myNodalAtomicMomentum,dt);
}
//--------------------------------------------------------
// pre_initial_integrate2
// second time integration after kinetostat application
// to compute MD contributions to momentum change
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::pre_initial_integrate2(double dt)
{
// used for updating change in velocity from mass matrix change
this->compute_old_time_data();
// update filtered nodal atomic force
timeFilter_->apply_pre_step1(nodalAtomicForceFiltered_.set_quantity(),
nodalAtomicForce_,dt);
// store current force for use later
nodalAtomicForce_ = nodalAtomicMomentum_->quantity();
nodalAtomicForce_ *= -1.;
}
//--------------------------------------------------------
// mid_initial_integrate1
// time integration between the velocity and position
// updates in Verlet step 1
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::mid_initial_integrate1(double dt)
{
// atomic contributions to change in momentum
// compute change in restricted atomic momentum
const DENS_MAT & nodalAtomicMomentum(nodalAtomicMomentum_->quantity());
nodalAtomicForce_ += nodalAtomicMomentum;
// update FE velocity with change in velocity from MD
DENS_MAT & atomicVelocityDelta(atomicVelocityDelta_.set_quantity());
atc_->apply_inverse_mass_matrix(nodalAtomicForce_,
atomicVelocityDelta,
VELOCITY);
velocity_ += atomicVelocityDelta;
// approximation to force for output
nodalAtomicForce_ /= 0.5*dt;
timeFilter_->apply_post_step1(nodalAtomicForceFiltered_.set_quantity(),
nodalAtomicForce_,dt);
// change to velocity from FE dynamics
atc_->apply_inverse_mass_matrix(velocityRhs_.quantity(),
acceleration_.set_quantity(),
VELOCITY);
explicit_1(velocity_.set_quantity(),acceleration_.quantity(),0.5*dt);
// used for updating change in momentum from mass matrix change
atc_->apply_inverse_mass_matrix(nodalAtomicMomentum,
nodalAtomicVelocityOld_,
VELOCITY);
nodalAtomicMomentumOld_ = nodalAtomicMomentum;
}
//--------------------------------------------------------
// post_initial_integrate1
// time integration after Verlet step 1
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::post_initial_integrate1(double dt)
{
// get nodal momentum for second part of force update
nodalAtomicForce_ = nodalAtomicMomentum_->quantity();
nodalAtomicForce_ *= -1.;
// update nodal displacements
explicit_1(displacement_.set_quantity(),velocity_.quantity(),dt);
}
//--------------------------------------------------------
// post_final_integrate2
// second time integration computations
// after Verlet step 2
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::post_final_integrate2(double dt)
{
// atomic contributions to change in momentum
// compute change in restricted atomic momentum
nodalAtomicForce_ += nodalAtomicMomentum_->quantity();
// update FE temperature with change in temperature from MD
compute_velocity_delta(nodalAtomicForce_,dt);
velocity_ += atomicVelocityDelta_.quantity();
// approximation to power for output
nodalAtomicForce_ /= 0.5*dt;
timeFilter_->apply_post_step1(nodalAtomicForceFiltered_.set_quantity(),
nodalAtomicForce_,dt);
// change to velocity from FE dynamics
atc_->apply_inverse_mass_matrix(velocityRhs_.quantity(),
acceleration_.set_quantity(),
VELOCITY);
explicit_1(velocity_.set_quantity(),acceleration_.quantity(),0.5*dt);
}
//--------------------------------------------------------
// post_process
// post processing of variables before output
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::post_process()
{
nodalAtomicDisplacementOut_ = nodalAtomicDisplacement_->quantity();
nodalAtomicVelocityOut_ = nodalAtomicVelocity_->quantity();
}
//--------------------------------------------------------
// output
// add variables to output list
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::output(OUTPUT_LIST & outputData)
{
if ((atc_->lammps_interface())->rank_zero()) {
outputData["NodalAtomicForce"] = & nodalAtomicForce_;
}
}
//--------------------------------------------------------
// finish
// finalize state of nodal atomic quantities
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::finish()
{
post_process();
}
//--------------------------------------------------------
// compute_old_time_data
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::compute_old_time_data()
{
const DENS_MAT & myNodalAtomicMomentum(nodalAtomicMomentum_->quantity());
atc_->apply_inverse_mass_matrix(myNodalAtomicMomentum,
nodalAtomicVelocityOld_,
VELOCITY);
nodalAtomicMomentumOld_ = myNodalAtomicMomentum;
}
//--------------------------------------------------------
// compute_velocity_delta
//--------------------------------------------------------
void ElasticTimeIntegratorFractionalStep::compute_velocity_delta(const DENS_MAT & atomicMomentumDelta,
double dt)
{
DENS_MAT & myAtomicVelocityDelta(atomicVelocityDelta_.set_quantity());
myAtomicVelocityDelta = nodalAtomicMomentumOld_ + atomicMomentumDelta;
atc_->apply_inverse_mass_matrix(myAtomicVelocityDelta,
VELOCITY);
myAtomicVelocityDelta += -1.*nodalAtomicVelocityOld_;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FluidsTimeIntegratorGear
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab data from ATC
//--------------------------------------------------------
FluidsTimeIntegratorGear::FluidsTimeIntegratorGear(MomentumTimeIntegrator * momentumTimeIntegrator) :
MomentumIntegrationMethod(momentumTimeIntegrator),
nodalAtomicForceFiltered_(momentumTimeIntegrator->nodal_atomic_force_filtered()),
nodalAtomicMomentum_(NULL),
nodalAtomicMomentumFiltered_(momentumTimeIntegrator->nodal_atomic_momentum_filtered()),
atomicVelocityDelta_(atc_->num_nodes(),atc_->nsd()),
nodalAtomicMomentumOld_(atc_->num_nodes(),atc_->nsd()),
nodalAtomicVelocityOld_(atc_->num_nodes(),atc_->nsd()),
velocity2Roc_(atc_->field_2roc(VELOCITY))
{
// do nothing
}
//--------------------------------------------------------
// construct_transfers
// Grab existing managed quantities,
// create the rest
//--------------------------------------------------------
void FluidsTimeIntegratorGear::construct_transfers()
{
MomentumIntegrationMethod::construct_transfers();
InterscaleManager & interscaleManager(atc_->interscale_manager());
nodalAtomicMomentum_ = interscaleManager.dense_matrix("NodalAtomicMomentum");
}
//--------------------------------------------------------
// initialize
// initialize all data
//--------------------------------------------------------
void FluidsTimeIntegratorGear::initialize()
{
MomentumIntegrationMethod::initialize();
// initial power to zero
nodalAtomicForce_.reset(atc_->num_nodes(),atc_->nsd());
// sets up time filter for cases where variables temporally filtered
// this time integrator should use Crank-Nicholson filter for 2nd order accuracy
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (timeFilterManager->need_reset()) {
// the form of this integrator implies no time filters that require history data can be used
timeFilter_->initialize();
}
// sets up time filter for post-processing the filtered power
// this time integrator should use an explicit-implicit filter
// to mirror the 2nd order Verlet integration scheme
// It requires no history information so initial value just sizes arrays
if (!timeFilterManager->end_equilibrate()) {
// implies an initial condition of the instantaneous atomic energy
// for the corresponding filtered variable, consistent with the temperature
nodalAtomicMomentumFiltered_ = nodalAtomicMomentum_->quantity();
nodalAtomicForceFiltered_.reset(atc_->num_nodes(),atc_->nsd());
}
}
//--------------------------------------------------------
// pre_initial_integrate1
//--------------------------------------------------------
void FluidsTimeIntegratorGear::pre_initial_integrate1(double dt)
{
const DENS_MAT & myNodalAtomicMomentum(nodalAtomicMomentum_->quantity());
// updated filtered momentum using explicit-implicit scheme
timeFilter_->apply_pre_step1(nodalAtomicMomentumFiltered_.set_quantity(),
myNodalAtomicMomentum,dt);
}
//--------------------------------------------------------
// pre_initial_integrate2
//--------------------------------------------------------
void FluidsTimeIntegratorGear::pre_initial_integrate2(double dt)
{
// used for updating change in velocity from mass matrix change
this->compute_old_time_data();
// update FE contributions
apply_gear_predictor(dt);
// update filtered nodal atomic force
// that way kinetostat and integrator can be consistent
timeFilter_->apply_pre_step1(nodalAtomicForceFiltered_.set_quantity(),
nodalAtomicForce_,dt);
// store current momentum for use later
nodalAtomicForce_ = nodalAtomicMomentum_->quantity();
nodalAtomicForce_ *= -1.;
}
//--------------------------------------------------------
// pre_final_integrate1
//--------------------------------------------------------
void FluidsTimeIntegratorGear::pre_final_integrate1(double dt)
{
// before the new rhs is computed but after atomic velocity is updated.
// compute change in restricted atomic momentum
nodalAtomicForce_ += nodalAtomicMomentum_->quantity();
// update FE velocity with change in velocity from MD
compute_velocity_delta(nodalAtomicForce_,dt);
velocity_ += atomicVelocityDelta_.quantity();
// approximation to force for output
nodalAtomicForce_ /= dt;
timeFilter_->apply_post_step1(nodalAtomicForceFiltered_.set_quantity(),
nodalAtomicForce_,dt);
// make sure nodes are fixed
atc_->set_fixed_nodes();
}
//--------------------------------------------------------
// post_final_integrate1
//--------------------------------------------------------
void FluidsTimeIntegratorGear::post_final_integrate1(double dt)
{
// Finish updating temperature with FE contributions
atc_->apply_inverse_mass_matrix(velocityRhs_.quantity(),
_velocityResidual_,VELOCITY);
_velocityResidual_ -= acceleration_.quantity();
_velocityResidual_ *= dt;
apply_gear_corrector(_velocityResidual_,dt);
}
//--------------------------------------------------------
// post_process
//--------------------------------------------------------
void FluidsTimeIntegratorGear::post_final_integrate2(double dt)
{
// update filtered atomic energy
timeFilter_->apply_post_step1(nodalAtomicMomentumFiltered_.set_quantity(),
nodalAtomicMomentum_->quantity(),dt);
}
//--------------------------------------------------------
// output
// add variables to output list
//--------------------------------------------------------
void FluidsTimeIntegratorGear::post_process()
{
nodalAtomicForceOut_ = nodalAtomicForce_;
nodalAtomicVelocityOut_ = nodalAtomicVelocity_->quantity();
}
//--------------------------------------------------------
// output
// add variables to output list
//--------------------------------------------------------
void FluidsTimeIntegratorGear::output(OUTPUT_LIST & outputData)
{
if ((atc_->lammps_interface())->rank_zero()) {
outputData["NodalAtomicForce"] = & nodalAtomicForce_;
}
}
//--------------------------------------------------------
// finish
// finalize state of nodal atomic quantities
//--------------------------------------------------------
void FluidsTimeIntegratorGear::finish()
{
post_process();
}
//--------------------------------------------------------
// apply_gear_predictor
//--------------------------------------------------------
void FluidsTimeIntegratorGear::apply_gear_predictor(double dt)
{
gear1_3_predict(velocity_.set_quantity(),
acceleration_.set_quantity(),
velocity2Roc_.quantity(),dt);
}
//--------------------------------------------------------
// apply_gear_corrector
//--------------------------------------------------------
void FluidsTimeIntegratorGear::apply_gear_corrector(const DENS_MAT & residual, double dt)
{
gear1_3_correct(velocity_.set_quantity(),
acceleration_.set_quantity(),
velocity2Roc_.set_quantity(),
residual,dt);
}
//--------------------------------------------------------
// compute_old_time_data
//--------------------------------------------------------
void FluidsTimeIntegratorGear::compute_old_time_data()
{
const DENS_MAT & myNodalAtomicMomentum(nodalAtomicMomentum_->quantity());
atc_->apply_inverse_mass_matrix(myNodalAtomicMomentum,
nodalAtomicVelocityOld_,
VELOCITY);
nodalAtomicMomentumOld_ = myNodalAtomicMomentum;
}
//--------------------------------------------------------
// compute_velocity_delta
//--------------------------------------------------------
void FluidsTimeIntegratorGear::compute_velocity_delta(const DENS_MAT & atomicMomentumDelta,
double dt)
{
DENS_MAT & myAtomicVelocityDelta(atomicVelocityDelta_.set_quantity());
myAtomicVelocityDelta = nodalAtomicMomentumOld_ + atomicMomentumDelta;
atc_->apply_inverse_mass_matrix(myAtomicVelocityDelta,
VELOCITY);
myAtomicVelocityDelta -= nodalAtomicVelocityOld_;
}
};
diff --git a/lib/atc/ElasticTimeIntegrator.h b/lib/atc/ElasticTimeIntegrator.h
index 284d5d65f..f6d270f5f 100644
--- a/lib/atc/ElasticTimeIntegrator.h
+++ b/lib/atc/ElasticTimeIntegrator.h
@@ -1,412 +1,410 @@
#ifndef ELASTIC_TIME_INTEGRATOR_H
#define ELASTIC_TIME_INTEGRATOR_H
/** MomentumTimeIntegrator : a class to implement various elasticity integrators for FE quantities */
-// ATC headers
#include "TimeIntegrator.h"
-using namespace std;
namespace ATC {
// forward declarations
class MomentumIntegrationMethod;
/**
* @class MomentumTimeIntegrator
* @brief Base class for various time integrators for elasticity FE quantities which handles parsing and stores basic data structures
*/
class MomentumTimeIntegrator : public TimeIntegrator {
public:
// constructor
MomentumTimeIntegrator(ATC_Coupling * atc,
TimeIntegrationType timeIntegrationType);
// destructor
virtual ~MomentumTimeIntegrator(){};
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** create objects to implement requested numerical method */
virtual void construct_methods();
/** pack persistent fields */
virtual void pack_fields(RESTART_LIST & data);
// Member data access
/** access for filtered atomic force */
DENS_MAN & nodal_atomic_force_filtered(){return nodalAtomicForceFiltered_;};
/** access for filtered atomic momentum */
// note: nodalAtomicMomentum_ should always be reset as it tracks the original momentum + MD evolution
DENS_MAN & nodal_atomic_momentum_filtered(){return nodalAtomicMomentumFiltered_;};
protected:
/** filtered atomic force */
DENS_MAN nodalAtomicForceFiltered_;
/** filtered atomic momentum due initial conditions and MD updates */
DENS_MAN nodalAtomicMomentumFiltered_;
private:
// DO NOT define this
MomentumTimeIntegrator();
};
/**
* @class MomentumIntegrationMethod
* @brief Base class for various time integration methods for the momentum equation
*/
class MomentumIntegrationMethod : public TimeIntegrationMethod {
public:
// constructor
MomentumIntegrationMethod(MomentumTimeIntegrator * momentumTimeIntegrator);
// destructor
virtual ~MomentumIntegrationMethod(){};
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** checks to see if first RHS computation is needed */
virtual bool has_final_predictor() {return true;};
protected:
/** time filtering object */
TimeFilter * timeFilter_;
/** finite element velocity field */
DENS_MAN & velocity_;
/** finite element acceleration field */
DENS_MAN & acceleration_;
/** atomic nodal velocity field */
DENS_MAN & nodalAtomicVelocityOut_;
/** right-hand side of velocity equation */
DENS_MAN & velocityRhs_;
/** force at nodes from atomic quantities */
DENS_MAN & nodalAtomicForceOut_;
/** transfer for computing nodal atomic velocity */
DENS_MAN * nodalAtomicVelocity_;
private:
// DO NOT define this
MomentumIntegrationMethod();
};
/**
* @class ElasticTimeIntegratorVerlet
* @brief Verlet integration for FE elastic quantities. Uses the second order Verlet integration to update the finite element velocity and displacement fields, i.e. the same integration used for the atomic velocities and positions.
*/
class ElasticTimeIntegratorVerlet : public MomentumIntegrationMethod {
public:
// constructor
ElasticTimeIntegratorVerlet(MomentumTimeIntegrator * momentumTimeIntegrator);
// destructor
virtual ~ElasticTimeIntegratorVerlet(){};
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** pre time integration initialization of data */
virtual void initialize();
// time step methods, corresponding to ATC_Transfer
/** first part of mid_initial_integrate */
virtual void mid_initial_integrate1(double dt);
/** first part of post_initial_integrate */
virtual void post_initial_integrate1(double dt);
/** first part of pre_final_integrate */
virtual void pre_final_integrate1(double dt);
/** second part of post_final_integrate */
virtual void post_final_integrate2(double dt);
/** adds any contributions from time integrator to RHS */
virtual void add_to_rhs();
/** post processing step before output */
virtual void post_process();
/** add output data */
virtual void output(OUTPUT_LIST & outputData);
/** operations at end of a run */
virtual void finish();
protected:
/** finite element displacement field */
DENS_MAN & displacement_;
/** atomic nodal displacement field */
DENS_MAN & nodalAtomicDisplacementOut_;
/** filtered atomic force */
DENS_MAN & nodalAtomicForceFiltered_;
/** transfer for computing atomic displacement */
DENS_MAN * nodalAtomicDisplacement_;
/** transfer for computing nodal atomic force */
DENS_MAN * nodalAtomicForce_;
private:
// DO NOT define this
ElasticTimeIntegratorVerlet();
};
/**
* @class ElasticTimeIntegratorVerlet
* @brief Verlet integration for FE elastic quantities with time filtering
*/
class ElasticTimeIntegratorVerletFiltered : public ElasticTimeIntegratorVerlet {
public:
// constructor
ElasticTimeIntegratorVerletFiltered(MomentumTimeIntegrator * momentumTimeIntegrator);
// destructor
virtual ~ElasticTimeIntegratorVerletFiltered(){};
// time step methods, corresponding to ATC_Transfer
/** first part of mid_initial_integrate */
virtual void mid_initial_integrate1(double dt);
/** first part of post_initial_integrate */
virtual void post_initial_integrate1(double dt);
/** second part of post_final_integrate */
virtual void post_final_integrate2(double dt);
/** adds any contributions from time integrator to RHS */
virtual void add_to_rhs();
/** post processing step before output */
virtual void post_process(){};
/** add output data */
virtual void output(OUTPUT_LIST & outputData);
protected:
/** atomic nodal acceleration field */
DENS_MAN & nodalAtomicAcceleration_;
private:
// DO NOT define this
ElasticTimeIntegratorVerletFiltered();
};
/**
* @class ElasticTimeIntegratorFractionalStep
* @brief Class for using 2nd order Verlet integration to update FE contributions to momentum field
* (Uses same update for the atomic contributions to the finite
* elements as are used by the LAMMPS integration scheme
* for the atomic velocities and positions, i.e. Verlet.)
*/
class ElasticTimeIntegratorFractionalStep : public MomentumIntegrationMethod {
public:
// constructor
ElasticTimeIntegratorFractionalStep(MomentumTimeIntegrator * momentumTimeIntegrator);
// destructor
virtual ~ElasticTimeIntegratorFractionalStep() {};
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** pre time integration initialization of data */
virtual void initialize();
// time step methods, corresponding to ATC_Transfer
/** first part of pre_initial_integrate */
virtual void pre_initial_integrate1(double dt);
/** second part of mid_initial_integrate */
virtual void pre_initial_integrate2(double dt);
/** first part of mid_initial_integrate */
virtual void mid_initial_integrate1(double dt);
/** first part of post_initial_integrate */
virtual void post_initial_integrate1(double dt);
/** second part of post_final_integrate */
virtual void post_final_integrate2(double dt);
/** post processing step before output */
virtual void post_process();
/** finalize state of some unfiltered variables */
virtual void finish();
/** add output data */
virtual void output(OUTPUT_LIST & outputData);
protected:
// methods
/** compute old energy and temperature for use in time integrators */
virtual void compute_old_time_data();
/** computes temperature change associated with atomic energy change */
virtual void compute_velocity_delta(const DENS_MAT & atomicMomentumDelta,
double dt);
// data
/** finite element displacement field */
DENS_MAN & displacement_;
/** atomic nodal displacement field */
DENS_MAN & nodalAtomicDisplacementOut_;
/** equivalent nodal force due to atomic momentum change */
DENS_MAT nodalAtomicForce_;
/** filtered atomic force */
DENS_MAN & nodalAtomicForceFiltered_;
/** transfer for computing atomic momentum */
DENS_MAN * nodalAtomicMomentum_;
/** filtered atomic momentum */
DENS_MAN & nodalAtomicMomentumFiltered_;
/** transfer for computing atomic displacement */
DENS_MAN * nodalAtomicDisplacement_;
/** change in FE velocity due to atomic motions */
DENS_MAN atomicVelocityDelta_;
/** restricted atomic momentum from previous time step */
DENS_MAT nodalAtomicMomentumOld_;
/** FE atomic velocity contribution from previous time step */
DENS_MAT nodalAtomicVelocityOld_;
private:
// DO NOT define this
ElasticTimeIntegratorFractionalStep();
};
/**
* @class FluidsTimeIntegratorGear
* @brief Class for using 3rd order Gear integration to update FE contributions to momentum field
* and fractional step method for atomic contributions
*/
class FluidsTimeIntegratorGear : public MomentumIntegrationMethod {
public:
// constructor
FluidsTimeIntegratorGear(MomentumTimeIntegrator * MomentumTimeIntegrator);
// destructor
virtual ~FluidsTimeIntegratorGear() {};
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** pre time integration initialization of data */
virtual void initialize();
// time step methods, corresponding to ATC_Transfer
/** first part of pre_initial_integrate */
virtual void pre_initial_integrate1(double dt);
/** second part of pre_initial_integrate */
virtual void pre_initial_integrate2(double dt);
/** first part of pre_final_integrate */
virtual void pre_final_integrate1(double dt);
/** first part of post_final_integrate */
virtual void post_final_integrate1(double dt);
/** second part of post_final_integrate */
virtual void post_final_integrate2(double dt);
/** post processing step before output */
virtual void post_process();
/** finalize state of some unfiltered variables */
virtual void finish();
/** add output data */
virtual void output(OUTPUT_LIST & outputData);
protected:
// methods
/** applies Gear predictor */
virtual void apply_gear_predictor(double dt);
/** applies Gear corrector */
virtual void apply_gear_corrector(const DENS_MAT & R_theta,
double dt);
/** compute old energy and temperature for use in time integrators */
virtual void compute_old_time_data();
/** computes temperature change associated with atomic energy change */
virtual void compute_velocity_delta(const DENS_MAT & atomicMomentumDelta,
double dt);
// data
/** equivalent nodal force due to atomic momentum change */
DENS_MAT nodalAtomicForce_;
/** filtered atomic force */
DENS_MAN & nodalAtomicForceFiltered_;
/** transfer for computing atomic momentum */
DENS_MAN * nodalAtomicMomentum_;
/** filtered atomic momentum */
DENS_MAN & nodalAtomicMomentumFiltered_;
/** change in FE velocity due to atomic motions */
DENS_MAN atomicVelocityDelta_;
/** restricted atomic momentum from previous time step */
DENS_MAT nodalAtomicMomentumOld_;
/** FE atomic velocity contribution from previous time step */
DENS_MAT nodalAtomicVelocityOld_;
/** finite element velocity 2nd time derivative */
DENS_MAN & velocity2Roc_;
// workspace for gear integration
DENS_MAT _velocityResidual_;
private:
// DO NOT define this
FluidsTimeIntegratorGear();
};
};
#endif
diff --git a/lib/atc/ElectronChargeDensity.cpp b/lib/atc/ElectronChargeDensity.cpp
index 7090d1e07..69127a933 100644
--- a/lib/atc/ElectronChargeDensity.cpp
+++ b/lib/atc/ElectronChargeDensity.cpp
@@ -1,127 +1,131 @@
#include "ElectronChargeDensity.h"
#include "ATC_Error.h"
#include <iostream>
-#include <fstream>
+#include <vector>
using ATC_Utility::command_line;
using ATC_Utility::str2dbl;
using ATC_Utility::str2int;
+using std::fstream;
+using std::map;
+using std::string;
+using std::vector;
namespace ATC {
ElectronChargeDensityInterpolation::ElectronChargeDensityInterpolation(
fstream &fileId, map<string,double> & parameters)
: ElectronChargeDensity(), n_()
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
int npts = 0;
double coef = 1.;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
else if (line[0] == "scale") coef = str2dbl(line[1]);
else if (line[0] == "number_of_points") {
npts = str2int(line[1]);
n_.initialize(npts,fileId,coef);
}
}
}
ElectronChargeDensityLinear::ElectronChargeDensityLinear(
fstream &fileId, map<string,double> & parameters)
: ElectronChargeDensity()
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
double value = str2dbl(line[1]);
if (line[0] == "coefficient") {
C_ = value;
parameters["coefficient"] = C_;
}
}
}
ElectronChargeDensityExponential::ElectronChargeDensityExponential(
fstream &fileId, map<string,double> & parameters)
: ElectronChargeDensity(),
intrinsicConcentration_(0),
intrinsicEnergy_(0),
referenceTemperature_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
double value = str2dbl(line[1]);
if (line[0] == "intrinsic_concentration") {
intrinsicConcentration_ = value;
parameters["intrinsic_concentration"] = intrinsicConcentration_;
}
else if (line[0] == "intrinsic_energy") {
intrinsicEnergy_ = value;
parameters["intrinsic_energy"] = intrinsicEnergy_;
}
else if (line[0] == "reference_temperature") {
referenceTemperature_ = value;
parameters["reference_temperature"] = referenceTemperature_;
}
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
}
ElectronChargeDensityFermiDirac::ElectronChargeDensityFermiDirac(
fstream &fileId, map<string,double> & parameters)
: ElectronChargeDensity(),
Ef_(0),
referenceTemperature_(0),
Ed_(0), Nd_(0), Eb_(0),
hasReferenceTemperature_(false),
donorIonization_(false)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
double value = str2dbl(line[1]);
if (line[0] == "fermi_energy") {
Ef_ = value;
parameters["fermi_energy"] = Ef_;
}
else if (line[0] == "reference_temperature") {
hasReferenceTemperature_ = true;
referenceTemperature_ = value;
parameters["reference_temperature"] = referenceTemperature_;
}
else if (line[0] == "band_edge") {
Eb_ = value;
parameters["band_edge_potential"] = Eb_;
}
else if (line[0] == "donor_ionization_energy") {
donorIonization_ = true;
Ed_ = value;
parameters["donor_ionization_energy"] = Ed_;
}
else if (line[0] == "donor_concentration") {
donorIonization_ = true;
Nd_ = value;
parameters["donor_concentration"] = Nd_;
}
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
}
}
diff --git a/lib/atc/ElectronChargeDensity.h b/lib/atc/ElectronChargeDensity.h
index dd95e621c..a5288c0b1 100644
--- a/lib/atc/ElectronChargeDensity.h
+++ b/lib/atc/ElectronChargeDensity.h
@@ -1,272 +1,269 @@
#ifndef ELECTRON_DENSITY_H
#define ELECTRON_DENSITY_H
#include <map>
#include <string>
-
-using std::map;
-using std::string;
-
+#include <fstream>
#include "ATC_TypeDefs.h"
#include "Function.h"
const double tol = 1.e-8;
namespace ATC {
/**
* @class ElectronChargeDensity
* @brief Base class for models of extrinsic electric charges
*/
class ElectronChargeDensity
{
public:
ElectronChargeDensity() {};
virtual ~ElectronChargeDensity() {};
virtual bool electron_charge_density(const FIELD_MATS &fields,
DENS_MAT &flux) const { return false; };
virtual void D_electron_charge_density(const FieldName fieldName,
const FIELD_MATS &fields,
DENS_MAT &flux) const
{ throw ATC_Error("Charge density D_electron_charge_density unimplemented function");}
virtual void band_edge_potential(const FIELD_MATS &fields,
DENS_MAT &density) const
{ throw ATC_Error("Charge density band_edge_potential unimplemented function");}
};
//-----------------------------------------------------------------------
/**
* @class ElectronChargeDensityInterpolation
* @brief Class for models of electron charge density as a tabular function of electric potential
*/
class ElectronChargeDensityInterpolation : public ElectronChargeDensity
{
public:
- ElectronChargeDensityInterpolation(fstream &matfile,map<string,double> & parameters);
+ ElectronChargeDensityInterpolation(std::fstream &matfile,std::map<std::string,double> & parameters);
virtual ~ElectronChargeDensityInterpolation() {};
virtual bool electron_charge_density(const FIELD_MATS &fields,
DENS_MAT &flux) const
{
FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL);
const DENS_MAT & phi = phi_field->second;
int nNodes = phi.nRows();
flux.reset(nNodes,1,false);
for (int i = 0; i < nNodes; i++) { // a mapping of a vector
flux(i,0) = n_.f(phi(i,0));
}
flux *= -1.;
return true;
};
virtual void D_electron_charge_density(const FieldName field,
const FIELD_MATS &fields,
DENS_MAT &coef) const
{
FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL);
const DENS_MAT & phi = phi_field->second;
int nNodes = phi.nRows();
coef.reset(nNodes,1,false);
for (int i = 0; i < nNodes; i++) {
coef(i,0) = n_.dfdt(phi(i,0));
coef(i,0) = n_.dfdt(phi(i,0));
}
coef *= -1.;
}
private:
InterpolationFunction n_;
};
//-----------------------------------------------------------------------
/**
* @class ElectronChargeDensityLinear
* @brief Class for models of electron charge density proportional to electric potential
*/
class ElectronChargeDensityLinear : public ElectronChargeDensity
{
public:
- ElectronChargeDensityLinear(fstream &matfile,map<string,double> & parameters);
+ ElectronChargeDensityLinear(std::fstream &matfile,std::map<std::string,double> & parameters);
virtual ~ElectronChargeDensityLinear() {};
virtual bool electron_charge_density(const FIELD_MATS &fields,
DENS_MAT &flux) const
{
FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL);
flux = phi_field->second;
flux *= -C_;
return true;
};
virtual void D_electron_charge_density(const FieldName field,
const FIELD_MATS &fields,
DENS_MAT &coef) const
{
FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL);
const DENS_MAT & phi = phi_field->second;
int nNodes = phi.nRows();
coef.reset(nNodes,1,false);
coef = -C_;
}
private:
double C_;
};
//-----------------------------------------------------------------------
/**
* @class ElectronChargeDensityExponential
* @brief Class for models of electron charge density dependent on difference between electric potential and the Fermi level n = n_i exp ( (phi-E_i) / kB T)
*/
class ElectronChargeDensityExponential : public ElectronChargeDensity
{
public:
- ElectronChargeDensityExponential(fstream &matfile,map<string,double> & parameters);
+ ElectronChargeDensityExponential(std::fstream &matfile,std::map<std::string,double> & parameters);
virtual ~ElectronChargeDensityExponential() {};
double n(const double phi, double T) const
{
return -intrinsicConcentration_*exp((phi-intrinsicEnergy_)/(kBeV_*T));
}
double dndphi(const double phi, double T) const
{
return n(phi,T)/(kBeV_*T);
}
virtual bool electron_charge_density(const FIELD_MATS &fields,
DENS_MAT &density) const
{
FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL);
FIELD_MATS::const_iterator T_field = fields.find(TEMPERATURE);
double T = 300;
bool hasTref = (referenceTemperature_ > 0 );
const DENS_MAT & phi = phi_field->second;
int nNodes = phi.nRows();
density.resize(nNodes,1);
if (hasTref) {
T = referenceTemperature_;
for (int i = 0; i < nNodes; i++) {
density(i,0) = n(phi(i,0),T); }
}
else {
const DENS_MAT & temp = T_field->second;
for (int i = 0; i < nNodes; i++) {
density(i,0) = n(phi(i,0),temp(i,0)); }
}
density *= -1.;
return true;
};
virtual void D_electron_charge_density(const FieldName field,
const FIELD_MATS &fields,
DENS_MAT &coef) const
{
FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL);
FIELD_MATS::const_iterator T_field = fields.find(TEMPERATURE);
double T = 300;
bool hasTref = (referenceTemperature_ > 0 );
const DENS_MAT & phi = phi_field->second;
int nNodes = phi.nRows();
coef.resize(nNodes,1);
if (hasTref) {
T = referenceTemperature_;
for (int i = 0; i < nNodes; i++) {
coef(i,0) = dndphi(phi(i,0),T); }
}
else {
const DENS_MAT & temp = T_field->second;
for (int i = 0; i < nNodes; i++) {
coef(i,0) = dndphi(phi(i,0),temp(i,0)); }
}
coef *= -1.;
};
protected:
double intrinsicConcentration_,intrinsicEnergy_;
double referenceTemperature_;
};
//-----------------------------------------------------------------------
/**
* @class ElectronChargeDensityFermiDirac
* @brief Class for models of electron charge density based on Fermi-Dirac statistics
*/
class ElectronChargeDensityFermiDirac : public ElectronChargeDensity
{
public:
- ElectronChargeDensityFermiDirac(fstream &matfile,map<string,double> & parameters);
+ ElectronChargeDensityFermiDirac(std::fstream &matfile,std::map<std::string,double> & parameters);
virtual ~ElectronChargeDensityFermiDirac() {};
double fermi_dirac(const double E, const double T) const
{
double f = 1.0;
if (T > 0) f = 1.0 / ( exp((E-Ef_)/kBeV_/T)+1.0 );
else if (E > Ef_) f = 0;
return f;
};
virtual bool electron_charge_density(const FIELD_MATS &fields,
DENS_MAT &density) const
{
// psi : the inhomogeneous solution
FIELD_MATS::const_iterator psi_field = fields.find(ELECTRON_WAVEFUNCTION);
const DENS_MAT & psi = psi_field->second;
FIELD_MATS::const_iterator psis_field = fields.find(ELECTRON_WAVEFUNCTIONS);
// if (psis_field==fields.end())
//throw ATC_Error("Wavefunctions not defined");
const DENS_MAT & psis = psis_field->second;
FIELD_MATS::const_iterator E_field = fields.find(ELECTRON_WAVEFUNCTION_ENERGIES);
const DENS_MAT & Es = E_field->second;
FIELD_MATS::const_iterator T_field = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & Ts = T_field->second;
FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL);
const DENS_MAT & phi = phi_field->second;
int nNodes = psi.nRows();
density.reset(nNodes,1);
double T = referenceTemperature_;
int count = 0;
for (int i = 0; i < nNodes; i++) {
if (!hasReferenceTemperature_) { T = Ts(i,0); }
int j = 0;
for (j = 0; j < psis.nCols(); j++) {
double E = Es(j,0); // Eigenvalue
double f = fermi_dirac(E,T);
if (f < tol) break;
else count++;
density(i,0) -= psis(i,j)*psis(i,j)*f; // < 0
}
if (donorIonization_) {
double E = -1.0* phi(i,0);// units [eV] E = - |e| phi
if ( E + Eb_ > Ef_+Ed_) density(i,0) += Nd_; // > 0
}
}
return true;
};
virtual void D_electron_charge_density(const FieldName fieldName,
const FIELD_MATS &fields,
DENS_MAT &coef) const
{
FIELD_MATS::const_iterator phi_field = fields.find(ELECTRIC_POTENTIAL);
const DENS_MAT & phi = phi_field->second;
int nNodes = phi.nRows();
coef.reset(nNodes,1,false);
}
virtual void band_edge_potential(const FIELD_MATS &fields,
DENS_MAT &density) const
{
FIELD_MATS::const_iterator p_field = fields.find(ELECTRIC_POTENTIAL);
const DENS_MAT & phi = p_field->second;
int nNodes = phi.nRows();
density.reset(nNodes,1,false);
density = Eb_;
};
protected:
double Ef_;
double referenceTemperature_;
double Ed_, Nd_;
double Eb_;
bool hasReferenceTemperature_, donorIonization_;
};
}
#endif
diff --git a/lib/atc/ElectronDragPower.cpp b/lib/atc/ElectronDragPower.cpp
index 8763aa457..b6bb45224 100644
--- a/lib/atc/ElectronDragPower.cpp
+++ b/lib/atc/ElectronDragPower.cpp
@@ -1,71 +1,75 @@
#include "ElectronDragPower.h"
#include "Material.h"
#include "ATC_Error.h"
#include <iostream>
-#include <fstream>
+#include <vector>
using ATC_Utility::command_line;
using ATC_Utility::str2dbl;
+using std::map;
+using std::string;
+using std::fstream;
+using std::vector;
namespace ATC {
ElectronDragPowerLinear::ElectronDragPowerLinear(fstream &fileId,
map<string,double> & parameters,
Material * material)
: ElectronDragPower(),
electronDragInvTau_(0),
material_(material)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") break;
double value = str2dbl(line[1]);
if (line[0] == "inv_momentum_relaxation_time") {
electronDragInvTau_ = value;
parameters["inv_momentum_relaxation_time"] = electronDragInvTau_;
}
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
}
bool ElectronDragPowerLinear::electron_drag_power(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT & flux)
{
FIELD_MATS::const_iterator evField = fields.find(ELECTRON_VELOCITY);
const DENS_MAT & v = evField->second;
// -1/tau (m_e * n * v)
electron_drag_velocity_coefficient(fields,dragCoefWorkspace_);
for (int i = 0; i < v.nRows(); i++) {
double velocityMagnitude = 0.;
for (int j = 0; j < v.nCols(); j++)
velocityMagnitude -= v(i,j)*v(i,j);
flux(i,0) += velocityMagnitude*dragCoefWorkspace_(i,0); // adds flux to phonon temperature
}
return true;
}
void ElectronDragPowerLinear::electron_drag_velocity_coefficient(const FIELD_MATS &fields,
DENS_MAT & dragCoef)
{
FIELD_MATS::const_iterator enField = fields.find(ELECTRON_DENSITY);
const DENS_MAT & n = enField->second;
// -1/tau (m_e * n)
material_->inv_effective_mass(fields,invEffMassWorkspace_);
dragCoef = n;
dragCoef /= invEffMassWorkspace_;
dragCoef *= -electronDragInvTau_;
}
}
diff --git a/lib/atc/ElectronDragPower.h b/lib/atc/ElectronDragPower.h
index 3c19c7da4..92103fe3e 100644
--- a/lib/atc/ElectronDragPower.h
+++ b/lib/atc/ElectronDragPower.h
@@ -1,73 +1,71 @@
#ifndef ELECTRON_DRAG_POWER_H
#define ELECTRON_DRAG_POWER_H
#include <map>
#include <string>
-
-using std::map;
-using std::string;
+#include <fstream>
#include "Material.h"
#include "ATC_TypeDefs.h"
namespace ATC {
/**
* @class ElectronDragPower
* @brief Base class for defining the lattice drag power from electrons
*/
class ElectronDragPower
{
public:
ElectronDragPower() {};
virtual ~ElectronDragPower() {};
/** computes drag power */
virtual bool electron_drag_power(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT & flux)
{
return false;
};
virtual void electron_drag_velocity_coefficient(const FIELD_MATS &fields,
DENS_MAT & dragCoef)
{
FIELD_MATS::const_iterator t_field = fields.find(TEMPERATURE);
dragCoef.reset((t_field->second).nRows(),1); // zero out matrix, resize if necessary
};
};
//-------------------------------------------------------------------
/**
* @class ElectronDragPowerLinear
* @brief Class for electron drag that linearly depends on the difference between the electron and lattice velocities
*/
class ElectronDragPowerLinear : public ElectronDragPower
{
public:
- ElectronDragPowerLinear(fstream &matfile,
- map<string,double> & parameters,
+ ElectronDragPowerLinear(std::fstream &matfile,
+ std::map<std::string,double> & parameters,
Material * material_);
virtual ~ElectronDragPowerLinear() {};
virtual bool electron_drag_power(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT & flux);
virtual void electron_drag_velocity_coefficient(const FIELD_MATS &fields,
DENS_MAT & dragCoef);
protected:
double electronDragInvTau_;
Material * material_;
// used to avoid unnecessary resizing
DENS_MAT dragCoefWorkspace_;
DENS_MAT invEffMassWorkspace_;
};
}
#endif
diff --git a/lib/atc/ElectronFlux.cpp b/lib/atc/ElectronFlux.cpp
index 06dae4c72..8ae8503a3 100644
--- a/lib/atc/ElectronFlux.cpp
+++ b/lib/atc/ElectronFlux.cpp
@@ -1,94 +1,101 @@
#include "ElectronFlux.h"
#include "ATC_Error.h"
#include <iostream>
#include <fstream>
+#include <map>
+#include <string>
+#include <vector>
using ATC_Utility::command_line;
using ATC_Utility::str2dbl;
+using std::fstream;
+using std::map;
+using std::string;
+using std::vector;
namespace ATC {
ElectronFlux::ElectronFlux() :
maskX_(false),maskY_(false),maskZ_(false)
{}
ElectronFluxLinear::ElectronFluxLinear(
fstream &fileId, map<string,double> & parameters)
: ElectronFlux(),
electronMobility_(0),
electronDiffusivity_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
double value = str2dbl(line[1]);
if (line[0] == "mobility") {
electronMobility_ = value;
parameters["electron_mobility"] = electronMobility_;
}
else if (line[0] == "diffusivity") {
electronDiffusivity_ = value;
parameters["electron_diffusivity"] = electronDiffusivity_;
}
else if (line[0] == "mask_x") { maskX_ = true; }
else if (line[0] == "mask_y") { maskY_ = true; }
else if (line[0] == "mask_z") { maskZ_ = true; }
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
}
ElectronFluxThermopower::ElectronFluxThermopower(
fstream &fileId, map<string,double> & parameters)
: ElectronFlux(),
electronMobility_(0),
seebeckCoef_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
double value = str2dbl(line[1]);
if (line[0] == "mobility") {
electronMobility_ = value;
parameters["electron_mobility"] = electronMobility_;
}
else if (line[0] == "seebeck") {
seebeckCoef_ = value;
parameters["seebeck_coefficient"] = seebeckCoef_;
}
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
}
ElectronFluxConvection::ElectronFluxConvection(
fstream &fileId, map<string,double> & parameters)
: ElectronFlux()
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
else if (line[0] == "mask_x") { maskX_ = true; }
else if (line[0] == "mask_y") { maskY_ = true; }
else if (line[0] == "mask_z") { maskZ_ = true; }
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
}
}
diff --git a/lib/atc/ElectronFlux.h b/lib/atc/ElectronFlux.h
index 47595b775..c40ea475b 100644
--- a/lib/atc/ElectronFlux.h
+++ b/lib/atc/ElectronFlux.h
@@ -1,228 +1,224 @@
#ifndef ELECTRON_FLUX_H
#define ELECTRON_FLUX_H
#include <map>
#include <string>
-
-using std::map;
-using std::string;
-
#include "ATC_TypeDefs.h"
namespace ATC {
/**
* @class ElectronFlux
* @brief Base class for the flux appearing in the electron density transport equation
*/
class ElectronFlux
{
public:
ElectronFlux();
virtual ~ElectronFlux() {};
/** computes flux */
virtual void electron_flux(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux)
{
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & etMat = etField->second;
zeroWorkspace_.reset(etMat.nRows(),etMat.nCols());
flux[0] = zeroWorkspace_;
flux[1] = zeroWorkspace_;
flux[2] = zeroWorkspace_;
};
void electron_convection(const FIELD_MATS &fields,
DENS_MAT_VEC &flux)
{
FIELD_MATS::const_iterator edField = fields.find(ELECTRON_DENSITY);
FIELD_MATS::const_iterator evField = fields.find(ELECTRON_VELOCITY);
const DENS_MAT & n = edField->second;
const DENS_MAT & v = evField->second;
const CLON_VEC vx(v,CLONE_COL,0);
const CLON_VEC vy(v,CLONE_COL,1);
const CLON_VEC vz(v,CLONE_COL,2);
zeroWorkspace_.reset(v.nRows(),1);
if (maskX_) {
flux[0] = zeroWorkspace_;
}
else {
flux[0] = vx;
flux[0] *= n; // scale by n
}
if (maskY_) {
flux[1] = zeroWorkspace_;
}
else {
flux[1] = vy;
flux[1] *= n;
}
if (maskZ_) {
flux[2] = zeroWorkspace_;
}
else {
flux[2] = vz;
flux[2] *= n;
}
};
protected:
bool maskX_, maskY_, maskZ_;
DENS_MAT zeroWorkspace_;
};
//-----------------------------------------------------------------------
/**
* @class ElectronFluxLinear
* @brief Class for drift-diffusion electron flux with linear dependency on the electron density gradient
*/
class ElectronFluxLinear : public ElectronFlux
{
public:
- ElectronFluxLinear(fstream &matfile, map<string,double> & parameters);
+ ElectronFluxLinear(std::fstream &matfile, std::map<std::string,double> & parameters);
virtual ~ElectronFluxLinear() {};
virtual void electron_flux(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux)
{
FIELD_MATS::const_iterator edField = fields.find(ELECTRON_DENSITY);
GRAD_FIELD_MATS::const_iterator dEdField = gradFields.find(ELECTRON_DENSITY);
GRAD_FIELD_MATS::const_iterator dPhiField = gradFields.find(ELECTRIC_POTENTIAL);
// J_n = - \mu n grad \phi - D grad n
const DENS_MAT & n = edField->second;
const DENS_MAT_VEC & dn = dEdField->second;
const DENS_MAT_VEC & dphi = dPhiField->second;
//n.print("DENSITY");
//for (int i = 0; i < 3; i++) {
// dn[i].print("GRAD N");
// dphi[i].print("GRAD PHI");
//}
//cout << "------------------------------------------------====\n";
flux[0] = n;
flux[1] = n;
flux[2] = n;
if (maskX_)
flux[0] = 0.;
else {
flux[0] *= -electronMobility_*dphi[0]; // scale by n to get : -n \mu grad(\phi)
flux[0] += -electronDiffusivity_* dn[0];
}
if (maskY_)
flux[1] = 0.;
else {
flux[1] *= -electronMobility_* dphi[1] ;
flux[1] += -electronDiffusivity_* dn[1];
}
if (maskZ_)
flux[2] = 0.;
else {
flux[2] *= -electronMobility_*dphi[2];
flux[2] += -electronDiffusivity_* dn[2];
}
};
protected:
double electronMobility_, electronDiffusivity_;
};
//-----------------------------------------------------------------------
/**
* @class ElectronFluxThermopower
* @brief Class for defining the electron flux (i.e., current) to include the elctron velocity or have a electron temperature-dependent mobility
*/
class ElectronFluxThermopower : public ElectronFlux
{
public:
- ElectronFluxThermopower(fstream &matfile,map<string,double> & parameters);
+ ElectronFluxThermopower(std::fstream &matfile,std::map<std::string,double> & parameters);
virtual ~ElectronFluxThermopower() {};
virtual void electron_flux(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux)
{
if (fields.find(ELECTRON_VELOCITY)!=fields.end()) {
// J_n = - e n v, note the electron charge e is unity
electron_convection(fields,flux);
flux[0] *= -1;
flux[1] *= -1;
flux[2] *= -1;
}
else {
FIELD_MATS::const_iterator edField = fields.find(ELECTRON_DENSITY);
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
GRAD_FIELD_MATS::const_iterator dEdField = gradFields.find(ELECTRON_VELOCITY);
GRAD_FIELD_MATS::const_iterator dPhiField = gradFields.find(ELECTRIC_POTENTIAL);
GRAD_FIELD_MATS::const_iterator dEtField = gradFields.find(ELECTRON_TEMPERATURE);
// J_n = - \mu n grad \phi - \mu kB/e T_e grad n
// - \mu S n grad T_e - \mu kB/e n grad T_e
const DENS_MAT & n = edField->second;
const DENS_MAT_VEC & dn = dEdField->second;
const DENS_MAT_VEC & dphi = dPhiField->second;
const DENS_MAT_VEC & dT = dEtField->second;
flux[0] = -electronMobility_*dphi[0];
flux[1] = -electronMobility_*dphi[1];
flux[2] = -electronMobility_*dphi[2];
double coef = -electronMobility_*(seebeckCoef_ + kBeV_);
flux[0] += coef* dT[0];
flux[1] += coef* dT[1];
flux[2] += coef* dT[2];
flux[0] *= n; // scale by n
flux[1] *= n;
flux[2] *= n;
//GRAD_FIELD tmp = dn;
const DENS_MAT & Te = etField->second;
//tmp[0] *= Te;
//tmp[1] *= Te;
//tmp[2] *= Te;
coef = -electronMobility_*kBeV_;
//flux[0] += tmp[0];
flux[0] += dn[0].mult_by_element(Te);
flux[1] += dn[1].mult_by_element(Te);
flux[2] += dn[2].mult_by_element(Te);
}
};
protected:
double electronMobility_, seebeckCoef_;
};
//-----------------------------------------------------------------------
/**
* @class ElectronFluxConvection
* @brief Class for electron flux based on the standard convection term
*/
class ElectronFluxConvection : public ElectronFlux
{
public:
- ElectronFluxConvection(fstream &matfile,map<string,double> & parameters);
+ ElectronFluxConvection(std::fstream &matfile,std::map<std::string,double> & parameters);
virtual ~ElectronFluxConvection() {};
virtual void electron_flux(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux)
{
// flux = n v
electron_convection(fields,flux);
};
};
}
#endif
diff --git a/lib/atc/ElectronHeatCapacity.cpp b/lib/atc/ElectronHeatCapacity.cpp
index b4b731ac3..aafaa3c37 100644
--- a/lib/atc/ElectronHeatCapacity.cpp
+++ b/lib/atc/ElectronHeatCapacity.cpp
@@ -1,73 +1,78 @@
#include "ElectronHeatCapacity.h"
#include "ATC_Error.h"
#include <iostream>
#include <fstream>
+#include <vector>
using ATC_Utility::command_line;
using ATC_Utility::str2dbl;
+using std::fstream;
+using std::map;
+using std::string;
+using std::vector;
namespace ATC {
ElectronHeatCapacityConstant::ElectronHeatCapacityConstant(
fstream &fileId, map<string,double> & parameters)
: ElectronHeatCapacity(),
electronHeatCapacity_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
else if (line[0] == "capacity") {
electronHeatCapacity_ = str2dbl(line[1]);
parameters["electron_heat_capacity"] = electronHeatCapacity_;
}
else {
throw ATC_Error( "unrecognized material function:" + line[0]);
}
}
}
ElectronHeatCapacityLinear::ElectronHeatCapacityLinear(
fstream &fileId, map<string,double> & parameters)
: ElectronHeatCapacity(),
electronHeatCapacity_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
else if (line[0] == "capacity") {
electronHeatCapacity_ = str2dbl(line[1]);
parameters["electron_heat_capacity"] = electronHeatCapacity_;
}
else {
throw ATC_Error( "unrecognized material function: " + line[0]);
}
}
}
ElectronHeatCapacityConstantAddDensity::ElectronHeatCapacityConstantAddDensity(fstream &fileId,
map<string,double> & parameters,
Material * material)
: ElectronHeatCapacityConstant(fileId, parameters),
material_(material)
{
// do nothing
}
ElectronHeatCapacityLinearAddDensity::ElectronHeatCapacityLinearAddDensity(fstream &fileId,
map<string,double> & parameters,
Material * material)
: ElectronHeatCapacityLinear(fileId, parameters),
material_(material)
{
// do nothing
}
}
diff --git a/lib/atc/ElectronHeatCapacity.h b/lib/atc/ElectronHeatCapacity.h
index 9285f8c4f..aefc3d681 100644
--- a/lib/atc/ElectronHeatCapacity.h
+++ b/lib/atc/ElectronHeatCapacity.h
@@ -1,229 +1,225 @@
#ifndef ELECTRON_HEAT_CAPACITY_H
#define ELECTRON_HEAT_CAPACITY_H
#include <map>
#include <string>
-
-using std::map;
-using std::string;
-
#include "ATC_TypeDefs.h"
#include "Material.h"
namespace ATC {
/**
* @class ElectronHeatCapacity
* @brief Base class for defining the heat capcity of the electron gas
*/
class ElectronHeatCapacity
{
public:
ElectronHeatCapacity() {};
virtual ~ElectronHeatCapacity() {};
/** computes heat capacity */
virtual void electron_heat_capacity(const FIELD_MATS &fields,
DENS_MAT &capacity)=0;
/** derivative of electron heat capacity */
virtual void D_electron_heat_capacity(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC & Dcapacity)=0;
/** computes thermal energy */
virtual void electron_thermal_energy(const FIELD_MATS &fields,
DENS_MAT &energy)=0;
};
//-------------------------------------------------------------------
/**
* @class ElectronHeatCapacityConstant
* @brief Class for a constant electron heat capacity
*/
class ElectronHeatCapacityConstant : public ElectronHeatCapacity
{
public:
- ElectronHeatCapacityConstant(fstream &matfile,
- map<string,double> & parameters);
+ ElectronHeatCapacityConstant(std::fstream &matfile,
+ std::map<std::string,double> & parameters);
virtual ~ElectronHeatCapacityConstant() {};
virtual void electron_heat_capacity(const FIELD_MATS &fields,
DENS_MAT &capacity)
{
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & T = etField->second;
capacity.resize(T.nRows(),T.nCols());
capacity = electronHeatCapacity_;
};
virtual void D_electron_heat_capacity(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC & Dcapacity)
{
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
zeroWorkspace_.reset((etField->second).nRows(),(etField->second).nCols());
Dcapacity[0] = zeroWorkspace_;
Dcapacity[1] = zeroWorkspace_;
Dcapacity[2] = zeroWorkspace_;
}
virtual void electron_thermal_energy(const FIELD_MATS &fields,
DENS_MAT &energy)
{
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & T = etField->second;
energy = electronHeatCapacity_ * T;
};
protected:
double electronHeatCapacity_;
DENS_MAT zeroWorkspace_;
};
//-------------------------------------------------------------------
/**
* @class ElectronHeatCapacityLinear
* @brief Class for an electron capacity that is directly proportional to the electron temperature
*/
class ElectronHeatCapacityLinear : public ElectronHeatCapacity
{
public:
- ElectronHeatCapacityLinear(fstream &matfile,
- map<string,double> & parameters);
+ ElectronHeatCapacityLinear(std::fstream &matfile,
+ std::map<std::string,double> & parameters);
virtual ~ElectronHeatCapacityLinear() {};
virtual void electron_heat_capacity(const FIELD_MATS &fields,
DENS_MAT &capacity)
{
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & T = etField->second;
capacity = electronHeatCapacity_*T;
};
virtual void D_electron_heat_capacity(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &Dcapacity)
{
GRAD_FIELD_MATS::const_iterator dEtField = gradFields.find(ELECTRON_TEMPERATURE);
const DENS_MAT_VEC & dT = dEtField->second;
Dcapacity[0] = electronHeatCapacity_ * dT[0];
Dcapacity[1] = electronHeatCapacity_ * dT[1];
Dcapacity[2] = electronHeatCapacity_ * dT[2];
}
virtual void electron_thermal_energy(const FIELD_MATS &fields,
DENS_MAT &energy)
{
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & T = etField->second;
energy = electronHeatCapacity_ * T;
energy *= T;
};
protected:
double electronHeatCapacity_;
};
//-------------------------------------------------------------------
/**
* @class ElectronHeatCapacityConstantAddDensity
* @brief Class for a constant electron specific heat capacity (i.e, does not include the electron density)
*/
class ElectronHeatCapacityConstantAddDensity : public ElectronHeatCapacityConstant
{
public:
- ElectronHeatCapacityConstantAddDensity(fstream &matfile,
- map<string,double> & parameters,
+ ElectronHeatCapacityConstantAddDensity(std::fstream &matfile,
+ std::map<std::string,double> & parameters,
Material * material);
virtual ~ElectronHeatCapacityConstantAddDensity() {};
virtual void electron_heat_capacity(const FIELD_MATS &fields,
DENS_MAT &capacity)
{
ElectronHeatCapacityConstant::electron_heat_capacity(fields,capacity);
FIELD_MATS::const_iterator edField = fields.find(ELECTRON_DENSITY);
const DENS_MAT & density = edField->second;
capacity = capacity.mult_by_element(density);
};
virtual void D_electron_heat_capacity(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &Dcapacity)
{
ElectronHeatCapacityConstant::D_electron_heat_capacity(fields,gradFields,Dcapacity);
FIELD_MATS::const_iterator edField = fields.find(ELECTRON_DENSITY);
const DENS_MAT & density = edField->second;
Dcapacity[0] *= density;
Dcapacity[1] *= density;
Dcapacity[2] *= density;
GRAD_FIELD_MATS::const_iterator dEdField = gradFields.find(ELECTRON_DENSITY);
const DENS_MAT_VEC & Ddensity = dEdField->second;
ElectronHeatCapacityConstant::electron_heat_capacity(fields,capacityMat_);
Dcapacity[0] += Ddensity[0].mult_by_element(capacityMat_);
Dcapacity[1] += Ddensity[1].mult_by_element(capacityMat_);
Dcapacity[2] += Ddensity[2].mult_by_element(capacityMat_);
}
virtual void electron_thermal_energy(const FIELD_MATS &fields,
DENS_MAT &energy)
{
ElectronHeatCapacityConstant::electron_thermal_energy(fields,energy);
FIELD_MATS::const_iterator edField = fields.find(ELECTRON_DENSITY);
const DENS_MAT & density = edField->second;
energy *= density;
};
protected:
Material * material_;
DENS_MAT capacityMat_; // avoid resizing if possible
};
//-------------------------------------------------------------------
/**
* @class ElectronHeatCapacityLinearAddDensity
* @brief Class for a electron specific heat capacity that is proportional to the temperature (i.e., does not include density)
*/
class ElectronHeatCapacityLinearAddDensity : public ElectronHeatCapacityLinear
{
public:
- ElectronHeatCapacityLinearAddDensity(fstream &matfile,
- map<string,double> & parameters,
+ ElectronHeatCapacityLinearAddDensity(std::fstream &matfile,
+ std::map<std::string,double> & parameters,
Material * material);
virtual ~ElectronHeatCapacityLinearAddDensity() {};
virtual void electron_heat_capacity(const FIELD_MATS &fields,
DENS_MAT &capacity)
{
ElectronHeatCapacityLinear::electron_heat_capacity(fields,capacity);
FIELD_MATS::const_iterator edField = fields.find(ELECTRON_DENSITY);
const DENS_MAT & density = edField->second;
capacity *= density;
};
virtual void D_electron_heat_capacity(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &Dcapacity)
{
ElectronHeatCapacityLinear::D_electron_heat_capacity(fields,gradFields,Dcapacity);
FIELD_MATS::const_iterator edField = fields.find(ELECTRON_DENSITY);
const DENS_MAT & density = edField->second;
Dcapacity[0] *= density;
Dcapacity[1] *= density;
Dcapacity[2] *= density;
GRAD_FIELD_MATS::const_iterator dEdField = gradFields.find(ELECTRON_DENSITY);
const DENS_MAT_VEC & Ddensity = dEdField->second;
ElectronHeatCapacityLinear::electron_heat_capacity(fields,capacityWorkspace_);
Dcapacity[0] += Ddensity[0].mult_by_element(capacityWorkspace_);
Dcapacity[1] += Ddensity[1].mult_by_element(capacityWorkspace_);
Dcapacity[2] += Ddensity[2].mult_by_element(capacityWorkspace_);
}
virtual void electron_thermal_energy(const FIELD_MATS &fields,
DENS_MAT &energy)
{
ElectronHeatCapacityLinear::electron_thermal_energy(fields,energy);
FIELD_MATS::const_iterator edField = fields.find(ELECTRON_DENSITY);
const DENS_MAT & density = edField->second;
energy *= density;
};
protected:
Material * material_;
DENS_MAT capacityWorkspace_; // avoid resizing if possible
};
}
#endif
diff --git a/lib/atc/ElectronHeatFlux.cpp b/lib/atc/ElectronHeatFlux.cpp
index fae193e3a..fbe3d0d51 100644
--- a/lib/atc/ElectronHeatFlux.cpp
+++ b/lib/atc/ElectronHeatFlux.cpp
@@ -1,90 +1,95 @@
#include "ElectronHeatFlux.h"
#include "ATC_Error.h"
#include <iostream>
#include <fstream>
+#include <vector>
using ATC_Utility::command_line;
using ATC_Utility::str2dbl;
+using std::fstream;
+using std::map;
+using std::string;
+using std::vector;
namespace ATC {
ElectronHeatFlux::ElectronHeatFlux(ElectronHeatCapacity * electronHeatCapacity)
:
electronHeatCapacity_(electronHeatCapacity)
{
// do nothing
}
ElectronHeatFluxLinear::ElectronHeatFluxLinear(fstream &fileId, map<string,double> & parameters,
ElectronHeatCapacity * electronHeatCapacity)
: ElectronHeatFlux(electronHeatCapacity),
conductivity_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
else if (line[0] == "conductivity") {
conductivity_ = str2dbl(line[1]);
parameters["electron_thermal_conductivity"] = conductivity_;
}
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
}
ElectronHeatFluxPowerLaw::ElectronHeatFluxPowerLaw(fstream &fileId, map<string,double> & parameters,
ElectronHeatCapacity * electronHeatCapacity)
: ElectronHeatFlux(electronHeatCapacity),
conductivity_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
else if (line[0] == "conductivity") {
conductivity_ = str2dbl(line[1]);
parameters["electron_thermal_conductivity"] = conductivity_;
}
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
}
ElectronHeatFluxThermopower::ElectronHeatFluxThermopower(
fstream &fileId, map<string,double> & parameters,
/*const*/ ElectronFlux * electronFlux,
ElectronHeatCapacity * electronHeatCapacity)
: ElectronHeatFlux(electronHeatCapacity),
conductivity_(0),
seebeckCoef_(0),
electronFlux_(electronFlux)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
double value = str2dbl(line[1]);
if (line[0] == "conductivity") {
conductivity_ = value;
parameters["electron_thermal_conductivity"] = conductivity_;
}
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
seebeckCoef_ = parameters["seebeck_coefficient"];
}
}
}
diff --git a/lib/atc/ElectronHeatFlux.h b/lib/atc/ElectronHeatFlux.h
index deb26d318..12a68fed7 100644
--- a/lib/atc/ElectronHeatFlux.h
+++ b/lib/atc/ElectronHeatFlux.h
@@ -1,182 +1,178 @@
#ifndef ELECTRON_HEAT_FLUX_H
#define ELECTRON_HEAT_FLUX_H
#include <map>
#include <string>
-
-using std::map;
-using std::string;
-
#include "ATC_TypeDefs.h"
#include "ElectronFlux.h"
#include "ElectronHeatCapacity.h"
namespace ATC {
/**
* @class ElectronHeatFlux
* @brief Base class for the electron heat flux
*/
class ElectronHeatFlux
{
public:
ElectronHeatFlux(/*const*/ ElectronHeatCapacity * electronHeatCapacity = NULL);
virtual ~ElectronHeatFlux() {};
/** computes heat flux */
virtual void electron_heat_flux(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux)
{
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & Te = etField->second;
zeroWorkspace_.reset(Te.nRows(),Te.nCols());
flux[0] = zeroWorkspace_;
flux[1] = zeroWorkspace_;
flux[2] = zeroWorkspace_;
};
void electron_heat_convection(const FIELD_MATS &fields,
DENS_MAT_VEC & flux)
{
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
FIELD_MATS::const_iterator evField = fields.find(ELECTRON_VELOCITY);
const DENS_MAT & Te = etField->second;
const DENS_MAT & v = evField->second;
electronHeatCapacity_->electron_heat_capacity(fields,cpTeWorkspace_);
cpTeWorkspace_ *= Te;
const CLON_VEC vx(v,CLONE_COL,0);
const CLON_VEC vy(v,CLONE_COL,1);
const CLON_VEC vz(v,CLONE_COL,2);
flux[0] = vx;
flux[1] = vy;
flux[2] = vz;
// scale by thermal energy
flux[0] *= cpTeWorkspace_;
flux[1] *= cpTeWorkspace_;
flux[2] *= cpTeWorkspace_;
};
protected:
ElectronHeatCapacity * electronHeatCapacity_;
DENS_MAT zeroWorkspace_;
DENS_MAT cpTeWorkspace_; // hopefully avoid resizing
};
//-----------------------------------------------------------------------
/**
* @class ElectronHeatFluxLinear
* @brief Class for an electron heat flux proportional to the temperature gradient with constant conductivity
*/
class ElectronHeatFluxLinear : public ElectronHeatFlux
{
public:
- ElectronHeatFluxLinear(fstream &matfile,map<string,double> & parameters,
+ ElectronHeatFluxLinear(std::fstream &matfile,std::map<std::string,double> & parameters,
/*const*/ ElectronHeatCapacity * electronHeatCapacity = NULL);
virtual ~ElectronHeatFluxLinear() {};
virtual void electron_heat_flux(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux)
{
GRAD_FIELD_MATS::const_iterator dEtField = gradFields.find(ELECTRON_TEMPERATURE);
// flux = -ke dTe/dx
const DENS_MAT_VEC & dT = dEtField->second;
flux[0] = -conductivity_ * dT[0];
flux[1] = -conductivity_ * dT[1];
flux[2] = -conductivity_ * dT[2];
};
protected:
double conductivity_;
};
//-----------------------------------------------------------------------
/**
* @class ElectronHeatFluxPowerLaw
* @brief Class for an electron heat flux proportional to the temperature gradient but with a conductivity proportional to the ratio of the electron and phonon temperatures
*/
class ElectronHeatFluxPowerLaw : public ElectronHeatFlux
{
public:
- ElectronHeatFluxPowerLaw(fstream &matfile,map<string,double> &parameters,
+ ElectronHeatFluxPowerLaw(std::fstream &matfile,std::map<std::string,double> &parameters,
/*const*/ ElectronHeatCapacity * electronHeatCapacity = NULL);
virtual ~ElectronHeatFluxPowerLaw() {};
virtual void electron_heat_flux(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux)
{
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
FIELD_MATS::const_iterator tField = fields.find(TEMPERATURE);
GRAD_FIELD_MATS::const_iterator dEtField = gradFields.find(ELECTRON_TEMPERATURE);
const DENS_MAT_VEC & dT = dEtField->second;
const DENS_MAT & T = tField->second;
const DENS_MAT & Te = etField->second;
// flux = -ke * ( Te / T ) dT;
flux[0] = dT[0];
flux[1] = dT[1];
flux[2] = dT[2];
electronConductivity_ = (-conductivity_* Te) / T;
flux[0] *= electronConductivity_;
flux[1] *= electronConductivity_;
flux[2] *= electronConductivity_;
};
protected:
double conductivity_;
DENS_MAT electronConductivity_; // hopefully avoid resizing
};
//-----------------------------------------------------------------------
/**
* @class ElectronHeatFluxThermopower
* @brief Class for an electron heat flux proportional to the temperature gradient but with a condu
ctivity proportional to the ratio of the electron and phonon temperatures with the thermopower from teh electric current included
*/
class ElectronHeatFluxThermopower : public ElectronHeatFlux
{
public:
- ElectronHeatFluxThermopower(fstream &matfile,
- map<string,double> & parameters,
+ ElectronHeatFluxThermopower(std::fstream &matfile,
+ std::map<std::string,double> & parameters,
/*const*/ ElectronFlux * electronFlux = NULL,
/*const*/ ElectronHeatCapacity * electronHeatCapacity = NULL);
virtual ~ElectronHeatFluxThermopower() {};
virtual void electron_heat_flux(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux)
{
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
FIELD_MATS::const_iterator tField = fields.find(TEMPERATURE);
GRAD_FIELD_MATS::const_iterator dEtField = gradFields.find(ELECTRON_TEMPERATURE);
const DENS_MAT_VEC & dT = dEtField->second;
const DENS_MAT & T = tField->second;
const DENS_MAT & Te = etField->second;
// flux = -ke * ( Te / T ) dT + pi J_e;
flux[0] = dT[0];
flux[1] = dT[1];
flux[2] = dT[2];
elecCondWorkspace_ = (-conductivity_* Te) / T;
flux[0] *= elecCondWorkspace_;
flux[1] *= elecCondWorkspace_;
flux[2] *= elecCondWorkspace_;
electronFlux_->electron_flux(fields, gradFields, tmp_);
tmp_[0] *= Te;
tmp_[1] *= Te;
tmp_[2] *= Te;
flux[0] += seebeckCoef_*tmp_[0];
flux[1] += seebeckCoef_*tmp_[1];
flux[2] += seebeckCoef_*tmp_[2];
};
protected:
double conductivity_,seebeckCoef_;
ElectronFlux * electronFlux_;
DENS_MAT elecCondWorkspace_; // hopefully avoid resizing
DENS_MAT_VEC tmp_;
};
}
#endif
diff --git a/lib/atc/ElectronPhononExchange.cpp b/lib/atc/ElectronPhononExchange.cpp
index c040cdd3e..2ed25fc55 100644
--- a/lib/atc/ElectronPhononExchange.cpp
+++ b/lib/atc/ElectronPhononExchange.cpp
@@ -1,115 +1,119 @@
#include "Material.h"
#include "ElectronPhononExchange.h"
#include "ATC_Error.h"
#include "LammpsInterface.h"
#include <iostream>
-#include <fstream>
+#include <vector>
#include <math.h>
using ATC_Utility::command_line;
using ATC_Utility::str2dbl;
using ATC_Utility::str2int;
+using std::fstream;
+using std::map;
+using std::string;
+using std::vector;
namespace ATC {
ElectronPhononExchangeLinear::ElectronPhononExchangeLinear(
fstream &fileId, map<string,double> & parameters)
: ElectronPhononExchange(),
exchangeCoef_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
else if (line[0] == "coefficient") {
exchangeCoef_ = str2dbl(line[1]);
parameters["electron_phonon_exchange_coefficient"] = exchangeCoef_;
}
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
}
ElectronPhononExchangePowerLaw::ElectronPhononExchangePowerLaw(
fstream &fileId, map<string,double> & parameters)
: ElectronPhononExchange(),
exchangeCoef_(0),
exponent_(1)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") return;
else if (line[0] == "coefficient") {
exchangeCoef_ = str2dbl(line[1]);
parameters["electron_phonon_exchange_coefficient"] = exchangeCoef_;
}
else if (line[0] == "exponent") {
exponent_ = str2int(line[1]);
}
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
}
ElectronPhononExchangeHertel::ElectronPhononExchangeHertel(fstream &fileId,
map<string,double> & parameters,
Material * material)
: ElectronPhononExchange(),
exchangeCoef_(0),
debeyeTemperature_(1),
massEnhancement_(0),
material_(material)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") break;
else if (line[0] == "debeye_temperature") {
debeyeTemperature_ = str2dbl(line[1]);
parameters["debeye_temperature"] = debeyeTemperature_;
}
else if (line[0] == "mass_enhancement") {
massEnhancement_ = str2dbl(line[1]);
parameters["mass_enhancement"] = massEnhancement_;
}
else {
throw ATC_Error( "unrecognized material function "+line[0]);
}
}
// coupling coefficient, eqn. 15 of Hertel 2002
double kb = LammpsInterface::instance()->kBoltzmann();
double hbar = LammpsInterface::instance()->hbar();
double PI = 3.141592653589793238;
exchangeCoef_ = 144.*1.0369*kb/(PI*hbar);
exchangeCoef_ *= massEnhancement_/pow(debeyeTemperature_,2);
}
bool ElectronPhononExchangeHertel::electron_phonon_exchange(const FIELD_MATS &fields,
DENS_MAT &flux)
{
FIELD_MATS::const_iterator tField = fields.find(TEMPERATURE);
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & T = tField->second;
const DENS_MAT & Te = etField->second;
// flux = g C_e (T_e - T_p)^5 / T_e
flux = (Te - T).pow(5);
flux /= Te;
flux *= exchangeCoef_;
material_->electron_heat_capacity(fields,capacityWorkspace_);
flux*= capacityWorkspace_;
return true;
}
}
diff --git a/lib/atc/ElectronPhononExchange.h b/lib/atc/ElectronPhononExchange.h
index 1507495b9..59cc61b4d 100644
--- a/lib/atc/ElectronPhononExchange.h
+++ b/lib/atc/ElectronPhononExchange.h
@@ -1,119 +1,116 @@
#ifndef ELECTRON_PHONON_EXCHANGE_H
#define ELECTRON_PHONON_EXCHANGE_H
#include <map>
#include <string>
-
-using std::map;
-using std::string;
-
+#include <fstream>
#include "ATC_TypeDefs.h"
namespace ATC {
class Material;
/**
* @class ElectronPhononExchange
* @brief Base class for energy exchange between the electron and phonon temperatures
*/
class ElectronPhononExchange
{
public:
ElectronPhononExchange() {};
virtual ~ElectronPhononExchange() {};
/** computes heat capacity */
virtual bool electron_phonon_exchange(const FIELD_MATS &fields,
DENS_MAT &flux) { return false; }
};
//-------------------------------------------------------------------
/**
* @class ElectronPhononExchangeLinear
* @brief Class for electron-phonon energy exchange proportional to the difference between the two temperatures
*/
class ElectronPhononExchangeLinear : public ElectronPhononExchange
{
public:
- ElectronPhononExchangeLinear(fstream &matfile,
- map<string,double> & parameters);
+ ElectronPhononExchangeLinear(std::fstream &matfile,
+ std::map<std::string,double> & parameters);
virtual ~ElectronPhononExchangeLinear() {};
virtual bool electron_phonon_exchange(const FIELD_MATS &fields,
DENS_MAT &flux)
{
FIELD_MATS::const_iterator tField = fields.find(TEMPERATURE);
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & T = tField->second;
const DENS_MAT & Te = etField->second;
// flux = g * ( T- Te)
flux = Te - T;
flux *= exchangeCoef_;
return true;
};
protected:
double exchangeCoef_;
};
//-------------------------------------------------------------------
/**
* @class ElectronPhononExchangePowerLaw
* @brief Class for electron-phonon exchange proportional to the temperature difference raised to a constant power
*/
class ElectronPhononExchangePowerLaw : public ElectronPhononExchange
{
public:
- ElectronPhononExchangePowerLaw(fstream &matfile,
- map<string,double> & parameters);
+ ElectronPhononExchangePowerLaw(std::fstream &matfile,
+ std::map<std::string,double> & parameters);
virtual ~ElectronPhononExchangePowerLaw() {};
virtual bool electron_phonon_exchange(const FIELD_MATS &fields,
DENS_MAT &flux)
{
FIELD_MATS::const_iterator tField = fields.find(TEMPERATURE);
FIELD_MATS::const_iterator etField = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & T = tField->second;
const DENS_MAT & Te = etField->second;
// flux = g c_e T_e (T_e - T_p)^5 / T_e
flux = (Te - T).pow(exponent_);
flux *= exchangeCoef_;
return true;
};
protected:
double exchangeCoef_;
int exponent_;
};
//-------------------------------------------------------------------
/**
* @class ElectronPhononExchangeHertel
* @brief Class for electron-phonon exchange based on the formulation of Hertel for Cu
*/
class ElectronPhononExchangeHertel : public ElectronPhononExchange
{
public:
- ElectronPhononExchangeHertel(fstream &matfile,
- map<string,double> & parameters,
+ ElectronPhononExchangeHertel(std::fstream &matfile,
+ std::map<std::string,double> & parameters,
Material * material);
virtual ~ElectronPhononExchangeHertel() {};
virtual bool electron_phonon_exchange(const FIELD_MATS &fields,
DENS_MAT &flux);
protected:
double exchangeCoef_;
double debeyeTemperature_;
double massEnhancement_;
Material * material_;
private:
ElectronPhononExchangeHertel() {};
DENS_MAT capacityWorkspace_;
};
}
#endif
diff --git a/lib/atc/ExtrinsicModel.cpp b/lib/atc/ExtrinsicModel.cpp
index 3f9091c81..0522f0681 100644
--- a/lib/atc/ExtrinsicModel.cpp
+++ b/lib/atc/ExtrinsicModel.cpp
@@ -1,388 +1,394 @@
// ATC Headers
#include "ExtrinsicModel.h"
#include "ExtrinsicModelTwoTemperature.h"
#include "ExtrinsicModelDriftDiffusion.h"
#include "ExtrinsicModelElectrostatic.h"
#include "ATC_Error.h"
#include "TimeIntegrator.h"
#include "ATC_Coupling.h"
#include "LammpsInterface.h"
#include "PrescribedDataManager.h"
#include "PhysicsModel.h"
+#include <sstream>
+
+using std::stringstream;
+using std::vector;
+using std::map;
+using std::string;
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelManager
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ExtrinsicModelManager::ExtrinsicModelManager(ATC_Coupling * atc) :
atc_(atc)
{
// do nothing
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ExtrinsicModelManager::~ExtrinsicModelManager()
{
vector<ExtrinsicModel *>::iterator imodel;
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
delete *(imodel);
}
//--------------------------------------------------------
// modify
//--------------------------------------------------------
bool ExtrinsicModelManager::modify(int narg, char **arg)
{
bool foundMatch = false;
// loop over models with command
vector<ExtrinsicModel *>::iterator imodel;
for(imodel=extrinsicModels_.begin();
imodel!=extrinsicModels_.end(); imodel++) {
foundMatch = (*imodel)->modify(narg,arg);
if (foundMatch) break;
}
return foundMatch;
}
//--------------------------------------------------------
// create_model
//--------------------------------------------------------
void ExtrinsicModelManager::create_model(ExtrinsicModelType modelType,
string matFileName)
{
string typeName;
bool validModel = model_to_string(modelType,typeName);
if (!validModel) {
throw ATC_Error("Could not create extrinsic model");
return;
}
ExtrinsicModel * myModel;
if (modelType==TWO_TEMPERATURE) {
stringstream ss;
ss << "creating two_temperature extrinsic model";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
myModel = new ExtrinsicModelTwoTemperature
(this,modelType,matFileName);
}
else if (modelType==DRIFT_DIFFUSION
|| modelType==DRIFT_DIFFUSION_EQUILIBRIUM
|| modelType==DRIFT_DIFFUSION_SCHRODINGER
|| modelType==DRIFT_DIFFUSION_SCHRODINGER_SLICE)
{
stringstream ss;
ss << "creating drift_diffusion extrinsic model";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
myModel = new ExtrinsicModelDriftDiffusion
(this,modelType,matFileName);
}
else if (modelType==CONVECTIVE_DRIFT_DIFFUSION
|| modelType==CONVECTIVE_DRIFT_DIFFUSION_EQUILIBRIUM
|| modelType==CONVECTIVE_DRIFT_DIFFUSION_SCHRODINGER) {
stringstream ss;
ss << "creating convective_drift_diffusion extrinsic model";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
myModel = new ExtrinsicModelDriftDiffusionConvection
(this,modelType,matFileName);
}
else if (modelType==ELECTROSTATIC || modelType==ELECTROSTATIC_EQUILIBRIUM) {
stringstream ss;
ss << "creating electrostatic extrinsic model";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
myModel = new ExtrinsicModelElectrostaticMomentum
(this,modelType,matFileName);
}
else if (modelType==FEM_EFIELD) {
stringstream ss;
ss << "creating fem_efield extrinsic model";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
myModel = new ExtrinsicModelElectrostatic
(this,modelType,matFileName);
}
extrinsicModels_.push_back(myModel);
// add new fields to fields data
map<FieldName,int> fieldSizes;
myModel->num_fields(fieldSizes);
atc_->add_fields(fieldSizes);
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void ExtrinsicModelManager::construct_transfers()
{
vector<ExtrinsicModel *>::iterator imodel;
for(imodel=extrinsicModels_.begin();
imodel!=extrinsicModels_.end(); imodel++) {
// initialize models
(*imodel)->construct_transfers();
}
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void ExtrinsicModelManager::initialize()
{
vector<ExtrinsicModel *>::iterator imodel;
for(imodel=extrinsicModels_.begin();
imodel!=extrinsicModels_.end(); imodel++) {
// initialize models
(*imodel)->initialize();
}
}
//--------------------------------------------------------
// get_model : access to a particular type of model
//--------------------------------------------------------
const ExtrinsicModel * ExtrinsicModelManager::model(const ExtrinsicModelType type) const {
vector<ExtrinsicModel *>::const_iterator imodel;
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++) {
if ((*imodel)->model_type()==type) return *imodel;
}
return NULL;
}
//--------------------------------------------------------
// size_vector
//--------------------------------------------------------
int ExtrinsicModelManager::size_vector(int intrinsicSize)
{
int extrinsicSize = 0;
vector<ExtrinsicModel *>::iterator imodel;
for(imodel=extrinsicModels_.begin();
imodel!=extrinsicModels_.end(); imodel++) {
// query all models for LAMMPS display
int currentSize = intrinsicSize + extrinsicSize;
extrinsicSize += (*imodel)->size_vector(currentSize);
}
return extrinsicSize;
}
//--------------------------------------------------------
// compute_scalar
//--------------------------------------------------------
double ExtrinsicModelManager::compute_scalar(void)
{
double value = 0.;
vector<ExtrinsicModel *>::iterator imodel;
for(imodel=extrinsicModels_.begin();
imodel!=extrinsicModels_.end(); imodel++) {
value += (*imodel)->compute_scalar(); // sum
}
return value;
}
//--------------------------------------------------------
// compute_vector
//--------------------------------------------------------
double ExtrinsicModelManager::compute_vector(int n)
{
double value = 0.;
vector<ExtrinsicModel *>::iterator imodel;
for(imodel=extrinsicModels_.begin();
imodel!=extrinsicModels_.end(); imodel++) {
// query all models for LAMMPS display
if ((*imodel)->compute_vector(n,value))
break;
}
return value;
}
//--------------------------------------------------------
// finish
//--------------------------------------------------------
void ExtrinsicModelManager::finish()
{
// do nothing
}
//--------------------------------------------------------
// pre_init_integrate
//--------------------------------------------------------
void ExtrinsicModelManager::pre_init_integrate(ExtrinsicModelType modelType)
{
vector<ExtrinsicModel *>::iterator imodel;
if (modelType == NUM_MODELS) {// execute all the models
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
(*imodel)->pre_init_integrate();
}
else { // execute only requested type of model
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
if ((*imodel)->model_type() == modelType)
(*imodel)->pre_init_integrate();
}
}
//--------------------------------------------------------
// mid_init_integrate
//--------------------------------------------------------
void ExtrinsicModelManager::mid_init_integrate(ExtrinsicModelType modelType)
{
vector<ExtrinsicModel *>::iterator imodel;
if (modelType == NUM_MODELS) {// execute all the models
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
(*imodel)->mid_init_integrate();
}
else { // execute only requested type of model
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
if ((*imodel)->model_type() == modelType)
(*imodel)->mid_init_integrate();
}
}
//--------------------------------------------------------
// post_init_integrate
//--------------------------------------------------------
void ExtrinsicModelManager::post_init_integrate(ExtrinsicModelType modelType)
{
vector<ExtrinsicModel *>::iterator imodel;
if (modelType == NUM_MODELS) {// execute all the models
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
(*imodel)->post_init_integrate();
}
else { // execute only requested type of model
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
if ((*imodel)->model_type() == modelType)
(*imodel)->post_init_integrate();
}
}
//--------------------------------------------------------
// post_force
//--------------------------------------------------------
void ExtrinsicModelManager::post_force(ExtrinsicModelType modelType)
{
vector<ExtrinsicModel *>::iterator imodel;
if (modelType == NUM_MODELS) {// execute all the models
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
(*imodel)->post_force();
}
else { // execute only requested type of model
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
if ((*imodel)->model_type() == modelType)
(*imodel)->post_force();
}
}
//--------------------------------------------------------
// pre_final_integrate
//--------------------------------------------------------
void ExtrinsicModelManager::pre_final_integrate(ExtrinsicModelType modelType)
{
vector<ExtrinsicModel *>::iterator imodel;
if (modelType == NUM_MODELS) {// execute all the models
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
(*imodel)->pre_final_integrate();
}
else { // execute only requested type of model
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
if ((*imodel)->model_type() == modelType)
(*imodel)->pre_final_integrate();
}
}
//--------------------------------------------------------
// post_final_integrate
//--------------------------------------------------------
void ExtrinsicModelManager::post_final_integrate(ExtrinsicModelType modelType)
{
vector<ExtrinsicModel *>::iterator imodel;
if (modelType == NUM_MODELS) {// execute all the models
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
(*imodel)->post_final_integrate();
}
else { // execute only requested type of model
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
if ((*imodel)->model_type() == modelType)
(*imodel)->post_final_integrate();
}
}
//--------------------------------------------------------
// set_sources
//--------------------------------------------------------
void ExtrinsicModelManager::set_sources(FIELDS & fields, FIELDS & sources, ExtrinsicModelType modelType)
{
vector<ExtrinsicModel *>::iterator imodel;
if (modelType == NUM_MODELS) {// execute all the models
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
(*imodel)->set_sources(fields,sources);
}
else { // execute only requested type of model
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
if ((*imodel)->model_type() == modelType)
(*imodel)->set_sources(fields,sources);
}
}
//--------------------------------------------------------
// output
//--------------------------------------------------------
void ExtrinsicModelManager::output(OUTPUT_LIST & outputData)
{
vector<ExtrinsicModel *>::iterator imodel;
for(imodel=extrinsicModels_.begin(); imodel!=extrinsicModels_.end(); imodel++)
(*imodel)->output(outputData);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModel
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ExtrinsicModel::ExtrinsicModel(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
string matFileName) :
atc_(modelManager->atc()),
modelManager_(modelManager),
modelType_(modelType),
physicsModel_(NULL)
{
rhsMaskIntrinsic_.reset(NUM_FIELDS,NUM_FLUX);
rhsMaskIntrinsic_ = false;
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ExtrinsicModel::~ExtrinsicModel()
{
if (physicsModel_) delete physicsModel_;
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void ExtrinsicModel::initialize(void)
{
physicsModel_->initialize();
}
//--------------------------------------------------------
// get_num_fields
// - sets dict of fields
//--------------------------------------------------------
void ExtrinsicModel::num_fields(map<FieldName,int> & fieldSizes)
{
physicsModel_->num_fields(fieldSizes,atc_->fieldMask_);
}
};
diff --git a/lib/atc/ExtrinsicModel.h b/lib/atc/ExtrinsicModel.h
index 468c3e115..4d8fb95fd 100644
--- a/lib/atc/ExtrinsicModel.h
+++ b/lib/atc/ExtrinsicModel.h
@@ -1,315 +1,315 @@
#ifndef EXTRINSIC_MODEL
#define EXTRINSIC_MODEL
-// ATC headers
+#include <vector>
+#include <map>
+#include <string>
+
#include "ATC_TypeDefs.h"
#include "MatrixLibrary.h"
-using namespace std;
namespace ATC {
-
- // forward declarations
class ATC_Coupling;
class ExtrinsicModel;
class PhysicsModel;
/** enumeration for the model types available */
enum ExtrinsicModelType {
NO_MODEL=0,
TWO_TEMPERATURE,
DRIFT_DIFFUSION,
DRIFT_DIFFUSION_EQUILIBRIUM,
DRIFT_DIFFUSION_SCHRODINGER,
DRIFT_DIFFUSION_SCHRODINGER_SLICE,
CONVECTIVE_DRIFT_DIFFUSION,
CONVECTIVE_DRIFT_DIFFUSION_EQUILIBRIUM,
CONVECTIVE_DRIFT_DIFFUSION_SCHRODINGER,
ELECTROSTATIC,
ELECTROSTATIC_EQUILIBRIUM,
FEM_EFIELD,
NUM_MODELS
};
/**
* @class ExtrinsicModelManager
* @brief Handles parsing and parameter storage extrinsic models
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelManager
//--------------------------------------------------------
//--------------------------------------------------------
class ExtrinsicModelManager {
public:
// constructor
ExtrinsicModelManager(ATC_Coupling * atcTransfer);
// destructor
~ExtrinsicModelManager();
/** parser/modifier */
bool modify(int narg, char **arg);
/** create_model */
- void create_model(ExtrinsicModelType modelType, string matFileName);
+ void create_model(ExtrinsicModelType modelType, std::string matFileName);
/** construct the transfers needed by the model */
void construct_transfers();
/** pre time integration */
void initialize();
/** set up LAMMPS display variables */
int size_vector(int intrinsicSize);
/** get LAMMPS display variables */
double compute_scalar(void);
double compute_vector(int n);
/** post integration run */
// is this called at end of run or simulation
void finish();
// calls during LAMMPS Velocity-Verlet integration
/** Predictor phase, executed before Verlet */
void pre_init_integrate(ExtrinsicModelType modelType = NUM_MODELS);
/** Predictor phase, executed between velocity and position Verlet */
void mid_init_integrate(ExtrinsicModelType modelType = NUM_MODELS);
/** Predictor phase, executed after Verlet */
void post_init_integrate(ExtrinsicModelType modelType = NUM_MODELS);
/** Make changes to the forces lammps calculates */
void post_force(ExtrinsicModelType modelType = NUM_MODELS);
/** Corrector phase, executed before Verlet */
void pre_final_integrate(ExtrinsicModelType modelType = NUM_MODELS);
/** Corrector phase, executed after Verlet*/
void post_final_integrate(ExtrinsicModelType modelType = NUM_MODELS);
/** get source terms for AtC equations */
void set_sources(FIELDS & fields, FIELDS & sources,
ExtrinsicModelType modelType = NUM_MODELS);
/** return output data to main AtC */
void output(OUTPUT_LIST & outputData);
/** model name enum to string */
- static bool model_to_string(const ExtrinsicModelType index, string & name)
+ static bool model_to_string(const ExtrinsicModelType index, std::string & name)
{
switch (index) {
case NO_MODEL:
name = "no_model";
break;
case TWO_TEMPERATURE:
name = "two_temperature";
break;
case DRIFT_DIFFUSION:
name = "drift_diffusion";
break;
case DRIFT_DIFFUSION_EQUILIBRIUM:
name = "drift_diffusion-equilibrium";
break;
case DRIFT_DIFFUSION_SCHRODINGER:
name = "drift_diffusion-schrodinger";
break;
case DRIFT_DIFFUSION_SCHRODINGER_SLICE:
name = "drift_diffusion-schrodinger-slice";
break;
case CONVECTIVE_DRIFT_DIFFUSION:
name = "convective_drift_diffusion";
break;
case CONVECTIVE_DRIFT_DIFFUSION_EQUILIBRIUM:
name = "convective_drift_diffusion-equilibrium";
break;
case CONVECTIVE_DRIFT_DIFFUSION_SCHRODINGER:
name = "convective_drift_diffusion-schrodinger";
break;
case ELECTROSTATIC:
name = "electrostatic";
break;
case ELECTROSTATIC_EQUILIBRIUM:
name = "electrostatic-equilibrium";
break;
case FEM_EFIELD:
name = "fem_efield";
break;
default:
return false;
break;
}
return true;
};
/** string to model enum */
- static bool string_to_model(const string & name, ExtrinsicModelType & index)
+ static bool string_to_model(const std::string & name, ExtrinsicModelType & index)
{
if (name=="no_model")
index = NO_MODEL;
else if (name=="two_temperature")
index = TWO_TEMPERATURE;
else if (name=="drift_diffusion")
index = DRIFT_DIFFUSION;
else if (name=="drift_diffusion-equilibrium")
index = DRIFT_DIFFUSION_EQUILIBRIUM;
else if (name=="drift_diffusion-schrodinger")
index = DRIFT_DIFFUSION_SCHRODINGER;
else if (name=="drift_diffusion-schrodinger-slice")
index = DRIFT_DIFFUSION_SCHRODINGER_SLICE;
else if (name=="convective_drift_diffusion")
index = CONVECTIVE_DRIFT_DIFFUSION;
else if (name=="convective_drift_diffusion-equilibrium")
index = CONVECTIVE_DRIFT_DIFFUSION_EQUILIBRIUM;
else if (name=="convective_drift_diffusion-schrodinger")
index = CONVECTIVE_DRIFT_DIFFUSION_SCHRODINGER;
else if (name=="electrostatic")
index = ELECTROSTATIC;
else if (name=="electrostatic-equilibrium")
index = ELECTROSTATIC_EQUILIBRIUM;
else if (name=="fem_efield")
index = FEM_EFIELD;
else
return false;
return true;
};
/** access to ATC transfer object */
ATC_Coupling * atc() {return atc_;};
/** access to model of a specific type */
const ExtrinsicModel * model(const ExtrinsicModelType type) const;
protected:
/** associated ATC_Coupling object */
ATC_Coupling * atc_;
/** equation handler */
- vector<ExtrinsicModel *> extrinsicModels_;
+ std::vector<ExtrinsicModel *> extrinsicModels_;
private:
ExtrinsicModelManager(); // DO NOT define this, only use constructor above
};
/**
* @class ExtrinsicModel
* @brief base class for functionality of all extrinsic models
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModel
//--------------------------------------------------------
//--------------------------------------------------------
class ExtrinsicModel {
public:
// constructor
ExtrinsicModel(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
- string matFileName);
+ std::string matFileName);
// destructor
virtual ~ExtrinsicModel();
/** parser/modifier */
virtual bool modify(int narg, char **arg) {return false;};
/** construct transfers needed by the model */
virtual void construct_transfers(){};
/** pre time integration */
virtual void initialize();
/** set up LAMMPS display variables */
virtual int size_vector(int externalSize) {return 0;};
/** get LAMMPS display variables */
virtual double compute_scalar(void) { return 0.0; }
virtual bool compute_vector(int n, double & value) {return false;};
/** post integration run */
// is this called at end of run or simulation
virtual void finish(){};
/** Predictor phase, executed before Verlet */
virtual void pre_init_integrate(){};
/** Predictor phase, executed between velocity and position Verlet */
virtual void mid_init_integrate(){};
/** Predictor phase, executed after Verlet */
virtual void post_init_integrate(){};
/** changes to lammps forces */
virtual void post_force(){};
/** Corrector phase, executed before Verlet */
virtual void pre_final_integrate(){};
/** Corrector phase, Verlet second step for velocity */
virtual void final_integrate(){};
/** Corrector phase, executed after Verlet*/
virtual void post_final_integrate(){};
/** Set sources to AtC equation */
virtual void set_sources(FIELDS & fields, FIELDS & sources){};
/** Add model-specific output data */
virtual void output(OUTPUT_LIST & outputData){};
/** get the fields and their sizes */
- void num_fields(map<FieldName,int> & fieldSizes);
+ void num_fields(std::map<FieldName,int> & fieldSizes);
/** return the type of model being used */
ExtrinsicModelType model_type() const {return modelType_;};
protected:
ExtrinsicModel(){};
/** ATC transfer object */
ATC_Coupling * atc_;
/** model manager object */
ExtrinsicModelManager * modelManager_;
/** tag for model type */
ExtrinsicModelType modelType_;
/** list of model fields in this model */
std::map<FieldName, int> fieldSizes_;
/** definition for physics used in this model */
PhysicsModel * physicsModel_;
/** rhs */
FIELDS rhs_;
/** rhs mask for coupling with MD */
Array2D<bool> rhsMaskIntrinsic_;
GRAD_FIELD_MATS fluxes_;
/** number of nodes */
int nNodes_;
/** number of spatial dimensions */
int nsd_;
};
};
#endif
diff --git a/lib/atc/ExtrinsicModelDriftDiffusion.cpp b/lib/atc/ExtrinsicModelDriftDiffusion.cpp
index 5827a8a28..f98467703 100644
--- a/lib/atc/ExtrinsicModelDriftDiffusion.cpp
+++ b/lib/atc/ExtrinsicModelDriftDiffusion.cpp
@@ -1,550 +1,558 @@
// ATC Headers
#include "ExtrinsicModelDriftDiffusion.h"
#include "ATC_Error.h"
#include "FieldEulerIntegrator.h"
#include "ATC_Coupling.h"
#include "LammpsInterface.h"
#include "PrescribedDataManager.h"
#include "PhysicsModel.h"
#include "LinearSolver.h"
#include "PoissonSolver.h"
#include "SchrodingerSolver.h"
// timer
#include "Utility.h"
+#include <utility>
+
+using ATC_Utility::to_string;
+using std::string;
+using std::set;
+using std::pair;
+using std::vector;
+
const double tol = 1.e-8;
const double zero_tol = 1.e-12;
const double f_tol = 1.e-8;
namespace ATC {
enum oneDconservationEnum {ONED_DENSITY=0, ONED_FLUX};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelDriftDiffusion
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ExtrinsicModelDriftDiffusion::ExtrinsicModelDriftDiffusion
(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
string matFileName) :
ExtrinsicModelTwoTemperature(modelManager,modelType,matFileName),
continuityIntegrator_(NULL),
poissonSolverType_(DIRECT), // ITERATIVE | DIRECT
poissonSolver_(NULL),
baseSize_(0),
electronDensityEqn_(ELECTRON_CONTINUITY),
fluxUpdateFreq_(1),
schrodingerSolverType_(DIRECT), // ITERATIVE | DIRECT
schrodingerSolver_(NULL),
schrodingerPoissonMgr_(),
schrodingerPoissonSolver_(NULL),
maxConsistencyIter_(0), maxConstraintIter_(1),
safe_dEf_(0.1), Ef_shift_(0.0),
oneD_(false), oneDcoor_(0), oneDconserve_(ONED_DENSITY)
{
// delete base class's version of the physics model
if (physicsModel_) delete physicsModel_;
if (modelType == DRIFT_DIFFUSION_EQUILIBRIUM) {
physicsModel_ = new PhysicsModelDriftDiffusionEquilibrium(matFileName);
electronDensityEqn_ = ELECTRON_EQUILIBRIUM;
}
else if (modelType == DRIFT_DIFFUSION_SCHRODINGER) {
physicsModel_ = new PhysicsModelDriftDiffusionSchrodinger(matFileName);
electronDensityEqn_ = ELECTRON_SCHRODINGER;
maxConsistencyIter_ = 1;
}
else if (modelType == DRIFT_DIFFUSION_SCHRODINGER_SLICE) {
physicsModel_ = new PhysicsModelDriftDiffusionSchrodingerSlice(matFileName);
electronDensityEqn_ = ELECTRON_SCHRODINGER;
maxConsistencyIter_ = 1;
}
else {
physicsModel_ = new PhysicsModelDriftDiffusion(matFileName);
}
atc_->useConsistentMassMatrix_(ELECTRON_DENSITY) = true;
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ExtrinsicModelDriftDiffusion::~ExtrinsicModelDriftDiffusion()
{
if(continuityIntegrator_) delete continuityIntegrator_;
if(poissonSolver_) delete poissonSolver_;
if(schrodingerSolver_) delete schrodingerSolver_;
if(schrodingerPoissonSolver_) delete schrodingerPoissonSolver_;
}
//--------------------------------------------------------
// modify
//--------------------------------------------------------
bool ExtrinsicModelDriftDiffusion::modify(int narg, char **arg)
{
bool match = false;
int argIndx = 0;
if (!match) {
match = ExtrinsicModelTwoTemperature::modify(narg, arg);
}
return match;
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void ExtrinsicModelDriftDiffusion::initialize()
{
// xTTM sets rhsMaskIntrinsic_
ExtrinsicModelTwoTemperature::initialize();
nNodes_ = atc_->num_nodes();
rhs_[ELECTRON_DENSITY].reset(nNodes_,1);
rhs_[ELECTRIC_POTENTIAL].reset(nNodes_,1);
// set up electron continuity integrator
Array2D <bool> rhsMask(NUM_TOTAL_FIELDS,NUM_FLUX);
rhsMask = false;
for (int i = 0; i < NUM_FLUX; i++) {
rhsMask(ELECTRON_DENSITY,i) = atc_->fieldMask_(ELECTRON_DENSITY,i);
}
// need to create the bcs for the solver to configure properly
atc_->set_fixed_nodes();
if (continuityIntegrator_) delete continuityIntegrator_;
if (electronTimeIntegration_ == TimeIntegrator::IMPLICIT) {
continuityIntegrator_ = new FieldImplicitEulerIntegrator(ELECTRON_DENSITY,
physicsModel_, atc_->feEngine_, atc_, rhsMask);
}
else {
continuityIntegrator_ = new FieldExplicitEulerIntegrator(ELECTRON_DENSITY,
physicsModel_, atc_->feEngine_, atc_, rhsMask);
}
atc_->compute_mass_matrix(ELECTRON_DENSITY,physicsModel_);
//(atc_->consistentMassMats_[ELECTRON_DENSITY].quantity()).print("PHYS MASS MAT");
//DENS_MAT temp = atc_->consistentMassInverse_ - atc_->consistentMassMatInv_[ELECTRON_DENSITY];
//temp.print("DIFF In MATS");
// set up poisson solver
rhsMask = false;
for (int i = 0; i < NUM_FLUX; i++) {
rhsMask(ELECTRIC_POTENTIAL,i) = atc_->fieldMask_(ELECTRIC_POTENTIAL,i);
}
int type = ATC::LinearSolver::ITERATIVE_SOLVE_SYMMETRIC;
if (poissonSolverType_ == DIRECT) {
type = ATC::LinearSolver::DIRECT_SOLVE;
}
if (poissonSolver_) delete poissonSolver_;
poissonSolver_ = new PoissonSolver(ELECTRIC_POTENTIAL,
physicsModel_, atc_->feEngine_, atc_->prescribedDataMgr_, atc_,
rhsMask,type, true);
poissonSolver_->initialize();
// set up schrodinger solver
if ( electronDensityEqn_ == ELECTRON_SCHRODINGER ) {
int type = ATC::LinearSolver::ITERATIVE_SOLVE_SYMMETRIC;
if (schrodingerSolverType_ == DIRECT) {
type = ATC::LinearSolver::DIRECT_SOLVE;
}
if ( schrodingerSolver_ ) delete schrodingerSolver_;
if ( oneD_ ) {
EfHistory_.reset(oneDslices_.size(),2);
schrodingerSolver_ = new SliceSchrodingerSolver(ELECTRON_DENSITY,
physicsModel_, atc_->feEngine_, atc_->prescribedDataMgr_, atc_,
oneDslices_, type, true);
}
else {
schrodingerSolver_ = new SchrodingerSolver(ELECTRON_DENSITY,
physicsModel_, atc_->feEngine_, atc_->prescribedDataMgr_, atc_,
type, true);
}
schrodingerSolver_->initialize();
if ( schrodingerPoissonSolver_ ) delete schrodingerPoissonSolver_;
schrodingerPoissonSolver_ = schrodingerPoissonMgr_.initialize(
atc_, schrodingerSolver_, poissonSolver_, physicsModel_);
}
if (electronDensityEqn_ == ELECTRON_SCHRODINGER && !(atc_->is_initialized())) {
((atc_->fields())[ELECTRON_WAVEFUNCTION].set_quantity()).reset(nNodes_,1);
((atc_->fields())[ELECTRON_WAVEFUNCTIONS].set_quantity()).reset(nNodes_,nNodes_);
((atc_->fields())[ELECTRON_WAVEFUNCTION_ENERGIES].set_quantity()).reset(nNodes_,1);
}
}
//--------------------------------------------------------
// pre initial integration
//--------------------------------------------------------
void ExtrinsicModelDriftDiffusion::pre_init_integrate()
{
double dt = atc_->lammpsInterface_->dt();
double time = atc_->time();
int step = atc_->step();
if (step % fluxUpdateFreq_ != 0) return;
// set Dirchlet data
atc_->set_fixed_nodes();
// set Neumann data (atc does not set these until post_final)
atc_->set_sources();
// subcyle integration of fast electron variable/s
double idt = dt/nsubcycle_;
for (int i = 0; i < nsubcycle_ ; ++i) {
if (electronDensityEqn_ == ELECTRON_CONTINUITY) {
// update continuity eqn
if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_DENSITY) )
continuityIntegrator_->update(idt,time,atc_->fields_,rhs_);
atc_->set_fixed_nodes();
// solve poisson eqn for electric potential
if (! atc_->prescribedDataMgr_->all_fixed(ELECTRIC_POTENTIAL) )
poissonSolver_->solve(atc_->fields(),rhs_);
}
else if (electronDensityEqn_ == ELECTRON_SCHRODINGER) {
schrodingerPoissonSolver_->solve(rhs_,fluxes_);
}
// update electron temperature
if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_TEMPERATURE) )
temperatureIntegrator_->update(idt,time,atc_->fields_,rhs_);
atc_->set_fixed_nodes();
}
}
//--------------------------------------------------------
// output
//--------------------------------------------------------
void ExtrinsicModelDriftDiffusion::output(OUTPUT_LIST & outputData)
{
ExtrinsicModelTwoTemperature::output(outputData);
// fields
outputData["dot_electron_density"] = & (atc_->dot_field(ELECTRON_DENSITY)).set_quantity();
outputData["joule_heating"] = & rhs_[ELECTRON_TEMPERATURE].set_quantity();
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX); rhsMask = false;
rhsMask(ELECTRON_DENSITY,FLUX) = true;
rhsMask(ELECTRIC_POTENTIAL,FLUX) = true;
atc_->compute_flux(rhsMask,atc_->fields_,fluxes_,physicsModel_);
//(fluxes_[ELECTRON_DENSITY][0]).print("J_x");
outputData["electron_flux_x"] = & fluxes_[ELECTRON_DENSITY][0];
outputData["electron_flux_y"] = & fluxes_[ELECTRON_DENSITY][1];
outputData["electron_flux_z"] = & fluxes_[ELECTRON_DENSITY][2];
outputData["electric_field_x"] = & fluxes_[ELECTRIC_POTENTIAL][0];
outputData["electric_field_y"] = & fluxes_[ELECTRIC_POTENTIAL][1];
outputData["electric_field_z"] = & fluxes_[ELECTRIC_POTENTIAL][2];
if (electronDensityEqn_ == ELECTRON_SCHRODINGER ) {
SPAR_MAT K;
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX);
rhsMask = false;
rhsMask(ELECTRON_WAVEFUNCTION,FLUX) = true;
pair<FieldName,FieldName> row_col(ELECTRON_WAVEFUNCTION,
ELECTRON_WAVEFUNCTION);
atc_->feEngine_->compute_tangent_matrix(
rhsMask, row_col, atc_->fields(), physicsModel_,
atc_->element_to_material_map(), K);
phiTotal_.reset(K.nRows(),1);
const DIAG_MAT & inv_dV = (atc_->invNodeVolumes_).quantity();
for (int i = 0; i < K.nRows() ; i++) {
phiTotal_(i,0) = 0.0;
for (int j = 0; j < K.nCols() ; j++) {
phiTotal_(i,0) += K(i,j);
}
phiTotal_(i,0) *= inv_dV(i,i);
}
outputData["V_total"] = & phiTotal_;
}
// globals
double nSum = ((atc_->field(ELECTRON_DENSITY)).quantity()).col_sum();
atc_->feEngine_->add_global("total_electron_density",nSum);
}
//--------------------------------------------------------
// size_vector
//--------------------------------------------------------
int ExtrinsicModelDriftDiffusion::size_vector(int intrinsicSize)
{
int xSize = ExtrinsicModelTwoTemperature::size_vector(intrinsicSize);
baseSize_ = intrinsicSize + xSize;
xSize += 1;
return xSize;
}
//--------------------------------------------------------
// compute_vector
//--------------------------------------------------------
bool ExtrinsicModelDriftDiffusion::compute_vector(int n, double & value)
{
// output[1] = total electron density
bool match = ExtrinsicModelTwoTemperature::compute_vector(n,value);
if (match) return match;
if (n == baseSize_) {
double nSum = ((atc_->field(ELECTRON_DENSITY)).quantity()).col_sum();
value = nSum;
return true;
}
return false;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelDriftDiffusionConvection
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ExtrinsicModelDriftDiffusionConvection::ExtrinsicModelDriftDiffusionConvection
(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
string matFileName) :
ExtrinsicModelDriftDiffusion(modelManager,modelType,matFileName),
cddmPoissonSolver_(NULL),
baseSize_(0)
{
// delete base class's version of the physics model
if (physicsModel_) delete physicsModel_;
if (modelType == CONVECTIVE_DRIFT_DIFFUSION_SCHRODINGER) {
physicsModel_ = new PhysicsModelDriftDiffusionConvectionSchrodinger(matFileName);
electronDensityEqn_ = ELECTRON_SCHRODINGER;
}
else {
physicsModel_ = new PhysicsModelDriftDiffusionConvection(matFileName);
}
atc_->useConsistentMassMatrix_(ELECTRON_VELOCITY) = true;
atc_->useConsistentMassMatrix_(ELECTRON_TEMPERATURE) = true;
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ExtrinsicModelDriftDiffusionConvection::~ExtrinsicModelDriftDiffusionConvection()
{
if (cddmPoissonSolver_) delete cddmPoissonSolver_;
for (vector<LinearSolver * >::const_iterator iter=velocitySolvers_.begin();
iter != velocitySolvers_.end(); iter++)
if (*iter) delete *iter;
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void ExtrinsicModelDriftDiffusionConvection::initialize()
{
ExtrinsicModelDriftDiffusion::initialize();
// change temperature integrator to be Crank-Nicolson
if (electronTimeIntegration_ == TimeIntegrator::IMPLICIT) {
if (temperatureIntegrator_) delete temperatureIntegrator_;
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX);
rhsMask = false;
for (int i = 0; i < NUM_FLUX; i++) {
rhsMask(ELECTRON_TEMPERATURE,i) = atc_->fieldMask_(ELECTRON_TEMPERATURE,i);
}
temperatureIntegrator_ = new FieldImplicitEulerIntegrator(ELECTRON_TEMPERATURE,
physicsModel_,
atc_->feEngine_, atc_,
rhsMask);
}
nNodes_ = atc_->num_nodes();
nsd_ = atc_->nsd();
rhs_[ELECTRON_VELOCITY].reset(nNodes_,nsd_);
atc_->set_fixed_nodes(); // needed to correctly set BC data
// initialize Poisson solver
if (cddmPoissonSolver_) delete cddmPoissonSolver_;
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX);
rhsMask = false;
rhsMask(ELECTRIC_POTENTIAL,FLUX) = true;
pair<FieldName,FieldName> row_col(ELECTRIC_POTENTIAL,ELECTRIC_POTENTIAL);
SPAR_MAT stiffness;
(atc_->feEngine_)->compute_tangent_matrix(rhsMask,row_col, atc_->fields(), physicsModel_,
atc_->element_to_material_map(), stiffness);
const BC_SET & bcs = (atc_->prescribedDataMgr_->bcs(ELECTRIC_POTENTIAL))[0];
cddmPoissonSolver_ = new LinearSolver(stiffness, bcs, poissonSolverType_,
-1, true);
// initialize velocity solver
const BCS & velocityBcs = atc_->prescribedDataMgr_->bcs(ELECTRON_VELOCITY);
DENS_MAT velocityRhs(nNodes_,nsd_);
atc_->compute_mass_matrix(ELECTRON_VELOCITY,physicsModel_);
SPAR_MAT & velocityMassMat = (atc_->consistentMassMats_[ELECTRON_VELOCITY]).set_quantity();
for (int i = 0; i < nsd_; i++ ) {
LinearSolver * myVelocitySolver =
new LinearSolver(velocityMassMat, velocityBcs[i],
LinearSolver::AUTO_SOLVE, -1, true);
velocitySolvers_.push_back(myVelocitySolver);
}
}
//--------------------------------------------------------
// pre initial integration
//--------------------------------------------------------
void ExtrinsicModelDriftDiffusionConvection::pre_init_integrate()
{
double dt = atc_->lammpsInterface_->dt();
double time = atc_->time();
int step = atc_->step();
if (step % fluxUpdateFreq_ != 0) return;
// set Dirchlet data
atc_->set_fixed_nodes();
// set Neumann data (atc does not set these until post_final)
atc_->set_sources();
// subcyle integration of fast electron variable/s
double idt = dt/nsubcycle_;
for (int i = 0; i < nsubcycle_ ; ++i) {
// update electron temperature mass matrix
atc_->compute_mass_matrix(ELECTRON_VELOCITY,physicsModel_);
// update electron velocity
if (!(atc_->prescribedDataMgr_)->all_fixed(ELECTRON_VELOCITY)) {
//const BCS & bcs
// = atc_->prescribedDataMgr_->bcs(ELECTRON_VELOCITY);
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX);
rhsMask = false;
rhsMask(ELECTRON_VELOCITY,SOURCE) = atc_->fieldMask_(ELECTRON_VELOCITY,SOURCE);
rhsMask(ELECTRON_VELOCITY,FLUX) = atc_->fieldMask_(ELECTRON_VELOCITY,FLUX);
FIELDS rhs;
rhs[ELECTRON_VELOCITY].reset(nNodes_,nsd_);
atc_->compute_rhs_vector(rhsMask, atc_->fields_, rhs, atc_->source_integration(), physicsModel_);
const DENS_MAT & velocityRhs = rhs[ELECTRON_VELOCITY].quantity();
// add a solver for electron momentum
DENS_MAT & velocity = (atc_->field(ELECTRON_VELOCITY)).set_quantity();
for (int j = 0; j < nsd_; ++j) {
if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_VELOCITY,j) ) {
CLON_VEC v = column(velocity,j);
const CLON_VEC r = column(velocityRhs,j);
(velocitySolvers_[j])->solve(v,r);
}
}
}
//atc_->set_fixed_nodes();
if (electronDensityEqn_ == ELECTRON_CONTINUITY) {
// update continuity eqn
if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_DENSITY) )
continuityIntegrator_->update(idt,time,atc_->fields_,rhs_);
atc_->set_fixed_nodes();
// solve poisson eqn for electric potential
if (! atc_->prescribedDataMgr_->all_fixed(ELECTRIC_POTENTIAL) ) {
//poissonSolver_->solve(atc_->fields_,rhs_);
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX);
rhsMask = false;
rhsMask(ELECTRIC_POTENTIAL,SOURCE) = atc_->fieldMask_(ELECTRIC_POTENTIAL,SOURCE);
rhsMask(ELECTRIC_POTENTIAL,PRESCRIBED_SOURCE) = atc_->fieldMask_(ELECTRIC_POTENTIAL,PRESCRIBED_SOURCE);
FIELDS rhs;
rhs[ELECTRIC_POTENTIAL].reset(nNodes_,1);
atc_->compute_rhs_vector(rhsMask, atc_->fields_, rhs, atc_->source_integration(), physicsModel_);
CLON_VEC x =column((atc_->field(ELECTRIC_POTENTIAL)).set_quantity(),0);
const CLON_VEC r =column(rhs[ELECTRIC_POTENTIAL].quantity(),0);
cddmPoissonSolver_->solve(x,r);
}
}
else if (electronDensityEqn_ == ELECTRON_SCHRODINGER) {
schrodingerPoissonSolver_->solve(rhs_,fluxes_);
}
atc_->set_fixed_nodes();
// update electron temperature mass matrix
atc_->compute_mass_matrix(ELECTRON_TEMPERATURE,physicsModel_);
// update electron temperature
if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_TEMPERATURE) )
temperatureIntegrator_->update(idt,time,atc_->fields_,rhs_);
atc_->set_fixed_nodes();
}
}
//--------------------------------------------------------
// output
//--------------------------------------------------------
void ExtrinsicModelDriftDiffusionConvection::output(OUTPUT_LIST & outputData)
{
ExtrinsicModelDriftDiffusion::output(outputData);
//FIELD jouleHeating(atc_->num_nodes(),1);
//set_kinetic_energy_source(atc_->fields(),jouleHeating);
outputData["joule_heating"] = & (atc_->extrinsic_source(TEMPERATURE)).set_quantity();
// globals
DENS_MAT nodalKineticEnergy;
compute_nodal_kinetic_energy(nodalKineticEnergy);
double kineticEnergy = nodalKineticEnergy.sum();
atc_->feEngine_->add_global("total_electron_kinetic_energy",kineticEnergy);
}
//--------------------------------------------------------
// size_vector
//--------------------------------------------------------
int ExtrinsicModelDriftDiffusionConvection::size_vector(int intrinsicSize)
{
int xSize = ExtrinsicModelDriftDiffusion::size_vector(intrinsicSize);
baseSize_ = intrinsicSize + xSize;
xSize += 1;
return xSize;
}
//--------------------------------------------------------
// compute_vector
//--------------------------------------------------------
bool ExtrinsicModelDriftDiffusionConvection::compute_vector(int n, double & value)
{
// output[1] = total electron kinetic energy
bool match = ExtrinsicModelDriftDiffusion::compute_vector(n,value);
if (match) return match;
if (n == baseSize_) {
DENS_MAT nodalKineticEnergy;
compute_nodal_kinetic_energy(nodalKineticEnergy);
value = nodalKineticEnergy.sum();
return true;
}
return false;
}
//--------------------------------------------------------
// compute_kinetic_energy
//--------------------------------------------------------
void ExtrinsicModelDriftDiffusionConvection::compute_nodal_kinetic_energy(DENS_MAT & kineticEnergy)
{
DENS_MAT & velocity((atc_->field(ELECTRON_VELOCITY)).set_quantity());
SPAR_MAT & velocityMassMat = (atc_->consistentMassMats_[ELECTRON_VELOCITY]).set_quantity();
kineticEnergy.reset(nNodes_,1);
for (int j = 0; j < nsd_; j++) {
CLON_VEC myVelocity(velocity,CLONE_COL,j);
DENS_MAT velocityMat(nNodes_,1);
for (int i = 0; i < nNodes_; i++)
velocityMat(i,0) = myVelocity(i);
kineticEnergy += velocityMat.mult_by_element(myVelocity);
}
kineticEnergy = 0.5*velocityMassMat*kineticEnergy;
}
};
diff --git a/lib/atc/ExtrinsicModelDriftDiffusion.h b/lib/atc/ExtrinsicModelDriftDiffusion.h
index 2761ae70d..92e2365dc 100644
--- a/lib/atc/ExtrinsicModelDriftDiffusion.h
+++ b/lib/atc/ExtrinsicModelDriftDiffusion.h
@@ -1,187 +1,187 @@
#ifndef EXTRINSIC_MODEL_DRIFT_DIFFUSION
#define EXTRINSIC_MODEL_DRIFT_DIFFUSION
-/** owned fields: ELECTRON_DENSITY, ... */
+#include <set>
+#include <string>
+#include <vector>
-// ATC headers
#include "ExtrinsicModelTwoTemperature.h"
#include "SchrodingerSolver.h"
-using namespace std;
namespace ATC {
- // forward declarations
class ATC_Coupling;
class PrescribedDataManager;
class ExtrinsicModel;
class PhysicsModel;
class PoissonSolver;
class LinearSolver;
class SchrodingerSolver;
class SchrodingerPoissonSolver;
/**
* @class ExtrinsicModelDriftDiffusion
* @brief add electron temperature physics to phonon physics
+ * owned fields ELECTRON_DENSITY
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelDriftDiffusion
//--------------------------------------------------------
//--------------------------------------------------------
class ExtrinsicModelDriftDiffusion : public ExtrinsicModelTwoTemperature {
public:
// constructor
ExtrinsicModelDriftDiffusion(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
- string matFileName);
+ std::string matFileName);
// destructor
virtual ~ExtrinsicModelDriftDiffusion();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** pre time integration */
virtual void initialize();
/** Predictor phase, executed before Verlet */
virtual void pre_init_integrate();
/** Add model-specific output data */
virtual void output(OUTPUT_LIST & outputData);
/** set up LAMMPS display variables */
virtual int size_vector(int externalSize);
/** get LAMMPS display variables */
virtual bool compute_vector(int n, double & value);
protected:
/** Poisson solve */
void poisson_solve();
/** Schrodinger-Poisson solve */
void schrodinger_poisson_solve(void); // wrapper
void schrodinger_poisson_solve(int iterations);
void slice_schrodinger_poisson_solve(int consistencyIter, int constraintIter);
double update_fermi_energy(double target,bool first = false);
/** time integrator for the continuity eqn */
FieldEulerIntegrator * continuityIntegrator_;
/** poisson solver type */
SolverType poissonSolverType_;
/** poisson solver */
PoissonSolver * poissonSolver_;
/** offset/size for LAMMPS display output */
int baseSize_;
/** ways to determine the electron density */
int electronDensityEqn_;
enum electronDensityEqnType { ELECTRON_CONTINUITY,
ELECTRON_EQUILIBRIUM,
ELECTRON_SCHRODINGER};
/** frequency for updating the electron state */
int fluxUpdateFreq_;
/** Schrodinger solver type */
SolverType schrodingerSolverType_;
/** poisson solver */
SchrodingerSolver * schrodingerSolver_;
/** schrodinger-poisson solver */
SchrodingerPoissonManager schrodingerPoissonMgr_;
SchrodingerPoissonSolver * schrodingerPoissonSolver_;
/** schrodinger-poisson data */
int maxConsistencyIter_, maxConstraintIter_;
double safe_dEf_, Ef_shift_;
DENS_MAT phiTotal_;
double Tmax_;
Array2D<double> EfHistory_;
/** one dimensional restriction */
bool oneD_;
int oneDcoor_;
int oneDstride_;
- string oneDnodesetName_;
- set<int> oneDnodeset_;
- Array< set<int> > oneDslices_;
+ std::string oneDnodesetName_;
+ std::set<int> oneDnodeset_;
+ Array< std::set<int> > oneDslices_;
int oneDconserve_;
DENS_MAT JE_;
};
/**
* @class ExtrinsicModelDriftDiffusionConvection
* @brief add electron temperature physics to phonon physics, including convective transport
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelDriftDiffusionConvection
//--------------------------------------------------------
//--------------------------------------------------------
class ExtrinsicModelDriftDiffusionConvection : public ExtrinsicModelDriftDiffusion {
public:
// constructor
ExtrinsicModelDriftDiffusionConvection(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
- string matFileName);
+ std::string matFileName);
// destructor
virtual ~ExtrinsicModelDriftDiffusionConvection();
/** pre time integration */
virtual void initialize();
/** Predictor phase, executed before Verlet */
virtual void pre_init_integrate();
/** Set sources to AtC equation */
//virtual void set_sources(FIELDS & fields, FIELDS & sources);
/** Add model-specific output data */
virtual void output(OUTPUT_LIST & outputData);
/** set up LAMMPS display variables */
virtual int size_vector(int externalSize);
/** get LAMMPS display variables */
virtual bool compute_vector(int n, double & value);
protected:
/** compute the total kinetic energy of the electrons */
void compute_nodal_kinetic_energy(DENS_MAT & kineticEnergy);
/** Linear solver for velocity */
- vector<LinearSolver * > velocitySolvers_;
+ std::vector<LinearSolver * > velocitySolvers_;
/** Linear solver for solving the poisson equations */
LinearSolver * cddmPoissonSolver_;
/** offset/size for LAMMPS display output */
int baseSize_;
double timerStart_, timerCurrent_;
};
};
#endif
diff --git a/lib/atc/ExtrinsicModelElectrostatic.cpp b/lib/atc/ExtrinsicModelElectrostatic.cpp
index 515791227..d07af21c0 100644
--- a/lib/atc/ExtrinsicModelElectrostatic.cpp
+++ b/lib/atc/ExtrinsicModelElectrostatic.cpp
@@ -1,1009 +1,1014 @@
// ATC Headers
#include "ExtrinsicModelElectrostatic.h"
#include "PhysicsModel.h"
#include "ATC_Error.h"
#include "FieldEulerIntegrator.h"
#include "ATC_Coupling.h"
#include "LammpsInterface.h"
#include "PrescribedDataManager.h"
#include "PoissonSolver.h"
#include "PerAtomQuantityLibrary.h"
#include "AtomToMoleculeTransfer.h"
#include "MoleculeSet.h"
#include "ChargeRegulator.h"
+#include <set>
+
+using std::string;
+using std::vector;
+using std::map;
+using std::pair;
+using std::set;
static const double kTol_ = 1.0e-8;
static const double tol_sparse = 1.e-30;//tolerance for compaction from dense
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelElectrostatic
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ExtrinsicModelElectrostatic::ExtrinsicModelElectrostatic
(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
string matFileName) :
ExtrinsicModel(modelManager,modelType,matFileName),
poissonSolverType_(DIRECT), // ITERATIVE | DIRECT
poissonSolverTol_(0),
poissonSolverMaxIter_(0),
poissonSolver_(NULL),
maxSolves_(0),
baseSize_(0),
chargeRegulator_(NULL),
useSlab_(false),
includeShortRange_(true),
atomForces_(NULL),
nodalAtomicCharge_(NULL),
nodalAtomicGhostCharge_(NULL)
{
physicsModel_ = new PhysicsModelSpeciesElectrostatic(matFileName);
// set up correct masks for coupling
rhsMaskIntrinsic_.reset(NUM_FIELDS,NUM_FLUX);
rhsMaskIntrinsic_ = false;
if (atc_->track_charge()) {
if (! chargeRegulator_) chargeRegulator_ = new ChargeRegulator(atc_);
}
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ExtrinsicModelElectrostatic::~ExtrinsicModelElectrostatic()
{
if (poissonSolver_) delete poissonSolver_;
if (chargeRegulator_) delete chargeRegulator_;
}
//--------------------------------------------------------
// modify
//--------------------------------------------------------
bool ExtrinsicModelElectrostatic::modify(int narg, char **arg)
{
bool match = false;
int argIndx = 0;
/** */
if (strcmp(arg[argIndx],"poisson_solver")==0) {
argIndx++;
if (strcmp(arg[argIndx],"max_solves")==0) {
argIndx++;
maxSolves_ = atoi(arg[argIndx]) ; }
else if (strcmp(arg[argIndx],"tolerance")==0) {
argIndx++;
poissonSolverTol_ = atof(arg[argIndx]);
}
else if (strcmp(arg[argIndx],"max_iterations")==0) {
argIndx++;
poissonSolverMaxIter_ = atoi(arg[argIndx]);
}
else if (strcmp(arg[argIndx],"iterative")==0) {
poissonSolverType_ = ITERATIVE; }
else {
poissonSolverType_ = DIRECT; }
match = true;
} // end "poisson_solver"
/** creates fixed charge on faceset
units on surface charge density are lammps charge units / lammps length units ^ 2
fix_modify ATC extrinsic fix_charge faceset_id value
*/
#ifdef CHARGED_SURFACE
else if (strcmp(arg[argIndx],"fix_charge")==0) {
argIndx++;
string facesetName(arg[argIndx]);
argIndx++;
double chargeDensity = atof(arg[argIndx]);
surfaceCharges_[facesetName] = chargeDensity;
match = true;
}
/** */
else if (strcmp(arg[argIndx],"unfix_charge")==0) {
argIndx++;
string fsetName(arg[argIndx]);
throw ATC_Error("Ability to unfix charge not yet implemented");
match = true;
}
#endif
else if (strcmp(arg[argIndx],"control")==0) {
argIndx++;
if (strcmp(arg[argIndx],"charge")==0) {
argIndx++;
if (!atc_->track_charge()) throw ATC_Error("must have charges to regulate");
match = chargeRegulator_->modify(narg-argIndx,&arg[argIndx]);
}
}
/** switch to use slabbing */
else if (strcmp(arg[argIndx],"slab")==0) {
argIndx++;
if (strcmp(arg[argIndx],"on")==0) {
useSlab_ = true;
match = true;
}
else if (strcmp(arg[argIndx],"off")==0) {
useSlab_ = false;
match = true;
}
}
/** switch to account for short range interaces */
else if (strcmp(arg[argIndx],"short_range")==0) {
argIndx++;
if (strcmp(arg[argIndx],"on")==0) {
includeShortRange_ = true;
match = true;
}
else if (strcmp(arg[argIndx],"off")==0) {
includeShortRange_ = false;
match = true;
}
}
return match;
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void ExtrinsicModelElectrostatic::construct_transfers()
{
// add charge density transfer operator
if (atc_->track_charge()) {
InterscaleManager & interscaleManager(atc_->interscale_manager());
+
+ // make sure we have gradients at atoms
+ VectorDependencyManager<SPAR_MAT * > * interpolantGradient = interscaleManager.vector_sparse_matrix("InterpolantGradient");
+ if (!interpolantGradient) {
+ interpolantGradient = new PerAtomShapeFunctionGradient(atc_);
+ interscaleManager.add_vector_sparse_matrix(interpolantGradient,
+ "InterpolantGradient");
+ }
+
FundamentalAtomQuantity * atomicCharge =
interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE);
AtfShapeFunctionRestriction * nodalAtomicCharge =
new AtfShapeFunctionRestriction(atc_,atomicCharge,atc_->accumulant());
interscaleManager.add_dense_matrix(nodalAtomicCharge,"NodalAtomicCharge");
AtfShapeFunctionMdProjection * nodalAtomicChargeDensity =
new AtfShapeFunctionMdProjection(atc_,nodalAtomicCharge,MASS_DENSITY);
interscaleManager.add_dense_matrix(nodalAtomicChargeDensity,"NodalAtomicChargeDensity");
-
- // add species charge density transfer operators
- const map<string,pair<IdType,int> > & speciesIds(atc_->species_ids());
- map<string,pair<IdType,int> >::const_iterator specid;
- for (specid = speciesIds.begin(); specid != speciesIds.end(); specid++) {
- const string specie = specid->first;
- AtfShapeFunctionRestriction * nodalAtomicSpeciesCharge =
- new AtfShapeFunctionRestriction(atc_,atomicCharge,
- interscaleManager.sparse_matrix("Accumulant"+specie));
- interscaleManager.add_dense_matrix(nodalAtomicSpeciesCharge,"NodalAtomicSpeciesCharge"+specie);
- AtfShapeFunctionMdProjection * nodalAtomicSpeciesChargeDensity =
- new AtfShapeFunctionMdProjection(atc_,nodalAtomicSpeciesCharge,MASS_DENSITY);
- interscaleManager.add_dense_matrix(nodalAtomicSpeciesChargeDensity,"NodalAtomicSpeciesChargeDensity"+specie);
- }
// get the total charge and dipole moment at the node per molecule
// small molecules require per atom quantities with ghosts
const map<string,pair<MolSize,int> > & moleculeIds(atc_->molecule_ids());
map<string,pair<MolSize,int> >::const_iterator molecule;
PerAtomQuantity<double> * atomProcGhostCoarseGrainingPositions = interscaleManager.per_atom_quantity("AtomicProcGhostCoarseGrainingPositions");
FundamentalAtomQuantity * charge = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE,
PROC_GHOST);
for (molecule = moleculeIds.begin(); molecule != moleculeIds.end(); molecule++) {
const string moleculeName = molecule->first;
SmallMoleculeSet * smallMoleculeSet = interscaleManager.small_molecule_set(moleculeName);
// calculate nodal charge from the molecules
AtomToSmallMoleculeTransfer<double> * moleculeCharge =
new AtomToSmallMoleculeTransfer<double>(atc_,charge,smallMoleculeSet);
interscaleManager.add_dense_matrix(moleculeCharge,"MoleculeCharge"+moleculeName);
MotfShapeFunctionRestriction * nodalAtomicMoleculeCharge =
new MotfShapeFunctionRestriction(moleculeCharge,
interscaleManager.sparse_matrix("ShapeFunction"+moleculeName));
interscaleManager.add_dense_matrix(nodalAtomicMoleculeCharge,"NodalMoleculeCharge"+moleculeName);
AtfShapeFunctionMdProjection * nodalAtomicMoleculeChargeDensity =
new AtfShapeFunctionMdProjection(atc_,nodalAtomicMoleculeCharge,MASS_DENSITY);
interscaleManager.add_dense_matrix(nodalAtomicMoleculeChargeDensity,"NodalMoleculeChargeDensity"+moleculeName);
// dipole moment density
// calculate the dipole moment of the molecules
SmallMoleculeCentroid * moleculeCentroid = static_cast<SmallMoleculeCentroid*>(interscaleManager.dense_matrix("MoleculeCentroid"+moleculeName));
SmallMoleculeDipoleMoment * dipoleMoment =
new SmallMoleculeDipoleMoment(atc_,charge,smallMoleculeSet,atomProcGhostCoarseGrainingPositions,moleculeCentroid);
interscaleManager.add_dense_matrix(dipoleMoment,"DipoleMoment"+moleculeName);
MotfShapeFunctionRestriction * nodalAtomicMoleculeDipole =
new MotfShapeFunctionRestriction(dipoleMoment,
interscaleManager.sparse_matrix("ShapeFunction"+moleculeName));
interscaleManager.add_dense_matrix(nodalAtomicMoleculeDipole,"NodalMoleculeDipole"+moleculeName);
AtfShapeFunctionMdProjection * nodalAtomicMoleculeDipoleDensity =
new AtfShapeFunctionMdProjection(atc_,nodalAtomicMoleculeDipole,MASS_DENSITY);
interscaleManager.add_dense_matrix(nodalAtomicMoleculeDipoleDensity,"NodalMoleculeDipoleDensity"+moleculeName);
}
}
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void ExtrinsicModelElectrostatic::initialize()
{
ExtrinsicModel::initialize();
InterscaleManager & interscaleManager = atc_->interscale_manager();
int nNodes = atc_->num_nodes();
atomForces_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE);
rhs_[ELECTRIC_POTENTIAL].reset(nNodes,1);
#ifdef CHARGED_SURFACE
// set fixed potential surfaces form charged surfaces
map<string,double>::const_iterator isurface;
for (isurface = surfaceCharges_.begin(); isurface != surfaceCharges_.end(); isurface++)
add_charged_surface(isurface->first,isurface->second);
#endif
// set up poisson solver
rhsMask_.reset(NUM_FIELDS,NUM_FLUX);
rhsMask_ = false;
for (int i = 0; i < NUM_FLUX; i++) {
rhsMask_(ELECTRIC_POTENTIAL,i) = atc_->fieldMask_(ELECTRIC_POTENTIAL,i);
}
rhsMask_(ELECTRIC_POTENTIAL,FLUX) = false;// for poisson solve & rhs compute
// need to create the bcs for the solver to configure properly
atc_->set_fixed_nodes();
if (poissonSolver_) delete poissonSolver_;
int type = ATC::LinearSolver::ITERATIVE_SOLVE_SYMMETRIC;
if (poissonSolverType_ == DIRECT) {
type = ATC::LinearSolver::DIRECT_SOLVE;
}
poissonSolver_ = new PoissonSolver(ELECTRIC_POTENTIAL,
physicsModel_, atc_->feEngine_,
atc_->prescribedDataMgr_, atc_,
rhsMask_,type, true);
if (poissonSolverTol_) poissonSolver_->set_tolerance(poissonSolverTol_);
if (poissonSolverMaxIter_) poissonSolver_->set_max_iterations(poissonSolverMaxIter_);
poissonSolver_->initialize();
// initialize localized Green's function for FE electric field correction
if (atc_->track_charge() && includeShortRange_) {
greensFunctions_.reserve(nNodes);
// set up Green's function per node
for (int i = 0; i < nNodes; i++) {
set<int> localNodes;
for (int j = 0; j < nNodes; j++)
localNodes.insert(j);
// call Poisson solver to get Green's function for node i
DENS_VEC globalGreensFunction;
poissonSolver_->greens_function(i,globalGreensFunction);
// store green's functions as sparse vectors only on local nodes
set<int>::const_iterator thisNode;
SparseVector<double> sparseGreensFunction(nNodes);
for (thisNode = localNodes.begin(); thisNode != localNodes.end(); thisNode++)
sparseGreensFunction(*thisNode) = globalGreensFunction(*thisNode);
greensFunctions_.push_back(sparseGreensFunction);
}
}
if (atc_->track_charge()) {
double * q = LammpsInterface::instance()->atom_charge();
if (!q) throw ATC_Error(" charge tracking requested but charge pointer is null");
nodalAtomicCharge_ = interscaleManager.dense_matrix("NodalAtomicCharge");
if (! nodalAtomicCharge_) {
FundamentalAtomQuantity * atomCharge = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE);
nodalAtomicCharge_ = new AtfShapeFunctionRestriction(atc_,atomCharge,
atc_->accumulant());
interscaleManager.add_dense_matrix(nodalAtomicCharge_,"NodalAtomicCharge");
}
if (atc_->groupbitGhost_) {
nodalAtomicGhostCharge_ = interscaleManager.dense_matrix("NodalAtomicGhostCharge");
if (! nodalAtomicGhostCharge_) {
FundamentalAtomQuantity * ghostCharge = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE, GHOST);
+
+ PerAtomSparseMatrix<double> * ghostShapeFunctions = interscaleManager.per_atom_sparse_matrix("InterpolantGhost");
+ if (!ghostShapeFunctions) {
+ ghostShapeFunctions = new PerAtomShapeFunction(atc_,
+ interscaleManager.per_atom_quantity("AtomicGhostCoarseGrainingPositions"),
+ interscaleManager.per_atom_int_quantity("AtomGhostElement"),
+ GHOST);
+ interscaleManager.add_per_atom_sparse_matrix(ghostShapeFunctions,"InterpolantGhost");
+ }
+
nodalAtomicGhostCharge_ = new AtfShapeFunctionRestriction(atc_,ghostCharge,
- interscaleManager.per_atom_sparse_matrix("InterpolantGhost"));
+ ghostShapeFunctions);
interscaleManager.add_dense_matrix(nodalAtomicGhostCharge_,"NodalAtomicGhostCharge");
}
}
}
if (chargeRegulator_) {
if (! poissonSolver_) throw ATC_Error("passing of Poisson solver from ExtrinsicModelElectrostatic to ChargeRegulator failed");
chargeRegulator_->assign_poisson_solver(poissonSolver_);
chargeRegulator_->construct_methods();
chargeRegulator_->initialize();
}
// set initial force
post_force();
}
//--------------------------------------------------------
// pre final integration
//--------------------------------------------------------
void ExtrinsicModelElectrostatic::post_init_integrate()
{
if (chargeRegulator_) chargeRegulator_->apply_pre_force(atc_->dt());
}
//--------------------------------------------------------
// post force
//--------------------------------------------------------
void ExtrinsicModelElectrostatic::post_force()
{
if (chargeRegulator_) chargeRegulator_->apply_post_force(atc_->dt());
// add in correction accounting for lumped mass matrix in charge density
// in atomistic part of domain & account for physics model fluxes,resets rhs
// set Dirchlet data
atc_->set_fixed_nodes();
// set sources
(atc_->prescribed_data_manager())->set_sources(atc_->time()+0.5*(atc_->dt()),atc_->sources());
// compute Poisson equation RHS sources
atc_->compute_rhs_vector(rhsMask_, atc_->fields_, rhs_, atc_->source_integration(), physicsModel_);
// add atomic charges to rhs
DENS_MAT & rhs = rhs_[ELECTRIC_POTENTIAL].set_quantity();
if (atc_->track_charge()) {
rhs += nodalAtomicCharge_->quantity();
if (nodalAtomicGhostCharge_) {
rhs += nodalAtomicGhostCharge_->quantity();
}
}
// solve poisson eqn for electric potential
// electron charge density added to Poisson RHS in solver
DENS_MAT & potential = (atc_->field(ELECTRIC_POTENTIAL)).set_quantity();
if ( maxSolves_ == 0 || (atc_->local_step() < maxSolves_) ) {
//potential.print("POT");
// rhs.print("RHS");
bool converged = poissonSolver_->solve(potential,rhs);
if (! converged ) throw ATC_Error("Poisson solver did not converge in ExtrinsicModelElectrostatic");
}
// do this for intrinsic charges or effective electron charges at atoms
if (atc_->track_charge()
|| ( LammpsInterface::instance()->atom_charge() && atc_->source_atomic_quadrature(ELECTRIC_POTENTIAL) ) ) {
_atomElectricalForce_.resize(atc_->nlocal(),atc_->nsd());
add_electrostatic_forces(potential);
#ifdef CHARGED_SURFACE
if (includeShortRange_)
apply_charged_surfaces(potential);
#endif
InterscaleManager & interscaleManager_ = atc_->interscale_manager();
atomForces_ = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE);
(*atomForces_) += _atomElectricalForce_; // f_E in ours, f in lammps ultimately
}
}
//--------------------------------------------------------
// output
//--------------------------------------------------------
void ExtrinsicModelElectrostatic::output(OUTPUT_LIST & outputData)
{
double scale = 1./(LammpsInterface::instance()->ftm2v());
double localF[3];
if (_atomElectricalForce_.nRows() > 0) {
localF[0] = scale*(_atomElectricalForce_).col_sum(0);
localF[1] = scale*(_atomElectricalForce_).col_sum(1);
localF[2] = scale*(_atomElectricalForce_).col_sum(2);
}
else {
localF[0] = 0.;localF[1] = 0.; localF[2] = 0.;
}
LammpsInterface::instance()->allsum(localF,totalElectricalForce_,3);
if (LammpsInterface::instance()->rank_zero()) {
atc_->feEngine_->add_global("electrostatic_force_x", totalElectricalForce_[0]);
atc_->feEngine_->add_global("electrostatic_force_y", totalElectricalForce_[1]);
atc_->feEngine_->add_global("electrostatic_force_z", totalElectricalForce_[2]);
}
// add in FE fields related to charge
FIELDS & fields(atc_->fields());
FIELDS::const_iterator rhoField = fields.find(CHARGE_DENSITY);
if (rhoField!=fields.end()) {
InterscaleManager & interscaleManager(atc_->interscale_manager());
const DENS_MAN * atomicChargeDensity(interscaleManager.dense_matrix("NodalAtomicChargeDensity"));
atc_->nodal_atomic_field(CHARGE_DENSITY) = atomicChargeDensity->quantity();
fields[CHARGE_DENSITY] = atomicChargeDensity->quantity();
DENS_MAT & chargeDensity(fields[CHARGE_DENSITY].set_quantity());
DENS_MAT & nodalAtomicChargeDensity((atc_->nodal_atomic_field(CHARGE_DENSITY)).set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData["charge_density"] = &chargeDensity;
outputData["NodalAtomicChargeDensity"] = &nodalAtomicChargeDensity;
}
}
if (fields.find(ELECTRON_DENSITY)==fields.end()) {
fields[ELECTRON_DENSITY].reset(fields[CHARGE_DENSITY].nRows(),1);
DENS_MAT & electronDensity(fields[ELECTRON_DENSITY].set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData["electron_density"] = &electronDensity;
}
}
- const map<string,pair<IdType,int> > & speciesIds(atc_->species_ids());
- map<string,pair<IdType,int> >::const_iterator specie;
- for (specie = speciesIds.begin(); specie != speciesIds.end(); specie++) {
- DENS_MAN & nodalAtomicSpeciesChargeDensityOut(atc_->tagged_dens_man("NodalAtomicSpeciesChargeDensity"+specie->first));
- DENS_MAN * nodalAtomicSpeciesChargeDensity((atc_->interscale_manager()).dense_matrix("NodalAtomicSpeciesChargeDensity"+specie->first));
- nodalAtomicSpeciesChargeDensityOut = nodalAtomicSpeciesChargeDensity->quantity();
- }
-
const map<string,pair<MolSize,int> > & moleculeIds(atc_->molecule_ids());
map<string,pair<MolSize,int> >::const_iterator molecule;
for (molecule = moleculeIds.begin(); molecule != moleculeIds.end(); molecule++) {
// net charge
DENS_MAN & nodalMoleculeChargeDensityOut(atc_->tagged_dens_man("NodalMoleculeChargeDensity"+molecule->first));
DENS_MAN * nodalMoleculeChargeDensity((atc_->interscale_manager()).dense_matrix("NodalMoleculeChargeDensity"+molecule->first));
nodalMoleculeChargeDensityOut = nodalMoleculeChargeDensity->quantity();
// dipole moment
DENS_MAN & nodalMoleculeDipoleDensityOut(atc_->tagged_dens_man("NodalMoleculeDipoleDensity"+molecule->first));
DENS_MAN * nodalMoleculeDipoleDensity((atc_->interscale_manager()).dense_matrix("NodalMoleculeDipoleDensity"+molecule->first));
nodalMoleculeDipoleDensityOut = nodalMoleculeDipoleDensity->quantity();
}
if(chargeRegulator_) chargeRegulator_->output(outputData);
}
//--------------------------------------------------------
// size_vector
//--------------------------------------------------------
int ExtrinsicModelElectrostatic::size_vector(int intrinsicSize)
{
baseSize_ = intrinsicSize;
return 5;
}
//--------------------------------------------------------
// compute_scalar : added energy = - f.x
//--------------------------------------------------------
double ExtrinsicModelElectrostatic::compute_scalar(void)
{
//((atc_->interscale_manager()).fundamental_atom_quantity(LammpsInterface::ATOM_POSITION))->force_reset();
const DENS_MAT & atomPosition = ((atc_->interscale_manager()).fundamental_atom_quantity(LammpsInterface::ATOM_POSITION))->quantity();
double local_fdotx = 0, fdotx;
for (int i = 0; i < _atomElectricalForce_.nRows() ; i++) {
for (int j = 0; j < _atomElectricalForce_.nCols() ; j++) {
local_fdotx -= _atomElectricalForce_(i,j)*atomPosition(i,j);
}
}
LammpsInterface::instance()->allsum(&local_fdotx,&fdotx,1);
// convert
fdotx *= LammpsInterface::instance()->mvv2e();
return fdotx;
}
//--------------------------------------------------------
// compute_vector
//--------------------------------------------------------
bool ExtrinsicModelElectrostatic::compute_vector(int n, double & value)
{
if (n == baseSize_) {
double nSum = ((atc_->field(ELECTRON_DENSITY)).quantity()).col_sum();
value = nSum;
return true;
}
else if (n > baseSize_ && n < baseSize_+4) {
int dof = n-baseSize_-1;
double localF = (_atomElectricalForce_).col_sum(dof), F=0;
LammpsInterface::instance()->allsum(&localF,&F,1);
double ftm2v = LammpsInterface::instance()->ftm2v();
value = F/ftm2v;
return true;
}
else if (n == baseSize_+4) {
double nSum = ((atc_->field(ELECTRIC_POTENTIAL)).quantity()).col_sum();
value = nSum;
return true;
}
return false;
}
//--------------------------------------------------------
// add_electrostatic_forces
//--------------------------------------------------------
void ExtrinsicModelElectrostatic::add_electrostatic_forces
(MATRIX & potential)
{
//double qE2f = LammpsInterface::instance()->qe2f();
double qV2e = LammpsInterface::instance()->qv2e(); // charge volts to our energy units
//double ** f = LammpsInterface::instance()->fatom();
double * q = LammpsInterface::instance()->atom_charge();
// f_ai = \sum_IJ N_Ia Bi_IJ phi_J = \sum_I N_Ia Ei_I
int nsd = atc_->nsd();
int nLocal = atc_->nlocal();
DENS_MAT E(nLocal,nsd);
+ const SPAR_MAT_VEC & shapeFucntionDerivatives(((atc_->interscale_manager()).vector_sparse_matrix("InterpolantGradient"))->quantity());
if (nLocal > 0) {
for (int i=0; i < nsd; i++) {
CLON_VEC Ei = column(E,i);
- Ei = -1.*(*(((atc_->shpFcnDerivs_)->quantity())[i])*potential);
+ Ei = -1.*(*(shapeFucntionDerivatives[i])*potential);
}
}
int dimOffset = 0;
if (useSlab_) dimOffset = nsd - 1;
for (int i = 0; i < nLocal; i++) {
int atomIdx = atc_->internalToAtom_(i);
double c = qV2e*q[atomIdx];
for (int j = 0; j < dimOffset; j ++)
_atomElectricalForce_(i,j) = 0.;
for (int j = dimOffset; j < nsd; j ++)
_atomElectricalForce_(i,j) = c*E(i,j);
}
// correct field for short range interactions
if (includeShortRange_)
correct_electrostatic_forces();
}
//--------------------------------------------------------
// correct_electrostatic_forces
//--------------------------------------------------------
void ExtrinsicModelElectrostatic::correct_electrostatic_forces()
{
// compute restricted sparse shape function set for each atom
// to account for its Green's Function
//double qE2f = LammpsInterface::instance()->qe2f();
double qV2e = LammpsInterface::instance()->qv2e();
double * q = LammpsInterface::instance()->atom_charge();
vector<SparseVector<double> > atomicFePotential;
int nLocal = atc_->nlocal();
int nGhostLammps = LammpsInterface::instance()->nghost();
int nLocalLammps = LammpsInterface::instance()->nlocal();
int nLocalTotal = nLocalLammps + nGhostLammps; // total number of atoms on this processor
atomicFePotential.reserve(nLocalTotal);
SparseVector<double> dummy(atc_->num_nodes());
for (int i = 0; i < nLocalTotal; i++)
atomicFePotential.push_back(dummy);
// compute local potential contributions from atoms on this processor
InterscaleManager & interscaleManager(atc_->interscale_manager());
const SPAR_MAT & myShpFcn((interscaleManager.per_atom_sparse_matrix("Interpolant"))->quantity());
for (int i = 0; i < nLocal; i++) {
DenseVector<INDEX> nodeIndices;
DENS_VEC nodeValues;
myShpFcn.row(i,nodeValues,nodeIndices);
int atomIdx = atc_->internalToAtom_(i);
//double c = qE2f*q[atomIdx];
//double c = qV2e*q[atomIdx];
//nodeValues *= c;
nodeValues *= q[atomIdx];
for (int j = 0; j < nodeIndices.size(); j++)
atomicFePotential[atomIdx].add_scaled(greensFunctions_[nodeIndices(j)],nodeValues(j));
}
// compute local potential contribtutions for lammps ghost atoms
// which are known to ATC,
// this will grab both processor and periodic neighbors,
// so we need to add in neighbor contributions using lammps indices
// rather than atc indices or we could potentially
// double count periodic contributions
double ** xatom = LammpsInterface::instance()->xatom();
const int * mask = LammpsInterface::instance()->atom_mask();
int nodesPerElement = ((atc_->feEngine_)->fe_mesh())->num_nodes_per_element();
int nsd = atc_->nsd();
for (int i = nLocalLammps; i < nLocalTotal; i++) {
if (mask[i] & atc_->groupbit_) {
DENS_VEC coords(nsd);
coords.copy(xatom[i],nsd);
Array<int> nodeIndices(nodesPerElement);
DENS_VEC nodeValues(nodesPerElement);
(atc_->feEngine_)->shape_functions(coords,nodeValues,nodeIndices);
//double c = qV2e*q[i];
//nodeValues *= c;
nodeValues *= q[i];
for (int j = 0; j < nodeIndices.size(); j++) {
atomicFePotential[i].add_scaled(greensFunctions_[nodeIndices(j)],nodeValues(j));
}
}
}
// Get sparse vectors of derivatives at each atom
// to compute this only when the shape functions change
vector<vector<SparseVector<double> > > atomicDerivatives;
atomicDerivatives.reserve(nLocal);
for (int i = 0; i < nLocal; i++) {
// determine shape function derivatives at atomic location
// and construct sparse vectors to store derivative data
vector<SparseVector<double> > derivativeVectors;
derivativeVectors.reserve(nsd);
for (int j = 0; j < nsd; j++)
derivativeVectors.push_back(dummy);
atomicDerivatives.push_back(derivativeVectors);
InterscaleManager & interscaleManager(atc_->interscale_manager());
const SPAR_MAT_VEC & shapeFucntionDerivatives((interscaleManager.vector_sparse_matrix("InterpolantGradient"))->quantity());
for (int j = 0; j < nsd; j++) {
DenseVector<INDEX> nodeIndices;
DENS_VEC nodeValues;
shapeFucntionDerivatives[j]->row(i,nodeValues,nodeIndices);
for (int k = 0; k < nodeIndices.size(); k++)
atomicDerivatives[i][j](nodeIndices(k)) = nodeValues(k);
}
}
// loop over all atoms and correct their efield based on all their
// neighbor's local efield response
// need to use specific coulombic cutoff from different pairs
// see pair_coul_cut for an example of the data structures
// unfortunately don't know how to get at this data in general
// beyond a cast from the LAMMPS pair object (see force.h).
// Until this is fixed, only use this method with the coulombic force
// the same for all pairs and equal to the largest force cutoff.
// Probably the best fix is to implement our own pair style for this.
double cutoffRadius = LammpsInterface::instance()->pair_cutoff();
double cutoffSq = cutoffRadius*cutoffRadius;
int inum = LammpsInterface::instance()->neighbor_list_inum();
int * ilist = LammpsInterface::instance()->neighbor_list_ilist();
int * numneigh = LammpsInterface::instance()->neighbor_list_numneigh();
int ** firstneigh = LammpsInterface::instance()->neighbor_list_firstneigh();
// loop over neighbors of my atoms
for (int ii = 0; ii < inum; ii++) {
int i = ilist[ii];
if (mask[i] & atc_->groupbit_) {
double xtmp = xatom[i][0];
double ytmp = xatom[i][1];
double ztmp = xatom[i][2];
int * jlist = firstneigh[i];
int jnum = numneigh[i];
for (int jj = 0; jj < jnum; jj++) {
int j = jlist[jj];
if (mask[j] & atc_->groupbit_) {
//double factor_coul = LammpsInterface::instance()->coulomb_factor(j);
LammpsInterface::instance()->neighbor_remap(j);
double delx = xtmp - xatom[j][0];
double dely = ytmp - xatom[j][1];
double delz = ztmp - xatom[j][2];
double rsq = delx*delx + dely*dely + delz*delz;
if (rsq < cutoffSq) {
DENS_VEC efield(nsd);
efield = 0.;
int atcIdx = atc_->atomToInternal_[i];
for (int k = 0; k < nsd; k++)
efield(k) = -1.*dot(atomicDerivatives[atcIdx][k],atomicFePotential[j]);
// apply correction in atomic forces
//double c = factor_coul*qE2f*q[i];
//double c = factor_coul*qV2e*q[i];
double c = qV2e*q[i];
for (int k = 0; k < nsd; k++) {
if ((!useSlab_) || (k==nsd)) {
//f[i][k] -= c*efield(k);
_atomElectricalForce_(atcIdx,k) -= c*efield(k);
}
}
}
}
}
}
}
}
#ifdef CHARGED_SURFACE
//--------------------------------------------------------
// add_charged_surface
//--------------------------------------------------------
void ExtrinsicModelElectrostatic::add_charged_surface(const string & facesetName,
const double chargeDensity)
{
// get faceset information
int nNodes = atc_->num_nodes();
const FE_Mesh * feMesh = (atc_->feEngine_)->fe_mesh();
const set< pair <int,int> > * faceset
= & ( feMesh->faceset(facesetName));
// set face sources to all point at one function for use in integration
SURFACE_SOURCE faceSources;
XT_Function * f = XT_Function_Mgr::instance()->constant_function(1.);
set< pair<int,int> >::const_iterator iset;
for (iset = faceset->begin(); iset != faceset->end(); iset++) {
pair<int,int> face = *iset;
// allocate
Array < XT_Function * > & dof = faceSources[ELECTRIC_POTENTIAL][face];
dof.reset(1);
dof(0) = f;
}
// Get associated nodeset
set<int> nodeset;
feMesh->faceset_to_nodeset(facesetName,nodeset);
// Get coordinates of each node in face set
map<int,pair<DENS_VEC,double> > & myFaceset = chargedSurfaces_[facesetName];
set<int>::const_iterator myNode;
for (myNode = nodeset.begin(); myNode != nodeset.end(); myNode++) {
DENS_VEC myCoords = feMesh->nodal_coordinates(*myNode);
pair<DENS_VEC,double> myPair(myCoords,0.);
myFaceset[*myNode] = myPair;
}
// computed integrals of nodal shape functions on face
FIELDS nodalFaceWeights;
nodalFaceWeights[ELECTRIC_POTENTIAL].reset(nNodes,1);
Array<bool> fieldMask(NUM_FIELDS);
fieldMask(ELECTRIC_POTENTIAL) = true;
(atc_->feEngine_)->add_fluxes(fieldMask,0.,faceSources,nodalFaceWeights);
// set up data structure holding charged faceset information
FIELDS sources;
double coulombConstant = LammpsInterface::instance()->coulomb_constant();
map<int,pair<DENS_VEC,double> >::iterator myNodeData;
for (myNodeData = myFaceset.begin(); myNodeData != myFaceset.end(); myNodeData++) {
// evaluate voltage at each node I
// set up X_T function for integration: k*chargeDensity/||x_I - x_s||
// integral is approximated in two parts:
// 1) near part with all faces within r < rcrit evaluated as 2 * pi * rcrit * k sigma A/A0, A is area of this region and A0 = pi * rcrit^2, so 2 k sigma A / rcrit
// 2) far part evaluated using Gaussian quadrature on faceset
double rcritSq = LammpsInterface::instance()->pair_cutoff();
rcritSq *= rcritSq;
int nodalIndex = myNodeData->first;
DENS_VEC myCoords((myNodeData->second).first);
double xtArgs[8];
xtArgs[0] = myCoords(0); xtArgs[1] = myCoords(1); xtArgs[2] = myCoords(2);
xtArgs[3] = 1.; xtArgs[4] = 1.; xtArgs[5] = 1.;
xtArgs[6] = coulombConstant*chargeDensity;
xtArgs[7] = -1.;
string radialPower = "radial_power";
f = XT_Function_Mgr::instance()->function(radialPower,8,xtArgs);
for (iset = faceset->begin(); iset != faceset->end(); iset++) {
pair<int,int> face = *iset;
// allocate
Array < XT_Function * > & dof = faceSources[ELECTRIC_POTENTIAL][face];
dof.reset(1);
dof(0) = f;
}
// perform integration to get quantities at nodes on facesets
// V_J' = int_S N_J k*sigma/|x_I - x_s| dS
sources[ELECTRIC_POTENTIAL].reset(nNodes,1);
(atc_->feEngine_)->add_fluxes(fieldMask,0.,faceSources,sources);
double myPotential = 0.;
// sum over all nodes in faceset to get total potential:
// V_I = sum_J VJ'
const DENS_MAT & myPotentialSource(sources[ELECTRIC_POTENTIAL].quantity());
nodalChargePotential_[facesetName][nodalIndex] = myPotentialSource(nodalIndex,0);
for (myNode = nodeset.begin(); myNode != nodeset.end(); myNode++)
myPotential += myPotentialSource(*myNode,0);
// assign an XT function per each node and
// then call the prescribed data manager and fix each node individually.
f = XT_Function_Mgr::instance()->constant_function(myPotential);
(atc_->prescribedDataMgr_)->fix_field(nodalIndex,ELECTRIC_POTENTIAL,0,f);
// compute effective charge at each node I
// multiply charge density by integral of N_I over face
(myNodeData->second).second = (nodalFaceWeights[ELECTRIC_POTENTIAL].quantity())(nodalIndex,0)*chargeDensity;
}
}
//--------------------------------------------------------
// apply_charged_surfaces
//--------------------------------------------------------
void ExtrinsicModelElectrostatic::apply_charged_surfaces
(MATRIX & potential)
{
//double qE2f = LammpsInterface::instance()->qe2f();
double qV2e = LammpsInterface::instance()->qv2e();
double qqrd2e = LammpsInterface::instance()->qqrd2e();
//double ** fatom = LammpsInterface::instance()->fatom();
double * qatom = LammpsInterface::instance()->atom_charge();
double cutoffRadius = LammpsInterface::instance()->pair_cutoff();
double cutoffSq = cutoffRadius*cutoffRadius;
int nLocal = atc_->nlocal();
int nsd = atc_->nsd();
int nNodes = atc_->num_nodes();
double penalty = poissonSolver_->penalty_coefficient();
if (penalty <= 0.0) throw ATC_Error("ExtrinsicModelElectrostatic::apply_charged_surfaces expecting non zero penalty");
SparseVector<double> dummy(atc_->num_nodes());
map<string,map<int,pair<DENS_VEC,double> > >::const_iterator isurface;
for (isurface = chargedSurfaces_.begin(); isurface != chargedSurfaces_.end(); isurface++) {
string facesetName = isurface->first;
map<int,pair<DENS_VEC,double> >::const_iterator inode;
for (inode = (isurface->second).begin(); inode != (isurface->second).end(); inode++) {
int nodeId = inode->first;
DENS_VEC nodalCoords = (inode->second).first;
double nodalCharge = (inode->second).second;
double nodalPotential = nodalChargePotential_[facesetName][nodeId];
PerAtomQuantity<double> * atomicCoords = (atc_->interscale_manager()).per_atom_quantity("AtomicCoarseGrainingPositions");
const DENS_MAT & myAtomicCoords(atomicCoords->quantity());
for (int i = 0; i < nLocal; i++) {
int atomIdx = atc_->internalToAtom_(i);
if (abs(qatom[atomIdx]) > 0) {
double distanceSq = 0.;
double deltaX[3];
for (int j = 0; j < nsd; j++) {
deltaX[j] = myAtomicCoords(i,j) - nodalCoords(j);
distanceSq += deltaX[j]*deltaX[j];
}
if (distanceSq < cutoffSq) {
// first apply pairwise coulombic interaction
if (!useSlab_) {
double coulForce = qqrd2e*nodalCharge*qatom[atomIdx]/(distanceSq*sqrtf(distanceSq));
for (int j = 0; j < nsd; j++)
//fatom[atomIdx][j] += deltaX[j]*coulForce;
_atomElectricalForce_(i,j) += deltaX[j]*coulForce;
}
// second correct for FE potential induced by BCs
// determine shape function derivatives at atomic location
// and construct sparse vectors to store derivative data
vector<SparseVector<double> > derivativeVectors;
derivativeVectors.reserve(nsd);
InterscaleManager & interscaleManager(atc_->interscale_manager());
const SPAR_MAT_VEC & shapeFunctionDerivatives((interscaleManager.vector_sparse_matrix("InterpolantGradient"))->quantity());
for (int j = 0; j < nsd; j++) {
DenseVector<INDEX> nodeIndices;
DENS_VEC nodeValues;
shapeFunctionDerivatives[j]->row(i,nodeValues,nodeIndices);
derivativeVectors.push_back(dummy);
for (int k = 0; k < nodeIndices.size(); k++)
derivativeVectors[j](nodeIndices(k)) = nodeValues(k);
}
// compute greens function from charge quadrature
SparseVector<double> shortFePotential(nNodes);
shortFePotential.add_scaled(greensFunctions_[nodeId],penalty*nodalPotential);
// compute electric field induced by charge
DENS_VEC efield(nsd);
efield = 0.;
for (int j = 0; j < nsd; j++)
efield(j) = -.1*dot(derivativeVectors[j],shortFePotential);
// apply correction in atomic forces
//double c = qE2f*qatom[atomIdx];
double c = qV2e*qatom[atomIdx];
for (int j = 0; j < nsd; j++)
if ((!useSlab_) || (j==nsd)) {
//fatom[atomIdx][j] -= c*efield(j);
_atomElectricalForce_(i,j) -= c*efield(j);
}
}
}
}
}
}
}
#endif
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelElectrostaticMomentum
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ExtrinsicModelElectrostaticMomentum::ExtrinsicModelElectrostaticMomentum
(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
string matFileName) :
ExtrinsicModelElectrostatic(modelManager,modelType,matFileName)
{
if (physicsModel_) delete physicsModel_;
if (modelType == ELECTROSTATIC) {
physicsModel_ = new PhysicsModelElectrostatic(matFileName);
}
else {
physicsModel_ = new PhysicsModelElectrostaticEquilibrium(matFileName);
}
// set up correct masks for coupling
rhsMaskIntrinsic_(VELOCITY,SOURCE) = true;
atc_->fieldMask_(VELOCITY,EXTRINSIC_SOURCE) = true;
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ExtrinsicModelElectrostaticMomentum::~ExtrinsicModelElectrostaticMomentum()
{
// do nothing
}
//--------------------------------------------------------
// modify
//--------------------------------------------------------
bool ExtrinsicModelElectrostaticMomentum::modify(int narg, char **arg)
{
bool match = false;
if (!match)
match = ExtrinsicModelElectrostatic::modify(narg,arg);
return match;
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void ExtrinsicModelElectrostaticMomentum::initialize()
{
ExtrinsicModelElectrostatic::initialize();
int nNodes = atc_->num_nodes();
int nsd = atc_->nsd();
rhs_[VELOCITY].reset(nNodes,nsd);
}
//--------------------------------------------------------
// set coupling source terms
//--------------------------------------------------------
void ExtrinsicModelElectrostaticMomentum::set_sources(FIELDS & fields, FIELDS & sources)
{
// compute charge density
if (modelType_ == ELECTROSTATIC_EQUILIBRIUM) {
DENS_MAN & n = atc_->field(ELECTRON_DENSITY);
atc_->nodal_projection(ELECTRON_DENSITY,physicsModel_,n);
}
// else {
// FIELDS rhs;
// Array2D<bool> mask;
// mask(ELECTRON_DENSITY,SOURCE) = true;
// atc_->evaluate_rhs_integral(mask,fields,rhs,FULL_DOMAIN,physicsModel_);
// atc_->apply_inverse_mass_matrix(rhs[ELECTRON_DENSITY].quantity(),n.set_quantity(),ELECTRON_DENSITY);
// }
// compute source term with appropriate masking and physics model
atc_->evaluate_rhs_integral(rhsMaskIntrinsic_, fields, sources,
atc_->source_integration(), physicsModel_);
//(sources[VELOCITY].quantity()).print("V SRC");
}
//--------------------------------------------------------
// output
//--------------------------------------------------------
void ExtrinsicModelElectrostaticMomentum::output(OUTPUT_LIST & outputData)
{
ExtrinsicModelElectrostatic::output(outputData);
}
};
diff --git a/lib/atc/ExtrinsicModelElectrostatic.h b/lib/atc/ExtrinsicModelElectrostatic.h
index b33cfed18..c4a0af464 100644
--- a/lib/atc/ExtrinsicModelElectrostatic.h
+++ b/lib/atc/ExtrinsicModelElectrostatic.h
@@ -1,184 +1,187 @@
#ifndef EXTRINSIC_MODEL_ELECTROSTATIC
#define EXTRINSIC_MODEL_ELECTROSTATIC
-/** owned fields: ELECTRIC_POTENTIAL */
+// WIP_REJ
#define CHARGED_SURFACE
-// ATC headers
#include "ExtrinsicModel.h"
+#include <utility>
+#include <string>
+#include <vector>
+#include <map>
-using namespace std;
namespace ATC {
// forward declarations
class ATC_Coupling;
class PrescribedDataManager;
class ExtrinsicModel;
class PhysicsModel;
class PoissonSolver;
class FundamentalAtomQuantity;
class AtfShapeFunctionRestriction;
class ChargeRegulator;
/**
* @class ExtrinsicModelElectrostatic
* @brief add self-consistent electrostatic forces
+ * owned field: ELECTRIC_POTENTIAL
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelElectrostatic
//--------------------------------------------------------
//--------------------------------------------------------
class ExtrinsicModelElectrostatic : public ExtrinsicModel {
public:
// constructor
ExtrinsicModelElectrostatic(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
- string matFileName);
+ std::string matFileName);
// destructor
virtual ~ExtrinsicModelElectrostatic();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** construct transfers needed for model */
virtual void construct_transfers();
/** pre time integration */
virtual void initialize();
/** Predictor phase, executed before Verlet */
virtual void post_init_integrate();
/** changes lammps forces to include long-range electrostatic interactions */
virtual void post_force();
/** Add model-specific output data */
virtual void output(OUTPUT_LIST & outputData);
/** set up LAMMPS display variables */
virtual int size_vector(int externalSize);
/** get LAMMPS display variables */
virtual double compute_scalar(void);
virtual bool compute_vector(int n, double & value);
PoissonSolver * poisson_solver(void) const { return poissonSolver_;}
protected:
/** poisson solver type */
SolverType poissonSolverType_;
double poissonSolverTol_;
int poissonSolverMaxIter_;
/** poisson solver */
PoissonSolver * poissonSolver_;
/** max solves per minimize */
int maxSolves_;
/** offset/size for LAMMPS display output */
int baseSize_;
/** rhs mask for Poisson solver */
Array2D<bool> rhsMask_;
/** estimate instrinsic charge density */
void add_electrostatic_forces(MATRIX & nodalPotential);
/** correct short range FE electric field */
void correct_electrostatic_forces();
#ifdef CHARGED_SURFACE
/** account for charged surfaces on charged atoms */
void apply_charged_surfaces(MATRIX & nodalPotential);
/** set charged surface data */
- void add_charged_surface(const string & facesetName,
+ void add_charged_surface(const std::string & facesetName,
const double chargeDensity);
#endif
/** charge regulator */
ChargeRegulator * chargeRegulator_;
/** local electric potential Green's function for each node */
- vector<SparseVector<double> > greensFunctions_;
+ std::vector<SparseVector<double> > greensFunctions_;
#ifdef CHARGED_SURFACE
/** stores surface charge data at fixed charge surfaces */
- map<string,double> surfaceCharges_;
+ std::map<std::string,double> surfaceCharges_;
/** data structure to store information for applying charged surfaces */
- map<string,map<int,pair<DENS_VEC,double> > > chargedSurfaces_;
+ std::map<std::string,std::map<int,std::pair<DENS_VEC,double> > > chargedSurfaces_;
#endif
/** data structure storing potential induced only by charges under the nodal shape function support */
- map<string,map<int,double> > nodalChargePotential_;
+ std::map<std::string,std::map<int,double> > nodalChargePotential_;
/** allows electric force only applied only in z direction to complement LAMMPS slab command */
bool useSlab_;
/** enables method when short range interactions are off */
bool includeShortRange_;
/** atomic forces */
FundamentalAtomQuantity * atomForces_;
/** coarse-grained charges from internal atoms */
DENS_MAN * nodalAtomicCharge_;
/** coarse-grained charges from ghost atoms */
DENS_MAN * nodalAtomicGhostCharge_;
/** workspace */
DENS_MAT _atomElectricalForce_;
double totalElectricalForce_[3];
};
/**
* @class ExtrinsicModelElectrostaticMomentum
* @brief add self-consistent electrostatic forces with elastic coupling
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelElectrostaticMomentum
//--------------------------------------------------------
//--------------------------------------------------------
class ExtrinsicModelElectrostaticMomentum : public ExtrinsicModelElectrostatic {
public:
// constructor
ExtrinsicModelElectrostaticMomentum(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
- string matFileName);
+ std::string matFileName);
// destructor
virtual ~ExtrinsicModelElectrostaticMomentum();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** pre time integration */
virtual void initialize();
/** Set sources to AtC equation */
virtual void set_sources(FIELDS & fields, FIELDS & sources);
/** Add model-specific output data */
virtual void output(OUTPUT_LIST & outputData);
};
};
#endif
diff --git a/lib/atc/ExtrinsicModelTwoTemperature.cpp b/lib/atc/ExtrinsicModelTwoTemperature.cpp
index 864857ac2..ddacbf229 100644
--- a/lib/atc/ExtrinsicModelTwoTemperature.cpp
+++ b/lib/atc/ExtrinsicModelTwoTemperature.cpp
@@ -1,268 +1,270 @@
// ATC Headers
#include "ExtrinsicModelTwoTemperature.h"
#include "ATC_Error.h"
#include "FieldEulerIntegrator.h"
#include "ATC_Coupling.h"
#include "LammpsInterface.h"
#include "PrescribedDataManager.h"
#include "PhysicsModel.h"
+using std::string;
+
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelTwoTemperature
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ExtrinsicModelTwoTemperature::ExtrinsicModelTwoTemperature
(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
string matFileName) :
ExtrinsicModel(modelManager,modelType,matFileName),
electronTimeIntegration_(TimeIntegrator::IMPLICIT),
temperatureIntegrator_(NULL),
nsubcycle_(1),
exchangeFlag_(true),
baseSize_(0)
{
physicsModel_ = new PhysicsModelTwoTemperature(matFileName);
// set up correct masks for coupling
rhsMaskIntrinsic_.reset(NUM_FIELDS,NUM_FLUX);
rhsMaskIntrinsic_ = false;
rhsMaskIntrinsic_(TEMPERATURE,SOURCE) = true;
atc_->fieldMask_(TEMPERATURE,EXTRINSIC_SOURCE) = true;
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ExtrinsicModelTwoTemperature::~ExtrinsicModelTwoTemperature()
{
if (temperatureIntegrator_) delete temperatureIntegrator_;
}
//--------------------------------------------------------
// modify
//--------------------------------------------------------
bool ExtrinsicModelTwoTemperature::modify(int narg, char **arg)
{
bool match = false;
int argIndx = 0;
// energy exchange switch
/*! \page man_extrinsic_exchange fix_modify AtC extrinsic exchange
\section syntax
fix_modify AtC extrinsic exchange <on|off>
\section examples
<TT> fix_modify AtC extrinsic exchange on </TT> \n
\section description
Switches energy exchange between the MD system and electron system on and off
\section restrictions
Only valid for use with two_temperature type of AtC fix.
\section related
see \ref man_fix_atc
\section default
on
*/
if (strcmp(arg[argIndx],"exchange")==0) {
argIndx++;
if (strcmp(arg[argIndx],"off")==0) {
exchangeFlag_ = false;
rhsMaskIntrinsic_(TEMPERATURE,SOURCE) = false;
atc_->fieldMask_(ELECTRON_TEMPERATURE,SOURCE) = false;
atc_->fieldMask_(TEMPERATURE,EXTRINSIC_SOURCE) = false;
}
else {
exchangeFlag_ = true;
rhsMaskIntrinsic_(TEMPERATURE,SOURCE) = true;
atc_->fieldMask_(ELECTRON_TEMPERATURE,SOURCE) = true;
atc_->fieldMask_(TEMPERATURE,EXTRINSIC_SOURCE) = true;
}
match = true;
} // end "exchange"
// electron integration type
/*! \page man_electron_integration fix_modify AtC extrinsic electron_integration
\section syntax
fix_modify AtC extrinsic electron_integration <integration_type> <num_subcyle_steps(optional)> \n
- integration_type (string) = explicit | implicit | steady \n
- num_subcycle_steps (int), optional = number of subcycle steps for the electron time integration
\section examples
<TT> fix_modify AtC extrinsic electron_integration implicit </TT> \n
<TT> fix_modify AtC extrinsic electron_integration explicit 100 </TT> \n
\section description
Switches between integration scheme for the electron temperature. The number of subcyling steps used to integrate the electron temperature 1 LAMMPS timestep can be manually adjusted to capture fast electron dynamics.
\section restrictions
For use only with two_temperature type of AtC fix ( see \ref man_fix_atc ) \n
\section default
implicit\n
subcycle_steps = 1
*/
else if (strcmp(arg[argIndx],"electron_integration")==0) {
argIndx++;
nsubcycle_ = 1;
if (strcmp(arg[argIndx],"explicit")==0) {
electronTimeIntegration_ = TimeIntegrator::EXPLICIT;
match = true;
}
else if (strcmp(arg[argIndx],"implicit")==0) {
electronTimeIntegration_ = TimeIntegrator::IMPLICIT;
match = true;
}
else if (strcmp(arg[argIndx],"steady")==0) {
electronTimeIntegration_ = TimeIntegrator::STEADY;
match = true;
}
if (narg > ++argIndx) nsubcycle_ = atoi(arg[argIndx]);
} // end "electron_integration"
if (!match) {
match = ExtrinsicModel::modify(narg, arg);
}
return match;
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void ExtrinsicModelTwoTemperature::initialize()
{
ExtrinsicModel::initialize();
int nNodes = atc_->num_nodes();
rhs_[TEMPERATURE].reset(nNodes,1);
rhs_[ELECTRON_TEMPERATURE].reset(nNodes,1);
// set up electron temperature integrator
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX);
rhsMask = false;
for (int i = 0; i < NUM_FLUX; i++) {
rhsMask(ELECTRON_TEMPERATURE,i) = atc_->fieldMask_(ELECTRON_TEMPERATURE,i);
}
if (temperatureIntegrator_) delete temperatureIntegrator_;
if (electronTimeIntegration_ == TimeIntegrator::STEADY) {
throw ATC_Error("not implemented");
}
else if (electronTimeIntegration_ == TimeIntegrator::IMPLICIT) {
double alpha = 1; // backwards Euler
temperatureIntegrator_ = new FieldImplicitEulerIntegrator(
ELECTRON_TEMPERATURE, physicsModel_, atc_->feEngine_, atc_,
rhsMask, alpha);
}
else {
temperatureIntegrator_ = new FieldExplicitEulerIntegrator(
ELECTRON_TEMPERATURE, physicsModel_, atc_->feEngine_, atc_,
rhsMask);
}
// set up mass matrix
Array<FieldName> massMask(1);
massMask = ELECTRON_TEMPERATURE;
(atc_->feEngine_)->compute_lumped_mass_matrix(massMask,atc_->fields_,physicsModel_,atc_->elementToMaterialMap_,atc_->massMats_);
atc_->massMatsInv_[ELECTRON_TEMPERATURE] = inv(atc_->massMats_[ELECTRON_TEMPERATURE].quantity());
}
//--------------------------------------------------------
// pre initial integration
//--------------------------------------------------------
void ExtrinsicModelTwoTemperature::pre_init_integrate()
{
double dt = atc_->lammpsInterface_->dt();
double time = atc_->time();
// integrate fast electron variable/s
// note: atc calls set_sources in pre_final_integrate
atc_->set_fixed_nodes();
double idt = dt/nsubcycle_;
for (int i = 0; i < nsubcycle_ ; ++i) {
temperatureIntegrator_->update(idt,time,atc_->fields_,rhs_);
}
}
//--------------------------------------------------------
// set coupling source terms
//--------------------------------------------------------
void ExtrinsicModelTwoTemperature::set_sources(FIELDS & fields, FIELDS & sources)
{
// compute source term with appropriate masking and physics model
atc_->evaluate_rhs_integral(rhsMaskIntrinsic_, fields,
sources,
atc_->source_integration(), physicsModel_);
}
//--------------------------------------------------------
// output
//--------------------------------------------------------
void ExtrinsicModelTwoTemperature::output(OUTPUT_LIST & outputData)
{
// nodal data
outputData["dot_electron_temperature"] = & rhs_[ELECTRON_TEMPERATURE].set_quantity();
// global data
if (atc_->lammpsInterface_->rank_zero()) {
double T_mean = ((atc_->field(ELECTRON_TEMPERATURE)).quantity()).col_sum(0)/atc_->nNodes_;
atc_->feEngine_->add_global("electron_temperature_mean", T_mean);
double T_stddev = ((atc_->field(ELECTRON_TEMPERATURE)).quantity()).col_stdev(0);
atc_->feEngine_->add_global("electron_temperature_std_dev", T_stddev);
}
}
//--------------------------------------------------------
// size_vector
//--------------------------------------------------------
int ExtrinsicModelTwoTemperature::size_vector(int intrinsicSize)
{
baseSize_ = intrinsicSize;
return 2;
}
//--------------------------------------------------------
// compute_vector
//--------------------------------------------------------
bool ExtrinsicModelTwoTemperature::compute_vector(int n, double & value)
{
// output[1] = total electron energy
// output[2] = average electron temperature
if (n == baseSize_) {
Array<FieldName> mask(1);
FIELD_MATS energy;
mask(0) = ELECTRON_TEMPERATURE;
(atc_->feEngine_)->compute_energy(mask,
atc_->fields(),
physicsModel_,
atc_->elementToMaterialMap_,
energy);
// convert to lammps energy units
double mvv2e = (atc_->lammps_interface())->mvv2e();
double electronEnergy = mvv2e * energy[ELECTRON_TEMPERATURE].col_sum();
value = electronEnergy;
return true;
}
else if (n == baseSize_+1) {
double electronTemperature = ((atc_->field(ELECTRON_TEMPERATURE)).quantity()).col_sum()/(atc_->nNodes_);
value = electronTemperature;
return true;
}
return false;
}
};
diff --git a/lib/atc/ExtrinsicModelTwoTemperature.h b/lib/atc/ExtrinsicModelTwoTemperature.h
index dd3a0af27..4c3038bba 100644
--- a/lib/atc/ExtrinsicModelTwoTemperature.h
+++ b/lib/atc/ExtrinsicModelTwoTemperature.h
@@ -1,82 +1,79 @@
#ifndef EXTRINSIC_MODEL_TWO_TEMPERATURE
#define EXTRINSIC_MODEL_TWO_TEMPERATURE
-/** owned fields: ELECTRON_TEMPERATURE */
+#include <string>
-// ATC headers
#include "ExtrinsicModel.h"
#include "FieldEulerIntegrator.h"
-using namespace std;
namespace ATC {
-
- // forward declarations
class ATC_Coupling;
class PrescribedDataManager;
class ExtrinsicModel;
class PhysicsModel;
/**
* @class ExtrinsicModelTwoTemperature
* @brief add electron temperature physics to phonon physics
+ * owned field: ELECTRON_TEMPERATURE
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class ExtrinsicModelTwoTemperature
//--------------------------------------------------------
//--------------------------------------------------------
class ExtrinsicModelTwoTemperature : public ExtrinsicModel {
public:
// constructor
ExtrinsicModelTwoTemperature(ExtrinsicModelManager * modelManager,
ExtrinsicModelType modelType,
- string matFileName);
+ std::string matFileName);
// destructor
virtual ~ExtrinsicModelTwoTemperature();
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** pre time integration */
virtual void initialize();
/** set up LAMMPS display variables */
virtual int size_vector(int externalSize);
/** get LAMMPS display variables */
virtual bool compute_vector(int n, double & value);
/** Predictor phase, executed before Verlet */
virtual void pre_init_integrate();
/** Set sources to AtC equation */
virtual void set_sources(FIELDS & fields, FIELDS & sources);
/** Add model-specific output data */
virtual void output(OUTPUT_LIST & outputData);
protected:
/** electron time integration flag */
TimeIntegrator::TimeIntegrationType electronTimeIntegration_;
/** electron time integration flag */
FieldEulerIntegrator * temperatureIntegrator_;
/** number of electron time integration subscycles */
int nsubcycle_;
/** flag for turning off exchange during equilibration */
bool exchangeFlag_;
/** offset/size for LAMMPS display output */
int baseSize_;
};
};
#endif
diff --git a/lib/atc/FE_Element.cpp b/lib/atc/FE_Element.cpp
index 01c4b29b1..d7c576967 100644
--- a/lib/atc/FE_Element.cpp
+++ b/lib/atc/FE_Element.cpp
@@ -1,746 +1,747 @@
// ATC header files
#include "ATC_Error.h"
#include "FE_Mesh.h"
#include "FE_Element.h"
#include "FE_Interpolate.h"
#include "LinearSolver.h"
#include "PolynomialSolver.h"
#include "Utility.h"
// Other headers
#include "math.h"
using ATC_Utility::dbl_geq;
using ATC_Utility::det3;
+using std::vector;
namespace ATC {
static const int localCoordinatesMaxIterations_ = 40;
static const double localCoordinatesTolerance = 1.e-09;
// =============================================================
// class FE_Element
// =============================================================
FE_Element::FE_Element(const int nSD,
int numFaces,
int numNodes,
int numFaceNodes,
int numNodes1d)
: nSD_(nSD),
numFaces_(numFaces),
numNodes_(numNodes),
numFaceNodes_(numFaceNodes),
numNodes1d_(numNodes1d),
tolerance_(localCoordinatesTolerance),
projectionGuess_(COORDINATE_ALIGNED)
{
feInterpolate_ = NULL;
}
FE_Element::~FE_Element()
{
if (feInterpolate_) delete feInterpolate_;
}
int FE_Element::num_ips() const
{
return feInterpolate_->num_ips();
}
int FE_Element::num_face_ips() const
{
return feInterpolate_->num_face_ips();
}
void FE_Element::face_coordinates(const DENS_MAT &eltCoords,
const int faceID,
DENS_MAT & faceCoords) const
{
faceCoords.reset(nSD_, numFaceNodes_);
for (int inode=0; inode < numFaceNodes_; inode++)
{
int id = localFaceConn_(faceID,inode);
for (int isd=0; isd<nSD_; isd++) {
faceCoords(isd,inode) = eltCoords(isd,id);
}
}
}
void FE_Element::mapping(const int inode, vector<int> &mapping) const
{
for (int iSD=0; iSD<nSD_; ++iSD) {
mapping[iSD] = static_cast<int>((localCoords_(iSD,inode)+1)/2*
(numNodes1d_-1));
}
}
DENS_VEC FE_Element::local_coords_1d() const
{
DENS_VEC localCoords1d(numNodes1d_);
for (int inode1d=0; inode1d<numNodes1d_; ++inode1d) {
localCoords1d(inode1d) = (double(inode1d)/double(numNodes1d_-1))*2 - 1;
}
return localCoords1d;
}
void FE_Element::centroid(const DENS_MAT &eltCoords,
DENS_VEC &centroid) const
{
centroid.reset(nSD_);
for (int i = 0; i < nSD_; i++) {
centroid(i) = eltCoords.row_mean(i);
}
}
// -------------------------------------------------------------
// generic conversion from global to local coordinates using
// Newton's method to solve the nonliear equation that arises
// -------------------------------------------------------------
bool FE_Element::local_coordinates(const DENS_MAT &eltCoords,
const DENS_VEC &x,
DENS_VEC &xi) const
{
// initial guess
DENS_VEC xiGuess(nSD_);
this->initial_local_coordinates(eltCoords,x,xiGuess);
// clip out-of-range guesses
if (fabs(xiGuess(0)) > 1.0) xiGuess(0) = 0.;
if (fabs(xiGuess(1)) > 1.0) xiGuess(1) = 0.;
if (fabs(xiGuess(2)) > 1.0) xiGuess(2) = 0.;
// iteratively solve the equation by calculating the global
// position of the guess and bringing the difference between it
// and the actual global position of x to zero
//
// uses Newton's method
DENS_VEC N(numNodes_);
DENS_MAT dNdr(nSD_,numNodes_);
DENS_VEC xGuess(nSD_);
DENS_VEC xDiff(nSD_);
DENS_MAT eltCoordsT = transpose(eltCoords);
int count = 0;
bool converged = false;
while (count < localCoordinatesMaxIterations_) {
feInterpolate_->compute_N_dNdr(xiGuess,N,dNdr);
xGuess = N*eltCoordsT;
xDiff = xGuess-x;
// determine if the guess is close enough.
// if it is, take it and run
// if not, use Newton's method to update the guess
if (!dbl_geq(abs(xDiff(0)),tolerance_) &&
!dbl_geq(abs(xDiff(1)),tolerance_) &&
!dbl_geq(abs(xDiff(2)),tolerance_)) {
converged = true;
xi = xiGuess;
break;
} else {
xiGuess = xiGuess - transpose(inv(dNdr*eltCoordsT))*xDiff;
}
++count;
}
return converged;
}
// -------------------------------------------------------------
// guess for initial local coordinates
// -------------------------------------------------------------
void FE_Element::initial_local_coordinates(const DENS_MAT &eltCoords,
const DENS_VEC &x,
DENS_VEC &xi) const
{
xi.reset(nSD_);
if (projectionGuess_ == COORDINATE_ALIGNED) {
double min=0; double max=0;
for (int i=0; i<nSD_; ++i) {
bounds_in_dim(eltCoords,i,min,max);
xi(i) = 2.0*(x(i)-min)/(max-min) - 1.0;
}
}
else if (projectionGuess_ == CENTROID_LINEARIZED) {
DENS_VEC xi0(nSD_); xi0 = 0;
DENS_VEC x0(nSD_), dx(nSD_);
centroid(eltCoords,x0);
dx = x - x0;
vector<DENS_VEC> ts; ts.reserve(nSD_);
tangents(eltCoords,xi0,ts);
DENS_VEC & t1 = ts[0];
DENS_VEC & t2 = ts[1];
DENS_VEC & t3 = ts[2];
double J = det3(t1.ptr(),t2.ptr(),t3.ptr());
double J1 = det3(dx.ptr(),t2.ptr(),t3.ptr());
double J2 = det3(t1.ptr(),dx.ptr(),t3.ptr());
double J3 = det3(t1.ptr(),t2.ptr(),dx.ptr());
xi(0) = J1/J;
xi(1) = J2/J;
xi(2) = J3/J;
}
else if (projectionGuess_ == TWOD_ANALYTIC) {
// assume x-y planar and HEX8
double x0 = x(0), y0 = x(1);
double X[4] = {eltCoords(0,0),eltCoords(0,1),eltCoords(0,2),eltCoords(0,3)};
double Y[4] = {eltCoords(1,0),eltCoords(1,1),eltCoords(1,2),eltCoords(1,3)};
double c[3]={0,0,0};
c[0] = y0*X[1] - y0*X[2] - y0*X[3] + y0*X[4] - x0*Y[1] + (X[2]*Y[1])*0.5 + (X[3]*Y[1])*0.5 + x0*Y[2] - (X[1]*Y[2])*0.5 - (X[4]*Y[2])*0.5 + x0*Y[3] - (X[1]*Y[3])*0.5 - (X[4]*Y[3])*0.5 - x0*Y[4] + (X[2]*Y[4])*0.5 + (X[3]*Y[4])*0.5;
c[1] = -(y0*X[1]) + y0*X[2] - y0*X[3] + y0*X[4] + x0*Y[1] - X[2]*Y[1] - x0*Y[2] + X[1]*Y[2] + x0*Y[3] - X[4]*Y[3] - x0*Y[4] + X[3]*Y[4];
c[2] = (X[2]*Y[1])*0.5 - (X[3]*Y[1])*0.5 - (X[1]*Y[2])*0.5 + (X[4]*Y[2])*0.5 + (X[1]*Y[3])*0.5 - (X[4]*Y[3])*0.5 - (X[2]*Y[4])*0.5 + (X[3]*Y[4])*0.5;
double xi2[2]={0,0};
int nroots = solve_quadratic(c,xi2);
if (nroots == 0) throw ATC_Error("no real roots in 2D analytic projection guess");
double xi1[2]={0,0};
xi1[0] = (4*x0 - X[1] + xi2[0]*X[1] - X[2] + xi2[0]*X[2] - X[3] - xi2[0]*X[3] - X[4] - xi2[0]*X[4])/(-X[1] + xi2[0]*X[1] + X[2] - xi2[0]*X[2] + X[3] + xi2[0]*X[3] - X[4] - xi2[0]*X[4]);
xi1[1] = (4*x0 - X[1] + xi2[1]*X[1] - X[2] + xi2[1]*X[2] - X[3] - xi2[1]*X[3] - X[4] - xi2[1]*X[4])/(-X[1] + xi2[1]*X[1] + X[2] - xi2[1]*X[2] + X[3] + xi2[1]*X[3] - X[4] - xi2[1]*X[4]);
// choose which one gives back x
xi(0) = xi1[0];
xi(1) = xi2[0];
xi(2) = 0;
}
}
bool FE_Element::range_check(const DENS_MAT &eltCoords,
const DENS_VEC &x) const
{
double min=0; double max=0;
for (int i=0; i<nSD_; ++i) {
bounds_in_dim(eltCoords,i,min,max);
if (!dbl_geq(x(i),min) || !dbl_geq(max,x(i))) return false;
}
return true;
}
// -------------------------------------------------------------
// Note: Only works for convex elements with planar faces with
// outward normals
// -------------------------------------------------------------
bool FE_Element::contains_point(const DENS_MAT &eltCoords,
const DENS_VEC &x) const
{
if (! range_check(eltCoords,x) ) return false;
DENS_MAT faceCoords;
DENS_VEC normal;
normal.reset(nSD_);
DENS_VEC faceToPoint;
double dot;
bool inside = true;
for (int faceID=0; faceID<numFaces_; ++faceID) {
face_coordinates(eltCoords, faceID, faceCoords);
feInterpolate_->face_normal(faceCoords,
0,
normal);
faceToPoint = x - column(faceCoords, 0);
dot = normal.dot(faceToPoint);
if (dbl_geq(dot,0)) {
inside = false;
break;
}
}
return inside;
}
// -------------------------------------------------------------
// returns the minimum and maximum values of an element in the
// specified dimension
// -------------------------------------------------------------
void FE_Element::bounds_in_dim(const DENS_MAT &eltCoords, const int dim,
double &min, double &max) const
{
int it;
// iterate over all nodes
min = eltCoords(dim,0);
it = 1;
while (it < numNodes_) {
if (dbl_geq(min,eltCoords(dim,it))) {
if (dbl_geq(eltCoords(dim,it),min)) {
++it;
} else {
// set min to this node's coord in the specified dim, if it's
// smaller than the value previously stored
min = eltCoords(dim,it);
}
} else {
++it;
}
}
max = eltCoords(dim,0);
it = 1;
while (it < numNodes_) {
if (dbl_geq(max,eltCoords(dim,it))) {
++it;
} else {
// same, except max/larger
max = eltCoords(dim,it);
}
}
}
// -------------------------------------------------------------
// shape_function calls should stay generic at all costs
// -------------------------------------------------------------
void FE_Element::shape_function(const VECTOR &xi,
DENS_VEC &N) const
{
feInterpolate_->shape_function(xi, N);
}
void FE_Element::shape_function(const DENS_MAT eltCoords,
const VECTOR &x,
DENS_VEC &N)
{
DENS_VEC xi;
local_coordinates(eltCoords, x, xi);
feInterpolate_->shape_function(xi, N);
}
void FE_Element::shape_function(const DENS_MAT eltCoords,
const VECTOR &x,
DENS_VEC &N,
DENS_MAT &dNdx)
{
DENS_VEC xi;
local_coordinates(eltCoords, x, xi);
feInterpolate_->shape_function(eltCoords, xi, N, dNdx);
}
void FE_Element::shape_function_derivatives(const DENS_MAT eltCoords,
const VECTOR &x,
DENS_MAT &dNdx)
{
DENS_VEC xi;
local_coordinates(eltCoords, x, xi);
feInterpolate_->shape_function_derivatives(eltCoords, xi, dNdx);
}
void FE_Element::shape_function(const DENS_MAT eltCoords,
DENS_MAT &N,
vector<DENS_MAT> &dN,
DIAG_MAT &weights)
{
feInterpolate_->shape_function(eltCoords, N, dN, weights);
}
void FE_Element::face_shape_function(const DENS_MAT &eltCoords,
const int faceID,
DENS_MAT &N,
DENS_MAT &n,
DIAG_MAT &weights)
{
DENS_MAT faceCoords;
face_coordinates(eltCoords, faceID, faceCoords);
feInterpolate_->face_shape_function(eltCoords, faceCoords, faceID,
N, n, weights);
}
void FE_Element::face_shape_function(const DENS_MAT &eltCoords,
const int faceID,
DENS_MAT &N,
vector<DENS_MAT> &dN,
vector<DENS_MAT> &Nn,
DIAG_MAT &weights)
{
DENS_MAT faceCoords;
face_coordinates(eltCoords, faceID, faceCoords);
feInterpolate_->face_shape_function(eltCoords, faceCoords, faceID,
N, dN, Nn, weights);
}
double FE_Element::face_normal(const DENS_MAT &eltCoords,
const int faceID,
int ip,
DENS_VEC &normal)
{
DENS_MAT faceCoords;
face_coordinates(eltCoords, faceID, faceCoords);
double J = feInterpolate_->face_normal(faceCoords, ip, normal);
return J;
}
void FE_Element::tangents(const DENS_MAT &eltCoords,
const DENS_VEC & localCoords,
vector<DENS_VEC> &tangents,
const bool normalize) const
{
feInterpolate_->tangents(eltCoords,localCoords,tangents,normalize);
}
// =============================================================
// class FE_ElementHex
// =============================================================
FE_ElementHex::FE_ElementHex(int numNodes,
int numFaceNodes,
int numNodes1d)
: FE_Element(3, // number of spatial dimensions
6, // number of faces
numNodes,
numFaceNodes,
numNodes1d)
{
// 3 --- 2
// /| /|
// / 0 --/ 1 y
// 7 --- 6 / |
// | |/ |
// 4 --- 5 -----x
// /
// /
// z
// Basic properties of element:
vol_ = 8.0;
faceArea_ = 4.0;
// Order-specific information:
if (numNodes != 8 &&
numNodes != 20 &&
numNodes != 27) {
throw ATC_Error("Unrecognized interpolation order specified "
"for element class: \n"
" element only knows how to construct lin "
"and quad elments.");
}
localCoords_.resize(nSD_,numNodes_);
localFaceConn_ = Array2D<int>(numFaces_,numFaceNodes_);
// Matrix of local nodal coordinates
localCoords_(0,0) = -1; localCoords_(0,4) = -1;
localCoords_(1,0) = -1; localCoords_(1,4) = -1;
localCoords_(2,0) = -1; localCoords_(2,4) = 1;
//
localCoords_(0,1) = 1; localCoords_(0,5) = 1;
localCoords_(1,1) = -1; localCoords_(1,5) = -1;
localCoords_(2,1) = -1; localCoords_(2,5) = 1;
//
localCoords_(0,2) = 1; localCoords_(0,6) = 1;
localCoords_(1,2) = 1; localCoords_(1,6) = 1;
localCoords_(2,2) = -1; localCoords_(2,6) = 1;
//
localCoords_(0,3) = -1; localCoords_(0,7) = -1;
localCoords_(1,3) = 1; localCoords_(1,7) = 1;
localCoords_(2,3) = -1; localCoords_(2,7) = 1;
if (numNodes >= 20) {
// only for quads
localCoords_(0,8) = 0; localCoords_(0,14) = 1;
localCoords_(1,8) = -1; localCoords_(1,14) = 1;
localCoords_(2,8) = -1; localCoords_(2,14) = 0;
//
localCoords_(0,9) = 1; localCoords_(0,15) = -1;
localCoords_(1,9) = 0; localCoords_(1,15) = 1;
localCoords_(2,9) = -1; localCoords_(2,15) = 0;
//
localCoords_(0,10) = 0; localCoords_(0,16) = 0;
localCoords_(1,10) = 1; localCoords_(1,16) = -1;
localCoords_(2,10) = -1; localCoords_(2,16) = 1;
//
localCoords_(0,11) = -1; localCoords_(0,17) = 1;
localCoords_(1,11) = 0; localCoords_(1,17) = 0;
localCoords_(2,11) = -1; localCoords_(2,17) = 1;
//
localCoords_(0,12) = -1; localCoords_(0,18) = 0;
localCoords_(1,12) = -1; localCoords_(1,18) = 1;
localCoords_(2,12) = 0; localCoords_(2,18) = 1;
//
localCoords_(0,13) = 1; localCoords_(0,19) = -1;
localCoords_(1,13) = -1; localCoords_(1,19) = 0;
localCoords_(2,13) = 0; localCoords_(2,19) = 1;
if (numNodes >= 27) {
// only for quads
localCoords_(0,20) = 0; localCoords_(0,24) = 1;
localCoords_(1,20) = 0; localCoords_(1,24) = 0;
localCoords_(2,20) = 0; localCoords_(2,24) = 0;
//
localCoords_(0,21) = 0; localCoords_(0,25) = 0;
localCoords_(1,21) = 0; localCoords_(1,25) = -1;
localCoords_(2,21) = -1; localCoords_(2,25) = 0;
//
localCoords_(0,22) = 0; localCoords_(0,26) = 0;
localCoords_(1,22) = 0; localCoords_(1,26) = 1;
localCoords_(2,22) = 1; localCoords_(2,26) = 0;
//
localCoords_(0,23) = -1;
localCoords_(1,23) = 0;
localCoords_(2,23) = 0;
}
}
// Matrix of local face connectivity
// -x // +x
localFaceConn_(0,0) = 0; localFaceConn_(1,0) = 1;
localFaceConn_(0,1) = 4; localFaceConn_(1,1) = 2;
localFaceConn_(0,2) = 7; localFaceConn_(1,2) = 6;
localFaceConn_(0,3) = 3; localFaceConn_(1,3) = 5;
if (numNodes >= 20) {
localFaceConn_(0,4) = 12; localFaceConn_(1,4) = 9;
localFaceConn_(0,5) = 19; localFaceConn_(1,5) = 14;
localFaceConn_(0,6) = 15; localFaceConn_(1,6) = 17;
localFaceConn_(0,7) = 11; localFaceConn_(1,7) = 13;
if (numNodes >= 27) {
localFaceConn_(0,8) = 23; localFaceConn_(1,8) = 24;
}
}
// -y // +y
localFaceConn_(2,0) = 0; localFaceConn_(3,0) = 3;
localFaceConn_(2,1) = 1; localFaceConn_(3,1) = 7;
localFaceConn_(2,2) = 5; localFaceConn_(3,2) = 6;
localFaceConn_(2,3) = 4; localFaceConn_(3,3) = 2;
if (numNodes >= 20) {
localFaceConn_(2,4) = 8; localFaceConn_(3,4) = 15;
localFaceConn_(2,5) = 13; localFaceConn_(3,5) = 18;
localFaceConn_(2,6) = 16; localFaceConn_(3,6) = 14;
localFaceConn_(2,7) = 12; localFaceConn_(3,7) = 10;
if (numNodes >= 27) {
localFaceConn_(2,8) = 25; localFaceConn_(3,8) = 26;
}
}
// -z // +z
localFaceConn_(4,0) = 0; localFaceConn_(5,0) = 4;
localFaceConn_(4,1) = 3; localFaceConn_(5,1) = 5;
localFaceConn_(4,2) = 2; localFaceConn_(5,2) = 6;
localFaceConn_(4,3) = 1; localFaceConn_(5,3) = 7;
if (numNodes >= 20) {
localFaceConn_(4,4) = 8; localFaceConn_(5,4) = 16;
localFaceConn_(4,5) = 11; localFaceConn_(5,5) = 17;
localFaceConn_(4,6) = 10; localFaceConn_(5,6) = 18;
localFaceConn_(4,7) = 9; localFaceConn_(5,7) = 19;
if (numNodes >= 27) {
localFaceConn_(4,8) = 21; localFaceConn_(5,8) = 22;
}
}
if (numNodes == 8) {
feInterpolate_ = new FE_InterpolateCartLin(this);
} else if (numNodes == 20) {
feInterpolate_ = new FE_InterpolateCartSerendipity(this);
} else if (numNodes == 27) {
feInterpolate_ = new FE_InterpolateCartLagrange(this);
}
// determine alignment and skewness to see which guess we should use
}
FE_ElementHex::~FE_ElementHex()
{
// Handled by base class
}
void FE_ElementHex::set_quadrature(FeIntQuadrature type)
{
feInterpolate_->set_quadrature(HEXA,type);
}
bool FE_ElementHex::contains_point(const DENS_MAT &eltCoords,
const DENS_VEC &x) const
{
if (! range_check(eltCoords,x) ) return false;
DENS_VEC xi;
bool converged = local_coordinates(eltCoords,x,xi);
if (!converged) return false;
for (int i=0; i<nSD_; ++i) {
if (!dbl_geq(1.0,abs(xi(i)))) return false;
}
return true;
}
// =============================================================
// class FE_ElementRect
// =============================================================
FE_ElementRect::FE_ElementRect()
: FE_ElementHex(8,4,2)
{
// Handled by hex class
}
FE_ElementRect::~FE_ElementRect()
{
// Handled by base class
}
bool FE_ElementRect::contains_point(const DENS_MAT &eltCoords,
const DENS_VEC &x) const
{
return range_check(eltCoords,x);
}
// much faster than the unstructured method
bool FE_ElementRect::local_coordinates(const DENS_MAT &eltCoords,
const DENS_VEC &x,
DENS_VEC &xi) const
{
xi.reset(nSD_);
double min = 0.0;
double max = 0.0;
for (int iSD=0; iSD<nSD_; ++iSD) {
min = eltCoords(iSD,0);
max = eltCoords(iSD,6);
xi(iSD) = 2.0*(x(iSD)-min)/(max-min) - 1.0;
}
return true;
}
// =============================================================
// class FE_ElementTet
// =============================================================
FE_ElementTet::FE_ElementTet(int numNodes,
int numFaceNodes,
int numNodes1d)
: FE_Element(3, // number of spatial dimensions
4, // number of faces
numNodes,
numFaceNodes,
numNodes1d)
{
// t
// ^
// |
// |
// s
// 3 .7
// |\```--- .
// | \ ```--2 .
// | \ .|
// | \ . |
// | . \ |
// | . \ |
// |.___________\| -------> r
// 0 1
//
// (This is as dictated by the EXODUSII standard.)
//
// The face opposite point 1 has r = 0,
// 2 has s = 0,
// 3 has t = 0,
// 0 has u = 0.
// Basic properties of element:
vol_ = 1.0/6.0; // local volume
faceArea_ = 1.0/2.0;
// Order-specific information:
if (numNodes != 4 && numNodes != 10) {
throw ATC_Error("Unrecognized interpolation order specified "
"for element class: \n"
" element only knows how to construct lin "
"and quad elments.");
}
localCoords_.resize(nSD_+1, numNodes_);
localFaceConn_ = Array2D<int>(numFaces_,numFaceNodes_);
// Matrix of local nodal coordinates
//
// Remember, there's actually another coordinate too (u), coming
// out from the third non-normal face. But we can deal with it on
// the fly; these coordinates are barycentric, such that
// r + s + t + u = 1 always. As such we only need to deal with r,
// s, and t and the computations become easy.
//
// The first three axes correspond to x, y, and z (essentially),
// for the canonical element.
// Everyone gets these nodes...
localCoords_(0,0) = 0; localCoords_(0,2) = 0;
localCoords_(1,0) = 0; localCoords_(1,2) = 1;
localCoords_(2,0) = 0; localCoords_(2,2) = 0;
localCoords_(3,0) = 1; localCoords_(3,2) = 0;
//
localCoords_(0,1) = 1; localCoords_(0,3) = 0;
localCoords_(1,1) = 0; localCoords_(1,3) = 0;
localCoords_(2,1) = 0; localCoords_(2,3) = 1;
localCoords_(3,1) = 0; localCoords_(3,3) = 0;
if (numNodes >= 10) {
// ...quads get even more!
localCoords_(0,4) = 0.5; localCoords_(0,5) = 0.5;
localCoords_(1,4) = 0.0; localCoords_(1,5) = 0.5;
localCoords_(2,4) = 0.0; localCoords_(2,5) = 0.0;
localCoords_(3,4) = 0.5; localCoords_(3,5) = 0.0;
//
localCoords_(0,6) = 0.0; localCoords_(0,7) = 0.0;
localCoords_(1,6) = 0.5; localCoords_(1,7) = 0.0;
localCoords_(2,6) = 0.0; localCoords_(2,7) = 0.5;
localCoords_(3,6) = 0.5; localCoords_(3,7) = 0.5;
//
localCoords_(0,8) = 0.5; localCoords_(0,9) = 0.0;
localCoords_(1,8) = 0.0; localCoords_(1,9) = 0.5;
localCoords_(2,8) = 0.5; localCoords_(2,9) = 0.5;
localCoords_(3,8) = 0.0; localCoords_(3,9) = 0.0;
}
// Matrix of local face connectivity:
// ...opposite point 0, ...opposite point 2,
localFaceConn_(0,0) = 1; localFaceConn_(2,0) = 0;
localFaceConn_(0,1) = 2; localFaceConn_(2,1) = 1;
localFaceConn_(0,2) = 3; localFaceConn_(2,2) = 3;
// ...opposite point 1, ...opposite point 3.
localFaceConn_(1,0) = 2; localFaceConn_(3,0) = 0;
localFaceConn_(1,1) = 0; localFaceConn_(3,1) = 2;
localFaceConn_(1,2) = 3; localFaceConn_(3,2) = 1;
feInterpolate_ = new FE_InterpolateSimpLin(this);
}
FE_ElementTet::~FE_ElementTet()
{
// Handled by base class
}
void FE_ElementTet::set_quadrature(FeIntQuadrature type)
{
feInterpolate_->set_quadrature(TETRA,type);
}
bool FE_ElementTet::local_coordinates(const DENS_MAT &eltCoords,
const DENS_VEC &x,
DENS_VEC &xi) const
{
DENS_MAT T(nSD_, numNodes_-1);
DENS_VEC r(nSD_);
for (int iSD=0; iSD<nSD_; ++iSD) {
for (int inode=1; inode<numNodes_; ++inode) {
T(iSD, inode-1) = eltCoords(iSD, inode) -
eltCoords(iSD, 0);
}
r(iSD) = x(iSD) - eltCoords(iSD, 0);
}
MultMv(inv(T), r, xi, false, 1.0, 0.0);
return true;
}
bool FE_ElementTet::contains_point(const DENS_MAT &eltCoords,
const DENS_VEC &x) const
{
if (! range_check(eltCoords,x) ) return false;
DENS_VEC xi(nSD_);
bool converged = local_coordinates(eltCoords, x, xi);
if (! converged) return false;
double sum = 0.0;
bool inside = true;
for (int iSD = 0; iSD < nSD_; ++iSD) {
if (dbl_geq(xi(iSD),1.0) || dbl_geq(0.0,xi(iSD))) {
inside = false;
break;
}
sum += xi(iSD);
}
if (dbl_geq(sum,1.0)) inside = false;
return inside;
}
}; // namespace ATC
diff --git a/lib/atc/FE_Element.h b/lib/atc/FE_Element.h
index ce0e6adda..a29a65403 100644
--- a/lib/atc/FE_Element.h
+++ b/lib/atc/FE_Element.h
@@ -1,356 +1,357 @@
#ifndef FE_ELEMENT_H
#define FE_ELEMENT_H
+#include <vector>
+#include <string>
+
// ATC_Transfer headers
#include "MatrixLibrary.h"
#include "Array2D.h"
#include "ATC_TypeDefs.h"
-using namespace std;
-
namespace ATC {
enum ProjectionGuessType {
COORDINATE_ALIGNED=0,
CENTROID_LINEARIZED,
TWOD_ANALYTIC};
// Forward declarations
class FE_Interpolate;
/**
* @class FE_Element
* @brief Base class for a finite element holding info for canonical element
*/
class FE_Element {
public:
///////////////////////////////////////////////////////////////////////////
//
// CONSTRUCTOR AND DESTRUCTOR
FE_Element(const int nSD,
int numFaces,
int numNodes,
int numFaceNodes,
int numNodes1d);
virtual ~FE_Element();
///////////////////////////////////////////////////////////////////////////
//
// GETTERS
/** get number of spatial dimensions (almost always 3) */
int num_dims() { return nSD_; }
/** get number of element nodes */
int num_elt_nodes() { return numNodes_; }
/** get number of element nodes */
int num_elt_nodes_1d() { return numNodes1d_; }
/** get number of faces */
int num_faces() { return numFaces_; }
/** get number of face nodes */
int num_face_nodes() { return numFaceNodes_; }
// Getters for FE_Interpoate to have access to coordinates and connectivity
/** get canonical coordinates */
const DENS_MAT &local_coords() const { return localCoords_; }
/** get canonical coordinates in 1d */
DENS_VEC local_coords_1d() const;
/** get canonical connectivity of nodes and faces */
const Array2D<int> &local_face_conn() const { return localFaceConn_; }
/** return volume of the element */
const double vol() const { return vol_; }
/** return area of a face */
const double face_area() const { return faceArea_; }
// the following two are pass-throughs to the interpolate class, and
// can thus only be declared in the class body (or else the
// interpolate class is "incomplete" and cannot be referenced)
/** get number of integration points */
int num_ips() const;
/** get number of integration points */
int num_face_ips() const;
/** order of interpolation */
int order() const {return numNodes1d_;}
/** compute the quadrature for a given element type */
virtual void set_quadrature(FeIntQuadrature type) = 0;
/** return the set of 1d nodes that correspond to this node in 3d space */
- void mapping(const int inode, vector<int> &mapping) const;
+ void mapping(const int inode, std::vector<int> &mapping) const;
/** extract face coordinates from element coordinates */
void face_coordinates(const DENS_MAT &eltCoords,
const int faceID,
DENS_MAT &faceCoords) const;
/** set initial guess type for point in element search */
void set_projection_guess(ProjectionGuessType type)
{ projectionGuess_ = type;}
///////////////////////////////////////////////////////////////////////////
//
// GENERIC ELEMENT COMPUTATIONS
/** compute local coordinates from global */
virtual bool local_coordinates(const DENS_MAT &eltCoords,
const DENS_VEC &x,
DENS_VEC &xi) const;
/** location of local coordinates (0,0,0) */
virtual void centroid(const DENS_MAT &eltCoords,
DENS_VEC & centroid) const;
/** test if a specified element actually contains the given point */
virtual bool contains_point(const DENS_MAT &eltCoords,
const DENS_VEC &x) const;
/** check if element bounding box contains the given point */
bool range_check(const DENS_MAT &eltCoords, const DENS_VEC & x) const;
/** get the min and max coordinate of any point in an element in a
* dimension */
void bounds_in_dim(const DENS_MAT &eltCoords, const int dim,
double &min, double &max) const;
///////////////////////////////////////////////////////////////////////////
//
//PASS-THROUGHS TO INTERPOLATE CLASS
virtual void shape_function(const VECTOR & xi,
DENS_VEC &N) const;
/**
* compute shape functions at all ip's:
* indexed: N(ip,node)
* dN[nsd](ip,node)
* weights(ip)
*/
virtual void shape_function(const DENS_MAT eltCoords,
DENS_MAT &N,
- vector<DENS_MAT> &dN,
+ std::vector<DENS_MAT> &dN,
DIAG_MAT &weights);
/**
* compute shape functions and derivatives at a single point,
* given the point and the element that contains it
* indexed: N(node)
*/
virtual void shape_function(const DENS_MAT eltCoords,
const VECTOR &x,
DENS_VEC &N);
/**
* compute shape functions and derivatives at a single point,
* given the point and the element that contains it
* indexed: N(node)
* dNdx(ip,nSD)
*/
virtual void shape_function(const DENS_MAT eltCoords,
const VECTOR &x,
DENS_VEC &N,
DENS_MAT &dNdx);
/**
* compute shape functions and derivatives at a single point,
* given the point and the element that contains it
* indexed:
* dNdx(ip,nSD)
*/
virtual void shape_function_derivatives(const DENS_MAT eltCoords,
const VECTOR &x,
DENS_MAT &dNdx);
/**
* compute shape functions at all face ip's:
* indexed: N(ip,node)
* n[nsd](ip,node)
* weights(ip)
*/
virtual void face_shape_function(const DENS_MAT &eltCoords,
const int faceID,
DENS_MAT &N,
DENS_MAT &n,
DIAG_MAT &weights);
/**
* compute shape functions at all face ip's:
* indexed: N(ip,node)
* dN[nsd](ip,node)
* Nn[nsd](ip,node)
* weights(ip)
*/
virtual void face_shape_function(const DENS_MAT &eltCoords,
const int faceID,
DENS_MAT &N,
- vector<DENS_MAT> &dN,
- vector<DENS_MAT> &Nn,
+ std::vector<DENS_MAT> &dN,
+ std::vector<DENS_MAT> &Nn,
DIAG_MAT &weights);
/**
* compute normal vector from the specified face
* indexed: normal(nSD)
*/
virtual double face_normal(const DENS_MAT &eltCoords,
const int faceID,
int ip,
DENS_VEC &normal);
/**
* compute tangents to local coordinates
* indexed:
*/
virtual void tangents(const DENS_MAT &eltCoords,
const DENS_VEC &x,
- vector<DENS_VEC> & tangents,
+ std::vector<DENS_VEC> & tangents,
const bool normalize=false) const;
protected:
///////////////////////////////////////////////////////////////////////////
//
// HELPERS
/**
* generate the appropriate interpolation class
*/
- FE_Interpolate *interpolate_factory(string interpolateType);
+ FE_Interpolate *interpolate_factory(std::string interpolateType);
/** initial guess for local coordinates */
virtual void initial_local_coordinates(const DENS_MAT &eltCoords,
const DENS_VEC &x,
DENS_VEC &xiInitial) const;
///////////////////////////////////////////////////////////////////////////
//
// PROTECTED MEMBERS
// Currently used interpolation class
FE_Interpolate *feInterpolate_;
// Number of spatial dimensions
int nSD_;
// Number of faces, used for generic contains_point
int numFaces_;
// Number of element nodes
int numNodes_;
// Number of face nodes
int numFaceNodes_;
// Number of nodes in one dimension
int numNodes1d_;
// local coords of nodes: localCoords_(isd, ip)
DENS_MAT localCoords_;
// local face numbering
Array2D<int> localFaceConn_;
// volume of canonical element
double vol_;
// area of faces of canonical element
double faceArea_;
/** tolerance used in solving Newton's method for local coordinates */
double tolerance_;
ProjectionGuessType projectionGuess_;
};
/**
* @class FE_ElementHex
* @author Sean Laguna
* @brief 3D, linear 8-node hex element
*/
class FE_ElementHex : public FE_Element {
public:
FE_ElementHex(int numNodes,
int numFaceNodes,
int numNodes1d);
// Dump state info to disk for later restart (unimplemented)
void write_restart(FILE *);
~FE_ElementHex();
void set_quadrature(FeIntQuadrature type);
bool contains_point(const DENS_MAT &eltCoords,
const DENS_VEC &x) const;
};
/**
* @class FE_ElementRect
* @author Greg Wagner, amended by Sean Laguna
* @brief 3D, linear 8-node rectilinear hex element
*/
class FE_ElementRect : public FE_ElementHex {
public:
FE_ElementRect();
// Dump state info to disk for later restart (unimplemented)
void write_restart(FILE *);
~FE_ElementRect();
bool local_coordinates(const DENS_MAT &eltCoords,
const DENS_VEC &x,
DENS_VEC &xi) const;
protected:
virtual bool contains_point(const DENS_MAT &eltCoords,
const DENS_VEC &x) const;
};
/**
* @class FE_ElementTet
* @author Aaron Gable & Sean Laguna
* @brief 3D, linear 4-node tetrahedral element
*/
class FE_ElementTet : public FE_Element {
public:
FE_ElementTet(int numNodes,
int numFaceNodes,
int numNodes1d);
// Dump state info to disk for later restart (unimplemented)
void write_restart(FILE *);
~FE_ElementTet();
void set_quadrature(FeIntQuadrature type);
bool local_coordinates(const DENS_MAT &eltCoords,
const DENS_VEC &x,
DENS_VEC &xi) const;
bool contains_point(const DENS_MAT &eltCoords,
const DENS_VEC &x) const;
};
}; // namespace ATC
#endif // FE_ELEMENT_H
diff --git a/lib/atc/FE_Engine.cpp b/lib/atc/FE_Engine.cpp
index 05f82c741..14bcb58c8 100644
--- a/lib/atc/FE_Engine.cpp
+++ b/lib/atc/FE_Engine.cpp
@@ -1,2668 +1,2713 @@
#include "FE_Engine.h"
#include "ATC_Transfer.h"
#include "FE_Element.h"
#include "Function.h"
#include "PhysicsModel.h"
#include "KernelFunction.h"
#include "Utility.h"
+#include "MPI_Wrappers.h"
#include <stdio.h>
#include <stdlib.h>
#include <map>
#include <string>
using namespace std;
+using ATC_Utility::is_numeric;
+using ATC_Utility::to_string;;
+using MPI_Wrappers::allsum;
+using MPI_Wrappers::int_allsum;
+using MPI_Wrappers::rank_zero;
+using MPI_Wrappers::print_msg;
+using MPI_Wrappers::print_msg_once;
namespace ATC{
static const double tol_sparse = 1.e-30;//tolerance for compaction from dense
//-----------------------------------------------------------------
FE_Engine::FE_Engine(MPI_Comm comm)
: communicator_(comm),
feMesh_(NULL),
initialized_(false),
outputManager_()
{
// Nothing to do here
}
//-----------------------------------------------------------------
FE_Engine::~FE_Engine()
{
if (feMesh_) delete feMesh_;
}
//-----------------------------------------------------------------
void FE_Engine::initialize()
{
if (!feMesh_) throw ATC_Error("FE_Engine has no mesh");
if (!initialized_) {
// set up work spaces
nNodesPerElement_ = feMesh_->num_nodes_per_element();
nIPsPerElement_ = feMesh_->num_ips_per_element();
nIPsPerFace_ = feMesh_->num_ips_per_face();
nSD_ = feMesh_->num_spatial_dimensions();
nElems_ = feMesh_->num_elements();
nNodesUnique_ = feMesh_->num_nodes_unique();
nNodes_ = feMesh_->num_nodes();
// arrays & matrices
_weights_.reset(nIPsPerElement_,nIPsPerElement_);
_N_.reset(nIPsPerElement_,nNodesPerElement_);
_dN_.assign(nSD_, DENS_MAT(nIPsPerElement_,nNodesPerElement_));
_Nw_.reset(nIPsPerElement_,nNodesPerElement_);
_dNw_.assign(nSD_, DENS_MAT(nIPsPerElement_,nNodesPerElement_));
_Bfluxes_.assign(nSD_, DENS_MAT());
// faces
_fweights_.reset(nIPsPerElement_,nIPsPerElement_);
_fN_.reset(nIPsPerFace_,nNodesPerElement_);
_fdN_.assign(nSD_, DENS_MAT(nIPsPerFace_, nNodesPerElement_));
_nN_.assign(nSD_, DENS_MAT(nIPsPerFace_, nNodesPerElement_));
// remove specified elements
if (nullElements_.size() > 0) delete_elements(nullElements_);
initialized_ = true;
}
}
void FE_Engine::partition_mesh()
{
if (is_partitioned()) return;
feMesh_->partition_mesh();
// now do all FE_Engine data structure partitioning
// partition nullElements_
/*for (vector<int>::iterator elemsIter = feMesh_->processor_elts().begin();
elemsIter != feMesh_->processor_elts().end();
++elemsIter)
{
if (nullElements_.find(*elemsIter) != nullElements_.end()) {
myNullElements_.insert(map_elem_to_myElem(*elemsIter));
}
}*/
}
void FE_Engine::departition_mesh()
{
if (!is_partitioned()) return;
feMesh_->departition_mesh();
}
void FE_Engine::set_quadrature(FeIntQuadrature type, bool temp) const
{
if (!feMesh_) throw ATC_Error("FE_Engine has no mesh");
feMesh_->set_quadrature(type);
if (!temp) quadrature_ = type;
int nIPsPerElement_new = feMesh_->num_ips_per_element();
int nIPsPerFace_new = feMesh_->num_ips_per_face();
if (nIPsPerElement_ != nIPsPerElement_new) {
// arrays & matrices
nIPsPerElement_ = nIPsPerElement_new;
_weights_.resize(nIPsPerElement_,nIPsPerElement_);
_N_.resize(nIPsPerElement_,nNodesPerElement_);
_dN_.assign(nSD_, DENS_MAT(nIPsPerElement_,nNodesPerElement_));
_Nw_.reset(nIPsPerElement_,nNodesPerElement_);
_dNw_.assign(nSD_, DENS_MAT(nIPsPerElement_,nNodesPerElement_));
}
if (nIPsPerFace_ != nIPsPerFace_new) {
// faces
nIPsPerFace_ = nIPsPerFace_new;
_fweights_.reset(nIPsPerElement_,nIPsPerElement_);
_fN_.reset(nIPsPerFace_,nNodesPerElement_);
_fdN_.assign(nSD_, DENS_MAT(nIPsPerFace_, nNodesPerElement_));
_nN_.assign(nSD_, DENS_MAT(nIPsPerFace_, nNodesPerElement_));
}
}
//-----------------------------------------------------------------
bool FE_Engine::modify(int narg, char **arg)
{
bool match = false;
- /*! \page man_mesh fix_modify AtC mesh create
+ /*! \page man_mesh_create fix_modify AtC mesh create
\section syntax
fix_modify AtC mesh create <nx> <ny> <nz> <region-id>
- <f|p> <f|p> <f|p>
+ <f|p> <f|p> <f|p> \n
- nx ny nz = number of elements in x, y, z
- region-id = id of region that is to be meshed
- - f p p = perioidicity flags for x, y, z
- fix_modify AtC mesh quadrature <quad> where
- - quad = one of <nodal|gauss1|gauss2|gauss3|face>
- - when a mesh is created it defaults to gauss2, use this call
- to change it after the fact
+ - f p p = periodicity flags for x, y, z
\section examples
- <TT> fix_modify AtC create mesh 10 1 1 feRegion p p p </TT>
+ <TT> fix_modify AtC mesh create 10 1 1 feRegion p p p </TT> \n
\section description
Creates a uniform mesh in a rectangular region
\section restrictions
- creates only uniform rectangular grids in a rectangular region
+ Creates only uniform rectangular grids in a rectangular region
\section related
+ \ref man_mesh_quadrature
\section default
- none
+ When created, mesh defaults to gauss2 (2-point Gaussian) quadrature.
+ Use "mesh quadrature" command to change quadrature style.
*/
int argIdx = 0;
if (strcmp(arg[argIdx],"mesh")==0) {
argIdx++;
// create mesh
if (strcmp(arg[argIdx],"create")==0) {
if (feMesh_) throw ATC_Error("FE Engine already has a mesh");
argIdx++;
int nx = atoi(arg[argIdx++]);
int ny = atoi(arg[argIdx++]);
int nz = atoi(arg[argIdx++]);
string box = arg[argIdx++];
Array<bool> periodicity(3);
periodicity(0) = (strcmp(arg[argIdx++],"p")==0) ? true : false;
periodicity(1) = (strcmp(arg[argIdx++],"p")==0) ? true : false;
periodicity(2) = (strcmp(arg[argIdx++],"p")==0) ? true : false;
if (argIdx < narg ) {
Array<double> dx(nx),dy(ny),dz(nz);
dx = 0;
dy = 0;
dz = 0;
double x[3] = {0,0,0};
while (argIdx < narg) {
if (strcmp(arg[argIdx++],"dx")==0) {
// parse relative values for each element
if (is_numeric(arg[argIdx])) {
for (int i = 0; i < nx; ++i) {
if (is_numeric(arg[argIdx])) { dx(i) = atof(arg[argIdx++]); }
else throw ATC_Error("not enough element partitions");
}
}
// construct relative values from a density function
// evaluate for a domain (0,1)
else {
XT_Function * f = XT_Function_Mgr::instance()->function(&(arg[argIdx]),narg-argIdx);
for (int i = 0; i < nx; ++i) {
x[0] = (i+0.5)/nx; dx(i) = f->f(x,0.);
}
}
break ;
}
else if (strcmp(arg[argIdx++],"dy")==0) {
for (int i = 0; i < ny; ++i) { dy(i) = atof(arg[argIdx++]); }
}
else if (strcmp(arg[argIdx++],"dz")==0) {
for (int i = 0; i < nz; ++i) { dz(i) = atof(arg[argIdx++]); }
}
}
create_mesh(dx, dy, dz, box.c_str(), periodicity);
}
else {
create_mesh(nx, ny, nz, box.c_str(), periodicity);
}
quadrature_ = GAUSS2;
match = true;
}
+ /*! \page man_mesh_quadrature fix_modify AtC mesh quadrature
+ \section syntax
+ fix_modify AtC mesh quadrature <quad>
+ - quad = one of <nodal|gauss1|gauss2|gauss3|face> --- when a mesh is created it defaults to gauss2, use this call to change it after the fact
+ \section examples
+ <TT> fix_modify AtC mesh quadrature face </TT>
+ \section description
+ (Re-)assigns the quadrature style for the existing mesh.
+ \section restrictions
+ \section related
+ \ref man_mesh_create
+ \section default
+ none
+ */
else if (strcmp(arg[argIdx],"quadrature")==0) {
argIdx++;
string quadStr = arg[argIdx];
FeIntQuadrature quadEnum = string_to_FIQ(quadStr);
set_quadrature(quadEnum);
match = true;
}
- /** Example command for reading a mesh from a file:
- fix_modify atc mesh read fileName */
- // read mesh
+ /*! \page man_mesh_read fix_modify AtC mesh read
+ \section syntax
+ fix_modify AtC mesh read <filename> <f|p> <f|p> <f|p>
+ - filename = name of file containing mesh to be read
+ - f p p = periodicity flags for x, y, z
+ \section examples
+ <TT> fix_modify AtC mesh read myComponent.mesh p p p </TT> \n
+ <TT> fix_modify AtC mesh read myOtherComponent.exo </TT>
+ \section description
+ Reads a mesh from a text or exodus file, and assigns periodic
+ boundary conditions if needed.
+ \section restrictions
+ \section related
+ \section default
+ periodicity flags are false by default
+ */
else if (strcmp(arg[argIdx],"read")==0) {
argIdx++;
string meshFile = arg[argIdx++];
Array<bool> periodicity(3);
periodicity = false;
if (argIdx < narg) {
periodicity(0) = (strcmp(arg[argIdx++],"p")==0) ? true : false;
periodicity(1) = (strcmp(arg[argIdx++],"p")==0) ? true : false;
periodicity(2) = (strcmp(arg[argIdx++],"p")==0) ? true : false;
}
read_mesh(meshFile,periodicity);
if (periodicity(0) || periodicity(1) || periodicity(2)) {
meshFile = "periodic_"+meshFile;
stringstream ss;
ss << "writing periodicity corrected mesh: " << meshFile;
print_msg(communicator_,ss.str());
feMesh_->write_mesh(meshFile);
feMesh_->output(meshFile);
}
match = true;
}
- /** Example command for reading a mesh from a file:
- fix_modify atc mesh write fileName */
- // write mesh
+ /*! \page man_mesh_write fix_modify AtC mesh write
+ \section syntax
+ fix_modify AtC mesh write <filename>
+ - filename = name of file to write mesh
+ \section examples
+ <TT> fix_modify AtC mesh write myMesh.mesh </TT> \n
+ \section description
+ Writes a mesh to a text file.
+ \section restrictions
+ \section related
+ \section default
+ */
else if (strcmp(arg[argIdx],"write")==0) {
argIdx++;
string meshFile = arg[argIdx];
feMesh_->write_mesh(meshFile);
match = true;
}
/*! \page man_mesh_delete_elements fix_modify AtC mesh delete_elements
\section syntax
fix_modify AtC mesh delete_elements <element_set>
- <element_set> = name of an element set
\section examples
<TT> fix_modify AtC delete_elements gap </TT>
\section description
Deletes a group of elements from the mesh.
\section restrictions
\section related
\section default
none
*/
else if (strcmp(arg[argIdx],"delete_elements")==0) {
argIdx++;
string esetName = arg[argIdx];
set<int> elemSet = feMesh_->elementset(esetName);
nullElements_.insert(elemSet.begin(), elemSet.end());
match = true;
}
else if (strcmp(arg[argIdx],"cut")==0) {
argIdx++;
string fsetName = arg[argIdx++];
set<PAIR> faceSet = feMesh_->faceset(fsetName);
cutFaces_.insert(faceSet.begin(), faceSet.end());
if (narg > argIdx && strcmp(arg[argIdx],"edge")==0) {
argIdx++;
string nsetName = arg[argIdx];
set<int> nodeSet = feMesh_->nodeset(nsetName);
cutEdge_.insert(nodeSet.begin(), nodeSet.end());
}
// cut mesh
if (cutFaces_.size() > 0) cut_mesh(cutFaces_,cutEdge_);
match = true;
}
else if (strcmp(arg[argIdx],"lammps_partition")==0) {
feMesh_->set_lammps_partition(true);
match = true;
}
else if (strcmp(arg[argIdx],"data_decomposition")==0) {
feMesh_->set_data_decomposition(true);
match = true;
}
else {
if ( ! feMesh_ ) throw ATC_Error("need mesh for parsing");
match = feMesh_->modify(narg,arg);
}
}
// FE_Mesh
else {
if ( ! feMesh_ ) throw ATC_Error("need mesh for parsing");
match = feMesh_->modify(narg,arg);
}
return match;
}
//-----------------------------------------------------------------
void FE_Engine::finish()
{
// Nothing to do
}
//-----------------------------------------------------------------
// write geometry
//-----------------------------------------------------------------
void FE_Engine::initialize_output(int rank,
string outputPrefix, set<int> otypes)
{
outputManager_.initialize(outputPrefix, otypes);
if (!feMesh_) throw ATC_Error("output needs mesh");
if (!initialized_) initialize();
if (!feMesh_->coordinates() || !feMesh_->connectivity())
throw ATC_Error("output mesh not properly initialized");
if (!feMesh_->coordinates()->nCols() ||
!feMesh_->connectivity()->nCols())
throw ATC_Error("output mesh is empty");
if (rank == 0)
outputManager_.write_geometry(feMesh_->coordinates(),
feMesh_->connectivity());
outputManager_.print_custom_names();
}
//-----------------------------------------------------------------
// write geometry
//-----------------------------------------------------------------
void FE_Engine::write_geometry(void)
{
outputManager_.write_geometry(feMesh_->coordinates(),
feMesh_->connectivity());
}
// -------------------------------------------------------------
// write data
// -------------------------------------------------------------
void FE_Engine::write_data(double time,
FIELDS &soln,
OUTPUT_LIST *data)
{
outputManager_.write_data(
time, &soln, data,
(feMesh_->node_map())->data());
}
// -------------------------------------------------------------
// write data
// -------------------------------------------------------------
void FE_Engine::write_data(double time, OUTPUT_LIST *data)
{
outputManager_.write_data(
time, data,
feMesh_->node_map()->data());
}
// -------------------------------------------------------------
// amend mesh for deleted elements
// -------------------------------------------------------------
void FE_Engine::delete_elements(const set<int> & elementList)
{
feMesh_->delete_elements(elementList);
}
// -------------------------------------------------------------
// amend mesh for cut at specified faces
// -------------------------------------------------------------
void FE_Engine::cut_mesh(const set<PAIR> &faceSet,
const set<int> &nodeSet)
{
feMesh_->cut_mesh(faceSet,nodeSet);
}
// -------------------------------------------------------------
// interpolate one value
// -------------------------------------------------------------
DENS_VEC FE_Engine::interpolate_field(const DENS_VEC & x, const FIELD & f) const
{
DENS_VEC N;
Array<int> nodelist;
feMesh_->shape_functions(x, N, nodelist);
const DENS_MAT &vI = f.quantity();
int dof = vI.nCols();
DENS_MAT vIe(nNodesPerElement_, dof);
for (int i = 0; i < nNodesPerElement_; i++)
for (int j = 0; j < dof; j++)
vIe(i,j) = vI(nodelist(i),j);
DENS_VEC vP;
vP = N*vIe;
return vP;
}
// -------------------------------------------------------------
// interpolate fields and gradients
// Currently, this function will break if called with an unowned ielem.
// Currently, this function is only called with owned ielems.
// -------------------------------------------------------------
void FE_Engine::interpolate_fields(
const int ielem,
const FIELDS &fields,
AliasArray<int> & conn,
DENS_MAT & N,
DENS_MAT_VEC & dN,
DIAG_MAT & _weights_,
FIELD_MATS &fieldsAtIPs,
GRAD_FIELD_MATS &gradFieldsAtIPs) const
{
// evaluate shape functions
feMesh_->shape_function(ielem, N, dN, _weights_);
// get connectivity
_conn_ = feMesh_->element_connectivity_unique(ielem);
// compute fields and gradients of fields ips of this element
FIELD_MATS localElementFields;
for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) {
// field values at all nodes
_fieldName_ = _fieldItr_->first;
const DENS_MAT &vI = (_fieldItr_->second).quantity();
int dof = vI.nCols();
// field values at integration points -> to be computed
DENS_MAT &vP = fieldsAtIPs[_fieldName_];
// gradients of field at integration points -> to be computed
DENS_MAT_VEC &dvP = gradFieldsAtIPs[_fieldName_];
if (_fieldName_ == ELECTRON_WAVEFUNCTION_ENERGIES ) {
vP = vI;
continue;
}
// field values at element nodes
DENS_MAT &vIe = localElementFields[_fieldName_];
// gather local field
vIe.reset(nNodesPerElement_, dof);
for (int i = 0; i < nNodesPerElement_; i++)
for (int j = 0; j < dof; j++)
vIe(i,j) = vI(conn(i),j);
// interpolate field at integration points
vP = N*vIe;
// gradients
dvP.assign(nSD_, DENS_MAT(nIPsPerElement_, dof));
for (int j = 0; j < nSD_; ++j) dvP[j] = dN[j]*vIe;
}
}
// -------------------------------------------------------------
// interpolate fields
// Currently, this function will break if called with an unowned ielem.
// Currently, this function is only called with owned ielems.
// -------------------------------------------------------------
void FE_Engine::interpolate_fields(
const int ielem,
const FIELDS &fields,
AliasArray<int> & conn,
DENS_MAT & N,
DIAG_MAT & _weights_,
FIELD_MATS &fieldsAtIPs) const
{
// evaluate shape functions
feMesh_->shape_function(ielem, N, _weights_);
// get connectivity
_conn_ = feMesh_->element_connectivity_unique(ielem);
// compute fields and gradients of fields ips of this element
FIELD_MATS localElementFields;
for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) {
// field values at all nodes
_fieldName_ = _fieldItr_->first;
const DENS_MAT &vI = (_fieldItr_->second).quantity();
int dof = vI.nCols();
// field values at integration points -> to be computed
DENS_MAT &vP = fieldsAtIPs[_fieldName_];
// field values at element nodes
DENS_MAT &vIe = localElementFields[_fieldName_];
if (_fieldName_ == ELECTRON_WAVEFUNCTION_ENERGIES ) {
vP = vI;
continue;
}
// gather local field
vIe.reset(nNodesPerElement_, dof);
for (int i = 0; i < nNodesPerElement_; i++)
for (int j = 0; j < dof; j++)
vIe(i,j) = vI(conn(i),j);
// interpolate field at integration points
vP = N*vIe;
}
}
// -------------------------------------------------------------
// compute dimensionless stiffness matrix using native quadrature
// -------------------------------------------------------------
void FE_Engine::stiffness_matrix(SPAR_MAT &matrix) const
{
// assemble consistent mass
matrix.reset(nNodesUnique_,nNodesUnique_);// zero since partial fill
DENS_MAT elementMassMatrix(nNodesPerElement_,nNodesPerElement_);
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
// evaluate shape functions
feMesh_->shape_function(ielem, _N_, _dN_, _weights_); // _N_ unused
// perform quadrature
elementMassMatrix = _dN_[0].transMat(_weights_*_dN_[0]);
for (int i = 1; i < nSD_; ++i) {
elementMassMatrix += _dN_[i].transMat(_weights_*_dN_[i]);
}
// get connectivity
_conn_ = feMesh_->element_connectivity_unique(ielem);
for (int i = 0; i < nNodesPerElement_; ++i)
{
int inode = _conn_(i);
for (int j = 0; j < nNodesPerElement_; ++j)
{
int jnode = _conn_(j);
matrix.add(inode, jnode, elementMassMatrix(i,j));
}
}
}
#ifdef ISOLATE_FE
sparse_allsum(communicator_,matrix);
#else
LammpsInterface::instance()->sparse_allsum(matrix);
#endif
matrix.compress();
}
// -------------------------------------------------------------
// compute tangent using native quadrature for one (field,field) pair
// -------------------------------------------------------------
void FE_Engine::compute_tangent_matrix(
const Array2D<bool> &rhsMask,
const pair<FieldName,FieldName> row_col,
const FIELDS &fields,
const PhysicsModel * physicsModel,
const Array<int> & elementMaterials,
SPAR_MAT &tangent,
const DenseMatrix<bool> *elementMask) const
{
tangent.reset(nNodesUnique_,nNodesUnique_);
FieldName rowField = row_col.first;
FieldName colField = row_col.second;
bool BB = rhsMask(rowField,FLUX);
bool NN = rhsMask(rowField,SOURCE);
DENS_MAT elementMatrix(nNodesPerElement_,nNodesPerElement_);
DENS_MAT coefsAtIPs;
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
// if element is masked, skip it
if (elementMask && !(*elementMask)(ielem,0)) continue;
// material id
int imat = elementMaterials(ielem);
const Material * mat = physicsModel->material(imat);
// interpolate fields and gradients (nonlinear only)
interpolate_fields(ielem,fields,_conn_,_N_,_dN_,_weights_,
_fieldsAtIPs_,_gradFieldsAtIPs_);
// evaluate Physics model
if (! (physicsModel->null(rowField,imat)) ) {
if (BB && physicsModel->weak_equation(rowField)->
has_BB_tangent_coefficients() ) {
physicsModel->weak_equation(rowField)->
BB_tangent_coefficients(colField, _fieldsAtIPs_, mat, coefsAtIPs);
DIAG_MAT D(column(coefsAtIPs,0));
D = _weights_*D;
elementMatrix = _dN_[0].transMat(D*_dN_[0]);
for (int i = 1; i < nSD_; i++) {
elementMatrix += _dN_[i].transMat(D*_dN_[i]);
}
}
else {
elementMatrix.reset(nNodesPerElement_,nNodesPerElement_);
}
if (NN && physicsModel->weak_equation(rowField)->
has_NN_tangent_coefficients() ) {
physicsModel->weak_equation(rowField)->
NN_tangent_coefficients(colField, _fieldsAtIPs_, mat, coefsAtIPs);
DIAG_MAT D(column(coefsAtIPs,0));
D = _weights_*D;
elementMatrix += _N_.transMat(D*_N_);
}
// assemble
for (int i = 0; i < nNodesPerElement_; ++i)
{
int inode = _conn_(i);
for (int j = 0; j < nNodesPerElement_; ++j)
{
int jnode = _conn_(j);
tangent.add(inode, jnode, elementMatrix(i,j));
}
}
}
}
#ifdef ISOLATE_FE
sparse_allsum(communicator_,tangent);
#else
LammpsInterface::instance()->sparse_allsum(tangent);
#endif
tangent.compress();
}
// -------------------------------------------------------------
// compute tangent using given quadrature for one (field,field) pair
// -------------------------------------------------------------
void FE_Engine::compute_tangent_matrix(const Array2D<bool> &rhsMask,
const pair<FieldName,FieldName> row_col,
const FIELDS &fields,
const PhysicsModel * physicsModel,
const Array<set<int> > & pointMaterialGroups,
const DIAG_MAT &weights,
const SPAR_MAT &N,
const SPAR_MAT_VEC &dN,
SPAR_MAT &tangent,
const DenseMatrix<bool> *elementMask ) const
{
int nn = nNodesUnique_;
FieldName rowField = row_col.first;
FieldName colField = row_col.second;
bool BB = rhsMask(rowField,FLUX);
bool NN = rhsMask(rowField,SOURCE);
DENS_MAT K(nn,nn);
DENS_MAT coefsAtIPs;
int nips = weights.nCols();
if (nips>0) {
// compute fields and gradients of fields at given ips
GRAD_FIELD_MATS gradFieldsAtIPs;
FIELD_MATS fieldsAtIPs;
for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) {
_fieldName_ = _fieldItr_->first;
const DENS_MAT & field = (_fieldItr_->second).quantity();
int dof = field.nCols();
gradFieldsAtIPs[_fieldName_].assign(nSD_,DENS_MAT(nips,dof));
fieldsAtIPs[_fieldName_] = N*field;
for (int j = 0; j < nSD_; ++j) {
gradFieldsAtIPs[_fieldName_][j] = (*dN[j])*field;
}
}
// treat single material point sets specially
int nMatls = pointMaterialGroups.size();
int atomMatls = 0;
for (int imat = 0; imat < nMatls; imat++) {
const set<int> & indices = pointMaterialGroups(imat);
if ( indices.size() > 0) atomMatls++;
}
bool singleMaterial = ( atomMatls == 1 );
if (! singleMaterial ) throw ATC_Error("FE_Engine::compute_tangent_matrix-given quadrature can not handle multiple atom material currently");
if (singleMaterial)
{
int imat = 0;
const Material * mat = physicsModel->material(imat);
// evaluate Physics model
if (! (physicsModel->null(rowField,imat)) ) {
if (BB && physicsModel->weak_equation(rowField)->
has_BB_tangent_coefficients() ) {
physicsModel->weak_equation(rowField)->
BB_tangent_coefficients(colField, fieldsAtIPs, mat, coefsAtIPs);
DIAG_MAT D(column(coefsAtIPs,0));
D = weights*D;
K = (*dN[0]).transMat(D*(*dN[0]));
for (int i = 1; i < nSD_; i++) {
K += (*dN[i]).transMat(D*(*dN[i]));
}
}
if (NN && physicsModel->weak_equation(rowField)->
has_NN_tangent_coefficients() ) {
physicsModel->weak_equation(rowField)->
NN_tangent_coefficients(colField, fieldsAtIPs, mat, coefsAtIPs);
DIAG_MAT D(column(coefsAtIPs,0));
D = weights*D;
K += N.transMat(D*N);
}
}
}
}
// share information between processors
int count = nn*nn;
DENS_MAT K_sum(nn,nn);
allsum(communicator_, K.ptr(), K_sum.ptr(), count);
// create sparse from dense
tangent.reset(K_sum,tol_sparse);
tangent.compress();
}
// -------------------------------------------------------------
// compute a consistent mass matrix for native quadrature
// -------------------------------------------------------------
void FE_Engine::compute_mass_matrix(
const Array<FieldName>& field_mask,
const FIELDS &fields,
const PhysicsModel * physicsModel,
const Array<int> & elementMaterials,
CON_MASS_MATS & massMatrices,
const DenseMatrix<bool> *elementMask) const
{
int nfields = field_mask.size();
vector<FieldName> usedFields;
DENS_MAT elementMassMatrix(nNodesPerElement_,nNodesPerElement_);
// (JAT, 04/21/11) FIX THIS
DENS_MAT capacity;
// zero, use incoming matrix as template if possible
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
SPAR_MAT & M = massMatrices[_fieldName_].set_quantity();
// compresses 2May11
if (M.has_template()) { M = 0; }
else { M.reset(nNodesUnique_,nNodesUnique_); }
M.reset(nNodesUnique_,nNodesUnique_);
}
// element wise assembly
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
// if element is masked, skip
if (elementMask && !(*elementMask)(ielem,0)) continue;
// material id
int imat = elementMaterials(ielem);
const Material * mat = physicsModel->material(imat);
// interpolate fields
interpolate_fields(ielem,fields,_conn_,_N_,_weights_,_fieldsAtIPs_);
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
SPAR_MAT & M = massMatrices[_fieldName_].set_quantity();
// skip null weakEqns by material
if (! (physicsModel->null(_fieldName_,imat)) ) {
physicsModel->weak_equation(_fieldName_)->
M_integrand(_fieldsAtIPs_, mat, capacity);
DIAG_MAT rho(column(capacity,0));
elementMassMatrix = _N_.transMat(_weights_*rho*_N_);
// assemble
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
for (int j = 0; j < nNodesPerElement_; ++j) {
int jnode = _conn_(j);
M.add(inode, jnode, elementMassMatrix(i,j));
}
}
}
}
}
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
SPAR_MAT & M = massMatrices[_fieldName_].set_quantity();
#ifdef ISOLATE_FE
sparse_allsum(communicator_,M);
#else
LammpsInterface::instance()->sparse_allsum(M);
#endif
}
// fix zero diagonal entries due to null material elements
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
SPAR_MAT & M = massMatrices[_fieldName_].set_quantity();
for (int inode = 0; inode < nNodesUnique_; ++inode) {
if (! M.has_entry(inode,inode)) {
M.set(inode,inode,1.0);
}
}
M.compress();
}
}
// -------------------------------------------------------------
// compute dimensionless consistent mass using native quadrature
// -------------------------------------------------------------
void FE_Engine::compute_mass_matrix(SPAR_MAT &massMatrix) const
{
// assemble nnodes X nnodes matrix
massMatrix.reset(nNodesUnique_,nNodesUnique_);// zero since partial fill
DENS_MAT elementMassMatrix(nNodesPerElement_,nNodesPerElement_);
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
// evaluate shape functions
feMesh_->shape_function(ielem, _N_, _weights_);
// perform quadrature
elementMassMatrix = _N_.transMat(_weights_*_N_);
// get connectivity
_conn_ = feMesh_->element_connectivity_unique(ielem);
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
for (int j = 0; j < nNodesPerElement_; ++j) {
int jnode = _conn_(j);
massMatrix.add(inode, jnode, elementMassMatrix(i,j));
}
}
}
// Assemble partial results
#ifdef ISOLATE_FE
sparse_allsum(communicator_,massMatrix);
#else
LammpsInterface::instance()->sparse_allsum(massMatrix);
#endif
}
// -------------------------------------------------------------
// compute dimensionless consistent mass using given quadrature
// -------------------------------------------------------------
void FE_Engine::compute_mass_matrix(const DIAG_MAT &weights,
const SPAR_MAT &N,
SPAR_MAT &massMatrix) const
{
int nn = N.nCols();
int nips = N.nRows();
DENS_MAT tmp_mass_matrix_local(nn,nn), tmp_mass_matrix(nn,nn);
if (nips>0) { tmp_mass_matrix_local = N.transMat(weights*N); }
// share information between processors
int count = nn*nn;
allsum(communicator_,
tmp_mass_matrix_local.ptr(),
tmp_mass_matrix.ptr(), count);
// create sparse from dense
massMatrix.reset(tmp_mass_matrix,tol_sparse);
}
// -------------------------------------------------------------
// compute dimensionless lumped mass using native quadrature
// -------------------------------------------------------------
void FE_Engine::compute_lumped_mass_matrix(DIAG_MAT & M) const
{
M.reset(nNodesUnique_,nNodesUnique_); // zero since partial fill
// assemble lumped diagonal mass
DENS_VEC Nvec(nNodesPerElement_);
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
// evaluate shape functions
feMesh_->shape_function(ielem, _N_, _weights_);
CLON_VEC w(_weights_);
// get connectivity
_conn_ = feMesh_->element_connectivity_unique(ielem);
Nvec = w*_N_;
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
M(inode,inode) += Nvec(i);
}
}
// Assemble partial results
allsum(communicator_,MPI_IN_PLACE, M.ptr(), M.size());
}
// -------------------------------------------------------------
// compute physical lumped mass using native quadrature
// -------------------------------------------------------------
void FE_Engine::compute_lumped_mass_matrix(
const Array<FieldName>& field_mask,
const FIELDS & fields,
const PhysicsModel * physicsModel,
const Array<int> &elementMaterials,
MASS_MATS & massMatrices, // mass matrix
const DenseMatrix<bool> *elementMask) const
{
int nfields = field_mask.size();
// zero initialize for assembly
for (int j = 0; j < nfields; ++j) {
DIAG_MAT & M = massMatrices[field_mask(j)].set_quantity();
M.reset(nNodesUnique_,nNodesUnique_);
}
// assemble diagonal matrix
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
// if element is masked, skip it
if (elementMask && !(*elementMask)(ielem,0)) continue;
// material id
int imat = elementMaterials(ielem);
const Material * mat = physicsModel->material(imat);
interpolate_fields(ielem,fields,_conn_,_N_,_weights_,_fieldsAtIPs_);
// compute densities, integrate & assemble
DENS_MAT capacity;
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
if (! physicsModel->null(_fieldName_,imat)) {
physicsModel->weak_equation(_fieldName_)->
M_integrand(_fieldsAtIPs_, mat, capacity);
_Nmat_ = _N_.transMat(_weights_*capacity);
DIAG_MAT & M = massMatrices[_fieldName_].set_quantity();
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
M(inode,inode) += _Nmat_(i,0);
}
}
}
}
// Assemble partial results
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
DIAG_MAT & M = massMatrices[_fieldName_].set_quantity();
allsum(communicator_,MPI_IN_PLACE, M.ptr(), M.size());
}
+
// fix zero diagonal entries due to null material elements
for (int inode = 0; inode < nNodesUnique_; ++inode) {
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
DIAG_MAT & M = massMatrices[_fieldName_].set_quantity();
if (M(inode,inode) == 0.0) {
M(inode,inode) = 1.0;
}
}
}
}
// -------------------------------------------------------------
// compute physical lumped mass using given quadrature
// -------------------------------------------------------------
void FE_Engine::compute_lumped_mass_matrix(
const Array<FieldName> &field_mask,
const FIELDS &fields,
const PhysicsModel * physicsModel,
const Array<set<int> > & pointMaterialGroups,
const DIAG_MAT &weights,
const SPAR_MAT &N,
MASS_MATS &M) const // mass matrices
{
int nips = weights.nCols();
int nfields = field_mask.size();
// initialize
map<FieldName, DIAG_MAT> M_local;
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
M_local[_fieldName_].reset(nNodesUnique_,nNodesUnique_);
M[_fieldName_].reset(nNodesUnique_,nNodesUnique_);
}
if (nips>0) {
// compute fields at given ips
// compute all fields since we don't the capacities dependencies
FIELD_MATS fieldsAtIPs;
for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) {
_fieldName_ = _fieldItr_->first;
const DENS_MAT & field = (_fieldItr_->second).quantity();
int dof = field.nCols();
fieldsAtIPs[_fieldName_].reset(nips,dof);
fieldsAtIPs[_fieldName_] = N*field;
}
// treat single material point sets specially
int nMatls = pointMaterialGroups.size();
int atomMatls = 0;
for (int imat = 0; imat < nMatls; imat++) {
const set<int> & indices = pointMaterialGroups(imat);
if ( indices.size() > 0) atomMatls++;
}
if (atomMatls == 0) {
throw ATC_Error("no materials in atom region - atoms may have migrated to FE-only region");
}
bool singleMaterial = ( atomMatls == 1 );
if (! singleMaterial ) {
stringstream ss; ss << " WARNING: multiple materials in atomic region";
print_msg(communicator_,ss.str());
}
// setup data structures
FIELD_MATS capacities;
// evaluate physics model & compute capacity|density for requested fields
if (singleMaterial) {
int imat = 0;
const Material * mat = physicsModel->material(imat);
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
// mass matrix needs to be invertible so null matls have cap=1
if (physicsModel->null(_fieldName_,imat)) {
throw ATC_Error("null material not supported for atomic region (single material)");
const FIELD & f = (fields.find(_fieldName_))->second;
capacities[_fieldName_].reset(f.nRows(),f.nCols());
capacities[_fieldName_] = 1.;
}
else {
physicsModel->weak_equation(_fieldName_)->
M_integrand(fieldsAtIPs, mat, capacities[_fieldName_]);
}
}
}
else {
FIELD_MATS groupCapacities, fieldsGroup;
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
capacities[_fieldName_].reset(nips,1);
}
for ( int imat = 0; imat < pointMaterialGroups.size(); imat++) {
const Material * mat = physicsModel->material(imat);
const set<int> & indices = pointMaterialGroups(imat);
int npts = indices.size();
if (npts > 0) {
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
groupCapacities[_fieldName_].reset(npts,1);
const FIELD & f = (fields.find(_fieldName_))->second;
int ndof = f.nCols();
fieldsGroup[_fieldName_].reset(npts,ndof);
int i = 0;
for (set<int>::const_iterator iter=indices.begin();
iter != indices.end(); iter++, i++ ) {
for (int dof = 0; dof < ndof; ++dof) {
fieldsGroup[_fieldName_](i,dof)
= fieldsAtIPs[_fieldName_](*iter,dof);
}
}
}
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
if (physicsModel->null(_fieldName_,imat)) {
throw ATC_Error("null material not supported for atomic region (multiple materials)");
const FIELD & f = (fields.find(_fieldName_))->second;
groupCapacities[_fieldName_].reset(f.nRows(),f.nCols());
groupCapacities[_fieldName_] = 1.;
}
else {
physicsModel->weak_equation(_fieldName_)->
M_integrand(fieldsGroup, mat, groupCapacities[_fieldName_]);
}
int i = 0;
for (set<int>::const_iterator iter=indices.begin();
iter != indices.end(); iter++, i++ ) {
capacities[_fieldName_](*iter,0)
= groupCapacities[_fieldName_](i,0);
}
}
}
}
}
// integrate & assemble
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
M_local[_fieldName_].reset( // assume all columns same
column(N.transMat(weights*capacities[_fieldName_]),0) );
}
}
// Share information between processors
for (int j = 0; j < nfields; ++j) {
_fieldName_ = field_mask(j);
DIAG_MAT & myMassMat(M[_fieldName_].set_quantity());
int count = M_local[_fieldName_].size();
allsum(communicator_, M_local[_fieldName_].ptr(), myMassMat.ptr(), count);
}
}
//-----------------------------------------------------------------
// compute assembled average gradient evaluated at the nodes
//-----------------------------------------------------------------
void FE_Engine::compute_gradient_matrix(SPAR_MAT_VEC & grad_matrix) const
{
// zero
DENS_MAT_VEC tmp_grad_matrix(nSD_);
for (int i = 0; i < nSD_; i++) {
tmp_grad_matrix[i].reset(nNodesUnique_,nNodesUnique_);
}
// element wise assembly
Array<int> count(nNodesUnique_); count = 0;
set_quadrature(NODAL);
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
// evaluate shape functions
feMesh_->shape_function(ielem, _N_, _dN_, _weights_);
// get connectivity
_conn_ = feMesh_->element_connectivity_unique(ielem);
for (int j = 0; j < nIPsPerElement_; ++j) {
int jnode = _conn_(j);
count(jnode) += 1;
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
for (int k = 0; k < nSD_; ++k) {
tmp_grad_matrix[k](jnode,inode) += _dN_[k](j,i);
}
}
}
}
// Assemble partial results
for (int k = 0; k < nSD_; ++k) {
allsum(communicator_,MPI_IN_PLACE, tmp_grad_matrix[k].ptr(), tmp_grad_matrix[k].size());
}
int_allsum(communicator_,MPI_IN_PLACE, count.ptr(), count.size());
set_quadrature(quadrature_); //reset to default
for (int inode = 0; inode < nNodesUnique_; ++inode) {
for (int jnode = 0; jnode < nNodesUnique_; ++jnode) {
for (int k = 0; k < nSD_; ++k) {
tmp_grad_matrix[k](jnode,inode) /= count(jnode);
}
}
}
// compact dense matrices
for (int k = 0; k < nSD_; ++k) {
grad_matrix[k]->reset(tmp_grad_matrix[k],tol_sparse);
}
}
// -------------------------------------------------------------
// compute energy per node using native quadrature
// -------------------------------------------------------------
void FE_Engine::compute_energy(const Array<FieldName> &mask,
const FIELDS &fields,
const PhysicsModel * physicsModel,
const Array<int> & elementMaterials,
FIELD_MATS &energies,
const DenseMatrix<bool> *elementMask,
const IntegrationDomainType domain) const
{
// Zero out all fields
for (int n = 0; n < mask.size(); n++) {
_fieldName_ = mask(n);
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
energies[_fieldName_].reset(field.nRows(), 1);
}
DENS_MAT elementEnergy(nNodesPerElement_,1); // workspace
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
// if element is masked, skip it
if (domain != FULL_DOMAIN && elementMask && !(*elementMask)(ielem,0)) continue;
// material id
int imat = elementMaterials(ielem);
const Material * mat = physicsModel->material(imat);
interpolate_fields(ielem,fields,_conn_,_N_,_dN_,_weights_,
_fieldsAtIPs_,_gradFieldsAtIPs_);
// assemble
for (int n = 0; n < mask.size(); n++) {
_fieldName_ = mask(n);
if (physicsModel->null(_fieldName_,imat)) continue;
if( ! (physicsModel->weak_equation(_fieldName_)-> has_E_integrand())) continue;
physicsModel->weak_equation(_fieldName_)->
E_integrand(_fieldsAtIPs_, _gradFieldsAtIPs_, mat, elementEnergy);
_fieldItr_ = fields.find(_fieldName_);
_Nmat_ = _N_.transMat(_weights_*elementEnergy);
DENS_MAT & energy = energies[_fieldName_];
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
energy(inode,0) += _Nmat_(i,0);
}
}
}
for (int n = 0; n < mask.size(); n++) {
_fieldName_ = mask(n);
DENS_MAT& myEnergy(energies[_fieldName_]);
allsum(communicator_,MPI_IN_PLACE, myEnergy.ptr(), myEnergy.size());
}
}
// -------------------------------------------------------------
// compute rhs using native quadrature
// -------------------------------------------------------------
void FE_Engine::compute_rhs_vector(const Array2D<bool> &rhsMask,
const FIELDS &fields,
const PhysicsModel * physicsModel,
const Array<int> & elementMaterials,
FIELDS &rhs,
const DenseMatrix<bool> *elementMask) const
{
vector<FieldName> usedFields;
// size and zero output
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (rhsMask(_fieldName_, FLUX) || rhsMask(_fieldName_, SOURCE)) {
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
rhs[_fieldName_].reset(field.nRows(), field.nCols());
// Save field names for easy lookup later.
usedFields.push_back(_fieldName_);
}
}
// Iterate over elements partitioned onto current processor.
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
// Skip masked elements
if (elementMask && !(*elementMask)(ielem,0)) continue;
int imat = elementMaterials(ielem); // material id
const Material * mat = physicsModel->material(imat);
// interpolate field values to integration points
interpolate_fields(ielem,fields,_conn_,_N_,_dN_,_weights_,
_fieldsAtIPs_,_gradFieldsAtIPs_);
// rescale by _weights_, a diagonal matrix
_Nw_ = _weights_*_N_;
for (int j = 0; j < nSD_; ++j) _dNw_[j] = _weights_*_dN_[j];
// evaluate physics model and assemble
// _Nfluxes is a set of fields
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (!rhsMask(_fieldName_,SOURCE)) continue;
if (physicsModel->null(_fieldName_,imat)) continue;
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
DENS_MAT & myRhs(rhs[_fieldName_].set_quantity());
int dof = field.nCols();
bool has = physicsModel->weak_equation(_fieldName_)->
N_integrand(_fieldsAtIPs_,_gradFieldsAtIPs_, mat, _Nfluxes_);
if (!has) continue;
_Nmat_ = _Nw_.transMat(_Nfluxes_);
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
for (int k = 0; k < dof; ++k) {
myRhs(inode,k) += _Nmat_(i,k);
}
}
}
// _Bfluxes_ is a set of field gradients
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (!rhsMask(_fieldName_,FLUX)) continue;
if (physicsModel->null(_fieldName_,imat)) continue;
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
DENS_MAT & myRhs(rhs[_fieldName_].set_quantity());
int dof = field.nCols();
physicsModel->weak_equation(_fieldName_)->
B_integrand(_fieldsAtIPs_, _gradFieldsAtIPs_, mat, _Bfluxes_);
for (int j = 0; j < nSD_; j++) {
_Nmat_ = _dNw_[j].transMat(_Bfluxes_[j]);
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
for (int k = 0; k < dof; ++k) {
myRhs(inode,k) += _Nmat_(i,k);
}
}
}
}
}
vector<FieldName>::iterator _fieldIter_;
for (_fieldIter_ = usedFields.begin(); _fieldIter_ != usedFields.end();
++_fieldIter_) {
// myRhs is where we put the global result for this field.
_fieldName_ = *_fieldIter_;
DENS_MAT & myRhs(rhs[_fieldName_].set_quantity());
// Sum matrices in-place across all processors into myRhs.
allsum(communicator_,MPI_IN_PLACE, myRhs.ptr(), myRhs.size());
}
}
// -------------------------------------------------------------
// compute rhs using given quadrature
// -------------------------------------------------------------
void FE_Engine::compute_rhs_vector(const Array2D<bool> &rhsMask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
const Array<set<int> >&pointMaterialGroups,
const DIAG_MAT &weights,
const SPAR_MAT &N,
const SPAR_MAT_VEC &dN,
FIELDS &rhs) const
{
FIELD_MATS rhs_local;
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (rhsMask(_fieldName_,FLUX) || rhsMask(_fieldName_,SOURCE)) {
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
int nrows = field.nRows();
int ncols = field.nCols();
rhs [_fieldName_].reset(nrows,ncols);
rhs_local[_fieldName_].reset(nrows,ncols);
}
}
int nips = weights.nCols();
if (nips>0) {
// compute fields and gradients of fields at given ips
GRAD_FIELD_MATS gradFieldsAtIPs;
FIELD_MATS fieldsAtIPs;
for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) {
_fieldName_ = _fieldItr_->first;
const DENS_MAT & field = (_fieldItr_->second).quantity();
int dof = field.nCols();
gradFieldsAtIPs[_fieldName_].assign(nSD_,DENS_MAT(nips,dof));
fieldsAtIPs[_fieldName_] = N*field;
for (int j = 0; j < nSD_; ++j) {
gradFieldsAtIPs[_fieldName_][j] = (*dN[j])*field;
}
}
// setup data structures
FIELD_MATS Nfluxes;
GRAD_FIELD_MATS Bfluxes;
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
int index = (int) _fieldName_;
if ( rhsMask(index,FLUX) ) {
Bfluxes[_fieldName_].assign(nSD_, DENS_MAT());
}
}
// treat single material point sets specially
int nMatls = pointMaterialGroups.size();
int atomMatls = 0;
for (int imat = 0; imat < nMatls; imat++) {
const set<int> & indices = pointMaterialGroups(imat);
if ( indices.size() > 0) atomMatls++;
}
bool singleMaterial = ( atomMatls == 1 );
// evaluate physics model
if (singleMaterial)
{
int imat = 0;
const Material * mat = physicsModel->material(imat);
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
int index = (int) _fieldName_;
if (! physicsModel->null(_fieldName_,imat)) {
if ( rhsMask(index,SOURCE) ) {
physicsModel->weak_equation(_fieldName_)->
N_integrand(fieldsAtIPs, gradFieldsAtIPs, mat, Nfluxes[_fieldName_]);
}
if ( rhsMask(index,FLUX) ) {
physicsModel->weak_equation(_fieldName_)->
B_integrand(fieldsAtIPs, gradFieldsAtIPs, mat, Bfluxes[_fieldName_]);
}
}
}
}
else
{
// 1) permanent workspace with per-row mapped clones per matl
// from caller/atc
// 2) per point calls to N/B_integrand
// 3) collect internalToAtom into materials and use mem-cont clones
// what about dof for matrices and data storage: clone _matrix_
// for each material group:
// set up storage
DENS_MAT group_Nfluxes;
DENS_MAT_VEC group_Bfluxes;
group_Bfluxes.reserve(nSD_);
FIELD_MATS fieldsGroup;
GRAD_FIELD_MATS gradFieldsGroup;
for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) {
_fieldName_ = _fieldItr_->first;
const DENS_MAT & field = (_fieldItr_->second).quantity();
int ndof = field.nCols();
gradFieldsGroup[_fieldName_].assign(nSD_,DENS_MAT(nips,ndof));
Nfluxes[_fieldName_].reset(nips,ndof);
Bfluxes[_fieldName_].assign(nSD_,DENS_MAT(nips,ndof));
//}
}
// copy fields
for ( int imat = 0; imat < pointMaterialGroups.size(); imat++)
{
const set<int> & indices = pointMaterialGroups(imat);
const Material * mat = physicsModel->material(0);
int npts = indices.size();
int i = 0;
for (set<int>::const_iterator iter=indices.begin();
iter != indices.end(); iter++, i++ ) {
for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) {
_fieldName_ = _fieldItr_->first;
const DENS_MAT & field = (_fieldItr_->second).quantity();
int ndof = field.nCols();
fieldsGroup[_fieldName_].reset(npts,ndof);
for (int j = 0; j < nSD_; ++j) {
(gradFieldsGroup[_fieldName_][j]).reset(npts,ndof);
}
for (int dof = 0; dof < ndof; ++dof) {
fieldsGroup[_fieldName_](i,dof)
= fieldsAtIPs[_fieldName_](*iter,dof);
for (int j = 0; j < nSD_; ++j) {
gradFieldsGroup[_fieldName_][j](i,dof)
= gradFieldsAtIPs[_fieldName_][j](*iter,dof);
}
}
}
}
// calculate forces, & assemble
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
_fieldItr_ = fields.find(_fieldName_);
int index = (int) _fieldName_;
if (physicsModel->null(_fieldName_,imat)) continue;
if ( rhsMask(index,SOURCE) ) {
const DENS_MAT & field = (_fieldItr_->second).quantity();
int ndof = field.nCols();
bool has = physicsModel->weak_equation(_fieldName_)->
N_integrand(fieldsGroup, gradFieldsGroup, mat, group_Nfluxes);
if (! has) throw ATC_Error("atomic source can not be null currently");
int i = 0;
for (set<int>::const_iterator iter=indices.begin();
iter != indices.end(); iter++, i++ ) {
for (int dof = 0; dof < ndof; ++dof) {
Nfluxes[_fieldName_](*iter,dof) += group_Nfluxes(i,dof);
}
}
}
}
// calculate forces, & assemble
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (physicsModel->null(_fieldName_,imat)) continue;
int index = (int) _fieldName_;
if ( rhsMask(index,FLUX) ) {
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
int ndof = field.nCols();
physicsModel->weak_equation(_fieldName_)->
B_integrand(fieldsGroup, gradFieldsGroup, mat, group_Bfluxes);
int i = 0;
for (set<int>::const_iterator iter=indices.begin();
iter != indices.end(); iter++, i++ ) {
for (int dof = 0; dof < ndof; ++dof) {
for (int j = 0; j < nSD_; ++j) {
Bfluxes[_fieldName_][j](*iter,dof) += group_Bfluxes[j](i,dof);
}
}
}
}
}
}
} // endif multiple materials
// assemble : N/Bfluxes -> rhs_local
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
int index = (int) _fieldName_;
if ( rhsMask(index,SOURCE) && Nfluxes[_fieldName_].nCols() > 0 ) {
rhs_local[_fieldName_]
+= N.transMat(weights*Nfluxes[_fieldName_]);
}
if ( rhsMask(index,FLUX) && (Bfluxes[_fieldName_][0]).nCols() > 0 ) {
for (int j = 0; j < nSD_; ++j) {
rhs_local[_fieldName_]
+= dN[j]->transMat(weights*Bfluxes[_fieldName_][j]);
}
}
}
} // end nips > 0
// Share information between processors: rhs_local -> rhs
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (rhsMask(_fieldName_,FLUX) || rhsMask(_fieldName_,SOURCE)) {
DENS_MAT & myRhs(rhs[_fieldName_].set_quantity());
int count = rhs_local[_fieldName_].size();
allsum(communicator_, rhs_local[_fieldName_].ptr(), myRhs.ptr(), count);
}
}
}
// -------------------------------------------------------------
// compute sources using given quadrature
// -------------------------------------------------------------
void FE_Engine::compute_source(const Array2D<bool> &rhsMask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
const Array<set<int> >&pointMaterialGroups,
const DIAG_MAT &weights,
const SPAR_MAT &N,
const SPAR_MAT_VEC &dN,
FIELD_MATS &sources) const
{
int nips = weights.nCols();
if (nips>0) {
FIELD_MATS Nfluxes;
// compute fields and gradients of fields at given ips
GRAD_FIELD_MATS gradFieldsAtIPs;
FIELD_MATS fieldsAtIPs;
for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) {
_fieldName_ = _fieldItr_->first;
const DENS_MAT & field = (_fieldItr_->second).quantity();
int dof = field.nCols();
gradFieldsAtIPs[_fieldName_].assign(nSD_,DENS_MAT(nips,dof));
fieldsAtIPs[_fieldName_] = N*field;
for (int j = 0; j < nSD_; ++j) {
gradFieldsAtIPs[_fieldName_][j] = (*dN[j])*field;
}
}
// treat single material point sets specially
int nMatls = pointMaterialGroups.size();
int atomMatls = 0;
for (int imat = 0; imat < nMatls; imat++) {
const set<int> & indices = pointMaterialGroups(imat);
if ( indices.size() > 0) atomMatls++;
}
bool singleMaterial = ( atomMatls == 1 );
// evaluate physics model
if (singleMaterial)
{
int imat = 0;
const Material * mat = physicsModel->material(imat);
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
int index = (int) _fieldName_;
if (! physicsModel->null(_fieldName_,imat)) {
if ( rhsMask(index,SOURCE) ) {
bool has = physicsModel->weak_equation(_fieldName_)->
N_integrand(fieldsAtIPs, gradFieldsAtIPs, mat, Nfluxes[_fieldName_]);
if (! has) throw ATC_Error("atomic source can not be null currently");
}
}
}
}
else
{
throw ATC_Error("compute source does not handle multiple materials currently");
}
// assemble
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
int index = (int) _fieldName_;
if ( rhsMask(index,SOURCE) ) {
sources[_fieldName_] =weights*Nfluxes[_fieldName_];
}
}
}
// no need to share information between processors
}
// -------------------------------------------------------------
// compute flux for post processing
// -------------------------------------------------------------
void FE_Engine::compute_flux(const Array2D<bool> &rhsMask,
const FIELDS &fields,
const PhysicsModel * physicsModel,
const Array<int> & elementMaterials,
GRAD_FIELD_MATS &fluxes,
const DenseMatrix<bool> *elementMask) const
{
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (rhsMask(_fieldName_,FLUX)) {
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
fluxes[_fieldName_].assign(nSD_, DENS_MAT(field.nRows(),field.nCols()));
}
}
// element wise assembly
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
// if element is masked, skip it
if (elementMask && !(*elementMask)(ielem,0)) continue;
// material id
int imat = elementMaterials(ielem);
const Material * mat = physicsModel->material(imat);
interpolate_fields(ielem,fields,_conn_,_N_,_dN_,_weights_,
_fieldsAtIPs_,_gradFieldsAtIPs_);
_Nw_ = _weights_*_N_;
// evaluate Physics model & assemble
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (!rhsMask(_fieldName_,FLUX)) continue;
if (physicsModel->null(_fieldName_,imat)) continue;
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
int dof = field.nCols();
physicsModel->weak_equation(_fieldName_)->
B_integrand(_fieldsAtIPs_, _gradFieldsAtIPs_, mat, _Bfluxes_);
for (int j = 0; j < nSD_; j++) {
_Nmat_ = _Nw_.transMat(_Bfluxes_[j]);
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
for (int k = 0; k < dof; ++k) {
fluxes[_fieldName_][j](inode,k) += _Nmat_(i,k);
}
}
}
}
}
// Assemble partial results
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (!rhsMask(_fieldName_,FLUX)) continue;
for (int j = 0; j < nSD_; j++) {
allsum(communicator_,MPI_IN_PLACE, fluxes[_fieldName_][j].ptr(), fluxes[_fieldName_][j].size());
}
}
}
//-----------------------------------------------------------------
// boundary flux using native quadrature
//-----------------------------------------------------------------
void FE_Engine::compute_boundary_flux(const Array2D<bool> & rhsMask,
const FIELDS & fields,
const PhysicsModel * physicsModel,
const Array<int> & elementMaterials,
const set< pair <int,int> > & faceSet,
FIELDS & rhs) const
{
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (rhsMask(_fieldName_,FLUX)) {
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
rhs[_fieldName_].reset(field.nRows(),field.nCols());
}
}
FIELD_MATS localElementFields;
GRAD_FIELD_MATS gradFieldsAtIPs;
FIELD_MATS fieldsAtIPs;
for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) {
_fieldName_ = _fieldItr_->first;
const FIELD & field = _fieldItr_->second;
int dof = field.nCols();
gradFieldsAtIPs[_fieldName_].reserve(nSD_);
for (int i = 0; i < nSD_; ++i) {
gradFieldsAtIPs[_fieldName_].push_back(DENS_MAT(nIPsPerFace_,dof));
}
fieldsAtIPs[_fieldName_].reset(nIPsPerFace_,dof);
localElementFields[_fieldName_].reset(nNodesPerElement_,dof);
}
// element wise assembly
set< PAIR >::iterator iter;
for (iter = faceSet.begin(); iter != faceSet.end(); iter++) {
// get connectivity
int ielem = iter->first;
// if this is not our element, do not do calculations
if (!feMesh_->is_owned_elt(ielem)) continue;
int imat = elementMaterials(ielem);
const Material * mat = physicsModel->material(imat);
_conn_ = feMesh_->element_connectivity_unique(ielem);
// evaluate shape functions at ips
feMesh_->face_shape_function(*iter, _fN_, _fdN_, _nN_, _fweights_);
// interpolate fields and gradients of fields ips of this element
for (_fieldItr_ = fields.begin(); _fieldItr_ != fields.end(); _fieldItr_++) {
_fieldName_ = _fieldItr_->first;
const DENS_MAT & field = (_fieldItr_->second).quantity();
int dof = field.nCols();
for (int i = 0; i < nNodesPerElement_; i++) {
for (int j = 0; j < dof; j++) {
localElementFields[_fieldName_](i,j) = field(_conn_(i),j);
}
}
// ips X dof = ips X nodes * nodes X dof
fieldsAtIPs[_fieldName_] = _fN_*localElementFields[_fieldName_];
for (int j = 0; j < nSD_; ++j) {
gradFieldsAtIPs[_fieldName_][j] = _fdN_[j]*localElementFields[_fieldName_];
}
}
// Evaluate- physics model
// do nothing for N_integrand
// nN : precomputed and held by ATC_Transfer
// assemble
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
int index = (int) _fieldName_;
if ( rhsMask(index,FLUX) ) {
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
DENS_MAT & myRhs(rhs[_fieldName_].set_quantity());
physicsModel->weak_equation(_fieldName_)->
B_integrand(fieldsAtIPs, gradFieldsAtIPs, mat, _Bfluxes_);
int dof = field.nCols();
for (int j = 0; j < nSD_; j++) {
_Nmat_ = _nN_[j].transMat(_fweights_*_Bfluxes_[j]);
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
for (int k = 0; k < dof; ++k) {
myRhs(inode,k) += _Nmat_(i,k);
}
}
}
}
}
}
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
int index = (int) _fieldName_;
if ( rhsMask(index,FLUX) ) {
DENS_MAT & myRhs(rhs[_fieldName_].set_quantity());
allsum(communicator_,MPI_IN_PLACE, myRhs.ptr(), myRhs.size());
}
}
}
// -------------------------------------------------------------
// compute boundary flux using given quadrature and interpolation
// -------------------------------------------------------------
void FE_Engine::compute_boundary_flux(const Array2D<bool> & rhsMask,
const FIELDS & fields,
const PhysicsModel * physicsModel,
const Array< int > & elementMaterials,
const Array< set<int> > & pointMaterialGroups,
const DIAG_MAT & _weights_,
const SPAR_MAT & N,
const SPAR_MAT_VEC & dN,
const DIAG_MAT & flux_mask,
FIELDS & flux,
const DenseMatrix<bool> * elementMask,
const set<int> * nodeSet) const
{
FIELDS rhs, rhsSubset;
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if (rhsMask(_fieldName_,FLUX)) {
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
int nrows = field.nRows();
int ncols = field.nCols();
rhs [_fieldName_].reset(nrows,ncols);
rhsSubset[_fieldName_].reset(nrows,ncols);
}
}
// R_I = - int_Omega Delta _N_I .q dV
compute_rhs_vector(rhsMask, fields, physicsModel, elementMaterials, rhs, elementMask);
// R_I^md = - int_Omega^md Delta _N_I .q dV
compute_rhs_vector(rhsMask, fields, physicsModel, pointMaterialGroups,
_weights_, N, dN, rhsSubset);
// flux_I = 1/Delta V_I V_I^md R_I + R_I^md
// where : Delta V_I = int_Omega _N_I dV
for (int n = 0; n < rhsMask.nRows(); n++) {
_fieldName_ = FieldName(n);
if ( rhsMask(_fieldName_,FLUX) ) {
if (nodeSet) {
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
int nrows = field.nRows();
int ncols = field.nCols();
DENS_MAT & myFlux(flux[_fieldName_].set_quantity());
const DENS_MAT & myRhsSubset(rhsSubset[_fieldName_].quantity());
const DENS_MAT & myRhs(rhs[_fieldName_].quantity());
myFlux.reset(nrows,ncols);
set<int>::const_iterator iset;
for (iset = nodeSet->begin(); iset != nodeSet->end(); iset++) {
for (int j = 0; j < ncols; j++) {
myFlux(*iset,j) = myRhsSubset(*iset,j) - flux_mask(*iset,*iset)*myRhs(*iset,j);
}
}
}
else {
flux[_fieldName_]
= rhsSubset[_fieldName_].quantity() - flux_mask*(rhs[_fieldName_].quantity());
}
}
}
}
/** integrate a nodal field over an element set */
DENS_VEC FE_Engine::integrate(const DENS_MAT &field, const ESET & eset) const
{
int dof = field.nCols();
DENS_MAT eField(nNodesPerElement_, dof);
int nips = nIPsPerElement_;
DENS_MAT ipField(nips, dof);
DENS_VEC integral(dof); integral = 0;
for (ESET::const_iterator itr = eset.begin(); itr != eset.end(); ++itr) {
int ielem = *itr;
// if this is not our element, do not do calculations
if (!feMesh_->is_owned_elt(ielem)) continue;
feMesh_->shape_function(ielem,_N_, _weights_);
_conn_ = feMesh_->element_connectivity_unique(ielem);
for (int i = 0; i < nNodesPerElement_; i++) {
for (int j = 0; j < dof; j++) {
eField(i,j) = field(_conn_(i),j); }}
ipField = _N_*eField;
for (int i = 0; i < nips; ++i) {
for (int j = 0; j < dof; ++j) {
integral(j) += ipField(i,j)*_weights_[i];
}
}
}
// assemble partial results
allsum(communicator_,MPI_IN_PLACE, integral.ptr(), integral.size());
return integral;
}
//-----------------------------------------------------------------
// Robin boundary flux using native quadrature
// integrate \int_delV _N_I s(x,t).n dA
//-----------------------------------------------------------------
void FE_Engine::add_robin_fluxes(const Array2D<bool> &rhsMask,
const FIELDS & fields,
const double time,
const ROBIN_SURFACE_SOURCE & sourceFunctions,
FIELDS &nodalSources) const
{
// sizing working arrays
DENS_MAT xCoords(nSD_,nNodesPerElement_);
DENS_MAT faceSource;
DENS_MAT localField;
DENS_MAT xAtIPs(nSD_,nIPsPerFace_);
DENS_MAT uAtIPs(nIPsPerFace_,1);
// element wise assembly
ROBIN_SURFACE_SOURCE::const_iterator src_iter;
if (!(rank_zero(communicator_))) {
// Zero out unmasked nodal sources on all non-main processors.
// This is to avoid counting the previous nodal source values
// multiple times when we aggregate.
for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++)
{
_fieldName_ = src_iter->first;
if (!rhsMask((int)_fieldName_,ROBIN_SOURCE)) continue;
DENS_MAT & myNodalSources(nodalSources[_fieldName_].set_quantity());
myNodalSources.reset(myNodalSources.nRows(), myNodalSources.nCols());
}
}
for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++)
{
_fieldName_ = src_iter->first;
if (!rhsMask((int)_fieldName_,ROBIN_SOURCE)) continue;
typedef map<PAIR,Array<UXT_Function*> > FSET;
const FSET *fset = (const FSET *)&(src_iter->second);
FSET::const_iterator fset_iter;
for (fset_iter = fset->begin(); fset_iter != fset->end(); fset_iter++)
{
const PAIR &face = fset_iter->first;
const int elem = face.first;
// if this is not our element, do not do calculations
if (!feMesh_->is_owned_elt(elem)) continue;
const Array <UXT_Function*> &fs = fset_iter->second;
_conn_ = feMesh_->element_connectivity_unique(elem);
// evaluate location at ips
feMesh_->face_shape_function(face, _fN_, _fdN_, _nN_, _fweights_);
feMesh_->element_coordinates(elem, xCoords);
xAtIPs = xCoords*(_fN_.transpose());
// collect field
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
feMesh_->element_field(elem, field, localField);
uAtIPs = _fN_*localField;
// interpolate prescribed flux at ips of this element
FSET::const_iterator face_iter = fset->find(face);
int nFieldDOF = (face_iter->second).size();
faceSource.reset(nIPsPerFace_,nFieldDOF);
for (int ip = 0; ip < nIPsPerFace_; ++ip) {
for (int idof = 0; idof<nFieldDOF; ++idof) {
UXT_Function * f = fs(idof);
if (!f) continue;
faceSource(ip,idof) = f->f(&(uAtIPs(ip,0)),
column(xAtIPs,ip).ptr(),time);
DENS_MAT coefsAtIPs(nIPsPerFace_,1);
coefsAtIPs(ip,idof) = f->dfdu(&(uAtIPs(ip,0)),
column(xAtIPs,ip).ptr(),time);
faceSource(ip,idof) -= coefsAtIPs(ip,0)*uAtIPs(ip,0);
}
}
// assemble
DENS_MAT & myNodalSources(nodalSources[_fieldName_].set_quantity());
_Nmat_ = _fN_.transMat(_fweights_*faceSource);
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
for (int idof = 0; idof < nFieldDOF; ++idof) {
myNodalSources(inode,idof) += _Nmat_(i,idof);
}
}
}
}
// assemble partial result matrices
for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) {
_fieldName_ = src_iter->first;
if (!rhsMask((int) _fieldName_,ROBIN_SOURCE)) continue;
DENS_MAT & myNodalSources(nodalSources[_fieldName_].set_quantity());
allsum(communicator_,MPI_IN_PLACE, myNodalSources.ptr(), myNodalSources.size());
}
}
//-----------------------------------------------------------------
// Robin boundary flux stiffness using native quadrature
// integrate \int_delV _N_I ds/du(x,t).n dA
//-----------------------------------------------------------------
void FE_Engine::add_robin_tangent(const Array2D<bool> &rhsMask,
const FIELDS & fields,
const double time,
const ROBIN_SURFACE_SOURCE & sourceFunctions,
SPAR_MAT &tangent) const
{
// sizing working arrays
DENS_MAT xCoords(nSD_,nNodesPerElement_);
DENS_MAT coefsAtIPs;
DENS_MAT localField;
DENS_MAT xAtIPs(nSD_,nIPsPerFace_);
DENS_MAT uAtIPs(nIPsPerFace_,1);
// element wise assembly
ROBIN_SURFACE_SOURCE::const_iterator src_iter;
if (!(rank_zero(communicator_))) {
// Zero out result (tangent) matrix on all non-main processors
// to avoid multiple-counting of the values already in tangent
tangent.reset(tangent.nRows(), tangent.nCols());
}
for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++)
{
_fieldName_ = src_iter->first;
if (!rhsMask((int)_fieldName_,ROBIN_SOURCE)) continue;
typedef map<PAIR,Array<UXT_Function*> > FSET;
const FSET *fset = (const FSET *)&(src_iter->second);
FSET::const_iterator fset_iter;
for (fset_iter = fset->begin(); fset_iter != fset->end(); fset_iter++)
{
const PAIR &face = fset_iter->first;
const int elem = face.first;
// if this is not our element, do not do calculations
if (!feMesh_->is_owned_elt(elem)) continue;
const Array <UXT_Function*> &fs = fset_iter->second;
_conn_ = feMesh_->element_connectivity_unique(elem);
// evaluate location at ips
feMesh_->face_shape_function(face, _fN_, _fdN_, _nN_, _fweights_);
feMesh_->element_coordinates(elem, xCoords);
xAtIPs = xCoords*(_fN_.transpose());
// collect field
_fieldItr_ = fields.find(_fieldName_);
const DENS_MAT & field = (_fieldItr_->second).quantity();
feMesh_->element_field(elem, field, localField);
uAtIPs = _fN_*localField;
// interpolate prescribed flux at ips of this element
FSET::const_iterator face_iter = fset->find(face);
int nFieldDOF = (face_iter->second).size();
coefsAtIPs.reset(nIPsPerFace_,nFieldDOF);
for (int ip = 0; ip < nIPsPerFace_; ++ip) {
for (int idof = 0; idof<nFieldDOF; ++idof) {
UXT_Function * f = fs(idof);
if (!f) continue;
coefsAtIPs(ip,idof) = f->dfdu(&(uAtIPs(ip,0)),
column(xAtIPs,ip).ptr(),time);
}
}
// assemble
DIAG_MAT D(column(coefsAtIPs,0));
D *= -1;
D *= _fweights_;
_Nmat_ = _fN_.transMat(D*_fN_);
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
for (int j = 0; j < nNodesPerElement_; ++j) {
int jnode = _conn_(j);
tangent.add(inode, jnode, _Nmat_(i,j));
}
}
}
}
// assemble partial result matrices
#ifdef ISOLATE_FE
sparse_allsum(communicator_,tangent);
#else
LammpsInterface::instance()->sparse_allsum(tangent);
#endif
}
//-----------------------------------------------------------------
// prescribed boundary flux using native quadrature
// integrate \int_delV _N_I s(x,t).n dA
//-----------------------------------------------------------------
void FE_Engine::add_fluxes(const Array<bool> &fieldMask,
const double time,
const SURFACE_SOURCE & sourceFunctions,
FIELDS &nodalSources) const
{
// sizing working arrays
DENS_MAT xCoords(nSD_,nNodesPerElement_);
DENS_MAT xAtIPs(nSD_,nIPsPerFace_);
DENS_MAT faceSource;
// element wise assembly
SURFACE_SOURCE::const_iterator src_iter;
if (!(rank_zero(communicator_))) {
// Zero out unmasked nodal sources on all non-main processors.
// This is to avoid counting the previous nodal source values
// multiple times when we aggregate.
for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++)
{
_fieldName_ = src_iter->first;
if (!fieldMask((int)_fieldName_)) continue;
DENS_MAT & myNodalSources(nodalSources[_fieldName_].set_quantity());
myNodalSources.reset(myNodalSources.nRows(), myNodalSources.nCols());
}
}
for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++)
{
_fieldName_ = src_iter->first;
if (!fieldMask((int)_fieldName_)) continue;
typedef map<PAIR,Array<XT_Function*> > FSET;
const FSET *fset = (const FSET *)&(src_iter->second);
FSET::const_iterator fset_iter;
for (fset_iter = fset->begin(); fset_iter != fset->end(); fset_iter++)
{
const PAIR &face = fset_iter->first;
const int elem = face.first;
// if this is not our element, do not do calculations
if (!feMesh_->is_owned_elt(elem)) continue;
const Array <XT_Function*> &fs = fset_iter->second;
_conn_ = feMesh_->element_connectivity_unique(elem);
// evaluate location at ips
feMesh_->face_shape_function(face, _fN_, _fdN_, _nN_, _fweights_);
feMesh_->element_coordinates(elem, xCoords);
MultAB(xCoords,_fN_,xAtIPs,0,1); //xAtIPs = xCoords*(N.transpose());
// interpolate prescribed flux at ips of this element
FSET::const_iterator face_iter = fset->find(face);
if (face_iter == fset->end())
{
stringstream ss;
ss << "face not found" << std::endl;
print_msg(communicator_,ss.str());
}
int nFieldDOF = (face_iter->second).size();
faceSource.reset(nIPsPerFace_,nFieldDOF);
for (int ip = 0; ip < nIPsPerFace_; ++ip) {
for (int idof = 0; idof<nFieldDOF; ++idof) {
XT_Function * f = fs(idof);
if (!f) continue;
faceSource(ip,idof) = f->f(column(xAtIPs,ip).ptr(),time);
}
}
// assemble
DENS_MAT & myNodalSources(nodalSources[_fieldName_].set_quantity());
_Nmat_ = _fN_.transMat(_fweights_*faceSource);
for (int i = 0; i < nNodesPerElement_; ++i)
{
int inode = _conn_(i);
for (int idof = 0; idof < nFieldDOF; ++idof)
{
myNodalSources(inode,idof) += _Nmat_(i,idof);
} // end assemble nFieldDOF
} // end assemble nNodesPerElement_
} // end fset loop
} // field loop
// assemble partial result matrices
for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) {
_fieldName_ = src_iter->first;
if (!fieldMask((int)_fieldName_)) continue;
DENS_MAT & myNodalSources(nodalSources[_fieldName_].set_quantity());
allsum(communicator_,MPI_IN_PLACE, myNodalSources.ptr(), myNodalSources.size());
}
}
//-----------------------------------------------------------------
// prescribed volume flux using native quadrature
// integrate \int_V _N_I s(x,t) dV
//-----------------------------------------------------------------
void FE_Engine::add_sources(const Array<bool> &fieldMask,
const double time,
const VOLUME_SOURCE &sourceFunctions,
FIELDS &nodalSources) const
{
// sizing working arrays
DENS_MAT elemSource;
DENS_MAT xCoords(nSD_,nNodesPerElement_);
DENS_MAT xAtIPs(nSD_,nIPsPerElement_);
if (!(rank_zero(communicator_))) {
// Zero out unmasked nodal sources on all non-main processors.
// This is to avoid counting the previous nodal source values
// multiple times when we aggregate.
for (VOLUME_SOURCE::const_iterator src_iter = sourceFunctions.begin();
src_iter != sourceFunctions.end(); src_iter++) {
_fieldName_ = src_iter->first;
int index = (int) _fieldName_;
if (fieldMask(index)) {
DENS_MAT & myNodalSources(nodalSources[_fieldName_].set_quantity());
myNodalSources.reset(myNodalSources.nRows(), myNodalSources.nCols());
}
}
}
vector<int> myElems = feMesh_->owned_elts();
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
_conn_ = feMesh_->element_connectivity_unique(ielem);
// evaluate location at ips
feMesh_->shape_function(ielem, _N_, _weights_);
feMesh_->element_coordinates(ielem, xCoords);
xAtIPs =xCoords*(_N_.transpose());
for (VOLUME_SOURCE::const_iterator src_iter = sourceFunctions.begin();
src_iter != sourceFunctions.end(); src_iter++) {
_fieldName_ = src_iter->first;
int index = (int) _fieldName_;
if ( fieldMask(index) ) {
const Array2D<XT_Function *> * thisSource
= (const Array2D<XT_Function *> *) &(src_iter->second);
int nFieldDOF = thisSource->nCols();
elemSource.reset(nIPsPerElement_,nFieldDOF);
// interpolate prescribed flux at ips of this element
for (int ip = 0; ip < nIPsPerElement_; ++ip) {
for (int idof = 0; idof < nFieldDOF; ++idof) {
XT_Function * f = (*thisSource)(ielem,idof);
if (f) {
elemSource(ip,idof) = f->f(column(xAtIPs,ip).ptr(),time);
}
}
}
// assemble
_Nmat_ = _N_.transMat(_weights_*elemSource);
DENS_MAT & myNodalSources(nodalSources[_fieldName_].set_quantity());
for (int i = 0; i < nNodesPerElement_; ++i) {
int inode = _conn_(i);
for (int idof = 0; idof < nFieldDOF; ++idof) {
myNodalSources(inode,idof) += _Nmat_(i,idof);
}
}
}
}
}
// Aggregate unmasked nodal sources on all processors.
for (VOLUME_SOURCE::const_iterator src_iter = sourceFunctions.begin();
src_iter != sourceFunctions.end(); src_iter++) {
_fieldName_ = src_iter->first;
int index = (int) _fieldName_;
if (fieldMask(index)) {
DENS_MAT & myNodalSources(nodalSources[_fieldName_].set_quantity());
allsum(communicator_,MPI_IN_PLACE, myNodalSources.ptr(), myNodalSources.size());
}
}
}
//-----------------------------------------------------------------
// boundary integral of a nodal field
//-----------------------------------------------------------------
void FE_Engine::field_surface_flux(
const DENS_MAT & field,
const set< PAIR > & faceSet,
DENS_MAT & values,
const bool contour,
const int axis) const
{
int dof = field.nCols();
double a[3] = {0,0,0};
a[axis] = 1;
// sizing working arrays
DENS_MAT n(nSD_,nIPsPerFace_);
DENS_MAT localElementFields(nNodesPerElement_,dof);
DENS_MAT integrals(dof,nSD_);
DENS_MAT fieldsAtIPs;
// SJL shouldn't this just be _fieldsAtIPs_
// the data member?
// element wise assembly
set< pair <int,int> >::iterator iter;
for (iter = faceSet.begin(); iter != faceSet.end(); iter++) {
int ielem = iter->first;
// if this is not our element, do not do calculations
//if (!feMesh_->is_owned_elt(ielem)) continue;
// evaluate shape functions at ips
feMesh_->face_shape_function(*iter, _N_, n, _fweights_);
// cross n with axis to get tangent
if (contour) {
double t[3];
for (int i = 0; i < nIPsPerFace_; i++) {
t[0] = a[1]*n(2,i) - a[2]*n(1,i);
t[1] = a[2]*n(0,i) - a[0]*n(2,i);
t[2] = a[0]*n(1,i) - a[1]*n(0,i);
n(0,i) = t[0];
n(1,i) = t[1];
n(2,i) = t[2];
}
}
// get connectivity
_conn_ = feMesh_->element_connectivity_unique(ielem);
// interpolate fields and gradients of fields ips of this element
for (int i = 0; i < nNodesPerElement_; i++) {
for (int j = 0; j < dof; j++) {
localElementFields(i,j) = field(_conn_(i),j);
}
}
// ips X dof = ips X nodes * nodes X dof
fieldsAtIPs = _N_*localElementFields;
// assemble : integral(k,j) = sum_ip n(j,ip) wg(ip,ip) field(ip,k)
_Nmat_ = n*_fweights_*fieldsAtIPs;
for (int j = 0; j < nSD_; j++) {
for (int k = 0; k < dof; ++k) {
integrals(k,j) += _Nmat_(j,k);
}
}
}
// assemble partial results
//LammpsInterface::instance()->allsum(MPI_IN_PLACE, integrals.ptr(), integrals.size());
// (S.n)_1 = S_1j n_j = S_11 n_1 + S_12 n_2 + S_13 n_3
// (S.n)_2 = S_2j n_j = S_21 n_1 + S_22 n_2 + S_23 n_3
// (S.n)_3 = S_3j n_j = S_31 n_1 + S_32 n_2 + S_33 n_3
if (dof == 9) { // tensor
values.reset(nSD_,1);
values(0,0) = integrals(0,0)+integrals(1,1)+integrals(2,2);
values(1,0) = integrals(3,0)+integrals(4,1)+integrals(5,2);
values(2,0) = integrals(6,0)+integrals(7,1)+integrals(8,2);
}
else if (dof == 6) { // sym tensor
values.reset(nSD_,1);
values(0,0) = integrals(0,0)+integrals(3,1)+integrals(4,2);
values(1,0) = integrals(3,0)+integrals(1,1)+integrals(5,2);
values(2,0) = integrals(4,1)+integrals(5,1)+integrals(2,2);
}
// (v.n) = v_j n_j
else if (dof == 3) { // vector
values.reset(1,1);
values(0,0) = integrals(0,0)+integrals(1,1)+integrals(2,2);
}
// s n = s n_j e_j
else if (dof == 1) { // scalar
values.reset(nSD_,1);
values(0,0) = integrals(0,0);
values(1,0) = integrals(0,1);
values(2,0) = integrals(0,2);
}
else {
string msg = "FE_Engine::field_surface_flux unsupported field width: ";
msg += to_string(dof);
throw ATC_Error(msg);
}
}
//-----------------------------------------------------------------
// evaluate shape functions at given points
//-----------------------------------------------------------------
void FE_Engine::evaluate_shape_functions(
const MATRIX & pt_coords,
SPAR_MAT & N) const
{
// Get shape function and derivatives at atomic locations
int nnodes = feMesh_->num_nodes_unique();
int npts = pt_coords.nRows();
// loop over point (atom) coordinates
DENS_VEC x(nSD_);
Array<int> node_index(nNodesPerElement_);
DENS_VEC shp(nNodesPerElement_);
N.reset(npts,nnodes);
for (int i = 0; i < npts; ++i) {
for (int k = 0; k < nSD_; ++k) { x(k) = pt_coords(i,k); }
feMesh_->shape_functions(x,shp,node_index);
for (int j = 0; j < nNodesPerElement_; ++j) {
int jnode = node_index(j);
N.add(i,jnode,shp(j));
}
}
N.compress();
}
//-----------------------------------------------------------------
// evaluate shape functions and their spatial derivatives at given points
//-----------------------------------------------------------------
void FE_Engine::evaluate_shape_functions(
const MATRIX & pt_coords,
SPAR_MAT & N,
SPAR_MAT_VEC & dN) const
{
// Get shape function and derivatives at atomic locations
int nnodes = feMesh_->num_nodes_unique();
int npts = pt_coords.nRows();
// loop over point (atom) coordinates
DENS_VEC x(nSD_);
Array<int> node_index(nNodesPerElement_);
DENS_VEC shp(nNodesPerElement_);
DENS_MAT dshp(nSD_,nNodesPerElement_);
for (int k = 0; k < nSD_; ++k) {
dN[k]->reset(npts,nnodes);
}
N.reset(npts,nnodes);
for (int i = 0; i < npts; ++i) {
for (int k = 0; k < nSD_; ++k) { x(k) = pt_coords(i,k); }
feMesh_->shape_functions(x,shp,dshp,node_index);
for (int j = 0; j < nNodesPerElement_; ++j) {
int jnode = node_index(j);
N.add(i,jnode,shp(j));
for (int k = 0; k < nSD_; ++k) {
dN[k]->add(i,jnode,dshp(k,j));
}
}
}
N.compress();
for (int k = 0; k < nSD_; ++k) {
dN[k]->compress();
}
}
//-----------------------------------------------------------------
// evaluate shape functions at given points
//-----------------------------------------------------------------
void FE_Engine::evaluate_shape_functions(
const MATRIX & pt_coords,
const INT_ARRAY & pointToEltMap,
SPAR_MAT & N) const
{
// Get shape function and derivatives at atomic locations
int nnodes = feMesh_->num_nodes_unique();
int npts = pt_coords.nRows();
// loop over point (atom) coordinates
DENS_VEC x(nSD_);
Array<int> node_index(nNodesPerElement_);
DENS_VEC shp(nNodesPerElement_);
N.reset(npts,nnodes);
for (int i = 0; i < npts; ++i) {
for (int k = 0; k < nSD_; ++k) { x(k) = pt_coords(i,k); }
int eltId = pointToEltMap(i,0);
feMesh_->shape_functions(x,eltId,shp,node_index);
for (int j = 0; j < nNodesPerElement_; ++j) {
int jnode = node_index(j);
N.add(i,jnode,shp(j));
}
}
N.compress();
}
//-----------------------------------------------------------------
// evaluate shape functions and their spatial derivatives at given points
//-----------------------------------------------------------------
void FE_Engine::evaluate_shape_functions(
const MATRIX & pt_coords,
const INT_ARRAY & pointToEltMap,
SPAR_MAT & N,
SPAR_MAT_VEC & dN) const
{
// Get shape function and derivatives at atomic locations
int nnodes = feMesh_->num_nodes_unique();
int npts = pt_coords.nRows();
// loop over point (atom) coordinates
DENS_VEC x(nSD_);
Array<int> node_index(nNodesPerElement_);
DENS_VEC shp(nNodesPerElement_);
DENS_MAT dshp(nSD_,nNodesPerElement_);
for (int k = 0; k < nSD_; ++k) {
dN[k]->reset(npts,nnodes);
}
N.reset(npts,nnodes);
for (int i = 0; i < npts; ++i) {
for (int k = 0; k < nSD_; ++k) { x(k) = pt_coords(i,k); }
int eltId = pointToEltMap(i,0);
feMesh_->shape_functions(x,eltId,shp,dshp,node_index);
for (int j = 0; j < nNodesPerElement_; ++j) {
int jnode = node_index(j);
N.add(i,jnode,shp(j));
for (int k = 0; k < nSD_; ++k) {
dN[k]->add(i,jnode,dshp(k,j));
}
}
}
N.compress();
for (int k = 0; k < nSD_; ++k) {
dN[k]->compress();
}
}
//-----------------------------------------------------------------
// evaluate shape functions spatial derivatives at given points
//-----------------------------------------------------------------
void FE_Engine::evaluate_shape_function_derivatives(
const MATRIX & pt_coords,
const INT_ARRAY & pointToEltMap,
SPAR_MAT_VEC & dNdx ) const
{
int nnodes = feMesh_->num_nodes_unique();
int npts = pt_coords.nRows();
for (int k = 0; k < nSD_; ++k) {
dNdx[k]->reset(npts,nnodes);
}
// loop over point (atom) coordinates
DENS_VEC x(nSD_);
Array<int> node_index(nNodesPerElement_);
DENS_MAT dshp(nSD_,nNodesPerElement_);
for (int i = 0; i < npts; ++i) {
for (int k = 0; k < nSD_; ++k) { x(k) = pt_coords(i,k); }
int eltId = pointToEltMap(i,0);
feMesh_->shape_function_derivatives(x,eltId,dshp,node_index);
for (int j = 0; j < nNodesPerElement_; ++j) {
int jnode = node_index(j);
for (int k = 0; k < nSD_; ++k) {
dNdx[k]->add(i,jnode,dshp(k,j));
}
}
}
for (int k = 0; k < nSD_; ++k) {
dNdx[k]->compress();
}
}
//-------------------------------------------------------------------
// set kernels
//-------------------------------------------------------------------
void FE_Engine::set_kernel(KernelFunction* ptr){kernelFunction_=ptr;}
//-------------------------------------------------------------------
// kernel_matrix_bandwidth
//-------------------------------------------------------------------
int FE_Engine::kernel_matrix_bandwidth(
const MATRIX & ptCoords) const
{
if (! kernelFunction_) throw ATC_Error("no kernel function specified");
int npts = ptCoords.nRows();
int bw = 0;
if (npts>0) {
DENS_VEC xI(nSD_),x(nSD_),dx(nSD_);
for (int i = 0; i < nNodes_; i++) {
xI = feMesh_->global_coordinates(i);
for (int j = 0; j < npts; j++) {
for (int k = 0; k < nSD_; ++k) { x(k) = ptCoords(j,k); }
dx = x - xI;
if (kernelFunction_->in_support(dx)) bw = max(bw,abs(j-map_global_to_unique(i)));
}
}
}
return bw;
}
//-------------------------------------------------------------------
// evaluate kernels
//-------------------------------------------------------------------
void FE_Engine::evaluate_kernel_functions(
const MATRIX & ptCoords,
SPAR_MAT & N ) const
{
+#ifdef EXTENDED_ERROR_CHECKING
print_msg_once(communicator_,"kernel matrix bandwidth " +to_string(kernel_matrix_bandwidth(ptCoords)));
+#endif
if (! kernelFunction_) throw ATC_Error("no kernel function specified");
int npts = ptCoords.nRows();
if (npts>0) {
N.reset(npts,nNodesUnique_); // transpose of N_Ia
DENS_VEC xI(nSD_),x(nSD_),dx(nSD_);
for (int i = 0; i < nNodes_; i++) {
xI = feMesh_->global_coordinates(i);
for (int j = 0; j < npts; j++) {
for (int k = 0; k < nSD_; ++k) { x(k) = ptCoords(j,k); }
dx = x - xI;
double val = kernelFunction_->value(dx);
val *= kernelFunction_->dimensionality_factor();
if (val > 0) N.add(j,map_global_to_unique(i),val);
}
}
N.compress();
}
}
//-----------------------------------------------------------------
// create a non-uniform rectangular mesh on a rectangular region
//-----------------------------------------------------------------
void FE_Engine::create_mesh(Array<double> & dx,
Array<double> & dy,
Array<double> & dz,
const char * regionName,
Array<bool> periodicity)
{
double xmin, xmax, ymin, ymax, zmin, zmax;
double xscale, yscale, zscale;
// check to see if region exists and is it a box, and if so get the bounds
bool isBox;
isBox = ATC::LammpsInterface::instance()->region_bounds(
regionName,
xmin, xmax,
ymin, ymax,
zmin, zmax,
xscale,
yscale,
zscale);
if (!isBox) throw ATC_Error("Region for FE mesh is not a box");
if (dx(0) == 0.0) dx = (xmax-xmin)/dx.size();
if (dy(0) == 0.0) dy = (ymax-ymin)/dy.size();
if (dz(0) == 0.0) dz = (zmax-zmin)/dz.size();
feMesh_ = new FE_Rectangular3DMesh(dx,dy,dz,
xmin, xmax,
ymin, ymax,
zmin, zmax,
periodicity,
xscale, yscale, zscale);
stringstream ss;
ss << "created structured mesh with " << feMesh_->num_nodes() << " nodes, "
<< feMesh_->num_nodes_unique() << " unique nodes, and "
<< feMesh_->num_elements() << " elements";
print_msg_once(communicator_,ss.str());
#ifdef ATC_VERBOSE
string msg = "element sizes in x:\n";
double sum = 0;
for (int i = 0; i < dx.size(); ++i) { sum += dx(i); }
double xn= 1.0/sum;
double xs= xn*(xmax-xmin);
double xl= xs/(ATC::LammpsInterface::instance()->xlattice());
double sumn = 0, sums = 0, suml = 0;
for (int i = 0; i < dx.size(); ++i) {
double dxn = dx(i)*xn; sumn += dxn;
double dxs = dx(i)*xs; sums += dxs;
double dxl = dx(i)*xl; suml += dxl;
msg += " "+to_string(i+1)
+" "+to_string(dx(i))
+" "+to_string(dxn)
+" "+to_string(dxs)
+" "+to_string(dxl)+"\n";
}
msg += "sum "+to_string(sum)+" "
+to_string(sumn)+" "
+to_string(sums)+" "
+to_string(suml)+"\n";
print_msg_once(communicator_,msg);
#endif
}
//-----------------------------------------------------------------
// create a uniform rectangular mesh on a rectangular region
//-----------------------------------------------------------------
void FE_Engine::create_mesh(int nx, int ny, int nz, const char * regionName,
Array<bool> periodicity)
{
double xmin, xmax, ymin, ymax, zmin, zmax;
double xscale, yscale, zscale;
// check to see if region exists and is it a box, and if so get the bounds
bool isBox;
isBox = ATC::LammpsInterface::instance()->region_bounds(
regionName,
xmin, xmax,
ymin, ymax,
zmin, zmax,
xscale, yscale, zscale);
if (!isBox) throw ATC_Error("Region for FE mesh is not a box");
feMesh_ = new FE_Uniform3DMesh(nx,ny,nz,
xmin, xmax,
ymin, ymax,
zmin, zmax,
periodicity,
xscale, yscale, zscale);
stringstream ss;
ss << "created uniform mesh with " << feMesh_->num_nodes() << " nodes, "
<< feMesh_->num_nodes_unique() << " unique nodes, and "
<< feMesh_->num_elements() << " elements";
print_msg_once(communicator_,ss.str());
}
//-----------------------------------------------------------------
// read a mesh from an input file using MeshReader object
//-----------------------------------------------------------------
void FE_Engine::read_mesh(string meshFile, Array<bool> & periodicity)
{
if (feMesh_) throw ATC_Error("FE_Engine already has a mesh");
feMesh_ = MeshReader(meshFile,periodicity).create_mesh();
feMesh_->initialize();
}
};
diff --git a/lib/atc/FE_Engine.h b/lib/atc/FE_Engine.h
index 8a2ffd405..ab902fe60 100644
--- a/lib/atc/FE_Engine.h
+++ b/lib/atc/FE_Engine.h
@@ -1,559 +1,556 @@
#ifndef FE_ENGINE_H
#define FE_ENGINE_H
-// Other headers
+
#include <vector>
#include <map>
-
-// ATC headers
+#include <set>
+#include <utility>
+#include <string>
#include "ATC_TypeDefs.h"
#include "Array.h"
#include "Array2D.h"
#include "FE_Mesh.h"
#include "PhysicsModel.h"
#include "OutputManager.h"
#include "MeshReader.h"
#include "mpi.h"
-using namespace std;
-
namespace ATC {
- // Forward declarations
-
class ATC_Method;
class FE_Element;
class XT_Function;
class KernelFunction;
/**
* @class FE_Engine
* @brief Base class for computing and assembling mass matrix
* and rhs vectors
*/
class FE_Engine{
public:
/** constructor/s */
FE_Engine(MPI_Comm comm);
/** destructor */
~FE_Engine();
/** initialize */
void initialize();
MPI_Comm communicator() {return communicator_;}
void partition_mesh();
void departition_mesh();
bool is_partitioned() const { return feMesh_->is_partitioned(); }
int map_elem_to_myElem(int elemID) const
{ return feMesh_->map_elem_to_myElem(elemID); }
int map_myElem_to_elem(int myElemID) const
{ return feMesh_->map_myElem_to_elem(myElemID); }
// note: it is misleading to declare the following const
// because it touches the nIPsPer* data members, which
// are now declared mutable. Why? Well, set_quadrature
// has to be called from a const function, and all the
// matrices dependent on nIPsPer* are declared mutable
// as well (and have been). I think this is because a
// const engine needs to be able to deal with various
// quadratures and update its data members directly, which
// are really convenience-copies of data members that
// are more pertinent to other classes (FE_Interpolate,
// for the most part) that it uses temporarily for space/
// time speedups while doing it's computations.
//
// I approve of this usage of mutable, but the const/
// non-const member function declaring in this class is
// really all wrong to begin with.
/** set quadrature scheme, resize matrices if necessary as per
* initialize() */
void set_quadrature(FeIntQuadrature quadType, bool temp=true) const;
/** parser/modifier */
bool modify(int narg, char **arg);
/** finish up */
void finish();
/** print out the "global connectivity" of all elements */
void print_mesh() const;
//----------------------------------------------------------------
/** \name output */
//----------------------------------------------------------------
/*@{*/
/** these assume the caller is handling the parallel collection */
- void initialize_output(int rank, string outputPrefix, set<int> otypes);
+ void initialize_output(int rank, std::string outputPrefix, std::set<int> otypes);
/** write geometry */
void write_geometry(void);
/** write data: data is arrayed over _unique_ nodes
and then mapped by the engine */
void write_data(double time, FIELDS &soln, OUTPUT_LIST *data=NULL);
void write_data(double time, OUTPUT_LIST *data);
- void write_restart_file(string fileName, RESTART_LIST *data)
+ void write_restart_file(std::string fileName, RESTART_LIST *data)
{ outputManager_.write_restart_file(fileName,data); }
- void read_restart_file(string fileName, RESTART_LIST *data)
+ void read_restart_file(std::string fileName, RESTART_LIST *data)
{ outputManager_.read_restart_file(fileName,data); }
- void delete_elements(const set<int> &elementList);
- void cut_mesh(const set<PAIR> &cutFaces, const set<int> &edgeNodes);
+ void delete_elements(const std::set<int> &elementList);
+ void cut_mesh(const std::set<PAIR> &cutFaces, const std::set<int> &edgeNodes);
- void add_global(const string name, const double value)
+ void add_global(const std::string name, const double value)
{ outputManager_.add_global(name,value); }
- void add_field_names(const string field, const vector<string> & names)
+ void add_field_names(const std::string field, const std::vector<std::string> & names)
{ outputManager_.add_field_names(field,names); }
void reset_globals() { outputManager_.reset_globals(); }
/** pass through to access output manager */
OutputManager *output_manager() { return &outputManager_; }
/*@}*/
//----------------------------------------------------------------
/** \name assembled matrices and vectors */
//----------------------------------------------------------------
/*@{*/
DENS_VEC interpolate_field(const DENS_VEC & x, const FIELD & f) const;
/** interpolate fields */
void interpolate_fields(const int ielem,
const FIELDS &fields,
AliasArray<int> &conn,
DENS_MAT &N,
DIAG_MAT &weights,
- map<FieldName,DENS_MAT> &fieldsAtIPs) const;
+ std::map<FieldName,DENS_MAT> &fieldsAtIPs) const;
/** interpolate fields & gradients */
void interpolate_fields(const int ielem,
const FIELDS &fields,
AliasArray<int> &conn,
DENS_MAT &N,
DENS_MAT_VEC &dN,
DIAG_MAT &weights,
FIELD_MATS &fieldsAtIPs,
GRAD_FIELD_MATS &grad_fieldsAtIPs) const;
/** compute a dimensionless stiffness matrix */
void stiffness_matrix(SPAR_MAT &matrix) const;
/** compute tangent matrix for a pair of fields - native quadrature */
void compute_tangent_matrix(
const RHS_MASK &rhsMask,
- const pair<FieldName,FieldName> row_col,
+ const std::pair<FieldName,FieldName> row_col,
const FIELDS &fields,
const PhysicsModel *physicsModel,
const Array<int> &elementMaterials,
SPAR_MAT &tangent,
const DenseMatrix<bool> *elementMask=NULL) const;
/** compute tangent matrix for a pair of fields - given quadrature */
void compute_tangent_matrix(const RHS_MASK &rhsMask,
- const pair<FieldName,FieldName> row_col,
+ const std::pair<FieldName,FieldName> row_col,
const FIELDS &fields,
const PhysicsModel *physicsModel,
- const Array<set<int> > &pointMaterialGroups,
+ const Array<std::set<int> > &pointMaterialGroups,
const DIAG_MAT &weights,
const SPAR_MAT &N,
const SPAR_MAT_VEC &dN,
SPAR_MAT &tangent,
const DenseMatrix<bool> *elementMask=NULL) const;
/** compute a consistent mass matrix for a field */
void compute_mass_matrix(
const Array<FieldName> &mask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
const Array<int> &elementMaterials,
CON_MASS_MATS &mass_matrix,
const DenseMatrix<bool> *elementMask=NULL) const;
/** compute a dimensionless mass matrix */
void compute_mass_matrix(SPAR_MAT &mass_matrix) const;
/** computes a dimensionless mass matrix for the given-quadrature */
void compute_mass_matrix(const DIAG_MAT &weights,
const SPAR_MAT &N,
SPAR_MAT &mass_matrix) const;
/** compute a single dimensionless mass matrix */
void compute_lumped_mass_matrix(DIAG_MAT &lumped_mass_matrix) const;
/** compute lumped mass matrix = diag (\int \rho N_I dV) */
void compute_lumped_mass_matrix(
const Array<FieldName> &mask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
const Array<int> &elementMaterials,
MASS_MATS &mass_matrix,
const DenseMatrix<bool> *elementMask=NULL) const;
/** compute dimensional lumped mass matrix using given quadrature */
void compute_lumped_mass_matrix(
const Array<FieldName> &mask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
- const Array<set<int> > &pointMaterialGroups,
+ const Array<std::set<int> > &pointMaterialGroups,
const DIAG_MAT &weights,
const SPAR_MAT &N,
MASS_MATS &mass_matrix) const;
/** compute an approximation to a finite difference gradient from mesh */
void compute_gradient_matrix(SPAR_MAT_VEC &grad_matrix) const;
/** compute energy */
void compute_energy(const Array<FieldName> &mask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
const Array<int> &elementMaterials,
FIELD_MATS &energy,
const DenseMatrix<bool> *elementMask=NULL,
const IntegrationDomainType domain=FULL_DOMAIN) const;
/** compute residual or RHS of the dynamic weak eqn */
void compute_rhs_vector(
const RHS_MASK &rhsMask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
const Array<int> &elementMaterials,
FIELDS &rhs,
const DenseMatrix<bool> *elementMask=NULL) const;
/** compute RHS for given quadrature */
void compute_rhs_vector(const RHS_MASK &rhsMask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
- const Array<set<int> > &pointMaterialGroups,
+ const Array<std::set<int> > &pointMaterialGroups,
const DIAG_MAT &weights,
const SPAR_MAT &N,
const SPAR_MAT_VEC &dN,
FIELDS &rhs) const;
/** compute pointwise source for given quadrature */
void compute_source(const Array2D<bool> &rhsMask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
- const Array<set<int> > &pointMaterialGroups,
+ const Array<std::set<int> > &pointMaterialGroups,
const DIAG_MAT &weights,
const SPAR_MAT &N,
const SPAR_MAT_VEC &dN,
FIELD_MATS &sources) const;
/** compute flux in domain i.e. N^T B_integrand */
void compute_flux(const RHS_MASK &rhsMask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
const Array<int> &elementMaterials,
GRAD_FIELD_MATS &flux,
const DenseMatrix<bool> *elementMask=NULL) const;
/** compute the flux on the MD/FE boundary */
void compute_boundary_flux(const RHS_MASK &rhsMask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
const Array<int> &elementMaterials,
- const set<PAIR> &faceSet,
+ const std::set<PAIR> &faceSet,
FIELDS &rhs) const;
/** compute the flux on using an L2 interpolation of the flux */
void compute_boundary_flux(const RHS_MASK &rhsMask,
const FIELDS &fields,
const PhysicsModel *physicsModel,
const Array<int> &elementMaterials,
- const Array<set<int> > &pointMaterialGroups,
+ const Array<std::set<int> > &pointMaterialGroups,
const DIAG_MAT &weights,
const SPAR_MAT &N,
const SPAR_MAT_VEC &dN,
const DIAG_MAT &flux_mask,
FIELDS &rhs,
const DenseMatrix<bool> *elementMask=NULL,
- const set<int> *nodeSet=NULL) const;
+ const std::set<int> *nodeSet=NULL) const;
/** compute prescribed flux given an array of functions of x & t */
void add_fluxes(const Array<bool> &fieldMask,
const double time,
const SURFACE_SOURCE &sourceFunctions,
FIELDS &nodalSources) const;
void compute_fluxes(const Array<bool> &fieldMask,
const double time,
const SURFACE_SOURCE &sourceFunctions,
FIELDS &nodalSources) const
{
SURFACE_SOURCE::const_iterator src_iter;
for (src_iter=sourceFunctions.begin(); src_iter!=sourceFunctions.end(); src_iter++) {
_fieldName_ = src_iter->first;
if (!fieldMask((int)_fieldName_)) continue;
if (nodalSources[_fieldName_].nRows()==0) {
nodalSources[_fieldName_].reset(nNodesUnique_,1);
}
}
add_fluxes(fieldMask, time, sourceFunctions, nodalSources);
}
/** compute prescribed flux given an array of functions of u, x & t */
void add_robin_fluxes(const Array2D<bool> &rhsMask,
const FIELDS &fields,
const double time,
const ROBIN_SURFACE_SOURCE &sourceFunctions,
FIELDS &nodalSources) const;
void add_robin_tangent(const Array2D<bool> &rhsMask,
const FIELDS &fields,
const double time,
const ROBIN_SURFACE_SOURCE &sourceFunctions,
SPAR_MAT &tangent) const;
/** compute nodal vector of volume based sources */
void add_sources(const Array<bool> &fieldMask,
const double time,
const VOLUME_SOURCE &sourceFunctions,
FIELDS &nodalSources) const;
/** compute surface flux of a nodal field */
void field_surface_flux(const DENS_MAT &field,
- const set<PAIR> &faceSet,
+ const std::set<PAIR> &faceSet,
DENS_MAT &values,
const bool contour=false,
const int axis=2) const;
/** integrate a nodal field over an element set */
DENS_VEC integrate(const DENS_MAT &field, const ESET & eset) const;
/** integrate a nodal field over an face set */
DENS_VEC integrate(const DENS_MAT &field, const FSET & fset) const
{ throw ATC_Error(FILELINE,"unimplemented function"); }
/*@}*/
//----------------------------------------------------------------
/** \name shape functions */
//----------------------------------------------------------------
/*@{*/
/** evaluate shape function at a list of points in R^3 */
void evaluate_shape_functions(const MATRIX &coords,
SPAR_MAT &N) const;
/** evaluate shape function & derivatives at a list of points in R^3 */
void evaluate_shape_functions(const MATRIX &coords,
SPAR_MAT &N,
SPAR_MAT_VEC &dN) const;
/** evaluate shape function at a list of points in R^3 */
void evaluate_shape_functions(const MATRIX &coords,
const INT_ARRAY &pointToEltMap,
SPAR_MAT &N) const;
/** evaluate shape function & derivatives at a list of points in R^3 */
void evaluate_shape_functions(const MATRIX &coords,
const INT_ARRAY &pointToEltMap,
SPAR_MAT &N,
SPAR_MAT_VEC &dN) const;
/** evaluate shape derivatives at a list of points in R^3 */
void evaluate_shape_function_derivatives(const MATRIX &coords,
const INT_ARRAY &pointToEltMap,
SPAR_MAT_VEC &dN) const;
void shape_functions(const VECTOR &x,
DENS_VEC &shp,
Array<int> &node_list) const
{ feMesh_->shape_functions(x,shp,node_list); }
void shape_functions(const VECTOR & x,
DENS_VEC& shp,
DENS_MAT& dshp,
Array<int> &node_list) const
{ feMesh_->shape_functions(x,shp,dshp,node_list); }
void shape_functions(const VECTOR &x,
const int eltId,
DENS_VEC& shp,
Array<int> &node_list) const
{ feMesh_->shape_functions(x,eltId,shp,node_list); }
void shape_functions(const VECTOR &x,
DENS_VEC& shp,
Array<int> &node_list,
int &eltId) const
{ feMesh_->shape_functions(x,shp,node_list,eltId); }
void shape_functions(const VECTOR &x,
const int eltId,
DENS_VEC &shp,
DENS_MAT &dshp,
Array<int> &node_list) const
{ feMesh_->shape_functions(x,eltId,shp,dshp,node_list); }
/*@}*/
//----------------------------------------------------------------
/** \name kernel functions */
//----------------------------------------------------------------
/** evaluate kernel function */
void evaluate_kernel_functions(const MATRIX &pt_coords,
SPAR_MAT &N) const;
/** kernel matrix bandwidth */
int kernel_matrix_bandwidth(const MATRIX &pt_coords) const;
//----------------------------------------------------------------
/** \name nodeset */
//----------------------------------------------------------------
/** pass through */
- void create_nodeset(const string &name, const set<int> &nodeset)
+ void create_nodeset(const std::string &name, const std::set<int> &nodeset)
{ feMesh_->create_nodeset(name,nodeset); }
//----------------------------------------------------------------
/** \name accessors */
//----------------------------------------------------------------
/*@{*/
/** even though these are pass-throughs there is a necessary
* translation */
/** return number of unique nodes */
int num_nodes() const { return feMesh_->num_nodes_unique(); }
/** return number of total nodes */
int nNodesTotal() const { return feMesh_->num_nodes(); }
/** return number of elements */
int num_elements() const { return feMesh_->num_elements(); }
int my_num_elements() const { return feMesh_->my_num_elements(); }
/** return number of nodes per element */
int num_nodes_per_element() const { return feMesh_->num_nodes_per_element(); }
/** return element connectivity */
void element_connectivity(const int eltID,
Array<int> & nodes) const
{ feMesh_->element_connectivity_unique(eltID, nodes); }
/** return face connectivity */
void face_connectivity(const PAIR &faceID,
Array<int> &nodes) const
{ feMesh_->face_connectivity_unique(faceID, nodes); }
/** in lieu of pass-throughs const accessors ... */
/** return const ptr to mesh */
const FE_Mesh* fe_mesh() const { return feMesh_; }
/** return number of spatial dimensions */
int nsd() const { return feMesh_->num_spatial_dimensions(); }
/** return if the FE mesh has been created */
int has_mesh() const { return feMesh_!=NULL; }
/** get nodal coordinates for a given element */
void element_coordinates(const int eltIdx, DENS_MAT &coords)
{ feMesh_->element_coordinates(eltIdx,coords); }
/** get nodal coordinates for a given element */
void element_field(const int eltIdx, const DENS_MAT field,
DENS_MAT &local_field)
{ feMesh_->element_field(eltIdx, field, local_field); }
/** access list of elements to be deleted */
- const set<int> &null_elements(void) const
+ const std::set<int> &null_elements(void) const
{ return nullElements_; }
/** access to the amended nodal coordinate values */
const DENS_MAT &nodal_coordinates(void) const
{ return (*feMesh_->coordinates()); }
/** map global node numbering to unique node numbering for
* amended mesh */
int map_global_to_unique(const int global_id) const
{ return (*feMesh_->node_map())(global_id); }
int number_of_global_nodes(void) const { return nNodes_; }
/*@}*/
/** set kernel */
void set_kernel(KernelFunction* ptr);
KernelFunction *kernel(int i=0) { return kernelFunction_; }
private:
//----------------------------------------------------------------
/** mesh setup commands (called from modify) */
//----------------------------------------------------------------
/*@{*/
MPI_Comm communicator_;
/** finite element mesh */
FE_Mesh *feMesh_;
/** auxillary kernel function */
KernelFunction *kernelFunction_;
/** initialized flag */
bool initialized_;
/** create a uniform, structured mesh */
void create_mesh(Array<double> &dx,
Array<double> &dy,
Array<double> &dz,
const char *regionName,
Array<bool> periodic);
void create_mesh(int nx, int ny, int nz,
const char *regionName,
Array<bool> periodic);
/** read an unstructured mesh from a file */
- void read_mesh(string meshFile, Array<bool> & periodicity);
+ void read_mesh(std::string meshFile, Array<bool> & periodicity);
/*@}*/
/** data that can be used for a subset of original mesh */
- set<int> nullElements_;
+ std::set<int> nullElements_;
/** faces upon which nodes are duplicated */
- set<PAIR> cutFaces_;
- set<int> cutEdge_;
+ std::set<PAIR> cutFaces_;
+ std::set<int> cutEdge_;
/** workspace */
int nNodesPerElement_;
int nSD_;
int nElems_;
int nNodes_; /** number of global nodes */
int nNodesUnique_; /** number of unique nodes */
mutable int nIPsPerElement_;
mutable int nIPsPerFace_;
mutable FeIntQuadrature quadrature_;
mutable FIELDS::const_iterator _fieldItr_;
mutable FieldName _fieldName_;
/** sized arrays */
mutable DIAG_MAT _weights_;
mutable DENS_MAT _N_, _Nw_;
mutable DENS_MAT_VEC _dN_, _dNw_;
mutable DIAG_MAT _fweights_;
mutable DENS_MAT _fN_;
mutable DENS_MAT_VEC _fdN_, _nN_;
/** unsized arrays */
mutable DENS_MAT _Nmat_;
mutable FIELD_MATS _fieldsAtIPs_;
mutable GRAD_FIELD_MATS _gradFieldsAtIPs_;
mutable DENS_MAT _Nfluxes_;
mutable AliasArray<int> _conn_;
mutable DENS_MAT_VEC _Bfluxes_;
/** output object */
OutputManager outputManager_;
};
}; // end namespace ATC
#endif
diff --git a/lib/atc/FE_Interpolate.cpp b/lib/atc/FE_Interpolate.cpp
index 5f9bf02c2..3f41e3002 100644
--- a/lib/atc/FE_Interpolate.cpp
+++ b/lib/atc/FE_Interpolate.cpp
@@ -1,990 +1,993 @@
// ATC header files
#include "ATC_Error.h"
#include "FE_Element.h"
#include "FE_Interpolate.h"
#include "FE_Quadrature.h"
// Other headers
#include "math.h"
+using std::map;
+using std::vector;
+
namespace ATC {
FE_Interpolate::FE_Interpolate(FE_Element *feElement)
: feElement_(feElement),
nSD_(feElement->num_dims())
{
// Nothing to do here
}
FE_Interpolate::~FE_Interpolate()
{
if (!feQuadList_.empty()) {
map<FeIntQuadrature,FE_Quadrature *>::iterator qit;
for (qit = feQuadList_.begin();
qit != feQuadList_.end(); ++qit) {
delete (qit->second);
}
}
}
void FE_Interpolate::set_quadrature(FeEltGeometry geo,
FeIntQuadrature quad)
{
if (feQuadList_.count(quad) == 0) {
feQuad_ = new FE_Quadrature(geo,quad);
feQuadList_[quad] = feQuad_;
} else {
feQuad_ = feQuadList_[quad];
}
precalculate_shape_functions();
}
void FE_Interpolate::precalculate_shape_functions()
{
int numEltNodes = feElement_->num_elt_nodes();
int numFaces = feElement_->num_faces();
int numFaceNodes = feElement_->num_face_nodes();
int numIPs = feQuad_->numIPs;
DENS_MAT &ipCoords = feQuad_->ipCoords;
int numFaceIPs = feQuad_->numFaceIPs;
vector<DENS_MAT> &ipFaceCoords = feQuad_->ipFaceCoords;
DENS_MAT &ipFace2DCoords = feQuad_->ipFace2DCoords;
// Compute elemental shape functions at ips
N_.reset(numIPs,numEltNodes);
dNdr_.assign(numIPs,DENS_MAT(nSD_,numEltNodes));
for (int ip = 0; ip < numIPs; ip++) {
CLON_VEC thisIP = column(ipCoords,ip);
CLON_VEC thisN = row(N_,ip);
DENS_MAT &thisdNdr = dNdr_[ip];
compute_N(thisIP,thisN);
compute_N_dNdr(thisIP,thisN,thisdNdr);
}
// Compute face shape functions at ip's
NFace_.assign(numFaces,DENS_MAT(numFaceIPs,numEltNodes));
dNdrFace_.resize(numFaces);
for (int f = 0; f < numFaces; f++) {
dNdrFace_[f].assign(numIPs,DENS_MAT(nSD_,numEltNodes));
}
for (int f = 0; f < numFaces; f++) {
for (int ip = 0; ip < numFaceIPs; ip++) {
CLON_VEC thisIP = column(ipFaceCoords[f],ip);
CLON_VEC thisN = row(NFace_[f],ip);
DENS_MAT &thisdNdr = dNdrFace_[f][ip];
compute_N_dNdr(thisIP,thisN,thisdNdr);
}
}
// Compute 2D face shape function derivatives
dNdrFace2D_.assign(numFaceIPs,DENS_MAT(nSD_-1,numFaceNodes));
for (int ip = 0; ip < numFaceIPs; ip++) {
CLON_VEC thisIP = column(ipFace2DCoords,ip);
DENS_MAT &thisdNdr = dNdrFace2D_[ip];
compute_dNdr(thisIP,
numFaceNodes,nSD_-1,feElement_->face_area(),
thisdNdr);
}
}
//-----------------------------------------------------------------
// shape function value at a particular point given local coordinates
//-----------------------------------------------------------------
void FE_Interpolate::shape_function(const VECTOR &xi,
DENS_VEC &N)
{
int numEltNodes = feElement_->num_elt_nodes();
N.resize(numEltNodes);
compute_N(xi,N);
}
void FE_Interpolate::shape_function(const DENS_MAT &eltCoords,
const VECTOR &xi,
DENS_VEC &N,
DENS_MAT &dNdx)
{
int numEltNodes = feElement_->num_elt_nodes();
N.resize(numEltNodes);
DENS_MAT dNdr(nSD_,numEltNodes,false);
compute_N_dNdr(xi,N,dNdr);
DENS_MAT eltCoordsT = transpose(eltCoords);
DENS_MAT dxdr, drdx;
dxdr = dNdr*eltCoordsT;
drdx = inv(dxdr);
dNdx = drdx*dNdr;
}
void FE_Interpolate::shape_function_derivatives(const DENS_MAT &eltCoords,
const VECTOR &xi,
DENS_MAT &dNdx)
{
int numEltNodes = feElement_->num_elt_nodes();
DENS_MAT dNdr(nSD_,numEltNodes,false);
DENS_VEC N(numEltNodes);
compute_N_dNdr(xi,N,dNdr);
DENS_MAT eltCoordsT = transpose(eltCoords);
DENS_MAT dxdr, drdx;
dxdr = dNdr*eltCoordsT; // tangents or Jacobian matrix
drdx = inv(dxdr);
dNdx = drdx*dNdr; // dN/dx = dN/dxi (dx/dxi)^-1
}
void FE_Interpolate::tangents(const DENS_MAT &eltCoords,
const VECTOR &xi,
DENS_MAT &dxdr) const
{
int numEltNodes = feElement_->num_elt_nodes();
DENS_MAT dNdr(nSD_,numEltNodes,false);
DENS_VEC N(numEltNodes);
compute_N_dNdr(xi,N,dNdr);
//dNdr.print("dNdr");
DENS_MAT eltCoordsT = transpose(eltCoords);
//eltCoordsT.print("elt coords");
dxdr = dNdr*eltCoordsT;
//dxdr.print("dxdr");
}
void FE_Interpolate::tangents(const DENS_MAT &eltCoords,
const VECTOR &xi,
vector<DENS_VEC> & dxdxi,
const bool normalize) const
{
DENS_MAT dxdr;
tangents(eltCoords,xi,dxdr);
//dxdr.print("dxdr-post");
dxdxi.resize(nSD_);
//for (int i = 0; i < nSD_; ++i) dxdxi[i] = CLON_VEC(dxdr,CLONE_COL,i);
for (int i = 0; i < nSD_; ++i) {
dxdxi[i].resize(nSD_);
for (int j = 0; j < nSD_; ++j) {
dxdxi[i](j) = dxdr(i,j);
}
}
//dxdxi[0].print("t1");
//dxdxi[1].print("t2");
//dxdxi[2].print("t3");
if (normalize) {
for (int j = 0; j < nSD_; ++j) {
double norm = 0;
VECTOR & t = dxdxi[j];
for (int i = 0; i < nSD_; ++i) norm += t(i)*t(i);
norm = 1./sqrt(norm);
for (int i = 0; i < nSD_; ++i) t(i) *= norm;
}
}
}
// -------------------------------------------------------------
// shape_function values at nodes
// -------------------------------------------------------------
void FE_Interpolate::shape_function(const DENS_MAT &eltCoords,
DENS_MAT &N,
vector<DENS_MAT> &dN,
DIAG_MAT &weights)
{
int numEltNodes = feElement_->num_elt_nodes();
// Transpose eltCoords
DENS_MAT eltCoordsT(transpose(eltCoords));
// Shape functions are simply the canonical element values
N = N_;
// Set sizes of matrices and vectors
if ((int)dN.size() != nSD_) dN.resize(nSD_);
for (int isd = 0; isd < nSD_; isd++)
dN[isd].resize(feQuad_->numIPs,numEltNodes);
weights.resize(feQuad_->numIPs,feQuad_->numIPs);
// Create some temporary matrices:
// Jacobian matrix: [dx/dr dy/ds dz/dt | dx/ds ... ]
DENS_MAT dxdr, drdx, dNdx;
// Loop over integration points
for (int ip = 0; ip < feQuad_->numIPs; ip++) {
// Compute dx/dxi matrix
dxdr = dNdr_[ip]*eltCoordsT;
drdx = inv(dxdr);
// Compute dNdx and fill dN matrix
dNdx = drdx * dNdr_[ip];
for (int isd = 0; isd < nSD_; isd++)
for (int inode = 0; inode < numEltNodes; inode++)
dN[isd](ip,inode) = dNdx(isd,inode);
// Compute jacobian determinant of dxdr at this ip
double J = dxdr(0,0) * (dxdr(1,1)*dxdr(2,2) - dxdr(2,1)*dxdr(1,2))
- dxdr(0,1) * (dxdr(1,0)*dxdr(2,2) - dxdr(1,2)*dxdr(2,0))
+ dxdr(0,2) * (dxdr(1,0)*dxdr(2,1) - dxdr(1,1)*dxdr(2,0));
// Compute ip weight
weights(ip,ip) = feQuad_->ipWeights(ip)*J;
}
}
//-----------------------------------------------------------------
// shape functions on a given face
//-----------------------------------------------------------------
void FE_Interpolate::face_shape_function(const DENS_MAT &eltCoords,
const DENS_MAT &faceCoords,
const int faceID,
DENS_MAT &N,
DENS_MAT &n,
DIAG_MAT &weights)
{
int numFaceIPs = feQuad_->numFaceIPs;
// Transpose eltCoords
DENS_MAT eltCoordsT = transpose(eltCoords);
// Shape functions are simply the canonical element values
N = NFace_[faceID];
// Create some temporary matrices:
// Jacobian matrix: [dx/dr dy/ds dz/dt | dx/ds ... ]
DENS_MAT dxdr, drdx, dNdx;
// Loop over integration points
DENS_VEC normal(nSD_);
n.resize(nSD_,numFaceIPs);
weights.resize(numFaceIPs,numFaceIPs);
for (int ip = 0; ip < numFaceIPs; ip++) {
// Compute 2d jacobian determinant of dxdr at this ip
double J = face_normal(faceCoords,ip,normal);
// Copy normal at integration point
for (int isd = 0; isd < nSD_; isd++) {
n(isd,ip) = normal(isd);
}
// Compute ip weight
weights(ip,ip) = feQuad_->ipFaceWeights(ip)*J;
}
}
void FE_Interpolate::face_shape_function(const DENS_MAT &eltCoords,
const DENS_MAT &faceCoords,
const int faceID,
DENS_MAT &N,
vector<DENS_MAT> &dN,
vector<DENS_MAT> &Nn,
DIAG_MAT &weights)
{
int numEltNodes = feElement_->num_elt_nodes();
int numFaceIPs = feQuad_->numFaceIPs;
// Transpose eltCoords
DENS_MAT eltCoordsT = transpose(eltCoords);
// Shape functions are simply the canonical element values
N = NFace_[faceID];
// Set sizes of matrices and vectors
if ((int)dN.size() != nSD_) dN.resize(nSD_);
if ((int)Nn.size() != nSD_) Nn.resize(nSD_);
for (int isd = 0; isd < nSD_; isd++) {
dN[isd].resize(numFaceIPs,numEltNodes);
Nn[isd].resize(numFaceIPs,numEltNodes);
}
weights.resize(numFaceIPs,numFaceIPs);
// Create some temporary matrices:
// Jacobian matrix: [dx/dr dy/ds dz/dt | dx/ds ... ]
DENS_MAT dxdr, drdx, dNdx;
DENS_VEC normal(nSD_);
// Loop over integration points
for (int ip = 0; ip < numFaceIPs; ip++) {
// Compute dx/dxi matrix
dxdr = dNdrFace_[faceID][ip] * eltCoordsT;
drdx = inv(dxdr);
// Compute 2d jacobian determinant of dxdr at this ip
double J = face_normal(faceCoords,ip,normal);
// Compute dNdx and fill dN matrix
dNdx = drdx * dNdrFace_[faceID][ip];
for (int isd = 0; isd < nSD_; isd++) {
for (int inode = 0; inode < numEltNodes; inode++) {
dN[isd](ip,inode) = dNdx(isd,inode);
Nn[isd](ip,inode) = N(ip,inode)*normal(isd);
}
}
// Compute ip weight
weights(ip,ip) = feQuad_->ipFaceWeights(ip)*J;
}
}
// -------------------------------------------------------------
// face normal
// -------------------------------------------------------------
double FE_Interpolate::face_normal(const DENS_MAT &faceCoords,
int ip,
DENS_VEC &normal)
{
// Compute dx/dr for deformed element
DENS_MAT faceCoordsT = transpose(faceCoords);
DENS_MAT dxdr = dNdrFace2D_[ip]*faceCoordsT;
// Normal vector from cross product, hardcoded for 3D, sad
normal(0) = dxdr(0,1)*dxdr(1,2) - dxdr(0,2)*dxdr(1,1);
normal(1) = dxdr(0,2)*dxdr(1,0) - dxdr(0,0)*dxdr(1,2);
normal(2) = dxdr(0,0)*dxdr(1,1) - dxdr(0,1)*dxdr(1,0);
// Jacobian (3D)
double J = sqrt(normal(0)*normal(0) +
normal(1)*normal(1) +
normal(2)*normal(2));
double invJ = 1.0/J;
normal(0) *= invJ;
normal(1) *= invJ;
normal(2) *= invJ;
return J;
}
int FE_Interpolate::num_ips() const
{
return feQuad_->numIPs;
}
int FE_Interpolate::num_face_ips() const
{
return feQuad_->numFaceIPs;
}
/*********************************************************
* Class FE_InterpolateCartLagrange
*
* For computing Lagrange shape functions using Cartesian
* coordinate systems (all quads/hexes fall under this
* category, and any elements derived by degenerating
* them). Not to be used for serendipity elements, which
* should be implemented for SPEED.
*
*********************************************************/
FE_InterpolateCartLagrange::FE_InterpolateCartLagrange(
FE_Element *feElement)
: FE_Interpolate(feElement)
{
set_quadrature(HEXA,GAUSS2);
}
FE_InterpolateCartLagrange::~FE_InterpolateCartLagrange()
{
// Handled by base class
}
void FE_InterpolateCartLagrange::compute_N(const VECTOR &point,
VECTOR &N)
{
// *** see comments for compute_N_dNdr ***
const DENS_VEC &localCoords1d = feElement_->local_coords_1d();
int numEltNodes = feElement_->num_elt_nodes();
int numEltNodes1d = feElement_->num_elt_nodes_1d();
DENS_MAT lagrangeTerms(nSD_,numEltNodes1d);
DENS_MAT lagrangeDenom(nSD_,numEltNodes1d);
lagrangeTerms = 1.0;
lagrangeDenom = 1.0;
for (int iSD = 0; iSD < nSD_; ++iSD) {
for (int inode = 0; inode < numEltNodes1d; ++inode) {
for (int icont = 0; icont < numEltNodes1d; ++icont) {
if (inode != icont) {
lagrangeDenom(iSD,inode) *= (localCoords1d(inode) -
localCoords1d(icont));
lagrangeTerms(iSD,inode) *= (point(iSD)-localCoords1d(icont));
}
}
}
}
for (int iSD=0; iSD<nSD_; ++iSD) {
for (int inode=0; inode<numEltNodes1d; ++inode) {
lagrangeTerms(iSD,inode) /= lagrangeDenom(iSD,inode);
}
}
N = 1.0;
vector<int> mapping(nSD_);
for (int inode=0; inode<numEltNodes; ++inode) {
feElement_->mapping(inode,mapping);
for (int iSD=0; iSD<nSD_; ++iSD) {
N(inode) *= lagrangeTerms(iSD,mapping[iSD]);
}
}
}
// Sort of a test-ride for a generic version that can be used for
// faces too. The only thing that's not "generic" is localCoords,
// which very magically works in both cases.
void FE_InterpolateCartLagrange::compute_dNdr(const VECTOR &point,
const int numNodes,
const int nD,
const double,
DENS_MAT &dNdr)
{
// *** see comments for compute_N_dNdr ***
const DENS_VEC &localCoords1d = feElement_->local_coords_1d();
int numEltNodes1d = feElement_->num_elt_nodes_1d();
DENS_MAT lagrangeTerms(nD,numEltNodes1d);
DENS_MAT lagrangeDenom(nD,numEltNodes1d);
DENS_MAT lagrangeDeriv(nD,numEltNodes1d);
lagrangeDenom = 1.0;
lagrangeTerms = 1.0;
lagrangeDeriv = 0.0;
DENS_VEC productRuleVec(numEltNodes1d);
productRuleVec = 1.0;
for (int iSD = 0; iSD < nD; ++iSD) {
for (int inode = 0; inode < numEltNodes1d; ++inode) {
for (int icont = 0; icont < numEltNodes1d; ++icont) {
if (inode != icont) {
lagrangeTerms(iSD,inode) *= (point(iSD)-localCoords1d(icont));
lagrangeDenom(iSD,inode) *= (localCoords1d(inode) -
localCoords1d(icont));
for (int dcont=0; dcont<numEltNodes1d; ++dcont) {
if (inode == dcont) {
productRuleVec(dcont) = 0.0;
} else if (icont == dcont) {
} else {
productRuleVec(dcont) *= (point(iSD)-localCoords1d(icont));
}
}
}
}
for (int dcont=0; dcont<numEltNodes1d; ++dcont) {
lagrangeDeriv(iSD,inode) += productRuleVec(dcont);
}
productRuleVec = 1.0;
}
}
for (int iSD=0; iSD<nD; ++iSD) {
for (int inode=0; inode<numEltNodes1d; ++inode) {
lagrangeTerms(iSD,inode) /= lagrangeDenom(iSD,inode);
lagrangeDeriv(iSD,inode) /= lagrangeDenom(iSD,inode);
}
}
dNdr = 1.0;
vector<int> mapping(nD);
for (int inode=0; inode<numNodes; ++inode) {
feElement_->mapping(inode,mapping);
for (int iSD=0; iSD<nD; ++iSD) {
for (int dSD=0; dSD<nD; ++dSD) {
if (iSD == dSD) {
dNdr(dSD,inode) *= lagrangeDeriv(iSD,mapping[iSD]);
} else {
dNdr(dSD,inode) *= lagrangeTerms(iSD,mapping[iSD]);
}
}
}
}
}
void FE_InterpolateCartLagrange::compute_N_dNdr(const VECTOR &point,
VECTOR &N,
DENS_MAT &dNdr) const
{
// Required data from element class
const DENS_VEC &localCoords1d = feElement_->local_coords_1d();
int numEltNodes = feElement_->num_elt_nodes();
int numEltNodes1d = feElement_->num_elt_nodes_1d();
// lagrangeTerms stores the numerator for the various Lagrange polynomials
// in one dimension, that will be used to produce the three dimensional
// shape functions
DENS_MAT lagrangeTerms(nSD_,numEltNodes1d);
// lagrangeDenom stores the denominator. Stored separately to reduce
// redundancy, because it will be used for the shape functions and derivs
DENS_MAT lagrangeDenom(nSD_,numEltNodes1d);
// lagrangeDeriv stores the numerator for the derivative of the Lagrange
// polynomials
DENS_MAT lagrangeDeriv(nSD_,numEltNodes1d);
// Terms/Denom are products, Deriv will be a sum, so initialize as such:
lagrangeTerms = 1.0;
lagrangeDenom = 1.0;
lagrangeDeriv = 0.0;
// the derivative requires use of the product rule; to store the prodcuts
// which make up the terms produced by the product rule, we'll use this
// vector
DENS_VEC productRuleVec(numEltNodes1d);
productRuleVec = 1.0;
for (int iSD = 0; iSD < nSD_; ++iSD) {
for (int inode = 0; inode < numEltNodes1d; ++inode) {
for (int icont = 0; icont < numEltNodes1d; ++icont) {
if (inode != icont) {
// each dimension and each 1d node per dimension has a
// contribution from all nodes besides the current node
lagrangeTerms(iSD,inode) *= (point(iSD)-localCoords1d(icont));
lagrangeDenom(iSD,inode) *= (localCoords1d(inode) -
localCoords1d(icont));
// complciated; each sum produced by the product rule has one
// "derivative", and the rest are just identical to the terms
// above
for (int dcont=0; dcont<numEltNodes1d; ++dcont) {
if (inode == dcont) {
// skip this term, derivative is 0
productRuleVec(dcont) = 0.0;
} else if (icont == dcont) {
// no numerator contribution, derivative is 1
} else {
// part of the "constant"
productRuleVec(dcont) *= (point(iSD)-localCoords1d(icont));
}
}
}
}
// sum the terms produced by the product rule and store in Deriv
for (int dcont=0; dcont<numEltNodes1d; ++dcont) {
lagrangeDeriv(iSD,inode) += productRuleVec(dcont);
}
productRuleVec = 1.0;
}
}
// divide by denom
for (int iSD=0; iSD<nSD_; ++iSD) {
for (int inode=0; inode<numEltNodes1d; ++inode) {
lagrangeTerms(iSD,inode) /= lagrangeDenom(iSD,inode);
lagrangeDeriv(iSD,inode) /= lagrangeDenom(iSD,inode);
}
}
N = 1.0;
dNdr = 1.0;
// mapping returns the 1d nodes in each dimension that sould be multiplied
// to achieve the shape functions in 3d
vector<int> mapping(nSD_);
for (int inode=0; inode<numEltNodes; ++inode) {
feElement_->mapping(inode,mapping);
for (int iSD=0; iSD<nSD_; ++iSD) {
N(inode) *= lagrangeTerms(iSD,mapping[iSD]);
for (int dSD=0; dSD<nSD_; ++dSD) {
// only use Deriv for the dimension in which we're taking the
// derivative, because the rest is essentially a "constant"
if (iSD == dSD) {
dNdr(dSD,inode) *= lagrangeDeriv(iSD,mapping[iSD]);
} else {
dNdr(dSD,inode) *= lagrangeTerms(iSD,mapping[iSD]);
}
}
}
}
}
/*********************************************************
* Class FE_InterpolateCartLin
*
* For computing linear shape functions using Cartesian
* coordinate systems (all quads/hexes fall under this
* category, and any elements derived by degenerating
* them).
*
*********************************************************/
FE_InterpolateCartLin::FE_InterpolateCartLin(
FE_Element *feElement)
: FE_Interpolate(feElement)
{
set_quadrature(HEXA,GAUSS2);
}
FE_InterpolateCartLin::~FE_InterpolateCartLin()
{
// Handled by base class
}
void FE_InterpolateCartLin::compute_N(const VECTOR &point,
VECTOR &N)
{
// *** see comments for compute_N_dNdr ***
const DENS_MAT &localCoords = feElement_->local_coords();
double invVol = 1.0/(feElement_->vol());
int numEltNodes = feElement_->num_elt_nodes();
for (int inode = 0; inode < numEltNodes; ++inode) {
N(inode) = invVol;
for (int isd = 0; isd < nSD_; ++isd) {
N(inode) *= (1.0 + point(isd)*localCoords(isd,inode));
}
}
}
// Sort of a test-ride for a generic version that can be used for
// faces too. The only thing that's not "generic" is localCoords,
// which very magically works in both cases.
void FE_InterpolateCartLin::compute_dNdr(const VECTOR &point,
const int numNodes,
const int nD,
const double vol,
DENS_MAT &dNdr)
{
// *** see comments for compute_N_dNdr ***
const DENS_MAT &localCoords = feElement_->local_coords();
double invVol = 1.0/vol;
for (int inode = 0; inode < numNodes; ++inode) {
for (int idr = 0; idr < nD; ++idr) {
dNdr(idr,inode) = invVol;
}
for (int id = 0; id < nD; ++id) {
for (int idr = 0; idr < nD; ++idr) {
if (id == idr) dNdr(idr,inode) *= localCoords(id,inode);
else dNdr(idr,inode) *= 1.0 +
point(id)*localCoords(id,inode);
}
}
}
}
void FE_InterpolateCartLin::compute_N_dNdr(const VECTOR &point,
VECTOR &N,
DENS_MAT &dNdr) const
{
// Required data from element class
const DENS_MAT &localCoords = feElement_->local_coords();
double invVol = 1.0/(feElement_->vol());
int numEltNodes = feElement_->num_elt_nodes();
// Fill in for each node
for (int inode = 0; inode < numEltNodes; ++inode) {
// Intiialize shape function and derivatives
N(inode) = invVol;
for (int idr = 0; idr < nSD_; ++idr) {
dNdr(idr,inode) = invVol;
}
for (int isd = 0; isd < nSD_; ++isd) {
// One term for each dimension
N(inode) *= (1.0 + point(isd)*localCoords(isd,inode));
// One term for each dimension, only deriv in deriv's dimension
for (int idr = 0; idr < nSD_; ++idr) {
if (isd == idr) dNdr(idr,inode) *= localCoords(isd,inode);
else dNdr(idr,inode) *= 1.0 +
point(isd)*localCoords(isd,inode);
}
}
}
}
/*********************************************************
* Class FE_InterpolateCartSerendipity
*
* For computing shape functions for quadratic serendipity
* elements, implemented for SPEED.
*
*********************************************************/
FE_InterpolateCartSerendipity::FE_InterpolateCartSerendipity(
FE_Element *feElement)
: FE_Interpolate(feElement)
{
set_quadrature(HEXA,GAUSS2);
}
FE_InterpolateCartSerendipity::~FE_InterpolateCartSerendipity()
{
// Handled by base class
}
void FE_InterpolateCartSerendipity::compute_N(const VECTOR &point,
VECTOR &N)
{
// *** see comments for compute_N_dNdr ***
const DENS_MAT &localCoords = feElement_->local_coords();
double invVol = 1.0/(feElement_->vol());
int numEltNodes = feElement_->num_elt_nodes();
for (int inode = 0; inode < numEltNodes; ++inode) {
N(inode) = invVol;
for (int isd = 0; isd < nSD_; ++isd) {
if (((inode == 8 || inode == 10 || inode == 16 || inode == 18) &&
(isd == 0)) ||
((inode == 9 || inode == 11 || inode == 17 || inode == 19) &&
(isd == 1)) ||
((inode == 12 || inode == 13 || inode == 14 || inode == 15) &&
(isd == 2))) {
N(inode) *= (1.0 - pow(point(isd),2))*2;
} else {
N(inode) *= (1.0 + point(isd)*localCoords(isd,inode));
}
}
if (inode < 8) {
N(inode) *= (point(0)*localCoords(0,inode) +
point(1)*localCoords(1,inode) +
point(2)*localCoords(2,inode) - 2);
}
}
}
// Sort of a test-ride for a generic version that can be used for
// faces too. The only thing that's not "generic" is localCoords,
// which very magically works in both cases.
void FE_InterpolateCartSerendipity::compute_dNdr(const VECTOR &point,
const int numNodes,
const int nD,
const double vol,
DENS_MAT &dNdr)
{
// *** see comments for compute_N_dNdr ***
const DENS_MAT &localCoords = feElement_->local_coords();
double invVol = 1.0/vol;
bool serendipityNode = false;
double productRule1 = 0.0;
double productRule2 = 0.0;
if (nD != 3 && nD != 2) {
ATC_Error("Serendipity dNdr calculations are too hard-wired to do "
"what you want them to. Only 2D and 3D currently work.");
}
for (int inode = 0; inode < numNodes; ++inode) {
for (int idr = 0; idr < nD; ++idr) {
dNdr(idr,inode) = invVol;
}
for (int id = 0; id < nD; ++id) {
for (int idr = 0; idr < nD; ++idr) {
// identify nodes/dims differently if 3d or 2d case
if (nD == 3) {
serendipityNode =
(((inode == 8 || inode == 10 || inode == 16 || inode == 18) &&
(id == 0)) ||
((inode == 9 || inode == 11 || inode == 17 || inode == 19) &&
(id == 1)) ||
((inode == 12 || inode == 13 || inode == 14 || inode == 15) &&
(id == 2)));
} else if (nD == 2) {
serendipityNode =
(((inode == 4 || inode == 6) && (id == 0)) ||
((inode == 5 || inode == 7) && (id == 1)));
}
if (serendipityNode) {
if (id == idr) {
dNdr(idr,inode) *= point(id)*(-4);
} else {
dNdr(idr,inode) *= (1.0 - pow(point(id),2))*2;
}
} else {
if (id == idr) {
dNdr(idr,inode) *= localCoords(id,inode);
} else {
dNdr(idr,inode) *= (1.0 + point(id)*localCoords(id,inode));
}
}
}
}
for (int idr = 0; idr < nD; ++idr) {
if (inode < 8) {
// final corner contribution slightly different for 3d and 2d cases
if (nD == 3) {
productRule2 = (point(0)*localCoords(0,inode) +
point(1)*localCoords(1,inode) +
point(2)*localCoords(2,inode) - 2);
} else if (nD == 2) {
productRule2 = (point(0)*localCoords(0,inode) +
point(1)*localCoords(1,inode) - 1);
}
productRule1 = dNdr(idr,inode) *
(1 + point(idr)*localCoords(idr,inode));
productRule2 *= dNdr(idr,inode);
dNdr(idr,inode) = productRule1 + productRule2;
}
}
}
}
void FE_InterpolateCartSerendipity::compute_N_dNdr(const VECTOR &point,
VECTOR &N,
DENS_MAT &dNdr) const
{
// Required data from element class
const DENS_MAT &localCoords = feElement_->local_coords();
double invVol = 1.0/(feElement_->vol());
int numEltNodes = feElement_->num_elt_nodes();
// Will store terms for product rule derivative for dNdr
double productRule1;
double productRule2;
// Fill in for each node
for (int inode = 0; inode < numEltNodes; ++inode) {
// Initialize shape functions and derivatives
N(inode) = invVol;
for (int idr = 0; idr < nSD_; ++idr) {
dNdr(idr,inode) = invVol;
}
// Add components from each dimension
for (int isd = 0; isd < nSD_; ++isd) {
for (int idr = 0; idr < nSD_; ++idr) {
// Check to see if the node is NOT a corner node, and if its
// "0-coordinate" is in the same dimension as the one we're currently
// iterating over. If that's the case, we want to contribute to its
// shape functions and derivatives in a modified way:
if (((inode == 8 || inode == 10 || inode == 16 || inode == 18) &&
(isd == 0)) ||
((inode == 9 || inode == 11 || inode == 17 || inode == 19) &&
(isd == 1)) ||
((inode == 12 || inode == 13 || inode == 14 || inode == 15) &&
(isd == 2))) {
// If the 1d shape function dimension matches the derivative
// dimension...
if (isd == idr) {
// contribute to N; sloppy, but this is the easiest way to get
// N to work right without adding extra, arguably unnecessary
// loops, while also computing the shape functions
N(inode) *= (1.0 - pow(point(isd),2))*2;
// contribute to dNdr with the derivative of this shape function
// contribution
dNdr(idr,inode) *= point(isd)*(-4);
} else {
// otherwise, just use the "constant" contribution to the deriv
dNdr(idr,inode) *= (1.0 - pow(point(isd),2))*2;
}
} else {
// non-serendipity style contributions
if (isd == idr) {
N(inode) *= (1.0 + point(isd)*localCoords(isd,inode));
dNdr(idr,inode) *= localCoords(isd,inode);
} else {
dNdr(idr,inode) *= (1.0 + point(isd)*localCoords(isd,inode));
}
}
}
}
// serendipity corner nodes require more extra handling
if (inode < 8) {
N(inode) *= (point(0)*localCoords(0,inode) +
point(1)*localCoords(1,inode) +
point(2)*localCoords(2,inode) - 2);
}
for (int idr = 0; idr < nSD_; ++idr) {
if (inode < 8) {
productRule1 = dNdr(idr,inode) *
(1 + point(idr)*localCoords(idr,inode));
productRule2 = dNdr(idr,inode) * (point(0)*localCoords(0,inode) +
point(1)*localCoords(1,inode) +
point(2)*localCoords(2,inode) - 2);
dNdr(idr,inode) = productRule1 + productRule2;
}
}
}
}
/*********************************************************
* Class FE_InterpolateSimpLin
*
* For computing linear shape functions of simplices,
* which are rather different from those computed
* in Cartesian coordinates.
*
* Note: degenerating quads/hexes can yield simplices
* as well, but this class is for computing these
* shape fucntions _natively_, in their own
* triangular/tetrahedral coordinate systems.
*
*********************************************************/
FE_InterpolateSimpLin::FE_InterpolateSimpLin(
FE_Element *feElement)
: FE_Interpolate(feElement)
{
set_quadrature(TETRA,GAUSS2);
}
FE_InterpolateSimpLin::~FE_InterpolateSimpLin()
{
// Handled by base class
}
void FE_InterpolateSimpLin::compute_N(const VECTOR &point,
VECTOR &N)
{
int numEltNodes = feElement_->num_elt_nodes();
// Fill in for each node
for (int inode = 0; inode < numEltNodes; ++inode) {
if (inode == 0) {
// Fill N...the ips are serving as proxies for "dimensions"
// since we're in tetrahedral coordinates, except that
// 0th node = 3rd "dimension" (u or O_o)
// 1st node = 0th "dimension" (x or r)
// 2nd node = 1st "dimension" (y or s)
// 3rd node = 3nd "dimension" (z or t)
// and remember that u = 1 - r - s - t for tet coords
N(inode) = 1;
for (int icont = 0; icont < nSD_; ++icont) {
N(inode) -= point(icont);
}
} else {
N(inode) = point(inode-1);
}
}
}
void FE_InterpolateSimpLin::compute_dNdr(const VECTOR &,
const int numNodes,
const int nD,
const double,
DENS_MAT &dNdr)
{
// Fill in for each node
for (int inode = 0; inode < numNodes; ++inode) {
// Fill dNdr_; we want 1 if the dimension of derivative
// and variable within N correspond. That is, if N == r,
// we want the 0th dimension to contain (d/dr)r = 1. Of
// course, (d/di)r = 0 forall i != r, so we need that as
// well. This is a bit elusively complicated. Also, the 0th
// integration point contains the term u = 1 - r - s - t.
// (which map to x, y, and z). Therefore, the derivative in
// each dimension are -1.
//
// The idea is similar for 2 dimensions, which this can
// handle as well.
for (int idr = 0; idr < nD; ++idr) {
if (inode == 0) {
dNdr(idr,inode) = -1;
} else {
dNdr(idr,inode) = (inode == (idr + 1)) ? 1 : 0;
}
}
}
}
void FE_InterpolateSimpLin::compute_N_dNdr(const VECTOR &point,
VECTOR &N,
DENS_MAT &dNdr) const
{
int numEltNodes = feElement_->num_elt_nodes();
// Fill in for each node
for (int inode = 0; inode < numEltNodes; ++inode) {
// Fill N...
if (inode == 0) {
N(inode) = 1;
for (int icont = 0; icont < nSD_; ++icont) {
N(inode) -= point(icont);
}
} else {
N(inode) = point(inode-1);
}
// Fill dNdr...
for (int idr = 0; idr < nSD_; ++idr) {
if (inode == 0) {
dNdr(idr,inode) = -1;
} else {
dNdr(idr,inode) = (inode == (idr + 1)) ? 1 : 0;
}
}
}
}
} // namespace ATC
diff --git a/lib/atc/FE_Interpolate.h b/lib/atc/FE_Interpolate.h
index b9f7adac5..9e0b1388c 100644
--- a/lib/atc/FE_Interpolate.h
+++ b/lib/atc/FE_Interpolate.h
@@ -1,264 +1,263 @@
#ifndef FE_INTERPOLATE_H
#define FE_INTERPOLATE_H
-// ATC_Transfer headers
#include "MatrixLibrary.h"
#include "ATC_TypeDefs.h"
-using namespace std;
+#include <vector>
+#include <map>
namespace ATC {
- // Forward declarations
struct FE_Quadrature;
class FE_Element;
/**
* @class FE_Interpolate
* @brief Base class for computing shape functions, nested inside FE_Element
*/
class FE_Interpolate {
public:
FE_Interpolate(FE_Element *feElement);
virtual ~FE_Interpolate();
/** compute the quadrature for a given element type */
void set_quadrature(FeEltGeometry geo, FeIntQuadrature quad);
/** store N_ and dNdr_ (and eventually dNdrFace_) the given
* quadrature */
virtual void precalculate_shape_functions();
/** compute the shape functions at the given point;
* we use CLON_VECs */
virtual void compute_N(const VECTOR &point,
VECTOR &N) = 0;
// middle args get no names because they won't be used by some
// child classes.
/** compute the shape function derivatives at the given point;
* generic, so can work for 2D or 3D case */
virtual void compute_dNdr(const VECTOR &point,
const int,
const int,
const double,
DENS_MAT &dNdr) = 0;
/** compute both shape functions and derivatives, using the
* fastest, shortcuttiest methods available for batch use */
virtual void compute_N_dNdr(const VECTOR &point,
VECTOR &N,
DENS_MAT &dNdr) const = 0;
/** compute shape functions at a single point, given the local
* coordinates; eltCoords needed for derivatives:
* indexed: N(node)
* dN[nsd](node) */
virtual void shape_function(const VECTOR &xi,
DENS_VEC &N);
virtual void shape_function(const DENS_MAT &eltCoords,
const VECTOR &xi,
DENS_VEC &N,
DENS_MAT &dNdx);
virtual void shape_function_derivatives(const DENS_MAT &eltCoords,
const VECTOR &xi,
DENS_MAT &dNdx);
/** compute shape functions at all ip's:
* indexed: N(ip,node)
* dN[nsd](ip,node)
* weights(ip) */
virtual void shape_function(const DENS_MAT &eltCoords,
DENS_MAT &N,
- vector<DENS_MAT> &dN,
+ std::vector<DENS_MAT> &dN,
DIAG_MAT &weights);
/** compute shape functions at all face ip's:
* indexed: N(ip,node)
* dN[nsd](ip,node)
* n(ip,node)/Nn[nsd](ip,node)
* weights(ip) */
virtual void face_shape_function(const DENS_MAT &eltCoords,
const DENS_MAT &faceCoords,
const int faceID,
DENS_MAT &N,
DENS_MAT &n,
DIAG_MAT &weights);
virtual void face_shape_function(const DENS_MAT &eltCoords,
const DENS_MAT &faceCoords,
const int faceID,
DENS_MAT &N,
- vector<DENS_MAT> &dN,
- vector<DENS_MAT> &Nn,
+ std::vector<DENS_MAT> &dN,
+ std::vector<DENS_MAT> &Nn,
DIAG_MAT &weights);
/** compute unit normal vector for a face:
* indexed: N(ip,node)
* dN[nsd](ip,node)
* n(ip,node)/Nn[nsd](ip,node)
* weights(ip) */
virtual double face_normal(const DENS_MAT &faceCoords,
int ip,
DENS_VEC &normal);
/** compute tangents to coordinate lines
* indexed: */
virtual void tangents(const DENS_MAT &eltCoords,
const VECTOR &localCoords,
DENS_MAT &dxdr) const;
virtual void tangents(const DENS_MAT &eltCoords,
const VECTOR &localCoords,
- vector<DENS_VEC> &t,
+ std::vector<DENS_VEC> &t,
const bool normalize = false) const;
/** get number of ips in scheme */
int num_ips() const;
/** get number of ips per face */
int num_face_ips() const;
protected:
// owner element
FE_Element *feElement_;
// Number of dimensions
int nSD_;
- map<FeIntQuadrature,FE_Quadrature *> feQuadList_;
+ std::map<FeIntQuadrature,FE_Quadrature *> feQuadList_;
FE_Quadrature *feQuad_;
// matrix of shape functions at ip's: N_(ip, node)
DENS_MAT N_;
- vector<DENS_MAT> dNdr_;
+ std::vector<DENS_MAT> dNdr_;
// matrix of shape functions at ip's: N_(ip, node)
- vector<DENS_MAT> NFace_;
+ std::vector<DENS_MAT> NFace_;
// matrix of generic face shape function derivatives
- vector<vector<DENS_MAT> > dNdrFace_;
+ std::vector<std::vector<DENS_MAT> > dNdrFace_;
// matrix of generic face shape function derivatives
- vector<DENS_MAT> dNdrFace2D_;
+ std::vector<DENS_MAT> dNdrFace2D_;
};
/**********************************************
* Class for linear interpolation functions with
* Cartesian coordinates
**********************************************/
class FE_InterpolateCartLagrange : public FE_Interpolate {
public:
FE_InterpolateCartLagrange(FE_Element *feElement);
virtual ~FE_InterpolateCartLagrange();
virtual void compute_N(const VECTOR &point,
VECTOR &N);
virtual void compute_dNdr(const VECTOR &point,
const int numNodes,
const int nD,
const double,
DENS_MAT &dNdr);
virtual void compute_N_dNdr(const VECTOR &point,
VECTOR &N,
DENS_MAT &dNdr) const;
};
/**********************************************
* Class for linear elements with
* Cartesian coordinates
**********************************************/
class FE_InterpolateCartLin : public FE_Interpolate {
public:
FE_InterpolateCartLin(FE_Element *feElement);
virtual ~FE_InterpolateCartLin();
virtual void compute_N(const VECTOR &point,
VECTOR &N);
virtual void compute_dNdr(const VECTOR &point,
const int numNodes,
const int nD,
const double vol,
DENS_MAT &dNdr);
virtual void compute_N_dNdr(const VECTOR &point,
VECTOR &N,
DENS_MAT &dNdr) const;
};
/**********************************************
* Class for quadratic serendipity elements with
* Cartesian coordinates
**********************************************/
class FE_InterpolateCartSerendipity : public FE_Interpolate {
public:
FE_InterpolateCartSerendipity(FE_Element *feElement);
virtual ~FE_InterpolateCartSerendipity();
virtual void compute_N(const VECTOR &point,
VECTOR &N);
virtual void compute_dNdr(const VECTOR &point,
const int numNodes,
const int nD,
const double vol,
DENS_MAT &dNdr);
virtual void compute_N_dNdr(const VECTOR &point,
VECTOR &N,
DENS_MAT &dNdr) const;
};
/**********************************************
* Class for linear interpolation functions with
* volumetric coordinates
**********************************************/
class FE_InterpolateSimpLin : public FE_Interpolate {
public:
// "Simp"ly overrides all standard shape function methods
FE_InterpolateSimpLin(FE_Element *feElement);
virtual ~FE_InterpolateSimpLin();
virtual void compute_N(const VECTOR &point,
VECTOR &N);
// middle args get no names because they won't be used by some
// child classes.
virtual void compute_dNdr(const VECTOR &,
const int,
const int,
const double,
DENS_MAT &dNdr);
virtual void compute_N_dNdr(const VECTOR &point,
VECTOR &N,
DENS_MAT &dNdr) const;
};
}; // namespace ATC
#endif // FE_INTERPOLATE_H
diff --git a/lib/atc/FE_Mesh.cpp b/lib/atc/FE_Mesh.cpp
index 6a5e811c7..3dd00497d 100644
--- a/lib/atc/FE_Mesh.cpp
+++ b/lib/atc/FE_Mesh.cpp
@@ -1,3046 +1,3044 @@
// ATC header files
#include "FE_Element.h"
#include "FE_Mesh.h"
#include "LammpsInterface.h"
#include "ATC_Error.h"
#include "OutputManager.h"
#include "Utility.h"
#include <sstream>
#include <assert.h>
#include <algorithm>
#include <cmath>
#include <functional>
// Other headers
#include <iostream>
using namespace std;
using ATC_Utility::dbl_geq;
using ATC_Utility::parse_min;
using ATC_Utility::parse_max;
using ATC_Utility::parse_minmax;
using ATC_Utility::split_values;
using ATC_Utility::plane_coords;
using ATC_Utility::norm3;
using ATC_Utility::to_string;
namespace ATC {
// constants
const static double tangentTolerance = 0.01;
const static double tol = 1.0e-10;
// =============================================================
// class FE_Mesh
// =============================================================
FE_Mesh::FE_Mesh()
: decomposition_(false),
lammpsPartition_(false),
partitioned_(false),
nNodes_(0),
nNodesUnique_(0),
feElement_(NULL),
twoDimensional_(false),
hasPlanarFaces_(false)
{
}
// -------------------------------------------------------------
FE_Mesh::~FE_Mesh()
{
if (feElement_) delete feElement_;
}
// -------------------------------------------------------------
// modify
// -------------------------------------------------------------
bool FE_Mesh::modify(int narg, char **arg)
{
bool match = false;
if (strcmp(arg[0],"mesh")==0)
{
/*! \page man_mesh_create_faceset_box fix_modify AtC mesh create_faceset box
\section syntax
fix_modify AtC mesh create_faceset <id> box
<xmin> <xmax> <ymin> <ymax> <zmin> <zmax> <in|out> [units]
- <id> = id to assign to the collection of FE faces
- <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> = coordinates of
the bounding box that is coincident with the desired FE faces
- <in|out> = "in" gives inner faces to the box,
"out" gives the outer faces to the box
- units = option to specify real as opposed to lattice units
\section examples
<TT> fix_modify AtC mesh create_faceset obndy box -4.0 4.0 -12 12 -12 12 out </TT>
\section description
Command to assign an id to a set of FE faces.
\section restrictions
Only viable for rectangular grids.
\section related
\section default
The default options are units = lattice and the use of outer faces
*/
/*! \page man_mesh_create_faceset_plane fix_modify AtC mesh create_faceset plane
\section syntax
fix_modify AtC mesh create_faceset <id> plane
<x|y|z> <val1> <x|y|z> <lval2> <uval2> [units]
- <id> = id to assign to the collection of FE faces
- <x|y|z> = coordinate directions that define plane on which faceset lies
- <val1>,<lval2>,<uval2> = plane is specified as the x|y|z=val1 plane bounded by
the segments x|y|z = [lval2,uval2]
- units = option to specify real as opposed to lattice units
\section examples
<TT> fix_modify AtC mesh create_faceset xyplane plane y 0 x -4 0 </TT>
\section description
Command to assign an id to a set of FE faces.
\section restrictions
Only viable for rectangular grids.
\section related
\section default
The default option is units = lattice.
*/
if (strcmp(arg[1],"create_faceset")==0)
{
int argIdx = 2;
string tag = arg[argIdx++];
if (strcmp(arg[argIdx],"plane")==0)
{
argIdx++;
string n(arg[argIdx++]);
int idir = -1, isgn = 0;
int i2dir = -1, i3dir = -1;
double x2min = 0.0, x2max = 0.0, x3min = 0.0, x3max = 0.0;
string_to_index(n, idir, isgn);
double x = parse_minmax(arg[argIdx++]);
if (narg > argIdx ) {
if (string_to_index(arg[argIdx],i2dir)) {
argIdx++;
x2min = parse_min(arg[argIdx++]);
x2max = parse_max(arg[argIdx++]);
}
}
if (narg > argIdx ) {
if (string_to_index(arg[argIdx],i3dir)) {
argIdx++;
x3min = parse_min(arg[argIdx++]);
x3max = parse_max(arg[argIdx++]);
}
}
if (i2dir >= 0 &&
((i2dir == idir) || (i2dir == idir) || (i2dir == idir) ) )
{
throw ATC_Error( "inconsistent directions in create_faceset plane");
}
if (narg > argIdx && (strcmp(arg[argIdx++],"units") == 0))
{}
else
{
if (idir == 0) { x *= xscale_; }
else if (idir == 1) { x *= yscale_; }
else if (idir == 2) { x *= zscale_; }
if (i2dir >=0) {
if (i2dir == 0) { x2min *= xscale_; x2max *= xscale_; }
else if (i2dir == 1) { x2min *= yscale_; x2max *= yscale_; }
else if (i2dir == 2) { x2min *= zscale_; x2max *= zscale_; }
}
if (i3dir >=0) {
if (i3dir == 0) { x3min *= xscale_; x2max *= xscale_; }
else if (i3dir == 1) { x3min *= yscale_; x3max *= yscale_; }
else if (i3dir == 2) { x3min *= zscale_; x3max *= zscale_; }
}
}
if (i2dir >=0) {
create_faceset(tag, x, idir, isgn, i2dir, x2min, x2max,
i3dir, x3min, x3max);
}
else {
create_faceset(tag, x, idir, isgn);
}
match = true;
}
// bounding_box
else
{
if (strcmp(arg[argIdx],"box")==0) argIdx++;
double xmin = parse_min(arg[argIdx++]);
double xmax = parse_max(arg[argIdx++]);
double ymin = parse_min(arg[argIdx++]);
double ymax = parse_max(arg[argIdx++]);
double zmin = parse_min(arg[argIdx++]);
double zmax = parse_max(arg[argIdx++]);
bool outward = true;
if (narg > argIdx && (strcmp(arg[argIdx++],"in") == 0))
outward = false;
if (narg > argIdx && (strcmp(arg[argIdx++],"units") == 0)) {}
else
{ // scale from lattice units to physical units
xmin *= xscale_;
xmax *= xscale_;
ymin *= yscale_;
ymax *= yscale_;
zmin *= zscale_;
zmax *= zscale_;
}
create_faceset(tag, xmin, xmax, ymin, ymax, zmin, zmax, outward);
match = true;
}
}
/*! \page man_mesh_create_nodeset fix_modify AtC mesh create_nodeset
\section syntax
fix_modify AtC mesh create_nodeset <id>
<xmin> <xmax> <ymin> <ymax> <zmin> <zmax>
- <id> = id to assign to the collection of FE nodes
- <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> = coordinates of
the bounding box that contains only the desired nodes
\section examples
<TT> fix_modify AtC mesh create_nodeset lbc -12.1 -11.9 -12 12 -12 12 </TT>
\section description
Command to assign an id to a set of FE nodes to be used subsequently
in defining boundary conditions.
\section restrictions
- Only viable for rectangular grids.
\section related
\section default
Coordinates are assumed to be in lattice units.
*/
else if (strcmp(arg[1],"create_nodeset")==0) {
string tag = arg[2];
double xmin = parse_min(arg[3]);
double xmax = parse_max(arg[4]);
double ymin = parse_min(arg[5]);
double ymax = parse_max(arg[6]);
double zmin = parse_min(arg[7]);
double zmax = parse_max(arg[8]);
create_nodeset(tag, xmin, xmax, ymin, ymax, zmin, zmax);
match = true;
}
/*! \page man_mesh_add_to_nodeset fix_modify AtC mesh add_to_nodeset
\section syntax
fix_modify AtC mesh add_to_nodeset <id>
<xmin> <xmax> <ymin> <ymax> <zmin> <zmax>
- <id> = id of FE nodeset to be added to
- <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> = coordinates of
the bounding box that contains the desired nodes to be added
\section examples
<TT> fix_modify AtC mesh add_to_nodeset lbc -11.9 -11 -12 12 -12 12 </TT>
\section description
Command to add nodes to an already existing FE nodeset.
\section restrictions
- Only viable for rectangular grids.
\section related
\section default
Coordinates are assumed to be in lattice units.
*/
else if (strcmp(arg[1],"add_to_nodeset")==0) {
string tag = arg[2];
double xmin = parse_min(arg[3]);
double xmax = parse_max(arg[4]);
double ymin = parse_min(arg[5]);
double ymax = parse_max(arg[6]);
double zmin = parse_min(arg[7]);
double zmax = parse_max(arg[8]);
add_to_nodeset(tag, xmin, xmax, ymin, ymax, zmin, zmax);
match = true;
}
/*! \page man_mesh_create_elementset fix_modify AtC mesh create_elementset
\section syntax
fix_modify AtC create_elementset <id>
<xmin> <xmax> <ymin> <ymax> <zmin> <zmax>
- <id> = id to assign to the collection of FE element
- <xmin> <xmax> <ymin> <ymax> <zmin> <zmax> = coordinates of
the bounding box that contains only the desired elements
\section examples
<TT> fix_modify AtC mesh create_elementset middle -4.1 4.1 -100 100 -100 1100 </TT>
\section description
Command to assign an id to a set of FE elements to be used subsequently
in defining material and mesh-based operations.
\section restrictions
Only viable for rectangular grids.
\section related
\section default
Coordinates are assumed to be in lattice units.
*/
else if (strcmp(arg[1],"create_elementset")==0) {
string tag = arg[2];
double xmin = 0;
double xmax = 0;
double ymin = 0;
double ymax = 0;
double zmin = 0;
double zmax = 0;
if (narg > 4) {
xmin = parse_min(arg[3]);
xmax = parse_max(arg[4]);
ymin = parse_min(arg[5]);
ymax = parse_max(arg[6]);
zmin = parse_min(arg[7]);
zmax = parse_max(arg[8]);
}
else {
string regionName = arg[3];
LammpsInterface::instance()->
region_bounds(regionName.c_str(),xmin,xmax,ymin,ymax,zmin,zmax);
}
create_elementset(tag, xmin, xmax, ymin, ymax, zmin, zmax);
match = true;
}
/*! \page man_mesh_nodeset_to_elementset fix_modify AtC mesh nodeset_to_elementset
\section syntax
fix_modify AtC nodeset_to_elementset <nodeset_id> <elementset_id> <max/min>
- <nodeset_id> = id of desired nodeset from which to create elementset
- <elementset_id> = id to assign to the collection of FE element
- <max/min> = flag to choose either the maximal or minimal elementset
\section examples
<TT> fix_modify AtC mesh nodeset_to_elementset myNodeset myElementset min </TT>
\section description
Command to create an elementset from an existing nodeset. Either the minimal element set
of elements with all nodes in the set, or maximal element set with all elements with at
least one node in the set, can be created
\section restrictions
None.
\section related
\section default
Unless specified, the maximal element set is created
*/
else if (strcmp(arg[1],"nodeset_to_elementset")==0) {
string nodesetId = arg[2];
string elementsetId = arg[3];
set<int> elementSet;
if (narg < 5) {
this->nodeset_to_maximal_elementset(nodesetId,elementSet);
}
else {
if (strcmp(arg[4],"max")==0) {
this->nodeset_to_maximal_elementset(nodesetId,elementSet);
}
else if (strcmp(arg[4],"min")==0) {
this->nodeset_to_minimal_elementset(nodesetId,elementSet);
}
else {
return false;
}
}
elementSetMap_[elementsetId] = elementSet;
match = true;
}
/*! \page man_mesh_output fix_modify AtC mesh output
\section syntax
fix_modify AtC mesh output <file_prefix>
\section examples
<TT> fix_modify AtC mesh output meshData </TT> \n
\section description
Command to output mesh and associated data: nodesets, facesets, and
elementsets. This data is only output once upon initialization since
currently the mesh is static. Creates (binary, "gold" format) Ensight
output of mesh data.
\section restrictions
none
\section related
\section default
none
*/
else if (strcmp(arg[1],"output")==0) {
string outputPrefix = arg[2];
output(outputPrefix);
match = true;
}
}
return match;
}
// -------------------------------------------------------------
// initialize
// -------------------------------------------------------------
void FE_Mesh::initialize(void)
{
bool aligned = is_aligned();
if (!aligned) {
feElement_->set_projection_guess(CENTROID_LINEARIZED);
ATC::LammpsInterface::instance()->print_msg_once("WARNING: mesh is not aligned with the coordinate directions atom-to-element mapping will be expensive");
// if HEX8 -> orient();
}
bool twoD = is_two_dimensional();
if (twoD) {
feElement_->set_projection_guess(TWOD_ANALYTIC);
if (feElement_->order()< 3) hasPlanarFaces_ = true;
ATC::LammpsInterface::instance()->print_msg_once(" mesh is two dimensional");
}
}
//-----------------------------------------------------------------
//-----------------------------------------------------------------
void FE_Mesh::write_mesh(string meshFile)
{
ofstream out;
out.open(meshFile.c_str());
DENS_MAT & x = *(coordinates());
Array2D<int> & conn = *(connectivity());
int nNodes = x.nCols(); // transpose
int ndm = x.nRows();
int nElems = conn.nCols();
int nodesPerElem = conn.nRows(); // transpose
out << "Coordinates " << nNodes << "\n";
for (int n = 0; n < nNodes; n++) {
for (int i = 0; i < ndm; i++) {
out << " " << std::setprecision(16) << x(i,n);
}
out << "\n";
}
out << "\n";
string type = element_type();
out << "Elements " << nElems << " " << type << "\n";
for (int n = 0; n < nElems; n++) {
for (int i = 0; i < nodesPerElem; i++) {
out << 1+conn(i,n) << " ";
}
out << "\n";
}
out << "\n";
if (nodeSetMap_.size()) {
out << "Nodesets " << nodeSetMap_.size() <<"\n";
NODE_SET_MAP::const_iterator niter;
map<string,DENS_MAT> nodesets;
for (niter = nodeSetMap_.begin(); niter != nodeSetMap_.end(); niter++) {
string name = niter->first;
const set<int> & nset = niter->second;
out << name << " " << nset.size() << "\n";
set<int>::const_iterator iter;
for (iter = nset.begin(); iter != nset.end(); iter++) {
out << *iter << " " ;
}
out << "\n";
}
}
}
// -------------------------------------------------------------
// test whether almost structured
// -------------------------------------------------------------
bool FE_Mesh::is_aligned(void) const
{
vector<bool> foundBestMatch(nSD_,false);
vector<DENS_VEC> tangents(nSD_);
DENS_VEC xi0(nSD_);
xi0 = 0;
DENS_MAT eltCoords;
for (int ielem = 0; ielem < nElts_; ielem++) {
element_coordinates(ielem,eltCoords);
feElement_->tangents(eltCoords,xi0,tangents,true);
for (unsigned i = 0; i < tangents.size(); i++) {
// find maximum value for which global axis its closest to
int maxIndex = 0;
double maxValue = abs(tangents[i](0));
for (int j = 1; j < nSD_; j++) {
if (abs(tangents[i](j)) > maxValue) {
maxValue = abs(tangents[i](j));
maxIndex = j;
}
}
// make sure no other tangent is associated with this direction
if (foundBestMatch[maxIndex]) {
return false;
}
else {
foundBestMatch[maxIndex] = true;
}
// compute deviation from a perfectly aligned vector
double error = 0.;
for (int j = 1; j < nSD_; j++) {
if (j != maxIndex) {
error += abs(tangents[i](j));
}
}
error /= maxValue;
if (error > tangentTolerance) {
return false;
}
}
}
return true;
}
// -------------------------------------------------------------
// element_type
// -------------------------------------------------------------
string FE_Mesh::element_type(void) const {
int npe = feElement_->num_elt_nodes();
if (npe == 4) { return "TET4"; }
else if (npe == 8) { return "HEX8"; }
else if (npe == 20) { return "HEX20"; }
else if (npe == 27) { return "HEX27"; }
return "UNKNOWN";
}
// -------------------------------------------------------------
// element_coordinates
// -------------------------------------------------------------
void FE_Mesh::element_coordinates(const int eltID,
DENS_MAT & xCoords) const
{
const int nne = num_nodes_per_element();
xCoords.reset(nSD_, nne, false);
for (int inode=0; inode<nne; inode++) {
const int id = element_connectivity_global(eltID, inode);
for (int isd=0; isd<nSD_; isd++) {
xCoords(isd,inode) = nodalCoords_(isd,id);
}
}
}
// -------------------------------------------------------------
// position
// -------------------------------------------------------------
void FE_Mesh::position(const int eltID,
const VECTOR & xi,
DENS_VEC & x) const
{
const int nne = num_nodes_per_element();
DENS_VEC N;
feElement_->shape_function(xi,N);
x.reset(nSD_);
for (int inode=0; inode<nne; inode++) {
const int id = element_connectivity_global(eltID, inode);
for (int isd=0; isd<nSD_; isd++) {
x(isd) += nodalCoords_(isd,id)*N(inode);
}
}
}
// -------------------------------------------------------------
// element size in each direction
// -------------------------------------------------------------
void FE_Mesh::bounding_box(const int ielem,
DENS_VEC & xmin, DENS_VEC & xmax)
{
xmin.reset(nSD_);
xmax.reset(nSD_);
int nne = num_nodes_per_element();
for (int isd=0; isd<nSD_; isd++) {
int id = element_connectivity_global(ielem, 0);
double x = nodalCoords_(isd,id);
xmin(isd) = x;
xmax(isd) = x;
for (int inode=1; inode<nne; inode++) {
id = element_connectivity_global(ielem, inode);
x = nodalCoords_(isd,id);
xmin(isd) = min(xmin(isd), x );
xmax(isd) = max(xmax(isd), x );
}
}
}
// -------------------------------------------------------------
// element size in each direction
// -------------------------------------------------------------
void FE_Mesh::element_size(const int ielem,
double & hx, double & hy, double & hz)
{
DENS_VEC xmin(nSD_), xmax(nSD_);
bounding_box(ielem,xmin,xmax);
hx = xmax(0)-xmin(0);
hy = xmax(1)-xmin(1);
hz = xmax(2)-xmin(2);
}
// -------------------------------------------------------------
// face_coordinates
// -------------------------------------------------------------
void FE_Mesh::face_coordinates(const PAIR face, DENS_MAT & xCoords) const
{
const int eltID=face.first, faceID=face.second;
const int nnf = num_nodes_per_face();
const Array2D <int> & local_conn = local_face_connectivity();
xCoords.reset(nSD_, nnf, false);
for (int inode=0; inode < nnf; inode++)
{
int id = element_connectivity_global(eltID, local_conn(faceID,inode));
for (int isd=0; isd<nSD_; isd++)
xCoords(isd,inode) = nodalCoords_(isd,id);
}
}
// -------------------------------------------------------------
// nodal_coordinates
// -------------------------------------------------------------
DENS_VEC FE_Mesh::nodal_coordinates(const int nodeID) const
{
DENS_VEC xCoords(nSD_, false);
const int id = uniqueToGlobalMap_(nodeID);
for (int isd=0; isd<nSD_; isd++)
xCoords(isd) = nodalCoords_(isd, id);
return xCoords;
}
DENS_VEC FE_Mesh::global_coordinates(const int nodeID) const
{
DENS_VEC xCoords(nSD_, false);
for (int isd=0; isd<nSD_; isd++)
xCoords(isd) = nodalCoords_(isd, nodeID);
return xCoords;
}
// -------------------------------------------------------------
// query_nodeset
// -------------------------------------------------------------
bool FE_Mesh::query_nodeset(const string & name) const
{
if (name == "all") return true;
if (nodeSetMap_.find(name) == nodeSetMap_.end()) return false;
return true;
}
// -------------------------------------------------------------
// get_nodeset
// -------------------------------------------------------------
const set<int> & FE_Mesh::nodeset(const string & name) const
{
NODE_SET_MAP::const_iterator iter = nodeSetMap_.find(name);
if (name == "all") return nodeSetAll_;
else if (iter == nodeSetMap_.end())
throw ATC_Error( "No nodeset with name " + name + " found.");
else return iter->second;
}
// -------------------------------------------------------------
// get_elementset
// -------------------------------------------------------------
const set<int> & FE_Mesh::elementset(const string & name) const
{
NODE_SET_MAP::const_iterator iter = elementSetMap_.find(name);
if (name == "all") return elementSetAll_;
else if (iter == elementSetMap_.end())
throw ATC_Error( "No elementset with name " + name + " found.");
else return iter->second;
}
// -------------------------------------------------------------
// nodeset_to_minimal_elementset
// -------------------------------------------------------------
void FE_Mesh::nodeset_to_minimal_elementset
(const string & name, set<int> & elemSet) const
{
if (name == "all") {
for (int ielem = 0; ielem < nElts_; ielem++) {
elemSet.insert(ielem);
}
}
else {
NODE_SET_MAP::const_iterator iter = nodeSetMap_.find(name);
if (iter == nodeSetMap_.end())
throw ATC_Error( "No nodeset with name " + name + " found.");
nodeset_to_minimal_elementset(iter->second,elemSet);
if (elemSet.size()==0) {
throw ATC_Error("No elements found in minimal condensation of nodeset " + name);
}
}
}
// -------------------------------------------------------------
// nodeset_to_minimal_elementset
// -------------------------------------------------------------
void FE_Mesh::nodeset_to_minimal_elementset
(const set<int> & nodeSet, set<int> & elemSet) const
{
int npe = num_nodes_per_element();
for (int ielem=0; ielem < nElts_; ielem++) {
int inode = 0;
bool in = true;
while (in && inode < npe) {
int node = element_connectivity_unique(ielem, inode);
set<int>::const_iterator iter = nodeSet.find(node);
if (iter == nodeSet.end()) { in=false; }
inode++;
}
if (in) elemSet.insert(ielem);
}
}
// -------------------------------------------------------------
// nodeset_to_maximal_elementset
// -------------------------------------------------------------
void FE_Mesh::nodeset_to_maximal_elementset(const string &name, set<int> &elemSet) const
{
if (name == "all") {
for (int ielem = 0; ielem < nElts_; ielem++) {
elemSet.insert(ielem);
}
}
else {
NODE_SET_MAP::const_iterator iter = nodeSetMap_.find(name);
if (iter == nodeSetMap_.end())
throw ATC_Error( "No nodeset with name " + name + " found.");
nodeset_to_maximal_elementset(iter->second,elemSet);
if (elemSet.size()==0) {
throw ATC_Error("No elements found in maximal condensation of nodeset " + name);
}
}
}
// -------------------------------------------------------------
// nodeset_to_maximal_elementset
// -------------------------------------------------------------
void FE_Mesh::nodeset_to_maximal_elementset(const set<int> &nodeSet, set<int> &elemSet) const
{
int npe = num_nodes_per_element();
for (int ielem = 0; ielem < nElts_; ielem++) {
int inode = 0;
bool in = false;
while (!in && inode < npe) {
int node = element_connectivity_unique(ielem, inode);
set<int>::const_iterator iter = nodeSet.find(node);
if (iter != nodeSet.end()) { in = true; }
inode++;
}
if (in) elemSet.insert(ielem);
}
}
// -------------------------------------------------------------
// elementset_to_nodeset
// -------------------------------------------------------------
void FE_Mesh::elementset_to_nodeset
(const set<int> & elemSet, set<int> & nodeSet) const
{
int npe = num_nodes_per_element();
set<int>::const_iterator itr;
for (itr = elemSet.begin(); itr != elemSet.end(); itr++)
{
int ielem = *itr;
for (int inode=0; inode < npe; inode++)
{
int node = element_connectivity_global(ielem, inode);
nodeSet.insert(node);
}
}
}
// -------------------------------------------------------------
// elementset_to_nodeset
// -------------------------------------------------------------
void FE_Mesh::elementset_to_nodeset
(const string & name, set<int> & nodeSet) const
{
if (name == "all")
for (int ielem = 0; ielem < nElts_; ielem++)
nodeSet.insert(ielem);
else
{
ELEMENT_SET_MAP::const_iterator iter = elementSetMap_.find(name);
if (iter == elementSetMap_.end())
throw ATC_Error( "No elementset with name " + name + " found.");
int npe = num_nodes_per_element();
const set<int> &elemSet = iter->second;
set<int>::const_iterator itr;
for (itr = elemSet.begin(); itr != elemSet.end(); itr++)
{
int ielem = *itr;
for (int inode=0; inode < npe; inode++)
{
int node = element_connectivity_unique(ielem, inode);
nodeSet.insert(node);
inode++;
}
}
}
}
// -------------------------------------------------------------
// elementset_to_minimal_nodeset
// -------------------------------------------------------------
void FE_Mesh::elementset_to_minimal_nodeset
(const string & name, set<int> & nodeSet) const
{
// return: set - complement_of_set
if (name == "all") { return;}
else
{
elementset_to_nodeset(name,nodeSet);
set<int> compElemSet;
elementset_complement(name,compElemSet);
int npe = num_nodes_per_element();
set<int>::const_iterator itr;
for (itr = compElemSet.begin(); itr != compElemSet.end(); itr++)
{
int ielem = *itr;
for (int inode=0; inode < npe; inode++)
{
int node = element_connectivity_unique(ielem, inode);
nodeSet.erase(node);
inode++;
}
}
}
}
// -------------------------------------------------------------
// elementset_complement
// -------------------------------------------------------------
void FE_Mesh::elementset_complement
(const string & name, set<int> & cElemSet) const
{
// return: set - complement_of_set
if (name == "all") { return;}
else
{
ELEMENT_SET_MAP::const_iterator iter = elementSetMap_.find(name);
if (iter == elementSetMap_.end())
throw ATC_Error( "No elementset with name " + name + " found.");
const set<int> &elemSet = iter->second;
for (int ielem = 0; ielem < nElts_; ielem++)
{
if(elemSet.find(ielem) == elemSet.end() ) cElemSet.insert(ielem);
}
}
}
// -------------------------------------------------------------
// elementset_complement
// -------------------------------------------------------------
void FE_Mesh::elementset_complement
(const set<int> & elemSet, set<int> & cElemSet) const
{
for (int ielem = 0; ielem < nElts_; ielem++)
{
if(elemSet.find(ielem) == elemSet.end() ) cElemSet.insert(ielem);
}
}
// -------------------------------------------------------------
// faceset_to_nodeset
// -------------------------------------------------------------
void FE_Mesh::faceset_to_nodeset(const string &name, set<int> &nodeSet) const
{
if (name == "all") {
for (int inode = 0; inode < nNodesUnique_; inode++)
nodeSet.insert(inode);
}
else
{
FACE_SET_MAP::const_iterator faceset = faceSetMap_.find(name);
if (faceset == faceSetMap_.end())
throw ATC_Error( "No faceset with name " + name + " found.");
const set<PAIR> & faceSet = faceset->second;
set<PAIR>::const_iterator iter;
Array <int> conn;
for (iter = faceSet.begin(); iter != faceSet.end(); iter++)
{
PAIR face = *iter;
face_connectivity_unique(face,conn);
for (int i = 0; i < conn.size() ; ++i) {
int inode = conn(i);
nodeSet.insert(inode);
}
}
}
}
void FE_Mesh::faceset_to_nodeset(const set<PAIR> &faceSet, set<int> &nodeSet) const
{
set<PAIR>::const_iterator iter;
Array <int> conn;
for (iter = faceSet.begin(); iter != faceSet.end(); iter++)
{
PAIR face = *iter;
face_connectivity_unique(face,conn);
for (int i = 0; i < conn.size() ; ++i) {
int inode = conn(i);
nodeSet.insert(inode);
}
}
}
// -------------------------------------------------------------
// faceset_to_nodeset
// -------------------------------------------------------------
void FE_Mesh::faceset_to_nodeset_global(const string &name, set<int> &nodeSet) const
{
if (name == "all") {
for (int inode = 0; inode < nNodes_; inode++)
nodeSet.insert(inode);
}
else
{
FACE_SET_MAP::const_iterator faceset = faceSetMap_.find(name);
if (faceset == faceSetMap_.end())
throw ATC_Error( "No faceset with name " + name + " found.");
const set<PAIR> & faceSet = faceset->second;
set<PAIR>::const_iterator iter;
Array <int> conn;
for (iter = faceSet.begin(); iter != faceSet.end(); iter++)
{
PAIR face = *iter;
face_connectivity(face,conn);
for (int i = 0; i < conn.size() ; ++i) {
int inode = conn(i);
nodeSet.insert(inode);
}
}
}
}
void FE_Mesh::faceset_to_nodeset_global(const set<PAIR> &faceSet, set<int> &nodeSet) const
{
set<PAIR>::const_iterator iter;
Array <int> conn;
for (iter = faceSet.begin(); iter != faceSet.end(); iter++)
{
PAIR face = *iter;
face_connectivity(face,conn);
for (int i = 0; i < conn.size() ; ++i) {
int inode = conn(i);
nodeSet.insert(inode);
}
}
}
// -------------------------------------------------------------
// get_faceset
// -------------------------------------------------------------
const set<PAIR> &FE_Mesh::faceset(const string & name) const
{
FACE_SET_MAP::const_iterator iter = faceSetMap_.find(name);
if (iter == faceSetMap_.end())
{
throw ATC_Error( "No faceset with name " + name + " found.");
}
return iter->second;
}
// -------------------------------------------------------------
// create_nodeset
// -------------------------------------------------------------
void FE_Mesh::create_nodeset(const string & name,
const set<int> & nodeSet)
{
// Make sure we don't already have a nodeset with this name
NODE_SET_MAP::iterator iter = nodeSetMap_.find(name);
if (iter != nodeSetMap_.end()) {
string message("A nodeset with name " + name + " is already defined.");
throw ATC_Error( message);
}
nodeSetMap_[name] = nodeSet;
if (ATC::LammpsInterface::instance()->rank_zero()) {
stringstream ss;
ss << "created nodeset " << name
<< " with " << nodeSet.size() << " nodes";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
}
void FE_Mesh::create_nodeset(const string & name,
double xmin,
double xmax,
double ymin,
double ymax,
double zmin,
double zmax)
{
// Make sure we don't already have a nodeset with this name
NODE_SET_MAP::iterator iter = nodeSetMap_.find(name);
if (iter != nodeSetMap_.end()) {
string message("A nodeset with name " + name + " is already defined.");
throw ATC_Error( message);
}
if (xmin == xmax) split_values(xmin,xmax);
if (ymin == ymax) split_values(ymin,ymax);
if (zmin == zmax) split_values(zmin,zmax);
xmin *= xscale_;
xmax *= xscale_;
ymin *= yscale_;
ymax *= yscale_;
zmin *= zscale_;
zmax *= zscale_;
set<int> nodeSet;
// Loop over nodes and add their unique id's to the set if they're
// in the correct range
for (int inode = 0; inode < nNodes_; inode++) {
double x = nodalCoords_(0,inode);
double y = nodalCoords_(1,inode);
double z = nodalCoords_(2,inode);
if ( (xmin <= x) && (x <= xmax) &&
(ymin <= y) && (y <= ymax) &&
(zmin <= z) && (z <= zmax) ) {
int uid = globalToUniqueMap_(inode);
nodeSet.insert(uid);
}
}
if (nodeSet.size() == 0) {
string message("nodeset " + name + " has zero size.");
throw ATC_Error( message);
}
nodeSetMap_[name] = nodeSet;
if (ATC::LammpsInterface::instance()->rank_zero()) {
stringstream ss;
ss << "created nodeset " << name
<< " with " << nodeSet.size() << " nodes";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
}
// -------------------------------------------------------------
// add_to_nodeset
// -------------------------------------------------------------
void FE_Mesh::add_to_nodeset(const string & name,
double xmin,
double xmax,
double ymin,
double ymax,
double zmin,
double zmax)
{
// Make sure we already have a nodeset with this name
NODE_SET_MAP::iterator iter = nodeSetMap_.find(name);
if (iter == nodeSetMap_.end()) {
string message("A nodeset with name " +name + " is not already defined.");
throw ATC_Error( message);
}
if (xmin == xmax) split_values(xmin,xmax);
if (ymin == ymax) split_values(ymin,ymax);
if (zmin == zmax) split_values(zmin,zmax);
xmin *= xscale_;
xmax *= xscale_;
ymin *= yscale_;
ymax *= yscale_;
zmin *= zscale_;
zmax *= zscale_;
set<int> nodeSet;
// Loop over nodes and add their unique id's to the set if they're
// in the correct range
for (int inode = 0; inode < nNodes_; inode++) {
double x = nodalCoords_(0,inode);
double y = nodalCoords_(1,inode);
double z = nodalCoords_(2,inode);
if ( (xmin <= x) && (x <= xmax) &&
(ymin <= y) && (y <= ymax) &&
(zmin <= z) && (z <= zmax) ) {
int uid = globalToUniqueMap_(inode);
nodeSet.insert(uid);
}
}
if (nodeSet.size() == 0) {
string message("nodeset " + name + " has zero size.");
throw ATC_Error( message);
}
nodeSetMap_[name].insert(nodeSet.begin(),nodeSet.end());
if (ATC::LammpsInterface::instance()->rank_zero()) {
stringstream ss;
ss << "added " << nodeSet.size() << " nodes to nodeset " << name ;
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
}
// -------------------------------------------------------------
// create_faceset
// -------------------------------------------------------------
void FE_Mesh::create_faceset(const string & name,
double xmin,
double xmax,
double ymin,
double ymax,
double zmin,
double zmax,
bool outward)
{
// Make sure we don't already have a nodeset with this name
FACE_SET_MAP::iterator iter = faceSetMap_.find(name);
if (iter != faceSetMap_.end())
throw ATC_Error( "A faceset with name " + name + " is already defined.");
if (xmin == xmax) split_values(xmin,xmax);
if (ymin == ymax) split_values(ymin,ymax);
if (zmin == zmax) split_values(zmin,zmax);
set<PAIR> faceSet;
// Loop over face and add their unique id's to the set if they concide
// with region
const int nf = num_faces_per_element();
const int npf = num_nodes_per_face();
const Array2D<int> & face_conn = local_face_connectivity();
for (int ielem = 0; ielem < nElts_; ielem++)
{
for (int iface = 0; iface < nf; iface++)
{
bool in = true;
bool on_xmin = true, on_xmax = true;
bool on_ymin = true, on_ymax = true;
bool on_zmin = true, on_zmax = true;
bool x_neg = false, x_pos = false;
bool y_neg = false, y_pos = false;
bool z_neg = false, z_pos = false;
double x,y,z;
for (int inode = 0; inode < npf; inode++)
{
x = nodalCoords_(0,connectivity_(face_conn(iface,inode),ielem));
y = nodalCoords_(1,connectivity_(face_conn(iface,inode),ielem));
z = nodalCoords_(2,connectivity_(face_conn(iface,inode),ielem));
if ( x + tol < xmin) { in = false; break; }
if ( x - tol > xmax) { in = false; break; }
if ( y + tol < ymin) { in = false; break; }
if ( y - tol > ymax) { in = false; break; }
if ( z + tol < zmin) { in = false; break; }
if ( z - tol > zmax) { in = false; break; }
on_xmin = on_xmin && fabs(x-xmin) <= tol;
on_xmax = on_xmax && fabs(x-xmax) <= tol;
on_ymin = on_ymin && fabs(y-ymin) <= tol;
on_ymax = on_ymax && fabs(y-ymax) <= tol;
on_zmin = on_zmin && fabs(z-zmin) <= tol;
on_zmax = on_zmax && fabs(z-zmax) <= tol;
}
if (in) {
// note based on structured grid
if (outward)
{
if (on_xmin && iface==0) { x_neg = true;}
if (on_xmax && iface==1) { x_pos = true;}
if (on_ymin && iface==2) { y_neg = true;}
if (on_ymax && iface==3) { y_pos = true;}
if (on_zmin && iface==4) { z_neg = true;}
if (on_zmax && iface==5) { z_pos = true;}
}
else
{
if (on_xmin && iface==1) { x_pos = true;}
if (on_xmax && iface==0) { x_neg = true;}
if (on_ymin && iface==3) { y_pos = true;}
if (on_ymax && iface==2) { y_neg = true;}
if (on_zmin && iface==5) { z_pos = true;}
if (on_zmax && iface==4) { z_neg = true;}
}
if ( (x_neg || x_pos) || (y_neg || y_pos) || (z_neg || z_pos) ) {
PAIR face(ielem,iface);
faceSet.insert(face);
}
}
}
}
if (faceSet.empty()) throw ATC_Error( "faceset "+name+" is empty.");
faceSetMap_[name] = faceSet;
if (ATC::LammpsInterface::instance()->comm_rank() == 0) {
stringstream ss;
ss << "created faceset " << name
<< " with " << faceSet.size() << " faces";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
}
void FE_Mesh::create_faceset(const string & name,
double xRef,
int nIdx, int nSgn,
int nIdx2, double x2lo, double x2hi,
int nIdx3, double x3lo, double x3hi)
{
// note scaling done by caller and split_values is tricky with orientation
// Make sure we don't already have a faceset with this name
FACE_SET_MAP::iterator iter = faceSetMap_.find(name);
if (iter != faceSetMap_.end())
throw ATC_Error( "A faceset with name "+name+" is already defined.");
bool finite2 = (nIdx2 >= 0);
bool finite3 = (nIdx3 >= 0);
set<PAIR> faceSet;
// Loop over faces i& add unique id's to the set if concide w/ plane
int nf = num_faces_per_element();
int npf = num_nodes_per_face();
const Array2D<int> & face_conn = local_face_connectivity();
for (int ielem = 0; ielem < nElts_; ielem++)
{
for (int iface = 0; iface < nf; iface++)
{
bool in = true;
// all nodes must be on the plane
for (int inode = 0; inode < npf; inode++) {
int node = connectivity_(face_conn(iface,inode),ielem);
double x = nodalCoords_(nIdx,node);
if ( fabs(x-xRef) > tol){ in = false; break;}
if (finite2) {
double y = nodalCoords_(nIdx2,node);
if ( y < x2lo || y > x2hi){ in = false; break;}
}
if (finite3) {
double y = nodalCoords_(nIdx3,node);
if ( y < x3lo || y > x3hi){ in = false; break;}
}
}
// check correct orientation
if (in)
{
if ( (nIdx == 0 && iface==0 && nSgn == -1)
|| (nIdx == 0 && iface==1 && nSgn == 1)
|| (nIdx == 1 && iface==2 && nSgn == -1)
|| (nIdx == 1 && iface==3 && nSgn == 1)
|| (nIdx == 2 && iface==4 && nSgn == -1)
|| (nIdx == 3 && iface==5 && nSgn == 1) )
{
PAIR face(ielem,iface);
faceSet.insert(face);
}
}
}
}
if (faceSet.empty())
throw ATC_Error( "faceset "+name+" is empty.");
faceSetMap_[name] = faceSet;
if (ATC::LammpsInterface::instance()->comm_rank() == 0) {
stringstream ss;
ss << "created faceset " << name
<< " with " << faceSet.size() << " faces";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
}
// -------------------------------------------------------------
// create_elementset
// -------------------------------------------------------------
void FE_Mesh::create_elementset(const string & name,
double xmin,
double xmax,
double ymin,
double ymax,
double zmin,
double zmax)
{
// Make sure we don't already have a elementset with this name
ELEMENT_SET_MAP::iterator iter = elementSetMap_.find(name);
if (iter != elementSetMap_.end()) {
string message("An elementset with name "+name+" is already defined.");
throw ATC_Error( message);
}
if (xmin == xmax) split_values(xmin,xmax);
if (ymin == ymax) split_values(ymin,ymax);
if (zmin == zmax) split_values(zmin,zmax);
xmin *= xscale_;
xmax *= xscale_;
ymin *= yscale_;
ymax *= yscale_;
zmin *= zscale_;
zmax *= zscale_;
set<int> nodeSet;
// Loop over nodes and add their unique id's to the set if they're
// in the correct range
for (int inode = 0; inode < nNodes_; inode++) {
double x = nodalCoords_(0,inode);
double y = nodalCoords_(1,inode);
double z = nodalCoords_(2,inode);
if ( (xmin <= x) && (x <= xmax) &&
(ymin <= y) && (y <= ymax) &&
(zmin <= z) && (z <= zmax) ) {
int uid = globalToUniqueMap_(inode);
nodeSet.insert(uid);
}
}
if (nodeSet.size() == 0) {
string message("elementset " + name + " has zero size.");
throw ATC_Error( message);
}
// create a minimal element set from all the nodes included in the region
set<int> elemSet;
int npe = num_nodes_per_element();
for (int ielem=0; ielem < nElts_; ielem++)
{
int inode = 0;
bool in = true;
while (in && inode < npe)
{
int node = connectivityUnique_(inode, ielem);
set<int>::const_iterator iter = nodeSet.find(node);
if (iter == nodeSet.end()) { in=false; }
inode++;
}
if (in) elemSet.insert(ielem);
}
if (elemSet.size() == 0) {
string message("element set " + name + " has zero size.");
throw ATC_Error( message);
}
elementSetMap_[name] = elemSet;
if (ATC::LammpsInterface::instance()->comm_rank() == 0) {
stringstream ss;
ss << "created elementset " << name
<< " with " << elemSet.size() << " elements";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
}
// -------------------------------------------------------------
// get_numIPsPerElement()
// -------------------------------------------------------------
int FE_Mesh::num_ips_per_element() const
{
return feElement_->num_ips();
}
// -------------------------------------------------------------
// get_numNodesPerElement()
// -------------------------------------------------------------
int FE_Mesh::num_nodes_per_element() const
{
return feElement_->num_elt_nodes();
}
// -------------------------------------------------------------
// get_numFacesPerElement()
// -------------------------------------------------------------
int FE_Mesh::num_faces_per_element() const
{
return feElement_->num_faces();
}
// -------------------------------------------------------------
// get_num_ips_per_face()
// -------------------------------------------------------------
int FE_Mesh::num_ips_per_face() const
{
return feElement_->num_face_ips();
}
// -------------------------------------------------------------
// get_num_nodes_per_face()
// -------------------------------------------------------------
int FE_Mesh::num_nodes_per_face() const
{
return feElement_->num_face_nodes();
}
// -------------------------------------------------------------
// mappings from element id to associated nodes
// -------------------------------------------------------------
void FE_Mesh::element_connectivity_global(const int eltID,
Array<int> & nodes) const
{
const int npe = num_nodes_per_element();
nodes.reset(npe);
// use connectivity arrays
if (decomposition_ && partitioned_) {
for (int inode = 0; inode < npe; inode++) {
nodes(inode) = myConnectivity_(inode, map_elem_to_myElem(eltID));
}
} else {
for (int inode = 0; inode < npe; inode++) {
nodes(inode) = connectivity_(inode, eltID);
}
}
}
// -------------------------------------------------------------
//
// -------------------------------------------------------------
void FE_Mesh::element_connectivity_unique(const int eltID,
Array<int> & nodes) const
{
const int npe = num_nodes_per_element();
nodes.reset(npe);
// use connectivity arrays
if (decomposition_ && partitioned_) {
for (int inode = 0; inode < npe; inode++) {
nodes(inode) = myConnectivityUnique_(inode, map_elem_to_myElem(eltID));
}
} else {
for (int inode = 0; inode < npe; inode++) {
nodes(inode) = connectivityUnique_(inode, eltID);
}
}
}
// -------------------------------------------------------------
//
// -------------------------------------------------------------
int FE_Mesh::element_connectivity_global(const int eltID,
const int inode) const
{
if (decomposition_ && partitioned_) {
return myConnectivity_(inode, map_elem_to_myElem(eltID));
} else {
return connectivity_(inode, eltID);
}
}
// -------------------------------------------------------------
//
// -------------------------------------------------------------
int FE_Mesh::element_connectivity_unique(const int eltID,
const int inode) const
{
if (decomposition_ && partitioned_) {
return myConnectivityUnique_(inode, map_elem_to_myElem(eltID));
} else {
return connectivityUnique_(inode, eltID);
}
}
// -------------------------------------------------------------
//
// -------------------------------------------------------------
AliasArray<int> FE_Mesh::element_connectivity_global(const int eltID) const
{
if (decomposition_ && partitioned_) {
return myConnectivity_.column(map_elem_to_myElem(eltID));
} else {
return connectivity_.column(eltID);
}
}
// -------------------------------------------------------------
//
// -------------------------------------------------------------
AliasArray<int> FE_Mesh::element_connectivity_unique(const int eltID) const
{
if (decomposition_ && partitioned_) {
return myConnectivityUnique_.column(map_elem_to_myElem(eltID));
} else {
return connectivityUnique_.column(eltID);
}
}
// -------------------------------------------------------------
// local_face_connectivity()
// -------------------------------------------------------------
const Array2D<int> &FE_Mesh::local_face_connectivity() const
{
return feElement_->local_face_conn();
}
// -------------------------------------------------------------
// maps to/from partitioned element data
// -------------------------------------------------------------
int FE_Mesh::map_elem_to_myElem(int elemID) const
{
return elemToMyElemMap_.at(elemID);
}
int FE_Mesh::map_myElem_to_elem(int myElemID) const
{
return myElts_[myElemID];
}
// -------------------------------------------------------------
// shape function evaluation
// -------------------------------------------------------------
// set quadrature scheme pass-through
void FE_Mesh::set_quadrature(FeIntQuadrature type)
{
feElement_->set_quadrature(type);
}
// shape function evaluation
void FE_Mesh::shape_functions(const VECTOR &x,
DENS_VEC &N,
Array<int> &nodeList) const
{
// get element id from global coordinates
int eltID = map_to_element(x);
// call appropriate function below, with eltID
shape_functions(x,eltID,N,nodeList);
}
void FE_Mesh::shape_functions(const DENS_VEC &x,
DENS_VEC &N,
DENS_MAT &dNdx,
Array<int> &nodeList) const
{
// get element id from global coordinates
int eltID = map_to_element(x);
// call appropriate function below, with eltID
shape_functions(x,eltID,N,dNdx,nodeList);
}
void FE_Mesh::shape_functions(const VECTOR &x,
const int eltID,
DENS_VEC &N,
Array<int> &nodeList) const
{
// Get element node coordinates from mesh
DENS_MAT eltCoords;
element_coordinates(eltID, eltCoords);
// pass through call
feElement_->shape_function(eltCoords,x,N);
// determine nodes which correspond to shape function indices
element_connectivity_unique(eltID,nodeList);
}
void FE_Mesh::shape_functions(const DENS_VEC &x,
const int eltID,
DENS_VEC &N,
DENS_MAT &dNdx,
Array<int> &nodeList) const
{
// Get element node coordinates from mesh
DENS_MAT eltCoords;
element_coordinates(eltID,eltCoords);
// pass through call
feElement_->shape_function(eltCoords,x,N,dNdx);
// determine nodes which correspond to shp function indices
element_connectivity_unique(eltID,nodeList);
}
void FE_Mesh::shape_function_derivatives(const DENS_VEC &x,
const int eltID,
DENS_MAT &dNdx,
Array<int> &nodeList) const
{
// Get element node coordinates from mesh
DENS_MAT eltCoords;
element_coordinates(eltID,eltCoords);
// pass through call
feElement_->shape_function_derivatives(eltCoords,x,dNdx);
// determine nodes which correspond to shp function indices
element_connectivity_unique(eltID,nodeList);
}
void FE_Mesh::shape_function(const int eltID,
DENS_MAT &N,
DIAG_MAT &weights) const
{
// unused data (but required to calc weights)
vector<DENS_MAT> dN;
// call below function with dN to avoid duplicated code
shape_function(eltID,N,dN,weights);
}
void FE_Mesh::shape_function(int eltID,
DENS_MAT &N,
vector<DENS_MAT> &dN,
DIAG_MAT &weights) const
{
// Get element node coordinates from mesh
DENS_MAT eltCoords;
element_coordinates(eltID,eltCoords);
// pass through call
feElement_->shape_function(eltCoords,N,dN,weights);
}
void FE_Mesh::face_shape_function(const PAIR &face,
DENS_MAT &N,
DENS_MAT &n,
DIAG_MAT &weights) const
{
int eltID = face.first;
int faceID = face.second;
// Get element node coordinates from mesh
DENS_MAT eltCoords;
element_coordinates(eltID,eltCoords);
// pass through call
feElement_->face_shape_function(eltCoords,faceID,N,n,weights);
}
void FE_Mesh::face_shape_function(const PAIR &face,
DENS_MAT &N,
vector<DENS_MAT> &dN,
vector<DENS_MAT> &Nn,
DIAG_MAT &weights) const
{
int eltID = face.first;
int faceID = face.second;
// Get element node coordinates from mesh
DENS_MAT eltCoords;
element_coordinates(eltID,eltCoords);
// pass through call
feElement_->face_shape_function(eltCoords,faceID,N,dN,Nn,weights);
}
double FE_Mesh::face_normal(const PAIR &face,
int ip,
DENS_VEC &normal) const
{
int eltID = face.first;
int faceID = face.second;
// Get element node coordinates from mesh
DENS_MAT eltCoords;
element_coordinates(eltID,eltCoords);
// pass through call
double J = feElement_->face_normal(eltCoords,faceID,ip,normal);
return J;
}
//-----------------------------------------------------------------------
void FE_Mesh::output(string prefix) const
{
set<int> otypes;
otypes.insert(ENSIGHT);
otypes.insert(FULL_GNUPLOT);
OutputManager meshSets(prefix,otypes);
meshSets.write_geometry(&nodalCoords_, & connectivity_);
OUTPUT_LIST subsetData;
int size = nNodesUnique_;
// material
// DENS_MAT material(nNodes_,1);
// material = 1;
// subsetData["material"] = &material;
//string name = "global_to_unique_map";
// nodesets
NODE_SET_MAP::const_iterator niter;
map<string,DENS_MAT> nodesets;
for (niter = nodeSetMap_.begin(); niter != nodeSetMap_.end(); niter++) {
string name = niter->first;
const set<int> & nset = niter->second;
string nodeset = "nodeset_"+name;
nodesets[nodeset].reset(size,1);
set<int>::const_iterator iter;
for (iter = nset.begin(); iter != nset.end(); iter++) {
(nodesets[nodeset])(*iter,0) = 1;
}
subsetData[nodeset] = & nodesets[nodeset];
}
// facesets
FACE_SET_MAP::const_iterator fiter;
map<string,DENS_MAT> facesets;
for (fiter = faceSetMap_.begin(); fiter != faceSetMap_.end(); fiter++) {
string name = fiter->first;
string faceset = "faceset_"+name;
facesets[faceset].reset(size,1);
set<int> nset;
faceset_to_nodeset(name,nset);
set<int>::const_iterator iter;
for (iter = nset.begin(); iter != nset.end(); iter++) {
(facesets[faceset])(*iter,0) = 1;
}
subsetData[faceset] = & facesets[faceset];
}
// elementsets
ELEMENT_SET_MAP::const_iterator eiter;
map<string,DENS_MAT> elemsets;
for (eiter = elementSetMap_.begin();eiter != elementSetMap_.end();eiter++) {
string name = eiter->first;
const set<int> & eset = eiter->second;
string elemset = "elementset_"+name;
elemsets[elemset].reset(size,1);
set<int>::const_iterator iter;
for (iter = eset.begin(); iter != eset.end(); iter++) {
Array<int> nodes;
element_connectivity_unique(*iter, nodes);
for(int i = 0; i < nodes.size(); ++i) {
(elemsets[elemset])(nodes(i),0) = 1;
}
}
subsetData[elemset] = & elemsets[elemset];
}
// output
const int * map = globalToUniqueMap_.data();
if (subsetData.size() > 0 )
meshSets.write_data(0.0,&subsetData,map);
else
if (LammpsInterface::instance()->comm_rank() == 0) {
stringstream ss;
ss << "Warning mesh output requested without any mesh entities, output suppressed";
ATC::LammpsInterface::instance()->print_msg(ss.str());
}
}
bool FE_Mesh::is_owned_elt(int elt) const
{
return (find(myElts_.begin(), myElts_.end(), elt) != myElts_.end());
}
// -------------------------------------------------------------
// -------------------------------------------------------------
// class FE_3DMesh
// -------------------------------------------------------------
// -------------------------------------------------------------
FE_3DMesh::FE_3DMesh(const string elementType,
const int nNodes,
const int nElements,
const Array2D<int> *connectivity,
const DENS_MAT *nodalCoordinates,
const Array<bool> periodicity,
const Array< pair< string, set<int> > > *nodeSets):
FE_Mesh(),
minEltSize_(0),
tree_(NULL)
{
// Pick which element class to make
if (elementType == "HEX8") {
feElement_ = new FE_ElementHex(8,4,2);
} else if (elementType == "HEX20") {
feElement_ = new FE_ElementHex(20,8,3);
} else if (elementType == "HEX27") {
feElement_ = new FE_ElementHex(27,9,3);
} else if (elementType == "TET4") {
feElement_ = new FE_ElementTet(4,3,2);
hasPlanarFaces_ = true;
} else {
throw ATC_Error("Unrecognized element type specified.");
}
nSD_ = 3;
nNodes_ = nNodes;
nNodesUnique_ = nNodes;
nElts_ = nElements;
xscale_ = yscale_ = zscale_ = 1;
periodicity_ = periodicity;
// Connectivity and coordinates describe the mesh geometry.
connectivity_.reset(connectivity->nRows(),connectivity->nCols());
connectivity_ = (*connectivity);
nodalCoords_.reset(nodalCoordinates->nRows(),nodalCoordinates->nCols());
nodalCoords_ = (*nodalCoordinates);
// set minimum element size
minEltSize_ = 1.e20;
for (int i=0; i< connectivity_.nCols(); ++i) {
int n1 = connectivity_(0,i);
int n2 = connectivity_(1,i);
double dx[3] = {fabs(nodalCoords_(0,n1)-nodalCoords_(0,n2)),
fabs(nodalCoords_(1,n1)-nodalCoords_(1,n2)),
fabs(nodalCoords_(2,n1)-nodalCoords_(2,n2))};
minEltSize_ = min(minEltSize_,norm3(dx));
}
// create global-unique maps
coordTol_ = this->coordinate_tolerance();
setup_periodicity();
// Create the "all" elementset, the "all" nodeset, and the read-in nodesets.
for (int elem = 0; elem < nElts_; elem++) elementSetAll_.insert(elem);
for (int node = 0; node < nNodesUnique_; node++) nodeSetAll_.insert(node);
const Array<pair<string,set<int> > > & sets = *nodeSets;
for (int nodeSet = 0; nodeSet < sets.size(); ++nodeSet) {
const set<int> & nset = sets(nodeSet).second;
set<int> copy;
if (compactRemap_.size() > 0) {
for (set<int>::iterator itr = nset.begin(); itr != nset.end(); itr++) {
copy.insert(globalToUniqueMap_(compactRemap_(*itr)));
}
}
else {
for (set<int>::iterator itr = nset.begin(); itr != nset.end(); itr++) {
copy.insert(globalToUniqueMap_(*itr));
}
}
create_nodeset(sets(nodeSet).first, copy);
}
// Insert nodes and elements into KD-tree for PIE search.
if (tree_ == NULL) {
tree_ = KD_Tree::create_KD_tree(feElement_->num_elt_nodes(), nNodes_,
&nodalCoords_, nElts_, connectivity_);
}
}
FE_3DMesh::~FE_3DMesh() {
//if (tree_) delete tree_;
// not sure why, commenting out for now - JZ 2/28/13
}
// -------------------------------------------------------------
// setup_periodicity
// -------------------------------------------------------------
void FE_3DMesh::setup_periodicity(double tol)
{
// unique <-> global id maps
globalToUniqueMap_.reset(nNodes_);
uniqueToGlobalMap_.reset(nNodes_);
for (int node = 0; node < nNodes_; node++) {
globalToUniqueMap_(node) = node;
}
// recursive fix and setup global to unique map
if (periodicity_(2)) { fix_periodicity(3); }
if (periodicity_(1)) { fix_periodicity(2); }
if (periodicity_(0)) { fix_periodicity(1); }
// renumber to compact unique numbering
// unique nodes map to the same id with global to unique
if (nNodesUnique_ < nNodes_) {
int n = 0;
int m = nNodesUnique_;
compactRemap_.reset(nNodes_); // old to new global numbering
compactRemap_ = -1;
for (int node = 0; node < nNodes_; node++) {
if (globalToUniqueMap_(node) == node) { // unique nodes
compactRemap_(node) = n++;
}
else { // periodic nodes
compactRemap_(node) = m++;
}
}
if (n != nNodesUnique_) throw ATC_Error("didn't compact numbering");
int npe = num_nodes_per_element();
// temporary copy
DENS_MAT coor = DENS_MAT(nodalCoords_);
Array2D<int> conn(connectivity_);
Array<int> oldGlobalToUniqueMap = globalToUniqueMap_;
for (int node = 0; node < nNodes_; node++) {
// unique = remap * global2unique global
globalToUniqueMap_(compactRemap_(node)) = compactRemap_(oldGlobalToUniqueMap(node));
if (compactRemap_(node) < 0) throw ATC_Error("mis-map to compact numbering");
// swap coordinates
for (int i = 0; i < nSD_; i++) {
nodalCoords_(i,compactRemap_(node)) = coor(i,node);
}
}
for (int elem = 0; elem < nElts_; elem++) {
for (int i = 0; i < npe; i++) {
connectivity_(i,elem) = compactRemap_(conn(i,elem));
}
}
}
for (int node = 0; node < nNodes_; node++) {
uniqueToGlobalMap_(globalToUniqueMap_(node)) = node;
}
set_unique_connectivity();
//amended_ = true; // would always be true since setup_always called
}
void FE_3DMesh::fix_periodicity(int idir)
{
set<int> topNodes,botNodes;
int ntop = find_boundary_nodes( idir,topNodes);
int nbot = find_boundary_nodes(-idir,botNodes);
if (ntop != nbot)
throw ATC_Error("can't fix periodicity, number of top and bottom nodes are different ");
bool match = match_nodes(idir,topNodes,botNodes,globalToUniqueMap_);
if (!match) {
stringstream ss;
ss << "can't match periodic nodes with tolerance " << coordTol_;
throw ATC_Error(ss.str());
}
}
int FE_3DMesh::find_boundary_nodes(int idir, set<int> & nodes)
{
nodes.clear();
double limit = 0;
int idm = abs(idir)-1;
DENS_MAT & x = nodalCoords_;
if (idir > 0) limit = x.row_max(idm);
else limit = x.row_min(idm);
for (int i=0; i < x.nCols(); ++i) {
double xi = x(idm,i);
if (fabs(xi-limit) < coordTol_) nodes.insert(i);
}
// stringstream ss;
// ss << "found " << nodes.size() << " nodes at x_" << abs(idir) << "= "<< limit ;
// ATC::LammpsInterface::instance()->print_msg_once(ss.str());
return nodes.size();
}
bool FE_3DMesh::match_nodes(int idir, set<int> & nodes1, set<int> & nodes2,
Array<int> & map)
{
int i1=0,i2=1;
plane_coords(idir-1,i1,i2);
vector<bool> found(nNodes_,false);
DENS_MAT & x = nodalCoords_;
for (set<int>::iterator it1=nodes1.begin(); it1 != nodes1.end(); it1++) {
int n1 = *it1;
double x1 = x(i1,n1);
double x2 = x(i2,n1);
for (set<int>::iterator it2=nodes2.begin(); it2 != nodes2.end(); it2++) {
int n2 = *it2;
if (!found[n2]) {
double y1 = x(i1,n2);
double y2 = x(i2,n2);
if (fabs(x1-y1) < coordTol_ && fabs(x2-y2) < coordTol_) {
map(n1) = n2;
found[n2] = true;
// coincidence
x(i1,n2) = x1;
x(i2,n2) = x2;
}
}
}
if (map(n1) == n1) return false;
}
nNodesUnique_ -= nodes1.size();
stringstream ss;
ss << "condensed " << nodes1.size() << " periodic nodes in the " << abs(idir) << " direction";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
return true;
}
void FE_3DMesh::set_unique_connectivity(void)
{
int numEltNodes = feElement_->num_elt_nodes();
connectivityUnique_.reset(numEltNodes, nElts_);
uniqueNodeToElementMap_.reset(nNodes_);
for (int node = 0; node < nNodes_; node++) {
uniqueNodeToElementMap_(node) = vector<int>();
}
for (int elem = 0; elem < nElts_; elem++) {
for (int node = 0; node < numEltNodes; node++) {
int global_node = connectivity_(node, elem);
int unique_node = globalToUniqueMap_(global_node);
connectivityUnique_(node,elem) = unique_node;
uniqueNodeToElementMap_(unique_node).push_back(elem);
}
}
}
// orient the local coordinate with the global one
bool FE_3DMesh::orient(int idm)
{
int numEltNodes = feElement_->num_elt_nodes();
if (numEltNodes != 8) throw ATC_Error("can't currently orient non HEX8 elements");
DENS_MAT x;
for (int elem = 0; elem < nElts_; elem++) {
element_coordinates(elem,x);
double xmax = x.row_max(idm);
double xmin = x.row_min(idm);
set<int> top,bot;
for (int node = 0; node < numEltNodes; node++) {
// find top nodes
if ((x(idm,node) - xmax) < coordTol_) top.insert(node);
// find bottom nodes
else if ((x(idm,node) - xmin) < coordTol_) bot.insert(node);
else return false;
}
// order by rh rule
// start with one
}
throw ATC_Error("not completely implemented function: FE_3DMesh::orient");
return true;
}
// -------------------------------------------------------------
// amend mesh for cut at specified faces
// -------------------------------------------------------------
void FE_3DMesh::cut_mesh(const set<PAIR> & faceSet, const set<int> & nodeSet)
{
int nsd = nSD_;
// get all nodes to create an old to new number map
set<int> dupNodes;
map<int,int> oldToNewMap;
faceset_to_nodeset_global(faceSet,dupNodes);
// remove edge nodes
Array<int> & node_map = globalToUniqueMap_;
set<int>::const_iterator itr;
for (itr = dupNodes.begin(); itr != dupNodes.end(); itr++) {
int gnode = *itr;
int unode = node_map(gnode);
if (nodeSet.find(unode) != nodeSet.end()) {
dupNodes.erase(gnode);
}
}
int nNodesAdded = dupNodes.size();
// copy coordinates and nodemap
DENS_MAT &coordinates = nodalCoords_;
int nNodesNew = coordinates.nCols() + nNodesAdded;
coordinates.resize(nsd,nNodesNew,true);
node_map.resize(nNodesNew,true);
// add duplicate coordinates
int iNew = nNodes_;
int iNewUnique = nNodesUnique_;
for (itr = dupNodes.begin(); itr != dupNodes.end();
itr++,iNew++) {
int iOld = *itr;
oldToNewMap[iOld] = iNew; // global ids
if (iOld == node_map(iOld)) { // non-image atom
node_map(iNew) = iNewUnique++;
} else {
node_map(iNew) = -1;
}
for(int j = 0; j < nsd; j++) {
coordinates(j,iNew) = coordinates(j,iOld);
}
}
nNodes_ = iNew;
nNodesUnique_ = iNewUnique;
for (itr = dupNodes.begin(); itr != dupNodes.end();
itr++,iNew++) {
int iOld = *itr;
iNew = oldToNewMap[iOld]; // global ids
int iOldImage = node_map(iOld);
if (iOld != iOldImage) { // image atom
int iNewImage = oldToNewMap[iOldImage];
node_map(iNew) = node_map(iNewImage);
}
}
// update element connectivities
const int nnf = num_nodes_per_face();
const Array2D <int> & local_conn = feElement_->local_face_conn();
set< PAIR >::iterator iter;
for (iter = faceSet.begin(); iter != faceSet.end(); iter++)
{
PAIR face = *iter;
int eltID=face.first, faceID=face.second;
for (int inode=0; inode < nnf; inode++) {
int lid = local_conn(faceID,inode);
int id = connectivity_(lid, eltID);
if (oldToNewMap.find(id) != oldToNewMap.end() ) {
int new_id = (*oldToNewMap.find(id)).second;
connectivity_(lid,eltID) = new_id;
connectivityUnique_(lid, eltID) = node_map(new_id);
}
}
}
}
// -------------------------------------------------------------
// amend mesh for deleted elements
// -------------------------------------------------------------
void FE_3DMesh::delete_elements(const set<int> &elementList)
{
int nPE = num_nodes_per_element();
set<int> elementsNew;
elementset_complement(elementList,elementsNew);
int nElementsNew = elementsNew.size();
set<int> newToOld;
map<int,int> oldToNewMap;
elementset_to_nodeset(elementsNew,newToOld);
int nNodesNew = newToOld.size();
set<int>::const_iterator itr;
// coordinates & node map (from nodes to data)
const DENS_MAT &coordinates = nodal_coordinates();
const Array<int> & node_map = global_to_unique_map();
DENS_MAT *newCoords = new DENS_MAT(nSD_,nNodesNew);
Array<int> *newNodeMap = new Array<int> (nNodesNew);
Array2D<int> * newConnectivity = new Array2D<int>(nPE,nElementsNew);
int k = 0, i = 0;
for (itr = newToOld.begin(); itr != newToOld.end(); itr++) {
int node = *itr;
oldToNewMap[node] = i++;
(*newNodeMap)(k) = node_map(node);
for(int j = 0; j < nSD_; j++) {
(*newCoords)(j,k) = coordinates(j,node);
}
k++;
}
// nNodes_ = nNodesNew; ???
// connectivity
k = 0;
for (itr = elementsNew.begin(); itr != elementsNew.end(); itr++) {
int ielem = *itr;
for(int j = 0; j < nPE; j++) {
int old_node = connectivity_(j,ielem);
map<int,int>::iterator map_itr = oldToNewMap.find(old_node);
if (map_itr == oldToNewMap.end()) {
stringstream ss;
ss << "map failure " << old_node << "\n";
ATC::LammpsInterface::instance()->print_msg(ss.str());
}
int node = map_itr->second;
(*newConnectivity)(j,k) = node;
}
k++;
}
delete newCoords;
delete newNodeMap;
delete newConnectivity;
}
// -------------------------------------------------------------
// partition_mesh
// -------------------------------------------------------------
void FE_3DMesh::partition_mesh()
{
if (lammpsPartition_) {
lammps_partition_mesh();
}
if (partitioned_) return;
int nProcs, myrank;
MPI_Comm_size(MPI_COMM_WORLD, &nProcs); // get the number of processors
MPI_Comm_rank(MPI_COMM_WORLD, &myrank); // get the current processor's rank
// use the KD tree for partitioning, getting more blocks than
// processors
if (tree_ == NULL) {
tree_ = KD_Tree::create_KD_tree(feElement_->num_elt_nodes(),
nNodes_, &nodalCoords_,
nElts_, connectivity_);
}
// Get the divisions of the elements from the KD-tree.
int depth = ceil(log(nProcs)/log(2));
// In order to make sure there are enough divisions to evenly
// divide between all processors, we get the next-highest
// power of 2.
vector<vector<int> > procEltLists = tree_->getElemIDs(depth);
int numEltLists = procEltLists.size();
// Make sure the KD tree is behaving as expected.
assert(numEltLists >= nProcs);
// If the KD-tree was not able to return enough divisions,
// duplicate the largest list.
// elements, then the division would be more even.
vector<vector<int> >::iterator it;
if (numNonempty(procEltLists) < nProcs) {
// Find the list of maximum size and assign it to empty processors
vector<int> maxSizeList (0);
for (it = procEltLists.begin(); it != procEltLists.end(); ++it) {
if (it->size() > maxSizeList.size())
maxSizeList.assign(it->begin(), it->end());
}
for (it = procEltLists.begin(); it != procEltLists.end(); ++it) {
if (it->empty()) {
if (numNonempty(procEltLists) >= nProcs) break;
it->assign(maxSizeList.begin(), maxSizeList.end());
}
}
}
// We will store the owning processor for each element.
int * eltToOwners = new int[nElts_];
for (int i = 0; i < nElts_; ++i) {
eltToOwners[i] = -1; // -1 here means the element is unowned.
}
// Prune elements that appear on more than one processor.
// Simultaneously fill in the ownership array.
prune_duplicate_elements( procEltLists, eltToOwners);
// If we have more lists than processors, get rid of the
// extras and redistribute their elements.
if (numNonempty(procEltLists) > nProcs) {
redistribute_extra_proclists(procEltLists, eltToOwners, nProcs);
}
// Sort the lists so that the fuller ones are in the front.
sort(procEltLists.begin(), procEltLists.end(), vectorCompSize);
// Assign each processor a list of elements.
myElts_ = procEltLists[myrank];
//mesh_distribute(eltStartIDs);
delete[] eltToOwners;
// We should do nodes later.
if (decomposition_) distribute_mesh_data();
partitioned_ = true;
}
void FE_3DMesh::departition_mesh()
{
if (!partitioned_) return;
partitioned_ = false;
}
void FE_3DMesh::prune_duplicate_elements(vector<vector<int> > & procEltLists,
int * eltToOwners)
{
int procID = 0;
vector<vector<int> >::iterator topIt;
vector<int> * conflictingProc;
vector<int>::iterator it, toErase;
for (topIt = procEltLists.begin(); topIt != procEltLists.end(); ++topIt) {
// Simultaneously fill in eltToOwners and prune, if an element
// appears on multiple processors.
for (it = topIt->begin(); it != topIt->end(); ++it) {
// If the element has no corresponding processor in eltToOwners,
// record it as belonging to processor *it.
if (eltToOwners[*it] == -1) {
eltToOwners[*it] = procID;
}
else {
// If it does have a processor in eltToOwners, then we need
// to remove it from either processor *topIt or from the processor
// listed in eltToOwners. We discriminate based on size.
conflictingProc = &(procEltLists[eltToOwners[*it]]);
if (conflictingProc->size() <= procEltLists[procID].size()) {
// Delete element from processor *topIt, if it has more elements.
it = topIt->erase(it);
--it;
}
else {
// Delete element from conflicting processor otherwise.
toErase = find(conflictingProc->begin(), conflictingProc->end(), *it);
conflictingProc->erase(toErase);
eltToOwners[*it] = procID;
}
}
}
++procID;
}
}
// -------------------------------------------------------------
// lammps_partition_mesh
// -------------------------------------------------------------
void FE_3DMesh::lammps_partition_mesh()
{
if (LammpsInterface::instance()->domain_triclinic()) {
LammpsInterface::instance()->print_msg_once("Cannot use lammps partitioning, domain is triclinic");
return;
}
LammpsInterface::instance()->print_msg_once("Warning: Using native lammps partitioning");
double xlo, xhi, ylo, yhi, zlo, zhi;
double boxxlo, boxxhi, boxylo, boxyhi, boxzlo, boxzhi;
LammpsInterface::instance()->sub_bounds(xlo, xhi, ylo, yhi, zlo, zhi);
LammpsInterface::instance()->box_bounds(boxxlo, boxxhi, boxylo, boxyhi, boxzlo, boxzhi);
myElts_.clear();
double xCent, yCent, zCent;
// Assign elements to processors based on the centroid of the element.
int numNodes = num_nodes_per_element();
for (int i = 0; i < nElts_; ++i)
{
xCent = 0.0;
yCent = 0.0;
zCent = 0.0;
for (int j = 0; j < numNodes; ++ j)
{
xCent += nodalCoords_(0, connectivity_(j,i));
yCent += nodalCoords_(1, connectivity_(j,i));
zCent += nodalCoords_(2, connectivity_(j,i));
}
xCent /= numNodes;
yCent /= numNodes;
zCent /= numNodes;
if (xCent < boxxlo) xCent = boxxlo;
if (xCent < boxxhi) xCent = boxxhi;
if (yCent < boxylo) yCent = boxylo;
if (yCent < boxyhi) yCent = boxyhi;
if (zCent < boxzlo) zCent = boxzlo;
if (zCent < boxzhi) zCent = boxzhi;
if ( dbl_geq(xCent, xlo) &&
((xhi == boxxhi) || !dbl_geq(xCent, xhi)) &&
dbl_geq(yCent, ylo) &&
((yhi == boxyhi) || !dbl_geq(yCent, yhi)) &&
dbl_geq(zCent, zlo) &&
((zhi == boxzhi) || !dbl_geq(zCent, zhi))) {
myElts_.push_back(i);
}
}
// if decomposing add in myAtomElts list based on nodal locations, i.e., all elements with a local node
// myElts: for FE assembly
// myAndGhost : for atom ops like restrict
if (decomposition_) {
set<int> elms;
vector<int>::const_iterator itr;
for (itr=myElts_.begin(); itr!=myElts_.end(); itr++) {elms.insert(*itr); }
set<int> nodes;
elementset_to_nodeset(elms,nodes);
elms.clear();
nodeset_to_maximal_elementset(nodes,elms);
myAndGhostElts_.clear();
set<int>::const_iterator iter;
for (iter=elms.begin(); iter!=elms.end(); iter++)
{myAndGhostElts_.push_back(*iter);}
distribute_mesh_data();
}
partitioned_ = true;
return;
}
void FE_3DMesh::redistribute_extra_proclists(vector<vector<int> > &procEltLists,
int *eltToOwners, int nProcs)
{
DENS_MAT faceAdjacencies(nElts_, num_faces_per_element());
faceAdjacencies = -1; // Set all values to -1, indicating uninitialized/uncalculated
int currentElt, adjacentElt, procID;
// Put all of the hobos onto one master list, allHomelessElts.
list<int> allHomelessElts;
vector<int> oneHomelessList;
vector<vector<int> >::iterator current;
int nHoboLists = numNonempty(procEltLists) - nProcs;
for (int i = 0; i < nHoboLists; ++i) {
current = min_element(procEltLists.begin(), procEltLists.end(), vectorCompSize);
oneHomelessList = *current;
allHomelessElts.insert(allHomelessElts.end(),
oneHomelessList.begin(), oneHomelessList.end());
current->clear();
}
// Make sure the hobos lose their association with their old processor.
list<int>::iterator it;
for (it = allHomelessElts.begin(); it != allHomelessElts.end(); it++){
eltToOwners[*it] = -1;
}
// Figure out which elements the hobos are adjacent to. That way, they
// will know what processors they can be redistributed to.
compute_face_adjacencies(allHomelessElts, faceAdjacencies);
// Place homeless elements onto lists that correspond to actual processors.
while (!allHomelessElts.empty()) {
currentElt = allHomelessElts.back();
// This will store the ID of the processor with the fewest elements
// so far that has an element adjacent to currentElt.
PAIR smallestProc(-1, INT_MAX);
// Iterate over the faces, check the processors of adjacent elements,
// and slate the element to go on the adjacent processor with the fewest
// elements.
for (int localFaceID = 0; localFaceID < num_faces_per_element(); ++localFaceID) {
adjacentElt = faceAdjacencies(currentElt, localFaceID);
// This means that there is no adjacency through this face.
if (adjacentElt >= nElts_) continue;
procID = eltToOwners[adjacentElt];
// The procID > -1 check makes sure we're not adjacent to another
// homeless element by this face, in which case it won't have a
// processor to put currentElt onto yet.
if (procID > -1 && ((int) procEltLists[procID].size()) < smallestProc.second) {
smallestProc = PAIR(procID, procEltLists[procID].size());
}
}
allHomelessElts.pop_back();
// If we couldn't find an adjacent element that had a processor,
// skip for now and come back to it later.
if (smallestProc.first == -1) {
allHomelessElts.push_front(currentElt);
}
// Otherwise, put it onto the processor with the fewest elements that
// we found.
else {
procEltLists[smallestProc.first].push_back(currentElt);
eltToOwners[currentElt] = smallestProc.first;
}
}
}
void FE_3DMesh::compute_face_adjacencies(const list<int> &elts,
DENS_MAT &faceAdjacencies)
{
list<int>::const_iterator cit;
for (cit = elts.begin(); cit != elts.end(); ++cit) {
// For each element, look at ever face, get the nodes on that face,
// and find out which elements are in the intersection of elements
// containing that node. Those two elements are adjacent, and we
// mark it as such in the faceAdjacencies array.
for (int localFaceID = 0; localFaceID < num_faces_per_element(); ++localFaceID) {
Array<int> faceNodes;
face_connectivity(PAIR(*(cit), localFaceID), faceNodes);
// Put the first node's elements into the accumulator to start.
vector<int> vIntersect = uniqueNodeToElementMap_(faceNodes(0));
vector<int> vCurrent;
// set_intersect requires a vector large enough to contain the
// max possible intersect, which cannot be larger than the entirety
// of the first vector involved.
vector<int> vTemp(vIntersect.size(), -1);
// Find the intersection of each of the nodes' element vectors.
for (int ithOnFace = 1; ithOnFace < num_nodes_per_face(); ++ithOnFace) {
vCurrent = uniqueNodeToElementMap_(faceNodes(ithOnFace)); // Vector of elements for this node
set_intersection(vCurrent.begin(), vCurrent.end(),
vIntersect.begin(), vIntersect.end(), vTemp.begin());
vIntersect = vTemp;
// Because we initialized the vector to be larger than necessary, maybe,
// we remove all of the meaningless values used in initialization.
while (vIntersect.back() == -1)
vIntersect.pop_back();
vTemp.clear();
vTemp.resize(vIntersect.size(),-1);
}
// This means there is an adjacent face, since there
// are two elements sharing all of the nodes on the face.
if (vIntersect.size() == 2) {
// We want to choose the element id of NOT the current
// element to be listed as the adjacency.
// well, but that requires more complicated memoization and
// this doesn't take much extra time.
if (*cit == vIntersect[0]) {
faceAdjacencies(*cit, localFaceID) = vIntersect[1];
}
else {
faceAdjacencies(*cit, localFaceID) = vIntersect[0];
}
}
// This means the element is on the border.
else if (vIntersect.size() == 1) {
faceAdjacencies(*cit, localFaceID) = INT_MAX;
}
else {
// This should never ever happen! The nodes should at least
// share one element, since they are all on one face!
// There should also never be more than two elements on the
// same face... that would defy mathematics and physics in
// every way.
}
}
}
}
// Sometimes we want to count the number of vectors that actually
// have stuff in them. We use this.
int FE_3DMesh::numNonempty(vector<vector<int> > & v)
{
int result = 0;
vector<vector<int> >::iterator it;
for (it = v.begin(); it != v.end(); ++it){
if (!(it->empty())){
result++;
}
}
return result;
}
int FE_3DMesh::map_to_element(const DENS_VEC &query) const
{
DENS_MAT eltCoords;
vector<int> candidates = tree_->find_nearest(query);
vector<int> matches = vector<int>();
// Search through each of the nearest elements
for (vector<int>::iterator elem = candidates.begin();
elem < candidates.end(); elem++) {
if (contains_point(*elem, query)) {
matches.push_back(*elem); // Keep track of the elements
// which contain it
}
}
// Return the index of the parent element which does contain the point
if (matches.size() == 1) { // x is conclusively in a single element
return matches[0];
} else if (matches.size() == 0) { // not so much
throw ATC_Error("FE_3DMesh::map_to_element could not find an element");
} else { // definitely not so much
throw ATC_Error("FE_3DMesh::map_to_element found multiple elements");
}
}
bool FE_3DMesh::contains_point(const int eltID,
const DENS_VEC &x) const
{
DENS_MAT eltCoords;
element_coordinates(eltID, eltCoords);
return feElement_->contains_point(eltCoords, x);
}
//-----------------------------------------------------------------------
void FE_3DMesh::distribute_mesh_data()
{
myNElts_ = myElts_.size();
//create elemToMyElemMap_
elemToMyElemMap_.clear();
for (int myID = 0; myID < myNElts_; ++myID) {
int baseID = myElts_[myID];
elemToMyElemMap_[baseID] = myID;
}
// create myConnectivity_, myConnectivityUnique_
int numEltNodes = feElement_->num_elt_nodes();
myConnectivity_.reset(numEltNodes, myNElts_);
myConnectivityUnique_.reset(numEltNodes, myNElts_);
for (int elem = 0; elem < myNElts_; ++elem) {
for (int node = 0; node < numEltNodes; ++node) {
myConnectivity_(node,elem) = connectivity_(node,map_myElem_to_elem(elem));
myConnectivityUnique_(node,elem) = connectivityUnique_(node,map_myElem_to_elem(elem));
}
}
}
// -------------------------------------------------------------
// -------------------------------------------------------------
// class FE_Rectangular3DMesh
// -------------------------------------------------------------
// -------------------------------------------------------------
FE_Rectangular3DMesh::FE_Rectangular3DMesh(
const Array<double> & hx,
const Array<double> & hy,
const Array<double> & hz,
const double xmin, const double xmax,
const double ymin, const double ymax,
const double zmin, const double zmax,
const Array<bool> periodicity,
const double xscale,
const double yscale,
const double zscale)
: hx_(hx), hy_(hy), hz_(hz)
{
hasPlanarFaces_ = true;
xscale_ = xscale;
yscale_ = yscale;
zscale_ = zscale;
borders_[0][0] = xmin;
borders_[0][1] = ymin;
borders_[0][2] = zmin;
borders_[1][0] = xmax;
borders_[1][1] = ymax;
borders_[1][2] = zmax;
L_[0] = xmax-xmin;
L_[1] = ymax-ymin;
L_[2] = zmax-zmin;
n_[0] = hx_.size();
n_[1] = hy_.size();
n_[2] = hz_.size();
// Compute region size and element size
double Lx = 0;
for (int i = 0; i < n_[0]; ++i) { Lx += hx_(i); }
double Ly = 0;
for (int i = 0; i < n_[1]; ++i) { Ly += hy_(i); }
double Lz = 0;
for (int i = 0; i < n_[2]; ++i) { Lz += hz_(i); }
// rescale to fit box
double ax = L_[0]/Lx;
for (int i = 0; i < n_[0]; ++i) { hx_(i) *= ax; }
double ay = L_[1]/Ly;
for (int i = 0; i < n_[1]; ++i) { hy_(i) *= ay; }
double az = L_[2]/Lz;
for (int i = 0; i < n_[2]; ++i) { hz_(i) *= az; }
// fill node locations
nSD_ = 3;
x_.reserve(nSD_);
for (int i = 0; i < nSD_; ++i) {x_.push_back(Array<double>(n_[i]+1)); }
Array<double> & xI = x_[0];
xI(0) = xmin;
for (int i = 0; i < n_[0]; ++i) { xI(i+1) = xI(i)+hx_(i); }
Array<double> & yI = x_[1];
yI(0) = ymin;
for (int i = 0; i < n_[1]; ++i) { yI(i+1) = yI(i)+hy_(i); }
Array<double> & zI = x_[2];
zI(0) = zmin;
for (int i = 0; i < n_[2]; ++i) { zI(i+1) = zI(i)+hz_(i); }
// Member data setup
nElts_ = n_[0] * n_[1] * n_[2];
nNodes_ = (n_[0]+1) * (n_[1]+1) * (n_[2]+1);
periodicity_ = Array<bool>(periodicity);
feElement_ = new FE_ElementRect();
nodalCoords_.reset(3, nNodes_);
connectivity_.reset(feElement_->num_elt_nodes(), nElts_);
// Fill nodal coordinates
double x[3] = {xmin,ymin,zmin};
int inode = 0;
for (int k = 0; k <= n_[2]; ++k) {
for (int j = 0; j <= n_[1]; ++j) {
for (int i = 0; i <= n_[0]; ++i) {
for (int m = 0; m < 3; ++m) {
nodalCoords_(m,inode) = x[m];
}
++inode;
if (i < n_[0]) x[0] += hx_(i);
}
if (j < n_[1]) x[1] += hy_(j);
x[0] = xmin;
}
if (k < n_[2]) x[2] += hz_(k);
x[1] = ymin;
}
// Compute element connectivities
int ielt = 0;
int noffx = 1;
int noffy = n_[0] + 1;
int noffz = (n_[0]+1) * (n_[1]+1);
for (int k = 0; k < n_[2]; ++k) {
for (int j = 0; j < n_[1]; ++j) {
for (int i = 0; i < n_[0]; ++i) {
int i1 = i + j*noffy + k*noffz;
connectivity_(0,ielt) = i1;
connectivity_(1,ielt) = i1 + noffx;
connectivity_(2,ielt) = i1 + noffx + noffy;
connectivity_(3,ielt) = i1 + noffy;
connectivity_(4,ielt) = i1 + noffz;
connectivity_(5,ielt) = i1 + noffx + noffz;
connectivity_(6,ielt) = i1 + noffx + noffy + noffz;
connectivity_(7,ielt) = i1 + noffy + noffz;
++ielt;
}
}
}
setup_periodicity();
}
// -------------------------------------------------------------
// partition_mesh
// -------------------------------------------------------------
void FE_Rectangular3DMesh::partition_mesh()
{
if (lammpsPartition_) {
lammps_partition_mesh();
}
if (partitioned_) return;
// Currently this code has been rather naively copied from
// FE_Uniform3DMesh::partition_mesh()
// Determine dimensions of mesh in order to partition according to largest dimension.
double xmin = borders_[0][0];
double xmax = borders_[1][0];
double ymin = borders_[0][1];
double ymax = borders_[1][1];
double zmin = borders_[0][2];
double zmax = borders_[1][2];
int numProcs;
MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
int processorRank;
MPI_Comm_rank(MPI_COMM_WORLD, &processorRank);
// Spatially partition along the largest dimension.
procs_.clear();
if (max(max(L_[0], L_[1]), L_[2]) == L_[0]) {
partitionAxis_ = 0;
for (int i = 0; i < numProcs; ++i) {
procs_.push_back(xmin + (L_[0]*i)/numProcs);
}
procs_.push_back(xmax);
}
else if (max(max(L_[0], L_[1]), L_[2]) == L_[1]) {
partitionAxis_ = 1;
for (int i = 0; i < numProcs; ++i) {
procs_.push_back(ymin + (L_[1]*i)/numProcs);
}
procs_.push_back(ymax);
}
else {
partitionAxis_ = 2;
for (int i = 0; i < numProcs; ++i) {
procs_.push_back(zmin + (L_[2]*i)/numProcs);
}
procs_.push_back(zmax);
}
// Distribute each node to the correct processor
myNodes_.clear();
for (int i = 0; i < nNodes_; ++i) {
// Allocate node to this processor if it lies between processor's left and right boundaries.
if ( dbl_geq(nodalCoords_(partitionAxis_, i), procs_[processorRank]) &&
!dbl_geq(nodalCoords_(partitionAxis_, i), procs_[processorRank + 1])) {
myNodes_.push_back(i);
}
// Also allocate nodes on the right boundary to the last processor.
if ((processorRank == numProcs - 1) &&
dbl_geq(nodalCoords_(partitionAxis_, i), procs_[processorRank + 1])) {
myNodes_.push_back(i);
}
}
// Distribute each element to the correct processor - assign it to the processor
// which owns its node of lowest index. (this partitioning scheme is unambiguous)
myElts_.clear();
for (int i = 0; i < nElts_; ++i) {
int min = INT_MAX;
for (int j = 0; j < connectivity_.nRows(); j++) {
if (connectivity_(j, i) < min)
min = connectivity_(j, i);
}
if (find(myNodes_.begin(), myNodes_.end(), min) != myNodes_.end()) {
myElts_.push_back(i);
}
}
/* Commented out because ghost nodes are never used and dx_ is not a member of
FE_Rectangular3DMesh.
// Compute the facesets that describes the left and right boundaries
// in order to determine ghost nodes.
int leftMult = 0;
while ((leftMult+1)*dx_[partitionAxis_] < procs_[processorRank]) {
++leftMult;
}
int rightMult = 0;
while ((rightMult)*dx_[partitionAxis_] < procs_[processorRank+1]) {
++rightMult;
}
// Compute our ghost nodes - nodes that we need that belong to adjacent processors,
// and our shared nodes - our nodes that are ghosted on the adjacent processors.
for (int i = 0; i < nNodes_; ++i) {
if (nodalCoords_(partitionAxis_, i) == leftMult*dx_[partitionAxis_])
ghostNodesL_.push_back(i);
else if (nodalCoords_(partitionAxis_, i) == rightMult*dx_[partitionAxis_])
ghostNodesR_.push_back(i);
else if (nodalCoords_(partitionAxis_, i) == (leftMult+1)*dx_[partitionAxis_])
shareNodesL_.push_back(i);
else if (nodalCoords_(partitionAxis_, i) == (rightMult-1)*dx_[partitionAxis_])
shareNodesR_.push_back(i);
}*/
if (decomposition_) distribute_mesh_data();
partitioned_ = true;
}
void FE_Rectangular3DMesh::departition_mesh()
{
if (!partitioned_) return;
partitioned_ = false;
}
// -------------------------------------------------------------
// setup_periodicity
// -------------------------------------------------------------
void FE_Rectangular3DMesh::setup_periodicity()
{
nNodesUnique_ = 1;
for (int i = 0; i < 3; i++) {
nNodesUnique_ *= (n_[i] + 1 - periodicity_(i));
}
// form maximal nodeset
for (int i = 0; i < nNodesUnique_; i++) {
nodeSetAll_.insert(i);
}
// Create global-to-unique map: globalToUniqueMap_(ig) = iu
globalToUniqueMap_.reset(nNodes_);
uniqueToGlobalMap_.reset(nNodesUnique_);
for (int k = 0; k <= n_[2]; ++k) {
int kper = (k == n_[2] && periodicity_(2)) ? 0 : k;
for (int j = 0; j <= n_[1]; ++j) {
int jper = (j == n_[1] && periodicity_(1)) ? 0 : j;
for (int i = 0; i <= n_[0]; ++i) {
int iper = (i == n_[0] && periodicity_(0)) ? 0 : i;
int id = i + j*(n_[0]+1) + k*(n_[0]+1)*(n_[1]+1);
int uid = iper + jper*(n_[0]+1-periodicity_(0))
+ kper*(n_[0]+1-periodicity_(0))*(n_[1]+1-periodicity_(1));
globalToUniqueMap_(id) = uid;
uniqueToGlobalMap_(uid) = id;
}
}
}
set_unique_connectivity();
// form maximal elementset
for (int i = 0; i < nElts_; i++) {
elementSetAll_.insert(i);
}
}
int FE_Rectangular3DMesh::map_to_element(const DENS_VEC &x) const
{
int ix[3]; // ix[i] is the element in the ith direction
for (int i = 0; i < 3; i++) {
// map to box
double y = x(i);
if (periodicity_(i)) {
double diff = y-borders_[0][i];
int shift = int(diff/L_[i]);
if (diff < 0.) shift--;
y -= shift*L_[i];
}
// project into element
ix[i] = x_[i].index(y);
if (fabs(y-borders_[0][i]) < tol) { ix[i] = 0; } // on the lower boundary
if (ix[i] < 0 || ix[i] >= n_[i]) {
string msg = "FE_Rectangular3DMesh:: point maps outside of mesh, coordinate "
+ index_to_string(i) + "=" + to_string(x(i)) + " image=" + to_string(y)
+ " not in " + to_string(borders_[0][i]) + ":" + to_string(borders_[1][i]);
throw ATC_Error(msg);
}
}
int elt = ix[2]*(n_[0]*n_[1]) + ix[1]*n_[0] + ix[0];
return elt;
}
// -------------------------------------------------------------
// -------------------------------------------------------------
// class FE_Uniform3DMesh
// -------------------------------------------------------------
// -------------------------------------------------------------
FE_Uniform3DMesh::FE_Uniform3DMesh(const int nx,
const int ny,
const int nz,
const double xmin, const double xmax,
const double ymin, const double ymax,
const double zmin, const double zmax,
const Array<bool> periodicity,
const double xscale,
const double yscale,
const double zscale)
{
hasPlanarFaces_ = true;
tree_ = NULL;
xscale_ = xscale;
yscale_ = yscale;
zscale_ = zscale;
n_[0] = nx;
n_[1] = ny;
n_[2] = nz;
borders_[0][0] = xmin;
borders_[1][0] = xmax;
borders_[0][1] = ymin;
borders_[1][1] = ymax;
borders_[0][2] = zmin;
borders_[1][2] = zmax;
periodicity_ = Array<bool>(periodicity);
// Compute region size and element size
for (int i = 0; i < 3; i++) {
L_[i] = borders_[1][i] - borders_[0][i];
dx_[i] = L_[i]/n_[i];
}
// Member data setup
nSD_ = 3;
nElts_ = n_[0] * n_[1] * n_[2];
nNodes_ = (n_[0]+1) * (n_[1]+1) * (n_[2]+1);
feElement_ = new FE_ElementRect();
nodalCoords_.reset(3, nNodes_);
connectivity_.reset(feElement_->num_elt_nodes(), nElts_);
// Fill nodal coordinates
double ix[3];
int inode = 0;
for (int k = 0; k <= n_[2]; ++k) {
ix[2] = borders_[0][2] + k*dx_[2];
for (int j = 0; j <= n_[1]; ++j) {
ix[1] = borders_[0][1] + j*dx_[1];
for (int i = 0; i <= n_[0]; ++i) {
ix[0] = borders_[0][0] + i*dx_[0];
for (int m = 0; m < 3; ++m) {
nodalCoords_(m,inode) = ix[m];
}
++inode;
}
}
}
// Compute element connectivities
int ielt = 0;
int noffx = 1;
int noffy = n_[0] + 1;
int noffz = (n_[0]+1) * (n_[1]+1);
for (int k = 0; k < n_[2]; ++k) {
for (int j = 0; j < n_[1]; ++j) {
for (int i = 0; i < n_[0]; ++i) {
int i1 = i + j*noffy + k*noffz;
connectivity_(0,ielt) = i1;
connectivity_(1,ielt) = i1 + noffx;
connectivity_(2,ielt) = i1 + noffx + noffy;
connectivity_(3,ielt) = i1 + noffy;
connectivity_(4,ielt) = i1 + noffz;
connectivity_(5,ielt) = i1 + noffx + noffz;
connectivity_(6,ielt) = i1 + noffx + noffy + noffz;
connectivity_(7,ielt) = i1 + noffy + noffz;
++ielt;
}
}
}
setup_periodicity();
}
// -------------------------------------------------------------
// destructor
// -------------------------------------------------------------
FE_Uniform3DMesh::~FE_Uniform3DMesh()
{
// Clean up is currently unimplemented
}
// -------------------------------------------------------------
// partition_mesh
// -------------------------------------------------------------
void FE_Uniform3DMesh::partition_mesh()
{
if (lammpsPartition_) {
lammps_partition_mesh();
}
if (partitioned_) return;
// Determine dimensions of mesh in order to partition according to largest dimension.
double xmin = borders_[0][0];
double xmax = borders_[1][0];
double ymin = borders_[0][1];
double ymax = borders_[1][1];
double zmin = borders_[0][2];
double zmax = borders_[1][2];
int numProcs;
MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
int processorRank;
MPI_Comm_rank(MPI_COMM_WORLD, &processorRank);
// Spatially partition along the largest dimension.
procs_.clear();
if (max(max(L_[0], L_[1]), L_[2]) == L_[0]) {
partitionAxis_ = 0;
for (int i = 0; i < numProcs; ++i) {
procs_.push_back(xmin + (L_[0]*i)/numProcs);
}
procs_.push_back(xmax);
}
else if (max(max(L_[0], L_[1]), L_[2]) == L_[1]) {
partitionAxis_ = 1;
for (int i = 0; i < numProcs; ++i) {
procs_.push_back(ymin + (L_[1]*i)/numProcs);
}
procs_.push_back(ymax);
}
else {
partitionAxis_ = 2;
for (int i = 0; i < numProcs; ++i) {
procs_.push_back(zmin + (L_[2]*i)/numProcs);
}
procs_.push_back(zmax);
}
// Distribute each node to the correct processor
myNodes_.clear();
for (int i = 0; i < nNodes_; ++i) {
// Allocate node to this processor if it lies between processor's left and right boundaries.
if ( dbl_geq(nodalCoords_(partitionAxis_, i), procs_[processorRank]) &&
!dbl_geq(nodalCoords_(partitionAxis_, i), procs_[processorRank + 1])) {
myNodes_.push_back(i);
}
// Also allocate nodes on the right boundary to the last processor.
if ((processorRank == numProcs - 1) &&
dbl_geq(nodalCoords_(partitionAxis_, i), procs_[processorRank + 1])) {
myNodes_.push_back(i);
}
}
// Distribute each element to the correct processor - assign it to the processor
// which owns its node of lowest index. (this partitioning scheme is unambiguous)
myElts_.clear();
for (int i = 0; i < nElts_; ++i) {
int min = INT_MAX;
for (int j = 0; j < connectivity_.nRows(); j++) {
if (connectivity_(j, i) < min)
min = connectivity_(j, i);
}
if (find(myNodes_.begin(), myNodes_.end(), min) != myNodes_.end()) {
myElts_.push_back(i);
}
}
// Compute the facesets that describes the left and right boundaries
// in order to determine ghost nodes.
int leftMult = 0;
while ((leftMult+1)*dx_[partitionAxis_] < procs_[processorRank]) {
++leftMult;
}
int rightMult = 0;
while ((rightMult)*dx_[partitionAxis_] < procs_[processorRank+1]) {
++rightMult;
}
// Compute our ghost nodes - nodes that we need that belong to adjacent processors,
// and our shared nodes - our nodes that are ghosted on the adjacent processors.
for (int i = 0; i < nNodes_; ++i) {
if (nodalCoords_(partitionAxis_, i) == leftMult*dx_[partitionAxis_])
ghostNodesL_.push_back(i);
else if (nodalCoords_(partitionAxis_, i) == rightMult*dx_[partitionAxis_])
ghostNodesR_.push_back(i);
else if (nodalCoords_(partitionAxis_, i) == (leftMult+1)*dx_[partitionAxis_])
shareNodesL_.push_back(i);
else if (nodalCoords_(partitionAxis_, i) == (rightMult-1)*dx_[partitionAxis_])
shareNodesR_.push_back(i);
}
if (decomposition_) distribute_mesh_data();
partitioned_ = true;
}
void FE_Uniform3DMesh::departition_mesh()
{
if (!partitioned_) return;
partitioned_ = false;
}
// -------------------------------------------------------------
// map_to_element
// -------------------------------------------------------------
int FE_Uniform3DMesh::map_to_element(const DENS_VEC &x) const
{
// countx[i] is the number of the element, where 1 is the
// element adjacent to the lower border, in the ith direction
int countx[3];
for (int i = 0; i < 3; ++i) {
// handle points on upper boundary; not sure why this is
// hard-coded in, though...
if (fabs(x(i)-borders_[1][i]) < tol) {
countx[i] = n_[i] - 1;
} else {
// find the x, y, and z bins for the point in the mesh
countx[i] = (int)floor((x(i)-borders_[0][i])/dx_[i]);
}
// handle points out-of-range [0:nx-1] w/ periodicity
if (countx[i] < 0 || countx[i] >= n_[i]) {
if (periodicity_(i)) {
countx[i] = countx[i] % n_[i];
// handles c++ ambiguous mod problems
if (countx[i] < 0) countx[i] += n_[i];
} else {
string msg = " point maps outside "
"of mesh, coordinate " +
index_to_string(i) + " " + to_string(x(i)) +
" not in " + to_string(borders_[0][i]) +
" : " + to_string(borders_[1][i]);
throw ATC_Error(FILELINE,msg);
}
}
}
int elt = countx[2]*(n_[0]*n_[1]) +
countx[1]*n_[0] +
countx[0];
return elt;
}
} // namespace ATC
diff --git a/lib/atc/FE_Mesh.h b/lib/atc/FE_Mesh.h
index ec984c324..b832a5b70 100644
--- a/lib/atc/FE_Mesh.h
+++ b/lib/atc/FE_Mesh.h
@@ -1,707 +1,704 @@
#ifndef FE_MESH_H
#define FE_MESH_H
-// ATC_Transfer headers
#include "Array.h"
#include "Array2D.h"
#include "MatrixLibrary.h"
#include "ATC_TypeDefs.h"
#include "KD_Tree.h"
-
-// Other headers
#include <vector>
#include <deque>
#include <list>
#include <map>
#include <set>
#include <utility>
#include <float.h>
+#include <string>
+#include <vector>
#include "mpi.h"
-using namespace std;
-
namespace ATC {
- // Forward declarations
+
class FE_Element;
/**
* @class FE_Mesh
* @brief Base class for a finite element mesh
*/
class FE_Mesh {
public:
/** constructor */
FE_Mesh();
/** destructor */
virtual ~FE_Mesh();
/** parser/modifier */
bool modify(int narg, char **arg);
/** initialization */
void initialize(void);
/** write an unstructured mesh */
- void write_mesh(string meshFile);
+ void write_mesh(std::string meshFile);
// SJL why? will they ever be overridden by derived classes? in what
// situation would that be required, or desirable? virtual functions
// are slightly less efficient because they cannot be hard-linked at
// compile time.
bool is_partitioned() const { return partitioned_; }
virtual void partition_mesh() = 0;
virtual void departition_mesh() = 0;
int map_elem_to_myElem(int elemID) const;
int map_myElem_to_elem(int myElemID) const;
void set_lammps_partition(bool t) {lammpsPartition_ = t;}
void set_data_decomposition(bool t) {decomposition_ = t;}
/** set quadrature on element from within interpolate class */
void set_quadrature(FeIntQuadrature type);
/** evaluate shape function at real coordinates */
void position(const int elem,
const VECTOR &xi,
DENS_VEC &x) const;
/** evaluate shape function at real coordinates */
void shape_functions(const VECTOR &x,
DENS_VEC &N,
Array<int> &nodeList) const;
/** evaluate shape function at real coordinates */
void shape_functions(const VECTOR &x,
DENS_VEC &N,
Array<int> &nodeList,
const Array<bool> &) const;
/** evaluate shape function at real coordinates */
void shape_functions(const DENS_VEC &x,
DENS_VEC &N,
DENS_MAT &dNdx,
Array<int> &nodeList) const;
/** evaluate shape function at real coordinates */
void shape_functions(const VECTOR &x,
const int eltID,
DENS_VEC &N,
Array<int> &nodeList) const;
/** evaluate shape function at real coordinates */
void shape_functions(const DENS_VEC &x,
const int eltID,
DENS_VEC &N,
DENS_MAT &dNdx,
Array<int> &nodeList) const;
/** evaluate shape function at real coordinates */
void shape_function_derivatives(const DENS_VEC &x,
const int eltID,
DENS_MAT &dNdx,
Array<int> &nodeList) const;
/** evaluate shape functions for all ip's on an element */
// N is numIPsInElement X numNodesInElement
void shape_function(const int eltID,
DENS_MAT &N,
DIAG_MAT &weights) const;
/** evaluate shape functions for all ip's on an element */
// N is numIPsInElement X numNodesInElement
void shape_function(const int eltID,
DENS_MAT &N,
- vector<DENS_MAT> &dN,
+ std::vector<DENS_MAT> &dN,
DIAG_MAT &weights) const;
/** evaluate shape functions for all ip's on a face */
// N is numIPsInFace X numNodesInElement
void face_shape_function(const PAIR &face,
DENS_MAT &N,
DENS_MAT &n,
DIAG_MAT &weights) const;
void face_shape_function(const PAIR &face,
DENS_MAT &N,
- vector<DENS_MAT> &dN,
- vector<DENS_MAT> &Nn,
+ std::vector<DENS_MAT> &dN,
+ std::vector<DENS_MAT> &Nn,
DIAG_MAT &weights) const;
/** compute normal vector from the specified face */
double face_normal(const PAIR &face,
const int ip,
DENS_VEC &normal) const;
/** return connectivity (global ID numbers) for element eltID */
void element_connectivity_global(const int eltID,
Array<int> & nodes) const;
void element_connectivity_unique(const int eltID,
Array<int> & nodes) const;
int element_connectivity_global(const int eltID,
const int inode) const;
int element_connectivity_unique(const int eltID,
const int inode) const;
AliasArray<int> element_connectivity_global(const int eltID) const;
AliasArray<int> element_connectivity_unique(const int eltID) const;
void face_connectivity(const PAIR & faceID,
Array<int> & nodes) const
{ int nNodesPerFace = num_nodes_per_face();
nodes.reset(nNodesPerFace);
int eltID = faceID.first;
int localFace = faceID.second;
const Array2D<int> & localFaceConn = local_face_connectivity();
for(int i = 0; i < nNodesPerFace; ++i) {
nodes(i) = element_connectivity_global(eltID, localFaceConn(localFace,i));
}
}
void face_connectivity_unique(const PAIR & faceID,
Array<int> & nodes) const
{ int nNodesPerFace = num_nodes_per_face();
nodes.reset(nNodesPerFace);
int eltID = faceID.first;
int localFace = faceID.second;
const Array2D<int> & localFaceConn = local_face_connectivity();
for(int i = 0; i < nNodesPerFace; ++i) {
nodes(i) = element_connectivity_unique(eltID, localFaceConn(localFace,i));
}
}
/**
* return spatial coordinates for element nodes on eltID,
* indexed xCoords(isd,inode)
*/
void element_coordinates(const int eltID,
DENS_MAT & xCoords) const;
void face_coordinates(const PAIR face,
DENS_MAT & xCoords) const;
/** access to the nodal coordinate values */
const DENS_MAT & nodal_coordinates(void) const {return nodalCoords_ ;}
/** access to nodal coordinates of a unique node */
DENS_VEC nodal_coordinates(const int nodeID) const;
/** access to nodal coordinates of a node */
DENS_VEC global_coordinates(const int nodeID) const;
/** map spatial location to element */
virtual int map_to_element(const DENS_VEC &x) const = 0;
/** map global node numbering to unique node numbering */
int map_global_to_unique(const int global_id) const
{
return globalToUniqueMap_(global_id);
}
inline const Array<int>& global_to_unique_map(void) const
{
return globalToUniqueMap_;
}
/** map unique node numbering a global node numbering */
int map_unique_to_global(const int unique_id)
{
return uniqueToGlobalMap_(unique_id);
}
inline const Array<int>& unique_to_global_map(void) const
{
return uniqueToGlobalMap_;
}
/** query whether a nodeset with the given name exists */
- bool query_nodeset(const string & name) const;
+ bool query_nodeset(const std::string & name) const;
/** get node set (unique ID's) from the string name assigned to the set */
- const set<int> & nodeset(const string & name) const;
+ const std::set<int> & nodeset(const std::string & name) const;
/** create node set with tag "name" from nodes in given spatial range */
- void create_nodeset(const string & name, const set<int> & nodeset);
- void create_nodeset(const string & name,
+ void create_nodeset(const std::string & name, const std::set<int> & nodeset);
+ void create_nodeset(const std::string & name,
double xmin, double xmax,
double ymin, double ymax,
double zmin, double zmax);
/** add to node set with tag "name" from nodes in given spatial range */
- void add_to_nodeset(const string & name,
+ void add_to_nodeset(const std::string & name,
double xmin, double xmax,
double ymin, double ymax,
double zmin, double zmax);
/** get element set from the string name assigned to the set */
- const set<int> & elementset(const string & name) const;
+ const std::set<int> & elementset(const std::string & name) const;
/** create element set with tag "name" from nodes in given spatial range */
- void create_elementset(const string & name,
+ void create_elementset(const std::string & name,
double xmin, double xmax,
double ymin, double ymax,
double zmin, double zmax);
/** get the minimal element set from a nodeset by name */
- void nodeset_to_minimal_elementset(const string &name,
- set<int> &elemSet) const;
+ void nodeset_to_minimal_elementset(const std::string &name,
+ std::set<int> &elemSet) const;
/** get the minimal element set from a set of nodes */
- void nodeset_to_minimal_elementset(const set<int> &nodeSet,
- set<int> &elemSet) const;
+ void nodeset_to_minimal_elementset(const std::set<int> &nodeSet,
+ std::set<int> &elemSet) const;
/** get the maximal element set from a nodeset by name */
- void nodeset_to_maximal_elementset(const string &name,
- set<int> &elemSet) const;
+ void nodeset_to_maximal_elementset(const std::string &name,
+ std::set<int> &elemSet) const;
/** get the maximal element set from a set of nodes */
- void nodeset_to_maximal_elementset(const set<int> &nodeSet,
- set<int> &elemSet) const;
+ void nodeset_to_maximal_elementset(const std::set<int> &nodeSet,
+ std::set<int> &elemSet) const;
/** get complement of element set by name */
- void elementset_complement(const string &name,
- set<int> &elemSet) const;
- void elementset_complement(const set<int> &elemSet,
- set<int> &elemSetComplement) const;
+ void elementset_complement(const std::string &name,
+ std::set<int> &elemSet) const;
+ void elementset_complement(const std::set<int> &elemSet,
+ std::set<int> &elemSetComplement) const;
/** get the node set from an element set by name */
- void elementset_to_minimal_nodeset(const string &name,
- set<int> &nodeSet) const;
+ void elementset_to_minimal_nodeset(const std::string &name,
+ std::set<int> &nodeSet) const;
- void elementset_to_nodeset(const string &name,
- set<int> &nodeSet) const;
- void elementset_to_nodeset(const set<int> &elemSet,
- set<int> &nodeSet) const;
+ void elementset_to_nodeset(const std::string &name,
+ std::set<int> &nodeSet) const;
+ void elementset_to_nodeset(const std::set<int> &elemSet,
+ std::set<int> &nodeSet) const;
/** convert faceset to nodeset in _unique_ node numbering */
- void faceset_to_nodeset(const string &name,
- set<int> &nodeSet) const;
- void faceset_to_nodeset(const set<PAIR> &faceSet,
- set<int> &nodeSet) const;
+ void faceset_to_nodeset(const std::string &name,
+ std::set<int> &nodeSet) const;
+ void faceset_to_nodeset(const std::set<PAIR> &faceSet,
+ std::set<int> &nodeSet) const;
- void faceset_to_nodeset_global(const string &name,
- set<int> &nodeSet) const;
- void faceset_to_nodeset_global(const set<PAIR> &faceSet,
- set<int> &nodeSet) const;
+ void faceset_to_nodeset_global(const std::string &name,
+ std::set<int> &nodeSet) const;
+ void faceset_to_nodeset_global(const std::set<PAIR> &faceSet,
+ std::set<int> &nodeSet) const;
/** get face set from the string name assigned to the set */
- const set< pair<int,int> > & faceset(const string & name) const;
+ const std::set< std::pair<int,int> > & faceset(const std::string & name) const;
/** create face set with tag "name" from faces aligned with box */
- void create_faceset(const string & name,
+ void create_faceset(const std::string & name,
double xmin, double xmax,
double ymin, double ymax,
double zmin, double zmax,
bool outward);
/** create face set with tag "name" from faces aligned with plane */
- void create_faceset(const string & name, double x, int idir, int isgn,
+ void create_faceset(const std::string & name, double x, int idir, int isgn,
int nIdx2=-1, double x2lo=0.0, double x2hi=0.0,
int nIdx3=-1, double x3lo=0.0, double x3hi=0.0);
/** cut mesh */
- virtual void cut_mesh(const set<PAIR> & faceSet, const set<int> & nodeSet) = 0;
+ virtual void cut_mesh(const std::set<PAIR> & faceSet, const std::set<int> & nodeSet) = 0;
/** delete elements */
- virtual void delete_elements(const set<int> & elementList) = 0;
+ virtual void delete_elements(const std::set<int> & elementList) = 0;
/** return number of spatial dimensions */
int num_spatial_dimensions() const { return nSD_; }
/** return total number of nodes */
int num_nodes() const { return nNodes_; }
/** return number of unique nodes */
int num_nodes_unique() const { return nNodesUnique_; }
/** return number of elements */
int num_elements() const { return nElts_; }
/** return number of elements partitioned to my processor */
int my_num_elements() const { return myNElts_; }
/** return number of integration points per element */
int num_ips_per_element() const;
/** return number of nodes per element */
int num_nodes_per_element() const;
/** return number of faces per element */
int num_faces_per_element() const;
/** return number of nodes per face */
int num_nodes_per_face() const;
/** return number of integration points per face */
int num_ips_per_face() const;
/** return a pointer to the connectivity. This function will only work
when mesh is not partitioned. */
Array2D<int> * connectivity(void) { return &connectivity_; }
/** return a pointer to the connectivity */
DENS_MAT * coordinates(void) { return &nodalCoords_;}
/** Engine nodeMap stuff */
Array<int> *node_map(void) { return &globalToUniqueMap_;}
/** return scale in x,y,z */
double xscale() const { return xscale_; }
double yscale() const { return yscale_; }
double zscale() const { return zscale_; }
/** local face connectivity */
const Array2D<int> & local_face_connectivity() const;
/** element size in each direction */
virtual void bounding_box(const int ielem,
DENS_VEC & xmin, DENS_VEC & xmax);
/** element size in each direction */
virtual void element_size(const int ielem,
double & hx, double & hy, double & hz);
/** element size in each direction */
virtual double min_element_size(void) const {return 0.0 ;}
/** get nodal coordinates for a given element */
void element_field(const int eltIdx, const DENS_MAT f,
DENS_MAT &local_field)
{
int dof = f.nCols();
Array<int> nodes;
element_connectivity_unique(eltIdx,nodes);
local_field.reset(num_nodes_per_element(), dof);
for (int i = 0; i < nodes.size(); i++) {
for (int j = 0; j < dof; j++) local_field(i,j) = f(nodes(i),j);
}
}
/** almost structured */
bool is_aligned(void) const;
/** extruded */
bool is_two_dimensional(void) const {return twoDimensional_;}
virtual double coordinate_tolerance(void) const {return 1.e-8;}
/** element type */
- string element_type(void) const ;
+ std::string element_type(void) const ;
/** output mesh subsets */
- void output(string prefix) const;
+ void output(std::string prefix) const;
/* Parallelization data members */
/** return element vector for this processor */
- const vector<int> & owned_elts() const { return myElts_; }
- const vector<int> & owned_and_ghost_elts() const {
+ const std::vector<int> & owned_elts() const { return myElts_; }
+ const std::vector<int> & owned_and_ghost_elts() const {
return (decomposition_) ? myAndGhostElts_: myElts_; }
bool is_owned_elt(int elt) const;
protected:
/** will this mesh use data decomposition? */
bool decomposition_;
/** should the mesh use the native lammps partitioning? */
bool lammpsPartition_;
/** is the element/node data currently partitioned among processors? */
bool partitioned_;
/** number of spatial dimensions */
int nSD_;
/** number of elements */
int nElts_;
/** number of elements partitioned to this processor */
int myNElts_;
/** number of nodes */
int nNodes_;
int nNodesUnique_;
/** periodicity flags */
Array<bool> periodicity_;
/** element type for this mesh */
FE_Element *feElement_;
/** Nodal coordinates: nodalCoords_(nsd, numnode) */
DENS_MAT nodalCoords_;
/** Element connectivity: connectivity_(neltnode, nelt) */
Array2D<int> connectivity_;
Array2D<int> myConnectivity_;
Array2D<int> connectivityUnique_;
Array2D<int> myConnectivityUnique_;
/** map from unique node id to associated elements for periodic meshes */
/** this data structure is only ever accessed from an unpartitioned context */
- Array<vector<int> > uniqueNodeToElementMap_;
+ Array<std::vector<int> > uniqueNodeToElementMap_;
/** map of global to unique node ID's */
Array<int> globalToUniqueMap_;
Array<int> compactRemap_; // for condensing unique numbering
/** map of unique to global node ID's */
Array<int> uniqueToGlobalMap_;
/** map of string names to node sets */
NODE_SET_MAP nodeSetMap_;
/** maximal nodeset */
- set<int> nodeSetAll_;
+ std::set<int> nodeSetAll_;
/** map of string names to node sets */
FACE_SET_MAP faceSetMap_;
/** map of string names to element sets */
ELEMENT_SET_MAP elementSetMap_;
/** maximal elementset */
- set<int> elementSetAll_;
+ std::set<int> elementSetAll_;
/** length scaling used by lammps */
double xscale_, yscale_, zscale_;
/** Processor demarcations */
- vector<double> procs_;
+ std::vector<double> procs_;
/** Dimension (x=0, y=1, or z=2) */
int partitionAxis_;
/** List of nodes for this processor */
- vector<int> myNodes_;
+ std::vector<int> myNodes_;
/** List of elements for this processor */
- vector<int> myElts_;
- vector<int> myAndGhostElts_;
+ std::vector<int> myElts_;
+ std::vector<int> myAndGhostElts_;
/** maps between my IDs and the total IDs */
- map<int,int> elemToMyElemMap_;
+ std::map<int,int> elemToMyElemMap_;
/** Lists of ghost nodes/neighbor ghost nodes */
- vector<int> ghostNodesL_;
- vector<int> ghostNodesR_;
- vector<int> shareNodesL_;
- vector<int> shareNodesR_;
+ std::vector<int> ghostNodesL_;
+ std::vector<int> ghostNodesR_;
+ std::vector<int> shareNodesL_;
+ std::vector<int> shareNodesR_;
/** extruded */
bool twoDimensional_;
bool hasPlanarFaces_;
double coordTol_;
};
/**
* @class FE_3DMesh
* @brief Derived class for an unstructured 3D mesh
*/
class FE_3DMesh : public FE_Mesh {
public:
/** constructor */
FE_3DMesh(){};
/** constructor for read-in mesh **/
// can later be extended to take nodesets, elementsets, etc.
- FE_3DMesh(const string elementType,
+ FE_3DMesh(const std::string elementType,
const int nNodes,
const int nElements,
const Array2D<int> *connectivity,
const DENS_MAT *nodalCoordinates,
const Array<bool> periodicity,
- const Array<pair<string,set<int> > > *nodeSets);
+ const Array<std::pair<std::string,std::set<int> > > *nodeSets);
/** destructor */
virtual ~FE_3DMesh();
void partition_mesh(void);
void departition_mesh(void);
void lammps_partition_mesh(void);
/** Removes duplicate elements that appear in more than one vector
within procEltLists. **/
- void prune_duplicate_elements(vector<vector<int> > &procEltLists,
+ void prune_duplicate_elements(std::vector<std::vector<int> > &procEltLists,
int *eltToOwners);
/** Takes procEltLists, and if there are more than nProcs of them
it takes the extra elements and distributes them to other vectors
in procEltLists. */
// processors if during pruning processors end up
// elementless. This is slightly complicated because of
// ghost nodes.
- void redistribute_extra_proclists(vector<vector<int> > &procEltLists,
+ void redistribute_extra_proclists(std::vector<std::vector<int> > &procEltLists,
int *eltToOwners, int nProcs);
/** This takes in a dense matrix and a list of elements
and fills in a standard adjacency list (within the matrix)
for those elements. **/
// the set intersection, which does redundant computations
// right now, and filling in the adjacencies for both elements
// simultaneously when two elements share a face.
- void compute_face_adjacencies(const list<int> &elts,
+ void compute_face_adjacencies(const std::list<int> &elts,
DENS_MAT &faceAdjacencies);
/** Counts the number of nonempty vectors in a vector of vectors. **/
- int numNonempty(vector<vector<int> > &v);
+ int numNonempty(std::vector<std::vector<int> > &v);
/** In the partitioning, we want to sort vectors of integers by size,
and furthermore we want empty vectors to count as the "largest"
possible vector because they dont want to count in the minimum. **/
struct vectorComparer {
- bool operator() (vector<int> l, vector<int> r) {
+ bool operator() (std::vector<int> l, std::vector<int> r) {
if (l.empty())
return false;
if (r.empty())
return true;
return (l.size() < r.size());
}
} vectorCompSize;
virtual double min_element_size(void) const {return minEltSize_; }
virtual double coordinate_tolerance(void) const {
return 0.25*(this->min_element_size()); // loose
//return 0.5;
}
- virtual void cut_mesh(const set<PAIR> &faceSet,
- const set<int> &nodeSet);
+ virtual void cut_mesh(const std::set<PAIR> &faceSet,
+ const std::set<int> &nodeSet);
- virtual void delete_elements(const set<int> &elementSet);
+ virtual void delete_elements(const std::set<int> &elementSet);
/** map spatial location to element */
virtual int map_to_element(const DENS_VEC &x) const;
/** sends out data to processors during partitioning */
void distribute_mesh_data();
protected:
/** create global-to-unique node mapping */
virtual void setup_periodicity(double tol = 1.e-8);
void fix_periodicity (int idim);
- int find_boundary_nodes(int idim, set<int> & nodes);
- bool match_nodes(int idim, set<int> & top, set<int> & bot,
+ int find_boundary_nodes(int idim, std::set<int> & nodes);
+ bool match_nodes(int idim, std::set<int> & top, std::set<int> & bot,
Array<int> & map);
void set_unique_connectivity(void);
bool orient(int idir);
double minEltSize_;
KD_Tree *tree_;
/** test if a specified element actually contains the given point */
bool contains_point(const int eltID, const DENS_VEC & x) const;
private:
- Array<vector<int> > nodeToParentElements_;
+ Array<std::vector<int> > nodeToParentElements_;
};
/**
* @class FE_Rectangular3DMesh
* @brief Derived class for a structured mesh with
* variable element sizes in x, y, and z directions
*/
class FE_Rectangular3DMesh : public FE_3DMesh {
public:
/** constructor */
FE_Rectangular3DMesh(){};
FE_Rectangular3DMesh(
const Array<double> & hx,
const Array<double> & hy,
const Array<double> & hz,
const double xmin, const double xmax,
const double ymin, const double ymax,
const double zmin, const double zmax,
const Array<bool> periodicity,
const double xscale=1,
const double yscale=1,
const double zscale=1);
/** destructor */
virtual ~FE_Rectangular3DMesh() {};
void partition_mesh(void);
void departition_mesh(void);
/** map spatial location to element */
virtual int map_to_element(const DENS_VEC &x) const;
protected:
/** Number of elements in each spatial direction */
int n_[3];
/** Bounds of region on which mesh is defined */
double borders_[2][3];
/** Region size in each direction */
double L_[3];
/** create global-to-unique node mapping */
virtual void setup_periodicity(); // note no "tol"
private: // only used by this class
/** partitions in x,y,z */
Array<double> hx_, hy_, hz_;
/** nodal locations */
- vector< Array<double> > x_;
+ std::vector< Array<double> > x_;
};
/**
* @class FE_Uniform3DMesh
* @brief Derived class for a uniform structured mesh with
* fixed element sizes in x, y, and z directions
*/
class FE_Uniform3DMesh : public FE_Rectangular3DMesh {
public:
/** constructor */
FE_Uniform3DMesh(const int nx,
const int ny,
const int nz,
const double xmin, const double xmax,
const double ymin, const double ymax,
const double zmin, const double zmax,
const Array<bool> periodicity,
const double xscale=1,
const double yscale=1,
const double zscale=1);
/** destructor */
virtual ~FE_Uniform3DMesh();
void partition_mesh(void);
void departition_mesh(void);
virtual void element_size(const int ielem,
double hx, double hy, double hz)
{ hx = L_[0]/n_[0]; hy = L_[1]/n_[1]; hz = L_[2]/n_[2]; }
virtual double min_element_size(void) const
- { return min(L_[0]/n_[0], min(L_[1]/n_[1], L_[2]/n_[2])); }
+ { return std::min(L_[0]/n_[0], std::min(L_[1]/n_[1], L_[2]/n_[2])); }
/** map spatial location to element */
virtual int map_to_element(const DENS_VEC &x) const;
private: // only used by this class
/** Element size in each direction */
double dx_[3];
};
}; // namespace ATC_Transfer
#endif // FE_MESH_H
diff --git a/lib/atc/FE_Quadrature.h b/lib/atc/FE_Quadrature.h
index 953dce639..922ade05c 100644
--- a/lib/atc/FE_Quadrature.h
+++ b/lib/atc/FE_Quadrature.h
@@ -1,710 +1,709 @@
#ifndef FE_QUADRATURE_H
#define FE_QUADRATURE_H
-// ATC_Transfer headers
+#include <vector>
+
#include "MatrixLibrary.h"
#include "ATC_TypeDefs.h"
-using namespace std;
-
namespace ATC {
/**
* @class FE_Quadrature
* @brief Stores quadrature schemes
*/
struct FE_Quadrature {
int numIPs;
int numFaceIPs;
DENS_MAT ipCoords;
- vector<DENS_MAT> ipFaceCoords;
+ std::vector<DENS_MAT> ipFaceCoords;
DENS_MAT ipFace2DCoords;
DENS_VEC ipWeights;
DENS_VEC ipFaceWeights;
FE_Quadrature(FeEltGeometry geo, FeIntQuadrature quad)
{
if (geo == HEXA) {
switch (quad) {
// Degenerate 1 point quadrature
case GAUSS1: {
// Set number of IPs and face IPs
numIPs = 1;
numFaceIPs = 1;
// Size matrices and vectors thereof accordingly
ipCoords.resize(3,numIPs);
ipFaceCoords.assign(6,DENS_MAT(3,numFaceIPs));
ipFace2DCoords.resize(2,numFaceIPs);
ipWeights.reset(numIPs);
ipFaceWeights.reset(numFaceIPs);
// "Matrix" of integration point location
ipCoords(0,0) = 0.0;
ipCoords(1,0) = 0.0;
ipCoords(2,0) = 0.0;
// Integration point for each face
ipFaceCoords[0](0,0) = -1.0; ipFaceCoords[3](0,0) = 0.0;
ipFaceCoords[0](1,0) = 0.0; ipFaceCoords[3](1,0) = 1.0;
ipFaceCoords[0](2,0) = 0.0; ipFaceCoords[3](2,0) = 0.0;
//
ipFaceCoords[1](0,0) = 1.0; ipFaceCoords[4](0,0) = 0.0;
ipFaceCoords[1](1,0) = 0.0; ipFaceCoords[4](1,0) = 0.0;
ipFaceCoords[1](2,0) = 0.0; ipFaceCoords[4](2,0) = -1.0;
//
ipFaceCoords[2](0,0) = 0.0; ipFaceCoords[5](0,0) = 0.0;
ipFaceCoords[2](1,0) = -1.0; ipFaceCoords[5](1,0) = 0.0;
ipFaceCoords[2](2,0) = 0.0; ipFaceCoords[5](2,0) = 1.0;
// 2D integration scheme for the faces
ipFace2DCoords(0,0) = 0.0;
ipFace2DCoords(1,0) = 0.0;
// Integration point weights
ipWeights = 8.0;
// Face integration point weights
ipFaceWeights = 4.0;
break;
}
// 8 point quadratures
case NODAL:
case GAUSS2: {
// Set number of IPs and face IPs
numIPs = 8;
numFaceIPs = 4;
// Size matrices and vectors thereof accordingly
ipCoords.resize(3,numIPs);
ipFaceCoords.assign(6,DENS_MAT(3,numFaceIPs));
ipFace2DCoords.resize(2,numFaceIPs);
ipWeights.reset(numIPs);
ipFaceWeights.reset(numFaceIPs);
// Dictates difference in node locations for nodal/GAUSS2
double a = 1.0/sqrt(3.0);
if (quad == NODAL) a = 1.0;
// Matrix of integration point locations & follows local
// conn
ipCoords(0,0) = -a; ipCoords(0,4) = -a;
ipCoords(1,0) = -a; ipCoords(1,4) = -a;
ipCoords(2,0) = -a; ipCoords(2,4) = a;
//
ipCoords(0,1) = a; ipCoords(0,5) = a;
ipCoords(1,1) = -a; ipCoords(1,5) = -a;
ipCoords(2,1) = -a; ipCoords(2,5) = a;
//
ipCoords(0,2) = a; ipCoords(0,6) = a;
ipCoords(1,2) = a; ipCoords(1,6) = a;
ipCoords(2,2) = -a; ipCoords(2,6) = a;
//
ipCoords(0,3) = -a; ipCoords(0,7) = -a;
ipCoords(1,3) = a; ipCoords(1,7) = a;
ipCoords(2,3) = -a; ipCoords(2,7) = a;
// Integration points by face
ipFaceCoords[0](0,0) = -1; ipFaceCoords[3](0,0) = -a;
ipFaceCoords[0](1,0) = -a; ipFaceCoords[3](1,0) = 1;
ipFaceCoords[0](2,0) = -a; ipFaceCoords[3](2,0) = -a;
//
ipFaceCoords[0](0,1) = -1; ipFaceCoords[3](0,1) = a;
ipFaceCoords[0](1,1) = a; ipFaceCoords[3](1,1) = 1;
ipFaceCoords[0](2,1) = -a; ipFaceCoords[3](2,1) = -a;
//
ipFaceCoords[0](0,2) = -1; ipFaceCoords[3](0,2) = a;
ipFaceCoords[0](1,2) = a; ipFaceCoords[3](1,2) = 1;
ipFaceCoords[0](2,2) = a; ipFaceCoords[3](2,2) = a;
//
ipFaceCoords[0](0,3) = -1; ipFaceCoords[3](0,3) = -a;
ipFaceCoords[0](1,3) = -a; ipFaceCoords[3](1,3) = 1;
ipFaceCoords[0](2,3) = a; ipFaceCoords[3](2,3) = a;
ipFaceCoords[1](0,0) = 1; ipFaceCoords[4](0,0) = -a;
ipFaceCoords[1](1,0) = -a; ipFaceCoords[4](1,0) = -a;
ipFaceCoords[1](2,0) = -a; ipFaceCoords[4](2,0) = -1;
//
ipFaceCoords[1](0,1) = 1; ipFaceCoords[4](0,1) = a;
ipFaceCoords[1](1,1) = a; ipFaceCoords[4](1,1) = -a;
ipFaceCoords[1](2,1) = -a; ipFaceCoords[4](2,1) = -1;
//
ipFaceCoords[1](0,2) = 1; ipFaceCoords[4](0,2) = a;
ipFaceCoords[1](1,2) = a; ipFaceCoords[4](1,2) = a;
ipFaceCoords[1](2,2) = a; ipFaceCoords[4](2,2) = -1;
//
ipFaceCoords[1](0,3) = 1; ipFaceCoords[4](0,3) = -a;
ipFaceCoords[1](1,3) = -a; ipFaceCoords[4](1,3) = a;
ipFaceCoords[1](2,3) = a; ipFaceCoords[4](2,3) = -1;
ipFaceCoords[2](0,0) = -a; ipFaceCoords[5](0,0) = -a;
ipFaceCoords[2](1,0) = -1; ipFaceCoords[5](1,0) = -a;
ipFaceCoords[2](2,0) = -a; ipFaceCoords[5](2,0) = 1;
//
ipFaceCoords[2](0,1) = a; ipFaceCoords[5](0,1) = a;
ipFaceCoords[2](1,1) = -1; ipFaceCoords[5](1,1) = -a;
ipFaceCoords[2](2,1) = -a; ipFaceCoords[5](2,1) = 1;
//
ipFaceCoords[2](0,2) = a; ipFaceCoords[5](0,2) = a;
ipFaceCoords[2](1,2) = -1; ipFaceCoords[5](1,2) = a;
ipFaceCoords[2](2,2) = a; ipFaceCoords[5](2,2) = 1;
//
ipFaceCoords[2](0,3) = -a; ipFaceCoords[5](0,3) = -a;
ipFaceCoords[2](1,3) = -1; ipFaceCoords[5](1,3) = a;
ipFaceCoords[2](2,3) = a; ipFaceCoords[5](2,3) = 1;
// Integration points for all faces ignoring the
// redundant dim
ipFace2DCoords(0,0) = -a; ipFace2DCoords(0,2) = a;
ipFace2DCoords(1,0) = -a; ipFace2DCoords(1,2) = a;
//
ipFace2DCoords(0,1) = a; ipFace2DCoords(0,3) = -a;
ipFace2DCoords(1,1) = -a; ipFace2DCoords(1,3) = a;
// Integration point weights
ipWeights = 1.0;
// Face integration point weights
ipFaceWeights = 1.0;
break;
}
// 6 point "face" quadrature
case FACE: {
printf("using face quad!\n");
// Set number of IPs and face IPs
numIPs = 6;
numFaceIPs = 4;
// Size matrices and vectors thereof accordingly
ipCoords.resize(3,numIPs);
ipFaceCoords.assign(6,DENS_MAT(3,numFaceIPs));
ipFace2DCoords.resize(2,numFaceIPs);
ipWeights.reset(numIPs);
ipFaceWeights.reset(numFaceIPs);
// Use GAUSS2 for faces for now...
double a = 1.0/sqrt(3.0);
// Matrix of integration point locations
ipCoords(0,0) = 1.0; ipCoords(0,3) = 0.0;
ipCoords(1,0) = 0.0; ipCoords(1,3) = -1.0;
ipCoords(2,0) = 0.0; ipCoords(2,3) = 0.0;
//
ipCoords(0,1) = -1.0; ipCoords(0,4) = 0.0;
ipCoords(1,1) = 0.0; ipCoords(1,4) = 0.0;
ipCoords(2,1) = 0.0; ipCoords(2,4) = 1.0;
//
ipCoords(0,2) = 0.0; ipCoords(0,5) = 0.0;
ipCoords(1,2) = 1.0; ipCoords(1,5) = 0.0;
ipCoords(2,2) = 0.0; ipCoords(2,5) = -1.0;
// Integration points by face
ipFaceCoords[0](0,0) = -1; ipFaceCoords[3](0,0) = -a;
ipFaceCoords[0](1,0) = -a; ipFaceCoords[3](1,0) = 1;
ipFaceCoords[0](2,0) = -a; ipFaceCoords[3](2,0) = -a;
//
ipFaceCoords[0](0,1) = -1; ipFaceCoords[3](0,1) = -a;
ipFaceCoords[0](1,1) = a; ipFaceCoords[3](1,1) = 1;
ipFaceCoords[0](2,1) = -a; ipFaceCoords[3](2,1) = a;
//
ipFaceCoords[0](0,2) = -1; ipFaceCoords[3](0,2) = a;
ipFaceCoords[0](1,2) = a; ipFaceCoords[3](1,2) = 1;
ipFaceCoords[0](2,2) = a; ipFaceCoords[3](2,2) = a;
//
ipFaceCoords[0](0,3) = -1; ipFaceCoords[3](0,3) = a;
ipFaceCoords[0](1,3) = -a; ipFaceCoords[3](1,3) = 1;
ipFaceCoords[0](2,3) = a; ipFaceCoords[3](2,3) = -a;
ipFaceCoords[1](0,0) = 1; ipFaceCoords[4](0,0) = -a;
ipFaceCoords[1](1,0) = -a; ipFaceCoords[4](1,0) = -a;
ipFaceCoords[1](2,0) = -a; ipFaceCoords[4](2,0) = -1;
//
ipFaceCoords[1](0,1) = 1; ipFaceCoords[4](0,1) = a;
ipFaceCoords[1](1,1) = a; ipFaceCoords[4](1,1) = -a;
ipFaceCoords[1](2,1) = -a; ipFaceCoords[4](2,1) = -1;
//
ipFaceCoords[1](0,2) = 1; ipFaceCoords[4](0,2) = a;
ipFaceCoords[1](1,2) = a; ipFaceCoords[4](1,2) = a;
ipFaceCoords[1](2,2) = a; ipFaceCoords[4](2,2) = -1;
//
ipFaceCoords[1](0,3) = 1; ipFaceCoords[4](0,3) = -a;
ipFaceCoords[1](1,3) = -a; ipFaceCoords[4](1,3) = a;
ipFaceCoords[1](2,3) = a; ipFaceCoords[4](2,3) = -1;
ipFaceCoords[2](0,0) = -a; ipFaceCoords[5](0,0) = -a;
ipFaceCoords[2](1,0) = -1; ipFaceCoords[5](1,0) = -a;
ipFaceCoords[2](2,0) = -a; ipFaceCoords[5](2,0) = 1;
//
ipFaceCoords[2](0,1) = -a; ipFaceCoords[5](0,1) = a;
ipFaceCoords[2](1,1) = -1; ipFaceCoords[5](1,1) = -a;
ipFaceCoords[2](2,1) = a; ipFaceCoords[5](2,1) = 1;
//
ipFaceCoords[2](0,2) = a; ipFaceCoords[5](0,2) = a;
ipFaceCoords[2](1,2) = -1; ipFaceCoords[5](1,2) = a;
ipFaceCoords[2](2,2) = a; ipFaceCoords[5](2,2) = 1;
//
ipFaceCoords[2](0,3) = a; ipFaceCoords[5](0,3) = -a;
ipFaceCoords[2](1,3) = -1; ipFaceCoords[5](1,3) = a;
ipFaceCoords[2](2,3) = -a; ipFaceCoords[5](2,3) = 1;
// Integration points for all faces ignoring the
// redundant dim
ipFace2DCoords(0,0) = -a; ipFace2DCoords(0,2) = a;
ipFace2DCoords(1,0) = -a; ipFace2DCoords(1,2) = a;
//
ipFace2DCoords(0,1) = a; ipFace2DCoords(0,3) = -a;
ipFace2DCoords(1,1) = -a; ipFace2DCoords(1,3) = a;
// Integration point weights
ipWeights = 4.0/3.0;
// Face integration point weights
ipFaceWeights = 1.0;
break;
}
// 27 point quadrature
case GAUSS3: {
// Set number of IPs and face IPs
numIPs = 27;
numFaceIPs = 9;
// Size matrices and vectors thereof accordingly
ipCoords.resize(3,numIPs);
ipFaceCoords.assign(6,DENS_MAT(3,numFaceIPs));
ipFace2DCoords.resize(2,numFaceIPs);
ipWeights.reset(numIPs);
ipFaceWeights.reset(numFaceIPs);
double a = sqrt(3.0/5.0);
// Matrix of integration point locations & follows local
// conn
ipCoords(0,0) = -a; ipCoords(0,16) = -a;
ipCoords(1,0) = -a; ipCoords(1,16) = -a;
ipCoords(2,0) = -a; ipCoords(2,16) = 0;
//
ipCoords(0,1) = a; ipCoords(0,17) = -a;
ipCoords(1,1) = -a; ipCoords(1,17) = a;
ipCoords(2,1) = -a; ipCoords(2,17) = 0;
//
ipCoords(0,2) = a; ipCoords(0,18) = a;
ipCoords(1,2) = a; ipCoords(1,18) = -a;
ipCoords(2,2) = -a; ipCoords(2,18) = 0;
//
ipCoords(0,3) = -a; ipCoords(0,19) = a;
ipCoords(1,3) = a; ipCoords(1,19) = a;
ipCoords(2,3) = -a; ipCoords(2,19) = 0;
ipCoords(0,4) = -a; ipCoords(0,20) = 0;
ipCoords(1,4) = -a; ipCoords(1,20) = 0;
ipCoords(2,4) = a; ipCoords(2,20) = -a;
ipCoords(0,5) = a; ipCoords(0,21) = 0;
ipCoords(1,5) = -a; ipCoords(1,21) = 0;
ipCoords(2,5) = a; ipCoords(2,21) = a;
ipCoords(0,6) = a; ipCoords(0,22) = 0;
ipCoords(1,6) = a; ipCoords(1,22) = -a;
ipCoords(2,6) = a; ipCoords(2,22) = 0;
ipCoords(0,7) = -a; ipCoords(0,23) = 0;
ipCoords(1,7) = a; ipCoords(1,23) = a;
ipCoords(2,7) = a; ipCoords(2,23) = 0;
ipCoords(0,8) = 0; ipCoords(0,24) = -a;
ipCoords(1,8) = -a; ipCoords(1,24) = 0;
ipCoords(2,8) = -a; ipCoords(2,24) = 0;
ipCoords(0,9) = 0; ipCoords(0,25) = a;
ipCoords(1,9) = -a; ipCoords(1,25) = 0;
ipCoords(2,9) = a; ipCoords(2,25) = 0;
ipCoords(0,10) = 0; ipCoords(0,26) = 0;
ipCoords(1,10) = a; ipCoords(1,26) = 0;
ipCoords(2,10) = -a; ipCoords(2,26) = 0;
ipCoords(0,11) = 0;
ipCoords(1,11) = a;
ipCoords(2,11) = a;
ipCoords(0,12) = -a;
ipCoords(1,12) = 0;
ipCoords(2,12) = -a;
ipCoords(0,13) = -a;
ipCoords(1,13) = 0;
ipCoords(2,13) = a;
ipCoords(0,14) = a;
ipCoords(1,14) = 0;
ipCoords(2,14) = -a;
ipCoords(0,15) = a;
ipCoords(1,15) = 0;
ipCoords(2,15) = a;
// Integration points by face
ipFaceCoords[0](0,0) = -1; ipFaceCoords[0](0,5) = -1;
ipFaceCoords[0](1,0) = -a; ipFaceCoords[0](1,5) = 0;
ipFaceCoords[0](2,0) = -a; ipFaceCoords[0](2,5) = a;
//
ipFaceCoords[0](0,1) = -1; ipFaceCoords[0](0,6) = -1;
ipFaceCoords[0](1,1) = a; ipFaceCoords[0](1,6) = -a;
ipFaceCoords[0](2,1) = -a; ipFaceCoords[0](2,6) = 0;
//
ipFaceCoords[0](0,2) = -1; ipFaceCoords[0](0,7) = -1;
ipFaceCoords[0](1,2) = a; ipFaceCoords[0](1,7) = a;
ipFaceCoords[0](2,2) = a; ipFaceCoords[0](2,7) = 0;
//
ipFaceCoords[0](0,3) = -1; ipFaceCoords[0](0,8) = -1;
ipFaceCoords[0](1,3) = -a; ipFaceCoords[0](1,8) = 0;
ipFaceCoords[0](2,3) = a; ipFaceCoords[0](2,8) = 0;
//
ipFaceCoords[0](0,4) = -1;
ipFaceCoords[0](1,4) = 0;
ipFaceCoords[0](2,4) = -a;
ipFaceCoords[1](0,0) = 1; ipFaceCoords[1](0,5) = 1;
ipFaceCoords[1](1,0) = -a; ipFaceCoords[1](1,5) = 0;
ipFaceCoords[1](2,0) = -a; ipFaceCoords[1](2,5) = a;
//
ipFaceCoords[1](0,1) = 1; ipFaceCoords[1](0,6) = 1;
ipFaceCoords[1](1,1) = a; ipFaceCoords[1](1,6) = -a;
ipFaceCoords[1](2,1) = -a; ipFaceCoords[1](2,6) = 0;
//
ipFaceCoords[1](0,2) = 1; ipFaceCoords[1](0,7) = 1;
ipFaceCoords[1](1,2) = a; ipFaceCoords[1](1,7) = a;
ipFaceCoords[1](2,2) = a; ipFaceCoords[1](2,7) = 0;
//
ipFaceCoords[1](0,3) = 1; ipFaceCoords[1](0,8) = 1;
ipFaceCoords[1](1,3) = -a; ipFaceCoords[1](1,8) = 0;
ipFaceCoords[1](2,3) = a; ipFaceCoords[1](2,8) = 0;
//
ipFaceCoords[1](0,4) = 1;
ipFaceCoords[1](1,4) = 0;
ipFaceCoords[1](2,4) = -a;
ipFaceCoords[2](0,0) = -a; ipFaceCoords[2](0,5) = 0;
ipFaceCoords[2](1,0) = -1; ipFaceCoords[2](1,5) = -1;
ipFaceCoords[2](2,0) = -a; ipFaceCoords[2](2,5) = a;
//
ipFaceCoords[2](0,1) = -a; ipFaceCoords[2](0,6) = -a;
ipFaceCoords[2](1,1) = -1; ipFaceCoords[2](1,6) = -1;
ipFaceCoords[2](2,1) = a; ipFaceCoords[2](2,6) = 0;
//
ipFaceCoords[2](0,2) = a; ipFaceCoords[2](0,7) = a;
ipFaceCoords[2](1,2) = -1; ipFaceCoords[2](1,7) = -1;
ipFaceCoords[2](2,2) = a; ipFaceCoords[2](2,7) = 0;
//
ipFaceCoords[2](0,3) = a; ipFaceCoords[2](0,8) = 0;
ipFaceCoords[2](1,3) = -1; ipFaceCoords[2](1,8) = -1;
ipFaceCoords[2](2,3) = -a; ipFaceCoords[2](2,8) = 0;
//
ipFaceCoords[2](0,4) = 0;
ipFaceCoords[2](1,4) = -1;
ipFaceCoords[2](2,4) = -a;
ipFaceCoords[3](0,0) = -a; ipFaceCoords[3](0,5) = 0;
ipFaceCoords[3](1,0) = 1; ipFaceCoords[3](1,5) = 1;
ipFaceCoords[3](2,0) = -a; ipFaceCoords[3](2,5) = a;
//
ipFaceCoords[3](0,1) = -a; ipFaceCoords[3](0,6) = -a;
ipFaceCoords[3](1,1) = 1; ipFaceCoords[3](1,6) = 1;
ipFaceCoords[3](2,1) = a; ipFaceCoords[3](2,6) = 0;
//
ipFaceCoords[3](0,2) = a; ipFaceCoords[3](0,7) = a;
ipFaceCoords[3](1,2) = 1; ipFaceCoords[3](1,7) = 1;
ipFaceCoords[3](2,2) = a; ipFaceCoords[3](2,7) = 0;
//
ipFaceCoords[3](0,3) = a; ipFaceCoords[3](0,8) = 0;
ipFaceCoords[3](1,3) = 1; ipFaceCoords[3](1,8) = 1;
ipFaceCoords[3](2,3) = -a; ipFaceCoords[3](2,8) = 0;
//
ipFaceCoords[3](0,4) = 0;
ipFaceCoords[3](1,4) = 1;
ipFaceCoords[3](2,4) = -a;
ipFaceCoords[4](0,0) = -a; ipFaceCoords[4](0,5) = 0;
ipFaceCoords[4](1,0) = -a; ipFaceCoords[4](1,5) = a;
ipFaceCoords[4](2,0) = -1; ipFaceCoords[4](2,5) = -1;
//
ipFaceCoords[4](0,1) = a; ipFaceCoords[4](0,6) = -a;
ipFaceCoords[4](1,1) = -a; ipFaceCoords[4](1,6) = 0;
ipFaceCoords[4](2,1) = -1; ipFaceCoords[4](2,6) = -1;
//
ipFaceCoords[4](0,2) = a; ipFaceCoords[4](0,7) = a;
ipFaceCoords[4](1,2) = a; ipFaceCoords[4](1,7) = 0;
ipFaceCoords[4](2,2) = -1; ipFaceCoords[4](2,7) = -1;
//
ipFaceCoords[4](0,3) = -a; ipFaceCoords[4](0,8) = 0;
ipFaceCoords[4](1,3) = a; ipFaceCoords[4](1,8) = 0;
ipFaceCoords[4](2,3) = -1; ipFaceCoords[4](2,8) = -1;
//
ipFaceCoords[4](0,4) = 0;
ipFaceCoords[4](1,4) = -a;
ipFaceCoords[4](2,4) = -1;
ipFaceCoords[5](0,0) = -a; ipFaceCoords[5](0,5) = 0;
ipFaceCoords[5](1,0) = -a; ipFaceCoords[5](1,5) = a;
ipFaceCoords[5](2,0) = 1; ipFaceCoords[5](2,5) = 1;
//
ipFaceCoords[5](0,1) = a; ipFaceCoords[5](0,6) = -a;
ipFaceCoords[5](1,1) = -a; ipFaceCoords[5](1,6) = 0;
ipFaceCoords[5](2,1) = 1; ipFaceCoords[5](2,6) = 1;
//
ipFaceCoords[5](0,2) = a; ipFaceCoords[5](0,7) = a;
ipFaceCoords[5](1,2) = a; ipFaceCoords[5](1,7) = 0;
ipFaceCoords[5](2,2) = 1; ipFaceCoords[5](2,7) = 1;
//
ipFaceCoords[5](0,3) = -a; ipFaceCoords[5](0,8) = 0;
ipFaceCoords[5](1,3) = a; ipFaceCoords[5](1,8) = 0;
ipFaceCoords[5](2,3) = 1; ipFaceCoords[5](2,8) = 1;
//
ipFaceCoords[5](0,4) = 0;
ipFaceCoords[5](1,4) = -a;
ipFaceCoords[5](2,4) = 1;
// Integration points for all faces ignoring the
// redundant dim
ipFace2DCoords(0,0) = -a; ipFace2DCoords(0,5) = 0;
ipFace2DCoords(1,0) = -a; ipFace2DCoords(1,5) = a;
//
ipFace2DCoords(0,1) = a; ipFace2DCoords(0,6) = -a;
ipFace2DCoords(1,1) = -a; ipFace2DCoords(1,6) = 0;
//
ipFace2DCoords(0,2) = a; ipFace2DCoords(0,7) = a;
ipFace2DCoords(1,2) = a; ipFace2DCoords(1,7) = 0;
//
ipFace2DCoords(0,3) = -a; ipFace2DCoords(0,8) = 0;
ipFace2DCoords(1,3) = a; ipFace2DCoords(1,8) = 0;
//
ipFace2DCoords(0,4) = 0;
ipFace2DCoords(1,4) = -a;
// Integration point weights
for (int i=0; i<numIPs; ++i) {
if (i < 8) ipWeights[i] = 125.0/729.0;
else if (i < 20) ipWeights[i] = 200.0/729.0;
else if (i < 26) ipWeights[i] = 320.0/729.0;
else ipWeights[i] = 512.0/729.0;
}
// Face integration point weights
for (int i=0; i<numFaceIPs; ++i) {
if (i < 4) ipFaceWeights[i] = 25.0/81.0;
else if (i < 8) ipFaceWeights[i] = 40.0/81.0;
else ipFaceWeights[i] = 64.0/81.0;
}
break;
}
// Error
default: {
throw ATC_Error("Unrecognized quadrature type "
"for element type HEXA.");
}
}
} else if (geo == TETRA) {
switch (quad) {
// 4 point quadratures
case NODAL:
case GAUSS2: {
// Set number of IPs and face IPs
numIPs = 4;
numFaceIPs = 3;
// Size matrices and vectors thereof accordingly
ipCoords.resize(4,numIPs);
ipFaceCoords.assign(4,DENS_MAT(3,numFaceIPs));
ipFace2DCoords.resize(3,numFaceIPs);
ipWeights.reset(numIPs);
ipFaceWeights.reset(numFaceIPs);
double v1, v2, a1, a2;
v1 = 0.585410196624969;
v2 = 0.138196601125011;
a1 = 2.0/3.0;
a2 = 1.0/6.0;
if (quad == NODAL) {
// Nodal quadrature
v1 = 1;
v2 = 0;
a1 = 1;
a2 = 0;
}
// Integration point coordinates
ipCoords.resize(4, numIPs);
ipCoords(0,0) = v2; ipCoords(0,2) = v2;
ipCoords(1,0) = v2; ipCoords(1,2) = v1;
ipCoords(2,0) = v2; ipCoords(2,2) = v2;
ipCoords(3,0) = v1; ipCoords(3,2) = v2;
//
ipCoords(0,1) = v1; ipCoords(0,3) = v2;
ipCoords(1,1) = v2; ipCoords(1,3) = v2;
ipCoords(2,1) = v2; ipCoords(2,3) = v1;
ipCoords(3,1) = v2; ipCoords(3,3) = v2;
// Integration points by face
// ...face 0 ...face 2
ipFaceCoords[0](0,0) = a1; ipFaceCoords[2](0,0) = a2;
ipFaceCoords[0](1,0) = a2; ipFaceCoords[2](1,0) = 0;
ipFaceCoords[0](2,0) = a2; ipFaceCoords[2](2,0) = a2;
//
ipFaceCoords[0](0,1) = a2; ipFaceCoords[2](0,1) = a1;
ipFaceCoords[0](1,1) = a1; ipFaceCoords[2](1,1) = 0;
ipFaceCoords[0](2,1) = a2; ipFaceCoords[2](2,1) = a2;
//
ipFaceCoords[0](0,2) = a2; ipFaceCoords[2](0,2) = a2;
ipFaceCoords[0](1,2) = a2; ipFaceCoords[2](1,2) = 0;
ipFaceCoords[0](2,2) = a1; ipFaceCoords[2](2,2) = a1;
// ...face 1 ...face 3
ipFaceCoords[1](0,0) = 0; ipFaceCoords[3](0,0) = a2;
ipFaceCoords[1](1,0) = a1; ipFaceCoords[3](1,0) = a2;
ipFaceCoords[1](2,0) = a2; ipFaceCoords[3](2,0) = 0;
//
ipFaceCoords[1](0,1) = 0; ipFaceCoords[3](0,1) = a2;
ipFaceCoords[1](1,1) = a2; ipFaceCoords[3](1,1) = a1;
ipFaceCoords[1](2,1) = a2; ipFaceCoords[3](2,1) = 0;
//
ipFaceCoords[1](0,2) = 0; ipFaceCoords[3](0,2) = a1;
ipFaceCoords[1](1,2) = a2; ipFaceCoords[3](1,2) = a2;
ipFaceCoords[1](2,2) = a1; ipFaceCoords[3](2,2) = 0;
// 2D integration points for faces
ipFace2DCoords(0,0) = a2; ipFace2DCoords(0,2) = a2;
ipFace2DCoords(1,0) = a2; ipFace2DCoords(1,2) = a1;
ipFace2DCoords(2,0) = a1; ipFace2DCoords(2,2) = a2;
//
ipFace2DCoords(0,1) = a1;
ipFace2DCoords(1,1) = a2;
ipFace2DCoords(2,1) = a2;
// Integration point weights
ipWeights = (1.0/6.0)/numIPs;
// Integration point face weights
ipFaceWeights = (1.0/2.0)/numFaceIPs;
break;
}
case GAUSS3: {
// Set number of IPs and face IPs
numIPs = 5;
numFaceIPs = 4;
// Size matrices and vectors thereof accordingly
ipCoords.resize(4,numIPs);
ipFaceCoords.assign(4,DENS_MAT(3,numFaceIPs));
ipFace2DCoords.resize(3,numFaceIPs);
ipWeights.reset(numIPs);
ipFaceWeights.reset(numFaceIPs);
double v1, v2, v3, a1, a2, a3;
/* These weights for calculating Gaussian Quadrature
* points are taken from the paper "Integration Points
* for Triangles and Tetrahedra Obtained from the
* Gaussian Quadrature Points for a Line" by K. S. Sunder
* and R. A. Cookson, Computers and Structures, Vol 21,
* No. 5, 1985. */
v1 = 1.0/4.0;
v2 = 1.0/2.0;
v3 = 1.0/6.0;
a1 = 1.0/3.0;
a2 = 3.0/5.0;
a3 = 1.0/5.0;
// Integration point coordinates
ipCoords.resize(4, numIPs);
ipCoords(0,0) = v1;
ipCoords(1,0) = v1;
ipCoords(2,0) = v1;
ipCoords(3,0) = v1;
//
ipCoords(0,1) = v3; ipCoords(0,3) = v3;
ipCoords(1,1) = v3; ipCoords(1,3) = v2;
ipCoords(2,1) = v3; ipCoords(2,3) = v3;
ipCoords(3,1) = v2; ipCoords(3,3) = v3;
//
ipCoords(0,2) = v2; ipCoords(0,4) = v3;
ipCoords(1,2) = v3; ipCoords(1,4) = v3;
ipCoords(2,2) = v3; ipCoords(2,4) = v2;
ipCoords(3,2) = v3; ipCoords(3,4) = v3;
// Integration points by face
// ...face 0 ...face 2
ipFaceCoords[0](0,0) = a1; ipFaceCoords[2](0,0) = a1;
ipFaceCoords[0](1,0) = a1; ipFaceCoords[2](1,0) = 0;
ipFaceCoords[0](2,0) = a1; ipFaceCoords[2](2,0) = a1;
//
ipFaceCoords[0](0,1) = a2; ipFaceCoords[2](0,1) = a3;
ipFaceCoords[0](1,1) = a3; ipFaceCoords[2](1,1) = 0;
ipFaceCoords[0](2,1) = a3; ipFaceCoords[2](2,1) = a3;
//
ipFaceCoords[0](0,2) = a3; ipFaceCoords[2](0,2) = a2;
ipFaceCoords[0](1,2) = a2; ipFaceCoords[2](1,2) = 0;
ipFaceCoords[0](2,2) = a3; ipFaceCoords[2](2,2) = a3;
//
ipFaceCoords[0](0,3) = a3; ipFaceCoords[2](0,3) = a3;
ipFaceCoords[0](1,3) = a3; ipFaceCoords[2](1,3) = 0;
ipFaceCoords[0](2,3) = a2; ipFaceCoords[2](2,3) = a2;
// ...face 1 ...face 3
ipFaceCoords[1](0,0) = 0; ipFaceCoords[3](0,0) = a1;
ipFaceCoords[1](1,0) = a1; ipFaceCoords[3](1,0) = a1;
ipFaceCoords[1](2,0) = a1; ipFaceCoords[3](2,0) = 0;
//
ipFaceCoords[1](0,1) = 0; ipFaceCoords[3](0,1) = a3;
ipFaceCoords[1](1,1) = a2; ipFaceCoords[3](1,1) = a3;
ipFaceCoords[1](2,1) = a3; ipFaceCoords[3](2,1) = 0;
//
ipFaceCoords[1](0,2) = 0; ipFaceCoords[3](0,2) = a3;
ipFaceCoords[1](1,2) = a3; ipFaceCoords[3](1,2) = a2;
ipFaceCoords[1](2,2) = a3; ipFaceCoords[3](2,2) = 0;
//
ipFaceCoords[1](0,3) = 0; ipFaceCoords[3](0,3) = a2;
ipFaceCoords[1](1,3) = a3; ipFaceCoords[3](1,3) = a3;
ipFaceCoords[1](2,3) = a2; ipFaceCoords[3](2,3) = 0;
// 2D integration points for faces
//
ipFace2DCoords(0,0) = a1; ipFace2DCoords(0,2) = a2;
ipFace2DCoords(1,0) = a1; ipFace2DCoords(1,2) = a3;
ipFace2DCoords(2,0) = a1; ipFace2DCoords(2,2) = a3;
//
ipFace2DCoords(0,1) = a3; ipFace2DCoords(0,3) = a3;
ipFace2DCoords(1,1) = a3; ipFace2DCoords(1,3) = a2;
ipFace2DCoords(2,1) = a2; ipFace2DCoords(2,3) = a3;
for (int i=0; i<numIPs; ++i) {
if (i < 1) ipWeights[i] = -4.0/5.0;
else ipWeights[i] = 9.0/20.0;
}
// Face integration point weights
for (int i=0; i<numFaceIPs; ++i) {
if (i < 1) ipFaceWeights[i] = -9.0/16.0;
else ipFaceWeights[i] = 25.0/48.0;
}
break;
}
// Error
default: {
throw ATC_Error("Unrecognized quadrature type "
"for element type TETRA.");
}
}
}
}
};
}; // namespace ATC
#endif // FE_QUADRATURE_H
diff --git a/lib/atc/FieldManager.cpp b/lib/atc/FieldManager.cpp
index c0c99c83d..9a74fc22c 100644
--- a/lib/atc/FieldManager.cpp
+++ b/lib/atc/FieldManager.cpp
@@ -1,504 +1,548 @@
#include "FieldManager.h"
#include "ATC_Method.h"
#include "LammpsInterface.h"
#include "PerAtomQuantity.h"
#include "TransferOperator.h"
+using std::string;
namespace ATC {
typedef PerAtomQuantity<double> PAQ;
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
FieldManager::FieldManager(ATC_Method * atc):
atc_(atc),
interscaleManager_(atc->interscale_manager())
{};
//-----------------------------------------------------------------------------
//* restricted_atom_quantity
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::restricted_atom_quantity(FieldName field, string name, PAQ * atomicQuantity)
{
if (name == "default") { name = field_to_restriction_name(field); }
DENS_MAN * quantity = interscaleManager_.dense_matrix(name);
if (!quantity){
if (field == CHARGE_DENSITY) {
atomicQuantity = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE);
}
else if (field == MASS_DENSITY) {
atomicQuantity = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS);
}
else {
if (!atomicQuantity) {
throw ATC_Error("FieldManager::restricted_atom_quantity - need to supply PAQ if restricted quantity does not already exist");
}
}
quantity = new AtfShapeFunctionRestriction(atc_,atomicQuantity,atc_->accumulant());
interscaleManager_.add_dense_matrix(quantity,name);
}
return quantity;
}
//-----------------------------------------------------------------------------
//* restricted_atom_quantity
//-----------------------------------------------------------------------------
- DENS_MAN * FieldManager::projected_atom_quantity(FieldName field,string name, PAQ * atomic, FieldName massMat, DIAG_MAN * normalization)
+ DENS_MAN * FieldManager::projected_atom_quantity(FieldName field,string name, PAQ * atomic, DIAG_MAN * normalization)
{
if (atc_->use_md_mass_normalization()) {
if (name == "default") { name = field_to_intrinsic_name(field); }
DENS_MAN * quantity = interscaleManager_.dense_matrix(name);
if (!quantity) {
DENS_MAN * restricted = restricted_atom_quantity(field,field_to_restriction_name(field),atomic);
- quantity = new AtfShapeFunctionMdProjection(atc_,restricted,massMat);
+ quantity = new AtfShapeFunctionMdProjection(atc_,restricted,use_mass_matrix(field));
interscaleManager_.add_dense_matrix(quantity,name);
}
return quantity;
}
else {
if (name == "default") { name = field_to_string(field); }
DENS_MAN * quantity = interscaleManager_.dense_matrix(name);
if (quantity) return quantity;
if (atc_->kernel_on_the_fly()) {
if (atc_->kernel_based()) {
quantity = new OnTheFlyKernelAccumulationNormalized(atc_, atomic,
- atc_->kernel_function(),
- atc_->atom_coarsegraining_positions(),
- normalization);
+ atc_->kernel_function(),
+ atc_->atom_coarsegraining_positions(),
+ normalization);
} else {
quantity = new OnTheFlyMeshAccumulationNormalized(atc_, atomic,
- atc_->atom_coarsegraining_positions(),
- normalization);
+ atc_->atom_coarsegraining_positions(),
+ normalization);
}
} else {
quantity = new AtfProjection(atc_, atomic,
atc_->accumulant(),
normalization);
}
interscaleManager_.add_dense_matrix(quantity,name);
return quantity;
}
}
//-----------------------------------------------------------------------------
//* referenced_projected_atom_quantity
//-----------------------------------------------------------------------------
- DENS_MAN * FieldManager::referenced_projected_atom_quantity(FieldName field,string name, PAQ * atomic, const DENS_MAT * reference, FieldName massMat, DIAG_MAN * normalization)
+ DENS_MAN * FieldManager::referenced_projected_atom_quantity(FieldName field,string name, PAQ * atomic, DENS_MAN * reference, DIAG_MAN * normalization)
{
if (name == "default") { name = field_to_string(field); }
DENS_MAN * quantity = interscaleManager_.dense_matrix(name);
if (quantity) return quantity;
if (atc_->use_md_mass_normalization()) {
DENS_MAN * restricted = restricted_atom_quantity(field,field_to_restriction_name(field),atomic);
- quantity = new AtfShapeFunctionMdProjectionReferenced(atc_,restricted,reference,massMat);
+ quantity = new AtfShapeFunctionMdProjectionReferenced(atc_,restricted,reference,use_mass_matrix(field));
}
else if (atc_->kernel_on_the_fly()) {
if (atc_->kernel_based()) {
quantity = new OnTheFlyKernelAccumulationNormalizedReferenced(atc_,
atomic,
atc_->kernel_function(),
atc_->atom_coarsegraining_positions(),
normalization,
reference);
} else {
quantity = new OnTheFlyMeshAccumulationNormalizedReferenced(atc_,
atomic,
atc_->atom_coarsegraining_positions(),
normalization,
reference);
}
} else {
quantity = new AtfProjectionReferenced(atc_, atomic,
atc_->accumulant(),
reference,
normalization);
}
interscaleManager_.add_dense_matrix(quantity,name);
return quantity;
}
//-----------------------------------------------------------------------------
//* scaled_projected_atom_quantity
//-----------------------------------------------------------------------------
- DENS_MAN * FieldManager::scaled_projected_atom_quantity(FieldName field,string name, PAQ * atomic, double scale, FieldName massMat, DIAG_MAN * normalization)
+ DENS_MAN * FieldManager::scaled_projected_atom_quantity(FieldName field,string name, PAQ * atomic, double scale, DIAG_MAN * normalization)
{
if (name == "default") { name = field_to_string(field); }
DENS_MAN * quantity = interscaleManager_.dense_matrix(name);
if (quantity) return quantity;
if (atc_->use_md_mass_normalization()) {
DENS_MAN * restricted = restricted_atom_quantity(field,field_to_restriction_name(field),atomic);
- quantity = new AtfShapeFunctionMdProjectionScaled(atc_,restricted,scale,massMat);
+ quantity = new AtfShapeFunctionMdProjectionScaled(atc_,restricted,scale,use_mass_matrix(field));
}
else if (atc_->kernel_on_the_fly()) {
if (atc_->kernel_based()) {
quantity = new OnTheFlyKernelAccumulationNormalizedScaled(atc_, atomic,
atc_->kernel_function(),
atc_->atom_coarsegraining_positions(),
normalization,
scale);
} else {
quantity = new OnTheFlyMeshAccumulationNormalizedScaled(atc_, atomic,
atc_->atom_coarsegraining_positions(),
normalization,
scale);
}
} else {
quantity = new AtfProjectionScaled(atc_, atomic,
atc_->accumulant(),
scale,
normalization);
}
interscaleManager_.add_dense_matrix(quantity,name);
return quantity;
}
//-----------------------------------------------------------------------------
//* CHARGE_DENSITY
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::charge_density(string name)
{
FundamentalAtomQuantity * atomic = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE);
- return projected_atom_quantity(CHARGE_DENSITY,name,atomic,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ return projected_atom_quantity(CHARGE_DENSITY,name,atomic,atc_->accumulant_inverse_volumes());
}
//-----------------------------------------------------------------------------
//* MASS_DENSITY
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::mass_density(string name)
{
FundamentalAtomQuantity * atomic = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS);
- return projected_atom_quantity(MASS_DENSITY,name,atomic,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ return projected_atom_quantity(MASS_DENSITY,name,atomic,atc_->accumulant_inverse_volumes());
}
//-----------------------------------------------------------------------------
//* SPECIES_CONCENTRATION
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::species_concentration(string name)
{
- DENS_MAN * c = NULL;
-#ifdef ATC_VERBOSE
- atc_->print_tracked();
-#endif
- PAQ * atomSpecies = atomic_species_vector();
-
- if (atc_->kernel_on_the_fly()) {
- if (atc_->kernel_based()) {
- c = new OnTheFlyKernelAccumulationNormalized(atc_, atomSpecies,
- atc_->kernel_function(),
- atc_->atom_coarsegraining_positions(),
- atc_->accumulant_inverse_volumes());
- } else {
- c = new OnTheFlyMeshAccumulationNormalized(atc_, atomSpecies,
- atc_->atom_coarsegraining_positions(),
- atc_->accumulant_inverse_volumes());
- }
- } else {
- c = new AtfProjection(atc_, atomSpecies,
- atc_->accumulant(),
- atc_->accumulant_inverse_volumes());
+ PerAtomQuantity<double> * atomTypeVector = interscaleManager_.per_atom_quantity("atom_species_vector");
+ if (!atomTypeVector) {
+ atomTypeVector = new AtomTypeVector(atc_,atc_->type_list(),atc_->group_list());
+ interscaleManager_.add_per_atom_quantity(atomTypeVector,"atom_species_vector");
}
- if (name == "default") { name = field_to_string(SPECIES_CONCENTRATION); }
- interscaleManager_.add_dense_matrix(c,name);
- return c;
+ return projected_atom_quantity(SPECIES_CONCENTRATION,name,atomTypeVector,atc_->accumulant_inverse_volumes());
}
//-----------------------------------------------------------------------------
//* NUMBER_DENSITY
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::number_density(string name)
{
PAQ * atomic = interscaleManager_.per_atom_quantity("atomNumber");
if (!atomic) {
atomic = new AtomNumber(atc_);
interscaleManager_.add_per_atom_quantity(atomic, "atomNumber");
}
- return projected_atom_quantity(NUMBER_DENSITY,name,atomic,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ return projected_atom_quantity(NUMBER_DENSITY,name,atomic,atc_->accumulant_inverse_volumes());
}
//-----------------------------------------------------------------------------
//* MOMENTUM
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::momentum(string name)
{
PAQ * atomic = interscaleManager_.per_atom_quantity("atomMomentum");
if (!atomic) {
atomic = new AtomicMomentum(atc_);
interscaleManager_.add_per_atom_quantity(atomic, "atomMomentum");
}
- return projected_atom_quantity(MOMENTUM,name,atomic,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ return projected_atom_quantity(MOMENTUM,name,atomic,atc_->accumulant_inverse_volumes());
}
//-----------------------------------------------------------------------------
//* VELOCITY
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::velocity(string name)
{
if (name == "default") { name = field_to_string(VELOCITY); }
DENS_MAN * v = interscaleManager_.dense_matrix(name);
if (v) return v;
if (atc_->use_md_mass_normalization()) {
PAQ * atomic = interscaleManager_.per_atom_quantity("atomMomentum");
if (!atomic) {
atomic = new AtomicMomentum(atc_);
interscaleManager_.add_per_atom_quantity(atomic, "atomMomentum");
}
DENS_MAN * restricted = restricted_atom_quantity(VELOCITY,field_to_restriction_name(VELOCITY),atomic);
v = new AtfShapeFunctionMdProjection(atc_,restricted,VELOCITY);
}
else {
DENS_MAN* p = interscaleManager_.dense_matrix(field_to_string(MOMENTUM));
if (!p) p = nodal_atomic_field(MOMENTUM);
DENS_MAN* m = interscaleManager_.dense_matrix(field_to_string(MASS_DENSITY));
if (!m) m = nodal_atomic_field(MASS_DENSITY);
v = new DenseMatrixQuotient(p,m);
}
interscaleManager_.add_dense_matrix(v,field_to_string(VELOCITY));
return v;
}
//-----------------------------------------------------------------------------
//* PROJECTED_VELOCITY
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::projected_velocity(string name)
{
FundamentalAtomQuantity * atomic = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY);
- return projected_atom_quantity(PROJECTED_VELOCITY,name,atomic,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ return projected_atom_quantity(PROJECTED_VELOCITY,name,atomic,atc_->accumulant_inverse_volumes());
}
//-----------------------------------------------------------------------------
//* DISPLACEMENT
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::displacement(string name)
{
if (name == "default") { name = field_to_string(DISPLACEMENT); }
DENS_MAN * u = interscaleManager_.dense_matrix(name);
if (u) return u;
PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicMassWeightedDisplacement");
if (!atomic) {
FundamentalAtomQuantity * atomMasses = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS);
FundamentalAtomQuantity * atomPositions = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION);
atomic = new AtomicMassWeightedDisplacement(atc_,atomPositions, atomMasses, atc_->atom_reference_positions(), INTERNAL);
interscaleManager_.add_per_atom_quantity(atomic,"AtomicMassWeightedDisplacement");
}
if (atc_->use_md_mass_normalization()) {
DENS_MAN * restricted = restricted_atom_quantity(DISPLACEMENT,field_to_restriction_name(DISPLACEMENT),atomic);
u = new AtfShapeFunctionMdProjection(atc_,restricted,VELOCITY);
}
else {
DENS_MAN * q = NULL;
if (atc_->kernel_on_the_fly()) {
if (atc_->kernel_based()) {
q = new OnTheFlyKernelAccumulationNormalized(atc_, atomic,
atc_->kernel_function(),
atc_->atom_coarsegraining_positions(),
atc_->accumulant_inverse_volumes());
} else {
q = new OnTheFlyMeshAccumulationNormalized(atc_, atomic,
atc_->atom_coarsegraining_positions(),
atc_->accumulant_inverse_volumes());
}
} else {
q = new AtfProjection(atc_, atomic,
atc_->accumulant(),
atc_->accumulant_inverse_volumes());
}
interscaleManager_.add_dense_matrix(q,"CoarseGrainedAMWD");
DENS_MAN* m = interscaleManager_.dense_matrix(field_to_string(MASS_DENSITY));
u = new DenseMatrixQuotient(q,m);
}
interscaleManager_.add_dense_matrix(u,name);
return u;
}
//-----------------------------------------------------------------------------
//* REFERENCE_POTENTIAL_ENERGY
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::reference_potential_energy(string name)
{
- PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicReferencePotential");
- if (!atomic) {
- atomic = new AtcAtomQuantity<double>(atc_);
- interscaleManager_.add_per_atom_quantity(atomic, "AtomicReferencePotential");
- atomic->set_memory_type(PERSISTENT);
+ DENS_MAN * rpe = interscaleManager_.dense_matrix(field_to_string(REFERENCE_POTENTIAL_ENERGY));
+ if (! rpe ) {
+ PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicReferencePotential");
+ if (!atomic) {
+ atomic = new AtcAtomQuantity<double>(atc_);
+ interscaleManager_.add_per_atom_quantity(atomic, "AtomicReferencePotential");
+ atomic->set_memory_type(PERSISTENT);
+ }
+
+ SPAR_MAN * referenceAccumulant = interscaleManager_.sparse_matrix("ReferenceAccumulant");
+ if (!referenceAccumulant) {
+ referenceAccumulant = new SPAR_MAN();
+ referenceAccumulant->set_memory_type(PERSISTENT);
+ interscaleManager_.add_sparse_matrix(referenceAccumulant,
+ "ReferenceAccumulant");
+ }
+
+ DIAG_MAN * referenceAccumulantInverseVolumes = interscaleManager_.diagonal_matrix("ReferenceAccumulantInverseVolumes");
+ if (!referenceAccumulantInverseVolumes) {
+ referenceAccumulantInverseVolumes = new DIAG_MAN();
+ referenceAccumulantInverseVolumes->set_memory_type(PERSISTENT);
+ interscaleManager_.add_diagonal_matrix(referenceAccumulantInverseVolumes,
+ "ReferenceAccumulantInverseVolumes");
+ }
+
+ rpe = new AtfProjection(atc_, atomic,
+ referenceAccumulant,
+ referenceAccumulantInverseVolumes);
+ interscaleManager_.add_dense_matrix(rpe,field_to_string(REFERENCE_POTENTIAL_ENERGY));
+ rpe->set_memory_type(PERSISTENT);
}
- return projected_atom_quantity(REFERENCE_POTENTIAL_ENERGY,"NodalAtomicReferencePotential",atomic,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ return rpe;
}
//-----------------------------------------------------------------------------
//* POTENTIAL_ENERGY
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::potential_energy(string name)
{
PerAtomQuantity<double> * atomic = interscaleManager_.per_atom_quantity("AtomicPotentialEnergy");
- const DENS_MAT * reference = atc_->nodal_ref_potential_energy();
- return referenced_projected_atom_quantity(POTENTIAL_ENERGY,name,atomic,reference,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ if (!atomic) {
+ atomic = new ComputedAtomQuantity(atc_,(atc_->lammps_interface())->compute_pe_name(), atc_->pe_scale());
+ interscaleManager_.add_per_atom_quantity(atomic,"AtomicPotentialEnergy");
+ }
+ DENS_MAN * reference = interscaleManager_.dense_matrix(field_to_string(REFERENCE_POTENTIAL_ENERGY));
+ if (reference) {
+ return referenced_projected_atom_quantity(POTENTIAL_ENERGY,name,atomic,reference,atc_->accumulant_inverse_volumes());
+ }
+ else {
+ return projected_atom_quantity(POTENTIAL_ENERGY,name,atomic,atc_->accumulant_inverse_volumes());
+ }
}
//-----------------------------------------------------------------------------
//* TEMPERATURE
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::temperature(string name)
{
double Tcoef = 1./((atc_->nsd())*(atc_->lammps_interface())->kBoltzmann());
PAQ * atomic = per_atom_quantity("AtomicTwiceFluctuatingKineticEnergy");
- return scaled_projected_atom_quantity(TEMPERATURE,name,atomic,Tcoef,TEMPERATURE,atc_->accumulant_weights());
+ return scaled_projected_atom_quantity(TEMPERATURE,name,atomic,Tcoef,atc_->accumulant_weights());
}
//-----------------------------------------------------------------------------
//* KINETIC_TEMPERATURE
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::kinetic_temperature(string name)
{
double Tcoef = 1./((atc_->nsd())*(atc_->lammps_interface())->kBoltzmann());
PAQ * atomic = per_atom_quantity("AtomicTwiceKineticEnergy");
- return scaled_projected_atom_quantity(KINETIC_TEMPERATURE,name,atomic,Tcoef,MASS_DENSITY,atc_->accumulant_weights());
+ return scaled_projected_atom_quantity(KINETIC_TEMPERATURE,name,atomic,Tcoef,atc_->accumulant_weights());
}
//-----------------------------------------------------------------------------
//* THERMAL_ENERGY
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::thermal_energy(string name)
{
double Ecoef = 0.5*atc_->ke_scale();
PAQ * atomic = per_atom_quantity("AtomicTwiceFluctuatingKineticEnergy");
- return scaled_projected_atom_quantity(THERMAL_ENERGY,name,atomic,Ecoef,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ return scaled_projected_atom_quantity(THERMAL_ENERGY,name,atomic,Ecoef,atc_->accumulant_inverse_volumes());
}
//-----------------------------------------------------------------------------
//* KINETIC_ENERGY
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::kinetic_energy(string name)
{
double Ecoef = 0.5*atc_->ke_scale();
PAQ * atomic = per_atom_quantity("AtomicTwiceKineticEnergy");
- return scaled_projected_atom_quantity(KINETIC_ENERGY,name,atomic,Ecoef,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ return scaled_projected_atom_quantity(KINETIC_ENERGY,name,atomic,Ecoef,atc_->accumulant_inverse_volumes());
}
//-----------------------------------------------------------------------------
//* CHARGE_FLUX
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::charge_flux(string name)
{
PAQ * atomic = per_atom_quantity("AtomicChargeVelocity");
- return projected_atom_quantity(CHARGE_FLUX,name,atomic,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ return projected_atom_quantity(CHARGE_FLUX,name,atomic,atc_->accumulant_inverse_volumes());
}
//-----------------------------------------------------------------------------
//* SPECIES_FLUX
//-----------------------------------------------------------------------------
DENS_MAN * FieldManager::species_flux(string name)
{
PAQ * atomic = per_atom_quantity("AtomicSpeciesVelocity");
- return projected_atom_quantity(SPECIES_FLUX,name,atomic,MASS_DENSITY,atc_->accumulant_inverse_volumes());
+ return projected_atom_quantity(SPECIES_FLUX,name,atomic,atc_->accumulant_inverse_volumes());
}
+//-----------------------------------------------------------------------------
+//* INTERNAL_ENERGY
+//-----------------------------------------------------------------------------
+ DENS_MAN * FieldManager::internal_energy(string name)
+ {
+ if (name == "default") { name = field_to_string(INTERNAL_ENERGY); }
+ DENS_MAN * te = thermal_energy(field_to_string(THERMAL_ENERGY));
+ DENS_MAN * pe = potential_energy(field_to_string(POTENTIAL_ENERGY));
+ DenseMatrixSum * ie = new DenseMatrixSum(te,pe);
+ interscaleManager_.add_dense_matrix(ie,name);
+ return ie;
+ }
+//-----------------------------------------------------------------------------
+//* ENERGY
+//-----------------------------------------------------------------------------
+ DENS_MAN * FieldManager::energy(string name)
+ {
+ if (name == "default") { name = field_to_string(ENERGY); }
+ DENS_MAN * ke = kinetic_energy(field_to_string(KINETIC_ENERGY));
+ DENS_MAN * pe = potential_energy(field_to_string(POTENTIAL_ENERGY));
+ DenseMatrixSum * e = new DenseMatrixSum(ke,pe);
+ interscaleManager_.add_dense_matrix(e,name);
+
+ return e;
+ }
+
+
//=============================================================================
//* PER ATOM QUANTITIES
//=============================================================================
//-----------------------------------------------------------------------------
//* 2 KE '
//-----------------------------------------------------------------------------
PAQ * FieldManager::atomic_twice_fluctuating_kinetic_energy()
{
PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicTwiceFluctuatingKineticEnergy");
if (!atomic) {
FundamentalAtomQuantity * atomMass = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS);
FundamentalAtomQuantity * atomVelocity = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY);
PAQ * vbar = per_atom_quantity(field_to_prolongation_name(VELOCITY));
atomic = new TwiceFluctuatingKineticEnergy(atc_,atomVelocity,atomMass,vbar);
interscaleManager_.add_per_atom_quantity(atomic, "AtomicTwiceFluctuatingKineticEnergy");
}
return atomic;
}
//-----------------------------------------------------------------------------
//* 2 KE
//-----------------------------------------------------------------------------
PAQ * FieldManager::atomic_twice_kinetic_energy()
{
PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicTwiceKineticEnergy");
if (!atomic) {
FundamentalAtomQuantity * atomMass = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_MASS);
FundamentalAtomQuantity * atomVelocity = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY);
atomic = new TwiceKineticEnergy(atc_,atomVelocity,atomMass);
interscaleManager_.add_per_atom_quantity(atomic, "AtomicTwiceKineticEnergy");
}
return atomic;
}
//-----------------------------------------------------------------------------
//* v'
//-----------------------------------------------------------------------------
PAQ * FieldManager::atomic_fluctuating_velocity()
{
PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicFluctuatingVelocity");
if (!atomic) {
FundamentalAtomQuantity * atomVelocity = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY);
PAQ * atomMeanVelocity = per_atom_quantity(field_to_prolongation_name(VELOCITY));
atomic = new FluctuatingVelocity(atc_,atomVelocity,atomMeanVelocity);
interscaleManager_.add_per_atom_quantity(atomic, "AtomicFluctuatingVelocity");
}
return atomic;
}
//-----------------------------------------------------------------------------
//* q v'
//-----------------------------------------------------------------------------
PAQ * FieldManager::atomic_charge_velocity()
{
PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicChargeVelocity");
if (!atomic) {
PAQ * atomVelocity = atomic_fluctuating_velocity();
FundamentalAtomQuantity * atomCharge = interscaleManager_.fundamental_atom_quantity(LammpsInterface::ATOM_CHARGE);
atomic = new ChargeVelocity(atc_,atomVelocity,atomCharge);
interscaleManager_.add_per_atom_quantity(atomic, "AtomicChargeVelocity");
}
return atomic;
}
//-----------------------------------------------------------------------------
//* m^a v'
//-----------------------------------------------------------------------------
PAQ * FieldManager::atomic_species_velocity()
{
PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicSpeciesVelocity");
if (!atomic) {
PAQ * atomVelocity = atomic_fluctuating_velocity();
PAQ * atomSpecies = atomic_species_vector();
atomic = new SpeciesVelocity(atc_,atomVelocity,atomSpecies);
interscaleManager_.add_per_atom_quantity(atomic, "AtomicSpeciesVelocity");
}
return atomic;
}
//-----------------------------------------------------------------------------
//* [0 1 0 0 ] for type 2 atom
//-----------------------------------------------------------------------------
PAQ * FieldManager::atomic_species_vector()
{
PAQ * atomic = interscaleManager_.per_atom_quantity("AtomicSpeciesVector");
if (!atomic) {
atomic = new AtomTypeVector(atc_,atc_->type_list(),atc_->group_list());
interscaleManager_.add_per_atom_quantity(atomic,"AtomicSpeciesVector");
}
return atomic;
}
-
- PAQ * FieldManager::prolonged_field(FieldName field)
- {
- PAQ * quantity = interscaleManager_.per_atom_quantity(field_to_prolongation_name(field));
- if (!quantity) {
-
+ //-----------------------------------------------------------------------------
+ //* Prolonged coarse scale field
+ //-----------------------------------------------------------------------------
+ PAQ * FieldManager::prolonged_field(FieldName field)
+ {
+ PAQ * quantity = interscaleManager_.per_atom_quantity(field_to_prolongation_name(field));
+ if (!quantity) {
+
DENS_MAN * coarseQuantity = interscaleManager_.dense_matrix(field_to_string(field));
- if (!coarseQuantity) coarseQuantity = nodal_atomic_field(field);
- if (!coarseQuantity) throw ATC_Error("can not prolong quantity: " + field_to_string(field) + " no field registered");
- if (atc_->kernel_on_the_fly()) {
- quantity = new OnTheFlyShapeFunctionProlongation(atc_,
- coarseQuantity,atc_->atom_coarsegraining_positions());
- } else {
- quantity = new FtaShapeFunctionProlongation(atc_,
- coarseQuantity,atc_->interpolant());
- }
- interscaleManager_.add_per_atom_quantity(quantity,
- field_to_prolongation_name(field));
- }
- return quantity;
- }
-
+ if (!coarseQuantity) coarseQuantity = nodal_atomic_field(field);
+ if (!coarseQuantity) throw ATC_Error("can not prolong quantity: " + field_to_string(field) + " no field registered");
+ if (atc_->kernel_on_the_fly()) {
+ quantity = new OnTheFlyShapeFunctionProlongation(atc_,
+ coarseQuantity,atc_->atom_coarsegraining_positions());
+ } else {
+ quantity = new FtaShapeFunctionProlongation(atc_,
+ coarseQuantity,atc_->interpolant());
+ }
+ interscaleManager_.add_per_atom_quantity(quantity,
+ field_to_prolongation_name(field));
+ }
+ return quantity;
+ }
}
diff --git a/lib/atc/FieldManager.h b/lib/atc/FieldManager.h
index 903b57b8d..d3db3f268 100644
--- a/lib/atc/FieldManager.h
+++ b/lib/atc/FieldManager.h
@@ -1,124 +1,132 @@
#ifndef FIELD_MANAGER_H
#define FIELD_MANAGER_H
+#include <string>
+
#include "ATC_TypeDefs.h"
#include "ATC_Error.h"
#include "PerAtomQuantity.h"
namespace ATC {
class ATC_Method;
enum CanonicalName {ATOMIC_TWICE_FLUCTUATING_KINETIC_ENERGY,
ATOMIC_TWICE_KINETIC_ENERGY,
ATOMIC_FLUCTUATING_VELOCITY,
ATOMIC_CHARGE_VELOCITY,
ATOMIC_SPECIES_VELOCITY,
PROLONGED_VELOCITY};
typedef PerAtomQuantity<double> PAQ;
/**
* @class FieldManager
* @brief Manager for constructing fields from atomic data
*/
class FieldManager{
public:
FieldManager(ATC_Method * atc);
virtual ~FieldManager(void){};
+ /** this function returns a (density) field derived from atomic data */
DENS_MAN * nodal_atomic_field(FieldName fieldName,
- string name = "default") {
+ std::string name = "default") {
switch (fieldName) {
case CHARGE_DENSITY: return charge_density(name);
case MASS_DENSITY: return mass_density(name);
case SPECIES_CONCENTRATION: return species_concentration(name);
case NUMBER_DENSITY: return number_density(name);
case MOMENTUM: return momentum(name);
case VELOCITY: return velocity(name);
case PROJECTED_VELOCITY: return projected_velocity(name);
case DISPLACEMENT: return displacement(name);
case REFERENCE_POTENTIAL_ENERGY: return reference_potential_energy(name);
case POTENTIAL_ENERGY: return potential_energy(name);
case THERMAL_ENERGY: return thermal_energy(name);
case KINETIC_ENERGY: return kinetic_energy(name);
case TEMPERATURE: return temperature(name);
case KINETIC_TEMPERATURE: return kinetic_temperature(name);
case CHARGE_FLUX: return charge_flux(name);
case SPECIES_FLUX: return species_flux(name);
+ case INTERNAL_ENERGY: return internal_energy(name);
+ case ENERGY: return energy(name);
default: throw ATC_Error("FieldManager:: unknown field"); return NULL;
}
}
- CanonicalName string_to_canonical_name(string name){
+ CanonicalName string_to_canonical_name(std::string name){
if (name == "AtomicTwiceFluctuatingKineticEnergy")
return ATOMIC_TWICE_FLUCTUATING_KINETIC_ENERGY;
else if (name == "AtomicTwiceKineticEnergy")
return ATOMIC_TWICE_KINETIC_ENERGY;
else if (name == "AtomicTwiceKineticEnergy")
return ATOMIC_TWICE_KINETIC_ENERGY;
else if (name == "AtomicFluctuatingVelocity")
return ATOMIC_FLUCTUATING_VELOCITY;
else if (name == "AtomicChargeVelocity") // ionic current
return ATOMIC_CHARGE_VELOCITY;
else if (name == "AtomicSpeciesVelocity") // per species momentum
return ATOMIC_SPECIES_VELOCITY;
else if (name == field_to_prolongation_name(VELOCITY))
return PROLONGED_VELOCITY;
else
throw ATC_Error("unknown canonical name "+name);
}
- PAQ * per_atom_quantity(string name) {
+ PAQ * per_atom_quantity(std::string name) {
switch (string_to_canonical_name(name)) {
case ATOMIC_TWICE_FLUCTUATING_KINETIC_ENERGY:
return atomic_twice_fluctuating_kinetic_energy();
case ATOMIC_TWICE_KINETIC_ENERGY:
return atomic_twice_kinetic_energy();
case ATOMIC_FLUCTUATING_VELOCITY:
return atomic_fluctuating_velocity();
case ATOMIC_CHARGE_VELOCITY:
return atomic_charge_velocity();
case ATOMIC_SPECIES_VELOCITY:
return atomic_species_velocity();
case PROLONGED_VELOCITY:
return prolonged_field(VELOCITY);
default:
throw ATC_Error("FieldManager:: unknown PAQ"); return NULL;
}
}
- DENS_MAN * restricted_atom_quantity(FieldName field, string name = "default", PAQ * atomi = NULL);
+ /** this function returns a restriction of atomic data */
+ DENS_MAN * restricted_atom_quantity(FieldName field, std::string name = "default", PAQ * atomi = NULL);
protected:
ATC_Method * atc_;
InterscaleManager & interscaleManager_;
// nodal atomic fields
- DENS_MAN * charge_density(string name);
- DENS_MAN * mass_density(string name);
- DENS_MAN * species_concentration(string name);
- DENS_MAN * number_density(string name);
- DENS_MAN * momentum(string name);
- DENS_MAN * velocity(string name);
- DENS_MAN * projected_velocity(string name);
- DENS_MAN * displacement(string name);
- DENS_MAN * reference_potential_energy(string name);
- DENS_MAN * potential_energy(string name);
- DENS_MAN * thermal_energy(string name);
- DENS_MAN * kinetic_energy(string name);
- DENS_MAN * temperature(string name);
- DENS_MAN * kinetic_temperature(string name);
- DENS_MAN * charge_flux(string name);
- DENS_MAN * species_flux(string name);
+ DENS_MAN * charge_density(std::string name);
+ DENS_MAN * mass_density(std::string name);
+ DENS_MAN * species_concentration(std::string name);
+ DENS_MAN * number_density(std::string name);
+ DENS_MAN * momentum(std::string name);
+ DENS_MAN * velocity(std::string name);
+ DENS_MAN * projected_velocity(std::string name);
+ DENS_MAN * displacement(std::string name);
+ DENS_MAN * reference_potential_energy(std::string name);
+ DENS_MAN * potential_energy(std::string name);
+ DENS_MAN * thermal_energy(std::string name);
+ DENS_MAN * kinetic_energy(std::string name);
+ DENS_MAN * temperature(std::string name);
+ DENS_MAN * kinetic_temperature(std::string name);
+ DENS_MAN * charge_flux(std::string name);
+ DENS_MAN * species_flux(std::string name);
+ DENS_MAN * internal_energy(std::string name);
+ DENS_MAN * energy(std::string name);
// non intrinsic per atom quantities (intrinsic are handled elsewhere)
PAQ * atomic_twice_kinetic_energy();
PAQ * atomic_twice_fluctuating_kinetic_energy();
PAQ * atomic_fluctuating_velocity();
PAQ * atomic_charge_velocity();
PAQ * atomic_species_velocity();
PAQ * atomic_species_vector();
// internal functions
- DENS_MAN * projected_atom_quantity(FieldName field,string name, PAQ * atomic, FieldName massMat, DIAG_MAN * normalization = NULL);
- DENS_MAN * scaled_projected_atom_quantity(FieldName field,string name, PAQ * atomic, double scale, FieldName massMat, DIAG_MAN * normalization = NULL);
- DENS_MAN * referenced_projected_atom_quantity(FieldName field, string name, PAQ * atomic, const DENS_MAT * reference, FieldName massMat, DIAG_MAN * normalization = NULL);
- DENS_MAN * inferred_atom_quantity(FieldName field, string name, PAQ * atomic, FieldName massMat){return NULL;};
+ DENS_MAN * projected_atom_quantity(FieldName field,std::string name, PAQ * atomic, DIAG_MAN * normalization = NULL);
+ DENS_MAN * scaled_projected_atom_quantity(FieldName field,std::string name, PAQ * atomic, double scale, DIAG_MAN * normalization = NULL);
+ DENS_MAN * referenced_projected_atom_quantity(FieldName field, std::string name, PAQ * atomic, DENS_MAN * reference, DIAG_MAN * normalization = NULL);
+ DENS_MAN * inferred_atom_quantity(FieldName field, std::string name, PAQ * atomic){return NULL;};
PAQ * prolonged_field(FieldName field);
private:
FieldManager(void);
};
}
#endif
diff --git a/lib/atc/Function.cpp b/lib/atc/Function.cpp
index beb3d2a3a..36d3e9a09 100644
--- a/lib/atc/Function.cpp
+++ b/lib/atc/Function.cpp
@@ -1,543 +1,548 @@
#include "Function.h"
#include "ATC_Error.h"
#include "LammpsInterface.h"
#include <sstream>
+using std::stringstream;
+using std::string;
+using std::set;
+using std::fstream;
+
namespace ATC {
//====================================================================
// UXT_Function
//===================================================================
UXT_Function::UXT_Function(int narg, double* args) { }
//====================================================================
// UXT_Function_Mgr
//====================================================================
UXT_Function_Mgr * UXT_Function_Mgr::myInstance_ = NULL;
// -----------------------------------------------------------------
// instance()
// -----------------------------------------------------------------
UXT_Function_Mgr * UXT_Function_Mgr::instance()
{
if (myInstance_ == NULL) {
myInstance_ = new UXT_Function_Mgr();
}
return myInstance_;
}
// Destructor
UXT_Function_Mgr::~UXT_Function_Mgr()
{
// Delete all functions created using "new"
set<UXT_Function * >::iterator it;
for (it = pointerSet_.begin(); it != pointerSet_.end(); it++)
if (*it) delete *it;
}
// add user function into the if statement and assign returnFunction to it
UXT_Function* UXT_Function_Mgr::function(string & type, int nargs, double * args)
{
UXT_Function * returnFunction;
if (type=="linear") {
returnFunction = new ScalarLinearFunction(nargs,args);
}
else
throw ATC_Error("Bad user function name");
pointerSet_.insert(returnFunction);
return returnFunction;
}
// add user function into the if statement and assign returnFunction to it
UXT_Function* UXT_Function_Mgr::function(char ** args, int nargs)
{
string type = args[0];
int narg = nargs -1;
double dargs[narg];
for (int i = 0; i < narg; ++i) dargs[i] = atof(args[i+1]);
return function(type, narg, dargs);
}
// add constant function
UXT_Function* UXT_Function_Mgr::linear_function(double c0, double c1)
{
double args[2] = {c0,c1};
UXT_Function * returnFunction = new ScalarLinearFunction(2,args);
pointerSet_.insert(returnFunction);
return (returnFunction);
}
UXT_Function* UXT_Function_Mgr::copy_UXT_function(UXT_Function* other)
{
string tag = other->tag();
UXT_Function * returnFunction = NULL;
if (tag=="linear") {
ScalarLinearFunction * other_cast = (ScalarLinearFunction*) other;
returnFunction = new ScalarLinearFunction(*other_cast);
}
pointerSet_.insert(returnFunction);
return returnFunction;
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// ScalarLinearFunction
//--------------------------------------------------------------------
//--------------------------------------------------------------------
ScalarLinearFunction::ScalarLinearFunction(int narg, double* args)
: UXT_Function(narg,args)
{
tag_ = "linear";
c0_ = args[0];
c1_ = args[1];
stringstream ss;
ss << "created function : " << c0_ << " + " << c1_ << "*u";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// XT_Function
//--------------------------------------------------------------------
//--------------------------------------------------------------------
XT_Function::XT_Function(int narg, double* args)
{
if (narg > 5 ) {
x0[0] = args[0];
x0[1] = args[1];
x0[2] = args[2];
mask[0] = args[3];
mask[1] = args[4];
mask[2] = args[5];
}
else {
x0[0] = 0.0;
x0[1] = 0.0;
x0[2] = 0.0;
mask[0] = 0.0;
mask[1] = 0.0;
mask[2] = 0.0;
}
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// XT_Function_Mgr
//--------------------------------------------------------------------
//--------------------------------------------------------------------
XT_Function_Mgr * XT_Function_Mgr::myInstance_ = NULL;
// -----------------------------------------------------------------
// instance()
// -----------------------------------------------------------------
XT_Function_Mgr * XT_Function_Mgr::instance()
{
if (myInstance_ == NULL) {
myInstance_ = new XT_Function_Mgr();
}
return myInstance_;
}
// Destructor
XT_Function_Mgr::~XT_Function_Mgr()
{
// Delete all functions created using "new"
set<XT_Function * >::iterator it;
for (it = pointerSet_.begin(); it != pointerSet_.end(); it++)
if (*it) delete *it;
}
// add user function into the if statement and assign returnFunction to it
XT_Function* XT_Function_Mgr::function(string & type, int nargs, double * args)
{
XT_Function * returnFunction;
if (type=="constant") {
returnFunction = new ConstantFunction(nargs,args);
}
else if (type=="temporal_ramp") {
returnFunction = new TemporalRamp(nargs,args);
}
else if (type=="linear")
returnFunction = new LinearFunction(nargs,args);
else if (type=="piecewise_linear")
returnFunction = new PiecewiseLinearFunction(nargs,args);
else if (type=="linear_temporal_ramp")
returnFunction = new LinearTemporalRamp(nargs,args);
else if (type=="quadratic")
returnFunction = new QuadraticFunction(nargs,args);
else if (type=="sine")
returnFunction = new SineFunction(nargs,args);
else if (type=="gaussian")
returnFunction = new GaussianFunction(nargs,args);
else if (type=="gaussian_temporal_ramp")
returnFunction = new GaussianTemporalRamp(nargs,args);
else if (type=="radial_power")
returnFunction = new RadialPower(nargs,args);
else
throw ATC_Error("Bad user function name");
pointerSet_.insert(returnFunction);
return returnFunction;
}
// add user function into the if statement and assign returnFunction to it
XT_Function* XT_Function_Mgr::function(char ** args, int nargs)
{
string type = args[0];
int narg = nargs -1;
double dargs[narg];
for (int i = 0; i < narg; ++i) dargs[i] = atof(args[i+1]);
return function(type, narg, dargs);
}
// add constant function
XT_Function* XT_Function_Mgr::constant_function(double c)
{
XT_Function * returnFunction = new ConstantFunction(c);
pointerSet_.insert(returnFunction);
return (returnFunction);
}
XT_Function* XT_Function_Mgr::copy_XT_function(XT_Function* other)
{
string tag = other->tag();
XT_Function * returnFunction = NULL;
if (tag=="linear") {
LinearFunction * other_cast = (LinearFunction*) other;
returnFunction = new LinearFunction(*other_cast);
}
else if (tag=="piecewise_linear") {
PiecewiseLinearFunction * other_cast = (PiecewiseLinearFunction*) other;
returnFunction = new PiecewiseLinearFunction(*other_cast);
}
else if (tag=="quadratic") {
QuadraticFunction * other_cast = (QuadraticFunction*) other;
returnFunction = new QuadraticFunction(*other_cast);
}
else if (tag=="sine") {
SineFunction * other_cast = (SineFunction*) other;
returnFunction = new SineFunction(*other_cast);
}
else if (tag=="gaussian") {
GaussianFunction * other_cast = (GaussianFunction*) other;
returnFunction = new GaussianFunction(*other_cast);
}
else if (tag=="gaussian_temporal_ramp") {
GaussianTemporalRamp * other_cast = (GaussianTemporalRamp*) other;
returnFunction = new GaussianTemporalRamp(*other_cast);
}
else if (tag=="temporal_ramp") {
TemporalRamp * other_cast = (TemporalRamp*) other;
returnFunction = new TemporalRamp(*other_cast);
}
else if (tag=="radial_power") {
RadialPower * other_cast = (RadialPower*) other;
returnFunction = new RadialPower(*other_cast);
}
pointerSet_.insert(returnFunction);
return returnFunction;
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// ConstantFunction
//--------------------------------------------------------------------
//--------------------------------------------------------------------
ConstantFunction::ConstantFunction(int narg, double* args)
: XT_Function(narg,args),
C0(args[0])
{
tag_ = "constant";
}
//--------------------------------------------------------------------
ConstantFunction::ConstantFunction(double arg)
: XT_Function(1,&arg),
C0(arg)
{
tag_ = "constant";
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// LinearFunction
//--------------------------------------------------------------------
//--------------------------------------------------------------------
LinearFunction::LinearFunction(int narg, double* args)
: XT_Function(narg,args)
{
C0 = args[6];
tag_ = "linear";
stringstream ss;
ss << "created function : " << C0 << " + " << mask[0] << "(x-"<< x0[0] << ")+"<< mask[1] << "(y-"<<x0[1]<<")+"<<mask[2]<<"(z-"<<x0[2] << ")";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// PiecewiseLinearFunction
//--------------------------------------------------------------------
//--------------------------------------------------------------------
PiecewiseLinearFunction::PiecewiseLinearFunction(int narg, double* args)
: XT_Function(narg,args)
{
int i=0, idx = 6, n = (narg-idx)/2;
xi.reset(n);
fi.reset(n);
while (idx < narg) {
xi(i) = args[idx++];
fi(i++) = args[idx++];
}
tag_ = "piecewise_linear";
}
double PiecewiseLinearFunction::f(double * x, double t)
{
double s = mask[0]*(x[0]-x0[0])+mask[1]*(x[1]-x0[1])+mask[2]*(x[2]-x0[2]);
int index = xi.index(s);
if (index < 0) return fi(0);
else if (index >= xi.size()-1 ) return fi(xi.size()-1);
else {
double f = fi(index)
+ (fi(index+1)-fi(index))*(s-xi(index))/(xi(index+1)-xi(index));
return f;
}
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// LinearTemporalRamp
//--------------------------------------------------------------------
//--------------------------------------------------------------------
LinearTemporalRamp::LinearTemporalRamp(int narg, double* args)
: XT_Function(narg,args)
{
double mask_final[3];
mask_final[0] = args[6];
mask_final[1] = args[7];
mask_final[2] = args[8];
C0_initial = args[9];
double C0_final = args[10];
double delta_t = args[11];
for (int i = 0; i < 3; i++)
mask_slope[i] = (mask_final[i] - mask[i])/delta_t;
C0_slope = (C0_initial - C0_final)/delta_t;
}
double LinearTemporalRamp::f(double* x, double t) {
double slope[3];
for (int i = 0; i < 3; i++)
slope[i] = mask[i] + mask_slope[i]*t;
double C0 = C0_initial + C0_slope*t;
return slope[0]*(x[0]-x0[0])+slope[1]*(x[1]-x0[1])+slope[2]*(x[2]-x0[2]) + C0;
}
double LinearTemporalRamp::dfdt(double* x, double t) {
return mask_slope[0]*(x[0]-x0[0])+mask_slope[1]*(x[1]-x0[1])+mask_slope[2]*(x[2]-x0[2]) + C0_slope;
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// QuadraticFunction
//--------------------------------------------------------------------
//--------------------------------------------------------------------
QuadraticFunction::QuadraticFunction(int narg, double* args)
: XT_Function(narg,args)
{
C0 = args[6];
C2[0] = args[7];
C2[1] = args[8];
C2[2] = args[9];
C2[3] = args[10];
C2[4] = args[11];
C2[5] = args[12];
tag_ = "quadratic";
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// SineFunction
//--------------------------------------------------------------------
//--------------------------------------------------------------------
SineFunction::SineFunction(int narg, double* args)
: XT_Function(narg,args)
{
C = args[6];
w = args[7];
C0 = args[8];
tag_ = "sine";
stringstream ss;
ss << "created function : " << C << " sin( " << mask[0] << "(x-"<< x0[0] << ")+"<< mask[1] << "(y-"<<x0[1]<<")+"<<mask[2]<<"(z-"<<x0[2] << ") - " << w << "t ) + " << C0;
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// GaussianFunction
//--------------------------------------------------------------------
//--------------------------------------------------------------------
GaussianFunction::GaussianFunction(int narg, double* args)
: XT_Function(narg,args)
{
tau = args[6];
C = args[7];
C0 = args[8];
tag_ = "gaussian";
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// GaussianTemporalRamp
//--------------------------------------------------------------------
//--------------------------------------------------------------------
GaussianTemporalRamp::GaussianTemporalRamp(int narg, double* args)
: GaussianFunction(narg,args)
{
tau_initial = args[9];
C_initial = args[10];
C0_initial = args[11];
double delta_t = args[12];
tau_slope = (tau - tau_initial)/delta_t;
C_slope = (C - C_initial)/delta_t;
C0_slope = (C0 - C0_initial)/delta_t;
tag_ = "gaussian_temporal_ramp";
}
double GaussianTemporalRamp::f(double* x, double t) {
tau = tau_initial + tau_slope*t;
C = C_initial + C_slope*t;
C0 = C0_initial + C0_slope*t;
return GaussianFunction::f(x,t);
}
double GaussianTemporalRamp::dfdt(double* x, double t) {
tau = tau_initial + tau_slope*t;
C = C_initial + C_slope*t;
C0 = C0_initial + C0_slope*t;
double dfdt = 0.;
dfdt += C_slope*exp(-(mask[0]*(x[0]-x0[0])*(x[0]-x0[0])
+mask[1]*(x[1]-x0[1])*(x[1]-x0[1])
+mask[2]*(x[2]-x0[2])*(x[2]-x0[2]))
/tau/tau);
dfdt += C*exp(2.*tau_slope*(mask[0]*(x[0]-x0[0])*(x[0]-x0[0])
+mask[1]*(x[1]-x0[1])*(x[1]-x0[1])
+mask[2]*(x[2]-x0[2])*(x[2]-x0[2]))
/tau/tau/tau);
dfdt += C0_slope;
return dfdt;
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// TemporalRamp
//--------------------------------------------------------------------
//--------------------------------------------------------------------
TemporalRamp::TemporalRamp(int narg, double* args)
: XT_Function(narg,args)
{
f_initial = args[0];
double f_final = args[1];
double delta_t = args[2];
slope = (f_final - f_initial)/delta_t;
tag_ = "temporal_ramp";
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// RadialPower
//--------------------------------------------------------------------
//--------------------------------------------------------------------
RadialPower::RadialPower(int narg, double* args)
: XT_Function(narg,args)
{
C0 = args[6];
n = args[7];
tag_ = "radial_power";
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// InterpolationFunction
//--------------------------------------------------------------------
//--------------------------------------------------------------------
void InterpolationFunction::initialize(int npts, fstream &fileId, double coef)
{ // read data
npts_ = npts;
xs_.reset(npts);
fs_.reset(npts);
fps_.reset(npts);
double x,f,fp;
int i = 0;
while(fileId.good() && i < npts) {
fileId >> x >> f >> fp;
xs_(i)=x;
fs_(i)=coef*f;
fps_(i)=coef*fp;
i++;
}
// scale tangents
double dx, dx0 = xs_(1)-xs_(0);
for (int i = 0; i < npts_ ; i++) {
if (i == 0) { dx = xs_(1)-xs_(0); }
else if (i+1 == npts_) { dx = xs_(npts_-1)-xs_(npts_-2); }
else { dx= 0.5*(xs_(i+1)-xs_(i-1)); }
if (abs(dx-dx0) > 1.e-8) throw ATC_Error("InterpolationFunction::initialize non-uniform data spacing not handled currently");
fps_(i) *= dx;
}
// options: calculate / adjust tangents for monotonicity
}
double InterpolationFunction::coordinate(double x,
double & f0, double & fp0, double & f1, double & fp1, double & inv_dx ) const
{
int i0 = xs_.index(x);
int i1 = i0+1;
if (i0 < 0) {
double x0 = xs_(0), x1 = xs_(1);
inv_dx = 1./(x1-x0);
fp0 = fp1 = fps_(0);
f1 = fs_(0);
f0 = fp0*(x-xs_(0))+f1;
return 0;
}
else if (i1 >= npts_) {
double x0 = xs_(npts_-2), x1 = xs_(npts_-1);
inv_dx = 1./(x1-x0);
fp0 = fp1 = fps_(i0);
f0 = fs_(i0);
f1 = fp0*(x-xs_(i0))+f0;
return 1;
}
else {
double x0 = xs_(i0), x1 = xs_(i1);
inv_dx = 1./(x1-x0);
f0 = fs_ (i0); f1 = fs_ (i1);
fp0 = fps_(i0); fp1 = fps_(i1);
double t = (x-x0)*inv_dx;
return t;
}
}
double InterpolationFunction::f(const double x) const
{
double f0,fp0,f1,fp1,inv_dx;
double t = coordinate(x,f0,fp0,f1,fp1,inv_dx);
double t2 = t*t;
double t3 = t*t2;
double h00 = 2*t3 - 3*t2 + 1;
double h10 = t3 - 2*t2 + t;
double h01 =-2*t3 + 3*t2;
double h11 = t3 - t2;
double f = h00 * f0 + h10 * fp0 + h01 * f1 + h11 * fp1;
return f;
}
double InterpolationFunction::dfdt(const double x) const
{
double f0,fp0,f1,fp1,inv_dx;
double t = coordinate(x,f0,fp0,f1,fp1,inv_dx);
double t2 = t*t;
double d00 = 6*t2 - 6*t;
double d10 = 3*t2 - 4*t + 1;
double d01 =-6*t2 + 6*t;
double d11 = 3*t2 - 2*t;
double fp = d00 * f0 + d10 * fp0 + d01 * f1 + d11 * fp1;
fp *= inv_dx;
return fp;
}
}
diff --git a/lib/atc/Function.h b/lib/atc/Function.h
index 6c015f507..45d5d7220 100644
--- a/lib/atc/Function.h
+++ b/lib/atc/Function.h
@@ -1,432 +1,428 @@
#ifndef XT_FUNCTION_H
#define XT_FUNCTION_H
#include <math.h>
#include <string>
#include <set>
#include <cstdlib>
#include <iostream>
#include "Array.h"
#include "ATC_TypeDefs.h"
-using namespace std;
-using ATC_matrix::Array;
-
namespace ATC {
/**
* @class Function
* @brief Base class for functions of fields, space and time
*/
-
class Function {
public:
Function(int nargs, char** args);
virtual ~Function(void) {};
/** name */
- const string & tag() { return tag_;}
+ const std::string & tag() { return tag_;}
/** depdendencies */
virtual inline ARG_NAMES args(void) {ARG_NAMES names; return names;};
/** function value */
virtual inline double f(ARGS& args) {return 0.0;};
virtual inline void f(ARGS& args, DENS_MAT vals) {};
/** (1st) derivative of function wrt to a field */
virtual inline double dfd(FieldName field, ARGS& args ) {return 0.0;};
virtual inline void dfd(FieldName field, ARGS& args, DENS_MAT vals ) {};
// addl: d2fd2(field1, field2, args), linearization(), grad_args
protected:
/** tag : name of function */
- string tag_;
+ std::string tag_;
};
/**
* @class Function_Mgr
* @brief Base class that constructs and returns UXT_Function objects based on requests
*/
class Function_Mgr {
public:
/** Static instance of this class */
static Function_Mgr * instance();
Function* function(char ** arg, int nargs);
Function* copy_function(Function* other);
protected:
Function_Mgr() {};
~Function_Mgr();
private:
static Function_Mgr * myInstance_;
/** set to store all generated objects for later deletion */
- set<Function * > pointerSet_;
+ std::set<Function * > pointerSet_;
};
/**
* @class LinearFieldFunction
* @brief Class for functions returning values linear a given field
*/
class LinearFieldFunction : public Function {
public:
LinearFieldFunction(int nargs, char** args);
virtual ~LinearFieldFunction(void) {};
inline double f(double* u, double* x, double t) {return c1_*u[0]-c0_;}
inline double dfd(FieldName field, ARGS& args) {return c1_;}
private :
double c0_,c1_;
};
/**
* @class UXT_Function
* @brief Base class for functions of fields, space and time
*/
class UXT_Function {
public:
UXT_Function(int nargs, double* args);
virtual ~UXT_Function(void) {};
- const string & tag() { return tag_;}
+ const std::string & tag() { return tag_;}
/** function value */
virtual inline double f(double * u, double* x, double t) {return 0.0;};
/** derivative of function wrt to field */
virtual inline double dfdu(double * u, double* x, double t) {return 0.0;};
protected:
/** tag : name of function */
- string tag_;
+ std::string tag_;
};
/**
* @class UXT_Function_Mgr
* @brief Base class that constructs and returns UXT_Function objects based on requests
*/
class UXT_Function_Mgr {
public:
/** Static instance of this class */
static UXT_Function_Mgr * instance();
- UXT_Function* function(string & type, int nargs, double * arg);
+ UXT_Function* function(std::string & type, int nargs, double * arg);
UXT_Function* function(char ** arg, int nargs);
UXT_Function* linear_function(double c0, double c1);
UXT_Function* copy_UXT_function(UXT_Function* other);
protected:
UXT_Function_Mgr() {};
~UXT_Function_Mgr();
private:
static UXT_Function_Mgr * myInstance_;
/** set to store all generated objects for later deletion */
- set<UXT_Function * > pointerSet_;
+ std::set<UXT_Function * > pointerSet_;
};
/**
* @class ScalarLinearFunction
* @brief Class for functions returning values linear in space
*/
class ScalarLinearFunction : public UXT_Function {
public:
ScalarLinearFunction(int nargs, double* args);
virtual ~ScalarLinearFunction(void) {};
//inline double f(double* u, double* x, double t) {return c1_*(u[0]-c0_);}
inline double f(double* u, double* x, double t) {return c1_*u[0]+c0_;}
inline double dfdu(double* u, double* x, double t) {return c1_;}
private :
double c0_,c1_;
};
/**
* @class XT_Function
* @brief Base class for functions based on space and time variables
*/
class XT_Function {
public:
XT_Function(int nargs, double* args);
virtual ~XT_Function(void) {};
- const string & tag() { return tag_;}
+ const std::string & tag() { return tag_;}
/** function value */
virtual inline double f(double* x, double t) {return 0.0;};
/** time derivative of function */
virtual inline double dfdt(double* x, double t) {return 0.0;};
/** 2nd time derivative of function */
virtual inline double ddfdt(double* x, double t) {return 0.0;};
/** 3rd time derivative of function */
virtual inline double dddfdt(double* x, double t) {return 0.0;};
protected:
/** mask : masks x,y,z dependence, x0 : origin */
double mask[3], x0[3];
/** tag : name of function */
- string tag_;
+ std::string tag_;
};
/**
* @class XT_Function_Mgr
* @brief Base class that constructs and returns XT_Function objects based on requests
*/
class XT_Function_Mgr {
public:
/** Static instance of this class */
static XT_Function_Mgr * instance();
- XT_Function* function(string & type, int nargs, double * arg);
+ XT_Function* function(std::string & type, int nargs, double * arg);
XT_Function* function(char ** arg, int nargs);
XT_Function* constant_function(double c);
XT_Function* copy_XT_function(XT_Function* other);
protected:
XT_Function_Mgr() {};
~XT_Function_Mgr();
private:
static XT_Function_Mgr * myInstance_;
/** set to store all generated objects for later deletion */
- set<XT_Function * > pointerSet_;
+ std::set<XT_Function * > pointerSet_;
};
//------------------------------------------------------------------------
// derived classes
//------------------------------------------------------------------------
/**
* @class ConstantFunction
* @brief Class for functions returning constant values
*/
class ConstantFunction : public XT_Function {
public:
ConstantFunction(int nargs, double* args);
ConstantFunction(double arg);
virtual ~ConstantFunction(void) {};
inline double f(double* x, double t)
{return C0;};
private :
double C0;
};
/**
* @class LinearFunction
* @brief Class for functions returning values linear in space
*/
class LinearFunction : public XT_Function {
public:
LinearFunction(int nargs, double* args);
virtual ~LinearFunction(void) {};
double f(double* x, double t)
{return mask[0]*(x[0]-x0[0])+mask[1]*(x[1]-x0[1])+mask[2]*(x[2]-x0[2]) + C0;};
private :
double C0;
};
/**
* @class PiecewiseLinearFunction
* @brief Class for functions returning values piecewise linear in space
* along given direction
*/
class PiecewiseLinearFunction : public XT_Function {
public:
PiecewiseLinearFunction(int nargs, double* args);
virtual ~PiecewiseLinearFunction(void) {};
double f(double* x, double t) ;
private :
Array<double> xi;
Array<double> fi;
};
/**
* @class LinearTemporalRamp
* @brief Class for functions returning values linear in space and time
*/
class LinearTemporalRamp : public XT_Function {
public:
LinearTemporalRamp(int nargs, double* args);
~LinearTemporalRamp(void) {};
double f(double* x, double t);
double dfdt(double* x, double t);
protected :
double mask_slope[3];
double C0_initial, C0_slope;
};
/**
* @class QuadraticFunction
* @brief Class for functions returning values quadratic in space
*/
class QuadraticFunction : public XT_Function {
public:
QuadraticFunction(int nargs, double* args);
virtual ~QuadraticFunction(void) {};
inline double f(double* x, double t)
{return
C2[0]*(x[0]-x0[0])*(x[0]-x0[0])+
C2[1]*(x[1]-x0[1])*(x[1]-x0[1])+
C2[2]*(x[2]-x0[2])*(x[2]-x0[2])+
2.0*C2[3]*(x[0]-x0[0])*(x[1]-x0[1]) +
2.0*C2[4]*(x[0]-x0[0])*(x[2]-x0[2]) +
2.0*C2[5]*(x[1]-x0[1])*(x[2]-x0[2]) +
mask[0]*(x[0]-x0[0])+mask[1]*(x[1]-x0[1])+mask[2]*(x[2]-x0[2]) + C0;};
private :
double C0, C2[6]; // C2 1:xx 2:yy 3:zz 4:xy|yx 5:xz|zx 6:yz|zy
};
/**
* @class SineFunction
* @brief Class for functions returning values sinusoidally varying in space and time
*/
class SineFunction : public XT_Function {
public:
SineFunction(int nargs, double* args);
virtual ~SineFunction(void){};
inline double f(double* x, double t)
{return C*sin( mask[0]*(x[0]-x0[0])
+mask[1]*(x[1]-x0[1])
+mask[2]*(x[2]-x0[2]) - w*t) + C0;};
private :
double C, C0, w;
};
/**
* @class GaussianFunction
* @brief Class for functions returning values according to a Gaussian distribution in space
*/
class GaussianFunction : public XT_Function {
public:
GaussianFunction(int nargs, double* args);
virtual ~GaussianFunction(void){};
// 1/(2 pi \sigma)^(n/2) exp(-1/2 x.x/\sigma^2 ) for n = dimension
inline double f(double* x, double t)
{return C*exp(-(mask[0]*(x[0]-x0[0])*(x[0]-x0[0])
+mask[1]*(x[1]-x0[1])*(x[1]-x0[1])
+mask[2]*(x[2]-x0[2])*(x[2]-x0[2]))/tau/tau) + C0;};
protected:
double tau, C, C0;
};
/**
* @class GaussianTemporalRamp
* @brief Class for functions returning values according to a Gaussian distribution in space and linearly in time
*/
class GaussianTemporalRamp : public GaussianFunction {
public:
GaussianTemporalRamp(int nargs, double* args);
virtual ~GaussianTemporalRamp(void){};
double f(double* x, double t);
double dfdt(double* x, double t);
protected:
double tau_initial, tau_slope;
double C_initial, C_slope;
double C0_initial, C0_slope;
};
/**
* @class TemporalRamp
* @brief Class for functions returning values constant in space and varying linearly in time
*/
class TemporalRamp : public XT_Function {
public:
TemporalRamp(int nargs, double* args);
virtual ~TemporalRamp(void) {};
inline double f(double* x, double t)
{return f_initial + slope*t;};
inline double dfdt(double* x, double t)
{return slope;};
private :
double f_initial, slope;
};
/**
* @class RadialPower
* @brief Class for functions returning values based on distance from a fix point raised to a specified power
*/
class RadialPower : public XT_Function {
public:
RadialPower(int nargs, double* args);
virtual ~RadialPower(void) {};
inline double f(double* x, double t)
{
double dx = x[0]-x0[0]; double dy = x[1]-x0[1]; double dz = x[2]-x0[2];
double r = mask[0]*dx*dx+mask[1]*dy*dy+mask[2]*dz*dz; r = sqrt(r);
return C0*pow(r,n);
};
private :
double C0, n;
};
/**
* @class InterpolationFunction
* @brief Base class for interpolation functions
*/
class InterpolationFunction {
public:
InterpolationFunction(void) : npts_(0) {};
virtual ~InterpolationFunction(void) {};
/** populate data */
- void initialize(int npts,fstream &fileId, double coef = 1.);
+ void initialize(int npts,std::fstream &fileId, double coef = 1.);
/** function value */
double f(const double t) const;
/** derivative of function */
double dfdt(const double t) const;
protected:
double coordinate(double x,
double & f0, double & fp0, double & f1, double & fp1, double & inv_dx) const;
int npts_;
Array<double> xs_;
Array<double> fs_;
Array<double> fps_;
};
}
#endif
diff --git a/lib/atc/FundamentalAtomicQuantity.cpp b/lib/atc/FundamentalAtomicQuantity.cpp
index 025e38f7d..0ebb54e16 100644
--- a/lib/atc/FundamentalAtomicQuantity.cpp
+++ b/lib/atc/FundamentalAtomicQuantity.cpp
@@ -1,150 +1,152 @@
#include "FundamentalAtomicQuantity.h"
+using std::string;
+
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class FundamentalAtomQuantity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
FundamentalAtomQuantity::FundamentalAtomQuantity(ATC_Method * atc,
LammpsInterface::FundamentalAtomQuantity atomQuantity,
AtomType atomType) :
ShallowAtomQuantity<double>(atc,0,atomType),
atomQuantity_(atomQuantity),
unitsConversion_(lammpsInterface_->atom_quantity_conversion(atomQuantity_))
{
nCols_ = lammpsInterface_->atom_quantity_ndof(atomQuantity_);
}
//--------------------------------------------------------
// set_lammps_to_quantity
//--------------------------------------------------------
void FundamentalAtomQuantity::set_lammps_to_quantity() const
{
if (unitsConversion_==1.) { // is there a way to avoid equal testing a double?
PerAtomQuantity<double>::set_lammps_to_quantity();
}
else { // perform unit conversion
if (quantity_.nRows()>0) {
// full matrix copy
if (atomType_ == ALL || atomType_ == PROC_GHOST) {
if (nCols_==1) { // scalar
double * lammpsQuantity = lammps_scalar();
for (int i = 0; i < atc_.nlocal_total(); i++)
lammpsQuantity[i] = quantity_(i,0)/unitsConversion_;
}
else{ // vector
double ** lammpsQuantity = lammps_vector();
for (int i = 0; i < atc_.nlocal_total(); i++)
for (int j = 0; j < nCols_; j++)
lammpsQuantity[i][j] = quantity_(i,j)/unitsConversion_;
}
}
// mapped copy
else {
int atomIndex;
if (nCols_==1) { // scalar
double * lammpsQuantity = lammps_scalar();
for (int i = 0; i < quantity_.nRows(); i++) {
atomIndex = quantityToLammps_(i);
lammpsQuantity[atomIndex] = quantity_(i,0)/unitsConversion_;
}
}
else{ // vector
double ** lammpsQuantity = lammps_vector();
for (int i = 0; i < quantity_.nRows(); i++) {
atomIndex = quantityToLammps_(i);
for (int j = 0; j < nCols_; j++) {
lammpsQuantity[atomIndex][j] = quantity_(i,j)/unitsConversion_;
}
}
}
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomMass
// Access-only operations when mass is
// defined per type.
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomMass::AtomMass(ATC_Method * atc,AtomType atomType) :
FundamentalAtomQuantity(atc,LammpsInterface::ATOM_MASS,atomType)
{
// do nothing
}
//--------------------------------------------------------
// set_quantity_to_lammps
//--------------------------------------------------------
void AtomMass::set_quantity_to_lammps() const
{
const int * type = lammpsInterface_->atom_type();
const double * mass = lammpsInterface_->atom_mass();
if (atomType_ == ALL || atomType_ == PROC_GHOST) {
for (int i = 0; i < quantity_.nRows(); i++)
quantity_(i,0) = mass[type[i]];
}
else {
int atomIndex;
for (int i = 0; i < quantity_.nRows(); i++) {
atomIndex = quantityToLammps_(i);
quantity_(i,0) = mass[type[atomIndex]];
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ComputedAtomQuantity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ComputedAtomQuantity::ComputedAtomQuantity(ATC_Method * atc,
const string & tag,
double unitsConversion,
AtomType atomType) :
ShallowAtomQuantity<double>(atc,0,atomType),
computePointer_(NULL),
computeTag_(tag),
unitsConversion_(unitsConversion)
{
// register compute with lammps interface and provide pointer for syncing
computePointer_ = lammpsInterface_->compute_pointer(computeTag_.c_str());
nCols_ = lammpsInterface_->compute_ncols_peratom(computePointer_);
}
//--------------------------------------------------------
// force_reset
//--------------------------------------------------------
void ComputedAtomQuantity::force_reset()
{
// only reset if the compute needs it this timestep
if (lammpsInterface_->compute_matchstep(computePointer_,lammpsInterface_->ntimestep())) {
if (!isFixed_) {
lammpsInterface_->reset_invoked_flag(computePointer_);
}
ShallowAtomQuantity<double>::force_reset();
}
}
}
diff --git a/lib/atc/FundamentalAtomicQuantity.h b/lib/atc/FundamentalAtomicQuantity.h
index 04f0e5b15..46b3c4b00 100644
--- a/lib/atc/FundamentalAtomicQuantity.h
+++ b/lib/atc/FundamentalAtomicQuantity.h
@@ -1,255 +1,254 @@
// A class for defining an alternate atomic mass, needed for templating
#ifndef FUNDAMENTAL_ATOM_QUANTITY_H
#define FUNDAMENTAL_ATOM_QUANTITY_H
-// ATC_Method headers
-#include "PerAtomQuantity.h"
+#include <string>
-using namespace std;
+#include "PerAtomQuantity.h"
namespace ATC {
// forward declarations
class ATC_Method;
//--------------------------------------------------------
//--------------------------------------------------------
// Class FundamentalAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms based on lammps data
//--------------------------------------------------------
//--------------------------------------------------------
class FundamentalAtomQuantity : public ShallowAtomQuantity<double> {
public:
// constructor
FundamentalAtomQuantity(ATC_Method * atc,
LammpsInterface::FundamentalAtomQuantity atomQuantity,
AtomType atomType=INTERNAL);
// destructor
virtual ~FundamentalAtomQuantity() {};
/** specialized reset to account for quantities which lammps can change */
virtual void lammps_force_reset() {this->force_reset();};
protected:
/** enumerates the type of atom quantity being considered */
LammpsInterface::FundamentalAtomQuantity atomQuantity_;
/** converts from Lammps units to ATC units */
double unitsConversion_;
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const;
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const
{ShallowAtomQuantity<double>::set_quantity_to_lammps(); if (unitsConversion_!=1.) quantity_ *= unitsConversion_;};
/** gets appropriate pointer for lammps data */
virtual double * lammps_scalar() const
{return lammpsInterface_->atom_scalar(atomQuantity_);};
/** gets appropriate pointer for lammps data */
virtual double ** lammps_vector() const
{return lammpsInterface_->atom_vector(atomQuantity_);};
private:
// do not define
FundamentalAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomMass
//--------------------------------------------------------
//--------------------------------------------------------
class AtomMass : public FundamentalAtomQuantity {
public:
// constructor
AtomMass(ATC_Method * atc,AtomType atomType = INTERNAL);
// destructor
virtual ~AtomMass() {};
/** sets the quantity to a given value */
virtual void operator=(const DENS_MAT & target)
{throw ATC_Error("Cannot modify type-based atom mass");};
/** sets the quantity to a given constant value */
virtual void operator=(const double & target)
{throw ATC_Error("Cannot modify type-based atom mass");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DENS_MAT & addition)
{throw ATC_Error("Cannot modify type-based atom mass");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(double addition)
{throw ATC_Error("Cannot modify type-based atom mass");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DENS_MAT & subtraction)
{throw ATC_Error("Cannot modify type-based atom mass");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(double subtracts)
{throw ATC_Error("Cannot modify type-based atom mass");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DENS_MAT & multiplier)
{throw ATC_Error("Cannot modify type-based atom mass");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(double multiplier)
{throw ATC_Error("Cannot modify type-based atom mass");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DENS_MAT & divisor)
{throw ATC_Error("Cannot modify type-based atom mass");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(double divisor)
{throw ATC_Error("Cannot modify type-based atom mass");};
protected:
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity(){};
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const;
/** gets appropriate pointer for lammps data */
virtual double * lammps_scalar() const
{return NULL;};
/** gets appropriate pointer for lammps data */
virtual double ** lammps_vector() const
{return NULL;};
private:
// do not define
AtomMass();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ComputedAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms by Lammps computes
// The compute associated with the tag must already
// be initialized.
//--------------------------------------------------------
//--------------------------------------------------------
class ComputedAtomQuantity : public ShallowAtomQuantity<double> {
public:
// constructor
ComputedAtomQuantity(ATC_Method * atc,
- const string & tag,
+ const std::string & tag,
double unitsConversion = 1.,
AtomType atomType=INTERNAL);
// destructor
virtual ~ComputedAtomQuantity() {};
/** resets compute, must be this way to accomodate atom sorting between runs */
virtual void post_exchange() {this->needReset_ = true;};
/** specialized reset to account for forcing lammps to perform the compute */
virtual void force_reset();
/** specialized reset to account for quantities which lammps can change */
virtual void lammps_force_reset() {this->force_reset();};
// remove operations that change the lammps data
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DENS_MAT & set_quantity()
{throw ATC_Error("ComputedAtomQuantity::set_quantity - Cannot modify computed per atom quantities"); return quantity_;};
/** sets the quantity to a given constant value */
virtual void operator=(const DENS_MAT & target)
{throw ATC_Error("ComputedAtomQuantity::operator= - Cannot modify computed per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DENS_MAT & addition)
{throw ATC_Error("ComputedAtomQuantity::operator+= - Cannot modify computed per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(double addition)
{throw ATC_Error("ComputedAtomQuantity::operator+= - Cannot modify computed per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DENS_MAT & subtraction)
{throw ATC_Error("ComputedAtomQuantity::operator-= - Cannot modify computed per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(double subtraction)
{throw ATC_Error("ComputedAtomQuantity::operator-= - Cannot modify computed per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DENS_MAT & multiplier)
{throw ATC_Error("ComputedAtomQuantity::operator*= - Cannot modify computed per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(double multiplier)
{throw ATC_Error("ComputedAtomQuantity::operator*= - Cannot modify computed per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DENS_MAT & divisor)
{throw ATC_Error("ComputedAtomQuantity::operator/= - Cannot modify computed per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(double divisor)
{throw ATC_Error("ComputedAtomQuantity::operator/= - Cannot modify computed per atom quantities");};
protected:
/** pointer to Lammps compute, meant as rapid indexing only (do not use!) */
COMPUTE_POINTER computePointer_;
/** tag for Lammps compute */
- string computeTag_;
+ std::string computeTag_;
/** units conversion from LAMMPS to ATC units */
double unitsConversion_;
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const
{ShallowAtomQuantity<double>::set_quantity_to_lammps(); if (unitsConversion_!=1.) quantity_ *= unitsConversion_;};
/** gets appropriate data for lammps pointer */
virtual double * lammps_scalar() const {return lammpsInterface_->compute_vector_peratom(computePointer_);};
/** gets appropriate data for lammps pointer */
virtual double ** lammps_vector() const {return lammpsInterface_->compute_array_peratom(computePointer_);};
// not needed if no MPI
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity()
{throw ATC_Error("ComputedAtomQuantity::set_lammps_to_quantity - Cannot modify a compute's LAMMPS data");};
private:
// do not define
ComputedAtomQuantity();
};
}
#endif
diff --git a/lib/atc/GhostManager.cpp b/lib/atc/GhostManager.cpp
new file mode 100644
index 000000000..f722a2fa2
--- /dev/null
+++ b/lib/atc/GhostManager.cpp
@@ -0,0 +1,499 @@
+// ATC transfer headers
+#include "GhostManager.h"
+#include "ATC_Method.h"
+#include "LammpsInterface.h"
+#include "ATC_Error.h"
+
+namespace ATC {
+
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+ // Class GhostManager
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+
+ //--------------------------------------------------------
+ // Constructor
+ //--------------------------------------------------------
+ GhostManager::GhostManager(ATC_Method * atc) :
+ ghostModifier_(NULL),
+ atc_(atc),
+ boundaryDynamics_(NO_BOUNDARY_DYNAMICS),
+ needReset_(true),
+ kappa_(0.),
+ gamma_(0.),
+ mu_(0.)
+ {
+ // do nothing
+ }
+
+ //--------------------------------------------------------
+ // Destructor
+ //--------------------------------------------------------
+ GhostManager::~GhostManager()
+ {
+ if (ghostModifier_) delete ghostModifier_;
+ }
+
+ //--------------------------------------------------------
+ // modify
+ // parses inputs and modifies state of the integrator
+ //--------------------------------------------------------
+ bool GhostManager::modify(int narg, char **arg)
+ {
+ int argIndex = 0;
+
+ /*! \page man_boundary_dynamics fix_modify AtC boundary_dynamics
+ \section syntax
+ fix_modify AtC boundary_dynamics < on | damped_harmonic | prescribed | coupled | none > [args] \n
+ \section description
+ Sets different schemes for controlling boundary atoms. On will integrate the boundary atoms using the velocity-verlet algorithm. Damped harmonic uses a mass/spring/dashpot for the boundary atoms with added arguments of the damping and spring constants followed by the ratio of the boundary type mass to the desired mass. Prescribed forces the boundary atoms to follow the finite element displacement. Coupled does the same.
+ \section restrictions
+ Boundary atoms must be specified. When using swaps between internal and boundary atoms, the initial configuration must have already correctly partitioned the two.
+ \section related
+ \man_boundary
+ \section default
+ prescribed
+ on
+ */
+ if (strcmp(arg[argIndex],"none")==0) {
+ boundaryDynamics_ = NO_BOUNDARY_DYNAMICS;
+ needReset_ = true;
+ return true;
+ }
+ else if (strcmp(arg[argIndex],"on")==0) {
+ boundaryDynamics_ = VERLET;
+ needReset_ = true;
+ return true;
+ }
+ else if (strcmp(arg[argIndex],"prescribed")==0) {
+ boundaryDynamics_ = PRESCRIBED;
+ needReset_ = true;
+ return true;
+ }
+ else if (strcmp(arg[argIndex],"damped_harmonic")==0) {
+ argIndex++;
+ kappa_ = atof(arg[argIndex++]);
+ gamma_ = atof(arg[argIndex++]);
+ mu_ = atof(arg[argIndex]);
+ boundaryDynamics_ = DAMPED_HARMONIC;
+ needReset_ = true;
+ return true;
+ }
+ else if (strcmp(arg[argIndex],"coupled")==0) {
+ boundaryDynamics_ = COUPLED;
+ kappa_ = 0.;
+ gamma_ = 0.;
+ mu_ = 0.;
+ needReset_ = true;
+ return true;
+ }
+
+ return false;
+ }
+
+ //--------------------------------------------------------
+ // construct_methods
+ // constructs the specific method to modify the ghosts
+ //--------------------------------------------------------
+ void GhostManager::construct_methods()
+ {
+ if (ghostModifier_) {
+ delete ghostModifier_;
+ ghostModifier_ = NULL;
+ }
+
+ if (!atc_->groupbit_ghost()) {
+ ghostModifier_ = new GhostModifier(this);
+ return;
+ }
+
+ switch (boundaryDynamics_) {
+ case VERLET: {
+ ghostModifier_ = new GhostModifier(this);
+ ghostModifier_->set_integrate_atoms(true);
+ break;
+ }
+ case PRESCRIBED: {
+ ghostModifier_ = new GhostModifierPrescribed(this);
+ break;
+ }
+ case COUPLED:
+ case DAMPED_HARMONIC: {
+ ghostModifier_ = new GhostModifierDampedHarmonic(this,kappa_,gamma_,mu_);
+ ghostModifier_->set_integrate_atoms(true);
+ break;
+ }
+ case SWAP: {
+ // if regions based on element sets, use verlet on ghosts and swap ghosts and internal when they move between regions
+ const std::string & internalElementSet(atc_->internal_element_set());
+ if (internalElementSet.size() && (atc_->atom_to_element_map_type()==EULERIAN)) {
+ LammpsInterface * lammpsInterface = LammpsInterface::instance();
+ if (atc_->atom_to_element_map_frequency() % lammpsInterface->reneighbor_frequency() != 0) {
+ throw ATC_Error("GhostManager::construct_methods - eulerian frequency and lammsp reneighbor frequency must be consistent to swap boundary and internal atoms");
+ }
+ ghostModifier_ = new GhostIntegratorSwap(this);
+ }
+ break;
+ }
+ case SWAP_VERLET: {
+ // if regions based on element sets, use verlet on ghosts and swap ghosts and internal when they move between regions
+ const std::string & internalElementSet(atc_->internal_element_set());
+ if (internalElementSet.size() && (atc_->atom_to_element_map_type()==EULERIAN)) {
+ LammpsInterface * lammpsInterface = LammpsInterface::instance();
+ if (atc_->atom_to_element_map_frequency() % lammpsInterface->reneighbor_frequency() != 0) {
+ throw ATC_Error("GhostManager::construct_methods - eulerian frequency and lammsp reneighbor frequency must be consistent to swap boundary and internal atoms");
+ }
+ ghostModifier_ = new GhostIntegratorSwap(this);
+ ghostModifier_->set_integrate_atoms(true);
+ }
+ break;
+ }
+ default: {
+ ghostModifier_ = new GhostModifier(this);
+ }
+ }
+ }
+
+ //--------------------------------------------------------
+ // construct_transfers
+ // sets/constructs all required dependency managed data
+ //--------------------------------------------------------
+ void GhostManager::construct_transfers()
+ {
+ ghostModifier_->construct_transfers();
+ }
+
+ //--------------------------------------------------------
+ // initialize
+ // initialize all data and variables before a run
+ //--------------------------------------------------------
+ void GhostManager::initialize()
+ {
+ ghostModifier_->initialize();
+ needReset_ = false;
+ }
+
+ //--------------------------------------------------------
+ // pre_exchange
+ // makes any updates required before lammps exchanges
+ // atoms
+ //--------------------------------------------------------
+ void GhostManager::pre_exchange()
+ {
+ ghostModifier_->pre_exchange();
+ }
+
+ //--------------------------------------------------------
+ // initial_integrate_velocity
+ // velocity update in first part of velocity-verlet
+ //--------------------------------------------------------
+ void GhostManager::init_integrate_velocity(double dt)
+ {
+ ghostModifier_->init_integrate_velocity(dt);
+ }
+
+ //--------------------------------------------------------
+ // initial_integrate_position
+ // position update in first part of velocity-verlet
+ //--------------------------------------------------------
+ void GhostManager::init_integrate_position(double dt)
+ {
+ ghostModifier_->init_integrate_position(dt);
+ }
+
+ //--------------------------------------------------------
+ // post_init_integrate
+ // makes any updates required after first integration
+ //--------------------------------------------------------
+ void GhostManager::post_init_integrate()
+ {
+ ghostModifier_->post_init_integrate();
+ }
+
+ //--------------------------------------------------------
+ // final_integrate
+ // velocity update in second part of velocity-verlet
+ //--------------------------------------------------------
+ void GhostManager::final_integrate(double dt)
+ {
+ ghostModifier_->final_integrate(dt);
+ }
+
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+ // Class GhostModifier
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+
+ //--------------------------------------------------------
+ // Constructor
+ //--------------------------------------------------------
+ GhostModifier::GhostModifier(GhostManager * ghostManager) :
+ ghostManager_(ghostManager),
+ atomTimeIntegrator_(NULL),
+ integrateAtoms_(false)
+ {
+ // do nothing
+ }
+
+ //--------------------------------------------------------
+ // Destructor
+ //--------------------------------------------------------
+ GhostModifier::~GhostModifier()
+ {
+ if (atomTimeIntegrator_) delete atomTimeIntegrator_;
+ }
+
+ //--------------------------------------------------------
+ // construct_transfers
+ // sets/constructs all required dependency managed data
+ //--------------------------------------------------------
+ void GhostModifier::construct_transfers()
+ {
+ if (atomTimeIntegrator_) delete atomTimeIntegrator_;
+ if (integrateAtoms_) {
+ atomTimeIntegrator_ = new AtomTimeIntegratorType(ghostManager_->atc(),GHOST);
+ atomTimeIntegrator_->construct_transfers();
+ }
+ else {
+ atomTimeIntegrator_ = new AtomTimeIntegrator();
+ }
+
+ }
+
+ //--------------------------------------------------------
+ // initial_integrate_velocity
+ // velocity update in first part of velocity-verlet
+ //--------------------------------------------------------
+ void GhostModifier::init_integrate_velocity(double dt)
+ {
+ atomTimeIntegrator_->init_integrate_velocity(dt);
+ }
+
+ //--------------------------------------------------------
+ // initial_integrate_position
+ // position update in first part of velocity-verlet
+ //--------------------------------------------------------
+ void GhostModifier::init_integrate_position(double dt)
+ {
+ atomTimeIntegrator_->init_integrate_position(dt);
+ }
+
+ //--------------------------------------------------------
+ // final_integrate
+ // velocity update in second part of velocity-verlet
+ //--------------------------------------------------------
+ void GhostModifier::final_integrate(double dt)
+ {
+ atomTimeIntegrator_->final_integrate(dt);
+ }
+
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+ // Class GhostModifierPrescribed
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+
+ //--------------------------------------------------------
+ // Constructor
+ //--------------------------------------------------------
+ GhostModifierPrescribed::GhostModifierPrescribed(GhostManager * ghostManager) :
+ GhostModifier(ghostManager),
+ atomPositions_(NULL),
+ atomFeDisplacement_(NULL),
+ atomRefPositions_(NULL)
+ {
+ // do nothing
+ }
+
+ //--------------------------------------------------------
+ // construct_transfers
+ // sets/constructs all required dependency managed data
+ //--------------------------------------------------------
+ void GhostModifierPrescribed::construct_transfers()
+ {
+ GhostModifier::construct_transfers();
+
+ InterscaleManager & interscaleManager((ghostManager_->atc())->interscale_manager());
+ atomPositions_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION,GHOST);
+
+ // prolongation from displacement field to atoms
+ PerAtomSparseMatrix<double> * atomShapeFunctions = interscaleManager.per_atom_sparse_matrix("InterpolantGhost");
+ if (!atomShapeFunctions) {
+ atomShapeFunctions = new PerAtomShapeFunction(ghostManager_->atc(),
+ interscaleManager.per_atom_quantity("AtomicGhostCoarseGrainingPositions"),
+ interscaleManager.per_atom_int_quantity("AtomGhostElement"),
+ GHOST);
+ interscaleManager.add_per_atom_sparse_matrix(atomShapeFunctions,"InterpolantGhost");
+ }
+ atomFeDisplacement_ = new FtaShapeFunctionProlongation(ghostManager_->atc(),
+ &(ghostManager_->atc())->field(DISPLACEMENT),
+ atomShapeFunctions,
+ GHOST);
+ interscaleManager.add_per_atom_quantity(atomFeDisplacement_,field_to_prolongation_name(DISPLACEMENT)+"Ghost");
+
+ atomRefPositions_ = interscaleManager.per_atom_quantity("AtomicGhostCoarseGrainingPositions");
+ }
+
+ //--------------------------------------------------------
+ // post_init_integrate
+ // after integration, fix ghost atoms' positions
+ //--------------------------------------------------------
+ void GhostModifierPrescribed::post_init_integrate()
+ {
+ const DENS_MAT & atomFeDisplacement(atomFeDisplacement_->quantity());
+ const DENS_MAT & atomRefPositions(atomRefPositions_->quantity());
+ *atomPositions_ = atomFeDisplacement + atomRefPositions;
+ }
+
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+ // Class GhostModifierDampedHarmonic
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+
+ //--------------------------------------------------------
+ // Constructor
+ //--------------------------------------------------------
+ GhostModifierDampedHarmonic::GhostModifierDampedHarmonic(GhostManager * ghostManager,
+ double kappa,
+ double gamma, double mu) :
+ GhostModifierPrescribed(ghostManager),
+ atomVelocities_(NULL),
+ atomFeVelocity_(NULL),
+ atomForces_(NULL),
+ kappa_(kappa),
+ gamma_(gamma),
+ mu_(mu)
+ {
+ // do nothing
+ }
+
+ //--------------------------------------------------------
+ // construct_transfers
+ // sets/constructs all required dependency managed data
+ //--------------------------------------------------------
+ void GhostModifierDampedHarmonic::construct_transfers()
+ {
+ GhostModifierPrescribed::construct_transfers();
+
+ InterscaleManager & interscaleManager((ghostManager_->atc())->interscale_manager());
+ atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,GHOST);
+ atomForces_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE,GHOST);
+
+ // prolongation from displacement field to atoms
+ PerAtomSparseMatrix<double> * atomShapeFunctions = interscaleManager.per_atom_sparse_matrix("InterpolantGhost");
+ atomFeVelocity_ = new FtaShapeFunctionProlongation(ghostManager_->atc(),
+ &(ghostManager_->atc())->field(VELOCITY),
+ atomShapeFunctions,
+ GHOST);
+ interscaleManager.add_per_atom_quantity(atomFeVelocity_,field_to_prolongation_name(VELOCITY)+"Ghost");
+ }
+
+ //--------------------------------------------------------
+ // initial_integrate_velocity
+ // velocity update in first part of velocity-verlet
+ //--------------------------------------------------------
+ void GhostModifierDampedHarmonic::init_integrate_velocity(double dt)
+ {
+ atomTimeIntegrator_->init_integrate_velocity(mu_*dt);
+ }
+
+ //--------------------------------------------------------
+ // initial_integrate_position
+ // position update in first part of velocity-verlet
+ //--------------------------------------------------------
+ void GhostModifierDampedHarmonic::init_integrate_position(double dt)
+ {
+ atomTimeIntegrator_->init_integrate_position(dt);
+ }
+
+ //--------------------------------------------------------
+ // final_integrate
+ // velocity update in second part of velocity-verlet
+ //--------------------------------------------------------
+ void GhostModifierDampedHarmonic::final_integrate(double dt)
+ {
+
+ const DENS_MAT & atomPositions(atomPositions_->quantity());
+ const DENS_MAT & atomVelocities(atomVelocities_->quantity());
+ const DENS_MAT & atomFeDisplacement(atomFeDisplacement_->quantity());
+ const DENS_MAT & atomFeVelocity(atomFeVelocity_->quantity());
+ const DENS_MAT & atomRefPositions(atomRefPositions_->quantity());
+
+ _forces_ = atomFeDisplacement;
+ _forces_ += atomRefPositions;
+ _forces_ -= atomPositions;
+ _forces_ *= kappa_;
+ _forces_ += gamma_*(atomFeVelocity - atomVelocities);
+ *atomForces_ = _forces_;
+
+ atomTimeIntegrator_->final_integrate(mu_*dt);
+ }
+
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+ // Class GhostIntegratorVerletSwap
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+
+ //--------------------------------------------------------
+ // Constructor
+ //--------------------------------------------------------
+ GhostIntegratorSwap::GhostIntegratorSwap(GhostManager * ghostManager) :
+ GhostModifier(ghostManager),
+ lammpsInterface_(LammpsInterface::instance()),
+ elementSet_((((ghostManager_->atc())->fe_engine())->fe_mesh())->elementset((ghostManager_->atc())->internal_element_set())),
+ atomElement_(NULL),
+ atomGhostElement_(NULL),
+ internalToAtom_((ghostManager_->atc())->internal_to_atom_map()),
+ ghostToAtom_((ghostManager_->atc())->ghost_to_atom_map()),
+ groupbit_((ghostManager_->atc())->groupbit()),
+ groupbitGhost_((ghostManager_->atc())->groupbit_ghost())
+ {
+ // do nothing
+ }
+
+ //--------------------------------------------------------
+ // construct_transfers
+ // sets/constructs all required dependency managed data
+ //--------------------------------------------------------
+ void GhostIntegratorSwap::construct_transfers()
+ {
+ GhostModifier::construct_transfers();
+
+ InterscaleManager & interscaleManager((ghostManager_->atc())->interscale_manager());
+ atomElement_ = interscaleManager.per_atom_int_quantity("AtomElement");
+ atomGhostElement_ = interscaleManager.per_atom_int_quantity("AtomGhostElement");
+ }
+
+ //--------------------------------------------------------
+ // initialize
+ // initialize all data and variables before a run
+ //--------------------------------------------------------
+ void GhostIntegratorSwap::initialize()
+ {
+ if ((ghostManager_->atc())->atom_to_element_map_frequency() % lammpsInterface_->reneighbor_frequency() != 0) {
+ throw ATC_Error("GhostIntegratorSwap::initialize - AtC Eulerian reset frequency must be a multiple of the Lammps reneighbor frequency when using internal/boundary atom swapping");
+ }
+ }
+
+ //--------------------------------------------------------
+ // pre_exchange
+ // swaps atoms between types depending on region
+ //--------------------------------------------------------
+ void GhostIntegratorSwap::pre_exchange()
+ {
+ // lammps mask to change type
+ int * mask = lammpsInterface_->atom_mask();
+
+ const DenseMatrix<int> & atomElement(atomElement_->quantity());
+ for (int i = 0; i < atomElement.nRows(); ++i) {
+ if (elementSet_.find(atomElement(i,0)) == elementSet_.end()) {
+ mask[internalToAtom_(i)] |= groupbitGhost_;
+ // remove from internal
+ }
+ }
+ }
+};
diff --git a/lib/atc/GhostManager.h b/lib/atc/GhostManager.h
new file mode 100644
index 000000000..dcacdbd3a
--- /dev/null
+++ b/lib/atc/GhostManager.h
@@ -0,0 +1,327 @@
+#ifndef GHOST_MANAGER_H
+#define GHOST_MANAGER_H
+
+// ATC headers
+#include "MatrixLibrary.h"
+#include "PerAtomQuantityLibrary.h"
+#include "TimeIntegrator.h"
+#include "ATC_TypeDefs.h"
+
+namespace ATC {
+
+ // forward declarations
+ class ATC_Method;
+ class GhostModifier;
+ class LammpsInterface;
+
+ /**
+ * @class GhostManager
+ * @brief Manages methods for modifying ghost atoms
+ */
+
+ class GhostManager {
+
+ public:
+
+ /** types of ghost boundary conditions in momentum */
+ enum BoundaryDynamicsType {
+ NO_BOUNDARY_DYNAMICS=0,
+ VERLET,
+ PRESCRIBED,
+ DAMPED_HARMONIC,
+ COUPLED,
+ SWAP,
+ SWAP_VERLET
+ };
+
+ // constructor
+ GhostManager(ATC_Method * atc);
+
+ // destructor
+ virtual ~GhostManager();
+
+ /** parser/modifier */
+ virtual bool modify(int narg, char **arg);
+
+ /** create objects to implement requested numerical method */
+ virtual void construct_methods();
+
+ /** create and get necessary transfer operators */
+ virtual void construct_transfers();
+
+ /** pre time integration initialization of data */
+ virtual void initialize();
+
+ /** prior to lammps exchange */
+ virtual void pre_exchange();
+
+ /** Predictor phase, Verlet first step for velocity */
+ virtual void init_integrate_velocity(double dt);
+
+ /** Predictor phase, Verlet first step for position */
+ virtual void init_integrate_position(double dt);
+
+ /** set positions after integration */
+ virtual void post_init_integrate();
+
+ /** Corrector phase, Verlet second step for velocity */
+ virtual void final_integrate(double dt);
+
+ /** sets the boundary dynamics flag as desired */
+ void set_boundary_dynamics(BoundaryDynamicsType boundaryDynamics) {boundaryDynamics_ = boundaryDynamics;}
+
+ /** flag for reset */
+ bool need_reset() const {return needReset_;};
+
+ /** access to ATC method object */
+ ATC_Method * atc() {return atc_;};
+
+ protected:
+
+ /** pointer to routines that modify ghosts */
+ GhostModifier* ghostModifier_;
+
+ /** pointer to access ATC methods */
+ ATC_Method * atc_;
+
+ /** boundary dynamics method type */
+ BoundaryDynamicsType boundaryDynamics_;
+
+ /** flag for reset */
+ bool needReset_;
+
+ /** spring constant for some models */
+ double kappa_;
+
+ /** damping constant for some models */
+ double gamma_;
+
+ /** ratio between mass of ghost types and desired mass for some models */
+ double mu_;
+
+ private:
+
+ // DO NOT define this
+ GhostManager();
+
+ };
+
+ /**
+ * @class GhostModifier
+ * @brief Base class for objects which modify the ghost atoms, integrates ghost atoms using velocity-verlet if requested
+ */
+
+ class GhostModifier {
+
+ public:
+
+ // constructor
+ GhostModifier(GhostManager * ghostManager);
+
+ // destructor
+ virtual ~GhostModifier();
+
+ /** create and get necessary transfer operators */
+ virtual void construct_transfers();
+
+ /** pre time integration initialization of data */
+ virtual void initialize(){};
+
+ /** Predictor phase, Verlet first step for velocity */
+ virtual void init_integrate_velocity(double dt);
+
+ /** Predictor phase, Verlet first step for position */
+ virtual void init_integrate_position(double dt);
+
+ /** set positions after integration */
+ virtual void post_init_integrate(){};
+
+ /** prior to lammps exchange */
+ virtual void pre_exchange(){};
+
+ /** Corrector phase, Verlet second step for velocity */
+ virtual void final_integrate(double dt);
+
+ /** sets the verlet integration flag as desired */
+ void set_integrate_atoms(bool integrateAtoms) {integrateAtoms_ = integrateAtoms;}
+
+ protected:
+
+ /** owning ghost manager */
+ GhostManager * ghostManager_;
+
+ /** object which integrates atoms */
+ AtomTimeIntegrator * atomTimeIntegrator_;
+
+ /** flag to perform velocity-verlet integration of ghosts */
+ bool integrateAtoms_;
+
+
+ private:
+
+ // DO NOT define this
+ GhostModifier();
+
+ };
+
+ /**
+ * @class GhostModifierPrescribed
+ * @brief sets ghost atom positions based on FE displacement
+ */
+
+ class GhostModifierPrescribed : public GhostModifier {
+
+ public:
+
+ // constructor
+ GhostModifierPrescribed(GhostManager * ghostManager);
+
+ // destructor
+ virtual ~GhostModifierPrescribed(){};
+
+ /** create and get necessary transfer operators */
+ virtual void construct_transfers();
+
+ /** set positions after integration */
+ virtual void post_init_integrate();
+
+ protected:
+
+ /** positions of atoms */
+ PerAtomQuantity<double> * atomPositions_;
+
+ /** FE displacement at ghost locations */
+ PerAtomQuantity<double> * atomFeDisplacement_;
+
+ /** atom reference positions */
+ PerAtomQuantity<double> * atomRefPositions_;
+
+ private:
+
+ // DO NOT define this
+ GhostModifierPrescribed();
+
+ };
+
+ /**
+ * @class GhostModifierDampedHarmonic
+ * @brief Integrates ghost atoms using velocity-verlet with a damped harmonic force
+ */
+
+ class GhostModifierDampedHarmonic : public GhostModifierPrescribed {
+
+ public:
+
+ // constructor
+ GhostModifierDampedHarmonic(GhostManager * ghostManager,
+ double kappa_, double gamma, double mu);
+
+ // destructor
+ virtual ~GhostModifierDampedHarmonic(){};
+
+ /** create and get necessary transfer operators */
+ virtual void construct_transfers();
+
+ /** Predictor phase, Verlet first step for velocity */
+ virtual void init_integrate_velocity(double dt);
+
+ /** Predictor phase, Verlet first step for position */
+ virtual void init_integrate_position(double dt);
+
+ /** set positions after integration */
+ virtual void post_init_integrate(){};
+
+ /** Corrector phase, Verlet second step for velocity */
+ virtual void final_integrate(double dt);
+
+ protected:
+
+ /** velocities of atoms */
+ PerAtomQuantity<double> * atomVelocities_;
+
+ /** FE velocity at ghost locations */
+ PerAtomQuantity<double> * atomFeVelocity_;
+
+ /** atom forces */
+ PerAtomQuantity<double> * atomForces_;
+
+ /** spring constant */
+ double kappa_;
+
+ /** damping constant */
+ double gamma_;
+
+ /** ratio between mass of ghost types and desired mass */
+ double mu_;
+
+ // workspace
+ DENS_MAT _forces_;
+
+ private:
+
+ // DO NOT define this
+ GhostModifierDampedHarmonic();
+
+ };
+
+ /**
+ * @class GhostIntegratorSwap
+ * @brief Integrates ghost atoms using velocity-verlet, and swaps atoms between ghost
+ * and internal depending on what element they are in
+ */
+
+ class GhostIntegratorSwap : public GhostModifier {
+
+ public:
+
+ // constructor
+ GhostIntegratorSwap(GhostManager * ghostManager);
+
+ // destructor
+ virtual ~GhostIntegratorSwap(){};
+
+ /** create and get necessary transfer operators */
+ virtual void construct_transfers();
+
+ /** pre time integration initialization of data */
+ virtual void initialize();
+
+ /** prior to lammps exchange */
+ virtual void pre_exchange();
+
+ protected:
+
+ /** pointer to lammps interface */
+ LammpsInterface * lammpsInterface_;
+
+ /** internal element set */
+ const std::set<int> & elementSet_;
+
+ /** internal to element map */
+ PerAtomQuantity<int> * atomElement_;
+
+ /** ghost to element map */
+ PerAtomQuantity<int> * atomGhostElement_;
+
+ /** internal to atom map */
+ const Array<int> & internalToAtom_;
+
+ /** ghost to atom map */
+ const Array<int> & ghostToAtom_;
+
+ /** group bit for internal */
+ int groupbit_;
+
+ /** group bit for ghost */
+ int groupbitGhost_;
+
+ private:
+
+ // DO NOT define this
+ GhostIntegratorSwap();
+
+ };
+
+
+};
+#endif
diff --git a/lib/atc/InterscaleOperators.cpp b/lib/atc/InterscaleOperators.cpp
index 15facf919..28762b977 100644
--- a/lib/atc/InterscaleOperators.cpp
+++ b/lib/atc/InterscaleOperators.cpp
@@ -1,653 +1,658 @@
// ATC transfer headers
#include "InterscaleOperators.h"
#include "PerAtomQuantity.h"
#include "TransferOperator.h"
#include "MoleculeSet.h"
#include "ATC_Method.h"
//#include <typeinfo>
+using std::set;
+using std::map;
+using std::string;
+
namespace ATC{
//--------------------------------------------------------
//--------------------------------------------------------
// Class InterscaleManager
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
InterscaleManager::InterscaleManager(ATC_Method * atc) :
atc_(atc),
initialized_(false),
prefix_(":fix_atc:")
{
fundamentalAtomQuantities_.resize(NUM_ATOM_TYPES);
for (unsigned int i = 0; i < NUM_ATOM_TYPES; i++) {
fundamentalAtomQuantities_[i].resize(LammpsInterface::NUM_FUNDAMENTAL_ATOM_QUANTITIES);
for (unsigned int j = 0; j < LammpsInterface::NUM_FUNDAMENTAL_ATOM_QUANTITIES; j++)
fundamentalAtomQuantities_[i][j] = NULL;
}
}
//----------------------------------------------------
// Set_lammps_data_prefix
//--------------------------------------------------------
void InterscaleManager::set_lammps_data_prefix()
{
prefix_ = (atc_->lammps_interface())->fix_id() + prefix_;
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
InterscaleManager::~InterscaleManager()
{
clear();
}
//--------------------------------------------------------
// clear
//--------------------------------------------------------
void InterscaleManager::clear()
{
// set all memory types to temporary
for (unsigned int i = 0; i < NUM_ATOM_TYPES; i++) {
for (unsigned int j = 0; j < LammpsInterface::NUM_FUNDAMENTAL_ATOM_QUANTITIES; j++) {
if (fundamentalAtomQuantities_[i][j]) {
fundamentalAtomQuantities_[i][j]->set_memory_type(TEMPORARY);
}
}
}
set_memory_temporary(perAtomQuantities_);
set_memory_temporary(perAtomIntQuantities_);
set_memory_temporary(perAtomDiagonalMatrices_);
set_memory_temporary(perAtomSparseMatrices_);
set_memory_temporary(pairMaps_);
set_memory_temporary(denseMatrices_);
set_memory_temporary(denseMatricesInt_);
set_memory_temporary(denseMatricesBool_);
set_memory_temporary(sparseMatrices_);
set_memory_temporary(diagonalMatrices_);
set_memory_temporary(vectorSparMat_);
set_memory_temporary(setInt_);
set_memory_temporary(smallMoleculeSets_);
// clean up maps and vectors
clear_temporary_data();
}
//--------------------------------------------------------
// clear
//--------------------------------------------------------
void InterscaleManager::clear_temporary_data()
{
deletionList_.clear();
int listSize = fundamentalAtomQuantities_.size()+perAtomQuantities_.size()+perAtomIntQuantities_.size()+perAtomDiagonalMatrices_.size()+perAtomSparseMatrices_.size();
listSize += pairMaps_.size()+denseMatrices_.size()+denseMatricesInt_.size()+denseMatricesBool_.size()+sparseMatrices_.size()+diagonalMatrices_.size()+vectorSparMat_.size()+setInt_.size()+smallMoleculeSets_.size();
deletionList_.reserve(listSize);
create_deletion_list();
for (unsigned int i = 0; i < deletionList_.size(); i++) {
if (deletionList_[i]) {
delete deletionList_[i];
}
}
}
//--------------------------------------------------------
// create_deletion_list
//--------------------------------------------------------
void InterscaleManager::create_deletion_list()
{
// set all quantities to unfound
dfs_prepare_loop(perAtomQuantities_);
dfs_prepare_loop(perAtomIntQuantities_);
dfs_prepare_loop(perAtomDiagonalMatrices_);
dfs_prepare_loop(perAtomSparseMatrices_);
dfs_prepare_loop(perAtomQuantities_);
dfs_prepare_loop(pairMaps_);
dfs_prepare_loop(denseMatrices_);
dfs_prepare_loop(denseMatricesInt_);
dfs_prepare_loop(denseMatricesBool_);
dfs_prepare_loop(sparseMatrices_);
dfs_prepare_loop(diagonalMatrices_);
dfs_prepare_loop(vectorSparMat_);
dfs_prepare_loop(setInt_);
dfs_prepare_loop(smallMoleculeSets_);
// perform dfs, special case for fundamental atom quantities
int index = 0;
for (unsigned int i = 0; i < NUM_ATOM_TYPES; i++) {
for (unsigned int j = 0; j < LammpsInterface::NUM_FUNDAMENTAL_ATOM_QUANTITIES; j++) {
if (fundamentalAtomQuantities_[i][j]) {
index = dfs_visit(fundamentalAtomQuantities_[i][j],index);
if ((fundamentalAtomQuantities_[i][j])->memory_type()==TEMPORARY) {
fundamentalAtomQuantities_[i][j] = NULL;
}
}
}
}
// dfs for everything else
dfs_visit_loop(perAtomQuantities_,index);
dfs_visit_loop(perAtomIntQuantities_,index);
dfs_visit_loop(perAtomDiagonalMatrices_,index);
dfs_visit_loop(perAtomSparseMatrices_,index);
dfs_visit_loop(pairMaps_,index);
dfs_visit_loop(denseMatrices_,index);
dfs_visit_loop(denseMatricesInt_,index);
dfs_visit_loop(denseMatricesBool_,index);
dfs_visit_loop(sparseMatrices_,index);
dfs_visit_loop(diagonalMatrices_,index);
dfs_visit_loop(vectorSparMat_,index);
dfs_visit_loop(setInt_,index);
dfs_visit_loop(smallMoleculeSets_,index);
}
//--------------------------------------------------------
// dfs_visit
//--------------------------------------------------------
int InterscaleManager::dfs_visit(DependencyManager * quantity, const int index)
{
int myIndex = index;
set<DependencyManager * >::iterator it;
bool isTemporary = (quantity->memory_type()==TEMPORARY);
for (it = (quantity->dependentQuantities_).begin(); it != (quantity->dependentQuantities_).end(); it++) {
// make sure that if quantity isn't persistent, none of it's depedencies are
if ((*it)->memory_type()==PERSISTENT && isTemporary) {
throw ATC_Error("InterscaleManager::dfs_visit - a persistent quantity has a temporary dependency");
}
if (!((*it)->dfsFound_)) {
myIndex = dfs_visit(*it,myIndex);
}
}
quantity->dfsFound_ = true;
if (isTemporary)
deletionList_.push_back(quantity);
return ++myIndex;
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void InterscaleManager::initialize()
{
// force all existing objects to reset
for (unsigned int i = 0; i < NUM_ATOM_TYPES; i++) {
for (unsigned int j = 0; j < LammpsInterface::NUM_FUNDAMENTAL_ATOM_QUANTITIES; j++) {
if (fundamentalAtomQuantities_[i][j]) {
fundamentalAtomQuantities_[i][j]->force_reset();
}
}
}
force_reset_loop(perAtomQuantities_);
force_reset_loop(perAtomIntQuantities_);
force_reset_loop(perAtomDiagonalMatrices_);
force_reset_loop(perAtomSparseMatrices_);
force_reset_loop(perAtomQuantities_);
force_reset_loop(pairMaps_);
force_reset_loop(denseMatrices_);
force_reset_loop(denseMatricesInt_);
force_reset_loop(denseMatricesBool_);
force_reset_loop(sparseMatrices_);
force_reset_loop(diagonalMatrices_);
force_reset_loop(vectorSparMat_);
force_reset_loop(setInt_);
force_reset_loop(smallMoleculeSets_);
}
// access methods for atomic quantities
//--------------------------------------------------------
// fundamental_atom_quantity
//--------------------------------------------------------
FundamentalAtomQuantity * InterscaleManager::fundamental_atom_quantity(LammpsInterface::FundamentalAtomQuantity id,
AtomType atomType)
{
if (!fundamentalAtomQuantities_[atomType][id]) { // create a new one if it doesn't exist
if (id == LammpsInterface::ATOM_MASS) {
double * mass = LammpsInterface::instance()->atom_mass();
if (mass)
fundamentalAtomQuantities_[atomType][id] = new AtomMass(atc_,atomType);
else
fundamentalAtomQuantities_[atomType][id] = new FundamentalAtomQuantity(atc_,id,atomType);
}
else
fundamentalAtomQuantities_[atomType][id] = new FundamentalAtomQuantity(atc_,id,atomType);
fundamentalAtomQuantities_[atomType][id]->set_memory_type(PERSISTENT);
}
return fundamentalAtomQuantities_[atomType][id];
}
//--------------------------------------------------------
// per_atom_quantity
//--------------------------------------------------------
PerAtomQuantity<double> * InterscaleManager::per_atom_quantity(const string & tag)
{
return return_quantity(perAtomQuantities_,tag);
}
//--------------------------------------------------------
// per_atom_int_quantity
//--------------------------------------------------------
PerAtomQuantity<int> * InterscaleManager::per_atom_int_quantity(const string & tag)
{
return return_quantity(perAtomIntQuantities_,tag);
}
//--------------------------------------------------------
// per_atom_diagonal_matrix
//--------------------------------------------------------
PerAtomDiagonalMatrix<double> * InterscaleManager::per_atom_diagonal_matrix(const string & tag)
{
return return_quantity(perAtomDiagonalMatrices_,tag);
}
//--------------------------------------------------------
// per_atom_sparse_matrix
//--------------------------------------------------------
PerAtomSparseMatrix<double> * InterscaleManager::per_atom_sparse_matrix(const string & tag)
{
return return_quantity(perAtomSparseMatrices_,tag);
}
//--------------------------------------------------------
// pair_map
//--------------------------------------------------------
PairMap * InterscaleManager::pair_map(const string & tag)
{
return return_quantity(pairMaps_,tag);
}
//--------------------------------------------------------
// add_per_atom_quantity
//--------------------------------------------------------
void InterscaleManager::add_per_atom_quantity(PerAtomQuantity<double> * atomQuantity,
const string & tag)
{
add_comm_quantity(perAtomQuantities_,commList_,atomQuantity,tag);
}
//--------------------------------------------------------
// add_per_atom_int_quantity
//--------------------------------------------------------
void InterscaleManager::add_per_atom_int_quantity(PerAtomQuantity<int> * atomQuantity,
const string & tag)
{
add_comm_quantity(perAtomIntQuantities_,commIntList_,atomQuantity,tag);
}
//--------------------------------------------------------
// add_per_atom_diagonal_matrix
//--------------------------------------------------------
void InterscaleManager::add_per_atom_diagonal_matrix(PerAtomDiagonalMatrix<double> * atomQuantity,
const string & tag)
{
add_comm_quantity(perAtomDiagonalMatrices_,commDmList_,atomQuantity,tag);
}
//--------------------------------------------------------
// add_per_atom_sparse_matrix
//--------------------------------------------------------
void InterscaleManager::add_per_atom_sparse_matrix(PerAtomSparseMatrix<double> * atomQuantity,
const string & tag)
{
add_comm_quantity(perAtomSparseMatrices_,commSmList_,atomQuantity,tag);
}
//--------------------------------------------------------
// add_pair_map
//--------------------------------------------------------
void InterscaleManager::add_pair_map(PairMap * pairMap,
const string & tag)
{
add_quantity(pairMaps_,pairMap,tag);
}
//--------------------------------------------------------
// dense_matrix
//--------------------------------------------------------
DENS_MAN * InterscaleManager::dense_matrix(const string & tag)
{
return return_quantity(denseMatrices_,tag);
}
//--------------------------------------------------------
// add_dense_matrix
//--------------------------------------------------------
void InterscaleManager::add_dense_matrix(DENS_MAN * denseMatrix,
const string & tag)
{
add_quantity(denseMatrices_,denseMatrix,tag);
}
//--------------------------------------------------------
// dense_matrix_int
//--------------------------------------------------------
MatrixDependencyManager<DenseMatrix, int> * InterscaleManager::dense_matrix_int(const string & tag)
{
return return_quantity(denseMatricesInt_,tag);
}
//--------------------------------------------------------
// add_dense_matrix_int
//--------------------------------------------------------
void InterscaleManager::add_dense_matrix_int(MatrixDependencyManager<DenseMatrix, int> * denseMatrix,
const string & tag)
{
add_quantity(denseMatricesInt_,denseMatrix,tag);
}
//--------------------------------------------------------
// dense_matrix_bool
//--------------------------------------------------------
MatrixDependencyManager<DenseMatrix, bool> * InterscaleManager::dense_matrix_bool(const string & tag)
{
return return_quantity(denseMatricesBool_,tag);
}
//--------------------------------------------------------
// add_dense_matrix_bool
//--------------------------------------------------------
void InterscaleManager::add_dense_matrix_bool(MatrixDependencyManager<DenseMatrix, bool> * denseMatrix,
const string & tag)
{
add_quantity(denseMatricesBool_,denseMatrix,tag);
}
//--------------------------------------------------------
// sparse_matrix
//--------------------------------------------------------
SPAR_MAN * InterscaleManager::sparse_matrix(const string & tag)
{
return return_quantity(sparseMatrices_,tag);
}
//--------------------------------------------------------
// add_sparse_matrix
//--------------------------------------------------------
void InterscaleManager::add_sparse_matrix(SPAR_MAN * sparseMatrix,
const string & tag)
{
add_quantity(sparseMatrices_,sparseMatrix,tag);
}
//--------------------------------------------------------
// diagonal_matrix
//--------------------------------------------------------
DIAG_MAN * InterscaleManager::diagonal_matrix(const string & tag)
{
return return_quantity(diagonalMatrices_,tag);
}
//--------------------------------------------------------
// add_sparse_matrix
//--------------------------------------------------------
void InterscaleManager::add_diagonal_matrix(DIAG_MAN * diagonalMatrix,
const string & tag)
{
add_quantity(diagonalMatrices_,diagonalMatrix,tag);
}
//--------------------------------------------------------
// vector_spar_mat
//--------------------------------------------------------
VectorDependencyManager<SPAR_MAT * > * InterscaleManager::vector_sparse_matrix(const string & tag)
{
return return_quantity(vectorSparMat_,tag);
}
//--------------------------------------------------------
// add_vector_spar_mat
//--------------------------------------------------------
void InterscaleManager::add_vector_sparse_matrix(VectorDependencyManager<SPAR_MAT * > * vectorSparMat,
const string & tag)
{
add_quantity(vectorSparMat_,vectorSparMat,tag);
}
//--------------------------------------------------------
// set_int
//--------------------------------------------------------
SetDependencyManager<int> * InterscaleManager::set_int(const string & tag)
{
return return_quantity(setInt_,tag);
}
//--------------------------------------------------------
// add_set_int
//--------------------------------------------------------
void InterscaleManager::add_set_int(SetDependencyManager<int> * setInt,
const string & tag)
{
add_quantity(setInt_,setInt,tag);
}
//--------------------------------------------------------
// molecule_set
//--------------------------------------------------------
SmallMoleculeSet * InterscaleManager::small_molecule_set(const string & tag)
{
return return_quantity(smallMoleculeSets_,tag);
}
//--------------------------------------------------------
// add_molecule_set
//--------------------------------------------------------
void InterscaleManager::add_small_molecule_set(SmallMoleculeSet * moleculeSet,
const string & tag)
{
add_quantity(smallMoleculeSets_,moleculeSet,tag);
moleculeSet->initialize();
}
//--------------------------------------------------------
// find_tag
//--------------------------------------------------------
DependencyManager * InterscaleManager::find(const string & tag)
{
// REFACTOR add check for duplicate entries
DependencyManager * quantity = NULL;
quantity = find_in_list(perAtomQuantities_,tag);
if (quantity) return quantity;
quantity = find_in_list(perAtomIntQuantities_,tag);
if (quantity) return quantity;
quantity = find_in_list(perAtomDiagonalMatrices_,tag);
if (quantity) return quantity;
quantity = find_in_list(perAtomSparseMatrices_,tag);
if (quantity) return quantity;
quantity = find_in_list(pairMaps_,tag);
if (quantity) return quantity;
quantity = find_in_list(denseMatrices_,tag);
if (quantity) return quantity;
quantity = find_in_list(denseMatricesInt_,tag);
if (quantity) return quantity;
quantity = find_in_list(denseMatricesBool_,tag);
if (quantity) return quantity;
quantity = find_in_list(sparseMatrices_,tag);
if (quantity) return quantity;
quantity = find_in_list(diagonalMatrices_,tag);
if (quantity) return quantity;
quantity = find_in_list(vectorSparMat_,tag);
if (quantity) return quantity;
quantity = find_in_list(setInt_,tag);
if (quantity) return quantity;
quantity = find_in_list(smallMoleculeSets_,tag);
if (quantity) return quantity;
return NULL;
}
//--------------------------------------------------------
// remove
//--------------------------------------------------------
void InterscaleManager::remove(const string & tag)
{
DependencyManager * toBeDeleted = find(tag);
if (toBeDeleted) {
toBeDeleted->set_memory_type(TEMPORARY);
}
}
//--------------------------------------------------------
// reset_nlocal
//--------------------------------------------------------
void InterscaleManager::reset_nlocal()
{
reset_nlocal_loop(perAtomSparseMatrices_); // this goes in between diagonal matrices and molecule sets above
}
//--------------------------------------------------------
// computes_force_reset
//--------------------------------------------------------
void InterscaleManager::lammps_force_reset()
{
for (unsigned int i = 0; i < NUM_ATOM_TYPES; i++) {
for (unsigned int j = 0; j < LammpsInterface::NUM_FUNDAMENTAL_ATOM_QUANTITIES; j++) {
if (fundamentalAtomQuantities_[i][j]) {
fundamentalAtomQuantities_[i][j]->lammps_force_reset();
}
}
}
lammps_reset_loop(perAtomQuantities_);
lammps_reset_loop(perAtomIntQuantities_);
lammps_reset_loop(perAtomDiagonalMatrices_);
lammps_reset_loop(perAtomSparseMatrices_);
}
//--------------------------------------------------------
// size_comm_quantities
//--------------------------------------------------------
void InterscaleManager::size_comm_quantities()
{
size_comm_loop(commList_);
size_comm_loop(commIntList_);
size_comm_loop(commDmList_);
size_comm_loop(commSmList_);
}
//--------------------------------------------------------
// prepare_exchange
//--------------------------------------------------------
void InterscaleManager::prepare_exchange()
{
prepare_exchange_loop(perAtomIntQuantities_);
prepare_exchange_loop(perAtomQuantities_);
prepare_exchange_loop(perAtomDiagonalMatrices_);
prepare_exchange_loop(perAtomSparseMatrices_);
}
//--------------------------------------------------------
// post_exchange
//--------------------------------------------------------
void InterscaleManager::post_exchange()
{
post_exchange_loop(perAtomIntQuantities_);
post_exchange_loop(perAtomQuantities_);
post_exchange_loop(perAtomDiagonalMatrices_);
post_exchange_loop(perAtomSparseMatrices_);
post_exchange_loop(smallMoleculeSets_);
+ post_exchange_loop(pairMaps_);
}
//--------------------------------------------------------
// memory_usage
//--------------------------------------------------------
int InterscaleManager::memory_usage() const
{
int usage = 0;
memory_usage_loop(perAtomQuantities_,usage);
memory_usage_loop(perAtomIntQuantities_,usage);
memory_usage_loop(perAtomDiagonalMatrices_,usage);
memory_usage_loop(perAtomSparseMatrices_,usage);
return usage;
}
//--------------------------------------------------------
// pack_exchange
//--------------------------------------------------------
int InterscaleManager::pack_exchange(int i, double *buffer)
{
int index = 0;
pack_exchange_loop(perAtomQuantities_,index,i,&buffer[index]);
pack_exchange_loop(perAtomIntQuantities_,index,i,&buffer[index]);
pack_exchange_loop(perAtomDiagonalMatrices_,index,i,&buffer[index]);
pack_exchange_loop(perAtomSparseMatrices_,index,i,&buffer[index]);
return index;
}
//--------------------------------------------------------
// unpack_exchange
//--------------------------------------------------------
int InterscaleManager::unpack_exchange(int i, double *buffer)
{
int index = 0;
unpack_exchange_loop(perAtomQuantities_,index,i,&buffer[index]);
unpack_exchange_loop(perAtomIntQuantities_,index,i,&buffer[index]);
unpack_exchange_loop(perAtomDiagonalMatrices_,index,i,&buffer[index]);
unpack_exchange_loop(perAtomSparseMatrices_,index,i,&buffer[index]);
return index;
}
//--------------------------------------------------------
// pack_comm
//--------------------------------------------------------
int InterscaleManager::pack_comm(int index, double *buf,
int pbc_flag, int *pbc)
{
int size = 0;
//pack_comm_loop(commList_,size,index,buf,pbc_flag,pbc);
pack_comm_loop(commIntList_,size,index,buf,pbc_flag,pbc);
//pack_comm_loop(commDmList_,size,index,buf,pbc_flag,pbc);
//pack_comm_loop(commSmList_,size,index,buf,pbc_flag,pbc);
return size;
}
//--------------------------------------------------------
// unpack_comm
//--------------------------------------------------------
int InterscaleManager::unpack_comm(int index, double *buf)
{
int size = 0;
//unpack_comm_loop(commList_,size,index,buf);
unpack_comm_loop(commIntList_,size,index,buf);
//unpack_comm_loop(commDmList_,size,index,buf);
//unpack_comm_loop(commSmList_,size,index,buf);
return size;
}
//--------------------------------------------------------
// grow_array
//--------------------------------------------------------
void InterscaleManager::grow_arrays(int nmax)
{
grow_arrays_loop(perAtomQuantities_,nmax);
grow_arrays_loop(perAtomIntQuantities_,nmax);
grow_arrays_loop(perAtomDiagonalMatrices_,nmax);
grow_arrays_loop(perAtomSparseMatrices_,nmax);
}
//--------------------------------------------------------
// copy_array
//--------------------------------------------------------
void InterscaleManager::copy_arrays(int i, int j)
{
copy_arrays_loop(perAtomQuantities_,i,j);
copy_arrays_loop(perAtomIntQuantities_,i,j);
copy_arrays_loop(perAtomDiagonalMatrices_,i,j);
copy_arrays_loop(perAtomSparseMatrices_,i,j);
}
};
diff --git a/lib/atc/InterscaleOperators.h b/lib/atc/InterscaleOperators.h
index e4a4525a1..20d16de9c 100644
--- a/lib/atc/InterscaleOperators.h
+++ b/lib/atc/InterscaleOperators.h
@@ -1,458 +1,462 @@
// An interscale operator class for sharing definitions of atomic quantities, e.g., temperature
// between different parts of the code
#ifndef INTERSCALE_MANAGER_H
#define INTERSCALE_MANAGER_H
-// ATC_Transfer headers
#include "MatrixLibrary.h"
#include "ATC_TypeDefs.h"
#include "ATC_Error.h"
#include "LammpsInterface.h"
#include "PerAtomQuantity.h"
#include "PerPairQuantity.h"
#include "FundamentalAtomicQuantity.h"
#include <vector>
#include <map>
+#include <set>
+#include <string>
+#include <utility>
-using namespace std;
namespace ATC {
// forward declarations
class ATC_Method;
class SmallMoleculeSet;
/**
* @class InterscaleManager
* @brief Handles definitions for atomistic quantities
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class InterscaleManager
//--------------------------------------------------------
//--------------------------------------------------------
class InterscaleManager {
public:
// constructor
InterscaleManager(ATC_Method * atc);
// destructor
~InterscaleManager();
/** delete all allocated data */
void clear();
/** delete non-persistent data */
void clear_temporary_data();
/** set lammps data prefix */
void set_lammps_data_prefix();
/** parser/modifier */
bool modify(int narg, char **arg);
/** pre time integration */
void initialize();
// access to per atom quantity objects
/** access to fundamental atomic quantities */
FundamentalAtomQuantity * fundamental_atom_quantity(LammpsInterface::FundamentalAtomQuantity id,
AtomType atomType = INTERNAL);
/** access to double per atom quantities */
- PerAtomQuantity<double> * per_atom_quantity(const string & tag);
+ PerAtomQuantity<double> * per_atom_quantity(const std::string & tag);
/** access to integer per atom quantities */
- PerAtomQuantity<int> * per_atom_int_quantity(const string & tag);
+ PerAtomQuantity<int> * per_atom_int_quantity(const std::string & tag);
/** access to double per atom diagonal matrices */
- PerAtomDiagonalMatrix<double> * per_atom_diagonal_matrix(const string & tag);
+ PerAtomDiagonalMatrix<double> * per_atom_diagonal_matrix(const std::string & tag);
/** access to double per atom sparse matrices */
- PerAtomSparseMatrix<double> * per_atom_sparse_matrix(const string & tag);
+ PerAtomSparseMatrix<double> * per_atom_sparse_matrix(const std::string & tag);
/** access to pair maps */
- PairMap * pair_map(const string & tag);
+ PairMap * pair_map(const std::string & tag);
// addition of new atom quantities, note provider must allocate but the manager will clean-up
/** addition of a double atomic quantity */
void add_per_atom_quantity(PerAtomQuantity<double> * atomQuantity,
- const string & tag);
+ const std::string & tag);
/** addition of an integer atomic quantity */
void add_per_atom_int_quantity(PerAtomQuantity<int> * atomQuantity,
- const string & tag);
+ const std::string & tag);
/** addition of a double atomic diagonal matrix */
void add_per_atom_diagonal_matrix(PerAtomDiagonalMatrix<double> * atomQuantity,
- const string & tag);
+ const std::string & tag);
/** addition of a double atomic sparse matrix */
void add_per_atom_sparse_matrix(PerAtomSparseMatrix<double> * atomQuantity,
- const string & tag);
+ const std::string & tag);
/** addition of an pair map */
- void add_pair_map(PairMap * pairMap, const string & tag);
+ void add_pair_map(PairMap * pairMap, const std::string & tag);
/** access to dense matrices */
- DENS_MAN * dense_matrix(const string & tag);
+ DENS_MAN * dense_matrix(const std::string & tag);
/** addition of dense matrices */
void add_dense_matrix(DENS_MAN * denseMatrix,
- const string & tag);
+ const std::string & tag);
/** access integer dense matrices */
- MatrixDependencyManager<DenseMatrix, int> * dense_matrix_int(const string & tag);
+ MatrixDependencyManager<DenseMatrix, int> * dense_matrix_int(const std::string & tag);
/** addition of integer dense matrices */
void add_dense_matrix_int(MatrixDependencyManager<DenseMatrix, int> * denseMatrix,
- const string & tag);
+ const std::string & tag);
/** access boolean dense matrices */
- MatrixDependencyManager<DenseMatrix, bool> * dense_matrix_bool(const string & tag);
+ MatrixDependencyManager<DenseMatrix, bool> * dense_matrix_bool(const std::string & tag);
/** addition of boolean dense matrices */
void add_dense_matrix_bool(MatrixDependencyManager<DenseMatrix, bool> * denseMatrix,
- const string & tag);
+ const std::string & tag);
/** access to sparse matrices */
- SPAR_MAN * sparse_matrix(const string & tag);
+ SPAR_MAN * sparse_matrix(const std::string & tag);
/** addition of a sparse matrix */
void add_sparse_matrix(SPAR_MAN * sparseMatrix,
- const string & tag);
+ const std::string & tag);
/** access to diagonal matrices */
- DIAG_MAN * diagonal_matrix(const string & tag);
+ DIAG_MAN * diagonal_matrix(const std::string & tag);
/** addition of a diagonal matrix */
void add_diagonal_matrix(DIAG_MAN * diagonalMatrix,
- const string & tag);
+ const std::string & tag);
/** access to vectors of sparse matrices */
- VectorDependencyManager<SPAR_MAT * > * vector_sparse_matrix(const string & tag);
+ VectorDependencyManager<SPAR_MAT * > * vector_sparse_matrix(const std::string & tag);
/** addition of a vector of sparse matrices */
void add_vector_sparse_matrix(VectorDependencyManager<SPAR_MAT * > * sparseMatrix,
- const string & tag);
+ const std::string & tag);
/** access to sets of ints */
- SetDependencyManager<int> * set_int(const string & tag);
+ SetDependencyManager<int> * set_int(const std::string & tag);
/** addition of a set of ints */
void add_set_int(SetDependencyManager<int> * sparseMatrix,
- const string & tag);
+ const std::string & tag);
/** access to molecule sets */
- SmallMoleculeSet * small_molecule_set(const string & tag);
+ SmallMoleculeSet * small_molecule_set(const std::string & tag);
/** addition of a transfer operator */
void add_small_molecule_set(SmallMoleculeSet * moleculeSet,
- const string & tag);
+ const std::string & tag);
/** addition of exchange list object */
- void add_to_exchange_list(const string & tag);
+ void add_to_exchange_list(const std::string & tag);
/** searches through all lists to see if a tag is registered */
- DependencyManager * find(const string & tag);
+ DependencyManager * find(const std::string & tag);
/** schedules a quantity for deletion, if it exists */
- void remove(const string & tag);
+ void remove(const std::string & tag);
/** size communicated quantities initially */
void size_comm_quantities();
/** resets nlocal count of managed atomic quantities which do not perform parallel exchange */
void reset_nlocal();
/** resets all lammps data, as needed, to account for times when lammps can change quantities */
void lammps_force_reset();
/** syncs lammps data to managed objects for parallel communication */
void prepare_exchange();
/** syncs managed objects to lammps data after parallel communication */
void post_exchange();
/** returns how much lammps memory is used in this function */
int memory_usage() const;
/** packs up data for parallel transfer, called from pack_exchange */
int pack_exchange(int i, double *buffer);
/** unpacks data after parallel transfer, called from unpack_exchange */
int unpack_exchange(int i, double *buffer);
/** packs up data for parallel transfer to ghost atoms on other processors */
int pack_comm(int index, double *buf,
int pbc_flag, int *pbc);
/** unpacks data after parallel transfer to ghost atoms on other processors */
int unpack_comm(int index, double *buf);
/** changes size of temperary lammps storage data if transfer is being used */
void grow_arrays(int nmax);
/** rearrange memory of temporary lammps storage data, called from copy_array */
void copy_arrays(int i, int j);
protected:
/** pointer to access ATC methods */
ATC_Method * atc_;
/** flag for if first initialization has happened */
bool initialized_;
/** containers for fundamental atom quantities, set on request */
- vector<vector<FundamentalAtomQuantity* > > fundamentalAtomQuantities_;
+ std::vector<std::vector<FundamentalAtomQuantity* > > fundamentalAtomQuantities_;
/** container for per-atom quantities using dense matrices of doubles */
- map<string, PerAtomQuantity<double> * > perAtomQuantities_;
+ std::map<std::string, PerAtomQuantity<double> * > perAtomQuantities_;
/** container for integer atom quantities, set by AtC classes */
- map<string, PerAtomQuantity<int> * > perAtomIntQuantities_;
+ std::map<std::string, PerAtomQuantity<int> * > perAtomIntQuantities_;
/** container for per-atom quantities using diagonal matrices of doubles */
- map<string, PerAtomDiagonalMatrix<double> * > perAtomDiagonalMatrices_;
+ std::map<std::string, PerAtomDiagonalMatrix<double> * > perAtomDiagonalMatrices_;
/** container for per-atom quantities using sparse matrices of doubles */
- map<string, PerAtomSparseMatrix<double> * > perAtomSparseMatrices_;
+ std::map<std::string, PerAtomSparseMatrix<double> * > perAtomSparseMatrices_;
/** container for pair maps */
- map<string, PairMap * > pairMaps_;
+ std::map<std::string, PairMap * > pairMaps_;
/** container for dense matrices */
- map<string, DENS_MAN * > denseMatrices_;
+ std::map<std::string, DENS_MAN * > denseMatrices_;
/** container for dense matrices for integer quantities */
- map<string, MatrixDependencyManager<DenseMatrix, int> * > denseMatricesInt_;
+ std::map<std::string, MatrixDependencyManager<DenseMatrix, int> * > denseMatricesInt_;
/** container for dense matrces for boolean quantities */
- map<string, MatrixDependencyManager<DenseMatrix, bool> * > denseMatricesBool_;
+ std::map<std::string, MatrixDependencyManager<DenseMatrix, bool> * > denseMatricesBool_;
/** container for sparse matrices */
- map<string, SPAR_MAN * > sparseMatrices_;
+ std::map<std::string, SPAR_MAN * > sparseMatrices_;
/** container for diagonal matrices */
- map<string, DIAG_MAN * > diagonalMatrices_;
+ std::map<std::string, DIAG_MAN * > diagonalMatrices_;
/** container for vectors of vectors of sparse matrices */
- map<string, VectorDependencyManager<SPAR_MAT * > * > vectorSparMat_;
+ std::map<std::string, VectorDependencyManager<SPAR_MAT * > * > vectorSparMat_;
/** container for sets of integer quantities */
- map<string, SetDependencyManager<int> * > setInt_;
+ std::map<std::string, SetDependencyManager<int> * > setInt_;
/** container for molecule sets */
- map<string, SmallMoleculeSet * > smallMoleculeSets_;
+ std::map<std::string, SmallMoleculeSet * > smallMoleculeSets_;
/** container for atomic quantities which must be transfered when atoms cross processors */
- set<PerAtomQuantity<double> *> exchangeList_;
+ std::set<PerAtomQuantity<double> *> exchangeList_;
/** container for atomic quantities which must be transfered to ghost atoms on other processors */
- vector<PerAtomQuantity<double> *> commList_;
+ std::vector<PerAtomQuantity<double> *> commList_;
/** container for integer atomic quantities which must be transfered to ghost atoms on other processors */
- vector<PerAtomQuantity<int> *> commIntList_;
+ std::vector<PerAtomQuantity<int> *> commIntList_;
/** container for atomic diagonal matrices which must be transfered to ghost atoms on other processors */
- vector<PerAtomDiagonalMatrix<double> *> commDmList_;
+ std::vector<PerAtomDiagonalMatrix<double> *> commDmList_;
/** container for atomic sparse matrices which must be transfered to ghost atoms on other processors */
- vector<PerAtomSparseMatrix<double> *> commSmList_;
+ std::vector<PerAtomSparseMatrix<double> *> commSmList_;
/** prefix for labeling associated lammps arrays */
- string prefix_;
+ std::string prefix_;
/** order of deletion list of managed quantities */
- vector<DependencyManager * > deletionList_;
+ std::vector<DependencyManager * > deletionList_;
/** creates a reverse sorted depth-first search list for deleting managed quantities */
void create_deletion_list();
/** executes a depth-first search visit on a managed quantity */
int dfs_visit(DependencyManager * quantity, const int index);
/** helper function to access a data entry in a list */
template <typename data>
- data * return_quantity(map<string,data * > & list, const string & tag)
+ data * return_quantity(std::map<std::string,data * > & list, const std::string & tag)
{
- typename map<string,data * >::iterator it = list.find(tag);
+ typename std::map<std::string,data * >::iterator it = list.find(tag);
if (it==list.end()) return NULL;
return it->second;
};
/** helper function to add a data entry to a list */
template <typename data>
- void add_quantity(map<string,data * > & list, data * quantity, const string & tag)
+ void add_quantity(std::map<std::string,data * > & list, data * quantity, const std::string & tag)
{
- typename map<string,data * >::iterator it = list.find(tag);
+ typename std::map<std::string,data * >::iterator it = list.find(tag);
if (it!=list.end())
throw ATC_Error("Tried to add another Quantity with tag "+tag+" in InterscaleManager::add_quantity");
- typename std::template pair<string,data * > myPair(tag,quantity);
+ typename std::template pair<std::string,data * > myPair(tag,quantity);
list.insert(myPair);
};
/** helper function to add a data entry to a list when it requires neighbor communication*/
template <typename data>
- void add_comm_quantity(map<string,data * > & list, vector<data * > & commList, data * quantity, const string & tag)
+ void add_comm_quantity(std::map<std::string,data * > & list, std::vector<data * > & commList, data * quantity, const std::string & tag)
{
add_quantity(list,quantity,tag);
// allocate data for parallel communication
quantity->grow_lammps_array(LammpsInterface::instance()->nmax(),prefix_+tag);
if (quantity->atom_type() == PROC_GHOST) {
commList.push_back(quantity);
}
};
/** helper function to fina a data entry in a list */
template <typename data>
- data * find_in_list(map<string,data * > & list, const string & tag)
+ data * find_in_list(std::map<std::string,data * > & list, const std::string & tag)
{
- typename map<string,data * >::iterator it = list.find(tag);
+ typename std::map<std::string,data * >::iterator it = list.find(tag);
if (it!=list.end()) return it->second;
return NULL;
};
/** helper function to force the reset of all data in a list */
template <typename data>
- void force_reset_loop(map<string,data * > & list)
+ void force_reset_loop(std::map<std::string,data * > & list)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it)
(it->second)->force_reset();
};
/** helper function to set the memory type to temporary of a list */
template <typename data>
- void set_memory_temporary(map<string,data * > & list)
+ void set_memory_temporary(std::map<std::string,data * > & list)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it)
(it->second)->set_memory_type(TEMPORARY);
};
/** helper function to perform intialization for dfs of a list */
template <typename data>
- void dfs_prepare_loop(map<string,data * > & list)
+ void dfs_prepare_loop(std::map<std::string,data * > & list)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it) {
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it) {
(it->second)->dfsFound_ = false;
}
};
/** helper function to start the dfs visit for list */
template <typename data>
- void dfs_visit_loop(map<string,data * > & list,
+ void dfs_visit_loop(std::map<std::string,data * > & list,
int & index)
{
- typename map<string,data* >::iterator it = list.begin();
+ typename std::map<std::string,data* >::iterator it = list.begin();
while (it != list.end()) {
if (!((it->second)->dfsFound_)) index = dfs_visit(it->second,index);
if ((it->second)->memory_type()==TEMPORARY) list.erase(it++);
else ++it;
}
};
// PAQ helper functions
/** helper function to adjust local atom count for all data in a list before exchange, only valid with quantities that do that are aware of atom counts */
template <typename data>
- void reset_nlocal_loop(map<string,data * > & list)
+ void reset_nlocal_loop(std::map<std::string,data * > & list)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it) {
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it) {
(it->second)->reset_nlocal();
}
};
/** helper function to indicate lammps data is stale for all data in a list before exchange, only valid with PAQs */
template <typename data>
- void lammps_reset_loop(map<string,data * > & list)
+ void lammps_reset_loop(std::map<std::string,data * > & list)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it)
(it->second)->lammps_force_reset();
};
/** helper function to size all data in a list, only valid with comm lists */
template <typename data>
- void size_comm_loop(vector<data * > & list)
+ void size_comm_loop(std::vector<data * > & list)
{
- for (typename vector<data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::vector<data* >::iterator it = list.begin(); it != list.end(); ++it)
(*it)->quantity();
};
/** helper function to pack all data in a list before exchange, only valid with quantities that do work before parallel communication */
template <typename data>
- void prepare_exchange_loop(map<string,data * > & list)
+ void prepare_exchange_loop(std::map<std::string,data * > & list)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it) {
(it->second)->prepare_exchange();
+ }
};
/** helper function to extract all data in a list after exchange, only valid with quantities that do work after parallel communication */
template <typename data>
- void post_exchange_loop(map<string,data * > & list)
+ void post_exchange_loop(std::map<std::string,data * > & list)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it) {
(it->second)->post_exchange();
+ }
};
/** helper function to determine memory usage of all data in a list, only valid with PAQs */
template <typename data>
- void memory_usage_loop(const map<string,data * > & list, int & usage) const
+ void memory_usage_loop(const std::map<std::string,data * > & list, int & usage) const
{
- for (typename map<string,data* >::const_iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::map<std::string,data* >::const_iterator it = list.begin(); it != list.end(); ++it)
usage += (it->second)->memory_usage();
};
/** helper function to pack arrays of all data before exchange in a list, only valid with PAQs */
template <typename data>
- void pack_exchange_loop(map<string,data * > & list, int & index, int i, double *buffer)
+ void pack_exchange_loop(std::map<std::string,data * > & list, int & index, int i, double *buffer)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it) {
index += (it->second)->pack_exchange(i,&buffer[index]);
+ }
};
/** helper function to unpack arrays of all data after exchange in a list, only valid with PAQs */
template <typename data>
- void unpack_exchange_loop(map<string,data * > & list, int & index, int i, double *buffer)
+ void unpack_exchange_loop(std::map<std::string,data * > & list, int & index, int i, double *buffer)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it)
index += (it->second)->unpack_exchange(i,&buffer[index]);
};
/** helper function to pack arrays of all data in a list, only valid with comm lists */
template <typename data>
- void pack_comm_loop(vector<data * > & list, int & size, int index, double *buf,
+ void pack_comm_loop(std::vector<data * > & list, int & size, int index, double *buf,
int pbc_flag, int *pbc)
{
- for (typename vector<data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::vector<data* >::iterator it = list.begin(); it != list.end(); ++it)
size += (*it)->pack_comm(index,&buf[size],pbc_flag,pbc);
};
/** helper function to unpack arrays of all data in a list, only valid with comm lists */
template <typename data>
- void unpack_comm_loop(vector<data * > & list, int & size, int index, double *buf)
+ void unpack_comm_loop(std::vector<data * > & list, int & size, int index, double *buf)
{
- for (typename vector<data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::vector<data* >::iterator it = list.begin(); it != list.end(); ++it)
size += (*it)->unpack_comm(index,&buf[size]);
};
/** helper function to grow arrays of all data in a list, only valid with PAQs */
template <typename data>
- void grow_arrays_loop(map<string,data * > & list, int nmax)
+ void grow_arrays_loop(std::map<std::string,data * > & list, int nmax)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it)
(it->second)->grow_lammps_array(nmax,prefix_+it->first);
};
/** helper function to copy arrays of all data in a list, only valid with PAQs */
template <typename data>
- void copy_arrays_loop(map<string,data * > & list, int i, int j)
+ void copy_arrays_loop(std::map<std::string,data * > & list, int i, int j)
{
- for (typename map<string,data* >::iterator it = list.begin(); it != list.end(); ++it)
+ for (typename std::map<std::string,data* >::iterator it = list.begin(); it != list.end(); ++it)
(it->second)->copy_lammps_array(i,j);
};
private:
InterscaleManager();
};
}
#endif
diff --git a/lib/atc/KD_Tree.cpp b/lib/atc/KD_Tree.cpp
index 41e67c9f6..a28e54b7a 100644
--- a/lib/atc/KD_Tree.cpp
+++ b/lib/atc/KD_Tree.cpp
@@ -1,162 +1,164 @@
#include "KD_Tree.h"
#include <assert.h>
+using std::vector;
+
KD_Tree *KD_Tree::create_KD_tree(const int nNodesPerElem, const int nNodes,
const DENS_MAT *nodalCoords, const int nElems,
const Array2D<int> &conn) {
vector<Node> *points = new vector<Node>(); // Initialize an empty list of Nodes
for (int node = 0; node < nNodes; node++) { // Insert all nodes into list
points->push_back(Node(node, (*nodalCoords)(0, node),
(*nodalCoords)(1, node),
(*nodalCoords)(2, node)));
}
vector<Elem> *elements = new vector<Elem>();
for (int elem = 0; elem < nElems; elem++) {
vector<Node> nodes = vector<Node>();
for (int node = 0; node < nNodesPerElem; node++) {
nodes.push_back((*points)[conn(node, elem)]);
}
elements->push_back(Elem(elem, nodes));
}
return new KD_Tree(points, elements);
}
KD_Tree::~KD_Tree() {
delete sortedPts_;
delete leftChild_;
delete rightChild_;
}
KD_Tree::KD_Tree(vector<Node> *points, vector<Elem> *elements,
int dimension)
: candElems_(elements) {
// Set up comparison functions
bool (*compare)(Node, Node);
if (dimension == 0) {
compare = Node::compareX;
} else if (dimension == 1) {
compare = Node::compareY;
} else {
compare = Node::compareZ;
}
// Sort points by their coordinate in the current dimension
sort(points->begin(), points->end(), compare);
sortedPts_ = points;
// Pick the median point as the root of the tree
size_t nNodes = points->size();
size_t med = nNodes/2;
value_ = (*sortedPts_)[med];
// Recursively construct the left sub-tree
vector<Node> *leftPts = new vector<Node>;
vector<Elem> *leftElems = new vector<Elem>;
// Recursively construct the right sub-tree
vector<Node> *rightPts = new vector<Node>;
vector<Elem> *rightElems = new vector<Elem>;
for (vector<Elem>::iterator elit = candElems_->begin();
elit != candElems_->end(); elit++) {
// Identify elements that should be kept on either side
bool foundElemLeft = false;
bool foundElemRight = false;
for (vector<Node>::iterator ndit = elit->second.begin();
ndit != elit->second.end(); ndit++) {
// Search this node
if (compare(*ndit, value_)) {
if (find(leftPts->begin(), leftPts->end(), *ndit) == leftPts->end()) {
leftPts->push_back(*ndit);
}
foundElemLeft = true;
}
if (compare(value_, *ndit)) {
if (find(rightPts->begin(), rightPts->end(), *ndit) == rightPts->end()) {
rightPts->push_back(*ndit);
}
foundElemRight = true;
}
}
if (foundElemLeft) leftElems->push_back(*elit);
if (foundElemRight) rightElems->push_back(*elit);
}
// Create child tree, or NULL if there's nothing to create
if (candElems_->size() - leftElems->size() < 4 || leftElems->size() == 0) {
leftChild_ = NULL;
} else {
leftChild_ = new KD_Tree(leftPts, leftElems, (dimension+1) % 3);
}
// Create child tree, or NULL if there's nothing to create
if (candElems_->size() - rightElems->size() < 4 || rightElems->size() == 0) {
rightChild_ = NULL;
} else {
rightChild_ = new KD_Tree(rightPts, rightElems, (dimension+1) % 3);
}
}
vector<int> KD_Tree::find_nearest_elements(Node query, int dimension) {
// if the root coordinate is less than the query coordinate
// If the query point is less that the value (split) point of this
// tree, either recurse to the left or return this node's elements
// if there is no left child.
if (query.lessThanInDimension(value_, dimension)) {
if (leftChild_ == NULL) {
vector<int> result = vector<int>();
for (vector<Elem>::iterator elem = candElems_->begin();
elem != candElems_->end(); elem++) {
result.push_back(elem->first);
}
return result;
}
return leftChild_->find_nearest_elements(query, (dimension+1) % 3);
} else {
if (rightChild_ == NULL) {
vector<int> result = vector<int>();
for (vector<Elem>::iterator elem = candElems_->begin();
elem != candElems_->end(); elem++) {
result.push_back(elem->first);
}
return result;
}
return rightChild_->find_nearest_elements(query, (dimension+1) % 3);
}
}
vector<vector<int> > KD_Tree::getElemIDs(int depth) {
vector<vector<int> > result;
vector<vector<int> > temp;
assert(depth >= 0 );
if (depth == 0) {
vector<int> candElemIDs;
vector<Elem>::iterator it;
for(it = candElems_->begin(); it != candElems_->end(); ++it) {
candElemIDs.push_back((*it).first);
}
sort(candElemIDs.begin(), candElemIDs.end());
result.push_back(candElemIDs);
} else if (leftChild_ == NULL || rightChild_ == NULL) {
// Insert all nodes at this level once,
// then insert a bunch of empty vectors.
temp = this->getElemIDs(0);
result.insert(result.end(), temp.begin(), temp.end());
int numRequested = floor(pow(2,depth));
for (int i = 0; i < numRequested - 1; ++i) {
vector<int> emptyVec;
result.push_back(emptyVec);
}
} else {
--depth;
temp = leftChild_->getElemIDs(depth);
result.insert(result.end(), temp.begin(), temp.end());
temp = rightChild_->getElemIDs(depth);
result.insert(result.end(), temp.begin(), temp.end());
}
return result;
}
diff --git a/lib/atc/KD_Tree.h b/lib/atc/KD_Tree.h
index 0bbcf25f2..6c788c407 100644
--- a/lib/atc/KD_Tree.h
+++ b/lib/atc/KD_Tree.h
@@ -1,89 +1,89 @@
#ifndef KD_TREE_H
#define KD_TREE_H
#include "Array2D.h"
#include "MatrixDef.h"
#include "MatrixLibrary.h"
#include <math.h>
-
-using namespace ATC_matrix;
+#include <vector>
+#include <utility>
class Node {
public:
Node() {
// Zero argument constructor just for default initialization.
}
Node(int node, double x, double y, double z)
: index_(node)
{
coords_[0] = x;
coords_[1] = y;
coords_[2] = z;
}
int index_;
double coords_[3];
double distanceSquared(Node query) {
return pow(coords_[0] - query.coords_[0], 2)
+ pow(coords_[1] - query.coords_[1], 2)
+ pow(coords_[2] - query.coords_[2], 2);
}
double distanceInDimension(Node query, int dimension) {
return pow(coords_[dimension] - query.coords_[dimension], 2);
}
bool lessThanInDimension(Node query, int dimension) {
if (dimension == 0) return Node::compareX(*this, query);
else if (dimension == 1) return Node::compareY(*this, query);
else if (dimension == 2) return Node::compareZ(*this, query);
else return false;
}
bool operator==(const Node &rhs) {
return ((*this).coords_[0] == rhs.coords_[0] &&
(*this).coords_[1] == rhs.coords_[1] &&
(*this).coords_[2] == rhs.coords_[2]);
}
static bool compareX(Node one, Node two) { return one.coords_[0] < two.coords_[0]; }
static bool compareY(Node one, Node two) { return one.coords_[1] < two.coords_[1]; }
static bool compareZ(Node one, Node two) { return one.coords_[2] < two.coords_[2]; }
};
-typedef std::pair<int,vector<Node> > Elem;
+typedef std::pair<int,std::vector<Node> > Elem;
class KD_Tree {
public:
static KD_Tree* create_KD_tree(const int nNodesPerElement, const int nNodes,
const DENS_MAT *points, const int nElems,
const Array2D<int> &conn);
- KD_Tree(vector<Node> *points, vector<Elem> *elems,
+ KD_Tree(std::vector<Node> *points, std::vector<Elem> *elems,
int dimension=0);
~KD_Tree();
- vector<int> find_nearest(DENS_VEC query) {
+ std::vector<int> find_nearest(DENS_VEC query) {
// Create a fake Node and find the nearest Node in the tree to it.
return find_nearest_elements(Node(-1, query(0), query(1), query(2)));
}
- vector<int> find_nearest_elements(Node query, int dimension=0);
+ std::vector<int> find_nearest_elements(Node query, int dimension=0);
- vector<vector<int> > getElemIDs(int depth);
+ std::vector<std::vector<int> > getElemIDs(int depth);
private:
Node value_;
- vector<Node> *sortedPts_;
- vector<Elem> *candElems_;
+ std::vector<Node> *sortedPts_;
+ std::vector<Elem> *candElems_;
KD_Tree *leftChild_;
KD_Tree *rightChild_;
};
#endif
diff --git a/lib/atc/KernelFunction.h b/lib/atc/KernelFunction.h
index f9ed3df68..996685253 100644
--- a/lib/atc/KernelFunction.h
+++ b/lib/atc/KernelFunction.h
@@ -1,256 +1,255 @@
-/** KernelFunction: Hardy smoothing */
#ifndef KERNEL_FUNCTION_H
#define KERNEL_FUNCTION_H
#include <set>
#include "LammpsInterface.h"
#include "MatrixLibrary.h"
namespace ATC {
/**
* @class KernelFunctionMgr
* @brief Base class for managing kernels
*/
class KernelFunctionMgr {
public:
/** Static instance of this class */
static KernelFunctionMgr * instance();
class KernelFunction* function(char** arg, int nargs);
protected:
KernelFunctionMgr() {};
~KernelFunctionMgr();
private:
static KernelFunctionMgr * myInstance_;
- set<KernelFunction*> pointerSet_;
+ std::set<KernelFunction*> pointerSet_;
};
/**
* @class KernelFunction
* @brief Base class for kernels for atom-continuum transfer
*/
class KernelFunction {
public:
// constructor
KernelFunction(int nparameters, double* parameters);
// destructor
virtual ~KernelFunction() {};
// function value
virtual double value(DENS_VEC& x_atom) const =0 ;
// function derivative
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const =0 ;
// bond function value via quadrature
virtual double bond(DENS_VEC& xa, DENS_VEC&xb, double lam1, double lam2) const;
// localization-volume intercepts for bond calculation
virtual void bond_intercepts(DENS_VEC& xa,
DENS_VEC& xb, double &lam1, double &lam2) const;
virtual bool node_contributes(DENS_VEC node) const;
virtual bool in_support(DENS_VEC node) const;
double inv_vol(void) const { return invVol_; }
virtual double dimensionality_factor(void) const { return 1.; }
protected:
double invVol_; // normalization factor
double Rc_, invRc_; // cutoff radius
int nsd_ ; // number of dimensions
/** pointer to lammps interface class */
LammpsInterface * lammpsInterface_;
/** periodicity flags and lengths */
int periodicity[3];
double box_bounds[2][3];
double box_length[3];
};
/**
* @class KernelFunctionStep
* @brief Class for defining kernel function of a step with spherical support
*/
class KernelFunctionStep : public KernelFunction {
public:
// constructor
KernelFunctionStep(int nparameters, double* parameters);
// destructor
virtual ~KernelFunctionStep() {};
// function value
virtual double value(DENS_VEC& x_atom) const;
// function derivative
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
// bond function value
virtual double bond(DENS_VEC& xa, DENS_VEC&xb, double lam1, double lam2) const
{ return lam2-lam1; }
};
/**
* @class KernelFunctionCell
* @brief Class for defining kernel function of a step with rectangular support
* suitable for a rectangular grid
*/
class KernelFunctionCell : public KernelFunction {
public:
// constructor
KernelFunctionCell(int nparameters, double* parameters);
// destructor
virtual ~KernelFunctionCell() {};
// function value
virtual double value(DENS_VEC& x_atom) const;
// function derivative
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
// bond function value
virtual double bond(DENS_VEC& xa, DENS_VEC&xb, double lam1, double lam2) const
{return lam2 -lam1;}
// bond intercept values : origin is the node position
void bond_intercepts(DENS_VEC& xa, DENS_VEC& xb,
double &lam1, double &lam2) const;
bool node_contributes(DENS_VEC node) const;
bool in_support(DENS_VEC dx) const;
protected:
double hx, hy, hz;
DENS_VEC cellBounds_;
};
/**
* @class KernelFunctionCubicSphere
* @brief Class for defining kernel function of a cubic with spherical support
*/
class KernelFunctionCubicSphere : public KernelFunction {
public:
// constructor
KernelFunctionCubicSphere(int nparameters, double* parameters);
// destructor
virtual ~KernelFunctionCubicSphere() {};
// function value
virtual double value(DENS_VEC& x_atom) const;
// function derivative
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
};
/**
* @class KernelFunctionQuarticSphere
* @brief Class for defining kernel function of a quartic with spherical support
*/
class KernelFunctionQuarticSphere : public KernelFunction {
public:
// constructor
KernelFunctionQuarticSphere(int nparameters, double* parameters);
// destructor
virtual ~KernelFunctionQuarticSphere() {};
// function value
virtual double value(DENS_VEC& x_atom) const;
// function derivative
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
};
/**
* @class KernelFunctionCubicCyl
* @brief Class for defining kernel function of a cubic with cylindrical support
*/
class KernelFunctionCubicCyl : public KernelFunction {
public:
// constructor
KernelFunctionCubicCyl(int nparameters, double* parameters);
// destructor
virtual ~KernelFunctionCubicCyl() {};
// function value
virtual double value(DENS_VEC& x_atom) const;
// function derivative
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double dimensionality_factor(void) const { return 0.5; }
};
/**
* @class KernelFunctionQuarticCyl
* @brief Class for defining kernel function of a quartic with cylindrical support
*/
class KernelFunctionQuarticCyl : public KernelFunction {
public:
// constructor
KernelFunctionQuarticCyl(int nparameters, double* parameters);
// destructor
virtual ~KernelFunctionQuarticCyl() {};
// function value
virtual double value(DENS_VEC& x_atom) const;
// function derivative
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double dimensionality_factor(void) const { return 0.5; }
};
/**
* @class KernelFunctionCubicBar
* @brief Class for defining kernel function of a cubic with 1-dimensional (bar) support
*/
class KernelFunctionCubicBar : public KernelFunction {
public:
// constructor
KernelFunctionCubicBar(int nparameters, double* parameters);
// destructor
virtual ~KernelFunctionCubicBar() {};
// function value
virtual double value(DENS_VEC& x_atom) const;
// function derivative
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double dimensionality_factor(void) const { return 0.25; }
};
/**
* @class KernelFunctionCubicBar
* @brief Class for defining kernel function of a cubic with 1-dimensional (bar) support
*/
class KernelFunctionLinearBar : public KernelFunction {
public:
// constructor
KernelFunctionLinearBar(int nparameters, double* parameters);
// destructor
virtual ~KernelFunctionLinearBar() {};
// function value
virtual double value(DENS_VEC& x_atom) const;
// function derivative
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double dimensionality_factor(void) const { return 0.25; }
};
/**
* @class KernelFunctionQuarticBar
* @brief Class for defining kernel function of a quartic with 1-dimensional (bar) support
*/
class KernelFunctionQuarticBar : public KernelFunction {
public:
// constructor
KernelFunctionQuarticBar(int nparameters, double* parameters);
// destructor
virtual ~KernelFunctionQuarticBar() {};
// function value
virtual double value(DENS_VEC& x_atom) const;
// function derivative
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double dimensionality_factor(void) const { return 0.25; }
};
};
#endif
diff --git a/lib/atc/KinetoThermostat.cpp b/lib/atc/KinetoThermostat.cpp
index ccbbd12bc..72afec7b3 100644
--- a/lib/atc/KinetoThermostat.cpp
+++ b/lib/atc/KinetoThermostat.cpp
@@ -1,442 +1,428 @@
#include "KinetoThermostat.h"
#include "ATC_Coupling.h"
#include "ATC_Error.h"
#include "PrescribedDataManager.h"
#include "ElasticTimeIntegrator.h"
#include "ThermalTimeIntegrator.h"
#include "TransferOperator.h"
using namespace std;
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class KinetoThermostat
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
KinetoThermostat::KinetoThermostat(ATC_Coupling * atc,
const string & regulatorPrefix) :
AtomicRegulator(atc,regulatorPrefix),
kinetostat_(atc,"Momentum"),
thermostat_(atc,"Energy")
{
// nothing to do
}
//--------------------------------------------------------
// modify:
// parses and adjusts thermostat state based on
// user input, in the style of LAMMPS user input
//--------------------------------------------------------
bool KinetoThermostat::modify(int narg, char **arg)
{
bool foundMatch = false;
-
- int argIndex = 0;
- if (strcmp(arg[argIndex],"thermal")==0) {
- foundMatch = thermostat_.modify(narg,arg);
- }
-
- if (strcmp(arg[argIndex],"momentum")==0) {
- foundMatch = kinetostat_.modify(narg,arg);
- }
-
- if (!foundMatch)
- foundMatch = AtomicRegulator::modify(narg,arg);
- if (foundMatch)
- needReset_ = true;
return foundMatch;
}
//--------------------------------------------------------
// reset_lambda_contribution:
// resets the thermostat generated power to a
// prescribed value
//--------------------------------------------------------
void KinetoThermostat::reset_lambda_contribution(const DENS_MAT & target,
const FieldName field)
{
//TEMP_JAT
if (field==VELOCITY) {
kinetostat_.reset_lambda_contribution(target);
}
else if (field == TEMPERATURE) {
thermostat_.reset_lambda_contribution(target);
}
else {
throw ATC_Error("KinetoThermostat::reset_lambda_contribution - invalid field given");
}
}
//--------------------------------------------------------
// construct_methods:
// instantiations desired regulator method(s)
// dependence, but in general there is also a
// time integrator dependence. In general the
// precedence order is:
// time filter -> time integrator -> thermostat
// In the future this may need to be added if
// different types of time integrators can be
// specified.
//--------------------------------------------------------
void KinetoThermostat::construct_methods()
{
// #ifdef WIP_JAT
// // get data associated with stages 1 & 2 of ATC_Method::initialize
// AtomicRegulator::construct_methods();
// if (atc_->reset_methods()) {
// // eliminate existing methods
// delete_method();
// // update time filter
// TimeIntegrator::TimeIntegrationType myIntegrationType = (atc_->time_integrator(TEMPERATURE))->time_integration_type();
// TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
// if (timeFilterManager->need_reset() ) {
// if (myIntegrationType == TimeIntegrator::GEAR)
// timeFilter_ = timeFilterManager->construct(TimeFilterManager::EXPLICIT);
// else if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP)
// timeFilter_ = timeFilterManager->construct(TimeFilterManager::EXPLICIT_IMPLICIT);
// }
// if (timeFilterManager->filter_dynamics()) {
// switch (regulatorTarget_) {
// case NONE: {
// regulatorMethod_ = new RegulatorMethod(this);
// break;
// }
// case FIELD: { // error check, rescale and filtering not supported together
// throw ATC_Error("Cannot use rescaling thermostat with time filtering");
// break;
// }
// case DYNAMICS: {
// switch (couplingMode_) {
// case FIXED: {
// if (use_lumped_lambda_solve()) {
// throw ATC_Error("Thermostat:construct_methods - lumped lambda solve cannot be used with Hoover thermostats");
// }
// if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP) {
// if (md_flux_nodes(TEMPERATURE)) {
// if (!md_fixed_nodes(TEMPERATURE) && (boundaryIntegrationType_ == NO_QUADRATURE)) {
// // there are fluxes but no fixed or coupled nodes
// regulatorMethod_ = new ThermostatFluxFiltered(this);
// }
// else {
// // there are both fixed and flux nodes
// regulatorMethod_ = new ThermostatFluxFixedFiltered(this);
// }
// }
// else {
// // there are only fixed nodes
// regulatorMethod_ = new ThermostatFixedFiltered(this);
// }
// }
// else {
// regulatorMethod_ = new ThermostatHooverVerletFiltered(this);
// }
// break;
// }
// case FLUX: {
// if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP) {
// if (use_lumped_lambda_solve()) {
// throw ATC_Error("Thermostat:construct_methods - lumped lambda solve has been depricated for fractional step thermostats");
// }
// if (md_fixed_nodes(TEMPERATURE)) {
// if (!md_flux_nodes(TEMPERATURE) && (boundaryIntegrationType_ == NO_QUADRATURE)) {
// // there are fixed nodes but no fluxes
// regulatorMethod_ = new ThermostatFixedFiltered(this);
// }
// else {
// // there are both fixed and flux nodes
// regulatorMethod_ = new ThermostatFluxFixedFiltered(this);
// }
// }
// else {
// // there are only flux nodes
// regulatorMethod_ = new ThermostatFluxFiltered(this);
// }
// }
// else {
// if (use_localized_lambda()) {
// if (!((atc_->prescribed_data_manager())->no_fluxes(TEMPERATURE)) &&
// atc_->boundary_integration_type() != NO_QUADRATURE) {
// throw ATC_Error("Cannot use flux coupling with localized lambda");
// }
// }
// regulatorMethod_ = new ThermostatPowerVerletFiltered(this);
// }
// break;
// }
// default:
// throw ATC_Error("Unknown coupling mode in Thermostat::initialize");
// }
// break;
// }
// default:
// throw ATC_Error("Unknown thermostat type in Thermostat::initialize");
// }
// }
// else {
// switch (regulatorTarget_) {
// case NONE: {
// regulatorMethod_ = new RegulatorMethod(this);
// break;
// }
// case FIELD: {
// if (atc_->temperature_def()==KINETIC)
// regulatorMethod_ = new ThermostatRescale(this);
// else if (atc_->temperature_def()==TOTAL)
// regulatorMethod_ = new ThermostatRescaleMixedKePe(this);
// else
// throw ATC_Error("Unknown temperature definition");
// break;
// }
// case DYNAMICS: {
// switch (couplingMode_) {
// case FIXED: {
// if (use_lumped_lambda_solve()) {
// throw ATC_Error("Thermostat:construct_methods - lumped lambda solve cannot be used with Hoover thermostats");
// }
// if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP) {
// if (md_flux_nodes(TEMPERATURE)) {
// if (!md_fixed_nodes(TEMPERATURE) && (boundaryIntegrationType_ == NO_QUADRATURE)) {
// // there are fluxes but no fixed or coupled nodes
// regulatorMethod_ = new ThermostatFlux(this);
// }
// else {
// // there are both fixed and flux nodes
// regulatorMethod_ = new ThermostatFluxFixed(this);
// }
// }
// else {
// // there are only fixed nodes
// regulatorMethod_ = new ThermostatFixed(this);
// }
// }
// else {
// regulatorMethod_ = new ThermostatHooverVerlet(this);
// }
// break;
// }
// case FLUX: {
// if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP) {
// if (use_lumped_lambda_solve()) {
// throw ATC_Error("Thermostat:construct_methods - lumped lambda solve has been depricated for fractional step thermostats");
// }
// if (md_fixed_nodes(TEMPERATURE)) {
// if (!md_flux_nodes(TEMPERATURE) && (boundaryIntegrationType_ == NO_QUADRATURE)) {
// // there are fixed nodes but no fluxes
// regulatorMethod_ = new ThermostatFixed(this);
// }
// else {
// // there are both fixed and flux nodes
// regulatorMethod_ = new ThermostatFluxFixed(this);
// }
// }
// else {
// // there are only flux nodes
// regulatorMethod_ = new ThermostatFlux(this);
// }
// }
// else {
// if (use_localized_lambda()) {
// if (!((atc_->prescribed_data_manager())->no_fluxes(TEMPERATURE)) &&
// atc_->boundary_integration_type() != NO_QUADRATURE) {
// throw ATC_Error("Cannot use flux coupling with localized lambda");
// }
// }
// regulatorMethod_ = new ThermostatPowerVerlet(this);
// }
// break;
// }
// default:
// throw ATC_Error("Unknown coupling mode in Thermostat::initialize");
// }
// break;
// }
// default:
// throw ATC_Error("Unknown thermostat target in Thermostat::initialize");
// }
// }
// AtomicRegulator::reset_method();
// }
// else {
// set_all_data_to_used();
// }
// #endif
//TEMP_JAT
kinetostat_.construct_methods();
thermostat_.construct_methods();
}
//TEMP_JAT all functions which have explicit thermo and kinetostats need to be removed
//--------------------------------------------------------
// reset_nlocal:
// resizes lambda force if necessary
//--------------------------------------------------------
void KinetoThermostat::reset_nlocal()
{
kinetostat_.reset_nlocal();
thermostat_.reset_nlocal();
}
//--------------------------------------------------------
// reset_atom_materials:
// resets the localized atom to material map
//--------------------------------------------------------
void KinetoThermostat::reset_atom_materials(const Array<int> & elementToMaterialMap,
const MatrixDependencyManager<DenseMatrix, int> * atomElement)
{
kinetostat_.reset_atom_materials(elementToMaterialMap,
atomElement);
thermostat_.reset_atom_materials(elementToMaterialMap,
atomElement);
}
//--------------------------------------------------------
// construct_transfers:
// pass through to appropriate transfer constuctors
//--------------------------------------------------------
void KinetoThermostat::construct_transfers()
{
kinetostat_.construct_transfers();
thermostat_.construct_transfers();
}
//--------------------------------------------------------
// initialize:
// sets up methods before a run
//--------------------------------------------------------
void KinetoThermostat::initialize()
{
kinetostat_.initialize();
thermostat_.initialize();
needReset_ = false;
}
//--------------------------------------------------------
// output:
// pass through to appropriate output methods
//--------------------------------------------------------
void KinetoThermostat::output(OUTPUT_LIST & outputData) const
{
kinetostat_.output(outputData);
thermostat_.output(outputData);
}
//--------------------------------------------------------
// finish:
// pass through to appropriate end-of-run methods
//--------------------------------------------------------
void KinetoThermostat::finish()
{
kinetostat_.finish();
thermostat_.finish();
}
//--------------------------------------------------
// pack_fields
// bundle all allocated field matrices into a list
// for output needs
//--------------------------------------------------
void KinetoThermostat::pack_fields(RESTART_LIST & data)
{
kinetostat_.pack_fields(data);
thermostat_.pack_fields(data);
}
//--------------------------------------------------------
// compute_boundary_flux:
// computes the boundary flux to be consistent with
// the controller
//--------------------------------------------------------
void KinetoThermostat::compute_boundary_flux(FIELDS & fields)
{
kinetostat_.compute_boundary_flux(fields);
thermostat_.compute_boundary_flux(fields);
}
//--------------------------------------------------------
// add_to_rhs:
// adds any controller contributions to the FE rhs
//--------------------------------------------------------
void KinetoThermostat::add_to_rhs(FIELDS & rhs)
{
thermostat_.add_to_rhs(rhs);
kinetostat_.add_to_rhs(rhs);
}
//--------------------------------------------------------
// apply_pre_predictor:
// applies the controller in the pre-predictor
// phase of the time integrator
//--------------------------------------------------------
void KinetoThermostat::apply_pre_predictor(double dt, int timeStep)
{
thermostat_.apply_pre_predictor(dt,timeStep);
kinetostat_.apply_pre_predictor(dt,timeStep);
}
//--------------------------------------------------------
// apply_mid_predictor:
// applies the controller in the mid-predictor
// phase of the time integrator
//--------------------------------------------------------
void KinetoThermostat::apply_mid_predictor(double dt, int timeStep)
{
thermostat_.apply_mid_predictor(dt,timeStep);
kinetostat_.apply_mid_predictor(dt,timeStep);
}
//--------------------------------------------------------
// apply_post_predictor:
// applies the controller in the post-predictor
// phase of the time integrator
//--------------------------------------------------------
void KinetoThermostat::apply_post_predictor(double dt, int timeStep)
{
thermostat_.apply_post_predictor(dt,timeStep);
kinetostat_.apply_post_predictor(dt,timeStep);
}
//--------------------------------------------------------
// apply_pre_corrector:
// applies the controller in the pre-corrector phase
// of the time integrator
//--------------------------------------------------------
void KinetoThermostat::apply_pre_corrector(double dt, int timeStep)
{
thermostat_.apply_pre_corrector(dt,timeStep);
kinetostat_.apply_pre_corrector(dt,timeStep);
}
//--------------------------------------------------------
// apply_post_corrector:
// applies the controller in the post-corrector phase
// of the time integrator
//--------------------------------------------------------
void KinetoThermostat::apply_post_corrector(double dt, int timeStep)
{
thermostat_.apply_post_corrector(dt,timeStep);
kinetostat_.apply_post_corrector(dt,timeStep);
}
//--------------------------------------------------------
// pre_exchange
//--------------------------------------------------------
void KinetoThermostat::pre_exchange()
{
thermostat_.pre_exchange();
kinetostat_.pre_exchange();
}
//--------------------------------------------------------
// pre_force
//--------------------------------------------------------
AtomicRegulator::RegulatorCouplingType KinetoThermostat::coupling_mode(const FieldName field) const
{
//TEMP_JAT
if (field==VELOCITY) {
return kinetostat_.coupling_mode();
}
else if (field == TEMPERATURE) {
return thermostat_.coupling_mode();
}
else {
throw ATC_Error("KinetoThermostat::coupling_mode - invalid field given");
}
}
};
diff --git a/lib/atc/KinetoThermostat.h b/lib/atc/KinetoThermostat.h
index 2ad2294ed..ee0883fb4 100644
--- a/lib/atc/KinetoThermostat.h
+++ b/lib/atc/KinetoThermostat.h
@@ -1,689 +1,687 @@
#ifndef KINETOTHERMOSTAT_H
#define KINETOTHERMOSTAT_H
-// ATC headers
#include "AtomicRegulator.h"
#include "PerAtomQuantityLibrary.h"
//TEMP_JAT - transitional headers until we have a new method
#include "Kinetostat.h"
#include "Thermostat.h"
-
-// other headers
#include <map>
#include <set>
+#include <string>
namespace ATC {
/* #ifdef WIP_JAT */
/* static const int myLambdaMaxIterations = 50; */
/* #endif */
// forward declarations
class MomentumTimeIntegrator;
class ThermalTimeIntegrator;
class AtfShapeFunctionRestriction;
class FundamentalAtomQuantity;
class PrescribedDataManager;
/**
* @class KinetoThermostat
* @brief Manager class for atom-continuum simulataneous control of momentum and thermal energy
*/
class KinetoThermostat : public AtomicRegulator {
public:
// constructor
KinetoThermostat(ATC_Coupling * atc,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
// destructor
virtual ~KinetoThermostat(){};
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** instantiate up the desired method(s) */
virtual void construct_methods();
//TEMP_JAT - required temporarily while we have two regulators
/** initialization of method data */
virtual void initialize();
/** method(s) create all necessary transfer operators */
virtual void construct_transfers();
/** reset number of local atoms, as well as atomic data */
virtual void reset_nlocal();
/** set up atom to material identification */
virtual void reset_atom_materials(const Array<int> & elementToMaterialMap,
const MatrixDependencyManager<DenseMatrix, int> * atomElement);
/** apply the regulator in the pre-predictor phase */
virtual void apply_pre_predictor(double dt, int timeStep);
/** apply the regulator in the mid-predictor phase */
virtual void apply_mid_predictor(double dt, int timeStep);
/** apply the regulator in the post-predictor phase */
virtual void apply_post_predictor(double dt, int timeStep);
/** apply the regulator in the pre-correction phase */
virtual void apply_pre_corrector(double dt, int timeStep);
/** apply the regulator in the post-correction phase */
virtual void apply_post_corrector(double dt, int timeStep);
/** prior to exchanges */
virtual void pre_exchange();
/** force a reset to occur */
void force_reset() {kinetostat_.force_reset();thermostat_.force_reset();};
/** compute the thermal boundary flux, must be consistent with regulator */
virtual void compute_boundary_flux(FIELDS & fields);
/** type of boundary coupling */
virtual RegulatorCouplingType coupling_mode(const FieldName) const;
virtual void output(OUTPUT_LIST & outputData) const;
/** final work at the end of a run */
virtual void finish();
/** add contributions (if any) to the finite element right-hand side */
virtual void add_to_rhs(FIELDS & rhs);
/** pack fields for restart */
virtual void pack_fields(RESTART_LIST & data);
// data access, intended for method objects
/** reset the nodal power to a prescribed value */
virtual void reset_lambda_contribution(const DENS_MAT & target,
const FieldName field);
//TEMP_JAT - will use real accessor
/** return value for the correction maximum number of iterations */
int lambda_max_iterators() {return thermostat_.lambda_max_iterations();};
protected:
//TEMP_JAT - individual controllers for now
Kinetostat kinetostat_;
Thermostat thermostat_;
private:
// DO NOT define this
KinetoThermostat();
};
/* #ifdef WIP_JAT */
/* /\** */
/* * @class ThermostatShapeFunction */
/* * @brief Class for thermostat algorithms using the shape function matrices */
/* * (thermostats have general for of N^T w N lambda = rhs) */
/* *\/ */
/* class ThermostatShapeFunction : public RegulatorShapeFunction { */
/* public: */
/* ThermostatShapeFunction(Thermostat * thermostat, */
-/* const string & regulatorPrefix = ""); */
+/* const std::string & regulatorPrefix = ""); */
/* virtual ~ThermostatShapeFunction() {}; */
/* /\** instantiate all needed data *\/ */
/* virtual void construct_transfers(); */
/* protected: */
/* // methods */
/* /\** set weighting factor for in matrix Nhat^T * weights * Nhat *\/ */
/* virtual void set_weights(); */
/* // member data */
/* /\** pointer to thermostat object for data *\/ */
/* Thermostat * thermostat_; */
/*
/* /\** MD mass matrix *\/ */
/* DIAG_MAN & mdMassMatrix_;
/* /\** pointer to atom velocities *\/ */
/* FundamentalAtomQuantity * atomVelocities_; */
/* /\** workspace variables *\/ */
/* DENS_VEC _weightVector_, _maskedWeightVector_; */
/* private: */
/* // DO NOT define this */
/* ThermostatShapeFunction(); */
/* }; */
/* /\** */
/* * @class ThermostatRescale */
/* * @brief Enforces constraint on atomic kinetic energy based on FE temperature */
/* *\/ */
/* class ThermostatRescale : public ThermostatShapeFunction { */
/* public: */
/* ThermostatRescale(Thermostat * thermostat); */
/* virtual ~ThermostatRescale() {}; */
/* /\** instantiate all needed data *\/ */
/* virtual void construct_transfers(); */
/* /\** applies thermostat to atoms in the post-corrector phase *\/ */
/* virtual void apply_post_corrector(double dt); */
/* #ifdef WIP_JAT */
/* /\** compute boundary flux, requires thermostat input since it is part of the coupling scheme *\/ */
/* virtual void compute_boundary_flux(FIELDS & fields) */
/* {boundaryFlux_[TEMPERATURE] = 0.;}; */
/* #endif */
/* /\** get data for output *\/ */
/* virtual void output(OUTPUT_LIST & outputData); */
/* protected: */
/* /\** apply solution to atomic quantities *\/ */
/* void apply_to_atoms(PerAtomQuantity<double> * atomVelocities); */
/* /\** correct the RHS for complex temperature definitions *\/ */
/* virtual void correct_rhs(DENS_MAT & rhs) {}; // base class does no correction, assuming kinetic definition */
/* /\** FE temperature field *\/ */
/* DENS_MAN & nodalTemperature_; */
/* /\** construction for prolongation of lambda to atoms *\/ */
/* AtomicVelocityRescaleFactor * atomVelocityRescalings_; */
/* /\** workspace variables *\/ */
/* DENS_MAT _rhs_; */
/* private: */
/* // DO NOT define this */
/* ThermostatRescale(); */
/* }; */
/* /\** */
/* * @class ThermostatRescaleMixedKePe */
/* * @brief Enforces constraint on atomic kinetic energy based on FE temperature */
/* * when the temperature is a mix of the KE and PE */
/* *\/ */
/* class ThermostatRescaleMixedKePe : public ThermostatRescale { */
/* public: */
/* ThermostatRescaleMixedKePe(Thermostat * thermostat); */
/* virtual ~ThermostatRescaleMixedKePe() {}; */
/* /\** instantiate all needed data *\/ */
/* virtual void construct_transfers(); */
/* /\** pre-run initialization of method data *\/ */
/* virtual void initialize(); */
/* protected: */
/* /\** correct the RHS for inclusion of the PE *\/ */
/* virtual void correct_rhs(DENS_MAT & rhs); */
/* /\** nodal fluctuating potential energy *\/ */
/* DENS_MAN * nodalAtomicFluctuatingPotentialEnergy_; */
/* /\** fraction of temperature from KE *\/ */
/* double keMultiplier_; */
/* /\** fraction of temperature from PE *\/ */
/* double peMultiplier_; */
/* private: */
/* // DO NOT define this */
/* ThermostatRescaleMixedKePe(); */
/* }; */
/* /\** */
/* * @class ThermostatGlcFs */
/* * @brief Class for thermostat algorithms based on Gaussian least constraints (GLC) for fractional step (FS) algorithsm */
/* *\/ */
/* class ThermostatGlcFs : public ThermostatShapeFunction { */
/* public: */
/* ThermostatGlcFs(Thermostat * thermostat, */
-/* const string & regulatorPrefix = ""); */
+/* const std::string & regulatorPrefix = ""); */
/* virtual ~ThermostatGlcFs() {}; */
/* /\** instantiate all needed data *\/ */
/* virtual void construct_transfers(); */
/* /\** pre-run initialization of method data *\/ */
/* virtual void initialize(); */
/* /\** applies thermostat to atoms in the predictor phase *\/ */
/* virtual void apply_pre_predictor(double dt); */
/* /\** applies thermostat to atoms in the pre-corrector phase *\/ */
/* virtual void apply_pre_corrector(double dt); */
/* /\** applies thermostat to atoms in the post-corrector phase *\/ */
/* virtual void apply_post_corrector(double dt); */
/* /\** get data for output *\/ */
/* virtual void output(OUTPUT_LIST & outputData); */
/* /\* flag for performing the full lambda prediction calculation *\/ */
/* bool full_prediction(); */
/* protected: */
/* // methods */
/* /\** determine mapping from all nodes to those to which the thermostat applies *\/ */
/* void compute_rhs_map(); */
/* /\** sets up appropriate rhs for thermostat equations *\/ */
/* virtual void set_thermostat_rhs(DENS_MAT & rhs, */
/* double dt) = 0; */
/* /\** apply forces to atoms *\/ */
/* virtual void apply_to_atoms(PerAtomQuantity<double> * atomicVelocity, */
/* const DENS_MAN * nodalAtomicEnergy, */
/* const DENS_MAT & lambdaForce, */
/* DENS_MAT & nodalAtomicLambdaPower, */
/* double dt); */
/* /\** add contributions from thermostat to FE energy *\/ */
/* virtual void add_to_energy(const DENS_MAT & nodalLambdaPower, */
/* DENS_MAT & deltaEnergy, */
/* double dt) = 0; */
/* /\* sets up and solves the linear system for lambda *\/ */
/* virtual void compute_lambda(double dt, */
/* bool iterateSolution = true); */
/* /\** solves the non-linear equation for lambda iteratively *\/ */
/* void iterate_lambda(const MATRIX & rhs); */
/* // member data */
/* /\** reference to AtC FE temperature *\/ */
/* DENS_MAN & temperature_; */
/* /\** pointer to a time filtering object *\/ */
/* TimeFilter * timeFilter_; */
/* /\** power induced by lambda *\/ */
/* DENS_MAN * nodalAtomicLambdaPower_; */
/* /\** filtered lambda power *\/ */
/* DENS_MAN * lambdaPowerFiltered_; */
/* /\** atomic force induced by lambda *\/ */
/* AtomicThermostatForce * atomThermostatForces_; */
/* /\** pointer to atom masses *\/ */
/* FundamentalAtomQuantity * atomMasses_; */
/* /\** pointer to the values of lambda interpolated to atoms *\/ */
/* DENS_MAN * rhsLambdaSquared_; */
/* /\** hack to determine if first timestep has been passed *\/ */
/* bool isFirstTimestep_; */
/* /\** maximum number of iterations used in iterative solve for lambda *\/ */
/* int lambdaMaxIterations_; */
/* /\** nodal atomic energy *\/ */
/* DENS_MAN * nodalAtomicEnergy_; */
/* /\** local version of velocity used as predicted final veloctiy *\/ */
/* PerAtomQuantity<double> * atomPredictedVelocities_; */
/* /\** predicted nodal atomic energy *\/ */
/* AtfShapeFunctionRestriction * nodalAtomicPredictedEnergy_; */
/* /\** pointer for force applied in first time step *\/ */
/* DENS_MAN * firstHalfAtomForces_; */
/* /\** FE temperature change from thermostat during predictor phase in second half of timestep *\/ */
/* DENS_MAT deltaEnergy1_; */
/* /\** FE temperature change from thermostat during corrector phase in second half of timestep *\/ */
/* DENS_MAT deltaEnergy2_; */
/* /\** right-hand side data for thermostat equation *\/ */
/* DENS_MAT rhs_; */
/* /\** mapping from all to regulated nodes *\/ */
/* DENS_MAT rhsMap_; */
/* /\** fraction of timestep over which constraint is exactly enforced *\/ */
/* double dtFactor_; */
/* // workspace */
/* DENS_MAT _lambdaPowerOutput_; // power applied by lambda in output format */
/* DENS_MAT _velocityDelta_; // change in velocity when lambda force is applied */
/* DENS_VEC _lambdaOverlap_; // lambda in MD overlapping FE nodes */
/* DENS_MAT _lambdaOld_; // lambda from previous iteration */
/* DENS_MAT _rhsOverlap_; // normal RHS vector mapped to overlap nodes */
/* DENS_VEC _rhsTotal_; // normal + 2nd order RHS for the iteration loop */
/* private: */
/* // DO NOT define this */
/* ThermostatGlcFs(); */
/* }; */
/* /\** */
/* * @class ThermostatFlux */
/* * @brief Class enforces GLC on atomic forces based on FE power when using fractional step time integration */
/* *\/ */
/* class ThermostatFlux : public ThermostatGlcFs { */
/* public: */
/* ThermostatFlux(Thermostat * thermostat, */
-/* const string & regulatorPrefix = ""); */
+/* const std::string & regulatorPrefix = ""); */
/* virtual ~ThermostatFlux() {}; */
/* /\** instantiate all needed data *\/ */
/* virtual void construct_transfers(); */
/* /\** pre-run initialization of method data *\/ */
/* virtual void initialize(); */
/* protected: */
/* /\** sets up appropriate rhs for thermostat equations *\/ */
/* virtual void set_thermostat_rhs(DENS_MAT & rhs, */
/* double dt); */
/* /\** add contributions from thermostat to FE energy *\/ */
/* virtual void add_to_energy(const DENS_MAT & nodalLambdaPower, */
/* DENS_MAT & deltaEnergy, */
/* double dt); */
/* /\** sets up the transfer which is the set of nodes being regulated *\/ */
/* virtual void construct_regulated_nodes(); */
/* // data */
/* /\** reference to ATC sources coming from prescribed data, AtC coupling, and extrinsic coupling *\/ */
/* DENS_MAN & heatSource_; */
/* private: */
/* // DO NOT define this */
/* ThermostatFlux(); */
/* }; */
/* /\** */
/* * @class ThermostatFixed */
/* * @brief Class enforces GLC on atomic forces based on FE power when using fractional step time integration */
/* *\/ */
/* class ThermostatFixed : public ThermostatGlcFs { */
/* public: */
/* ThermostatFixed(Thermostat * thermostat, */
-/* const string & regulatorPrefix = ""); */
+/* const std::string & regulatorPrefix = ""); */
/* virtual ~ThermostatFixed() {}; */
/* /\** instantiate all needed data *\/ */
/* virtual void construct_transfers(); */
/* /\** pre-run initialization of method data *\/ */
/* virtual void initialize(); */
/* /\** applies thermostat to atoms in the predictor phase *\/ */
/* virtual void apply_pre_predictor(double dt); */
/* /\** applies thermostat to atoms in the pre-corrector phase *\/ */
/* virtual void apply_pre_corrector(double dt); */
/* /\** applies thermostat to atoms in the post-corrector phase *\/ */
/* virtual void apply_post_corrector(double dt); */
/* /\** compute boundary flux, requires thermostat input since it is part of the coupling scheme *\/ */
/* virtual void compute_boundary_flux(FIELDS & fields) */
/* {boundaryFlux_[TEMPERATURE] = 0.;}; */
/* /\** determine if local shape function matrices are needed *\/ */
/* virtual bool use_local_shape_functions() const {return atomicRegulator_->use_localized_lambda();}; */
/* protected: */
/* // methods */
/* /\** initialize data for tracking the change in nodal atomic temperature *\/ */
/* virtual void initialize_delta_nodal_atomic_energy(double dt); */
/* /\** compute the change in nodal atomic temperature *\/ */
/* virtual void compute_delta_nodal_atomic_energy(double dt); */
/* /\** sets up appropriate rhs for thermostat equations *\/ */
/* virtual void set_thermostat_rhs(DENS_MAT & rhs, */
/* double dt); */
/* /\** add contributions from thermostat to FE energy *\/ */
/* virtual void add_to_energy(const DENS_MAT & nodalLambdaPower, */
/* DENS_MAT & deltaEnergy, */
/* double dt); */
/* /\* sets up and solves the linear system for lambda *\/ */
/* virtual void compute_lambda(double dt, */
/* bool iterateSolution = true); */
/* /\** flag for halving the applied force to mitigate numerical errors *\/ */
/* bool halve_force(); */
/* /\** sets up the transfer which is the set of nodes being regulated *\/ */
/* virtual void construct_regulated_nodes(); */
/* // data */
/* /\** change in FE energy over a timestep *\/ */
/* DENS_MAT deltaFeEnergy_; */
/* /\** initial FE energy used to compute change *\/ */
/* DENS_MAT initialFeEnergy_; */
/* /\** change in restricted atomic FE energy over a timestep *\/ */
/* DENS_MAT deltaNodalAtomicEnergy_; */
/* /\** intial restricted atomic FE energy used to compute change *\/ */
/* DENS_MAT initialNodalAtomicEnergy_; */
/* /\** filtered nodal atomic energy *\/ */
/* DENS_MAN nodalAtomicEnergyFiltered_; */
/* /\** forces depending on predicted velocities for correct updating with fixed nodes *\/ */
/* AtomicThermostatForce * atomThermostatForcesPredVel_; */
/* /\** coefficient to account for effect of time filtering on rhs terms *\/ */
/* double filterCoefficient_; */
/* /\** kinetic energy multiplier in total energy (used for temperature expression) *\/ */
/* double keMultiplier_; */
/* // workspace */
/* DENS_MAT _tempNodalAtomicEnergyFiltered_; // stores filtered energy change in atoms for persistence during predictor */
/* private: */
/* // DO NOT define this */
/* ThermostatFixed(); */
/* }; */
/* /\** */
/* * @class ThermostatFluxFiltered */
/* * @brief Class enforces GLC on atomic forces based on FE power when using fractional step time integration */
/* * in conjunction with time filtering */
/* *\/ */
/* class ThermostatFluxFiltered : public ThermostatFlux { */
/* public: */
/* ThermostatFluxFiltered(Thermostat * thermostat, */
-/* const string & regulatorPrefix = ""); */
+/* const std::string & regulatorPrefix = ""); */
/* virtual ~ThermostatFluxFiltered() {}; */
/* /\** pre-run initialization of method data *\/ */
/* virtual void initialize(); */
/* /\** applies thermostat to atoms in the post-corrector phase *\/ */
/* virtual void apply_post_corrector(double dt); */
/* /\** get data for output *\/ */
/* virtual void output(OUTPUT_LIST & outputData); */
/* protected: */
/* /\** sets up appropriate rhs for thermostat equations *\/ */
/* virtual void set_thermostat_rhs(DENS_MAT & rhs, */
/* double dt); */
/* /\** add contributions from thermostat to FE energy *\/ */
/* virtual void add_to_energy(const DENS_MAT & nodalLambdaPower, */
/* DENS_MAT & deltaEnergy, */
/* double dt); */
/* // data */
/* /\** heat source time history required to get instantaneous heat sources *\/ */
/* DENS_MAT heatSourceOld_; */
/* DENS_MAT instantHeatSource_; */
/* DENS_MAT timeStepSource_; */
/* private: */
/* // DO NOT define this */
/* ThermostatFluxFiltered(); */
/* }; */
/* /\** */
/* * @class ThermostatFixedFiltered */
/* * @brief Class for thermostatting using the temperature matching constraint and is compatible with */
/* the fractional step time-integration with time filtering */
/* *\/ */
/* class ThermostatFixedFiltered : public ThermostatFixed { */
/* public: */
/* ThermostatFixedFiltered(Thermostat * thermostat, */
-/* const string & regulatorPrefix = ""); */
+/* const std::string & regulatorPrefix = ""); */
/* virtual ~ThermostatFixedFiltered() {}; */
/* /\** get data for output *\/ */
/* virtual void output(OUTPUT_LIST & outputData); */
/* protected: */
/* // methods */
/* /\** initialize data for tracking the change in nodal atomic temperature *\/ */
/* virtual void initialize_delta_nodal_atomic_energy(double dt); */
/* /\** compute the change in nodal atomic temperature *\/ */
/* virtual void compute_delta_nodal_atomic_energy(double dt); */
/* /\** sets up appropriate rhs for thermostat equations *\/ */
/* virtual void set_thermostat_rhs(DENS_MAT & rhs, */
/* double dt); */
/* /\** add contributions from thermostat to temperature for uncoupled nodes *\/ */
/* virtual void add_to_energy(const DENS_MAT & nodalLambdaPower, */
/* DENS_MAT & deltaEnergy, */
/* double dt); */
/* private: */
/* // DO NOT define this */
/* ThermostatFixedFiltered(); */
/* }; */
/* /\** */
/* * @class ThermostatFluxFixed */
/* * @brief Class for thermostatting using the temperature matching constraint one one set of nodes and the flux matching constraint on another */
/* *\/ */
/* class ThermostatFluxFixed : public RegulatorMethod { */
/* public: */
/* ThermostatFluxFixed(Thermostat * thermostat, */
/* bool constructThermostats = true); */
/* virtual ~ThermostatFluxFixed(); */
/* /\** instantiate all needed data *\/ */
/* virtual void construct_transfers(); */
/* /\** pre-run initialization of method data *\/ */
/* virtual void initialize(); */
/* /\** applies thermostat to atoms in the predictor phase *\/ */
/* virtual void apply_pre_predictor(double dt); */
/* /\** applies thermostat to atoms in the pre-corrector phase *\/ */
/* virtual void apply_pre_corrector(double dt); */
/* /\** applies thermostat to atoms in the post-corrector phase *\/ */
/* virtual void apply_post_corrector(double dt); */
/* /\** get data for output *\/ */
/* virtual void output(OUTPUT_LIST & outputData); */
/* /\** compute boundary flux, requires thermostat input since it is part of the coupling scheme *\/ */
/* virtual void compute_boundary_flux(FIELDS & fields) */
/* {thermostatBcs_->compute_boundary_flux(fields);}; */
/* protected: */
/* // data */
/* /\** thermostat for imposing the fluxes *\/ */
/* ThermostatFlux * thermostatFlux_; */
/* /\** thermostat for imposing fixed nodes *\/ */
/* ThermostatFixed * thermostatFixed_; */
/* /\** pointer to whichever thermostat should compute the flux, based on coupling method *\/ */
/* ThermostatGlcFs * thermostatBcs_; */
/* private: */
/* // DO NOT define this */
/* ThermostatFluxFixed(); */
/* }; */
/* /\** */
/* * @class ThermostatFluxFixedFiltered */
/* * @brief Class for thermostatting using the temperature matching constraint one one set of nodes and the flux matching constraint on another with time filtering */
/* *\/ */
/* class ThermostatFluxFixedFiltered : public ThermostatFluxFixed { */
/* public: */
/* ThermostatFluxFixedFiltered(Thermostat * thermostat); */
/* virtual ~ThermostatFluxFixedFiltered(){}; */
/* private: */
/* // DO NOT define this */
/* ThermostatFluxFixedFiltered(); */
/* }; */
/* #endif */
};
#endif
diff --git a/lib/atc/Kinetostat.cpp b/lib/atc/Kinetostat.cpp
index 74bb28817..a76c678d2 100644
--- a/lib/atc/Kinetostat.cpp
+++ b/lib/atc/Kinetostat.cpp
@@ -1,2242 +1,2246 @@
#include "Kinetostat.h"
#include "ATC_Error.h"
#include "ATC_Coupling.h"
#include "LammpsInterface.h"
#include "PerAtomQuantityLibrary.h"
#include "PrescribedDataManager.h"
#include "ElasticTimeIntegrator.h"
#include "TransferOperator.h"
+using std::set;
+using std::pair;
+using std::string;
+
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class Kinetostat
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
Kinetostat::Kinetostat(ATC_Coupling * atc,
const string & regulatorPrefix) :
AtomicRegulator(atc,regulatorPrefix)
{
// do nothing
}
//--------------------------------------------------------
// modify:
// parses and adjusts kinetostat state based on
// user input, in the style of LAMMPS user input
//--------------------------------------------------------
bool Kinetostat::modify(int narg, char **arg)
{
bool foundMatch = false;
int argIndex = 0;
if (strcmp(arg[argIndex],"momentum")==0) {
argIndex++;
// fluxstat type
/*! \page man_control_momentum fix_modify AtC control momentum
\section syntax
fix_modify AtC control momentum none \n
fix_modify AtC control momentum rescale <frequency>\n
- frequency (int) = time step frequency for applying displacement and velocity rescaling \n
fix_modify AtC control momentum glc_displacement \n
fix_modify AtC control momentum glc_velocity \n
fix_modify AtC control momentum hoover \n
fix_modify AtC control momentum flux [faceset face_set_id, interpolate]
- face_set_id (string) = id of boundary face set, if not specified
(or not possible when the atomic domain does not line up with
mesh boundaries) defaults to an atomic-quadrature approximate
evaulation\n
\section examples
fix_modify AtC control momentum glc_velocity \n
- fix_modify AtC control momentum stress_flux faceset bndy_faces \n
+ fix_modify AtC control momentum flux faceset bndy_faces \n
\section description
\section restrictions
- only for be used with specific transfers :
+ only to be used with specific transfers :
elastic \n
rescale not valid with time filtering activated
\section related
\section default
none
*/
boundaryIntegrationType_ = NO_QUADRATURE;
howOften_ = 1;
if (strcmp(arg[argIndex],"none")==0) { // restore defaults
regulatorTarget_ = NONE;
couplingMode_ = UNCOUPLED;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"glc_displacement")==0) {
regulatorTarget_ = FIELD;
couplingMode_ = FIXED;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"glc_velocity")==0) {
regulatorTarget_ = DERIVATIVE;
couplingMode_ = FIXED;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"hoover")==0) {
regulatorTarget_ = DYNAMICS;
couplingMode_ = FIXED;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"flux")==0) {
regulatorTarget_ = DYNAMICS;
couplingMode_ = FLUX;
argIndex++;
boundaryIntegrationType_ = atc_->parse_boundary_integration(narg-argIndex,&arg[argIndex],boundaryFaceSet_);
foundMatch = true;
}
else if (strcmp(arg[argIndex],"ghost_flux")==0) {
regulatorTarget_ = DYNAMICS;
couplingMode_ = GHOST_FLUX;
foundMatch = true;
}
}
if (!foundMatch)
foundMatch = AtomicRegulator::modify(narg,arg);
if (foundMatch)
needReset_ = true;
return foundMatch;
}
//--------------------------------------------------------
// reset_lambda_contribution
// resets the kinetostat generated force to a
// prescribed value
//--------------------------------------------------------
void Kinetostat::reset_lambda_contribution(const DENS_MAT & target)
{
DENS_MAN * lambdaForceFiltered = regulator_data("LambdaForceFiltered",nsd_);
lambdaForceFiltered->set_quantity() = target;
}
//--------------------------------------------------------
// initialize:
// sets up methods before a run
// dependence, but in general there is also a
// time integrator dependence. In general the
// precedence order is:
// time filter -> time integrator -> kinetostat
// In the future this may need to be added if
// different types of time integrators can be
// specified.
//--------------------------------------------------------
void Kinetostat::construct_methods()
{
// get data associated with stages 1 & 2 of ATC_Method::initialize
AtomicRegulator::construct_methods();
if (atc_->reset_methods()) {
// eliminate existing methods
delete_method();
DENS_MAT nodalGhostForceFiltered;
TimeIntegrator::TimeIntegrationType myIntegrationType = (atc_->time_integrator(VELOCITY))->time_integration_type();
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (timeFilterManager->end_equilibrate() && regulatorTarget_==AtomicRegulator::DYNAMICS) {
StressFlux * myMethod;
myMethod = dynamic_cast<StressFlux *>(regulatorMethod_);
nodalGhostForceFiltered = (myMethod->filtered_ghost_force()).quantity();
}
// update time filter
if (timeFilterManager->need_reset()) {
timeFilter_ = timeFilterManager->construct(TimeFilterManager::IMPLICIT_UPDATE);
}
if (timeFilterManager->filter_dynamics()) {
switch (regulatorTarget_) {
case NONE: {
regulatorMethod_ = new RegulatorMethod(this);
break;
}
case FIELD: {
regulatorMethod_ = new DisplacementGlcFiltered(this);
break;
}
case DERIVATIVE: {
regulatorMethod_ = new VelocityGlcFiltered(this);
break;
}
case DYNAMICS: {
throw ATC_Error("Kinetostat::initialize - force based kinetostats not yet implemented with time filtering");
regulatorMethod_ = new StressFluxFiltered(this);
if (timeFilterManager->end_equilibrate()) {
StressFlux * myMethod;
myMethod = dynamic_cast<StressFlux *>(regulatorMethod_);
myMethod->reset_filtered_ghost_force(nodalGhostForceFiltered);
}
break;
}
default:
throw ATC_Error("Unknown kinetostat type in Kinetostat::initialize");
}
}
else {
switch (regulatorTarget_) {
case NONE: {
regulatorMethod_ = new RegulatorMethod(this);
break;
}
case FIELD: {
regulatorMethod_ = new DisplacementGlc(this);
break;
}
case DERIVATIVE: {
regulatorMethod_ = new VelocityGlc(this);
break;
}
case DYNAMICS: {
if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP) {
if (couplingMode_ == GHOST_FLUX) {
regulatorMethod_ = new KinetostatFluxGhost(this);
}
else if (couplingMode_ == FIXED) {
regulatorMethod_ = new KinetostatFixed(this);
}
else if (couplingMode_ == FLUX) {
regulatorMethod_ = new KinetostatFlux(this);
}
break;
}
if (myIntegrationType == TimeIntegrator::GEAR) {
if (couplingMode_ == FIXED) {
regulatorMethod_ = new KinetostatFixed(this);
}
else if (couplingMode_ == FLUX) {
regulatorMethod_ = new KinetostatFlux(this);
}
break;
}
else {
if (couplingMode_ == GHOST_FLUX) {
regulatorMethod_ = new StressFluxGhost(this);
}
else {
regulatorMethod_ = new StressFlux(this);
}
break;
}
}
default:
throw ATC_Error("Unknown kinetostat type in Kinetostat::initialize");
}
AtomicRegulator::reset_method();
}
}
else {
set_all_data_to_used();
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class KinetostatShapeFunction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
KinetostatShapeFunction::KinetostatShapeFunction(Kinetostat *kinetostat,
const string & regulatorPrefix) :
RegulatorShapeFunction(kinetostat,regulatorPrefix),
kinetostat_(kinetostat),
timeFilter_(atomicRegulator_->time_filter()),
nodalAtomicLambdaForce_(NULL),
lambdaForceFiltered_(NULL),
atomKinetostatForce_(NULL),
atomVelocities_(NULL),
atomMasses_(NULL)
{
// data associated with stage 3 in ATC_Method::initialize
lambda_ = kinetostat->regulator_data(regulatorPrefix_+"LambdaMomentum",nsd_);
lambdaForceFiltered_ = kinetostat_->regulator_data("LambdaForceFiltered",nsd_);
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void KinetostatShapeFunction::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// needed fundamental quantities
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY);
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS);
// base class transfers
RegulatorShapeFunction::construct_transfers();
// lambda interpolated to the atomic coordinates
atomLambdas_ = new FtaShapeFunctionProlongation(atc_,
lambda_,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_per_atom_quantity(atomLambdas_,
regulatorPrefix_+"AtomLambdaMomentum");
}
//--------------------------------------------------------
// set_weights
// sets diagonal weighting matrix used in
// solve_for_lambda
//--------------------------------------------------------
void KinetostatShapeFunction::set_weights()
{
if (this->use_local_shape_functions()) {
ConstantQuantityMapped<double> * myWeights = new ConstantQuantityMapped<double>(atc_,1.,lambdaAtomMap_);
weights_ = myWeights;
(atc_->interscale_manager()).add_per_atom_quantity(myWeights,
"AtomOnesMapped");
}
else {
weights_ = (atc_->interscale_manager()).per_atom_quantity("AtomicOnes");
if (!weights_) {
weights_ = new ConstantQuantity<double>(atc_,1.);
(atc_->interscale_manager()).add_per_atom_quantity(weights_,
"AtomicOnes");
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class GlcKinetostat
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
GlcKinetostat::GlcKinetostat(Kinetostat *kinetostat) :
KinetostatShapeFunction(kinetostat),
mdMassMatrix_(atc_->set_mass_mat_md(VELOCITY)),
atomPositions_(NULL)
{
// do nothing
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void GlcKinetostat::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// needed fundamental quantities
atomPositions_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION);
// base class transfers
KinetostatShapeFunction::construct_transfers();
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void GlcKinetostat::initialize()
{
KinetostatShapeFunction::initialize();
// set up list of nodes using Hoover coupling
// (a) nodes with prescribed values
PrescribedDataManager * prescribedDataMgr(atc_->prescribed_data_manager());
for (int i = 0; i < nNodes_; ++i)
for (int j = 0; j < nsd_; ++j)
if (prescribedDataMgr->is_fixed(i,VELOCITY,j))
hooverNodes_.insert(pair<int,int>(i,j));
// (b) AtC coupling nodes
if (atomicRegulator_->coupling_mode()==AtomicRegulator::FIXED) {
InterscaleManager & interscaleManager(atc_->interscale_manager());
const INT_ARRAY & nodeType((interscaleManager.dense_matrix_int("NodalGeometryType"))->quantity());
if (atomicRegulator_->use_localized_lambda()) {
for (int i = 0; i < nNodes_; ++i) {
if (nodeType(i,0)==BOUNDARY) {
for (int j = 0; j < nsd_; ++j) {
hooverNodes_.insert(pair<int,int>(i,j));
}
}
}
}
else {
for (int i = 0; i < nNodes_; ++i) {
if (nodeType(i,0)==BOUNDARY || nodeType(i,0)==MD_ONLY) {
for (int j = 0; j < nsd_; ++j) {
hooverNodes_.insert(pair<int,int>(i,j));
}
}
}
}
}
}
//--------------------------------------------------------
// apply_lambda_to_atoms
// uses existing lambda to modify given
// atomic quantity
//--------------------------------------------------------
void GlcKinetostat::apply_to_atoms(PerAtomQuantity<double> * quantity,
const DENS_MAT & lambdaAtom,
double dt)
{
*quantity -= lambdaAtom;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class DisplacementGlc
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
DisplacementGlc::DisplacementGlc(Kinetostat * kinetostat) :
GlcKinetostat(kinetostat),
nodalAtomicMassWeightedDisplacement_(NULL),
nodalDisplacements_(atc_->field(DISPLACEMENT))
{
// do nothing
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void DisplacementGlc::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// set up node mappings
create_node_maps();
// set up shape function matrix
if (this->use_local_shape_functions()) {
lambdaAtomMap_ = new AtomToElementset(atc_,elementMask_);
interscaleManager.add_per_atom_int_quantity(lambdaAtomMap_,
regulatorPrefix_+"LambdaAtomMap");
shapeFunctionMatrix_ = new LocalLambdaCouplingMatrix(atc_,
lambdaAtomMap_,
nodeToOverlapMap_);
}
else {
shapeFunctionMatrix_ = new LambdaCouplingMatrix(atc_,nodeToOverlapMap_);
}
interscaleManager.add_per_atom_sparse_matrix(shapeFunctionMatrix_,
regulatorPrefix_+"LambdaCouplingMatrixMomentum");
// set linear solver strategy
if (atomicRegulator_->use_lumped_lambda_solve()) {
linearSolverType_ = AtomicRegulator::RSL_SOLVE;
}
else {
linearSolverType_ = AtomicRegulator::CG_SOLVE;
}
// base class transfers
GlcKinetostat::construct_transfers();
// atomic force induced by kinetostat
atomKinetostatForce_ = new AtomicKinetostatForceDisplacement(atc_);
interscaleManager.add_per_atom_quantity(atomKinetostatForce_,
regulatorPrefix_+"AtomKinetostatForce");
// restricted force due to kinetostat
nodalAtomicLambdaForce_ = new AtfShapeFunctionRestriction(atc_,
atomKinetostatForce_,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_dense_matrix(nodalAtomicLambdaForce_,
regulatorPrefix_+"NodalAtomicLambdaForce");
// nodal displacement restricted from atoms
nodalAtomicMassWeightedDisplacement_ = interscaleManager.dense_matrix("NodalAtomicMassWeightedDisplacement");
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void DisplacementGlc::initialize()
{
GlcKinetostat::initialize();
// sets up time filter for cases where variables temporally filtered
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (!timeFilterManager->end_equilibrate()) {
*lambdaForceFiltered_ = 0.;
timeFilter_->initialize(lambdaForceFiltered_->quantity());
}
}
//--------------------------------------------------------
// apply:
// apply the kinetostat to the atoms
//--------------------------------------------------------
void DisplacementGlc::apply_post_predictor(double dt)
{
compute_kinetostat(dt);
}
//--------------------------------------------------------
// compute_kinetostat
// manages the solution and application of the
// kinetostat equations and variables
//--------------------------------------------------------
void DisplacementGlc::compute_kinetostat(double dt)
{
// initial filtering update
apply_pre_filtering(dt);
// set up rhs
DENS_MAT rhs(nNodes_,nsd_);
set_kinetostat_rhs(rhs,dt);
// solve linear system for lambda
solve_for_lambda(rhs,lambda_->set_quantity());
// compute nodal atomic power
compute_nodal_lambda_force(dt);
// apply kinetostat to atoms
apply_to_atoms(atomPositions_,atomLambdas_->quantity());
}
//--------------------------------------------------------
// set_kinetostat_rhs
// sets up the right-hand side of the
// kinetostat equations
//--------------------------------------------------------
void DisplacementGlc::set_kinetostat_rhs(DENS_MAT & rhs, double dt)
{
// form rhs : sum_a (hatN_Ia * x_ai) - (Upsilon)_Ii
rhs = nodalAtomicMassWeightedDisplacement_->quantity();
rhs -= ((atc_->mass_mat_md(VELOCITY)).quantity())*(nodalDisplacements_.quantity());
}
//--------------------------------------------------------
// compute_nodal_lambda_force
// compute the effective FE force applied
// by the kinetostat
//--------------------------------------------------------
void DisplacementGlc::compute_nodal_lambda_force(double dt)
{
const DENS_MAT & myNodalAtomicLambdaForce(nodalAtomicLambdaForce_->quantity());
timeFilter_->apply_post_step1(lambdaForceFiltered_->set_quantity(),
myNodalAtomicLambdaForce,dt);
// update FE displacements for localized thermostats
apply_localization_correction(myNodalAtomicLambdaForce,
nodalDisplacements_.set_quantity(),
dt*dt);
}
//--------------------------------------------------------
// apply_pre_filtering
// applies first step of filtering to
// relevant variables
//--------------------------------------------------------
void DisplacementGlc::apply_pre_filtering(double dt)
{
// apply time filtered lambda force
DENS_MAT lambdaZero(nNodes_,nsd_);
timeFilter_->apply_pre_step1(lambdaForceFiltered_->set_quantity(),(-1./dt/dt)*lambdaZero,dt);
}
//--------------------------------------------------------
// set_weights
// sets diagonal weighting matrix used in
// solve_for_lambda
//--------------------------------------------------------
void DisplacementGlc::set_weights()
{
if (lambdaAtomMap_) {
MappedAtomQuantity * myWeights = new MappedAtomQuantity(atc_,atomMasses_,lambdaAtomMap_);
weights_ = myWeights;
(atc_->interscale_manager()).add_per_atom_quantity(myWeights,
"AtomMassesMapped");
}
else {
weights_ = atomMasses_;
}
}
//--------------------------------------------------------
// apply_localization_correction
// corrects for localized kinetostats only
// solving kinetostat equations on a subset
// of the MD region
//--------------------------------------------------------
void DisplacementGlc::apply_localization_correction(const DENS_MAT & source,
DENS_MAT & nodalField,
double weight)
{
DENS_MAT nodalLambdaRoc(nNodes_,nsd_);
atc_->apply_inverse_mass_matrix(source,
nodalLambdaRoc,
VELOCITY);
set<pair<int,int> >::const_iterator iter;
for (iter = hooverNodes_.begin(); iter != hooverNodes_.end(); ++iter) {
nodalLambdaRoc(iter->first,iter->second) = 0.;
}
nodalField += weight*nodalLambdaRoc;
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void DisplacementGlc::output(OUTPUT_LIST & outputData)
{
_nodalAtomicLambdaForceOut_ = nodalAtomicLambdaForce_->quantity();
DENS_MAT & lambda(lambda_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData[regulatorPrefix_+"Lambda"] = &lambda;
outputData[regulatorPrefix_+"NodalLambdaForce"] = &(_nodalAtomicLambdaForceOut_);
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class DisplacementGlcFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
DisplacementGlcFiltered::DisplacementGlcFiltered(Kinetostat * kinetostat) :
DisplacementGlc(kinetostat),
nodalAtomicDisplacements_(atc_->nodal_atomic_field(DISPLACEMENT))
{
// do nothing
}
//--------------------------------------------------------
// apply_pre_filtering
// applies first step of filtering to
// relevant variables
//--------------------------------------------------------
void DisplacementGlcFiltered::apply_pre_filtering(double dt)
{
// apply time filtered lambda to atomic fields
DisplacementGlc::apply_pre_filtering(dt);
DENS_MAT nodalAcceleration(nNodes_,nsd_);
atc_->apply_inverse_md_mass_matrix(lambdaForceFiltered_->set_quantity(),
nodalAcceleration,
VELOCITY);
nodalAtomicDisplacements_ += dt*dt*nodalAcceleration;
}
//--------------------------------------------------------
// set_kinetostat_rhs
// sets up the right-hand side of the
// kinetostat equations
//--------------------------------------------------------
void DisplacementGlcFiltered::set_kinetostat_rhs(DENS_MAT & rhs, double dt)
{
// form rhs : sum_a (hatN_Ia * x_ai) - (Upsilon)_Ii
double coef = 1./(timeFilter_->unfiltered_coefficient_pre_s1(dt));
rhs = coef*((atc_->mass_mat_md(VELOCITY)).quantity())*(nodalAtomicDisplacements_.quantity() - nodalDisplacements_.quantity());
}
//--------------------------------------------------------
// compute_nodal_lambda_force
// compute the effective FE force applied
// by the kinetostat
//--------------------------------------------------------
void DisplacementGlcFiltered::compute_nodal_lambda_force(double dt)
{
const DENS_MAT & myNodalAtomicLambdaForce(nodalAtomicLambdaForce_->quantity());
DENS_MAT & myLambdaForceFiltered(lambdaForceFiltered_->set_quantity());
timeFilter_->apply_post_step1(myLambdaForceFiltered,
myNodalAtomicLambdaForce,dt);
// update filtered atomic displacements
DENS_MAT nodalLambdaRoc(myNodalAtomicLambdaForce.nRows(),myNodalAtomicLambdaForce.nCols());
atc_->apply_inverse_md_mass_matrix(myNodalAtomicLambdaForce,
nodalLambdaRoc,
VELOCITY);
timeFilter_->apply_post_step1(nodalAtomicDisplacements_.set_quantity(),dt*dt*nodalLambdaRoc,dt);
// update FE displacements for localized thermostats
apply_localization_correction(myLambdaForceFiltered,
nodalDisplacements_.set_quantity(),
dt*dt);
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void DisplacementGlcFiltered::output(OUTPUT_LIST & outputData)
{
DENS_MAT & lambda(lambda_->set_quantity());
DENS_MAT & lambdaForceFiltered(lambdaForceFiltered_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData[regulatorPrefix_+"Lambda"] = &lambda;
outputData[regulatorPrefix_+"NodalLambdaForce"] = &lambdaForceFiltered;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class VelocityGlc
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
VelocityGlc::VelocityGlc(Kinetostat * kinetostat) :
GlcKinetostat(kinetostat),
nodalAtomicMomentum_(NULL),
nodalVelocities_(atc_->field(VELOCITY))
{
// do nothing
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void VelocityGlc::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// set up node mappings
create_node_maps();
// set up shape function matrix
if (this->use_local_shape_functions()) {
lambdaAtomMap_ = new AtomToElementset(atc_,elementMask_);
interscaleManager.add_per_atom_int_quantity(lambdaAtomMap_,
regulatorPrefix_+"LambdaAtomMap");
shapeFunctionMatrix_ = new LocalLambdaCouplingMatrix(atc_,
lambdaAtomMap_,
nodeToOverlapMap_);
}
else {
shapeFunctionMatrix_ = new LambdaCouplingMatrix(atc_,nodeToOverlapMap_);
}
interscaleManager.add_per_atom_sparse_matrix(shapeFunctionMatrix_,
regulatorPrefix_+"LambdaCouplingMatrixMomentum");
// set linear solver strategy
if (atomicRegulator_->use_lumped_lambda_solve()) {
linearSolverType_ = AtomicRegulator::RSL_SOLVE;
}
else {
linearSolverType_ = AtomicRegulator::CG_SOLVE;
}
// base class transfers
GlcKinetostat::construct_transfers();
// atomic force induced by kinetostat
atomKinetostatForce_ = new AtomicKinetostatForceVelocity(atc_);
interscaleManager.add_per_atom_quantity(atomKinetostatForce_,
regulatorPrefix_+"AtomKinetostatForce");
// restricted force due to kinetostat
nodalAtomicLambdaForce_ = new AtfShapeFunctionRestriction(atc_,
atomKinetostatForce_,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_dense_matrix(nodalAtomicLambdaForce_,
regulatorPrefix_+"NodalAtomicLambdaForce");
// nodal momentum restricted from atoms
nodalAtomicMomentum_ = interscaleManager.dense_matrix("NodalAtomicMomentum");
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void VelocityGlc::initialize()
{
GlcKinetostat::initialize();
// sets up time filter for cases where variables temporally filtered
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (!timeFilterManager->end_equilibrate()) {
lambdaForceFiltered_->set_quantity() = 0.;
timeFilter_->initialize(lambdaForceFiltered_->quantity());
}
}
//--------------------------------------------------------
// apply_mid_corrector:
// apply the kinetostat during the middle of the
// predictor phase
//--------------------------------------------------------
void VelocityGlc::apply_mid_predictor(double dt)
{
double dtLambda = 0.5*dt;
compute_kinetostat(dtLambda);
}
//--------------------------------------------------------
// apply_post_corrector:
// apply the kinetostat after the corrector phase
//--------------------------------------------------------
void VelocityGlc::apply_post_corrector(double dt)
{
double dtLambda = 0.5*dt;
compute_kinetostat(dtLambda);
}
//--------------------------------------------------------
// apply_pre_filtering
// applies first step of filtering to
// relevant variables
//--------------------------------------------------------
void VelocityGlc::apply_pre_filtering(double dt)
{
// apply time filtered lambda to atomic fields
DENS_MAT lambdaZero(nNodes_,nsd_);
timeFilter_->apply_pre_step1(lambdaForceFiltered_->set_quantity(),(-1./dt)*lambdaZero,dt);
}
//--------------------------------------------------------
// compute_kinetostat
// manages the solution and application of the
// kinetostat equations and variables
//--------------------------------------------------------
void VelocityGlc::compute_kinetostat(double dt)
{
// initial filtering update
apply_pre_filtering(dt);
// set up rhs
DENS_MAT rhs(nNodes_,nsd_);
set_kinetostat_rhs(rhs,dt);
// solve linear system for lambda
solve_for_lambda(rhs,lambda_->set_quantity());
// compute nodal atomic power
compute_nodal_lambda_force(dt);
// apply kinetostat to atoms
apply_to_atoms(atomVelocities_,atomLambdas_->quantity());
}
//--------------------------------------------------------
// set_kinetostat_rhs
// sets up the right-hand side of the
// kinetostat equations
//--------------------------------------------------------
void VelocityGlc::set_kinetostat_rhs(DENS_MAT & rhs, double dt)
{
// form rhs : sum_a (hatN_Ia * x_ai) - (\dot{Upsilon})_Ii
rhs = nodalAtomicMomentum_->quantity();
rhs -= ((atc_->mass_mat_md(VELOCITY)).quantity())*(nodalVelocities_.quantity());
}
//--------------------------------------------------------
// compute_nodal_lambda_force
// compute the effective FE force applied
// by the kinetostat
//--------------------------------------------------------
void VelocityGlc::compute_nodal_lambda_force(double dt)
{
const DENS_MAT & myNodalAtomicLambdaForce(nodalAtomicLambdaForce_->quantity());
timeFilter_->apply_pre_step1(lambdaForceFiltered_->set_quantity(),
myNodalAtomicLambdaForce,dt);
// update FE displacements for localized thermostats
apply_localization_correction(myNodalAtomicLambdaForce,
nodalVelocities_.set_quantity(),
dt);
}
//--------------------------------------------------------
// set_weights
// sets diagonal weighting matrix used in
// solve_for_lambda
//--------------------------------------------------------
void VelocityGlc::set_weights()
{
if (lambdaAtomMap_) {
MappedAtomQuantity * myWeights = new MappedAtomQuantity(atc_,atomMasses_,lambdaAtomMap_);
weights_ = myWeights;
(atc_->interscale_manager()).add_per_atom_quantity(myWeights,
"AtomMassesMapped");
}
else {
weights_ = atomMasses_;
}
}
//--------------------------------------------------------
// apply_localization_correction
// corrects for localized kinetostats only
// solving kinetostat equations on a subset
// of the MD region
//--------------------------------------------------------
void VelocityGlc::apply_localization_correction(const DENS_MAT & source,
DENS_MAT & nodalField,
double weight)
{
DENS_MAT nodalLambdaRoc(nNodes_,nsd_);
atc_->apply_inverse_mass_matrix(source,
nodalLambdaRoc,
VELOCITY);
set<pair<int,int> >::const_iterator iter;
for (iter = hooverNodes_.begin(); iter != hooverNodes_.end(); ++iter) {
nodalLambdaRoc(iter->first,iter->second) = 0.;
}
nodalField += weight*nodalLambdaRoc;
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void VelocityGlc::output(OUTPUT_LIST & outputData)
{
_nodalAtomicLambdaForceOut_ = nodalAtomicLambdaForce_->quantity();
if ((atc_->lammps_interface())->rank_zero()) {
outputData[regulatorPrefix_+"Lambda"] = &(lambda_->set_quantity());
outputData[regulatorPrefix_+"NodalLambdaForce"] = &(_nodalAtomicLambdaForceOut_);
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class VelocityGlcFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
VelocityGlcFiltered::VelocityGlcFiltered(Kinetostat *kinetostat)
: VelocityGlc(kinetostat),
nodalAtomicVelocities_(atc_->nodal_atomic_field(VELOCITY))
{
// do nothing
}
//--------------------------------------------------------
// apply_pre_filtering
// applies first step of filtering to
// relevant variables
//--------------------------------------------------------
void VelocityGlcFiltered::apply_pre_filtering(double dt)
{
// apply time filtered lambda to atomic fields
VelocityGlc::apply_pre_filtering(dt);
DENS_MAT nodalAcceleration(nNodes_,nsd_);
atc_->apply_inverse_md_mass_matrix(lambdaForceFiltered_->quantity(),
nodalAcceleration,
VELOCITY);
nodalAtomicVelocities_ += dt*nodalAcceleration;
}
//--------------------------------------------------------
// set_kinetostat_rhs
// sets up the right-hand side of the
// kinetostat equations
//--------------------------------------------------------
void VelocityGlcFiltered::set_kinetostat_rhs(DENS_MAT & rhs, double dt)
{
// form rhs : sum_a (hatN_Ia * x_ai) - (Upsilon)_Ii
double coef = 1./(timeFilter_->unfiltered_coefficient_pre_s1(dt));
rhs = coef*((atc_->mass_mat_md(VELOCITY)).quantity())*(nodalAtomicVelocities_.quantity() - nodalVelocities_.quantity());
}
//--------------------------------------------------------
// compute_nodal_lambda_force
// compute the effective FE force applied
// by the kinetostat
//--------------------------------------------------------
void VelocityGlcFiltered::compute_nodal_lambda_force(double dt)
{
const DENS_MAT & myNodalAtomicLambdaForce(nodalAtomicLambdaForce_->quantity());
DENS_MAT & myLambdaForceFiltered(lambdaForceFiltered_->set_quantity());
timeFilter_->apply_post_step1(myLambdaForceFiltered,myNodalAtomicLambdaForce,dt);
// update filtered atomic displacements
DENS_MAT nodalLambdaRoc(myNodalAtomicLambdaForce.nRows(),myNodalAtomicLambdaForce.nCols());
atc_->apply_inverse_md_mass_matrix(myNodalAtomicLambdaForce,
nodalLambdaRoc,
VELOCITY);
timeFilter_->apply_post_step1(nodalAtomicVelocities_.set_quantity(),dt*nodalLambdaRoc,dt);
// update FE displacements for localized thermostats
apply_localization_correction(myLambdaForceFiltered,
nodalVelocities_.set_quantity(),
dt);
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void VelocityGlcFiltered::output(OUTPUT_LIST & outputData)
{
if ((atc_->lammps_interface())->rank_zero()) {
outputData[regulatorPrefix_+"Lambda"] = &(lambda_->set_quantity());
outputData[regulatorPrefix_+"NodalLambdaForce"] = &(lambdaForceFiltered_->set_quantity());
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class StressFlux
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
StressFlux::StressFlux(Kinetostat * kinetostat) :
GlcKinetostat(kinetostat),
nodalForce_(atc_->field_rhs(VELOCITY)),
nodalAtomicForce_(NULL),
nodalGhostForce_(NULL),
momentumSource_(atc_->atomic_source(VELOCITY))
{
// flag for performing boundary flux calculation
fieldMask_(VELOCITY,FLUX) = true;
}
StressFlux::~StressFlux()
{
// do nothing
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void StressFlux::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// set up node mappings
create_node_maps();
// set up shape function matrix
if (this->use_local_shape_functions()) {
lambdaAtomMap_ = new AtomToElementset(atc_,elementMask_);
interscaleManager.add_per_atom_int_quantity(lambdaAtomMap_,
regulatorPrefix_+"LambdaAtomMap");
shapeFunctionMatrix_ = new LocalLambdaCouplingMatrix(atc_,
lambdaAtomMap_,
nodeToOverlapMap_);
}
else {
shapeFunctionMatrix_ = new LambdaCouplingMatrix(atc_,nodeToOverlapMap_);
}
interscaleManager.add_per_atom_sparse_matrix(shapeFunctionMatrix_,
regulatorPrefix_+"LambdaCouplingMatrixMomentum");
// set linear solver strategy
if (atomicRegulator_->use_lumped_lambda_solve()) {
linearSolverType_ = AtomicRegulator::RSL_SOLVE;
}
else {
linearSolverType_ = AtomicRegulator::CG_SOLVE;
}
// base class transfers
GlcKinetostat::construct_transfers();
// force at nodes due to atoms
nodalAtomicForce_ = interscaleManager.dense_matrix("NodalAtomicForce");
// atomic force induced by kinetostat
atomKinetostatForce_ = new AtomicKinetostatForceStress(atc_,atomLambdas_);
interscaleManager.add_per_atom_quantity(atomKinetostatForce_,
regulatorPrefix_+"AtomKinetostatForce");
// restricted force due to kinetostat
nodalAtomicLambdaForce_ = new AtfShapeFunctionRestriction(atc_,
atomKinetostatForce_,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_dense_matrix(nodalAtomicLambdaForce_,
regulatorPrefix_+"NodalAtomicLambdaForce");
// sets up space for ghost force related variables
if (atc_->groupbit_ghost()) {
GhostCouplingMatrix * shapeFunctionGhost = new GhostCouplingMatrix(atc_,interscaleManager.per_atom_sparse_matrix("InterpolantGhost"),
regulatedNodes_,nodeToOverlapMap_);
interscaleManager.add_sparse_matrix(shapeFunctionGhost,
regulatorPrefix_+"GhostCouplingMatrix");
FundamentalAtomQuantity * atomGhostForce = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE,
GHOST);
nodalGhostForce_ = new AtfShapeFunctionRestriction(atc_,atomGhostForce,
shapeFunctionGhost);
interscaleManager.add_dense_matrix(nodalGhostForce_,
regulatorPrefix_+"NodalGhostForce");
nodalGhostForceFiltered_.reset(nNodes_,nsd_);
}
}
//--------------------------------------------------------
// compute_boundary_flux:
// computes the boundary flux to be consistent with
// the controller
//--------------------------------------------------------
void StressFlux::compute_boundary_flux(FIELDS & fields)
{
GlcKinetostat::compute_boundary_flux(fields);
}
//--------------------------------------------------------
// apply_pre_predictor:
// apply the kinetostat to the atoms in the
// mid-predictor integration phase
//--------------------------------------------------------
void StressFlux::apply_mid_predictor(double dt)
{
double dtLambda = 0.5*dt;
// apply lambda force to atoms
apply_to_atoms(atomVelocities_,atomKinetostatForce_->quantity(),dtLambda);
}
//--------------------------------------------------------
// apply_post_corrector:
// apply the kinetostat to the atoms in the
// post-corrector integration phase
//--------------------------------------------------------
void StressFlux::apply_post_corrector(double dt)
{
double dtLambda = 0.5*dt;
// apply lambda force to atoms
apply_to_atoms(atomVelocities_,atomKinetostatForce_->quantity(),dtLambda);
}
//--------------------------------------------------------
// compute_kinetostat
// manages the solution and application of the
// kinetostat equations and variables
//--------------------------------------------------------
void StressFlux::compute_kinetostat(double dt)
{
// initial filtering update
apply_pre_filtering(dt);
// set up rhs
DENS_MAT rhs(nNodes_,nsd_);
set_kinetostat_rhs(rhs,dt);
// solve linear system for lambda
solve_for_lambda(rhs,lambda_->set_quantity());
// compute nodal atomic power
compute_nodal_lambda_force(dt);
}
//--------------------------------------------------------
// apply_pre_filtering
// applies first step of filtering to
// relevant variables
//--------------------------------------------------------
void StressFlux::apply_pre_filtering(double dt)
{
// apply time filtered lambda force
DENS_MAT lambdaZero(nNodes_,nsd_);
timeFilter_->apply_pre_step1(lambdaForceFiltered_->set_quantity(),lambdaZero,dt);
if (nodalGhostForce_) {
timeFilter_->apply_pre_step1(nodalGhostForceFiltered_.set_quantity(),
nodalGhostForce_->quantity(),dt);
}
}
//--------------------------------------------------------
// set_kinetostat_rhs
// sets up the RHS of the kinetostat equations
// for the coupling parameter lambda
//--------------------------------------------------------
void StressFlux::set_kinetostat_rhs(DENS_MAT & rhs, double dt)
{
// (a) for flux based :
// form rhs : \int N_I r dV - \sum_g N_Ig^* f_g
// sources are set in ATC transfer
rhs.reset(nNodes_,nsd_);
rhs = momentumSource_.quantity();
if (nodalGhostForce_) {
rhs -= nodalGhostForce_->quantity();
}
// (b) for ess. bcs
// form rhs : {sum_a (N_Ia * f_ia) - M_md * (ddupsilon/dt)_I}
DENS_MAT rhsPrescribed = -1.*nodalForce_.quantity();
atc_->apply_inverse_mass_matrix(rhsPrescribed,VELOCITY);
rhsPrescribed = (mdMassMatrix_.quantity())*rhsPrescribed;
rhsPrescribed += nodalAtomicForce_->quantity();
set<pair<int,int> >::const_iterator iter;
for (iter = hooverNodes_.begin(); iter != hooverNodes_.end(); ++iter) {
rhs(iter->first,iter->second) = rhsPrescribed(iter->first,iter->second);
}
}
//--------------------------------------------------------
// compute_nodal_lambda_force
// computes the force induced on the FE
// by applying lambdaForce on the atoms
//--------------------------------------------------------
void StressFlux::compute_nodal_lambda_force(double dt)
{
DENS_MAT myNodalAtomicLambdaForce = nodalAtomicLambdaForce_->quantity();
set<pair<int,int> >::const_iterator iter;
for (iter = hooverNodes_.begin(); iter != hooverNodes_.end(); ++iter) {
myNodalAtomicLambdaForce(iter->first,iter->second) = 0.;
}
timeFilter_->apply_post_step1(lambdaForceFiltered_->set_quantity(),
myNodalAtomicLambdaForce,dt);
}
//--------------------------------------------------------
// add_to_rhs:
// determines what if any contributions to the
// finite element equations are needed for
// consistency with the kinetostat
//--------------------------------------------------------
void StressFlux::add_to_rhs(FIELDS & rhs)
{
// compute the kinetostat force
compute_kinetostat(atc_->dt());
rhs[VELOCITY] += nodalAtomicLambdaForce_->quantity() + boundaryFlux_[VELOCITY].quantity();
}
//--------------------------------------------------------
// apply_lambda_to_atoms
// uses existing lambda to modify given
// atomic quantity
//--------------------------------------------------------
void StressFlux::apply_to_atoms(PerAtomQuantity<double> * atomVelocities,
const DENS_MAT & lambdaForce,
double dt)
{
_deltaVelocity_ = lambdaForce;
_deltaVelocity_ /= atomMasses_->quantity();
_deltaVelocity_ *= dt;
*atomVelocities += _deltaVelocity_;
}
//--------------------------------------------------------
// reset_filtered_ghost_force:
// resets the kinetostat generated ghost force to a
// prescribed value
//--------------------------------------------------------
void StressFlux::reset_filtered_ghost_force(DENS_MAT & target)
{
nodalGhostForceFiltered_ = target;
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void StressFlux::output(OUTPUT_LIST & outputData)
{
_nodalAtomicLambdaForceOut_ = nodalAtomicLambdaForce_->quantity();
DENS_MAT & lambda(lambda_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData[regulatorPrefix_+"Lambda"] = &lambda;
outputData[regulatorPrefix_+"NodalLambdaForce"] = &(_nodalAtomicLambdaForceOut_);
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class StressFluxGhost
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
StressFluxGhost::StressFluxGhost(Kinetostat * kinetostat) :
StressFlux(kinetostat)
{
// flag for performing boundary flux calculation
fieldMask_(VELOCITY,FLUX) = false;
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void StressFluxGhost::construct_transfers()
{
StressFlux::construct_transfers();
if (!nodalGhostForce_) {
throw ATC_Error("StressFluxGhost::StressFluxGhost - ghost atoms must be specified");
}
}
//--------------------------------------------------------
// compute_boundary_flux:
// computes the boundary flux to be consistent with
// the controller
//--------------------------------------------------------
void StressFluxGhost::compute_boundary_flux(FIELDS & fields)
{
// This is only used in computation of atomic sources
boundaryFlux_[VELOCITY] = 0.;
}
//--------------------------------------------------------
// add_to_rhs:
// determines what if any contributions to the
// finite element equations are needed for
// consistency with the kinetostat
//--------------------------------------------------------
void StressFluxGhost::add_to_rhs(FIELDS & rhs)
{
// compute the kinetostat force
compute_kinetostat(atc_->dt());
// uses ghost force as the boundary flux to add to the RHS
rhs[VELOCITY] += nodalAtomicLambdaForce_->quantity() + nodalGhostForce_->quantity();
}
//--------------------------------------------------------
// set_kinetostat_rhs
// sets up the RHS of the kinetostat equations
// for the coupling parameter lambda
//--------------------------------------------------------
void StressFluxGhost::set_kinetostat_rhs(DENS_MAT & rhs, double dt)
{
// (a) for flux based :
// form rhs : \int N_I r dV - \sum_g N_Ig^* f_g
// sources are set in ATC transfer
rhs.reset(nNodes_,nsd_);
rhs = momentumSource_.quantity();
// (b) for ess. bcs
// form rhs : {sum_a (N_Ia * f_ia) - M_md * (ddupsilon/dt)_I}
DENS_MAT rhsPrescribed = -1.*nodalForce_.quantity();
atc_->apply_inverse_mass_matrix(rhsPrescribed,VELOCITY);
rhsPrescribed = (mdMassMatrix_.quantity())*rhsPrescribed;
rhsPrescribed += nodalAtomicForce_->quantity();
set<pair<int,int> >::const_iterator iter;
for (iter = hooverNodes_.begin(); iter != hooverNodes_.end(); ++iter) {
rhs(iter->first,iter->second) = rhsPrescribed(iter->first,iter->second);
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class StressFluxFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
StressFluxFiltered::StressFluxFiltered(Kinetostat * kinetostat) :
StressFlux(kinetostat),
nodalAtomicVelocity_(atc_->nodal_atomic_field(VELOCITY))
{
// do nothing
}
//--------------------------------------------------------
// set_kinetostat_rhs
// sets up the RHS of the kinetostat equations
// for the coupling parameter lambda
//--------------------------------------------------------
void StressFluxFiltered::set_kinetostat_rhs(DENS_MAT & rhs, double dt)
{
// set basic terms
// (a) for flux based :
// form rhs : \int N_I r dV - \sum_g N_Ig^* f_g
// sources are set in ATC transfer
rhs.reset(nNodes_,nsd_);
rhs = momentumSource_.quantity() - nodalGhostForceFiltered_.quantity();
// (b) for ess. bcs
// form rhs : {sum_a (N_Ia * f_ia) - M_md * (ddupsilon/dt)_I}
DENS_MAT rhsPrescribed = -1.*nodalForce_.quantity();
atc_->apply_inverse_mass_matrix(rhsPrescribed,VELOCITY);
rhsPrescribed = (mdMassMatrix_.quantity())*rhsPrescribed;
rhsPrescribed += nodalAtomicForce_->quantity();
set<pair<int,int> >::const_iterator iter;
for (iter = hooverNodes_.begin(); iter != hooverNodes_.end(); ++iter) {
rhs(iter->first,iter->second) = rhsPrescribed(iter->first,iter->second);
}
// adjust for application of current lambda force
rhs += lambdaForceFiltered_->quantity();
// correct for time filtering
rhs *= 1./(timeFilter_->unfiltered_coefficient_pre_s1(dt));
}
//--------------------------------------------------------
// apply_lambda_to_atoms
// uses existing lambda to modify given
// atomic quantity
//--------------------------------------------------------
void StressFluxFiltered::apply_to_atoms(PerAtomQuantity<double> * atomVelocities,
const DENS_MAT & lambdaForce,
double dt)
{
StressFlux::apply_to_atoms(atomVelocities,lambdaForce,dt);
// add in corrections to filtered nodal atomice velocity
DENS_MAT velocityRoc(nNodes_,nsd_);
atc_->apply_inverse_md_mass_matrix(lambdaForceFiltered_->quantity(),
velocityRoc,
VELOCITY);
nodalAtomicVelocity_ += dt*velocityRoc;
}
//--------------------------------------------------------
// add_to_rhs:
// determines what if any contributions to the
// finite element equations are needed for
// consistency with the kinetostat
//--------------------------------------------------------
void StressFluxFiltered::add_to_rhs(FIELDS & rhs)
{
// compute kinetostat forces
compute_kinetostat(atc_->dt());
rhs[VELOCITY] += lambdaForceFiltered_->quantity() + boundaryFlux_[VELOCITY].quantity();
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void StressFluxFiltered::output(OUTPUT_LIST & outputData)
{
DENS_MAT & lambda(lambda_->set_quantity());
DENS_MAT & lambdaForceFiltered(lambdaForceFiltered_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData[regulatorPrefix_+"Lambda"] = &lambda;
outputData[regulatorPrefix_+"NodalLambdaForce"] = &lambdaForceFiltered;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class KinetostatGlcFs
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
KinetostatGlcFs::KinetostatGlcFs(Kinetostat * kinetostat,
const string & regulatorPrefix) :
KinetostatShapeFunction(kinetostat,regulatorPrefix),
velocity_(atc_->field(VELOCITY))
{
// constuct/obtain data corresponding to stage 3 of ATC_Method::initialize
nodalAtomicLambdaForce_ = kinetostat_->regulator_data(regulatorPrefix_+"NodalAtomicLambdaForce",nsd_);
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void KinetostatGlcFs::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// base class transfers
KinetostatShapeFunction::construct_transfers();
// get data from manager
nodalAtomicMomentum_ = interscaleManager.dense_matrix("NodalAtomicMomentum");
// atomic force induced by kinetostat
PerAtomQuantity<double> * atomLambdas = interscaleManager.per_atom_quantity(regulatorPrefix_+"AtomLambdaMomentum");
atomKinetostatForce_ = new AtomicKinetostatForceStress(atc_,atomLambdas);
interscaleManager.add_per_atom_quantity(atomKinetostatForce_,
regulatorPrefix_+"AtomKinetostatForce");
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void KinetostatGlcFs::initialize()
{
KinetostatShapeFunction::initialize();
// set up workspaces
_deltaMomentum_.reset(nNodes_,nsd_);
_lambdaForceOutput_.reset(nNodes_,nsd_);
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (!timeFilterManager->end_equilibrate()) {
// we should reset lambda and lambdaForce to zero in this case
// implies an initial condition of 0 for the filtered nodal lambda power
// initial conditions will always be needed when using time filtering
// however, the fractional step scheme must assume the instantaneous
// nodal lambda power is 0 initially because all quantities are in delta form
*lambda_ = 0.; // ensures initial lambda force is zero
*nodalAtomicLambdaForce_ = 0.; // momentum change due to kinetostat
*lambdaForceFiltered_ = 0.; // filtered momentum change due to kinetostats
}
else {
// we can grab lambda power variables using time integrator and atc transfer in cases for equilibration
}
// sets up time filter for cases where variables temporally filtered
if (timeFilterManager->need_reset()) {
// the form of this integrator implies no time filters that require history data can be used
timeFilter_->initialize(nodalAtomicLambdaForce_->quantity());
}
compute_rhs_map();
}
//--------------------------------------------------------
// compute_rhs_map
// creates mapping from all nodes to those to which
// the kinetostat applies
//--------------------------------------------------------
void KinetostatGlcFs::compute_rhs_map()
{
rhsMap_.resize(overlapToNodeMap_->nRows(),1);
DENS_MAT rhsMapGlobal(nNodes_,1);
const set<int> & applicationNodes(applicationNodes_->quantity());
for (int i = 0; i < nNodes_; i++) {
if (applicationNodes.find(i) != applicationNodes.end()) {
rhsMapGlobal(i,0) = 1.;
}
else {
rhsMapGlobal(i,0) = 0.;
}
}
map_unique_to_overlap(rhsMapGlobal,rhsMap_);
}
//--------------------------------------------------------
// apply_pre_predictor:
// apply the kinetostat to the atoms in the
// pre-predictor integration phase
//--------------------------------------------------------
void KinetostatGlcFs::apply_pre_predictor(double dt)
{
DENS_MAT & lambdaForceFiltered(lambdaForceFiltered_->set_quantity());
DENS_MAT & nodalAtomicLambdaForce(nodalAtomicLambdaForce_->set_quantity());
// update filtered forces
timeFilter_->apply_pre_step1(lambdaForceFiltered,nodalAtomicLambdaForce,dt);
// apply lambda force to atoms and compute instantaneous lambda force
this->apply_to_atoms(atomVelocities_,nodalAtomicMomentum_,
atomKinetostatForce_->quantity(),
nodalAtomicLambdaForce,0.5*dt);
// update nodal variables for first half of timestep
this->add_to_momentum(nodalAtomicLambdaForce,_deltaMomentum_,0.5*dt);
atc_->apply_inverse_mass_matrix(_deltaMomentum_,VELOCITY);
velocity_ += _deltaMomentum_;
// start update of filtered lambda force
nodalAtomicLambdaForce = 0.;
timeFilter_->apply_post_step1(lambdaForceFiltered,nodalAtomicLambdaForce,dt);
}
//--------------------------------------------------------
// apply_post_corrector:
// apply the kinetostat to the atoms in the
// post-corrector integration phase
//--------------------------------------------------------
void KinetostatGlcFs::apply_post_corrector(double dt)
{
// compute the kinetostat equation and update lambda
this->compute_lambda(dt);
DENS_MAT & lambdaForceFiltered(lambdaForceFiltered_->set_quantity());
DENS_MAT & nodalAtomicLambdaForce(nodalAtomicLambdaForce_->set_quantity());
// update filtered force
timeFilter_->apply_pre_step1(lambdaForceFiltered,nodalAtomicLambdaForce,dt);
// apply lambda force to atoms and compute instantaneous lambda force
this->apply_to_atoms(atomVelocities_,nodalAtomicMomentum_,
atomKinetostatForce_->quantity(),
nodalAtomicLambdaForce,0.5*dt);
// update nodal variables for first half of timestep
this->add_to_momentum(nodalAtomicLambdaForce,_deltaMomentum_,0.5*dt);
nodalAtomicLambdaForce *= 2./dt;
atc_->apply_inverse_mass_matrix(_deltaMomentum_,VELOCITY);
velocity_ += _deltaMomentum_;
// start update of filtered lambda force
timeFilter_->apply_post_step2(lambdaForceFiltered,nodalAtomicLambdaForce,dt);
}
//--------------------------------------------------------
// compute_kinetostat
// manages the solution and application of the
// kinetostat equations and variables
//--------------------------------------------------------
void KinetostatGlcFs::compute_lambda(double dt)
{
// set up rhs for lambda equation
this->set_kinetostat_rhs(rhs_,0.5*dt);
// solve linear system for lambda
DENS_MAT & lambda(lambda_->set_quantity());
solve_for_lambda(rhs_,lambda);
}
//--------------------------------------------------------
// apply_lambda_to_atoms
// uses existing lambda to modify given
// atomic quantity
//--------------------------------------------------------
void KinetostatGlcFs::apply_to_atoms(PerAtomQuantity<double> * atomVelocity,
const DENS_MAN * nodalAtomicMomentum,
const DENS_MAT & lambdaForce,
DENS_MAT & nodalAtomicLambdaForce,
double dt)
{
// compute initial contributions to lambda force
nodalAtomicLambdaForce = nodalAtomicMomentum->quantity();
nodalAtomicLambdaForce *= -1.;
// apply lambda force to atoms
_velocityDelta_ = lambdaForce;
_velocityDelta_ /= atomMasses_->quantity();
_velocityDelta_ *= dt;
(*atomVelocity) += _velocityDelta_;
// finalize lambda force
nodalAtomicLambdaForce += nodalAtomicMomentum->quantity();
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void KinetostatGlcFs::output(OUTPUT_LIST & outputData)
{
_lambdaForceOutput_ = nodalAtomicLambdaForce_->quantity();
// approximate value for lambda force
double dt = LammpsInterface::instance()->dt();
_lambdaForceOutput_ *= (2./dt);
DENS_MAT & lambda(lambda_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData[regulatorPrefix_+"Lambda"] = &lambda;
outputData[regulatorPrefix_+"NodalLambdaForce"] = &(_lambdaForceOutput_);
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class KinetostatFlux
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
KinetostatFlux::KinetostatFlux(Kinetostat * kinetostat,
const string & regulatorPrefix) :
KinetostatGlcFs(kinetostat,regulatorPrefix),
momentumSource_(atc_->atomic_source(VELOCITY)),
nodalGhostForce_(NULL),
nodalGhostForceFiltered_(NULL)
{
// flag for performing boundary flux calculation
fieldMask_(VELOCITY,FLUX) = true;
// constuct/obtain data corresponding to stage 3 of ATC_Method::initialize
nodalGhostForceFiltered_ = kinetostat_->regulator_data(regulatorPrefix_+"NodalGhostForceFiltered",nsd_);
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void KinetostatFlux::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// set up node mappings
create_node_maps();
// set up linear solver
// set up data for linear solver
shapeFunctionMatrix_ = new LambdaCouplingMatrix(atc_,nodeToOverlapMap_);
interscaleManager.add_per_atom_sparse_matrix(shapeFunctionMatrix_,
regulatorPrefix_+"LambdaCouplingMatrixMomentum");
if (elementMask_) {
lambdaAtomMap_ = new AtomToElementset(atc_,elementMask_);
interscaleManager.add_per_atom_int_quantity(lambdaAtomMap_,
regulatorPrefix_+"LambdaAtomMap");
}
if (atomicRegulator_->use_localized_lambda()) {
linearSolverType_ = AtomicRegulator::RSL_SOLVE;
}
else {
linearSolverType_ = AtomicRegulator::CG_SOLVE;
}
// base class transfers
KinetostatGlcFs::construct_transfers();
// sets up space for ghost force related variables
if (atc_->groupbit_ghost()) {
MatrixDependencyManager<DenseMatrix, int> * nodeToOverlapMap =
interscaleManager.dense_matrix_int(regulatorPrefix_+"NodeToOverlapMap");
GhostCouplingMatrix * shapeFunctionGhost = new GhostCouplingMatrix(atc_,interscaleManager.per_atom_sparse_matrix("InterpolantGhost"),
regulatedNodes_,
nodeToOverlapMap);
interscaleManager.add_sparse_matrix(shapeFunctionGhost,
regulatorPrefix_+"GhostCouplingMatrix");
FundamentalAtomQuantity * atomGhostForce = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE,
GHOST);
nodalGhostForce_ = new AtfShapeFunctionRestriction(atc_,atomGhostForce,
shapeFunctionGhost);
interscaleManager.add_dense_matrix(nodalGhostForce_,
regulatorPrefix_+"NodalGhostForce");
}
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void KinetostatFlux::initialize()
{
KinetostatGlcFs::initialize();
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (!timeFilterManager->end_equilibrate()) {
// we should reset lambda and lambdaForce to zero in this case
// implies an initial condition of 0 for the filtered nodal lambda power
// initial conditions will always be needed when using time filtering
// however, the fractional step scheme must assume the instantaneous
// nodal lambda power is 0 initially because all quantities are in delta form
*nodalGhostForceFiltered_ = 0.; // filtered force from ghost atoms
}
else {
// we can grab lambda power variables using time integrator and atc transfer in cases for equilibration
}
}
//--------------------------------------------------------
// construct_regulated_nodes:
// constructs the set of nodes being regulated
//--------------------------------------------------------
void KinetostatFlux::construct_regulated_nodes()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// matrix requires all entries even if localized for correct lumping
regulatedNodes_ = new RegulatedNodes(atc_);
interscaleManager.add_set_int(regulatedNodes_,
regulatorPrefix_+"KinetostatRegulatedNodes");
// if localized monitor nodes with applied fluxes
if (atomicRegulator_->use_localized_lambda()) {
if ((kinetostat_->coupling_mode() == Kinetostat::FLUX) && (atomicRegulator_->boundary_integration_type() != NO_QUADRATURE)) {
// include boundary nodes
applicationNodes_ = new FluxBoundaryNodes(atc_);
boundaryNodes_ = new BoundaryNodes(atc_);
interscaleManager.add_set_int(boundaryNodes_,
regulatorPrefix_+"KinetostatBoundaryNodes");
}
else {
// fluxed nodes only
applicationNodes_ = new FluxNodes(atc_);
}
interscaleManager.add_set_int(applicationNodes_,
regulatorPrefix_+"KinetostatApplicationNodes");
}
else {
applicationNodes_ = regulatedNodes_;
}
// special set of boundary elements for boundary flux quadrature
if ((atomicRegulator_->boundary_integration_type() == FE_INTERPOLATION)
&& (atomicRegulator_->use_localized_lambda())) {
elementMask_ = new ElementMaskNodeSet(atc_,applicationNodes_);
interscaleManager.add_dense_matrix_bool(elementMask_,
regulatorPrefix_+"BoundaryElementMask");
}
}
//--------------------------------------------------------
// apply_pre_predictor:
// apply the kinetostat to the atoms in the
// pre-predictor integration phase
//--------------------------------------------------------
void KinetostatFlux::apply_pre_predictor(double dt)
{
// update filtered forces
if (nodalGhostForce_) {
timeFilter_->apply_pre_step1(nodalGhostForceFiltered_->set_quantity(),
nodalGhostForce_->quantity(),dt);
}
KinetostatGlcFs::apply_pre_predictor(dt);
}
//--------------------------------------------------------
// apply_post_corrector:
// apply the kinetostat to the atoms in the
// post-corrector integration phase
//--------------------------------------------------------
void KinetostatFlux::apply_post_corrector(double dt)
{
// update filtered ghost force
if (nodalGhostForce_) {
timeFilter_->apply_post_step1(nodalGhostForceFiltered_->set_quantity(),
nodalGhostForce_->quantity(),dt);
}
// compute the kinetostat equation and update lambda
KinetostatGlcFs::apply_post_corrector(dt);
}
//--------------------------------------------------------
// set_kinetostat_rhs
// sets up the RHS of the kinetostat equations
// for the coupling parameter lambda
//--------------------------------------------------------
void KinetostatFlux::set_kinetostat_rhs(DENS_MAT & rhs, double dt)
{
// (a) for flux based :
// form rhs : \int N_I r dV - \sum_g N_Ig^* f_g
// sources are set in ATC transfer
rhs.reset(nNodes_,nsd_);
const DENS_MAT & momentumSource(momentumSource_.quantity());
const set<int> & applicationNodes(applicationNodes_->quantity());
set<int>::const_iterator iNode;
for (iNode = applicationNodes.begin(); iNode != applicationNodes.end(); iNode++) {
for (int j = 0; j < nsd_; j++) {
rhs(*iNode,j) = momentumSource(*iNode,j);
}
}
// add ghost forces, if needed
if (nodalGhostForce_) {
const DENS_MAT & nodalGhostForce(nodalGhostForce_->quantity());
for (iNode = applicationNodes.begin(); iNode != applicationNodes.end(); iNode++) {
for (int j = 0; j < nsd_; j++) {
rhs(*iNode,j) -= nodalGhostForce(*iNode,j);
}
}
}
}
//--------------------------------------------------------
// add_to_momentum:
// determines what if any contributions to the
// finite element equations are needed for
// consistency with the kinetostat
//--------------------------------------------------------
void KinetostatFlux::add_to_momentum(const DENS_MAT & nodalLambdaForce,
DENS_MAT & deltaMomentum,
double dt)
{
deltaMomentum.resize(nNodes_,nsd_);
const DENS_MAT & boundaryFlux(boundaryFlux_[VELOCITY].quantity());
for (int i = 0; i < nNodes_; i++) {
for (int j = 0; j < nsd_; j++) {
deltaMomentum(i,j) = nodalLambdaForce(i,j) + dt*boundaryFlux(i,j);
}
}
}
//--------------------------------------------------------
// reset_filtered_ghost_force:
// resets the kinetostat generated ghost force to a
// prescribed value
//--------------------------------------------------------
void KinetostatFlux::reset_filtered_ghost_force(DENS_MAT & target)
{
(*nodalGhostForceFiltered_) = target;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class KinetostatFluxGhost
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
KinetostatFluxGhost::KinetostatFluxGhost(Kinetostat * kinetostat,
const string & regulatorPrefix) :
KinetostatFlux(kinetostat,regulatorPrefix)
{
// flag for performing boundary flux calculation
fieldMask_(VELOCITY,FLUX) = false;
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void KinetostatFluxGhost::construct_transfers()
{
KinetostatFlux::construct_transfers();
if (!nodalGhostForce_) {
throw ATC_Error("StressFluxGhost::StressFluxGhost - ghost atoms must be specified");
}
}
//--------------------------------------------------------
// compute_boundary_flux:
// computes the boundary flux to be consistent with
// the controller
//--------------------------------------------------------
void KinetostatFluxGhost::compute_boundary_flux(FIELDS & fields)
{
// This is only used in computation of atomic sources
boundaryFlux_[VELOCITY] = 0.;
}
//--------------------------------------------------------
// add_to_momentum:
// determines what if any contributions to the
// finite element equations are needed for
// consistency with the kinetostat
//--------------------------------------------------------
void KinetostatFluxGhost::add_to_momentum(const DENS_MAT & nodalLambdaForce,
DENS_MAT & deltaMomentum,
double dt)
{
deltaMomentum.resize(nNodes_,nsd_);
const DENS_MAT & boundaryFlux(nodalGhostForce_->quantity());
for (int i = 0; i < nNodes_; i++) {
for (int j = 0; j < nsd_; j++) {
deltaMomentum(i,j) = nodalLambdaForce(i,j) + dt*boundaryFlux(i,j);
}
}
}
//--------------------------------------------------------
// set_kinetostat_rhs
// sets up the RHS of the kinetostat equations
// for the coupling parameter lambda
//--------------------------------------------------------
void KinetostatFluxGhost::set_kinetostat_rhs(DENS_MAT & rhs, double dt)
{
// (a) for flux based :
// form rhs : \int N_I r dV - \sum_g N_Ig^* f_g
// sources are set in ATC transfer
rhs.reset(nNodes_,nsd_);
const DENS_MAT & momentumSource(momentumSource_.quantity());
const set<int> & applicationNodes(applicationNodes_->quantity());
set<int>::const_iterator iNode;
for (iNode = applicationNodes.begin(); iNode != applicationNodes.end(); iNode++) {
for (int j = 0; j < nsd_; j++) {
rhs(*iNode,j) = momentumSource(*iNode,j);
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class KinetostatFixed
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and kinetostat data
//--------------------------------------------------------
KinetostatFixed::KinetostatFixed(Kinetostat * kinetostat,
const string & regulatorPrefix) :
KinetostatGlcFs(kinetostat,regulatorPrefix),
mdMassMatrix_(atc_->set_mass_mat_md(VELOCITY)),
isFirstTimestep_(true)
{
// do nothing
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void KinetostatFixed::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// set up node mappings
create_node_maps();
// determine if map is needed and set up if so
if (this->use_local_shape_functions()) {
lambdaAtomMap_ = new AtomToElementset(atc_,elementMask_);
interscaleManager.add_per_atom_int_quantity(lambdaAtomMap_,
regulatorPrefix_+"LambdaAtomMap");
shapeFunctionMatrix_ = new LocalLambdaCouplingMatrix(atc_,
lambdaAtomMap_,
nodeToOverlapMap_);
}
else {
shapeFunctionMatrix_ = new LambdaCouplingMatrix(atc_,nodeToOverlapMap_);
}
interscaleManager.add_per_atom_sparse_matrix(shapeFunctionMatrix_,
regulatorPrefix_+"LambdaCouplingMatrixMomentum");
linearSolverType_ = AtomicRegulator::CG_SOLVE;
// base class transfers
KinetostatGlcFs::construct_transfers();
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void KinetostatFixed::initialize()
{
KinetostatGlcFs::initialize();
// reset data to zero
deltaFeMomentum_.reset(nNodes_,nsd_);
deltaNodalAtomicMomentum_.reset(nNodes_,nsd_);
}
//--------------------------------------------------------
// halve_force:
// flag to halve the lambda force for improved
// accuracy
//--------------------------------------------------------
bool KinetostatFixed::halve_force()
{
if (isFirstTimestep_ || ((atc_->atom_to_element_map_type() == EULERIAN)
&& (atc_->atom_to_element_map_frequency() > 1)
&& (atc_->step() % atc_->atom_to_element_map_frequency() == 1))) {
return true;
}
return false;
}
//--------------------------------------------------------
// construct_regulated_nodes:
// constructs the set of nodes being regulated
//--------------------------------------------------------
void KinetostatFixed::construct_regulated_nodes()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
if (!atomicRegulator_->use_localized_lambda()) {
regulatedNodes_ = new RegulatedNodes(atc_);
}
else if (kinetostat_->coupling_mode() == Kinetostat::FLUX) {
regulatedNodes_ = new FixedNodes(atc_);
}
else if (kinetostat_->coupling_mode() == Kinetostat::FIXED) {
// include boundary nodes
regulatedNodes_ = new FixedBoundaryNodes(atc_);
}
else {
throw ATC_Error("ThermostatFixed::construct_regulated_nodes - couldn't determine set of regulated nodes");
}
interscaleManager.add_set_int(regulatedNodes_,
regulatorPrefix_+"RegulatedNodes");
applicationNodes_ = regulatedNodes_;
// special set of boundary elements for defining regulated atoms
if (atomicRegulator_->use_localized_lambda()) {
elementMask_ = new ElementMaskNodeSet(atc_,applicationNodes_);
interscaleManager.add_dense_matrix_bool(elementMask_,
regulatorPrefix_+"BoundaryElementMask");
}
}
//--------------------------------------------------------
// initialize_delta_nodal_atomic_momentum:
// initializes storage for the variable tracking
// the change in the nodal atomic momentum
// that has occured over the past timestep
//--------------------------------------------------------
void KinetostatFixed::initialize_delta_nodal_atomic_momentum(double dt)
{
// initialize delta energy
const DENS_MAT & myNodalAtomicMomentum(nodalAtomicMomentum_->quantity());
initialNodalAtomicMomentum_ = myNodalAtomicMomentum;
initialNodalAtomicMomentum_ *= -1.; // initially stored as negative for efficiency
timeFilter_->apply_pre_step1(nodalAtomicMomentumFiltered_.set_quantity(),
myNodalAtomicMomentum,dt);
}
//--------------------------------------------------------
// compute_delta_nodal_atomic_momentum:
// computes the change in the nodal atomic momentum
// that has occured over the past timestep
//--------------------------------------------------------
void KinetostatFixed::compute_delta_nodal_atomic_momentum(double dt)
{
// set delta energy based on predicted atomic velocities
const DENS_MAT & myNodalAtomicMomentum(nodalAtomicMomentum_->quantity());
timeFilter_->apply_post_step1(nodalAtomicMomentumFiltered_.set_quantity(),
myNodalAtomicMomentum,dt);
deltaNodalAtomicMomentum_ = initialNodalAtomicMomentum_;
deltaNodalAtomicMomentum_ += myNodalAtomicMomentum;
}
//--------------------------------------------------------
// apply_pre_predictor:
// apply the kinetostat to the atoms in the
// pre-predictor integration phase
//--------------------------------------------------------
void KinetostatFixed::apply_pre_predictor(double dt)
{
// initialize values to be track change in finite element energy over the timestep
initialize_delta_nodal_atomic_momentum(dt);
initialFeMomentum_ = -1.*((mdMassMatrix_.quantity())*(velocity_.quantity())); // initially stored as negative for efficiency
KinetostatGlcFs::apply_pre_predictor(dt);
}
//--------------------------------------------------------
// apply_post_corrector:
// apply the kinetostat to the atoms in the
// post-corrector integration phase
//--------------------------------------------------------
void KinetostatFixed::apply_post_corrector(double dt)
{
KinetostatGlcFs::apply_post_corrector(dt);
// update filtered momentum with lambda force
DENS_MAT & myNodalAtomicLambdaForce(nodalAtomicLambdaForce_->set_quantity());
timeFilter_->apply_post_step2(nodalAtomicMomentumFiltered_.set_quantity(),
myNodalAtomicLambdaForce,dt);
if (halve_force()) {
// Halve lambda force due to fixed temperature constraints
// 1) makes up for poor initial condition
// 2) accounts for possibly large value of lambda when atomic shape function values change
// from eulerian mapping after more than 1 timestep
// avoids unstable oscillations arising from
// thermostat having to correct for error introduced in lambda changing the
// shape function matrices
*lambda_ *= 0.5;
}
isFirstTimestep_ = false;
}
//--------------------------------------------------------
// compute_kinetostat
// manages the solution and application of the
// kinetostat equations and variables
//--------------------------------------------------------
void KinetostatFixed::compute_lambda(double dt)
{
// compute predicted changes in nodal atomic momentum
compute_delta_nodal_atomic_momentum(dt);
// change in finite element momentum
deltaFeMomentum_ = initialFeMomentum_;
deltaFeMomentum_ += (mdMassMatrix_.quantity())*(velocity_.quantity());
// set up rhs for lambda equation
KinetostatGlcFs::compute_lambda(dt);
}
//--------------------------------------------------------
// set_kinetostat_rhs
// sets up the RHS of the kinetostat equations
// for the coupling parameter lambda
//--------------------------------------------------------
void KinetostatFixed::set_kinetostat_rhs(DENS_MAT & rhs, double dt)
{
// for essential bcs (fixed nodes) :
// form rhs : (delUpsV - delUps)/dt
const set<int> & regulatedNodes(regulatedNodes_->quantity());
double factor = (1./dt);
for (int i = 0; i < nNodes_; i++) {
if (regulatedNodes.find(i) != regulatedNodes.end()) {
for (int j = 0; j < nsd_; j++) {
rhs(i,j) = factor*(deltaNodalAtomicMomentum_(i,j) - deltaFeMomentum_(i,j));
}
}
else {
for (int j = 0; j < nsd_; j++) {
rhs(i,j) = 0.;
}
}
}
}
//--------------------------------------------------------
// add_to_momentum:
// determines what if any contributions to the
// finite element equations are needed for
// consistency with the kinetostat
//--------------------------------------------------------
void KinetostatFixed::add_to_momentum(const DENS_MAT & nodalLambdaForce,
DENS_MAT & deltaMomentum,
double dt)
{
deltaMomentum.resize(nNodes_,nsd_);
const set<int> & regulatedNodes(regulatedNodes_->quantity());
for (int i = 0; i < nNodes_; i++) {
if (regulatedNodes.find(i) != regulatedNodes.end()) {
for (int j = 0; j < nsd_; j++) {
deltaMomentum(i,j) = 0.;
}
}
else {
for (int j = 0; j < nsd_; j++) {
deltaMomentum(i,j) = nodalLambdaForce(i,j);
}
}
}
}
};
diff --git a/lib/atc/Kinetostat.h b/lib/atc/Kinetostat.h
index 3023f7ddd..e85caa886 100644
--- a/lib/atc/Kinetostat.h
+++ b/lib/atc/Kinetostat.h
@@ -1,809 +1,809 @@
#ifndef KINETOSTAT_H
#define KINETOSTAT_H
-// ATC headers
#include "AtomicRegulator.h"
#include "PerAtomQuantityLibrary.h"
-
-// other headers
#include <map>
#include <set>
+#include <utility>
+#include <string>
namespace ATC {
// forward declarations
class FundamentalAtomQuantity;
class AtfShapeFunctionRestriction;
template <typename T>
class ProtectedAtomQuantity;
/**
* @class Kinetostat
* @brief Manager class for atom-continuum control of momentum and position
*/
class Kinetostat : public AtomicRegulator {
public:
// constructor
Kinetostat(ATC_Coupling *atc,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
// destructor
virtual ~Kinetostat(){};
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** instantiate up the desired method(s) */
virtual void construct_methods();
// data access, intended for method objects
/** reset the nodal force to a prescribed value */
virtual void reset_lambda_contribution(const DENS_MAT & target);
private:
// DO NOT define this
Kinetostat();
};
/**
* @class KinetostatShapeFunction
* @brief Base class for implementation of kinetostat algorithms based on FE shape functions
*/
class KinetostatShapeFunction : public RegulatorShapeFunction {
public:
KinetostatShapeFunction(Kinetostat *kinetostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~KinetostatShapeFunction(){};
/** instantiate all needed data */
virtual void construct_transfers();
protected:
// methods
/** set weighting factor for in matrix Nhat^T * weights * Nhat */
virtual void set_weights();
// member data
/** pointer to thermostat object for data */
Kinetostat * kinetostat_;
/** pointer to a time filtering object */
TimeFilter * timeFilter_;
/** stress induced by lambda */
DENS_MAN * nodalAtomicLambdaForce_;
/** filtered lambda force */
DENS_MAN * lambdaForceFiltered_;
/** atomic force induced by lambda */
ProtectedAtomQuantity<double> * atomKinetostatForce_;
/** lambda prolonged to the atoms */
ProtectedAtomQuantity<double> * atomLambda_;
/** pointer to atom velocities */
FundamentalAtomQuantity * atomVelocities_;
/** pointer to atom velocities */
FundamentalAtomQuantity * atomMasses_;
// workspace
DENS_MAT _nodalAtomicLambdaForceOut_; // matrix for output only
private:
// DO NOT define this
KinetostatShapeFunction();
};
/**
* @class GlcKinetostat
* @brief Base class for implementation of kinetostat algorithms based on Gaussian least constraints (GLC)
*/
class GlcKinetostat : public KinetostatShapeFunction {
public:
GlcKinetostat(Kinetostat *kinetostat);
virtual ~GlcKinetostat(){};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
protected:
// methods
/** apply forces to atoms */
virtual void apply_to_atoms(PerAtomQuantity<double> * quantity,
const DENS_MAT & lambdaAtom,
double dt=0.);
/** apply any required corrections for localized kinetostats */
virtual void apply_localization_correction(const DENS_MAT & source,
DENS_MAT & nodalField,
double weight = 1.){};
// member data
/** MD mass matrix */
DIAG_MAN & mdMassMatrix_;
/** nodeset corresponding to Hoover coupling */
- set<pair<int,int> > hooverNodes_;
+ std::set<std::pair<int,int> > hooverNodes_;
+
/** pointer to atom positions */
FundamentalAtomQuantity * atomPositions_;
private:
// DO NOT define this
GlcKinetostat();
};
/**
* @class DisplacementGlc
* @brief Enforces GLC on atomic position based on FE displacement
*/
class DisplacementGlc : public GlcKinetostat {
public:
DisplacementGlc(Kinetostat * kinetostat);
virtual ~DisplacementGlc(){};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
/** applies kinetostat to atoms */
virtual void apply_post_predictor(double dt);
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
/** determine if local shape function matrices are needed */
virtual bool use_local_shape_functions() const {return (!atomicRegulator_->use_lumped_lambda_solve()) && atomicRegulator_->use_localized_lambda();};
protected:
// methods
/** set weighting factor for in matrix Nhat^T * weights * Nhat */
virtual void set_weights();
/** does initial filtering operations before main computation */
virtual void apply_pre_filtering(double dt);
/** sets up and solves kinetostat equations */
virtual void compute_kinetostat(double dt);
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs, double dt);
/** computes the nodal FE force applied by the kinetostat */
virtual void compute_nodal_lambda_force(double dt);
/** apply any required corrections for localized kinetostats */
virtual void apply_localization_correction(const DENS_MAT & source,
DENS_MAT & nodalField,
double weight = 1.);
// data
/** restricted atomic displacements at the nodes */
DENS_MAN * nodalAtomicMassWeightedDisplacement_;
/** clone of FE displacement field */
DENS_MAN & nodalDisplacements_;
private:
// DO NOT define this
DisplacementGlc();
};
/**
* @class DisplacementGlcFiltered
* @brief Enforces GLC on time filtered atomic position based on FE displacement
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class DisplacementGlcFiltered
//--------------------------------------------------------
//--------------------------------------------------------
class DisplacementGlcFiltered : public DisplacementGlc {
public:
DisplacementGlcFiltered(Kinetostat * kinetostat);
virtual ~DisplacementGlcFiltered(){};
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
protected:
// methods
/** does initial filtering operations before main computation */
virtual void apply_pre_filtering(double dt);
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs, double dt);
/** computes the nodal FE force applied by the kinetostat */
virtual void compute_nodal_lambda_force(double dt);
// data
/** clone of FE nodal atomic displacement field */
DENS_MAN & nodalAtomicDisplacements_;
private:
// DO NOT define this
DisplacementGlcFiltered();
};
/**
* @class VelocityGlc
* @brief Enforces GLC on atomic velocity based on FE velocity
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class VelocityGlc
//--------------------------------------------------------
//--------------------------------------------------------
class VelocityGlc : public GlcKinetostat {
public:
VelocityGlc(Kinetostat * kinetostat);
virtual ~VelocityGlc(){};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
/** applies kinetostat to atoms */
virtual void apply_mid_predictor(double dt);
/** applies kinetostat to atoms */
virtual void apply_post_corrector(double dt);
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
/** determine if local shape function matrices are needed */
virtual bool use_local_shape_functions() const {return (!atomicRegulator_->use_lumped_lambda_solve()) && atomicRegulator_->use_localized_lambda();};
protected:
// methods
/** set weighting factor for in matrix Nhat^T * weights * Nhat */
virtual void set_weights();
/** does initial filtering operations before main computation */
virtual void apply_pre_filtering(double dt);
/** sets up and solves kinetostat equations */
virtual void compute_kinetostat(double dt);
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs, double dt);
/** computes the nodal FE force applied by the kinetostat */
virtual void compute_nodal_lambda_force(double dt);
/** apply any required corrections for localized kinetostats */
virtual void apply_localization_correction(const DENS_MAT & source,
DENS_MAT & nodalField,
double weight = 1.);
// data
/** restricted atomic displacements at the nodes */
DENS_MAN * nodalAtomicMomentum_;
/** clone of FE velocity field */
DENS_MAN & nodalVelocities_;
private:
// DO NOT define this
VelocityGlc();
};
/**
* @class VelocityGlcFiltered
* @brief Enforces GLC on time filtered atomic velocity based on FE velocity
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class VelocityGlcFiltered
//--------------------------------------------------------
//--------------------------------------------------------
class VelocityGlcFiltered : public VelocityGlc {
public:
VelocityGlcFiltered(Kinetostat * kinetostat);
virtual ~VelocityGlcFiltered(){};
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
protected:
// methods
/** does initial filtering operations before main computation */
virtual void apply_pre_filtering(double dt);
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs, double dt);
/** computes the nodal FE force applied by the kinetostat */
virtual void compute_nodal_lambda_force(double dt);
// data
/** clone of FE nodal atomic velocity field */
DENS_MAN & nodalAtomicVelocities_;
private:
// DO NOT define this
VelocityGlcFiltered();
};
/**
* @class StressFlux
* @brief Enforces GLC on atomic forces based on FE stresses or accelerations
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class StressFlux
//--------------------------------------------------------
//--------------------------------------------------------
class StressFlux : public GlcKinetostat {
public:
StressFlux(Kinetostat * kinetostat);
virtual ~StressFlux();
/** instantiate all needed data */
virtual void construct_transfers();
/** applies kinetostat to atoms in the mid-predictor phase */
virtual void apply_mid_predictor(double dt);
/** applies kinetostat to atoms in the post-corrector phase */
virtual void apply_post_corrector(double dt);
/** compute boundary flux, requires thermostat input since it is part of the coupling scheme */
virtual void compute_boundary_flux(FIELDS & fields);
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
/** sets filtered ghost force to prescribed value */
void reset_filtered_ghost_force(DENS_MAT & targetForce);
/** returns reference to filtered ghost force */
DENS_MAN & filtered_ghost_force() {return nodalGhostForceFiltered_;};
/** determine if local shape function matrices are needed */
virtual bool use_local_shape_functions() const {return ((!atomicRegulator_->use_lumped_lambda_solve()) && atomicRegulator_->use_localized_lambda());};
protected:
// data
/** nodal force */
DENS_MAN & nodalForce_;
/** nodal force due to atoms */
DENS_MAN * nodalAtomicForce_;
/** nodal ghost force */
AtfShapeFunctionRestriction * nodalGhostForce_;
/** filtered ghost force */
DENS_MAN nodalGhostForceFiltered_;
/** reference to ATC sources coming from prescribed data, AtC coupling, and extrinsic coupling */
DENS_MAN & momentumSource_;
// methods
/** does initial filtering operations before main computation */
virtual void apply_pre_filtering(double dt);
/** sets up and solves kinetostat equations */
virtual void compute_kinetostat(double dt);
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs, double dt);
/** computes the nodal FE force applied by the kinetostat */
virtual void compute_nodal_lambda_force(double dt);
/** apply forces to atoms */
virtual void apply_to_atoms(PerAtomQuantity<double> * atomVelocities,
const DENS_MAT & lambdaForce,
double dt);
/** adds in finite element rhs contributions */
virtual void add_to_rhs(FIELDS & rhs);
// workspace
DENS_MAT _deltaVelocity_; // change in velocity during time integration
private:
// DO NOT define this
StressFlux();
};
/**
* @class StressFluxGhost
* @brief Enforces GLC on atomic forces based on FE stresses or accelerations, using
* the ghost forces to prescribe the FE boundary stress
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class StressFluxGhost
//--------------------------------------------------------
//--------------------------------------------------------
class StressFluxGhost : public StressFlux {
public:
StressFluxGhost(Kinetostat * kinetostat);
virtual ~StressFluxGhost() {};
/** instantiate all needed data */
virtual void construct_transfers();
/** compute boundary flux, requires kinetostat input since it is part of the coupling scheme */
virtual void compute_boundary_flux(FIELDS & fields);
protected:
// methods
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs, double dt);
/** adds in finite element rhs contributions */
virtual void add_to_rhs(FIELDS & rhs);
private:
// DO NOT define this
StressFluxGhost();
};
/**
* @class StressFluxFiltered
* @brief Enforces GLC on time filtered atomic forces based on FE stresses or accelerations
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class StressFluxFiltered
//--------------------------------------------------------
//--------------------------------------------------------
class StressFluxFiltered : public StressFlux {
public:
StressFluxFiltered(Kinetostat * kinetostat);
virtual ~StressFluxFiltered(){};
/** adds in finite element rhs contributions */
virtual void add_to_rhs(FIELDS & rhs);
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
protected:
// data
DENS_MAN & nodalAtomicVelocity_;
// methods
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs, double dt);
/** apply forces to atoms */
virtual void apply_to_atoms(PerAtomQuantity<double> * quantity,
const DENS_MAT & lambdaAtom,
double dt);
private:
// DO NOT define this
StressFluxFiltered();
};
/**
* @class KinetostatGlcFs
* @brief Base class for implementation of kinetostat algorithms based on Gaussian least constraints (GLC)
* when fractional step time integration is used
*/
class KinetostatGlcFs : public KinetostatShapeFunction {
public:
KinetostatGlcFs(Kinetostat *kinetostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~KinetostatGlcFs(){};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
/** applies thermostat to atoms in the predictor phase */
virtual void apply_pre_predictor(double dt);
/** applies thermostat to atoms in the post-corrector phase */
virtual void apply_post_corrector(double dt);
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
protected:
// methods
/** determine mapping from all nodes to those to which the kinetostat applies */
void compute_rhs_map();
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs,
double dt) = 0;
/** apply forces to atoms */
virtual void apply_to_atoms(PerAtomQuantity<double> * atomicVelocity,
const DENS_MAN * nodalAtomicEnergy,
const DENS_MAT & lambdaForce,
DENS_MAT & nodalAtomicLambdaPower,
double dt);
/** add contributions from kinetostat to FE energy */
virtual void add_to_momentum(const DENS_MAT & nodalLambdaForce,
DENS_MAT & deltaMomemtum,
double dt) = 0;
/* sets up and solves the linear system for lambda */
virtual void compute_lambda(double dt);
/** sets up the transfer which is the set of nodes being regulated */
virtual void construct_regulated_nodes() = 0;
// member data
/** reference to AtC FE velocity */
DENS_MAN & velocity_;
/** nodal atomic momentum */
DENS_MAN * nodalAtomicMomentum_;
/** right-hand side data for thermostat equation */
DENS_MAT rhs_;
/** mapping from all to regulated nodes */
DENS_MAT rhsMap_;
// workspace
DENS_MAT _lambdaForceOutput_; // force applied by lambda in output format
DENS_MAT _velocityDelta_; // change in velocity when lambda force is applied
DENS_MAT _deltaMomentum_; // FE velocity change from kinetostat
private:
// DO NOT define this
KinetostatGlcFs();
};
/**
* @class KinetostatFlux
* @brief Implementation of kinetostat algorithms based on Gaussian least constraints (GLC)
* which apply stresses when fractional step time integration is used
*/
class KinetostatFlux : public KinetostatGlcFs {
public:
KinetostatFlux(Kinetostat *kinetostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~KinetostatFlux(){};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
/** applies thermostat to atoms in the predictor phase */
virtual void apply_pre_predictor(double dt);
/** applies thermostat to atoms in the post-corrector phase */
virtual void apply_post_corrector(double dt);
/** enables resetting of filtered ghost force */
void reset_filtered_ghost_force(DENS_MAT & target);
protected:
// methods
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs,
double dt);
/** add contributions from kinetostat to FE energy */
virtual void add_to_momentum(const DENS_MAT & nodalLambdaForce,
DENS_MAT & deltaMomemtum,
double dt);
/** sets up the transfer which is the set of nodes being regulated */
virtual void construct_regulated_nodes();
// member data
/** reference to ATC sources coming from prescribed data, AtC coupling, and extrinsic coupling */
DENS_MAN & momentumSource_;
/** force from ghost atoms restricted to nodes */
DENS_MAN * nodalGhostForce_;
/** filtered nodal ghost force */
DENS_MAN * nodalGhostForceFiltered_;
private:
// DO NOT define this
KinetostatFlux();
};
/**
* @class KinetostatFluxGhost
* @brief Implements ghost-atom boundary flux and other loads for fractional-step based kinetostats
*/
class KinetostatFluxGhost : public KinetostatFlux {
public:
KinetostatFluxGhost(Kinetostat *kinetostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~KinetostatFluxGhost(){};
/** instantiate all needed data */
virtual void construct_transfers();
/** compute boundary flux */
virtual void compute_boundary_flux(FIELDS & fields);
protected:
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs,
double dt);
/** add contributions from kinetostat to FE energy */
virtual void add_to_momentum(const DENS_MAT & nodalLambdaForce,
DENS_MAT & deltaMomemtum,
double dt);
private:
// DO NOT define this
KinetostatFluxGhost();
};
/**
* @class KinetostatFixed
* @brief Implementation of kinetostat algorithms based on Gaussian least constraints (GLC)
* which perform Hoover coupling when fractional step time integration is used
*/
class KinetostatFixed : public KinetostatGlcFs {
public:
KinetostatFixed(Kinetostat *kinetostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~KinetostatFixed(){};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
/** applies thermostat to atoms in the predictor phase */
virtual void apply_pre_predictor(double dt);
/** applies thermostat to atoms in the post-corrector phase */
virtual void apply_post_corrector(double dt);
/** determine if local shape function matrices are needed */
virtual bool use_local_shape_functions() const {return atomicRegulator_->use_localized_lambda();};
protected:
// methods
/** initialize data for tracking the change in nodal atomic velocity */
virtual void initialize_delta_nodal_atomic_momentum(double dt);
/** compute the change in nodal atomic velocity */
virtual void compute_delta_nodal_atomic_momentum(double dt);
/** sets up appropriate rhs for kinetostat equations */
virtual void set_kinetostat_rhs(DENS_MAT & rhs,
double dt);
/** add contributions from kinetostat to FE energy */
virtual void add_to_momentum(const DENS_MAT & nodalLambdaForce,
DENS_MAT & deltaMomemtum,
double dt);
/* sets up and solves the linear system for lambda */
virtual void compute_lambda(double dt);
/** flag for halving the applied force to mitigate numerical errors */
bool halve_force();
/** sets up the transfer which is the set of nodes being regulated */
virtual void construct_regulated_nodes();
// member data
/** MD mass matrix */
DIAG_MAN & mdMassMatrix_;
/** change in FE momentum over a timestep */
DENS_MAT deltaFeMomentum_;
/** initial FE momentum used to compute change */
DENS_MAT initialFeMomentum_;
/** change in restricted atomic FE momentum over a timestep */
DENS_MAT deltaNodalAtomicMomentum_;
/** intial restricted atomic FE momentum used to compute change */
DENS_MAT initialNodalAtomicMomentum_;
/** filtered nodal atomic momentum */
DENS_MAN nodalAtomicMomentumFiltered_;
/** hack to determine if first timestep has been passed */
bool isFirstTimestep_;
private:
// DO NOT define this
KinetostatFixed();
};
}
#endif
diff --git a/lib/atc/LammpsInterface.cpp b/lib/atc/LammpsInterface.cpp
index 4d85d0ebc..b9b1aa8d3 100644
--- a/lib/atc/LammpsInterface.cpp
+++ b/lib/atc/LammpsInterface.cpp
@@ -1,1511 +1,1523 @@
// Header file for this class
#include "LammpsInterface.h"
// LAMMPS includes
#include "lammps.h"
#include "atom.h" // x, v, f
#include "atom_vec.h" //for insertion
#include "domain.h" // for basing locations on regions
#include "region.h" // region bounding box and style
#include "force.h" // boltzman constant
#include "group.h" // atom masks
#include "memory.h" // grow atom information
#include "compute.h" // computes
#include "compute_pe_atom.h" // computes potential energy per atom
#include "compute_stress_atom.h" // computes stress per atom
#include "compute_centro_atom.h" // computes centrosymmetry per atom
#include "compute_cna_atom.h" // computes common-neighbor-analysis per atom
#include "compute_coord_atom.h" // computes coordination number per atom
#include "compute_ke_atom.h" // computes kinetic energy per atom
#include "modify.h" //
#include "neighbor.h" // neighbors
#include "neigh_list.h" // neighbor list
#include "update.h" // timestepping information
#include "pair.h" // pair potentials
-
#include "MANYBODY/pair_eam.h" // pair potentials
#include "lattice.h" // lattice parameters
#include "bond.h" // bond potentials
#include "comm.h" //
#include "fix.h"
// ATC includes
#include "ATC_Error.h"
#include "MatrixLibrary.h"
#include "Utility.h"
using ATC_Utility::to_string;
// Other include files
#include "mpi.h"
#include <cstring>
#include <map>
#include <typeinfo>
+using std::max;
+using std::stringstream;
+using std::copy;
+using std::map;
+using std::pair;
+using std::string;
+using std::set;
+using LAMMPS_NS::bigint;
+
namespace ATC {
const static double PI = 3.141592653589793238;
const static int seed_ = 3141592;
const static int MAX_GROUP_BIT = 2147483647; //4294967295; // pow(2,31)-1;
double norm(double * v) {return sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); }
LammpsInterface * LammpsInterface::myInstance_ = NULL;
// -----------------------------------------------------------------
// instance()
// -----------------------------------------------------------------
LammpsInterface * LammpsInterface::instance()
{
if (myInstance_ == NULL) {
myInstance_ = new LammpsInterface();
}
return myInstance_;
}
// -----------------------------------------------------------------
// Destroy()
// -----------------------------------------------------------------
void LammpsInterface::Destroy()
{
if (myInstance_) delete myInstance_;
myInstance_ = NULL;
}
// -----------------------------------------------------------------
// constructor
// -----------------------------------------------------------------
LammpsInterface::LammpsInterface()
: lammps_(NULL),
fixPointer_(NULL),
commRank_(0),
atomPE_(NULL),
refBoxIsSet_(false),
random_(NULL),
globalrandom_(NULL)
{
}
// -----------------------------------------------------------------
// general interface methods
// -----------------------------------------------------------------
MPI_Comm LammpsInterface::world() const { return lammps_->world; }
void LammpsInterface::set_fix_pointer(LAMMPS_NS::Fix * thisFix) { fixPointer_ = thisFix; }
void LammpsInterface::forward_comm_fix() const { lammps_->comm->forward_comm_fix(fixPointer_); }
void LammpsInterface::comm_borders() const { lammps_->comm->borders(); }
#ifndef ISOLATE_FE
void LammpsInterface::sparse_allsum(SparseMatrix<double> &toShare) const
{
toShare.compress();
// initialize MPI information
int nProcs;
int myRank;
MPI_Comm_size(MPI_COMM_WORLD, &nProcs);
MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
int error;
// get numbers of rows, columns, rowsCRS, and
// sizes (number of nonzero elements in matrix)
SparseMatInfo *recInfo = new SparseMatInfo[nProcs];
SparseMatInfo myInfo;
myInfo.rows = toShare.nRows();
myInfo.cols = toShare.nCols();
myInfo.rowsCRS = toShare.nRowsCRS();
myInfo.size = toShare.size();
error = MPI_Allgather(&myInfo, 4, MPI_INT,
recInfo, 4, MPI_INT, lammps_->world);
if (error != MPI_SUCCESS) throw ATC_Error("error in sparse_allsum_numrows "+to_string(error));
// adjust row sendcounts because recRowsCRS is off by one
int rowCounts[nProcs];
int sizeCounts[nProcs];
// set up total size of receive buffers for Allgatherv calls
int totalRowsCRS = 0;
int totalSize = 0;
// set up array of displacements for Allgatherv calls
int rowOffsets[nProcs];
rowOffsets[0] = 0;
int sizeOffsets[nProcs];
sizeOffsets[0] = 0;
for (int i = 0; i < nProcs; i++) {
// find the total number of entries to share in the mpi calls below
rowCounts[i] = recInfo[i].rowsCRS + 1;
sizeCounts[i] = recInfo[i].size;
totalRowsCRS += rowCounts[i];
totalSize += recInfo[i].size;
// these already have their 0th slot filled in
if (i == 0) continue;
rowOffsets[i] = rowOffsets[i-1] + rowCounts[i-1];
sizeOffsets[i] = sizeOffsets[i-1] + sizeCounts[i-1];
}
// get actual rows
INDEX *rec_ia = new INDEX[totalRowsCRS];
if (toShare.size() == 0) {
double dummy[0];
error = MPI_Allgatherv(dummy, 0, MPI_INT,
rec_ia, rowCounts, rowOffsets, MPI_INT, lammps_->world);
}
else
error = MPI_Allgatherv(toShare.rows(), rowCounts[myRank], MPI_INT,
rec_ia, rowCounts, rowOffsets, MPI_INT, lammps_->world);
if (error != MPI_SUCCESS)
throw ATC_Error("error in sparse_allsum_rowarray "+to_string(error));
// get actual cols
INDEX *rec_ja = new INDEX[totalSize];
error = MPI_Allgatherv(toShare.cols(), sizeCounts[myRank], MPI_INT,
rec_ja, sizeCounts, sizeOffsets, MPI_INT, lammps_->world);
if (error != MPI_SUCCESS)
throw ATC_Error("error in sparse_allsum_colarray "+to_string(error));
// get the array of values
double *rec_vals = new double[totalSize];
error = MPI_Allgatherv(toShare.ptr(), sizeCounts[myRank], MPI_DOUBLE,
rec_vals, sizeCounts, sizeOffsets, MPI_DOUBLE, lammps_->world);
if (error != MPI_SUCCESS)
throw ATC_Error("error in sparse_allsum_valarray "+to_string(error));
INDEX *rec_ia_proc;
INDEX *rec_ja_proc;
double *rec_vals_proc;
for (int i = 0; i < nProcs; i++) {
if (myRank != i) {
// deallocated when tempMat is deleted since it wraps them
rec_ia_proc = new INDEX[rowCounts[i]];
rec_ja_proc = new INDEX[sizeCounts[i]];
rec_vals_proc = new double[sizeCounts[i]];
// copy the data passed with MPI into the new spots
copy(rec_ia + rowOffsets[i],
rec_ia + rowOffsets[i] + rowCounts[i],
rec_ia_proc);
copy(rec_ja + sizeOffsets[i],
rec_ja + sizeOffsets[i] + sizeCounts[i],
rec_ja_proc);
copy(rec_vals + sizeOffsets[i],
rec_vals + sizeOffsets[i] + sizeCounts[i],
rec_vals_proc);
// Does anyone know why we have to declare tempMat here (as well as set it equal to
// something) to avoid segfaults? there are still segfaults, but they happen at a much
// later stage of the game now (and for less benchmarks overall).
SparseMatrix<double> tempMat =
SparseMatrix<double>(rec_ia_proc, rec_ja_proc, rec_vals_proc,
recInfo[i].size, recInfo[i].rows,
recInfo[i].cols, recInfo[i].rowsCRS);
toShare += tempMat;
}
}
delete[] recInfo;
delete[] rec_ia;
delete[] rec_ja;
delete[] rec_vals;
}
#endif
// -----------------------------------------------------------------
// atom interface methods
// -----------------------------------------------------------------
string LammpsInterface::fix_id() const { return string(fixPointer_->id); }
int LammpsInterface::nlocal() const { return lammps_->atom->nlocal; }
int LammpsInterface::nghost() const { return lammps_->atom->nghost; }
bool LammpsInterface::atoms_sorted() const
{
int sortfreq = lammps_->atom->sortfreq;
if (sortfreq > 0) { return true; }
else { return false;
}
}
bigint LammpsInterface::natoms() const { return lammps_->atom->natoms; }
int LammpsInterface::nmax() const { return lammps_->atom->nmax; }
int LammpsInterface::ntypes() const { return lammps_->atom->ntypes; }
double ** LammpsInterface::xatom() const { return lammps_->atom->x; }
int LammpsInterface::type_to_charge(int atype) const {
double *q = lammps_->atom->q;
if (! q) return 0;
int nlocal = lammps_->atom->nlocal;
int *type = lammps_->atom->type;
double aq = 0.0;
for (int i = 0; i < nlocal; i++) {
if (type[i] == atype) {
aq = q[i];
break;
}
}
double pcharge;
MPI_Allreduce(&aq,&pcharge,1,MPI_DOUBLE,MPI_MAX,world());
double ncharge;
MPI_Allreduce(&aq,&ncharge,1,MPI_DOUBLE,MPI_MIN,world());
double charge = (pcharge == 0.0) ? ncharge : pcharge;
return charge;
}
//const double ** LammpsInterface::xatom() const { return (const double**)(lammps_->atom->x); }
double ** LammpsInterface::vatom() const { return lammps_->atom->v; }
double ** LammpsInterface::fatom() const { return lammps_->atom->f; }
const int * LammpsInterface::atom_mask() const { return (const int*)lammps_->atom->mask; }
+int * LammpsInterface::atom_mask() { return lammps_->atom->mask; }
+
int * LammpsInterface::atom_type() const { return lammps_->atom->type; }
int * LammpsInterface::atom_tag() const { return lammps_->atom->tag; }
int * LammpsInterface::atom_to_molecule() const { return lammps_->atom->molecule; }
int * LammpsInterface::num_bond() const { return lammps_->atom->num_bond; }
int ** LammpsInterface::bond_atom() const { return lammps_->atom->bond_atom; }
int * LammpsInterface::image() const { return lammps_->atom->image; }
int LammpsInterface::bond_per_atom() const { return lammps_->atom->bond_per_atom; }
int LammpsInterface::newton_bond() const { return lammps_->force->newton_bond; }
int LammpsInterface::local_to_global_map(int global) const { return lammps_->atom->map(global); }
double * LammpsInterface::atom_mass() const { return lammps_->atom->mass; }
double LammpsInterface::atom_mass(int iType) const { return lammps_->atom->mass[iType]; }
double * LammpsInterface::atom_rmass() const { return lammps_->atom->rmass; }
double * LammpsInterface::atom_charge() const { return lammps_->atom->q; }
double * LammpsInterface::atom_scalar(FundamentalAtomQuantity quantityType) const
{
if (quantityType==ATOM_MASS) {
if (atom_mass())
throw ATC_Error("Atom mass array requested but not defined");
return atom_rmass();
}
else if (quantityType==ATOM_CHARGE) {
double * atomCharge = atom_charge();
if (!atomCharge)
throw ATC_Error("Atom charge array requested but not defined");
return atomCharge;
}
else
throw ATC_Error("BAD type requested in atom_scalar");
return NULL;
}
double ** LammpsInterface::atom_vector(FundamentalAtomQuantity quantityType) const
{
if (quantityType==ATOM_POSITION)
return xatom();
else if (quantityType==ATOM_VELOCITY)
return vatom();
else if (quantityType==ATOM_FORCE)
return fatom();
else
throw ATC_Error("BAD type requested in atom_vector");
return NULL;
}
int LammpsInterface::atom_quantity_ndof(FundamentalAtomQuantity quantityType) const
{
if (quantityType==ATOM_MASS || quantityType==ATOM_CHARGE)
return 1;
else if (quantityType==ATOM_POSITION || quantityType==ATOM_VELOCITY || quantityType==ATOM_FORCE)
return dimension();
else
throw ATC_Error("BAD type requested in atom_quantity_ndof");
}
double LammpsInterface::atom_quantity_conversion(FundamentalAtomQuantity quantityType) const
{
if (quantityType==ATOM_MASS || quantityType==ATOM_CHARGE || quantityType==ATOM_POSITION || quantityType==ATOM_VELOCITY)
return 1;
else if ( quantityType==ATOM_FORCE)
return ftm2v();
else
throw ATC_Error("BAD type requested in atom_quantity_conversion");
}
// -----------------------------------------------------------------
// domain interface methods
// -----------------------------------------------------------------
int LammpsInterface::dimension() const { return lammps_->domain->dimension; }
int LammpsInterface::nregion() const { return lammps_->domain->nregion; }
void LammpsInterface::box_bounds(double & boxxlo, double & boxxhi,
double & boxylo, double & boxyhi,
double & boxzlo, double &boxzhi) const
{
if (lammps_->domain->triclinic == 0) {
boxxlo = lammps_->domain->boxlo[0];
boxxhi = lammps_->domain->boxhi[0];
boxylo = lammps_->domain->boxlo[1];
boxyhi = lammps_->domain->boxhi[1];
boxzlo = lammps_->domain->boxlo[2];
boxzhi = lammps_->domain->boxhi[2];
}
else {
boxxlo = lammps_->domain->boxlo_bound[0];
boxxhi = lammps_->domain->boxhi_bound[0];
boxylo = lammps_->domain->boxlo_bound[1];
boxyhi = lammps_->domain->boxhi_bound[1];
boxzlo = lammps_->domain->boxlo_bound[2];
boxzhi = lammps_->domain->boxhi_bound[2];
}
}
bool LammpsInterface::in_box(double * x) const
{
double xlo,xhi,ylo,yhi,zlo,zhi;
box_bounds(xlo,xhi,ylo,yhi,zlo,zhi);
if (x[0] >= xlo && x[0] < xhi &&
x[1] >= ylo && x[1] < yhi &&
x[2] >= zlo && x[2] < zhi)
return true;
return false;
}
bool LammpsInterface::in_my_processor_box(double * x) const
{
if (x[0] >= lammps_->domain->sublo[0] && x[0] < lammps_->domain->subhi[0] &&
x[1] >= lammps_->domain->sublo[1] && x[1] < lammps_->domain->subhi[1] &&
x[2] >= lammps_->domain->sublo[2] && x[2] < lammps_->domain->subhi[2])
return true;
if (! in_box(x))
throw ATC_Error("point is in no processors box");
return false;
}
void LammpsInterface::sub_bounds(double & subxlo, double & subxhi,
double & subylo, double & subyhi,
double & subzlo, double & subzhi) const
{
if (lammps_->domain->triclinic == 0) {
subxlo = lammps_->domain->sublo[0];
subxhi = lammps_->domain->subhi[0];
subylo = lammps_->domain->sublo[1];
subyhi = lammps_->domain->subhi[1];
subzlo = lammps_->domain->sublo[2];
subzhi = lammps_->domain->subhi[2];
}
else {
ATC_Error("Subboxes not accurate when triclinic != 0.");
}
}
int LammpsInterface::xperiodic() const { return lammps_->domain->xperiodic; }
int LammpsInterface::yperiodic() const { return lammps_->domain->yperiodic; }
int LammpsInterface::zperiodic() const { return lammps_->domain->zperiodic; }
int LammpsInterface::nperiodic() const
{
int nprd = 0;
if ( lammps_->domain->xperiodic > 0 ) { nprd++ ; }
if ( lammps_->domain->yperiodic > 0 ) { nprd++ ; }
if ( lammps_->domain->zperiodic > 0 ) { nprd++ ; }
return nprd;
}
// correct posistions for periodic box
void LammpsInterface::periodicity_correction(double * x) const
{
int* periodicity = lammps_->domain->periodicity;
if (!refBoxIsSet_) set_reference_box();
for (int m = 0; m < 3; m++) {
if ((bool) periodicity[m]) {
if (x[m] < lower_[m] || x[m] > upper_[m]) {
x[m] -= length_[m]*floor((x[m]-lower_[m])/length_[m]);
}
if (x[m] < lower_[m] || x[m] > upper_[m]) {
throw ATC_Error("periodicity_correction: still out of box bounds");
}
}
}
}
void LammpsInterface::set_reference_box(void) const
{
double * hi = lammps_->domain->boxhi;
double * lo = lammps_->domain->boxlo;
double * len = lammps_->domain->prd;
for (int i = 0; i < 3; i++) {
upper_[i] = hi[i];
lower_[i] = lo[i];
length_[i] = len[i];
}
refBoxIsSet_ = true;
}
double LammpsInterface::domain_xprd() const { return lammps_->domain->xprd; }
double LammpsInterface::domain_yprd() const { return lammps_->domain->yprd; }
double LammpsInterface::domain_zprd() const { return lammps_->domain->zprd; }
double LammpsInterface::domain_volume() const
{
return (lammps_->domain->xprd)*
(lammps_->domain->yprd)*
(lammps_->domain->zprd);
}
double LammpsInterface::domain_xy() const { return lammps_->domain->xy; }
double LammpsInterface::domain_xz() const { return lammps_->domain->xz; }
double LammpsInterface::domain_yz() const { return lammps_->domain->yz; }
int LammpsInterface::domain_triclinic() const { return lammps_->domain->triclinic; }
void LammpsInterface::box_periodicity(int & xperiodic,
int & yperiodic,
int & zperiodic) const
{
xperiodic = lammps_->domain->xperiodic;
yperiodic = lammps_->domain->yperiodic;
zperiodic = lammps_->domain->zperiodic;
}
int LammpsInterface::region_id(const char * regionName) const {
int nregion = this->nregion();
for (int iregion = 0; iregion < nregion; iregion++) {
if (strcmp(regionName, region_name(iregion)) == 0) {
return iregion;
}
}
throw ATC_Error("Region has not been defined");
return -1;
}
bool LammpsInterface::region_bounds(const char * regionName,
double & xmin, double & xmax,
double & ymin, double & ymax,
double & zmin, double & zmax,
double & xscale, double & yscale, double & zscale) const
{
int iRegion = region_id(regionName);
xscale = region_xscale(iRegion);
yscale = region_yscale(iRegion);
zscale = region_zscale(iRegion);
xmin = region_xlo(iRegion);
xmax = region_xhi(iRegion);
ymin = region_ylo(iRegion);
ymax = region_yhi(iRegion);
zmin = region_zlo(iRegion);
zmax = region_zhi(iRegion);
if (strcmp(region_style(iRegion),"block")==0) { return true; }
else { return false; }
}
void LammpsInterface::minimum_image(double & dx, double & dy, double & dz) const {
lammps_->domain->minimum_image(dx,dy,dz);
}
void LammpsInterface::closest_image(const double * const xi, const double * const xj, double * const xjImage) const {
lammps_->domain->closest_image(xi,xj,xjImage);
}
// -----------------------------------------------------------------
// update interface methods
// -----------------------------------------------------------------
LammpsInterface::UnitsType LammpsInterface::units_style(void) const
{
if (strcmp(lammps_->update->unit_style,"lj") == 0) return LJ;
else if (strcmp(lammps_->update->unit_style,"real") == 0) return REAL;
else if (strcmp(lammps_->update->unit_style,"metal") == 0) return METAL;
else return UNKNOWN;
}
double LammpsInterface::convert_units(double value, UnitsType in, UnitsType out, int massExp, int lenExp, int timeExp, int engExp) const
{
double ps2fs = 1.e3;
double eV2kcal = 23.069;
if (in==REAL) {
if (out==METAL) {
return value*pow(ps2fs,-timeExp)*pow(eV2kcal,-engExp);
}
else if (out==ATC) {
if (units_style()==REAL) {
return value;
}
else if (units_style()==METAL) {
return convert_units(value, METAL, out, massExp, lenExp, timeExp)*1.0;
}
}
else throw ATC_Error("can't convert");
}
else if (in==METAL) {
if (out==REAL) {
return value*pow(ps2fs,timeExp)*pow(eV2kcal,engExp);
}
else if (out==ATC) {
if (units_style()==REAL) {
return convert_units(value, REAL, out, massExp, lenExp, timeExp)*1.0;
}
else if (units_style()==METAL) {
return value;
}
}
else throw ATC_Error("can't convert");
}
else throw ATC_Error("can't convert");
return value;
}
// -----------------------------------------------------------------
// lattice interface methods
// -----------------------------------------------------------------
double LammpsInterface::xlattice() const { return lammps_->domain->lattice->xlattice; }
double LammpsInterface::ylattice() const { return lammps_->domain->lattice->ylattice; }
double LammpsInterface::zlattice() const { return lammps_->domain->lattice->zlattice; }
LammpsInterface::LatticeType LammpsInterface::lattice_style() const
{
if (lammps_->domain->lattice)
return (LammpsInterface::LatticeType)lammps_->domain->lattice->style;
else
throw ATC_Error("Lattice has not been defined");
}
//* retuns the number of basis vectors
int LammpsInterface::n_basis() const
{
return lammps_->domain->lattice->nbasis;
}
//* returns the basis vectors, transformed to the box coords
void LammpsInterface::basis_vectors(double **basis) const
{
LAMMPS_NS::Lattice *lattice = lammps_->domain->lattice;
int i,j;
double origin[3] = {0.0, 0.0, 0.0};
lattice->lattice2box(origin[0], origin[1], origin[2]);
for (i=0; i<n_basis(); i++)
{
memcpy(basis[i],lattice->basis[i],3*sizeof(double));
lattice->lattice2box(basis[i][0], basis[i][1], basis[i][2]);
for (j=0; j<3; j++) basis[i][j] -= origin[j];
}
}
//* gets the (max) lattice constant
double LammpsInterface::max_lattice_constant(void) const
{
double a1[3], a2[3], a3[3];
unit_cell(a1,a2,a3);
double a = norm(a1);
a = max(a,norm(a2));
a = max(a,norm(a3));
return a;
}
//* computes a cutoff distance halfway between 1st and 2nd nearest neighbors
double LammpsInterface::near_neighbor_cutoff(void) const
{
double cutoff;
double alat = LammpsInterface::max_lattice_constant();
LatticeType type = lattice_style();
if (type == LammpsInterface::SC) {
cutoff = 0.5*(1.0+sqrt(2.0))*alat;
} else if (type == LammpsInterface::BCC) {
cutoff = 0.5*(0.5*sqrt(3.0)+1.0)*alat;
} else if (type == LammpsInterface::FCC) {
cutoff = 0.5*(1.0/sqrt(2.0)+1.0)*alat;
} else if (type == LammpsInterface::HCP) {
cutoff = 0.5*(1.0/sqrt(2.0)+1.0)*alat;
} else if (type == LammpsInterface::DIAMOND) {
cutoff = 0.5*(0.25*sqrt(3.0)+1.0/sqrt(2.0))*alat;
} else if (type == LammpsInterface::SQ) {
cutoff = 0.5*(1.0+sqrt(2.0))*alat;
} else if (type == LammpsInterface::SQ2) {
cutoff = 0.5*(1.0/sqrt(2.0)+1.0)*alat;
} else if (type == LammpsInterface::HEX) {
cutoff = 0.5*(1.0/sqrt(3.0)+1.0)*alat;
} else {
throw ATC_Error("Unknown lattice type");
}
return cutoff;
}
//* gets the unit cell vectors
void LammpsInterface::unit_cell(double *a1, double *a2, double *a3) const
{
int i, j;
double *a[3] = {a1,a2,a3};
double origin[3] = {0.0,0.0,0.0};
LAMMPS_NS::Lattice *lattice = lammps_->domain->lattice;
// transform origin
lattice->lattice2box(origin[0], origin[1], origin[2]);
// copy reference lattice vectors
memcpy(a[0], lattice->a1, 3*sizeof(double));
memcpy(a[1], lattice->a2, 3*sizeof(double));
memcpy(a[2], lattice->a3, 3*sizeof(double));
for (i=0; i<3; i++)
{
lattice->lattice2box(a[i][0], a[i][1], a[i][2]);
for (j=0; j<3; j++) a[i][j] -= origin[j];
}
}
//* gets number of atoms in a unit cell
int LammpsInterface::num_atoms_per_cell(void) const
{
int naCell = 0;
LatticeType type = lattice_style();
if (type == LammpsInterface::SC) naCell = 1;
else if (type == LammpsInterface::BCC) naCell = 2;
else if (type == LammpsInterface::FCC) naCell = 4;
else if (type == LammpsInterface::DIAMOND) naCell = 8;
else if (comm_rank()==0) {
//{throw ATC_Error("lattice style not currently supported by ATC");}
print_msg_once("WARNING: Cannot get number of atoms per cell from lattice");
naCell = 1;
}
return naCell;
}
//* gets tributary volume for an atom
double LammpsInterface::volume_per_atom(void) const
{
double naCell = num_atoms_per_cell();
double volPerAtom =
xlattice() * ylattice() * zlattice() / naCell;
return volPerAtom;
}
//* gets lattice basis
void LammpsInterface::lattice(MATRIX &N, MATRIX &B) const
{
int nbasis = n_basis();
double **basis = new double*[nbasis];
N.reset(3,3);
B.reset(3,nbasis);
for (int i=0; i<nbasis; i++) basis[i] = column(B,i).ptr();
basis_vectors(basis);
unit_cell(column(N,0).ptr(),
column(N,1).ptr(),
column(N,2).ptr());
delete [] basis;
}
// -----------------------------------------------------------------
// force interface methods
// -----------------------------------------------------------------
double LammpsInterface::boltz() const{ return lammps_->force->boltz; }
double LammpsInterface::mvv2e() const{ return lammps_->force->mvv2e; }
double LammpsInterface::ftm2v()const { return lammps_->force->ftm2v; }
double LammpsInterface::nktv2p()const{ return lammps_->force->nktv2p; }
double LammpsInterface::qqr2e() const{ return lammps_->force->qqr2e; }
double LammpsInterface::qe2f() const{ return lammps_->force->qe2f; }
double LammpsInterface::dielectric()const{return lammps_->force->dielectric; }
double LammpsInterface::qqrd2e()const{ return lammps_->force->qqrd2e; }
double LammpsInterface::qv2e() const{ return qe2f()*ftm2v(); }
double LammpsInterface::pair_force(int i, int j, double rsq,
double & fmag_over_rmag) const
{
int itype = (lammps_->atom->type)[i];
int jtype = (lammps_->atom->type)[j];
// return value is the energy
if (rsq < (lammps_->force->pair->cutsq)[itype][jtype]) {
return lammps_->force->pair->single(i,j,itype,jtype,
rsq,1.0,1.0,fmag_over_rmag);
}
return 0.0;
}
double LammpsInterface::pair_force(int n, double rsq,
double & fmag_over_rmag) const
{
int i = bond_list_i(n);
int j = bond_list_j(n);
int type = bond_list_type(n);
// return value is the energy
return lammps_->force->bond->single(type,rsq,i,j,fmag_over_rmag);
}
double LammpsInterface::pair_force(
- map< pair< int,int >,int >::const_iterator itr, double rsq,
+ map< std::pair< int,int >,int >::const_iterator itr, double rsq,
double & fmag_over_rmag, int nbonds) const
{
int n = itr->second;
if (n < nbonds) {
return pair_force(n, rsq,fmag_over_rmag);
}
else {
- pair <int,int> ij = itr->first;
+ std::pair <int,int> ij = itr->first;
int i = ij.first;
int j = ij.second;
return pair_force(i,j, rsq,fmag_over_rmag);
}
}
double LammpsInterface::pair_force(
- pair< pair< int,int >,int > apair, double rsq,
+ std::pair< std::pair< int,int >,int > apair, double rsq,
double & fmag_over_rmag, int nbonds) const
{
int n = apair.second;
if (n < nbonds) {
return pair_force(n, rsq,fmag_over_rmag);
}
else {
- pair <int,int> ij = apair.first;
+ std::pair <int,int> ij = apair.first;
int i = ij.first;
int j = ij.second;
return pair_force(i,j, rsq,fmag_over_rmag);
}
}
double LammpsInterface::pair_cutoff() const
{
return lammps_->force->pair->cutforce;
}
void LammpsInterface::pair_reinit() const
{
lammps_->force->pair->reinit();
}
int LammpsInterface::single_enable() const
{
return lammps_->force->pair->single_enable; // all bonds have a single
}
//* insertion/deletion functions : see FixGCMC
//* delete atom
int LammpsInterface::delete_atom(int id) const
{
LAMMPS_NS::Atom * atom = lammps_->atom;
atom->avec->copy(atom->nlocal-1,id,1);
atom->nlocal--;
return atom->nlocal;
}
//* insert atom
int LammpsInterface::insert_atom(int atype, int amask,
double *ax, double *av, double aq) const
{
LAMMPS_NS::Atom * atom = lammps_->atom;
atom->avec->create_atom(atype,ax);
int m = atom->nlocal - 1;
atom->mask[m] = amask;
atom->v[m][0] = av[0];
atom->v[m][1] = av[1];
atom->v[m][2] = av[2];
if (aq != 0) atom->q[m] = aq;
int nfix = lammps_->modify->nfix;
LAMMPS_NS::Fix **fix = lammps_->modify->fix;
for (int j = 0; j < nfix; j++) {
if (fix[j]->create_attribute) fix[j]->set_arrays(m);
}
return m;
}
int LammpsInterface::reset_ghosts(int deln) const
{
LAMMPS_NS::Atom * atom = lammps_->atom;
//ATC::LammpsInterface::instance()->print_msg("reset_ghosts del n "+to_string(deln));
if (atom->tag_enable) {
atom->natoms += deln;
//ATC::LammpsInterface::instance()->print_msg("reset_ghosts natoms "+to_string(atom->natoms));
if (deln > 0) { atom->tag_extend(); }
if (atom->map_style) atom->map_init();
}
atom->nghost = 0;
lammps_->comm->borders();
//ATC::LammpsInterface::instance()->print_msg("reset_ghosts nghosts "+to_string(atom->nghost));
return atom->nghost;
}
//* energy for interactions within the shortrange cutoff
double LammpsInterface::shortrange_energy(double *coord,
int itype, int id, double max) const
{
LAMMPS_NS::Atom * atom = lammps_->atom;
double **x = atom->x;
int *type = atom->type;
int nall = atom->nlocal+ atom->nghost;
LAMMPS_NS::Pair *pair = lammps_->force->pair;
double **cutsq = lammps_->force->pair->cutsq;
double fpair = 0.0; // an output of single
double factor_coul = 1.0;
double factor_lj = 1.0;
double total_energy = 0.0;
for (int j = 0; j < nall; j++) {
if (id == j) continue;
// factor_lj = special_lj[sbmask(j)];
// factor_coul = special_coul[sbmask(j)];
//j &= NEIGHMASK;
double delx = coord[0] - x[j][0];
double dely = coord[1] - x[j][1];
double delz = coord[2] - x[j][2];
double rsq = delx*delx + dely*dely + delz*delz;
int jtype = type[j];
double cut2 = cutsq[itype][jtype];
if (rsq < cut2) {
total_energy += pair->single(id,j,itype,jtype,rsq,factor_coul,factor_lj,fpair); //id is for charge lookup
}
}
return total_energy;
}
double LammpsInterface::shortrange_energy(int id, double max) const
{
double *x = (lammps_->atom->x)[id];
int type = (lammps_->atom->type)[id];
return shortrange_energy(x,type,id,max);
}
POTENTIAL LammpsInterface::potential() const
{
// find pair style - FRAGILE
const int nStyles = 4;
string pairStyles[nStyles] = {"lj/cut",
"lj/cut/coul/long",
"lj/cut/coul/cut",
"lj/charmm/coul/long"};
LAMMPS_NS::Pair *pair = NULL;
for (int i = 0; i < nStyles; i++){
pair = lammps_->force->pair_match(pairStyles[i].c_str(),1);
if (pair != NULL) break;
}
return pair;
}
int LammpsInterface::type_to_groupbit(int itype) const
{
LAMMPS_NS::Atom * atom = lammps_->atom;
int groupbit = -1;
int *type = atom->type;
int *mask = atom->mask;
for (int i = 0; i < nlocal(); i++) {
if (type[i] == itype) {
groupbit = mask[i];
break;
}
}
return int_allmax(groupbit);
}
bool LammpsInterface::epsilons(int itype, POTENTIAL pair, double * epsilon0) const
{
// grab energy parameters
char * pair_parameter = new char[8];
strcpy(pair_parameter,"epsilon");
int dim = 2; // a return value for extract
double ** epsilons = (double**) ( pair->extract(pair_parameter,dim) );
delete [] pair_parameter;
if (epsilons == NULL) return false;
//if (epsilons == NULL) error->all(FLERR,"Fix concentration adapted pair style parameter not supported");
int i1,i2;
for (int i=1; i < ntypes()+1; i++) {
if (i < itype) { i1 = i; i2 = itype; }
else { i2 = i; i1 = itype; }
epsilon0[i-1] = epsilons[i1][i2];
}
return true;
}
bool LammpsInterface::set_epsilons(int itype, POTENTIAL pair, double * epsilon) const
{
// grab energy parameters
char * pair_parameter = new char[8];
strcpy(pair_parameter,"epsilon");
int dim = 2; // a return value for extract
double ** epsilons = (double**) ( pair->extract(pair_parameter,dim) );
delete [] pair_parameter;
if (epsilons == NULL) return false;
//if (epsilons == NULL) error->all(FLERR,"Fix concentration adapted pair style parameter not supported");
// scale interactions
int i1,i2;
for (int i = 1; i < ntypes()+1; i++) {
if (i < itype) { i1 = i; i2 = itype; }
else { i2 = i; i1 = itype; }
epsilons[i1][i2] = epsilon[i-1];
}
return true;
}
int LammpsInterface::set_charge(int itype, double charge) const
{
int nlocal = lammps_->atom->nlocal;
int *type = lammps_->atom->type;
double *q = lammps_->atom->q;
int count = 0;
for (int i = 0; i < nlocal; i++) {
if (type[i] == itype) {
q[i] = charge;
count++;
}
}
return count;
}
int LammpsInterface::change_type(int itype, int jtype) const
{
int nlocal = lammps_->atom->nlocal;
int *type = lammps_->atom->type;
int count = 0;
for (int i = 0; i < nlocal; i++) {
if (type[i] == itype) {
type[i] = jtype;
count++;
}
}
return count;
}
int LammpsInterface::count_type(int itype) const
{
int nlocal = lammps_->atom->nlocal;
int *type = lammps_->atom->type;
int count = 0;
for (int i = 0; i < nlocal; i++) {
if (type[i] == itype) { count++; }
}
return int_allsum(count);
}
// random number generators
RNG_POINTER LammpsInterface::random_number_generator() const {
RNG_POINTER p = new LAMMPS_NS::RanPark(lammps_,seed_);
return p;
}
double LammpsInterface::random_uniform(RNG_POINTER p) const {
return p->uniform();
}
double LammpsInterface::random_normal (RNG_POINTER p) const {
return p->gaussian();
}
int LammpsInterface::random_state (RNG_POINTER p) const {
return p->state();
}
void LammpsInterface::set_random_state (RNG_POINTER p, int seed) const {
return p->reset(seed);
}
void LammpsInterface::advance_random_generator (RNG_POINTER p, int n) const {
advance_random_uniform(p,n);
}
void LammpsInterface::advance_random_uniform (RNG_POINTER p, int n) const {
for (int i = 0; i < n; i++) p->uniform();
}
void LammpsInterface::advance_random_normal (RNG_POINTER p, int n) const {
for (int i = 0; i < n; i++) p->gaussian();
}
//* Boltzmann's constant in M,L,T,t units
double LammpsInterface::kBoltzmann() const {
return (lammps_->force->boltz)/(lammps_->force->mvv2e);
}
//* Planck's constant
double LammpsInterface::hbar() const {
const int UNITS_STYLE = (int) units_style();
double hbar = 1.0; // LJ: Dimensionless
if (UNITS_STYLE == 2) hbar = 15.1685792814; // Real: KCal/mol-fs
else if (UNITS_STYLE == 3) hbar = 0.000658212202469; // Metal: eV-ps
return hbar;
}
//* Dulong-Petit heat capacity
double LammpsInterface::heat_capacity() const {
double rhoCp = dimension()*kBoltzmann()/volume_per_atom();
return rhoCp;
}
//* reference mass density for a *unit cell*
// all that is needed is a unit cell: volume, types, mass per type
double LammpsInterface::mass_density(int* numPerType) const
{
const double *mass = lammps_->atom->mass;
if (!mass) throw ATC_Error("cannot compute a mass density: no mass");
const int ntypes = lammps_->atom->ntypes;
const int *mass_setflag = lammps_->atom->mass_setflag;
const int *type = lammps_->atom->type;
double naCell = num_atoms_per_cell();
double vol = volume_per_atom();
if (numPerType) {
double m = 0.0;
double n = 0;
for (int i = 0; i < ntypes; i++) {
m += numPerType[i]*mass[i+1];
n += numPerType[i];
}
if (n>naCell) throw ATC_Error("cannot compute a mass density: too many basis atoms");
return m/n/vol;
}
// since basis->type map not stored only monatomic lattices are automatic
// if not given a basis try to guess
else {
if (ntypes == 1) {
if ((this->natoms()==0) && mass_setflag[1]) {
return mass[1]/vol;
}
else {
if (type) return mass[type[0]]/vol;
else if (mass_setflag[1]) return mass[1]/vol;
}
}
}
throw ATC_Error("cannot compute a mass density");
return 0.0;
}
//* permittivity of free space
double LammpsInterface::epsilon0() const
{
return qe2f()/(4.*PI*qqr2e());
}
//* Coulomb's constant
double LammpsInterface::coulomb_constant() const
{
return qqr2e()/qe2f();
}
//* special coulombic interactions
double * LammpsInterface::special_coul() const
{
return lammps_->force->special_coul;
}
//* flag for newton
int LammpsInterface::newton_pair() const
{
return lammps_->force->newton_pair;
}
// -----------------------------------------------------------------
// group interface methods
// -----------------------------------------------------------------
int LammpsInterface::ngroup() const { return lammps_->group->ngroup; }
int LammpsInterface::group_bit(string name) const
{
return group_bit(group_index(name));
}
int LammpsInterface::group_bit(int iGroup) const
{
int mybit = 0;
mybit |= lammps_->group->bitmask[iGroup];
if (mybit < 0 || mybit > MAX_GROUP_BIT) {
string msg("LammpsInterface::group_bit() lammps group bit "+to_string(mybit)+" is out of range 0:"+to_string(MAX_GROUP_BIT));
throw ATC_Error(msg);
}
return mybit;
}
int LammpsInterface::group_index(string name) const
{
int igroup = lammps_->group->find(name.c_str());
if (igroup == -1) {
string msg("LammpsInterface::group_index() lammps group "+name+" does not exist");
throw ATC_Error(msg);
}
return igroup;
}
int LammpsInterface::group_inverse_mask(int iGroup) const
{
return lammps_->group->inversemask[iGroup];
}
char * LammpsInterface::group_name(int iGroup) const
{
return lammps_->group->names[iGroup];
}
void LammpsInterface::group_bounds(int iGroup, double * b) const
{
lammps_->group->bounds(iGroup, b);
}
// -----------------------------------------------------------------
// memory interface methods
// -----------------------------------------------------------------
double * LammpsInterface::create_1d_double_array(int length, const char *name) const {
double * myArray;
return lammps_->memory->create(myArray, length, name);
}
double *LammpsInterface::grow_1d_double_array(double *array,
int length,
const char *name) const
{
return lammps_->memory->grow(array, length, name);
}
void LammpsInterface::destroy_1d_double_array(double * d) const {
lammps_->memory->destroy(d);
}
double ** LammpsInterface::create_2d_double_array(int n1, int n2, const char *name) const {
double ** myArray;
return lammps_->memory->create(myArray, n1, n2, name);
}
void LammpsInterface::destroy_2d_double_array(double **d) const {
lammps_->memory->destroy(d);
}
double **LammpsInterface::grow_2d_double_array(double **array,
int n1,
int n2,
const char *name) const
{
return lammps_->memory->grow(array, n1, n2, name);
}
int * LammpsInterface::create_1d_int_array(int length, const char *name) const {
int * myArray;
return lammps_->memory->create(myArray, length, name);
}
int *LammpsInterface::grow_1d_int_array(int *array,
int length,
const char *name) const
{
return lammps_->memory->grow(array, length, name);
}
void LammpsInterface::destroy_1d_int_array(int * d) const {
lammps_->memory->destroy(d);
}
int ** LammpsInterface::create_2d_int_array(int n1, int n2, const char *name) const {
int ** myArray;
return lammps_->memory->create(myArray, n1, n2, name);
}
void LammpsInterface::destroy_2d_int_array(int **i) const {
lammps_->memory->destroy(i);
}
int ** LammpsInterface::grow_2d_int_array(int **array, int n1, int n2, const char *name) const {
return lammps_->memory->grow(array, n1, n2, name);
}
// -----------------------------------------------------------------
// update interface methods
// -----------------------------------------------------------------
double LammpsInterface::dt() const { return lammps_->update->dt; }
bigint LammpsInterface::ntimestep() const { return lammps_->update->ntimestep; }
int LammpsInterface::nsteps() const { return lammps_->update->nsteps; }
// -----------------------------------------------------------------
// neighbor list interface methods
// -----------------------------------------------------------------
int LammpsInterface::sbmask(int j) const {return j >> SBBITS & 3; }
void LammpsInterface::set_list(int id, LAMMPS_NS::NeighList *ptr) { list_ = ptr; }
int LammpsInterface::neighbor_list_inum() const { return list_->inum; }
int * LammpsInterface::neighbor_list_numneigh() const { return list_->numneigh; }
int * LammpsInterface::neighbor_list_ilist() const { return list_->ilist; }
int ** LammpsInterface::neighbor_list_firstneigh() const { return list_->firstneigh; }
int LammpsInterface::neighbor_ago() const { return lammps_->neighbor->ago; }
+int LammpsInterface::reneighbor_frequency() const {return lammps_->neighbor->every; }
+
// -----------------------------------------------------------------
// bond list interface methods
// -----------------------------------------------------------------
int LammpsInterface::bond_list_length() const { return lammps_->neighbor->nbondlist; }
int** LammpsInterface::bond_list() const { return lammps_->neighbor->bondlist; }
// -----------------------------------------------------------------
// region interface methods
// -----------------------------------------------------------------
char * LammpsInterface::region_name(int iRegion) const
{
return lammps_->domain->regions[iRegion]->id;
}
char * LammpsInterface::region_style(int iRegion) const
{
return lammps_->domain->regions[iRegion]->style;
}
double LammpsInterface::region_xlo(int iRegion) const
{
return lammps_->domain->regions[iRegion]->extent_xlo;
}
double LammpsInterface::region_xhi(int iRegion) const
{
return lammps_->domain->regions[iRegion]->extent_xhi;
}
double LammpsInterface::region_ylo(int iRegion) const
{
return lammps_->domain->regions[iRegion]->extent_ylo;
}
double LammpsInterface::region_yhi(int iRegion) const
{
return lammps_->domain->regions[iRegion]->extent_yhi;
}
double LammpsInterface::region_zlo(int iRegion) const
{
return lammps_->domain->regions[iRegion]->extent_zlo;
}
double LammpsInterface::region_zhi(int iRegion) const
{
return lammps_->domain->regions[iRegion]->extent_zhi;
}
double LammpsInterface::region_xscale(int iRegion) const
{
return lammps_->domain->regions[iRegion]->xscale;
}
double LammpsInterface::region_yscale(int iRegion) const
{
return lammps_->domain->regions[iRegion]->yscale;
}
double LammpsInterface::region_zscale(int iRegion) const
{
return lammps_->domain->regions[iRegion]->zscale;
}
int LammpsInterface::region_match(int iRegion, double x, double y, double z) const {
return lammps_->domain->regions[iRegion]->match(x,y,z);
}
// -----------------------------------------------------------------
// compute methods
// -----------------------------------------------------------------
COMPUTE_POINTER LammpsInterface::compute_pointer(string tag) const
{
// get the compute id
char * name = const_cast <char*> (tag.c_str());
int id = lammps_->modify->find_compute(name);
if (id < 0) {
string msg("Could not find compute "+tag);
msg += tag;
throw ATC_Error(msg);
}
// get the compute
LAMMPS_NS::Compute* cmpt = lammps_->modify->compute[id];
// insert it into our set, recall it won't be added if it already exists
computePointers_.insert(cmpt);
return cmpt;
}
void LammpsInterface::computes_addstep(int step) const
{
set<LAMMPS_NS::Compute * >::iterator iter;
for (iter = computePointers_.begin(); iter != computePointers_.end(); iter++) {
(*iter)->addstep(step);
}
}
void LammpsInterface::compute_addstep(COMPUTE_POINTER computePointer, int step) const
{
LAMMPS_NS::Compute* cmpt = const_to_active(computePointer);
cmpt->addstep(step);
}
int LammpsInterface::compute_matchstep(COMPUTE_POINTER computePointer, int step) const
{
LAMMPS_NS::Compute* cmpt = const_to_active(computePointer);
return cmpt->matchstep(step);
}
void LammpsInterface::reset_invoked_flag(COMPUTE_POINTER computePointer) const
{
LAMMPS_NS::Compute* cmpt = const_to_active(computePointer);
cmpt->invoked_flag = 0;
}
int LammpsInterface::compute_ncols_peratom(COMPUTE_POINTER computePointer) const
{
LAMMPS_NS::Compute* cmpt = const_to_active(computePointer);
int ndof = cmpt->size_peratom_cols;
if (ndof == 0 ) ndof = 1;
return ndof;
}
double* LammpsInterface::compute_vector_peratom(COMPUTE_POINTER computePointer) const
{
LAMMPS_NS::Compute* cmpt = const_to_active(computePointer);
if (!(cmpt->invoked_flag & INVOKED_PERATOM)) {
cmpt->compute_peratom();
cmpt->invoked_flag |= INVOKED_PERATOM;
}
return cmpt->vector_atom;
}
double** LammpsInterface::compute_array_peratom(COMPUTE_POINTER computePointer) const
{
LAMMPS_NS::Compute* cmpt = const_to_active(computePointer);
if (!(cmpt->invoked_flag & INVOKED_PERATOM)) {
cmpt->compute_peratom();
cmpt->invoked_flag |= INVOKED_PERATOM;
}
return cmpt->array_atom;
}
LAMMPS_NS::Compute * LammpsInterface::const_to_active(COMPUTE_POINTER computePointer) const
{
LAMMPS_NS::Compute* cmpt = const_cast<LAMMPS_NS::Compute* >(computePointer);
set<LAMMPS_NS::Compute * >::iterator cmptPtr;
cmptPtr = computePointers_.find(cmpt);
if (cmptPtr != computePointers_.end())
return *cmptPtr;
else
throw ATC_Error("Requested bad computer pointer");
}
// -----------------------------------------------------------------
// compute pe/atom interface methods
// - the only compute "owned" by ATC
// -----------------------------------------------------------------
int LammpsInterface::create_compute_pe_peratom(void) const
{
char **list = new char*[4];
string atomPeName = compute_pe_name();
list[0] = (char *) atomPeName.c_str();
list[1] = (char *) "all";
list[2] = (char *) "pe/atom";
list[3] = (char *) "pair";
int icompute = lammps_->modify->find_compute(list[0]);
if (icompute < 0) {
lammps_->modify->add_compute(4,list);
icompute = lammps_->modify->find_compute(list[0]);
}
delete [] list;
if (! atomPE_ ) {
atomPE_ = lammps_->modify->compute[icompute];
}
computePointers_.insert(atomPE_);
stringstream ss;
ss << "peratom PE compute created with ID: " << icompute;
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
return icompute;
}
double * LammpsInterface::compute_pe_peratom(void) const
{
if (atomPE_) {
atomPE_->compute_peratom();
return atomPE_->vector_atom;
}
else {
return NULL;
}
}
/* ---------------------------------------------------------------------- */
void LammpsInterface::unwrap_coordinates(int iatom, double* xatom) const
{
double **x = lammps_->atom->x;
int *image = lammps_->atom->image;
double *h = lammps_->domain->h;
double xprd = lammps_->domain->xprd;
double yprd = lammps_->domain->yprd;
double zprd = lammps_->domain->zprd;
int xbox,ybox,zbox;
// for triclinic, need to unwrap current atom coord via h matrix
if (lammps_->domain->triclinic == 0) {
xbox = (image[iatom] & 1023) - 512;
ybox = (image[iatom] >> 10 & 1023) - 512;
zbox = (image[iatom] >> 20) - 512;
xatom[0] = x[iatom][0] + xbox*xprd;
xatom[1] = x[iatom][1] + ybox*yprd;
xatom[2] = x[iatom][2] + zbox*zprd;
} else {
xbox = (image[iatom] & 1023) - 512;
ybox = (image[iatom] >> 10 & 1023) - 512;
zbox = (image[iatom] >> 20) - 512;
xatom[0] = x[iatom][0] + h[0]*xbox + h[5]*ybox + h[4]*zbox;
xatom[1] = x[iatom][1] + h[1]*ybox + h[3]*zbox;
xatom[2] = x[iatom][2] + h[2]*zbox;
}
}
/* ---------------------------------------------------------------------- */
LAMMPS_NS::PairEAM* LammpsInterface::pair_eam() const
{
//if (typeid(lammps_->force->pair) == typeid(LAMMPS_NS::PairEAM)) {
// return lammps_->force->pair;
//}
LAMMPS_NS::PairEAM* pair_eam = dynamic_cast<LAMMPS_NS::PairEAM*> (lammps_->force->pair);
if (pair_eam != NULL) {
return pair_eam;
}
else {
throw ATC_Error("LAMMPS Pair object is not of the derived class type PairEAM");
}
}
// -----------------------------------------------------------------
// other methods
// -----------------------------------------------------------------
/** Return lammps pointer -- only as a last resort! */
LAMMPS_NS::LAMMPS * LammpsInterface::lammps_pointer() const { return lammps_; }
}
diff --git a/lib/atc/LammpsInterface.h b/lib/atc/LammpsInterface.h
index 576ccf48e..bb7c0f482 100644
--- a/lib/atc/LammpsInterface.h
+++ b/lib/atc/LammpsInterface.h
@@ -1,723 +1,710 @@
#ifndef LAMMPS_INTERFACE_H
#define LAMMPS_INTERFACE_H
#include <iostream>
-using std::flush;
#include <stdlib.h>
-using std::copy;
-using std::max;
#include <map>
-using std::map;
#include <iostream>
-using std::cout;
#include <string>
-using std::string;
#include <sstream>
-using std::stringstream;
+#include <utility>
#include "mpi.h"
-#include "../../src/lammps.h"
-#include "../../src/lmptype.h"
-#include "../../src/modify.h"
-#include "../../src/memory.h"
-
-#include "../../src/random_park.h"
+#include "lammps.h"
+#include "modify.h"
+#include "memory.h"
+#include "random_park.h"
typedef LAMMPS_NS::RanPark* RNG_POINTER;
-
-using LAMMPS_NS::bigint;
-//using LAMMPS_NS::NEIGHMASK;
-
-#include "../../src/compute.h"
+#include "lmptype.h"
+#include "compute.h"
typedef const LAMMPS_NS::Compute* COMPUTE_POINTER;
-
-#include "../../src/update.h"
-#include "../../src/min.h"
-
+#include "update.h"
+#include "min.h"
#include "ATC_Error.h"
#include "ATC_TypeDefs.h"
#include "MatrixDef.h"
-using namespace ATC_matrix;
-// must scope ATC_matrix
#include "MPI_Wrappers.h"
typedef LAMMPS_NS::Pair* POTENTIAL;
// Forward class declarations for LAMMPS_NS namespace
namespace LAMMPS_NS {
class LAMMPS;
class NeighList;
class Compute;
class ComputePEAtom;
class ComputeStressAtom;
class ComputeCentroAtom;
class ComputeCNAAtom;
class ComputeCoordAtom;
class ComputeKEAtom;
class Pair;
class PairEAM;
class Fix;
class RanPark;
}
namespace ATC {
-static const string atomPeNameBase_ = "atcPE";
+static const std::string atomPeNameBase_ = "atcPE";
static const double big_ = 1.e20;
/**
* @class LammpsInterface
* @brief Singleton class that handles all interfacing with the lammps code
*/
class LammpsInterface {
public:
// Enumeration of fundamental per-atom quantities, i.e. those defined directly by Lammps
enum FundamentalAtomQuantity {
ATOM_MASS = 0,
ATOM_CHARGE,
ATOM_POSITION,
ATOM_VELOCITY,
ATOM_FORCE,
NUM_FUNDAMENTAL_ATOM_QUANTITIES
};
// Enumeration for lattice type. this MUST match the enum in src/lattice.cpp
enum LatticeType {
NONE=0,
SC,
BCC,
FCC,
HCP,
DIAMOND,
SQ,
SQ2,
HEX,
CUSTOM
};
// Enumeration for units type. this is internal to ATC
enum UnitsType {
UNKNOWN=0,
ATC,
LJ,
REAL,
METAL,
SI
};
// Provides a struct for easily passing/recovering data about SparseMats
struct SparseMatInfo {
INDEX rows;
INDEX cols;
INDEX rowsCRS;
INDEX size;
};
/** Static instance of this class */
static LammpsInterface * instance();
/** Destroy */
static void Destroy();
/** Set lammps pointer */
void set_lammps(LAMMPS_NS::LAMMPS * lammps)
{
lammps_ = lammps;
MPI_Comm_rank(lammps_->world, & commRank_);
MPI_Comm_size(lammps_->world, & commSize_);
}
/** \name Methods that interface with lammps base class */
/*@{*/
// begin MPI --------------------------------------------------------------------
MPI_Comm world() const;
void broadcast(double * buf, int count = 1) const
{
MPI_Wrappers::broadcast(lammps_->world, buf, count);
}
void int_broadcast(int * buf, int count = 1) const
{
MPI_Wrappers::int_broadcast(lammps_->world, buf, count);
}
// send_buf is frequently a void* so MPI_IN_PLACE can be passed in
void allsum(void * send_buf, double * rec_buf, int count = 1) const
{
MPI_Wrappers::allsum(lammps_->world, send_buf, rec_buf, count);
}
void int_allsum(void * send_buf, int * rec_buf, int count = 1) const
{
MPI_Wrappers::int_allsum(lammps_->world, send_buf, rec_buf, count);
}
int int_allsum(int & i) const
{
int j = 0;
MPI_Wrappers::int_allsum(lammps_->world, &i, &j, 1);
return j;
}
int int_scansum(int & i) const
{
int j = 0;
MPI_Wrappers::int_scansum(lammps_->world, &i, &j, 1);
return j;
}
int int_allmax(int & i) const
{
int j = 0;
MPI_Wrappers::int_allmax(lammps_->world, &i, &j, 1);
return j;
}
int int_allmin(int & i) const
{
int j = 0;
MPI_Wrappers::int_allmin(lammps_->world, &i, &j, 1);
return j;
}
double allmin(double & i) const
{
double j = 0;
MPI_Wrappers::allmin(lammps_->world, &i, &j, 1);
return j;
}
void sparse_allsum(SparseMatrix<double> &toShare) const
#ifdef ISOLATE_FE
{
MPI_Wrappers::sparse_allsum(lammps_->world, toShare);
}
#else
;
#endif
void allmax(double * send_buf, double * rec_buf, int count = 1)
{
MPI_Wrappers::allmax(lammps_->world, send_buf, rec_buf, count);
}
void int_allmax(int * send_buf, int * rec_buf, int count = 1) const
{
MPI_Wrappers::int_allmax(lammps_->world, send_buf, rec_buf, count);
}
void allmin(double * send_buf, double * rec_buf, int count = 1) const
{
MPI_Wrappers::allmin(lammps_->world, send_buf, rec_buf, count);
}
void int_allmin(int * send_buf, int * rec_buf, int count = 1) const
{
MPI_Wrappers::int_allmin(lammps_->world, send_buf, rec_buf, count);
}
int rank_min(double * send_buf, double * rec_buf, int count = 1) const
{
return MPI_Wrappers::rank_min(lammps_->world, send_buf, rec_buf, count);
}
void int_recv(int * recv_buf, int max_size, int iproc) const
{
MPI_Wrappers::int_recv(lammps_->world, recv_buf, max_size, iproc);
}
void recv(double * recv_buf, int max_size, int iproc) const
{
MPI_Wrappers::recv(lammps_->world, recv_buf, max_size, iproc);
}
void int_send(int * send_buf, int send_size) const
{
MPI_Wrappers::int_send(lammps_->world, send_buf, send_size);
}
void send(double * send_buf, int send_size) const
{
MPI_Wrappers::send(lammps_->world, send_buf, send_size);
}
void allgatherv(double * send_buf, int send_count,
double * rec_buf, int * rec_counts, int * displacements) const
{
MPI_Wrappers::allgatherv(lammps_->world, send_buf, send_count, rec_buf,
rec_counts, displacements);
}
void int_scatter(int * send_buf, int * rec_buf, int count = 1)
{
MPI_Wrappers::int_scatter(lammps_->world, send_buf, rec_buf, count);
}
void logical_or(void * send_buf, int * rec_buf, int count = 1) const
{
MPI_Wrappers::logical_or(lammps_->world, send_buf, rec_buf, count);
}
void barrier(void) const
{
MPI_Wrappers::barrier(lammps_->world);
}
- void stop(string msg="") const
+ void stop(std::string msg="") const
{
MPI_Wrappers::stop(lammps_->world, msg);
}
// end MPI --------------------------------------------------------------------
- void print_debug(string msg="") const
+ void print_debug(std::string msg="") const
{
- cout << "rank " << comm_rank() << " " << msg << "\n" << std::flush;
+ std::cout << "rank " << comm_rank() << " " << msg << "\n" << std::flush;
barrier();
}
int comm_rank(void) const { return commRank_;}
int comm_size(void) const { return commSize_;}
bool rank_zero(void) const { return (commRank_==0);}
bool serial(void) const {
int size = 1; MPI_Comm_size(lammps_->world,&size);
return (size==1);
}
- void print_msg(string msg) const
+ void print_msg(std::string msg) const
{
int me;
MPI_Comm_rank(lammps_->world,&me);
- stringstream full_msg;
+ std::stringstream full_msg;
if (serial()) {
full_msg << " ATC: " << msg << "\n";
}
else {
full_msg << " ATC: P" << me << ", " << msg << "\n";
}
- string mesg = full_msg.str();
+ std::string mesg = full_msg.str();
if (lammps_->screen) fprintf(lammps_->screen, "%s",mesg.c_str());
if (lammps_->logfile) fprintf(lammps_->logfile,"%s",mesg.c_str());
}
- void print_msg_once(string msg,bool prefix=true, bool endline=true) const
+ void print_msg_once(std::string msg,bool prefix=true, bool endline=true) const
{
int me;
MPI_Comm_rank(lammps_->world,&me);
if (me==0) {
- stringstream full_msg;
+ std::stringstream full_msg;
if (prefix) full_msg << " ATC: ";
full_msg << msg;
if (endline) full_msg << "\n";
- string mesg = full_msg.str();
+ std::string mesg = full_msg.str();
if (lammps_->screen) fprintf(lammps_->screen, "%s",mesg.c_str());
if (lammps_->logfile) fprintf(lammps_->logfile,"%s",mesg.c_str());
}
}
- void all_print(double data, string tag ="") const
+ void all_print(double data, std::string tag ="") const
{
int me;
MPI_Comm_rank(lammps_->world,&me);
- stringstream full_msg;
+ std::stringstream full_msg;
if (serial()) {
full_msg << " ATC: " << tag << data << "\n";
}
else {
int commSize = comm_size();
double recv[commSize];
MPI_Wrappers::gather(lammps_->world,data,recv);
if (rank_zero()) {
full_msg << " ATC:" << tag;
for (int i = 0; i < commSize; i++) {
full_msg << " P" << i << ": " << recv[i] ;
}
full_msg << "\n";
}
}
if (rank_zero()) {
- string mesg = full_msg.str();
+ std::string mesg = full_msg.str();
if (lammps_->screen) fprintf(lammps_->screen, "%s",mesg.c_str());
if (lammps_->logfile) fprintf(lammps_->logfile,"%s",mesg.c_str());
}
}
- void stream_msg_once(string msg,bool prefix=true, bool endline=true) const
+ void stream_msg_once(std::string msg,bool prefix=true, bool endline=true) const
{
int me;
MPI_Comm_rank(lammps_->world,&me);
if (me==0) {
- if (prefix) cout << " ATC: ";
- cout << msg;
- if (endline) cout << "\n";
- cout << flush;
+ if (prefix) std::cout << " ATC: ";
+ std::cout << msg;
+ if (endline) std::cout << "\n";
+ std::cout << std::flush;
}
}
void forward_comm_fix() const;
void comm_borders() const;
/*@}*/
/** \name Methods that interface with Atom class */
/*@{*/
void set_fix_pointer(LAMMPS_NS::Fix * thisFix);
- string fix_id() const;
+ std::string fix_id() const;
bool atoms_sorted() const;
- bigint natoms() const;
+ LAMMPS_NS::bigint natoms() const;
int nlocal() const;
int nghost() const;
int nmax() const;
int ntypes() const;
double ** xatom() const;
double ** vatom() const;
double ** fatom() const;
const int * atom_mask() const;
+ int * atom_mask();
int * atom_type() const;
int * atom_tag() const;
int * atom_to_molecule() const;
int * num_bond() const;
int ** bond_atom() const;
int * image() const;
int bond_per_atom() const;
int newton_bond() const;
int local_to_global_map(int global) const;
int type_to_charge(int t) const;
//* Returns a pointer to the atom masses (NOT SAFE).
double * atom_mass() const;
//* Indexes an atomic mass by atom type (NO BOUNDS CHECK).
double atom_mass(int iType) const;
double * atom_rmass() const;
double * atom_charge() const;
double * atom_scalar(FundamentalAtomQuantity quantityType) const;
double ** atom_vector(FundamentalAtomQuantity quantityType) const;
int atom_quantity_ndof(FundamentalAtomQuantity quantityType) const;
double atom_quantity_conversion(FundamentalAtomQuantity quantityType) const;
void unwrap_coordinates(int iatom, double* xatom) const;
/*@}*/
/** \name Methods that interface with Domain class */
/*@{*/
int dimension() const;
int nregion() const;
void box_bounds(double & boxxlo, double & boxxhi,
double & boxylo, double & boxyhi,
double & boxzlo, double & boxzhi) const;
bool in_box(double * x) const;
bool in_my_processor_box(double * x) const;
void sub_bounds(double & subxlo, double & subxhi,
double & subylo, double & subyhi,
double & subzlo, double & subzhi) const;
int xperiodic() const;
int yperiodic() const;
int zperiodic() const;
int nperiodic() const;
void box_periodicity(int & xperiodic,
int & yperiodic,
int & zperiodic) const;
void periodicity_correction(double * x) const;
void set_reference_box(void) const; // const since called by perd_corr
int region_id(const char * regionName) const;
double domain_xprd() const;
double domain_yprd() const;
double domain_zprd() const;
double domain_volume() const;
double domain_xy() const;
double domain_xz() const;
double domain_yz() const;
int domain_triclinic() const;
bool region_bounds(const char * regionName,
double &xmin, double &xmax,
double &ymin, double & ymax,
double &zmin, double &zmax,
double &xscale,
double &yscale,
double &zscale) const;
bool region_bounds(const char * regionName,
double &xmin, double &xmax,
double &ymin, double & ymax,
double &zmin, double &zmax) const {
double xs,ys,zs;
bool ifBlock = region_bounds(regionName,
xmin,xmax,ymin,ymax,zmin,zmax,xs,ys,zs);
xmin *= xs;
xmax *= xs;
ymin *= ys;
ymax *= ys;
zmin *= zs;
zmax *= zs;
return ifBlock;
}
/*@}*/
void minimum_image(double & dx, double & dy, double & dz) const;
void closest_image(const double * const xi, const double * const xj, double * const xjImage) const;
/** \name Methods that interface with Update class */
UnitsType units_style() const;
double convert_units(double value, UnitsType in, UnitsType out, int massExp, int lenExp, int timeExp, int engExp=0) const;
//double minimize_energy() { return lammps_->update->minimize->ecurrent; }
double minimize_energy() const { return lammps_->update->minimize->eprevious; }
/*@}*/
/** \name Methods that interface with Lattice class */
/*@{*/
double xlattice() const;
double ylattice() const;
double zlattice() const;
LatticeType lattice_style() const;
int n_basis() const;
void basis_vectors(double **basis) const;
double max_lattice_constant(void) const;
double near_neighbor_cutoff(void) const;
void unit_cell(double *a1, double *a2, double *a3) const;
/** these functions are more than just simple pass throughs */
int num_atoms_per_cell(void) const;
double volume_per_atom(void) const;
void lattice(Matrix<double> &N, Matrix<double> &B) const;
/*@}*/
/** \name Methods that interface with Force class */
/*@{*/
double boltz() const;
double mvv2e() const;
double ftm2v() const;
double nktv2p() const;
double qqr2e() const;
double qe2f() const;
double dielectric() const;
double qqrd2e() const;
double qv2e() const; // converts charge * voltage --> mass length^2 / time^2
/*@}*/
/** \name Methods that interface with pair class */
/*@{*/
// interface to "single"
double pair_force(int i, int j, double rsq, double& fmag_over_rmag) const; // pair class
double pair_force(int n, double rsq, double& fmag_over_rmag) const; // bond class
- double pair_force(map< pair< int,int >,int >::const_iterator itr, double rsq, double& fmag_over_rmag, int nbonds = 0) const;
- double pair_force(pair< pair< int,int >,int > apair, double rsq, double& fmag_over_rmag, int nbonds = 0) const;
+ double pair_force(std::map< std::pair< int,int >,int >::const_iterator itr, double rsq, double& fmag_over_rmag, int nbonds = 0) const;
+ double pair_force(std::pair< std::pair< int,int >,int > apair, double rsq, double& fmag_over_rmag, int nbonds = 0) const;
double pair_cutoff() const;
void pair_reinit() const;
int single_enable() const;
LAMMPS_NS::PairEAM * pair_eam(void) const;
/*@}*/
/** \name Methods for addition/deletion of atoms*/
/*@{*/
int delete_atom(int id) const;
int insert_atom(int type, int mask, double* x, double* v, double q = 0) const;
double shortrange_energy(double *x, int type, int id = -1,
double max = big_) const;
int reset_ghosts(int dn) const;
double shortrange_energy(int id, double max = big_) const;
POTENTIAL potential(void) const;
int type_to_groupbit(int itype) const;
int change_type(int itype, int jtype) const;
int count_type(int itype) const;
bool epsilons(int type, POTENTIAL p, double * epsilons) const;
bool set_epsilons(int type, POTENTIAL p, double * epsilons) const;
int set_charge(int type, double charge) const;
/*@}*/
/** \name interface to random number generator */
/*@{*/
RNG_POINTER random_number_generator() const;
double random_uniform(RNG_POINTER p) const;
double random_normal (RNG_POINTER p) const;
int random_state (RNG_POINTER p) const;
void set_random_state (RNG_POINTER p, int seed) const;
void advance_random_generator (RNG_POINTER p, int n = 1) const;
void advance_random_uniform (RNG_POINTER p, int n = 1) const;
void advance_random_normal (RNG_POINTER p, int n = 1) const;
/*@}*/
/** these functions are more than just simple pass throughs */
/*@{*/
/** Boltzmann's constant in M,L,T,t units */
double kBoltzmann(void) const;
/** Planck's constant (energy-time units) */
double hbar(void) const;
/** Dulong-Petit heat capacity per volume in M,L,T,t units */
double heat_capacity(void) const;
/** mass per volume in reference configuraturation in M,L units */
double mass_density(int* numPerType=NULL) const;
/** permittivity of free space, converts from LAMMPS potential units implied by the electric field units to LAMMPS charge units/LAMMPS length units (e.g., V to elemental charge/A) */
double epsilon0(void) const;
double coulomb_constant(void) const;
double * special_coul() const;
int newton_pair() const;
double coulomb_factor(int & j) const {
int n = nlocal() + nghost();
double * sc = special_coul();
double factor_coul = 1.;
if (j >= n) {
factor_coul = sc[j/n];
j %= n;
}
return factor_coul;
}
/*@}*/
/** \name Methods that interface with Group class */
/*@{*/
int ngroup() const;
- int group_bit(string name) const;
+ int group_bit(std::string name) const;
int group_bit(int iGroup) const;
- int group_index(string name) const;
+ int group_index(std::string name) const;
int group_inverse_mask(int iGroup) const;
char * group_name(int iGroup) const;
void group_bounds(int iGroup, double * b) const;
/*@}*/
/** \name Methods that interface with Memory class */
/*@{*/
double * create_1d_double_array(int length, const char *name) const;
double * grow_1d_double_array(double *array, int length, const char *name) const;
void destroy_1d_double_array(double * d) const;
double ** create_2d_double_array(int n1, int n2, const char *name) const;
void destroy_2d_double_array(double **d) const;
double **grow_2d_double_array(double **array, int n1, int n2, const char *name) const;
int * create_1d_int_array(int length, const char *name) const;
int * grow_1d_int_array(int *array, int length, const char *name) const;
void destroy_1d_int_array(int * d) const;
int ** create_2d_int_array(int n1, int n2, const char *name) const;
void destroy_2d_int_array(int **i) const;
int ** grow_2d_int_array(int **array, int n1, int n2, const char *name) const;
template <typename T>
T * grow_array(T *&array, int n, const char *name) const {return lammps_->memory->grow(array,n,name);};
template <typename T>
void destroy_array(T * array) {lammps_->memory->destroy(array);};
template <typename T>
T ** grow_array(T **&array, int n1, int n2, const char *name) const {return lammps_->memory->grow(array,n1,n2,name);};
template <typename T>
void destroy_array(T ** array) const {lammps_->memory->destroy(array);};
/*@}*/
/** \name Methods that interface with Update class */
/*@{*/
double dt() const;
- bigint ntimestep() const;
+ LAMMPS_NS::bigint ntimestep() const;
int nsteps() const;
- bool now(bigint f) { return (ntimestep() % f == 0); }
+ bool now(LAMMPS_NS::bigint f) { return (ntimestep() % f == 0); }
/*@}*/
/** \name Methods that interface with neighbor list */
/*@{*/
void neighbor_remap(int & j) const { j &= NEIGHMASK; }
int sbmask(int j) const;
void set_list(int id, LAMMPS_NS::NeighList *ptr) ;
int neighbor_list_inum() const;
int * neighbor_list_numneigh() const;
int * neighbor_list_ilist() const;
int ** neighbor_list_firstneigh() const;
int neighbor_ago() const;
+ int reneighbor_frequency() const;
LAMMPS_NS::NeighList * neighbor_list(void) const { return list_;}
/*@}*/
/** \name Methods that interface with bond list */
/*@{*/
int bond_list_length() const;
int ** bond_list() const; // direct access
int * bond_list(int n) const { return bond_list()[n];}
int bond_list_i(int n) const { return bond_list(n)[0];}
int bond_list_j(int n) const { return bond_list(n)[1];}
int bond_list_type(int n) const { return bond_list(n)[2];}
/*@}*/
/** \name Methods that interface with Region class */
/*@{*/
char * region_name(int iRegion) const;
char * region_style(int iRegion) const;
double region_xlo(int iRegion) const;
double region_xhi(int iRegion) const;
double region_ylo(int iRegion) const;
double region_yhi(int iRegion) const;
double region_zlo(int iRegion) const;
double region_zhi(int iRegion) const;
double region_xscale(int iRegion) const;
double region_yscale(int iRegion) const;
double region_zscale(int iRegion) const;
int region_match(int iRegion, double x, double y, double z) const;
/*@}*/
/** \name Methods that interface with compute class */
enum COMPUTE_INVOKED
{INVOKED_SCALAR=1,INVOKED_VECTOR=2,INVOKED_ARRAY=4,INVOKED_PERATOM=8};
enum PER_ATOM_COMPUTE
{PE_ATOM,
STRESS_ATOM,
CENTRO_ATOM,
CNA_ATOM,
COORD_ATOM,
KE_ATOM,
NUM_PER_ATOM_COMPUTES};
// computes owned by LAMMPS
- COMPUTE_POINTER compute_pointer(string tag) const;
+ COMPUTE_POINTER compute_pointer(std::string tag) const;
int compute_ncols_peratom(COMPUTE_POINTER computePointer) const;
double* compute_vector_peratom(COMPUTE_POINTER computePointer) const;
double** compute_array_peratom(COMPUTE_POINTER computePointer) const;
void computes_addstep(int step) const;
void compute_addstep(COMPUTE_POINTER computePointer, int step) const;
int compute_matchstep(COMPUTE_POINTER computePointer, int step) const;
void reset_invoked_flag(COMPUTE_POINTER computePointer) const;
// computes owned by ATC
int create_compute_pe_peratom(void) const;
double * compute_pe_peratom(void) const;
- string compute_pe_name(void) const {return atomPeNameBase_;};// +fix_id();}; enables unique names, if desired
+ std::string compute_pe_name(void) const {return atomPeNameBase_;};// +fix_id();}; enables unique names, if desired
void computes_clearstep(void) const {lammps_->modify->clearstep_compute();};
/*@}*/
/** Return lammps pointer -- only as a last resort! */
LAMMPS_NS::LAMMPS * lammps_pointer() const;
protected:
/** transfer a const compute pointer to a non-const computer pointer */
LAMMPS_NS::Compute * const_to_active(const LAMMPS_NS::Compute* computePointer) const;
LAMMPS_NS::LAMMPS * lammps_;
LAMMPS_NS::Fix * fixPointer_;
/** access to neighbor list */
mutable LAMMPS_NS::NeighList *list_;
/** constructor */
LammpsInterface();
/** comm rank */
int commRank_;
/** number of processes */
int commSize_;
/** compute pe/atom */
mutable LAMMPS_NS::Compute * atomPE_;
/** box info */
mutable bool refBoxIsSet_;
mutable double upper_[3],lower_[3],length_[3];
/** registry of computer pointers */
- mutable set<LAMMPS_NS::Compute * > computePointers_;
+ mutable std::set<LAMMPS_NS::Compute * > computePointers_;
/** a random number generator from lammps */
mutable LAMMPS_NS::RanPark * random_;
mutable LAMMPS_NS::RanPark * globalrandom_;
private:
static LammpsInterface * myInstance_;
};
class HeartBeat
{
public:
- HeartBeat(string name, int freq) :
+ HeartBeat(std::string name, int freq) :
name_(name), freq_(freq), counter_(0) {};
~HeartBeat(){};
void start() const
{ ATC::LammpsInterface::instance()->stream_msg_once(name_,true,false);}
void next() const { if (counter_++ % freq_ == 0 )
ATC::LammpsInterface::instance()->stream_msg_once(".",false,false);}
void finish() const
{ ATC::LammpsInterface::instance()->stream_msg_once("done",false,true);}
protected:
- string name_;
+ std::string name_;
int freq_;
mutable int counter_;
private:
HeartBeat();
};
} // end namespace ATC
#endif
diff --git a/lib/atc/LinearSolver.cpp b/lib/atc/LinearSolver.cpp
index cea781b64..c6e1e9cf7 100644
--- a/lib/atc/LinearSolver.cpp
+++ b/lib/atc/LinearSolver.cpp
@@ -1,563 +1,563 @@
// Header file for this class
#include "LinearSolver.h"
#include <sstream>
using std::stringstream;
-
+using std::set;
namespace ATC {
const double kPenalty = 1.0e4;
const double kTol = 1.0e-8;
const int kMaxDirect = 1000;
// ====================================================================
// LinearSolver
// ====================================================================
LinearSolver::LinearSolver(
const SPAR_MAT & A,
const BC_SET & bcs,
const int solverType,
const int constraintHandlerType,
bool parallel
)
: solverType_(solverType),
constraintHandlerType_(constraintHandlerType),
nVariables_(0),
initialized_(false),
initializedMatrix_(false),
initializedInverse_(false),
matrixModified_(false),
allowReinitialization_(false),
homogeneousBCs_(false),
bcs_(&bcs),
rhs_(NULL),
rhsDense_(),
b_(NULL),
matrix_(A),
matrixDense_(),
matrixFreeFree_(), matrixFreeFixed_(),matrixInverse_(),
penalty_(0),maxIterations_(0), maxRestarts_(0), tol_(0),
parallel_(parallel)
{
// deep copy
matrixCopy_ = A;
matrixSparse_ = &matrixCopy_;
setup();
}
LinearSolver::LinearSolver(
const SPAR_MAT & A,
const int solverType,
bool parallel
)
: solverType_(solverType),
constraintHandlerType_(NO_CONSTRAINTS),
nVariables_(0),
initialized_(false),
initializedMatrix_(true),
initializedInverse_(false),
matrixModified_(false),
allowReinitialization_(false),
homogeneousBCs_(false),
bcs_(NULL), // null implies no contraints will be added later
rhs_(NULL),
rhsDense_(), b_(NULL),
matrix_(A),
matrixDense_(),
matrixFreeFree_(), matrixFreeFixed_(),matrixInverse_(),
penalty_(0),maxIterations_(0), maxRestarts_(0), tol_(0),
parallel_(parallel)
{
// shallow copy
matrixSparse_ = &A;
setup();
}
// --------------------------------------------------------------------
// Setup
// --------------------------------------------------------------------
void LinearSolver::setup(void)
{
penalty_ = kPenalty; // relative to matrix diagonal
tol_ = kTol;
nVariables_ = matrix_.nRows();
maxIterations_=2*nVariables_;
maxRestarts_=nVariables_;
// switch method based on size
if (solverType_ < 0) {
if (nVariables_ > kMaxDirect ) {
solverType_ = ITERATIVE_SOLVE_SYMMETRIC;
constraintHandlerType_ = PENALIZE_CONSTRAINTS;
}
else {
solverType_ = DIRECT_SOLVE;
}
}
if (constraintHandlerType_ < 0) {
constraintHandlerType_ = PENALIZE_CONSTRAINTS;
if (solverType_ == DIRECT_SOLVE) constraintHandlerType_ = CONDENSE_CONSTRAINTS;
}
if ( solverType_ == DIRECT_SOLVE && constraintHandlerType_ == CONDENSE_CONSTRAINTS ) allowReinitialization_ = true;
if ( solverType_ == ITERATIVE_SOLVE_SYMMETRIC && constraintHandlerType_ == CONDENSE_CONSTRAINTS )
throw ATC_Error("LinearSolver::unimplemented method");
}
// --------------------------------------------------------------------
// Initialize
// --------------------------------------------------------------------
void LinearSolver::allow_reinitialization(void)
{
if (constraintHandlerType_ == PENALIZE_CONSTRAINTS) {
if (matrixModified_ ) throw ATC_Error("LinearSolver: can't allow reinitialization after matrix has been modified");
matrixOriginal_ = *matrixSparse_;
}
allowReinitialization_ = true;
}
void LinearSolver::initialize(const BC_SET * bcs)
{
if (bcs) {
if (! allowReinitialization_ ) throw ATC_Error("LinearSolver: reinitialization not allowed");
//if (! bcs_ ) throw ATC_Error("LinearSolver: adding constraints after constructing without constraints is not allowed");
// shallow --> deep copy
if (! bcs_ ) { // constraintHandlerType_ == NO_CONSTRAINTS
if (matrixModified_) {
throw ATC_Error("LinearSolver: adding constraints after constructing without constraints is not allowed if matrix has been modified");
}
else {
matrixCopy_ = *matrixSparse_;
matrixSparse_ = &matrixCopy_;
constraintHandlerType_ = -1;
setup();
}
}
bcs_ = bcs;
initializedMatrix_ = false;
initializedInverse_ = false;
if (matrixModified_) {
matrixCopy_ = matrixOriginal_;
matrixSparse_ = &matrixCopy_;
}
}
initialize_matrix();
initialize_inverse();
initialize_rhs();
initialized_ = true;
}
// --------------------------------------------------------------------
// initialize_matrix
// --------------------------------------------------------------------
void LinearSolver::initialize_matrix(void)
{
if ( initializedMatrix_ ) return;
if (constraintHandlerType_ == PENALIZE_CONSTRAINTS) {
add_matrix_penalty();
}
else if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) {
partition_matrix();
}
initializedMatrix_ = true;
}
// --------------------------------------------------------------------
// initialize_inverse
// --------------------------------------------------------------------
void LinearSolver::initialize_inverse(void)
{
if ( initializedInverse_ ) return;
if (solverType_ == ITERATIVE_SOLVE_SYMMETRIC
|| solverType_ == ITERATIVE_SOLVE ) {
matrixDiagonal_ = matrixSparse_->diag(); // preconditioner
}
else { // DIRECT_SOLVE
if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) {
if( num_unknowns() > 0 ) {
matrixInverse_ = inv(matrixFreeFree_);
}
}
else { // NO_CONSTRAINTS || PENALIZE_CONSTRAINTS
matrixDense_ = matrixSparse_->dense_copy(); // need dense for lapack
matrixInverse_ = inv(matrixDense_);
}
}
initializedInverse_ = true;
}
// --------------------------------------------------------------------
// initialize_rhs
// --------------------------------------------------------------------
void LinearSolver::initialize_rhs(void)
{
if (! rhs_ ) return;
if (! bcs_ ) {
b_ = rhs_;
return;
}
if (constraintHandlerType_ == PENALIZE_CONSTRAINTS) {
add_rhs_penalty();
}
else if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) {
add_rhs_influence();
}
}
// --------------------------------------------------------------------
// add matrix penalty
// - change matrix for Dirichlet conditions: add penalty
// --------------------------------------------------------------------
void LinearSolver::add_matrix_penalty(void)
{
SPAR_MAT & A = matrixCopy_;
penalty_ *= (A.diag()).maxabs();
BC_SET::const_iterator itr;
for (itr = bcs_->begin(); itr != bcs_->end(); itr++) {
int i = itr->first;
A.add(i,i,penalty_); // modifies matrix
}
A.compress();
matrixModified_ = true;
}
// --------------------------------------------------------------------
// partition matrix
// - partition matrix based on Dirichlet constraints
// --------------------------------------------------------------------
void LinearSolver::partition_matrix(void)
{
fixedSet_.clear();
BC_SET::const_iterator itr;
for (itr = bcs_->begin(); itr != bcs_->end(); itr++) {
int i = itr->first;
fixedSet_.insert(i);
}
freeSet_.clear();
freeGlobalToCondensedMap_.clear();
int j = 0; // local index
for (int i = 0; i < nVariables_; i++) {
if (fixedSet_.find(i) == fixedSet_.end() ) {
freeSet_.insert(i);
freeGlobalToCondensedMap_[i] = j++;
}
}
if (matrixDense_.nRows() == 0) matrixDense_ =matrixSparse_->dense_copy();
DENS_MAT & K = matrixDense_;
K.row_partition(freeSet_,matrixFreeFree_,matrixFreeFixed_);
}
// --------------------------------------------------------------------
// add_rhs_penalty
// --------------------------------------------------------------------
void LinearSolver::add_rhs_penalty()
{
// deep copy
VECTOR & b = rhsDense_;
const VECTOR & r = *rhs_;
int size = r.nRows();
b.reset(size);
for (int i = 0; i < size; i++) {
b(i) = r(i);
}
if ( ! homogeneousBCs_ ){
BC_SET::const_iterator itr;
for (itr = bcs_->begin(); itr != bcs_->end(); itr++) {
int i = itr->first;
double v = itr->second;
b(i) += penalty_ * v;
}
}
b_ = &rhsDense_;
}
// --------------------------------------------------------------------
// add_rhs_influence
// --------------------------------------------------------------------
void LinearSolver::add_rhs_influence()
{
if (! initializedMatrix_ ) partition_matrix();
// rhs = rhs + K_free,fixed * x_fixed
int nbcs = bcs_->size();
if (nbcs == 0) { // no bcs to handle
b_ = rhs_;
}
else {
DENS_VEC & b = rhsDense_;
if ( ! homogeneousBCs_ ){
DENS_VEC xFixed(nbcs);
BC_SET::const_iterator itr;
int i = 0;
for (itr = bcs_->begin(); itr != bcs_->end(); itr++,i++) {
double v = itr->second;
xFixed(i,0) = -v;
}
b = matrixFreeFixed_*xFixed; // matrix and bcs have same ordering
}
else {
b.reset(matrixFreeFixed_.nRows());
}
const VECTOR & r = *rhs_;
set<int>::const_iterator iter;
int i = 0;
for (iter = freeSet_.begin(); iter != freeSet_.end(); iter++,i++) {
b(i) += r(*iter);
}
b_ = &rhsDense_;
}
}
// --------------------------------------------------------------------
// set fixed values
// - {x_i = y_i}
// --------------------------------------------------------------------
void LinearSolver::set_fixed_values(VECTOR & X)
{
BC_SET::const_iterator itr;
for (itr = bcs_->begin(); itr != bcs_->end(); itr++) {
int i = itr->first;
double v = 0;
if ( ! homogeneousBCs_ ) v = itr->second;
X(i) = v;
}
}
// --------------------------------------------------------------------
// Eigensystem
// --------------------------------------------------------------------
// calls lapack
void LinearSolver::eigen_system( DENS_MAT & eigenvalues, DENS_MAT & eigenvectors, const DENS_MAT * M) /* const */
{
initialize_matrix(); // no inverse needed
const DENS_MAT * Kp = NULL;
const DENS_MAT * Mp =M;
DENS_MAT MM;
DENS_MAT KM;
if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) {
Kp = &matrixFreeFree_;
if (M) {
DENS_MAT MfreeFixed; // not used
M->row_partition(freeSet_,MM,MfreeFixed);
Mp = &MM;
}
}
else {
if (matrixDense_.nRows() == 0) matrixDense_ =matrixSparse_->dense_copy();
Kp = &matrixDense_;
}
if (!M) {
MM.identity(Kp->nRows());
Mp = &MM;
}
DENS_MAT eVecs, eVals;
eVecs = eigensystem(*Kp,*Mp,eVals);
eigenvalues.reset(nVariables_,1);
eigenvectors.reset(nVariables_,nVariables_);
set<int>::const_iterator itr;
for (int i = 0; i < Kp->nRows(); i++) { // ordering is by energy not node
eigenvalues(i,0) = eVals(i,0);
int j = 0;
for (itr = freeSet_.begin(); itr != freeSet_.end(); itr++,j++) {
int jj = *itr;
eigenvectors(jj,i) = eVecs(j,i); // transpose
}
}
}
// --------------------------------------------------------------------
// solve
// - solves A x = b
// - if a "b" is provided it is used as the new rhs
// --------------------------------------------------------------------
bool LinearSolver::solve(VECTOR & x, const VECTOR & b)
{
SPAR_MAT * A = NULL;
rhs_ = &b;
initialized_ = false;
initialize();
if (num_unknowns() == 0) {
set_fixed_values(x);
return true;
}
const VECTOR & r = *b_;
if (solverType_ == ITERATIVE_SOLVE_SYMMETRIC) {
if (parallel_) {
A = new PAR_SPAR_MAT(LammpsInterface::instance()->world(), *matrixSparse_);
}
else {
A = new SPAR_MAT(*matrixSparse_);
}
DIAG_MAT & PC = matrixDiagonal_;
int niter = maxIterations_;
double tol = tol_;
int convergence = CG(*A, x, r, PC, niter, tol);// CG changes niter, tol
if (convergence>0) {
stringstream ss;
ss << "CG solve did not converge,";
ss << " iterations: " << niter;
ss << " residual: " << tol;
throw ATC_Error(ss.str());
}
}
else if (solverType_ == ITERATIVE_SOLVE) {
if (parallel_) {
A = new PAR_SPAR_MAT(LammpsInterface::instance()->world(), *matrixSparse_);
}
else {
A = new SPAR_MAT(*matrixSparse_);
}
const DIAG_MAT & PC = matrixDiagonal_;
int iterations = maxIterations_;
int restarts = maxRestarts_;
double tol = tol_;
DENS_MAT H(maxRestarts_+1, maxRestarts_);
DENS_VEC xx(nVariables_);
DENS_VEC bb;
bb = b;
int convergence = GMRES(*A, xx, bb, PC, H, restarts, iterations, tol);
if (convergence>0) {
stringstream ss;
ss << "GMRES greens_function solve did not converge,";
ss << " iterations: " << iterations;
ss << " residual: " << tol;
throw ATC_Error(ss.str());
}
x.copy(xx.ptr(),xx.nRows());
}
else { // DIRECT_SOLVE
const DENS_MAT & invA = matrixInverse_;
if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) {
DENS_MAT xx = invA*r;
int i = 0;
set<int>::const_iterator itr;
for (itr = freeSet_.begin(); itr != freeSet_.end(); itr++,i++) {
int ii = *itr;
x(ii) = xx(i,0);
}
set_fixed_values(x);
}
else {
DENS_VEC xx = invA*r;
for (int i = 0; i < xx.nRows(); i++) {
x(i) = xx(i);
}
}
}
delete A;
return true;
}
// --------------------------------------------------------------------
// greens function
// - returns the solution to a Kronecker delta rhs b = {0 0 .. 1 .. 0 0}
// and with homogeneous constraints {x_i = 0}
// --------------------------------------------------------------------
void LinearSolver::greens_function(int I, VECTOR & G_I)
{
SPAR_MAT * A = NULL;
initialize_matrix();
initialize_inverse();
G_I.reset(nVariables_);
VECTOR & x = G_I;
if (solverType_ == ITERATIVE_SOLVE_SYMMETRIC) {
DENS_VEC b(nVariables_); b = 0.0; b(I) = 1.0;
if (parallel_) {
A = new PAR_SPAR_MAT(LammpsInterface::instance()->world(), *matrixSparse_);
}
else {
A = new SPAR_MAT(*matrixSparse_);
}
const DIAG_MAT & PC = matrixDiagonal_;
int niter = maxIterations_;
double tol = tol_;
int convergence = CG(*A, x, b, PC, niter, tol);
if (convergence>0) {
stringstream ss;
ss << "CG greens_function solve did not converge,";
ss << " iterations: " << niter;
ss << " residual: " << tol;
throw ATC_Error(ss.str());
}
}
else if (solverType_ == ITERATIVE_SOLVE) {
DENS_VEC b(nVariables_); b = 0.0; b(I) = 1.0;
// VECTOR & bb = b;
if (parallel_) {
A = new PAR_SPAR_MAT(LammpsInterface::instance()->world(), *matrixSparse_);
}
else {
A = new SPAR_MAT(*matrixSparse_);
}
// const DENS_MAT A = matrixSparse_->dense_copy();
const DIAG_MAT & PC = matrixDiagonal_;
int iterations = maxIterations_;
int restarts = maxRestarts_;
double tol = tol_;
DENS_MAT H(maxRestarts_+1, maxRestarts_);
DENS_VEC xx(nVariables_);
int convergence = GMRES(*A, xx, b, PC, H, restarts, iterations, tol);
if (convergence>0) {
stringstream ss;
ss << "GMRES greens_function solve did not converge,";
ss << " iterations: " << iterations;
ss << " residual: " << tol;
throw ATC_Error(ss.str());
}
x.copy(xx.ptr(),xx.nRows());
}
else {
const DENS_MAT & invA = matrixInverse_;
if (constraintHandlerType_ == CONDENSE_CONSTRAINTS) {
set<int>::const_iterator itr;
for (itr = fixedSet_.begin(); itr != fixedSet_.end(); itr++) {
int ii = *itr;
x(ii) = 0;
}
itr = freeSet_.find(I);
if (itr !=freeSet_.end() ) {
int j = freeGlobalToCondensedMap_[I];
int i = 0;
for (itr = freeSet_.begin(); itr != freeSet_.end(); itr++,i++) {
int ii = *itr;
x(ii) = invA(j,i);
}
}
}
else {
for (int i = 0; i < nVariables_; ++i) x(i) = invA(I,i);
}
}
delete A;
}
} // namespace ATC
diff --git a/lib/atc/LinearSolver.h b/lib/atc/LinearSolver.h
index b9a922be7..eb84976c3 100644
--- a/lib/atc/LinearSolver.h
+++ b/lib/atc/LinearSolver.h
@@ -1,183 +1,182 @@
#ifndef LINEAR_SOLVER_H
#define LINEAR_SOLVER_H
// ATC includes
#include "ATC_TypeDefs.h"
#include "MatrixLibrary.h"
#include "ATC_Error.h"
// other includes
#include <set>
#include <map>
-using std::pair;
#include "LammpsInterface.h"
#include "CG.h"
#include "GMRES.h"
namespace ATC {
/**
* @class LinearSolver
* @brief a class to solve a system of linear equations
* A x = b subject to a set of constraints { x_i = y_i }
*/
class LinearSolver {
public:
enum LinearSolveType {
AUTO_SOLVE=-1,
DIRECT_SOLVE=0,
ITERATIVE_SOLVE,
ITERATIVE_SOLVE_SYMMETRIC
};
enum LinearSolveConstraintHandlingType {
NO_CONSTRAINTS=0,
CONDENSE_CONSTRAINTS,
PENALIZE_CONSTRAINTS
};
/** Constructor */
LinearSolver( // does not assume that A is persistent
const SPAR_MAT & A, // lhs matrix "deep" copy
const BC_SET & bcs, // constraints
const int solverType = AUTO_SOLVE,
const int bcHandlerType = -1,
bool parallel = false
);
LinearSolver( // assumes A is persistent
const SPAR_MAT & A, // lhs matrix "shallow" copy
const int solverType = AUTO_SOLVE,
bool parallel = false
);
/** Destructor */
virtual ~LinearSolver() {};
/** (re)initialize
- if bcs are provided the lhs matrix is re-configured
for the new constraints
- if the class is to be reused with new constraints
allow_reinitialization must be called before first solve, etc */
void allow_reinitialization(void); // depending on method save a copy of A
void set_homogeneous_bcs(void) { homogeneousBCs_ = true;} // for nonlinear solver, solve for increment
void initialize(const BC_SET * bcs = NULL);
/** solve
- solves A x = b
- if a "b" is provided it is used as the new rhs */
bool solve(VECTOR & x, const VECTOR & b);
/** greens function
- returns the solution to a Kronecker delta rhs b = {0 0 .. 1 .. 0 0}
and with homogeneous constraints {x_i = 0} */
void greens_function(int I, VECTOR & G_I);
/** eigensystem
- returns the e-values & e-vectors for constrained system Ax + v x = 0
- if M is provided the eval problem : ( A + v M ) x = 0 is solved*/
void eigen_system(DENS_MAT & eigenvalues, DENS_MAT & eigenvectors,
const DENS_MAT * M = NULL);
/** access to penalty coefficient
- if a penalty method is not being used this returns zero */
double penalty_coefficient(void) const {return penalty_;};
/** change iterative solver parameters */
void set_max_iterations(const int maxIter) {
if (solverType_ != ITERATIVE_SOLVE && solverType_ != ITERATIVE_SOLVE_SYMMETRIC ) throw ATC_Error("inappropriate parameter set in LinearSolver");
maxIterations_=maxIter;
}
void set_tolerance(const double tol) { tol_=tol;}
/* access to number of unknowns */
int num_unknowns(void) const
{
int nUnknowns = nVariables_;
if (bcs_) { nUnknowns -= bcs_->size(); }
return nUnknowns;
}
protected:
/** flavors */
int solverType_;
int constraintHandlerType_ ;
/** number of variables = number of rows of matrix */
int nVariables_;
/** initialize methods */
bool initialized_,initializedMatrix_,initializedInverse_;
bool matrixModified_,allowReinitialization_;
bool homogeneousBCs_;
void setup(void);
void initialize_matrix(void);
void initialize_inverse(void);
void initialize_rhs(void);
/** constraint handling methods to modify the RHS */
void add_matrix_penalty(void); /** penalty */
void partition_matrix(void); /** condense */
/** constraint handling methods to modify the RHS */
void add_rhs_penalty(void); /** penalty */
void add_rhs_influence(void); /** condense */
/** set fixed values */
void set_fixed_values(VECTOR & x);
/** constraints container */
const BC_SET * bcs_;
/** rhs vector/s */
const VECTOR * rhs_;
DENS_VEC rhsDense_; // modified
const VECTOR * b_; // points to appropriate rhs
/** lhs matrix */
const SPAR_MAT & matrix_;
SPAR_MAT matrixCopy_; // a copy that will be modified by penalty methods
SPAR_MAT matrixOriginal_; // a copy that is used for re-initialization
const SPAR_MAT * matrixSparse_; // points to matrix_ or matrixCopy_
DENS_MAT matrixDense_; // a dense copy for lapack
/** partitioned matrix - condense constraints */
DENS_MAT matrixFreeFree_, matrixFreeFixed_;
/** maps for free and fixed variables for partitioned matrix - condense */
- set<int> freeSet_, fixedSet_;
- map<int,int> freeGlobalToCondensedMap_;
+ std::set<int> freeSet_, fixedSet_;
+ std::map<int,int> freeGlobalToCondensedMap_;
/** inverse matrix matrix - direct solve */
DENS_MAT matrixInverse_;
/** pre-conditioner diagonal of the matrix - iterative solve */
DIAG_MAT matrixDiagonal_;
/** penalty coefficient - penalty constraints */
double penalty_;
/** max iterations - iterative solve */
int maxIterations_;
/** max restarts - GMRES solve */
int maxRestarts_;
/** tolerance - iterative solve */
double tol_;
/** run solve in parallel */
bool parallel_;
};
} // namespace ATC
#endif
diff --git a/lib/atc/MPI_Wrappers.cpp b/lib/atc/MPI_Wrappers.cpp
index ddf2056b0..d69620ecb 100644
--- a/lib/atc/MPI_Wrappers.cpp
+++ b/lib/atc/MPI_Wrappers.cpp
@@ -1,330 +1,333 @@
#include "MPI_Wrappers.h"
#include "Utility.h"
using ATC_Utility::to_string;
+#include "ATC_Error.h"
+using ATC::ATC_Error;
using std::cout;
+using std::string;
#ifdef ISOLATE_FE
#include "Matrix.h"
using ATC_Matrix::SparseMatrix;
#endif
namespace MPI_Wrappers {
int rank(MPI_Comm comm)
{
int rank;
MPI_Comm_rank(comm, &rank);
return rank;
}
bool rank_zero(MPI_Comm comm) { return rank(comm)==0;}
int size(MPI_Comm comm)
{
int size;
MPI_Comm_size(comm, &size);
return size;
}
bool serial(MPI_Comm comm) { return size(comm) == 0; }
void broadcast(MPI_Comm comm, double *buf, int count)
{
int error = MPI_Bcast(buf, count, MPI_DOUBLE, 0, comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in broadcast "+to_string(error));
}
void int_broadcast(MPI_Comm comm, int *buf, int count)
{
int error = MPI_Bcast(buf, count, MPI_INT, 0, comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in broadcast "+to_string(error));
}
void allsum(MPI_Comm comm, void *send_buf, double *rec_buf, int count)
{
int error = MPI_Allreduce(send_buf, rec_buf, count, MPI_DOUBLE, MPI_SUM,
comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in allsum "+to_string(error));
}
void int_allsum(MPI_Comm comm, void *send_buf, int *rec_buf, int count)
{
int error = MPI_Allreduce(send_buf, rec_buf, count, MPI_INT, MPI_SUM,
comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in int_allsum "+to_string(error));
}
void int_scansum(MPI_Comm comm, int *send_buf, int *rec_buf, int count)
{
int error = MPI_Scan(send_buf, rec_buf, count, MPI_INT, MPI_SUM,
comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in int_scansum "+to_string(error));
}
void allmax(MPI_Comm comm, double *send_buf, double *rec_buf, int count)
{
int error = MPI_Allreduce(send_buf, rec_buf, count, MPI_DOUBLE, MPI_MAX,
comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in allmax "+to_string(error));
}
void int_allmax(MPI_Comm comm, int *send_buf, int *rec_buf, int count)
{
int error = MPI_Allreduce(send_buf, rec_buf, count, MPI_INT, MPI_MAX,
comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in int_allmax "+to_string(error));
}
void allmin(MPI_Comm comm, double *send_buf, double *rec_buf, int count)
{
int error = MPI_Allreduce(send_buf, rec_buf, count, MPI_DOUBLE, MPI_MIN,
comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in allmax "+to_string(error));
}
void int_allmin(MPI_Comm comm, int *send_buf, int *rec_buf, int count)
{
int error = MPI_Allreduce(send_buf, rec_buf, count, MPI_INT, MPI_MIN,
comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in int_allmax "+to_string(error));
}
int rank_min(MPI_Comm comm, double *send_buf, double *rec_buf, int count)
{
int myRank;
MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
DOUBLE_RANK in[count],out[count];
for (int i = 0; i < count; i++) {
in[i].val = send_buf[i];
in[i].rank = myRank;
}
int error = MPI_Allreduce(in, out, count, MPI_DOUBLE_INT, MPI_MINLOC,
comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in rank_min "+to_string(error));
for (int i = 0; i < count; i++) {
rec_buf[i] = out[i].val;
}
return out[0].rank;
}
void int_recv(MPI_Comm comm, int *recv_buf, int max_size, int iproc)
{
MPI_Status status;
MPI_Request request;
int tmp, error, recv_size;
error = MPI_Irecv(recv_buf,max_size,MPI_INT,iproc,0,comm,&request);
error = error && MPI_Send(&tmp,0,MPI_INT,iproc,0,comm);
error = error && MPI_Wait(&request,&status);
error = error && MPI_Get_count(&status,MPI_DOUBLE,&recv_size);
if (error != MPI_SUCCESS) throw ATC_Error("error in int_recv "+to_string(error));
}
void recv(MPI_Comm comm, double *recv_buf, int max_size,int iproc)
{
MPI_Status status;
MPI_Request request;
int tmp, error, recv_size;
error = MPI_Irecv(recv_buf,max_size,MPI_DOUBLE,iproc,0,comm,&request);
error = error && MPI_Send(&tmp,0,MPI_INT,iproc,0,comm);
error = error && MPI_Wait(&request,&status);
error = error && MPI_Get_count(&status,MPI_DOUBLE,&recv_size);
if (error != MPI_SUCCESS) throw ATC_Error("error in recv "+to_string(error));
}
void int_send(MPI_Comm comm, int *send_buf,int send_size)
{
MPI_Status status;
int tmp, error;
error = MPI_Recv(&tmp,0,MPI_INT,0,0,comm,&status);
error = error && MPI_Rsend(send_buf,send_size,MPI_INT,0,0,comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in int_send "+to_string(error));
}
void send(MPI_Comm comm, double *send_buf,int send_size)
{
MPI_Status status;
int tmp, error;
error = MPI_Recv(&tmp,0,MPI_INT,0,0,comm,&status);
error = error && MPI_Rsend(send_buf,send_size,MPI_DOUBLE,0,0,comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in int_send "+to_string(error));
}
void int_scatter(MPI_Comm comm, int *send_buf, int *rec_buf, int count)
{
int error;
int numprocs = size(comm);
int sizes[numprocs];
int displacements[numprocs];
for (int i = 0; i < numprocs; ++i) {
sizes[i] = 1;
displacements[i] = i;
}
error = MPI_Scatterv(send_buf, sizes, displacements, MPI_INT, rec_buf, count, MPI_INT, 0, comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in int_scatter "+to_string(error));
}
void allgatherv(MPI_Comm comm, double *send_buf, int send_count,
double *rec_buf, int *rec_counts, int *displacements)
{
int error = MPI_Allgatherv(send_buf, send_count, MPI_DOUBLE,
rec_buf, rec_counts, displacements, MPI_DOUBLE,
comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in allgatherv "+to_string(error));
}
void gather(MPI_Comm comm, double send, double* recv)
{
int send_count = 1;
int recv_count = 1;
int root = 0;
int error = MPI_Gather(&send, send_count, MPI_DOUBLE,
recv, recv_count, MPI_DOUBLE, root, comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in allgatherv "+to_string(error));
}
void logical_or(MPI_Comm comm, void *send_buf, int *rec_buf, int count)
{
int error = MPI_Allreduce(send_buf, rec_buf, count, MPI_INT, MPI_LOR,
comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in logical_or "+to_string(error));
}
void barrier(MPI_Comm comm)
{
int error = MPI_Barrier(comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in barrier "+to_string(error));
}
void stop(MPI_Comm comm, string msg)
{
int error = MPI_Barrier(comm);
if (error != MPI_SUCCESS) throw ATC_Error("error in barrier "+to_string(error));
throw ATC_Error("...stopping "+msg);
}
#ifdef ISOLATE_FE
void sparse_allsum(MPI_Comm comm,SparseMatrix<double> &toShare) const
{
toShare.compress();
// initialize MPI information
int nProcs = size(comm);
int myRank = rank(comm);;
int error;
// get numbers of rows, columns, rowsCRS, and
// sizes (number of nonzero elements in matrix)
SparseMatInfo *recInfo = new SparseMatInfo[nProcs];
SparseMatInfo myInfo;
myInfo.rows = toShare.nRows();
myInfo.cols = toShare.nCols();
myInfo.rowsCRS = toShare.nRowsCRS();
myInfo.size = toShare.size();
error = MPI_Allgather(&myInfo, 4, MPI_INT,
recInfo, 4, MPI_INT, lammps_->world);
if (error != MPI_SUCCESS) throw ATC_Error("error in sparse_allsum_numrows "+to_string(error));
// adjust row sendcounts because recRowsCRS is off by one
int rowCounts[nProcs];
int sizeCounts[nProcs];
// set up total size of receive buffers for Allgatherv calls
int totalRowsCRS = 0;
int totalSize = 0;
// set up array of displacements for Allgatherv calls
int rowOffsets[nProcs];
rowOffsets[0] = 0;
int sizeOffsets[nProcs];
sizeOffsets[0] = 0;
for (int i = 0; i < nProcs; i++) {
// find the total number of entries to share in the mpi calls below
rowCounts[i] = recInfo[i].rowsCRS + 1;
sizeCounts[i] = recInfo[i].size;
totalRowsCRS += rowCounts[i];
totalSize += recInfo[i].size;
// these already have their 0th slot filled in
if (i == 0) continue;
rowOffsets[i] = rowOffsets[i-1] + rowCounts[i-1];
sizeOffsets[i] = sizeOffsets[i-1] + sizeCounts[i-1];
}
// get actual rows
INDEX *rec_ia = new INDEX[totalRowsCRS];
if (toShare.size() == 0) {
double dummy[0];
error = MPI_Allgatherv(dummy, 0, MPI_INT,
rec_ia, rowCounts, rowOffsets, MPI_INT, lammps_->world);
}
else
error = MPI_Allgatherv(toShare.rows(), rowCounts[myRank], MPI_INT,
rec_ia, rowCounts, rowOffsets, MPI_INT, lammps_->world);
if (error != MPI_SUCCESS)
throw ATC_Error("error in sparse_allsum_rowarray "+to_string(error));
// get actual cols
INDEX *rec_ja = new INDEX[totalSize];
error = MPI_Allgatherv(toShare.cols(), sizeCounts[myRank], MPI_INT,
rec_ja, sizeCounts, sizeOffsets, MPI_INT, lammps_->world);
if (error != MPI_SUCCESS)
throw ATC_Error("error in sparse_allsum_colarray "+to_string(error));
// get the array of values
double *rec_vals = new double[totalSize];
error = MPI_Allgatherv(toShare.ptr(), sizeCounts[myRank], MPI_DOUBLE,
rec_vals, sizeCounts, sizeOffsets, MPI_DOUBLE, lammps_->world);
if (error != MPI_SUCCESS)
throw ATC_Error("error in sparse_allsum_valarray "+to_string(error));
INDEX *rec_ia_proc;
INDEX *rec_ja_proc;
double *rec_vals_proc;
for (int i = 0; i < nProcs; i++) {
if (myRank != i) {
// deallocated when tempMat is deleted since it wraps them
rec_ia_proc = new INDEX[rowCounts[i]];
rec_ja_proc = new INDEX[sizeCounts[i]];
rec_vals_proc = new double[sizeCounts[i]];
// copy the data passed with MPI into the new spots
copy(rec_ia + rowOffsets[i],
rec_ia + rowOffsets[i] + rowCounts[i],
rec_ia_proc);
copy(rec_ja + sizeOffsets[i],
rec_ja + sizeOffsets[i] + sizeCounts[i],
rec_ja_proc);
copy(rec_vals + sizeOffsets[i],
rec_vals + sizeOffsets[i] + sizeCounts[i],
rec_vals_proc);
// Does anyone know why we have to declare tempMat here (as well as set it equal to
// something) to avoid segfaults? there are still segfaults, but they happen at a much
// later stage of the game now (and for less benchmarks overall).
SparseMatrix<double> tempMat =
SparseMatrix<double>(rec_ia_proc, rec_ja_proc, rec_vals_proc,
recInfo[i].size, recInfo[i].rows,
recInfo[i].cols, recInfo[i].rowsCRS);
toShare += tempMat;
}
}
delete[] recInfo;
delete[] rec_ia;
delete[] rec_ja;
delete[] rec_vals;
}
#endif
void print_msg(MPI_Comm comm, string msg)
{
if (serial(comm)) { cout << " ATC: " << msg << "\n"; }
else { cout << " ATC: P" << rank(comm) << ", " << msg << "\n"; }
}
void print_msg_once(MPI_Comm comm, string msg, bool prefix, bool endline)
{
if (rank_zero(comm)) {
if (prefix) cout << " ATC: ";
cout << msg;
if (endline) cout << "\n";
}
}
}
diff --git a/lib/atc/MPI_Wrappers.h b/lib/atc/MPI_Wrappers.h
index bff68523d..691c9d525 100644
--- a/lib/atc/MPI_Wrappers.h
+++ b/lib/atc/MPI_Wrappers.h
@@ -1,49 +1,45 @@
#ifndef MPI_WRAPPERS_H
#define MPI_WRAPPERS_H
#include <iostream>
#include <string>
-using std::string;
#include "mpi.h"
-#include "ATC_Error.h"
-using ATC::ATC_Error;
-//using ATC_matrix::SparseMatrix;
namespace MPI_Wrappers {
typedef struct {double val; int rank; } DOUBLE_RANK;
int rank(MPI_Comm comm);
bool rank_zero(MPI_Comm comm);
int size(MPI_Comm comm);
bool serial(MPI_Comm comm);
void broadcast(MPI_Comm comm, double *buf, int count = 1);
void int_broadcast(MPI_Comm comm, int *buf, int count = 1);
void allsum(MPI_Comm comm, void *send_buf, double *rec_buf, int count = 1);
void int_allsum(MPI_Comm comm, void *send_buf, int *rec_buf, int count = 1);
void int_scansum(MPI_Comm comm, int *send_buf, int *rec_buf, int count = 1);
void allmax(MPI_Comm comm, double *send_buf, double *rec_buf, int count = 1);
void int_allmax(MPI_Comm comm, int *send_buf, int *rec_buf, int count = 1);
void allmin(MPI_Comm comm, double *send_buf, double *rec_buf, int count = 1);
void int_allmin(MPI_Comm comm, int *send_buf, int *rec_buf, int count = 1);
int rank_min(MPI_Comm comm, double *send_buf, double *rec_buf, int count);
void int_recv(MPI_Comm comm, int *recv_buf, int max_size,int iproc);
void recv(MPI_Comm comm, double *recv_buf, int max_size,int iproc);
void int_send(MPI_Comm comm, int *send_buf,int send_size);
void send(MPI_Comm comm, double *send_buf,int send_size);
void allgatherv(MPI_Comm comm, double *send_buf, int send_count,
double *rec_buf, int *rec_counts, int *displacements);
void gather(MPI_Comm comm, double send, double * recv);
void logical_or(MPI_Comm comm, void *send_buf, int *rec_buf, int count = 1);
void barrier(MPI_Comm comm);
- void stop(MPI_Comm comm, string msg="");
+ void stop(MPI_Comm comm, std::string msg="");
void int_scatter(MPI_Comm comm, int *send_buf, int *rec_buf, int count = 1);
// void sparse_allsum(MPI_Comm comm, SparseMatrix<double> &toShare);
- void print_msg(MPI_Comm comm, string msg);
- void print_msg_once(MPI_Comm comm,string msg,bool prefix=true,bool endline=true);
+ void print_msg(MPI_Comm comm, std::string msg);
+ void print_msg_once(MPI_Comm comm,std::string msg,bool prefix=true,bool endline=true);
}
#endif
diff --git a/lib/atc/Material.cpp b/lib/atc/Material.cpp
index 188ab1f45..eaeb7c975 100644
--- a/lib/atc/Material.cpp
+++ b/lib/atc/Material.cpp
@@ -1,764 +1,776 @@
#include "Material.h"
#include "ATC_Transfer.h"
#include "LammpsInterface.h"
#include "ElectronChargeDensity.h"
#include "ElectronHeatCapacity.h"
#include "ElectronHeatFlux.h"
#include "ElectronPhononExchange.h"
#include "ElectronDragPower.h"
#include "Stress.h"
#include "ViscousStress.h"
#include "BodyForce.h"
#include "ElectronFlux.h"
+#include <sstream>
+#include <fstream>
+#include <vector>
+
+using ATC_Utility::command_line;
+using ATC_Utility::str2dbl;
+using ATC_Utility::str2int;
+using std::stringstream;
+using std::set;
+using std::fstream;
+using std::string;
+using std::vector;
namespace ATC {
Material::Material()
: rhoCp_(0),
heatCapacity_(0),
electronHeatCapacity_(NULL),
massDensity_(0),
heatConductivity_(0),
electronHeatFlux_(NULL),
stress_(NULL),
viscousStress_(NULL),
bodyForce_(NULL),
electronPhononExchange_(NULL),
electronDragPower_(NULL),
electronFlux_(NULL),
permittivity_(1.),
invEffectiveMass_(1.),
electronEquilibriumDensity_(0),
electronRecombinationInvTau_(0),
electronChargeDensity_(NULL)
{
}
//--------------------------------------------------------------
// Constructor (parser)
//--------------------------------------------------------------
// Example:
// material Cu
// heat_capacity constant
// capacity 1.0
// end
// heat_flux linear
// conductivity 1.0
// end
// electron_heat_flux linear
// conductivity 1.0
// end
// electron_heat_capacity linear
// capacity 1.0
// end
// electron_phonon_exchange linear
// coefficient 0.1
// end
// end
Material::Material(string & tag, fstream &fileId)
: tag_(tag),
rhoCp_(0),
heatCapacity_(0),
electronHeatCapacity_(NULL),
massDensity_(0),
heatConductivity_(0),
electronHeatFlux_(NULL),
stress_(NULL),
viscousStress_(NULL),
bodyForce_(NULL),
electronPhononExchange_(NULL),
electronDragPower_(NULL),
electronFlux_(NULL),
permittivity_(1.),
invEffectiveMass_(1.),
electronEquilibriumDensity_(0),
electronRecombinationInvTau_(0),
electronChargeDensity_(NULL)
{
linearFlux_.reset(NUM_FIELDS);
linearFlux_ = false;
linearSource_.reset(NUM_FIELDS);
linearSource_ = true;
constantDensity_.reset(NUM_FIELDS);
constantDensity_ = false;
rhoCp_ = ATC::LammpsInterface::instance()->heat_capacity();
parameters_["heat_capacity"] = rhoCp_;
heatCapacity_ = rhoCp_;
registry_.insert("heat_capacity");
registry_.insert("thermal_energy");
constantDensity_(TEMPERATURE) = true;
constantDensity_(DISPLACEMENT) = true;
constantDensity_(VELOCITY) = true;
electronDragPower_ = new ElectronDragPower();
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line.size() == 1) {
if (line[0] == "end") {
return;
}
}
if (line[0] == "heat_capacity") { // over-ride default
registry_. insert("heat_capacity");
registry_. insert("thermal_energy");
if (line[1] == "constant") {
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") break;
double value = str2dbl(line[1]);
if (line[0] == "capacity") {
heatCapacity_ = value;
parameters_["heat_capacity"] = heatCapacity_;
}
}
}
}
else if (line[0] == "heat_flux") {
registry_. insert("heat_flux");
if (line[1] == "linear") {
linearFlux_(TEMPERATURE) = true;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") break;
double value = str2dbl(line[1]);
if (line[0] == "conductivity") {
heatConductivity_ = value;
}
}
}
}
else if (line[0] == "electron_heat_flux") {
registry_. insert("electron_heat_flux");
if (line[1] == "null") {
linearFlux_(ELECTRON_TEMPERATURE) = true;
if (electronHeatFlux_) delete electronHeatFlux_;
electronHeatFlux_ = new ElectronHeatFlux();
}
else if (line[1] == "linear") {
linearFlux_(ELECTRON_TEMPERATURE) = true;
if (electronHeatCapacity_) {
if (electronHeatFlux_) delete electronHeatFlux_;
electronHeatFlux_ = new ElectronHeatFluxLinear(fileId, parameters_,electronHeatCapacity_);
}
else {
if (electronHeatFlux_) delete electronHeatFlux_;
electronHeatFlux_ = new ElectronHeatFluxLinear(fileId, parameters_);
}
}
else if (line[1] == "power_law") {
if (electronHeatCapacity_) {
if (electronHeatFlux_) delete electronHeatFlux_;
electronHeatFlux_ = new ElectronHeatFluxPowerLaw(fileId, parameters_,electronHeatCapacity_);
}
else {
if (electronHeatFlux_) delete electronHeatFlux_;
electronHeatFlux_ = new ElectronHeatFluxPowerLaw(fileId, parameters_);
}
}
else if (line[1] == "thermopower") {
if (! electronFlux_) {
throw ATC_Error( "for thermopower please define electron_flux before electron_heat_flux");
}
if (electronHeatFlux_) delete electronHeatFlux_;
electronHeatFlux_ = new ElectronHeatFluxThermopower(fileId,
parameters_, electronFlux_);
}
}
else if (line[0] == "electron_heat_capacity") {
registry_. insert("electron_heat_capacity");
registry_. insert("electron_thermal_energy");
if (line[1] == "constant") {
if ((line.size() == 3) && (line[2] == "no_density")) {
if (electronHeatCapacity_) delete electronHeatCapacity_;
electronHeatCapacity_ = new ElectronHeatCapacityConstantAddDensity(fileId,
parameters_,
this);
}
else {
constantDensity_(ELECTRON_TEMPERATURE) = true;
if (electronHeatCapacity_) delete electronHeatCapacity_;
electronHeatCapacity_ = new ElectronHeatCapacityConstant(fileId,
parameters_);
}
}
else if (line[1] == "linear") {
if ((line.size() == 3) && line[2] == "no_density") {
if (electronHeatCapacity_) delete electronHeatCapacity_;
electronHeatCapacity_ = new ElectronHeatCapacityLinearAddDensity(fileId,
parameters_,
this);
}
else {
if (electronHeatCapacity_) delete electronHeatCapacity_;
electronHeatCapacity_ = new ElectronHeatCapacityLinear(fileId,
parameters_);
}
}
}
else if (line[0] == "electron_phonon_exchange") {
registry_. insert("electron_phonon_exchange");
if (line[1] == "null") {
if (electronPhononExchange_) delete electronPhononExchange_;
electronPhononExchange_ = new ElectronPhononExchange();
}
else if (line[1] == "linear") {
if (electronPhononExchange_) delete electronPhononExchange_;
electronPhononExchange_ = new ElectronPhononExchangeLinear(fileId,
parameters_);
}
else if (line[1] == "power_law") {
linearSource_(TEMPERATURE) = false;
linearSource_(ELECTRON_TEMPERATURE) = false;
if (electronPhononExchange_) delete electronPhononExchange_;
electronPhononExchange_ = new ElectronPhononExchangePowerLaw(fileId,
parameters_);
}
else if (line[1] == "hertel") {
linearSource_(TEMPERATURE) = false;
linearSource_(ELECTRON_TEMPERATURE) = false;
if (electronPhononExchange_) delete electronPhononExchange_;
electronPhononExchange_ = new ElectronPhononExchangeHertel(fileId,parameters_,this);
}
}
else if (line[0] == "mass_density") { // over-ride default
registry_. insert("mass_density");
registry_. insert("kinetic_energy");
if (line.size() == 1 ) { // try to calculate from lattice
massDensity_ = LammpsInterface::instance()->mass_density();
parameters_["mass_density"] = massDensity_;
stringstream ss;
ss << "computed mass density : " << massDensity_ ;
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
else if (line[1] == "basis") {
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") break;
int n = line.size();
int* numPerType = new int[n];
for (int i = 0; i < n; i++) {
numPerType[i] = str2int(line[i]);
}
massDensity_ = LammpsInterface::instance()->mass_density(numPerType);
delete [] numPerType;
parameters_["mass_density"] = massDensity_;
stringstream ss;
ss << "computed mass density (from given basis) : " << massDensity_ ;
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
}
else if (line[1] == "constant") {
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") break;
double value = str2dbl(line[1]);
if (line[0] == "density") {
massDensity_ = value;
parameters_["mass_density"] = massDensity_;
}
}
}
}
else if (line[0] == "stress") {
registry_. insert("stress");
registry_. insert("elastic_energy");
if (line[1] == "linear") {
linearFlux_(VELOCITY) = true;
linearFlux_(DISPLACEMENT) = true;
if (stress_) delete stress_;
stress_ = new StressLinearElastic(fileId);
}
else if (line[1] == "cubic") {
linearFlux_(VELOCITY) = true;
linearFlux_(DISPLACEMENT) = true;
if (stress_) delete stress_;
stress_ = new StressCubicElastic(fileId);
}
else if (line[1] == "damped_cubic") {
linearFlux_(VELOCITY) = true;
linearFlux_(DISPLACEMENT) = true;
if (stress_) delete stress_;
stress_ = new StressCubicElasticDamped(fileId);
}
else if (line[1] == "cauchy-born") {
CbData cb;
LammpsInterface *lmp = LammpsInterface::instance();
lmp->lattice(cb.cell_vectors, cb.basis_vectors);
cb.inv_atom_volume = 1.0 / lmp->volume_per_atom();
cb.e2mvv = 1.0 / lmp->mvv2e();
cb.boltzmann = lmp->boltz();
cb.atom_mass = lmp->atom_mass(1);
if (stress_) delete stress_;
stress_ = new StressCauchyBorn(fileId, cb);
}
}
else if (line[0] == "viscous_stress") {
registry_.insert("viscous_stress");
if (line[1] == "constant") {
linearFlux_(VELOCITY) = true;
if (viscousStress_) delete viscousStress_;
viscousStress_ = new ViscousStressConstant(fileId);
}
}
else if (line[0] == "body_force") {
registry_. insert("body_force");
if (line.size() > 1) {
if (line[1] == "electric_field") {
if (bodyForce_) delete bodyForce_;
bodyForce_ = new BodyForceElectricField(fileId,parameters_);
}
else if (line[1] == "viscous") {
if (bodyForce_) delete bodyForce_;
bodyForce_ = new BodyForceViscous(fileId,parameters_);
}
else {
if (bodyForce_) delete bodyForce_;
bodyForce_ = new BodyForce();
}
}
else {
if (bodyForce_) delete bodyForce_;
bodyForce_ = new BodyForce();
}
}
else if (line[0] == "electron_flux") {
registry_. insert("electron_flux");
if (line[1] == "null") {
linearFlux_(ELECTRON_DENSITY) = true;
if (electronFlux_) delete electronFlux_;
electronFlux_ = new ElectronFlux();
}
else if (line[1] == "linear") {
linearFlux_(ELECTRON_DENSITY) = true;
if (electronFlux_) delete electronFlux_;
electronFlux_ = new ElectronFluxLinear(fileId, parameters_);
}
else if (line[1] == "thermopower") {
if (electronFlux_) delete electronFlux_;
electronFlux_ = new ElectronFluxThermopower(fileId, parameters_);
}
else if (line[1] == "convection") {
if (electronFlux_) delete electronFlux_;
electronFlux_ = new ElectronFluxConvection(fileId, parameters_);
}
}
else if (line[0] == "electric_field") {
registry_. insert("electric_field");
registry_. insert("electric_displacement");
if (line[1] == "linear") {
linearFlux_(ELECTRIC_POTENTIAL) = true;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") break;
if (line[0] == "permittivity") {
// if no value given use lammps dielectric constant
if (line.size() == 1 ) {
permittivity_ = LammpsInterface::instance()->dielectric();
}
else {
double value = str2dbl(line[1]);
permittivity_ = value;
}
// convert relative permitivity (dielectric) to abs internal units
stringstream ss;
ss << "permittivity : " << permittivity_ ;
permittivity_ *= LammpsInterface::instance()->epsilon0();
ss << " -> " << permittivity_ ;
LammpsInterface::UnitsType utype = LammpsInterface::instance()->units_style();
if ( utype != LammpsInterface::REAL
&& utype != LammpsInterface::METAL) {
ATC::LammpsInterface::instance()->print_msg_once("WARNING: must use a unit system where: [Energy/force] = [Length] and [charge] = e");
// note this is so that: perm0/e = 1 / (Epotential_units * Length)
// our charge densities are multiples of the elemental charge
}
parameters_["permittivity"] = permittivity_;
}
}
}
}
else if (line[0] == "effective_mass") {
registry_. insert("inv_effective_mass");
if (line[1] == "constant") {
linearFlux_(ELECTRON_WAVEFUNCTION) = true;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") break;
if (line[0] == "inv_effective_mass") {
double value = str2dbl(line[1]);
invEffectiveMass_ = value; // 1/m* = inv_eff_mass/m_e
// convert to hbar^2 / 2 / m* / e
//double hbar = LammpsInterface::instance()->hbar();
//invEffectiveMass_ *= 0.5*hbar*hbar;
// m_e in units [eV-ps^2/A^2] : 5.68562958414706e-32
double scale = 3.80998192145007; // units [V A^2]
invEffectiveMass_ *= scale;
parameters_["inverse_effective_mass"] = invEffectiveMass_;
}
}
}
}
else if (line[0] == "electron_drag") {
registry_.insert("electron_drag_power");
registry_.insert("electron_drag_coefficient");
if (line[1] == "null") {
if (electronDragPower_) delete electronDragPower_;
electronDragPower_ = new ElectronDragPower();
}
else if (line[1] == "linear") {
if (electronDragPower_) delete electronDragPower_;
electronDragPower_ = new ElectronDragPowerLinear(fileId,
parameters_,
this);
}
}
else if (line[0] == "electron_recombination") {
registry_. insert("electron_recombination");
if (line[1] == "linear") {
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0) continue;
if (line[0] == "end") break;
double value = str2dbl(line[1]);
if (line[0] == "inv_relaxation_time") {
electronRecombinationInvTau_ = value;
parameters_["inv_relaxation_time"] = electronRecombinationInvTau_;
}
else if (line[0] == "equilibrium_carrier_density") {
electronEquilibriumDensity_ = value;
parameters_["equilibrium_carrier_density"]
= electronEquilibriumDensity_;
}
}
}
}
else if (line[0] == "electron_density") { // density is converted to charge
registry_. insert("electron_charge_density");
if (line[1] == "null") {
if (electronChargeDensity_) delete electronChargeDensity_;
electronChargeDensity_ = new ElectronChargeDensity();
}
else if (line[1] == "linear") {
linearSource_(ELECTRIC_POTENTIAL) = false;
if (electronChargeDensity_) delete electronChargeDensity_;
electronChargeDensity_ = new ElectronChargeDensityLinear(fileId, parameters_);
}
else if (line[1] == "interpolation") {
linearSource_(ELECTRIC_POTENTIAL) = false;
if (electronChargeDensity_) delete electronChargeDensity_;
electronChargeDensity_ = new ElectronChargeDensityInterpolation(fileId, parameters_);
}
else if (line[1] == "exponential") {
linearSource_(ELECTRIC_POTENTIAL) = false;
if (electronChargeDensity_) delete electronChargeDensity_;
electronChargeDensity_ = new ElectronChargeDensityExponential(fileId, parameters_);
}
else if (line[1] == "fermi_dirac") {
registry_. insert("band_edge_potential");
//linearSource_(ELECTRIC_POTENTIAL) = false; // treated as constant
if (electronChargeDensity_) delete electronChargeDensity_;
electronChargeDensity_ = new ElectronChargeDensityFermiDirac(fileId, parameters_);
}
else {
throw ATC_Error("unrecognized material function type: "+line[0]+" - "+line[1]);
}
}
else {
throw ATC_Error( "unrecognized material function: "+line[0]);
}
}
}
//--------------------------------------------------------------------
Material::~Material()
{
if (electronDragPower_) delete electronDragPower_;
if (electronChargeDensity_) delete electronChargeDensity_;
if (electronHeatCapacity_) delete electronHeatCapacity_;
if (electronHeatFlux_) delete electronHeatFlux_;
if (electronFlux_) delete electronFlux_;
if (stress_) delete stress_;
if (viscousStress_) delete viscousStress_;
if (bodyForce_) delete bodyForce_;
if (electronPhononExchange_) delete electronPhononExchange_;
}
//---------------------------------------------------------------------
void Material::initialize(){if (stress_) stress_->initialize();}
void Material::heat_capacity(
const FIELD_MATS & fields,
DENS_MAT & capacity) const
{
const DENS_MAT & T = (fields.find(TEMPERATURE))->second;
int nNodes = T.nRows();
capacity.reset(nNodes,1);
capacity = heatCapacity_;
};
//---------------------------------------------------------------------
void Material::thermal_energy(
const FIELD_MATS &fields,
DENS_MAT &energy) const
{
const DENS_MAT & T = (fields.find(TEMPERATURE))->second;
energy = heatCapacity_ * T;
};
//---------------------------------------------------------------------
void Material::electron_heat_capacity(
const FIELD_MATS & fields,
DENS_MAT & capacity) const
{
electronHeatCapacity_->electron_heat_capacity(fields,capacity);
};
//---------------------------------------------------------------------
void Material::D_electron_heat_capacity(
const FIELD_MATS & fields,
const GRAD_FIELD_MATS & gradFields,
DENS_MAT_VEC & Dcapacity) const
{
electronHeatCapacity_->D_electron_heat_capacity(fields,gradFields,Dcapacity);
};
//---------------------------------------------------------------------
void Material::electron_thermal_energy(
const FIELD_MATS &fields,
DENS_MAT &energy) const
{
electronHeatCapacity_->electron_thermal_energy(fields,energy);
};
//---------------------------------------------------------------------
void Material::mass_density(
const FIELD_MATS &fields,
DENS_MAT &density) const
{
int nNodes = 0;
FIELD_MATS::const_iterator field = fields.find(MASS_DENSITY);
if (field != fields.end()) {
const DENS_MAT & d = field->second;
nNodes = d.nRows();
}
else {
FIELD_MATS::const_iterator field = fields.find(VELOCITY);
if (field != fields.end()) {
const DENS_MAT & v = field->second;
nNodes = v.nRows();
}
}
density.reset(nNodes,1);
density = massDensity_;
};
//---------------------------------------------------------------------
void Material::electron_mass_density(
const FIELD_MATS &fields,
DENS_MAT &density) const
{
int nNodes = 0;
FIELD_MATS::const_iterator field = fields.find(ELECTRON_DENSITY);
//if (field != fields.end()) {
const DENS_MAT & d = field->second;
nNodes = d.nRows();
//}
density.reset(nNodes,1);
inv_effective_mass(fields,density);
density = d.div_by_element(density);
};
//---------------------------------------------------------------------
void Material::kinetic_energy(
const FIELD_MATS &fields,
DENS_MAT &energy) const
{
FIELD_MATS::const_iterator field = fields.find(VELOCITY);
if (field != fields.end()) {
const DENS_MAT & v = field->second;
energy = 0.5*massDensity_*v;
energy *= v;
}
else {
energy = 0.;
}
};
//---------------------------------------------------------------------
void Material::permittivity(
const FIELD_MATS &fields,
DENS_MAT &density) const
{
const DENS_MAT & phi = (fields.find(ELECTRIC_POTENTIAL))->second;
int nNodes = phi.nRows();
density.reset(nNodes,1);
density = permittivity_;
};
//---------------------------------------------------------------------
void Material::band_edge_potential(
const FIELD_MATS &fields,
DENS_MAT &density) const
{
electronChargeDensity_->band_edge_potential(fields,density);
};
//---------------------------------------------------------------------
void Material::inv_effective_mass(
const FIELD_MATS &fields,
DENS_MAT &density) const
{
const DENS_MAT & phi = (fields.find(ELECTRON_DENSITY))->second;
int nNodes = phi.nRows();
density.reset(nNodes,1);
density = invEffectiveMass_;
};
//---------------------------------------------------------------------
void Material::heat_flux(
const FIELD_MATS & fields,
const GRAD_FIELD_MATS & gradFields,
DENS_MAT_VEC & flux) const
{
const DENS_MAT_VEC & dT = (gradFields.find(TEMPERATURE))->second;
flux[0] = -heatConductivity_* dT[0];
flux[1] = -heatConductivity_* dT[1];
flux[2] = -heatConductivity_* dT[2];
}
//---------------------------------------------------------------------
void Material::electron_heat_flux(
const FIELD_MATS & fields,
const GRAD_FIELD_MATS & gradFields,
DENS_MAT_VEC & flux) const
{
electronHeatFlux_->electron_heat_flux(fields,gradFields,flux);
}
//---------------------------------------------------------------------
void Material::electron_heat_convection(
const FIELD_MATS & fields,
DENS_MAT_VEC & flux) const
{
electronHeatFlux_->electron_heat_convection(fields,flux);
}
//---------------------------------------------------------------------
bool Material::electron_phonon_exchange(
const FIELD_MATS & fields,
DENS_MAT & flux) const
{
return electronPhononExchange_->electron_phonon_exchange(fields,flux);
}
//---------------------------------------------------------------------
void Material::electron_drag_velocity_coefficient(
const FIELD_MATS &fields,
DENS_MAT & dragCoef) const
{
electronDragPower_->electron_drag_velocity_coefficient(fields,dragCoef);
}
//---------------------------------------------------------------------
bool Material::electron_drag_power(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT & power) const
{
return electronDragPower_->electron_drag_power(fields,gradFields,power);
}
//---------------------------------------------------------------------
bool Material::electron_recombination(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT & recombination) const
{
// 1/tau (n - n0)
const DENS_MAT & n = (fields.find(ELECTRON_DENSITY))->second;
recombination = n;
recombination -= electronEquilibriumDensity_;
recombination *= -electronRecombinationInvTau_;
return true;
}
//---------------------------------------------------------------------
bool Material::electron_charge_density(
const FIELD_MATS &fields,
DENS_MAT & density) const
{
return electronChargeDensity_->electron_charge_density(fields,density);
};
//---------------------------------------------------------------------
void Material::D_electron_charge_density(const FieldName fieldName,
const FIELD_MATS &fields,
DENS_MAT & D_density) const
{
electronChargeDensity_->D_electron_charge_density(fieldName,fields,D_density);
};
//---------------------------------------------------------------------
bool Material::body_force(
const FIELD_MATS &fields,
DENS_MAT & density) const
{
return bodyForce_->body_force(fields,density);
};
//---------------------------------------------------------------------
void Material::stress(
const FIELD_MATS & fields,
const GRAD_FIELD_MATS & gradFields,
DENS_MAT_VEC & stress) const
{
stress_->stress(fields,gradFields,stress);
}
//---------------------------------------------------------------------
void Material::elastic_energy(
const FIELD_MATS & fields,
const GRAD_FIELD_MATS & gradFields,
DENS_MAT & energy) const
{
stress_->elastic_energy(fields,gradFields,energy);
}
//---------------------------------------------------------------------
void Material::viscous_stress(
const FIELD_MATS & fields,
const GRAD_FIELD_MATS & gradFields,
DENS_MAT_VEC & stress) const
{
viscousStress_->viscous_stress(fields,gradFields,stress);
}
//---------------------------------------------------------------------
void Material::viscosity(
const FIELD_MATS &fields,
DENS_MAT &coefs) const
{
viscousStress_->viscosity(fields,coefs);
}
//---------------------------------------------------------------------
void Material::electron_flux(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux) const
{
electronFlux_->electron_flux(fields,gradFields,flux);
}
//---------------------------------------------------------------------
void Material::electric_field(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux) const
{
// E = - grad \phi
const DENS_MAT_VEC & dphi = (gradFields.find(ELECTRIC_POTENTIAL))->second;
flux[0] = -1.0* dphi[0];
flux[1] = -1.0* dphi[1];
flux[2] = -1.0* dphi[2];
}
//---------------------------------------------------------------------
void Material::electric_displacement(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux) const
{
// D = - permitivity grad \phi
const DENS_MAT_VEC & dphi = (gradFields.find(ELECTRIC_POTENTIAL))->second;
flux[0] = -permittivity_* dphi[0];
flux[1] = -permittivity_* dphi[1];
flux[2] = -permittivity_* dphi[2];
}
//---------------------------------------------------------------------
} // end namespace
diff --git a/lib/atc/Material.h b/lib/atc/Material.h
index 5b20b619e..18cccd879 100644
--- a/lib/atc/Material.h
+++ b/lib/atc/Material.h
@@ -1,248 +1,248 @@
#ifndef MATERIAL_H
#define MATERIAL_H
#include <map>
#include <set>
#include <string>
#include "MatrixLibrary.h"
#include "ATC_TypeDefs.h"
#include "ATC_Error.h"
#include "LammpsInterface.h"
namespace ATC
{
class BodyForce;
class Stress;
class ViscousStress;
class ElectronChargeDensity;
class ElectronHeatCapacity;
class ElectronHeatFlux;
class ElectronFlux;
class ElectronPhononExchange;
class ElectronDragPower;
/**
* @class Material
* @brief Base class for computing and storing properties and fields for a material
*/
class Material
{
public:
Material();
virtual ~Material();
/** this constructor parses material file */
- Material(string & tag, fstream & fileId);
+ Material(std::string & tag, std::fstream & fileId);
/** initialize */
virtual void initialize();
/** return label */
- string label(void) const {return tag_;}
+ std::string label(void) const {return tag_;}
/** check material has required interfaces */
- bool check_registry(const set<string> functionList) const
+ bool check_registry(const std::set<std::string> functionList) const
{
- set<string>::const_iterator itr;
+ std::set<std::string>::const_iterator itr;
for (itr=functionList.begin(); itr!=functionList.end(); itr++) {
if (registry_.find(*itr) == registry_.end()) {
- stringstream ss;
+ std::stringstream ss;
ss << "WARNING: material: [" << tag_ << "] cannot find " << *itr ;
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
if (registry_.find(*itr) == registry_.end()) return false;
}
return true;
}
/** access to material parameters */
- bool parameter(const string name, double & value) const
+ bool parameter(const std::string name, double & value) const
{
- map<string,double>::const_iterator iter = parameters_.find(name);
+ std::map<std::string,double>::const_iterator iter = parameters_.find(name);
if ( iter == parameters_.end()) {
value = 0.0;
return false;
}
value = iter->second;
return true;
}
/** true if rhs flux is linear (per field) */
bool linear_flux(FieldName name) const {
return linearFlux_(name);
};
/** true if rhs source is linear (per field) */
bool linear_source(FieldName name) const {
return linearSource_(name);
};
/** true if lhs density is constant (per field) */
bool constant_density(FieldName name) const {
return constantDensity_(name);
};
/** each of these is a field function computed at a set of points */
/** if there is only one function it is in the base class
** otherwise, a subsidary class is setup */
/* -----------------------------------------------------------------*/
/** densities */
/* -----------------------------------------------------------------*/
/** thermal energy */
void thermal_energy(const FIELD_MATS & fields,
DENS_MAT & energy) const;
/** heat capacity */
void heat_capacity(const FIELD_MATS & fields,
DENS_MAT & capacity) const;
/** thermal energy */
void electron_thermal_energy(const FIELD_MATS & fields,
DENS_MAT & energy) const;
/** electron capacities */
void electron_mass_density(const FIELD_MATS &fields,
DENS_MAT &density) const;
void electron_heat_capacity(const FIELD_MATS &fields,
DENS_MAT &capacity) const;
/** derivative of electron heat capacity */
void D_electron_heat_capacity(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &Dcapacity) const;
/** kinetic energy */
void kinetic_energy(const FIELD_MATS & fields,
DENS_MAT & energy) const;
/** mass density */
void mass_density(const FIELD_MATS &fields,
DENS_MAT &density) const;
/** elastic energy */
void elastic_energy(const FIELD_MATS & fields,
const GRAD_FIELD_MATS & gradFields,
DENS_MAT & energy) const;
/** permitivity */
void permittivity(const FIELD_MATS & fields,
DENS_MAT & energy) const;
/** inverse effective mass */
void inv_effective_mass(const FIELD_MATS & fields,
DENS_MAT & energy) const;
/** band-edge potential */
void band_edge_potential(const FIELD_MATS & fields,
DENS_MAT & energy) const;
/** viscosity */
void viscosity(const FIELD_MATS & fields,
DENS_MAT & energy) const;
/* -----------------------------------------------------------------*/
/** fluxes */
/* -----------------------------------------------------------------*/
/** heat_flux */
void heat_flux(const FIELD_MATS & fields,
const GRAD_FIELD_MATS & gradFields,
DENS_MAT_VEC & heatFlux) const;
/** electron conduction flux */
void electron_heat_flux(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux) const;
/** electron heat convection */
void electron_heat_convection(const FIELD_MATS &fields,
DENS_MAT_VEC &flux) const;
/** electron momentum convection */
void electron_momentum_convection(const FIELD_MATS &fields,
DENS_MAT_VEC &flux) const;
/** stress */
void stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &stress) const;
/** viscous stress */
void viscous_stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &viscousStress) const;
/** computes electron flux */
void electron_flux(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux) const;
void electron_thermal_stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &stress) const;
/** computes electric displacement */
void electric_displacement(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux) const;
/** computes electric field */
void electric_field(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux) const;
/* -----------------------------------------------------------------*/
/** sources */
/* -----------------------------------------------------------------*/
/** electron-phonon exchange flux */
bool electron_phonon_exchange(const FIELD_MATS &fields,
DENS_MAT &flux) const;
bool electron_drag_power(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT &power) const;
void electron_drag_velocity_coefficient(const FIELD_MATS &fields,
DENS_MAT &dragCoef) const;
/** computes net generation */
virtual bool electron_recombination(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT &recombination) const;
/** computes drift diffusion charge density */
virtual bool electron_charge_density(const FIELD_MATS &fields,
DENS_MAT &density) const;
virtual void D_electron_charge_density(const FieldName fieldName,
const FIELD_MATS &fields,
DENS_MAT &D_density) const;
/** computes momentum source */
virtual bool body_force(const FIELD_MATS &fields,
DENS_MAT &density) const;
protected:
/** material's label */
- string tag_;
+ std::string tag_;
/** dictionary of material parameters */
- map<string,double> parameters_;
+ std::map<std::string,double> parameters_;
/** dictionary of instantiated functions */
- set<string> registry_;
+ std::set<std::string> registry_;
/** per eqn flag of constant density */
Array<bool> constantDensity_;
/** per eqn flag of linearity/nonlinearity */
Array<bool> linearFlux_, linearSource_;
/** default heat capacity */
double rhoCp_;
/** heat capacity */
double heatCapacity_;
/** electron heat capacity */
ElectronHeatCapacity * electronHeatCapacity_;
/** mass density */
double massDensity_;
/** thermal conductivity */
double heatConductivity_;
/** electron heat flux */
ElectronHeatFlux * electronHeatFlux_;
/** stress */
Stress * stress_;
/** viscous stress */
ViscousStress * viscousStress_;
/** body force */
BodyForce * bodyForce_;
/** electron-phonon exchange */
ElectronPhononExchange * electronPhononExchange_;
/** electron drag power */
ElectronDragPower * electronDragPower_;
/** electron flux */
ElectronFlux * electronFlux_;
/** electric permittivity */
double permittivity_;
/** inverse effective mass */
double invEffectiveMass_;
/** equilibrium carrier density */
double electronEquilibriumDensity_;
/** relaxation time */
double electronRecombinationInvTau_;
/** electron charge density model */
ElectronChargeDensity * electronChargeDensity_;
};
}
#endif // Material.h
diff --git a/lib/atc/Matrix.h b/lib/atc/Matrix.h
index 4f84a5759..179bea52b 100644
--- a/lib/atc/Matrix.h
+++ b/lib/atc/Matrix.h
@@ -1,1019 +1,1019 @@
#ifndef MATRIX_H
#define MATRIX_H
#include "MatrixDef.h"
namespace ATC_matrix {
static const int myPrecision = 15;
/**
* @class Matrix
* @brief Base class for linear algebra subsystem
*/
template<typename T>
class Matrix
{
protected:
Matrix(const Matrix &c);
public:
Matrix() {}
virtual ~Matrix() {}
//* stream output functions
- void print(ostream &o) const { o << to_string(); }
- void print(ostream &o, const string &name) const;
- friend ostream& operator<<(ostream &o, const Matrix<T> &m){m.print(o); return o;}
+ void print(std::ostream &o) const { o << to_string(); }
+ void print(std::ostream &o, const std::string &name) const;
+ friend std::ostream& operator<<(std::ostream &o, const Matrix<T> &m){m.print(o); return o;}
void print() const;
- virtual void print(const string &name) const;
- virtual string to_string() const;
+ virtual void print(const std::string &name) const;
+ virtual std::string to_string() const;
// element by element operations
DenseMatrix<T> operator/(const Matrix<T>& B) const;
DenseMatrix<T> pow(int n) const;
DenseMatrix<T> pow(double n) const;
// functions that return a copy
DenseMatrix<T> transpose() const;
- void row_partition(const set<int> & rowsIn, set<int> & rows, set<int> & colsC,
+ void row_partition(const std::set<int> & rowsIn, std::set<int> & rows, std::set<int> & colsC,
DenseMatrix<T> & A1, DenseMatrix<T> & A2, bool complement=true) const;
- set<int> row_partition(const set<int> & rows,
+ std::set<int> row_partition(const std::set<int> & rows,
DenseMatrix<T> & A1, DenseMatrix<T> & A2) const;
- void map(const set<int>& rows, const set<int>& cols, DenseMatrix<T> & A) const;
- void insert(const set<int>& rows, const set<int>& cols, const DenseMatrix<T> & A);
- void assemble(const set<int>& rows, const set<int>& cols, const DenseMatrix<T> & A);
+ void map(const std::set<int>& rows, const std::set<int>& cols, DenseMatrix<T> & A) const;
+ void insert(const std::set<int>& rows, const std::set<int>& cols, const DenseMatrix<T> & A);
+ void assemble(const std::set<int>& rows, const std::set<int>& cols, const DenseMatrix<T> & A);
// matrix to scalar functions
T sum() const;
T stdev() const;
T max() const;
T min() const;
T maxabs() const;
T minabs() const;
T norm() const;
T norm_sq() const;
T mean() const;
T dot(const Matrix<T> &r) const;
T trace() const;
// row and column operations
T row_sum (INDEX i=0) const { return row(*this,i).sum(); }
T row_mean (INDEX i=0) const { return row(*this,i).mean(); }
T row_norm (INDEX i=0) const { return row(*this,i).norm(); }
T row_min (INDEX i=0) const { return row(*this,i).min(); }
T row_max (INDEX i=0) const { return row(*this,i).max(); }
T row_stdev(INDEX i=0) const { return row(*this,i).stdev(); }
T col_sum (INDEX i=0) const { return column(*this,i).sum(); }
T col_mean (INDEX i=0) const { return column(*this,i).mean(); }
T col_norm (INDEX i=0) const { return column(*this,i).norm(); }
T col_min (INDEX i=0) const { return column(*this,i).min(); }
T col_max (INDEX i=0) const { return column(*this,i).max(); }
T col_stdev(INDEX i=0) const { return column(*this,i).stdev(); }
// pure virtual functions (required to implement these) ---------------------
//* reference index operator
virtual T& operator()(INDEX i, INDEX j)=0;
//* value index operator
virtual T operator()(INDEX i, INDEX j)const=0;
//* value flat index operator
virtual T& operator [](INDEX i)=0;
//* reference flat index operator
virtual T operator [](INDEX i) const=0;
//* returns the # of rows
virtual INDEX nRows() const=0;
//* returns the # of columns
virtual INDEX nCols() const=0;
//* returns a pointer to the data (dangerous)
virtual T * ptr() const=0;
//* resizes the matrix, copy what fits default to OFF
virtual void resize(INDEX nRows, INDEX nCols=1, bool copy=false)=0;
//* resizes the matrix, zero it out default to ON
virtual void reset(INDEX nRows, INDEX nCols=1, bool zero=true)=0;
//* resizes and copies data
virtual void copy(const T * ptr, INDEX nRows, INDEX nCols=1)=0;
//* create restart file
virtual void write_restart(FILE *f) const=0;
//* writes a matlab command to recreate this in a variable named s
- virtual void matlab(ostream &o, const string &s="M") const;
+ virtual void matlab(std::ostream &o, const std::string &s="M") const;
//* writes a mathematica command to recreate this in a variable named s
- virtual void mathematica(ostream &o, const string &s="M") const;
+ virtual void mathematica(std::ostream &o, const std::string &s="M") const;
// output to matlab, with variable name s
- void matlab(const string &s="M") const;
+ void matlab(const std::string &s="M") const;
// output to mathematica, with variable name s
- void mathematica(const string &s="M") const;
+ void mathematica(const std::string &s="M") const;
Matrix<T>& operator+=(const Matrix &r);
Matrix<T>& operator-=(const Matrix &r);
Matrix<T>& operator*=(const Matrix<T>& R);
Matrix<T>& operator/=(const Matrix<T>& R);
Matrix<T>& operator+=(const T v);
Matrix<T>& operator-=(const T v);
Matrix<T>& operator*=(const T v);
Matrix<T>& operator/=(T v);
Matrix<T>& divide_zero_safe(const Matrix<T>& B);
Matrix<T>& operator=(const T &v);
Matrix<T>& operator=(const Matrix<T> &c);
virtual void set_all_elements_to(const T &v);
//* adds a matrix scaled by factor s to this one.
void add_scaled(const Matrix<T> &A, const T& s);
//* sets all elements to zero
Matrix& zero();
//* sets matrix to the identity
Matrix& identity(int nrows=0);
//* returns the total number of elements
virtual INDEX size() const;
//* returns true if (i,j) is within the range of the matrix
bool in_range(INDEX i, INDEX j) const;
//* returns true if the matrix size is rs x cs
bool is_size(INDEX rs, INDEX cs) const;
//* returns true if the matrix is square and not empty
bool is_square() const;
//* returns true if Matrix, m, is the same size as this
bool same_size(const Matrix &m) const;
//* returns true if Matrix a and Matrix b are the same size
static bool same_size(const Matrix<T> &a, const Matrix<T> &b);
//* returns true if Matrix a rows are equal to Matrix b cols
static bool cols_equals_rows(const Matrix<T> &a, const Matrix<T> &b);
//* checks if memory is contiguous, only can be false for clone vector
virtual bool memory_contiguous() const { return true; }
//* checks if all values are within the prescribed range
virtual bool check_range(T min, T max) const;
protected:
virtual void _set_equal(const Matrix<T> &r);
};
//* Matrix operations
//@{
//* Sets C as b*C + a*A[tranpose?]*B[transpose?]
template<typename T>
void MultAB(const Matrix<T> &A, const Matrix<T> &B, DenseMatrix<T> &C,
bool At=0, bool Bt=0, T a=1, T b=0);
//* performs a matrix-vector multiply
template<typename T>
void MultMv(const Matrix<T> &A, const Vector<T> &v, DenseVector<T> &c,
const bool At, T a, T b);
// returns the inverse of a double precision matrix
DenseMatrix<double> inv(const Matrix<double>& A);
// returns the eigensystem of a pair of double precision matrices
DenseMatrix<double> eigensystem(const Matrix<double>& A, const Matrix<double>& B, DenseMatrix<double> & eVals, bool normalize = true);
// returns the polar decomposition of a double precision matrix
DenseMatrix<double> polar_decomposition(const Matrix<double>& A, DenseMatrix<double> & rotation, DenseMatrix<double> & stretch, bool leftRotation = true);
//* returns the trace of a matrix
template<typename T>
T trace(const Matrix<T>& A) { return A.trace(); }
//* computes the determinant of a square matrix
double det(const Matrix<double>& A);
//* Returns the maximum eigenvalue of a matrix.
double max_eigenvalue(const Matrix<double>& A);
//@}
//-----------------------------------------------------------------------------
// computes the sum of the difference squared of each element.
//-----------------------------------------------------------------------------
template<typename T>
double sum_difference_squared(const Matrix<T>& A, const Matrix<T> &B)
{
SSCK(A, B, "sum_difference_squared");
double v=0.0;
for (INDEX i=0; i<A.size(); i++) {
double d = A[i]-B[i];
v += d*d;
}
return v;
}
//-----------------------------------------------------------------------------
//* Operator for Matrix-matrix product
//-----------------------------------------------------------------------------
template<typename T>
DenseMatrix<T> operator*(const Matrix<T> &A, const Matrix<T> &B)
{
DenseMatrix<T> C(0,0,false);
MultAB(A,B,C);
return C;
}
//-----------------------------------------------------------------------------
//* Multiply a Matrix by a scalar
//-----------------------------------------------------------------------------
template<typename T>
DenseMatrix<T> operator*(const Matrix<T> &M, const T s)
{
DenseMatrix<T> R(M);
return R*=s;
}
//-----------------------------------------------------------------------------
//* Multiply a Matrix by a scalar
template<typename T>
DenseMatrix<T> operator*(const T s, const Matrix<T> &M)
{
DenseMatrix<T> R(M);
return R*=s;
}
//-----------------------------------------------------------------------------
//* inverse scaling operator - must always create memory
template<typename T>
DenseMatrix<T> operator/(const Matrix<T> &M, const T s)
{
DenseMatrix<T> R(M);
return R*=(1.0/s); // for integer types this may be worthless
}
//-----------------------------------------------------------------------------
//* Operator for Matrix-matrix sum
template<typename T>
DenseMatrix<T> operator+(const Matrix<T> &A, const Matrix<T> &B)
{
DenseMatrix<T> C(A);
return C+=B;
}
//-----------------------------------------------------------------------------
//* Operator for Matrix-matrix subtraction
template<typename T>
DenseMatrix<T> operator-(const Matrix<T> &A, const Matrix<T> &B)
{
DenseMatrix<T> C(A);
return C-=B;
}
/******************************************************************************
* Template definitions for class Matrix
******************************************************************************/
//-----------------------------------------------------------------------------
//* performs a matrix-matrix multiply with general type implementation
template<typename T>
void MultAB(const Matrix<T> &A, const Matrix<T> &B, DenseMatrix<T> &C,
const bool At, const bool Bt, T a, T b)
{
const INDEX sA[2] = {A.nRows(), A.nCols()}; // m is sA[At] k is sA[!At]
const INDEX sB[2] = {B.nRows(), B.nCols()}; // k is sB[Bt] n is sB[!Bt]
const INDEX M=sA[At], K=sB[Bt], N=sB[!Bt]; // M is the number of rows in A or Atrans (sA[At]),
// K is the number of rows in B or Btrans (sB[Bt], sA[!At]),
// N is the number of columns in B or Btrans (sB[!Bt]).
GCK(A, B, sA[!At]!=K, "MultAB<T> shared index not equal size");
if (!C.is_size(M,N))
{
C.resize(M,N); // set size of C
C.zero();
}
else C *= b; // Zero C
for (INDEX p=0; p<M; p++) {
INDEX p_times_At = p*At;
INDEX p_times_notAt = p*!At;
for (INDEX q=0; q<N; q++) {
INDEX q_times_Bt = q*Bt;
INDEX q_times_notBt = q*!Bt;
for (INDEX r=0; r<K; r++) {
INDEX ai = p_times_notAt+r*At;
INDEX aj = p_times_At+r*!At;
INDEX bi = r*!Bt+q_times_Bt;
INDEX bj = r*Bt+q_times_notBt;
T a_entry = A(ai, aj);
T b_entry = B(bi, bj);
T mult = a_entry * b_entry;
C(p,q) += mult;
}
}
}
}
//-----------------------------------------------------------------------------
//* output operator
template<typename T>
-string Matrix<T>::to_string() const
+std::string Matrix<T>::to_string() const
{
- string s;
+ std::string s;
for (INDEX i=0; i<nRows(); i++)
{
if (i) s += '\n';
for (INDEX j=0; j<nCols(); j++)
{
if (j) s+= '\t';
s += ATC_Utility::to_string((*this)(i,j),myPrecision)+" ";
}
}
return s;
}
//-----------------------------------------------------------------------------
//* output operator that wraps the matrix in a nice labeled box
template<typename T>
-void Matrix<T>::print(ostream &o, const string &name) const
+void Matrix<T>::print(std::ostream &o, const std::string &name) const
{
o << "------- Begin "<<name<<" -----------------\n";
this->print(o);
o << "\n------- End "<<name<<" -------------------\n";
}
//-----------------------------------------------------------------------------
//* print operator, use cout by default
template<typename T>
void Matrix<T>::print() const
{
- print(cout);
+ print(std::cout);
}
//-----------------------------------------------------------------------------
//* named print operator, use cout by default
template<typename T>
-void Matrix<T>::print(const string &name) const
+void Matrix<T>::print(const std::string &name) const
{
- print(cout, name);
+ print(std::cout, name);
}
//-----------------------------------------------------------------------------
//* element by element division
template<typename T>
DenseMatrix<T> Matrix<T>::operator/ (const Matrix<T>& B) const
{
SSCK(*this, B, "Matrix<T>::Operator/");
DenseMatrix<T> R(*this);
R /= B;
return R;
}
//-----------------------------------------------------------------------------
//* element-wise raise to a power
template<typename T>
DenseMatrix<T> Matrix<T>::pow(int n) const
{
DenseMatrix<T> R(*this);
int sz=this->size(); for(INDEX i=0; i<sz; i++)
{
double val = R[i];
for (int k=1; k<n; k++) val *= R[i];
for (int k=n; k<1; k++) val /= R[i];
R[i] = val;
}
return R;
}
//-----------------------------------------------------------------------------
//* element-wise raise to a power
template<typename T>
DenseMatrix<T> Matrix<T>::pow(double n) const
{
DenseMatrix<T> R(*this);
int sz=this->size(); for(INDEX i=0; i<sz; i++)
{
double val = R[i];
R[i] = pow(val,n);
}
return R;
}
//-----------------------------------------------------------------------------
//* returns the transpose of this matrix (makes a copy)
template <typename T>
DenseMatrix<T> Matrix<T>::transpose() const
{
DenseMatrix<T> t(this->nCols(), this->nRows());
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
t(j,i) = (*this)(i,j);
return t;
}
//-----------------------------------------------------------------------------
//* returns the transpose of a matrix (makes a copy)
template <typename T>
DenseMatrix<T> transpose(const Matrix<T> &A)
{
return A.transpose();
}
//-----------------------------------------------------------------------------
//* Returns the sum of all matrix elements
template<typename T>
T Matrix<T>::sum() const
{
if (!size()) return T(0);
T v = (*this)[0];
for (INDEX i=1; i<this->size(); i++) v += (*this)[i];
return v;
}
//-----------------------------------------------------------------------------
//* Returns the standard deviation of the matrix
template<typename T>
T Matrix<T>::stdev() const
{
GCHK(this->size()<2, "Matrix::stdev() size must be > 1");
T mean = this->mean();
T diff = (*this)[0]-mean;
T stdev = diff*diff;
for (INDEX i=1; i<this->size(); i++)
{
diff = (*this)[i]-mean;
stdev += diff*diff;
}
return sqrt(stdev/T(this->size()-1));
}
//-----------------------------------------------------------------------------
//* Returns the maximum of the matrix
template<typename T>
T Matrix<T>::max() const
{
GCHK(!this->size(), "Matrix::max() size must be > 0");
T v = (*this)[0];
for (INDEX i=1; i<this->size(); i++) v = std::max(v, (*this)[i]);
return v;
}
//-----------------------------------------------------------------------------
//* Returns the minimum of the matrix
template<typename T>
T Matrix<T>::min() const
{
GCHK(!this->size(), "Matrix::min() size must be > 0");
T v = (*this)[0];
for (INDEX i=1; i<this->size(); i++) v = std::min(v, (*this)[i]);
return v;
}
//-----------------------------------------------------------------------------
//* Returns the maximum absolute value of the matrix
template<typename T>
T Matrix<T>::maxabs() const
{
GCHK(!this->size(), "Matrix::maxabs() size must be > 0");
T v = (*this)[0];
for (INDEX i=1; i<this->size(); i++) v = ATC_Utility::max_abs(v, (*this)[i]);
return v;
}
//-----------------------------------------------------------------------------
//* Returns the minimum absoute value of the matrix
template<typename T>
T Matrix<T>::minabs() const
{
GCHK(!this->size(), "Matrix::minabs() size must be > 0");
T v = (*this)[0];
for (INDEX i=1; i<this->size(); i++) v = ATC_Utility::min_abs(v, (*this)[i]);
return v;
}
//-----------------------------------------------------------------------------
//* returns the L2 norm of the matrix
template<typename T>
T Matrix<T>::norm() const
{
GCHK(!this->size(), "Matrix::norm() size must be > 0");
return sqrt(dot(*this));
}
//-----------------------------------------------------------------------------
//* returns the L2 norm of the matrix
template<typename T>
T Matrix<T>::norm_sq() const
{
GCHK(!this->size(), "Matrix::norm() size must be > 0");
return dot(*this);
}
//-----------------------------------------------------------------------------
//* returns the average of the matrix
template<typename T>
T Matrix<T>::mean() const
{
GCHK(!this->size(), "Matrix::mean() size must be > 0");
return sum()/T(this->size());
}
//-----------------------------------------------------------------------------
//* Returns the dot product of two vectors
template<typename T>
T Matrix<T>::dot(const Matrix<T>& r) const
{
SSCK(*this, r, "Matrix<T>::dot");
if (!this->size()) return T(0);
T v = r[0]*(*this)[0];
for (INDEX i=1; i<this->size(); i++) v += r[i]*(*this)[i];
return v;
}
//-----------------------------------------------------------------------------
// returns the sum of the matrix diagonal
//-----------------------------------------------------------------------------
template<typename T>
T Matrix<T>::trace() const
{
const INDEX N = std::min(nRows(),nCols());
if (!N) return T(0);
T r = (*this)(0,0);
for (INDEX i=0; i<N; i++)
r += (*this)(i,i);
return r;
}
//-----------------------------------------------------------------------------
//* Adds a matrix to this one
template<typename T>
Matrix<T>& Matrix<T>::operator+=(const Matrix &r)
{
SSCK(*this, r, "operator+= or operator +");
int sz=this->size(); for(INDEX i=0; i<sz; i++) (*this)[i]+=r[i];
return *this;
}
//-----------------------------------------------------------------------------
// subtracts a matrix from this one
//-----------------------------------------------------------------------------
template<typename T>
Matrix<T>& Matrix<T>::operator-=(const Matrix &r)
{
SSCK(*this, r, "operator-= or operator -");
int sz=this->size(); for(INDEX i=0; i<sz; i++) (*this)[i]-=r[i];
return *this;
}
//-----------------------------------------------------------------------------
// multiplies each element in this by the corresponding element in R
//-----------------------------------------------------------------------------
template<typename T>
Matrix<T>& Matrix<T>::operator*=(const Matrix<T>& R)
{
if ((R.nCols()==1) && (this->nCols()>1)) { // multiply every entry in a row by the same value
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
{
(*this)(i,j) *= R[i];
}
}
else if (((R.nCols()==R.size()) && (R.nRows()==R.size())) && !((this->nCols()==this->size()) && (this->nRows()==this->size()))){
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
{
(*this)(i,j) *= R[i];
}
}
else { // multiply each entry by a different value
int sz = this->size();
for (INDEX i = 0; i < sz; i++)
{
(*this)[i] *= R[i];
}
}
return *this;
}
//-----------------------------------------------------------------------------
// divides each element in this by the corresponding element in R
//-----------------------------------------------------------------------------
template<typename T>
Matrix<T>& Matrix<T>::operator/=(const Matrix<T>& R)
{
if ((R.nCols()==1) && (this->nCols()>1)) { // divide every entry in a row by the same value
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
{
(*this)(i,j) /= R[i];
}
}
else { // divide each entry by a different value
SSCK(*this, R, "operator/= or operator/");
int sz = this->size();
for(INDEX i = 0; i < sz; i++)
{
GCHK(fabs(R[i])==0,"Operator/: division by zero");
(*this)[i] /= R[i];
}
}
return *this;
}
//-----------------------------------------------------------------------------
// divides each element in this by the corresponding element in R unless zero
//-----------------------------------------------------------------------------
template<typename T>
Matrix<T>& Matrix<T>::divide_zero_safe(const Matrix<T>& R)
{
if ((R.nCols()==1) && (this->nCols()>1)) { // divide every entry in a row by the same value
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
{
if(fabs(R[i])!=0) {
(*this)(i,j) /= R[i];
}
}
}
else { // divide each entry by a different value
SSCK(*this, R, "operator/= or operator/");
int sz = this->size();
for(INDEX i = 0; i < sz; i++)
{
if(fabs(R[i])!=0) {
(*this)[i] /= R[i];
}
}
}
return *this;
}
//-----------------------------------------------------------------------------
// scales this matrix by a constant
//-----------------------------------------------------------------------------
template<typename T>
Matrix<T>& Matrix<T>::operator*=(const T v)
{
int sz=this->size(); for(INDEX i=0; i<sz; i++) (*this)[i]*=v;
return *this;
}
//-----------------------------------------------------------------------------
// adds a constant to this matrix
//-----------------------------------------------------------------------------
template<typename T>
Matrix<T>& Matrix<T>::operator+=(const T v)
{
int sz=this->size(); for(INDEX i=0; i<sz; i++) (*this)[i]+=v;
return *this;
}
//-----------------------------------------------------------------------------
// substracts a constant to this matrix
//-----------------------------------------------------------------------------
template<typename T>
Matrix<T>& Matrix<T>::operator-=(const T v)
{
int sz=this->size(); for(INDEX i=0; i<sz; i++) (*this)[i]-=v;
return *this;
}
//-----------------------------------------------------------------------------
//* scales this matrix by the inverse of a constant
template<typename T>
Matrix<T>& Matrix<T>::operator/=(T v)
{
return (*this)*=(1.0/v);
}
//----------------------------------------------------------------------------
// Assigns one matrix to another
//----------------------------------------------------------------------------
template<typename T>
Matrix<T>& Matrix<T>::operator=(const Matrix<T> &r)
{
this->_set_equal(r);
return *this;
}
//----------------------------------------------------------------------------
// general matrix assignment (for densely packed matrices)
//----------------------------------------------------------------------------
template<typename T>
void Matrix<T>::_set_equal(const Matrix<T> &r)
{
this->resize(r.nRows(), r.nCols());
const Matrix<T> *pr = &r;
if (const SparseMatrix<T> *ps = sparse_cast(pr))
copy_sparse_to_matrix(ps, *this);
else if (diag_cast(pr)) // r is Diagonal?
{
this->zero();
for (INDEX i=0; i<r.size(); i++) (*this)(i,i) = r[i];
}
else memcpy(this->ptr(), r.ptr(), r.size()*sizeof(T));
}
//-----------------------------------------------------------------------------
//* sets all elements to a constant
template<typename T>
inline Matrix<T>& Matrix<T>::operator=(const T &v)
{
set_all_elements_to(v);
return *this;
}
//-----------------------------------------------------------------------------
//* sets all elements to a constant
template<typename T>
void Matrix<T>::set_all_elements_to(const T &v)
{
int sz=this->size(); for(INDEX i=0; i<sz; i++) (*this)[i] = v;
}
//----------------------------------------------------------------------------
// adds a matrix scaled by factor s to this one.
//----------------------------------------------------------------------------
template <typename T>
void Matrix<T>::add_scaled(const Matrix<T> &A, const T& s)
{
SSCK(A, *this, "Matrix::add_scaled");
int sz=this->size(); for(INDEX i=0; i<sz; i++) (*this)[i] += A[i]*s;
}
//-----------------------------------------------------------------------------
//* writes a matlab command to the console
template<typename T>
-void Matrix<T>::matlab(const string &s) const
+void Matrix<T>::matlab(const std::string &s) const
{
- this->matlab(cout, s);
+ this->matlab(std::cout, s);
}
//-----------------------------------------------------------------------------
//* Writes a matlab script defining the vector to the stream
template<typename T>
-void Matrix<T>::matlab(ostream &o, const string &s) const
+void Matrix<T>::matlab(std::ostream &o, const std::string &s) const
{
o << s <<"=zeros(" << nRows() << ","<<nCols()<<");\n";
int szi = this->nRows();
int szj = this->nCols();
for (INDEX i = 0; i < szi; i++)
for (INDEX j = 0; j < szj; j++)
o << s << "("<<i+1<<","<<j+1<<")=" << (*this)(i,j) << ";\n";
}
//-----------------------------------------------------------------------------
//* writes a mathematica command to the console
template<typename T>
-void Matrix<T>::mathematica(const string &s) const
+void Matrix<T>::mathematica(const std::string &s) const
{
- this->mathematica(cout, s);
+ this->mathematica(std::cout, s);
}
//-----------------------------------------------------------------------------
//* Writes a mathematica script defining the vector to the stream
template<typename T>
-void Matrix<T>::mathematica(ostream &o, const string &s) const
+void Matrix<T>::mathematica(std::ostream &o, const std::string &s) const
{
o << s <<" = { \n";
o.precision(15);
o << std::fixed;
for(INDEX i=0; i< nRows(); i++) {
o <<" { " << (*this)(i,0);
for(INDEX j=1; j< nCols(); j++) o << ", " << (*this)(i,j);
if (i+1 == nRows()) { o <<" } \n"; }
else { o <<" }, \n"; }
}
o << "};\n";
o << std::scientific;
}
//-----------------------------------------------------------------------------
//* sets all matrix elements to zero
template<typename T>
inline Matrix<T>& Matrix<T>::zero()
{
set_all_elements_to(T(0));
return *this;
}
//-----------------------------------------------------------------------------
//* sets to identity
template<typename T>
inline Matrix<T>& Matrix<T>::identity(int nrows)
{
if (nrows == 0) {
SQCK(*this, "DenseMatrix::inv(), matrix not square"); // check matrix is square
nrows = nRows();
}
reset(nrows,nrows);
for(INDEX i=0; i< nRows(); i++) (*this)(i,i) = 1;
return *this;
}
//-----------------------------------------------------------------------------
//* returns the total number of elements
template<typename T>
inline INDEX Matrix<T>::size() const
{
return nRows()*nCols();
}
//-----------------------------------------------------------------------------
//* returns true if (i,j) is within the range of the matrix
template<typename T>
inline bool Matrix<T>::in_range(INDEX i, INDEX j) const
{
return i<nRows() && j<nCols();
}
//-----------------------------------------------------------------------------
//* returns true if the matrix size is rs x cs
template<typename T>
inline bool Matrix<T>::is_size(INDEX rs, INDEX cs) const
{
return nRows()==rs && nCols()==cs;
}
//-----------------------------------------------------------------------------
//* returns true if the matrix is square and not empty
template<typename T>
inline bool Matrix<T>::is_square() const
{
return nRows()==nCols() && nRows();
}
//-----------------------------------------------------------------------------
//* returns true if Matrix, m, is the same size as this
template<typename T>
inline bool Matrix<T>::same_size(const Matrix<T> &m) const
{
return is_size(m.nRows(), m.nCols());
}
//-----------------------------------------------------------------------------
//* returns true if Matrix a and Matrix b are the same size
template<typename T>
inline bool Matrix<T>::same_size(const Matrix<T> &a, const Matrix<T> &b)
{
return a.same_size(b);
}
//-----------------------------------------------------------------------------
//* returns true if Matrix a rows = Matrix b cols
template<typename T>
inline bool Matrix<T>::cols_equals_rows(const Matrix<T> &a, const Matrix<T> &b)
{
return a.nCols() == b.nRows();
}
//-----------------------------------------------------------------------------
//* returns true if no value is outside of the range
template<typename T>
inline bool Matrix<T>::check_range(T min, T max) const
{
for (INDEX i = 0; i < this->nRows(); i++) {
for (INDEX j = 0; j < this->nCols(); j++) {
T val = (*this)(i,j);
if ( (val > max) || (val < min) ) return false;
}
}
return true;
}
//-----------------------------------------------------------------------------
//* Displays indexing error message and quits
template<typename T>
void ierror(const Matrix<T> &a, const char *FILE, int LINE, INDEX i, INDEX j)
{
- cout << "Error: Matrix indexing failure ";
- cout << "in file: " << FILE << ", line: "<< LINE <<"\n";
- cout << "Tried accessing index (" << i << ", " << j <<")\n";
- cout << "Matrix size was "<< a.nRows() << "x" << a.nCols() << "\n";
+ std::cout << "Error: Matrix indexing failure ";
+ std::cout << "in file: " << FILE << ", line: "<< LINE <<"\n";
+ std::cout << "Tried accessing index (" << i << ", " << j <<")\n";
+ std::cout << "Matrix size was "<< a.nRows() << "x" << a.nCols() << "\n";
ERROR_FOR_BACKTRACE
exit(EXIT_FAILURE);
}
//-----------------------------------------------------------------------------
//* Displays custom message and indexing error and quits
template<typename T>
-void ierror(const Matrix<T> &a, INDEX i, INDEX j, const string m)
+void ierror(const Matrix<T> &a, INDEX i, INDEX j, const std::string m)
{
- cout << m << "\n";
- cout << "Tried accessing index (" << i << ", " << j <<")\n";
- cout << "Matrix size was "<< a.nRows() << "x" << a.nCols() << "\n";
+ std::cout << m << "\n";
+ std::cout << "Tried accessing index (" << i << ", " << j <<")\n";
+ std::cout << "Matrix size was "<< a.nRows() << "x" << a.nCols() << "\n";
ERROR_FOR_BACKTRACE
exit(EXIT_FAILURE);
}
//-----------------------------------------------------------------------------
//* Displays matrix compatibility error message
template<typename T>
-void merror(const Matrix<T> &a, const Matrix<T> &b, const string m)
+void merror(const Matrix<T> &a, const Matrix<T> &b, const std::string m)
{
- cout << "Error: " << m << "\n";
- cout << "Matrix sizes were " << a.nRows() << "x" << a.nCols();
- if (&a != &b) cout << ", and "<< b.nRows() << "x" << b.nCols();
- cout << "\n";
+ std::cout << "Error: " << m << "\n";
+ std::cout << "Matrix sizes were " << a.nRows() << "x" << a.nCols();
+ if (&a != &b) std::cout << ", and "<< b.nRows() << "x" << b.nCols();
+ std::cout << "\n";
if (a.size() < 100) a.print("Matrix");
ERROR_FOR_BACKTRACE
exit(EXIT_FAILURE);
}
//-----------------------------------------------------------------------------
//* returns upper or lower half of a partitioned matrix
//* A1 is the on-diagonal square matrix, A2 is the off-diagonal matrix
//* rowsIn is the rows to be placed in A1
//* rows is the map for A1, (rows,colsC) is the map for A2
template <typename T>
-void Matrix<T>::row_partition(const set<int> & rowsIn,
-set<int> & rows, set<int> & colsC,
+void Matrix<T>::row_partition(const std::set<int> & rowsIn,
+std::set<int> & rows, std::set<int> & colsC,
DenseMatrix<T> & A1, DenseMatrix<T> & A2, bool complement) const
{
if (complement) {
for (INDEX i = 0; i < this->nRows(); i++) {
if (rowsIn.find(i) == rowsIn.end() ) rows.insert(i);
}
}
else rows = rowsIn;
// complement of set "rows" in set of this.cols is "cols"
for (INDEX i = 0; i < this->nCols(); i++) {
if (rows.find(i) == rows.end() ) colsC.insert(i);
}
// degenerate cases
if (int(rows.size()) == this->nCols()) {
A1 = (*this);
A2.reset(0,0);
return;
}
else if (rows.size() == 0) {
A1.reset(0,0);
A2 = (*this);
return;
}
// non-degenerate case
int nrows = rows.size();
int ncolsC = colsC.size();
A1.reset(nrows,nrows);
A2.reset(nrows,ncolsC);
- set<int>::const_iterator itrI, itrJ;
+ std::set<int>::const_iterator itrI, itrJ;
INDEX i =0;
for (itrI = rows.begin(); itrI != rows.end(); itrI++) {
INDEX j = 0;
for (itrJ = rows.begin(); itrJ != rows.end(); itrJ++) {
A1(i,j) = (*this)(*itrI,*itrJ);
j++;
}
j = 0;
for (itrJ = colsC.begin(); itrJ != colsC.end(); itrJ++) {
A2(i,j) = (*this)(*itrI,*itrJ);
j++;
}
i++;
}
}
template <typename T>
-set<int> Matrix<T>::row_partition(const set<int> & rows,
+std::set<int> Matrix<T>::row_partition(const std::set<int> & rows,
DenseMatrix<T> & A1, DenseMatrix<T> & A2) const
{
// complement of set "rows" in set of this.cols is "cols"
- set<int> colsC;
+ std::set<int> colsC;
for (INDEX i = 0; i < this->nCols(); i++) {
if (rows.find(i) == rows.end() ) colsC.insert(i);
}
// degenerate cases
if (int(rows.size()) == this->nCols()) {
A1 = (*this);
A2.reset(0,0);
return colsC;
}
else if (rows.size() == 0) {
A1.reset(0,0);
A2 = (*this);
return colsC;
}
// non-degenerate case
int nrows = rows.size();
int ncolsC = colsC.size();
A1.reset(nrows,nrows);
A2.reset(nrows,ncolsC);
- set<int>::const_iterator itrI, itrJ;
+ std::set<int>::const_iterator itrI, itrJ;
INDEX i =0;
for (itrI = rows.begin(); itrI != rows.end(); itrI++) {
INDEX j = 0;
for (itrJ = rows.begin(); itrJ != rows.end(); itrJ++) {
A1(i,j) = (*this)(*itrI,*itrJ);
j++;
}
j = 0;
for (itrJ = colsC.begin(); itrJ != colsC.end(); itrJ++) {
A2(i,j) = (*this)(*itrI,*itrJ);
j++;
}
i++;
}
return colsC;
}
//-----------------------------------------------------------------------------
//* returns row & column mapped matrix
template <typename T>
-void Matrix<T>::map(const set<int> & rows, const set<int> & cols,
+void Matrix<T>::map(const std::set<int> & rows, const std::set<int> & cols,
DenseMatrix<T> & A ) const
{
if (rows.size() == 0 || cols.size() == 0 ) {
A.reset(0,0);
return;
}
int nrows = rows.size();
int ncols = cols.size();
A.reset(nrows,ncols);
- set<int>::const_iterator itrI, itrJ;
+ std::set<int>::const_iterator itrI, itrJ;
INDEX i =0;
for (itrI = rows.begin(); itrI != rows.end(); itrI++) {
INDEX j = 0;
for (itrJ = cols.begin(); itrJ != cols.end(); itrJ++) {
A(i,j) = (*this)(*itrI,*itrJ);
j++;
}
i++;
}
}
//-----------------------------------------------------------------------------
//* inserts elements from a smaller matrix
template <typename T>
-void Matrix<T>::insert(const set<int> & rows, const set<int> & cols,
+void Matrix<T>::insert(const std::set<int> & rows, const std::set<int> & cols,
const DenseMatrix<T> & A )
{
if (rows.size() == 0 || cols.size() == 0 ) return;
- set<int>::const_iterator itrI, itrJ;
+ std::set<int>::const_iterator itrI, itrJ;
int i =0;
for (itrI = rows.begin(); itrI != rows.end(); itrI++) {
int j = 0;
for (itrJ = cols.begin(); itrJ != cols.end(); itrJ++) {
(*this)(*itrI,*itrJ) = A(i,j);
-//cout << *itrI << " " << *itrJ << " : " << (*this)(*itrI,*itrJ) << "\n";
+//std::cout << *itrI << " " << *itrJ << " : " << (*this)(*itrI,*itrJ) << "\n";
j++;
}
i++;
}
}
//-----------------------------------------------------------------------------
//* assemble elements from a smaller matrix
template <typename T>
-void Matrix<T>::assemble(const set<int> & rows, const set<int> & cols,
+void Matrix<T>::assemble(const std::set<int> & rows, const std::set<int> & cols,
const DenseMatrix<T> & A )
{
if (rows.size() == 0 || cols.size() == 0 ) return;
- set<int>::const_iterator itrI, itrJ;
+ std::set<int>::const_iterator itrI, itrJ;
int i =0;
for (itrI = rows.begin(); itrI != rows.end(); itrI++) {
int j = 0;
for (itrJ = cols.begin(); itrJ != cols.end(); itrJ++) {
(*this)(*itrI,*itrJ) += A(i,j);
j++;
}
i++;
}
}
//-----------------------------------------------------------------------------
} // end namespace
#endif
diff --git a/lib/atc/MatrixDef.h b/lib/atc/MatrixDef.h
index 3121fa781..d1505e7bf 100644
--- a/lib/atc/MatrixDef.h
+++ b/lib/atc/MatrixDef.h
@@ -1,201 +1,192 @@
#ifndef MATRIXDEF_H
#define MATRIXDEF_H
/******************************************************************************
* Common definitions for Matrix and Vector classes
* This header file contains macros and inline functions needed for the matrix
* classes. All error checking should be defined here as a macro so that it is
* neatly disabled when ATC_PRINT_DEBUGGING is not defined
******************************************************************************/
/******************************************************************************
* Headers and namespaces used by Matrix and Vector classes
******************************************************************************/
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <set>
#include <cstring>
#include <string>
#include <iomanip>
#include <cmath>
#include "Utility.h"
-using std::cout;
-using std::ostream;
-using std::fstream;
-using std::map;
-using std::vector;
-using std::set;
-using std::string;
-using std::scientific;
-using std::showbase;
namespace ATC_matrix {
/******************************************************************************
* Typedefs used by Matrix and Vector classes
******************************************************************************/
//* @typedef INDEX
//* @brief indexing type (default: unsigned) for matrix classes
// can switch typedef back to unsigned to be more precise, but will cause warnings everywhere
//typedef unsigned INDEX;
typedef int INDEX;
//* @typedef CLONE_TYPE
//* @brief dimension of matrix to clone
enum CLONE_TYPE { CLONE_ROW=0, CLONE_COL=1, CLONE_DIAG=2 };
//* @struct TRIPLET
//* @brief Triplet output entity
template <typename T>
struct TRIPLET { TRIPLET<T>(int _i=0, int _j=0, T _v=T(0)) : i(_i), j(_j), v(_v) {}
INDEX i, j; T v; };
/******************************************************************************
* Definitions for row/column major storage
******************************************************************************/
#define COL_STORAGE /* <--- comment out this line for row-major storage*/
#ifdef COL_STORAGE
#define DATA(i,j) _data[(i)+_nRows*(j)]
#else
#define ROW_STORAGE
#define DATA(i,j) _data[(i)*_nCols+(j)]
#endif
/******************************************************************************
* error checking macros
* MICK: checks if index (i,j) is in range MATRIX ONLY
* VICK: checks if index (i) is in range VECTOR ONLY
* MICM: checks if index (i,j) is in range, displays message MATRIX ONLY
* VICM: checks if index (i) is in range, displays message VECTOR ONLY
* SQCK: checks if matrix is square, displays message MATRIX ONLY
* SSCK: checks if a has the same size as b VECTOR/MATRIX
* GCK: generic two object check, checks if c is true VECTOR/MATRIX
* GCHK: generic check, checks if c is true ANYTHING
******************************************************************************/
#define ERROR_FOR_BACKTRACE /**/
#define MICK(i,j) /**/
#define VICK(i) /**/
#define MICM(i,j,m) /**/
#define VICM(i,m) /**/
#define SQCK(a,m) /**/
#define SICK(a,b,m) /**/
#define SSCK(a,b,m) /**/
#define GCK(a,b,c,m) /**/
#define GCHK(c,m) /**/
// the following two convert __LINE__ to a string
#define STRING2(x) #x
#define STRING(x) STRING2(x)
// prints file and line number for error messages
#define ERROR(x) __FILE__":"STRING(__LINE__)" "x
/******************************************************************************
* BLAS and LAPACK definitions
******************************************************************************/
#ifdef MKL
#include "mkl.h"
#define dgemv_ dgemv
#define dgemm_ dgemm
#define dgetrf_ dgetrf
#define dgetri_ dgetri
#define dgecon_ dgecon
#define dlange_ dlange
#define dsygvd_ dsygvd
#define dgesvd_ dgesvd
#define dgesdd_ dgesdd
#else
extern "C"
{
extern void dgemv_(char*,int*,int*,double*,const double*,int*,const double*,int *,double*,double*,int*);
extern void dgemm_(char*,char*,int*,int*,int*,double*,const double*,int*,const double*,int*,double*,double*,int*);
extern void dgetrf_(int*,int*,double*,int*,int*,int*);
extern void dgetri_(int*,double*,int*,int*,double*,int*,int*);
extern void dgecon_(char*,int*,double*,int*,double*,double*,double*,int*,int*);
extern double dlange_(char*,int*,int*,const double*,int*,double*);
extern double dsygvd_(int*,char*,char*,int*,double*,int*,double*,int*,double*,double*,int*,int*,int*,int*);
extern double dgesvd_(char*,char*,int*,int*,double*,int*,double*,double*,int*,double*,int*,double*,int*,int*);
extern double dgesdd_(char*,char*,int*,int*,double*,int*,double*,double*,int*,double*,int*,double*,int*,int*);
};
#endif
// forward declarations of matrix and vector classes
template<typename T> class Matrix;
template<typename T> class DenseMatrix;
template<typename T> class ParDenseMatrix;
template<typename T> class SparseMatrix;
template<typename T> class ParSparseMatrix;
template<typename T> class SparseVector;
template<typename T> class DiagonalMatrix;
template<typename T> class ParDiagonalMatrix;
template<typename T> class Vector;
template<typename T> class DenseVector;
template<typename T> class CloneVector;
template<typename T> class WrapMatrix;
template<typename T> class WrapVector;
//* forward declaration of operations
//@{
template<class T> DenseVector<T> operator*(const Matrix<T> &M, const SparseVector<T> &v);
template<class T> DenseVector<T> operator*(const SparseVector<T> &v, const Matrix<T> &M);
template<class T> SparseVector<T> operator*(const SparseMatrix<T> &M, const SparseVector<T> &v);
template<class T> SparseVector<T> operator*(const SparseVector<T> &v, const SparseMatrix<T> &M);
template<class T> DenseVector<T> operator*(const SparseMatrix<T> &A, const Vector<T>& x);
template<class T> DenseVector<T> operator*(const Vector<T> &A, const SparseMatrix<T>& x);
template<class T> DenseMatrix<T> operator*(const SparseMatrix<T> &A, const Matrix<T>& D);
template<class T> SparseMatrix<T> operator*(const SparseMatrix<T> &A, const DiagonalMatrix<T>& D);
template<class T> SparseMatrix<T> operator*(const SparseMatrix<T> &A, const SparseMatrix<T> &B);
template<class T> T dot(const SparseVector<T> &a, const SparseVector<T> &b);
//@}
template<class T> CloneVector<T> column(Matrix<T> &c, INDEX i) {
return CloneVector<T>(c, CLONE_COL, i);
}
template<class T> CloneVector<T> row(Matrix<T> &c, INDEX i) {
return CloneVector<T>(c, CLONE_ROW, i);
}
template<class T> CloneVector<T> diagonal(Matrix<T> &c) {
return CloneVector<T>(c, CLONE_DIAG);
}
template<class T> const CloneVector<T> column(const Matrix<T> &c, INDEX i) {
return CloneVector<T>(c, CLONE_COL, i);
}
template<class T> const CloneVector<T> row(const Matrix<T> &c, INDEX i) {
return CloneVector<T>(c, CLONE_ROW, i);
}
template<class T> const CloneVector<T> diagonal(const Matrix<T> &c) {
return CloneVector<T>(c, CLONE_DIAG);
}
template<class T> const SparseMatrix<T> *sparse_cast(const Matrix<T> *m);
template<class T> const DiagonalMatrix<T> *diag_cast(const Matrix<T> *m);
template<class T> void copy_sparse_to_matrix(const SparseMatrix<T> *s, Matrix<T> &m);
template<typename T> DenseMatrix<T> operator*(const DiagonalMatrix<T>& A, const Matrix<T> &B);
template<typename T> DenseMatrix<T> operator*(const Matrix<T> &B, const DiagonalMatrix<T>& A);
// double precision shortcuts
typedef Matrix<double> MATRIX; // matrix of double
typedef Vector<double> VECTOR; // vector of double
typedef DenseMatrix<double> DENS_MAT; // dense matrix of double type
typedef ParDenseMatrix<double> PAR_DENS_MAT; // parallel dense matrix of doubles
typedef CloneVector<double> CLON_VEC; // cloned vector of double type
typedef DenseVector<double> DENS_VEC; // dense vector of double type
typedef DiagonalMatrix<double> DIAG_MAT; // diagonal matrix of double type
typedef ParDiagonalMatrix<double> PAR_DIAG_MAT; // diagonal matrix of double type
typedef SparseMatrix<double> SPAR_MAT; // sparse matrix of double type
typedef ParSparseMatrix<double> PAR_SPAR_MAT; // parallel sparse matrix of doubles
typedef SparseVector<double> SPAR_VEC; // sparse matrix of double type
-typedef vector<DenseMatrix<double> > DENS_MAT_VEC;
-typedef vector<SparseMatrix<double> * > SPAR_MAT_VEC;
+typedef std::vector<DenseMatrix<double> > DENS_MAT_VEC;
+typedef std::vector<SparseMatrix<double> * > SPAR_MAT_VEC;
// int containers
typedef DenseMatrix<int> INT_ARRAY; // to become vector<int> or Array2D
//typedef SparseMatrix<int> SPAR_INT_ARRAY; // to become ?
typedef DenseVector<int> INT_VECTOR; // to become vector<int> or Array
// forward declaration of error messages
template<typename T> void ierror(const Matrix<T> &a, const char *FILE, int LINE, INDEX i, INDEX j=0);
-template<typename T> void ierror(const Matrix<T> &a, INDEX i, INDEX j, const string m);
-template<typename T> void merror(const Matrix<T> &a, const Matrix<T> &b, const string m);
-inline void gerror(const string m) { cout<<"Error: "<<m<<"\n"; ERROR_FOR_BACKTRACE ; exit(EXIT_FAILURE); }
+template<typename T> void ierror(const Matrix<T> &a, INDEX i, INDEX j, const std::string m);
+template<typename T> void merror(const Matrix<T> &a, const Matrix<T> &b, const std::string m);
+inline void gerror(const std::string m) { std::cout<<"Error: "<<m<<"\n"; ERROR_FOR_BACKTRACE ; exit(EXIT_FAILURE); }
} // end namespace
#endif
diff --git a/lib/atc/MeshReader.cpp b/lib/atc/MeshReader.cpp
index e52134fe4..0ecb8f625 100644
--- a/lib/atc/MeshReader.cpp
+++ b/lib/atc/MeshReader.cpp
@@ -1,217 +1,223 @@
#include "MeshReader.h"
#include "LammpsInterface.h"
#include "Utility.h"
#ifdef HAS_EXODUS
//#include <stdio.h>
//#include "netcdf.h"
#include "exodusII.h"
#endif
+using ATC_Utility::to_string;
+using std::ifstream;
+using std::istringstream;
+using std::stringstream;
+using std::map;
+using std::pair;
+using std::set;
+using std::string;
+
namespace ATC {
- using ATC_Utility::to_string;
/** constructor, takes a filename */
MeshReader::MeshReader(string filename,
Array<bool> periodicity,
double tol)
: meshfile_(filename),
periodicity_(periodicity),
nNodes_(0),
nElements_(0),
coordTol_(tol)
{
conn_ = new Array2D<int>();
nodeCoords_ = new DENS_MAT;
- nodeSets_ = new Array< pair< string,set<int> > >();
+ nodeSets_ = new Array< std::pair< string,set<int> > >();
size_t idx = filename.rfind('.');
if (idx == string::npos) {
throw ATC_Error("Given mesh file is of unknown type.");
}
string ext = filename.substr(idx+1);
if (ext == "mesh"){ read_mesh_file(); }
else { throw ATC_Error("mesh file is of unknown type."); }
}
/** destructor */
MeshReader::~MeshReader()
{
}
/** creates handle to new mesh object */
FE_Mesh* MeshReader::create_mesh()
{
return new FE_3DMesh(elementType_,
nNodes_, nElements_,
conn_, nodeCoords_,
periodicity_,
nodeSets_);
}
+ int MeshReader::number_of_vertices(string str)
+ {
+ string temp;
+ int number=0;
+ for (unsigned int i=0; i < str.size(); i++) {
+ if (isdigit(str[i])) {
+ for (unsigned int a=i; a<str.size(); a++) {
+ temp += str[a];
+ }
+ break;
+ }
+ }
+ istringstream(temp) >> number;
+ return number;
+ }
+
+
/** reads .mesh format file */
void MeshReader::read_mesh_file() {
ifstream in;
in.open(meshfile_.c_str(), ifstream::in);
string header;
while (getline(in,header)) {
istringstream words(header);
string section;
words >> section;
if (section == "Coordinates") {
words >> nNodes_;
nodeCoords_->reset(3, nNodes_, false);
string line;
for (int i = 0; i < nNodes_; ++i) {
getline(in,line);
istringstream coords(line);
coords >> (*nodeCoords_)(0, i);
coords >> (*nodeCoords_)(1, i);
coords >> (*nodeCoords_)(2, i);
}
stringstream ss;
ss << "read " << nNodes_ << " nodes";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
else if (section == "Elements") {
words >> nElements_;
words >> elementType_;
- int nVerts = int_from_str(elementType_);
+ int nVerts = number_of_vertices(elementType_);
conn_->reset(nVerts, nElements_);
string line;
for (int i = 0; i < nElements_; ++i) {
getline(in,line);
istringstream verts(line);
for (int j = 0; j < nVerts; ++j ) {
int node;
verts >> node;
(*conn_)(j,i) = node-1;
}
}
stringstream ss;
ss << "read " << nElements_ << " " << elementType_ << " elements";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
else if (section == "Nodesets") {
words >> nNodeSets_;
nodeSets_->reset(nNodeSets_);
string infoline;
string setName;
int nNodes;
string line;
for (int i = 0; i < nNodeSets_; ++i) {
getline(in,infoline);
istringstream info(infoline);
info >> setName;
info >> nNodes;
(*nodeSets_)(i).first = setName;
getline(in,line);
istringstream nodes(line);
for (int j = 0; j < nNodes; ++j ) {
int node;
nodes >> node;
(*nodeSets_)(i).second.insert(node-1);
}
}
}
}
in.close();
if (nodeCoords_->size() == 0) {
throw ATC_Error("Could not find mesh file, or mesh file empty.");
}
}
/** reads .exo format file */
void MeshReader::read_exo_file() {
#ifndef HAS_EXODUS
throw ATC_Error("Reading ExodusII .exo files not supported.");
#else
int CPU_word_size=0,IO_word_size=0;
float version;
int exoid = ex_open (meshfile_.c_str(), EX_READ,
&CPU_word_size, &IO_word_size, &version);
if (exoid < 0) { throw ATC_Error("couldn't open "+meshfile_); }
int nsd,nelemblk,nfsets;
char title[MAX_LINE_LENGTH+1];
int error = ex_get_init (exoid, title,
&nsd, &nNodes_, &nElements_, &nelemblk, &nNodeSets_, &nfsets);
if (error > 0) { throw ATC_Error("problem with init "+meshfile_+" "+title); }
// coordinates
float x[nNodes_], y[nNodes_], z[nNodes_];
error = ex_get_coord (exoid, x, y, z);
if (error > 0) { throw ATC_Error("problem with getting coordinates "+meshfile_); }
nodeCoords_->reset(nsd,nNodes_);
DENS_MAT & nodes = *nodeCoords_;
for (int i = 0; i < nNodes_; ++i) {
nodes(0,i) = x[i]; // this is a float to double conversion
nodes(1,i) = y[i]; // this is a float to double conversion
nodes(2,i) = z[i]; // this is a float to double conversion
}
ATC::LammpsInterface::instance()->print_msg_once("read "+to_string(nNodes_)+
" nodes");
// elements
int blkIds[nelemblk],nblkelem[nelemblk],nnpe[nelemblk],na[nelemblk];
error = ex_get_elem_blk_ids(exoid, blkIds);
char etype[MAX_STR_LENGTH+1];
string lastType;
for (int i=0; i<nelemblk; i++){
error = ex_get_elem_block (exoid, blkIds[i], etype,
&(nblkelem[i]), &(nnpe[i]), &(na[i]));
elementType_ = etype;
if (i > 0 && elementType_ != lastType )
{ throw ATC_Error(meshfile_+" is composed of multiple types"); }
lastType = etype;
}
- int nVerts = int_from_str(elementType_);
+ int nVerts = number_of_vertices(elementType_);
conn_->reset(nVerts, nElements_);
int n = 0;
for (int i=0; i<nelemblk; i++) {
int bconn[nnpe[i]*nblkelem[i]];
error = ex_get_elem_conn (exoid, blkIds[i], &bconn);
for (int j=0; j<nblkelem[i]; j++) {
for (int k=0; k<nnpe[i]; k++) {
(*conn_)(k,n) = bconn[k+j*nnpe[i]]-1;
}
n++;
}
ATC::LammpsInterface::instance()->print_msg_once("read "+to_string(n)+" "+elementType_+" elements, block "+to_string(i+1)+"/"+to_string(nelemblk));
}
// nodesets
int nsetIds[nNodeSets_];
error = ex_get_node_set_ids (exoid, nsetIds);
int nnodes,ndist;
//nodeSets_ = new Array< pair< string,set<int> > >();
nodeSets_->reset(nNodeSets_);
for (int i=0; i<nNodeSets_; i++) {
(*nodeSets_)(i).first = to_string(nsetIds[i]);
error = ex_get_node_set_param (exoid, nsetIds[i], &nnodes, &ndist);
int nodes[nnodes];
error = ex_get_node_set (exoid, nsetIds[i], nodes);
for (int j=0; j<nnodes; j++) {
(*nodeSets_)(i).second.insert(nodes[j]-1);
}
}
error = ex_close(exoid);
if (error > 0) { throw ATC_Error("problem with closing "+meshfile_); }
#endif
}
-
- int MeshReader::int_from_str(string str)
- {
- string temp;
- int number=0;
-
- for (unsigned int i=0; i < str.size(); i++) {
- if (isdigit(str[i])) {
- for (unsigned int a=i; a<str.size(); a++) {
- temp += str[a];
- }
- break;
- }
- }
-
- istringstream(temp) >> number;
- return number;
- }
-
}; // end namespace ATC
diff --git a/lib/atc/MeshReader.h b/lib/atc/MeshReader.h
index 200eb6a96..d974b75e1 100644
--- a/lib/atc/MeshReader.h
+++ b/lib/atc/MeshReader.h
@@ -1,53 +1,52 @@
#ifndef MESH_READER_H
#define MESH_READER_H
#include "Array2D.h"
#include "MatrixDef.h"
#include "MatrixLibrary.h"
#include "ATC_Error.h"
#include "FE_Mesh.h"
-
#include <sstream>
-
-using namespace std;
+#include <set>
+#include <utility>
+#include <string>
namespace ATC {
class MeshReader {
public:
/** constructor, takes a filename */
- MeshReader(string filename, Array<bool> periodicity, double tol=1.e-8);
+ MeshReader(std::string filename, Array<bool> periodicity, double tol=1.e-8);
/** destructor */
~MeshReader();
/** creates handle to new mesh object */
FE_Mesh* create_mesh();
private:
+ int number_of_vertices(std::string str);
+
/** reads .mesh format file */
void read_mesh_file();
/** reads .exo format file */
void read_exo_file();
- /** helper function for parsing mesh type string */
- int int_from_str(string str);
-
/** Data members for storing necessary information */
- string meshfile_;
- Array<bool> periodicity_;
- string elementType_;
+ std::string meshfile_;
+ ATC_matrix::Array<bool> periodicity_;
+ std::string elementType_;
int nNodes_;
int nElements_;
int nNodeSets_;
- Array2D<int> * conn_;
+ ATC_matrix::Array2D<int> * conn_;
DENS_MAT * nodeCoords_;
- Array<pair<string,set<int> > > * nodeSets_;
+ ATC_matrix::Array<std::pair<std::string,std::set<int> > > * nodeSets_;
double coordTol_;
};
}; // end namespace ATC
#endif
diff --git a/lib/atc/MoleculeSet.cpp b/lib/atc/MoleculeSet.cpp
index 3681fe877..e1c7da6d8 100644
--- a/lib/atc/MoleculeSet.cpp
+++ b/lib/atc/MoleculeSet.cpp
@@ -1,284 +1,292 @@
// ATC_Method headers
#include "MoleculeSet.h"
#include "ATC_Method.h"
#include "LammpsInterface.h"
#include "ATC_Error.h"
#include <queue>
+#include <utility>
+#include <sstream>
+
+using std::multimap;
+using std::map;
+using std::pair;
+using std::set;
+using std::stringstream;
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class MoleculeSet
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
MoleculeSet::MoleculeSet(ATC_Method * atc, int groupBit) :
atc_(atc),
groupBit_(groupBit),
lammps_(atc->lammps_interface())
{
// do nothing
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
MoleculeSet::~MoleculeSet()
{
clear();
}
//--------------------------------------------------------
// clear
//--------------------------------------------------------
void MoleculeSet::clear()
{
moleculeToAtoms_.clear();
localMoleculeToAtoms_.clear();
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void MoleculeSet::initialize(map<int,double> * globalAtomsPerMolecule)
{
// determine the total number of molecules in this group
// essentially ripped Compute::molecules_in_group from lammps
// find lo/hi molecule ID for any atom in group
int i;
int *molecule = lammps_->atom_to_molecule();
const int *mask = lammps_->atom_mask();
int nlocal = lammps_->nlocal();
int lo = lammps_->natoms();
int hi = -1;
int flag = 0;
for (i = 0; i < nlocal; i++) {
if (mask[i] & groupBit_) {
if (molecule[i] == 0) flag = 1;
lo = MIN(lo,molecule[i]);
hi = MAX(hi,molecule[i]);
}
}
int flagall;
lammps_->int_allsum(&flag,&flagall);
if (flagall) throw ATC_Error("Atom with molecule ID = 0 included in atc molecule group");
int globalLo, globalHi;
lammps_->int_allmin(&lo,&globalLo);
lammps_->int_allmax(&hi,&globalHi);
if (globalLo == lammps_->natoms()) throw ATC_Error("MoleculeSet:initialize - no molecules correspond to the group");
// molmap = vector of length nlen
// set to 1 for IDs that appear in group across all procs, else 0
int nlen = globalHi-globalLo+1;
int * localCount = new int[nlen];
for (i = 0; i < nlen; i++) localCount[i] = 0;
for (i = 0; i < nlocal; i++)
if (mask[i] & groupBit_)
localCount[molecule[i]-globalLo]++;
int * globalCount = new int[nlen];
lammps_->int_allsum(localCount,globalCount,nlen);
// nmolecules = # of non-zero IDs in molmap
// molmap[i] = index of molecule, skipping molecules not in group with -1
nMoleculesTotal_ = 0;
for (i = 0; i < nlen; i++)
if (globalCount[i]) nMoleculesTotal_++;
if (globalAtomsPerMolecule) {
for (i = 0; i < nlen; i++)
if (globalCount[i]) globalAtomsPerMolecule->insert(pair<int,double>(i+globalLo,double(globalCount[i])));
}
// deallocate storage
delete [] localCount;
delete [] globalCount;
}
//--------------------------------------------------------
// atoms_by_global_molecule
//--------------------------------------------------------
set<int> MoleculeSet::atoms_by_global_molecule(int id) const
{
if (need_reset()) reset();
typedef multimap<int, set<int> >::const_iterator MMIT;
typedef set<int>::const_iterator SIT;
pair<MMIT,MMIT> mol = moleculeToAtoms_.equal_range(id);
set<int> realAtoms;
const set<int> * myAtoms;
for (MMIT molIt = mol.first; molIt != mol.second; molIt++) {
myAtoms = &(molIt->second);
for (SIT atomIt = myAtoms->begin(); atomIt != myAtoms->end(); atomIt++)
realAtoms.insert(*atomIt);
}
return realAtoms;
}
//--------------------------------------------------------
// atoms_by_local_molecule
//--------------------------------------------------------
const set<int> & MoleculeSet::atoms_by_local_molecule(int id) const
{
if (need_reset()) reset();
return localMoleculeToAtoms_[id]->second;
}
//--------------------------------------------------------
// set_local_molecules_to_atoms
//--------------------------------------------------------
void MoleculeSet::set_local_molecules_to_atoms() const
{
localMoleculeToAtoms_.clear();
localMoleculeToAtoms_.reserve(moleculeToAtoms_.size());
multimap<int, set<int> >::const_iterator molecule;
for (molecule = moleculeToAtoms_.begin(); molecule != moleculeToAtoms_.end(); molecule++)
localMoleculeToAtoms_.push_back(molecule);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class SmallMoleculeSet
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
SmallMoleculeSet::SmallMoleculeSet(ATC_Method * atc, int groupBit,
PerAtomQuantity<int> * bondList, PerAtomQuantity<int> * numBond) :
MoleculeSet(atc,groupBit),
bondList_(bondList)
{
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
SmallMoleculeSet::~SmallMoleculeSet()
{
}
//--------------------------------------------------------
// clear
//--------------------------------------------------------
void SmallMoleculeSet::clear()
{
MoleculeSet::clear();
}
//--------------------------------------------------------
// initialize
//--------------------------------------------------------
void SmallMoleculeSet::initialize()
{
// make sure newton_bond is off, otherwise use large molecule set
if (lammps_->newton_bond())
throw ATC_Error("Cannot use newton_bond with small molecules");
MoleculeSet::initialize();
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void SmallMoleculeSet::reset() const
{
stringstream message;
using std::queue;
moleculeToAtoms_.clear();
lammps_->forward_comm_fix();
int * numBond = lammps_->num_bond();
int ** bondAtom = lammps_->bond_atom();
// add in real atoms for molecules
int *molecule = lammps_->atom_to_molecule();
const int *mask = lammps_->atom_mask();
int nlocal = lammps_->nlocal();
_atomFound_.resize(atc_->nproc_ghost());
_atomFound_ = false;
int nmol = 0;
for (int i = 0; i < nlocal; i++) {
queue<int> myQueue;
if ((mask[i] & groupBit_) && !_atomFound_(i)) {
set<int> myAtoms;
myAtoms.insert(i);
_atomFound_(i) = true;
for (int j = 0; j < numBond[i]; j++) {
int localIdx = lammps_->local_to_global_map(bondAtom[i][j]);
if (!_atomFound_(localIdx)) {
myQueue.push(localIdx);
_atomFound_(localIdx) = true;
}
}
while (!myQueue.empty()) {
int myIdx = myQueue.front();
myQueue.pop();
myAtoms.insert(myIdx);
for (int j = 0; j < numBond[myIdx]; j++) {
int localIdx = lammps_->local_to_global_map(bondAtom[myIdx][j]);
if (!_atomFound_(localIdx)) {
myQueue.push(localIdx);
_atomFound_(localIdx) = true;
}
}
}
nmol++;
moleculeToAtoms_.insert(pair<int,set<int> >(molecule[i],myAtoms));
}
}
// set local molecule order
MoleculeSet::set_local_molecules_to_atoms();
needReset_ = false;
}
//--------------------------------------------------------
// atoms_by_global_molecule
//--------------------------------------------------------
set<int> SmallMoleculeSet::atoms_by_global_molecule(int id) const
{
// take all atoms and prune out ghosts
set<int> realAtoms = MoleculeSet::atoms_by_global_molecule(id);
remove_proc_ghosts(realAtoms);
return realAtoms;
}
//--------------------------------------------------------
// local_fraction
//--------------------------------------------------------
double SmallMoleculeSet::local_fraction(int id) const
{
if (need_reset()) reset();
set<int> realAtoms = (localMoleculeToAtoms_[id])->second;
int totalAtoms = realAtoms.size();
remove_proc_ghosts(realAtoms);
return double(realAtoms.size())/double(totalAtoms);
}
//--------------------------------------------------------
// remove_proc_ghosts
//--------------------------------------------------------
void SmallMoleculeSet::remove_proc_ghosts(set<int> & atomSet) const
{
int nlocalIdx = lammps_->nlocal() - 1;
set<int>::const_iterator atomIt;
for (atomIt = atomSet.begin(); atomIt != atomSet.end(); atomIt++) {
if (*atomIt > nlocalIdx)
atomSet.erase(atomIt);
}
}
};
diff --git a/lib/atc/MoleculeSet.h b/lib/atc/MoleculeSet.h
index 9c30f5352..6fa815876 100644
--- a/lib/atc/MoleculeSet.h
+++ b/lib/atc/MoleculeSet.h
@@ -1,160 +1,158 @@
// A class for managing the data associated with sets of molecules
#ifndef PER_MOLECULE_SET_H
#define PER_MOLECULE_SET_H
// ATC_Method headers
#include "LammpsInterface.h"
#include "DependencyManager.h"
#include <map>
#include <set>
#include <vector>
-using namespace std;
-
namespace ATC {
// forward declarations
class ATC_Method;
template <typename T> class PerAtomQuantity;
/**
* @class MoleculeSet
* @brief A class for handling all the data associated with sets of molecules
*/
class MoleculeSet : public DependencyManager {
public:
MoleculeSet(ATC_Method * atc, int groupBit);
virtual ~MoleculeSet();
/** reset all data */
virtual void clear();
/** initialize global data */
- virtual void initialize(map<int, double> * globalAtomsPerMolecule = NULL);
+ virtual void initialize(std::map<int, double> * globalAtomsPerMolecule = NULL);
/** reset the number of atoms/molecules on this processor */
void reset_nlocal() {this->set_reset();};
/** recompute data when atoms cross processors */
void post_exchange() {this->set_reset();};
/** access the number of total molecules */
int global_molecule_count() const {return nMoleculesTotal_;};
/** access the number of local molecules */
int local_molecule_count() const {if (need_reset()) reset(); return moleculeToAtoms_.size();};
/** access molecule atoms by lammps id */
- set<int> atoms_by_global_molecule(int id) const;
+ std::set<int> atoms_by_global_molecule(int id) const;
/** access molecules by local indexing */
- const set<int> & atoms_by_local_molecule(int id) const;
+ const std::set<int> & atoms_by_local_molecule(int id) const;
/** access fraction of a locally indexed molecule on this processor */
virtual double local_fraction(int id) const = 0;
/** use global index to get local index */
//int global_to_local(int id) const;
/** use local index to get global index */
int local_to_global(int id) const {return (*localMoleculeToAtoms_[id]).first;};
protected:
/** pointer for access to atc data */
ATC_Method * atc_;
/** lammps group bit corresponding to desired molecules */
int groupBit_;
/** pointer to lammps interface */
const LammpsInterface * lammps_;
/** total number of molecules in this group */
// see Compute::molecules_in_group
int nMoleculesTotal_;
/** multimap from lammps molecule id to ids of consituent atoms, all atoms are real */
// multiple map to account for periodic images
- mutable multimap<int, set<int> > moleculeToAtoms_;
+ mutable std::multimap<int, std::set<int> > moleculeToAtoms_;
/** vector in processor-local molecule order to constituent atom sets, atoms include ghosts */
- mutable vector< map<int, set<int> >::const_iterator > localMoleculeToAtoms_;
+ mutable std::vector< std::map<int, std::set<int> >::const_iterator > localMoleculeToAtoms_;
/** resets the quantity based on the latest data */
virtual void reset() const = 0;
/** creates the ordered list of local molecules */
void set_local_molecules_to_atoms() const;
private:
// do not define this
MoleculeSet();
};
/**
* @class SmallMoleculeSet
* @brief A class for handling data for small molecules, i.e., molecules with maximum distance between atoms less than the lammps cutoff radius. Atom ids are in [0,nlocalTotal-1].
*/
class SmallMoleculeSet : public MoleculeSet {
public:
SmallMoleculeSet(ATC_Method * atc, int groupBit,
PerAtomQuantity<int> * bondList = NULL,
PerAtomQuantity<int> * numBond = NULL);
virtual ~SmallMoleculeSet();
/** reset all data */
virtual void clear();
/** initialize global data */
virtual void initialize();
/** access molecule atoms by lammps id */
- set<int> atoms_by_global_molecule(int id) const;
+ std::set<int> atoms_by_global_molecule(int id) const;
/** access fraction of a locally indexed molecule on this processor */
virtual double local_fraction(int id) const;
protected:
/** store the number of atoms in a molecule on this processor */
- //map<int, int> localAtomsPerMolecule_;
+ //std::map<int, int> localAtomsPerMolecule_;
/** resets the quantity based on the latest data */
virtual void reset() const;
/** data structure containing bond list information, forces parallel communication of bond lists */
PerAtomQuantity<int> * bondList_;
/** data structure containing bond list information, forces parallel communication of bond lists */
PerAtomQuantity<int> * numBond_;
/** removes processor ghosts from a set of atom ids */
- void remove_proc_ghosts(set<int> & atomSet) const;
+ void remove_proc_ghosts(std::set<int> & atomSet) const;
// workspace variable for determining if we've hit an internal atom already
mutable Array<bool> _atomFound_;
private:
// do not define this
SmallMoleculeSet();
};
};
#endif
diff --git a/lib/atc/NonLinearSolver.cpp b/lib/atc/NonLinearSolver.cpp
index 8018f525a..c11ca9474 100644
--- a/lib/atc/NonLinearSolver.cpp
+++ b/lib/atc/NonLinearSolver.cpp
@@ -1,112 +1,114 @@
// ATC headers
#include "NonLinearSolver.h"
#include "LinearSolver.h"
#include "ATC_Error.h"
#include "LammpsInterface.h"
+using std::stringstream;
+
namespace ATC {
//===================================================================
// TangentOperator
//===================================================================
//===================================================================
// NonLinearSolver
//===================================================================
NonLinearSolver::NonLinearSolver(TangentOperator * f,
const BC_SET * bcs, const int dof,
bool parallel):
f_(f),
bcs_(bcs),
dof_(dof),
rNorm0P_(1.0),
tol_(1.e-10),
tolx_(1.e-8),
tol0_(1.e-6),
maxIterations_(20),
parallel_(parallel)
{
}
//--------------------------------------------------------------------
double NonLinearSolver::residual_norm(VECTOR & r)
{
if (bcs_) {
DENS_VEC R = r;
BC_SET::const_iterator itr;
for (itr = bcs_->begin(); itr != bcs_->end(); itr++) {
int i = itr->first;
R(i) = 0;
}
return R.norm();
}
else { return r.norm(); }
}
//--------------------------------------------------------------------
bool NonLinearSolver::solve(VECTOR & x)
{
f_->function(x, r_);
rNorm0_ = residual_norm(r_);
if (rNorm0_ < tol_*rNorm0P_) { // if a "solution" does pass here rNorm0_ will be too small to allow for convergence
return true; // note abs vs rel tol
}
if (rNorm0_ == 0.0) rNorm0_ = 1.0;
if (rNorm0_ < tol0_ ) rNorm0_ = rNorm0P_;
if (rNorm0P_ == 1.0) rNorm0P_ = rNorm0_;
rNormP_ = rNorm0_;
dx_.reset(r_.nRows()); // needs to be sized for linear solver
// newton's method
for (int iter = 0; iter < maxIterations_ ; iter++ ) {
// compute tangent
f_->tangent(x, r_, A_);
rNorm_ = residual_norm(r_);
rNorm_ /= rNorm0_;
if (rNorm_ < tol_) {
return true;
}
SPAR_MAT Asparse(A_);
LinearSolver linearSolver(Asparse, LinearSolver::AUTO_SOLVE, parallel_);
if (bcs_) {
linearSolver.allow_reinitialization();
linearSolver.initialize(bcs_);
if (iter > 0) linearSolver.set_homogeneous_bcs();
else { x.zero(); } // linear solve w/ bcs will replace guess
}
r_ *= -1;
linearSolver.solve(dx_,r_);
if (iter > 0 && rNorm_ > rNormP_) {
bool descent = line_search(x);
if (! descent ) {
// return false;
}
}
rNormP_ = rNorm_;
x += dx_;
}
stringstream ss;
ss << "WARNING NonLinearSolver: did not converge, iterations="<< maxIterations_ <<" error= " << rNorm_;
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
return false;
}
//--------------------------------------------------------------------
bool NonLinearSolver::line_search(VECTOR & x)
{
double rNormP = rNormP_;
double dxnorm = dx_.norm();
while ( dxnorm > tolx_) {
dx_ *= 0.5; // bisection
dxnorm = dx_.norm();
f_->function(x+dx_,r_);
rNorm_ = residual_norm(r_)/rNorm0_;
if (rNorm_ < rNormP) return true;
}
return false; // no descent
}
} // end namespace ATC
diff --git a/lib/atc/NonLinearSolver.h b/lib/atc/NonLinearSolver.h
index 7439153c4..d3d906a39 100644
--- a/lib/atc/NonLinearSolver.h
+++ b/lib/atc/NonLinearSolver.h
@@ -1,106 +1,105 @@
#ifndef NON_LINEAR_SOLVER_H
#define NON_LINEAR_SOLVER_H
// ATC includes
#include "ATC_TypeDefs.h"
#include "MatrixLibrary.h"
#include "ATC_Error.h"
// other includes
#include <set>
#include <map>
-using std::pair;
namespace ATC {
/**
* @class TangentOperator
* @brief an adaptor to allow NonLinearSolver to work with a generic function
*/
class TangentOperator {
public:
TangentOperator(){};
virtual ~TangentOperator(){};
virtual void function(const VECTOR & x, DENS_VEC & f) {}; // =0;
virtual void tangent(const VECTOR & x, DENS_VEC & f, MATRIX & dfdx) =0;
//virtual void function(const VECTOR & x, VECTOR & f) {}; // =0;
//virtual void tangent(const VECTOR & x, VECTOR & f, MATRIX & dfdx) {}; // =0;
};
/**
* @class NonLinearSolver
* @brief a class to solve a system of non-linear equations
* f(x) = 0
*/
class NonLinearSolver {
public:
enum NonLinearSolveType {
NEWTON_RAPHSON=0,
};
/** Constructor */
NonLinearSolver(
TangentOperator * f, // provides f and f' at x, pointer for polymorphism
const BC_SET * bcs = NULL,
const int dof = 0,
bool parallel = false
);
/** Destructor */
virtual ~NonLinearSolver() {};
/** residual norm */
double residual_norm(VECTOR & x);
/** solve */
bool solve(VECTOR & x); // incoming: initial guess, outgoing: solution
/** line search */
bool line_search(VECTOR & x);
/** access to current state */
DENS_MAT & tangent() { return A_;}
DENS_VEC & residual() { return r_;}
/** change solver parameters */
void set_max_iterations(const int maxIter) { maxIterations_=maxIter; }
void set_residual_tolerance(const double tol) { tol_=tol;}
void set_solution_tolerance(const double tol) { tolx_=tol;}
protected:
/** function & tangent */
TangentOperator * f_;
DENS_VEC r_;
DENS_MAT A_;
DENS_VEC dx_;
/** equality constraints */
const BC_SET * bcs_;
/** degree of freedom */
int dof_;
/** flavors */
int solverType_;
/** state */
double rNorm0_, rNorm0P_, rNorm_, rNormP_;
/** parameters & tolerances */
double tol_; // tolerance on f
double tolx_; // tolerance on dx
double tol0_; // tolerance on initial f
int maxIterations_;
/** run solve in parallel */
bool parallel_;
};
} // namespace ATC
#endif
diff --git a/lib/atc/OutputManager.cpp b/lib/atc/OutputManager.cpp
index fe8ba89a4..586b4294f 100644
--- a/lib/atc/OutputManager.cpp
+++ b/lib/atc/OutputManager.cpp
@@ -1,880 +1,889 @@
#include <string>
#include <fstream>
#include <stdio.h>
#include <sstream>
#include "OutputManager.h"
#include "ATC_Error.h"
#include "LammpsInterface.h"
+using std::ofstream;
+using std::stringstream;
+using std::ios_base;
+using std::setw;
+using std::string;
+using std::map;
+using std::vector;
+using std::set;
+
namespace ATC {
static const int kFieldPrecison = 12;
static const int kFieldWidth = kFieldPrecison + 6;
static const int kFileNameSize = 26; // HERE <<<<
static string tensor_component_names[9] = {"11","12","13",
"21","22","23",
"31","32","33"};
static string sym_tensor_component_names[6] = {"11","22","33","12","13","23"};
static string vector_component_names[3] = {"_X","_Y","_Z"};
static string list_component_names[26] = {"_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z"};
string* get_component_names(int type) { // HERE <<<<
string* componentNames = list_component_names;
if (type==VECTOR_OUTPUT)
componentNames = vector_component_names;
else if (type == SYM_TENSOR_OUTPUT)
componentNames = sym_tensor_component_names;
else if (type == TENSOR_OUTPUT)
componentNames = tensor_component_names;
return componentNames;
}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
OutputManager::OutputManager(string outputPrefix, set<int> & otypes)
: initialized_(false),
firstStep_(true),
firstGlobalsWrite_(true),
writeGlobalsHeader_(true),
coordinates_(NULL),
connectivities_(NULL),
dataType_(POINT),
outputPrefix_(outputPrefix),
ensightOutput_(otypes.count(ENSIGHT)),
textOutput_(otypes.count(GNUPLOT)),
fullTextOutput_(otypes.count(FULL_GNUPLOT)),
vtkOutput_(otypes.count(VTK)),
tensorToComponents_(false), // paraview does not support tensors
vectorToComponents_(false)
{}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
OutputManager::OutputManager()
: initialized_(false),
firstStep_(true),
firstGlobalsWrite_(true),
writeGlobalsHeader_(true),
coordinates_(NULL),
connectivities_(NULL),
dataType_(POINT),
outputPrefix_("NULL"),
ensightOutput_(true),
textOutput_(false),
fullTextOutput_(false),
vtkOutput_(false),
tensorToComponents_(false), // paraview does not support tensors
vectorToComponents_(false)
{}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
OutputManager::~OutputManager() {}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
void OutputManager::set_option(OutputOption option, bool value) {
if (option == OUTPUT_VECTOR_COMPONENTS) vectorToComponents_ = value;
else if (option == OUTPUT_TENSOR_COMPONENTS) tensorToComponents_ = value;
else throw ATC_Error("unsupported output option");
};
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
void OutputManager::initialize(string outputPrefix, set<int> & otypes)
{
if (outputPrefix_ != outputPrefix ) { // new stream with existing object
outputPrefix_ = outputPrefix;
initialized_ = false;
}
outputTimes_.clear();
if (otypes.count(ENSIGHT) > 0) ensightOutput_ = true;
else ensightOutput_ = false;
if (otypes.count(GNUPLOT) > 0) textOutput_ = true;
if (otypes.count(FULL_GNUPLOT) > 0) fullTextOutput_ = true;
if (otypes.count(VTK) > 0) vtkOutput_ = true;
firstStep_ = true;
firstGlobalsWrite_ = true;
writeGlobalsHeader_ = true;
}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
void OutputManager::print_custom_names() {
map<string,vector<string> >::const_iterator itr;
string msg = "output custom names:\n";
for (itr = fieldNames_.begin(); itr != fieldNames_.end(); itr++) {
string stem = itr->first;
vector<string> names = itr->second;
for (unsigned int i = 0; i < names.size(); i++) {
msg+= stem+" : "+names[i]+"\n";
}
}
ATC::LammpsInterface::instance()->print_msg_once(msg);
}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
// Dump text-based fields to disk for later restart
void OutputManager::write_restart_file(string fileName, RESTART_LIST *data)
{
FILE * fp=NULL;
fp=fopen(fileName.c_str(),"wb"); // open
RESTART_LIST::iterator iter;
for (iter = data->begin(); iter != data->end(); iter++) {
const MATRIX* field_data = iter->second;
for (int i = 0; i < field_data->nRows(); ++i) {
for (int j = 0; j < field_data->nCols(); ++j) {
double x = (*field_data)(i,j);
fwrite(&x,sizeof(double),1,fp);
}
}
}
fclose(fp);
}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
// Read a file corresponding to a write by write_restart_file
void OutputManager::read_restart_file(string fileName, RESTART_LIST *data)
{
FILE * fp=NULL;
fp=fopen(fileName.c_str(),"rb"); // open
RESTART_LIST::iterator iter;
for (iter = data->begin(); iter != data->end(); iter++) {
MATRIX* field_data = iter->second;
for (int i = 0; i < field_data->nRows(); ++i) {
for (int j = 0; j < field_data->nCols(); ++j) {
double myVal;
fread(&myVal,sizeof(double),1,fp);
(*field_data)(i,j) = myVal;
}
}
}
fclose(fp);
}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
void OutputManager::write_globals(void)
{
if ( outputPrefix_ == "NULL") return;
string file = outputPrefix_ + ".GLOBALS";
ofstream text;
if ( firstGlobalsWrite_ ) text.open(file.c_str(),ios_base::out);
else text.open(file.c_str(),ios_base::app);
firstGlobalsWrite_ = false;
map<string, double>::iterator iter;
// header
if ( firstStep_ || writeGlobalsHeader_) {
text << "# time:1 ";
int index = 2;
for (iter = globalData_.begin(); iter != globalData_.end(); iter++)
{
string name = iter->first;
string str; stringstream out; out << ":" << index++;
str = out.str();
name.append(str);
text.width(kFieldWidth); text << name << " ";
}
text << '\n';
}
writeGlobalsHeader_ = false;
// data
text.width(kFieldWidth); text << outputTimes_[outputTimes_.size()-1] << " ";
for (iter = globalData_.begin();
iter != globalData_.end(); iter++) {
double value = iter->second;
text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << value << " ";
}
text << "\n";
}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
void OutputManager::write_geometry(const MATRIX *coordinates,
const Array2D<int> *connectivities)
{
if ( outputPrefix_ == "NULL") throw ATC_Error( "No outputPrefix given.");
number_of_nodes_ = coordinates->nCols();
coordinates_ = coordinates;
connectivities_ = connectivities;
if (ensightOutput_) write_geometry_ensight();
if (textOutput_) write_geometry_text();
initialized_ = true;
}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
void OutputManager::write_geometry_ensight(void)
{
// geometry based on a reference configuration
string geom_file_name = outputPrefix_ + ".geo";
// open file
FILE * fp=NULL;
char buffer[80];
if ( ! initialized_ ) {
fp=fopen(geom_file_name.c_str(),"wb"); // open
strcpy(buffer,"C Binary");
fwrite(buffer,sizeof(char),80,fp);
}
else {
fp=fopen(geom_file_name.c_str(),"ab"); // append
}
if (fp == NULL) {
throw ATC_Error("can not create Ensight geometry file");
}
// write preamble
strcpy(buffer,"BEGIN TIME STEP");
fwrite(buffer,sizeof(char),80,fp);
strcpy(buffer,"Ensight geometry file");
fwrite(buffer,sizeof(char),80,fp);
strcpy(buffer,"description");
fwrite(buffer,sizeof(char),80,fp);
strcpy(buffer,"node id assign");
fwrite(buffer,sizeof(char),80,fp);
strcpy(buffer,"element id assign");
fwrite(buffer,sizeof(char),80,fp);
// per part
strcpy(buffer,"part");
fwrite(buffer,sizeof(char),80,fp);
int part_number=1;
fwrite(&part_number,sizeof(int),1,fp);
strcpy(buffer,"description");
fwrite(buffer,sizeof(char),80,fp);
const MATRIX & coordinates = *coordinates_;
// write coordinates
strcpy(buffer,"coordinates");
fwrite(buffer,sizeof(char),80,fp);
fwrite(&number_of_nodes_,sizeof(int),1,fp);
int number_of_spatial_dimensions = coordinates.nRows();
if (number_of_spatial_dimensions != 3)
throw ATC_Error("Ensight writer needs a 3D geometry");
for (int i = 0; i < number_of_spatial_dimensions; ++i)
{
for (int j = 0; j < number_of_nodes_; ++j)
{
float x = (float) coordinates(i,j);
fwrite(&x,sizeof(float),1,fp);
}
}
// write mesh connectivities or point "connectivities"
if (connectivities_)
{
dataType_ = MESH;
int nodes_per_element = connectivities_->nRows();
if (nodes_per_element == 4) { strcpy(buffer,"tetra4"); }
else if (nodes_per_element == 8) { strcpy(buffer,"hexa8"); }
else if (nodes_per_element == 20) { strcpy(buffer,"hexa20"); }
else if (nodes_per_element == 27) { strcpy(buffer,"hexa27"); }
else
throw ATC_Error("Ensight writer does not recoginize element type");
fwrite(buffer,sizeof(char),80,fp);
int number_of_elements = connectivities_->nCols();
fwrite(&number_of_elements,sizeof(int),1,fp);
int number_of_nodes_per_element = connectivities_->nRows();
for (int j = 0; j < number_of_elements; ++j)
{
for (int i = 0; i < number_of_nodes_per_element; ++i)
{
int inode = (*connectivities_)(i,j) +1; // 1 based numbering
fwrite(&inode,sizeof(int),1,fp);
}
}
}
else
{
strcpy(buffer,"point");
fwrite(buffer,sizeof(char),80,fp);
int number_of_elements = number_of_nodes_;
fwrite(&number_of_elements,sizeof(int),1,fp);
for (int j = 0; j < number_of_elements; ++j)
{
int inode = j +1; // 1 based numbering
fwrite(&inode,sizeof(int),1,fp);
}
}
// end per part
strcpy(buffer,"END TIME STEP");
fwrite(buffer,sizeof(char),80,fp);
fclose(fp);
}
//-----------------------------------------------------------------------------
//*
//-----------------------------------------------------------------------------
void OutputManager::write_geometry_text(void)
{
if ( outputPrefix_ == "NULL") return;
// geometry based on a reference configuration
string geom_file_text = outputPrefix_ + ".XYZ";
// open file
ofstream text;
text.open(geom_file_text.c_str(),ios_base::out);
if (connectivities_)
{
int number_of_elements = connectivities_->nCols();
int number_of_nodes_per_element = connectivities_->nRows();
for (int j = 0; j < number_of_elements; ++j)
{
text << "#";
for (int i = 0; i < number_of_nodes_per_element; ++i)
{
int inode = (*connectivities_)(i,j) +1; // 1 based numbering
text << setw(6) << inode;
}
text << "\n";
}
}
const MATRIX & coordinates = *coordinates_;
int number_of_spatial_dimensions = coordinates.nRows();
for (int j = 0; j < number_of_nodes_; ++j)
{
text << setw(6) << j+1 << " ";
for (int i = 0; i < number_of_spatial_dimensions; ++i)
{
text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << coordinates(i,j) << " ";
}
text << "\n";
}
text << "\n";
}
//-----------------------------------------------------------------------------
/** pack "soln" into data */
//-----------------------------------------------------------------------------
void OutputManager::write_data(double time, FIELDS *soln, OUTPUT_LIST *data, const int *node_map)
{
// pack
OUTPUT_LIST combined_data;
if (soln)
{
FIELDS::iterator iter;
for (iter = soln->begin(); iter != soln->end(); iter++)
{
FieldName field_index = iter->first;
MATRIX* field_data = &((iter->second).set_quantity());
string field_name = field_to_string(field_index);
combined_data[field_name] = field_data;
}
}
if (data)
{
OUTPUT_LIST::iterator iter;
for (iter = data->begin(); iter != data->end(); iter++)
{
string field_name = iter->first;
const MATRIX* field_data = iter->second;
combined_data[field_name] = field_data;
}
}
write_data(time, &(combined_data), node_map);
};
//-----------------------------------------------------------------------------
/** write data */
//-----------------------------------------------------------------------------
void OutputManager::write_data(double time, OUTPUT_LIST *data, const int *node_map)
{
if (! initialized_) {
throw ATC_Error("must write geometry before data");
}
// store the time step value
outputTimes_.push_back(time);
if (ensightOutput_) {
// write data
OUTPUT_LIST::iterator iter;
for (iter = data->begin(); iter != data->end(); iter++)
{
string field_name = iter->first;
const MATRIX* field_data = iter->second;
write_data_ensight(field_name, field_data, node_map);
}
// write dictionary
write_dictionary(time,data);
}
// write text dump
if (textOutput_) {
write_data_text(data);
if (firstStep_ && node_map) {
string map_file_text = outputPrefix_ + ".MAP";
ofstream text;
text.open(map_file_text.c_str(),ios_base::out);
for (int i=0; i< number_of_nodes_ ; i++) {
text << node_map[i] << "\n";
}
text.close();
}
}
else if (fullTextOutput_) {
write_data_text(data,node_map);
}
if (vtkOutput_) {
write_data_vtk(data);
}
// global variables
if (! globalData_.empty()) write_globals();
if (firstStep_) firstStep_ = false;
}
//-----------------------------------------------------------------------------
/** write (ensight gold format "C" binary) data */
// use "ens_checker" to check binary format
//-----------------------------------------------------------------------------
void OutputManager::write_data_ensight(string field_name, const MATRIX *field_data, const int *node_map)
{
int ndof = field_data->nCols();
int col_start = 0;
int col_end = ndof;
string filenames[kFileNameSize];
int nfiles = 1;
filenames[0] = outputPrefix_ + "." + field_name;
int type = data_type(ndof);
if (use_component_names(type)){
nfiles = ndof;
if (nfiles > kFileNameSize) {
if (ATC::LammpsInterface::instance()->rank_zero()) {
stringstream ss;
ss << " only writing " << kFileNameSize
<< " components of " << field_name << " which has " << ndof;
ATC::LammpsInterface::instance()->print_msg(ss.str());
}
nfiles = kFileNameSize;
}
string* component_names = get_component_names(type);
for (int ifile = 0; ifile < nfiles; ++ifile)
{
string comp_name;
if (! custom_name(field_name,ifile,comp_name))
comp_name = field_name + component_names[ifile];
filenames[ifile] = outputPrefix_ + "." + comp_name;
}
}
for (int ifile = 0; ifile < nfiles; ++ifile)
{
// for vector/tensor to components
if ( nfiles > 1 )
{
col_start = ifile;
col_end = ifile+1;
}
// open or append data file
string data_file_name = filenames[ifile];
FILE * fp=NULL;
if ( outputTimes_.size() == 1 ) {
fp=fopen(data_file_name.c_str(),"wb"); // open
}
else {
fp=fopen(data_file_name.c_str(),"ab"); // append
}
if (fp == NULL) {
throw ATC_Error("can not create Ensight data file: "+data_file_name);
}
// write data
char buffer[80];
strcpy(buffer,"BEGIN TIME STEP");
fwrite(buffer,sizeof(char),80,fp);
strcpy(buffer,"field name");
fwrite(buffer,sizeof(char),80,fp);
// per part
strcpy(buffer,"part");
fwrite(buffer,sizeof(char),80,fp);
int part_number = 1;
fwrite(&part_number,sizeof(int),1,fp);
strcpy(buffer,"coordinates");
fwrite(buffer,sizeof(char),80,fp);
if (node_map)
{
for (int j = col_start; j < col_end; ++j)
{
for (int i = 0; i < number_of_nodes_; ++i)
{
int inode = node_map[i];
float x = (float) (*field_data)(inode,j);
fwrite(&x,sizeof(float),1,fp);
}
}
}
else
{
for (int j = col_start; j < col_end; ++j)
{
for (int i = 0; i < field_data->nRows(); ++i)
{
float x = (float) (*field_data)(i,j);
fwrite(&x,sizeof(float),1,fp);
}
}
}
// end per part
strcpy(buffer,"END TIME STEP");
fwrite(buffer,sizeof(char),80,fp);
fclose(fp);
}
}
//-----------------------------------------------------------------------------
/** write data dict for both text & full_text */
//-----------------------------------------------------------------------------
void OutputManager::write_text_data_header(OUTPUT_LIST *data, ofstream & text, int k)
{
if (data)
{
OUTPUT_LIST::iterator iter;
for (iter = data->begin(); iter != data->end(); iter++)
{
string field_name = iter->first;
int nrows = iter->second->nRows();
if (!(nrows>0)) {
string msg = field_name + " does not have data for output";
throw ATC_Error(msg);
}
int ncols = iter->second->nCols();
if (ncols > kFileNameSize) {
if (ATC::LammpsInterface::instance()->rank_zero()) {
stringstream ss;
ss << " only writing " << kFileNameSize
<< " components of " << field_name << " which has " << ncols;
ATC::LammpsInterface::instance()->print_msg(ss.str());
}
ncols = kFileNameSize;
}
if (ncols == 1) {
string name = field_name;
custom_name(field_name,0,name);
string str; stringstream out; out <<":"<<k; str = out.str();
name.append(str);
text.width(kFieldWidth); text << name << " ";
k++;
}
else {
for (int i = 1; i <= ncols; i++) {
string name = field_name;
string str; stringstream out;
if (! custom_name(field_name,i-1,name)) { out <<"_"<<i; }
out <<":"<<k; str = out.str();
name.append(str);
text.width(kFieldWidth); text << name << " ";
k++;
}
}
}
} else { throw ATC_Error(" data missing from output");}
text << "\n";
}
//-----------------------------------------------------------------------------
/** write data in text format */
//-----------------------------------------------------------------------------
void OutputManager::write_data_text(OUTPUT_LIST *data)
{
string data_file_text = outputPrefix_ + ".DATA";
ofstream text;
if (firstStep_) text.open(data_file_text.c_str(),ios_base::out);
else text.open(data_file_text.c_str(),ios_base::app);
// write data label header
if (firstStep_)
{
text.width(6); text << "# index:1" << " "; // give an ordinate for gnuplot
text.width(10); text << " step:2" << " ";
write_text_data_header(data,text,3);
}
text << "# timestep " << outputTimes_.size() << " : "
<< outputTimes_[outputTimes_.size()-1] << "\n";
int nrows = 0;
OUTPUT_LIST::iterator iter;
iter = data->begin();
if (iter == data->end()) { throw ATC_Error(" no data in output");}
const MATRIX* field_data = iter->second;
nrows = field_data->nRows();
for (int i = 0; i < nrows; ++i)
{
text.width(6); text << i << " "; // give an ordinate for gnuplot
text.width(10); text << outputTimes_.size() << " ";
OUTPUT_LIST::iterator iter;
for (iter = data->begin(); iter != data->end(); iter++)
{
const MATRIX* field_data = iter->second;
int ncols = field_data->nCols();
if (ncols > kFileNameSize) { ncols = kFileNameSize;}
for (int j = 0; j < ncols; ++j)
{
text.width(kFieldWidth);
text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << (*field_data)(i,j) << " ";
}
}
text <<"\n";
}
text <<"\n";
}
//-----------------------------------------------------------------------------
/** write data in full text format */
//-----------------------------------------------------------------------------
void OutputManager::write_data_text(OUTPUT_LIST *data, const int *node_map)
{
string data_file_text = outputPrefix_ + ".DATA";
ofstream text;
if (firstStep_) text.open(data_file_text.c_str(),ios_base::out);
else text.open(data_file_text.c_str(),ios_base::app);
// write data label header
if (firstStep_)
{
text.width(6); text << "# index:1" << " ";
text.width(6); text << " id:2" << " ";
text.width(10); text << " step:3" << " ";
text.width(4); text << " x:4" << " ";
text.width(4); text << " y:5" << " ";
text.width(4); text << " z:6" << " ";
write_text_data_header(data,text,7);
if (connectivities_)
{
int number_of_elements = connectivities_->nCols();
int number_of_nodes_per_element = connectivities_->nRows();
text << "# connectivities number_of_elements: " << number_of_elements
<< " nodes_per_element: " << number_of_nodes_per_element << "\n";
for (int j = 0; j < number_of_elements; ++j)
{
text << "#";
for (int i = 0; i < number_of_nodes_per_element; ++i)
{
int inode = (*connectivities_)(i,j) +1; // 1 based numbering
text << setw(6) << inode;
}
text << "\n";
}
}
}
text << "# timestep " << outputTimes_.size() << " : "
<< outputTimes_[outputTimes_.size()-1] << "\n";
OUTPUT_LIST::iterator iter;
iter = data->begin();
if (iter == data->end()) { throw ATC_Error(" no data in output");}
int nnodes = coordinates_->nCols();
for (int i = 0; i < nnodes; ++i)
{
int unode = i;
if (node_map) unode = node_map[i];
text.width(6); text << i << " ";
text.width(6); text << unode << " ";
text.width(10); text << outputTimes_.size() << " ";
// coordinates
for (int j = 0; j < coordinates_->nRows(); ++j) {
text.width(kFieldWidth);
text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << (*coordinates_)(j,i) << " ";
}
// data
OUTPUT_LIST::iterator iter;
for (iter = data->begin(); iter != data->end(); iter++)
{
const MATRIX* field_data = iter->second;
int ncols = field_data->nCols();
if (ncols > kFileNameSize) { ncols = kFileNameSize; }
for (int j = 0; j < ncols; ++j)
{
text.width(kFieldWidth);
text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << (*field_data)(unode,j) << " ";
}
}
text <<"\n";
}
text <<"\n";
}
//-----------------------------------------------------------------------------
/** write data in vtk text format */
//-----------------------------------------------------------------------------
void OutputManager::write_data_vtk(OUTPUT_LIST *data)
{
string data_file_text = outputPrefix_ + ".vtk";
ofstream text;
if (firstStep_) text.open(data_file_text.c_str(),ios_base::out);
else throw ATC_Error(" vtk format can not handle multiple steps");
text << "# vtk DataFile Version 3.0\n";
text << "# " << outputPrefix_ << "\n";
text << "ASCII\n";
text << "DATASET UNSTRUCTURED_GRID\n";
// geometry
int nnodes = coordinates_->nCols();
text << "POINTS " << nnodes << " float\n";
for (int i = 0; i < nnodes; ++i) {
for (int j = 0; j < coordinates_->nRows(); ++j) {
text.width(kFieldWidth);
text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << (*coordinates_)(j,i) << " ";
}
text << "\n";
}
text << "\n";
int nelems = connectivities_->nCols();
int nodes_per_element = connectivities_->nRows();
text << "CELLS " << nelems << " " << nelems*(nodes_per_element+1) << "\n";
for (int j = 0; j < nelems; ++j) {
text << setw(6) << nodes_per_element;
for (int i = 0; i < nodes_per_element; ++i) {
int inode = (*connectivities_)(i,j); // 0 based numbering
text << setw(6) << inode;
}
text << "\n";
}
text << "\n";
int cell_type = 4 ;
text << "CELL_TYPES " << nelems << "\n";
for (int j = 0; j < nelems; ++j) {
text << cell_type << "\n";
}
text << "\n";
// data
text << "POINT_DATA " << nnodes << "\n";
text << "\n";
OUTPUT_LIST::iterator iter;
for (iter = data->begin(); iter != data->end(); iter++)
{
string field_name = iter->first;
const MATRIX* field_data = iter->second;
int ncols = field_data->nCols();
if (ncols == 1) {
text << "SCALARS " << field_name << " float\n";
text << "LOOKUP_TABLE default\n";
}
else {
text << "VECTORS " << field_name << " float\n";
}
for (int i = 0; i < nnodes; ++i) {
for (int j = 0; j < ncols; ++j) {
text.width(kFieldWidth);
text << setw(kFieldWidth) << std::scientific << std::setprecision(kFieldPrecison) << (*field_data)(i,j) << " ";
}
text <<"\n";
}
}
text <<"\n";
}
/** write (ensight gold : ASCII "C" format) dictionary */
void OutputManager::write_dictionary(double time, OUTPUT_LIST *data)
{
// file names
string dict_file_name = outputPrefix_ + ".case";
string geom_file_name = outputPrefix_ + ".geo";
// open file
FILE * fp=NULL;
if ((fp=fopen(dict_file_name.c_str(),"w")) == NULL)
{
throw ATC_Error("can not create Ensight case file");
}
// write file
fprintf(fp,"FORMAT\n");
fprintf(fp,"type: ensight gold\n");
fprintf(fp,"GEOMETRY\n");
if ( dataType_ == POINT) {
fprintf(fp,"model: 1 1 %s change_coords_only\n", geom_file_name.c_str());
} else {
fprintf(fp,"model: %s\n", geom_file_name.c_str());
}
fprintf(fp,"VARIABLE\n");
// data types
if (!data) throw ATC_Error("no data for output");
OUTPUT_LIST::iterator iter;
int ncols = 0;
for (iter = data->begin(); iter != data->end(); iter++) {
string field_name = iter->first;
string field_file = outputPrefix_ + "." + field_name;
const MATRIX* field_data = iter->second;
int fieldCols = field_data->nCols();
ncols += fieldCols;
int type = data_type(fieldCols);
if (use_component_names(type)){
string* component_names = get_component_names(type);
int ndof = fieldCols;
if (ndof > kFileNameSize) ndof = kFileNameSize;
for (int j = 0; j < ndof; ++j)
{
string comp_name;
if (! custom_name(field_name,j,comp_name))
comp_name = field_name + component_names[j];
string comp_file = outputPrefix_ + "." + comp_name;
fprintf(fp,"scalar per node: 1 1 %s %s\n",
comp_name.c_str(),comp_file.c_str());
}
}
else if (type == VECTOR_OUTPUT) {
fprintf(fp,"vector per node: 1 1 %s %s\n",
field_name.c_str(),field_file.c_str());
}
else if (type == SYM_TENSOR_OUTPUT) {
fprintf(fp,"tensor symm per node: 1 1 %s %s\n",
field_name.c_str(),field_file.c_str());
}
else if (type == TENSOR_OUTPUT) {
fprintf(fp,"tensor asymm per node: 1 1 %s %s\n",
field_name.c_str(),field_file.c_str());
}
else {
fprintf(fp,"scalar per node: 1 1 %s %s\n",
field_name.c_str(),field_file.c_str());
}
}
if (!firstStep_ && ncols != nDataCols_) {
throw ATC_Error("number of columns of data has changed: start new output");
}
nDataCols_ = ncols;
int nsteps = outputTimes_.size();
fprintf(fp,"TIME\n");
fprintf(fp,"time set: 1\n");
fprintf(fp,"number of steps: %10d\n",nsteps);
if ( dataType_ == POINT) {
fprintf(fp,"filename start number: 0\n");
fprintf(fp,"filename increment: 1\n");
}
fprintf(fp,"time values:\n");
for (int j = 0; j < nsteps; ++j) {
double t = outputTimes_[j];
fprintf(fp,"%12.5e",t);
if ((j+1)%6 == 0) fprintf(fp,"\n");
}
fprintf(fp,"\n");
fprintf(fp,"FILE\n");
fprintf(fp,"file set: 1\n");
fprintf(fp,"number of steps: %10d\n",nsteps);
fclose(fp);
};
} // end ATC namespace
diff --git a/lib/atc/OutputManager.h b/lib/atc/OutputManager.h
index c4c70a2e6..f63780b77 100644
--- a/lib/atc/OutputManager.h
+++ b/lib/atc/OutputManager.h
@@ -1,146 +1,145 @@
#ifndef OUTPUT_MANAGER_H
#define OUTPUT_MANAGER_H
#include "ATC_TypeDefs.h"
-
#include <map>
+#include <vector>
#include <string>
+#include <set>
// 1 -> scalar
// 3 -> vector x,y,z
// NOT 6 -> tensor xx,xy,xz,yy,yz,zz
// 6 -> tensor xx,yy,zz,xy,zx,yz
// 9 -> tensor xx,xy,xz,yx,yy,yz,zx,zy,zz
-using namespace std;
-
namespace ATC {
enum OutputType { ENSIGHT=0, GNUPLOT, FULL_GNUPLOT, VTK };
enum OutputDataType { POINT=0, MESH };
enum OutputDataCardinality { SCALAR_OUTPUT=0, VECTOR_OUTPUT, TENSOR_OUTPUT,
SYM_TENSOR_OUTPUT, LIST_OUTPUT };
enum OutputOption { OUTPUT_VECTOR_COMPONENTS=0, OUTPUT_TENSOR_COMPONENTS};
/**
* @class OutputManager
* @brief Base class for handling output desired from an AtC computation
*/
class OutputManager{
public:
OutputManager(void);
- OutputManager(string outputPrefix, set<int> &otypes);
+ OutputManager(std::string outputPrefix, std::set<int> &otypes);
~OutputManager(void);
/** initialize output */
- void initialize(string outputPrefix, set<int> &otypes);
+ void initialize(std::string outputPrefix, std::set<int> &otypes);
/** set output options */
void set_option(OutputOption option, bool value);
// Dump text-based field info to disk for later restart
- void write_restart_file(string fileName, RESTART_LIST *data);
+ void write_restart_file(std::string fileName, RESTART_LIST *data);
// Read text-based field file written from write_restart_file
- void read_restart_file(string fileName, RESTART_LIST *data);
+ void read_restart_file(std::string fileName, RESTART_LIST *data);
/** write initial/reference geometry
default is to write point data,
if connectivities are given then mesh data will be output
coordinates : num _total_ points/nodes X num spatial dim
connectivities : num elements X num nodes per element*/
void write_geometry(const MATRIX *coordinates,
const Array2D<int> *connectivity=NULL);
/** write data from a time step
specify node_map to handle periodic soln & data */
void write_data(double time, OUTPUT_LIST *data, const int *node_map=NULL);
void write_data(double time, FIELDS *soln, OUTPUT_LIST *data,
const int *node_map=NULL);
/** add custom names for any field */
- void add_field_names(const string& name, const vector<string>& list) {
+ void add_field_names(const std::string& name, const std::vector<std::string>& list) {
fieldNames_[name] = list; }
/** add a scalar to a text output file */
- void add_global(const string& name, const double& value) {
+ void add_global(const std::string& name, const double& value) {
globalData_[name] = value; }
/** delete a scalar from the output */
- void delete_global(const string& name) { globalData_.erase(name); }
+ void delete_global(const std::string& name) { globalData_.erase(name); }
/** reset the stored output scalars */
void reset_globals() { globalData_.clear(); writeGlobalsHeader_=true; }
/** return data type: scalar, vector, tensor, list */
int data_type(const DENS_MAT & data) const {
return data_type(data.nCols());
}
int data_type(int cols) const {
if (cols == 1) return SCALAR_OUTPUT;
else if (cols == 3) return VECTOR_OUTPUT;
else if (cols == 6) return SYM_TENSOR_OUTPUT;
else if (cols == 9) return TENSOR_OUTPUT;
else return LIST_OUTPUT;
}
bool use_component_names(int type) const {
if ( (type==LIST_OUTPUT) ||
((type==SYM_TENSOR_OUTPUT || type==TENSOR_OUTPUT) && tensorToComponents_)
|| (type==VECTOR_OUTPUT && vectorToComponents_) )
return true;
else
return false;
}
- bool custom_name(const string field, const int index, string & name) const {
- map<string,vector<string> >::const_iterator itr = fieldNames_.find(field);
+ bool custom_name(const std::string field, const int index, std::string & name) const {
+ std::map<std::string,std::vector<std::string> >::const_iterator itr = fieldNames_.find(field);
if (itr == fieldNames_.end()) return false;
- vector<string> names = itr->second;
+ std::vector<std::string> names = itr->second;
name = names[index];
return true;
}
void print_custom_names();
private:
void write_geometry_ensight(void);
void write_geometry_text(void);
- void write_data_ensight(string name, const MATRIX *data, const int *node_map);
- void write_text_data_header(OUTPUT_LIST *data, ofstream & text, int k);
+ void write_data_ensight(std::string name, const MATRIX *data, const int *node_map);
+ void write_text_data_header(OUTPUT_LIST *data, std::ofstream & text, int k);
void write_data_text(OUTPUT_LIST *data);
void write_data_text(OUTPUT_LIST *data, const int *node_map);
void write_data_vtk(OUTPUT_LIST *data);
void write_dictionary(double time, OUTPUT_LIST *data);
void write_globals();
/** status flags */
bool initialized_, firstStep_, firstGlobalsWrite_, writeGlobalsHeader_;
/** custom field names */
- map<string,vector<string> > fieldNames_;
+ std::map<std::string,std::vector<std::string> > fieldNames_;
/** pointers to mesh data */
const MATRIX * coordinates_;
const Array2D<int> * connectivities_;
/** number of columns of data */
int nDataCols_;
/** number of nodes */
int number_of_nodes_;
/** data type */
int dataType_;
/** base name for output files */
- string outputPrefix_;
+ std::string outputPrefix_;
/** list of output timesteps */
- vector<double> outputTimes_;
+ std::vector<double> outputTimes_;
/** output type flags */
bool ensightOutput_,textOutput_,fullTextOutput_,vtkOutput_;
/** output tensor as its components */
bool tensorToComponents_;
/** output vector as its components */
bool vectorToComponents_;
/** global variables */
- map<string,double> globalData_;
+ std::map<std::string,double> globalData_;
};
}
#endif
diff --git a/lib/atc/ParDenseMatrix.h b/lib/atc/ParDenseMatrix.h
index 06a9549fb..1c9e75f17 100644
--- a/lib/atc/ParDenseMatrix.h
+++ b/lib/atc/ParDenseMatrix.h
@@ -1,174 +1,172 @@
#ifndef PARDENSEMATRIX_H
#define PARDENSEMATRIX_H
#include "MatrixDef.h"
#include "DenseMatrix.h"
#include "DenseVector.h"
#include "MPI_Wrappers.h"
#include "ATC_Error.h"
using ATC::ATC_Error;
#include <algorithm>
#include <sstream>
-using namespace MPI_Wrappers;
-
namespace ATC_matrix {
/**
* @class ParDenseMatrix
* @brief Parallelized version of DenseMatrix class.
*/
template <typename T>
class ParDenseMatrix : public DenseMatrix<T> {
public:
MPI_Comm _comm;
ParDenseMatrix(MPI_Comm comm, INDEX rows=0, INDEX cols=0, bool z=1)
: DenseMatrix<T>(rows, cols, z), _comm(comm) {}
ParDenseMatrix(MPI_Comm comm, const DenseMatrix<T>& c)
: DenseMatrix<T>(c), _comm(comm) {}
ParDenseMatrix(MPI_Comm comm, const SparseMatrix<T>& c)
: DenseMatrix<T>(c), _comm(comm) {}
ParDenseMatrix(MPI_Comm comm, const Matrix<T>& c)
: DenseMatrix<T>(c), _comm(comm) {}
//////////////////////////////////////////////////////////////////////////////
//* performs a matrix-vector multiply
void ParMultMv(const Vector<T> &v,
DenseVector<T> &c, const bool At, T a, T b)
{
// We can't generically support parallel multiplication because the data
// types must be specified when using MPI
MultMv(*this, v, c, At, a, b);
}
};
template<>
class ParDenseMatrix<double> : public DenseMatrix<double> {
public:
MPI_Comm _comm;
ParDenseMatrix(MPI_Comm comm, INDEX rows=0, INDEX cols=0, bool z=1)
: DenseMatrix<double>(rows, cols, z), _comm(comm) {}
ParDenseMatrix(MPI_Comm comm, const DenseMatrix<double>& c)
: DenseMatrix<double>(c), _comm(comm) {}
ParDenseMatrix(MPI_Comm comm, const SparseMatrix<double>& c)
: DenseMatrix<double>(c), _comm(comm) {}
ParDenseMatrix(MPI_Comm comm, const Matrix<double>& c)
: DenseMatrix<double>(c), _comm(comm) {}
void ParMultMv(const Vector<double> &v, DenseVector<double> &c,
const bool At, double a, double b) const
{
// We don't support parallel vec-Mat multiplication yet
if (At) {
MultMv(*this, v, c, At, a, b);
return;
}
const INDEX nRows = this->nRows();
const INDEX nCols = this->nCols();
if (c.size() != nRows) {
c.resize(nRows); // set size of C
c.zero(); // do not add result to C
} else c *= b;
// Determine how many rows will be handled on each processor
int nProcs = MPI_Wrappers::size(_comm);
int myRank = MPI_Wrappers::rank(_comm);
int *majorCounts = new int[nProcs];
int *offsets = new int[nProcs];
#ifdef COL_STORAGE // Column-major storage
int nMajor = nCols;
int nMinor = nRows;
int ParDenseMatrix::*majorField = &ParDenseMatrix::_nCols;
int ParDenseMatrix::*minorField = &ParDenseMatrix::_nRows;
#else // Row-major storage
int nMajor = nRows;
int nMinor = nCols;
int ParDenseMatrix::*majorField = &ParDenseMatrix::_nRows;
int ParDenseMatrix::*minorField = &ParDenseMatrix::_nCols;
#endif
for (int i = 0; i < nProcs; i++) {
// If we have an uneven row-or-col/processors number, or too few rows
// or cols, some processors will need to receive fewer rows/cols.
offsets[i] = (i * nMajor) / nProcs;
majorCounts[i] = (((i + 1) * nMajor) / nProcs) - offsets[i];
}
int myNMajor = majorCounts[myRank];
int myMajorOffset = offsets[myRank];
// Take data from an offset version of A
ParDenseMatrix<double> A_local(_comm);
A_local._data = this->_data + myMajorOffset * nMinor;
A_local.*majorField = myNMajor;
A_local.*minorField = nMinor;
#ifdef COL_STORAGE // Column-major storage
// When splitting by columns, we split the vector as well, and sum the
// results.
DenseVector<double> v_local(myNMajor);
for (int i = 0; i < myNMajor; i++)
v_local(i) = v(myMajorOffset + i);
// Store results in a local vector
DenseVector<double> c_local = A_local * v_local;
// Sum all vectors onto each processor
- allsum(_comm, c_local.ptr(), c.ptr(), c_local.size());
+ MPI_Wrappers::allsum(_comm, c_local.ptr(), c.ptr(), c_local.size());
#else // Row-major storage
// When splitting by rows, we use the whole vector and concatenate the
// results.
// Store results in a small local vector
DenseVector<double> c_local(myNMajor);
for (int i = 0; i < myNMajor; i++)
c_local(i) = c(myMajorOffset + i);
MultMv(A_local, v, c_local, At, a, b);
// Gather the results onto each processor
allgatherv(_comm, c_local.ptr(), c_local.size(), c.ptr(),
majorCounts, offsets);
#endif
// Clear out the local matrix's pointer so we don't double-free
A_local._data = NULL;
delete [] majorCounts;
delete [] offsets;
}
};
// Operator for dense Matrix - dense vector product
template<typename T>
DenseVector<T> operator*(const ParDenseMatrix<T> &A, const Vector<T> &b)
{
DenseVector<T> c;
A.ParMultMv(b, c, 0, 1.0, 0.0);
return c;
}
} // end namespace
#endif
diff --git a/lib/atc/ParDiagonalMatrix.cpp b/lib/atc/ParDiagonalMatrix.cpp
index 8fbd343b5..15690b32e 100644
--- a/lib/atc/ParDiagonalMatrix.cpp
+++ b/lib/atc/ParDiagonalMatrix.cpp
@@ -1,91 +1,93 @@
#include "ParDiagonalMatrix.h"
+using MPI_Wrappers::allgatherv;
+
namespace ATC_matrix {
// template<>
// void ParDiagonalMatrix<double>::MultAB(const Matrix<double> &B, DenseMatrix<double> &C) const
// {
// //SparseMatrix<T>::compress(*this);
// GCK(*this, B, this->nCols()!=B.nRows(), "ParDiagonalMatrix * Matrix");
// const INDEX nRows = this->nRows();
// const INDEX nCols = this->nCols();
// // Determine which rows will be handled on this processor
// int nProcs = MPI_Wrappers::size(_comm);
// int myRank = MPI_Wrappers::rank(_comm);
// INDEX startIndex = (myRank * nRows) / nProcs;
// INDEX endIndex = ((myRank + 1) * nRows) / nProcs;
// // Calculate the scaled rows associated with this processor
// for (INDEX i = startIndex; i < endIndex; i++) {
// double value = (*this)[i];
// for (INDEX j = 0; j < nCols; j++)
// C(i, j) = value * B(i, j);
// }
// // Collect results on all processors
// // consider sending only owned rows from each processor
// allsum(_comm, MPI_IN_PLACE, C.ptr(), C.size());
// }
template<>
void ParDiagonalMatrix<double>::MultAB(const Matrix<double> &B, DenseMatrix<double> &C) const
{
//SparseMatrix<T>::compress(*this);
GCK(*this, B, this->nCols()!=B.nRows(), "ParDiagonalMatrix * Matrix");
const INDEX nRows = this->nRows();
const INDEX nCols = this->nCols();
int nProcs = MPI_Wrappers::size(_comm);
int myRank = MPI_Wrappers::rank(_comm);
#ifdef COL_STORAGE // Column-major storage
int nMajor = nCols;
int nMinor = nRows;
#else // Row-major storage
int nMajor = nRows;
int nMinor = nCols;
#endif
int *majorCounts = new int[nProcs];
int *majorOffsets = new int[nProcs];
// Determine which rows/columns will be handled on this processor
for (int i = 0; i < nProcs; i++) {
majorOffsets[i] = (i * nMajor) / nProcs;
majorCounts[i] = (((i + 1) * nMajor) / nProcs) - majorOffsets[i];
}
INDEX myNMajor = majorCounts[myRank];
INDEX myMajorOffset = majorOffsets[myRank];
// Calculate the scaled values associated with this processor, in row chunks
#ifdef COL_STORAGE // Column-major storage
for (INDEX i = 0; i < nRows; i++) {
double value = (*this)[i];
for (INDEX j = myMajorOffset; j < myMajorOffset + myNMajor; j++)
C(i, j) = value * B(i, j);
}
#else // Row-major storage
for (INDEX i = myMajorOffset; i < myMajorOffset + myNMajor; i++) {
double value = (*this)[i];
for (INDEX j = 0; j < nCols; j++)
C(i, j) = value * B(i, j);
}
#endif
for (int i = 0; i < nProcs; i++) {
majorCounts[i] *= nMinor;
majorOffsets[i] *= nMinor;
}
// Collect results on all processors
allgatherv(_comm, C.ptr() + myMajorOffset * nMinor, myNMajor * nMinor,
C.ptr(), majorCounts, majorOffsets);
}
} // end namespace
diff --git a/lib/atc/ParDiagonalMatrix.h b/lib/atc/ParDiagonalMatrix.h
index cb854360a..89f22b783 100644
--- a/lib/atc/ParDiagonalMatrix.h
+++ b/lib/atc/ParDiagonalMatrix.h
@@ -1,40 +1,38 @@
#ifndef PARDIAGONALMATRIX_H
#define PARDIAGONALMATRIX_H
#include "mpi.h"
#include "MPI_Wrappers.h"
#include "MatrixLibrary.h"
#include "DiagonalMatrix.h"
#include "DenseMatrix.h"
-using namespace MPI_Wrappers;
-
namespace ATC_matrix {
/**
* @class ParDiagonalMatrix
* @brief Parallelized version of DiagonalMatrix class.
*/
template <typename T>
class ParDiagonalMatrix : public DiagonalMatrix<T> {
public:
ParDiagonalMatrix(MPI_Comm comm, INDEX rows=0, bool z=0)
: DiagonalMatrix<T>(rows, z), _comm(comm) {}
ParDiagonalMatrix(MPI_Comm comm, const DiagonalMatrix<T>& c)
: DiagonalMatrix<T>(c), _comm(comm) {}
ParDiagonalMatrix(MPI_Comm comm, const Vector<T>& v)
: DiagonalMatrix<T>(v), _comm(comm) {}
void MultAB(const Matrix<T> &B, DenseMatrix<T> &C) const;
private:
MPI_Comm _comm;
};
template<>
void ParDiagonalMatrix<double>::MultAB(const Matrix<double> &B, DenseMatrix<double> &C) const;
} // end namespace
#endif
diff --git a/lib/atc/ParSparseMatrix.h b/lib/atc/ParSparseMatrix.h
index 5ea20491d..0985115d0 100644
--- a/lib/atc/ParSparseMatrix.h
+++ b/lib/atc/ParSparseMatrix.h
@@ -1,152 +1,150 @@
#ifndef PARSPARSEMATRIX_H
#define PARSPARSEMATRIX_H
#include "mpi.h"
#include "MPI_Wrappers.h"
#include "SparseMatrix.h"
#include "DiagonalMatrix.h"
#include <algorithm>
-using namespace MPI_Wrappers;
-
namespace ATC_matrix {
/**
* @class ParSparseMatrix
* @brief Parallelized version of SparseMatrix class.
*
* ParSparseMatrix<double>::MultMv is used in LinearSolver, which is then
* used in NonLinearSolver, PoissonSolver, and SchrodingerSolver. These
* parallelized solvers are used in the following locations:
*
* - LinearSolver
* - ExtrinsicModelDriftDiffusion.cpp (lines 511 and 522)
* - AtomicRegulator.cpp (line 926)
* - TransferLibrary.cpp (lines 72 and 260)
* - PoissonSolver
* - ExtrinsicModelDriftDiffusion.cpp (line 232)
* - SchrodingerSolver
* - ExtrinsicModelDriftDiffusion.cpp (line 251)
* - SliceSchrodingerSolver
* - ExtrinsicModelDriftDiffusion.cpp (line 246)
*/
template <typename T>
class ParSparseMatrix : public SparseMatrix<T>
{
public:
ParSparseMatrix(MPI_Comm comm, INDEX rows = 0, INDEX cols = 0)
: SparseMatrix<T>(rows, cols), _comm(comm){}
ParSparseMatrix(MPI_Comm comm, const SparseMatrix<T> &c)
: SparseMatrix<T>(c), _comm(comm){}
ParSparseMatrix(MPI_Comm comm, INDEX* rows, INDEX* cols, T* vals,
INDEX size, INDEX nRows, INDEX nCols, INDEX nRowsCRS)
: SparseMatrix<T>(rows, cols, vals, size, nRows, nCols, nRowsCRS)
,_comm(comm){}
ParSparseMatrix(MPI_Comm comm)
: SparseMatrix<T>(), _comm(comm){}
virtual void operator=(const SparseMatrix<T> &source)
{
copy(source);
}
template<typename U>
friend void ParMultAB(MPI_Comm comm, const SparseMatrix<U>& A,
const Matrix<U>& B, DenseMatrix<U>& C);
private:
MPI_Comm _comm;
};
template <>
class ParSparseMatrix<double> : public SparseMatrix<double>
{
public:
// All the same constructors as for SparseMatrix
ParSparseMatrix(MPI_Comm comm, INDEX rows = 0, INDEX cols=0);
ParSparseMatrix(MPI_Comm comm, const SparseMatrix<double> &c);
ParSparseMatrix(MPI_Comm comm, INDEX* rows, INDEX* cols, double* vals, INDEX size,
INDEX nRows, INDEX nCols, INDEX nRowsCRS);
// Parallel sparse matrix multiplication functions
void MultMv(const Vector<double>& v, DenseVector<double>& c) const;
DenseVector<double> transMat(const Vector<double>& v) const;
void MultAB(const Matrix<double>& B, DenseMatrix<double>& C) const;
DenseMatrix<double> transMat(const DenseMatrix<double>& B) const;
DenseMatrix<double> transMat(const SparseMatrix<double>& B) const;
virtual void operator=(const SparseMatrix<double> &source);
template<typename U>
friend void ParMultAB(MPI_Comm comm, const SparseMatrix<U>& A, const Matrix<U>& B, DenseMatrix<U>& C);
private:
void partition(ParSparseMatrix<double>& A_local) const;
void finalize();
MPI_Comm _comm;
};
// The SparseMatrix versions of these functions will call the correct
// MultMv/MultAB:
// DenseVector<double> operator*(const ParSparseMatrix<double> &A, const Vector<double> &v);
// DenseVector<double> operator*(const Vector<double> &v, const ParSparseMatrix<double> &A);
// DenseMatrix<double> operator*(const ParSparseMatrix<double> &A, const Matrix<double> &B);
template<typename T>
void ParMultAB(MPI_Comm comm, const SparseMatrix<T>& A, const Matrix<T>& B, DenseMatrix<T>& C)
{
SparseMatrix<T>::compress(A);
INDEX M = A.nRows(), N = B.nCols();
if (!C.is_size(M, N))
{
C.resize(M, N);
C.zero();
}
// Temporarily put fields into a ParSparseMatrix for distributed multiplication
ParSparseMatrix<T> Ap(comm);
Ap._nRows = A._nRows;
Ap._nCols = A._nCols;
Ap._size = A._size;
Ap._nRowsCRS = A._nRowsCRS;
Ap._val = A._val;
Ap._ja = A._ja;
Ap._ia = A._ia;
Ap.hasTemplate_ = A.hasTemplate_;
// MultAB calls compress(), but we hope that does nothing because we just
// compressed A. If it did something, it might mess up other members
// (e.g. _tri).
Ap.MultAB(B, C);
// We're not changing the matrix's values, so we can justify calling A const.
SparseMatrix<T> &Avar = const_cast<SparseMatrix<T> &>(A);
Avar._nRows = Ap._nRows;
Avar._nCols = Ap._nCols;
Avar._size = Ap._size;
Avar._nRowsCRS = Ap._nRowsCRS;
Avar._val = Ap._val;
Avar._ja = Ap._ja;
Avar._ia = Ap._ia;
Avar.hasTemplate_ = Ap.hasTemplate_;
// Avoid catastrophe
Ap._val = NULL;
Ap._ja = NULL;
Ap._ia = NULL;
}
/*SparseMatrix<double> operator*(const ParSparseMatrix<double> &A, const SparseMatrix<double> &B);
SparseMatrix<double> operator*(const ParSparseMatrix<double> &A, const DiagonalMatrix<double> &B);
*/
} // end namespace
#endif
diff --git a/lib/atc/PerAtomQuantity-inl.h b/lib/atc/PerAtomQuantity-inl.h
index 493e681cd..037c3aded 100644
--- a/lib/atc/PerAtomQuantity-inl.h
+++ b/lib/atc/PerAtomQuantity-inl.h
@@ -1,791 +1,801 @@
#ifndef PER_ATOM_QUANTITY_INL_H
#define PER_ATOM_QUANTITY_INL_H
+#include <string>
+
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class PerAtomQuantity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
template <typename T>
PerAtomQuantity<T>::PerAtomQuantity(ATC_Method * atc,
int nCols,
AtomType atomType) :
MatrixDependencyManager<DenseMatrix, T>(),
atc_(atc,atomType),
lammpsInterface_(LammpsInterface::instance()),
atomType_(atomType),
nCols_(nCols),
quantityToLammps_(atc_.atc_to_lammps_map()),
lammpsScalar_(NULL),
lammpsVector_(NULL)
{
// do nothing
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
template <typename T>
PerAtomQuantity<T>::~PerAtomQuantity()
{
if (lammpsScalar_) lammpsInterface_->destroy_array(lammpsScalar_);
if (lammpsVector_) lammpsInterface_->destroy_array(lammpsVector_);
}
//--------------------------------------------------------
// set_lammps_to_quantity
//--------------------------------------------------------
template <typename T>
void PerAtomQuantity<T>::set_lammps_to_quantity() const
{
const DenseMatrix<T> & myQuantity(this->quantity_); // necessary to access quantity_ this way because of templating
if (myQuantity.nRows()>0) {
// full matrix copy
if (atomType_ == ALL || atomType_ == PROC_GHOST) {
if (nCols_==1) { // scalar
T * lammpsQuantity = this->lammps_scalar();
for (int i = 0; i < atc_.nlocal_total(); i++)
lammpsQuantity[i] = myQuantity(i,0);
}
else{ // vector
T ** lammpsQuantity = this->lammps_vector();
for (int i = 0; i < atc_.nlocal_total(); i++)
for (int j = 0; j < nCols_; j++)
lammpsQuantity[i][j] = myQuantity(i,j);
}
}
// map quantities
else {
int atomIndex;
+ const Array<int> & quantityToLammps = atc_.atc_to_lammps_map();
if (nCols_==1) { // scalar
T * lammpsQuantity = this->lammps_scalar();
for (int i = 0; i < myQuantity.nRows(); i++) {
- atomIndex = quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
lammpsQuantity[atomIndex] = myQuantity(i,0);
}
}
else{ // vector
T ** lammpsQuantity = this->lammps_vector();
for (int i = 0; i < myQuantity.nRows(); i++) {
- atomIndex = quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
for (int j = 0; j < nCols_; j++) {
lammpsQuantity[atomIndex][j] = myQuantity(i,j);
}
}
}
}
}
}
//--------------------------------------------------------
// set_quantity_to_lammps
//--------------------------------------------------------
template <typename T>
void PerAtomQuantity<T>::set_quantity_to_lammps() const
{
DenseMatrix<T> & myQuantity(this->quantity_);
if (myQuantity.nRows()>0) {
// full matrix copy
// in the case where processor ghosts are in the quantity, don't set them back
if (atomType_ == ALL || atomType_ == PROC_GHOST) {
if (nCols_==1) { // scalar
const T * lammpsQuantity = this->lammps_scalar();
for (int i = 0; i < myQuantity.nRows(); i++) {
myQuantity(i,0) = lammpsQuantity[i];
}
}
else {
const T * const * lammpsQuantity = this->lammps_vector();
for (int i = 0; i < myQuantity.nRows(); i++) {
for (int j = 0; j < nCols_; j++) {
myQuantity(i,j) = lammpsQuantity[i][j];
}
}
}
}
// map quantities
else {
+ const Array<int> & quantityToLammps = atc_.atc_to_lammps_map();
int atomIndex;
-
+
if (nCols_==1) { // scalar
const T * lammpsQuantity = this->lammps_scalar();
for (int i = 0; i < myQuantity.nRows(); i++) {
- atomIndex = quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
myQuantity(i,0) = lammpsQuantity[atomIndex];
}
}
else {
const T * const * lammpsQuantity = this->lammps_vector();
for (int i = 0; i < myQuantity.nRows(); i++) {
- atomIndex = quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
for (int j = 0; j < nCols_; j++) {
myQuantity(i,j) = lammpsQuantity[atomIndex][j];
}
}
}
}
}
}
//-----------------------------------------------------------------
// pack values in local atom-based arrays for exchange with another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomQuantity<T>::pack_exchange(int i, double *buffer)
{
if (nCols_ == 1)
buffer[0] = static_cast<double>(this->lammps_scalar()[i]);
else
for (int j = 0; j < nCols_; j++) {
T ** lammpsVector = this->lammps_vector();
buffer[j] = static_cast<double>(lammpsVector[i][j]);
}
return nCols_;
}
//-----------------------------------------------------------------
// unpack values in local atom-based arrays from exchange with another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomQuantity<T>::unpack_exchange(int i, double *buffer)
{
if (nCols_ == 1)
this->lammps_scalar()[i] = static_cast<T>(buffer[0]);
else
for (int j = 0; j < nCols_; j++) {
T ** lammpsVector = this->lammps_vector();
lammpsVector[i][j] = static_cast<T>(buffer[j]);
}
return nCols_;
}
//-----------------------------------------------------------------
// pack values in local atom-based arrays for passing to ghosts on another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomQuantity<T>::pack_comm(int index, double *buf,
int pbc_flag, int *pbc)
{
if (this->need_reset()) this->reset();
DenseMatrix<T> & myQuantity(this->quantity_);
for (int k = 0; k < nCols_; k++) {
buf[k] = static_cast<double>(myQuantity(index,k));
}
return nCols_;
}
//-----------------------------------------------------------------
// unpack values in local atom-based arrays for passing to ghosts on another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomQuantity<T>::unpack_comm(int index, double *buf)
{
DenseMatrix<T> & myQuantity(this->quantity_);
for (int k = 0; k < nCols_; k++) {
myQuantity(index,k) = static_cast<T>(buf[k]);
}
this->propagate_reset();
return nCols_;
}
//-----------------------------------------------------------------
// allocate local atom-based arrays
//-----------------------------------------------------------------
template <typename T>
- void PerAtomQuantity<T>::grow_lammps_array(int nmax, const string & tag)
+ void PerAtomQuantity<T>::grow_lammps_array(int nmax, const std::string & tag)
{
if (nCols_ == 1)
this->lammpsScalar_ = lammpsInterface_->grow_array(this->lammpsScalar_,nmax,tag.c_str());
else
this->lammpsVector_ = lammpsInterface_->grow_array(this->lammpsVector_,nmax,nCols_,tag.c_str());
}
//-----------------------------------------------------------------
// copy values within local atom-based arrays
//-----------------------------------------------------------------
template <typename T>
void PerAtomQuantity<T>::copy_lammps_array(int i, int j)
{
if (nCols_ == 1) {
T * lammpsScalar = this->lammps_scalar();
lammpsScalar[j] = lammpsScalar[i];
}
else {
T ** lammpsVector = this->lammps_vector();
for (int k = 0; k < nCols_; k++)
lammpsVector[j][k] = lammpsVector[i][k];
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class LammpsAtomQuantity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// reset
// reset is only true if set_quantity was used,
// so this syncs the quantity back with lammps
//--------------------------------------------------------
template <typename T>
void LammpsAtomQuantity<T>::reset() const
{
if (this->need_reset()) {
PerAtomQuantity<T>::reset();
this->set_quantity_to_lammps();
}
}
//-----------------------------------------------------------------
// pack values in local atom-based arrays for passing to ghosts on another proc
//-----------------------------------------------------------------
template <typename T>
int LammpsAtomQuantity<T>::pack_comm(int index, double *buf,
int pbc_flag, int *pbc)
{
if (this->need_reset()) this->reset();
int bufIdx = 0;
if (this->nCols_ == 1) {
T * lammpsQuantity = this->lammps_scalar();
buf[bufIdx++] = double(lammpsQuantity[index]);
}
else {
T ** lammpsQuantity = this->lammps_vector();
for (int k = 0; k < this->nCols_; k++)
buf[bufIdx++] = double(lammpsQuantity[index][k]);
}
return bufIdx;
}
//-----------------------------------------------------------------
// unpack values in local atom-based arrays for passing to ghosts on another proc
//-----------------------------------------------------------------
template <typename T>
int LammpsAtomQuantity<T>::unpack_comm(int index, double *buf)
{
DenseMatrix<T> & myQuantity(this->quantity_);
int bufIdx = 0;
if (this->nCols_ == 1) {
T * lammpsQuantity = this->lammps_scalar();
myQuantity(index,0) = T(buf[bufIdx++]);
lammpsQuantity[index] = myQuantity(index,0);
}
else {
T ** lammpsQuantity = this->lammps_vector();
for (int k = 0; k < this->nCols_; k++) {
myQuantity(index,k) = T(buf[bufIdx++]);
lammpsQuantity[index][k] = myQuantity(index,k);
}
}
this->propagate_reset();
return bufIdx;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedMappedAtomQuantity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// set_lammps_to_quantity
//--------------------------------------------------------
template <typename T>
void ProtectedMappedAtomQuantity<T>::set_lammps_to_quantity() const
{
this->reset();
const DenseMatrix<T> & myQuantity(this->quantity_); // necessary to access quantity_ this way because of templating
int nCols = myQuantity.nCols();
const INT_ARRAY & atomMap(atomMap_->quantity());
if (myQuantity.nRows()>0) {
// full matrix copy
if (PerAtomQuantity<T>::atomType_ == ALL || PerAtomQuantity<T>::atomType_ == PROC_GHOST) {
if (nCols==1) { // scalar
T * lammpsQuantity = ProtectedAtomQuantity<T>::lammps_scalar();
for (int i = 0; i < PerAtomQuantity<T>::atc_.nlocal_total(); i++) {
int idx = atomMap(i,0);
if (idx > -1) {
lammpsQuantity[i] = myQuantity(idx,0);
}
}
}
else{ // vector
T ** lammpsQuantity = ProtectedAtomQuantity<T>::lammps_vector();
for (int i = 0; i < PerAtomQuantity<T>::atc_.nlocal_total(); i++) {
int idx = atomMap(i,0);
if (idx > -1) {
for (int j = 0; j < nCols; j++) {
lammpsQuantity[i][j] = myQuantity(idx,j);
}
}
}
}
}
// map quantities
else {
int atomIndex;
+ const Array<int> & quantityToLammps = (PerAtomQuantity<T>::atc_).atc_to_lammps_map();
if (nCols==1) { // scalar
T * lammpsQuantity = ProtectedAtomQuantity<T>::lammps_scalar();
for (int i = 0; i < atomMap.nRows(); i++) {
int idx = atomMap(i,0);
if (idx > -1) {
- atomIndex = ProtectedAtomQuantity<T>::quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
lammpsQuantity[atomIndex] = myQuantity(idx,0);
}
}
}
else{ // vector
T ** lammpsQuantity = ProtectedAtomQuantity<T>::lammps_vector();
for (int i = 0; i < atomMap.nRows(); i++) {
int idx = atomMap(i,0);
if (idx > -1) {
- atomIndex = ProtectedAtomQuantity<T>::quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
for (int j = 0; j < nCols; j++) {
lammpsQuantity[atomIndex][j] = myQuantity(idx,j);
}
}
}
}
}
}
}
//--------------------------------------------------------
// set_quantity_to_lammps
//--------------------------------------------------------
template <typename T>
void ProtectedMappedAtomQuantity<T>::set_quantity_to_lammps() const
{
DenseMatrix<T> & myQuantity(this->quantity_);
int nCols = myQuantity.nCols();
const INT_ARRAY & atomMap(atomMap_->quantity());
if (myQuantity.nRows()>0) {
// full matrix copy
// in the case where processor ghosts are in the quantity, don't set them back
if (PerAtomQuantity<T>::atomType_ == ALL || PerAtomQuantity<T>::atomType_ == PROC_GHOST) {
if (nCols==1) { // scalar
const T * lammpsQuantity = ProtectedAtomQuantity<T>::lammps_scalar();
for (int i = 0; i < PerAtomQuantity<T>::atc_.nlocal_total(); i++) {
int idx = atomMap(i,0);
if (idx > -1) {
myQuantity(idx,0) = lammpsQuantity[i];
}
}
}
else {
const T * const * lammpsQuantity = ProtectedAtomQuantity<T>::lammps_vector();
for (int i = 0; i < PerAtomQuantity<T>::atc_.nlocal_total(); i++) {
int idx = atomMap(i,0);
if (idx > -1) {
for (int j = 0; j < nCols; j++)
myQuantity(idx,j) = lammpsQuantity[i][j];
}
}
}
}
// map quantities
else {
int atomIndex;
-
+ const Array<int> & quantityToLammps = (PerAtomQuantity<T>::atc_).atc_to_lammps_map();
if (nCols==1) { // scalar
const T * lammpsQuantity = ProtectedAtomQuantity<T>::lammps_scalar();
for (int i = 0; i < atomMap.nRows(); i++) {
int idx = atomMap(i,0);
if (idx > -1) {
- atomIndex = ProtectedAtomQuantity<T>::quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
myQuantity(idx,0) = lammpsQuantity[atomIndex];
}
}
}
else {
const T * const * lammpsQuantity = ProtectedAtomQuantity<T>::lammps_vector();
for (int i = 0; i < atomMap.nRows(); i++) {
int idx = atomMap(i,0);
if (idx > -1) {
- atomIndex = ProtectedAtomQuantity<T>::quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
for (int j = 0; j < nCols; j++) {
myQuantity(idx,j) = lammpsQuantity[atomIndex][j];
}
}
}
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class PerAtomDiagonalMatrix
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
template <typename T>
PerAtomDiagonalMatrix<T>::PerAtomDiagonalMatrix(ATC_Method * atc,
AtomType atomType) :
MatrixDependencyManager<DiagonalMatrix, T>(),
atc_(atc,atomType),
lammpsInterface_(LammpsInterface::instance()),
atomType_(atomType),
quantityToLammps_(atc_.atc_to_lammps_map()),
lammpsScalar_(NULL)
{
// do nothing
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
template <typename T>
PerAtomDiagonalMatrix<T>::~PerAtomDiagonalMatrix()
{
if (lammpsScalar_) lammpsInterface_->destroy_array(lammpsScalar_);
}
//--------------------------------------------------------
// set_lammps_to_quantity
//--------------------------------------------------------
template <typename T>
void PerAtomDiagonalMatrix<T>::set_lammps_to_quantity() const
{
const DiagonalMatrix<T> & myQuantity(this->quantity_); // necessary to access quantity_ this way because of templating
if (myQuantity.size()>0) {
// full matrix copy
if (atomType_ == ALL || atomType_ == PROC_GHOST) {
T * lammpsQuantity = this->lammps_scalar();
for (int i = 0; i < atc_.nlocal_total(); i++) {
lammpsQuantity[i] = myQuantity(i,i);
}
}
// map quantities
else {
int atomIndex;
+ const Array<int> & quantityToLammps = atc_.atc_to_lammps_map();
T * lammpsQuantity = this->lammps_scalar();
for (int i = 0; i < myQuantity.nRows(); i++) {
- atomIndex = quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
lammpsQuantity[atomIndex] = myQuantity(i,i);
}
}
}
}
//--------------------------------------------------------
// set_quantity_to_lammps
//--------------------------------------------------------
template <typename T>
void PerAtomDiagonalMatrix<T>::set_quantity_to_lammps() const
{
DiagonalMatrix<T> & myQuantity(this->quantity_);
if (myQuantity.size()>0) {
// full matrix copy
// in the case where processor ghosts are in the quantity, don't set them back
if (atomType_ == ALL || atomType_ == PROC_GHOST) {
const T * lammpsQuantity = this->lammps_scalar();
for (int i = 0; i < myQuantity.nRows(); i++) {
myQuantity(i,i) = lammpsQuantity[i];
}
}
// map quantities
else {
int atomIndex;
+ const Array<int> & quantityToLammps = atc_.atc_to_lammps_map();
const T * lammpsQuantity = this->lammps_scalar();
for (int i = 0; i < myQuantity.nRows(); i++) {
- atomIndex = quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
myQuantity(i,i) = lammpsQuantity[atomIndex];
}
}
}
}
//-----------------------------------------------------------------
// pack values in local atom-based arrays for exchange with another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomDiagonalMatrix<T>::pack_exchange(int i, double *buffer)
{
buffer[0] = static_cast<double>(lammps_scalar()[i]);
return 1;
}
//-----------------------------------------------------------------
// unpack values in local atom-based arrays from exchange with another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomDiagonalMatrix<T>::unpack_exchange(int i, double *buffer)
{
lammps_scalar()[i] = static_cast<T>(buffer[0]);
return 1;
}
//-----------------------------------------------------------------
// pack values in local atom-based arrays for passing to ghosts on another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomDiagonalMatrix<T>::pack_comm(int index, double *buf,
int pbc_flag, int *pbc)
{
if (this->need_reset()) this->reset();
DiagonalMatrix<T> & myQuantity(this->quantity_);
buf[0] = static_cast<double>(myQuantity(index,index));
return 1;
}
//-----------------------------------------------------------------
// unpack values in local atom-based arrays for passing to ghosts on another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomDiagonalMatrix<T>::unpack_comm(int index, double *buf)
{
DiagonalMatrix<T> & myQuantity(this->quantity_);
myQuantity(index,index) = static_cast<T>(buf[0]);
this->propagate_reset();
return 1;
}
//-----------------------------------------------------------------
// allocate local atom-based arrays
//-----------------------------------------------------------------
template <typename T>
- void PerAtomDiagonalMatrix<T>::grow_lammps_array(int nmax, const string & tag)
+ void PerAtomDiagonalMatrix<T>::grow_lammps_array(int nmax, const std::string & tag)
{
this->lammpsScalar_ = lammpsInterface_->grow_array(this->lammpsScalar_,nmax,tag.c_str());
}
//-----------------------------------------------------------------
// copy values within local atom-based arrays
//-----------------------------------------------------------------
template <typename T>
void PerAtomDiagonalMatrix<T>::copy_lammps_array(int i, int j)
{
T * lammpsScalar = this->lammps_scalar();
lammpsScalar[j] = lammpsScalar[i];
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class PerAtomSparseMatrix
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
template <typename T>
PerAtomSparseMatrix<T>::PerAtomSparseMatrix(ATC_Method * atc,
int nCols,
int maxEntriesPerRow,
AtomType atomType) :
MatrixDependencyManager<SparseMatrix, T>(),
atc_(atc,atomType),
lammpsInterface_(LammpsInterface::instance()),
atomType_(atomType),
nCols_(nCols),
maxEntriesPerRow_(maxEntriesPerRow),
quantityToLammps_(atc_.atc_to_lammps_map()),
lammpsVector_(NULL),
lammpsColIndices_(NULL)
{
// do nothing
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
template <typename T>
PerAtomSparseMatrix<T>::~PerAtomSparseMatrix()
{
if (lammpsVector_) lammpsInterface_->destroy_array(lammpsVector_);
if (lammpsColIndices_) lammpsInterface_->destroy_array(lammpsColIndices_);
}
//--------------------------------------------------------
// set_lammps_to_quantity
//--------------------------------------------------------
template <typename T>
void PerAtomSparseMatrix<T>::set_lammps_to_quantity() const
{
const SparseMatrix<T> & myQuantity(this->quantity_); // necessary to access quantity_ this way because of templating
if (myQuantity.nRows()>0) {
// full matrix copy
if (atomType_ == ALL || atomType_ == PROC_GHOST) {
T ** lammpsQuantity = this->lammps_vector();
int ** lammpsColIndices = this->lammps_column_indices();
for (int i = 0; i < atc_.nlocal_total(); i++) {
myQuantity.row(i,_values_,_colIndices_);
for (int j = 0; j < _values_.size(); j++) {
lammpsQuantity[i][j] = _values_(j);
lammpsColIndices[i][j] = _colIndices_(j);
}
for (int j = _values_.size(); j < maxEntriesPerRow_; j++) {
lammpsColIndices[i][j] = -1;
}
}
}
// map quantities
else {
int atomIndex;
+ const Array<int> & quantityToLammps = atc_.atc_to_lammps_map();
T ** lammpsQuantity = this->lammps_vector();
int ** lammpsColIndices = this->lammps_column_indices();
for (int i = 0; i < myQuantity.nRows(); i++) {
myQuantity.row(i,_values_,_colIndices_);
- atomIndex = quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
for (int j = 0; j < _values_.size(); j++) {
lammpsQuantity[atomIndex][j] = _values_(j);
lammpsColIndices[atomIndex][j] = _colIndices_(j);
}
for (int j = _values_.size(); j < maxEntriesPerRow_; j++) {
+ lammpsQuantity[atomIndex][j] = 0;
lammpsColIndices[atomIndex][j] = -1;
}
}
}
}
}
//--------------------------------------------------------
// set_quantity_to_lammps
//--------------------------------------------------------
template <typename T>
void PerAtomSparseMatrix<T>::set_quantity_to_lammps() const
{
SparseMatrix<T> & myQuantity(this->quantity_);
if (myQuantity.nRows()>0) {
// full matrix copy
// in the case where processor ghosts are in the quantity, don't set them back
if (atomType_ == ALL || atomType_ == PROC_GHOST) {
const T * const * lammpsQuantity = this->lammps_vector();
const int * const * lammpsColIndices = this->lammps_column_indices();
for (int i = 0; i < myQuantity.nRows(); i++) {
for (int j = 0; j < maxEntriesPerRow_; j++) {
if (lammpsColIndices[i][j] < 0) {
break;
}
myQuantity.set(i,lammpsColIndices[i][j],lammpsQuantity[i][j]);
}
}
}
// map quantities
else {
int atomIndex;
+ const Array<int> & quantityToLammps = atc_.atc_to_lammps_map();
const T * const * lammpsQuantity = this->lammps_vector();
const int * const * lammpsColIndices = this->lammps_column_indices();
for (int i = 0; i < myQuantity.nRows(); i++) {
- atomIndex = quantityToLammps_(i);
+ atomIndex = quantityToLammps(i);
for (int j = 0; j < maxEntriesPerRow_; j++) {
if (lammpsColIndices[atomIndex][j] < 0) {
break;
}
myQuantity.set(i,lammpsColIndices[atomIndex][j],lammpsQuantity[atomIndex][j]);
}
}
}
myQuantity.compress();
}
}
//-----------------------------------------------------------------
// pack values in local atom-based arrays for exchange with another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomSparseMatrix<T>::pack_exchange(int i, double *buffer)
{
int idx = 0;
+ T ** lammpsVector = this->lammps_vector();
for (int j = 0; j < maxEntriesPerRow_; j++) {
- T ** lammpsVector = this->lammps_vector();
buffer[idx++] = static_cast<double>(lammpsVector[i][j]);
}
+ int ** lammpsColIndices = this->lammps_column_indices();
for (int j = 0; j < maxEntriesPerRow_; j++) {
- int ** lammpsColIndices = this->lammps_column_indices();
buffer[idx++] = static_cast<double>(lammpsColIndices[i][j]);
}
return 2*maxEntriesPerRow_;
}
//-----------------------------------------------------------------
// unpack values in local atom-based arrays from exchange with another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomSparseMatrix<T>::unpack_exchange(int i, double *buffer)
{
int idx = 0;
+ T ** lammpsVector = this->lammps_vector();
for (int j = 0; j < maxEntriesPerRow_; j++) {
- T ** lammpsVector = this->lammps_vector();
lammpsVector[i][j] = static_cast<T>(buffer[idx++]);
}
+ int ** lammpsColIndices = this->lammps_column_indices();
for (int j = 0; j < maxEntriesPerRow_; j++) {
- int ** lammpsColIndices = this->lammps_column_indices();
lammpsColIndices[i][j] = static_cast<int>(buffer[idx++]);
}
return 2*maxEntriesPerRow_;
}
//-----------------------------------------------------------------
// pack values in local atom-based arrays for passing to ghosts on another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomSparseMatrix<T>::pack_comm(int index, double *buf,
int pbc_flag, int *pbc)
{
- return maxEntriesPerRow_;
+ return 0;
}
//-----------------------------------------------------------------
// unpack values in local atom-based arrays for passing to ghosts on another proc
//-----------------------------------------------------------------
template <typename T>
int PerAtomSparseMatrix<T>::unpack_comm(int index, double *buf)
{
- return maxEntriesPerRow_;
+ return 0;
}
//-----------------------------------------------------------------
// allocate local atom-based arrays
//-----------------------------------------------------------------
template <typename T>
- void PerAtomSparseMatrix<T>::grow_lammps_array(int nmax, const string & tag)
+ void PerAtomSparseMatrix<T>::grow_lammps_array(int nmax, const std::string & tag)
{
this->lammpsVector_ = lammpsInterface_->grow_array(this->lammpsVector_,nmax,maxEntriesPerRow_,tag.c_str());
- string myString(tag+string("Columns"));
+ std::string myString(tag+std::string("Columns"));
this->lammpsColIndices_ = lammpsInterface_->grow_array(this->lammpsColIndices_,nmax,maxEntriesPerRow_,myString.c_str());
}
//-----------------------------------------------------------------
// copy values within local atom-based arrays
//-----------------------------------------------------------------
template <typename T>
void PerAtomSparseMatrix<T>::copy_lammps_array(int i, int j)
{
T ** lammpsVector = this->lammps_vector();
int ** lammpsColIndices = this->lammps_column_indices();
for (int k = 0; k < maxEntriesPerRow_; k++) {
lammpsVector[j][k] = lammpsVector[i][k];
lammpsColIndices[j][k] = lammpsColIndices[i][k];
}
}
}
#endif
diff --git a/lib/atc/PerAtomQuantity.h b/lib/atc/PerAtomQuantity.h
index 69daf2c4b..a4e8c78aa 100644
--- a/lib/atc/PerAtomQuantity.h
+++ b/lib/atc/PerAtomQuantity.h
@@ -1,1471 +1,1469 @@
// A class for defining atomic quantities for interscale operations
#ifndef PER_ATOM_QUANTITY_H
#define PER_ATOM_QUANTITY_H
// ATC_Method headers
#include "LammpsInterface.h"
#include "DependencyManager.h"
#include "PaqAtcUtility.h"
#include <set>
+#include <string>
#include <vector>
-using namespace std;
-
namespace ATC {
// forward declarations
class ATC_Method;
template <typename TT> class ClonedAtomQuantity;
/**
* @class PerAtomQuantity
* @brief Base class for objects that manage atomic quantities and their AtC interface
*/
template <typename T>
class PerAtomQuantity : public MatrixDependencyManager<DenseMatrix, T> {
public:
// constructor
PerAtomQuantity(ATC_Method * atc, int nCols = 1, AtomType atomType = INTERNAL);
// destructor
virtual ~PerAtomQuantity();
/** access to a constant dense matrix of the quantity, indexed by prescribed counts */
virtual const DenseMatrix<T> & quantity() const
{reset(); return MatrixDependencyManager<DenseMatrix, T>::quantity();};
/** access to a non-constant dens matrix of the quantity, indexed by prescribed atom counts */
virtual DenseMatrix<T> & set_quantity()
{reset(); return MatrixDependencyManager<DenseMatrix, T>::set_quantity();}
/** number of columns in quantity */
INDEX nCols() const {return nCols_;};
/** sets the Lammps quantity to a given value, input is indexed by AtC atom counts */
virtual void operator=(const DenseMatrix<T> & target) {PerAtomQuantity<T>::reset(); MatrixDependencyManager<DenseMatrix, T>::operator=(target);};
/** adds the given data to the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator+=(const DenseMatrix<T> & addition) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator+=(addition);};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator+=(addition);};
/** subtracts the given data from the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator-=(const DenseMatrix<T> & subtraction) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator-=(subtraction);};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(double subtraction) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator-=(subtraction);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & multiplier) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator*=(multiplier);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator*=(multiplier);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & divisor) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator/=(divisor);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator/=(divisor);};
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {this->set_lammps_to_quantity();};
/** resets AtC local quantity after exchange */
virtual void post_exchange() {(this->quantity_).resize(atc_.nlocal(),nCols_); this->set_quantity_to_lammps();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return nCols_;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int i, double *buffer);
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int i, double *buffer);
// pack/unpack_comm only valid if the quantity is over all real and processor ghost atoms
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc);
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf);
/** returns per-atom size of communicated data */
virtual int size_comm() const {return nCols_;};
/** changes size of temperary lammps storage data if transfer is being used */
- virtual void grow_lammps_array(int nmax, const string & tag);
+ virtual void grow_lammps_array(int nmax, const std::string & tag);
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j);
/** access type of data this quantity is applied to */
AtomType atom_type() const {return atomType_;};
/** specialized reset to account for quantities which lammps can change */
virtual void lammps_force_reset() {};
/** resets local storage */
virtual void reset_nlocal() { this->force_reset();}
protected:
/** utility object to access ATC methods */
PaqAtcUtility atc_;
/** pointer to access Lammps data */
LammpsInterface * lammpsInterface_;
/** type of atoms this quantity applies to */
AtomType atomType_;
/** number of columns of the per atom quantity, must be defined in derived class */
int nCols_;
/** map from this quantity's AtC indexing to Lammps indexing for atomic arrays */
const Array<int> & quantityToLammps_;
/** resets data, if necessary */
virtual void reset() const {if (this->needReset_) {(this->quantity_).resize(atc_.nlocal(),nCols_); this->needReset_ = false;}};
/** sets the quantity based on a lammps pointer */
virtual void set_lammps_to_quantity() const;
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const;
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const = 0;
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const = 0;
/** point to lammps-style array for data */
T * lammpsScalar_;
/** pointer to lammps-style double array for data */
T ** lammpsVector_;
private:
// do not define
PerAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class LammpsAtomQuantity
// A base class for defining objects that manage
// quantities but the lammps data forms the
// absolute definition for the contained data.
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class LammpsAtomQuantity : public PerAtomQuantity<T> {
public:
// used as a friend so that clones can use it's methods
template <typename TT>
friend class ClonedAtomQuantity;
// constructor
LammpsAtomQuantity(ATC_Method * atc,int nCols = 1, AtomType atomType = INTERNAL) :
PerAtomQuantity<T>(atc,nCols,atomType) {};
// destructor
virtual ~LammpsAtomQuantity() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DenseMatrix<T> & set_quantity()
{throw ATC_Error("LammpsAtomQuantity::set_quantity - Cannot modify shallow per atom quantities outside of manager class"); return this->quantity_;};
/** sets the Lammps quantity to a given value, input is indexed by AtC atom counts */
virtual void operator=(const DenseMatrix<T> & target)
{PerAtomQuantity<T>::operator=(target); this->set_lammps_to_quantity();};
/** adds the given data to the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator+=(const DenseMatrix<T> & addition)
{PerAtomQuantity<T>::operator+=(addition); this->set_lammps_to_quantity();};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition)
{PerAtomQuantity<T>::operator+=(addition); this->set_lammps_to_quantity();};
/** subtracts the given data from the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator-=(const DenseMatrix<T> & subtraction)
{PerAtomQuantity<T>::operator-=(subtraction); this->set_lammps_to_quantity();};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T subtraction)
{PerAtomQuantity<T>::operator-=(subtraction); this->set_lammps_to_quantity();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & multiplier)
{PerAtomQuantity<T>::operator*=(multiplier); this->set_lammps_to_quantity();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier)
{PerAtomQuantity<T>::operator*=(multiplier); this->set_lammps_to_quantity();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & divisor)
{PerAtomQuantity<T>::operator/=(divisor); this->set_lammps_to_quantity();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor)
{PerAtomQuantity<T>::operator/=(divisor); this->set_lammps_to_quantity();};
/** sets quantity to lammps data, but not needed */
virtual void prepare_exchange() {};
/** packs data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc);
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf);
protected:
virtual void reset() const;
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const = 0;
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const = 0;
private:
// do not define
LammpsAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ShallowAtomQuantity
// A base class for defining objects that manage
// quantities but do not own their own lammps data.
// The lammps data forms the absolute definition
// for the contained data.
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ShallowAtomQuantity : public LammpsAtomQuantity<T> {
public:
// constructor
ShallowAtomQuantity(ATC_Method * atc,int nCols = 1, AtomType atomType = INTERNAL) :
LammpsAtomQuantity<T>(atc,nCols,atomType) {};
// destructor
virtual ~ShallowAtomQuantity() {};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 0;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int i, double *buffer) {return 0;};
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int i, double *buffer) {return 0;};
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc) {return 0;};
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf) {return 0;};
/** returns size of per-atom communication */
virtual int size_comm() {return 0;};
/** changes size of temperary lammps storage data if transfer is being used */
- virtual void grow_lammps_array(int nmax, const string & tag) {};
+ virtual void grow_lammps_array(int nmax, const std::string & tag) {};
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j) {};
protected:
private:
// do not define
ShallowAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ClonedLammpsAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms based on data in
// a LammpsAtomQuantity
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ClonedAtomQuantity : public ShallowAtomQuantity<T> {
public:
// constructor
ClonedAtomQuantity(ATC_Method * atc,
LammpsAtomQuantity<T> * target,
AtomType atomType=INTERNAL) :
ShallowAtomQuantity<T>(atc,target->nCols(),atomType),
target_(target)
{
target_->register_dependence(this);
};
// destructor
virtual ~ClonedAtomQuantity() {};
protected:
/** reference to originating per atom quantity */
LammpsAtomQuantity<T> * target_;
/** sets quantity based on root lammps data */
virtual void set_quantity_to_lammps() const
{
target_->reset(); // make sure target is all the way up to date
ShallowAtomQuantity<T>::set_quantity_to_lammps(); // change appropriate data
}
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const
{
target_->reset(); // make sure target is all the way up to date
ShallowAtomQuantity<T>::set_lammps_to_quantity(); // change appropriate data
target_->propagate_reset();
this->needReset_ = false;
};
/** gets appropriate pointer for lammps data */
virtual T * lammps_scalar() const
{return target_->lammps_scalar();};
/** gets appropriate pointer for lammps data */
virtual T ** lammps_vector() const
{return target_->lammps_vector();};
private:
// do not define
ClonedAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedClonedAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms based on data in
// a pointer managed in the standard lammps way.
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedClonedAtomQuantity : public ShallowAtomQuantity<T> {
public:
// constructor
ProtectedClonedAtomQuantity(ATC_Method * atc,
int nCols,
AtomType atomType=INTERNAL) :
ShallowAtomQuantity<T>(atc,nCols,atomType) {};
// destructor
virtual ~ProtectedClonedAtomQuantity() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DenseMatrix<T> & set_quantity()
{throw ATC_Error("ProtectedClonedAtomQuantity::set_quantity - Cannot modify protected per atom quantities"); return this->quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const DenseMatrix<T> & target)
{throw ATC_Error("ProtectedClonedAtomQuantity::set_quantity - Cannot modify protected per atom quantities");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & target)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator= - Cannot modify protected per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DenseMatrix<T> & addition)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DenseMatrix<T> & subtraction)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T subtraction)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & multiplier)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & divisor)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
protected:
/** sets lammps data based on the quantity, not needed by this class */
virtual void set_lammps_to_quantity() const {};
/** gets appropriate pointer for lammps data */
virtual T * lammps_scalar() const {return NULL;};
/** gets appropriate pointer for lammps data */
virtual T ** lammps_vector() const {return NULL;};
private:
// do not define
ProtectedClonedAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtcAtomQuantity
// A funcational base class for defining objects that
// manage quantities defined at atoms and their AtC
// interface that are defined by AtC classes
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class AtcAtomQuantity : public PerAtomQuantity<T> {
public:
// constructor
AtcAtomQuantity(ATC_Method * atc,
int nCols = 1,
AtomType atomType = INTERNAL) : PerAtomQuantity<T>(atc,nCols,atomType) {};
// destructor
virtual ~AtcAtomQuantity() {};
protected:
// these get the appropriate pointer to local data mimicing lammps storage
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const {return this->lammpsScalar_;};
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const {return this->lammpsVector_;};
private:
// do not define
AtcAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms internally and do not
// allow for reset externally
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedAtomQuantity : public AtcAtomQuantity<T> {
public:
// constructor
ProtectedAtomQuantity(ATC_Method * atc,
int nCols = 1,
AtomType atomType = INTERNAL)
: AtcAtomQuantity<T>(atc, nCols, atomType) {};
// destructor
virtual ~ProtectedAtomQuantity() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DenseMatrix<T> & set_quantity()
{throw ATC_Error("ProtectedAtomQuantity::set_quantity - Cannot modify protected per atom quantities"); return this->quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const DenseMatrix<T> & target)
{throw ATC_Error("ProtectedAtomQuantity::set_quantity - Cannot modify protected per atom quantities");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & target)
{throw ATC_Error("ProtectedAtomQuantity::operator= - Cannot modify protected per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DenseMatrix<T> & addition)
{throw ATC_Error("ProtectedAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition)
{throw ATC_Error("ProtectedAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DenseMatrix<T> & subtraction)
{throw ATC_Error("ProtectedAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T subtraction)
{throw ATC_Error("ProtectedAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & multiplier)
{throw ATC_Error("ProtectedAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier)
{throw ATC_Error("ProtectedAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & divisor)
{throw ATC_Error("ProtectedAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor)
{throw ATC_Error("ProtectedAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
protected:
/** resets the data if necessary */
virtual void reset() const = 0;
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const {this->reset(); PerAtomQuantity<T>::set_lammps_to_quantity();};
private:
// do not define
ProtectedAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedMappedAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms internally and do not
// allow for reset externally, but are mapped onto a
// subset of internal atoms
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedMappedAtomQuantity : public ProtectedAtomQuantity<T> {
public:
// constructor
ProtectedMappedAtomQuantity(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int> * atomMap,
int nCols = 1,
AtomType atomType = INTERNAL)
: ProtectedAtomQuantity<T>(atc, nCols, atomType), atomMap_(atomMap)
{atomMap_->register_dependence(this);};
// destructor
virtual ~ProtectedMappedAtomQuantity() {atomMap_->remove_dependence(this);};
protected:
// methods
/** resets data, if necessary */
virtual void reset() const {if (this->needReset_) {(this->quantity_).resize(atomMap_->size(),this->nCols()); this->needReset_ = false;}};
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const;
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const;
// data
/** map from atoms of atomType to desired subset */
MatrixDependencyManager<DenseMatrix, int> * atomMap_;
private:
// do not define
ProtectedMappedAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedLammpsAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms using lammps storage as
// the definition and do not allow for reset externally
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedLammpsAtomQuantity : public LammpsAtomQuantity<T> {
public:
// constructor
ProtectedLammpsAtomQuantity(ATC_Method * atc,
int nCols = 1,
AtomType atomType = INTERNAL)
: LammpsAtomQuantity<T>(atc, nCols, atomType) {};
// destructor
virtual ~ProtectedLammpsAtomQuantity() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DenseMatrix<T> & set_quantity()
{throw ATC_Error("ProtectedLammpsAtomQuantity::set_quantity - Cannot modify protected per atom quantities"); return this->quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const DenseMatrix<T> & target)
{throw ATC_Error("ProtectedLammpsAtomQuantity::set_quantity - Cannot modify protected per atom quantities");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & target)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator= - Cannot modify protected per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DenseMatrix<T> & addition)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DenseMatrix<T> & subtraction)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T subtraction)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & multiplier)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & divisor)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
protected:
/** resets the data if necessary */
virtual void reset() const = 0;
// these get the appropriate pointer to local data mimicing lammps storage
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const {return this->lammpsScalar_;};
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const {return this->lammpsVector_;};
private:
// do not define
ProtectedLammpsAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ConstantQuantity
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ConstantQuantity : public ProtectedAtomQuantity<T> {
public:
// constructor
ConstantQuantity(ATC_Method * atc,
T constant,
int nCols = 1,
AtomType atomType = INTERNAL) : ProtectedAtomQuantity<T>(atc,nCols,atomType), constant_(constant) {};
// destructor
virtual ~ConstantQuantity() {};
// eliminate MPI, use resets instead
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {};
/** resets local AtC storage */
virtual void post_exchange() {this->set_reset();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 0;};
/** packs up data for parallel transfer */
virtual int pack_exchange(int i, double *buffer) {return 0;};
/** unpacks data after parallel transfer */
virtual int unpack_exchange(int i, double *buffer) {return 0;};
/** changes size of temperary lammps storage data if transfer is being used */
- virtual void grow_lammps_array(int nmax, const string & tag) {};
+ virtual void grow_lammps_array(int nmax, const std::string & tag) {};
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j) {};
protected:
/** resets the data if necessary */
virtual void reset() const {if (this->need_reset()) {PerAtomQuantity<T>::reset(); this->quantity_ = constant_;}};
/** constant to set data to */
T constant_;
private:
// do not define
ConstantQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ConstantQuantityMapped
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ConstantQuantityMapped : public ProtectedMappedAtomQuantity<T> {
public:
// constructor
ConstantQuantityMapped(ATC_Method * atc,
T constant,
MatrixDependencyManager<DenseMatrix, int> * atomMap,
int nCols = 1,
AtomType atomType = INTERNAL) : ProtectedMappedAtomQuantity<T>(atc,atomMap,nCols,atomType), constant_(constant) {};
// destructor
virtual ~ConstantQuantityMapped() {};
// eliminate MPI, use resets instead
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {};
/** resets local AtC storage */
virtual void post_exchange() {this->set_reset();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 0;};
/** packs up data for parallel transfer */
virtual int pack_exchange(int i, double *buffer) {return 0;};
/** unpacks data after parallel transfer */
virtual int unpack_exchange(int i, double *buffer) {return 0;};
/** changes size of temperary lammps storage data if transfer is being used */
- virtual void grow_lammps_array(int nmax, const string & tag) {};
+ virtual void grow_lammps_array(int nmax, const std::string & tag) {};
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j) {};
protected:
/** resets the data if necessary */
virtual void reset() const {if (this->need_reset()) {ProtectedMappedAtomQuantity<T>::reset(); this->quantity_ = constant_;}};
/** constant to set data to */
T constant_;
private:
// do not define
ConstantQuantityMapped();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class SummedAtomicQuantity
//--------------------------------------------------------
//--------------------------------------------------------
// Had to define all functions in header, not sure why (JAT, 12/14/11)
template <typename T>
class SummedAtomicQuantity : public ProtectedAtomQuantity<T> {
public:
// constructor
SummedAtomicQuantity(ATC_Method * atcTransfer,
PerAtomQuantity<T> * quantity1,
PerAtomQuantity<T> * quantity2) :
ProtectedAtomQuantity<T>(atcTransfer, quantity1->nCols(), quantity1->atom_type()),
quantity1_(quantity1),
quantity2_(quantity2)
{
if (quantity1_->nCols() != quantity2_->nCols())
throw ATC_Error("SummedAtomicQuantity - dependencies do not have same number of columns");
if (quantity1_->atom_type() != quantity2_->atom_type())
throw ATC_Error("SummedAtomicQuantity - dependencies do not have same atom type");
quantity1_->register_dependence(this);
quantity2_->register_dependence(this);
};
// destructor
virtual ~SummedAtomicQuantity()
{
quantity1_->remove_dependence(this);
quantity2_->remove_dependence(this);
};
protected:
/** resets the data if necessary */
virtual void reset() const
{
if (this->need_reset()) {
PerAtomQuantity<T>::reset();
const DenseMatrix<T> & quantity1(quantity1_->quantity());
const DenseMatrix<T> & quantity2(quantity2_->quantity());
DenseMatrix<T> & myQuantity(this->quantity_);
myQuantity = quantity1;
myQuantity += quantity2;
}
};
/** first quantity */
PerAtomQuantity<T> * quantity1_;
/** second quantity */
PerAtomQuantity<T> * quantity2_;
private:
// do not define
SummedAtomicQuantity();
};
/**
* @class PerAtomDiagonalMatrix
* @brief Base class for objects that manage atomic diagonal matrices and their AtC interface
*/
template <typename T>
class PerAtomDiagonalMatrix : public MatrixDependencyManager<DiagonalMatrix, T> {
public:
// constructor
PerAtomDiagonalMatrix(ATC_Method * atc, AtomType atomType = INTERNAL);
// destructor
virtual ~PerAtomDiagonalMatrix();
/** access to a constant dense matrix of the quantity, indexed by prescribed counts */
virtual const DiagonalMatrix<T> & quantity() const
{reset(); return MatrixDependencyManager<DiagonalMatrix, T>::quantity();};
/** access to a non-constant dens matrix of the quantity, indexed by prescribed atom counts */
virtual DiagonalMatrix<T> & set_quantity()
{reset(); return MatrixDependencyManager<DiagonalMatrix, T>::set_quantity();}
/** sets the Lammps quantity to a given value, input is indexed by AtC atom counts */
virtual void operator=(const DiagonalMatrix<T> & target) {PerAtomDiagonalMatrix<T>::reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator=(target);};
/** adds the given data to the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator+=(const DiagonalMatrix<T> & addition) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator+=(addition);};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator+=(addition);};
/** subtracts the given data from the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator-=(const DiagonalMatrix<T> & subtraction) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator-=(subtraction);};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(double subtraction) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator-=(subtraction);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DiagonalMatrix<T> & multiplier) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator*=(multiplier);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator*=(multiplier);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DiagonalMatrix<T> & divisor) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator/=(divisor);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator/=(divisor);};
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {this->set_lammps_to_quantity();};
/** resets AtC local quantity after exchange */
virtual void post_exchange() {(this->quantity_).resize(atc_.nlocal()); this->set_quantity_to_lammps();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 1;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int i, double *buffer);
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int i, double *buffer);
// pack/unpack_comm only valid if the quantity is over all real and processor ghost atoms
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc);
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf);
/** returns per-atom size of communicated data */
virtual int size_comm() const {return 1;};
/** changes size of temperary lammps storage data if transfer is being used */
- virtual void grow_lammps_array(int nmax, const string & tag);
+ virtual void grow_lammps_array(int nmax, const std::string & tag);
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j);
/** access type of data this quantity is applied to */
AtomType atom_type() const {return atomType_;};
/** specialized reset to account for quantities which lammps can change */
virtual void lammps_force_reset() {};
/** resets local storage */
virtual void reset_nlocal() { this->force_reset();}
protected:
/** utility object to access ATC methods */
PaqAtcUtility atc_;
/** pointer to access Lammps data */
LammpsInterface * lammpsInterface_;
/** type of atoms this quantity applies to */
AtomType atomType_;
/** map from this quantity's AtC indexing to Lammps indexing for atomic arrays */
const Array<int> & quantityToLammps_;
/** resets data, if necessary */
virtual void reset() const {if (this->needReset_) {(this->quantity_).resize(atc_.nlocal()); this->needReset_ = false;}};
/** sets the quantity based on a lammps pointer */
virtual void set_lammps_to_quantity() const;
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const;
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const = 0;
/** point to lammps-style array for data */
T * lammpsScalar_;
private:
// do not define
PerAtomDiagonalMatrix();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtcAtomDiagonalMatrix
// A funcational base class for defining objects that
// manage diagonal matrices defined at atoms and their
// AtC interface that are defined by AtC classes
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class AtcAtomDiagonalMatrix : public PerAtomDiagonalMatrix<T> {
public:
// constructor
AtcAtomDiagonalMatrix(ATC_Method * atc,
AtomType atomType = INTERNAL) : PerAtomDiagonalMatrix<T>(atc,atomType) {};
// destructor
virtual ~AtcAtomDiagonalMatrix() {};
protected:
// these get the appropriate pointer to local data mimicing lammps storage
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const {return this->lammpsScalar_;};
private:
// do not define
AtcAtomDiagonalMatrix();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedAtomDiagonalMatrix
// A base class for defining objects that manage
// diagonal matrixes defined at atoms internally and
// do not allow for reset externally
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedAtomDiagonalMatrix : public AtcAtomDiagonalMatrix<T> {
public:
// constructor
ProtectedAtomDiagonalMatrix(ATC_Method * atc,
AtomType atomType = INTERNAL)
: AtcAtomDiagonalMatrix<T>(atc, atomType) {};
// destructor
virtual ~ProtectedAtomDiagonalMatrix() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DiagonalMatrix<T> & set_quantity()
{throw ATC_Error("ProtectedAtomDiagonalMatrix::set_quantity - Cannot modify protected per atom quantities"); return this->quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const DiagonalMatrix<T> & target)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::set_quantity - Cannot modify protected per atom quantities");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & target)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator= - Cannot modify protected per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DiagonalMatrix<T> & addition)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator+= - Cannot modify protected per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator+= - Cannot modify protected per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DiagonalMatrix<T> & subtraction)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator-= - Cannot modify protected per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T subtraction)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator-= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DiagonalMatrix<T> & multiplier)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DiagonalMatrix<T> & divisor)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator/= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator/= - Cannot modify protected per atom quantities");};
protected:
/** resets the data if necessary */
virtual void reset() const = 0;
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const {this->reset(); PerAtomDiagonalMatrix<T>::set_lammps_to_quantity();};
private:
// do not define
ProtectedAtomDiagonalMatrix();
};
/**
* @class PerAtomSparseMatrix
* @brief Base class for objects that manage atomic sparse matrices and their AtC interface
*/
template <typename T>
class PerAtomSparseMatrix : public MatrixDependencyManager<SparseMatrix, T> {
public:
// constructor
PerAtomSparseMatrix(ATC_Method * atc, int nCols = 1, int maxEntriesPerRow = 1, AtomType atomType = INTERNAL);
// destructor
virtual ~PerAtomSparseMatrix();
/** access to a constant dense matrix of the quantity, indexed by prescribed counts */
virtual const SparseMatrix<T> & quantity() const
{reset(); return MatrixDependencyManager<SparseMatrix, T>::quantity();};
/** access to a non-constant dens matrix of the quantity, indexed by prescribed atom counts */
virtual SparseMatrix<T> & set_quantity()
{reset(); return MatrixDependencyManager<SparseMatrix, T>::set_quantity();}
/** number of columns in quantity */
INDEX nCols() const {return nCols_;};
/** maximum number of entries per row */
INDEX max_entries_per_row() const {return maxEntriesPerRow_;};
/** sets the Lammps quantity to a given value, input is indexed by AtC atom counts */
virtual void operator=(const SparseMatrix<T> & target) {PerAtomSparseMatrix<T>::reset(); MatrixDependencyManager<SparseMatrix, T>::operator=(target);};
/** adds the given data to the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator+=(const SparseMatrix<T> & addition) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator+=(addition);};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator+=(addition);};
/** subtracts the given data from the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator-=(const SparseMatrix<T> & subtraction) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator-=(subtraction);};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(double subtraction) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator-=(subtraction);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator*=(multiplier);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const SparseMatrix<T> & divisor) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator/=(divisor);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator/=(divisor);};
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {this->set_lammps_to_quantity();};
/** resets AtC local quantity after exchange */
virtual void post_exchange() {(this->quantity_).reset(atc_.nlocal(),nCols_); this->set_quantity_to_lammps();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 2*maxEntriesPerRow_;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int i, double *buffer);
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int i, double *buffer);
// pack/unpack_comm only valid if the quantity is over all real and processor ghost atoms
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc);
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf);
/** returns per-atom size of communicated data */
virtual int size_comm() const {return 2*maxEntriesPerRow_;};
/** changes size of temperary lammps storage data if transfer is being used */
- virtual void grow_lammps_array(int nmax, const string & tag);
+ virtual void grow_lammps_array(int nmax, const std::string & tag);
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j);
/** access type of data this quantity is applied to */
AtomType atom_type() const {return atomType_;};
/** specialized reset to account for quantities which lammps can change */
virtual void lammps_force_reset() {};
/** resets local storage */
- //WIP_JAT revert this to force_reset when reset_nlocal is functioning correctly (see comment by ATC_Method::reset_nlocal - interscaleManager_.reset_nlocal())
- virtual void reset_nlocal() { this->set_reset();}
+ virtual void reset_nlocal() { this->set_reset();};
protected:
/** utility object to access ATC methods */
PaqAtcUtility atc_;
/** pointer to access Lammps data */
LammpsInterface * lammpsInterface_;
/** type of atoms this quantity applies to */
AtomType atomType_;
/** number of columns of the per atom quantity, must be defined in derived class */
int nCols_;
/** maximum number of entries that can be stored in a row */
int maxEntriesPerRow_;
/** map from this quantity's AtC indexing to Lammps indexing for atomic arrays */
const Array<int> & quantityToLammps_;
/** resets data, if necessary */
virtual void reset() const {if (this->needReset_) {(this->quantity_).reset(atc_.nlocal(),nCols_); this->needReset_ = false;}};
/** sets the quantity based on a lammps pointer */
virtual void set_lammps_to_quantity() const;
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const;
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const = 0;
/** gets appropriate data for lammps pointer to column indices */
virtual int ** lammps_column_indices() const = 0;
/** pointer to lammps-style double array for data */
T ** lammpsVector_;
/** stores column indices in lammps-style array */
int ** lammpsColIndices_;
// workspace
mutable DenseVector<T> _values_;
mutable DenseVector<INDEX> _colIndices_;
private:
// do not define
PerAtomSparseMatrix();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtcAtomSparseMatrix
// A funcational base class for defining objects that
// manage sparse matrices defined at atoms and their
// AtC interface that are defined by AtC classes
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class AtcAtomSparseMatrix : public PerAtomSparseMatrix<T> {
public:
// constructor
AtcAtomSparseMatrix(ATC_Method * atc,
int nCols = 1, int maxEntriesPerRow = 1,
AtomType atomType = INTERNAL) :
PerAtomSparseMatrix<T>(atc,nCols,maxEntriesPerRow,atomType) {};
// destructor
virtual ~AtcAtomSparseMatrix() {};
protected:
// these get the appropriate pointer to local data mimicing lammps storage
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const {return this->lammpsVector_;};
/** gets appropriate data for lammps pointer to column indices */
virtual int ** lammps_column_indices() const {return this->lammpsColIndices_;};
private:
// do not define
AtcAtomSparseMatrix();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedAtomSparseMatrix
// A base class for defining objects that manage
// sparse matrixes defined at atoms internally and
// do not allow for reset externally
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedAtomSparseMatrix : public AtcAtomSparseMatrix<T> {
public:
// constructor
ProtectedAtomSparseMatrix(ATC_Method * atc,
int nCols = 1, int maxEntriesPerRow = 1,
AtomType atomType = INTERNAL)
: AtcAtomSparseMatrix<T>(atc, nCols, maxEntriesPerRow, atomType) {};
// destructor
virtual ~ProtectedAtomSparseMatrix() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual SparseMatrix<T> & set_quantity()
{throw ATC_Error("ProtectedAtomSparseMatrix::set_quantity - Cannot modify protected per atom quantities"); return this->quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const SparseMatrix<T> & target)
{throw ATC_Error("ProtectedAtomSparseMatrix::set_quantity - Cannot modify protected per atom quantities");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & target)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator= - Cannot modify protected per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const SparseMatrix<T> & addition)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator+= - Cannot modify protected per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator+= - Cannot modify protected per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const SparseMatrix<T> & subtraction)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator-= - Cannot modify protected per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T subtraction)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator-= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const SparseMatrix<T> & multiplier)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const SparseMatrix<T> & divisor)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator/= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator/= - Cannot modify protected per atom quantities");};
protected:
/** resets the data if necessary */
virtual void reset() const = 0;
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const {this->reset(); PerAtomSparseMatrix<T>::set_lammps_to_quantity();};
private:
// do not define
ProtectedAtomSparseMatrix();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedMappedSparseMatrix
// A base class for defining objects that manage
// sparse matrices defined at atoms internally and do
// not allow for reset externally, but are mapped in
// at least one of their dimensions
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedMappedAtomSparseMatrix : public ProtectedAtomSparseMatrix<T> {
public:
// constructor
ProtectedMappedAtomSparseMatrix(ATC_Method * atc,
int nCols = 1,
int maxEntriesPerRow = 1,
AtomType atomType = INTERNAL)
: ProtectedAtomSparseMatrix<T>(atc, nCols, maxEntriesPerRow, atomType)
{};
// destructor
virtual ~ProtectedMappedAtomSparseMatrix() {};
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {};
/** resets AtC local quantity after exchange */
virtual void post_exchange() {this->set_reset();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 0;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int i, double *buffer) {return 0;};
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int i, double *buffer) {return 0;};
// pack/unpack_comm only valid if the quantity is over all real and processor ghost atoms
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc) {return 0;};
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf) {return 0;};
/** returns per-atom size of communicated data */
virtual int size_comm() const {return 0;};
/** changes size of temperary lammps storage data if transfer is being used */
- virtual void grow_lammps_array(int nmax, const string & tag) {};
+ virtual void grow_lammps_array(int nmax, const std::string & tag) {};
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j) {};
protected:
// methods
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const {};
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const {};
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const {return NULL;};
/** gets appropriate data for lammps pointer to column indices */
virtual int ** lammps_column_indices() const {return NULL;};
private:
// do not define
ProtectedMappedAtomSparseMatrix();
};
}
#include "PerAtomQuantity-inl.h"
#endif
diff --git a/lib/atc/PerAtomQuantityLibrary.cpp b/lib/atc/PerAtomQuantityLibrary.cpp
index 29c2b117d..c7f57fd72 100644
--- a/lib/atc/PerAtomQuantityLibrary.cpp
+++ b/lib/atc/PerAtomQuantityLibrary.cpp
@@ -1,2368 +1,2383 @@
// ATC transfer headers
#include "PerAtomQuantityLibrary.h"
#include "ATC_Transfer.h"
#include "FE_Engine.h"
#include "LammpsInterface.h"
#include <typeinfo>
+#include <sstream>
+#include <iostream>
+
+using std::map;
+using std::ifstream;
+using std::stringstream;
+using std::set;
+using std::string;
+using std::vector;
+
+using ATC_Utility::to_string;
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomToElementMap
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomToElementMap::AtomToElementMap(ATC_Method * atc,
PerAtomQuantity<double> * atomPositions,
AtomType atomType) :
ProtectedAtomQuantity<int>(atc,1,atomType),
atomPositions_(atomPositions)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomPositions_)
atomPositions_ = interscaleManager.per_atom_quantity("AtomicCoarseGrainingPositions");
if (!atomPositions_)
throw ATC_Error("AtomToElementMap::AtomToElementMap - atom position quantity is undefined");
atomPositions_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
AtomToElementMap::~AtomToElementMap()
{
atomPositions_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomToElementMap::reset() const
{
if (need_reset()) {
PerAtomQuantity<int>::reset();
const DENS_MAT & position(atomPositions_->quantity());
const FE_Mesh * feMesh = atc_.fe_engine()->fe_mesh();
int nsd = atc_.nsd();
DENS_VEC coords(nsd);
for (int i = 0; i < quantity_.nRows(); i++) {
for (int j = 0; j < nsd; j++) {
coords(j) = position(i,j);
}
quantity_(i,0) = feMesh->map_to_element(coords);
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomInElementSet
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomInElementSet::AtomInElementSet(ATC_Method * atc,
PerAtomQuantity<int> * map,
ESET eset, int type):
atc_(atc,INTERNAL),
map_(map),eset_(eset),type_(type),
quantityToLammps_(atc_.atc_to_lammps_map())
{
map_->register_dependence(this);
needReset_ = true;
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
AtomInElementSet::~AtomInElementSet()
{
map_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomInElementSet::reset()
{
if (map_->need_reset() || needReset_) {
list_.clear();
INT_ARRAY map = map_->quantity();
int * type = ATC::LammpsInterface::instance()->atom_type();
ESET::const_iterator itr;
+ const Array<int> & quantityToLammps = atc_.atc_to_lammps_map();
for (int i = 0; i < map.size(); i++) {
for (itr=eset_.begin(); itr != eset_.end(); itr++) {
if (map(i,0) == *itr) {
- int a = quantityToLammps_(i);
+ int a = quantityToLammps(i);
if (type[a] == type_) {
list_.push_back(ID_PAIR(i,a));
break;
}
}
}
}
needReset_ = false;
}
}
//--------------------------------------------------------
// qauntity
//--------------------------------------------------------
const ID_LIST & AtomInElementSet::quantity()
{
reset();
return list_;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomVolumeUser
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomVolumeUser::AtomVolumeUser(ATC_Method * atc,
map<int,double> & atomGroupVolume,
AtomType atomType) :
ProtectedAtomDiagonalMatrix<double>(atc,atomType),
atomGroupVolume_(atomGroupVolume),
lammpsInterface_(atc->lammps_interface()),
atcToLammps_(atc->internal_to_atom_map())
{
// do nothing
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomVolumeUser::reset() const
{
if (need_reset()) {
PerAtomDiagonalMatrix<double>::reset();
const int *mask = lammpsInterface_->atom_mask();
quantity_ = 0.;
map<int, double>::const_iterator igroup;
for (igroup = atomGroupVolume_.begin(); igroup != atomGroupVolume_.end(); igroup++) {
int gid = igroup->first;
double weight = igroup->second;
for (int i = 0; i < quantity_.nRows(); ++i) {
if (mask[atcToLammps_(i)] & gid) {
quantity_(i,i) = weight;
}
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomVolumeGroup
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomVolumeGroup::AtomVolumeGroup(ATC_Method * atc,
map<int,double> & atomGroupVolume,
AtomType atomType) :
AtomVolumeUser(atc,atomGroupVolume,atomType),
atomGroupVolume_(atomGroupVolume),
lammpsInterface_(atc->lammps_interface()),
atcToLammps_(atc->internal_to_atom_map())
{
// Uses group bounding box as total volume
// ASSUME will *only* work if atoms exactly fill the box
int ngroup = lammpsInterface_->ngroup();
const int *mask = lammpsInterface_->atom_mask();
double * bounds;
bounds = new double[6];
for (int i = 0; i < ngroup; ++i) {
lammpsInterface_->group_bounds(i, bounds);
atomGroupVolume_[lammpsInterface_->group_bit(i)] =
(bounds[1]-bounds[0])*(bounds[3]-bounds[2])*(bounds[5]-bounds[4]);
}
delete [] bounds;
INT_VECTOR localCount(ngroup);
INT_VECTOR globalCount(ngroup);
// loop over atoms
localCount = 0;
for (int i = 0; i < atcToLammps_.size(); ++i) {
for (int j = 0; j < ngroup; ++j) {
if (mask[atcToLammps_(i)] & lammpsInterface_->group_bit(j))
localCount(j)++;
}
}
// communication to get total atom counts per group
lammpsInterface_->int_allsum(localCount.ptr(),
globalCount.ptr(),ngroup);
for (int i = 0; i < ngroup; ++i) {
int iGroupBit = lammpsInterface_->group_bit(i);
if (globalCount(i) > 0)
atomGroupVolume_[iGroupBit] /= globalCount(i);
else
atomGroupVolume_[iGroupBit] = 0;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomVolumeLattice
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomVolumeLattice::AtomVolumeLattice(ATC_Method * atc,
AtomType atomType) :
ProtectedAtomDiagonalMatrix<double>(atc,atomType),
lammpsInterface_(atc->lammps_interface())
{
// do nothing
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomVolumeLattice::reset() const
{
if (need_reset()) {
PerAtomDiagonalMatrix<double>::reset();
quantity_ = lammpsInterface_->volume_per_atom();
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomVolumeElement
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomVolumeElement::AtomVolumeElement(ATC_Method * atc,
PerAtomQuantity<int> * atomElement,
AtomType atomType) :
ProtectedAtomDiagonalMatrix<double>(atc,atomType),
atomElement_(atomElement),
lammpsInterface_(atc->lammps_interface()),
feMesh_((atc->fe_engine())->fe_mesh())
{
if (!atomElement_) {
InterscaleManager & interscaleManager(atc->interscale_manager());
atomElement_ = interscaleManager.per_atom_int_quantity("AtomElement");
}
atomElement_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtomVolumeElement::~AtomVolumeElement()
{
atomElement_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomVolumeElement::reset() const
{
if (need_reset()) {
PerAtomDiagonalMatrix<double>::reset();
int nElts = feMesh_->num_elements();
int nLocal = quantity_.nRows();
_elementAtomCountLocal_.reset(nElts);
_elementAtomCount_.resize(nElts);
const INT_ARRAY & atomElement(atomElement_->quantity());
_elementAtomVolume_.resize(nElts);
// determine number of atoms in each element, partial sum
for (int i = 0; i < nLocal; ++i) {
_elementAtomCountLocal_(atomElement(i,0)) += 1;
}
// mpi to determine total atoms
lammpsInterface_->int_allsum(_elementAtomCountLocal_.ptr(),_elementAtomCount_.ptr(),nElts);
// divide element volume by total atoms to get atomic volume
if (nLocal>0) {
for (int i = 0; i < nElts; ++i) {
double minx, maxx, miny, maxy, minz, maxz;
feMesh_->element_coordinates(i,_nodalCoordinates_);
minx = _nodalCoordinates_(0,0); maxx = _nodalCoordinates_(0,0);
miny = _nodalCoordinates_(1,0); maxy = _nodalCoordinates_(1,0);
minz = _nodalCoordinates_(2,0); maxz = _nodalCoordinates_(2,0);
for (int j = 1; j < _nodalCoordinates_.nCols(); ++j) {
if (_nodalCoordinates_(0,j)<minx) minx = _nodalCoordinates_(0,j);
if (_nodalCoordinates_(0,j)>maxx) maxx = _nodalCoordinates_(0,j);
if (_nodalCoordinates_(1,j)<miny) miny = _nodalCoordinates_(1,j);
if (_nodalCoordinates_(1,j)>maxy) maxy = _nodalCoordinates_(1,j);
if (_nodalCoordinates_(2,j)<minz) minz = _nodalCoordinates_(2,j);
if (_nodalCoordinates_(2,j)>maxz) maxz = _nodalCoordinates_(2,j);
}
double eltVol = (maxx-minx)*(maxy-miny)*(maxz-minz);
if (eltVol<0) eltVol *= -1.;
_elementAtomVolume_(i) = eltVol/_elementAtomCount_(i);
}
for (int i = 0; i < nLocal; ++i)
quantity_(i,i) = _elementAtomVolume_(atomElement(i,0));
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomVolumeRegion
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomVolumeRegion::AtomVolumeRegion(ATC_Method * atc,
DENS_MAN * atomCoarseGrainingPositions,
AtomType atomType) :
ProtectedAtomDiagonalMatrix<double>(atc,atomType),
lammpsInterface_(atc->lammps_interface())
{
if (!atomCoarseGrainingPositions) {
InterscaleManager & interscaleManager(atc->interscale_manager());
atomCoarseGrainingPositions_ = interscaleManager.per_atom_quantity("AtomicCoarseGrainingPositions");
}
atomCoarseGrainingPositions_->register_dependence(this);
// compute volumes and atom counts in each region
int nregion = lammpsInterface_->nregion();
regionalAtomVolume_.resize(nregion);
for (int i = 0; i < nregion; ++i) {
regionalAtomVolume_(i) =
(lammpsInterface_->region_xhi(i)-lammpsInterface_->region_xlo(i))
*(lammpsInterface_->region_yhi(i)-lammpsInterface_->region_ylo(i))
*(lammpsInterface_->region_zhi(i)-lammpsInterface_->region_zlo(i));
}
INT_VECTOR localCount(nregion);
INT_VECTOR globalCount(nregion);
// loop over atoms
localCount = 0;
const DENS_MAT atomicCoordinates(atomCoarseGrainingPositions->quantity());
for (int i = 0; i < quantity_.nRows(); ++i) {
for (int j = 0; j < nregion; ++j) {
if (lammpsInterface_->region_match(j,
atomicCoordinates(i,0),
atomicCoordinates(i,1),
atomicCoordinates(i,2))) {
localCount(j)++;
}
}
}
// communication to get total atom counts per group
lammpsInterface_->int_allsum(localCount.ptr(),
globalCount.ptr(),nregion);
for (int i = 0; i < nregion; ++i) {
if (globalCount(i) > 0)
regionalAtomVolume_(i) /= globalCount(i);
else
regionalAtomVolume_(i) = 0;
}
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtomVolumeRegion::~AtomVolumeRegion()
{
atomCoarseGrainingPositions_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomVolumeRegion::reset() const
{
if (need_reset()) {
PerAtomDiagonalMatrix<double>::reset();
const DENS_MAT & atomicCoordinates(atomCoarseGrainingPositions_->quantity());
for (int i = 0; i < quantity_.nRows(); i++) {
for (int iregion = 0; iregion < lammpsInterface_->nregion(); iregion++) {
if (lammpsInterface_->region_match(iregion,
atomicCoordinates(i,0),
atomicCoordinates(i,0),
atomicCoordinates(i,2)))
quantity_(i,i) = regionalAtomVolume_(iregion);
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomVolumeFile
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomVolumeFile::AtomVolumeFile(ATC_Method * atc,
const string & atomVolumeFile,
AtomType atomType) :
ProtectedAtomDiagonalMatrix<double>(atc,atomType),
atomVolumeFile_(atomVolumeFile),
lammpsInterface_(atc->lammps_interface())
{
// do nothing
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomVolumeFile::reset() const
{
if (need_reset()) {
PerAtomDiagonalMatrix<double>::reset();
int nlocal = lammpsInterface_->nlocal();
ifstream in;
const int lineSize = 256;
char line[lineSize];
const char* fname = &atomVolumeFile_[0];
// create tag to local id map for this processor
map <int,int> tag2id;
map <int,int>::const_iterator itr;
const int * atom_tag = lammpsInterface_->atom_tag();
for (int i = 0; i < nlocal; ++i) {
tag2id[atom_tag[i]] = i;
}
// get number of atoms
int natoms = 0;
if (ATC::LammpsInterface::instance()->rank_zero()) {
in.open(fname);
string msg;
string name = atomVolumeFile_;
msg = "no "+name+" atomic weights file found";
if (! in.good()) throw ATC_Error(msg);
in.getline(line,lineSize); // header
in.getline(line,lineSize); // blank line
in.getline(line,lineSize); // number of atoms
stringstream inss (line,stringstream::in | stringstream::out);
inss >> natoms; // number of atoms
stringstream ss;
ss << " found " << natoms << " atoms in atomic weights file";
lammpsInterface_->print_msg(ss.str());
if (natoms != lammpsInterface_->natoms()) {
throw ATC_Error("Incorrect number of atomic weights read-in!");
}
in.getline(line,lineSize); // blank line
}
// read and assign atomic weights
int nread = 0, tag = -1, count = 0;
double atomic_weight;
while (nread < natoms) {
if (ATC::LammpsInterface::instance()->rank_zero()) {
in.getline(line,lineSize);
stringstream ss (line,stringstream::in | stringstream::out);
ss >> tag >> atomic_weight;
nread++;
}
lammpsInterface_->int_broadcast(&nread);
lammpsInterface_->int_broadcast(&tag);
lammpsInterface_->broadcast(&atomic_weight);
itr = tag2id.find(tag);
if (itr != tag2id.end()) {
int iatom = itr->second;
quantity_(iatom,0) = atomic_weight;
count++;
}
}
if (lammpsInterface_->rank_zero()) {
in.close();
stringstream ss;
ss << " read " << nread << " atomic weights";
lammpsInterface_->print_msg(ss.str());
}
if (count != nlocal)
throw ATC_Error("reset "+to_string(count)+" atoms vs "+to_string(nlocal));
}
}
// need to add capability to take in group bit (JAT, 04/02/11)
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomNumber
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
AtomNumber::AtomNumber(ATC_Method * atc, AtomType atomType) :
ProtectedAtomQuantity<double>(atc,1,atomType),
atc_(atc)
{
}
void AtomNumber::reset() const
{
int nlocal = atc_->nlocal();
quantity_.reset(nlocal,1);
quantity_ = 1;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomTypeVector
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
AtomTypeVector::AtomTypeVector(ATC_Method * atc,
vector<int> typeList, AtomType atomType) :
ProtectedAtomQuantity<double>(atc,
typeList.size(),
atomType),
atc_(atc), ntypes_(ATC::LammpsInterface::instance()->ntypes()),
typeList_(typeList)
{
if (typeList_.size() == 0) throw ATC_Error("type list is empty");
index_.resize(ntypes_,-1);
for (unsigned int i = 0; i < typeList_.size(); i++) {
index_[typeList_[i]] = i;
}
}
AtomTypeVector::AtomTypeVector(ATC_Method * atc,
vector<int> typeList, vector<int> groupList, AtomType atomType) :
ProtectedAtomQuantity<double>(atc,
typeList.size()+groupList.size(),
atomType),
atc_(atc), ntypes_(ATC::LammpsInterface::instance()->ntypes()),
typeList_(typeList),
groupList_(groupList)
{
if ((typeList_.size() == 0) && (groupList_.size() == 0)) throw ATC_Error("type/group lists are empty");
// reverse map
index_.resize(ntypes_,-1);
for (unsigned int i = 0; i < typeList_.size(); i++) {
index_[typeList_[i]-1] = i;
}
}
void AtomTypeVector::reset() const
{
if (need_reset()) {
//PerAtomQuantity<double>::reset();
int nlocal = atc_->nlocal();
quantity_.reset(nlocal,typeList_.size()+groupList_.size());
+ const Array<int> & quantityToLammps = (PerAtomQuantity<double>::atc_).atc_to_lammps_map();
if (typeList_.size()) {
int * type = ATC::LammpsInterface::instance()->atom_type();
for (int i = 0; i < nlocal; i++) {
- int a = quantityToLammps_(i);
+ int a = quantityToLammps(i);
int index = index_[type[a]-1];
if (index > -1) quantity_(i,index) = 1;
}
}
int index = typeList_.size();
if (groupList_.size()) {
const int * mask = ATC::LammpsInterface::instance()->atom_mask();
for (unsigned int j = 0; j < groupList_.size(); j++) {
int group = groupList_[j];
for (int i = 0; i < nlocal; i++) {
- int a = quantityToLammps_(i);
+ int a = quantityToLammps(i);
if (mask[a] & group) quantity_(i,index) = 1;
}
index++;
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class XrefWrapper
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
XrefWrapper::XrefWrapper(ATC_Method * atc, AtomType atomType) :
ProtectedClonedAtomQuantity<double>(atc,atc->nsd(),atomType),
atc_(atc)
{
// do nothing
}
//--------------------------------------------------------
// lammps_vector
//--------------------------------------------------------
double ** XrefWrapper::lammps_vector() const
{
return atc_->xref();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomicMassWeightedDisplacement
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
AtomicMassWeightedDisplacement::AtomicMassWeightedDisplacement(ATC_Method * atc,
PerAtomQuantity<double> * atomPositions,
PerAtomQuantity<double> * atomMasses,
PerAtomQuantity<double> * atomReferencePositions,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,atc->nsd(),atomType),
atomPositions_(atomPositions),
atomMasses_(atomMasses),
atomReferencePositions_(atomReferencePositions)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomPositions_)
atomPositions_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION,
atomType);
if (!atomMasses_)
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
atomType);
if (!atomReferencePositions_)
atomReferencePositions_ = interscaleManager.per_atom_quantity("AtomicCoarseGrainingPositions");
atomPositions_->register_dependence(this);
atomMasses_->register_dependence(this);
atomReferencePositions_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
AtomicMassWeightedDisplacement::~AtomicMassWeightedDisplacement()
{
atomPositions_->remove_dependence(this);
atomMasses_->remove_dependence(this);
atomReferencePositions_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomicMassWeightedDisplacement::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & position(atomPositions_->quantity());
const DENS_MAT & mass(atomMasses_->quantity());
const DENS_MAT & refPosition(atomReferencePositions_->quantity());
// q = m * (x - xref)
quantity_ = position;
quantity_ -= refPosition;
quantity_ *= mass;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomicMomentum
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
AtomicMomentum::AtomicMomentum(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities,
PerAtomQuantity<double> * atomMasses,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,atc->nsd(),atomType),
atomVelocities_(atomVelocities),
atomMasses_(atomMasses)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomVelocities_)
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,
atomType);
if (!atomMasses_)
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
atomType);
atomVelocities_->register_dependence(this);
atomMasses_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
AtomicMomentum::~AtomicMomentum()
{
atomVelocities_->remove_dependence(this);
atomMasses_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomicMomentum::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & mass(atomMasses_->quantity());
const DENS_MAT & velocity(atomVelocities_->quantity());
// q = m * v
quantity_ = velocity;
quantity_ *= mass;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TwiceKineticEnergy
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
TwiceKineticEnergy::TwiceKineticEnergy(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities,
PerAtomQuantity<double> * atomMasses,
AtomType atomType) :
AtomicEnergyForTemperature(atc,atomType),
atomVelocities_(atomVelocities),
atomMasses_(atomMasses)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomVelocities_)
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,
atomType);
if (!atomMasses_)
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
atomType);
atomVelocities_->register_dependence(this);
atomMasses_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
TwiceKineticEnergy::~TwiceKineticEnergy()
{
atomVelocities_->remove_dependence(this);
atomMasses_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void TwiceKineticEnergy::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & mass(atomMasses_->quantity());
const DENS_MAT & velocity(atomVelocities_->quantity());
// q = m * (v dot v)
for (int i = 0; i < quantity_.nRows(); i++) {
quantity_(i,0) = velocity(i,0)*velocity(i,0);
for (int j = 1; j < velocity.nCols(); j++) {
quantity_(i,0) += velocity(i,j)*velocity(i,j);
}
quantity_(i,0) *= mass(i,0);
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FluctuatingVelocity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
FluctuatingVelocity::FluctuatingVelocity(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities,
PerAtomQuantity<double> * atomMeanVelocities,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,3,atomType),
atomVelocities_(atomVelocities),
atomMeanVelocities_(atomMeanVelocities)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomVelocities_) {
atomVelocities_ = interscaleManager.fundamental_atom_quantity(
LammpsInterface::ATOM_VELOCITY, atomType);
}
if (!atomMeanVelocities_) {
atomMeanVelocities_ = interscaleManager.per_atom_quantity("AtomicMeanVelocity");
}
atomVelocities_->register_dependence(this);
atomMeanVelocities_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
FluctuatingVelocity::~FluctuatingVelocity()
{
atomVelocities_->remove_dependence(this);
atomMeanVelocities_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void FluctuatingVelocity::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & velocity(atomVelocities_->quantity());
const DENS_MAT & meanVelocity(atomMeanVelocities_->quantity());
// q = m * (v dot v)
for (int i = 0; i < quantity_.nRows(); i++) {
for (int j = 0; j < velocity.nCols(); j++) {
quantity_(i,j) = velocity(i,j) - meanVelocity(i,j);
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ChargeVelocity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
ChargeVelocity::ChargeVelocity(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities,
FundamentalAtomQuantity * atomCharge,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,3,atomType),
fluctuatingVelocities_(atomVelocities),
atomCharge_(atomCharge)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!fluctuatingVelocities_) {
fluctuatingVelocities_ = interscaleManager.per_atom_quantity("AtomicFluctuatingVelocity");
}
if (!atomCharge_) {
atomCharge_ = interscaleManager.fundamental_atom_quantity(
LammpsInterface::ATOM_CHARGE, atomType);
}
fluctuatingVelocities_->register_dependence(this);
atomCharge_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
ChargeVelocity::~ChargeVelocity()
{
fluctuatingVelocities_->remove_dependence(this);
atomCharge_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void ChargeVelocity::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & velocity(fluctuatingVelocities_->quantity());
const DENS_MAT & charge(atomCharge_->quantity());
for (int i = 0; i < quantity_.nRows(); i++) {
for (int j = 0; j < velocity.nCols(); j++) {
quantity_(i,j) = charge(i,0)*velocity(i,j);
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class SpeciesVelocity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
SpeciesVelocity::SpeciesVelocity(ATC_Method * atc,
PerAtomQuantity<double> * fluctuatingVelocities,
PerAtomQuantity<double> * atomTypeVector,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,3*(atomTypeVector->nCols()),atomType),
fluctuatingVelocities_(fluctuatingVelocities),
atomTypeVector_(atomTypeVector)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!fluctuatingVelocities_) {
fluctuatingVelocities_ = interscaleManager.per_atom_quantity("AtomicFluctuatingVelocity");
}
if (!atomTypeVector_) {
atomTypeVector_ = interscaleManager.per_atom_quantity("AtomicTypeVector");
}
fluctuatingVelocities_->register_dependence(this);
atomTypeVector_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
SpeciesVelocity::~SpeciesVelocity()
{
fluctuatingVelocities_->remove_dependence(this);
atomTypeVector_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void SpeciesVelocity::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & velocity(fluctuatingVelocities_->quantity());
const DENS_MAT & tv(atomTypeVector_->quantity());
for (int i = 0; i < quantity_.nRows(); i++) {
int m = 0;
for (int j = 0; j < velocity.nCols(); j++) {
for (int k = 0; j < tv.nCols(); j++) {
quantity_(i,m++) = tv(i,k)*velocity(i,j);
}
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TwiceFluctuatingKineticEnergy
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
TwiceFluctuatingKineticEnergy::TwiceFluctuatingKineticEnergy(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities,
PerAtomQuantity<double> * atomMasses,
PerAtomQuantity<double> * atomMeanVelocities,
AtomType atomType) :
AtomicEnergyForTemperature(atc,atomType),
atomVelocities_(atomVelocities),
atomMasses_(atomMasses),
atomMeanVelocities_(atomMeanVelocities)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomVelocities_) {
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,
atomType);
}
if (!atomMasses_) {
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
atomType);
}
if (!atomMeanVelocities_) {
atomMeanVelocities_ = interscaleManager.per_atom_quantity("AtomicMeanVelocity");
}
atomVelocities_->register_dependence(this);
atomMasses_->register_dependence(this);
atomMeanVelocities_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
TwiceFluctuatingKineticEnergy::~TwiceFluctuatingKineticEnergy()
{
atomVelocities_->remove_dependence(this);
atomMasses_->remove_dependence(this);
atomMeanVelocities_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void TwiceFluctuatingKineticEnergy::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & mass(atomMasses_->quantity());
const DENS_MAT & velocity(atomVelocities_->quantity());
const DENS_MAT & meanVelocity(atomMeanVelocities_->quantity());
// q = m * (v dot v)
double vRel;
for (int i = 0; i < quantity_.nRows(); i++) {
vRel = velocity(i,0) - meanVelocity(i,0);
quantity_(i,0) = vRel*vRel;
for (int j = 1; j < velocity.nCols(); j++) {
vRel = velocity(i,j) - meanVelocity(i,j);
quantity_(i,0) += vRel*vRel;;
}
quantity_(i,0) *= mass(i,0);
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class KineticTensor
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
KineticTensor::KineticTensor(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities,
PerAtomQuantity<double> * atomMasses,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,6,atomType),
atomVelocities_(atomVelocities),
atomMasses_(atomMasses)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomVelocities_) {
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,
atomType);
}
if (!atomMasses_) {
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
atomType);
}
atomVelocities_->register_dependence(this);
atomMasses_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
KineticTensor::~KineticTensor()
{
atomVelocities_->remove_dependence(this);
atomMasses_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void KineticTensor::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & mass(atomMasses_->quantity());
const DENS_MAT & velocity(atomVelocities_->quantity());
// K = m * (v \otimes v)
for (int i = 0; i < quantity_.nRows(); i++) {
double m = mass(i,0);
double v[3] = {velocity(i,0),velocity(i,1),velocity(i,2)};
quantity_(i,0) -= m*v[0]*v[0];
quantity_(i,1) -= m*v[1]*v[1];
quantity_(i,2) -= m*v[2]*v[2];
quantity_(i,3) -= m*v[0]*v[1];
quantity_(i,4) -= m*v[0]*v[2];
quantity_(i,5) -= m*v[1]*v[2];
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FluctuatingKineticTensor
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
FluctuatingKineticTensor::FluctuatingKineticTensor(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities,
PerAtomQuantity<double> * atomMasses,
PerAtomQuantity<double> * atomMeanVelocities,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,6,atomType),
atomVelocities_(atomVelocities),
atomMasses_(atomMasses)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomVelocities_) {
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,
atomType);
}
if (!atomMasses_) {
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
atomType);
}
if (!atomMeanVelocities_) {
atomMeanVelocities_ = interscaleManager.per_atom_quantity("AtomicMeanVelocity");
}
atomVelocities_->register_dependence(this);
atomMasses_->register_dependence(this);
atomMeanVelocities_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
FluctuatingKineticTensor::~FluctuatingKineticTensor()
{
atomVelocities_->remove_dependence(this);
atomMasses_->remove_dependence(this);
atomMeanVelocities_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void FluctuatingKineticTensor::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & mass(atomMasses_->quantity());
const DENS_MAT & velocity(atomVelocities_->quantity());
const DENS_MAT & meanVelocity(atomMeanVelocities_->quantity());
// K = m * (v \otimes v)
for (int i = 0; i < quantity_.nRows(); i++) {
double m = mass(i,0);
double v[3] = {velocity(i,0)-meanVelocity(i,0),
velocity(i,1)-meanVelocity(i,0),
velocity(i,2)-meanVelocity(i,0)};
quantity_(i,0) -= m*v[0]*v[0];
quantity_(i,1) -= m*v[1]*v[1];
quantity_(i,2) -= m*v[2]*v[2];
quantity_(i,3) -= m*v[0]*v[1];
quantity_(i,4) -= m*v[0]*v[2];
quantity_(i,5) -= m*v[1]*v[2];
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class MixedKePeEnergy
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
MixedKePeEnergy::MixedKePeEnergy(ATC_Method * atc,
double keMultiplier,
double peMultiplier,
PerAtomQuantity<double> * twiceKineticEnergy,
PerAtomQuantity<double> * potentialEnergy,
AtomType atomType) :
AtomicEnergyForTemperature(atc,atomType),
keMultiplier_(keMultiplier),
peMultiplier_(peMultiplier),
twiceKineticEnergy_(twiceKineticEnergy),
potentialEnergy_(potentialEnergy)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!twiceKineticEnergy_) {
twiceKineticEnergy_ = interscaleManager.per_atom_quantity("AtomicTwiceKineticEnergy");
}
if (!potentialEnergy_) {
potentialEnergy_ = interscaleManager.per_atom_quantity("AtomicFluctuatingPotentialEnergy");
}
twiceKineticEnergy_->register_dependence(this);
potentialEnergy_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
MixedKePeEnergy::~MixedKePeEnergy()
{
twiceKineticEnergy_->remove_dependence(this);
potentialEnergy_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void MixedKePeEnergy::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & twoKe(twiceKineticEnergy_->quantity());
const DENS_MAT & pe(potentialEnergy_->quantity());
// q = peScale * pe + keScale * ke
quantity_ = pe;
quantity_ *= peMultiplier_;
quantity_ += (keMultiplier_/2.)*twoKe;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TotalEnergy
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
TotalEnergy::TotalEnergy(ATC_Method * atc,
PerAtomQuantity<double> * twiceKineticEnergy,
PerAtomQuantity<double> * potentialEnergy,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,atomType),
twiceKineticEnergy_(twiceKineticEnergy),
potentialEnergy_(potentialEnergy)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!twiceKineticEnergy_) {
twiceKineticEnergy_ = interscaleManager.per_atom_quantity("AtomicTwiceKineticEnergy");
}
if (!potentialEnergy_) {
potentialEnergy_ = interscaleManager.per_atom_quantity("AtomicPotentialEnergy");
}
twiceKineticEnergy_->register_dependence(this);
potentialEnergy_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
TotalEnergy::~TotalEnergy()
{
twiceKineticEnergy_->remove_dependence(this);
potentialEnergy_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void TotalEnergy::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & twoKe(twiceKineticEnergy_->quantity());
const DENS_MAT & pe(potentialEnergy_->quantity());
quantity_ = pe;
quantity_ += (0.5)*twoKe;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FluctuatingPotentialEnergy
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
FluctuatingPotentialEnergy::FluctuatingPotentialEnergy(ATC_Method * atc,
PerAtomQuantity<double> * potentialEnergy,
PerAtomQuantity<double> * referencePotential,
AtomType atomType) :
AtomicEnergyForTemperature(atc,atomType),
potentialEnergy_(potentialEnergy),
referencePotential_(referencePotential)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!potentialEnergy_) {
potentialEnergy_ = interscaleManager.per_atom_quantity("AtomicPotentialEnergy");
}
if (!referencePotential_) {
referencePotential_ = interscaleManager.per_atom_quantity("AtomicReferencePotential");
}
potentialEnergy_->register_dependence(this);
referencePotential_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
FluctuatingPotentialEnergy::~FluctuatingPotentialEnergy()
{
potentialEnergy_->remove_dependence(this);
referencePotential_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void FluctuatingPotentialEnergy::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & pe(potentialEnergy_->quantity());
const DENS_MAT & refPe(referencePotential_->quantity());
quantity_ = pe;
quantity_ -= refPe;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class DotTwiceKineticEnergy
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
DotTwiceKineticEnergy::DotTwiceKineticEnergy(ATC_Method * atc,
PerAtomQuantity<double> * atomForces,
PerAtomQuantity<double> * atomVelocities,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,1,atomType),
atomForces_(atomForces),
atomVelocities_(atomVelocities)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomForces_)
atomForces_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE,
atomType);
if (!atomVelocities_)
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,
atomType);
atomForces_->register_dependence(this);
atomVelocities_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
DotTwiceKineticEnergy::~DotTwiceKineticEnergy()
{
atomForces_->remove_dependence(this);
atomVelocities_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void DotTwiceKineticEnergy::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & velocity(atomVelocities_->quantity());
const DENS_MAT & force(atomForces_->quantity());
for (int i = 0; i < quantity_.nRows(); i++) {
quantity_(i,0) = velocity(i,0)*force(i,0);
for (int j = 1; j < velocity.nCols(); j++) {
quantity_(i,0) += velocity(i,j)*force(i,j);
}
quantity_(i,0) *= 2.;
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class VelocitySquared
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
VelocitySquared::VelocitySquared(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,1,atomType),
atomVelocities_(atomVelocities)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomVelocities_)
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,
atomType);
atomVelocities_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
VelocitySquared::~VelocitySquared()
{
atomVelocities_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void VelocitySquared::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & velocity(atomVelocities_->quantity());
for (int i = 0; i < quantity_.nRows(); i++) {
quantity_(i,0) = velocity(i,0)*velocity(i,0);
for (int j = 1; j < velocity.nCols(); j++) {
quantity_(i,0) += velocity(i,j)*velocity(i,j);
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class LambdaSquared
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
LambdaSquared::LambdaSquared(ATC_Method * atc,
PerAtomQuantity<double> * atomMasses,
PerAtomQuantity<double> * atomVelocitiesSquared,
PerAtomQuantity<double> * atomLambdas,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,1,atomType),
atomMasses_(atomMasses),
atomVelocitiesSquared_(atomVelocitiesSquared),
atomLambdas_(atomLambdas)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomMasses_) {
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
atomType);
}
atomMasses_->register_dependence(this);
if (!atomVelocitiesSquared) {
atomVelocitiesSquared_ = interscaleManager.per_atom_quantity("LambdaSquared");
}
atomVelocitiesSquared_->register_dependence(this);
if (!atomLambdas_) {
atomLambdas_ = interscaleManager.per_atom_quantity("AtomLambdaEnergy");
}
atomLambdas_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
LambdaSquared::~LambdaSquared()
{
atomMasses_->remove_dependence(this);
atomVelocitiesSquared_->remove_dependence(this);
atomLambdas_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void LambdaSquared::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & mass(atomMasses_->quantity());
const DENS_MAT & velocitySquared(atomVelocitiesSquared_->quantity());
const DENS_MAT & lambda(atomLambdas_->quantity());
for (int i = 0; i < quantity_.nRows(); i++) {
quantity_(i,0) = lambda(i,0)*lambda(i,0)*velocitySquared(i,0)/mass(i,0);
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomToType
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomToType::AtomToType(ATC_Method * atc,
int type,
AtomType atomType) :
LargeToSmallAtomMap(atc,atomType),
type_(type)
{
// DO NOTHING
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomToType::reset() const
{
if (need_reset()) {
PerAtomQuantity<int>::reset();
quantity_ = -1.;
size_ = 0;
const int * type = lammpsInterface_->atom_type();
+ const Array<int> & quantityToLammps = atc_.atc_to_lammps_map();
for (int i = 0; i < quantity_.nRows(); ++i) {
- int atomIdx = quantityToLammps_(i);
+ int atomIdx = quantityToLammps(i);
if (type[atomIdx] == type_) {
quantity_(i,0) = size_;
++size_;
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomToGroup
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomToGroup::AtomToGroup(ATC_Method * atc,
int group,
AtomType atomType) :
LargeToSmallAtomMap(atc,atomType),
group_(group)
{
// DO NOTHING
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomToGroup::reset() const
{
if (need_reset()) {
PerAtomQuantity<int>::reset();
quantity_ = -1.;
size_ = 0;
const int * mask = lammpsInterface_->atom_mask();
+ const Array<int> & quantityToLammps = atc_.atc_to_lammps_map();
for (int i = 0; i < quantity_.nRows(); ++i) {
- int atomIdx = quantityToLammps_(i);
+ int atomIdx = quantityToLammps(i);
if (mask[atomIdx] & group_) {
quantity_(i,0) = size_;
++size_;
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomToNodeset
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomToNodeset::AtomToNodeset(ATC_Method * atc,
SetDependencyManager<int> * subsetNodes,
PerAtomQuantity<int> * atomElement,
AtomType atomType) :
LargeToSmallAtomMap(atc,atomType),
subsetNodes_(subsetNodes),
atomElement_(atomElement),
feMesh_((atc->fe_engine())->fe_mesh())
{
if (!atomElement_) {
atomElement_ = (atc->interscale_manager()).per_atom_int_quantity("AtomElement");
}
if (atomElement_) {
atomElement_->register_dependence(this);
}
else {
throw ATC_Error("PerAtomQuantityLibrary::AtomToRegulated - No AtomElement provided");
}
subsetNodes_->register_dependence(this);
}
//--------------------------------------------------------
// quantity
//--------------------------------------------------------
void AtomToNodeset::reset() const
{
//so it has been commented out.
/*
if (need_reset()) {
PerAtomQuantity<int>::reset();
const INT_ARRAY & atomElement(atomElement_->quantity());
const set<int> & subsetNodes(subsetNodes_->quantity());
int nLocal = atomElement.nRows();
quantity_.resize(nLocal,1);
quantity_ = -1;
size_ = 0;
for (int i = 0; i < nLocal; ++i) {
feMesh_->element_connectivity_unique(atomElement(i,0),_nodes_);
for (int j = 0; j < _nodes_.size(); ++j) {
if (subsetNodes.find(_nodes_(j)) != subsetNodes.end()) {
quantity_(i,0) = size_;
size_++;
break;
}
}
}
}
*/
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomToElementset
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomToElementset::AtomToElementset(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, bool> * elementMask,
PerAtomQuantity<int> * atomElement,
AtomType atomType) :
LargeToSmallAtomMap(atc,atomType),
elementMask_(elementMask),
atomElement_(atomElement),
feMesh_((atc->fe_engine())->fe_mesh())
{
if (!atomElement_) {
atomElement_ = (atc->interscale_manager()).per_atom_int_quantity("AtomElement");
}
if (atomElement_) {
atomElement_->register_dependence(this);
}
else {
throw ATC_Error("PerAtomQuantityLibrary::AtomToRegulated - No AtomElement provided");
}
elementMask_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
AtomToElementset::~AtomToElementset()
{
atomElement_->remove_dependence(this);
elementMask_->remove_dependence(this);
}
//--------------------------------------------------------
// quantity
//--------------------------------------------------------
void AtomToElementset::reset() const
{
if (need_reset()) {
PerAtomQuantity<int>::reset();
const INT_ARRAY & atomElement(atomElement_->quantity());
const DenseMatrix<bool> & elementMask(elementMask_->quantity());
int nLocal = atomElement.nRows();
quantity_.resize(nLocal,1);
quantity_ = -1;
size_ = 0;
for (int i = 0; i < nLocal; ++i) {
if (elementMask(atomElement(i,0),0)) {
quantity_(i,0) = size_;
size_++;
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class MappedAtomQuantity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
MappedAtomQuantity::MappedAtomQuantity(ATC_Method * atc,
PerAtomQuantity<double> * source,
LargeToSmallAtomMap * map,
AtomType atomType) :
ProtectedMappedAtomQuantity<double>(atc,map,source->nCols(),atomType),
source_(source),
map_(map)
{
source_->register_dependence(this);
map_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void MappedAtomQuantity::reset() const
{
if (needReset_) {
ProtectedMappedAtomQuantity<double>::reset();
const DENS_MAT & source(source_->quantity());
const INT_ARRAY & map(map_->quantity());
quantity_.resize(map_->size(),source.nCols());
for (int i = 0; i < source.nRows(); i++) {
int idx = map(i,0);
if (idx > -1) {
for (int j = 0; j < source.nCols(); j++) {
quantity_(idx,j) = source(i,j);
}
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class VelocitySquaredMapped
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
VelocitySquaredMapped::VelocitySquaredMapped(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int> * atomMap,
PerAtomQuantity<double> * atomVelocities,
AtomType atomType) :
ProtectedMappedAtomQuantity<double>(atc,atomMap,1,atomType),
atomVelocities_(atomVelocities)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomVelocities_)
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,
atomType);
atomVelocities_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
VelocitySquaredMapped::~VelocitySquaredMapped()
{
atomVelocities_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void VelocitySquaredMapped::reset() const
{
if (need_reset()) {
ProtectedMappedAtomQuantity<double>::reset();
const DENS_MAT & velocity(atomVelocities_->quantity());
const INT_ARRAY & atomMap(atomMap_->quantity());
for (int i = 0; i < atomMap.nRows(); i++) {
int idx = atomMap(i,0);
if (idx > -1) {
quantity_(idx,0) = velocity(i,0)*velocity(i,0);
for (int j = 1; j < velocity.nCols(); j++) {
quantity_(idx,0) += velocity(i,j)*velocity(i,j);
}
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class LambdaSquaredMapped
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
LambdaSquaredMapped::LambdaSquaredMapped(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int> * atomMap,
PerAtomQuantity<double> * atomMasses,
PerAtomQuantity<double> * atomVelocitiesSquared,
PerAtomQuantity<double> * atomLambdas,
AtomType atomType) :
ProtectedMappedAtomQuantity<double>(atc,atomMap,1,atomType),
atomMasses_(atomMasses),
atomVelocitiesSquared_(atomVelocitiesSquared),
atomLambdas_(atomLambdas)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomMasses_) {
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
atomType);
}
atomMasses_->register_dependence(this);
if (!atomVelocitiesSquared) {
atomVelocitiesSquared_ = interscaleManager.per_atom_quantity("LambdaSquared");
}
atomVelocitiesSquared_->register_dependence(this);
if (!atomLambdas_) {
atomLambdas_ = interscaleManager.per_atom_quantity("AtomLambdaEnergy");
}
atomLambdas_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
LambdaSquaredMapped::~LambdaSquaredMapped()
{
atomMasses_->remove_dependence(this);
atomVelocitiesSquared_->remove_dependence(this);
atomLambdas_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void LambdaSquaredMapped::reset() const
{
if (need_reset()) {
ProtectedMappedAtomQuantity<double>::reset();
const DENS_MAT & mass(atomMasses_->quantity());
const DENS_MAT & velocitySquared(atomVelocitiesSquared_->quantity());
const DENS_MAT & lambda(atomLambdas_->quantity());
const INT_ARRAY & atomMap(atomMap_->quantity());
for (int i = 0; i < atomMap.nRows(); i++) {
int idx = atomMap(i,0);
if (idx > -1) {
quantity_(idx,0) = lambda(i,0)*lambda(i,0)*velocitySquared(idx,0)/mass(i,0);
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class HeatCapacity
// computes the classical atomic heat capacity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
HeatCapacity::HeatCapacity(ATC_Method * atc, AtomType atomType) :
ConstantQuantity<double>(atc,1,1,atomType)
{
constant_ = (atc->nsd())*(lammpsInterface_->kBoltzmann());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomicVelocityRescaleFactor
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
AtomicVelocityRescaleFactor::AtomicVelocityRescaleFactor(ATC_Method * atc,
PerAtomQuantity<double> * atomLambdas,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,1,atomType),
atomMasses_(NULL),
atomLambdas_(atomLambdas)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
atomType);
if (!atomLambdas) {
atomLambdas_ = interscaleManager.per_atom_quantity("AtomLambdaEnergy");
}
atomMasses_->register_dependence(this);
atomLambdas_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
AtomicVelocityRescaleFactor::~AtomicVelocityRescaleFactor()
{
atomMasses_->remove_dependence(this);
atomLambdas_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomicVelocityRescaleFactor::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & mass(atomMasses_->quantity());
const DENS_MAT & lambda(atomLambdas_->quantity());
for (int i = 0; i < quantity_.nRows(); i++) {
quantity_(i,0) = sqrt(lambda(i,0)/mass(i,0));
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomicThermostatForce
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
AtomicThermostatForce::AtomicThermostatForce(ATC_Method * atc,
PerAtomQuantity<double> * atomLambdas,
PerAtomQuantity<double> * atomVelocities,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,atc->nsd(),atomType),
atomLambdas_(atomLambdas),
atomVelocities_(atomVelocities)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomLambdas) {
atomLambdas_ = interscaleManager.per_atom_quantity("AtomLambdaEnergy");
}
if (!atomVelocities_) {
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,
atomType);
}
atomLambdas_->register_dependence(this);
atomVelocities_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
AtomicThermostatForce::~AtomicThermostatForce()
{
atomLambdas_->remove_dependence(this);
atomVelocities_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomicThermostatForce::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & v(atomVelocities_->quantity());
const DENS_MAT & lambda(atomLambdas_->quantity());
// force = -lambda*v
quantity_ = v;
quantity_ *= lambda;
quantity_ *= -1.;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomicKinetostatForceDisplacement
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
AtomicKinetostatForceDisplacement::AtomicKinetostatForceDisplacement(ATC_Method * atc,
PerAtomQuantity<double> * atomLambda,
PerAtomQuantity<double> * atomMass,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,atc->nsd(),atomType),
atomLambda_(atomLambda),
atomMass_(atomMass)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomLambda) {
atomLambda_ = interscaleManager.per_atom_quantity("AtomLambdaMomentum");
}
if (!atomMass_) {
atomMass_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,
atomType);
}
atomLambda_->register_dependence(this);
atomMass_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
AtomicKinetostatForceDisplacement::~AtomicKinetostatForceDisplacement()
{
atomLambda_->remove_dependence(this);
atomMass_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomicKinetostatForceDisplacement::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & m(atomMass_->quantity());
const DENS_MAT & lambda(atomLambda_->quantity());
double timeFactor = time_step_factor(0.5*atc_.dt());
//force = -lambda*m*(timestep factor)
quantity_ = lambda;
quantity_ *= m;
quantity_ *= -1.*timeFactor;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomicKinetostatForceStress
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
AtomicKinetostatForceStress::AtomicKinetostatForceStress(ATC_Method * atc,
PerAtomQuantity<double> * atomLambda,
AtomType atomType) :
ProtectedAtomQuantity<double>(atc,atc->nsd(),atomType),
atomLambda_(atomLambda)
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomLambda_) {
atomLambda_ = interscaleManager.per_atom_quantity("AtomLambdaMomentum");
}
atomLambda_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
AtomicKinetostatForceStress::~AtomicKinetostatForceStress()
{
atomLambda_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void AtomicKinetostatForceStress::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & lambda(atomLambda_->quantity());
// force = -lambda
quantity_ = lambda;
quantity_ *= -1.;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class PerAtomKernelFunction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
PerAtomKernelFunction::PerAtomKernelFunction(ATC_Method * atc,
PerAtomQuantity<double> * atomPositions,
AtomType atomType) :
- ProtectedAtomSparseMatrix<double>(atc,(atc->fe_engine())->num_nodes(),(atc->fe_engine())->num_nodes(),atomType),
+ ProtectedAtomSparseMatrix<double>(atc,(atc->fe_engine())->num_nodes(),atc->accumulant_bandwidth(),atomType),
atomPositions_(atomPositions),
feEngine_(atc->fe_engine())
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomPositions_) {
atomPositions_ = interscaleManager.per_atom_quantity("AtomicCoarseGrainingPositions");
}
atomPositions_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
PerAtomKernelFunction::~PerAtomKernelFunction()
{
atomPositions_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void PerAtomKernelFunction::reset() const
{
if (need_reset()) {
PerAtomSparseMatrix<double>::reset();
const DENS_MAT & positions(atomPositions_->quantity());
if (positions.nRows() > 0) {
feEngine_->evaluate_kernel_functions(positions,quantity_);
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class PerAtomShapeFunction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
PerAtomShapeFunction::PerAtomShapeFunction(ATC_Method * atc,
PerAtomQuantity<double> * atomPositions,
PerAtomQuantity<int> * atomElements,
AtomType atomType) :
ProtectedAtomSparseMatrix<double>(atc,atc->num_nodes(),(atc->fe_engine())->num_nodes_per_element(),atomType),
atomPositions_(atomPositions),
atomElements_(atomElements),
feEngine_(atc->fe_engine())
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomPositions_) {
atomPositions_ = interscaleManager.per_atom_quantity("AtomicCoarseGrainingPositions");
}
if (!atomElements_) {
atomElements_ = interscaleManager.per_atom_int_quantity("AtomElement");
}
atomPositions_->register_dependence(this);
atomElements_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
PerAtomShapeFunction::~PerAtomShapeFunction()
{
atomPositions_->remove_dependence(this);
atomElements_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void PerAtomShapeFunction::reset() const
{
if (need_reset()) {
PerAtomSparseMatrix<double>::reset();
const DENS_MAT & positions(atomPositions_->quantity());
const INT_ARRAY & elements(atomElements_->quantity());
if (positions.nRows() > 0) {
feEngine_->evaluate_shape_functions(positions,
elements,
quantity_);
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class LambdaCouplingMatrix
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
LambdaCouplingMatrix::LambdaCouplingMatrix(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int> * nodeToOverlapMap,
SPAR_MAN * shapeFunction) :
ProtectedMappedAtomSparseMatrix<double>(atc,nodeToOverlapMap->size(),
(atc->fe_engine())->num_nodes_per_element(),
INTERNAL),
shapeFunction_(shapeFunction),
nodeToOverlapMap_(nodeToOverlapMap)
{
if (!shapeFunction_) {
shapeFunction_ = (atc->interscale_manager()).per_atom_sparse_matrix("Interpolant");;
}
if (!nodeToOverlapMap_) {
nodeToOverlapMap_ = (atc->interscale_manager()).dense_matrix_int("NodeToOverlapMap");
}
shapeFunction_->register_dependence(this);
nodeToOverlapMap_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void LambdaCouplingMatrix::reset() const
{
if (need_reset()) {
PerAtomSparseMatrix<double>::reset();
int nNodeOverlap = nodeToOverlapMap_->size();
const SPAR_MAT & shapeFunction(shapeFunction_->quantity());
quantity_.reset(shapeFunction.nRows(),nNodeOverlap); // number of atoms X number of nodes overlapping MD region
const INT_ARRAY nodeToOverlapMap(nodeToOverlapMap_->quantity());
for (int i = 0; i < shapeFunction.size(); ++i) {
TRIPLET<double> myTriplet = shapeFunction.triplet(i);
int myCol = nodeToOverlapMap(myTriplet.j,0);
if (myCol > -1) {
quantity_.set(myTriplet.i,myCol,myTriplet.v);
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class LocalLambdaCouplingMatrix
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
LocalLambdaCouplingMatrix::LocalLambdaCouplingMatrix(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int> * lambdaAtomMap,
MatrixDependencyManager<DenseMatrix, int> * nodeToOverlapMap,
SPAR_MAN * shapeFunction) :
LambdaCouplingMatrix(atc,nodeToOverlapMap,shapeFunction),
lambdaAtomMap_(lambdaAtomMap)
{
if (!lambdaAtomMap_) {
lambdaAtomMap_ = (atc->interscale_manager()).dense_matrix_int("LambdaAtomMap");
}
lambdaAtomMap_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void LocalLambdaCouplingMatrix::reset() const
{
if (need_reset()) {
PerAtomSparseMatrix<double>::reset();
int nNodeOverlap = nodeToOverlapMap_->size();
int nLocalLambda = lambdaAtomMap_->size();
quantity_.reset(nLocalLambda,nNodeOverlap); // number of regulated atoms X number of nodes containing them
const SPAR_MAT & shapeFunction(shapeFunction_->quantity());
const INT_ARRAY nodeToOverlapMap(nodeToOverlapMap_->quantity());
const INT_ARRAY lambdaAtomMap(lambdaAtomMap_->quantity());
for (int i = 0; i < shapeFunction.size(); ++i) {
TRIPLET<double> myTriplet = shapeFunction.triplet(i);
int myRow = lambdaAtomMap(myTriplet.i,0);
int myCol = nodeToOverlapMap(myTriplet.j,0);
if ((myRow > -1) && (myCol > -1)) {
quantity_.set(myRow,myCol,myTriplet.v);
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class GhostCouplingMatrix
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
GhostCouplingMatrix::GhostCouplingMatrix(ATC_Method * atc,
SPAR_MAN * shapeFunction,
SetDependencyManager<int> * subsetNodes,
MatrixDependencyManager<DenseMatrix, int> * nodeToOverlapMap) :
LambdaCouplingMatrix(atc,nodeToOverlapMap,shapeFunction),
subsetNodes_(subsetNodes)
{
subsetNodes_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void GhostCouplingMatrix::reset() const
{
if (need_reset()) {
PerAtomSparseMatrix<double>::reset();
const SPAR_MAT & shapeFunction(shapeFunction_->quantity());
const set<int> & subsetNodes(subsetNodes_->quantity());
int nNodes = nodeToOverlapMap_->nRows();
int nLocalGhost = shapeFunction.nRows();
quantity_.reset(nLocalGhost,nNodes);
const INT_ARRAY nodeToOverlapMap(nodeToOverlapMap_->quantity());
for (int i = 0; i < shapeFunction.size(); ++i) {
TRIPLET<double> myTriplet = shapeFunction.triplet(i);
int myCol = myTriplet.j;
if (nodeToOverlapMap(myCol,0) > -1) {
quantity_.set(myTriplet.i,myCol,myTriplet.v);
}
}
quantity_.compress();
//int nNodes = nodeToOverlapMap_->nRows();
_activeNodes_.reset(nNodes);
for (int i = 0; i < nNodes; ++i) {
if (subsetNodes.find(i) != subsetNodes.end()) {
_activeNodes_(i) = 1.;
}
}
//const SPAR_MAT & shapeFunction(shapeFunction_->quantity());
//int nLocalGhost = shapeFunction.nRows();
_weights_ = shapeFunction*_activeNodes_;
_weightMatrix_.resize(nLocalGhost,nLocalGhost);
for (int i = 0; i < nLocalGhost; ++i) {
_weightMatrix_(i,i) = 1./_weights_(i);
}
quantity_ = _weightMatrix_*quantity_;
}
}
};
diff --git a/lib/atc/PerAtomQuantityLibrary.h b/lib/atc/PerAtomQuantityLibrary.h
index 16664dde4..e6847ef6a 100644
--- a/lib/atc/PerAtomQuantityLibrary.h
+++ b/lib/atc/PerAtomQuantityLibrary.h
@@ -1,1732 +1,1727 @@
// A library for defining various atomic quantities
#ifndef PER_ATOM_QUANTITY_LIBRARY_H
#define PER_ATOM_QUANTITY_LIBRARY_H
-// ATC_Method headers
#include "PerAtomQuantity.h"
#include "FundamentalAtomicQuantity.h"
#include <set>
+#include <map>
#include <vector>
-
-using namespace std;
-
+#include <string>
namespace ATC {
// forward declarations
class LammpsInterface;
class FE_Mesh;
class FE_Engine;
template <class T> class DenseMatrixTransfer;
// need to add capability to take in group bit (JAT, 04/02/11)
/**
* @class AtomNumber
* @brief Class for identifying atoms based on a specified group
*/
class AtomNumber : public ProtectedAtomQuantity<double> {
public:
// constructor
AtomNumber(ATC_Method * atc, AtomType atomType = INTERNAL);
// destructor
virtual ~AtomNumber() {};
/** reset the quantity */
virtual void reset() const;
protected:
// int groupBit_;
ATC_Method * atc_;
private:
// do not define
AtomNumber();
};
/**
* @class AtomTypeVector
* @brief Class for identifying atoms based on a specified group
*/
class AtomTypeVector : public ProtectedAtomQuantity<double> {
public:
// constructor
- AtomTypeVector(ATC_Method * atc, vector<int> typeList,
+ AtomTypeVector(ATC_Method * atc, std::vector<int> typeList,
AtomType atomType = INTERNAL);
- AtomTypeVector(ATC_Method * atc, vector<int> typeList, vector<int> grpList,
+ AtomTypeVector(ATC_Method * atc, std::vector<int> typeList, std::vector<int> grpList,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomTypeVector() {};
/** reset the quantity */
virtual void reset() const;
protected:
ATC_Method * atc_;
int ntypes_;
- vector<int> typeList_,index_; // lammps->atc & atc->lammps
- vector<int> groupList_;
+ std::vector<int> typeList_,index_; // lammps->atc & atc->lammps
+ std::vector<int> groupList_;
private:
AtomTypeVector(); // do not define
};
// inherited classes are used for this task because
// lammps changes pointer location so it can only be
// accessed by functions
/**
* @class XrefWrapper
* @brief Class for wrapping the xref_ array
*/
class XrefWrapper : public ProtectedClonedAtomQuantity<double> {
public:
// constructor
XrefWrapper(ATC_Method * atc, AtomType atomType=INTERNAL);
// destructor
virtual ~XrefWrapper() {};
protected:
/** pointer to atc to access raw pointer */
ATC_Method * atc_;
/** gets appropriate pointer for lammps data */
double ** lammps_vector() const;
private:
// do not define
XrefWrapper();
};
/**
* @class AtomToElementMap
* @brief Class for identifying the element associated with an atom
*/
class AtomToElementMap : public ProtectedAtomQuantity<int> {
public:
// constructor
AtomToElementMap(ATC_Method * atc,
PerAtomQuantity<double> * atomPositions = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomToElementMap();
protected:
/** resets the data if necessary */
virtual void reset() const;
/** atomic positions */
PerAtomQuantity<double> * atomPositions_;
private:
// do not define
AtomToElementMap();
};
/**
* @class AtomToElementMap
* @brief Class list of atoms in an element set
*/
class AtomInElementSet : public DependencyManager {
public:
// constructor
AtomInElementSet(ATC_Method * atc,
PerAtomQuantity<int> * map,
ESET eset, int type);
// destructor
virtual ~AtomInElementSet();
// accessors
virtual const ID_LIST & quantity();
virtual ID_LIST & set_quantity() {return list_;}
int size() {if (needReset_) reset(); return list_.size(); }
ID_PAIR item(int i) {if (needReset_) reset(); return list_[i]; }
protected:
/** resets the data if necessary */
virtual void reset();
PaqAtcUtility atc_;
/** atom to element map */
PerAtomQuantity<int> * map_;
ESET eset_;
int type_;
const Array<int> & quantityToLammps_;
ID_LIST list_;
private:
// do not define
AtomInElementSet();
};
/**
* @class AtomVolumeUser
* @brief Class for defining the volume per atom based on a user specification
*/
class AtomVolumeUser : public ProtectedAtomDiagonalMatrix<double> {
public:
// constructor
AtomVolumeUser(ATC_Method * atc,
- map<int,double> & atomGroupVolume,
+ std::map<int,double> & atomGroupVolume,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomVolumeUser() {};
protected:
/** resets the data if necessary */
virtual void reset() const;
/** reference to the map of atom group ids to atom volumes */
- map<int,double> & atomGroupVolume_;
+ std::map<int,double> & atomGroupVolume_;
/** pointer to lammps interface */
const LammpsInterface * lammpsInterface_;
/** map from atc indices to lammps indices */
const Array<int> & atcToLammps_;
private:
// do not define
AtomVolumeUser();
};
/**
* @class AtomVolumeGroup
- * @brief Class for defining the volume per atom based on the atom count in a group and it's volume
+ * @brief Class for defining the volume per atom based on the atom count in a group and its volume
*/
class AtomVolumeGroup : public AtomVolumeUser {
public:
// constructor
AtomVolumeGroup(ATC_Method * atc,
- map<int,double> & atomGroupVolume,
+ std::map<int,double> & atomGroupVolume,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomVolumeGroup() {};
protected:
/** map from group to group atom volume */
- map<int,double> atomGroupVolume_;
+ std::map<int,double> atomGroupVolume_;
/** pointer to lammps interface */
const LammpsInterface * lammpsInterface_;
/** reference to array mapping atc indices to lammps indices */
const Array<int> & atcToLammps_;
private:
// do not define
AtomVolumeGroup();
};
/**
* @class AtomVolumeLattice
* @brief Class for defining the volume per atom based on the lattice type and size
*/
class AtomVolumeLattice : public ProtectedAtomDiagonalMatrix<double> {
public:
// constructor
AtomVolumeLattice(ATC_Method * atc,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomVolumeLattice() {};
protected:
/** resets the data if necessary */
virtual void reset() const;
/** pointer to lammps interface */
const LammpsInterface * lammpsInterface_;
private:
// do not define
AtomVolumeLattice();
};
/**
* @class AtomVolumeElement
* @brief Class for defining the volume per atom based on the atom count per element and elemental volume
*/
class AtomVolumeElement : public ProtectedAtomDiagonalMatrix<double> {
public:
// constructor
AtomVolumeElement(ATC_Method * atc,
PerAtomQuantity<int> * atomElement = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomVolumeElement();
protected:
/** resets the data if necessary */
virtual void reset() const;
/** pointer to the atom to element map */
PerAtomQuantity<int> * atomElement_;
/** pointer to lammps interface */
const LammpsInterface * lammpsInterface_;
/** pointer to mesh object */
const FE_Mesh * feMesh_;
// workspace variables
mutable INT_VECTOR _elementAtomCountLocal_;
mutable INT_VECTOR _elementAtomCount_;
mutable DENS_VEC _elementAtomVolume_;
mutable DENS_MAT _nodalCoordinates_;
private:
// do not define
AtomVolumeElement();
};
/**
* @class AtomVolumeRegion
* @brief Class for defining the volume per atom based on the atom count in the MD regions and their volumes.
* It will only be meaningful if atoms completely fill all the regions.
*/
class AtomVolumeRegion : public ProtectedAtomDiagonalMatrix<double> {
public:
// constructor
AtomVolumeRegion(ATC_Method * atc,
DENS_MAN * atomCoarseGrainingPositions = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomVolumeRegion();
protected:
/** resets the data if necessary */
virtual void reset() const;
/** pointer to atomic coordinates data */
DENS_MAN * atomCoarseGrainingPositions_;
/** pointer to lammps interface */
const LammpsInterface * lammpsInterface_;
/** vector from region index to volume */
DENS_VEC regionalAtomVolume_;
private:
// do not define
AtomVolumeRegion();
};
/**
* @class AtomVolumeFile
* @brief Class for defining the volume per atom based on data read in from a file
*/
class AtomVolumeFile : public ProtectedAtomDiagonalMatrix<double> {
public:
// constructor
AtomVolumeFile(ATC_Method * atc,
- const string & atomVolumeFile,
+ const std::string & atomVolumeFile,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomVolumeFile() {};
protected:
/** resets the data if necessary */
virtual void reset() const;
/** file name containing the atomic information */
- const string & atomVolumeFile_;
+ const std::string & atomVolumeFile_;
/** pointer to lammps interface */
const LammpsInterface * lammpsInterface_;
private:
// do not define
AtomVolumeFile();
};
/**
* @class AtomicMassWeightedDisplacement
* @brief Class for computing the precursor atomic quantity m*(x - x_ref)
*/
class AtomicMassWeightedDisplacement : public ProtectedAtomQuantity<double> {
public:
// constructor
AtomicMassWeightedDisplacement(ATC_Method * atc,
PerAtomQuantity<double> * atomPositions = NULL,
PerAtomQuantity<double> * atomMasses = NULL,
PerAtomQuantity<double> * atomReferencePositions = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomicMassWeightedDisplacement();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic positions */
PerAtomQuantity<double> * atomPositions_;
/** atomic masses */
PerAtomQuantity<double> * atomMasses_;
/** atomic reference positions */
PerAtomQuantity<double> * atomReferencePositions_;
private:
// do not define
AtomicMassWeightedDisplacement();
};
/**
* @class FluctuatingVelocity
* @brief Class for computing the atomic quantity v - bar{v}
*/
class FluctuatingVelocity : public ProtectedAtomQuantity<double> {
public:
// constructor
FluctuatingVelocity(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities = NULL,
PerAtomQuantity<double> * atomMeanVelocities = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~FluctuatingVelocity();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic velocities */
PerAtomQuantity<double> * atomVelocities_;
/** atomic mean velocities */
PerAtomQuantity<double> * atomMeanVelocities_;
private:
// do not define
FluctuatingVelocity();
};
/**
* @class ChargeVelcity
* @brief Class for computing the atomic quantity q v'
*/
class ChargeVelocity : public ProtectedAtomQuantity<double> {
public:
// constructor
ChargeVelocity(ATC_Method * atc,
PerAtomQuantity<double> * fluctuatingVelocities = NULL,
FundamentalAtomQuantity * atomCharges = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~ChargeVelocity();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic velocities */
PerAtomQuantity<double> * fluctuatingVelocities_;
/** atomic mean velocities */
FundamentalAtomQuantity * atomCharge_;
private:
// do not define
ChargeVelocity();
};
/**
* @class SpeciesVelcity
* @brief Class for computing the atomic quantity m^(a) v'
*/
class SpeciesVelocity : public ProtectedAtomQuantity<double> {
public:
// constructor
SpeciesVelocity(ATC_Method * atc,
PerAtomQuantity<double> * fluctuatingVelocities = NULL,
PerAtomQuantity<double> * atomTypeVector = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~SpeciesVelocity();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic velocities */
PerAtomQuantity<double> * fluctuatingVelocities_;
/** atomic mean velocities */
PerAtomQuantity<double> * atomTypeVector_;
private:
// do not define
SpeciesVelocity();
};
/**
* @class AtomicMomentum
* @brief Class for computing the precursor atomic quantity m*v
*/
class AtomicMomentum : public ProtectedAtomQuantity<double> {
public:
// constructor
AtomicMomentum(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities = NULL,
PerAtomQuantity<double> * atomMasses = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomicMomentum();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic velocities */
PerAtomQuantity<double> * atomVelocities_;
/** atomic masses */
PerAtomQuantity<double> * atomMasses_;
private:
// do not define
AtomicMomentum();
};
/**
* @class AtomicEnergyForTemperature
* @brief Base class for accessing quantities needed for computing temperature
*/
class AtomicEnergyForTemperature : public ProtectedAtomQuantity<double> {
public:
// constructor
AtomicEnergyForTemperature(ATC_Method * atc,
AtomType atomType = INTERNAL)
: ProtectedAtomQuantity<double>(atc, 1, atomType) {};
// destructor
virtual ~AtomicEnergyForTemperature() {};
// returns coefficient which multiplies kinetic energy in temperature definition
virtual double kinetic_energy_multiplier() const = 0;
private:
// do not define
AtomicEnergyForTemperature();
};
/**
* @class TwiceKineticEnergy
* @brief Class for computing the precursor atomic quantity m*v*v
* (used when the kinetic definition of temperature is required)
*/
class TwiceKineticEnergy : public AtomicEnergyForTemperature {
public:
// constructor
TwiceKineticEnergy(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities = NULL,
PerAtomQuantity<double> * atomMasses = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~TwiceKineticEnergy();
// returns coefficient which multiplies kinetic energy in temperature definition
virtual double kinetic_energy_multiplier() const {return 2.;};
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic velocities */
PerAtomQuantity<double> * atomVelocities_;
/** atomic masses */
PerAtomQuantity<double> * atomMasses_;
private:
// do not define
TwiceKineticEnergy();
};
/**
* @class KineticTensor
* @brief Class for computing the atomic quantity m v (x) v
*/
class KineticTensor : public ProtectedAtomQuantity<double> {
public:
// constructor
KineticTensor(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities = NULL,
PerAtomQuantity<double> * atomMasses = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~KineticTensor();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic velocities */
PerAtomQuantity<double> * atomVelocities_;
/** atomic masses */
PerAtomQuantity<double> * atomMasses_;
private:
// do not define
KineticTensor();
};
/**
* @class FluctuatingKineticTensor
* @brief Class for computing the atomic quantity m v (x) v
*/
class FluctuatingKineticTensor : public ProtectedAtomQuantity<double> {
public:
// constructor
FluctuatingKineticTensor(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities = NULL,
PerAtomQuantity<double> * atomMasses = NULL,
PerAtomQuantity<double> * atomMeanVelocities = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~FluctuatingKineticTensor();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic velocities */
PerAtomQuantity<double> * atomVelocities_;
/** atomic masses */
PerAtomQuantity<double> * atomMasses_;
/** atomic mean velocities */
PerAtomQuantity<double> * atomMeanVelocities_;
private:
// do not define
FluctuatingKineticTensor();
};
/**
* @class TwiceFluctuatingKineticEnergy
* @brief Class for computing the precursor atomic quantity m*(v-vr)*(v-vr)
* (used when the kinetic definition of temperature is required)
*/
class TwiceFluctuatingKineticEnergy : public AtomicEnergyForTemperature {
public:
// constructor
TwiceFluctuatingKineticEnergy(ATC_Method * atc,
PerAtomQuantity<double> * atomVelocities = NULL,
PerAtomQuantity<double> * atomMasses = NULL,
PerAtomQuantity<double> * atomMeanVelocities = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~TwiceFluctuatingKineticEnergy();
// returns coefficient which multiplies kinetic energy in temperature definition
virtual double kinetic_energy_multiplier() const {return 2.;};
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic velocities */
PerAtomQuantity<double> * atomVelocities_;
/** atomic masses */
PerAtomQuantity<double> * atomMasses_;
/** atomic mean velocities */
PerAtomQuantity<double> * atomMeanVelocities_;
private:
// do not define
TwiceFluctuatingKineticEnergy();
};
/**
* @class MixedKePeEnergy
* @brief Class for computing the precursor atomic quantity for
* a mixed temperature definition involving both KE and PE
*/
class MixedKePeEnergy : public AtomicEnergyForTemperature {
public:
// constructor
MixedKePeEnergy(ATC_Method * atc,
double keMultiplier,
double peMultiplier,
PerAtomQuantity<double> * twiceKineticEnergy = NULL,
PerAtomQuantity<double> * potentialEnergy = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~MixedKePeEnergy();
// returns coefficient which multiplies kinetic energy in temperature definition
virtual double kinetic_energy_multiplier() const {return keMultiplier_;};
protected:
/** handles resetting of data */
virtual void reset() const;
/** factor multiplying kinetic energy */
double keMultiplier_;
/** factor multiplying potential energy */
double peMultiplier_;
/** twice the kinetic energy of each atom */
PerAtomQuantity<double> * twiceKineticEnergy_;
/** potential energy of each atom */
PerAtomQuantity<double> * potentialEnergy_;
private:
// do not define
MixedKePeEnergy();
};
/**
* @class TotalEnergy
* @brief Class for the atomic total energy
*/
class TotalEnergy : public ProtectedAtomQuantity<double> {
public:
// constructor
TotalEnergy(ATC_Method * atc,
PerAtomQuantity<double> * twiceKineticEnergy = NULL,
PerAtomQuantity<double> * potentialEnergy = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~TotalEnergy();
protected:
/** handles resetting of data */
virtual void reset() const;
/** twice the kinetic energy of each atom */
PerAtomQuantity<double> * twiceKineticEnergy_;
/** potential energy of each atom */
PerAtomQuantity<double> * potentialEnergy_;
private:
TotalEnergy(); // do not define
};
/**
* @class FluctuatingPotentialEnergy
* @brief Class for computing the precursor atomic quantity for
* a configurational (PE-based) temperature
*/
class FluctuatingPotentialEnergy : public AtomicEnergyForTemperature {
public:
// constructor
FluctuatingPotentialEnergy(ATC_Method * atc,
PerAtomQuantity<double> * potentialEnergy = NULL,
PerAtomQuantity<double> * referencePotential = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~FluctuatingPotentialEnergy();
// returns coefficient which multiplies kinetic energy in temperature definition
virtual double kinetic_energy_multiplier() const {return 0.;;};
protected:
/** handles resetting of data */
virtual void reset() const;
/** potential energy of each atom */
PerAtomQuantity<double> * potentialEnergy_;
/** twice the kinetic energy of each atom */
PerAtomQuantity<double> * referencePotential_;
private:
// do not define
FluctuatingPotentialEnergy();
};
/**
* @class DotTwiceKineticEnergy
* @brief Class for computing the precursor atomic power 2*v*f
* (used when the kinetic definition of temperature is required)
*/
class DotTwiceKineticEnergy : public ProtectedAtomQuantity<double> {
public:
// constructor
DotTwiceKineticEnergy(ATC_Method * atc,
PerAtomQuantity<double> * atomForces = NULL,
PerAtomQuantity<double> * atomVelocities = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~DotTwiceKineticEnergy();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic forces */
PerAtomQuantity<double> * atomForces_;
/** atomic velocities */
PerAtomQuantity<double> * atomVelocities_;
private:
// do not define
DotTwiceKineticEnergy();
};
/**
* @class VelocitySquared
* @brief Class for computing the quantity |v|^2
* (used for weights in the thermostat)
*/
class VelocitySquared : public ProtectedAtomQuantity<double> {
public:
// constructor
VelocitySquared(ATC_Method *atc,
PerAtomQuantity<double> * atomVelocities = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~VelocitySquared();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic velocities */
PerAtomQuantity<double> * atomVelocities_;
private:
// do not define
VelocitySquared();
};
/**
* @class LambdaSquared
* @brief Class for computing the 2nd order RHS fractional step
* contribution to the equation for lambda, with appropriate weights
*/
class LambdaSquared : public ProtectedAtomQuantity<double> {
public:
// constructor
LambdaSquared(ATC_Method *atc,
PerAtomQuantity<double> * atomMasses = NULL,
PerAtomQuantity<double> * atomVelocitiesSquared = NULL,
PerAtomQuantity<double> * atomLambdas = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~LambdaSquared();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic masses */
PerAtomQuantity<double> * atomMasses_;
/** atomic velocities squared */
PerAtomQuantity<double> * atomVelocitiesSquared_;
/** atomic lambdas */
PerAtomQuantity<double> * atomLambdas_;
private:
// do not define
LambdaSquared();
};
/**
* @class LargeToSmallAtomMap
* @brief mapping from a larger set of atoms to a smaller set
* this implementation maximizes storage but reduces execution times,
* including taking advantage of MPI communcation
*/
class LargeToSmallAtomMap : public ProtectedAtomQuantity<int> {
public:
// constructor
LargeToSmallAtomMap(ATC_Method * atc,
AtomType atomType = INTERNAL)
: ProtectedAtomQuantity<int>(atc,1,atomType), size_(0) {};
// destructor
virtual ~LargeToSmallAtomMap() {};
/** change map when atoms change */
virtual void reset_nlocal() {this->set_reset();};
/** get the number of elements associated with the map */
virtual int size() const {this->quantity(); return size_;};
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {};
/** sets quantity to lammps data, if needed */
virtual void post_exchange() {this->set_reset();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 0;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int i, double *buffer) {return 0;};
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int i, double *buffer) {return 0;};
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc) {return 0;};
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf) {return 0;};
/** returns size of per-atom communication */
virtual int size_comm() {return 0;};
/** changes size of temperary lammps storage data if transfer is being used */
- virtual void grow_lammps_array(int nmax, const string & tag) {};
+ virtual void grow_lammps_array(int nmax, const std::string & tag) {};
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j) {};
protected:
/** number of nodes in the map */
mutable int size_;
};
/**
* @class AtomToType
* @brief mapping from all atoms to the subset of atoms of a specified type
*/
class AtomToType : public LargeToSmallAtomMap {
public:
// constructor
AtomToType(ATC_Method * atc,
int type,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomToType() {};
protected:
/** handles resetting of data */
virtual void reset() const;
/** tag for type */
int type_;
private:
// do not define
AtomToType();
};
/**
* @class AtomToGroup
* @brief mapping from all atoms to the subset of atoms of a specified group
*/
class AtomToGroup : public LargeToSmallAtomMap {
public:
// constructor
AtomToGroup(ATC_Method * atc,
int group,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomToGroup() {};
protected:
/** handles resetting of data */
virtual void reset() const;
/** tag for group */
int group_;
private:
// do not define
AtomToGroup();
};
/**
* @class AtomToNodeset
* @brief mapping from all atoms to a subset of nodes
*/
class AtomToNodeset : public LargeToSmallAtomMap {
public:
// constructor
AtomToNodeset(ATC_Method * atc,
SetDependencyManager<int> * subsetNodes,
PerAtomQuantity<int> * atomElement = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomToNodeset() {
atomElement_->remove_dependence(this);
subsetNodes_->remove_dependence(this);
};
protected:
/** handles resetting of data */
virtual void reset() const;
/** set of nodes which are being regulated */
SetDependencyManager<int> * subsetNodes_;
/** map from atom to element in which it resides */
PerAtomQuantity<int> * atomElement_;
/** pointer to the finite element engine */
const FE_Mesh * feMesh_;
// workspace
mutable Array<int> _nodes_; // nodes associated with an element
private:
// do not define
AtomToNodeset();
};
/**
* @class AtomToElementset
* @brief mapping from all atoms to a subset of elements
*/
class AtomToElementset : public LargeToSmallAtomMap {
public:
// constructor
AtomToElementset(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, bool> * elementMask,
PerAtomQuantity<int> * atomElement = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomToElementset();
protected:
/** handles resetting of data */
virtual void reset() const;
/** set of nodes which are being regulated */
MatrixDependencyManager<DenseMatrix, bool> * elementMask_;
/** map from atom to element in which it resides */
PerAtomQuantity<int> * atomElement_;
/** pointer to the finite element engine */
const FE_Mesh * feMesh_;
private:
// do not define
AtomToElementset();
};
/**
* @class MappedAtomQuantity
* @brief generic reduced mapping
*/
class MappedAtomQuantity : public ProtectedMappedAtomQuantity<double> {
public:
// constructor
MappedAtomQuantity(ATC_Method * atc,
PerAtomQuantity<double> * source,
LargeToSmallAtomMap * map,
AtomType atomType = INTERNAL);
// destructor
virtual ~MappedAtomQuantity() {
source_->remove_dependence(this);
map_->remove_dependence(this);
};
protected:
/** handles resetting of data */
virtual void reset() const;
/** original quantity */
PerAtomQuantity<double> * source_;
/** mapping transfer */
LargeToSmallAtomMap * map_;
private:
// do not define
MappedAtomQuantity();
};
/**
* @class VelocitySquaredMapped
* @brief Class for computing the quantity |v|^2 on a subset of atoms
* (used for weights in the thermostat)
*/
class VelocitySquaredMapped : public ProtectedMappedAtomQuantity<double> {
public:
// constructor
VelocitySquaredMapped(ATC_Method *atc,
MatrixDependencyManager<DenseMatrix, int> * atomMap,
PerAtomQuantity<double> * atomVelocities = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~VelocitySquaredMapped();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic velocities */
PerAtomQuantity<double> * atomVelocities_;
private:
// do not define
VelocitySquaredMapped();
};
/**
* @class LambdaSquaredMapped
* @brief Class for computing the 2nd order RHS fractional step
* contribution to the equation for lambda, with appropriate weights
*/
class LambdaSquaredMapped : public ProtectedMappedAtomQuantity<double> {
public:
// constructor
LambdaSquaredMapped(ATC_Method *atc,
MatrixDependencyManager<DenseMatrix, int> * atomMap,
PerAtomQuantity<double> * atomMasses = NULL,
PerAtomQuantity<double> * atomVelocitiesSquared = NULL,
PerAtomQuantity<double> * atomLambdas = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~LambdaSquaredMapped();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic masses */
PerAtomQuantity<double> * atomMasses_;
/** atomic velocities squared */
PerAtomQuantity<double> * atomVelocitiesSquared_;
/** atomic lambdas */
PerAtomQuantity<double> * atomLambdas_;
private:
// do not define
LambdaSquaredMapped();
};
/**
* @class HeatCapacity
* @brief Class for the classical atomic heat capacity
*/
class HeatCapacity : public ConstantQuantity<double> {
public:
// constructor
HeatCapacity(ATC_Method * atc, AtomType atomType = INTERNAL);
// destructor
virtual ~HeatCapacity() {};
protected:
private:
// do not define
HeatCapacity();
};
/**
* @class AtomicVelocityRescaleFactor
* @brief Class for computing the atomic rescaling induced by the rescaling thermostat
*/
class AtomicVelocityRescaleFactor : public ProtectedAtomQuantity<double> {
public:
// constructor
AtomicVelocityRescaleFactor(ATC_Method * atc,
PerAtomQuantity<double> * atomLambdas = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomicVelocityRescaleFactor();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic masses */
FundamentalAtomQuantity * atomMasses_;
/** atomic lambdas */
PerAtomQuantity<double> * atomLambdas_;
private:
// do not define
AtomicVelocityRescaleFactor();
};
/**
* @class AtomicThermostatForce
* @brief Class for computing the atomic force induced by the GLC-based thermostats
*/
class AtomicThermostatForce : public ProtectedAtomQuantity<double> {
public:
// constructor
AtomicThermostatForce(ATC_Method * atc,
PerAtomQuantity<double> * atomLambdas = NULL,
PerAtomQuantity<double> * atomVelocities = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomicThermostatForce();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic lambdas */
PerAtomQuantity<double> * atomLambdas_;
/** atomic velocities */
PerAtomQuantity<double> * atomVelocities_;
private:
// do not define
AtomicThermostatForce();
};
/**
* @class AtomicKinetostatForceDisplacement
* @brief Class for computing the atomic force induced by the GLC-based kinetostats
*/
class AtomicKinetostatForceDisplacement : public ProtectedAtomQuantity<double> {
public:
// constructor
AtomicKinetostatForceDisplacement(ATC_Method * atc,
PerAtomQuantity<double> * atomLambda = NULL,
PerAtomQuantity<double> * atomMass = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomicKinetostatForceDisplacement();
protected:
/** handles resetting of data */
virtual void reset() const;
/** computes the multiplication factor assocaited with the controlled quantity being an integral of the degrees of freedom */
virtual double time_step_factor(double dt) const {return 1./dt/dt;};
/** atomic lambdas */
PerAtomQuantity<double> * atomLambda_;
/** atomic velocities */
PerAtomQuantity<double> * atomMass_;
private:
// do not define
AtomicKinetostatForceDisplacement();
};
/**
* @class AtomicKinetostatForceVelocity
* @brief Class for computing the atomic force induced by the GLC-based kinetostats
*/
class AtomicKinetostatForceVelocity : public AtomicKinetostatForceDisplacement {
public:
// constructor
AtomicKinetostatForceVelocity(ATC_Method * atc,
PerAtomQuantity<double> * atomLambda = NULL,
PerAtomQuantity<double> * atomMass = NULL,
AtomType atomType = INTERNAL) :
AtomicKinetostatForceDisplacement(atc,atomLambda,atomMass,atomType) {};
// destructor
virtual ~AtomicKinetostatForceVelocity() {};
protected:
/** computes the multiplication factor assocaited with the controlled quantity being an integral of the degrees of freedom */
virtual double time_step_factor(double dt) const {return 1./dt;};
private:
// do not define
AtomicKinetostatForceVelocity();
};
/**
* @class AtomicKinetostatForceStress
* @brief Class for computing the atomic force induced by the stress-based kinetostats
*/
class AtomicKinetostatForceStress : public ProtectedAtomQuantity<double> {
public:
// constructor
AtomicKinetostatForceStress(ATC_Method * atc,
PerAtomQuantity<double> * atomLambda = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~AtomicKinetostatForceStress();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic lambdas */
PerAtomQuantity<double> * atomLambda_;
private:
// do not define
AtomicKinetostatForceStress();
};
/**
* @class PerAtomKernelFunction
* @brief Class for computing the kernel function at each atom location
*/
class PerAtomKernelFunction : public ProtectedAtomSparseMatrix<double> {
public:
// constructor
PerAtomKernelFunction(ATC_Method * atc,
PerAtomQuantity<double> * atomPositions = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~PerAtomKernelFunction();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic coarse-graining positions */
PerAtomQuantity<double> * atomPositions_;
/** finite element engine */
const FE_Engine * feEngine_;
private:
// do not define
PerAtomKernelFunction();
};
/**
* @class PerAtomShapeFunction
* @brief Class for computing the shape function at each atom location
*/
class PerAtomShapeFunction : public ProtectedAtomSparseMatrix<double> {
public:
// constructor
PerAtomShapeFunction(ATC_Method * atc,
PerAtomQuantity<double> * atomPositions = NULL,
PerAtomQuantity<int> * atomElements = NULL,
AtomType atomType = INTERNAL);
// destructor
virtual ~PerAtomShapeFunction();
protected:
/** handles resetting of data */
virtual void reset() const;
/** atomic coarse-graining positions */
PerAtomQuantity<double> * atomPositions_;
/** atom to element map */
PerAtomQuantity<int> * atomElements_;
/** finite element engine */
const FE_Engine * feEngine_;
private:
// do not define
PerAtomShapeFunction();
- mutable DENS_MAT OLDPOS;
- mutable INT_ARRAY OLDELS;
-
};
/**
* @class LambdaCouplingMatrix
* @brief constructs the coupling matrix needed to solve for lambda, i.e. N in N^T w N L = b
*/
class LambdaCouplingMatrix : public ProtectedMappedAtomSparseMatrix<double> {
public:
// constructor
LambdaCouplingMatrix(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int> * nodeToOverlapMap = NULL,
SPAR_MAN * shapeFunction = NULL);
// destructor
virtual ~LambdaCouplingMatrix() {
shapeFunction_->remove_dependence(this);
nodeToOverlapMap_->remove_dependence(this);
};
protected:
/** does the actual computation of the quantity */
virtual void reset() const;
/** base shape function */
SPAR_MAN * shapeFunction_;
/** map from all nodes to regulated ones */
MatrixDependencyManager<DenseMatrix, int> * nodeToOverlapMap_;
private:
// do not define
LambdaCouplingMatrix();
};
/**
* @class LocalLambdaCouplingMatrix
* @brief constructs the coupling matrix needed to solve for lambda, i.e. N in N^T w N L = b
* when localization is being used for the constraint
*/
class LocalLambdaCouplingMatrix : public LambdaCouplingMatrix {
public:
// constructor
LocalLambdaCouplingMatrix(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int> * lambdaAtomMap = NULL,
MatrixDependencyManager<DenseMatrix, int> * nodeToOverlapMap = NULL,
SPAR_MAN * shapeFunction = NULL);
// destructor
virtual ~LocalLambdaCouplingMatrix() {
lambdaAtomMap_->remove_dependence(this);
};
protected:
/** does the actual computation of the quantity */
virtual void reset() const;
/** map from all atoms to regulated ones */
MatrixDependencyManager<DenseMatrix, int> * lambdaAtomMap_;
private:
// do not define
LocalLambdaCouplingMatrix();
};
/**
* @class GhostCouplingMatrix
* @brief constructs the modified shape functions used to compute the total forces between ghost and internal atoms
*/
class GhostCouplingMatrix : public LambdaCouplingMatrix {
public:
// constructor
GhostCouplingMatrix(ATC_Method * atc,
SPAR_MAN * shapeFunction,
SetDependencyManager<int> * subsetNodes,
MatrixDependencyManager<DenseMatrix, int> * nodeToOverlapMap = NULL);
// destructor
virtual ~GhostCouplingMatrix() {
subsetNodes_->remove_dependence(this);
};
protected:
/** does the actual computation of the quantity */
virtual void reset() const;
/** set of nodes which are being regulated */
SetDependencyManager<int> * subsetNodes_;
// workspace
mutable DENS_VEC _activeNodes_; // nodes which are being regulated are 1, otherwise 0
mutable DENS_VEC _weights_; // required weighting for each shape function row to enforce partition of unity
mutable DIAG_MAT _weightMatrix_; // diagonal with necessary scaling for partition of unity
private:
// do not define
GhostCouplingMatrix();
};
}
#endif
diff --git a/lib/atc/PerPairQuantity.cpp b/lib/atc/PerPairQuantity.cpp
index c600bcd14..fa3bbe37e 100644
--- a/lib/atc/PerPairQuantity.cpp
+++ b/lib/atc/PerPairQuantity.cpp
@@ -1,397 +1,370 @@
#include "PerPairQuantity.h"
#include "PerAtomQuantity.h"
#include "KernelFunction.h"
#include "FE_Mesh.h"
#include "Utility.h"
#include "Quadrature.h"
using ATC::HeartBeat;
+using std::pair;
+using std::map;
namespace ATC {
//==========================================================
PairMap::PairMap(LammpsInterface * lammpsInterface, int groupbit ):
lammpsInterface_(lammpsInterface),
groupbit_(groupbit),
nPairs_(0), nBonds_(0)
{
};
PairMap::~PairMap(void)
{
};
//==========================================================
PairMapNeighbor::PairMapNeighbor(LammpsInterface * lammpsInterface, int groupbit):
PairMap(lammpsInterface,groupbit)
{
};
-bool PairMapNeighbor::need_reset(void) const
-{
- int inum = lammpsInterface_->neighbor_list_inum();
- int *ilist = lammpsInterface_->neighbor_list_ilist();
- int *numneigh = lammpsInterface_->neighbor_list_numneigh();
- int **firstneigh = lammpsInterface_->neighbor_list_firstneigh();
- const int * mask = lammpsInterface_->atom_mask();
- pair< int,int > pair_ij;
- map< pair< int,int >,int >::iterator pairMapIterator;
-
- int npairs = 0;
- for (int i = 0; i < inum; i++) {
- int lammps_i = ilist[i];
- if (mask[lammps_i] & groupbit_) {
- for (int j = 0; j < numneigh[lammps_i]; j++) {
- int lammps_j = firstneigh[lammps_i][j];
- pair_ij.first = lammps_i;
- pair_ij.second = lammps_j;
- pairMapIterator = pairMap_.find(pair_ij);
- if (pairMapIterator == pairMap_.end()) {
- return true;
- }
- npairs++;
- }
- }
- }
- if (npairs != (int) pairMap_.size()) return true;
- nPairs_ = npairs;
- return false;
-}
void PairMapNeighbor::reset(void) const
{
int inum = lammpsInterface_->neighbor_list_inum();
int *ilist = lammpsInterface_->neighbor_list_ilist();
int *numneigh = lammpsInterface_->neighbor_list_numneigh();
int **firstneigh = lammpsInterface_->neighbor_list_firstneigh();
const int * mask = lammpsInterface_->atom_mask();
pairMap_.clear();
int pairIndex = nBonds_;
- pair< int,int > pair_ij;
+ std::pair< int,int > pair_ij;
for (int i = 0; i < inum; i++) {
int lammps_i = ilist[i];
if (mask[lammps_i] & groupbit_) {
for (int j = 0; j < numneigh[lammps_i]; j++) {
int lammps_j = firstneigh[lammps_i][j];
lammpsInterface_->neighbor_remap(lammps_j);
pair_ij.first = lammps_i; // alpha
pair_ij.second = lammps_j; // beta
pairMap_[pair_ij] = pairIndex;
pairIndex++;
}
}
}
nPairs_ = pairIndex;
+ needReset_ = false;
}
//==========================================================
PairMapBond::PairMapBond(LammpsInterface * lammpsInterface, int groupbit):
PairMap(lammpsInterface,groupbit)
{
};
//==========================================================
PairMapBoth::PairMapBoth(LammpsInterface * lammpsInterface, int groupbit):
PairMapNeighbor(lammpsInterface,groupbit)
{
};
//==========================================================
DensePerPairMatrix::DensePerPairMatrix(LammpsInterface * lammpsInterface,
const PairMap & pairMap,
int nCols):
lammpsInterface_(lammpsInterface),
pairMap_(pairMap),
nCols_(nCols)
{
};
//==========================================================
PairVirial::PairVirial(LammpsInterface * lammpsInterface,
const PairMap & pairMap, int nCols):
DensePerPairMatrix(lammpsInterface,pairMap,nCols)
{
};
//==========================================================
PairVirialEulerian::PairVirialEulerian(LammpsInterface * lammpsInterface,
const PairMap & pairMap):
PairVirial(lammpsInterface,pairMap,6)
{
};
void PairVirialEulerian::reset(void) const
{
int nPairs = pairMap_.size();
quantity_.reset(nPairs,nCols_);
double **xatom = lammpsInterface_->xatom();
for (ATOM_PAIR apair = pairMap_.start();
! pairMap_.finished(); apair=pairMap_++){
int lammps_a = (apair.first).first ;
int lammps_b = (apair.first).second;
int pairIndex = apair.second;
double * xa = xatom[lammps_a];
double * xb = xatom[lammps_b];
double delx = xa[0] - xb[0];
double dely = xa[1] - xb[1];
double delz = xa[2] - xb[2];
double rsq = delx*delx + dely*dely + delz*delz;
double fforce = 0;
lammpsInterface_->pair_force(apair,rsq,fforce);
quantity_(pairIndex,0)=-delx*delx*fforce;
quantity_(pairIndex,1)=-dely*dely*fforce;
quantity_(pairIndex,2)=-delz*delz*fforce;
quantity_(pairIndex,3)=-delx*dely*fforce;
quantity_(pairIndex,4)=-delx*delz*fforce;
quantity_(pairIndex,5)=-dely*delz*fforce;
}
}
//==========================================================
PairVirialLagrangian::PairVirialLagrangian(LammpsInterface * lammpsInterface,
const PairMap & pairMap,
double ** xRef):
// const PerAtomQuantity<double> * xRef):
PairVirial(lammpsInterface,pairMap,9),
xRef_(xRef)
{
};
void PairVirialLagrangian::reset(void) const
{
int nPairs = pairMap_.size();
quantity_.reset(nPairs,nCols_);
double **xatom = lammpsInterface_->xatom();
double ** xref = xRef_;
for (ATOM_PAIR apair = pairMap_.start();
! pairMap_.finished(); apair=pairMap_++){
int lammps_a = (apair.first).first ;
int lammps_b = (apair.first).second;
int pairIndex = apair.second;
double * xa = xatom[lammps_a];
double * xb = xatom[lammps_b];
double delx = xa[0] - xb[0];
double dely = xa[1] - xb[1];
double delz = xa[2] - xb[2];
double * Xa = xref[lammps_a];
double * Xb = xref[lammps_b];
double delX = Xa[0] - Xb[0];
double delY = Xa[1] - Xb[1];
double delZ = Xa[2] - Xb[2];
double rsq = delx*delx + dely*dely + delz*delz;
double fforce = 0;
lammpsInterface_->pair_force(apair,rsq,fforce);
quantity_(pairIndex,0)=-delx*fforce*delX;
quantity_(pairIndex,1)=-delx*fforce*delY;
quantity_(pairIndex,2)=-delx*fforce*delZ;
quantity_(pairIndex,3)=-dely*fforce*delX;
quantity_(pairIndex,4)=-dely*fforce*delY;
quantity_(pairIndex,5)=-dely*fforce*delZ;
quantity_(pairIndex,6)=-delz*fforce*delX;
quantity_(pairIndex,7)=-delz*fforce*delY;
quantity_(pairIndex,8)=-delz*fforce*delZ;
}
}
//==========================================================
PairPotentialHeatFlux::PairPotentialHeatFlux(LammpsInterface * lammpsInterface,
const PairMap & pairMap):
DensePerPairMatrix(lammpsInterface,pairMap,3)
{
};
//==========================================================
PairPotentialHeatFluxEulerian::PairPotentialHeatFluxEulerian(LammpsInterface * lammpsInterface,
const PairMap & pairMap):
PairPotentialHeatFlux(lammpsInterface,pairMap)
{
};
void PairPotentialHeatFluxEulerian::reset(void) const
{
int nPairs = pairMap_.size();
quantity_.reset(nPairs,nCols_);
double **xatom = lammpsInterface_->xatom();
double **vatom = lammpsInterface_->vatom();
for (ATOM_PAIR apair = pairMap_.start();
! pairMap_.finished(); apair=pairMap_++){
int lammps_a = (apair.first).first ;
int lammps_b = (apair.first).second;
int pairIndex = apair.second;
double * xa = xatom[lammps_a];
double * xb = xatom[lammps_b];
double delx = xa[0] - xb[0];
double dely = xa[1] - xb[1];
double delz = xa[2] - xb[2];
double rsq = delx*delx + dely*dely + delz*delz;
double fforce = 0;
lammpsInterface_->pair_force(apair,rsq,fforce);
double* v = vatom[lammps_a];
fforce *=delx*v[0] + dely*v[1] + delz*v[2];
quantity_(pairIndex,0)=fforce*delx;
quantity_(pairIndex,1)=fforce*dely;
quantity_(pairIndex,2)=fforce*delz;
}
}
//==========================================================
PairPotentialHeatFluxLagrangian::PairPotentialHeatFluxLagrangian(LammpsInterface * lammpsInterface,
const PairMap & pairMap, double ** xRef):
PairPotentialHeatFlux(lammpsInterface,pairMap),
xRef_(xRef)
{
};
void PairPotentialHeatFluxLagrangian::reset(void) const
{
int nPairs = pairMap_.size();
quantity_.reset(nPairs,nCols_);
double **xatom = lammpsInterface_->xatom();
double **vatom = lammpsInterface_->vatom();
for (ATOM_PAIR apair = pairMap_.start();
! pairMap_.finished(); apair=pairMap_++){
int lammps_a = (apair.first).first ;
int lammps_b = (apair.first).second;
int pairIndex = apair.second;
double * xa = xatom[lammps_a];
double * xb = xatom[lammps_b];
double delx = xa[0] - xb[0];
double dely = xa[1] - xb[1];
double delz = xa[2] - xb[2];
double * Xa = xRef_[lammps_a];
double * Xb = xRef_[lammps_b];
double delX = Xa[0] - Xb[0];
double delY = Xa[1] - Xb[1];
double delZ = Xa[2] - Xb[2];
double rsq = delx*delx + dely*dely + delz*delz;
double fforce = 0;
lammpsInterface_->pair_force(apair,rsq,fforce);
double* v = vatom[lammps_a];
fforce *=delx*v[0] + dely*v[1] + delz*v[2];
quantity_(pairIndex,0)=fforce*delX;
quantity_(pairIndex,1)=fforce*delY;
quantity_(pairIndex,2)=fforce*delZ;
}
}
//==========================================================
SparsePerPairMatrix::SparsePerPairMatrix(LammpsInterface * lammpsInterface,
const PairMap & pairMap):
lammpsInterface_(lammpsInterface),
pairMap_(pairMap)
{
};
//==========================================================
BondMatrix::BondMatrix(LammpsInterface * lammpsInterface,
const PairMap & pairMap, double ** x, const FE_Mesh * feMesh):
SparsePerPairMatrix(lammpsInterface,pairMap), x_(x), feMesh_(feMesh)
{
};
//==========================================================
BondMatrixKernel::BondMatrixKernel(LammpsInterface * lammpsInterface,
const PairMap & pairMap,
double ** x,
const FE_Mesh * feMesh,
const KernelFunction * kernelFunction):
BondMatrix(lammpsInterface,pairMap,x,feMesh),
kernelFunction_(kernelFunction)
{
};
void BondMatrixKernel::reset(void) const
{
int nPairs = pairMap_.size(); // needs to come after quantity for reset
int nNodes = feMesh_->num_nodes_unique();
quantity_.reset(nNodes,nPairs);
double lam1,lam2;
- pair< int,int > pair_jk;
+ std::pair< int,int > pair_jk;
int heartbeatFreq = (nNodes <= 10 ? 1 : (int) nNodes / 10);
HeartBeat beat("computing bond matrix ",heartbeatFreq);
beat.start();
DENS_VEC xa(3),xI(3),xaI(3),xb(3),xbI(3),xba(3);
double invVol = kernelFunction_->inv_vol();
for (int I = 0; I < nNodes; I++) {
beat.next();
xI = feMesh_->nodal_coordinates(I);
if (!kernelFunction_->node_contributes(xI)) { continue; }
for (ATOM_PAIR apair = pairMap_.start();
! pairMap_.finished(); apair=pairMap_++){
int lammps_a = (apair.first).first ;
int lammps_b = (apair.first).second;
xa.copy(x_[lammps_a],3);
xaI = xa - xI;
lammpsInterface_->periodicity_correction(xaI.ptr());
xb.copy(x_[lammps_b],3);
xba = xb - xa;
xbI = xba + xaI;
kernelFunction_->bond_intercepts(xaI,xbI,lam1,lam2);
if (lam1 < lam2) {
double bondValue = invVol*(kernelFunction_->bond(xaI,xbI,lam1,lam2));
int pairIndex = apair.second;
quantity_.add(I,pairIndex,bondValue);
} // if lam1 < lam2
} // pair map
} // end nodes loop
quantity_.compress();
beat.finish();
}
//==========================================================
BondMatrixPartitionOfUnity::BondMatrixPartitionOfUnity(LammpsInterface * lammpsInterface,
const PairMap & pairMap, double ** x, const FE_Mesh * feMesh,
const DIAG_MAN * invVols):
BondMatrix(lammpsInterface,pairMap,x,feMesh),
invVols_(invVols)
{
ATC::Quadrature::instance()->set_line_quadrature(lineNgauss_,lineXg_,lineWg_);
double lam1 = 0.0, lam2 = 1.0;
double del_lambda = 0.5*(lam2 - lam1);
double avg_lambda = 0.5*(lam2 + lam1);
for (int i = 0; i < lineNgauss_; i++) {
double lambda = del_lambda*lineXg_[i] +avg_lambda;
lineXg_[i] = lambda;
lineWg_[i] *= 0.5;
}
};
void BondMatrixPartitionOfUnity::reset(void) const
{
int nNodes = feMesh_->num_nodes_unique();
int nPairs = pairMap_.size();
quantity_.reset(nNodes,nPairs);
int nodes_per_element = feMesh_->num_nodes_per_element();
Array<int> node_list(nodes_per_element);
DENS_VEC shp(nodes_per_element);
- pair< int,int > pair_jk;
+ std::pair< int,int > pair_jk;
int heartbeatFreq = (int) nPairs / 10;
HeartBeat beat("computing bond matrix ",heartbeatFreq);
beat.start();
DENS_VEC xa(3),xb(3),xab(3),xlambda(3);
for (ATOM_PAIR apair = pairMap_.start();
! pairMap_.finished(); apair=pairMap_++){
beat.next();
int lammps_a = (apair.first).first ;
int lammps_b = (apair.first).second;
int pairIndex = apair.second;
xa.copy(x_[lammps_a],3);
xb.copy(x_[lammps_b],3);
xab = xa - xb;
for (int i = 0; i < lineNgauss_; i++) {
double lambda = lineXg_[i];
xlambda = lambda*xab + xb;
lammpsInterface_->periodicity_correction(xlambda.ptr());
feMesh_->shape_functions(xlambda,shp,node_list);
// accumulate to nodes whose support overlaps the integration point
for (int I = 0; I < nodes_per_element; I++) {
int Inode = node_list(I);
double inv_vol = (invVols_->quantity())(Inode,Inode);
double val = inv_vol*shp(I)*lineWg_[i];
quantity_.add(Inode,pairIndex,val);
}
}
}
quantity_.compress();
beat.finish();
}
//==========================================================
}
diff --git a/lib/atc/PerPairQuantity.h b/lib/atc/PerPairQuantity.h
index 8178d2ff2..2c391f99a 100644
--- a/lib/atc/PerPairQuantity.h
+++ b/lib/atc/PerPairQuantity.h
@@ -1,421 +1,425 @@
// A class for defining atomic quantities for interscale operations
#ifndef PER_PAIR_QUANTITY_H
#define PER_PAIR_QUANTITY_H
// ATC_Method headers
#include "LammpsInterface.h"
#include "DependencyManager.h"
#include "PerAtomQuantity.h"
#include <map>
-
-using std::map;
-using std::pair;
+#include <utility>
+#include <string>
namespace ATC {
/** mapping of atomic pairs to pair index value */
- typedef map< pair< int,int >,int > PAIR_MAP;
- typedef map< pair< int,int >,int >::const_iterator PAIR_MAP_ITERATOR;
- typedef pair< pair< int,int >,int > ATOM_PAIR;
+ typedef std::map< std::pair< int,int >,int > PAIR_MAP;
+ typedef std::map< std::pair< int,int >,int >::const_iterator PAIR_MAP_ITERATOR;
+ typedef std::pair< std::pair< int,int >,int > ATOM_PAIR;
/**
* @class PairMap
* @brief Base class maps of pair indices to a single index
*/
class PairMap : public DependencyManager {
public:
PairMap(LammpsInterface * lammpsInterface, int groupbit);
virtual ~PairMap(void);
- virtual bool need_reset(void) const = 0;
+
virtual void reset(void) const = 0;
void quantity() {};
void set_quantity() { throw ATC_Error("inappropriate access to pair map");}
+
+ // lammps communication
+ virtual void post_exchange() {this->force_reset();};
+ virtual void rest_nlocal() {this->force_reset();};
+
// iterator interface
int size(void) const {
- if (need_reset()) reset();
+ if (this->need_reset()) reset();
return nPairs_+nBonds_;
}
int num_bonds(void) const { return nBonds_; }
virtual ATOM_PAIR start() const = 0; // const reset / non-const call propagte reset
virtual ATOM_PAIR next() const = 0;
//ATOM_PAIR& operator++ () {return next();} // prefix ++: no parameter, returns a reference
ATOM_PAIR operator++ (int) const {return next();} // postfix ++: dummy parameter, returns a value
virtual bool finished() const = 0;
protected:
LammpsInterface * lammpsInterface_;
int groupbit_;
mutable int nPairs_;
mutable int nBonds_;
private:
PairMap();// do not define
};
class PairMapNeighbor : public PairMap {
public:
PairMapNeighbor(LammpsInterface * lammpsInterface, int groupbit);
virtual ~PairMapNeighbor(void) {};
- virtual bool need_reset(void) const;
+
virtual void reset(void) const;
virtual ATOM_PAIR start(void) const {
- if (need_reset()) reset();
+ if (this->need_reset()) reset();
iterator_ = pairMap_.begin(); return *iterator_;}
virtual ATOM_PAIR next(void) const {
iterator_++; return *iterator_;}
virtual bool finished() const {
return (iterator_==pairMap_.end());}
protected:
mutable PAIR_MAP pairMap_;
private:
mutable PAIR_MAP_ITERATOR iterator_;
PairMapNeighbor();// do not define
};
class PairMapBond : public PairMap {
public:
PairMapBond(LammpsInterface * lammpsInterface, int groupbit);
virtual ~PairMapBond(void) {};
virtual bool need_reset(void) const { return true;}
virtual void reset(void) const {nBonds_ = lammpsInterface_->bond_list_length(); };
ATOM_PAIR start() const {
reset();
// if (needs_reset()) propagate_reset()
index_ = 0; return atom_pair(index_);}
ATOM_PAIR next() const {return atom_pair(++index_);}
bool finished() const { return index_==nBonds_; }
ATOM_PAIR atom_pair(int n) const {
if ( !(n<nBonds_) ) {
- pair<int,int> pair_ij(-1,-1); // this is the "end" value
+ std::pair<int,int> pair_ij(-1,-1); // this is the "end" value
ATOM_PAIR p(pair_ij,n);
return p;
}
int * bond = (lammpsInterface_->bond_list())[n];
- pair<int,int> pair_ij(bond[0],bond[1]);
+ std::pair<int,int> pair_ij(bond[0],bond[1]);
ATOM_PAIR p(pair_ij,n);
return p;
}
private:
mutable int index_;
PairMapBond();// do not define
};
class PairMapBoth : public PairMapNeighbor {
public:
PairMapBoth(LammpsInterface * lammpsInterface, int groupbit);
virtual ~PairMapBoth(void) {};
virtual bool need_reset(void) const {
nBonds_ = lammpsInterface_->bond_list_length();
return PairMapNeighbor::need_reset();
}
virtual void reset(void) const {
nBonds_ = lammpsInterface_->bond_list_length();
PairMapNeighbor::reset();
}
virtual ATOM_PAIR start(void) const {
if (need_reset()) reset();
index_ = 0;
iterator_ = pairMap_.begin();
return atom_pair(index_); // start with bonds
}
virtual ATOM_PAIR next(void) const {
++index_;
if (index_ < nBonds_) { return atom_pair(index_);}
else { if (index_>nBonds_) iterator_++; return *iterator_; }
}
ATOM_PAIR atom_pair(int n) const {
int * bond = (lammpsInterface_->bond_list())[n];
- pair<int,int> pair_ij(bond[0],bond[1]);
+ std::pair<int,int> pair_ij(bond[0],bond[1]);
ATOM_PAIR p(pair_ij,n);
return p;
}
virtual bool finished() const {
return (iterator_==pairMap_.end());}
private:
mutable int index_;
mutable PAIR_MAP_ITERATOR iterator_;
PairMapBoth();// do not define
};
/**
* @class DensePerPairQuantity
* @brief Base class for objects that manage pair/bond quantities
*/
class DensePerPairMatrix : public MatrixDependencyManager<DenseMatrix, double> {
public:
// constructor
DensePerPairMatrix(LammpsInterface * lammpsInterface,
const PairMap & pairMap,
int nCols = 1);
// destructor
virtual ~DensePerPairMatrix(){};
/** access to a constant dense matrix of the quantity */
virtual const DenseMatrix<double> & quantity() const
{this->reset(); return MatrixDependencyManager<DenseMatrix, double>::quantity();};
/** access to a non-constant dens matrix of the quantity */
virtual DenseMatrix<double> & set_quantity()
{this->reset(); return MatrixDependencyManager<DenseMatrix, double>::set_quantity();}
/** number of columns in quantity */
INDEX nCols() const {return nCols_;};
/** resets data, if necessary */
virtual void reset() const = 0;
protected:
/** pointer to access Lammps data */
LammpsInterface * lammpsInterface_;
/** reference to pair map */
const PairMap & pairMap_;
/** number of columns of the per atom quantity -static */
int nCols_;
private:
DensePerPairMatrix(); // do not define
};
/**
* @class PairVirial
* @brief f_ab (x) x_ab where (ab) -> p
*/
class PairVirial : public DensePerPairMatrix {
public:
// constructor
PairVirial(LammpsInterface * lammpsInterface,
const PairMap & pairMap, int nCols);
// destructor
virtual ~PairVirial(){};
/** resets data, if necessary */
virtual void reset() const = 0;
private:
PairVirial(void); // do not define
};
/**
* @class PairVirial
* @brief f_ab (x) x_ab where (ab) -> p
*/
class PairVirialEulerian : public PairVirial {
public:
// constructor
PairVirialEulerian(LammpsInterface * lammpsInterface,
const PairMap & pairMap);
// destructor
virtual ~PairVirialEulerian(){};
/** resets data, if necessary */
virtual void reset() const;
private:
PairVirialEulerian(void); // do not define
};
class PairVirialLagrangian : public PairVirial {
public:
// constructor
PairVirialLagrangian(LammpsInterface * lammpsInterface,
const PairMap & pairMap,
double ** xRef);
// const PerAtomQuantity<double> * x0);
// destructor
virtual ~PairVirialLagrangian(){};
/** resets data, if necessary */
virtual void reset() const;
protected:
double ** xRef_; // note difficult to make a ** const
// const PerAtomQuantity<double> * xRef_;
private:
PairVirialLagrangian(void); // do not define
};
/**`
* @class PairPotentialHeatFlux
* @brief f_ab v_b where (ab) -> p
*/
class PairPotentialHeatFlux : public DensePerPairMatrix {
public:
// constructor
PairPotentialHeatFlux(LammpsInterface * lammpsInterface,
const PairMap & pairMap);
// destructor
virtual ~PairPotentialHeatFlux(){};
/** resets data, if necessary */
virtual void reset() const =0;
private:
PairPotentialHeatFlux(void); // do not define
};
class PairPotentialHeatFluxEulerian : public PairPotentialHeatFlux {
public:
// constructor
PairPotentialHeatFluxEulerian(LammpsInterface * lammpsInterface,
const PairMap & pairMap);
// destructor
virtual ~PairPotentialHeatFluxEulerian(){};
/** resets data, if necessary */
virtual void reset() const;
private:
PairPotentialHeatFluxEulerian(void); // do not define
};
class PairPotentialHeatFluxLagrangian : public PairPotentialHeatFlux {
public:
// constructor
PairPotentialHeatFluxLagrangian(LammpsInterface * lammpsInterface,
const PairMap & pairMap, double ** xRef);
// destructor
virtual ~PairPotentialHeatFluxLagrangian(){};
/** resets data, if necessary */
virtual void reset() const;
protected:
double ** xRef_; // note difficult to make a ** const
//const PerAtomQuantity<double> * x0_;
private:
PairPotentialHeatFluxLagrangian(void); // do not define
};
/**
* @class SparsePerPairMatrix
* @brief Base class for objects that manage pair/bond quantities
*/
class SparsePerPairMatrix : public MatrixDependencyManager<SparseMatrix, double> {
public:
// constructor
SparsePerPairMatrix(LammpsInterface * lammpsInterface,
const PairMap & pairMap);
// destructor
virtual ~SparsePerPairMatrix(){};
/** access to a constant dense matrix of the quantity */
virtual const SparseMatrix<double> & quantity() const
{reset(); return MatrixDependencyManager<SparseMatrix, double>::quantity();};
/** access to a non-constant dens matrix of the quantity */
virtual SparseMatrix<double> & set_quantity()
{reset(); return MatrixDependencyManager<SparseMatrix, double>::set_quantity();}
/** resets data, if necessary */
virtual void reset() const = 0;
protected:
/** pointer to access Lammps data */
LammpsInterface * lammpsInterface_;
/** reference to pair map */
const PairMap & pairMap_;
private:
SparsePerPairMatrix(); // do not define
};
/**
* @class BondMatrix
* @brief Hardy's B_Iab wher (ab) -> p
*/
class BondMatrix : public SparsePerPairMatrix {
public:
// constructor
BondMatrix(LammpsInterface * lammpsInterface,
const PairMap & pairMap, double ** x_, const class FE_Mesh * feMesh);
// destructor
virtual ~BondMatrix(){};
/** resets data, if necessary */
virtual void reset() const = 0;
protected:
double ** x_;
const class FE_Mesh * feMesh_;
private:
BondMatrix(void); // do not define
};
/**
* @class BondMatrixKernel
* @brief Hardy's B_Iab wher (ab) -> p
*/
class BondMatrixKernel : public BondMatrix {
public:
// constructor
BondMatrixKernel(LammpsInterface * lammpsInterface,
const PairMap & pairMap,
double ** x,
const class FE_Mesh * feMesh,
const class KernelFunction * kernelFunction);
// destructor
virtual ~BondMatrixKernel(){};
/** resets data, if necessary */
virtual void reset() const;
protected:
const class KernelFunction * kernelFunction_;
private:
BondMatrixKernel(void); // do not define
};
/**
* @class BondMatrixPartitionOfUnity
* @brief Hardy's B_Iab wher (ab) -> p
*/
class BondMatrixPartitionOfUnity : public BondMatrix {
public:
// constructor
BondMatrixPartitionOfUnity(LammpsInterface * lammpsInterface,
const PairMap & pairMap,
double ** x,
const class FE_Mesh * feMesh,
const DIAG_MAN * invVol);
// destructor
virtual ~BondMatrixPartitionOfUnity(){};
/** resets data, if necessary */
virtual void reset() const;
protected:
const DIAG_MAN * invVols_;
static const int lineNgauss_ = 10;
double lineXg_[lineNgauss_], lineWg_[lineNgauss_];
private:
BondMatrixPartitionOfUnity(void); // do not define
};
}
#endif
diff --git a/lib/atc/PhysicsModel.cpp b/lib/atc/PhysicsModel.cpp
index 4e9cf645c..77cc41e97 100644
--- a/lib/atc/PhysicsModel.cpp
+++ b/lib/atc/PhysicsModel.cpp
@@ -1,435 +1,443 @@
#include "PhysicsModel.h"
#include "WeakEquation.h"
#include "WeakEquationDiffusion.h"
#include "WeakEquationChargeDiffusion.h"
#include "WeakEquationMassDiffusion.h"
#include "WeakEquationElectronContinuity.h"
#include "WeakEquationElectronMomentum.h"
#include "WeakEquationElectronTemperature.h"
#include "WeakEquationMomentum.h"
#include "WeakEquationPhononTemperature.h"
#include "WeakEquationPoisson.h"
#include "WeakEquationSchrodinger.h"
-
#include "ATC_Coupling.h" // for tangent operator
-
-#include <string>
#include <iostream>
#include <fstream>
+#include <sstream>
+#include <utility>
-namespace ATC {
+using ATC_Utility::command_line;
+using ATC_Utility::to_lower;
+using std::fstream;
+using std::stringstream;
+using std::pair;
+using std::string;
+using std::map;
+using std::set;
+using std::vector;
+namespace ATC {
//---------------------------------------------------------------------
// PhysicsModel
//---------------------------------------------------------------------
PhysicsModel::PhysicsModel(string fileName)
{
parse_material_file(fileName);
}
PhysicsModel::~PhysicsModel()
{
{
vector< Material* >::iterator iter;
for (iter = materials_.begin(); iter != materials_.end(); iter++) {
Material * mat = *iter;
if (mat) delete mat;
}
}
{
map<FieldName, WeakEquation* >::iterator iter;
for (iter = weakEqns_.begin(); iter != weakEqns_.end(); iter++) {
WeakEquation * weakEq = iter->second;
if (weakEq) delete weakEq;
}
}
}
void PhysicsModel::parse_material_file(string fileName)
{
vector< Material* >::iterator iter;
for (iter = materials_.begin(); iter != materials_.end(); iter++) {
Material * mat = *iter;
if (mat) delete mat;
}
LammpsInterface::UnitsType lammpsUnits = ATC::LammpsInterface::instance()->units_style();
fstream fileId(fileName.c_str(), std::ios::in);
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
int index = 0;
while(fileId.good()) {
command_line(fileId, line);
if (line.size() == 0 || line[0] == "#") continue;
if (line[0] == "material") {
string tag = line[1];
Material * mat = new Material(tag,fileId);
materials_.push_back(mat);
materialNameToIndexMap_[tag] = index++;
if (line.size() > 2) {
string units = line[2];
stringstream ss;
ss << "WARNING: material units " << units << " do not match lammps";
if (units == "SI") {
if (lammpsUnits != LammpsInterface::SI)
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
else if (units == "real") {
if (lammpsUnits != LammpsInterface::REAL )
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
else if (units == "metal") {
if (lammpsUnits != LammpsInterface::METAL )
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
else {
throw ATC_Error("unknown units in material file");
}
}
else {
throw ATC_Error("units need to be specfied in material file");
}
}
}
if (int(materials_.size()) == 0) {
throw ATC_Error("No materials were defined"); }
stringstream ss;
ss << int(materials_.size()) << " materials defined from " << fileName;
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
fileId.close();
}
void PhysicsModel::initialize(void)
{
// initialize materials
vector< Material* >::const_iterator iter;
for (iter = materials_.begin(); iter != materials_.end(); iter++) {
Material * mat = *iter;
mat->initialize();
}
// set up null (weakEq, material) registry
null_.reset(ATC::NUM_FIELDS, materials_.size());
null_ = false;
// initialize weak equations
map<FieldName, WeakEquation * >::const_iterator weak;
for (weak = weakEqns_.begin(); weak!=weakEqns_.end(); weak++) {
FieldName fieldName = weak->first;
WeakEquation * weakEq = weak->second;
set<string> needs= weakEq->needs_material_functions();
vector< Material* >::iterator iter;
for (iter = materials_.begin(); iter != materials_.end(); iter++) {
Material * mat = *iter;
if (! (mat->check_registry(needs)) ) {
string tag = mat->label();
int matId = materialNameToIndexMap_[tag];
null_(fieldName,matId) = true;
stringstream ss;
ss << "WARNING: physics model: [" << type_ << "], material: [" << tag
<< "] does not provide all interfaces for <"
<< field_to_string(fieldName)
<< "> physics and will be treated as null ";
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
// if (noNull_)
//throw ATC_Error("material does not provide all interfaces for physics");
}
}
}
}
int PhysicsModel::material_index(const string & name) const
{
string tag = name;
to_lower(tag); // this is an artifact of StringManip parsing
map<string,int>::const_iterator iter;
iter = materialNameToIndexMap_.find(tag);
if (iter == materialNameToIndexMap_.end()) {
throw ATC_Error("No material named "+name+" found");
}
int index = iter->second;
return index;
}
bool PhysicsModel::parameter_value(const string& name, double& value,
const int imat) const
{
// search owned parameters
value = 0.0;
map<string,double>::const_iterator it = parameterValues_.find(name);
if (it != parameterValues_.end()) {
value = it->second;
return true;
}
// interogate material models
bool found = materials_[imat]->parameter(name,value);
return found;
}
void PhysicsModel::num_fields(map<FieldName,int> & fieldSizes,
Array2D<bool> & rhsMask) const
{
map<FieldName, WeakEquation * >::const_iterator itr;
for (itr = weakEqns_.begin(); itr!=weakEqns_.end(); itr++) {
FieldName field = itr->first;
WeakEquation * weakEq = itr->second;
int size = weakEq->field_size();
fieldSizes[field] = size;
rhsMask(field,FLUX) = weakEq->has_B_integrand();
rhsMask(field,SOURCE) = weakEq->has_N_integrand();
}
}
//---------------------------------------------------------------------
// PhysicsModelThermal
//---------------------------------------------------------------------
PhysicsModelThermal::PhysicsModelThermal(string filename):
PhysicsModel(filename)
{
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperature();
}
//---------------------------------------------------------------------
// PhysicsModelElastic
//---------------------------------------------------------------------
PhysicsModelElastic::PhysicsModelElastic(string filename):
PhysicsModel(filename)
{
weakEqns_[VELOCITY] = new WeakEquationMomentum();
}
//---------------------------------------------------------------------
// PhysicsModelThermoElastic
//---------------------------------------------------------------------
PhysicsModelThermoElastic::PhysicsModelThermoElastic(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "thermo-elastic";
weakEqns_[VELOCITY] = new WeakEquationMomentum();
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperature();
}
//---------------------------------------------------------------------
// PhysicsModelShear
//---------------------------------------------------------------------
PhysicsModelShear::PhysicsModelShear(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "shear";
weakEqns_[VELOCITY] = new WeakEquationMomentumDiffusion();
}
//---------------------------------------------------------------------
// PhysicsModelThermoShear
//---------------------------------------------------------------------
PhysicsModelThermoShear::PhysicsModelThermoShear(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "thermo-shear";
weakEqns_[VELOCITY] = new WeakEquationMomentumDiffusion();
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperature();
}
//---------------------------------------------------------------------
// PhysicsModelSpecies
//---------------------------------------------------------------------
PhysicsModelSpecies::PhysicsModelSpecies(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "species";
weakEqns_[MASS_DENSITY] = new WeakEquationMassDiffusion();
weakEqns_[SPECIES_CONCENTRATION] = new WeakEquationDiffusion();
}
//---------------------------------------------------------------------
// PhysicsModelSpeciesElectrostatic
//---------------------------------------------------------------------
PhysicsModelSpeciesElectrostatic::PhysicsModelSpeciesElectrostatic(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "species electrostatic";
weakEqns_[MASS_DENSITY] = new WeakEquationMassDiffusion();
weakEqns_[CHARGE_DENSITY] = new WeakEquationChargeDiffusion();
weakEqns_[SPECIES_CONCENTRATION]= new WeakEquationDiffusion();
weakEqns_[ELECTRIC_POTENTIAL] = new WeakEquationPoissonConstantRHS();
}
//---------------------------------------------------------------------
// PhysicsModelTwoTemperature
//---------------------------------------------------------------------
PhysicsModelTwoTemperature::PhysicsModelTwoTemperature(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "two-temperature";
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperatureExchange();
weakEqns_[ELECTRON_TEMPERATURE] = new WeakEquationElectronTemperature();
}
//---------------------------------------------------------------------
// PhysicsModelDriftDiffusion
//---------------------------------------------------------------------
PhysicsModelDriftDiffusion::PhysicsModelDriftDiffusion(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "drift-diffusion";
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperatureExchange();
weakEqns_[ELECTRON_TEMPERATURE] = new WeakEquationElectronTemperatureJouleHeating();
weakEqns_[ELECTRON_DENSITY] = new WeakEquationElectronContinuity();
weakEqns_[ELECTRIC_POTENTIAL] = new WeakEquationPoissonConstantRHS();
}
//---------------------------------------------------------------------
// PhysicsModelDriftDiffusionEquilibrium
//---------------------------------------------------------------------
PhysicsModelDriftDiffusionEquilibrium::PhysicsModelDriftDiffusionEquilibrium(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "equilibrium drift-diffusion";
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperatureExchange();
weakEqns_[ELECTRON_TEMPERATURE] = new WeakEquationElectronTemperatureJouleHeating();
weakEqns_[ELECTRON_DENSITY] = new WeakEquationElectronEquilibrium();
weakEqns_[ELECTRIC_POTENTIAL] = new WeakEquationPoisson();
}
//---------------------------------------------------------------------
// PhysicsModelDriftDiffusionSchrodinger
//---------------------------------------------------------------------
PhysicsModelDriftDiffusionSchrodinger::PhysicsModelDriftDiffusionSchrodinger(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "schrodinger drift-diffusion";
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperatureExchange();
weakEqns_[ELECTRON_TEMPERATURE] = new WeakEquationElectronTemperatureJouleHeating();
weakEqns_[ELECTRON_DENSITY] = new WeakEquationElectronEquilibrium();
weakEqns_[ELECTRIC_POTENTIAL] = new WeakEquationPoisson();
weakEqns_[ELECTRON_WAVEFUNCTION]= new WeakEquationSchrodinger();
}
//---------------------------------------------------------------------
// PhysicsModelDriftDiffusionSchrodingerSlice
//---------------------------------------------------------------------
PhysicsModelDriftDiffusionSchrodingerSlice::PhysicsModelDriftDiffusionSchrodingerSlice(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "schrodinger drift-diffusion slice";
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperatureExchange();
weakEqns_[ELECTRON_TEMPERATURE] = new WeakEquationElectronTemperatureJouleHeating();
weakEqns_[ELECTRON_DENSITY] = new WeakEquationElectronEquilibrium();
weakEqns_[ELECTRIC_POTENTIAL] = new WeakEquationPoissonConstantRHS();
weakEqns_[ELECTRON_WAVEFUNCTION]= new WeakEquationSchrodinger();
}
//---------------------------------------------------------------------
// PhysicsModelDriftDiffusionConvection
//---------------------------------------------------------------------
PhysicsModelDriftDiffusionConvection::PhysicsModelDriftDiffusionConvection(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "convection drift-diffusion";
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperatureExchange();
weakEqns_[ELECTRON_TEMPERATURE] = new WeakEquationElectronTemperatureConvection();
weakEqns_[ELECTRON_DENSITY] = new WeakEquationElectronContinuity();
weakEqns_[ELECTRON_VELOCITY] = new WeakEquationElectronMomentumDDM();
weakEqns_[ELECTRIC_POTENTIAL] = new WeakEquationPoissonConstantRHS();
}
//---------------------------------------------------------------------
// PhysicsModelDriftDiffusionConvectionEquilibrium
//---------------------------------------------------------------------
PhysicsModelDriftDiffusionConvectionEquilibrium::PhysicsModelDriftDiffusionConvectionEquilibrium(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "equilibrium convection drift-diffusion";
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperatureExchange();
weakEqns_[ELECTRON_TEMPERATURE] = new WeakEquationElectronTemperatureConvection();
weakEqns_[ELECTRON_DENSITY] = new WeakEquationElectronEquilibrium();
weakEqns_[ELECTRON_VELOCITY] = new WeakEquationElectronMomentumDDM();
weakEqns_[ELECTRIC_POTENTIAL] = new WeakEquationPoisson();
}
//---------------------------------------------------------------------
// PhysicsModelDriftDiffusionConvectionSchrodinger
//---------------------------------------------------------------------
PhysicsModelDriftDiffusionConvectionSchrodinger::PhysicsModelDriftDiffusionConvectionSchrodinger(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "schrodinger convection drift-diffusion";
weakEqns_[TEMPERATURE] = new WeakEquationPhononTemperatureExchange();
weakEqns_[ELECTRON_TEMPERATURE] = new WeakEquationElectronTemperatureConvection();
weakEqns_[ELECTRON_DENSITY] = new WeakEquationElectronEquilibrium();
weakEqns_[ELECTRON_VELOCITY] = new WeakEquationElectronMomentumDDM();
weakEqns_[ELECTRIC_POTENTIAL] = new WeakEquationPoissonConstantRHS();
weakEqns_[ELECTRON_WAVEFUNCTION] = new WeakEquationSchrodinger();
}
//---------------------------------------------------------------------
// PhysicsModelElectrostatic
//---------------------------------------------------------------------
PhysicsModelElectrostatic::PhysicsModelElectrostatic(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "electrostatic";
weakEqns_[VELOCITY] = new WeakEquationMomentumElectrostatic();
weakEqns_[ELECTRON_DENSITY] = new WeakEquationElectronContinuity();
weakEqns_[ELECTRIC_POTENTIAL] = new WeakEquationPoissonConstantRHS();
}
//---------------------------------------------------------------------
// PhysicsModelElectrostaticEquilibrium
//---------------------------------------------------------------------
PhysicsModelElectrostaticEquilibrium::PhysicsModelElectrostaticEquilibrium(string filename):
PhysicsModel(filename)
{
PhysicsModel::type_ = "equilibrium electrostatic";
weakEqns_[VELOCITY] = new WeakEquationMomentumElectrostatic();
weakEqns_[ELECTRON_DENSITY] = new WeakEquationElectronEquilibrium();
weakEqns_[ELECTRIC_POTENTIAL] = new WeakEquationPoisson();
}
//-------------------------------------------------------------------
// PhysicsModelTangentOperator
//-------------------------------------------------------------------
PhysicsModelTangentOperator::PhysicsModelTangentOperator(ATC_Coupling * atc,
const PhysicsModel * physicsModel,
Array2D<bool> & rhsMask,
IntegrationDomainType integrationType,
FIELDS & rhs,
FIELDS & fields,
FieldName fieldName,
const int dof)
:TangentOperator(),
atc_(atc),
physicsModel_(physicsModel),
rhsMask_(rhsMask),
integrationType_(integrationType),
rhs_(rhs),
fields_(fields),
fieldName_(fieldName),
dof_(dof)
{
};
PhysicsModelTangentOperator::PhysicsModelTangentOperator(ATC_Coupling * atc,
const PhysicsModel * physicsModel,
Array2D<bool> & rhsMask,
IntegrationDomainType integrationType,
FieldName fieldName,
const int dof)
:TangentOperator(),
atc_(atc),
physicsModel_(physicsModel),
rhsMask_(rhsMask),
integrationType_(integrationType),
rhs_(atc_->rhs()),
fields_(atc_->fields()),
fieldName_(fieldName),
dof_(dof)
{
};
void PhysicsModelTangentOperator::function(const VECTOR & x, DENS_VEC & r)
{
CLON_VEC f = column(fields_[fieldName_].set_quantity(),dof_);
f = x;
atc_->compute_rhs_vector(rhsMask_, fields_, rhs_, integrationType_, physicsModel_);
CLON_VEC rhsv = column(rhs_[fieldName_].quantity(),dof_);
r = rhsv;
}
void PhysicsModelTangentOperator::tangent(const VECTOR & x, DENS_VEC & r,
MATRIX & K)
{
function(x,r);
pair<FieldName,FieldName> row_col(fieldName_,fieldName_);
const FIELDS & fields = fields_;
atc_->compute_rhs_tangent(row_col, rhsMask_, fields , stiffness_, integrationType_, physicsModel_);
K = stiffness_.dense_copy();
}
}; // end namespace
diff --git a/lib/atc/PhysicsModel.h b/lib/atc/PhysicsModel.h
index a794d7d89..86b8e2773 100644
--- a/lib/atc/PhysicsModel.h
+++ b/lib/atc/PhysicsModel.h
@@ -1,322 +1,321 @@
#ifndef PHYSICS_MODEL_H
#define PHYSICS_MODEL_H
#include <map>
+#include <vector>
+#include <string>
#include "Array2D.h"
#include "MatrixLibrary.h"
#include "ATC_Error.h"
#include "Material.h"
#include "WeakEquation.h"
#include "NonLinearSolver.h"
#include "ATC_TypeDefs.h"
#include "Utility.h"
-using namespace std;
-using namespace ATC_Utility;
-
namespace ATC
{
class ATC_Coupling;
//-------------------------------------------------------------------
// @class PhysicsModel
//-------------------------------------------------------------------
/**
* @brief An adaptor for the FE_Engine of the specific weak form of
* the continuum PDE for the FE_Engine.
* It is assumed that the PDE fits this template:
* DENSITY(FIELDS) FIELD_RATE
* = DIV FLUX(FIELDS, GRAD_FIELDS) + SOURCE(FIELDS,GRAD_FIELDS)
* + PRESCRIBED_SOURCE(X,t) + EXTRINSIC_SOURCE(FIELDS,GRAD_FIELDS)
* Also it is important to understand that the physics model only handles
* extrinsic fields or surrogates of intrinsic fields
*/
class PhysicsModel
{
public:
// constructor
- PhysicsModel(string fileName);
+ PhysicsModel(std::string fileName);
// destructor
virtual ~PhysicsModel();
/** parse material file */
- void parse_material_file(string fileName);
+ void parse_material_file(std::string fileName);
/** initialize */
void initialize(void);
// set timescale parameters based on a given lengthscale
virtual void set_timescales(const double lengthscale) {};
/** access number of materials */
int nMaterials(void) const { return materials_.size(); }
/** access material index from name */
- int material_index(const string & name) const;
+ int material_index(const std::string & name) const;
/** access material from index */
const Material * material(const int index) const {return materials_[index];}
/** access to parameter values */
- bool parameter_value(const string& name, double& value,
+ bool parameter_value(const std::string& name, double& value,
const int imat = 0) const ;
/** return fields ids and length */
- void num_fields(map<FieldName,int> & fieldSizes,
+ void num_fields(std::map<FieldName,int> & fieldSizes,
Array2D<bool> & rhsMask) const;
/** is the material model linear */
bool is_linear(FieldName name) const {
- vector< Material* >::const_iterator iter;
+ std::vector< Material* >::const_iterator iter;
for (iter = materials_.begin(); iter != materials_.end(); iter++) {
Material * mat = *iter;
bool linear = mat->linear_flux(name)
&& mat->linear_source(name)
&& mat->constant_density(name);
if (! linear) return linear;
}
return true;
}
/** is rhs linear */
bool has_linear_rhs(FieldName name) const {
- vector< Material* >::const_iterator iter;
+ std::vector< Material* >::const_iterator iter;
for (iter = materials_.begin(); iter != materials_.end(); iter++) {
Material * mat = *iter;
bool constant = mat->linear_flux(name) && mat->linear_source(name);
if (! constant) return constant;
}
return true;
}
/** is mass matrix constant */
bool has_constant_mass(FieldName name) const {
- vector< Material* >::const_iterator iter;
+ std::vector< Material* >::const_iterator iter;
for (iter = materials_.begin(); iter != materials_.end(); iter++) {
Material * mat = *iter;
bool constant = mat->constant_density(name);
if (! constant) return constant;
}
return true;
}
/** access to weak equations */
const WeakEquation * weak_equation(FieldName field) const
{
- map<FieldName,WeakEquation *>::const_iterator itr = weakEqns_.find(field);
+ std::map<FieldName,WeakEquation *>::const_iterator itr = weakEqns_.find(field);
if (itr == weakEqns_.end()) return NULL;
return (weakEqns_.find(field))->second;
}
/** requires ics */
bool is_dynamic(FieldName field) const
{
return (weak_equation(field)->type() == WeakEquation::DYNAMIC_PDE);
}
/** query null weak equations per material */
bool null(FieldName field, int matID) const
{
return null_(field,matID);
}
protected:
/** parameter values */
- map<string, double> parameterValues_;
+ std::map<std::string, double> parameterValues_;
/** material models */
- vector<Material *> materials_;
- map<string,int> materialNameToIndexMap_;// maps tag to index
+ std::vector<Material *> materials_;
+ std::map<std::string,int> materialNameToIndexMap_;// maps tag to index
/** weak equations */
- map<FieldName,WeakEquation *> weakEqns_;
+ std::map<FieldName,WeakEquation *> weakEqns_;
/** null weak equations per material */
Array2D<int> null_;
/** type tag */
- string type_;
+ std::string type_;
};
// note that these classes do not use inheritance other than from the
// generic base class above. Inheritance is meant to come from the
// weak equations that they contain
//-------------------------------------------------------------------
// @class PhysicsModelThermal
//-------------------------------------------------------------------
class PhysicsModelThermal : public PhysicsModel
{
public:
- PhysicsModelThermal(string filename);
+ PhysicsModelThermal(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelElastic
//-------------------------------------------------------------------
class PhysicsModelElastic : public PhysicsModel
{
public:
- PhysicsModelElastic(string filename);
+ PhysicsModelElastic(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelThemoMechanical
//-------------------------------------------------------------------
class PhysicsModelThermoElastic : public PhysicsModel
{
public:
- PhysicsModelThermoElastic(string filename);
+ PhysicsModelThermoElastic(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelShear
//-------------------------------------------------------------------
class PhysicsModelShear : public PhysicsModel
{
public:
- PhysicsModelShear(string filename);
+ PhysicsModelShear(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelThemoShear
//-------------------------------------------------------------------
class PhysicsModelThermoShear : public PhysicsModel
{
public:
- PhysicsModelThermoShear(string filename);
+ PhysicsModelThermoShear(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelSpecies
//-------------------------------------------------------------------
class PhysicsModelSpecies : public PhysicsModel
{
public:
- PhysicsModelSpecies(string filename);
+ PhysicsModelSpecies(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelTwoTemperature
//-------------------------------------------------------------------
class PhysicsModelTwoTemperature : public PhysicsModel
{
public:
- PhysicsModelTwoTemperature(string filename);
+ PhysicsModelTwoTemperature(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelDriftDiffusion
//-------------------------------------------------------------------
class PhysicsModelDriftDiffusion : public PhysicsModel
{
public:
- PhysicsModelDriftDiffusion(string filename);
+ PhysicsModelDriftDiffusion(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelDriftDiffusionEquilibrium
//-------------------------------------------------------------------
class PhysicsModelDriftDiffusionEquilibrium : public PhysicsModel
{
public:
- PhysicsModelDriftDiffusionEquilibrium(string filename);
+ PhysicsModelDriftDiffusionEquilibrium(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelDriftDiffusionSchrodinger
//-------------------------------------------------------------------
class PhysicsModelDriftDiffusionSchrodinger : public PhysicsModel
{
public:
- PhysicsModelDriftDiffusionSchrodinger(string filename);
+ PhysicsModelDriftDiffusionSchrodinger(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelDriftDiffusionConvection
//-------------------------------------------------------------------
class PhysicsModelDriftDiffusionConvection : public PhysicsModel
{
public:
- PhysicsModelDriftDiffusionConvection(string filename);
+ PhysicsModelDriftDiffusionConvection(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelDriftDiffusionEquilibrium
//-------------------------------------------------------------------
class PhysicsModelDriftDiffusionConvectionEquilibrium : public PhysicsModel
{
public:
- PhysicsModelDriftDiffusionConvectionEquilibrium(string filename);
+ PhysicsModelDriftDiffusionConvectionEquilibrium(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelDriftDiffusionSchrodinger
//-------------------------------------------------------------------
class PhysicsModelDriftDiffusionConvectionSchrodinger : public PhysicsModel
{
public:
- PhysicsModelDriftDiffusionConvectionSchrodinger(string filename);
+ PhysicsModelDriftDiffusionConvectionSchrodinger(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelDriftDiffusionSchrodingerSlice
//-------------------------------------------------------------------
class PhysicsModelDriftDiffusionSchrodingerSlice : public PhysicsModel
{
public:
- PhysicsModelDriftDiffusionSchrodingerSlice(string filename);
+ PhysicsModelDriftDiffusionSchrodingerSlice(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelElectrostatic
//-------------------------------------------------------------------
class PhysicsModelElectrostatic : public PhysicsModel
{
public:
- PhysicsModelElectrostatic(string filename);
+ PhysicsModelElectrostatic(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelElectrostaticEquilibrium
//-------------------------------------------------------------------
class PhysicsModelElectrostaticEquilibrium : public PhysicsModel
{
public:
- PhysicsModelElectrostaticEquilibrium(string filename);
+ PhysicsModelElectrostaticEquilibrium(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelElectrostatic
//-------------------------------------------------------------------
class PhysicsModelSpeciesElectrostatic : public PhysicsModel
{
public:
- PhysicsModelSpeciesElectrostatic(string filename);
+ PhysicsModelSpeciesElectrostatic(std::string filename);
};
//-------------------------------------------------------------------
// @class PhysicsModelTangentOperator
// @brief adaptor to NonLinearSolver to solve rhs(x,y) = 0 for x
//-------------------------------------------------------------------
class PhysicsModelTangentOperator : public TangentOperator
{
public:
PhysicsModelTangentOperator(ATC_Coupling * atc,
const PhysicsModel * physicsModel,
Array2D<bool> & rhsMask,
IntegrationDomainType integrationType,
FIELDS & rhs,
FIELDS & fields,
FieldName fieldName,
const int dof=0);
PhysicsModelTangentOperator(ATC_Coupling * atc,
const PhysicsModel * physicsModel,
Array2D<bool> & rhsMask,
IntegrationDomainType integrationType,
FieldName fieldName,
const int dof=0);
~PhysicsModelTangentOperator(){};
void function(const VECTOR & x, DENS_VEC & r);
void tangent(const VECTOR & x, DENS_VEC & r, MATRIX & K);
private:
ATC_Coupling * atc_;
const PhysicsModel * physicsModel_;
Array2D<bool> rhsMask_;
IntegrationDomainType integrationType_;
FIELDS & rhs_;
FIELDS & fields_;
FieldName fieldName_;
int dof_;
SPAR_MAT stiffness_;
};
};
#endif
diff --git a/lib/atc/PoissonSolver.cpp b/lib/atc/PoissonSolver.cpp
index 41df343fa..c2c062ede 100644
--- a/lib/atc/PoissonSolver.cpp
+++ b/lib/atc/PoissonSolver.cpp
@@ -1,212 +1,216 @@
#include "PoissonSolver.h"
#include "ATC_Coupling.h"
#include "FE_Engine.h"
#include "PhysicsModel.h"
#include "PrescribedDataManager.h"
#include "LinearSolver.h"
+#include <utility>
+#include <iostream>
+
+using std::pair;
namespace ATC {
// ====================================================================
// PoissonSolver
// ====================================================================
PoissonSolver::PoissonSolver(
const FieldName fieldName,
const PhysicsModel * physicsModel,
const FE_Engine * feEngine,
const PrescribedDataManager * prescribedDataMgr,
/*const*/ ATC_Coupling * atc,
const Array2D<bool> & rhsMask,
const int solverType,
bool parallel
)
: atc_(atc),
feEngine_(feEngine),
prescribedDataMgr_(prescribedDataMgr),
physicsModel_(physicsModel),
fieldName_(fieldName),
rhsMask_(rhsMask),
linear_(false),
solver_(NULL),
solverNL_(NULL),
tangent_(NULL),
solverType_(solverType),
solverTol_(0),
solverMaxIter_(0),
integrationType_(FULL_DOMAIN),
parallel_(parallel)
{
if (physicsModel_->has_linear_rhs(fieldName)) {
linear_ = true;
rhsMask_(fieldName,FLUX) = false;
}
else {
rhsMask_(fieldName,FLUX) = true;
rhsMask_(fieldName,SOURCE) = true;
}
if (prescribedDataMgr_->has_robin_source(fieldName)) {
rhsMask_(fieldName,ROBIN_SOURCE) = true;
}
}
// --------------------------------------------------------------------
PoissonSolver::~PoissonSolver()
{
if (tangent_) delete tangent_;
if (solverNL_) delete solverNL_;
if (solver_) delete solver_;
}
// --------------------------------------------------------------------
// Parser
// --------------------------------------------------------------------
bool PoissonSolver::modify(int narg, char **arg)
{
bool match = false;
/*! \page man_poisson_solver fix_modify AtC poisson_solver
\section syntax
fix_modify AtC poisson_solver mesh create <nx> <ny> <nz> <region-id>
<f|p> <f|p> <f|p>
- nx ny nz = number of elements in x, y, z
- region-id = id of region that is to be meshed
- f p p = perioidicity flags for x, y, z
\section examples
<TT> fix_modify AtC poisson_solver mesh create 10 1 1 feRegion p p p </TT>
\section description
Creates a uniform mesh in a rectangular region
\section restrictions
creates only uniform rectangular grids in a rectangular region
\section related
\section default
none
*/
int argIdx = 0;
if (strcmp(arg[argIdx],"poisson_solver")==0) {
argIdx++;
if (strcmp(arg[argIdx],"mesh")==0) {
argIdx++;
// create a FE_Engine
//feEngine_ = new FE_Engine(this); need alternate constructor?
// send args to new engine
// arg[0] = "mesh";
// arg[1] = "create";
// feEngine_->modify(narg,arg);
}
}
return match;
}
// --------------------------------------------------------------------
// Initialize
// --------------------------------------------------------------------
void PoissonSolver::initialize(void)
{
nNodes_ = feEngine_->num_nodes();
if (atc_->source_atomic_quadrature(fieldName_))
integrationType_ = FULL_DOMAIN_ATOMIC_QUADRATURE_SOURCE;
// compute penalty for Dirichlet boundaries
if (prescribedDataMgr_->none_fixed(fieldName_))
throw ATC_Error("Poisson solver needs Dirichlet data");
const BC_SET & bcs = (prescribedDataMgr_->bcs(fieldName_))[0];
if (linear_) { // constant rhs
if (! solver_ ) {
pair<FieldName,FieldName> row_col(fieldName_,fieldName_);
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX);
rhsMask = false; rhsMask(fieldName_,FLUX) = true;
if (prescribedDataMgr_->has_robin_source(fieldName_)) {
rhsMask(fieldName_,ROBIN_SOURCE) = true;
}
// compute stiffness for Poisson solve
atc_->compute_rhs_tangent(row_col, rhsMask, atc_->fields(),
stiffness_, FULL_DOMAIN, physicsModel_);
// create solver
solver_ = new LinearSolver(stiffness_,bcs,solverType_,-1,parallel_);
}
else {
// re-initialize
solver_->initialize(&bcs);
}
if (solverTol_) solver_->set_tolerance(solverTol_);
if (solverMaxIter_) solver_->set_max_iterations(solverMaxIter_);
}
else {
// print_mask(rhsMask_);
if ( solverNL_ ) delete solverNL_;
tangent_ = new PhysicsModelTangentOperator(atc_,physicsModel_, rhsMask_, integrationType_, fieldName_);
solverNL_ = new NonLinearSolver(tangent_,&bcs,0,parallel_);
if (solverTol_) solverNL_->set_residual_tolerance(solverTol_);
if (solverMaxIter_) solverNL_->set_max_iterations(solverMaxIter_);
}
}
// --------------------------------------------------------------------
// Solve
// --------------------------------------------------------------------
bool PoissonSolver::solve(FIELDS & fields, FIELDS & rhs)
{
atc_->compute_rhs_vector(rhsMask_, fields, rhs,
integrationType_, physicsModel_);
CLON_VEC f = column(fields[fieldName_].set_quantity(),0);
CLON_VEC r = column(rhs[fieldName_].quantity(),0);
bool converged = false;
if (linear_) {converged = solver_->solve(f,r);}
else {converged = solverNL_->solve(f);}
if (atc_->source_atomic_quadrature(fieldName_)
&& LammpsInterface::instance()->atom_charge() ) set_charges(fields);
return converged;
}
bool PoissonSolver::solve(DENS_MAT & field, const DENS_MAT & rhs)
{
CLON_VEC f = column(field,0);
CLON_VEC r = column(rhs,0);
bool converged = false;
if (linear_) {converged = solver_->solve(f,r);}
else {converged = solverNL_->solve(f);}
if (atc_->source_atomic_quadrature(fieldName_)
&& LammpsInterface::instance()->atom_charge() ) set_charges(atc_->fields());
return converged;
}
// --------------------------------------------------------------------
// set charges on atoms
// --------------------------------------------------------------------
void PoissonSolver::set_charges(FIELDS & fields)
{
FIELD_MATS sources;
atc_->compute_sources_at_atoms(rhsMask_, fields, physicsModel_,sources);
FIELD_MATS::const_iterator nField = sources.find(fieldName_);
if (nField != sources.end()) {
const DENS_MAT & electronCharges = nField->second;
double * q = LammpsInterface::instance()->atom_charge();
int nLocal = atc_->nlocal();
if (nLocal > 0) {
const Array<int> & i2a = atc_->internal_to_atom_map();
for (int i=0; i < nLocal; i++) {
int atomIdx = i2a(i);
q[atomIdx] = -electronCharges(i,0);
}
}
}
}
} // namespace ATC
diff --git a/lib/atc/PrescribedDataManager.cpp b/lib/atc/PrescribedDataManager.cpp
index 2ed390db7..8d27f7c21 100644
--- a/lib/atc/PrescribedDataManager.cpp
+++ b/lib/atc/PrescribedDataManager.cpp
@@ -1,562 +1,579 @@
#include "PrescribedDataManager.h"
#include "FE_Engine.h"
#include "ATC_Error.h"
+#include <sstream>
+#include <iostream>
-#include <set>
+using std::stringstream;
+using std::make_pair;
+using std::map;
+using std::set;
+using std::pair;
+using std::string;
+using std::cout;
namespace ATC {
//-------------------------------------------------------------------------
// PrescribedDataManager
//-------------------------------------------------------------------------
PrescribedDataManager::PrescribedDataManager
(FE_Engine * feEngine,
const map<FieldName,int> & fieldSize) :
fieldSizes_(fieldSize), feEngine_(feEngine)
{
// construct & initialize internal data
nNodes_ = feEngine_->num_nodes();
nElems_ = feEngine_->num_elements();
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
int thisSize = field->second;
// nodal ics & essential bcs
ics_[thisField].reset(nNodes_,thisSize);
bcs_[thisField].reset(nNodes_,thisSize);
for (int inode = 0; inode < nNodes_ ; ++inode) {
for (int idof = 0; idof < thisSize ; ++idof) {
ics_[thisField](inode,idof) = NULL;
bcs_[thisField](inode,idof) = NULL;
}
}
// compact inode, value lists
(bcValues_[thisField]).resize(thisSize);
// element based sources
elementSources_[thisField].reset(nElems_,thisSize);
for (int ielem = 0; ielem < nElems_ ; ++ielem) {
for (int idof = 0; idof < thisSize ; ++idof) {
elementSources_[thisField](ielem,idof) = NULL;
}
}
}
}
//-------------------------------------------------------------------------
// ~PrescribedDataManager
//-------------------------------------------------------------------------
PrescribedDataManager::~PrescribedDataManager()
{
}
//-------------------------------------------------------------------------
// add_field
//-------------------------------------------------------------------------
void PrescribedDataManager::add_field(FieldName fieldName, int size)
{
// check to see if field exists
if (fieldSizes_.find(fieldName) == fieldSizes_.end()) return;
// construct & initialize internal data
nNodes_ = feEngine_->num_nodes();
nElems_ = feEngine_->num_elements();
// nodal ics & essential bcs
ics_[fieldName].reset(nNodes_,size);
bcs_[fieldName].reset(nNodes_,size);
for (int inode = 0; inode < nNodes_ ; ++inode) {
for (int idof = 0; idof < size ; ++idof) {
ics_[fieldName](inode,idof) = NULL;
bcs_[fieldName](inode,idof) = NULL;
}
}
// element based sources
elementSources_[fieldName].reset(nElems_,size);
for (int ielem = 0; ielem < nElems_ ; ++ielem) {
for (int idof = 0; idof < size ; ++idof) {
elementSources_[fieldName](ielem,idof) = NULL;
}
}
}
//-------------------------------------------------------------------------
// remove_field
//-------------------------------------------------------------------------
void PrescribedDataManager::remove_field(FieldName fieldName)
{
// check to see if field exists
if (fieldSizes_.find(fieldName) == fieldSizes_.end())
return;
// delete field in maps
fieldSizes_.erase(fieldName);
ics_.erase(fieldName);
bcs_.erase(fieldName);
elementSources_.erase(fieldName);
}
//-------------------------------------------------------------------------
// fix_initial_field
//-------------------------------------------------------------------------
void PrescribedDataManager::fix_initial_field
(const string nodesetName,
const FieldName thisField,
const int thisIndex,
const XT_Function * f)
{
using std::set;
set<int> nodeSet = (feEngine_->fe_mesh())->nodeset(nodesetName);
set<int>::const_iterator iset;
for (iset = nodeSet.begin(); iset != nodeSet.end(); iset++) {
int inode = *iset;
ics_[thisField](inode,thisIndex) = (XT_Function*) f;
}
}
//-------------------------------------------------------------------------
// fix_field
//-------------------------------------------------------------------------
void PrescribedDataManager::fix_field
- (const string nodesetName,
+ (const std::set<int> nodeSet,
const FieldName thisField,
const int thisIndex,
const XT_Function * f)
{
using std::set;
// fix fields
- set<int> nodeSet = (feEngine_->fe_mesh())->nodeset(nodesetName);
set<int>::const_iterator iset;
for (iset = nodeSet.begin(); iset != nodeSet.end(); iset++) {
int inode = *iset;
bcs_[thisField](inode,thisIndex) = (XT_Function*) f;
}
}
+ void PrescribedDataManager::fix_field
+ (const string nodesetName,
+ const FieldName thisField,
+ const int thisIndex,
+ const XT_Function * f)
+ {
+ using std::set;
+ set<int> nodeSet = (feEngine_->fe_mesh())->nodeset(nodesetName);
+ fix_field(nodeSet,thisField,thisIndex,f);
+ }
//-------------------------------------------------------------------------
// unfix_field
//-------------------------------------------------------------------------
void PrescribedDataManager::unfix_field
(const string nodesetName,
const FieldName thisField,
const int thisIndex)
{
using std::set;
set<int> nodeSet = (feEngine_->fe_mesh())->nodeset(nodesetName);
set<int>::const_iterator iset;
for (iset = nodeSet.begin(); iset != nodeSet.end(); iset++) {
int inode = *iset;
bcs_[thisField](inode,thisIndex) = NULL;
}
}
//-------------------------------------------------------------------------
// fix_field
//-------------------------------------------------------------------------
void PrescribedDataManager::fix_field
(const int nodeId,
const FieldName thisField,
const int thisIndex,
const XT_Function * f)
{
bcs_[thisField](nodeId,thisIndex) = (XT_Function*) f;
}
//-------------------------------------------------------------------------
// unfix_field
//-------------------------------------------------------------------------
void PrescribedDataManager::unfix_field
(const int nodeId,
const FieldName thisField,
const int thisIndex)
{
bcs_[thisField](nodeId,thisIndex) = NULL;
}
//-------------------------------------------------------------------------
// fix_flux
//-------------------------------------------------------------------------
void PrescribedDataManager::fix_flux
(const string facesetName,
const FieldName thisField,
const int thisIndex,
const XT_Function * f)
{
const set< pair <int,int> > * fset
= & ( (feEngine_->fe_mesh())->faceset(facesetName));
set< pair<int,int> >::const_iterator iset;
for (iset = fset->begin(); iset != fset->end(); iset++) {
pair<int,int> face = *iset;
// allocate, if necessary
Array < XT_Function * > & dof = faceSources_[thisField][face];
if (dof.size() == 0) {
int ndof = (fieldSizes_.find(thisField))->second;
dof.reset(ndof);
for(int i = 0; i < ndof; i++) dof(i) = NULL;
}
dof(thisIndex) = (XT_Function*) f;
}
}
//-------------------------------------------------------------------------
// unfix_flux
//-------------------------------------------------------------------------
void PrescribedDataManager::unfix_flux
(const string facesetName,
const FieldName thisField,
const int thisIndex)
{
const set< pair <int,int> > * fset
= & ( (feEngine_->fe_mesh())->faceset(facesetName));
set< pair<int,int> >::const_iterator iset;
for (iset = fset->begin(); iset != fset->end(); iset++) {
pair<int,int> face = *iset;
Array < XT_Function * > & dof = faceSources_[thisField][face];
dof(thisIndex) = NULL;
}
}
//-------------------------------------------------------------------------
// fix_robin
//-------------------------------------------------------------------------
void PrescribedDataManager::fix_robin
(const string facesetName,
const FieldName thisField,
const int thisIndex,
const UXT_Function * f)
{
const set< pair <int,int> > * fset
= & ( (feEngine_->fe_mesh())->faceset(facesetName));
set< pair<int,int> >::const_iterator iset;
for (iset = fset->begin(); iset != fset->end(); iset++) {
pair<int,int> face = *iset;
// allocate, if necessary
Array < UXT_Function * > & dof = faceSourcesRobin_[thisField][face];
if (dof.size() == 0) {
int ndof = (fieldSizes_.find(thisField))->second;
dof.reset(ndof);
for(int i = 0; i < ndof; i++) dof(i) = NULL;
}
dof(thisIndex) = (UXT_Function*) f;
}
}
//-------------------------------------------------------------------------
// unfix_robin
//-------------------------------------------------------------------------
void PrescribedDataManager::unfix_robin
(const string facesetName,
const FieldName thisField,
const int thisIndex)
{
const set< pair <int,int> > * fset
= & ( (feEngine_->fe_mesh())->faceset(facesetName));
set< pair<int,int> >::const_iterator iset;
for (iset = fset->begin(); iset != fset->end(); iset++) {
pair<int,int> face = *iset;
Array < UXT_Function * > & dof = faceSourcesRobin_[thisField][face];
dof(thisIndex) = NULL;
}
}
//-------------------------------------------------------------------------
// fix_source
//-------------------------------------------------------------------------
void PrescribedDataManager::fix_source
(const string elemsetName,
const FieldName thisField,
const int thisIndex,
const XT_Function *f)
{
using std::set;
set<int> elemSet = (feEngine_->fe_mesh())->elementset(elemsetName);
set<int>::const_iterator iset;
for (iset = elemSet.begin(); iset != elemSet.end(); iset++) {
int ielem = *iset;
// fix source
elementSources_[thisField](ielem,thisIndex) = (XT_Function*) f;
}
}
//-------------------------------------------------------------------------
// unfix_source
//-------------------------------------------------------------------------
void PrescribedDataManager::unfix_source
(const string elemsetName,
const FieldName thisField,
const int thisIndex)
{
using std::set;
set<int> elemSet = (feEngine_->fe_mesh())->elementset(elemsetName);
set<int>::const_iterator iset;
for (iset = elemSet.begin(); iset != elemSet.end(); iset++) {
int ielem = *iset;
elementSources_[thisField](ielem,thisIndex) = NULL;
}
}
//-------------------------------------------------------------------------
// set_initial_conditions
//-------------------------------------------------------------------------
void PrescribedDataManager::set_initial_conditions(const double t,
FIELDS &fields,
FIELDS &dot_fields,
FIELDS &ddot_fields,
FIELDS &dddot_fields)
{
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
int thisSize = field->second;
DENS_MAT & myField(fields[thisField].set_quantity());
DENS_MAT & myDotField(dot_fields[thisField].set_quantity());
DENS_MAT & myDDotField(ddot_fields[thisField].set_quantity());
DENS_MAT & myDDDotField(dddot_fields[thisField].set_quantity());
bool warn = false;
for (int inode = 0; inode < nNodes_ ; ++inode) {
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
XT_Function *f = ics_[thisField](inode,thisIndex);
if (!f) f = bcs_[thisField](inode,thisIndex);
if (f)
{
DENS_VEC coords(3);
coords = (feEngine_->fe_mesh())->nodal_coordinates(inode);
double *x = coords.ptr();
myField(inode,thisIndex) = f->f(x,t);
myDotField(inode,thisIndex) = f->dfdt(x,t);
myDDotField(inode,thisIndex) = f->ddfdt(x,t);
myDDDotField(inode,thisIndex) = f->dddfdt(x,t);
}
else {
myField(inode,thisIndex) = 0;
myDotField(inode,thisIndex) = 0;
myDDotField(inode,thisIndex) = 0;
myDDDotField(inode,thisIndex) = 0;
warn = true;
}
}
}
// if (warn && is_dynamic(thisField)) { need access tp physics model or return warn per field
if (warn) {
stringstream ss;
ss << ("WARNING: all initial conditions for " +field_to_string(thisField)+" have not been defined and the undefined are assumed zero");
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
}
}
//-------------------------------------------------------------------------
// set_fixed_fields
//-------------------------------------------------------------------------
void PrescribedDataManager::set_fixed_fields(const double t,
FIELDS &fields,
FIELDS &dot_fields,
FIELDS &ddot_fields,
FIELDS &dddot_fields)
{
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
int thisSize = field->second;
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
BC_SET & bcs = (bcValues_[thisField])[thisIndex];
bcs.clear();
for (int inode = 0; inode < nNodes_ ; ++inode) {
XT_Function * f = bcs_[thisField](inode,thisIndex);
if (f) {
DENS_VEC coords(3);
coords = (feEngine_->fe_mesh())->nodal_coordinates(inode);
double * x = coords.ptr();
double val = f->f(x,t);
(fields [thisField].set_quantity())(inode,thisIndex) = val;
(dot_fields [thisField].set_quantity())(inode,thisIndex) = f->dfdt(x,t);
(ddot_fields [thisField].set_quantity())(inode,thisIndex) = f->ddfdt(x,t);
(dddot_fields[thisField].set_quantity())(inode,thisIndex) = f->dddfdt(x,t);
// compact set
pair <int, double > bc = make_pair(inode,val);
bcs.insert(bc);
}
}
}
}
}
//-------------------------------------------------------------------------
// set_fixed_field
//-------------------------------------------------------------------------
void PrescribedDataManager::set_fixed_field(
const double t,
const FieldName & fieldName,
DENS_MAT & fieldMatrix)
{
map<FieldName,int>::iterator fieldSizeIter = fieldSizes_.find(fieldName);
if (fieldSizeIter == fieldSizes_.end()) {
throw ATC_Error( "Unrecognized FieldName in PrescribedDataManager::set_fixed_field()");
}
int thisSize = fieldSizeIter->second;
for (int inode = 0; inode < nNodes_ ; ++inode) {
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
XT_Function * f = bcs_[fieldName](inode,thisIndex);
if (f) {
DENS_VEC coords(3);
coords = (feEngine_->fe_mesh())->nodal_coordinates(inode);
fieldMatrix(inode,thisIndex) = f->f(coords.ptr(),t);
}
}
}
}
//-------------------------------------------------------------------------
// set_fixed_dfield
//-------------------------------------------------------------------------
void PrescribedDataManager::set_fixed_dfield(
const double t,
const FieldName & fieldName,
DENS_MAT & dfieldMatrix)
{
map<FieldName,int>::iterator fieldSizeIter = fieldSizes_.find(fieldName);
if (fieldSizeIter == fieldSizes_.end()) {
throw ATC_Error( "Unrecognized FieldName in PrescribedDataManager::set_fixed_dfield()");
}
int thisSize = fieldSizeIter->second;
for (int inode = 0; inode < nNodes_ ; ++inode) {
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
XT_Function * f = bcs_[fieldName](inode,thisIndex);
if (f) {
DENS_VEC coords(3);
coords = (feEngine_->fe_mesh())->nodal_coordinates(inode);
dfieldMatrix(inode,thisIndex) = f->dfdt(coords.ptr(),t);
}
}
}
}
//-------------------------------------------------------------------------
// set_sources
//-------------------------------------------------------------------------
void PrescribedDataManager::set_sources
(double t,
FIELDS & sources)
{
// zero
Array<bool> fieldMask(NUM_FIELDS);
fieldMask = false;
map<FieldName,int>::const_iterator field;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
fieldMask(thisField) = true;
int thisSize = field->second;
sources[thisField].reset(nNodes_,thisSize);
}
// compute boundary fluxes
feEngine_->add_fluxes(fieldMask,t,faceSources_,sources);
// compute internal sources
feEngine_->add_sources(fieldMask,t,elementSources_,sources);
// mask out nodes with essential bcs
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
int thisSize = field->second;
for (int inode = 0; inode < nNodes_ ; ++inode) {
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
XT_Function * f = bcs_[thisField](inode,thisIndex);
if (f) {
(sources[thisField].set_quantity())(inode,thisIndex) = 0.0;
}
}
}
}
}
//-------------------------------------------------------------------------
// print
//-------------------------------------------------------------------------
void PrescribedDataManager::print(void)
{
// print and check consistency
enum dataType {FREE=0,FIELD,SOURCE};
Array2D < int > bcTypes;
Array <int> conn;
map<FieldName,int>::const_iterator field;
XT_Function * f;
for (field = fieldSizes_.begin(); field!=fieldSizes_.end(); field++) {
FieldName thisField = field->first;
int thisFieldSize = field->second;
string fieldName = field_to_string(thisField);
int thisSize = field->second;
bcTypes.reset(nNodes_,thisSize);
for (int inode = 0; inode < nNodes_ ; ++inode) {
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
f = bcs_[thisField](inode,thisIndex);
if (f) { bcTypes(inode,thisIndex) = FIELD; }
else { bcTypes(inode,thisIndex) = FREE; }
}
}
// FIXED has higher precidence than SOURCE
for (int ielem = 0; ielem < nElems_ ; ++ielem) {
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
f = elementSources_[thisField](ielem,thisIndex);
if (f) {
feEngine_->element_connectivity(ielem,conn);
for (int i = 0; i < conn.size() ; ++i) {
int inode = conn(i);
if (bcTypes(inode,thisIndex) != FIELD)
{ bcTypes(inode,thisIndex) = SOURCE; }
}
}
}
}
map < pair<int,int>, Array < XT_Function * > > & fset
= faceSources_[thisField];
map < pair<int,int>, Array < XT_Function * > > ::const_iterator iset;
for (iset = fset.begin(); iset != fset.end(); iset++) {
pair<int,int> face = iset->first;
Array < XT_Function * > fs = iset->second;
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
f = fs(thisIndex);
if (f) {
feEngine_->face_connectivity(face,conn);
for (int i = 0; i < conn.size() ; ++i) {
int inode = conn(i);
if (bcTypes(inode,thisIndex) != FIELD)
{ bcTypes(inode,thisIndex) = SOURCE; }
}
}
}
}
for (int inode = 0; inode < nNodes_ ; ++inode) {
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
cout << "node: " << inode << " " << fieldName;
if (thisFieldSize > 1) { cout << " " << thisIndex; }
f = ics_[thisField](inode,thisIndex);
if (f) { cout << " IC"; }
if (bcTypes(inode,thisIndex) == FIELD ) {cout << " FIXED"; }
else if (bcTypes(inode,thisIndex) == SOURCE) {cout << " SOURCE"; }
cout << "\n";
}
}
}
}
//-------------------------------------------------------------------------
// get_bcs of a subset of nodes
//-------------------------------------------------------------------------
void PrescribedDataManager::bcs(const FieldName thisField, const set<int> nodeSet, BCS & bcs, bool local) const
{
bcs.clear();
int thisSize = (fieldSizes_.find(thisField))->second;
bcs.resize(thisSize);
for (int thisIndex = 0; thisIndex < thisSize ; ++thisIndex) {
set<int>::const_iterator iset;
int i = 0;
for (iset = nodeSet.begin(); iset != nodeSet.end(); iset++) {
int inode = *iset;
const BC_SET & allBCs
= ((bcValues_.find(thisField))->second)[thisIndex];
BC_SET::const_iterator bset;
for (bset = allBCs.begin(); bset != allBCs.end(); bset++) {
int bnode = (*bset).first;
if (inode == bnode) {
double val = (*bset).second;
if (local) inode = i; // use a local numbering
pair <int, double > bc = make_pair(inode,val);
(bcs[thisIndex]).insert(bc);
}
}
i++;
}
}
}
} // end namespace
diff --git a/lib/atc/PrescribedDataManager.h b/lib/atc/PrescribedDataManager.h
index 851ea5fde..1801360a8 100644
--- a/lib/atc/PrescribedDataManager.h
+++ b/lib/atc/PrescribedDataManager.h
@@ -1,389 +1,393 @@
#ifndef PRESCRIBED_DATA_MANAGER_H
#define PRESCRIBED_DATA_MANAGER_H
#include <vector>
#include <map>
+#include <set>
#include <string>
+#include <utility>
#include "ATC_TypeDefs.h"
#include "Function.h"
#include "PhysicsModel.h"
#include "FE_Element.h"
#include "Array.h"
#include "Array2D.h"
#include "FE_Engine.h"
namespace ATC {
- using std::vector;
- using std::pair;
- using std::map;
/**
* @class PrescribedDataManager
* @brief Base class for managing initial conditions, essential/natural "boundary" conditions and sources
*/
class PrescribedDataManager {
public:
/** exclusive conditions: free | fixed field | flux or domain source */
//enum Bc_Type {FREE=0,FIELD,SOURCE};
PrescribedDataManager(FE_Engine * feEngine,
- const map<FieldName,int> & fieldSize);
+ const std::map<FieldName,int> & fieldSize);
~PrescribedDataManager();
/** add/remove a field */
void add_field(FieldName fieldName, int size);
void remove_field(FieldName fieldName);
/** direct access to ics */
- map < FieldName, Array2D < XT_Function * > > *
+ std::map < FieldName, Array2D < XT_Function * > > *
ics(void) { return & ics_; }
const Array2D < XT_Function * > *
ics(FieldName fieldName) { return & ics_[fieldName]; }
/** direct access to bcs */
- const map < FieldName, BCS > & bcs(void) const
+ const std::map < FieldName, BCS > & bcs(void) const
{
return bcValues_;
}
/** */
const BCS & bcs(const FieldName fieldName) const
{
return (bcValues_.find(fieldName))->second;
}
/** */
void bcs
- (const FieldName fieldName, const set<int> nodes, BCS & bcs,
+ (const FieldName fieldName, const std::set<int> nodes, BCS & bcs,
bool local = false) const;
/** */
- map < FieldName, Array2D < XT_Function * > > *
+ std::map < FieldName, Array2D < XT_Function * > > *
bc_functions(void) { return & bcs_; }
/** */
const Array2D < XT_Function * > *
bc_functions(FieldName fieldName) { return & bcs_[fieldName]; }
/** */
ROBIN_SURFACE_SOURCE * robin_functions(void) { return & faceSourcesRobin_; }
bool has_robin_source(FieldName fieldName) const {
return ((faceSourcesRobin_.find(fieldName)->second).size() > 0) ;
}
/** */
- const map<PAIR, Array<UXT_Function*> > *
+ const std::map<PAIR, Array<UXT_Function*> > *
robin_functions(FieldName fieldName) { return & faceSourcesRobin_[fieldName]; }
/** query initial state */
bool is_initially_fixed(const int node,
const FieldName thisField,
const int thisIndex=0) const
{
return ((ics_.find(thisField)->second))(node,thisIndex) ? true : false ;
}
/** query state */
bool is_fixed(const int node,
const FieldName thisField,
const int thisIndex=0) const
{
return ((bcs_.find(thisField)->second))(node,thisIndex) ? true : false ;
}
/** */
- set<int> fixed_nodes(
+ std::set<int> fixed_nodes(
const FieldName thisField,
const int thisIndex=0) const
{
- set<int> fixed;
+ std::set<int> fixed;
const Array2D < XT_Function *> & bcs = bcs_.find(thisField)->second;
for (int node = 0; node < bcs.nRows() ; node++) {
if (bcs(node,thisIndex)) fixed.insert(node);
}
return fixed;
}
/** */
void fixed_nodes(
const FieldName thisField,
- set<int> & fixed,
+ std::set<int> & fixed,
const int thisIndex=0) const
{
const Array2D < XT_Function *> & bcs = bcs_.find(thisField)->second;
for (int node = 0; node < bcs.nRows() ; node++) {
if (bcs(node,thisIndex)) fixed.insert(node);
}
}
/** to determine whether a solution is needed */
bool all_fixed(
const FieldName thisField,
const int thisIndex=-1) const
{
if (thisIndex < 0) {
// static_casts are to iterface with std::vector without compiler warngings
bool allFixed = (fixed_nodes(thisField,0).size() == static_cast<unsigned>(nNodes_) );
int ndof = (fieldSizes_.find(thisField)->second);
for (int j = 1; j < ndof; ++j) {
allFixed = allFixed && (fixed_nodes(thisField,j).size() == static_cast<unsigned>(nNodes_));
}
return allFixed;
}
else {
return (fixed_nodes(thisField,thisIndex).size() == static_cast<unsigned>(nNodes_) );
}
}
/** a function to determine if the tangent is invertible */
bool none_fixed(
const FieldName thisField,
const int thisIndex=0) const
{
return (fixed_nodes(thisField,thisIndex).size() == 0 )
&& (faceSourcesRobin_.size() == 0);
}
/** */
- set<int> flux_face_nodes(
+ std::set<int> flux_face_nodes(
const FieldName thisField,
const int thisIndex=0) const
{
- set<int> fluxes;
+ std::set<int> fluxes;
//list of nodes to insert.
//1 for nodes to insert, 0 for nodes not to insert.
int toInsert[nNodes_];
for (int i = 0; i < nNodes_; ++i) toInsert[i] = 0;
- const map < pair <int, int>, Array < XT_Function * > > & sources = faceSources_.find(thisField)->second;
- map < pair <int, int>, Array < XT_Function * > >::const_iterator fset_iter;
+ const std::map < std::pair <int, int>, Array < XT_Function * > > & sources = faceSources_.find(thisField)->second;
+ std::map < std::pair <int, int>, Array < XT_Function * > >::const_iterator fset_iter;
for (fset_iter = sources.begin(); fset_iter != sources.end(); fset_iter++) {
int ielem = fset_iter->first.first;
// if this is not our element, do not do calculations
if (!feEngine_->fe_mesh()->is_owned_elt(ielem)) continue;
const Array <XT_Function*> &fs = fset_iter->second;
if (fs(thisIndex)) {
Array<int> nodes;
feEngine_->face_connectivity(fset_iter->first,nodes);
for (int node = 0; node < nodes.size(); node++) {
toInsert[nodes(node)] = 1;
}
}
}
// gather partial results
LammpsInterface::instance()->logical_or(MPI_IN_PLACE, toInsert, nNodes_);
// insert selected elements into fluxes
for (int node = 0; node < nNodes_; ++node) {
if (toInsert[node]) fluxes.insert(node);
}
return fluxes;
}
/** */
void flux_face_nodes(
const FieldName thisField,
- set<int> fluxes,
+ std::set<int> fluxes,
const int thisIndex=0) const
{
//list of nodes to insert.
//1 for nodes to insert, 0 for nodes not to insert.
int toInsert[nNodes_];
for (int i = 0; i < nNodes_; ++i) toInsert[i] = 0;
- const map < pair <int, int>, Array < XT_Function * > > & sources = faceSources_.find(thisField)->second;
- map < pair <int, int>, Array < XT_Function * > >::const_iterator fset_iter;
+ const std::map < std::pair <int, int>, Array < XT_Function * > > & sources = faceSources_.find(thisField)->second;
+ std::map < std::pair <int, int>, Array < XT_Function * > >::const_iterator fset_iter;
for (fset_iter = sources.begin(); fset_iter != sources.end(); fset_iter++) {
int ielem = fset_iter->first.first;
// if this is not our element, do not do calculations
if (!feEngine_->fe_mesh()->is_owned_elt(ielem)) continue;
const Array <XT_Function*> &fs = fset_iter->second;
if (fs(thisIndex)) {
Array<int> nodes;
feEngine_->face_connectivity(fset_iter->first,nodes);
for (int node = 0; node < nodes.size(); node++) {
toInsert[nodes(node)] = 1;
}
}
}
// gather partial results
LammpsInterface::instance()->logical_or(MPI_IN_PLACE, toInsert, nNodes_);
// insert selected elements into fluxes
for (int node = 0; node < nNodes_; ++node) {
if (toInsert[node]) fluxes.insert(node);
}
}
/** */
- set<int> flux_element_nodes(
+ std::set<int> flux_element_nodes(
const FieldName thisField,
const int thisIndex=0) const
{
- set<int> fluxes;
+ std::set<int> fluxes;
//list of nodes to insert.
//1 for nodes to insert, 0 for nodes not to insert.
int toInsert[nNodes_];
for (int i = 0; i < nNodes_; ++i) toInsert[i] = 0;
const Array2D < XT_Function *> & sources = elementSources_.find(thisField)->second;
for (int element = 0; element < sources.nRows() ; element++) {
// if this is not our element, do not do calculations
if (!feEngine_->fe_mesh()->is_owned_elt(element)) continue;
if (sources(element,thisIndex)) {
Array<int> nodes;
feEngine_->element_connectivity(element,nodes);
for (int node = 0; node < nodes.size(); node++) {
toInsert[nodes(node)] = 1;
}
}
}
// gather partial results
LammpsInterface::instance()->logical_or(MPI_IN_PLACE, toInsert, nNodes_);
// insert selected elements into fluxes
for (int node = 0; node < nNodes_; ++node) {
if (toInsert[node]) fluxes.insert(node);
}
return fluxes;
}
/** */
void flux_element_nodes(
const FieldName thisField,
- set<int> fluxes,
+ std::set<int> fluxes,
const int thisIndex=0) const
{
//list of nodes to insert.
//1 for nodes to insert, 0 for nodes not to insert.
int toInsert[nNodes_];
for (int i = 0; i < nNodes_; ++i) toInsert[i] = 0;
const Array2D < XT_Function *> & sources = elementSources_.find(thisField)->second;
for (int element = 0; element < sources.nRows() ; element++) {
// if this is not our element, do not do calculations
if (!feEngine_->fe_mesh()->is_owned_elt(element)) continue;
if (sources(element,thisIndex)) {
Array<int> nodes;
feEngine_->element_connectivity(element,nodes);
for (int node = 0; node < nodes.size(); node++) {
toInsert[nodes(node)] = 1;
}
}
}
// gather partial results
LammpsInterface::instance()->logical_or(MPI_IN_PLACE, toInsert, nNodes_);
// insert selected elements into fluxes
for (int node = 0; node < nNodes_; ++node) {
if (toInsert[node]) fluxes.insert(node);
}
}
/** */
bool no_fluxes(
const FieldName thisField,
const int thisIndex=0) const
{
return ((flux_element_nodes(thisField,thisIndex).size() == 0) &&
(flux_face_nodes(thisField,thisIndex).size() == 0));
}
/** set initial field values */
- void fix_initial_field (const string nodesetName,
+ void fix_initial_field (const std::string nodesetName,
const FieldName thisField,
const int thisIndex,
const XT_Function * f);
/** un/set field values at fixed nodesets */
- void fix_field (const string nodesetName,
+ void fix_field (const std::set<int> nodeset,
const FieldName thisField,
const int thisIndex,
const XT_Function * f);
- void unfix_field (const string nodesetName,
+ /** un/set field values at fixed nodesets */
+ void fix_field (const std::string nodesetName,
+ const FieldName thisField,
+ const int thisIndex,
+ const XT_Function * f);
+ void unfix_field (const std::string nodesetName,
const FieldName thisField,
const int thisIndex);
/** un/set field values at fixed nodes */
void fix_field (const int nodeId,
const FieldName thisField,
const int thisIndex,
const XT_Function * f);
void unfix_field (const int nodeId,
const FieldName thisField,
const int thisIndex);
/** un/set fluxes */
- void fix_flux (const string facesetName,
+ void fix_flux (const std::string facesetName,
const FieldName thisField,
const int thisIndex,
const XT_Function * f);
- void unfix_flux(const string facesetName,
+ void unfix_flux(const std::string facesetName,
const FieldName thisField,
const int thisIndex);
- void fix_robin (const string facesetName,
+ void fix_robin (const std::string facesetName,
const FieldName thisField,
const int thisIndex,
const UXT_Function * f);
- void unfix_robin(const string facesetName,
+ void unfix_robin(const std::string facesetName,
const FieldName thisField,
const int thisIndex);
/** un/set sources */
- void fix_source(const string nodesetName,
+ void fix_source(const std::string nodesetName,
const FieldName thisField,
const int thisIndex,
const XT_Function * f);
- void unfix_source(const string nodesetName,
+ void unfix_source(const std::string nodesetName,
const FieldName thisField,
const int thisIndex);
/** get initial conditions */
void set_initial_conditions(const double time,
FIELDS & fields,
FIELDS & dot_fields,
FIELDS & ddot_fields,
FIELDS & dddot_fields);
/** get "boundary" conditions on fields */
void set_fixed_fields(const double time,
FIELDS & fields,
FIELDS & dot_fields,
FIELDS & ddot_fields,
FIELDS & dddot_fields);
/** get "boundary" conditions on a single field */
void set_fixed_field(const double time,
const FieldName & fieldName,
DENS_MAT & fieldMatrix);
/** get "boundary" conditions on a single time derivative field */
void set_fixed_dfield(const double time,
const FieldName & fieldName,
DENS_MAT & dfieldMatrix);
/** get "sources" (flux and sources: divided by leading coef of ODE) */
void set_sources(const double time,
FIELDS & sources);
/** debugging status output */
void print(void);
private:
/** number of unique nodes */
int nNodes_;
/** number of elements */
int nElems_;
/** names and sizes of fields */
- map<FieldName,int> fieldSizes_;
+ std::map<FieldName,int> fieldSizes_;
/** access to all the FE computations */
FE_Engine * feEngine_;
// node numbering & dof numbering : contiguous
// fieldname & bc_type : types/enums
/** ics : XT_Function * f = ics_[field](inode,idof) */
- map < FieldName, Array2D < XT_Function * > > ics_;
+ std::map < FieldName, Array2D < XT_Function * > > ics_;
/** bcs: essential bcs XT_Function * f = bcs_[field][face](idof) */
- map < FieldName, Array2D < XT_Function * > > bcs_;
+ std::map < FieldName, Array2D < XT_Function * > > bcs_;
/** sources : XT_Function * f = faceSources_[field][face](idof) */
- map < FieldName, map < pair <int, int>, Array < XT_Function * > > >
+ std::map < FieldName, std::map < std::pair <int, int>, Array < XT_Function * > > >
faceSources_;
/** sources : UXT_Function * f = faceSourcesRobin_[field][face](idof) */
- map < FieldName, map < pair <int, int>, Array < UXT_Function * > > >
+ std::map < FieldName, std::map < std::pair <int, int>, Array < UXT_Function * > > >
faceSourcesRobin_;
/** sources : XT_Function * f = elementSources_[field](ielem,idof) */
- map < FieldName, Array2D < XT_Function * > > elementSources_;
+ std::map < FieldName, Array2D < XT_Function * > > elementSources_;
/** values of bcs in a compact set */
- map < FieldName, BCS > bcValues_;
+ std::map < FieldName, BCS > bcValues_;
};
}
#endif
diff --git a/lib/atc/Quadrature.h b/lib/atc/Quadrature.h
index 1b87a232c..7854e9c3f 100644
--- a/lib/atc/Quadrature.h
+++ b/lib/atc/Quadrature.h
@@ -1,27 +1,26 @@
#ifndef QUADRATURE_H
#define QUADRATURE_H
namespace ATC {
/**
* @class Quadrature
* @brief create quadrature lists
*/
class Quadrature {
public:
/** Static instance of this class */
static Quadrature * instance();
/** Destroy */
static void Destroy();
/** domain of integration is -1 to 1 */
void set_line_quadrature(const int ng, double* xg, double* wg);
protected:
Quadrature();
private:
static Quadrature * myInstance_;
};
}
-
#endif
diff --git a/lib/atc/SchrodingerSolver.cpp b/lib/atc/SchrodingerSolver.cpp
index f66864337..191ddbb46 100644
--- a/lib/atc/SchrodingerSolver.cpp
+++ b/lib/atc/SchrodingerSolver.cpp
@@ -1,547 +1,559 @@
// ATC Headers
#include "SchrodingerSolver.h"
#include "ATC_Error.h"
#include "ATC_Coupling.h"
#include "LammpsInterface.h"
#include "PrescribedDataManager.h"
#include "PhysicsModel.h"
#include "LinearSolver.h"
#include "PoissonSolver.h"
+#include <utility>
+
+using std::pair;
+using std::set;
+
const double tol = 1.e-8;
const double zero_tol = 1.e-12;
const double f_tol = 1.e-8;
namespace ATC {
enum oneDconservationEnum {ONED_DENSITY=0, ONED_FLUX};
double fermi_dirac(const double E, const double T)
{
double f = 1.0;
if (T > 0) f = 1.0 / ( exp(E/kBeV_/T)+1.0 );
else if (E > 0) f = 0;
return f;
};
//--------------------------------------------------------
// Schrodinger solve
//--------------------------------------------------------
SchrodingerSolver::SchrodingerSolver(
const FieldName fieldName,
const PhysicsModel * physicsModel,
const FE_Engine * feEngine,
const PrescribedDataManager * prescribedDataMgr,
/*const*/ ATC_Coupling * atc,
const int solverType,
bool parallel
)
: atc_(atc),
feEngine_(feEngine),
prescribedDataMgr_(prescribedDataMgr),
physicsModel_(physicsModel),
fieldName_(fieldName),
solver_(NULL),
solverType_(solverType),
nNodes_(atc->num_nodes()),
parallel_(parallel)
{
}
SchrodingerSolver::~SchrodingerSolver()
{
if (solver_) delete solver_;
}
void SchrodingerSolver::initialize()
{
SPAR_MAT sparseM;
atc_->fe_engine()->compute_mass_matrix(sparseM);
M_ = sparseM.dense_copy();
}
bool SchrodingerSolver::solve(FIELDS & fields)
{
// typedef struct{float real, imag;} COMPLEX;
SPAR_MAT stiffness_;
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX);
rhsMask = false;
rhsMask(ELECTRON_WAVEFUNCTION,FLUX) = true;
rhsMask(ELECTRON_WAVEFUNCTION,SOURCE) = true;
pair<FieldName,FieldName> row_col(ELECTRON_WAVEFUNCTION,
ELECTRON_WAVEFUNCTION);
//set_fixed_nodes();
atc_->fe_engine()->compute_tangent_matrix(
rhsMask, row_col, atc_->fields(), physicsModel_,
atc_->element_to_material_map(), stiffness_);
DENS_MAT K(stiffness_.dense_copy());
set<int> fixedNodes = prescribedDataMgr_->fixed_nodes(ELECTRON_WAVEFUNCTION);
const BC_SET & bcs
= (prescribedDataMgr_->bcs(ELECTRON_WAVEFUNCTION))[0];
DENS_MAT & psi = (atc_->field(ELECTRON_WAVEFUNCTION)).set_quantity();
DENS_MAT & eVecs = (atc_->field(ELECTRON_WAVEFUNCTIONS)).set_quantity();
DENS_MAT & eVals = (atc_->field(ELECTRON_WAVEFUNCTION_ENERGIES)).set_quantity();
if (prescribedDataMgr_->all_fixed(ELECTRON_WAVEFUNCTION)) {
ATC::LammpsInterface::instance()->print_msg("all wavefunctions fixed");
psi.reset(nNodes_,1);
eVecs.reset(nNodes_,1);
eVals.reset(nNodes_,1);
return true;
}
// (1) Helmholtz solve for inhomongeneous bcs
LinearSolver helmholtzSolver_(K,bcs,LinearSolver::AUTO_SOLVE,-1,parallel_);
psi.reset(nNodes_,1);
// (2) Eigenvalue solve
helmholtzSolver_.eigen_system(eVals,eVecs,&M_);
return true;
}
//--------------------------------------------------------
// Schrodinger solve on slices
//--------------------------------------------------------
SliceSchrodingerSolver::SliceSchrodingerSolver(
const FieldName fieldName,
const PhysicsModel * physicsModel,
const FE_Engine * feEngine,
const PrescribedDataManager * prescribedDataMgr,
/*const*/ ATC_Coupling * atc,
const Array< set<int> > & oneDslices,
const int solverType,
bool parallel
)
- : SchrodingerSolver(fieldName, physicsModel, feEngine, prescribedDataMgr, atc, solverType, parallel),
+ : SchrodingerSolver(fieldName, physicsModel, feEngine, prescribedDataMgr,
+ atc, solverType, parallel),
oneDslices_(oneDslices)
{
}
SliceSchrodingerSolver::~SliceSchrodingerSolver()
{
}
void SliceSchrodingerSolver::initialize()
{
SchrodingerSolver::initialize();
}
bool SliceSchrodingerSolver::solve(FIELDS & fields)
{
// fields
DENS_MAT & psi = (atc_->field(ELECTRON_WAVEFUNCTION)).set_quantity();
DENS_MAT & eVecs = (atc_->field(ELECTRON_WAVEFUNCTIONS)).set_quantity();
DENS_MAT & eVals = (atc_->field(ELECTRON_WAVEFUNCTION_ENERGIES)).set_quantity();
psi.reset(nNodes_,1);
eVecs.reset(nNodes_,nNodes_);
eVals.reset(nNodes_,1);
DENS_MAT & Ef = (atc_->field(FERMI_ENERGY)).set_quantity();
DENS_MAT & n = (atc_->field(ELECTRON_DENSITY)).set_quantity();
DENS_MAT & T = (atc_->field(ELECTRON_TEMPERATURE)).set_quantity();
// stiffness = K + V M
SPAR_MAT stiffness_;
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX);
rhsMask = false;
rhsMask(ELECTRON_WAVEFUNCTION,FLUX) = true;
rhsMask(ELECTRON_WAVEFUNCTION,SOURCE) = true;
pair<FieldName,FieldName> row_col(ELECTRON_WAVEFUNCTION,
ELECTRON_WAVEFUNCTION);
atc_->fe_engine()->compute_tangent_matrix(
rhsMask, row_col, atc_->fields(), physicsModel_,
atc_->element_to_material_map(), stiffness_);
DENS_MAT K(stiffness_.dense_copy());
// Eigenvalue solve
DENS_MAT K1,M1;
int nslices = oneDslices_.size();
DENS_MAT b ;
DENS_MAT evals1,evecs1 ;
DENS_MAT n1 ;
BCS bcs;
set <int> one;
one.insert(0);
set <int> eindex;
int iEVal = 0;
for (int islice = 0; islice < nslices ; islice++) {
set<int> & slice = oneDslices_(islice);
int snodes = slice.size();
prescribedDataMgr_->bcs(ELECTRON_WAVEFUNCTION,slice,bcs,true);
const BC_SET & bc = bcs[0];
int nfixed = bc.size();
if (nfixed != snodes) {
K.map(slice,slice,K1);
M_.map(slice,slice,M1);
LinearSolver eigensolver(K1,bc,LinearSolver::AUTO_SOLVE,-1,parallel_);
// wave functions
evals1.reset(snodes,1);
evecs1.reset(snodes,snodes);
eigensolver.eigen_system(evals1,evecs1,&M1);
eindex.clear();
for (int j = 0; j < snodes; j++) eindex.insert(iEVal++);
eVals.insert(eindex,one, evals1);
eindex.clear();
for (int j = 0; j < snodes; j++) eindex.insert(j);
eVecs.insert(slice,eindex,evecs1);
// electron density
n1.reset(snodes,1);
set<int>::const_iterator iset;
double aveE_f = 0;
for (iset = slice.begin(); iset != slice.end(); iset++) {
int gnode = *iset;
aveE_f += Ef(gnode,0);
}
aveE_f /= snodes;
int node = 0;
for (iset = slice.begin(); iset != slice.end(); iset++) { // node
int gnode = *iset;
double temp = T(gnode,0);
//double E_f = Ef(gnode,0);
for (int mode = 0; mode < snodes-nfixed; mode++) {
double Ei = evals1(mode,0);
double E = Ei-aveE_f;
double f = fermi_dirac(E,temp);
if (f < f_tol) break; // take advantage of E ordering
double psi1 = evecs1(node,mode); // 2nd index corresp to evals order
n1(node,0) += psi1*psi1*f;
}
node++;
}
n.insert(slice,one, n1); // note not "assemble"
}
}
return true;
}
//--------------------------------------------------------
// Schrodinger-Poisson Manager
//--------------------------------------------------------
SchrodingerPoissonManager::SchrodingerPoissonManager() :
maxConsistencyIter_(0),
maxConstraintIter_(0),
oneD_(false),
oneDconserve_(ONED_FLUX),
Ef_shift_(0.),
safe_dEf_(0.)
{
}
SchrodingerPoissonManager::~SchrodingerPoissonManager()
{
}
bool SchrodingerPoissonManager::modify(int narg, char **arg)
{
bool match = false;
int argIndx = 0;
if (strcmp(arg[argIndx],"self_consistency")==0) {
argIndx++;
maxConsistencyIter_ = atoi(arg[argIndx]);
match = true;
}
else if (strcmp(arg[argIndx],"conserve")==0) {
oneD_ = true;
argIndx++;
if (strcmp(arg[argIndx],"density")==0) oneDconserve_ = ONED_DENSITY;
else oneDconserve_ = ONED_FLUX;
argIndx++;
maxConstraintIter_ = atoi(arg[argIndx]);
match = true;
}
else if (strcmp(arg[argIndx],"initial_fermi_level")==0) {
argIndx++;
Ef_shift_ = atof(arg[argIndx]);
match = true;
}
else if (strcmp(arg[argIndx],"safe_fermi_increment")==0) {
argIndx++;
safe_dEf_ = atof(arg[argIndx]);
match = true;
}
return match;
}
SchrodingerPoissonSolver * SchrodingerPoissonManager::initialize(
/*const*/ ATC_Coupling * atc,
SchrodingerSolver * schrodingerSolver,
PoissonSolver * poissonSolver,
const PhysicsModel * physicsModel
)
{
SchrodingerPoissonSolver * ptr;
if (oneD_) {
- ptr = new SliceSchrodingerPoissonSolver(atc,schrodingerSolver,poissonSolver,physicsModel,maxConsistencyIter_,
- maxConstraintIter_, oneDconserve_, Ef_shift_, safe_dEf_);
+ ptr = new SliceSchrodingerPoissonSolver(atc,
+ schrodingerSolver,poissonSolver,physicsModel,maxConsistencyIter_,
+ maxConstraintIter_, oneDconserve_, Ef_shift_, safe_dEf_);
}
else {
- ptr = new SchrodingerPoissonSolver(atc,schrodingerSolver,poissonSolver,physicsModel,maxConsistencyIter_);
+ ptr = new SchrodingerPoissonSolver(atc,
+ schrodingerSolver,poissonSolver,physicsModel,maxConsistencyIter_);
}
return ptr;
}
//-------------------------------------------------------------------
// SchrodingerPoissonSolver
//-------------------------------------------------------------------
SchrodingerPoissonSolver::SchrodingerPoissonSolver(
/*const*/ ATC_Coupling * atc,
SchrodingerSolver * schrodingerSolver,
PoissonSolver * poissonSolver,
const PhysicsModel * physicsModel,
int maxConsistencyIter
) :
atc_(atc),
schrodingerSolver_(schrodingerSolver),
poissonSolver_(poissonSolver),
physicsModel_(physicsModel),
maxConsistencyIter_(maxConsistencyIter),
nNodes_(atc_->num_nodes())
{
}
SchrodingerPoissonSolver::~SchrodingerPoissonSolver(void)
{
}
void SchrodingerPoissonSolver::solve(FIELDS & rhs, GRAD_FIELD_MATS & fluxes)
{
+ if ((atc_->prescribed_data_manager()->all_fixed(ELECTRON_WAVEFUNCTION))
+ && (atc_->prescribed_data_manager()->all_fixed(ELECTRIC_POTENTIAL))) {
+ return;
+ }
double norm = 1.0, norm0 = 1.0; // normPrev = 1.0;
DENS_MAT nPrev,psiPrev,phiPrev;
DENS_MAT & psi = (atc_->field(ELECTRON_WAVEFUNCTIONS)).set_quantity();
DENS_MAT & phi = (atc_->field(ELECTRIC_POTENTIAL)).set_quantity();
DENS_MAT & E_I = (atc_->field(ELECTRON_WAVEFUNCTION_ENERGIES)).set_quantity();
DENS_MAT & Te = (atc_->field(ELECTRON_TEMPERATURE)).set_quantity();
atc_->set_fixed_nodes();
DENS_MAT Te0 = Te; // save
const double tol = 1.e-4;
// double Tmax = Te.max();
int k = 0;
double logRatio = 3;
int maxIter = (int) logRatio;
double base = 2.0;
// temperature relaxation loop
for (int i = 0; i < maxIter ; ++i) {
//double alpha = ((double) i) /( (double) maxIter-1);
//double beta = 0.1;
//alpha = (exp(beta*i)-1.0)/(exp(beta*(maxIter-1))-1.0);
double alpha = pow(base,logRatio-i-1);
// self consistency loop
int j = 0; // for storage of last iterate
for (j = 0; j < maxConsistencyIter_ ; ++j) {
// compute eigen-values and vectors
atc_->set_fixed_nodes();
Te = alpha*Te0;
schrodingerSolver_->solve(atc_->fields());
for (int l = 0; l < nNodes_; l++) {
int count = 0;
double T_e = Te(l,0);
for (int m = 0; m < nNodes_; m++) {
double f = fermi_dirac(E_I(m,0), T_e);
if (f > tol) count++;
}
}
// compute charge density
DENS_MAN & n = atc_->field(ELECTRON_DENSITY);
//(n.quantity()).print("DENSITY");
atc_->nodal_projection(ELECTRON_DENSITY,physicsModel_,n);
atc_->set_fixed_nodes();
// solve poisson eqn for electric potential
atc_->set_fixed_nodes();
Te = alpha*Te0;
poissonSolver_->solve(atc_->fields(),rhs);
//DENS_MAT dn = n;
//DENS_MAT dpsi = psi;
//DENS_MAT dphi = phi;
if (i == 0 && j==0) {
nPrev = n.quantity();
psiPrev = psi;
phiPrev = phi;
}
//dn -= nPrev;
//dpsi -= psiPrev;
//dphi -= phiPrev;
norm = (n.quantity()-nPrev).norm();
if (i == 0 && j==0) norm0 = (n.quantity()).norm();
//normPrev = norm;
//psi_normPrev = psi_norm;
//phi_normPrev = phi_norm;
nPrev = n.quantity();
psiPrev = psi;
phiPrev = phi;
k++;
if (j > 0 && norm <= tol*norm0) break;
}
// Tmax_ *= 0.5;
}
}
//----------------------------------------------------------------------------
// SchrodingerPoissonSolver
//-------------------------------------------------------------------
SliceSchrodingerPoissonSolver::SliceSchrodingerPoissonSolver(
/*const*/ ATC_Coupling * atc,
SchrodingerSolver * schrodingerSolver,
PoissonSolver * poissonSolver,
const PhysicsModel * physicsModel,
int maxConsistencyIter,
int maxConstraintIter,
int oneDconserve,
double Ef_shift,
double safe_dEf
) :
SchrodingerPoissonSolver(atc,schrodingerSolver,poissonSolver,physicsModel,maxConsistencyIter),
maxConstraintIter_(maxConstraintIter),
oneDconserve_(oneDconserve),
oneDcoor_(0),
Ef_shift_(Ef_shift),
safe_dEf_(safe_dEf),
oneDslices_(((SliceSchrodingerSolver *) schrodingerSolver_)->slices())
{
EfHistory_.reset(oneDslices_.size(),2);
}
SliceSchrodingerPoissonSolver::~SliceSchrodingerPoissonSolver(void)
{
}
void SliceSchrodingerPoissonSolver::solve(FIELDS & rhs, GRAD_FIELD_MATS & fluxes)
{
const double tol = 1.e-4; // tolerance on consistency & constraint
double norm = 1.0, norm0 = 1.0;
DENS_MAT nPrev;
DENS_MAT & n = (atc_->field(ELECTRON_DENSITY)).set_quantity();
DENS_MAT & phi = (atc_->field(ELECTRIC_POTENTIAL)).set_quantity();
// fermi energy
DENS_MAT & Ef = (atc_->field(FERMI_ENERGY)).set_quantity();
Ef.reset(nNodes_,1);
int nslices = oneDslices_.size();
Array2D<double> nHistory(nslices,2);
// target for constraint
double target = 0.0;
set<int> & slice = oneDslices_(0); // note assume first slice is fixed
if (oneDconserve_ == ONED_FLUX) atc_->set_sources();
DENS_MAT & nSource = (atc_->source(ELECTRON_DENSITY)).set_quantity();
for (set<int>::const_iterator iset = slice.begin(); iset != slice.end(); iset++) {
if (oneDconserve_ == ONED_FLUX) target += nSource(*iset,0);
else target += n(*iset,0);
}
target /= slice.size();
// self consistency loop between Phi and n(psi_i)
double error = 1.0;
for (int i = 0; i < maxConsistencyIter_ ; ++i) {
atc_->set_fixed_nodes();
if (! atc_->prescribedDataMgr_->all_fixed(ELECTRIC_POTENTIAL) )
poissonSolver_->solve(atc_->fields(),rhs);
if (! atc_->prescribedDataMgr_->all_fixed(ELECTRON_DENSITY) ) {
// iterate on Ef
//if (i==0) Ef = -1.0*phi;// E ~ -|e| \Phi, charge of electron e = 1
Ef = -1.0*phi; // E ~ -|e| \Phi, charge of electron e = 1 in eV
Ef +=Ef_shift_;
for (int j = 0; j < maxConstraintIter_ ; ++j) {
schrodingerSolver_->solve(atc_->fields());
atc_->set_fixed_nodes();
error = update_fermi_energy(target,(j==0),fluxes);
// exit condition based on constraint satisfaction
if (error < tol*target) break;
} // loop j : flux constraint
// error based on change in field (Cauchy convergence)
if (i == 0) {
norm = norm0 = n.norm();
}
else {
DENS_MAT dn = n;
dn -= nPrev;
norm = dn.norm();
}
nPrev = n;
if (i > 0 && norm <= tol*norm0 && error < tol) break;
}
} // loop i : self consistency
}
//--------------------------------------------------------
// update fermi energy
//--------------------------------------------------------
double SliceSchrodingerPoissonSolver::update_fermi_energy
(double target, bool first, GRAD_FIELD_MATS & fluxes)
{
DENS_MAT & Ef = (atc_->field(FERMI_ENERGY)).set_quantity();
double safe_dEf = safe_dEf_;
DENS_MAT & n = (atc_->field(ELECTRON_DENSITY)).set_quantity();
const DENS_MAT * y = &n;
if (oneDconserve_ == ONED_FLUX) { // compute J_x
Array2D <bool> rhsMask(NUM_FIELDS,NUM_FLUX); rhsMask = false;
rhsMask(ELECTRON_DENSITY,FLUX) = true;
atc_->compute_flux(rhsMask,atc_->fields_,fluxes,physicsModel_);
y = & ( fluxes[ELECTRON_DENSITY][oneDcoor_] );
}
BCS bcs;
double error = 0;
// slice
for (int islice = 0; islice < oneDslices_.size(); islice++) {
set<int> & slice = oneDslices_(islice);
int nSlice = slice.size();
//atc_->prescribedDataMgr_->bcs(ELECTRON_DENSITY,slice,bcs,true);
atc_->prescribedDataMgr_->bcs(ELECTRON_WAVEFUNCTION,slice,bcs,true);
const BC_SET & bc = bcs[0];
int nFixed = bc.size();
if (nFixed == nSlice) continue;
double Y = 0.0, X = 0.0;
double nave = 0.0;
for (set<int>::const_iterator iset = slice.begin(); iset != slice.end(); iset++) {
int gnode = *iset;
X += Ef(gnode,0);
Y += (*y)(gnode,0);
nave += n(gnode,0);
}
X /= nSlice;
Y /= nSlice;
nave /= nSlice;
double dY = Y - EfHistory_(islice,0);
double dX = X - EfHistory_(islice,1);
if (fabs(dY) < zero_tol*dX) throw ATC_Error("zero increment in conserved field on slice");
double err = target - Y;
if (target*Y < -zero_tol*target) {
//throw ATC_Error("target and quantity opposite signs");
ATC::LammpsInterface::instance()->print_msg_once("WARNING: target and quantity opposite signs");
}
error += fabs(err);
//error = max(error,err);
double dEf = err / dY * dX;
if (first) {
dEf = (err < 0) ? -safe_dEf : safe_dEf;
}
else if (fabs(dEf) > safe_dEf) {
dEf = safe_dEf * dEf / fabs(dEf);
}
for (set<int>::const_iterator iset = slice.begin(); iset != slice.end(); iset++) {
int gnode = *iset;
Ef(gnode,0) += dEf;
}
EfHistory_(islice,0) = Y;
EfHistory_(islice,1) = X;
} // loop slice
return error;
}
};
diff --git a/lib/atc/SchrodingerSolver.h b/lib/atc/SchrodingerSolver.h
index a2c3a94f0..e190c8eae 100644
--- a/lib/atc/SchrodingerSolver.h
+++ b/lib/atc/SchrodingerSolver.h
@@ -1,203 +1,204 @@
#ifndef SCHRODINGER_SOLVER_H
#define SCHRODINGER_SOLVER_H
// ATC includes
#include "Array2D.h"
#include "LinearSolver.h"
// other includes
#include <vector>
#include <map>
+#include <set>
namespace ATC {
// Forward class declarations
class ATC_Coupling;
class FE_Engine;
class PrescribedDataManager;
class PhysicsModel;
class PoissonSolver;
/**
* @class SchrodingerSolver
* @brief a class to solve the (time-independent) Schrodinger equation
*/
class SchrodingerSolver {
public:
/** Constructor */
SchrodingerSolver(
const FieldName fieldName,
const PhysicsModel * physicsModel,
const FE_Engine * feEngine,
const PrescribedDataManager * prescribedDataMgr,
/*const*/ ATC_Coupling * atc,
const int solverType = ATC::LinearSolver::DIRECT_SOLVE,
bool parallel = false
);
/** Destructor */
virtual ~SchrodingerSolver();
/** parser */
bool modify(int narg, char **arg){ return false;}
/** initialize */
void initialize(void);
/** solve */
virtual bool solve(FIELDS & fields);
protected:
/** Pointer to ATC */
ATC_Coupling * atc_;
/** Pointer to FE_Engine */
const FE_Engine * feEngine_;
/** Pointer to PrescribedDataManager */
const PrescribedDataManager * prescribedDataMgr_;
/** Pointer to FE_Engine */
const PhysicsModel * physicsModel_;
/** field to solve for */
FieldName fieldName_;
/** linear solver */
LinearSolver * solver_;
int solverType_;
/** number of nodes */
int nNodes_;
/** stiffness matrix */
//SPAR_MAT stiffness_;
//SPAR_MAT massMatrix_;
DENS_MAT M_;
bool parallel_;
};
class SliceSchrodingerSolver : public SchrodingerSolver {
public:
/** Constructor */
SliceSchrodingerSolver(
const FieldName fieldName,
const PhysicsModel * physicsModel,
const FE_Engine * feEngine,
const PrescribedDataManager * prescribedDataMgr,
/*const*/ ATC_Coupling * atc,
- const Array< set<int> > & oneDslices,
+ const Array< std::set<int> > & oneDslices,
const int solverType = ATC::LinearSolver::DIRECT_SOLVE,
bool parallel = false
);
/** Destructor */
virtual ~SliceSchrodingerSolver();
/** parser */
bool modify(int narg, char **arg){return false;}
/** initialize */
void initialize(void);
/** solve */
virtual bool solve(FIELDS & fields);
- Array< set<int> > & slices(void){ return oneDslices_;}
+ Array< std::set<int> > & slices(void){ return oneDslices_;}
protected:
- Array< set<int> > oneDslices_;
+ Array< std::set<int> > oneDslices_;
};
class SchrodingerPoissonSolver {
public:
SchrodingerPoissonSolver(
/*const*/ ATC_Coupling * atc,
SchrodingerSolver * schrodingerSolver,
PoissonSolver * poissonSolver,
const PhysicsModel * physicsModel,
int maxConsistencyIter
);
virtual ~SchrodingerPoissonSolver(void);
virtual void solve(
FIELDS & rhs,
GRAD_FIELD_MATS & fluxes
);
protected:
ATC_Coupling * atc_;
SchrodingerSolver * schrodingerSolver_;
PoissonSolver * poissonSolver_;
const PhysicsModel * physicsModel_;
int maxConsistencyIter_;
int nNodes_;
};
class SliceSchrodingerPoissonSolver : public SchrodingerPoissonSolver {
public:
SliceSchrodingerPoissonSolver(
/*const*/ ATC_Coupling * atc,
SchrodingerSolver * schrodingerSolver,
PoissonSolver * poissonSolver,
const PhysicsModel * physicsModel,
int maxConsistencyIter,
int maxConstraintIter,
int oneDconserve,
double Ef_shift,
double safe_dEf
);
virtual ~SliceSchrodingerPoissonSolver(void);
virtual void solve(
FIELDS & rhs,
GRAD_FIELD_MATS & fluxes
);
protected:
double update_fermi_energy(double target, bool first,
GRAD_FIELD_MATS & fluxes);
int maxConstraintIter_;
int oneDconserve_;
int oneDcoor_;
double Ef_shift_;
double safe_dEf_;
- Array< set<int> > & oneDslices_;
+ Array< std::set<int> > & oneDslices_;
Array2D<double> EfHistory_;
};
class SchrodingerPoissonManager {
public:
SchrodingerPoissonManager();
~SchrodingerPoissonManager();
/** parser */
bool modify(int narg, char **arg);
/** initialize */
SchrodingerPoissonSolver * initialize(
/*const*/ ATC_Coupling * atc,
SchrodingerSolver * schrodingerSolver,
PoissonSolver * poissonSolver,
const PhysicsModel * physicsModel
);
protected:
int maxConsistencyIter_;
int maxConstraintIter_;
bool oneD_;
int oneDconserve_;
double Ef_shift_;
double safe_dEf_;
};
} // namespace ATC
#endif
diff --git a/lib/atc/SparseMatrix-inl.h b/lib/atc/SparseMatrix-inl.h
index 56401f64d..066a3a121 100644
--- a/lib/atc/SparseMatrix-inl.h
+++ b/lib/atc/SparseMatrix-inl.h
@@ -1,1066 +1,1066 @@
#ifndef SPARSEMATRIX_INL_H
#define SPARSEMATRIX_INL_H
#include "mpi.h"
#include "DenseVector.h"
namespace ATC_matrix {
template <typename T>
TRI_COORD<T>::TRI_COORD(INDEX row, INDEX col) : i(row), j(col) {}
template <typename T>
TRI_COORD<T>::TRI_COORD(INDEX row, INDEX col, T val, bool add_to)
: i(row), j(col), v(val), add(add_to) {}
//-----------------------------------------------------------------------------
// default constructor - creates an empty sparsematrix with specified size
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T>::SparseMatrix(INDEX rows, INDEX cols)
: _val(NULL), _ia(NULL), _ja(NULL), _size(0), _nRowsCRS(0), hasTemplate_(false),
_nRows(rows),_nCols(cols) {}
//-----------------------------------------------------------------------------
// copy constructor
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T>::SparseMatrix(const SparseMatrix<T>& C)
: _val(NULL), _ia(NULL), _ja(NULL), hasTemplate_(false)
{
_copy(C);
}
//-----------------------------------------------------------------------------
// copy constructor - converts from DenseMatrix
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T>::SparseMatrix(const DenseMatrix<T>& C)
: _val(NULL), _ia(NULL), _ja(NULL), hasTemplate_(false)
{
reset(C);
}
//-----------------------------------------------------------------------------
// constructor - creates a sparse matrix given an array of row indeces,
// an array of col indeces, and an array of nonzero values.
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T>::SparseMatrix(INDEX* rows, INDEX* cols, T* vals,
INDEX size, INDEX nRows, INDEX nCols, INDEX nRowsCRS)
: hasTemplate_(true)
{
_val = vals;
_ia = rows;
_ja = cols;
_size = size;
_nRows = nRows;
_nCols = nCols;
_nRowsCRS = nRowsCRS;
}
//-----------------------------------------------------------------------------
// assigns internal storage for CRS
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::_create(INDEX size, INDEX nrows)
{
_size = size;
_nRowsCRS = nrows;
// assign memory to hold matrix
try
{
_val = (_size*nrows) ? new T [_size] : NULL;
_ia = (_size*nrows) ? new INDEX [_nRowsCRS+1] : NULL;
_ja = (_size*nrows) ? new INDEX [_size] : NULL;
}
catch (std::exception &e)
{
- cout << "Could not allocate SparseMatrix of "<< _size << " nonzeros.\n";
+ std::cout << "Could not allocate SparseMatrix of "<< _size << " nonzeros.\n";
ERROR_FOR_BACKTRACE
exit(EXIT_FAILURE);
}
if (!_ia) return;
// automatically handle the ends of rowpointer
*_ia = 0; // first non-zero is the zero index
_ia[_nRowsCRS] = _size; // last row pointer is the size
}
//-----------------------------------------------------------------------------
// cleans up internal storage, but retains nRows & nCols
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::_delete()
{
- vector<TRI_COORD<T> >().swap(_tri); // completely deletes _tri
+ std::vector<TRI_COORD<T> >().swap(_tri); // completely deletes _tri
if (_val) delete [] _val;
if (_ia) delete [] _ia;
if (_ja) delete [] _ja;
_size = _nRowsCRS = 0;
_val = NULL;
_ia = _ja = NULL;
}
//-----------------------------------------------------------------------------
// full memory copy of C into this
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::_copy(const SparseMatrix<T> &C)
{
compress(C);
_delete();
_create(C.size(), C._nRowsCRS);
if (_size) {
std::copy(C._val, C._val+_size, _val);
std::copy(C._ja, C._ja+_size, _ja);
}
if (_nRowsCRS) {
std::copy(C._ia, C._ia+_nRowsCRS+1, _ia);
}
_nCols = C._nCols;
_nRows = C._nRows;
if (_nCols > 0 && _nRows > 0) hasTemplate_ = true; // needs if since map seems to call the copy instead of the default constructor
}
// this version is accessible to derived classes
template<typename T>
void SparseMatrix<T>::copy(const SparseMatrix<T> &C)
{
_copy(C);
}
//----------------------------------------------------------------------------
// general sparse matrix assignment
//----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::_set_equal(const Matrix<T> &r)
{
this->resize(r.nRows(), r.nCols());
const Matrix<T> *ptr_r = &r;
const SparseMatrix<T> *s_ptr = dynamic_cast<const SparseMatrix<T>*>(ptr_r);
if (s_ptr) this->reset(*s_ptr);
else if (dynamic_cast<const DiagonalMatrix<T>*>(ptr_r))
for (INDEX i=0; i<r.size(); i++) set(i,i,r[i]);
else if (dynamic_cast<const DenseMatrix<T>*>(ptr_r)) this->reset(r);
else
{
- cout <<"Error in general sparse matrix assignment\n";
+ std::cout <<"Error in general sparse matrix assignment\n";
exit(1);
}
}
// General flat index by value operator (by nth nonzero)
template <typename T> inline T SparseMatrix<T>::operator[](INDEX i) const
{
VICK(i); return _val[i];
}
// General flat index by reference operator (by nth nonzero)
template <typename T> inline T& SparseMatrix<T>::operator[](INDEX i)
{
VICK(i); return _val[i];
}
template<typename T>
T SparseMatrix<T>::_zero = T(0);
//-----------------------------------------------------------------------------
// triplet comparison operator returns true if x < y
//-----------------------------------------------------------------------------
template <typename T>
bool triplet_comparision(const TRI_COORD<T> &x, const TRI_COORD<T> &y)
{
const bool row_less = (x.i) < (y.i);
const bool row_equal = (x.i) == (y.i);
const bool col_less = (x.j) < (y.j);
return (row_less || (row_equal && col_less));
}
//-----------------------------------------------------------------------------
// triplet comparison operator returns true if x == y
//-----------------------------------------------------------------------------
template <typename T>
bool triplets_equal(const TRI_COORD<T> &x, const TRI_COORD<T> &y)
{
return x.i==y.i && x.j==y.j;
}
//-----------------------------------------------------------------------------
// multiply sparse matrix by a vector
//-----------------------------------------------------------------------------
template<typename T>
DenseVector<T> operator*(const SparseMatrix<T> &A, const Vector<T>& x)
{
DenseVector<T> y(A.nRows(), true);
A.MultMv(x, y);
return y;
}
//-----------------------------------------------------------------------------
// multiply a vector by a sparse matrix
//-----------------------------------------------------------------------------
template<typename T>
DenseVector<T> operator*(const Vector<T>& x, const SparseMatrix<T> &A)
{
return A.transMat(x);
}
//-----------------------------------------------------------------------------
// multiply sparse matrix by dense matrix
//-----------------------------------------------------------------------------
template<typename T>
DenseMatrix<T> operator*(const SparseMatrix<T> &A, const Matrix<T>& D)
{
DenseMatrix<T> C(A.nRows(), D.nCols(), true); // initialized to zero
A.MultAB(D, C);
return C;
}
//-----------------------------------------------------------------------------
// multiply sparse matrix by a diagonal matrix - scales each column
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T> operator*(const SparseMatrix<T> &A, const DiagonalMatrix<T>& D)
{
GCK(A, D, A.nCols()!=D.nRows(),"SparseMatrix * DiagonalMatrix")
SparseMatrix<T> C(A); // C has same sparcity as A
// C(i,j) = A(i,k) * D(k, j) * j==k
INDEX i, ij;
for (i=0; i<A._nRowsCRS; i++)
for (ij=A._ia[i]; ij<A._ia[i+1]; ij++)
C[ij] = A._val[ij]*D(A._ja[ij],A._ja[ij]);
return C;
}
//-----------------------------------------------------------------------------
// multiplies two sparse matrices - assumes their output is sparse
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T> operator*(const SparseMatrix<T> &A, const SparseMatrix<T> &B)
{
SparseMatrix<T> At(A.transpose());
SparseMatrix<T>::compress(B);
GCK(A, B, A.nCols()!=B.nRows(), "SparseMatrix * SparseMatrix");
SparseMatrix<T> C(A.nRows(), B.nCols());
if (At.empty() || B.empty()) return C;
INDEX k, ki, kj;
INDEX K = std::min(At._nRowsCRS, B._nRowsCRS);
for (k=0; k<K; k++) // loop over rows of A or B (smallest)
for (ki=At._ia[k]; ki<At._ia[k+1]; ki++) // loop over row nonzeros of A
for (kj=B._ia[k]; kj<B._ia[k+1]; kj++) // loop over row nonzeros of B
C.add(At._ja[ki], B._ja[kj], At[ki]*B[kj]); // C(i,j) = At(k,i)*B(k, j)
C.compress();
return C;
}
//-----------------------------------------------------------------------------
// returns the first row number with a nonzero entry or -1 if no rows
//-----------------------------------------------------------------------------
template<typename T>
int SparseMatrix<T>::_first_nonzero_row_crs() const
{
if (!_nRowsCRS) return -1;
INDEX r;
for (r=0; r<_nRowsCRS; r++)
if (_ia[r+1]>0) return r;
return -1;
}
//-----------------------------------------------------------------------------
// converts T to CRS
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::compress(const SparseMatrix<T> &C)
{
const_cast<SparseMatrix<T>*>(&C)->compress();
}
//-----------------------------------------------------------------------------
// merges all the _tri triples with CRS storage
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::compress()
{
if (_tri.empty()) return;
// Sort and find the number of unique triplets.
// Triplet values will all be not present in existing CRS structure.
const INDEX nUnique = CountUniqueTriplets();
// Max number of rows in new CRS structure.
const INDEX nRows = std::max((INDEX)_tri.back().i+1, _nRowsCRS);
// make a new CRS structure
INDEX *ia = new INDEX [nRows+1];
INDEX *ja = new INDEX [nUnique];
T *val = new T [nUnique];
// Set first and last row ptr to 0 and nnz respectively.
// Set all else to a flagvalue MAX_UNSIGNED (~0).
ia[0] = 0;
INDEX i;
for (i=1; i<nRows; i++) ia[i]=~0; // ~0 is max(INDEX)
ia[nRows] = nUnique;
INDEX crs_pt, crs_row;
unsigned tri_ct; // must be unsigned to interface with std::vector without warnings
// Get the first CRS and triplet coordinates (if they exist).
TRI_COORD<T> nextCRS, nextTRI(_tri[0]), next;
int first_row = _first_nonzero_row_crs();
if (first_row != -1) nextCRS = TRI_COORD<T>(first_row, _ja[0], _val[0]);
// merge sorted triplets into a new CRS structure
crs_pt = crs_row = tri_ct = 0; // initialize counters
for (i=0; i<nUnique; i++)
{
// is the next non-zero in the new triplet vector
if (tri_ct < _tri.size()
&& (triplet_comparision(nextTRI, nextCRS) || crs_pt>=_size)) {
next = nextTRI;
// advance the triplet counter, and skip voided TRIPLET entries
do tri_ct++;
while ( tri_ct<_tri.size() && _tri[tri_ct].j == ~0 );
// if not at the end of the vector, set the next triplet
if (tri_ct<_tri.size()) nextTRI = _tri[tri_ct];
}
// is the next nonzero in the old CRS data
else if (crs_pt < _size) {
next = nextCRS;
// Advance the CRS counter, don't set next if we are at the end.
if (++crs_pt < _size) {
// advance to the row corresponding to this value
while (crs_pt >= _ia[crs_row+1]) {
crs_row++;
}
nextCRS = TRI_COORD<T>(crs_row, _ja[crs_pt], _val[crs_pt]);
}
}
- else cout << "SparseMatrix - Error in compressing CRS\n";
+ else std::cout << "SparseMatrix - Error in compressing CRS\n";
// Add next to the new CRS structure.
// Is this a new row (is j>0 and is ja[j] == 0)?
if (ia[next.i]==~0) ia[next.i] = i;
ja[i] = next.j;
val[i] = next.v;
}
// sweep backwards through row pointers and check for skipped rows
for (i=nRows-1; i>0; i--) ia[i] = (ia[i]==~0) ? ia[i+1] : ia[i];
_delete();
_val = val;
_ia = ia;
_ja = ja;
_size = nUnique;
_nRowsCRS = nRows;
hasTemplate_=true;
}
//-----------------------------------------------------------------------------
// Sorts the triplets, condenses duplicates, and returns the # of unique values
//-----------------------------------------------------------------------------
template<typename T>
INDEX SparseMatrix<T>::CountUniqueTriplets()
{
if (_tri.empty()) return _size;
std::sort(_tri.begin(), _tri.end(), triplet_comparision<T>);
INDEX nUnique=1 + _size;
- typename vector<TRI_COORD<T> >::reverse_iterator t;
+ typename std::vector<TRI_COORD<T> >::reverse_iterator t;
// Loop backwards over all new triplets.
for (t = _tri.rbegin(); t+1!=_tri.rend(); ++t) {
// If this triplet is the same as the preceding one.
if (triplets_equal(*(t+1), *t)) {
if (t->add) (t+1)->v += t->v; // Add to previous
else (t+1)->v = t->v; // Replace previous -- DOES THIS WORK?
t->j = ~0; // Void this entry's column pointer
}
else nUnique++;
}
return nUnique;
}
//-----------------------------------------------------------------------------
// Checks if a value has been set
//-----------------------------------------------------------------------------
template<typename T>
bool SparseMatrix<T>::has_entry(INDEX i, INDEX j) const
{
if (has_entry_compressed(i,j)) return true;
if (has_entry_uncompressed(i,j)) return true;
return false;
}
template<typename T>
bool SparseMatrix<T>::has_entry_uncompressed(INDEX i, INDEX j) const
{
for (unsigned k=0; k<_tri.size() ; k++) {
if (_tri[k].i == i && _tri[k].j == j) return true;
}
return false;
}
template<typename T>
bool SparseMatrix<T>::has_entry_compressed(INDEX i, INDEX j) const
{
if (_size == 0) return false;
if (i >= _nRowsCRS) return false;
if (_ia[i] < _ia[i+1]) {
return -1 < ATC_Utility::search_sorted(_ja, j, _ia[i], _ia[i+1]);
}
return false;
}
//-----------------------------------------------------------------------------
// check if the matrix has been compressed at least once
//-----------------------------------------------------------------------------
template<typename T>
bool SparseMatrix<T>::has_template(void) const
{
return hasTemplate_;
}
//-----------------------------------------------------------------------------
// Index by copy operator - return zero if not found
//-----------------------------------------------------------------------------
template<typename T>
T SparseMatrix<T>::operator()(INDEX i, INDEX j) const
{
MICK(i,j); // Matrix Index ChecKing
compress(*this);
if (i>=_nRowsCRS || _ia[i+1]==_ia[i]) return 0.0;
INDEX f = std::lower_bound(_ja+_ia[i], _ja+_ia[i+1]-1, j) - _ja;
if (f>=_ia[i] && f<_ia[i+1] && _ja[f] == j) return _val[f];
return 0.0;
}
//-----------------------------------------------------------------------------
// Index by reference operator - add to _tri if not found
//-----------------------------------------------------------------------------
template<typename T>
T& SparseMatrix<T>::operator()(INDEX i, INDEX j)
{
MICK(i,j); // Matrix Index ChecKing
compress(*this);
if (i < _nRowsCRS && _ia[i+1]>_ia[i]) {
INDEX f = std::lower_bound(_ja+_ia[i], _ja+_ia[i+1]-1, j) - _ja;
if (f>=_ia[i] && f<_ia[i+1] && _ja[f] == j) return _val[f];
}
// NEVER use index operator as LHS to modify values not already in the
// sparcity pattern - the crude check below will only catch this on the
// second infraction.
- if (_zero != T(0)) cout << "Use add or set for SparseMatrix\n";
+ if (_zero != T(0)) std::cout << "Use add or set for SparseMatrix\n";
return _zero;
}
//-----------------------------------------------------------------------------
// Sets (i,j) to value
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::set(INDEX i, INDEX j, T v)
{
MICK(i,j); // Matrix Index ChecKing
if (i < _nRowsCRS)
{
const int loc = ATC_Utility::search_sorted(_ja, j, _ia[i], _ia[i+1]);
if (loc >=0 )
{
_val[loc] = v;
return;
}
}
_tri.push_back(TRI_COORD<T>(i,j,v,false));
}
//-----------------------------------------------------------------------------
// Adds (i,j) to value
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::add(INDEX i, INDEX j, T v)
{
MICK(i,j); // Matrix Index ChecKing
if (i < _nRowsCRS)
{
const int loc = ATC_Utility::search_sorted(_ja, j, _ia[i], _ia[i+1]);
if (loc >=0 )
{
_val[loc] += v;
return;
}
}
_tri.push_back(TRI_COORD<T>(i,j,v,true));
}
//-----------------------------------------------------------------------------
// returns a triplet value of the ith nonzero
//-----------------------------------------------------------------------------
template<typename T>
TRIPLET<T> SparseMatrix<T>::triplet(INDEX i) const
{
compress(*this);
if (i >= _ia[_nRowsCRS]) {
gerror("ERROR: tried indexing triplet of sparse matrix beyond range");
}
INDEX row(std::lower_bound(_ia, _ia+_nRowsCRS, i)-_ia);
row -= _ia[row] != i;
return TRIPLET<T>(row, _ja[i], _val[i]);
}
//-----------------------------------------------------------------------------
// full reset - completely wipes out all SparseMatrix data, zero is ignored
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::reset(INDEX rows, INDEX cols, bool zero)
{
_delete();
_nRows = rows;
_nCols = cols;
}
//-----------------------------------------------------------------------------
// resize - changes the _nRows and _nCols without changing anything else if
// the matrix is being enlarged, other wise wipes it
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::resize(INDEX rows, INDEX cols, bool copy)
{
//if (copy) throw;
if (_nRowsCRS>rows) {
_delete();
}
if (copy)
_nRows = rows;
_nCols = cols; // a check on this would be expensive
}
//-----------------------------------------------------------------------------
// get sparsity from DenseMatrix, if TOL < 0, then only zero values are added
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::reset(const DenseMatrix<T>& D, double TOL)
{
_delete(); // clears all values
// if TOL is specified then TOL = TOL^2 * max(abs(D))^2
if (TOL > 0.0)
{
TOL *= D.maxabs();
TOL *= TOL;
}
_nRows = D.nRows();
_nCols = D.nCols();
for (INDEX i=0; i<D.nRows(); i++)
for (INDEX j=0; j<D.nCols(); j++)
if (D(i,j)*D(i,j) >= TOL) // if TOL wasn't specified then TOL < 0
set(i, j, D(i,j));
compress();
}
//-----------------------------------------------------------------------------
// copy - dangerous: ignores rows & columns
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::copy(const T * ptr, INDEX rows, INDEX cols)
{
- cout << "SparseMatrix<T>::copy() has no effect.\n";
+ std::cout << "SparseMatrix<T>::copy() has no effect.\n";
throw;
}
//-----------------------------------------------------------------------------
// dense_copy - copy to dense matrix
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::dense_copy(DenseMatrix <T> & D ) const
{
SparseMatrix<T>::compress(*this);
D.reset(nRows(),nCols());
for (INDEX i=0; i<_nRowsCRS; i++)
for (INDEX j=_ia[i]; j<_ia[i+1]; j++)
D(i, _ja[j]) = _val[j];
}
template<typename T>
DenseMatrix <T> SparseMatrix<T>::dense_copy(void) const
{
DenseMatrix<T> D;
dense_copy(D);
return D;
}
//-----------------------------------------------------------------------------
// returns true if the matrix has no non-zero elements
//-----------------------------------------------------------------------------
template<typename T>
bool SparseMatrix<T>::empty() const
{
return _size==0 && _tri.empty();
}
//-----------------------------------------------------------------------------
// returns the number of rows specified by the user
//-----------------------------------------------------------------------------
template<typename T>
inline INDEX SparseMatrix<T>::nRows() const
{
return _nRows;
}
//-----------------------------------------------------------------------------
// returns ??????????????????????
//-----------------------------------------------------------------------------
template<typename T>
inline INDEX SparseMatrix<T>::nRowsCRS() const
{
return _nRowsCRS;
}
//-----------------------------------------------------------------------------
// returns the number of columns specified by the user
//-----------------------------------------------------------------------------
template<typename T>
inline INDEX SparseMatrix<T>::nCols() const
{
return _nCols;
}
//-----------------------------------------------------------------------------
// returns the number of non-zeros in the matrix
//-----------------------------------------------------------------------------
template<typename T>
INDEX SparseMatrix<T>::size() const
{
compress(*this);
return _size;
}
//-----------------------------------------------------------------------------
// returns the number of nonzero elements in a row
//-----------------------------------------------------------------------------
template<typename T>
INDEX SparseMatrix<T>::RowSize(INDEX r) const
{
compress(*this);
GCHK(r>=_nRows, "Rowsize: invalid row");
if (r >= _nRowsCRS) return 0;
return _ia[r+1]-_ia[r];
}
//-----------------------------------------------------------------------------
// returns a pointer to the data, causes a compress
//-----------------------------------------------------------------------------
template<typename T>
T* SparseMatrix<T>::ptr() const
{
compress(*this);
return _val;
}
template<typename T>
INDEX* SparseMatrix<T>::rows() const
{
compress(*this);
return _ia;
}
template<typename T>
INDEX* SparseMatrix<T>::cols() const
{
compress(*this);
return _ja;
}
//-----------------------------------------------------------------------------
// returns true if (i,j) falls in the user specified range
//-----------------------------------------------------------------------------
template<typename T>
bool SparseMatrix<T>::in_range(INDEX i, INDEX j) const
{
return i < nRows() && j < nCols();
}
//-----------------------------------------------------------------------------
// assigns this sparsematrix from another one - full memory copy
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T>& SparseMatrix<T>::operator=(const SparseMatrix<T> &C)
{
_delete();
_copy(C);
return *this;
}
//-----------------------------------------------------------------------------
// assigns existing sparsematrix to a value, preserving structure
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T>& SparseMatrix<T>::operator=(const T v)
{
this->set_all_elements_to(v);
return *this;
}
//-----------------------------------------------------------------------------
// scales this sparse matrix by a constant
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::set_all_elements_to(const T &a)
{
compress(*this);
for (INDEX i=0; i<size(); i++) _val[i] = a;
}
//-----------------------------------------------------------------------------
// scales this sparse matrix by a constant
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T>& SparseMatrix<T>::operator*=(const T &a)
{
compress(*this);
for (INDEX i=0; i<size(); i++) _val[i] *= a;
return *this;
}
template<typename T>
SparseMatrix<T>& SparseMatrix<T>::operator*=(const SparseMatrix<T> &a)
{
compress(*this);
Matrix<T>::operator*=(a);
return *this;
}
//-----------------------------------------------------------------------------
// Adds two sparse matrices together.
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T>& SparseMatrix<T>::operator+=(const SparseMatrix & R)
{
compress(R);
int *Ria = R.rows();
int *Rja = R.cols();
T *Rval = R.ptr();
int nRowsCRS = R.nRowsCRS();
int rowR, colR;
T valR;
for (rowR = 0; rowR < nRowsCRS; ++rowR) {
for (int j = Ria[rowR]; j < Ria[rowR+1]; ++j) {
colR = Rja[j];
valR = Rval[j];
// Because we simply want to add the value, we call add and let compress
// take care of the rest--we don't have to worry about extant entries.
add(rowR, colR, valR);
}
}
return *this;
}
//-----------------------------------------------------------------------------
// Return matrix transpose
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T> SparseMatrix<T>::transpose() const
{
compress(*this);
SparseMatrix<T> At(nCols(), nRows());
for (INDEX i=0; i<_nRowsCRS; i++)
for (INDEX ij=_ia[i]; ij<_ia[i+1]; ij++)
At.set(_ja[ij], i, _val[ij]);
compress(At);
return At;
}
//-----------------------------------------------------------------------------
// multiplies each row by the corresponding element in Vector scale
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T>& SparseMatrix<T>::row_scale(const Vector<T> &v)
{
compress(*this);
INDEX i,ij;
GCK(*this, v, v.size()!=nRows(), "Incompatible Vector length in row_scale.");
for(i=0; i<_nRowsCRS; i++)
for(ij=_ia[i]; ij<_ia[i+1]; ij++) _val[ij] *= v[i];
return *this;
}
//-----------------------------------------------------------------------------
// multiples each column by the corresponding element in Vector scale
//-----------------------------------------------------------------------------
template<typename T>
SparseMatrix<T>& SparseMatrix<T>::col_scale(const Vector<T> &v)
{
compress(*this);
INDEX i,ij;
GCK(*this, v, v.size()!=nCols(), "Incompatible Vector length in col_scale.");
for(i=0; i<_nRowsCRS; i++)
for(ij=_ia[i]; ij<_ia[i+1]; ij++) _val[ij] *= v[_ja[ij]];
return *this;
}
//-----------------------------------------------------------------------------
// Returns a vector of the sums of each column
//-----------------------------------------------------------------------------
template<typename T>
DenseVector<T> SparseMatrix<T>::col_sum() const
{
compress(*this);
INDEX i,ij;
GCHK(!nRows(), "SparseMatrix::Matrix not initialized in col_sum.")
DenseVector<T> csum(nCols());
for(i=0; i<_nRowsCRS; i++)
for(ij=_ia[i]; ij<_ia[i+1]; ij++) csum(_ja[ij]) += _val[ij];
return(csum);
}
//-----------------------------------------------------------------------------
// Returns a vector with the number of nonzeros in each column
//-----------------------------------------------------------------------------
template<typename T>
DenseVector<INDEX> SparseMatrix<T>::column_count() const
{
compress(*this);
INDEX i,j;
DenseVector<INDEX> counts(nCols());
for (i=0; i<_nRowsCRS; i++)
for(j=_ia[i]; j<_ia[i+1]; j++) counts(_ja[j])++;
return(counts);
}
//-----------------------------------------------------------------------------
// Writes a the nonzeros of a row to a vector
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::row(INDEX i, DenseVector<T>& row, DenseVector<INDEX>& indx) const
{
compress(*this);
GCHK(i>=nRows(), "get_row() - invalid row number");
if (i >= _nRowsCRS) {
row.resize(0);
indx.resize(0);
return;
}
row.resize(RowSize(i));
indx.resize(row.size());
INDEX idx=0, ij;
for(ij=_ia[i]; ij<_ia[i+1]; ij++)
{
row(idx) = _val[ij];
indx(idx++) = _ja[ij];
}
}
//-----------------------------------------------------------------------------
// Computes the product of N'DN
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::
weighted_least_squares(const SparseMatrix<T> &N, const DiagonalMatrix<T> &D)
{
compress(N);
GCK(N,D,N.nRows()!=D.nRows(),"SparseMatrix::WeightedLeastSquares()");
INDEX k, ki, kj;
resize(N.nCols(), N.nCols()); // set size of this matrix
for (k=0; k<_size; k++) _val[k] = 0.0;
// compute R(i,j) = N(k,i) D(k,q) N(i,j) = N(k,i)*D(k,k)*N(k,j) (sum on k)
for (k=0; k<N._nRowsCRS; k++)
for (ki=N._ia[k]; ki<N._ia[k+1]; ki++)
for (kj=N._ia[k]; kj<N._ia[k+1]; kj++)
add(N._ja[ki],N._ja[kj], D[k]*N[kj]*N[ki]);
compress();
}
//-----------------------------------------------------------------------------
// Return a diagonal matrix containing the diagonal entries of this matrix
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T> SparseMatrix<T>::diag() const
{
compress(*this);
DiagonalMatrix<T> D(nRows(), true); // initialized to zero
INDEX i, ij;
for (i=0; i<_nRowsCRS; i++)
{
for(ij=_ia[i]; ij<_ia[i+1]; ij++)
{
if (_ja[ij]>=i) // have we reached or passed the diagonal?
{
if (_ja[ij]==i) D[i]=_val[ij]; // this this the diagonal?
break; // D[i] is already zero if there is no diagonal
}
}
}
return D;
}
//-----------------------------------------------------------------------------
// Return a diagonal matrix containing row-sum lumped entries of the matrix
//-----------------------------------------------------------------------------
template<typename T>
DiagonalMatrix<T> SparseMatrix<T>::row_sum_lump() const
{
compress(*this);
DiagonalMatrix<T> D(nRows(), true); // initialized to zero
INDEX i, ij;
for (i=0; i<_nRowsCRS; i++)
{
for(ij=_ia[i]; ij<_ia[i+1]; ij++)
{
D(i,i) += _val[ij];
}
}
return D;
}
//-----------------------------------------------------------------------------
// output function - builds a string with each nonzero triplet value
//-----------------------------------------------------------------------------
template<typename T>
-string SparseMatrix<T>::to_string() const
+std::string SparseMatrix<T>::to_string() const
{
compress(*this);
- string out;
+ std::string out;
INDEX i, ij;
for(i=0; i<_nRowsCRS; i++)
{
for(ij=_ia[i]; ij<_ia[i+1]; ij++)
{
if (ij) out += "\n"; // append newline if not first nonzero
out += "(" + ATC_Utility::to_string(i) + ", "; // append "(i,"
out += ATC_Utility::to_string(_ja[ij]) + ") = "; // append "j) = "
out += ATC_Utility::to_string(_val[ij]); // append "value"
}
}
return out; // return the completed string
}
//-----------------------------------------------------------------------------
// returns the maximum value in the row
//-----------------------------------------------------------------------------
template<typename T>
T SparseMatrix<T>::row_max(INDEX row) const
{
compress(*this);
if (!RowSize(row)) return (T)0; // if there are no nonzeros in the row
INDEX ij;
T max = _val[_ia[row]];
for(ij=_ia[row]+1; ij<_ia[row+1]; ij++) max = std::max(max,_val[ij]);
return max;
}
//-----------------------------------------------------------------------------
// returns the minimum value in the row
//-----------------------------------------------------------------------------
template<typename T>
T SparseMatrix<T>::row_min(INDEX row) const
{
compress(*this);
if (!RowSize(row)) return (T)0; // if there are no nonzeros in the row
INDEX ij;
T min = _val[_ia[row]];
for(ij=_ia[row]+1; ij<_ia[row+1]; ij++) min = std::min(min,_val[ij]);
return min;
}
//-----------------------------------------------------------------------------
// prints a histogram of the values of a row to the screen
//-----------------------------------------------------------------------------
template<typename T>
-void SparseMatrix<T>::print_row_histogram(const string &name, INDEX nbins) const
+void SparseMatrix<T>::print_row_histogram(const std::string &name, INDEX nbins) const
{
compress(*this);
- cout << "Begin histogram " << name << "\n";
- cout << "# rows: " << _nRows << " columns: " << _nCols
+ std::cout << "Begin histogram " << name << "\n";
+ std::cout << "# rows: " << _nRows << " columns: " << _nCols
<< " size: " << _size << "\n";
for(INDEX i=0; i<_nRows; i++)
{
print_row_histogram(i, nbins);
- cout << "\n";
+ std::cout << "\n";
}
- cout << "End histogram " << name << "\n";
+ std::cout << "End histogram " << name << "\n";
}
//-----------------------------------------------------------------------------
// prints a histogram of the values of a row to the screen
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::print_row_histogram(INDEX row, INDEX nbins) const
{
compress(*this);
if (!nbins) nbins++;
- vector<INDEX> counts(nbins, 0);
+ std::vector<INDEX> counts(nbins, 0);
const T min = row_min(row);
const T max = row_max(row);
const T range = max-min;
const double bin_size = range/double(nbins);
if (range<=0.0) counts[nbins-1]=RowSize(row);
else
{
for(INDEX ij=_ia[row]; ij<_ia[row+1]; ij++)
{
INDEX bin = INDEX((_val[ij]-min)/bin_size);
counts[bin-(bin==nbins)]++;
}
}
- cout<<showbase<<scientific;
- cout<<"# Histogram: row "<<row<<" min "<<min<<" max "<<max<<" cnt " <<RowSize(row)<<"\n";
+ std::cout<<std::showbase<<std::scientific;
+ std::cout<<"# Histogram: row "<<row<<" min "<<min<<" max "<<max<<" cnt " <<RowSize(row)<<"\n";
T bin_start = min;
for(INDEX i=0; i<nbins; i++)
{
- cout << "(" << bin_start << ",";
+ std::cout << "(" << bin_start << ",";
bin_start += bin_size;
- cout << bin_start << ") " << counts[i] << "\n";
+ std::cout << bin_start << ") " << counts[i] << "\n";
}
}
//-----------------------------------------------------------------------------
// prints the triplets the screen
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::print_triplets() const
{
- typename vector<TRI_COORD<T> >::const_iterator t;
- string out;
+ typename std::vector<TRI_COORD<T> >::const_iterator t;
+ std::string out;
out += "==================BEGIN TRIPLETS=======================\n";
// Loop backwards over all new triplets.
for (t = _tri.begin(); t!=_tri.end(); ++t) {
out += "(" + ATC_Utility::to_string(t->i) + ", "; // append "(i,"
out += ATC_Utility::to_string(t->j) + ") = "; // append "j) = "
out += ATC_Utility::to_string(t->v); // append "value"
out += "\n";
}
out += "===================END TRIPLETS========================\n";
- cout << out;
+ std::cout << out;
}
//-----------------------------------------------------------------------------
// Outputs a string to a sparse Matlab type
//-----------------------------------------------------------------------------
template<typename T>
-void SparseMatrix<T>::matlab(ostream &o, const string &s) const
+void SparseMatrix<T>::matlab(std::ostream &o, const std::string &s) const
{
compress(*this);
INDEX i, ij;
o << s <<" = sparse(" << nRows() << "," << nCols() << ");\n";
- o << showbase << scientific;
+ o << std::showbase << std::scientific;
for(i=0; i<_nRowsCRS; i++)
for(ij=_ia[i]; ij<_ia[i+1]; ij++)
o<<s<<"("<<i+1<<","<<_ja[ij]+1<<")="<<_val[ij]<<";\n";
}
//-----------------------------------------------------------------------------
// Writes the matrix to a binary file (after a compress).
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::binary_write(std::fstream& f) const
{
compress(*this);
f.write((char*)&_size, sizeof(INDEX)); // writes number of nonzeros
f.write((char*)&_nRowsCRS, sizeof(INDEX)); // writes number of rows in crs
f.write((char*)&_nRows, sizeof(INDEX)); // write matrix rows
f.write((char*)&_nCols, sizeof(INDEX)); // write number of columns
if (!_size) return;
f.write((char*)_val, sizeof(T) *_size);
f.write((char*)_ja, sizeof(INDEX)*_size);
f.write((char*)_ia, sizeof(INDEX)*(_nRowsCRS+1));
}
//-----------------------------------------------------------------------------
// Reads a SparseMatrix from a binary file. (wipes out any original data)
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::binary_read(std::fstream& f)
{
_delete();
f.read((char*)&_size, sizeof(INDEX));
f.read((char*)&_nRowsCRS, sizeof(INDEX));
f.read((char*)&_nRows, sizeof(INDEX));
f.read((char*)&_nCols, sizeof(INDEX));
if (!_size) return;
_create(_size,_nRowsCRS);
f.read((char*)_val, sizeof(T)*_size);
f.read((char*)_ja, sizeof(INDEX)*_size);
f.read((char*)_ia, sizeof(INDEX)*(_nRowsCRS+1));
}
//-----------------------------------------------------------------------------
// Writes the sparse matrix to a file in a binary format
//-----------------------------------------------------------------------------
template<typename T>
void SparseMatrix<T>::write_restart(FILE *f) const
{
compress(*this);
fwrite(&_size, sizeof(INDEX), 1 ,f); // write number of nonzeros
fwrite(&_nRowsCRS, sizeof(INDEX), 1 ,f); // write number of rows
fwrite(&_nRows, sizeof(INDEX), 1 ,f); // write number of columns
fwrite(&_nCols, sizeof(INDEX), 1 ,f); // write number of columns
if (!_size) return;
fwrite(_val, sizeof(T), _size ,f);
fwrite(_ja, sizeof(T), _size ,f);
fwrite(_ia, sizeof(INDEX), _nRowsCRS+1 ,f);
}
} // end namespace
#endif
diff --git a/lib/atc/SparseMatrix.h b/lib/atc/SparseMatrix.h
index 3cf41a337..35393187c 100644
--- a/lib/atc/SparseMatrix.h
+++ b/lib/atc/SparseMatrix.h
@@ -1,299 +1,299 @@
#ifndef SPARSEMATRIX_H
#define SPARSEMATRIX_H
#include <exception>
#include "MatrixLibrary.h"
#include <algorithm>
namespace ATC_matrix {
/**
* @struct TRI_COORD
* @brief Triplet SparseMatrix entry
*/
template <typename T>
struct TRI_COORD
{
TRI_COORD<T>(INDEX row=0, INDEX col=0);
TRI_COORD<T>(INDEX row, INDEX col, T val, bool add_to=0);
INDEX i, j;
T v;
bool add;
};
template<typename T>
void ParMultAB(MPI_Comm comm, const SparseMatrix<T>& A, const Matrix<T>& B, DenseMatrix<T>& C);
/**
* @class SparseMatrix
* @brief Stores data in triplet format or CRS format
*/
template<typename T>
class SparseMatrix : public Matrix<T>
{
//* SparseMatrix-Vector multiplication (S * v)
friend DenseVector<T> operator*<T>(const SparseMatrix<T> &A, const Vector<T>& x);
//* SparseMatrix-DenseMatrix multiplication (S * F)
friend DenseMatrix<T> operator*<T>(const SparseMatrix<T> &A, const Matrix<T>& D);
//* SparseMatrix-DiagonalMatrix multiplication (S * D)
friend SparseMatrix<T> operator*<T>(const SparseMatrix<T> &A, const DiagonalMatrix<T>& D);
//* SparseMatrix-SparseMatrix multiplication (S * S)
friend SparseMatrix<T> operator*<T>(const SparseMatrix<T> &A, const SparseMatrix<T> &B);
//* computes the product of a SparseMatrix tranpose with a SparseVector (M'*v).
friend SparseVector<T> operator*<T>(const SparseMatrix<T> &M, const SparseVector<T> &v);
//* computes the product of a SparseMatrix tranpose with a SparseVector (M'*v).
friend SparseVector<T> operator*<T>(const SparseVector<T> &v, const SparseMatrix<T> &M);
template<typename U>
friend void ParMultAB(MPI_Comm comm, const SparseMatrix<U>& A, const Matrix<U>& B, DenseMatrix<U>& C);
public:
SparseMatrix(INDEX rows=0, INDEX cols=0);
SparseMatrix(const SparseMatrix<T>& c);
SparseMatrix(const DenseMatrix<T>& c);
SparseMatrix(INDEX* rows, INDEX* cols, T* vals, INDEX size,
INDEX nRows, INDEX nCols, INDEX nRowsCRS);
virtual ~SparseMatrix() { _delete(); }
//* General index by value (requires a binary search on the row)
T operator()(INDEX i, INDEX j) const;
//* General index by reference (requires a binary search on the row)
T& operator()(INDEX i, INDEX j);
//* General flat index by value operator (by nth nonzero)
T operator[](INDEX i) const;
//* General flat index by reference operator (by nth nonzero)
T& operator[](INDEX i);
//* sets a value to index i,j
void set(INDEX i, INDEX j, T v);
//* adds a value to index i,j
void add(INDEX i, INDEX j, T v);
//* return a triplet value of the ith nonzero
TRIPLET<T> triplet(INDEX i) const;
//* full reset - completely wipes out all SparseMatrix data
void reset(INDEX rows=0, INDEX cols=0, bool zero=true);
//* only changes the bounds of the matrix, no deletion
void resize(INDEX rows=0, INDEX cols=0, bool zero=true);
//* reset - from DenseMatrix - this will be SLOW
void reset(const DenseMatrix<T>& D, double TOL=-1.0);
//* copy data
void copy(const T * ptr, INDEX rows=0, INDEX cols=0);
void dense_copy(DenseMatrix<T>& D) const;
DenseMatrix<T> dense_copy(void) const;
//* returns true if the matrix has no nonzero elements
bool empty() const;
//* returns the user-specified number of rows
INDEX nRows() const;
INDEX nRowsCRS() const;
//* returns the user-specified number of cols
INDEX nCols() const;
//* returns the number of non-zero elements
INDEX size() const;
//* returns the number of non-zeros in a row
INDEX RowSize(INDEX r) const;
//* returns a pointer to the CRS list of rows
inline INDEX* rows() const;
//* returns a pointer to the CRS list of cols
inline INDEX* cols() const;
//* returns a pointer to the nonzero data
inline T* ptr() const;
//* checks if the index i,j falls in the user-specified range
bool in_range(INDEX i, INDEX j) const;
//* check if the total matrix has a value set for an index pair
bool has_entry(INDEX i, INDEX j) const;
//* check if the uncompressed part of the matrix has a value set for an index pair
bool has_entry_uncompressed(INDEX i, INDEX j) const;
//* check if the compressed part matrix has a value set for an index pair
bool has_entry_compressed(INDEX i, INDEX j) const;
//* check if the matrix has been compressed at least once
bool has_template(void) const;
/*
* \section assignment operators
*/
//* copies SparseMatrix R to this
SparseMatrix<T>& operator=(const SparseMatrix &R);
//* sets all nonzero values to a constant
SparseMatrix<T>& operator=(const T v);
//* scales all nonzero values by a constant
SparseMatrix<T>& operator*=(const T &a);
//* calls operator*= of base class
SparseMatrix<T>& operator*=(const SparseMatrix<T> &a);
// Adds two matrices together.
SparseMatrix<T>& operator+=(const SparseMatrix & R);
/*
* \section Multiplication operations
*/
//-----------------------------------------------------------------------------
// multiply sparse matrix by a vector
//-----------------------------------------------------------------------------
virtual void MultMv(const Vector<T>& v, DenseVector<T>& c) const
{
compress(*this);
GCK(*this, v, this->nCols() != v.size(), "SparseMatrix * Vector")
// resize c if necessary
if (c.size() != this->nRows()) {
c.resize(this->nRows());
c.zero();
}
INDEX i, j;
for (i = 0; i < this->_nRowsCRS; i++)
for (j = this->_ia[i]; j < this->_ia[i + 1]; j++)
c(i) += this->_val[j] * v(this->_ja[j]);
}
//-----------------------------------------------------------------------------
// multiply sparse matrix by dense matrix
//-----------------------------------------------------------------------------
virtual void MultAB(const Matrix<T>& B, DenseMatrix<T>& C) const
{
GCK(*this, B, this->nCols() != B.nRows(), "SparseMatrix * DenseMatrix")
const INDEX J = B.nCols();
INDEX i, ik, j;
for (i = 0; i < this->_nRowsCRS; i++)
for (ik = this->_ia[i]; ik < this->_ia[i + 1]; ik++)
for (j = 0; j < J; j++)
C(i, j) += this->_val[ik] * B(this->_ja[ik], j); // C(i,j) = S(i,k) * B(k, j)
}
//-----------------------------------------------------------------------------
// Multiplies this SparseMatrix transposed times a vector
//-----------------------------------------------------------------------------
virtual DenseVector<T> transMat(const Vector<T> &x) const
{
compress(*this);
DenseVector<T> y(nCols(), true);
GCK(*this, x, nRows()!=x.size(),"operator *: Sparse matrix incompatible with Vector.")
INDEX i, ij;
for(i=0; i<_nRowsCRS; i++)
for(ij=_ia[i]; ij<_ia[i+1]; ij++)
y(_ja[ij]) += _val[ij]*x(i);
return y;
}
//-----------------------------------------------------------------------------
// Matrix Transpose/DenseMatrix multiply
//-----------------------------------------------------------------------------
virtual DenseMatrix<T> transMat(const DenseMatrix<T> &D) const
{
compress(*this);
GCK(*this, D, nRows()!=D.nRows(),"transMat: Sparse matrix incompatible with DenseMatrix.")
DenseMatrix<T> C(nCols(), D.nCols(), true); // initialized to zero
INDEX j, k, ki;
for (k=0; k<_nRowsCRS; k++)
for (ki=_ia[k]; ki<_ia[k+1]; ki++)
for (j=0; j<D.nCols(); j++)
C(_ja[ki], j) += _val[ki]*D(k,j); // C(i,j) = S(k,i) * D(k, j)
return C;
}
//-----------------------------------------------------------------------------
// Matrix Transpose/SparseMatrix multiply - IS THIS REALLY NEEDED??
//-----------------------------------------------------------------------------
virtual DenseMatrix<T> transMat(const SparseMatrix<T> &D) const
{
compress(*this);
GCK(*this, D, nRows()!=D.nRows(),"transMat: Sparse matrix incompatible with DenseMatrix.")
DenseMatrix<T> C(nCols(), D.nCols(), true); // initialized to zero
INDEX k, ki, kj;
for (k=0; k<_nRowsCRS; k++)
for (kj=D._ia[k]; kj<D._ia[k+1]; kj++)
for (ki=_ia[k]; ki<_ia[k+1]; ki++)
C(_ja[ki], D._ja[kj]) += _val[ki]*D._val[kj]; // C(i,j) = S(k,i)*D(k,j)
return C;
}
SparseMatrix<T> transpose() const;
SparseMatrix<T>& row_scale(const Vector<T> &v);
SparseMatrix<T>& col_scale(const Vector<T> &v);
DenseVector<T> col_sum() const;
DenseVector<INDEX> column_count() const;
DiagonalMatrix<T> diag() const;
DiagonalMatrix<T> row_sum_lump() const;
void row(INDEX i, DenseVector<T>& row, DenseVector<INDEX>& indx) const;
void weighted_least_squares(const SparseMatrix<T> &N, const DiagonalMatrix<T> &D);
void set_all_elements_to(const T &v);
T row_max(INDEX row) const;
T row_min(INDEX row) const;
/*
* \section I/O functions
*/
//* outputs this SparseMatrix to a formatted string
- string to_string() const;
+ std::string to_string() const;
using Matrix<T>::matlab;
//* writes a command to recreate this matrix in matlab to a stream
- void matlab(ostream &o, const string &name="S") const;
+ void matlab(std::ostream &o, const std::string &name="S") const;
//* prints a row histogram for each row
- void print_row_histogram(const string &name, INDEX nbins = 10) const;
+ void print_row_histogram(const std::string &name, INDEX nbins = 10) const;
//* prints a histogram of the values in a row
void print_row_histogram(INDEX row, INDEX nbins) const;
//* prints the current triplets
void print_triplets() const;
//! Writes the matrix to a binary file (after a compress).
void binary_write(std::fstream& f) const;
//! Reads a SparseMatrix from a binary file. (wipes out any original data)
void binary_read(std::fstream& f);
//* Dump templated type to disk; operation not safe for all types
void write_restart(FILE *f) const;
/*
* \section Utility functions
*/
//* converts all triplets and merges with CRS
void compress();
//* converts T to CRS
static void compress(const SparseMatrix<T> &C);
//* sorts and returns the # of unique triplets
INDEX CountUniqueTriplets();
private:
//* creates a CRS structure
void _create(INDEX size, INDEX nrows);
//* clears all memory and nulls references
void _delete();
//* copies all data from another SparseMatrix
void _copy(const SparseMatrix<T> &C);
//* general sparse matrix assignment
void _set_equal(const Matrix<T> &r);
//* returns the first row with a nonzero in it (from the CRS structure only)
int _first_nonzero_row_crs() const;
/*
* \section CRS storage variables
*/
protected:
T * _val; // matrix non-zeros
INDEX *_ia, *_ja; // ptrs to rows, column indexes
INDEX _size, _nRowsCRS; // # of non-zeros, rows
bool hasTemplate_;
void copy(const SparseMatrix<T> &C);
//* new (unsorted triplet values - won't intersect CRS values)
- mutable vector<TRI_COORD<T> > _tri;
+ mutable std::vector<TRI_COORD<T> > _tri;
/*
* \section User specified variables
*/
INDEX _nRows, _nCols;
static T _zero;
};
} // end namespace
#include "SparseMatrix-inl.h"
#endif
diff --git a/lib/atc/SparseVector-inl.h b/lib/atc/SparseVector-inl.h
index c03528f88..204c412d6 100644
--- a/lib/atc/SparseVector-inl.h
+++ b/lib/atc/SparseVector-inl.h
@@ -1,228 +1,228 @@
// SparseVector-inl.h: provides templated functions for SparseVector in
// separate header
namespace ATC_matrix {
template<class T>
SparseVector<T> sparse_rand(INDEX n, INDEX fill, int seed=1234)
{
srand(seed);
const double rmax_inv = 1.0/double(RAND_MAX);
SparseVector<T> r(n);
while (r.size()<fill)
r(std::rand()%r.nRows())=double(std::rand()*rmax_inv);
return r;
}
// Multiplies a Matrix by a SparseVector (M*v) and returns a DenseVector.
template<class T>
DenseVector<T> operator*(const Matrix<T> &M, const SparseVector<T> &v)
{
DenseVector<T> y(M.nRows());
STORE::const_iterator it=v.data_.begin();
for (; it!=v.data_.end(); it++) {
const INDEX j = it->first;
const T& vj = it->second;
for (INDEX i=0; i<M.nRows(); i++) y(i)+=M(i,j)*vj;
}
return y;
}
// Multiplies a SparseVector by a Matrix (M'*v) and returns a DenseVector.
template<class T>
DenseVector<T> operator*(const SparseVector<T> &v, const Matrix<T> &M)
{
DenseVector<T> y(M.nCols());
STORE::const_iterator it=v.data_.begin();
for (; it!=v.data_.end(); it++) {
const INDEX i = it->first;
const T& vi = it->second;
for (INDEX j=0; j<M.nCols(); j++) y(j)+=vi*M(i,j);
}
return y;
}
// Computes the dot product between two SparseVectors of equal length.
template<class T>
T dot(const SparseVector<T> &a, const SparseVector<T> &b)
{
T v = 0.0;
for (STORE::const_iterator ai=a.data_.begin(); ai!=a.data_.end(); ai++) {
STORE::const_iterator bi=b.data_.find(ai->first);
if (bi == b.data_.end()) continue;
v += ai->second * bi->second;
}
return v;
}
// Computes the product of a SparseMatrix tranpose with a SparseVector (M'*v).
template<class T>
SparseVector<T> operator*(const SparseMatrix<T> &M, const SparseVector<T> &v)
{
SparseVector<T> y(M.nRows());
for (INDEX i=0; i<M.nRows(); i++) {
double yi=0.0;
for (INDEX ij=M._ia[i]; ij<M._ia[i+1]; ij++) {
const INDEX j = M._ja[ij];
STORE::const_iterator it = v._data.find(j);
if (it == v._data.end()) continue;
yi += M._v[ij] * it->second;
}
if (yi!=0.0) y(i)+=yi;
}
return y;
}
// computes the product of a SparseMatrix tranpose with a SparseVector (M'*v).
template<class T>
SparseVector<T> operator*(const SparseVector<T> &v, const SparseMatrix<T> &M)
{
SparseVector<T> y(M.nCols());
for (INDEX i=0; i<M.nRows(); i++) {
STORE::const_iterator it = v._data.find(i);
if (it == v._data.end()) continue;
for (INDEX ij=M._ia[i]; ij<M._ia[i+1]; ij++)
y(M._ja[ij]) += it->second * M._v[ij];
}
return y;
}
// General constructor - sets the vector length.
template<class T>
SparseVector<T>::SparseVector(INDEX n) : length_(n){}
// Outputs the vector to string
template<class T>
std::string SparseVector<T>::to_string() const
{
if (size() > nRows()/2) return Vector<T>::to_string();
STORE::const_iterator it=data_.begin();
std::string str;
using ATC_Utility::to_string;
for (; it!=data_.end(); it++)
str += to_string(it->first)+": "+to_string(it->second)+'\n';
return str;
}
// Indexes the ith component of the vector or returns zero if not found.
template<class T>
T SparseVector<T>::operator()(INDEX i, INDEX j) const
{
STORE::const_iterator it = data_.find(i);
if (it == data_.end()) return 0.0;
return it->second;
}
// Indexes the ith component of the vector or returns zero if not found.
template<class T>
T& SparseVector<T>::operator()(INDEX i, INDEX j)
{
return data_[i];
}
// Indexes the ith component of the vector or returns zero if not found.
template<class T> T SparseVector<T>::operator[](INDEX i) const
{
return (*this)(i);
}
// Indexes the ith component of the vector or returns zero if not found.
template<class T> T& SparseVector<T>::operator[](INDEX i)
{
return (*this)[i];
}
// Returns a pair (index, value) for a nonzero in the vector.
template<class T>
std::pair<INDEX, T> SparseVector<T>::pair(INDEX i) const
{
STORE::const_iterator it=data_.begin() + i;
return std::pair<INDEX, T>(it->first, it->second);
}
//* Adds SparseVector x, scaled by s to this one. Can be different sparcity.
template<class T>
void SparseVector<T>::add_scaled(SparseVector<T>& x, const T& s)
{
STORE::const_iterator it;
for (it=x.data_.begin(); it!=x.data_.end(); it++) {
data_[it->first] += it->second * s;
}
}
// Returns the number of nonzeros in the sparse vector.
template<class T> inline INDEX SparseVector<T>::size() const
{ return data_.size(); }
// Returns the number of nonzeros in the sparse vector.
template<class T> inline INDEX SparseVector<T>::nRows() const
{ return length_; }
// Copy constructor for sparse vector.
template<typename T>
SparseVector<T>::SparseVector(const SparseVector<T> &c)
{
length_ = c.length_;
data_ = c.data_;
}
// operator equal for sparse vector.
template<class T>
SparseVector<T>& SparseVector<T>::operator=(const SparseVector<T> &c)
{
length_ = c.length_;
data_ = c.data_;
return *this;
}
// Changes the size of the SparseVector
template<class T>
void SparseVector<T>::resize(INDEX nRows, INDEX nCols, bool copy)
{
length_ = nRows;
STORE::iterator it;
for (it=data_.begin(); it!=data_.end(); it++) {
if (it->second >= length_) data_.erase(it);
else if (!copy) it->second=T(0);
}
}
// same as resize, but zero rather than copy
template<class T>
void SparseVector<T>::reset(INDEX nRows, INDEX nCols, bool zero)
{
resize(nRows, nCols, !zero);
}
// sets all elements to zero but preserves sparcity
template<class T>
void SparseVector<T>::zero()
{
STORE::iterator it;
for (it=data_.begin(); it!=data_.end(); it++) it->second=T(0);
}
template<class T>
void SparseVector<T>::copy(const T* ptr, INDEX nRows, INDEX nCols)
{
}
template<class T>
void SparseVector<T>::write_restart(FILE *F) const
{
}
// writes a stream to a matlab script to recreate this variable
template<class T>
-void SparseVector<T>::matlab(ostream &o, const string &s) const
+void SparseVector<T>::matlab(std::ostream &o, const std::string &s) const
{
o << s << "=sparse(" << nRows() << ",1);\n";
- o << showbase << scientific;
+ o << std::showbase << std::scientific;
STORE::const_iterator it;
for (it=data_.begin(); it!=data_.end(); it++)
o << s << "(" << it->first+1 << ") = " << it->second << ";\n";
}
} // end namespace
diff --git a/lib/atc/SparseVector.h b/lib/atc/SparseVector.h
index 594182c9e..4219bb262 100644
--- a/lib/atc/SparseVector.h
+++ b/lib/atc/SparseVector.h
@@ -1,103 +1,103 @@
#ifndef SPARSEVECTOR_H
#define SPARSEVECTOR_H
#include "MatrixLibrary.h"
namespace ATC_matrix {
// No C++ templated typedefs, so use a define, gets cleaned up at end,
// so don't use outside of this class
#define STORE typename std::map<INDEX, T>
template<class T> class SparseVector;
template<class T> T dot(const SparseVector<T> &a, const SparseVector<T> &b);
/**
* @class SparseVector
* @brief Class for vectors that contain a majority of zero elements and provides relevant operations
*/
template<class T>
class SparseVector : public Vector<T> {
//* Multiplies a Matrix by a SparseVector (M*v) and returns a DenseVector.
friend DenseVector<T> operator*<T>(const Matrix<T> &M, const SparseVector<T> &v);
//* Multiplies a SparseVector by a Matrix (M'*v) and returns a DenseVector.
friend DenseVector<T> operator*<T>(const SparseVector<T> &v, const Matrix<T> &M);
//* Computes the dot product between two SparseVectors of equal length.
#ifdef __INTEL_COMPILER
// for use on Intel compilers
template<class T> friend T dot(const SparseVector<T> &a, const SparseVector<T> &b);
#else
// for use with gcc
friend T dot<T>(const SparseVector<T> &a, const SparseVector<T> &b);
#endif
//* computes the product of a SparseMatrix tranpose with a SparseVector (M'*v).
friend SparseVector<T> operator*<T>(const SparseMatrix<T> &M, const SparseVector<T> &v);
//* computes the product of a SparseMatrix tranpose with a SparseVector (M'*v).
friend SparseVector<T> operator*<T>(const SparseVector<T> &v, const SparseMatrix<T> &M);
public:
//* Constructor - sets length of vector (NOT # of nonzeros).
SparseVector(INDEX length=0);
//* Copies another SparseVector
SparseVector(const SparseVector<T> &c);
//* Copies a general Vector (avoid if possible, its going to be slow).
SparseVector(const Vector<T> &c);
//* Overrides output to string function to list only nonzeros and indices.
std::string to_string() const;
//* Indexing operators (w/ const overloading).
//@{
T operator()(INDEX i, INDEX j=0) const;
T& operator()(INDEX i, INDEX j=0);
T operator[](INDEX i) const;
T& operator[](INDEX i);
//* Returns a pair (index, value) for a nonzero in the vector.
std::pair<INDEX, T> pair(INDEX i) const;
//@}
//* assignment operators
//@{
SparseVector<T>& operator=(const SparseVector<T> &c);
SparseVector<T>& operator=(Vector<T> &c);
//@}
//* Return the number of rows in the Vector.
INDEX nRows() const;
//* Returns the number of columns - always 1.
INDEX nCols() const { return 1; }
//* Change # of Vector rows Vector and optionally keeps nonzeros (ignores nCols).
void resize(INDEX nRows, INDEX nCols=1, bool copy=0);
//* Return the number of nonzeros in the Vector.
INDEX size() const;
//* Changes size of Vector rows and optionally removes nonzeros.
void reset (INDEX nRows, INDEX nCols=1, bool zero=0);
//* zeros out all elements while preserving sparcity pattern
void zero();
//* TODO impliment copy (or maybe not necessary)
void copy(const T* ptr, INDEX nRows, INDEX nCols=1);
//* Writes a restart file (TODO impliment this if needed/wanted).
void write_restart(FILE *F) const;
//* Adds SparseVector x, scaled by s to this one. Can be different sparcity.
void add_scaled(SparseVector<T>& x, const T& s);
// output to matlab (is this needed)
// using Matrix<T>::matlab;
//* Writes a matlab string to a stream that creates this object with a name.
- void matlab(ostream &o, const string &s="v") const;
+ void matlab(std::ostream &o, const std::string &s="v") const;
protected:
//* Banned operators
//@{
SparseVector(const Matrix<T> &c);
SparseVector<T>& operator=(Matrix<T> &c);
T* ptr() const {return NULL; }
//@}
STORE data_; //*> sparse data structure
INDEX length_; //*> number of rows
};
} // end namespace
#include "SparseVector-inl.h"
#undef STORE
#endif
diff --git a/lib/atc/SpeciesTimeIntegrator.cpp b/lib/atc/SpeciesTimeIntegrator.cpp
index ac9ae1f3d..bf9f1a888 100644
--- a/lib/atc/SpeciesTimeIntegrator.cpp
+++ b/lib/atc/SpeciesTimeIntegrator.cpp
@@ -1,250 +1,251 @@
// ATC transfer headers
#include "SpeciesTimeIntegrator.h"
#include "TransferOperator.h"
#include "ATC_CouplingMass.h"
#include "TimeFilter.h"
#include "LammpsInterface.h"
#include "ATC_Error.h"
#include "PerAtomQuantityLibrary.h"
#include "AtomToMoleculeTransfer.h"
#include "MoleculeSet.h"
+using std::pair;
+using std::map;
+using std::string;
+
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class SpeciesTimeIntegrator
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab data from ATC
//--------------------------------------------------------
SpeciesTimeIntegrator::SpeciesTimeIntegrator(ATC_CouplingMass * atc,
TimeIntegrationType timeIntegrationType) :
TimeIntegrator(atc, timeIntegrationType),
- speciesIds_(atc->species_ids()),
moleculeIds_(atc->molecule_ids())
{
// do nothing
}
//--------------------------------------------------------
// modify
// parses inputs and modifies state of the filter
//--------------------------------------------------------
bool SpeciesTimeIntegrator::modify(int narg, char **arg)
{
bool match = false;
// no parsing needed
return match;
}
//--------------------------------------------------------
// construct_methods
// creates algorithm objects
//--------------------------------------------------------
void SpeciesTimeIntegrator::construct_methods()
{
if (atc_->reset_methods()) {
if (timeIntegrationMethod_) delete timeIntegrationMethod_;
if (timeFilterManager_->need_reset()) {
switch (timeIntegrationType_) {
case FRACTIONAL_STEP: {
timeFilter_ = timeFilterManager_->construct(TimeFilterManager::EXPLICIT_IMPLICIT);
atc_->set_mass_mat_time_filter(SPECIES_CONCENTRATION,TimeFilterManager::EXPLICIT);
break;
}
default:
throw ATC_Error("Unknown time integration type in SpeciesTimeIntegrator::Initialize()");
}
}
if (timeFilterManager_->filter_dynamics()) {
switch (timeIntegrationType_) {
case FRACTIONAL_STEP: {
- timeIntegrationMethod_ = new SpeciesTimeIntegratorFractionalStepFiltered(this,speciesIds_,moleculeIds_);
+ timeIntegrationMethod_ = new SpeciesTimeIntegratorFractionalStepFiltered(this,
+ moleculeIds_);
}
default:
throw ATC_Error("Unknown time integration type in SpeciesTimeIntegrator::Initialize()");
}
}
else {
- timeIntegrationMethod_ = new SpeciesTimeIntegratorFractionalStep(this,speciesIds_,moleculeIds_);
+ timeIntegrationMethod_ = new SpeciesTimeIntegratorFractionalStep(this,
+ moleculeIds_);
}
}
}
//--------------------------------------------------------
// pack_fields
// add persistent variables to data list
//--------------------------------------------------------
void SpeciesTimeIntegrator::pack_fields(RESTART_LIST & data)
{
TimeIntegrator::pack_fields(data);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class SpeciesIntegrationMethod
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab data from ATC
//--------------------------------------------------------
SpeciesIntegrationMethod::SpeciesIntegrationMethod(SpeciesTimeIntegrator * speciesTimeIntegrator,
- const map<string,pair<IdType,int> > & speciesIds,
const map<string,pair<MolSize,int> > & moleculeIds) :
TimeIntegrationMethod(speciesTimeIntegrator),
timeFilter_(speciesTimeIntegrator->time_filter()),
massDensity_(atc_->field(MASS_DENSITY)),
nodalAtomicMassDensityOut_(atc_->nodal_atomic_field(MASS_DENSITY)),
nodalAtomicMassDensity_(NULL),
speciesConcentration_(atc_->field(SPECIES_CONCENTRATION)),
nodalAtomicSpeciesConcentration_(NULL),
nodalAtomicSpeciesConcentrationFiltered_(speciesTimeIntegrator->nodal_atomic_species_concentration_filtered()),
- speciesIds_(speciesIds),
moleculeIds_(moleculeIds)
{
// do nothing
}
//--------------------------------------------------------
// construct_transfers
// sets up all the necessary transfer operators
//--------------------------------------------------------
void SpeciesIntegrationMethod::construct_transfers()
{
InterscaleManager & interscaleManager = atc_->interscale_manager();
// get existing data
nodalAtomicMassDensity_ = interscaleManager.dense_matrix(field_to_intrinsic_name(MASS_DENSITY));
if (atc_->has_tracked_species())
nodalAtomicSpeciesConcentration_ = interscaleManager.dense_matrix(field_to_intrinsic_name(SPECIES_CONCENTRATION));
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class SpeciesTimeIntegratorFractionalStep
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
SpeciesTimeIntegratorFractionalStep::SpeciesTimeIntegratorFractionalStep(SpeciesTimeIntegrator * speciesTimeIntegrator,
- const map<string,pair<IdType,int> > & speciesIds,
const map<string,pair<MolSize,int> > & moleculeIds) :
- SpeciesIntegrationMethod(speciesTimeIntegrator,speciesIds,moleculeIds)
+ SpeciesIntegrationMethod(speciesTimeIntegrator,moleculeIds)
{
// do nothing
}
//--------------------------------------------------------
// initialize
// initialize all data
//--------------------------------------------------------
void SpeciesTimeIntegratorFractionalStep::initialize()
{
SpeciesIntegrationMethod::initialize();
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (timeFilterManager->need_reset()) {
timeFilter_->initialize();
}
if (!timeFilterManager->end_equilibrate()) {
nodalAtomicSpeciesConcentrationFiltered_ = nodalAtomicSpeciesConcentration_->quantity();
}
pre_final_integrate1(0.);
}
//--------------------------------------------------------
// pre_initial_integrate1
//--------------------------------------------------------
void SpeciesTimeIntegratorFractionalStep::pre_initial_integrate1(double dt)
{
const DENS_MAT & my(nodalAtomicSpeciesConcentration_->quantity());
// updated filtered energy using explicit-implicit scheme
timeFilter_->apply_pre_step1(nodalAtomicSpeciesConcentrationFiltered_.set_quantity(),
my,dt);
}
//--------------------------------------------------------
// pre_final_integrate1
// first time integration computations
// before FractionalStep step 2
//--------------------------------------------------------
void SpeciesTimeIntegratorFractionalStep::pre_final_integrate1(double dt)
{
// Compute MD contribution to FEM equation
massDensity_ = nodalAtomicMassDensity_->quantity();
speciesConcentration_ = nodalAtomicSpeciesConcentration_->quantity();
atc_->set_fixed_nodes();
}
//--------------------------------------------------------
// post_final_integrate2
//--------------------------------------------------------
void SpeciesTimeIntegratorFractionalStep::post_final_integrate2(double dt)
{
timeFilter_->apply_post_step1(
nodalAtomicSpeciesConcentrationFiltered_.set_quantity(),
nodalAtomicSpeciesConcentration_->quantity(),dt);
speciesConcentration_ = nodalAtomicSpeciesConcentrationFiltered_.quantity();
}
//--------------------------------------------------------
// post_process
// post processing of variables before output
//--------------------------------------------------------
void SpeciesTimeIntegratorFractionalStep::post_process()
{
map<string,pair<MolSize,int> >::const_iterator molecule;
for (molecule = moleculeIds_.begin(); molecule != moleculeIds_.end(); molecule++) {
DENS_MAN & nodalMoleculeMassDensityOut(atc_->tagged_dens_man(molecule->first));
DENS_MAN * nodalMoleculeMassDensity((atc_->interscale_manager()).dense_matrix("NodalMoleculeMassDensity"+molecule->first));
nodalMoleculeMassDensityOut = nodalMoleculeMassDensity->quantity();
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class SpeciesTimeIntegratorFractionalStepFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab data from ATC
//--------------------------------------------------------
SpeciesTimeIntegratorFractionalStepFiltered::SpeciesTimeIntegratorFractionalStepFiltered(
SpeciesTimeIntegrator * speciesTimeIntegrator,
- const map<string,pair<IdType,int> > & speciesIds,
const map<string,pair<MolSize,int> > & moleculeIds) :
- SpeciesTimeIntegratorFractionalStep(speciesTimeIntegrator,speciesIds,moleculeIds)
+ SpeciesTimeIntegratorFractionalStep(speciesTimeIntegrator,moleculeIds)
{
throw ATC_Error("SpeciesTimeIntegratorFractionalStepFiltered work in progress");
// do nothing
}
//--------------------------------------------------------
// pre_initial_integrate1
//--------------------------------------------------------
void SpeciesTimeIntegratorFractionalStepFiltered::pre_final_integrate1(double dt)
{
}
};
diff --git a/lib/atc/SpeciesTimeIntegrator.h b/lib/atc/SpeciesTimeIntegrator.h
index 4c799b747..5d6c962d7 100644
--- a/lib/atc/SpeciesTimeIntegrator.h
+++ b/lib/atc/SpeciesTimeIntegrator.h
@@ -1,180 +1,177 @@
#ifndef SPECIES_TIME_INTEGRATOR_H
#define SPECIES_TIME_INTEGRATOR_H
+#include <map>
+#include <utility>
+#include <string>
+
// ATC headers
#include "TimeIntegrator.h"
-using namespace std;
namespace ATC {
// forward declarations
class ATC_CouplingMass;
class SpeciesIntegrationMethod;
/**
* @class SpeciesTimeIntegrator
* @brief Class for various time integrators for species FE quantities in the Eulerian frame
* (handles parsing and stores basic data structures)
*/
class SpeciesTimeIntegrator : public TimeIntegrator {
public:
// constructor
SpeciesTimeIntegrator(ATC_CouplingMass * atc,
TimeIntegrationType timeIntegrationType);
// destructor
virtual ~SpeciesTimeIntegrator(){};
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** create objects to implement requested numerical method */
virtual void construct_methods();
/** pack persistent fields */
virtual void pack_fields(RESTART_LIST & data);
DENS_MAN & nodal_atomic_species_concentration_filtered() { return nodalAtomicSpeciesConcentrationFiltered_; }
protected:
- /** sets of species tracked */
- const map<string,pair<IdType,int> > & speciesIds_;
/** sets of molecules tracked */
- const map<string,pair<MolSize,int> > & moleculeIds_;
+ const std::map<std::string,std::pair<MolSize,int> > & moleculeIds_;
/** data */
DENS_MAN nodalAtomicSpeciesConcentrationFiltered_;
private:
// DO NOT define this
SpeciesTimeIntegrator();
};
/**
* @class SpeciesIntegrationMethod
* @brief Class for species time integration methods which update FE quantities in time
*/
class SpeciesIntegrationMethod : public TimeIntegrationMethod {
public:
// constructor
SpeciesIntegrationMethod(SpeciesTimeIntegrator * speciesTimeIntegrator,
- const map<string,pair<IdType,int> > & speciesIds,
- const map<string,pair<MolSize,int> > & moleculeIds);
+ const std::map<std::string,std::pair<MolSize,int> > & moleculeIds);
// destructor
virtual ~SpeciesIntegrationMethod() {nodalAtomicMassDensity_=NULL;};
/** create and get necessary transfer operators */
virtual void construct_transfers();
protected:
/** time filtering object */
TimeFilter * timeFilter_;
/** finite element mass density field */
DENS_MAN & massDensity_;
/** atomic nodal mass density field */
// OBOLETE?
DENS_MAN & nodalAtomicMassDensityOut_;
DENS_MAN * nodalAtomicMassDensity_;
/** finite element mass density field */
DENS_MAN & speciesConcentration_;
DENS_MAN * nodalAtomicSpeciesConcentration_;
DENS_MAN & nodalAtomicSpeciesConcentrationFiltered_;
- /** sets of species tracked */
- const map<string,pair<IdType,int> > & speciesIds_;
+
/** sets of molecules tracked */
- const map<string,pair<MolSize,int> > & moleculeIds_;
+ const std::map<std::string,std::pair<MolSize,int> > & moleculeIds_;
private:
// DO NOT define this
SpeciesIntegrationMethod();
};
/**
* @class SpeciesTimeIntegratorFractionalStep
* @brief FractionalStep integration for FE species quantities
* (Uses 2nd order FractionalStep integration to update
* the FE mass density field)
*/
class SpeciesTimeIntegratorFractionalStep : public SpeciesIntegrationMethod {
public:
// constructor
SpeciesTimeIntegratorFractionalStep(SpeciesTimeIntegrator * speciesTimeIntegrator,
- const map<string,pair<IdType,int> > & speciesIds,
- const map<string,pair<MolSize,int> > & moleculeIds);
+ const std::map<std::string,std::pair<MolSize,int> > & moleculeIds);
// destructor
virtual ~SpeciesTimeIntegratorFractionalStep(){};
/** pre time integration */
virtual void initialize();
// time step methods, corresponding to ATC_Transfer
virtual void pre_initial_integrate1(double dt);
virtual void pre_final_integrate1(double dt);
virtual void post_final_integrate2(double dt);
/** post processing step before output */
virtual void post_process();
private:
// DO NOT define this
SpeciesTimeIntegratorFractionalStep();
};
/**
* @class SpeciesTimeIntegratorFractionalStepFiltered
* @brief FractionalStep integration for FE species quantities
* (Uses 2nd order FractionalStep integration to update
* the FE mass density field)
*/
class SpeciesTimeIntegratorFractionalStepFiltered : public SpeciesTimeIntegratorFractionalStep {
public:
// constructor
SpeciesTimeIntegratorFractionalStepFiltered(SpeciesTimeIntegrator * speciesTimeIntegrator,
- const map<string,pair<IdType,int> > & speciesIds,
- const map<string,pair<MolSize,int> > & moleculeIds);
+ const std::map<std::string,std::pair<MolSize,int> > & moleculeIds);
// destructor
virtual ~SpeciesTimeIntegratorFractionalStepFiltered(){};
/** pre time integration */
virtual void initialize() {};
// time step methods, corresponding to ATC_Transfer
/** first part of pre_final_integrate */
virtual void pre_final_integrate1(double dt);
/** post processing step before output */
virtual void post_process(){};
private:
// DO NOT define this
SpeciesTimeIntegratorFractionalStepFiltered();
};
};
#endif
diff --git a/lib/atc/Stress.cpp b/lib/atc/Stress.cpp
index c1747c3e9..df329f9fa 100644
--- a/lib/atc/Stress.cpp
+++ b/lib/atc/Stress.cpp
@@ -1,617 +1,620 @@
#include "Stress.h"
#include "CauchyBorn.h"
#include "CBLattice.h"
#include "CbLjCut.h"
#include "CbLjSmoothLinear.h"
#include "CbEam.h"
#include "ATC_Error.h"
#include "LammpsInterface.h"
#include "VoigtOperations.h"
#include <iostream>
-#include <fstream>
+using ATC_Utility::command_line;
+using ATC_Utility::str2dbl;
using voigt3::voigt_idx1;
using voigt3::voigt_idx2;
-//using voigt3::voigt_idx1_symm;
-//using voigt3::voigt_idx2_symm;
using voigt3::to_voigt_unsymmetric;
using voigt3::from_voigt_unsymmetric;
using voigt3::to_voigt;
using voigt3::from_voigt;
+using std::stringstream;
+using std::vector;
+using std::string;
+using std::fstream;
namespace ATC {
//=============================================================================
// extracts a stress at an integration point
// Note: Utility function: not in header
//=============================================================================
DENS_MAT extract_stress(const DENS_MAT_VEC &sigma, INDEX ip=0)
{
DENS_MAT s(3,3,false);
for (int j=0; j<3; j++) for (int i=0; i<3; i++) s(i,j) = sigma[i](ip,j);
return s;
}
//=============================================================================
// computes the pressure from the stress at the first quadrature point (in atm)
// Note: Utility function: not in header
//=============================================================================
double compute_pressure(const DENS_MAT_VEC &sigma, const DENS_MAT &F)
{
// pressure in units (mass-velocity^2)/Volume (LAMMPS real)
double p = (sigma[0](0,0) + sigma[1](0,1) + sigma[2](0,2)) * (1.0/3.0);
p *= 1.0e14/6.0221415; // convert from units real to Pa
p *= 1.0/101235.0; // convert from Pa to ATM
return p * pow(det(F), -1.0/3.0); // convert from PK2 to Cauchy stress
}
//=============================================================================
// extracts the deformation gradient at a quadrature point, q
// Note: Utility function: not in header
//=============================================================================
void deformation_gradient(const DENS_MAT_VEC &du, INDEX q, MATRIX &F)
{
F.reset(du.size(), du.size(), false);
for (INDEX j=0; j<F.nCols(); j++) {
for (INDEX i=0; i<F.nRows(); i++) F(i,j) = du[j](q,i);
F(j,j) += 1.0;
}
}
//=============================================================================
// E = 1/2 stress*strain for linear elastic models
//=============================================================================
void Stress::elastic_energy(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT &energy) const
{
int nRows = ( ((gradFields.find(DISPLACEMENT))->second)[0]).nRows();
energy.reset(nRows,1);
ATC::LammpsInterface::instance()->print_msg("WARNING: returning dummy elastic energy");
}
//=============================================================================
// isotropic linear elastic
//=============================================================================
StressLinearElastic::StressLinearElastic(fstream &fileId)
: StressCubicElastic(), E_(0), nu_(0), mu_(0), lambda_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line[0] == "end") {
mu_ = E_/(2.0+2.0*nu_);
lambda_ = mu_*nu_ / (0.5 - nu_);
StressCubicElastic::c11_ = E_*(1-nu_)/(1+nu_)/(1-2*nu_);
StressCubicElastic::c12_ = E_*nu_ /(1+nu_)/(1-2*nu_);
StressCubicElastic::c44_ = E_/(1+nu_)/2;
if (nu_ < 0.0 || nu_ > 1.0)
throw ATC_Error("bad linear elastic constants");
if (lambda_ < 0.0 || mu_ < 0.0)
throw ATC_Error("bad continuum material parameter");
return;
}
else if (line[0]=="modulus") E_ = str2dbl(line[1]);
else if (line[0]=="possions_ratio") nu_ = str2dbl(line[1]);
else throw ATC_Error( "unrecognized material function");
}
}
//=============================================================================
// compute the stress at N integration points from the displacement gradient
// T_{ij} = 1/2*C_{ijkl}* (u_{k,l} + u_{l,k})
//=============================================================================
void StressLinearElastic::stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &sigma)
{
GRAD_FIELD_MATS::const_iterator du_itr = gradFields.find(DISPLACEMENT);
const DENS_MAT_VEC &du = du_itr->second;
CLON_VEC uxx(du[0],CLONE_COL,0);
CLON_VEC uxy(du[1],CLONE_COL,0);
CLON_VEC uxz(du[2],CLONE_COL,0);
CLON_VEC uyx(du[0],CLONE_COL,1);
CLON_VEC uyy(du[1],CLONE_COL,1);
CLON_VEC uyz(du[2],CLONE_COL,1);
CLON_VEC uzx(du[0],CLONE_COL,2);
CLON_VEC uzy(du[1],CLONE_COL,2);
CLON_VEC uzz(du[2],CLONE_COL,2);
const INDEX N = uxx.size(); // # of integration pts
sigma.assign(3, DENS_MAT(N,3));
// precompute the pressure and copy to the diagonal
column(sigma[0],0) = (uxx + uyy + uzz)*(-lambda_);
column(sigma[1],1) = column(sigma[0],0);
column(sigma[2],2) = column(sigma[0],0);
column(sigma[0],0) -= 2.0*mu_*uxx;
column(sigma[0],1) = (uxy + uyx)*(-mu_);
column(sigma[0],2) = (uxz + uzx)*(-mu_);
column(sigma[1],0) = column(sigma[0],1);
column(sigma[1],1) -= 2.0*mu_*uyy;
column(sigma[1],2) = (uyz + uzy)*(-mu_);
column(sigma[2],0) = column(sigma[0],2);
column(sigma[2],1) = column(sigma[1],2);
column(sigma[2],2) -= 2.0*mu_*uzz;
}
//=============================================================================
// cubic elastic
//=============================================================================
StressCubicElastic::StressCubicElastic(fstream &fileId)
: c11_(0), c12_(0), c44_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line[0]=="end") return;
else if (line[0]=="c11") c11_ = str2dbl(line[1]);
else if (line[0]=="c12") c12_ = str2dbl(line[1]);
else if (line[0]=="c44") c44_ = str2dbl(line[1]);
else throw ATC_Error( "unrecognized material function");
}
}
//---------------------------------------------------------------------------
// compute the stress at N integration points from the displacement gradient
// T_{ij} = 1/2*C_{ijkl}*(u_{k,l} + u_{l,k})
//---------------------------------------------------------------------------
void StressCubicElastic::stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &sigma)
{
GRAD_FIELD_MATS::const_iterator du_itr = gradFields.find(DISPLACEMENT);
const DENS_MAT_VEC &du = du_itr->second;
CLON_VEC uxx(du[0],CLONE_COL,0);
CLON_VEC uxy(du[1],CLONE_COL,0);
CLON_VEC uxz(du[2],CLONE_COL,0);
CLON_VEC uyx(du[0],CLONE_COL,1);
CLON_VEC uyy(du[1],CLONE_COL,1);
CLON_VEC uyz(du[2],CLONE_COL,1);
CLON_VEC uzx(du[0],CLONE_COL,2);
CLON_VEC uzy(du[1],CLONE_COL,2);
CLON_VEC uzz(du[2],CLONE_COL,2);
const INDEX N = uxx.size(); // # of integration pts
sigma.assign(3, DENS_MAT(N,3));
const double c12 = c12_;
const double c11 = c11_;
const double c44 = c44_;
// scaling: stress must return (-) stress
column(sigma[0],0) = -c11*uxx - c12*(uyy+uzz);
column(sigma[1],1) = -c11*uyy - c12*(uxx+uzz);
column(sigma[2],2) = -c11*uzz - c12*(uxx+uyy);
column(sigma[0],1) = -c44*(uxy+uyx);
column(sigma[1],0) = column(sigma[0],1);
column(sigma[0],2) = -c44*(uxz+uzx);
column(sigma[2],0) = column(sigma[0],2);
column(sigma[1],2) = -c44*(uyz+uzy);
column(sigma[2],1) = column(sigma[1],2);
}
//---------------------------------------------------------------------------
// compute the elastic energy at N integration points from displacement gradient
// E = 1/8*C_{ijkl}* (u_{k,l} + u_{l,k})* (u_{i,j} + u_{j,i})*rho ?
// = 1/2 (4 c44 (u12^2 + u13^2 + u23^2) + 2 c12 (u11 u22 + u11 u33 + u22 u33)
// + c11 (u11^2 + u22^2 + u33^2))
//---------------------------------------------------------------------------
void StressCubicElastic::elastic_energy(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT &energy) const
{
GRAD_FIELD_MATS::const_iterator du_itr = gradFields.find(DISPLACEMENT);
const DENS_MAT_VEC &du = du_itr->second;
CLON_VEC uxx(du[0],CLONE_COL,0);
CLON_VEC uxy(du[1],CLONE_COL,0);
CLON_VEC uxz(du[2],CLONE_COL,0);
CLON_VEC uyx(du[0],CLONE_COL,1);
CLON_VEC uyy(du[1],CLONE_COL,1);
CLON_VEC uyz(du[2],CLONE_COL,1);
CLON_VEC uzx(du[0],CLONE_COL,2);
CLON_VEC uzy(du[1],CLONE_COL,2);
CLON_VEC uzz(du[2],CLONE_COL,2);
CLON_VEC E(energy,CLONE_COL,0);
const double c12 = c12_;
const double c11 = c11_;
const double c44 = c44_;
//double scale = (ATC::LammpsInterface::instance()->mvv2e());
for (INDEX gp=0; gp<du.front().nRows(); gp++) {
double u11 = uxx(gp);
double u22 = uyy(gp);
double u33 = uzz(gp);
double u12 = 0.5*(uxy(gp)+uyx(gp));
double u13 = 0.5*(uxz(gp)+uzx(gp));
double u23 = 0.5*(uyz(gp)+uzy(gp));
double EE = 0.5* (4.0*c44*(u12*u12 + u13*u13 + u23*u23)
+ 2.0*c12*(u11*u22 + u11*u33 + u22*u33)
+ c11*(u11*u11 + u22*u22 + u33*u33));
E(gp) = EE;
}
}
void StressCubicElastic::set_tangent(void)
{
C_.reset(6,6);
C_(0,0)=C_(1,1)=C_(2,2) =c11_;
C_(0,1)=C_(1,0)=C_(1,2)=C_(2,1)=C_(0,2)=C_(2,0)=c12_;
C_(3,3)=C_(4,4)=C_(5,5) =c44_;
}
//=============================================================================
// damped cubic elastic
//=============================================================================
StressCubicElasticDamped::StressCubicElasticDamped(fstream &fileId)
: StressCubicElastic(), gamma_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line[0]=="end") return;
else if (line[0]=="c11") StressCubicElastic::c11_ = str2dbl(line[1]);
else if (line[0]=="c12") StressCubicElastic::c12_ = str2dbl(line[1]);
else if (line[0]=="c44") StressCubicElastic::c44_ = str2dbl(line[1]);
else if (line[0]=="gamma") gamma_ = str2dbl(line[1]);
else throw ATC_Error( "unrecognized material function");
}
}
//---------------------------------------------------------------------------
// compute the stress at N integration points
//---------------------------------------------------------------------------
void StressCubicElasticDamped::stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &sigma)
{
StressCubicElastic::stress(fields,gradFields,sigma);
GRAD_FIELD_MATS::const_iterator dv_itr = gradFields.find(VELOCITY);
const DENS_MAT_VEC &dv = dv_itr->second;
CLON_VEC vxx(dv[0],CLONE_COL,0);
CLON_VEC vxy(dv[1],CLONE_COL,0);
CLON_VEC vxz(dv[2],CLONE_COL,0);
CLON_VEC vyx(dv[0],CLONE_COL,1);
CLON_VEC vyy(dv[1],CLONE_COL,1);
CLON_VEC vyz(dv[2],CLONE_COL,1);
CLON_VEC vzx(dv[0],CLONE_COL,2);
CLON_VEC vzy(dv[1],CLONE_COL,2);
CLON_VEC vzz(dv[2],CLONE_COL,2);
// scaling: stress must return (-) stress
column(sigma[0],0) += -gamma_*vxx;
column(sigma[1],1) += -gamma_*vyy;
column(sigma[2],2) += -gamma_*vzz;
column(sigma[0],1) += -0.5*gamma_*(vxy+vyx);
column(sigma[1],0) += column(sigma[0],1);
column(sigma[0],2) += -0.5*gamma_*(vxz+vzx);
column(sigma[2],0) += column(sigma[0],2);
column(sigma[1],2) += -0.5*gamma_*(vyz+vzy);
column(sigma[2],1) += column(sigma[1],2);
}
//==============================================================================
// cauchy born model
//==============================================================================
StressCauchyBorn::StressCauchyBorn(fstream &fileId, CbData &cb)
: cblattice_(NULL),
potential_(NULL),
makeLinear_(false),
cubicMat_(NULL),
initialized_(false),
fixed_temperature_(0.),
cbdata_(cb)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
while(fileId.good()) {
// reads a line from the material file
vector<string> line;
command_line(fileId, line);
if (line.empty()) continue; // skip blank lines
else if (line[0]=="end") {
delete cblattice_;
if (!potential_) throw ATC_Error( "no potential defined");
cblattice_ = new CBLattice(cbdata_.cell_vectors, cbdata_.basis_vectors);
return;
}
else if (line[0] == "pair_style") {
if (line[1] == "lj/cut") { // Lennard-Jones w/ cutoff radius
if (line.size()<3) throw(ATC_Error("no lj/cut cutoff radius"));
const double rc = str2dbl(line[2]);
while (!fileId.eof()) { // find next pair_coeff command
command_line(fileId, line);
if (line.size() && line[0]=="pair_coeff") break;
}
if (line[0] != "pair_coeff" || line.size() != 3) {
throw(ATC_Error("lj/cut needs 2 coefficents"));
}
delete potential_;
potential_ = new CbLjCut(str2dbl(line[1]), str2dbl(line[2]), rc);
}
else if (line[1] == "lj/smooth/linear") { // Lennard-Jones w/ cutoff radius and smoothed
if (line.size()<3) throw(ATC_Error("no lj/smooth/linear cutoff radius"));
const double rc = str2dbl(line[2]);
while (!fileId.eof()) { // find next pair_coeff command
command_line(fileId, line);
if (line.size() && line[0]=="pair_coeff") break;
}
if (line[0] != "pair_coeff" || line.size() != 3) {
throw(ATC_Error("lj/smooth/linear needs 2 coefficents"));
}
delete potential_;
potential_ = new CbLjSmoothLinear(str2dbl(line[1]), str2dbl(line[2]), rc);
}
else if (line[1] == "eam") { // Embedded atom method potential
delete potential_;
potential_ = new CbEam();
}
else throw (ATC_Error("Invalid pair style"));
}
else if (line[0] == "linear") makeLinear_ = true;
else if (line[0] == "temperature" && line.size() == 2) {
fixed_temperature_ = str2dbl(line[1]);
}
else if (line[0]=="material" || line[0]=="stress") /* ignore this */;
else throw ATC_Error( "Unrecognized Cauchy-Born parameter: "+line[0]+".");
}
}
//==============================================================================
//* default destructor - delete potential and lattice
//==============================================================================
StressCauchyBorn::~StressCauchyBorn()
{
if (potential_) delete potential_;
if (cblattice_) delete cblattice_;
if (cubicMat_) delete cubicMat_;
}
//==============================================================================
// initialize
//==============================================================================
void StressCauchyBorn::initialize(void)
{
if (!initialized_) {
if (makeLinear_) linearize();
stringstream ss;
double k = stiffness()*cbdata_.e2mvv;
double m = cbdata_.atom_mass;
double w0 = sqrt(k*m);
ss << "CB stiffness: " << stiffness() << " Einstein freq: " << w0;
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
initialized_ = true;
}
}
//==============================================================================
// compute the bond stiffness consistent with the einstein freq
//==============================================================================
double StressCauchyBorn::stiffness(void) const
{
AtomCluster vac;
cblattice_->atom_cluster(eye<double>(3,3), potential_->cutoff_radius(), vac);
DENS_MAT k = vac.force_constants(0,potential_);
return k(0,0);
}
//==============================================================================
// compute the stress at N integration points from the displacement gradient
//==============================================================================
void StressCauchyBorn::stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &sigma)
{
if (cubicMat_) {
cubicMat_->stress(fields, gradFields, sigma);
return;
}
FIELD_MATS::const_iterator temp = fields.find(TEMPERATURE);
GRAD_FIELD_MATS::const_iterator disp_gradient = gradFields.find(DISPLACEMENT);
// Scaling factor - scale by atomic volume and energy conversion.
// negative because stress must return (-) stress
const double fact = -cbdata_.inv_atom_volume * cbdata_.e2mvv;
const DENS_MAT_VEC &du(disp_gradient->second);
const INDEX num_integration_pts = du.front().nRows();
const INDEX nsd = du.size();
DENS_MAT F(nsd,nsd); // displacement gradient
bool temp_varies = (temp != fields.end());
sigma.assign(nsd, DENS_MAT(num_integration_pts, nsd));
StressAtIP S(sigma); // wrapper for quadrature points.
AtomCluster vac;
for (INDEX gp=0; gp<num_integration_pts; gp++) {
// Sets the quadrature point to be computed.
S.set_quadrature_point(gp);
// Get displacement gradient and construct a virtual atom cluster.
deformation_gradient(du, gp, F);
// Generates the atom cluster, given the deformation gradient.
cblattice_->atom_cluster(F, potential_->cutoff_radius(), vac);
// Get temperature (assume 0K if no temperature field is present).
const double T = (temp_varies ? temp->second[gp] : fixed_temperature_);
// Computes the cauchy-born stresses.
const StressArgs args(vac, potential_, cbdata_.boltzmann, cbdata_.hbar, T);
cb_stress(args, S);
// copy symmetric part of stress and scale by V0
for (INDEX i=0; i<nsd; i++) {
S(i,i) *= fact;
for (INDEX j=i+1; j<nsd; j++) S(j,i)=(S(i,j)*=fact);
}
}
}
//==============================================================================
// Computes free (T>0)/potential(T=0) energy density. [mvv/L^3]
//==============================================================================
void StressCauchyBorn::elastic_energy(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT &energy) const
{
if (cubicMat_) {
cubicMat_->elastic_energy(fields, gradFields, energy);
return;
}
FIELD_MATS::const_iterator temp = fields.find(TEMPERATURE);
GRAD_FIELD_MATS::const_iterator disp_gradient = gradFields.find(DISPLACEMENT);
const DENS_MAT_VEC &du(disp_gradient->second);
DENS_MAT F(du.size(),du.size());
AtomCluster vac;
for (INDEX gp=0; gp<du.front().nRows(); gp++) {
deformation_gradient(du, gp, F);
cblattice_->atom_cluster(F, potential_->cutoff_radius(), vac);
double T = (temp!=fields.end() ? temp->second[gp] : fixed_temperature_);
energy[gp] = cb_energy(StressArgs(vac, potential_, cbdata_.boltzmann, cbdata_.hbar, T));
}
// Scaling factor - scale by atomic volume and energy conversion.
energy *= cbdata_.inv_atom_volume * cbdata_.e2mvv;
}
//==============================================================================
// Computes entropic energy density. [mvv/L^3]
//==============================================================================
void StressCauchyBorn::entropic_energy(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT &energy) const
{
FIELD_MATS::const_iterator temp = fields.find(TEMPERATURE);
GRAD_FIELD_MATS::const_iterator disp_gradient = gradFields.find(DISPLACEMENT);
const DENS_MAT_VEC &du(disp_gradient->second);
DENS_MAT F(du.size(),du.size());
AtomCluster vac;
for (INDEX gp=0; gp<du.front().nRows(); gp++) {
deformation_gradient(du, gp, F);
cblattice_->atom_cluster(F, potential_->cutoff_radius(), vac);
double T = (temp!=fields.end() ? temp->second[gp] : fixed_temperature_);
energy[gp] = cb_entropic_energy(StressArgs(vac, potential_, cbdata_.boltzmann, cbdata_.hbar, T));
}
// Scaling factor - scale by atomic volume and energy conversion.
energy *= cbdata_.inv_atom_volume * cbdata_.e2mvv;
}
//==============================================================================
// creates a linearization for a deformation gradient
//==============================================================================
void StressCauchyBorn::linearize(MATRIX *F)
{
if (cubicMat_) delete cubicMat_;
DENS_MAT C;
if (F) tangent(*F, C);
else tangent(eye<double>(3,3), C);
cubicMat_ = new StressCubicElastic(C(0,0), C(0,1), C(3,3));
stringstream ss;
double c11 = C(0,0)/cbdata_.e2mvv;
double c12 = C(0,1)/cbdata_.e2mvv;
double c44 = C(3,3)/cbdata_.e2mvv;
ss << "created cubic stress function:"
<< "\n lammps ATC units"
<< "\n c11=" << c11 << " " << C(0,0)
<< "\n c12=" << c12 << " " << C(0,1)
<< "\n c44=" << c44 << " " << C(3,3);
ATC::LammpsInterface::instance()->print_msg_once(ss.str());
}
//==============================================================================
// sets C as the material tangent modulus, given deformation gradient F
//==============================================================================
// Note: C is dS/dC which is 1/2 dS/dF_sym
void StressCauchyBorn::tangent(const MATRIX &F, MATRIX &C) const
{
if (cubicMat_) {
cubicMat_->tangent(F,C);
return;
}
elasticity_tensor(F,C);
}
//==============================================================================
// 1st elasticity tensor : B = dP/dF = C F F + S I ( 9 x 9 in Voigt notation)
// 2nd elasticity tensor : C = dS/dE ( 6 x 6 in Voigt notation)
//==============================================================================
DENS_VEC StressCauchyBorn::elasticity_tensor(const VECTOR &Fv, MATRIX &C, const ElasticityTensorType type) const
{
DENS_MAT F;
if (Fv.nRows()==9) { F = from_voigt_unsymmetric(Fv); }
else { F = from_voigt(Fv); }
return elasticity_tensor(F, C,type);
}
DENS_VEC StressCauchyBorn::elasticity_tensor(const MATRIX &F, MATRIX &C, const ElasticityTensorType type) const
{
double T = 0;
AtomCluster vac;
cblattice_->atom_cluster(F, potential_->cutoff_radius(), vac);
if (vac.size() < 4) throw ATC_Error("StressCauchyBorn::second_elasticity_tensor cluster does not have sufficient atoms");
const StressArgs args(vac, potential_, cbdata_.boltzmann, cbdata_.hbar, T);
// if using EAM potential, calculate embedding function and derivatives
bool hasEAM = potential_->terms.embedding;
double embed_p = 0;
double embed_pp = 0;
if (hasEAM) {
double e_density = cb_electron_density(args);
embed_p = potential_->F_p(e_density); // "F" in usual EAM symbology
embed_pp = potential_->F_pp(e_density);
}
int size = 6;
if (type == FIRST_ELASTICITY_TENSOR) { size = 9; }
DENS_VEC Z(size), S(size), Zfp(size);
Zfp = 0;
C.reset(size,size);
for (INDEX a=0; a<vac.size(); a++) {
const DENS_VEC &Ra = vac.R(a);
if (type == FIRST_ELASTICITY_TENSOR) {
DENS_VEC ra = F*Ra;
for (INDEX i=0; i<size; i++) { Z(i)=ra(voigt_idx1[i])*Ra(voigt_idx2[i]); }
}
else {
for (INDEX i=0; i<size; i++) { Z(i)=Ra(voigt_idx1[i])*Ra(voigt_idx2[i]); }
}
double d = vac.bond_length(a);
double rinv = 1.0/d;
double phi_r = potential_->phi_r(d); // computes phi'
double phi_rr = potential_->phi_rr(d); // computes phi''
double fact1 = 0.5*phi_r*rinv; // 1/2 see Philips
double fact2 = 0.5*(phi_rr - phi_r*rinv) * rinv*rinv;
if (hasEAM) {
double rho_r = potential_->rho_r(d); // computes rho'
double rho_rr = potential_->rho_rr(d); // computes rho''
fact1 += embed_p*rho_r*rinv;
fact2 += embed_p*(rho_rr - rho_r*rinv) * rinv*rinv;
Zfp += Z*(rho_r*rinv);
}
for (INDEX i=0; i<size; i++) {
S(i) += fact1*Z(i);
for (INDEX j=0; j<size; j++) {
C(i,j) += fact2*Z(i)*Z(j);
}
}
if (type == FIRST_ELASTICITY_TENSOR) {
for (INDEX i=0; i<9; i++) {
for (INDEX j=0; j<9; j++) {
if ( voigt_idx1[i] == voigt_idx1[j] ) { // \delta_ik S_JL
C(i,j) += fact1*Ra(voigt_idx2[i])*Ra(voigt_idx2[j]);
}
}
}
}
}
if (hasEAM) {
for (INDEX i=0; i<6; i++) {
for (INDEX j=0; j<6; j++) {
C(i,j) += embed_pp*Zfp(i)*Zfp(j);
}
}
}
double s = cbdata_.inv_atom_volume * cbdata_.e2mvv;
S *= s;
C *= s;
return S;
}
}// end atc namespace
diff --git a/lib/atc/Stress.h b/lib/atc/Stress.h
index 66394f1e6..bf4065519 100644
--- a/lib/atc/Stress.h
+++ b/lib/atc/Stress.h
@@ -1,218 +1,212 @@
#ifndef STRESS_H
#define STRESS_H
#include <map>
#include <string>
#include <vector>
-
-using std::map;
-using std::string;
-
+#include <fstream>
#include "MatrixLibrary.h"
#include "ATC_TypeDefs.h"
#include "ATC_TypeDefs.h"
#include "NonLinearSolver.h"
-using ATC_Utility::command_line;
-using ATC_Utility::str2dbl;
-
namespace ATC {
enum ElasticityTensorType {FIRST_ELASTICITY_TENSOR=0, SECOND_ELASTICITY_TENSOR};
/**
* @class Stress
* @brief Base class that defines interface for a constitutive law
* @brief that computes stress given all field and gradient information.
*/
class Stress
{
public:
Stress() {};
virtual ~Stress() {};
virtual void initialize(void){};
//* Returns parameter values, (Nothing uses this).
- virtual void parameters(map<string,double> &parameters) {}
+ virtual void parameters(std::map<std::string,double> &parameters) {}
//* Computes stress given a displacement gradient.
//* Units: mvv/L^3 (i.e. for units Real: g/(mol ps^2 A^2) )
virtual void stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &stress)=0;
//* Computes free (T>0)/potential(T=0) energy density
//* Units: mvv/L^3 (i.e. for units Real: g/(mol ps^2 A^2) )
virtual void elastic_energy(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT &energy) const;
//* Returns the material tangent at a given deformation gradient.
virtual void tangent(const MATRIX &F, MATRIX &C) const
{throw ATC_Error("Stress::tangent: unimplemented function");}
};
/**
* @class StressCubicElastic
* @brief Class for computing stress for a cubic elastic material
*/
class StressCubicElastic : public Stress
{
public:
StressCubicElastic():c11_(0),c12_(0),c44_(0){};
- StressCubicElastic(fstream &matfile);
+ StressCubicElastic(std::fstream &matfile);
StressCubicElastic(double c11, double c12, double c44)
: c11_(c11), c12_(c12), c44_(c44) { }
void stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux);
virtual void elastic_energy(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT &energy) const;
virtual void tangent(const MATRIX &F, MATRIX &C) const {C=C_;}
protected:
double c11_, c12_, c44_;
DENS_MAT C_;
void set_tangent();
};
/**
* @class StressCubicElasticDamped
* @brief Class for computing stress for a cubic elastic material w/ damping
*/
class StressCubicElasticDamped : public StressCubicElastic
{
public:
- StressCubicElasticDamped(fstream &matfile);
+ StressCubicElasticDamped(std::fstream &matfile);
StressCubicElasticDamped(double c11, double c12, double c44, double gamma)
: StressCubicElastic(c11,c12,c44), gamma_(gamma) { }
void stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux);
protected:
double gamma_;
};
/**
* @class StressLinearElastic
* @brief Class for computing stress for a linear elastic material
*/
class StressLinearElastic : public StressCubicElastic
{
public:
- StressLinearElastic(fstream &matfile);
+ StressLinearElastic(std::fstream &matfile);
void stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux);
protected:
double E_, nu_;
double mu_, lambda_;
};
// forward declarations needed by StressCauchyBorn
class CbPotential;
class CBLattice;
/**
* Structure of lattice properties needed by StressCauchyBorn.
*/
struct CbData {
double e2mvv; //*> Energy conversion factor (1/mvv2e).
double boltzmann; //*> Boltzmann constant (in LAMMPS units)
double hbar; //*> Planck's constant (in LAMMPS units)
double inv_atom_volume; //*> Volume of atom.
double atom_mass; //*> Mass of an atom.
DENS_MAT cell_vectors; //*> Unit vectors for lattice cells.
DENS_MAT basis_vectors; //*> Positions of atoms within a lattice cell.
};
/**
* @class StressCauchyBorn
* @brief Class for computing the stress and elastic constants for a
* @brief Cauchy-Born material.
*/
class StressCauchyBorn : public Stress
{
public:
- StressCauchyBorn(fstream &matfile, CbData &cb);
+ StressCauchyBorn(std::fstream &matfile, CbData &cb);
virtual ~StressCauchyBorn();
virtual void initialize(void);
//* Returns the stress computed from a 0K Cauchy-Born approxmation.
virtual void stress(const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux);
//* Computes free (T>0)/potential(T=0) energy density
//* Units: mvv/L^3 (i.e. for units Real: g/(mol ps^2 A^2) )
virtual void elastic_energy(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT &energy) const;
//* Computes entropic energy density
void entropic_energy(const FIELD_MATS &fields, const GRAD_FIELD_MATS &gradFields,
DENS_MAT &energy) const;
//* Returns the material tangent at a given deformation gradient.
virtual void tangent(const MATRIX &F, MATRIX &C) const;
double stiffness() const;
//* Creates a linearization for a deformation gradient.
DENS_VEC elasticity_tensor(const VECTOR &Fv, MATRIX &C, const ElasticityTensorType type=FIRST_ELASTICITY_TENSOR) const;
DENS_VEC elasticity_tensor(const MATRIX &F, MATRIX &C, const ElasticityTensorType type=FIRST_ELASTICITY_TENSOR) const;
protected:
void linearize(MATRIX *F=NULL);
CBLattice *cblattice_; //*> CbLattice -> makes atom clusters.
CbPotential *potential_; //*> CbPotential -> interatomic forces.
bool makeLinear_;
StressCubicElastic *cubicMat_; //*> Stores optional linear elastic law.
bool initialized_;
double fixed_temperature_; //*> Specifies a uniform temperature.
CbData cbdata_; //*> Lattice & atom volume/mass.
};
// adaptor to NonLinearSolver
class CBElasticTangentOperator : public TangentOperator {
public:
CBElasticTangentOperator (StressCauchyBorn * cauchyBornStress,
DENS_VEC & targetP) :
TangentOperator(),
cauchyBornStress_(cauchyBornStress),
targetP_(targetP) {};
void function(const VECTOR & F, DENS_VEC & R)
{
DENS_MAT B;
tangent(F,R,B);
}
void tangent(const VECTOR & F, DENS_VEC & R, MATRIX & B)
{
cbP_ = cauchyBornStress_->elasticity_tensor(F, B);
R = cbP_ - targetP_;
}
private:
StressCauchyBorn * cauchyBornStress_;
DENS_VEC targetP_, cbP_;
};
// adaptor to NonLinearSolver
class CB2ndElasticTangentOperator : public TangentOperator {
public:
CB2ndElasticTangentOperator (StressCauchyBorn * cauchyBornStress,
DENS_VEC & targetS) :
TangentOperator(),
cauchyBornStress_(cauchyBornStress),
targetS_(targetS) {};
void function(const VECTOR & U, DENS_VEC & r)
{
DENS_MAT C;
tangent(U,r,C);
}
void tangent(const VECTOR & U, DENS_VEC & r, MATRIX & C)
{
cbS_ = cauchyBornStress_->elasticity_tensor(U, C, SECOND_ELASTICITY_TENSOR);
r = cbS_ - targetS_;
}
private:
StressCauchyBorn * cauchyBornStress_;
DENS_VEC targetS_, cbS_;
};
}
#endif
diff --git a/lib/atc/ThermalTimeIntegrator.cpp b/lib/atc/ThermalTimeIntegrator.cpp
index d2de5e858..8186437bf 100644
--- a/lib/atc/ThermalTimeIntegrator.cpp
+++ b/lib/atc/ThermalTimeIntegrator.cpp
@@ -1,701 +1,698 @@
// ATC transfer headers
#include "ThermalTimeIntegrator.h"
#include "TransferOperator.h"
#include "ATC_Coupling.h"
#include "TimeFilter.h"
#include "ATC_Error.h"
#include "PerAtomQuantityLibrary.h"
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermalTimeIntegrator
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ThermalTimeIntegrator::ThermalTimeIntegrator(ATC_Coupling * atc,
TimeIntegrationType timeIntegrationType) :
TimeIntegrator(atc, timeIntegrationType)
{
// do nothing
}
//--------------------------------------------------------
// modify
// parses inputs and modifies state of the integrator
//--------------------------------------------------------
bool ThermalTimeIntegrator::modify(int narg, char **arg)
{
bool foundMatch = false;
int argIndex = 0;
// time integration scheme
- /*! \page man_time_integration fix_modify AtC time_integration
+ /*! \page man_thermal_time_integration fix_modify AtC time_integration (thermal)
\section syntax
fix_modify AtC time_integration <descriptor> \n
- descriptor (string) = time integration type \n
various time integration methods for the finite elements\n
\section description
- GEAR - atomic velocity update with 2nd order Verlet \n
- nodal temperature update with 3rd or 4th order Gear \n
- thermostats based on controlling power \n
- FRACTIONAL_STEP - atomic velocity update with 2nd order Verlet \n
- mixed nodal temperature update, 3/4 Gear for continuum and 2 Verlet for atomic contributions\n
- thermostats based on controlling discrete energy changes\n
+ gear - atomic velocity update with 2nd order Verlet, nodal temperature update with 3rd or 4th order Gear, thermostats based on controlling power \n
+ fractional_step - atomic velocity update with 2nd order Verlet, mixed nodal temperature update, 3/4 Gear for continuum and 2 Verlet for atomic contributions, thermostats based on controlling discrete energy changes\n
\section examples
<TT> fix_modify atc time_integration gear </TT> \n
<TT> fix_modify atc time_integration fractional_step </TT> \n
\section description
\section related
+ see \ref man_fix_atc
\section default
- Gear
+ none
*/
if (strcmp(arg[argIndex],"gear")==0) {
timeIntegrationType_ = GEAR;
needReset_ = true;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"fractional_step")==0) {
timeIntegrationType_ = FRACTIONAL_STEP;
needReset_ = true;
foundMatch = true;
}
return foundMatch;
}
//--------------------------------------------------------
// construct_methods
// creates algorithm objects
//--------------------------------------------------------
void ThermalTimeIntegrator::construct_methods()
{
if (atc_->reset_methods()) {
if (timeIntegrationMethod_) delete timeIntegrationMethod_;
if (timeFilterManager_->need_reset()) {
switch (timeIntegrationType_) {
case GEAR: {
timeFilter_ = timeFilterManager_->construct(TimeFilterManager::IMPLICIT);
atc_->set_mass_mat_time_filter(TEMPERATURE,TimeFilterManager::EXPLICIT);
break;
}
case FRACTIONAL_STEP: {
timeFilter_ = timeFilterManager_->construct(TimeFilterManager::EXPLICIT_IMPLICIT);
atc_->set_mass_mat_time_filter(TEMPERATURE,TimeFilterManager::EXPLICIT_IMPLICIT);
break;
}
default:
throw ATC_Error("Uknown time integration type in ThermalTimeIntegrator::Initialize()");
}
}
if (timeFilterManager_->filter_dynamics()) {
switch (timeIntegrationType_) {
case GEAR: {
timeIntegrationMethod_ = new ThermalTimeIntegratorGearFiltered(this);
break;
}
case FRACTIONAL_STEP: {
timeIntegrationMethod_ = new ThermalTimeIntegratorFractionalStepFiltered(this);
break;
}
default:
throw ATC_Error("Uknown time integration type in ThermalTimeIntegrator::Initialize()");
}
}
else {
switch (timeIntegrationType_) {
case GEAR: {
timeIntegrationMethod_ = new ThermalTimeIntegratorGear(this);
break;
}
case FRACTIONAL_STEP: {
timeIntegrationMethod_ = new ThermalTimeIntegratorFractionalStep(this);
break;
}
default:
throw ATC_Error("Uknown time integration type in ThermalTimeIntegrator::Initialize()");
}
}
}
}
//--------------------------------------------------------
// pack_fields
// add persistent variables to data list
//--------------------------------------------------------
void ThermalTimeIntegrator::pack_fields(RESTART_LIST & data)
{
data["NodalAtomicPowerFiltered"] = & nodalAtomicPowerFiltered_.set_quantity();
data["NodalAtomicEnergyFiltered"] = & nodalAtomicEnergyFiltered_.set_quantity();
TimeIntegrator::pack_fields(data);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermalIntegrationMethod
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab data from ATC
//--------------------------------------------------------
ThermalIntegrationMethod::ThermalIntegrationMethod(ThermalTimeIntegrator * thermalTimeIntegrator) :
TimeIntegrationMethod(thermalTimeIntegrator),
timeFilter_(thermalTimeIntegrator->time_filter()),
temperature_(atc_->field(TEMPERATURE)),
temperatureRoc_(atc_->field_roc(TEMPERATURE)),
temperature2Roc_(atc_->field_2roc(TEMPERATURE)),
nodalAtomicTemperatureOut_(atc_->nodal_atomic_field(TEMPERATURE)),
nodalAtomicTemperature_(NULL),
temperatureRhs_(atc_->field_rhs(TEMPERATURE)),
nodalAtomicPowerOut_(atc_->nodal_atomic_field_roc(TEMPERATURE))
{
// do nothing
}
//--------------------------------------------------------
// construct_transfers
// Grab existing managed quantities,
// create the rest
//--------------------------------------------------------
void ThermalIntegrationMethod::construct_transfers()
{
nodalAtomicTemperature_ =
(atc_->interscale_manager()).dense_matrix("NodalAtomicTemperature");
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermalIntegratorGear
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ThermalTimeIntegratorGear::ThermalTimeIntegratorGear(ThermalTimeIntegrator * thermalTimeIntegrator) :
ThermalIntegrationMethod(thermalTimeIntegrator),
nodalAtomicPowerFiltered_(thermalTimeIntegrator->nodal_atomic_power_filtered())
{
// do nothing
}
//--------------------------------------------------------
// construct_transfers
// Grab existing managed quantities,
// create the rest
//--------------------------------------------------------
void ThermalTimeIntegratorGear::construct_transfers()
{
ThermalIntegrationMethod::construct_transfers();
InterscaleManager & interscaleManager = atc_->interscale_manager();
// add in power computation
DotTwiceKineticEnergy * dotTwiceKineticEnergy =
new DotTwiceKineticEnergy(atc_);
interscaleManager.add_per_atom_quantity(dotTwiceKineticEnergy,"DotTwiceKineticEnergy");
nodalAtomicPower_ = new AtfShapeFunctionRestriction(atc_,
dotTwiceKineticEnergy,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_dense_matrix(nodalAtomicPower_,"NodalAtomicPower");
}
//--------------------------------------------------------
// initialize
// initialize all data
//--------------------------------------------------------
void ThermalTimeIntegratorGear::initialize()
{
ThermalIntegrationMethod::initialize();
// sets up time filter for cases where variables temporally filtered
// this time integrator should use an implicit filter
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (timeFilterManager->need_reset()) {
// Some time filters need the old value for the power
timeFilter_->initialize(nodalAtomicPower_->quantity());
}
if (!timeFilterManager->end_equilibrate()) {
nodalAtomicPowerFiltered_.reset(atc_->num_nodes(),1);
}
if (!timeFilterManager->filter_dynamics()) {
temperatureRhs_ = nodalAtomicPower_->quantity();
}
}
//--------------------------------------------------------
// pre_initial_integrate2
/// time integration before Verlet step 1
//--------------------------------------------------------
void ThermalTimeIntegratorGear::pre_initial_integrate2(double dt)
{
// Predict nodal temperatures and time derivatives based on FE data
// use 3rd order Gear
gear1_3_predict(temperature_.set_quantity(),
temperatureRoc_.set_quantity(),
temperature2Roc_.quantity(),dt);
}
//--------------------------------------------------------
// post_final_integrate1
// time integration after Verlet step 2
//--------------------------------------------------------
void ThermalTimeIntegratorGear::post_final_integrate1(double dt)
{
const DENS_MAT & myNodalAtomicPower(nodalAtomicPower_->quantity());
timeFilter_->apply_post_step2(nodalAtomicPowerFiltered_.set_quantity(),
myNodalAtomicPower,dt);
temperatureRhs_ += myNodalAtomicPower;
// Finish updating temperature
_temperatureResidual_.resize(atc_->num_nodes(),1);
atc_->apply_inverse_mass_matrix(temperatureRhs_.quantity(),
_temperatureResidual_,
TEMPERATURE);
_temperatureResidual_ -= temperatureRoc_.quantity();
_temperatureResidual_ *= dt;
gear1_3_correct(temperature_.set_quantity(),
temperatureRoc_.set_quantity(),
temperature2Roc_.set_quantity(),
_temperatureResidual_,dt);
}
//--------------------------------------------------------
// post_process
// do any post-processing calculations required for
// output phase
//--------------------------------------------------------
void ThermalTimeIntegratorGear::post_process()
{
nodalAtomicPowerOut_ = nodalAtomicPower_->quantity();
nodalAtomicTemperatureOut_ = nodalAtomicTemperature_->quantity();
}
//--------------------------------------------------------
// finish
// finalize state of nodal atomic quantities
//--------------------------------------------------------
void ThermalTimeIntegratorGear::finish()
{
post_process();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermalTimeIntegratorGearFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab data from ATC
//--------------------------------------------------------
ThermalTimeIntegratorGearFiltered::ThermalTimeIntegratorGearFiltered(ThermalTimeIntegrator * thermalTimeIntegrator) :
ThermalTimeIntegratorGear(thermalTimeIntegrator),
temperature3Roc_(atc_->field_3roc(TEMPERATURE))
{
// do nothing
// specifically if history data is required and we need another time filter object for the fields
}
//--------------------------------------------------------
// pre_initial_integrate2
// time integration before Verlet step 1
//--------------------------------------------------------
void ThermalTimeIntegratorGearFiltered::pre_initial_integrate2(double dt)
{
// Predict nodal temperatures and time derivatives based on FE data
// use 3rd order Gear
gear1_4_predict(temperature_.set_quantity(),
temperatureRoc_.set_quantity(),
temperature2Roc_.set_quantity(),
temperature3Roc_.quantity(),dt);
}
//--------------------------------------------------------
// post_final_integrate1
// first time integration computations
// after Verlet step 2
//--------------------------------------------------------
void ThermalTimeIntegratorGearFiltered::post_final_integrate1(double dt)
{
DENS_MAT & myNodalAtomicPowerFiltered(nodalAtomicPowerFiltered_.set_quantity());
timeFilter_->apply_post_step2(myNodalAtomicPowerFiltered,nodalAtomicPower_->quantity(),dt);
temperatureRhs_ += myNodalAtomicPowerFiltered;
// Finish updating temperature
_temperatureResidual_.resize(atc_->num_nodes(),1);
atc_->apply_inverse_mass_matrix(temperatureRhs_.quantity(),
_temperatureResidual_,
TEMPERATURE);
_temperatureResidual_ -= temperatureRoc_.quantity();
_temperatureResidual_ *= dt;
gear1_4_correct(temperature_.set_quantity(),
temperatureRoc_.set_quantity(),
temperature2Roc_.set_quantity(),
temperature3Roc_.set_quantity(),
_temperatureResidual_,dt);
}
//--------------------------------------------------------
// post_final_integrate3
// third time integration computations
// after Verlet step 2
//--------------------------------------------------------
void ThermalTimeIntegratorGearFiltered::post_final_integrate3(double dt)
{
// update filtered atomic temperature
timeFilter_->apply_post_step2(nodalAtomicTemperatureOut_.set_quantity(),
nodalAtomicTemperature_->quantity(),dt);
}
//--------------------------------------------------------
// post_process
// do any post-processing calculations required for
// output phase
//--------------------------------------------------------
void ThermalTimeIntegratorGearFiltered::post_process()
{
nodalAtomicPowerOut_ = nodalAtomicPowerFiltered_.quantity();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermalIntegratorFractionalStep
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab data from ATC
//--------------------------------------------------------
ThermalTimeIntegratorFractionalStep::ThermalTimeIntegratorFractionalStep(ThermalTimeIntegrator * thermalTimeIntegrator) :
ThermalIntegrationMethod(thermalTimeIntegrator),
nodalAtomicEnergyFiltered_(thermalTimeIntegrator->nodal_atomic_energy_filtered()),
nodalAtomicPowerFiltered_(thermalTimeIntegrator->nodal_atomic_power_filtered()),
atomicTemperatureDelta_(atc_->num_nodes(),1),
nodalAtomicEnergy_(NULL),
nodalAtomicEnergyOld_(atc_->num_nodes(),1),
nodalAtomicTemperatureOld_(atc_->num_nodes(),1)
{
// do nothing
}
//--------------------------------------------------------
// construct_transfers
// Grab existing managed quantities,
// create the rest
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::construct_transfers()
{
ThermalIntegrationMethod::construct_transfers();
InterscaleManager & interscaleManager(atc_->interscale_manager());
nodalAtomicEnergy_ = interscaleManager.dense_matrix("NodalAtomicEnergy");
}
//--------------------------------------------------------
// initialize
// initialize all data
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::initialize()
{
ThermalIntegrationMethod::initialize();
// initial power to zero
nodalAtomicPower_.reset(atc_->num_nodes(),1);
// sets up time filter for cases where variables temporally filtered
// this time integrator should use Crank-Nicholson filter for 2nd order accuracy
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (timeFilterManager->need_reset()) {
// the form of this integrator implies no time filters that require history data can be used
timeFilter_->initialize();
}
// sets up time filter for post-processing the filtered power
// this time integrator should use an explicit-implicit filter
// to mirror the 2nd order Verlet integration scheme
// It requires no history information so initial value just sizes arrays
if (!timeFilterManager->end_equilibrate()) {
// implies an initial condition of the instantaneous atomic energy
// for the corresponding filtered variable, consistent with the temperature
nodalAtomicEnergyFiltered_ = nodalAtomicEnergy_->quantity();
nodalAtomicPowerFiltered_.reset(atc_->num_nodes(),1);
}
}
//--------------------------------------------------------
// pre_initial_integrate1
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::pre_initial_integrate1(double dt)
{
const DENS_MAT & myNodalAtomicEnergy(nodalAtomicEnergy_->quantity());
// updated filtered energy using explicit-implicit scheme
timeFilter_->apply_pre_step1(nodalAtomicEnergyFiltered_.set_quantity(),
myNodalAtomicEnergy,dt);
}
//--------------------------------------------------------
// pre_initial_integrate2
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::pre_initial_integrate2(double dt)
{
// used for updating change in temperature from mass matrix change
this->compute_old_time_data();
// update FE contributions
apply_gear_predictor(dt);
// update filtered nodal atomic power
// that way thermostat and integrator can be consistent
timeFilter_->apply_pre_step1(nodalAtomicPowerFiltered_.set_quantity(),
nodalAtomicPower_,dt);
// store current energy for use later
nodalAtomicPower_ = nodalAtomicEnergy_->quantity();
nodalAtomicPower_ *= -1.;
}
//--------------------------------------------------------
// pre_final_integrate1
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::pre_final_integrate1(double dt)
{
// before the new rhs is computed but after atomic velocity is updated
// to allow for general notions of temperature beyond kinetic.
// compute change in restricted atomic energy
nodalAtomicPower_ += nodalAtomicEnergy_->quantity();
// update FE temperature with change in temperature from MD
compute_temperature_delta(nodalAtomicPower_,dt);
temperature_ += atomicTemperatureDelta_.quantity();
// approximation to power for output
nodalAtomicPower_ /= dt;
timeFilter_->apply_post_step1(nodalAtomicPowerFiltered_.set_quantity(),
nodalAtomicPower_,dt);
// make sure nodes are fixed
atc_->set_fixed_nodes();
}
//--------------------------------------------------------
// post_final_integrate1
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::post_final_integrate1(double dt)
{
// Finish updating temperature with FE contributions
atc_->apply_inverse_mass_matrix(temperatureRhs_.quantity(),
_temperatureResidual_,TEMPERATURE);
_temperatureResidual_ -= temperatureRoc_.quantity();
_temperatureResidual_ *= dt;
apply_gear_corrector(_temperatureResidual_,dt);
}
//--------------------------------------------------------
// post_final_integrate3
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::post_final_integrate3(double dt)
{
// update filtered atomic energy
timeFilter_->apply_post_step1(nodalAtomicEnergyFiltered_.set_quantity(),
nodalAtomicEnergy_->quantity(),dt);
}
//--------------------------------------------------------
// output
// add variables to output list
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::post_process()
{
nodalAtomicPowerOut_ = nodalAtomicPower_;
nodalAtomicTemperatureOut_ = nodalAtomicTemperature_->quantity();
}
//--------------------------------------------------------
// finish
// finalize state of nodal atomic quantities
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::finish()
{
post_process();
}
//--------------------------------------------------------
// apply_gear_predictor
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::apply_gear_predictor(double dt)
{
gear1_3_predict(temperature_.set_quantity(),
temperatureRoc_.set_quantity(),
temperature2Roc_.quantity(),dt);
}
//--------------------------------------------------------
// apply_gear_corrector
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::apply_gear_corrector(const DENS_MAT & R_theta, double dt)
{
gear1_3_correct(temperature_.set_quantity(),
temperatureRoc_.set_quantity(),
temperature2Roc_.set_quantity(),
R_theta,dt);
}
//--------------------------------------------------------
// compute_old_time_data
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::compute_old_time_data()
{
const DENS_MAT & myNodalAtomicEnergy(nodalAtomicEnergy_->quantity());
atc_->apply_inverse_mass_matrix(myNodalAtomicEnergy,
nodalAtomicTemperatureOld_.set_quantity(),
TEMPERATURE);
nodalAtomicEnergyOld_ = myNodalAtomicEnergy;
}
//--------------------------------------------------------
// compute_temperature_delta
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStep::compute_temperature_delta(const DENS_MAT & atomicEnergyDelta,
double dt)
{
DENS_MAT & myAtomicTemperatureDelta(atomicTemperatureDelta_.set_quantity());
myAtomicTemperatureDelta = nodalAtomicEnergyOld_.quantity() + atomicEnergyDelta;
atc_->apply_inverse_mass_matrix(myAtomicTemperatureDelta,
TEMPERATURE);
myAtomicTemperatureDelta += -1.*(nodalAtomicTemperatureOld_.quantity());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermalTimeIntegratorFracionalStepFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab data from ATC
//--------------------------------------------------------
ThermalTimeIntegratorFractionalStepFiltered::ThermalTimeIntegratorFractionalStepFiltered(ThermalTimeIntegrator * thermalTimeIntegrator) :
ThermalTimeIntegratorFractionalStep(thermalTimeIntegrator),
temperature3Roc_(atc_->field_3roc(TEMPERATURE))
{
// do nothing
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ThermalTimeIntegratorFractionalStepFiltered::~ThermalTimeIntegratorFractionalStepFiltered()
{
// do nothing
}
//--------------------------------------------------------
// pre_initial_integrate1
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStepFiltered::pre_initial_integrate1(double dt)
{
// determine change in temperature if no forces were applied over this timestep
// relevant coefficients from time filter
double coefF1 = timeFilter_->filtered_coefficient_pre_s1(dt);
double coefF2 = timeFilter_->filtered_coefficient_post_s1(dt);
double coefU1 = timeFilter_->unfiltered_coefficient_pre_s1(dt);
double coefU2 = timeFilter_->unfiltered_coefficient_post_s1(dt);
DENS_MAT & myAtomicTemperatureDelta(atomicTemperatureDelta_.set_quantity());
DENS_MAT & myNodalAtomicEnergyFiltered(nodalAtomicEnergyFiltered_.set_quantity());
const DENS_MAT & myNodalAtomicEnergy(nodalAtomicEnergy_->quantity());
// composite from change after two step update of current filtered energy
myAtomicTemperatureDelta = (coefF1*coefF2-1.)*myNodalAtomicEnergyFiltered;
// change in filtered temperature from current energy from this and next time levels
myAtomicTemperatureDelta += (coefU1*coefF2+coefU2)*myNodalAtomicEnergy;
// updated filtered energy using explicit-implicit scheme
// nodalAtomicEnergy_ is either set from initialization or from the end of the last timestep
timeFilter_->apply_pre_step1(myNodalAtomicEnergyFiltered,myNodalAtomicEnergy,dt);
}
//--------------------------------------------------------
// output
// add variables to output list
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStepFiltered::output(OUTPUT_LIST & outputData)
{
atc_->apply_inverse_md_mass_matrix(nodalAtomicEnergyFiltered_.quantity(),
nodalAtomicTemperatureOut_.set_quantity(),
TEMPERATURE);
DENS_MAT & nodalAtomicPower(nodalAtomicPowerFiltered_.set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData["NodalAtomicPower"] = &nodalAtomicPower;
}
}
//--------------------------------------------------------
// apply_gear_predictor
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStepFiltered::apply_gear_predictor(double dt)
{
gear1_4_predict(temperature_.set_quantity(),
temperatureRoc_.set_quantity(),
temperature2Roc_.set_quantity(),
temperature3Roc_.quantity(),dt);
}
//--------------------------------------------------------
// apply_gear_corrector
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStepFiltered::apply_gear_corrector(const DENS_MAT & R_theta, double dt)
{
gear1_4_correct(temperature_.set_quantity(),
temperatureRoc_.set_quantity(),
temperature2Roc_.set_quantity(),
temperature3Roc_.set_quantity(),
R_theta,dt);
}
//--------------------------------------------------------
// compute_temperature_delta
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStepFiltered::compute_old_time_data()
{
const DENS_MAT & myNodalAtomicEnergyFiltered(nodalAtomicEnergyFiltered_.quantity());
atc_->apply_inverse_mass_matrix(myNodalAtomicEnergyFiltered,
nodalAtomicTemperatureOld_.set_quantity(),
TEMPERATURE);
nodalAtomicEnergyOld_ = myNodalAtomicEnergyFiltered;
}
//--------------------------------------------------------
// compute_old_time_data
//--------------------------------------------------------
void ThermalTimeIntegratorFractionalStepFiltered::compute_temperature_delta(const DENS_MAT & atomicEnergyDelta,
double dt)
{
DENS_MAT & myAtomicTemperatureDelta(atomicTemperatureDelta_.set_quantity());
double coefU2 = timeFilter_->unfiltered_coefficient_post_s1(dt);
myAtomicTemperatureDelta += nodalAtomicEnergyOld_.quantity() + coefU2*atomicEnergyDelta;
atc_->apply_inverse_mass_matrix(myAtomicTemperatureDelta,
TEMPERATURE);
myAtomicTemperatureDelta += -1.*nodalAtomicTemperatureOld_.quantity();
}
};
diff --git a/lib/atc/ThermalTimeIntegrator.h b/lib/atc/ThermalTimeIntegrator.h
index 86d638be0..f0ce73b9b 100644
--- a/lib/atc/ThermalTimeIntegrator.h
+++ b/lib/atc/ThermalTimeIntegrator.h
@@ -1,349 +1,348 @@
#ifndef THERMAL_TIME_INTEGRATOR_H
#define THERMAL_TIME_INTEGRATOR_H
// ATC headers
#include "TimeIntegrator.h"
-using namespace std;
namespace ATC {
// forward declarations
class ThermalIntegrationMethod;
class AtfShapeFunctionRestriction;
/**
* @class ThermalTimeIntegrator
* @brief Class for various time integrators for thermal FE quantities
* (handles parsing and stores basic data structures)
*/
class ThermalTimeIntegrator : public TimeIntegrator {
public:
// constructor
ThermalTimeIntegrator(ATC_Coupling * atc,
TimeIntegrationType timeIntegrationType);
// destructor
virtual ~ThermalTimeIntegrator(){};
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** create objects to implement requested numerical method */
virtual void construct_methods();
/** pack persistent fields */
virtual void pack_fields(RESTART_LIST & data);
// Member data access
/** access for filtered atomic power */
DENS_MAN & nodal_atomic_power_filtered(){return nodalAtomicPowerFiltered_;};
/** access for filtered atomic energy */
// note: nodalAtomicEnergy_ should always be reset as it tracks the original energy + MD evolution
DENS_MAN & nodal_atomic_energy_filtered(){return nodalAtomicEnergyFiltered_;};
protected:
/** filtered atomic power */
DENS_MAN nodalAtomicPowerFiltered_;
/** filtered atomic energy due initial conditions and MD updates */
DENS_MAN nodalAtomicEnergyFiltered_;
private:
// DO NOT define this
ThermalTimeIntegrator();
};
/**
* @class ThermalIntegrationMethod
* @brief Class for various time integration methods for thermal FE quantities
*/
class ThermalIntegrationMethod : public TimeIntegrationMethod {
public:
// constructor
ThermalIntegrationMethod(ThermalTimeIntegrator * thermalTimeIntegrator);
// destructor
virtual ~ThermalIntegrationMethod() {};
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** checks to see if first RHS computation is needed */
virtual bool has_final_predictor() {return true;};
protected:
/** time filtering object */
TimeFilter * timeFilter_;
/** finite element temperature field */
DENS_MAN & temperature_;
/** finite element temperature Rate of change (Roc) */
DENS_MAN & temperatureRoc_;
/** finite element temperature 2nd time derivative */
DENS_MAN & temperature2Roc_;
/** atomic nodal temperature field for output */
DENS_MAN & nodalAtomicTemperatureOut_;
/** interscale operator for instantaneous temperature */
DENS_MAN * nodalAtomicTemperature_;
/** right-hand side of temperature equation */
DENS_MAN & temperatureRhs_;
/** finite element power from atomic quantities for output */
DENS_MAN & nodalAtomicPowerOut_;
/** workspace for gear integration */
DENS_MAT _temperatureResidual_;
private:
// DO NOT define this
ThermalIntegrationMethod();
};
/**
* @class ThermalTimeIntegratorGear
* @brief Class uses 3rd order Gear integration for time integration of FE temperature field
*/
class ThermalTimeIntegratorGear : public ThermalIntegrationMethod {
public:
// constructor
ThermalTimeIntegratorGear(ThermalTimeIntegrator * ThermalTimeIntegrator);
// destructor
virtual ~ThermalTimeIntegratorGear() {};
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** pre time integration initialization of data */
virtual void initialize();
// time step methods, corresponding to ATC_Transfer
/** second part of pre_initial_integrate */
virtual void pre_initial_integrate2(double dt);
/** first part of post_final_integrate */
virtual void post_final_integrate1(double dt);
/** parallel post-processing operations pre-output */
virtual void post_process();
/** finalize state of some unfiltered variables */
virtual void finish();
protected:
/** filtered atomic power */
DENS_MAN & nodalAtomicPowerFiltered_;
/** instantaneous atomic power */
AtfShapeFunctionRestriction * nodalAtomicPower_;
private:
// DO NOT define this
ThermalTimeIntegratorGear();
};
/**
* @class ThermalTimeIntegratorGearFiltered
* @brief Gear integration for FE thermal quantities with time filtering
*/
class ThermalTimeIntegratorGearFiltered : public ThermalTimeIntegratorGear {
public:
// constructor
ThermalTimeIntegratorGearFiltered(ThermalTimeIntegrator * thermalTimeIntegrator);
// destructor
virtual ~ThermalTimeIntegratorGearFiltered(){};
// time step methods, corresponding to ATC_Transfer
/** second part of pre_initial_integrate */
virtual void pre_initial_integrate2(double dt);
/** first part of post_final_integrate */
virtual void post_final_integrate1(double dt);
/** third part of post_final_integrate */
virtual void post_final_integrate3(double dt);
/** parallel post-processing operations pre-output */
virtual void post_process();
protected:
/** finite element temperature 3rd time derivative */
DENS_MAN & temperature3Roc_;
private:
// DO NOT define this
ThermalTimeIntegratorGearFiltered();
};
/**
* @class ThermalTimeIntegratorFractionalStep
* @brief Class for using 3rd order Gear integration to update FE contributions to temperature field
* (Uses same update for the atomic contributions to the finite
* elements as are used by the LAMMPS integration scheme
* for the atomic velocities and positions, i.e. Verlet.)
*/
class ThermalTimeIntegratorFractionalStep : public ThermalIntegrationMethod {
public:
// constructor
ThermalTimeIntegratorFractionalStep(ThermalTimeIntegrator * ThermalTimeIntegrator);
// destructor
virtual ~ThermalTimeIntegratorFractionalStep() {};
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** pre time integration initialization of data */
virtual void initialize();
// time step methods, corresponding to ATC_Transfer
/** first part of pre_initial_integrate */
virtual void pre_initial_integrate1(double dt);
/** second part of pre_initial_integrate */
virtual void pre_initial_integrate2(double dt);
/** first part of pre_final_integrate */
virtual void pre_final_integrate1(double dt);
/** first part of post_final_integrate */
virtual void post_final_integrate1(double dt);
/** third part of post_final_integrate */
virtual void post_final_integrate3(double dt);
/** checks to see if first RHS computation is needed */
virtual bool has_final_corrector() {return true;};
/** post-process data */
virtual void post_process();
/** finalize state of some unfiltered variables */
virtual void finish();
protected:
// methods
/** applies Gear predictor */
virtual void apply_gear_predictor(double dt);
/** applies Gear corrector */
virtual void apply_gear_corrector(const DENS_MAT & R_theta,
double dt);
/** compute old energy and temperature for use in time integrators */
virtual void compute_old_time_data();
/** computes temperature change associated with atomic energy change */
virtual void compute_temperature_delta(const DENS_MAT & atomicEnergyDelta,
double dt);
// data
/** filtered restricted atomic energy */
DENS_MAN & nodalAtomicEnergyFiltered_;
/** filtered atomic power, for post-processing only */
DENS_MAN & nodalAtomicPowerFiltered_;
/** change in FE temperature due to atomic motions */
DENS_MAN atomicTemperatureDelta_;
/** fractional step auxilliary storage for restricted atomic energy */
DENS_MAN * nodalAtomicEnergy_;
/** power associated with thermostat for post-processing */
DENS_MAT nodalAtomicPower_;
/** restricted atomic energy from previous time step */
DENS_MAN nodalAtomicEnergyOld_;
/** FE atomic temperature contribution from previous time step */
DENS_MAN nodalAtomicTemperatureOld_;
private:
// DO NOT define this
ThermalTimeIntegratorFractionalStep();
};
/**
* @class ThermalTimeIntegratorFractionalStepFiltered
* @brief Class for using filtered results from a 3rd order Gear integration to update FE contributions to temperature field
*/
class ThermalTimeIntegratorFractionalStepFiltered : public ThermalTimeIntegratorFractionalStep {
public:
// constructor
ThermalTimeIntegratorFractionalStepFiltered(ThermalTimeIntegrator * ThermalTimeIntegrator);
// destructor
virtual ~ThermalTimeIntegratorFractionalStepFiltered();
// time step methods, corresponding to ATC_Transfer
/** first part of pre_initial_integrate */
virtual void pre_initial_integrate1(double dt);
/** add output data */
virtual void output(OUTPUT_LIST & outputData);
/** finalize state of some unfiltered variables */
virtual void finish(){};
protected:
// methods
/** applies Gear predictor */
virtual void apply_gear_predictor(double dt);
/** applies Gear corrector */
virtual void apply_gear_corrector(const DENS_MAT & R_theta,
double dt);
/** compute old energy and temperature for use in time integrators */
virtual void compute_old_time_data();
/** computes temperature change associated with atomic energy change */
virtual void compute_temperature_delta(const DENS_MAT & atomicEnergyDelta,
double dt);
// data
/** nodal temperature 3rd time derivative */
DENS_MAN & temperature3Roc_;
private:
// DO NOT define this
ThermalTimeIntegratorFractionalStepFiltered();
};
};
#endif
diff --git a/lib/atc/Thermostat.cpp b/lib/atc/Thermostat.cpp
index 1cba968ad..110d633ac 100644
--- a/lib/atc/Thermostat.cpp
+++ b/lib/atc/Thermostat.cpp
@@ -1,2380 +1,2381 @@
#include "Thermostat.h"
#include "ATC_Coupling.h"
#include "ATC_Error.h"
#include "PrescribedDataManager.h"
#include "ThermalTimeIntegrator.h"
#include "TransferOperator.h"
using namespace std;
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class Thermostat
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
Thermostat::Thermostat(ATC_Coupling * atc,
const string & regulatorPrefix) :
AtomicRegulator(atc,regulatorPrefix),
lambdaMaxIterations_(myLambdaMaxIterations)
{
// nothing to do
}
//--------------------------------------------------------
// modify:
// parses and adjusts thermostat state based on
// user input, in the style of LAMMPS user input
//--------------------------------------------------------
bool Thermostat::modify(int narg, char **arg)
{
bool foundMatch = false;
int argIndex = 0;
if (strcmp(arg[argIndex],"thermal")==0) {
argIndex++;
// thermostat type
- /*! \page man_control_thermal fix_modify AtC control thermal
+ /*! \page man_control_thermal fix_modify AtC control thermal
\section syntax
- fix_modify AtC control thermal <control_type> <optional args>\n
+ fix_modify AtC control thermal <control_type> <optional_args>
- control_type (string) = none | rescale | hoover | flux\n
- fix_modify AtC control thermal rescale <frequency>\n
+ fix_modify AtC control thermal rescale <frequency> \n
- frequency (int) = time step frequency for applying velocity rescaling \n
fix_modify AtC control thermal hoover \n
- fix_modify AtC control thermal flux <boundary_integration_type> <face_set_id(optional)>\n
+ fix_modify AtC control thermal flux <boundary_integration_type(optional)> <face_set_id(optional)>\n
- boundary_integration_type (string) = faceset | interpolate\n
- face_set_id (string), optional = id of boundary face set, if not specified
(or not possible when the atomic domain does not line up with
mesh boundaries) defaults to an atomic-quadrature approximate
evaulation, does not work with interpolate\n
\section examples
<TT> fix_modify AtC control thermal none </TT> \n
<TT> fix_modify AtC control thermal rescale 10 </TT> \n
<TT> fix_modify AtC control thermal hoover </TT> \n
- <TT> fix_modify AtC control thermal flux bndy_faces </TT> \n
+ <TT> fix_modify AtC control thermal flux </TT> \n
+ <TT> fix_modify AtC control thermal flux faceset bndy_faces </TT> \n
\section description
Sets the energy exchange mechansim from the finite elements to the atoms, managed through a control algorithm. Rescale computes a scale factor for each atom to match the finite element temperature. Hoover is a Gaussian least-constraint isokinetic thermostat enforces that the nodal restricted atomic temperature matches the finite element temperature. Flux is a similar mode, but rather adds energy to the atoms based on conservation of energy. Hoover and flux allows the prescription of sources or fixed temperatures on the atoms.
\section restrictions
only for be used with specific transfers :
thermal (rescale, hoover, flux), two_temperature (flux) \n
rescale not valid with time filtering activated
\section related
\section default
none\n
rescale frequency is 1\n
flux boundary_integration_type is interpolate
*/
if (strcmp(arg[argIndex],"none")==0) { // restore defaults
regulatorTarget_ = NONE;
couplingMode_ = UNCOUPLED;
howOften_ = 1;
boundaryIntegrationType_ = NO_QUADRATURE;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"rescale")==0) {
argIndex++;
howOften_ = atoi(arg[argIndex]);
if (howOften_ < 1) {
throw ATC_Error("Bad rescaling thermostat frequency");
}
else {
regulatorTarget_ = FIELD;
couplingMode_ = UNCOUPLED;
boundaryIntegrationType_ = NO_QUADRATURE;
foundMatch = true;
}
}
else if (strcmp(arg[argIndex],"hoover")==0) {
regulatorTarget_ = DYNAMICS;
couplingMode_ = FIXED;
howOften_ = 1;
boundaryIntegrationType_ = NO_QUADRATURE;
foundMatch = true;
}
else if (strcmp(arg[argIndex],"flux")==0) {
regulatorTarget_ = DYNAMICS;
couplingMode_ = FLUX;
howOften_ = 1;
argIndex++;
boundaryIntegrationType_ = atc_->parse_boundary_integration(narg-argIndex,&arg[argIndex],boundaryFaceSet_);
foundMatch = true;
}
// set parameters for numerical matrix solutions unique to this thermostat
/*! \page man_control_thermal_correction_max_iterations fix_modify AtC control thermal correction_max_iterations
\section syntax
- fix_modify AtC control thermal correction_max_iterations <value>\n
+ fix_modify AtC control thermal correction_max_iterations <max_iterations>
- max_iterations (int) = maximum number of iterations that will be used by iterative matrix solvers\n
\section examples
<TT> fix_modify AtC control thermal correction_max_iterations 10 </TT> \n
\section description
Sets the maximum number of iterations to compute the 2nd order in time correction term for lambda with the fractional step method. The method uses the same tolerance as the controller's matrix solver.
\section restrictions
only for use with thermal physics using the fractional step method.
\section related
\section default
correction_max_iterations is 20
*/
else if (strcmp(arg[argIndex],"correction_max_iterations")==0) {
argIndex++;
lambdaMaxIterations_ = atoi(arg[argIndex]);
if (lambdaMaxIterations_ < 1) {
throw ATC_Error("Bad correction maximum iteration count");
}
foundMatch = true;
}
}
if (!foundMatch)
foundMatch = AtomicRegulator::modify(narg,arg);
if (foundMatch)
needReset_ = true;
return foundMatch;
}
//--------------------------------------------------------
// reset_lambda_contribution:
// resets the thermostat generated power to a
// prescribed value
//--------------------------------------------------------
void Thermostat::reset_lambda_contribution(const DENS_MAT & target)
{
DENS_MAN * lambdaPowerFiltered = regulator_data("LambdaPowerFiltered",1);
*lambdaPowerFiltered = target;
}
//--------------------------------------------------------
// construct_methods:
// instantiations desired regulator method(s)
// dependence, but in general there is also a
// time integrator dependence. In general the
// precedence order is:
// time filter -> time integrator -> thermostat
// In the future this may need to be added if
// different types of time integrators can be
// specified.
//--------------------------------------------------------
void Thermostat::construct_methods()
{
// get data associated with stages 1 & 2 of ATC_Method::initialize
AtomicRegulator::construct_methods();
if (atc_->reset_methods()) {
// eliminate existing methods
delete_method();
// update time filter
TimeIntegrator::TimeIntegrationType myIntegrationType = (atc_->time_integrator(TEMPERATURE))->time_integration_type();
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (timeFilterManager->need_reset() ) {
if (myIntegrationType == TimeIntegrator::GEAR)
timeFilter_ = timeFilterManager->construct(TimeFilterManager::EXPLICIT);
else if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP)
timeFilter_ = timeFilterManager->construct(TimeFilterManager::EXPLICIT_IMPLICIT);
}
if (timeFilterManager->filter_dynamics()) {
switch (regulatorTarget_) {
case NONE: {
regulatorMethod_ = new RegulatorMethod(this);
break;
}
case FIELD: { // error check, rescale and filtering not supported together
throw ATC_Error("Cannot use rescaling thermostat with time filtering");
break;
}
case DYNAMICS: {
switch (couplingMode_) {
case FIXED: {
if (use_lumped_lambda_solve()) {
throw ATC_Error("Thermostat:construct_methods - lumped lambda solve cannot be used with Hoover thermostats");
}
if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP) {
if (md_flux_nodes(TEMPERATURE)) {
if (!md_fixed_nodes(TEMPERATURE) && (boundaryIntegrationType_ == NO_QUADRATURE)) {
// there are fluxes but no fixed or coupled nodes
regulatorMethod_ = new ThermostatFluxFiltered(this);
}
else {
// there are both fixed and flux nodes
regulatorMethod_ = new ThermostatFluxFixedFiltered(this);
}
}
else {
// there are only fixed nodes
regulatorMethod_ = new ThermostatFixedFiltered(this);
}
}
else {
regulatorMethod_ = new ThermostatHooverVerletFiltered(this);
}
break;
}
case FLUX: {
if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP) {
if (use_lumped_lambda_solve()) {
throw ATC_Error("Thermostat:construct_methods - lumped lambda solve has been depricated for fractional step thermostats");
}
if (md_fixed_nodes(TEMPERATURE)) {
if (!md_flux_nodes(TEMPERATURE) && (boundaryIntegrationType_ == NO_QUADRATURE)) {
// there are fixed nodes but no fluxes
regulatorMethod_ = new ThermostatFixedFiltered(this);
}
else {
// there are both fixed and flux nodes
regulatorMethod_ = new ThermostatFluxFixedFiltered(this);
}
}
else {
// there are only flux nodes
regulatorMethod_ = new ThermostatFluxFiltered(this);
}
}
else {
if (use_localized_lambda()) {
if (!((atc_->prescribed_data_manager())->no_fluxes(TEMPERATURE)) &&
atc_->boundary_integration_type() != NO_QUADRATURE) {
throw ATC_Error("Cannot use flux coupling with localized lambda");
}
}
regulatorMethod_ = new ThermostatPowerVerletFiltered(this);
}
break;
}
default:
throw ATC_Error("Unknown coupling mode in Thermostat::initialize");
}
break;
}
default:
throw ATC_Error("Unknown thermostat type in Thermostat::initialize");
}
}
else {
switch (regulatorTarget_) {
case NONE: {
regulatorMethod_ = new RegulatorMethod(this);
break;
}
case FIELD: {
if (atc_->temperature_def()==KINETIC)
regulatorMethod_ = new ThermostatRescale(this);
else if (atc_->temperature_def()==TOTAL)
regulatorMethod_ = new ThermostatRescaleMixedKePe(this);
else
throw ATC_Error("Unknown temperature definition");
break;
}
case DYNAMICS: {
switch (couplingMode_) {
case FIXED: {
if (use_lumped_lambda_solve()) {
throw ATC_Error("Thermostat:construct_methods - lumped lambda solve cannot be used with Hoover thermostats");
}
if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP) {
if (md_flux_nodes(TEMPERATURE)) {
if (!md_fixed_nodes(TEMPERATURE) && (boundaryIntegrationType_ == NO_QUADRATURE)) {
// there are fluxes but no fixed or coupled nodes
regulatorMethod_ = new ThermostatFlux(this);
}
else {
// there are both fixed and flux nodes
regulatorMethod_ = new ThermostatFluxFixed(this);
}
}
else {
// there are only fixed nodes
regulatorMethod_ = new ThermostatFixed(this);
}
}
else {
regulatorMethod_ = new ThermostatHooverVerlet(this);
}
break;
}
case FLUX: {
if (myIntegrationType == TimeIntegrator::FRACTIONAL_STEP) {
if (use_lumped_lambda_solve()) {
throw ATC_Error("Thermostat:construct_methods - lumped lambda solve has been depricated for fractional step thermostats");
}
if (md_fixed_nodes(TEMPERATURE)) {
if (!md_flux_nodes(TEMPERATURE) && (boundaryIntegrationType_ == NO_QUADRATURE)) {
// there are fixed nodes but no fluxes
regulatorMethod_ = new ThermostatFixed(this);
}
else {
// there are both fixed and flux nodes
regulatorMethod_ = new ThermostatFluxFixed(this);
}
}
else {
// there are only flux nodes
regulatorMethod_ = new ThermostatFlux(this);
}
}
else {
if (use_localized_lambda()) {
if (!((atc_->prescribed_data_manager())->no_fluxes(TEMPERATURE)) &&
atc_->boundary_integration_type() != NO_QUADRATURE) {
throw ATC_Error("Cannot use flux coupling with localized lambda");
}
}
regulatorMethod_ = new ThermostatPowerVerlet(this);
}
break;
}
default:
throw ATC_Error("Unknown coupling mode in Thermostat::initialize");
}
break;
}
default:
throw ATC_Error("Unknown thermostat target in Thermostat::initialize");
}
}
AtomicRegulator::reset_method();
}
else {
set_all_data_to_used();
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatShapeFunction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ThermostatShapeFunction::ThermostatShapeFunction(Thermostat * thermostat,
const string & regulatorPrefix) :
RegulatorShapeFunction(thermostat,regulatorPrefix),
thermostat_(thermostat),
mdMassMatrix_(atc_->set_mass_mat_md(TEMPERATURE)),
atomVelocities_(NULL)
{
fieldMask_(TEMPERATURE,FLUX) = true;
lambda_ = thermostat_->regulator_data(regulatorPrefix_+"LambdaEnergy",1); // data associated with stage 3 in ATC_Method::initialize
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatShapeFunction::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
RegulatorShapeFunction::construct_transfers();
// get atom velocity data from manager
atomVelocities_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY);
// construct lambda evaluated at atom locations
atomLambdas_ = new FtaShapeFunctionProlongation(atc_,
lambda_,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_per_atom_quantity(atomLambdas_,regulatorPrefix_+"AtomLambdaEnergy");
}
//---------------------------------------------------------
// set_weights:
// set the diagonal weighting matrix to be the atomic
// temperatures
//---------------------------------------------------------
void ThermostatShapeFunction::set_weights()
{
if (this->use_local_shape_functions()) {
VelocitySquaredMapped * myWeights = new VelocitySquaredMapped(atc_,lambdaAtomMap_);
weights_ = myWeights;
(atc_->interscale_manager()).add_per_atom_quantity(myWeights,
regulatorPrefix_+"AtomVelocitySquaredMapped");
}
else {
VelocitySquared * myWeights = new VelocitySquared(atc_);
weights_ = myWeights;
(atc_->interscale_manager()).add_per_atom_quantity(myWeights,
regulatorPrefix_+"AtomVelocitySquared");
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatRescale
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ThermostatRescale::ThermostatRescale(Thermostat * thermostat) :
ThermostatShapeFunction(thermostat),
nodalTemperature_(atc_->field(TEMPERATURE)),
atomVelocityRescalings_(NULL)
{
// do nothing
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatRescale::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// set up node mappings
create_node_maps();
// set up data for linear solver
shapeFunctionMatrix_ = new LambdaCouplingMatrix(atc_,nodeToOverlapMap_);
(atc_->interscale_manager()).add_per_atom_sparse_matrix(shapeFunctionMatrix_,
regulatorPrefix_+"LambdaCouplingMatrixEnergy");
linearSolverType_ = AtomicRegulator::CG_SOLVE;
// base class transfers
ThermostatShapeFunction::construct_transfers();
// velocity rescaling factor
atomVelocityRescalings_ = new AtomicVelocityRescaleFactor(atc_,atomLambdas_);
interscaleManager.add_per_atom_quantity(atomVelocityRescalings_,
regulatorPrefix_+"AtomVelocityRescaling");
}
//--------------------------------------------------------
// apply_post_corrector:
// apply the thermostat in the post corrector phase
//--------------------------------------------------------
void ThermostatRescale::apply_post_corrector(double dt)
{
// compute right-hand side
_rhs_ = mdMassMatrix_.quantity()*nodalTemperature_.quantity();
correct_rhs(_rhs_); // correct right-hand side for complex temperature definitions, e.g., when the potential energy is included
// solve equations
solve_for_lambda(_rhs_,lambda_->set_quantity());
// application of rescaling lambda due
apply_to_atoms(atomVelocities_);
}
//--------------------------------------------------------
// apply_lambda_to_atoms:
// applies the velocity rescale with an existing lambda
// note oldAtomicQuantity and dt are not used
//--------------------------------------------------------
void ThermostatRescale::apply_to_atoms(PerAtomQuantity<double> * atomVelocities)
{
*atomVelocities *= atomVelocityRescalings_->quantity();
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void ThermostatRescale::output(OUTPUT_LIST & outputData)
{
DENS_MAT & lambda(lambda_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData["Lambda"] = &lambda;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatRescaleMixedKePe
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ThermostatRescaleMixedKePe::ThermostatRescaleMixedKePe(Thermostat * thermostat) :
ThermostatRescale(thermostat),
nodalAtomicFluctuatingPotentialEnergy_(NULL)
{
// do nothing
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatRescaleMixedKePe::construct_transfers()
{
ThermostatRescale::construct_transfers();
InterscaleManager & interscaleManager(atc_->interscale_manager());
// get fluctuating PE at nodes
nodalAtomicFluctuatingPotentialEnergy_ =
interscaleManager.dense_matrix("NodalAtomicFluctuatingPotentialEnergy");
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void ThermostatRescaleMixedKePe::initialize()
{
ThermostatRescale::initialize();
InterscaleManager & interscaleManager(atc_->interscale_manager());
// multipliers for KE and PE
AtomicEnergyForTemperature * atomEnergyForTemperature =
static_cast<AtomicEnergyForTemperature * >(interscaleManager.per_atom_quantity("AtomicEnergyForTemperature"));
keMultiplier_ = atomEnergyForTemperature->kinetic_energy_multiplier();
peMultiplier_ = 2. - keMultiplier_;
keMultiplier_ /= 2.; // account for use of 2 X KE in matrix equation
}
//--------------------------------------------------------
// correct_rhs:
// accounts for potential energy contribution to
// definition of atomic temperature
//--------------------------------------------------------
void ThermostatRescaleMixedKePe::correct_rhs(DENS_MAT & rhs)
{
rhs -= peMultiplier_*(nodalAtomicFluctuatingPotentialEnergy_->quantity());
rhs /= keMultiplier_;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatGlcFs
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ThermostatGlcFs::ThermostatGlcFs(Thermostat * thermostat,
const string & regulatorPrefix) :
ThermostatShapeFunction(thermostat,regulatorPrefix),
temperature_(atc_->field(TEMPERATURE)),
timeFilter_(atomicRegulator_->time_filter()),
nodalAtomicLambdaPower_(NULL),
lambdaPowerFiltered_(NULL),
atomThermostatForces_(NULL),
atomMasses_(NULL),
rhsLambdaSquared_(NULL),
isFirstTimestep_(true),
lambdaMaxIterations_(thermostat->lambda_max_iterations()),
nodalAtomicEnergy_(NULL),
atomPredictedVelocities_(NULL),
nodalAtomicPredictedEnergy_(NULL),
firstHalfAtomForces_(NULL),
dtFactor_(0.)
{
// construct/obtain data corresponding to stage 3 of ATC_Method::initialize
nodalAtomicLambdaPower_ = thermostat->regulator_data(regulatorPrefix_+"NodalAtomicLambdaPower",1);
lambdaPowerFiltered_ = thermostat_->regulator_data(regulatorPrefix_+"LambdaPowerFiltered",1);
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatGlcFs::construct_transfers()
{
ThermostatShapeFunction::construct_transfers();
InterscaleManager & interscaleManager(atc_->interscale_manager());
// get data from manager
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS),
nodalAtomicEnergy_ = interscaleManager.dense_matrix("NodalAtomicEnergy");
// thermostat forces based on lambda and the atomic velocities
atomThermostatForces_ = new AtomicThermostatForce(atc_,atomLambdas_);
interscaleManager.add_per_atom_quantity(atomThermostatForces_,
regulatorPrefix_+"AtomThermostatForce");
// predicted temperature quantities: atom velocities, atom energies, and restricted atom energies
AtcAtomQuantity<double> * atomPredictedVelocities = new AtcAtomQuantity<double>(atc_,nsd_);
interscaleManager.add_per_atom_quantity(atomPredictedVelocities,
regulatorPrefix_+"AtomicPredictedVelocities");
atomPredictedVelocities_ = atomPredictedVelocities;
AtomicEnergyForTemperature * atomPredictedEnergyForTemperature = new TwiceKineticEnergy(atc_,
atomPredictedVelocities);
interscaleManager.add_per_atom_quantity(atomPredictedEnergyForTemperature,
regulatorPrefix_+"AtomicPredictedTwiceKineticEnergy");
nodalAtomicPredictedEnergy_ = new AtfShapeFunctionRestriction(atc_,
atomPredictedEnergyForTemperature,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_dense_matrix(nodalAtomicPredictedEnergy_,
regulatorPrefix_+"NodalAtomicPredictedEnergy");
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void ThermostatGlcFs::initialize()
{
ThermostatShapeFunction::initialize();
// reset data to zero
deltaEnergy1_.reset(nNodes_,1);
deltaEnergy2_.reset(nNodes_,1);
_lambdaPowerOutput_.reset(nNodes_,1);
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (!timeFilterManager->end_equilibrate()) {
// we should reset lambda and lambdaForce to zero in this case
// implies an initial condition of 0 for the filtered nodal lambda power
// initial conditions will always be needed when using time filtering
// however, the fractional step scheme must assume the instantaneous
// nodal lambda power is 0 initially because all quantities are in delta form
*lambda_ = 0.; // ensures initial lambda force is zero
*nodalAtomicLambdaPower_ = 0.; // energy change due to thermostats
*lambdaPowerFiltered_ = 0.; // filtered energy change due to thermostats
}
else {
// we can grab lambda power variables using time integrator and atc transfer in cases for equilibration
}
// sets up time filter for cases where variables temporally filtered
if (timeFilterManager->need_reset()) {
// the form of this integrator implies no time filters that require history data can be used
timeFilter_->initialize(nodalAtomicLambdaPower_->quantity());
}
atomThermostatForces_->quantity(); // initialize
atomThermostatForces_->fix_quantity();
firstHalfAtomForces_ = atomThermostatForces_; // initialize
compute_rhs_map();
}
//--------------------------------------------------------
// compute_rhs_map
// creates mapping from all nodes to those to which
// the thermostat applies
//--------------------------------------------------------
void ThermostatGlcFs::compute_rhs_map()
{
rhsMap_.resize(overlapToNodeMap_->nRows(),1);
DENS_MAT rhsMapGlobal(nNodes_,1);
const set<int> & applicationNodes(applicationNodes_->quantity());
for (int i = 0; i < nNodes_; i++) {
if (applicationNodes.find(i) != applicationNodes.end()) {
rhsMapGlobal(i,0) = 1.;
}
else {
rhsMapGlobal(i,0) = 0.;
}
}
map_unique_to_overlap(rhsMapGlobal,rhsMap_);
}
//--------------------------------------------------------
// apply_to_atoms:
// determines what if any contributions to the
// atomic moition is needed for
// consistency with the thermostat
// and computes the instantaneous induced power
//--------------------------------------------------------
void ThermostatGlcFs::apply_to_atoms(PerAtomQuantity<double> * atomicVelocity,
const DENS_MAN * nodalAtomicEnergy,
const DENS_MAT & lambdaForce,
DENS_MAT & nodalAtomicLambdaPower,
double dt)
{
// compute initial contributions to lambda power
nodalAtomicLambdaPower = nodalAtomicEnergy->quantity();
nodalAtomicLambdaPower *= -1.;
// apply lambda force to atoms
_velocityDelta_ = lambdaForce;
_velocityDelta_ /= atomMasses_->quantity();
_velocityDelta_ *= dt;
(*atomicVelocity) += _velocityDelta_;
// finalize lambda power
nodalAtomicLambdaPower += nodalAtomicEnergy->quantity();
}
//--------------------------------------------------------
// full_prediction:
// flag to perform a full prediction calcalation
// for lambda rather than using the old value
//--------------------------------------------------------
bool ThermostatGlcFs::full_prediction()
{
if (isFirstTimestep_ || ((atc_->atom_to_element_map_type() == EULERIAN)
&& (atc_->atom_to_element_map_frequency() > 1)
&& (atc_->step() % atc_->atom_to_element_map_frequency() == 0 ))) {
return true;
}
return false;
}
//--------------------------------------------------------
// apply_predictor:
// apply the thermostat to the atoms in the first step
// of the Verlet algorithm
//--------------------------------------------------------
void ThermostatGlcFs::apply_pre_predictor(double dt)
{
DENS_MAT & myLambdaPowerFiltered(lambdaPowerFiltered_->set_quantity());
DENS_MAT & myNodalAtomicLambdaPower(nodalAtomicLambdaPower_->set_quantity());
// update filtered power
timeFilter_->apply_pre_step1(myLambdaPowerFiltered,myNodalAtomicLambdaPower,dt); // equivalent update to measure power as change in energy due to thermostat
// apply lambda force to atoms and compute instantaneous lambda power for first half of time step
this->apply_to_atoms(atomVelocities_,nodalAtomicEnergy_,
firstHalfAtomForces_->quantity(),
myNodalAtomicLambdaPower,0.5*dt);
// update nodal variables for first half of time step
this->add_to_energy(myNodalAtomicLambdaPower,deltaEnergy1_,0.5*dt);
// start update of filtered lambda power
myNodalAtomicLambdaPower = 0.; // temporary power for first part of update
timeFilter_->apply_post_step1(myLambdaPowerFiltered,myNodalAtomicLambdaPower,dt);
}
//--------------------------------------------------------
// apply_pre_corrector:
// apply the thermostat to the atoms in the first part
// of the corrector step of the Verlet algorithm
//--------------------------------------------------------
void ThermostatGlcFs::apply_pre_corrector(double dt)
{
(*atomPredictedVelocities_) = atomVelocities_->quantity();
// do full prediction if we just redid the shape functions
if (full_prediction()) {
this->compute_lambda(dt);
atomThermostatForces_->unfix_quantity(); // allow update of atomic force applied by lambda
}
// apply lambda force to atoms and compute instantaneous lambda power to predict second half of time step
DENS_MAT & myNodalAtomicLambdaPower(nodalAtomicLambdaPower_->set_quantity());
apply_to_atoms(atomPredictedVelocities_,
nodalAtomicPredictedEnergy_,
firstHalfAtomForces_->quantity(),
myNodalAtomicLambdaPower,0.5*dt);
if (full_prediction())
atomThermostatForces_->fix_quantity();
// update predicted nodal variables for second half of time step
this->add_to_energy(myNodalAtomicLambdaPower,deltaEnergy2_,0.5*dt);
deltaEnergy1_ += deltaEnergy2_;
atc_->apply_inverse_mass_matrix(deltaEnergy1_,TEMPERATURE);
temperature_ += deltaEnergy1_;
}
//--------------------------------------------------------
// apply_post_corrector:
// apply the thermostat to the atoms in the second part
// of the corrector step of the Verlet algorithm
//--------------------------------------------------------
void ThermostatGlcFs::apply_post_corrector(double dt)
{
// remove predicted power effects
DENS_MAT & myTemperature(temperature_.set_quantity());
atc_->apply_inverse_mass_matrix(deltaEnergy2_,TEMPERATURE);
myTemperature -= deltaEnergy2_;
// set up equation and update lambda
this->compute_lambda(dt);
// apply lambda force to atoms and compute instantaneous lambda power for second half of time step
DENS_MAT & myNodalAtomicLambdaPower(nodalAtomicLambdaPower_->set_quantity());
atomThermostatForces_->unfix_quantity(); // allow computation of force applied by lambda
apply_to_atoms(atomVelocities_,nodalAtomicEnergy_,
atomThermostatForces_->quantity(),
myNodalAtomicLambdaPower,0.5*dt);
atomThermostatForces_->fix_quantity();
// finalize filtered lambda power by adding latest contribution
timeFilter_->apply_post_step2(lambdaPowerFiltered_->set_quantity(),
myNodalAtomicLambdaPower,dt);
// update nodal variables for second half of time step
this->add_to_energy(myNodalAtomicLambdaPower,deltaEnergy2_,0.5*dt);
atc_->apply_inverse_mass_matrix(deltaEnergy2_,TEMPERATURE);
myTemperature += deltaEnergy2_;
isFirstTimestep_ = false;
}
//--------------------------------------------------------
// compute_lambda:
// sets up and solves linear system for lambda, if the
// bool is true it iterators to a non-linear solution
//--------------------------------------------------------
void ThermostatGlcFs::compute_lambda(double dt,
bool iterateSolution)
{
// set up rhs for lambda equation
rhs_.resize(nNodes_,1);
this->set_thermostat_rhs(rhs_,0.5*dt);
// solve linear system for lambda guess
DENS_MAT & myLambda(lambda_->set_quantity());
solve_for_lambda(rhs_,myLambda);
// iterate to solution
if (iterateSolution) {
iterate_lambda(rhs_);
}
}
//--------------------------------------------------------
// iterate_lambda:
// iteratively solves the equations for lambda
// for the higher order dt corrections, assuming
// an initial guess for lambda
//--------------------------------------------------------
void ThermostatGlcFs::iterate_lambda(const MATRIX & rhs)
{
int nNodeOverlap = overlapToNodeMap_->nRows();
DENS_VEC _lambdaOverlap_(nNodeOverlap);
DENS_MAT & lambda(lambda_->set_quantity());
map_unique_to_overlap(lambda,_lambdaOverlap_);
double factor = 0.5*dtFactor_*atc_->dt();
_lambdaOld_.resize(nNodes_,1);
_rhsOverlap_.resize(nNodeOverlap,1);
map_unique_to_overlap(rhs,_rhsOverlap_);
_rhsTotal_.resize(nNodeOverlap);
// solve assuming we get initial guess for lambda
double error(-1.);
for (int i = 0; i < lambdaMaxIterations_; ++i) {
_lambdaOld_ = lambda;
// solve the system with the new rhs
const DENS_MAT & rhsLambdaSquared(rhsLambdaSquared_->quantity());
for (int i = 0; i < nNodeOverlap; i++) {
if (rhsMap_(i,0) == 1.) {
_rhsTotal_(i) = _rhsOverlap_(i,0) + factor*rhsLambdaSquared(i,0);
}
else {
_rhsTotal_(i) = 0.;
}
}
matrixSolver_->execute(_rhsTotal_,_lambdaOverlap_);
// check convergence
map_overlap_to_unique(_lambdaOverlap_,lambda);
lambda_->force_reset();
DENS_MAT difference = lambda-_lambdaOld_;
error = difference.col_norm()/_lambdaOld_.col_norm();
if (error < tolerance_)
break;
}
if (error >= tolerance_) {
stringstream message;
message << " Iterative solve for lambda failed to converge after " << lambdaMaxIterations_ << " iterations, final tolerance was " << error << "\n";
ATC::LammpsInterface::instance()->print_msg(message.str());
}
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void ThermostatGlcFs::output(OUTPUT_LIST & outputData)
{
_lambdaPowerOutput_ = nodalAtomicLambdaPower_->quantity();
// approximate value for lambda power
double dt = LammpsInterface::instance()->dt();
_lambdaPowerOutput_ *= (2./dt);
DENS_MAT & lambda(lambda_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData[regulatorPrefix_+"Lambda"] = &lambda;
outputData[regulatorPrefix_+"NodalLambdaPower"] = &(_lambdaPowerOutput_);
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatFlux
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and thermostat data
//--------------------------------------------------------
ThermostatFlux::ThermostatFlux(Thermostat * thermostat,
const string & regulatorPrefix) :
ThermostatGlcFs(thermostat,regulatorPrefix),
heatSource_(atc_->atomic_source(TEMPERATURE))
{
// do nothing
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatFlux::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// set up node mappings
create_node_maps();
// set up data for linear solver
shapeFunctionMatrix_ = new LambdaCouplingMatrix(atc_,nodeToOverlapMap_);
interscaleManager.add_per_atom_sparse_matrix(shapeFunctionMatrix_,
regulatorPrefix_+"LambdaCouplingMatrixEnergy");
if (elementMask_) {
lambdaAtomMap_ = new AtomToElementset(atc_,elementMask_);
interscaleManager.add_per_atom_int_quantity(lambdaAtomMap_,
regulatorPrefix_+"LambdaAtomMap");
}
if (atomicRegulator_->use_localized_lambda()) {
linearSolverType_ = AtomicRegulator::RSL_SOLVE;
}
else {
linearSolverType_ = AtomicRegulator::CG_SOLVE;
}
// base class transfers
ThermostatGlcFs::construct_transfers();
// add transfers for computation of extra RHS term accounting of O(lambda^2)
// lambda squared followed by fractional step RHS contribution
PerAtomQuantity<double> * lambdaAtom(interscaleManager.per_atom_quantity(regulatorPrefix_+"AtomLambdaEnergy"));
LambdaSquared * lambdaSquared = new LambdaSquared(atc_,
atomMasses_,
weights_,
lambdaAtom);
interscaleManager.add_per_atom_quantity(lambdaSquared,
regulatorPrefix_+"LambdaSquaredMapped");
rhsLambdaSquared_ = new AtfShapeFunctionRestriction(atc_,lambdaSquared,shapeFunctionMatrix_);
interscaleManager.add_dense_matrix(rhsLambdaSquared_,
regulatorPrefix_+"RhsLambdaSquared");
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void ThermostatFlux::initialize()
{
ThermostatGlcFs::initialize();
// timestep factor
dtFactor_ = 1.;
}
//--------------------------------------------------------
// construct_regulated_nodes:
// constructs the set of nodes being regulated
//--------------------------------------------------------
void ThermostatFlux::construct_regulated_nodes()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// matrix requires all entries even if localized for correct lumping
regulatedNodes_ = new RegulatedNodes(atc_);
interscaleManager.add_set_int(regulatedNodes_,
regulatorPrefix_+"ThermostatRegulatedNodes");
// if localized monitor nodes with applied fluxes
if (atomicRegulator_->use_localized_lambda()) {
if ((atomicRegulator_->coupling_mode() == Thermostat::FLUX) && (atomicRegulator_->boundary_integration_type() != NO_QUADRATURE)) {
// include boundary nodes
applicationNodes_ = new FluxBoundaryNodes(atc_);
boundaryNodes_ = new BoundaryNodes(atc_);
interscaleManager.add_set_int(boundaryNodes_,
regulatorPrefix_+"ThermostatBoundaryNodes");
}
else {
// fluxed nodes only
applicationNodes_ = new FluxNodes(atc_);
}
interscaleManager.add_set_int(applicationNodes_,
regulatorPrefix_+"ThermostatApplicationNodes");
}
else {
applicationNodes_ = regulatedNodes_;
}
// special set of boundary elements for boundary flux quadrature
if ((atomicRegulator_->boundary_integration_type() == FE_INTERPOLATION)
&& (atomicRegulator_->use_localized_lambda())) {
elementMask_ = new ElementMaskNodeSet(atc_,applicationNodes_);
interscaleManager.add_dense_matrix_bool(elementMask_,
regulatorPrefix_+"BoundaryElementMask");
}
}
//--------------------------------------------------------
// add_to_temperature
// add in contributions from lambda power and boundary
// flux to the FE temperature
//--------------------------------------------------------
void ThermostatFlux::add_to_energy(const DENS_MAT & nodalLambdaPower,
DENS_MAT & deltaEnergy,
double dt)
{
deltaEnergy.resize(nNodes_,1);
const DENS_MAT & myBoundaryFlux(boundaryFlux_[TEMPERATURE].quantity());
for (int i = 0; i < nNodes_; i++) {
deltaEnergy(i,0) = nodalLambdaPower(i,0) + dt*myBoundaryFlux(i,0);
}
}
//--------------------------------------------------------
// set_thermostat_rhs:
// sets up the right-hand side including boundary
// fluxes (coupling & prescribed), heat sources, and
// fixed (uncoupled) nodes
//--------------------------------------------------------
void ThermostatFlux::set_thermostat_rhs(DENS_MAT & rhs,
double dt)
{
// only tested with flux != 0 + ess bc = 0
// (a) for flux based :
// form rhs : 2/3kB * W_I^-1 * \int N_I r dV
// vs Wagner, CMAME, 2008 eq(24) RHS_I = 2/(3kB) flux_I
// fluxes are set in ATC transfer
const DENS_MAT & heatSource(heatSource_.quantity());
const set<int> & applicationNodes(applicationNodes_->quantity());
for (int i = 0; i < nNodes_; i++) {
if (applicationNodes.find(i) != applicationNodes.end()) {
rhs(i,0) = heatSource(i,0);
}
else {
rhs(i,0) = 0.;
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatFixed
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and thermostat data
//--------------------------------------------------------
ThermostatFixed::ThermostatFixed(Thermostat * thermostat,
const string & regulatorPrefix) :
ThermostatGlcFs(thermostat,regulatorPrefix),
atomThermostatForcesPredVel_(NULL),
filterCoefficient_(1.)
{
// do nothing
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatFixed::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// set up node mappings
create_node_maps();
// determine if map is needed and set up if so
if (this->use_local_shape_functions()) {
lambdaAtomMap_ = new AtomToElementset(atc_,elementMask_);
interscaleManager.add_per_atom_int_quantity(lambdaAtomMap_,
regulatorPrefix_+"LambdaAtomMap");
shapeFunctionMatrix_ = new LocalLambdaCouplingMatrix(atc_,
lambdaAtomMap_,
nodeToOverlapMap_);
}
else {
shapeFunctionMatrix_ = new LambdaCouplingMatrix(atc_,nodeToOverlapMap_);
}
interscaleManager.add_per_atom_sparse_matrix(shapeFunctionMatrix_,
regulatorPrefix_+"LambdaCouplingMatrixEnergy");
linearSolverType_ = AtomicRegulator::CG_SOLVE;
// base class transfers, e.g. weights
ThermostatGlcFs::construct_transfers();
// add transfers for computation of extra RHS term accounting of O(lambda^2)
// lambda squared followed by fractional step RHS contribution
PerAtomQuantity<double> * lambdaAtom(interscaleManager.per_atom_quantity(regulatorPrefix_+"AtomLambdaEnergy"));
if (lambdaAtomMap_) {
LambdaSquaredMapped * lambdaSquared = new LambdaSquaredMapped(atc_,
lambdaAtomMap_,
atomMasses_,
weights_,
lambdaAtom);
interscaleManager.add_per_atom_quantity(lambdaSquared,
regulatorPrefix_+"LambdaSquared");
rhsLambdaSquared_ = new AtfShapeFunctionRestriction(atc_,lambdaSquared,shapeFunctionMatrix_);
}
else {
LambdaSquared * lambdaSquared = new LambdaSquared(atc_,
atomMasses_,
weights_,
lambdaAtom);
interscaleManager.add_per_atom_quantity(lambdaSquared,
regulatorPrefix_+"LambdaSquaredMapped");
rhsLambdaSquared_ = new AtfShapeFunctionRestriction(atc_,lambdaSquared,shapeFunctionMatrix_);
}
interscaleManager.add_dense_matrix(rhsLambdaSquared_,
regulatorPrefix_+"RhsLambdaSquared");
// predicted forces for halving update
atomThermostatForcesPredVel_ = new AtomicThermostatForce(atc_,atomLambdas_,atomPredictedVelocities_);
interscaleManager.add_per_atom_quantity(atomThermostatForcesPredVel_,
regulatorPrefix_+"AtomThermostatForcePredictedVelocity");
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void ThermostatFixed::initialize()
{
ThermostatGlcFs::initialize();
InterscaleManager & interscaleManager(atc_->interscale_manager());
// set KE multiplier
AtomicEnergyForTemperature * atomEnergyForTemperature =
static_cast<AtomicEnergyForTemperature * >(interscaleManager.per_atom_quantity("AtomicEnergyForTemperature"));
keMultiplier_ = atomEnergyForTemperature->kinetic_energy_multiplier();
// reset data to zero
deltaFeEnergy_.reset(nNodes_,1);
deltaNodalAtomicEnergy_.reset(nNodes_,1);
// initialize filtered energy
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (!timeFilterManager->end_equilibrate()) {
nodalAtomicEnergyFiltered_ = nodalAtomicEnergy_->quantity();
}
// timestep factor
dtFactor_ = 0.5;
}
//--------------------------------------------------------
// halve_force:
// flag to halve the lambda force for improved
// accuracy
//--------------------------------------------------------
bool ThermostatFixed::halve_force()
{
if (isFirstTimestep_ || ((atc_->atom_to_element_map_type() == EULERIAN)
&& (atc_->atom_to_element_map_frequency() > 1)
&& (atc_->step() % atc_->atom_to_element_map_frequency() == 1))) {
return true;
}
return false;
}
//--------------------------------------------------------
// construct_regulated_nodes:
// constructs the set of nodes being regulated
//--------------------------------------------------------
void ThermostatFixed::construct_regulated_nodes()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
if (!atomicRegulator_->use_localized_lambda()) {
regulatedNodes_ = new RegulatedNodes(atc_);
}
else if (thermostat_->coupling_mode() == AtomicRegulator::FLUX) {
regulatedNodes_ = new FixedNodes(atc_);
}
else if (thermostat_->coupling_mode() == AtomicRegulator::FIXED) {
// include boundary nodes
regulatedNodes_ = new FixedBoundaryNodes(atc_);
}
else {
throw ATC_Error("ThermostatFixed::construct_regulated_nodes - couldn't determine set of regulated nodes");
}
interscaleManager.add_set_int(regulatedNodes_,
regulatorPrefix_+"RegulatedNodes");
applicationNodes_ = regulatedNodes_;
// special set of boundary elements for defining regulated atoms
if (atomicRegulator_->use_localized_lambda()) {
elementMask_ = new ElementMaskNodeSet(atc_,applicationNodes_);
interscaleManager.add_dense_matrix_bool(elementMask_,
regulatorPrefix_+"BoundaryElementMask");
}
}
//--------------------------------------------------------
// initialize_delta_nodal_atomic_energy:
// initializes storage for the variable tracking
// the change in the nodal atomic energy
// that has occured over the past timestep
//--------------------------------------------------------
void ThermostatFixed::initialize_delta_nodal_atomic_energy(double dt)
{
// initialize delta energy
const DENS_MAT & myNodalAtomicEnergy(nodalAtomicEnergy_->quantity());
initialNodalAtomicEnergy_ = myNodalAtomicEnergy;
initialNodalAtomicEnergy_ *= -1.; // initially stored as negative for efficiency
timeFilter_->apply_pre_step1(nodalAtomicEnergyFiltered_.set_quantity(),
myNodalAtomicEnergy,dt);
}
//--------------------------------------------------------
// compute_delta_nodal_atomic_energy:
// computes the change in the nodal atomic energy
// that has occured over the past timestep
//--------------------------------------------------------
void ThermostatFixed::compute_delta_nodal_atomic_energy(double dt)
{
// set delta energy based on predicted atomic velocities
const DENS_MAT & myNodalAtomicEnergy(nodalAtomicEnergy_->quantity());
timeFilter_->apply_post_step1(nodalAtomicEnergyFiltered_.set_quantity(),
myNodalAtomicEnergy,dt);
deltaNodalAtomicEnergy_ = initialNodalAtomicEnergy_;
deltaNodalAtomicEnergy_ += myNodalAtomicEnergy;
}
//--------------------------------------------------------
// compute_lambda:
// sets up and solves linear system for lambda, if the
// bool is true it iterators to a non-linear solution
//--------------------------------------------------------
void ThermostatFixed::compute_lambda(double dt,
bool iterateSolution)
{
// compute predicted changes in nodal atomic energy
compute_delta_nodal_atomic_energy(dt);
// change in finite element energy
deltaFeEnergy_ = initialFeEnergy_;
deltaFeEnergy_ += (mdMassMatrix_.quantity())*(temperature_.quantity());
ThermostatGlcFs::compute_lambda(dt,iterateSolution);
}
//--------------------------------------------------------
// apply_predictor:
// apply the thermostat to the atoms in the first step
// of the Verlet algorithm
//--------------------------------------------------------
void ThermostatFixed::apply_pre_predictor(double dt)
{
// initialize values to be track change in finite element energy over the timestep
initialize_delta_nodal_atomic_energy(dt);
initialFeEnergy_ = -1.*((mdMassMatrix_.quantity())*(temperature_.quantity())); // initially stored as negative for efficiency
ThermostatGlcFs::apply_pre_predictor(dt);
}
//--------------------------------------------------------
// apply_pre_corrector:
// apply the thermostat to the atoms in the first part
// of the corrector step of the Verlet algorithm
//--------------------------------------------------------
void ThermostatFixed::apply_pre_corrector(double dt)
{
// do full prediction if we just redid the shape functions
if (full_prediction()) {
firstHalfAtomForces_ = atomThermostatForces_; // reset in case this time step needed special treatment
_tempNodalAtomicEnergyFiltered_ = nodalAtomicEnergyFiltered_.quantity();
}
ThermostatGlcFs::apply_pre_corrector(dt);
if (full_prediction()) {
// reset temporary variables
nodalAtomicEnergyFiltered_ = _tempNodalAtomicEnergyFiltered_;
}
if (halve_force()) {
// save old velocities if we are doing halving calculation of lambda force
// copy velocities over into temporary storage
(*atomPredictedVelocities_) = atomVelocities_->quantity();
}
}
//--------------------------------------------------------
// add_to_temperature
// add in contributions from lambda power and boundary
// flux to the FE temperature
//--------------------------------------------------------
void ThermostatFixed::add_to_energy(const DENS_MAT & nodalLambdaPower,
DENS_MAT & deltaEnergy,
double dt)
{
deltaEnergy.resize(nNodes_,1);
const set<int> & regulatedNodes(regulatedNodes_->quantity());
for (int i = 0; i < nNodes_; i++) {
if (regulatedNodes.find(i) != regulatedNodes.end()) {
deltaEnergy(i,0) = 0.;
}
else {
deltaEnergy(i,0) = nodalLambdaPower(i,0);
}
}
}
//--------------------------------------------------------
// apply_post_corrector:
// apply the thermostat to the atoms in the second part
// of the corrector step of the Verlet algorithm
//--------------------------------------------------------
void ThermostatFixed::apply_post_corrector(double dt)
{
bool halveForce = halve_force();
ThermostatGlcFs::apply_post_corrector(dt);
// update filtered energy with lambda power
DENS_MAT & myNodalAtomicLambdaPower(nodalAtomicLambdaPower_->set_quantity());
timeFilter_->apply_post_step2(nodalAtomicEnergyFiltered_.set_quantity(),
myNodalAtomicLambdaPower,dt);
if (halveForce) {
// Halve lambda force due to fixed temperature constraints
// 1) makes up for poor initial condition
// 2) accounts for possibly large value of lambda when atomic shape function values change
// from eulerian mapping after more than 1 timestep
// avoids unstable oscillations arising from
// thermostat having to correct for error introduced in lambda changing the
// shape function matrices
*lambda_ *= 0.5;
firstHalfAtomForces_ = atomThermostatForcesPredVel_;
atomThermostatForcesPredVel_->unfix_quantity();
}
else {
firstHalfAtomForces_ = atomThermostatForces_;
}
}
//--------------------------------------------------------
// set_thermostat_rhs:
// sets up the right-hand side including boundary
// fluxes (coupling & prescribed), heat sources, and
// fixed (uncoupled) nodes
//--------------------------------------------------------
void ThermostatFixed::set_thermostat_rhs(DENS_MAT & rhs,
double dt)
{
// for essential bcs (fixed nodes) :
// form rhs : (delThetaV - delTheta)/dt
const set<int> & regulatedNodes(regulatedNodes_->quantity());
double factor = (1./dt)/keMultiplier_;
for (int i = 0; i < nNodes_; i++) {
if (regulatedNodes.find(i) != regulatedNodes.end()) {
rhs(i,0) = factor*(deltaNodalAtomicEnergy_(i,0) - deltaFeEnergy_(i,0));
}
else {
rhs(i,0) = 0.;
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatFluxFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and thermostat data
//--------------------------------------------------------
ThermostatFluxFiltered::ThermostatFluxFiltered(Thermostat * thermostat,
const string & regulatorPrefix) :
ThermostatFlux(thermostat,regulatorPrefix)
{
// do nothing
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void ThermostatFluxFiltered::initialize()
{
ThermostatFlux::initialize();
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (!timeFilterManager->end_equilibrate()) {
// always must start as zero because of filtering scheme
heatSourceOld_.reset(nNodes_,1);
instantHeatSource_.reset(nNodes_,1);
timeStepSource_.reset(nNodes_,1);
}
}
//--------------------------------------------------------
// apply_post_corrector:
// apply the thermostat to the atoms in the second part
// of the corrector step of the Verlet algorithm
//--------------------------------------------------------
void ThermostatFluxFiltered::apply_post_corrector(double dt)
{
// compute lambda
ThermostatFlux::apply_post_corrector(dt);
// store data needed for filter inversion of heat flux for thermostat rhs
instantHeatSource_ = rhs_;
heatSourceOld_ = heatSource_.quantity();
}
//--------------------------------------------------------
// add_to_temperature
// add in contributions from lambda power and boundary
// flux to the FE temperature
//--------------------------------------------------------
void ThermostatFluxFiltered::add_to_energy(const DENS_MAT & nodalLambdaPower,
DENS_MAT & deltaEnergy,
double dt)
{
deltaEnergy.reset(nNodes_,1);
double coef = timeFilter_->unfiltered_coefficient_post_s1(2.*dt);
const DENS_MAT & myBoundaryFlux(boundaryFlux_[TEMPERATURE].quantity());
for (int i = 0; i < nNodes_; i++) {
deltaEnergy(i,0) = coef*nodalLambdaPower(i,0) + dt*myBoundaryFlux(i,0);
}
}
//--------------------------------------------------------
// set_thermostat_rhs:
// sets up the right-hand side including boundary
// fluxes (coupling & prescribed), heat sources, and
// fixed (uncoupled) nodes
//--------------------------------------------------------
void ThermostatFluxFiltered::set_thermostat_rhs(DENS_MAT & rhs,
double dt)
{
// only tested with flux != 0 + ess bc = 0
// (a) for flux based :
// form rhs : 2/3kB * W_I^-1 * \int N_I r dV
// vs Wagner, CMAME, 2008 eq(24) RHS_I = 2/(3kB) flux_I
// fluxes are set in ATC transfer
// invert heatSource_ to get unfiltered source
// relevant coefficients from time filter
double coefF1 = timeFilter_->filtered_coefficient_pre_s1(2.*dt);
double coefF2 = timeFilter_->filtered_coefficient_post_s1(2.*dt);
double coefU1 = timeFilter_->unfiltered_coefficient_pre_s1(2.*dt);
double coefU2 = timeFilter_->unfiltered_coefficient_post_s1(2.*dt);
const DENS_MAT & heatSource(heatSource_.quantity());
const set<int> & applicationNodes(applicationNodes_->quantity());
for (int i = 0; i < nNodes_; i++) {
if (applicationNodes.find(i) != applicationNodes.end()) {
rhs(i,0) = heatSource(i,0) - coefF1*coefF2*heatSourceOld_(i,0) - coefU1*coefF2*instantHeatSource_(i,0);
rhs(i,0) /= coefU2;
}
else {
rhs(i,0) = 0.;
}
}
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void ThermostatFluxFiltered::output(OUTPUT_LIST & outputData)
{
_lambdaPowerOutput_ = lambdaPowerFiltered_->quantity();
// approximate value for lambda power
double dt = LammpsInterface::instance()->dt();
_lambdaPowerOutput_ *= (2./dt);
DENS_MAT & lambda(lambda_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData[regulatorPrefix_+"Lambda"] = &lambda;
outputData[regulatorPrefix_+"NodalLambdaPower"] = &(_lambdaPowerOutput_);
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatFixedFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and thermostat data
//--------------------------------------------------------
ThermostatFixedFiltered::ThermostatFixedFiltered(Thermostat * thermostat,
const string & regulatorPrefix) :
ThermostatFixed(thermostat,regulatorPrefix)
{
// do nothing
}
//--------------------------------------------------------
// initialize_delta_nodal_atomic_energy:
// initializes storage for the variable tracking
// the change in the nodal atomic energy
// that has occured over the past timestep
//--------------------------------------------------------
void ThermostatFixedFiltered::initialize_delta_nodal_atomic_energy(double dt)
{
// initialize delta energy
DENS_MAT & myNodalAtomicEnergyFiltered(nodalAtomicEnergyFiltered_.set_quantity());
initialNodalAtomicEnergy_ = myNodalAtomicEnergyFiltered;
initialNodalAtomicEnergy_ *= -1.; // initially stored as negative for efficiency
timeFilter_->apply_pre_step1(myNodalAtomicEnergyFiltered,
nodalAtomicEnergy_->quantity(),dt);
}
//--------------------------------------------------------
// compute_delta_nodal_atomic_energy:
// computes the change in the nodal atomic energy
// that has occured over the past timestep
//--------------------------------------------------------
void ThermostatFixedFiltered::compute_delta_nodal_atomic_energy(double dt)
{
// set delta energy based on predicted atomic velocities
DENS_MAT & myNodalAtomicEnergyFiltered(nodalAtomicEnergyFiltered_.set_quantity());
timeFilter_->apply_post_step1(myNodalAtomicEnergyFiltered,
nodalAtomicEnergy_->quantity(),dt);
deltaNodalAtomicEnergy_ = initialNodalAtomicEnergy_;
deltaNodalAtomicEnergy_ += myNodalAtomicEnergyFiltered;
}
//--------------------------------------------------------
// add_to_temperature
// add in contributions from lambda power and boundary
// flux to the FE temperature
//--------------------------------------------------------
void ThermostatFixedFiltered::add_to_energy(const DENS_MAT & nodalLambdaPower,
DENS_MAT & deltaEnergy,
double dt)
{
deltaEnergy.resize(nNodes_,1);
const set<int> & regulatedNodes(regulatedNodes_->quantity());
double coef = timeFilter_->unfiltered_coefficient_post_s1(2.*dt);
for (int i = 0; i < nNodes_; i++) {
if (regulatedNodes.find(i) != regulatedNodes.end()) {
deltaEnergy(i,0) = 0.;
}
else {
deltaEnergy(i,0) = coef*nodalLambdaPower(i,0);
}
}
}
//--------------------------------------------------------
// set_thermostat_rhs:
// sets up the right-hand side for fixed
// (coupling & prescribed) temperature values
//--------------------------------------------------------
void ThermostatFixedFiltered::set_thermostat_rhs(DENS_MAT & rhs,
double dt)
{
// (b) for essential bcs (fixed nodes) :
// form rhs : (delThetaV - delTheta)/dt
const set<int> & regulatedNodes(regulatedNodes_->quantity());
double factor = (1./dt)/keMultiplier_;
factor /= timeFilter_->unfiltered_coefficient_post_s1(2.*dt);
for (int i = 0; i < nNodes_; i++) {
if (regulatedNodes.find(i) != regulatedNodes.end()) {
rhs(i,0) = factor*(deltaNodalAtomicEnergy_(i,0) - deltaFeEnergy_(i,0));
}
else {
rhs(i,0) = 0.;
}
}
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void ThermostatFixedFiltered::output(OUTPUT_LIST & outputData)
{
_lambdaPowerOutput_ = lambdaPowerFiltered_->quantity();
// approximate value for lambda power
double dt = LammpsInterface::instance()->dt();
_lambdaPowerOutput_ *= (2./dt);
DENS_MAT & lambda(lambda_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData[regulatorPrefix_+"Lambda"] = &lambda;
outputData[regulatorPrefix_+"NodalLambdaPower"] = &(_lambdaPowerOutput_);
}
}
// have one for combined and one for lumped (lumped has two sub-thermostats)
// use node sets to call out fixed and fluxed locations
// derived off lumped lambda class that only considers certain atoms and certain nodes based on a mask
// move matrix solver construction to thermostats that actually do something
// thermostats can instantiate the type of shape function object they want in the future, for now we'll need hacks,
// for now we'll have to construct them with appropriate shape function matrix
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatFluxFixed
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ThermostatFluxFixed::ThermostatFluxFixed(Thermostat * thermostat,
bool constructThermostats) :
RegulatorMethod(thermostat),
thermostatFlux_(NULL),
thermostatFixed_(NULL),
thermostatBcs_(NULL)
{
if (constructThermostats) {
thermostatFlux_ = new ThermostatFlux(thermostat,regulatorPrefix_+"Flux");
thermostatFixed_ = new ThermostatFixed(thermostat,regulatorPrefix_+"Fixed");
// need to choose BC type based on coupling mode
if (thermostat->coupling_mode() == AtomicRegulator::FLUX) {
thermostatBcs_ = thermostatFlux_;
}
else if (thermostat->coupling_mode() == AtomicRegulator::FIXED) {
thermostatBcs_ = thermostatFixed_;
}
else {
throw ATC_Error("ThermostatFluxFixed:create_thermostats - invalid thermostat type provided");
}
}
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ThermostatFluxFixed::~ThermostatFluxFixed()
{
if (thermostatFlux_) delete thermostatFlux_;
if (thermostatFixed_) delete thermostatFixed_;
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatFluxFixed::construct_transfers()
{
thermostatFlux_->construct_transfers();
thermostatFixed_->construct_transfers();
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void ThermostatFluxFixed::initialize()
{
thermostatFlux_->initialize();
thermostatFixed_->initialize();
}
//--------------------------------------------------------
// apply_predictor:
// apply the thermostat to the atoms in the first step
// of the Verlet algorithm
//--------------------------------------------------------
void ThermostatFluxFixed::apply_pre_predictor(double dt)
{
thermostatFixed_->apply_pre_predictor(dt);
thermostatFlux_->apply_pre_predictor(dt);
}
//--------------------------------------------------------
// apply_pre_corrector:
// apply the thermostat to the atoms in the first part
// of the corrector step of the Verlet algorithm
//--------------------------------------------------------
void ThermostatFluxFixed::apply_pre_corrector(double dt)
{
thermostatFlux_->apply_pre_corrector(dt);
if (thermostatFixed_->full_prediction()) {
atc_->set_fixed_nodes();
}
thermostatFixed_->apply_pre_corrector(dt);
}
//--------------------------------------------------------
// apply_post_corrector:
// apply the thermostat to the atoms in the second part
// of the corrector step of the Verlet algorithm
//--------------------------------------------------------
void ThermostatFluxFixed::apply_post_corrector(double dt)
{
thermostatFlux_->apply_post_corrector(dt);
atc_->set_fixed_nodes();
thermostatFixed_->apply_post_corrector(dt);
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void ThermostatFluxFixed::output(OUTPUT_LIST & outputData)
{
thermostatFlux_->output(outputData);
thermostatFixed_->output(outputData);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatFluxFixedFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ThermostatFluxFixedFiltered::ThermostatFluxFixedFiltered(Thermostat * thermostat) :
ThermostatFluxFixed(thermostat,false)
{
thermostatFlux_ = new ThermostatFluxFiltered(thermostat,regulatorPrefix_+"Flux");
thermostatFixed_ = new ThermostatFixedFiltered(thermostat,regulatorPrefix_+"Fixed");
// need to choose BC type based on coupling mode
if (thermostat->coupling_mode() == AtomicRegulator::FLUX) {
thermostatBcs_ = thermostatFlux_;
}
else if (thermostat->coupling_mode() == AtomicRegulator::FIXED) {
thermostatBcs_ = thermostatFixed_;
}
else {
throw ATC_Error("ThermostatFluxFixed:create_thermostats - invalid thermostat type provided");
}
}
//--------------------------------------------------------
// Class ThermostatGlc
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ThermostatGlc::ThermostatGlc(Thermostat * thermostat) :
ThermostatShapeFunction(thermostat),
timeFilter_(atomicRegulator_->time_filter()),
lambdaPowerFiltered_(NULL),
atomThermostatForces_(NULL),
prescribedDataMgr_(atc_->prescribed_data_manager()),
atomMasses_(NULL)
{
// consistent with stage 3 of ATC_Method::initialize
lambdaPowerFiltered_= thermostat_->regulator_data(regulatorPrefix_+"LambdaPowerFiltered",1);
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatGlc::construct_transfers()
{
ThermostatShapeFunction::construct_transfers();
InterscaleManager & interscaleManager(atc_->interscale_manager());
// get data from manager
atomMasses_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS);
// thermostat forces based on lambda and the atomic velocities
AtomicThermostatForce * atomThermostatForces = new AtomicThermostatForce(atc_);
interscaleManager.add_per_atom_quantity(atomThermostatForces,
regulatorPrefix_+"AtomThermostatForce");
atomThermostatForces_ = atomThermostatForces;
}
//--------------------------------------------------------
// apply_to_atoms:
// determines what if any contributions to the
// atomic moition is needed for
// consistency with the thermostat
//--------------------------------------------------------
void ThermostatGlc::apply_to_atoms(PerAtomQuantity<double> * atomVelocities,
const DENS_MAT & lambdaForce,
double dt)
{
_velocityDelta_ = lambdaForce;
_velocityDelta_ /= atomMasses_->quantity();
_velocityDelta_ *= dt;
(*atomVelocities) += _velocityDelta_;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatPowerVerlet
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and thermostat data
//--------------------------------------------------------
ThermostatPowerVerlet::ThermostatPowerVerlet(Thermostat * thermostat) :
ThermostatGlc(thermostat),
nodalTemperatureRoc_(atc_->field_roc(TEMPERATURE)),
heatSource_(atc_->atomic_source(TEMPERATURE)),
nodalAtomicPower_(NULL),
nodalAtomicLambdaPower_(NULL)
{
// do nothing
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatPowerVerlet::construct_transfers()
{
InterscaleManager & interscaleManager(atc_->interscale_manager());
// set up node mappings
create_node_maps();
// determine if mapping is needed and set up if so
if (atomicRegulator_->use_localized_lambda()) {
lambdaAtomMap_ = new AtomToElementset(atc_,elementMask_);
interscaleManager.add_per_atom_int_quantity(lambdaAtomMap_,
regulatorPrefix_+"LambdaAtomMap");
}
// set up linear solver
if (atomicRegulator_->use_lumped_lambda_solve()) {
shapeFunctionMatrix_ = new LambdaCouplingMatrix(atc_,nodeToOverlapMap_);
linearSolverType_ = AtomicRegulator::RSL_SOLVE;
}
else {
if (lambdaAtomMap_) {
shapeFunctionMatrix_ = new LocalLambdaCouplingMatrix(atc_,
lambdaAtomMap_,
nodeToOverlapMap_);
}
else {
shapeFunctionMatrix_ = new LambdaCouplingMatrix(atc_,nodeToOverlapMap_);
}
linearSolverType_ = AtomicRegulator::CG_SOLVE;
}
interscaleManager.add_per_atom_sparse_matrix(shapeFunctionMatrix_,
regulatorPrefix_+"LambdaCouplingMatrixEnergy");
// base class transfers, e.g. weights
ThermostatGlc::construct_transfers();
// get managed data
nodalAtomicPower_ = interscaleManager.dense_matrix("NodalAtomicPower");
// power induced by lambda
DotTwiceKineticEnergy * atomicLambdaPower =
new DotTwiceKineticEnergy(atc_,atomThermostatForces_);
interscaleManager.add_per_atom_quantity(atomicLambdaPower,
regulatorPrefix_+"AtomicLambdaPower");
// restriction to nodes of power induced by lambda
nodalAtomicLambdaPower_ = new AtfShapeFunctionRestriction(atc_,
atomicLambdaPower,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_dense_matrix(nodalAtomicLambdaPower_,
regulatorPrefix_+"NodalAtomicLambdaPower");
}
//--------------------------------------------------------
// initialize
// initializes all method data
//--------------------------------------------------------
void ThermostatPowerVerlet::initialize()
{
ThermostatGlc::initialize();
// sets up time filter for cases where variables temporally filtered
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
if (!timeFilterManager->end_equilibrate()) {
_nodalAtomicLambdaPowerOut_ = 0.;
*lambdaPowerFiltered_ = 0.;
timeFilter_->initialize(lambdaPowerFiltered_->quantity());
}
}
//--------------------------------------------------------
// apply_predictor:
// apply the thermostat to the atoms in the first step
// of the Verlet algorithm
//--------------------------------------------------------
void ThermostatPowerVerlet::apply_pre_predictor(double dt)
{
atomThermostatForces_->unfix_quantity();
compute_thermostat(0.5*dt);
// apply lambda force to atoms
const DENS_MAT & thermostatForces(atomThermostatForces_->quantity());
atomThermostatForces_->fix_quantity();
apply_to_atoms(atomVelocities_,thermostatForces,0.5*dt);
}
//--------------------------------------------------------
// apply_pre_corrector:
// apply the thermostat to the atoms in the first part
// of the corrector step of the Verlet algorithm
//--------------------------------------------------------
void ThermostatPowerVerlet::apply_pre_corrector(double dt)
{
atomThermostatForces_->unfix_quantity();
compute_thermostat(0.5*dt);
// apply lambda force to atoms
const DENS_MAT & thermostatForces(atomThermostatForces_->quantity());
atomThermostatForces_->fix_quantity();
apply_to_atoms(atomVelocities_,thermostatForces,0.5*dt);
}
//--------------------------------------------------------
// add_to_rhs:
// determines what if any contributions to the
// finite element equations are needed for
// consistency with the thermostat
//--------------------------------------------------------
void ThermostatPowerVerlet::add_to_rhs(FIELDS & rhs)
{
rhs[TEMPERATURE] += nodalAtomicLambdaPower_->quantity() + boundaryFlux_[TEMPERATURE].quantity();
}
//--------------------------------------------------------
// set_thermostat_rhs:
// sets up the right-hand side including boundary
// fluxes (coupling & prescribed), heat sources, and
// fixed (uncoupled) nodes
//--------------------------------------------------------
void ThermostatPowerVerlet::set_thermostat_rhs(DENS_MAT & rhs_nodes)
{
// (a) for flux based :
// form rhs : \int N_I r dV
// vs Wagner, CMAME, 2008 eq(24) RHS_I = 2/(3kB) flux_I
// fluxes are set in ATC transfer
rhs_nodes = heatSource_.quantity();
// (b) for ess. bcs
// form rhs : {sum_a (2 * N_Ia * v_ia * f_ia) - (dtheta/dt)_I}
// replace rhs for prescribed nodes
const DENS_MAT & myNodalAtomicPower(nodalAtomicPower_->quantity());
const DIAG_MAT & myMdMassMatrix(mdMassMatrix_.quantity());
const DENS_MAT & myNodalTemperatureRoc(nodalTemperatureRoc_.quantity());
for (int i = 0; i < nNodes_; i++) {
if (prescribedDataMgr_->is_fixed(i,TEMPERATURE,0)) {
rhs_nodes(i,0) = 0.5*(myNodalAtomicPower(i,0) - myMdMassMatrix(i,i)*myNodalTemperatureRoc(i,0));
}
}
}
//--------------------------------------------------------
// compute_thermostat:
// sets up and solves the thermostat equations since
// they are the same at different parts of the time
// step
//--------------------------------------------------------
void ThermostatPowerVerlet::compute_thermostat(double dt)
{
// set up rhs
set_thermostat_rhs(_rhs_);
// solve linear system for lambda
DENS_MAT & myLambda(lambda_->set_quantity());
solve_for_lambda(_rhs_,myLambda);
nodalAtomicLambdaPower_->unfix_quantity(); // enable computation of force applied by lambda
timeFilter_->apply_pre_step1(lambdaPowerFiltered_->set_quantity(),
nodalAtomicLambdaPower_->quantity(),dt);
nodalAtomicLambdaPower_->fix_quantity();
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void ThermostatPowerVerlet::output(OUTPUT_LIST & outputData)
{
_nodalAtomicLambdaPowerOut_ = nodalAtomicLambdaPower_->quantity();
DENS_MAT & lambda(lambda_->set_quantity());
if ((atc_->lammps_interface())->rank_zero()) {
outputData["lambda"] = &lambda;
outputData["nodalLambdaPower"] = &(_nodalAtomicLambdaPowerOut_);
}
}
//--------------------------------------------------------
// finish:
// final tasks after a run
//--------------------------------------------------------
void ThermostatPowerVerlet::finish()
{
_nodalAtomicLambdaPowerOut_ = nodalAtomicLambdaPower_->quantity();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatHooverVerlet
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and thermostat data
//--------------------------------------------------------
ThermostatHooverVerlet::ThermostatHooverVerlet(Thermostat * thermostat) :
ThermostatPowerVerlet(thermostat),
lambdaHoover_(NULL),
nodalAtomicHooverLambdaPower_(NULL)
{
// set up data consistent with stage 3 of ATC_Method::initialize
lambdaHoover_ = thermostat_->regulator_data(regulatorPrefix_+"LambdaHoover",1);
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatHooverVerlet::construct_transfers()
{
ThermostatPowerVerlet::construct_transfers();
InterscaleManager & interscaleManager(atc_->interscale_manager());
FtaShapeFunctionProlongation * atomHooverLambdas = new FtaShapeFunctionProlongation(atc_,
lambdaHoover_,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_per_atom_quantity(atomHooverLambdas,
regulatorPrefix_+"AtomHooverLambda");
AtomicThermostatForce * atomHooverThermostatForces = new AtomicThermostatForce(atc_,atomHooverLambdas);
interscaleManager.add_per_atom_quantity(atomHooverThermostatForces,
regulatorPrefix_+"AtomHooverThermostatForce");
SummedAtomicQuantity<double> * atomTotalThermostatForces =
new SummedAtomicQuantity<double>(atc_,atomThermostatForces_,atomHooverThermostatForces);
interscaleManager.add_per_atom_quantity(atomTotalThermostatForces,
regulatorPrefix_+"AtomTotalThermostatForce");
atomThermostatForces_ = atomTotalThermostatForces;
// transfers dependent on time integration method
DotTwiceKineticEnergy * atomicHooverLambdaPower =
new DotTwiceKineticEnergy(atc_,atomHooverThermostatForces);
interscaleManager.add_per_atom_quantity(atomicHooverLambdaPower,
regulatorPrefix_+"AtomicHooverLambdaPower");
nodalAtomicHooverLambdaPower_ = new AtfShapeFunctionRestriction(atc_,
atomicHooverLambdaPower,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_dense_matrix(nodalAtomicHooverLambdaPower_,
regulatorPrefix_+"NodalAtomicHooverLambdaPower");
}
//--------------------------------------------------------
// add_to_rhs:
// determines what if any contributions to the
// finite element equations are needed for
// consistency with the thermostat
//--------------------------------------------------------
void ThermostatHooverVerlet::add_to_rhs(FIELDS & rhs)
{
rhs[TEMPERATURE] += _nodalAtomicLambdaPowerOut_;
}
//--------------------------------------------------------
// compute_thermostat:
// sets up and solves the thermostat equations since
// they are the same at different parts of the time
// step
//--------------------------------------------------------
void ThermostatHooverVerlet::compute_thermostat(double dt)
{
// apply prescribed/extrinsic sources and fixed nodes
ThermostatPowerVerlet::compute_thermostat(0.5*dt);
_nodalAtomicLambdaPowerOut_ = nodalAtomicLambdaPower_->quantity(); // save power from lambda in power-based thermostat
// set up Hoover rhs
set_hoover_rhs(_rhs_);
// solve linear system for lambda
DENS_MAT & myLambda(lambdaHoover_->set_quantity());
solve_for_lambda(_rhs_,myLambda);
// compute force applied by lambda
// compute nodal atomic power from Hoover coupling
// only add in contribution to uncoupled nodes
if (atomicRegulator_->use_localized_lambda())
add_to_lambda_power(atomThermostatForces_->quantity(),0.5*dt);
}
//--------------------------------------------------------
// set_hoover_rhs:
// sets up the right-hand side for fixed value,
// i.e. Hoover coupling
//--------------------------------------------------------
void ThermostatHooverVerlet::set_hoover_rhs(DENS_MAT & rhs)
{
// form rhs : sum_a ( N_Ia * v_ia * f_ia) - 0.5*M_MD*(dtheta/dt)_I
rhs = nodalAtomicPower_->quantity();
rhs -= mdMassMatrix_.quantity()*nodalTemperatureRoc_.quantity();
rhs /= 2.;
}
//--------------------------------------------------------
// add_to_nodal_lambda_power:
// determines the power exerted by the Hoover
// thermostat at each FE node
//--------------------------------------------------------
void ThermostatHooverVerlet::add_to_lambda_power(const DENS_MAT & myLambdaForce,
double dt)
{
_myNodalLambdaPower_ = nodalAtomicHooverLambdaPower_->quantity();
const INT_ARRAY & nodeToOverlapMap(nodeToOverlapMap_->quantity());
for (int i = 0; i < nNodes_; ++i) {
if (nodeToOverlapMap(i,0)==-1)
_nodalAtomicLambdaPowerOut_(i,0) += _myNodalLambdaPower_(i,0);
else
_myNodalLambdaPower_(i,0) = 0.;
}
timeFilter_->apply_post_step1(lambdaPowerFiltered_->set_quantity(),_myNodalLambdaPower_,dt);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatPowerVerletFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and thermostat data
//--------------------------------------------------------
ThermostatPowerVerletFiltered::ThermostatPowerVerletFiltered(Thermostat * thermostat) :
ThermostatPowerVerlet(thermostat),
nodalTemperature2Roc_(atc_->field_2roc(TEMPERATURE)),
fieldsRoc_(atc_->fields_roc()),
filterScale_((atc_->time_filter_manager())->filter_scale())
{
heatSourceRoc_.reset(nNodes_,1);
fluxRoc_[TEMPERATURE].reset(nNodes_,1);
}
//--------------------------------------------------------
// compute_boundary_flux
// also sets time derivatives of boundary flux and
// heat sources
//--------------------------------------------------------
void ThermostatPowerVerletFiltered::compute_boundary_flux(FIELDS & fields)
{
ThermostatPowerVerlet::compute_boundary_flux(fields);
// compute boundary flux rate of change
fluxRoc_[TEMPERATURE] = 0.;
atc_->compute_boundary_flux(fieldMask_,
fieldsRoc_,
fluxRoc_,
atomMaterialGroups_,
shpFcnDerivs_);
// compute extrinsic model rate of change
(atc_->extrinsic_model_manager()).set_sources(fieldsRoc_,fluxRoc_);
heatSourceRoc_ = fluxRoc_[TEMPERATURE].quantity();
}
//--------------------------------------------------------
// add_to_rhs:
// determines what if any contributions to the
// finite element equations are needed for
// consistency with the thermostat
//--------------------------------------------------------
void ThermostatPowerVerletFiltered::add_to_rhs(FIELDS & rhs)
{
rhs[TEMPERATURE] += lambdaPowerFiltered_->quantity() + boundaryFlux_[TEMPERATURE].quantity();
}
//--------------------------------------------------------
// set_thermostat_rhs:
// sets up the right-hand side including boundary
// fluxes (coupling & prescribed), heat sources, and
// fixed (uncoupled) nodes
//--------------------------------------------------------
void ThermostatPowerVerletFiltered::set_thermostat_rhs(DENS_MAT & rhs_nodes)
{
// (a) for flux based :
// form rhs : \int N_I r dV
// vs Wagner, CMAME, 2008 eq(24) RHS_I = 2/(3kB) flux_I
// fluxes are set in ATC transfer
rhs_nodes = heatSource_.quantity() + filterScale_*heatSourceRoc_.quantity();
// (b) for ess. bcs
// form rhs : {sum_a (N_Ia * v_ia * f_ia) - 0.5*(dtheta/dt)_I}
const DENS_MAT & myNodalAtomicPower(nodalAtomicPower_->quantity());
const DIAG_MAT & myMdMassMatrix(mdMassMatrix_.quantity());
const DENS_MAT & myNodalTemperatureRoc(nodalTemperatureRoc_.quantity());
const DENS_MAT & myNodalTemperature2Roc(nodalTemperature2Roc_.quantity());
for (int i = 0; i < nNodes_; i++) {
if (prescribedDataMgr_->is_fixed(i,TEMPERATURE,0)) {
rhs_nodes(i,0) = 0.5*(myNodalAtomicPower(i,0) - myMdMassMatrix(i,i)*(myNodalTemperatureRoc(i,0)+ filterScale_*myNodalTemperature2Roc(i,0)));
}
}
}
//--------------------------------------------------------
// output:
// adds all relevant output to outputData
//--------------------------------------------------------
void ThermostatPowerVerletFiltered::output(OUTPUT_LIST & outputData)
{
outputData["lambda"] = &(lambda_->set_quantity());
outputData["nodalLambdaPower"] = &(lambdaPowerFiltered_->set_quantity());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ThermostatHooverVerletFiltered
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab references to ATC and thermostat data
//--------------------------------------------------------
ThermostatHooverVerletFiltered::ThermostatHooverVerletFiltered(Thermostat * thermostat) :
ThermostatPowerVerletFiltered(thermostat),
lambdaHoover_(NULL),
nodalAtomicHooverLambdaPower_(NULL)
{
// consistent with stage 3 of ATC_Method::initialize
lambdaHoover_ = thermostat_->regulator_data("LambdaHoover",1);
}
//--------------------------------------------------------
// constructor_transfers
// instantiates or obtains all dependency managed data
//--------------------------------------------------------
void ThermostatHooverVerletFiltered::construct_transfers()
{
ThermostatPowerVerletFiltered::construct_transfers();
InterscaleManager & interscaleManager(atc_->interscale_manager());
FtaShapeFunctionProlongation * atomHooverLambdas = new FtaShapeFunctionProlongation(atc_,
lambdaHoover_,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_per_atom_quantity(atomHooverLambdas,
regulatorPrefix_+"AtomHooverLambda");
AtomicThermostatForce * atomHooverThermostatForces = new AtomicThermostatForce(atc_,atomHooverLambdas);
interscaleManager.add_per_atom_quantity(atomHooverThermostatForces,
regulatorPrefix_+"AtomHooverThermostatForce");
SummedAtomicQuantity<double> * atomTotalThermostatForces =
new SummedAtomicQuantity<double>(atc_,atomThermostatForces_,atomHooverThermostatForces);
interscaleManager.add_per_atom_quantity(atomTotalThermostatForces,
regulatorPrefix_+"AtomTotalThermostatForce");
atomThermostatForces_ = atomTotalThermostatForces;
// transfers dependent on time integration method
DotTwiceKineticEnergy * atomicHooverLambdaPower =
new DotTwiceKineticEnergy(atc_,atomHooverThermostatForces);
interscaleManager.add_per_atom_quantity(atomicHooverLambdaPower,
regulatorPrefix_+"AtomicHooverLambdaPower");
nodalAtomicHooverLambdaPower_ = new AtfShapeFunctionRestriction(atc_,
atomicHooverLambdaPower,
interscaleManager.per_atom_sparse_matrix("Interpolant"));
interscaleManager.add_dense_matrix(nodalAtomicHooverLambdaPower_,
regulatorPrefix_+"NodalAtomicHooverLambdaPower");
}
//--------------------------------------------------------
// compute_thermostat:
// sets up and solves the thermostat equations since
// they are the same at different parts of the time
// step
//--------------------------------------------------------
void ThermostatHooverVerletFiltered::compute_thermostat(double dt)
{
// apply prescribed/extrinsic sources and fixed nodes
ThermostatPowerVerletFiltered::compute_thermostat(0.5*dt);
_nodalAtomicLambdaPowerOut_ = nodalAtomicLambdaPower_->quantity(); // save power from lambda in power-based thermostat
// set up Hoover rhs
set_hoover_rhs(_rhs_);
// solve linear system for lambda
DENS_MAT & myLambda(lambdaHoover_->set_quantity());
solve_for_lambda(_rhs_,myLambda);
// compute force applied by lambda
// compute nodal atomic power from Hoover coupling
// only add in contribution to uncoupled nodes
if (atomicRegulator_->use_localized_lambda())
add_to_lambda_power(atomThermostatForces_->quantity(),0.5*dt);
}
//--------------------------------------------------------
// set_hoover_rhs:
// sets up the right-hand side for fixed value,
// i.e. Hoover coupling
//--------------------------------------------------------
void ThermostatHooverVerletFiltered::set_hoover_rhs(DENS_MAT & rhs)
{
// form rhs : sum_a (N_Ia * v_ia * f_ia) - 0.5*M_MD*(dtheta/dt)_I
rhs = nodalAtomicPower_->quantity();
rhs -= mdMassMatrix_.quantity()*(nodalTemperatureRoc_.quantity() + filterScale_*nodalTemperature2Roc_.quantity());
rhs /= 2.;
}
//--------------------------------------------------------
// add_to_nodal_lambda_power:
// determines the power exerted by the Hoover
// thermostat at each FE node
//--------------------------------------------------------
void ThermostatHooverVerletFiltered::add_to_lambda_power(const DENS_MAT & myLambdaForce,
double dt)
{
_myNodalLambdaPower_ = nodalAtomicHooverLambdaPower_->quantity();
const INT_ARRAY nodeToOverlapMap(nodeToOverlapMap_->quantity());
for (int i = 0; i < nNodes_; ++i) {
if (nodeToOverlapMap(i,0)==-1)
_nodalAtomicLambdaPowerOut_(i,0) += _myNodalLambdaPower_(i,0);
else
_myNodalLambdaPower_(i,0) = 0.;
}
timeFilter_->apply_post_step1(lambdaPowerFiltered_->set_quantity(),_myNodalLambdaPower_,dt);
}
//--------------------------------------------------------
// add_to_rhs:
// determines what if any contributions to the
// finite element equations are needed for
// consistency with the thermostat
//--------------------------------------------------------
void ThermostatHooverVerletFiltered::add_to_rhs(FIELDS & rhs)
{
rhs[TEMPERATURE] += lambdaPowerFiltered_->quantity();
}
};
diff --git a/lib/atc/Thermostat.h b/lib/atc/Thermostat.h
index 7d1639312..aa2658156 100644
--- a/lib/atc/Thermostat.h
+++ b/lib/atc/Thermostat.h
@@ -1,927 +1,925 @@
#ifndef THERMOSTAT_H
#define THERMOSTAT_H
-// ATC headers
#include "AtomicRegulator.h"
#include "PerAtomQuantityLibrary.h"
-
-// other headers
#include <map>
#include <set>
+#include <string>
namespace ATC {
static const int myLambdaMaxIterations = 50;
// forward declarations
class ThermalTimeIntegrator;
class AtfShapeFunctionRestriction;
class FundamentalAtomQuantity;
class PrescribedDataManager;
/**
* @class Thermostat
* @brief Manager class for atom-continuum control of thermal energy
*/
class Thermostat : public AtomicRegulator {
public:
// constructor
Thermostat(ATC_Coupling * atc,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
// destructor
virtual ~Thermostat(){};
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** instantiate up the desired method(s) */
virtual void construct_methods();
// data access, intended for method objects
/** reset the nodal power to a prescribed value */
virtual void reset_lambda_contribution(const DENS_MAT & target);
/** return value for the correction maximum number of iterations */
int lambda_max_iterations() {return lambdaMaxIterations_;};
protected:
// data regarding fixed nodes and applied fluxes
/** set of all fixed nodes */
- set<int> fixedNodes_;
+ std::set<int> fixedNodes_;
/** set of all nodes which have a flux applied */
- set<int> fluxNodes_;
+ std::set<int> fluxNodes_;
/** maximum number of iterations used in iterative solve for lambda */
int lambdaMaxIterations_;
private:
// DO NOT define this
Thermostat();
};
/**
* @class ThermostatShapeFunction
* @brief Class for thermostat algorithms using the shape function matrices
* (thermostats have general for of N^T w N lambda = rhs)
*/
class ThermostatShapeFunction : public RegulatorShapeFunction {
public:
ThermostatShapeFunction(Thermostat * thermostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~ThermostatShapeFunction() {};
/** instantiate all needed data */
virtual void construct_transfers();
protected:
// methods
/** set weighting factor for in matrix Nhat^T * weights * Nhat */
virtual void set_weights();
// member data
/** pointer to thermostat object for data */
Thermostat * thermostat_;
/** MD mass matrix */
DIAG_MAN & mdMassMatrix_;
/** pointer to atom velocities */
FundamentalAtomQuantity * atomVelocities_;
/** workspace variables */
DENS_VEC _weightVector_, _maskedWeightVector_;
private:
// DO NOT define this
ThermostatShapeFunction();
};
/**
* @class ThermostatRescale
* @brief Enforces constraint on atomic kinetic energy based on FE temperature
*/
class ThermostatRescale : public ThermostatShapeFunction {
public:
ThermostatRescale(Thermostat * thermostat);
virtual ~ThermostatRescale() {};
/** instantiate all needed data */
virtual void construct_transfers();
/** applies thermostat to atoms in the post-corrector phase */
virtual void apply_post_corrector(double dt);
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
protected:
/** apply solution to atomic quantities */
void apply_to_atoms(PerAtomQuantity<double> * atomVelocities);
/** correct the RHS for complex temperature definitions */
virtual void correct_rhs(DENS_MAT & rhs) {}; // base class does no correction, assuming kinetic definition
/** FE temperature field */
DENS_MAN & nodalTemperature_;
/** construction for prolongation of lambda to atoms */
AtomicVelocityRescaleFactor * atomVelocityRescalings_;
/** workspace variables */
DENS_MAT _rhs_;
private:
// DO NOT define this
ThermostatRescale();
};
/**
* @class ThermostatRescaleMixedKePe
* @brief Enforces constraint on atomic kinetic energy based on FE temperature
* when the temperature is a mix of the KE and PE
*/
class ThermostatRescaleMixedKePe : public ThermostatRescale {
public:
ThermostatRescaleMixedKePe(Thermostat * thermostat);
virtual ~ThermostatRescaleMixedKePe() {};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
protected:
/** correct the RHS for inclusion of the PE */
virtual void correct_rhs(DENS_MAT & rhs);
/** nodal fluctuating potential energy */
DENS_MAN * nodalAtomicFluctuatingPotentialEnergy_;
/** fraction of temperature from KE */
double keMultiplier_;
/** fraction of temperature from PE */
double peMultiplier_;
private:
// DO NOT define this
ThermostatRescaleMixedKePe();
};
/**
* @class ThermostatGlcFs
* @brief Class for thermostat algorithms based on Gaussian least constraints (GLC) for fractional step (FS) algorithsm
*/
class ThermostatGlcFs : public ThermostatShapeFunction {
public:
ThermostatGlcFs(Thermostat * thermostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~ThermostatGlcFs() {};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
/** applies thermostat to atoms in the predictor phase */
virtual void apply_pre_predictor(double dt);
/** applies thermostat to atoms in the pre-corrector phase */
virtual void apply_pre_corrector(double dt);
/** applies thermostat to atoms in the post-corrector phase */
virtual void apply_post_corrector(double dt);
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
/* flag for performing the full lambda prediction calculation */
bool full_prediction();
protected:
// methods
/** determine mapping from all nodes to those to which the thermostat applies */
void compute_rhs_map();
/** sets up appropriate rhs for thermostat equations */
virtual void set_thermostat_rhs(DENS_MAT & rhs,
double dt) = 0;
/** apply forces to atoms */
virtual void apply_to_atoms(PerAtomQuantity<double> * atomicVelocity,
const DENS_MAN * nodalAtomicEnergy,
const DENS_MAT & lambdaForce,
DENS_MAT & nodalAtomicLambdaPower,
double dt);
/** add contributions from thermostat to FE energy */
virtual void add_to_energy(const DENS_MAT & nodalLambdaPower,
DENS_MAT & deltaEnergy,
double dt) = 0;
/* sets up and solves the linear system for lambda */
virtual void compute_lambda(double dt,
bool iterateSolution = true);
/** solves the non-linear equation for lambda iteratively */
void iterate_lambda(const MATRIX & rhs);
// member data
/** reference to AtC FE temperature */
DENS_MAN & temperature_;
/** pointer to a time filtering object */
TimeFilter * timeFilter_;
/** power induced by lambda */
DENS_MAN * nodalAtomicLambdaPower_;
/** filtered lambda power */
DENS_MAN * lambdaPowerFiltered_;
/** atomic force induced by lambda */
AtomicThermostatForce * atomThermostatForces_;
/** pointer to atom masses */
FundamentalAtomQuantity * atomMasses_;
/** pointer to the values of lambda interpolated to atoms */
DENS_MAN * rhsLambdaSquared_;
/** hack to determine if first timestep has been passed */
bool isFirstTimestep_;
/** maximum number of iterations used in iterative solve for lambda */
int lambdaMaxIterations_;
/** nodal atomic energy */
DENS_MAN * nodalAtomicEnergy_;
/** local version of velocity used as predicted final veloctiy */
PerAtomQuantity<double> * atomPredictedVelocities_;
/** predicted nodal atomic energy */
AtfShapeFunctionRestriction * nodalAtomicPredictedEnergy_;
/** pointer for force applied in first time step */
DENS_MAN * firstHalfAtomForces_;
/** FE temperature change from thermostat during predictor phase in second half of timestep */
DENS_MAT deltaEnergy1_;
/** FE temperature change from thermostat during corrector phase in second half of timestep */
DENS_MAT deltaEnergy2_;
/** right-hand side data for thermostat equation */
DENS_MAT rhs_;
/** mapping from all to regulated nodes */
DENS_MAT rhsMap_;
/** fraction of timestep over which constraint is exactly enforced */
double dtFactor_;
// workspace
DENS_MAT _lambdaPowerOutput_; // power applied by lambda in output format
DENS_MAT _velocityDelta_; // change in velocity when lambda force is applied
DENS_VEC _lambdaOverlap_; // lambda in MD overlapping FE nodes
DENS_MAT _lambdaOld_; // lambda from previous iteration
DENS_MAT _rhsOverlap_; // normal RHS vector mapped to overlap nodes
DENS_VEC _rhsTotal_; // normal + 2nd order RHS for the iteration loop
private:
// DO NOT define this
ThermostatGlcFs();
};
/**
* @class ThermostatFlux
* @brief Class enforces GLC on atomic forces based on FE power when using fractional step time integration
*/
class ThermostatFlux : public ThermostatGlcFs {
public:
ThermostatFlux(Thermostat * thermostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~ThermostatFlux() {};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
protected:
/** sets up appropriate rhs for thermostat equations */
virtual void set_thermostat_rhs(DENS_MAT & rhs,
double dt);
/** add contributions from thermostat to FE energy */
virtual void add_to_energy(const DENS_MAT & nodalLambdaPower,
DENS_MAT & deltaEnergy,
double dt);
/** sets up the transfer which is the set of nodes being regulated */
virtual void construct_regulated_nodes();
// data
/** reference to ATC sources coming from prescribed data, AtC coupling, and extrinsic coupling */
DENS_MAN & heatSource_;
private:
// DO NOT define this
ThermostatFlux();
};
/**
* @class ThermostatFixed
* @brief Class enforces GLC on atomic forces based on FE power when using fractional step time integration
*/
class ThermostatFixed : public ThermostatGlcFs {
public:
ThermostatFixed(Thermostat * thermostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~ThermostatFixed() {};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
/** applies thermostat to atoms in the predictor phase */
virtual void apply_pre_predictor(double dt);
/** applies thermostat to atoms in the pre-corrector phase */
virtual void apply_pre_corrector(double dt);
/** applies thermostat to atoms in the post-corrector phase */
virtual void apply_post_corrector(double dt);
/** compute boundary flux, requires thermostat input since it is part of the coupling scheme */
virtual void compute_boundary_flux(FIELDS & fields)
{boundaryFlux_[TEMPERATURE] = 0.;};
/** determine if local shape function matrices are needed */
virtual bool use_local_shape_functions() const {return atomicRegulator_->use_localized_lambda();};
protected:
// methods
/** initialize data for tracking the change in nodal atomic temperature */
virtual void initialize_delta_nodal_atomic_energy(double dt);
/** compute the change in nodal atomic temperature */
virtual void compute_delta_nodal_atomic_energy(double dt);
/** sets up appropriate rhs for thermostat equations */
virtual void set_thermostat_rhs(DENS_MAT & rhs,
double dt);
/** add contributions from thermostat to FE energy */
virtual void add_to_energy(const DENS_MAT & nodalLambdaPower,
DENS_MAT & deltaEnergy,
double dt);
/* sets up and solves the linear system for lambda */
virtual void compute_lambda(double dt,
bool iterateSolution = true);
/** flag for halving the applied force to mitigate numerical errors */
bool halve_force();
/** sets up the transfer which is the set of nodes being regulated */
virtual void construct_regulated_nodes();
// data
/** change in FE energy over a timestep */
DENS_MAT deltaFeEnergy_;
/** initial FE energy used to compute change */
DENS_MAT initialFeEnergy_;
/** change in restricted atomic FE energy over a timestep */
DENS_MAT deltaNodalAtomicEnergy_;
/** intial restricted atomic FE energy used to compute change */
DENS_MAT initialNodalAtomicEnergy_;
/** filtered nodal atomic energy */
DENS_MAN nodalAtomicEnergyFiltered_;
/** forces depending on predicted velocities for correct updating with fixed nodes */
AtomicThermostatForce * atomThermostatForcesPredVel_;
/** coefficient to account for effect of time filtering on rhs terms */
double filterCoefficient_;
/** kinetic energy multiplier in total energy (used for temperature expression) */
double keMultiplier_;
// workspace
DENS_MAT _tempNodalAtomicEnergyFiltered_; // stores filtered energy change in atoms for persistence during predictor
private:
// DO NOT define this
ThermostatFixed();
};
/**
* @class ThermostatFluxFiltered
* @brief Class enforces GLC on atomic forces based on FE power when using fractional step time integration
* in conjunction with time filtering
*/
class ThermostatFluxFiltered : public ThermostatFlux {
public:
ThermostatFluxFiltered(Thermostat * thermostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~ThermostatFluxFiltered() {};
/** pre-run initialization of method data */
virtual void initialize();
/** applies thermostat to atoms in the post-corrector phase */
virtual void apply_post_corrector(double dt);
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
protected:
/** sets up appropriate rhs for thermostat equations */
virtual void set_thermostat_rhs(DENS_MAT & rhs,
double dt);
/** add contributions from thermostat to FE energy */
virtual void add_to_energy(const DENS_MAT & nodalLambdaPower,
DENS_MAT & deltaEnergy,
double dt);
// data
/** heat source time history required to get instantaneous heat sources */
DENS_MAT heatSourceOld_;
DENS_MAT instantHeatSource_;
DENS_MAT timeStepSource_;
private:
// DO NOT define this
ThermostatFluxFiltered();
};
/**
* @class ThermostatFixedFiltered
* @brief Class for thermostatting using the temperature matching constraint and is compatible with
the fractional step time-integration with time filtering
*/
class ThermostatFixedFiltered : public ThermostatFixed {
public:
ThermostatFixedFiltered(Thermostat * thermostat,
- const string & regulatorPrefix = "");
+ const std::string & regulatorPrefix = "");
virtual ~ThermostatFixedFiltered() {};
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
protected:
// methods
/** initialize data for tracking the change in nodal atomic temperature */
virtual void initialize_delta_nodal_atomic_energy(double dt);
/** compute the change in nodal atomic temperature */
virtual void compute_delta_nodal_atomic_energy(double dt);
/** sets up appropriate rhs for thermostat equations */
virtual void set_thermostat_rhs(DENS_MAT & rhs,
double dt);
/** add contributions from thermostat to temperature for uncoupled nodes */
virtual void add_to_energy(const DENS_MAT & nodalLambdaPower,
DENS_MAT & deltaEnergy,
double dt);
private:
// DO NOT define this
ThermostatFixedFiltered();
};
/**
* @class ThermostatFluxFixed
* @brief Class for thermostatting using the temperature matching constraint one one set of nodes and the flux matching constraint on another
*/
class ThermostatFluxFixed : public RegulatorMethod {
public:
ThermostatFluxFixed(Thermostat * thermostat,
bool constructThermostats = true);
virtual ~ThermostatFluxFixed();
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
/** applies thermostat to atoms in the predictor phase */
virtual void apply_pre_predictor(double dt);
/** applies thermostat to atoms in the pre-corrector phase */
virtual void apply_pre_corrector(double dt);
/** applies thermostat to atoms in the post-corrector phase */
virtual void apply_post_corrector(double dt);
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
/** compute boundary flux, requires thermostat input since it is part of the coupling scheme */
virtual void compute_boundary_flux(FIELDS & fields)
{thermostatBcs_->compute_boundary_flux(fields);};
protected:
// data
/** thermostat for imposing the fluxes */
ThermostatFlux * thermostatFlux_;
/** thermostat for imposing fixed nodes */
ThermostatFixed * thermostatFixed_;
/** pointer to whichever thermostat should compute the flux, based on coupling method */
ThermostatGlcFs * thermostatBcs_;
private:
// DO NOT define this
ThermostatFluxFixed();
};
/**
* @class ThermostatFluxFixedFiltered
* @brief Class for thermostatting using the temperature matching constraint one one set of nodes and the flux matching constraint on another with time filtering
*/
class ThermostatFluxFixedFiltered : public ThermostatFluxFixed {
public:
ThermostatFluxFixedFiltered(Thermostat * thermostat);
virtual ~ThermostatFluxFixedFiltered(){};
private:
// DO NOT define this
ThermostatFluxFixedFiltered();
};
/**
* @class ThermostatGlc
* @brief Class for thermostat algorithms based on Gaussian least constraints (GLC)
*/
class ThermostatGlc : public ThermostatShapeFunction {
public:
ThermostatGlc(Thermostat * thermostat);
virtual ~ThermostatGlc() {};
/** instantiate all needed data */
virtual void construct_transfers();
protected:
// methods
/** apply forces to atoms */
virtual void apply_to_atoms(PerAtomQuantity<double> * atomicVelocity,
const DENS_MAT & lambdaForce,
double dt);
// member data
/** pointer to a time filtering object */
TimeFilter * timeFilter_;
/** filtered lambda power */
DENS_MAN * lambdaPowerFiltered_;
/** atomic force induced by lambda */
PerAtomQuantity<double> * atomThermostatForces_;
/** pointer to access prescribed data for fixed nodes */
PrescribedDataManager * prescribedDataMgr_;
/** pointer to atom masses */
FundamentalAtomQuantity * atomMasses_;
/** workspace variables */
DENS_MAT _velocityDelta_;
private:
// DO NOT define this
ThermostatGlc();
};
/**
* @class ThermostatPowerVerlet
* @brief Class for thermostatting using the heat flux matching constraint and is compatible with
the Gear time-integration
*/
class ThermostatPowerVerlet : public ThermostatGlc {
public:
ThermostatPowerVerlet(Thermostat * thermostat);
virtual ~ThermostatPowerVerlet() {};
/** instantiate all needed data */
virtual void construct_transfers();
/** pre-run initialization of method data */
virtual void initialize();
/** applies thermostat to atoms in the predictor phase */
virtual void apply_pre_predictor(double dt);
/** applies thermostat to atoms in the pre-corrector phase */
virtual void apply_pre_corrector(double dt);
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
/** final tasks of a run */
virtual void finish();
/** determine if local shape function matrices are needed */
virtual bool use_local_shape_functions() const {return (!(atomicRegulator_->use_lumped_lambda_solve()) && atomicRegulator_->use_localized_lambda());};
protected:
/** nodal temperature rate of change */
DENS_MAN & nodalTemperatureRoc_;
/** reference to ATC sources coming from prescribed data, AtC coupling, and extrinsic coupling */
DENS_MAN & heatSource_;
/** pointer to nodal atomic power */
DENS_MAN * nodalAtomicPower_;
/** power applied to each atom by lambda force */
AtfShapeFunctionRestriction * nodalAtomicLambdaPower_;
/** workspace variables */
DENS_MAT _rhs_;
/** sets up and solves thermostat equations */
virtual void compute_thermostat(double dt);
/** sets up appropriate rhs for thermostat equations */
virtual void set_thermostat_rhs(DENS_MAT & rhs_nodes);
/** add contributions (if any) to the finite element right-hand side */
virtual void add_to_rhs(FIELDS & rhs);
// workspace
DENS_MAT _nodalAtomicLambdaPowerOut_; // power induced by lambda in output format
private:
// DO NOT define this
ThermostatPowerVerlet();
};
/**
* @class ThermostatHooverVerlet
* @brief Classfor thermostatting using the temperature matching constraint and is compatible with
Gear time-integration
*/
class ThermostatHooverVerlet : public ThermostatPowerVerlet {
public:
ThermostatHooverVerlet(Thermostat * thermostat);
virtual ~ThermostatHooverVerlet() {};
/** instantiate all needed data */
virtual void construct_transfers();
/** final tasks of a run */
virtual void finish() {};
/** compute boundary flux, requires thermostat input since it is part of the coupling scheme */
virtual void compute_boundary_flux(FIELDS & fields)
{boundaryFlux_[TEMPERATURE] = 0.;};
protected:
/** lambda coupling parameter for hoover thermostat */
DENS_MAN * lambdaHoover_;
/** workspace variables */
DENS_MAT _myNodalLambdaPower_;
/** sets up and solves thermostat equations */
virtual void compute_thermostat(double dt);
/** sets up Hoover component of the thermostat */
void set_hoover_rhs(DENS_MAT & rhs);
/** add Hoover contributions to lambda power */
void add_to_lambda_power(const DENS_MAT & myLambdaForce,
double dt);
/** power applied to each atom by hoover lambda force */
AtfShapeFunctionRestriction * nodalAtomicHooverLambdaPower_;
/** add contributions (if any) to the finite element right-hand side */
virtual void add_to_rhs(FIELDS & rhs);
private:
// DO NOT implement this
ThermostatHooverVerlet();
};
/**
* @class ThermostatPowerVerletFiltered
* @brief Class for thermostatting using the heat flux matching constraint and is compatible with
Gear time-integration with time filtering
*/
class ThermostatPowerVerletFiltered : public ThermostatPowerVerlet {
public:
ThermostatPowerVerletFiltered(Thermostat * thermostat);
virtual ~ThermostatPowerVerletFiltered(){};
/** get data for output */
virtual void output(OUTPUT_LIST & outputData);
/** compute boundary flux, requires thermostat input since it is part of the coupling scheme */
virtual void compute_boundary_flux(FIELDS & fields);
protected:
/** sets up appropriate rhs for thermostat equations */
virtual void set_thermostat_rhs(DENS_MAT & rhs_nodes);
/** add contributions (if any) to the finite element right-hand side */
virtual void add_to_rhs(FIELDS & rhs);
/** nodal temperature 2nd rate of change (i.e. second time derivative) */
DENS_MAN & nodalTemperature2Roc_;
/** reference to ATC rate of change sources coming from prescribed data, AtC coupling, and extrinsic coupling */
DENS_MAN heatSourceRoc_;
/** references to ATC field rates of changing for inverting the filtered heat sources */
FIELDS & fieldsRoc_;
/** flux rate of changes for inverting filtered fluxes */
FIELDS fluxRoc_;
/** time scale for the time filter */
double filterScale_;
private:
// DO NOT define this
ThermostatPowerVerletFiltered();
};
/**
* @class ThermostatHooverVerletFiltered
* @brief Class for thermostatting using the temperature matching constraint and is compatible with
Gear time-integration with time filtering
*/
class ThermostatHooverVerletFiltered : public ThermostatPowerVerletFiltered {
public:
ThermostatHooverVerletFiltered(Thermostat * thermostat);
virtual ~ThermostatHooverVerletFiltered() {};
/** instantiate all needed data */
virtual void construct_transfers();
/** final tasks of a run */
virtual void finish() {};
/** compute boundary flux, requires thermostat input since it is part of the coupling scheme */
virtual void compute_boundary_flux(FIELDS & fields)
{boundaryFlux_[TEMPERATURE] = 0.;};
protected:
/** lambda coupling parameter for hoover thermostat */
DENS_MAN * lambdaHoover_;
/** workspace variables */
DENS_MAT _myNodalLambdaPower_;
/** sets up and solves thermostat equations */
virtual void compute_thermostat(double dt);
/** sets up Hoover component of the thermostat */
void set_hoover_rhs(DENS_MAT & rhs);
/** add Hoover contributions to lambda power */
void add_to_lambda_power(const DENS_MAT & myLambdaForce,
double dt);
/** power applied to each atom by hoover lambda force */
DENS_MAN * nodalAtomicHooverLambdaPower_;
/** add contributions (if any) to the finite element right-hand side */
virtual void add_to_rhs(FIELDS & rhs);
private:
// DO NOT implement this
ThermostatHooverVerletFiltered();
};
};
#endif
diff --git a/lib/atc/TimeFilter.cpp b/lib/atc/TimeFilter.cpp
index 8580bb108..cb6aff9be 100644
--- a/lib/atc/TimeFilter.cpp
+++ b/lib/atc/TimeFilter.cpp
@@ -1,380 +1,382 @@
#include "ATC_Transfer.h"
#include "TimeFilter.h"
+using std::set;
+
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterManager
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilterManager::TimeFilterManager(ATC_Method * atc) :
atc_(atc),
filterType_(NO_FILTER),
filterScale_(0.),
useFilter_(false),
equilibrateFilter_(false),
needReset_(true),
endEquilibrate_(false)
{
// do nothing
}
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilterManager::~TimeFilterManager()
{
set<TimeFilter * >::iterator it;
for (it = timeFilterSet_.begin(); it != timeFilterSet_.end(); it++)
if (*it) delete *it;
}
//--------------------------------------------------------
// modify
// parses input commands
//--------------------------------------------------------
bool TimeFilterManager::modify(int narg, char ** arg)
{
bool foundMatch = false;
// filter scale size
/*! \page man_filter_scale fix_modify AtC filter scale
\section syntax
fix_modify AtC filter scale <scale> \n
- scale (real) = characteristic time scale of the filter \n
\section examples
<TT> fix_modify AtC filter scale 10.0 </TT> \n
\section description
Filters the MD dynamics to construct a more appropriate continuous field. Equilibrating first filters the time derivatives without changing the dynamics to provide a better initial condition to the filtered dynamics
\section restrictions
only for be used with specific transfers:
thermal, two_temperature
\section related
\ref man_time_filter
\ref man_filter_type
\section default
0.
*/
if (strcmp(arg[0],"scale")==0) {
filterScale_ = atof(arg[1]);
if (filterScale_<=0.)
throw ATC_Error("Bad filtering time scale");
foundMatch = true;
}
// time filtering activation switch
/*! \page man_time_filter fix_modify AtC filter
\section syntax
fix_modify AtC filter <on | off | equilibrate> \n
- on | off (keyword) = turns filter on or off\n
- equilibrate = runs dynamics without filtering but initializes filtered quantities
\section examples
<TT> fix_modify atc transfer filter on </TT> \n
\section description
Filters the MD dynamics to construct a more appropriate continuous field. Equilibrating first filters the time derivatives without changing the dynamics to provide a better initial condition to the filtered dynamics
\section restrictions
only for be used with specific transfers:
thermal, two_temperature
\section related
\ref man_filter_scale \n
\ref man_equilibrium_start
\section default
off
*/
else if (strcmp(arg[0],"on")==0) {
if (filterScale_<=0. && filterType_ != STEP_FILTER)
throw ATC_Error("Filtering time scale not initialized");
useFilter_ = true;
if (!equilibrateFilter_) {
needReset_ = true;
endEquilibrate_ = false;
}
else {
endEquilibrate_ = true;
}
equilibrateFilter_ = false;
foundMatch = true;
}
else if (strcmp(arg[0],"off")==0) {
useFilter_ = false;
equilibrateFilter_ = false;
endEquilibrate_ = false;
needReset_ = true;
foundMatch = true;
}
else if (strcmp(arg[0],"equilibrate")==0) {
if (filterScale_<=0. && filterType_ != STEP_FILTER)
throw ATC_Error("Filtering time scale not initialized");
equilibrateFilter_ = true;
endEquilibrate_ = false;
useFilter_ = false;
needReset_ = true;
foundMatch = true;
}
// filter type
/*! \page man_filter_type fix_modify AtC filter type
\section syntax
- fix_modify AtC filter type <exponential | no_filter> \n
+ fix_modify AtC filter type <exponential | step | no_filter> \n
\section examples
<TT> fix_modify AtC filter type exponential </TT> \n
\section description
Specifies the type of time filter used.
\section restrictions
only for be used with specific transfers:
thermal, two_temperature
\section related
\ref man_time_filter
\ref man_filter_scale
\section default
No default.
*/
else if (strcmp(arg[0],"type")==0) {
if (strcmp(arg[1],"exponential")==0) {
filterType_ = EXPONENTIAL_FILTER;
}
else if (strcmp(arg[1],"step")==0) {
filterType_ = STEP_FILTER;
}
else if (strcmp(arg[1],"no_filter")==0) {
filterType_ = NO_FILTER;
}
else throw ATC_Error("Not a supported time filter type");
foundMatch = true;
}
return foundMatch;
}
//--------------------------------------------------------
// initialize
// filter set up before a run
//--------------------------------------------------------
void TimeFilterManager::initialize()
{
needReset_ = false;
endEquilibrate_ = false;
}
//--------------------------------------------------------
// construct
// instantiates the filter
//--------------------------------------------------------
TimeFilter * TimeFilterManager::construct(const FilterIntegrationType intType)
{
TimeFilter * newTimeFilter;
if (useFilter_ || equilibrateFilter_) {
if (filterType_ == EXPONENTIAL_FILTER) {
if (intType == IMPLICIT_EXPLICIT) {
newTimeFilter = new TimeFilterImplicitExplicit(*this);
}
else if (intType == EXPLICIT_IMPLICIT) {
newTimeFilter = new TimeFilterExplicitImplicit(*this);
}
else if (intType == EXPLICIT) {
newTimeFilter = new TimeFilterExplicit(*this);
}
else if (intType == IMPLICIT) {
newTimeFilter = new TimeFilterImplicit(*this);
}
else if (intType == IMPLICIT_UPDATE) {
newTimeFilter = new TimeFilterImplicitUpdate(*this);
}
else if (intType == CRANK_NICHOLSON) {
newTimeFilter = new TimeFilterCrankNicolson(*this);
}
else { // default to return base class
newTimeFilter = new TimeFilter(*this);
}
}
else if (filterType_ == STEP_FILTER) {
newTimeFilter = new TimeFilterStep(*this);
}
}
else { // default to return base class
newTimeFilter = new TimeFilter(*this);
}
timeFilterSet_.insert(newTimeFilter);
return newTimeFilter;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilter
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilter::TimeFilter(TimeFilterManager & timeFilterManager) :
atc_(timeFilterManager.atc()),
filterScale_(timeFilterManager.filter_scale())
{
// do nothing
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterExponential
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilterExponential::TimeFilterExponential(TimeFilterManager & timeFilterManager) :
TimeFilter(timeFilterManager)
{
TimeFilter::filterType_ = TimeFilterManager::EXPONENTIAL_FILTER;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterCrankNicoslon
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilterCrankNicolson::TimeFilterCrankNicolson(TimeFilterManager & timeFilterManager) :
TimeFilterExponential(timeFilterManager)
{
// do nothing
}
//--------------------------------------------------------
// initialize
// resets memory as needed
//--------------------------------------------------------
void TimeFilterCrankNicolson::initialize(const MATRIX & target)
{
TimeFilterExponential::initialize(target);
unFilteredQuantityOld_.reset(target.nRows(),target.nCols());
unFilteredQuantityOld_ = target;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterExplicit
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilterExplicit::TimeFilterExplicit(TimeFilterManager & timeFilterManager) :
TimeFilterExponential(timeFilterManager)
{
// do nothing
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterImplicit
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilterImplicit::TimeFilterImplicit(TimeFilterManager & timeFilterManager) :
TimeFilterExponential(timeFilterManager)
{
// do nothing
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterImplicitExplicit
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilterImplicitExplicit::TimeFilterImplicitExplicit(TimeFilterManager & timeFilterManager) :
TimeFilterExponential(timeFilterManager)
{
// do nothing
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterExplicitImplicit
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilterExplicitImplicit::TimeFilterExplicitImplicit(TimeFilterManager & timeFilterManager) :
TimeFilterExponential(timeFilterManager)
{
// do nothing
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterImplicitUpdate
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilterImplicitUpdate::TimeFilterImplicitUpdate(TimeFilterManager & timeFilterManager) :
TimeFilterExponential(timeFilterManager)
{
// do nothing
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterStep
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeFilterStep::TimeFilterStep(TimeFilterManager & timeFilterManager) :
TimeFilter(timeFilterManager),
elapsedTime_(0.0)
{
// do nothing
}
//--------------------------------------------------------
// initialize
// resets memory as needed
//--------------------------------------------------------
void TimeFilterStep::initialize(const MATRIX & target)
{
TimeFilter::initialize(target);
unFilteredQuantityOld_.reset(target.nRows(),target.nCols());
unFilteredQuantityOld_ = target;
}
};
diff --git a/lib/atc/TimeFilter.h b/lib/atc/TimeFilter.h
index 06a88b40c..976884eb9 100644
--- a/lib/atc/TimeFilter.h
+++ b/lib/atc/TimeFilter.h
@@ -1,768 +1,769 @@
// The type of filter used should be determined by the
// integrator since filtering much match the time integration scheme
#ifndef TIME_FILTER_H
#define TIME_FILTER_H
+#include <set>
+
#include "ATC_TypeDefs.h"
#include "MatrixLibrary.h"
#include "ATC_Error.h"
-using namespace std;
namespace ATC {
// forward declarations
class ATC_Method;
class TimeFilter;
/**
* @class TimeFilterManager
* @brief Handles parsing and parameter storage for time filters
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterManager
//--------------------------------------------------------
//--------------------------------------------------------
class TimeFilterManager {
public:
/** enumeration for the functional form underlying the filter */
enum TimeFilterType {
NO_FILTER=0, // default
EXPONENTIAL_FILTER,
STEP_FILTER
};
/** enumeration for the functional form underlying the filter */
enum FilterIntegrationType {
INSTANTANEOUS=0, //default
CRANK_NICHOLSON,
IMPLICIT_EXPLICIT,
EXPLICIT_IMPLICIT,
EXPLICIT,
IMPLICIT,
IMPLICIT_UPDATE
};
// constructor
TimeFilterManager(ATC_Method * atc);
// destructor
~TimeFilterManager();
/** parser/modifier */
bool modify(int narg, char **arg);
/** pre time integration */
void initialize();
/** get filter base function */
TimeFilterType filter_type() const {return filterType_;};
/** return filtering time scale */
double filter_scale() const {return filterScale_;};
/** check if dynamics should be filtering */
bool filter_dynamics() const {return useFilter_;};
/** check if variables should be filtered */
bool filter_variables() const {return (useFilter_ || equilibrateFilter_);};
/** flag for if reset is needed */
bool need_reset() const {return needReset_;};
/** flag if ending equilibration */
bool end_equilibrate() const {return endEquilibrate_;};
/** get pointer to ATC transfer methods */
ATC_Method * atc() {return atc_;};
/** construct the appropriate time filter */
TimeFilter * construct(const FilterIntegrationType type = CRANK_NICHOLSON);
protected:
TimeFilterManager(){};
/** pointer to access ATC methods */
ATC_Method * atc_;
/** description of underlying function form of filter */
TimeFilterType filterType_;
/** filtering time scale */
double filterScale_;
/** flag to see if filtering is active */
bool useFilter_;
/** flag to see if we are equilibrating the filtered variables */
bool equilibrateFilter_;
/** flag to reset data */
bool needReset_;
/** flag to denote switch from equilibration to integration */
bool endEquilibrate_;
/** set to store all time filters for later deletion */
- set<TimeFilter * > timeFilterSet_;
+ std::set<TimeFilter * > timeFilterSet_;
};
/**
* @class TimeFilter
* @brief Base class for various temporal filters of atomistic quantities
* default behavior is no filter
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilter
//--------------------------------------------------------
//--------------------------------------------------------
class TimeFilter {
public:
// constructor
TimeFilter(TimeFilterManager & timeFilterManager);
// destructor
virtual ~TimeFilter(){};
/** pre time integration */
virtual void initialize(){};
/** pre time integration with a target for an initial condition */
virtual void initialize(const MATRIX & target){initialize();};
/** Step 1:
apply first step in a time filter update in the pre integration phase */
virtual void apply_pre_step1(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt)
{ TimeFilter::unFilteredQuantityOld_ = unFilteredQuantity;}
/** Step 2:
apply second step in a time filter update in pre integration phase */
virtual void apply_pre_step2(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt) {};
/** Step 3:
apply first step in a time filter update in post integration phase */
virtual void apply_post_step1(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt)
{ filteredQuantity = unFilteredQuantity;};
/** Step 4:
apply second step in a time filter update in post integration phase */
virtual void apply_post_step2(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt)
{ filteredQuantity = unFilteredQuantity;}
/** coefficient multipling unfiltered terms in apply_pre_step1 method */
virtual double unfiltered_coefficient_pre_s1(double dt){return 0.;};
/** coefficient multipling old filtered terms in apply_pre_step1 method */
virtual double filtered_coefficient_pre_s1(double dt){return 0.;};
/** coefficient multipling unfiltered terms in apply_post_step1 method */
virtual double unfiltered_coefficient_post_s1(double dt){return 0.;};
/** coefficient multipling old filtered terms in apply_post_step1 method */
virtual double filtered_coefficient_post_s1(double dt){return 0.;};
/** coefficient multipling unfiltered terms in apply_pre_step2 method */
virtual double unfiltered_coefficient_pre_s2(double dt){return 0.;};
/** coefficient multipling old filtered terms in apply_pre_step2 method */
virtual double filtered_coefficient_pre_s2(double dt){return 0.;};
/** coefficient multipling unfiltered terms in apply_post_step2 method */
virtual double unfiltered_coefficient_post_s2(double dt){return 0.;};
/** coefficient multipling old filtered terms in apply_post_step2 method */
virtual double filtered_coefficient_post_s2(double dt){return 0.;};
/** rate of filtered quantity to be called in post integration phase */
virtual void rate(MATRIX & rate,
const MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt = 0.0)
{ rate = 1/dt*(unFilteredQuantity - TimeFilter::unFilteredQuantityOld_);};
protected:
TimeFilter(){};
/** pointer to access ATC methods */
ATC_Method * atc_;
/** filtering time scale */
double filterScale_;
/** filter type */
TimeFilterManager::TimeFilterType filterType_;
/** member data to track old unfiltered values */
DENS_MAT unFilteredQuantityOld_;
};
/**
* @class TimeFilterExponential
* @brief Base class for filters using an exponential kernel,
* derived classes implement specific integration schemes
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterExponential
//--------------------------------------------------------
//--------------------------------------------------------
class TimeFilterExponential : public TimeFilter {
public:
// constructor
TimeFilterExponential(TimeFilterManager & timeFilterManager);
// destructor
virtual ~TimeFilterExponential(){};
/** apply first step in a time filter update in the pre integration phase */
virtual void apply_pre_step1(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt) {};
/** apply second step in a time filter update in pre integration phase */
virtual void apply_pre_step2(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt) {};
/** apply first step in a time filter update in post integration phase */
virtual void apply_post_step1(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt) {};
/** apply second step in a time filter update in post integration phase */
virtual void apply_post_step2(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt) {};
/** time rate of filtered quantity */
virtual void rate(MATRIX & rate,
const MATRIX & filteredQuantity,
const MATRIX & unfilteredQuantity,
double dt = 0)
{ double tau = TimeFilter::filterScale_;
rate = 1/tau*(unfilteredQuantity - filteredQuantity); };
protected:
TimeFilterExponential(){};
//--------------------------------------------------------
//--------------------------------------------------------
// filter integration functions not associated
// with any particular class
//--------------------------------------------------------
//--------------------------------------------------------
void update_filter(MATRIX & filteredQuantity,
const MATRIX & unfilteredQuantity,
MATRIX & unfilteredQuantityOld,
double tau,
double dt)
{
filteredQuantity *= 1./(1./dt+1./(2*tau))*((1./dt-1./(2*tau)));
filteredQuantity += 1./(1./dt+1./(2*tau))*( 1./(2*tau)*(unfilteredQuantity+unfilteredQuantityOld));
unfilteredQuantityOld = unfilteredQuantity;
}
void add_to_filter(MATRIX & filteredQuantity,
const MATRIX & unfilteredQuantity,
MATRIX & unfilteredQuantityOld,
double tau,
double dt)
{
filteredQuantity += 1./(1./dt+1./(2.*tau))*( 1./(2.*tau))*unfilteredQuantity;
unfilteredQuantityOld += unfilteredQuantity;
};
double unfiltered_coef(double tau, double dt)
{ return 1./(1./dt+1./(2.*tau))*( 1./(2.*tau)); };
double filtered_coef(double tau, double dt)
{ return 1./(1./dt+1./(2.*tau))*( 1./dt-1./(2*tau) ); };
void update_filter_implicit(MATRIX & filteredQuantity,
const MATRIX & unfilteredQuantity,
double tau,
double dt)
{
filteredQuantity /= 1.0 + dt/tau;
filteredQuantity += (dt)/(tau+dt)*unfilteredQuantity;
}
void add_to_filter_implicit(MATRIX & filteredQuantity,
const MATRIX & unfilteredQuantity,
double tau,
double dt)
{ filteredQuantity += (1./(1.+dt/tau))*(dt/tau)*unfilteredQuantity; };
double unfiltered_coef_implicit(double tau, double dt)
{ return (1./(1.+dt/tau))*(dt/tau); };
double filtered_coef_implicit(double tau, double dt)
{ return (1./(1.+dt/tau)); };
void update_filter_explicit(MATRIX & filteredQuantity,
const MATRIX & unfilteredQuantity,
double tau,
double dt)
{
filteredQuantity *= (1.-(dt/tau));
filteredQuantity += (dt/tau)*unfilteredQuantity;
}
void add_to_filter_explicit(MATRIX & filteredQuantity,
const MATRIX & unfilteredQuantity,
double tau,
double dt)
{ filteredQuantity += (dt/tau)*unfilteredQuantity; };
double unfiltered_coef_explicit(double tau, double dt)
{ return (dt/tau); };
double filtered_coef_explicit(double tau, double dt)
{ return (1.-(dt/tau)); };
};
/**
* @class TimeFilterCrankNicolson
* @brief Time Filter using Crank-Nicolson advancement of filtered quantity ODE's
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterCrankNicolson
//--------------------------------------------------------
//--------------------------------------------------------
class TimeFilterCrankNicolson : public TimeFilterExponential {
public:
// constructor
TimeFilterCrankNicolson(TimeFilterManager & timeFilterManager);
// destructor
virtual ~TimeFilterCrankNicolson(){};
/** pre time integration */
virtual void initialize(){throw ATC_Error("TimeFilterCrankNicolson::initialize() an initial condition is required for this time filter");};
/** pre time integration with an initial condition */
virtual void initialize(const MATRIX & target);
/** applies first step in a time filter update in the pre integration phase */
virtual void apply_pre_step1(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ update_filter(filteredQuantity,unFilteredQuantity,unFilteredQuantityOld_,TimeFilter::filterScale_,dt); };
/** applies first step in a time filter update after the pre integration phase */
virtual void apply_post_step1(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ add_to_filter(filteredQuantity,unFilteredQuantity,unFilteredQuantityOld_,TimeFilter::filterScale_,dt); };
/** applies second step in a time filter update in the post integration phase */
virtual void apply_post_step2(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ update_filter(filteredQuantity,unFilteredQuantity,unFilteredQuantityOld_,TimeFilter::filterScale_,dt); };
/** return coefficient multipling unfiltered terms in the apply_pre_step1 method */
virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef(TimeFilter::filterScale_,dt);};
/** return coefficient multipling old filtered terms in the apply_pre_step1 method */
virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef(TimeFilter::filterScale_,dt);};
/** return coefficient multipling unfiltered terms in the apply_post_step2 method */
virtual double unfiltered_coefficient_post_s2(double dt){return unfiltered_coef(TimeFilter::filterScale_,dt);};
/** return coefficient multipling old filtered terms in the apply_post_step2 method */
virtual double filtered_coefficient_post_s2(double dt){return filtered_coef(TimeFilter::filterScale_,dt);};
protected:
TimeFilterCrankNicolson();
};
/**
* @class TimeFilterExplicit
* @brief Time Filter using explicit advancement of filtered quantity ODE's
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterExplicit
//--------------------------------------------------------
//--------------------------------------------------------
class TimeFilterExplicit : public TimeFilterExponential {
public:
// constructor
TimeFilterExplicit(TimeFilterManager & timeFilterManager);
// destructor
virtual ~TimeFilterExplicit(){};
/** applies first step in a time filter update in the pre integration phase */
virtual void apply_pre_step1(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{update_filter_explicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); };
/** applies first step in a time filter update after the pre integration phase */
virtual void apply_post_step1(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ add_to_filter_explicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); };
/** applies second step in a time filter update in the post integration phase */
virtual void apply_post_step2(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ update_filter_explicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); };
/** return coefficient multipling unfiltered terms in the apply_pre_step1 method */
virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef_explicit(TimeFilter::filterScale_,dt);};
/** return coefficient multipling old filtered terms in the apply_pre_step1 method */
virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef_explicit(TimeFilter::filterScale_,dt);};
/** return coefficient multipling unfiltered terms in the apply_post_step2 method */
virtual double unfiltered_coefficient_post_s2(double dt){return unfiltered_coef_explicit(TimeFilter::filterScale_,dt);};
/** return coefficient multipling old filtered terms in the apply_post_step2 method */
virtual double filtered_coefficient_post_s2(double dt){return filtered_coef_explicit(TimeFilter::filterScale_,dt);};
protected:
TimeFilterExplicit();
};
/**
* @class TimeFilterImplicit
* @brief Time Filter using implicit advancement of filtered quantity ODE's
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterImplicit
//--------------------------------------------------------
//--------------------------------------------------------
class TimeFilterImplicit : public TimeFilterExponential {
public:
// constructor
TimeFilterImplicit(TimeFilterManager & timeFilterManager);
// destructor
virtual ~TimeFilterImplicit(){};
/** applies first step in a time filter update in the pre integration phase */
virtual void apply_pre_step1(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ update_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); };
/** applies second step in a time filter update in the post integration phase */
virtual void apply_post_step2(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ update_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); };
/** return coefficient multipling unfiltered terms in the apply_pre_step1 method */
virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,dt);};
/** return coefficient multipling old filtered terms in the apply_pre_step1 method */
virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,dt);};
/** return coefficient multipling unfiltered terms in the apply_post_step2 method */
virtual double unfiltered_coefficient_post_s2(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,dt);};
/** return coefficient multipling old filtered terms in the apply_post_step2 method */
virtual double filtered_coefficient_post_s2(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,dt);};
protected:
TimeFilterImplicit();
};
/**
* @class TimeFilterImplicitExplicit
* @brief Time Filter using two-step implicit/explicit advancement of filtered quantity ODE's
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterImplicitExplicit
//--------------------------------------------------------
//--------------------------------------------------------
class TimeFilterImplicitExplicit : public TimeFilterExponential {
public:
// constructor
TimeFilterImplicitExplicit(TimeFilterManager & timeFilterManager);
// destructor
virtual ~TimeFilterImplicitExplicit(){};
/** applies first step in a time filter update in the pre integration phase */
virtual void apply_pre_step1(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ update_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,0.5*dt); };
/** applies second step in a time filter update in the post integration phase */
virtual void apply_post_step2(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ update_filter_explicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,0.5*dt); };
/** return coefficient multipling unfiltered terms in the apply_pre_step1 method */
virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,0.5*dt);};
/** return coefficient multipling old filtered terms in the apply_pre_step1 method */
virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,0.5*dt);};
/** return coefficient multipling unfiltered terms in the apply_post_step2 method */
virtual double unfiltered_coefficient_post_s2(double dt){return unfiltered_coef_explicit(TimeFilter::filterScale_,0.5*dt);};
/** return coefficient multipling old filtered terms in the apply_post_step2 method */
virtual double filtered_coefficient_post_s2(double dt){return filtered_coef_explicit(TimeFilter::filterScale_,0.5*dt);};
protected:
TimeFilterImplicitExplicit();
};
/**
* @class TimeFilterExplicitImplicit
* @brief Time Filter using two-step explicit/implicit advancement of filtered quantity ODE's
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterExplicitImplicit
//--------------------------------------------------------
//--------------------------------------------------------
class TimeFilterExplicitImplicit : public TimeFilterExponential {
public:
// constructor
TimeFilterExplicitImplicit(TimeFilterManager & timeFilterManager);
// destructor
virtual ~TimeFilterExplicitImplicit(){};
/** applies first step in a time filter update in the pre integration phase */
virtual void apply_pre_step1(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ update_filter_explicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,0.5*dt); };
/** applies first step in a time filter update in the pre integration phase */
virtual void apply_pre_step2(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ add_to_filter_explicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,0.5*dt); };
/** applies second step in a time filter update in the post integration phase */
virtual void apply_post_step1(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ update_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,0.5*dt); };
/** applies second step in a time filter update in the post integration phase */
virtual void apply_post_step2(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ add_to_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,0.5*dt); };
/** return coefficient multipling unfiltered terms in the apply_pre_step1 method */
virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef_explicit(TimeFilter::filterScale_,0.5*dt);};
/** return coefficient multipling old filtered terms in the apply_pre_step1 method */
virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef_explicit(TimeFilter::filterScale_,0.5*dt);};
/** return coefficient multipling unfiltered terms in the apply_post_step2 method */
virtual double unfiltered_coefficient_post_s1(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,0.5*dt);};
/** return coefficient multipling old filtered terms in the apply_post_step2 method */
virtual double filtered_coefficient_post_s1(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,0.5*dt);};
protected:
TimeFilterExplicitImplicit();
};
/**
* @class TimeFilterImplicitUpdate
* @brief Time Filter using implicit advancement of filtered quantity ODE's but adds on contribution at the end of the second step
*/
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterImplicitUpdate
//--------------------------------------------------------
//--------------------------------------------------------
class TimeFilterImplicitUpdate : public TimeFilterExponential {
public:
// constructor
TimeFilterImplicitUpdate(TimeFilterManager & timeFilterManager);
// destructor
virtual ~TimeFilterImplicitUpdate(){};
/** applies first step in a time filter update in the pre integration phase */
virtual void apply_pre_step1(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ update_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); };
/** applies second step in a time filter update in the post integration phase */
virtual void apply_post_step1(MATRIX & filteredQuantity,
MATRIX const & unFilteredQuantity,
double dt)
{ add_to_filter_implicit(filteredQuantity,unFilteredQuantity,TimeFilter::filterScale_,dt); };
/** return coefficient multipling unfiltered terms in the apply_pre_step1 method */
virtual double unfiltered_coefficient_pre_s1(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,dt);};
/** return coefficient multipling old filtered terms in the apply_pre_step1 method */
virtual double filtered_coefficient_pre_s1(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,dt);};
/** return coefficient multipling unfiltered terms in the apply_post_step2 method */
virtual double unfiltered_coefficient_post_s1(double dt){return unfiltered_coef_implicit(TimeFilter::filterScale_,dt);};
/** return coefficient multipling old filtered terms in the apply_post_step2 method */
virtual double filtered_coefficient_post_s1(double dt){return filtered_coef_implicit(TimeFilter::filterScale_,dt);};
protected:
TimeFilterImplicitUpdate();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeFilterStep
//--------------------------------------------------------
//--------------------------------------------------------
class TimeFilterStep : public TimeFilter {
public:
// constructor
TimeFilterStep(TimeFilterManager & timeFilterManager);
// destructor
virtual ~TimeFilterStep(){};
/** pre time integration */
virtual void initialize(const MATRIX & target);
/** apply first step in a time filter update in the pre integration phase */
virtual void apply_pre_step1(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt) {};
/** apply second step in a time filter update in pre integration phase */
virtual void apply_pre_step2(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt) {};
/** apply first step in a time filter update in post integration phase */
virtual void apply_post_step1(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt) {};
/** apply second step in a time filter update in post integration phase */
virtual void apply_post_step2(MATRIX & filteredQuantity,
const MATRIX & unFilteredQuantity,
double dt)
{ update_filter(filteredQuantity, unFilteredQuantity,
TimeFilter::unFilteredQuantityOld_, TimeFilter::filterScale_, dt);
}
/** time rate of filtered quantity */
virtual void rate(MATRIX & rate,
const MATRIX & filteredQuantity,
const MATRIX & unfilteredQuantity,
double dt = 0)
{ rate = 1/elapsedTime_*(unfilteredQuantity - filteredQuantity); }
protected:
TimeFilterStep(){};
double elapsedTime_;
void update_filter(MATRIX & filteredQuantity,
const MATRIX & unfilteredQuantity,
MATRIX & unfilteredQuantitySum,
double tau,
double dt)
{
// this average and the next
if (elapsedTime_ == 0.0) { // a reset
elapsedTime_ = dt;
unfilteredQuantitySum = unfilteredQuantity*dt;
filteredQuantity = unfilteredQuantity;
}
else { // a running average
elapsedTime_ += dt;
unfilteredQuantitySum += unfilteredQuantity*dt;
filteredQuantity = unfilteredQuantitySum;
filteredQuantity /= elapsedTime_;
}
if (elapsedTime_ >= tau && tau > 0) {
elapsedTime_ = 0.0;
}
};
};
};
#endif
diff --git a/lib/atc/TimeIntegrator.cpp b/lib/atc/TimeIntegrator.cpp
index 18da58548..26db421b5 100644
--- a/lib/atc/TimeIntegrator.cpp
+++ b/lib/atc/TimeIntegrator.cpp
@@ -1,249 +1,323 @@
// ATC transfer headers
#include "TimeIntegrator.h"
#include "ATC_Coupling.h"
#include "ATC_Error.h"
namespace ATC {
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+ // Class AtomTimeIntegratorType
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+
+ //--------------------------------------------------------
+ // Constructor
+ //--------------------------------------------------------
+ AtomTimeIntegratorType::AtomTimeIntegratorType(ATC_Method * atc, AtomType atomType) :
+ atc_(atc),
+ atomType_(atomType),
+ mass_(NULL),
+ position_(NULL),
+ velocity_(NULL),
+ force_(NULL)
+ {
+ // do nothing
+ }
+
+ //--------------------------------------------------------
+ // construct_transfers
+ // sets/constructs all required dependency managed data
+ //--------------------------------------------------------
+ void AtomTimeIntegratorType::construct_transfers()
+ {
+ InterscaleManager & interscaleManager(atc_->interscale_manager());
+ mass_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_MASS,atomType_);
+ position_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_POSITION,atomType_);
+ velocity_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_VELOCITY,atomType_);
+ force_ = interscaleManager.fundamental_atom_quantity(LammpsInterface::ATOM_FORCE,atomType_);
+ }
+
+ //--------------------------------------------------------
+ // initial_integrate_velocity
+ // velocity update in first part of velocity-verlet
+ //--------------------------------------------------------
+ void AtomTimeIntegratorType::init_integrate_velocity(double dt)
+ {
+ const DENS_MAT & m(mass_->quantity());
+
+ _deltaQuantity_ = force_->quantity();
+ _deltaQuantity_ /= m;
+ _deltaQuantity_ *= 0.5*dt;
+
+ (*velocity_) += _deltaQuantity_;
+ }
+
+ //--------------------------------------------------------
+ // initial_integrate_position
+ // position update in first part of velocity-verlet
+ //--------------------------------------------------------
+ void AtomTimeIntegratorType::init_integrate_position(double dt)
+ {
+ _deltaQuantity_ = velocity_->quantity();
+ _deltaQuantity_ *= dt;
+ (*position_) += _deltaQuantity_;
+ }
+
+ //--------------------------------------------------------
+ // final_integrate
+ // velocity update in second part of velocity-verlet
+ //--------------------------------------------------------
+ void AtomTimeIntegratorType::final_integrate(double dt)
+ {
+ const DENS_MAT & m(mass_->quantity());
+
+ _deltaQuantity_ = force_->quantity();
+ _deltaQuantity_ /= m;
+ _deltaQuantity_ *= 0.5*dt;
+
+ (*velocity_) += _deltaQuantity_;
+ }
+
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeIntegrator
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
TimeIntegrator::TimeIntegrator(ATC_Coupling * atc,
TimeIntegrationType timeIntegrationType) :
timeIntegrationMethod_(NULL),
atc_(atc),
timeFilter_(NULL),
timeFilterManager_(atc_->time_filter_manager()),
timeIntegrationType_(timeIntegrationType),
needReset_(true)
{
// do nothing
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
TimeIntegrator::~TimeIntegrator()
{
if (timeIntegrationMethod_)
delete timeIntegrationMethod_;
}
//--------------------------------------------------------
// construct_transfers
// sets/constructs all required dependency managed data
//--------------------------------------------------------
void TimeIntegrator::construct_transfers()
{
timeIntegrationMethod_->construct_transfers();
}
//--------------------------------------------------------
// initialize
// initialize all data and variables before a run
//--------------------------------------------------------
void TimeIntegrator::initialize()
{
timeIntegrationMethod_->initialize();
needReset_ = false;
}
//--------------------------------------------------------
// pre_initial_integrate1
// first time integration computations
// before Verlet step 1
//--------------------------------------------------------
void TimeIntegrator::pre_initial_integrate1(double dt)
{
timeIntegrationMethod_->pre_initial_integrate1(dt);
}
//--------------------------------------------------------
// pre_initial_integrate2
// second time integration computations
// before Verlet step 1
//--------------------------------------------------------
void TimeIntegrator::pre_initial_integrate2(double dt)
{
timeIntegrationMethod_->pre_initial_integrate2(dt);
}
//--------------------------------------------------------
// mid_initial_integrate1
// first time integration computations
// at the mid-point of Verlet step 1
//--------------------------------------------------------
void TimeIntegrator::mid_initial_integrate1(double dt)
{
timeIntegrationMethod_->mid_initial_integrate1(dt);
}
//--------------------------------------------------------
// mid_initial_integrate2
// second time integration computations
// at the mid-point of Verlet step 1
//--------------------------------------------------------
void TimeIntegrator::mid_initial_integrate2(double dt)
{
timeIntegrationMethod_->mid_initial_integrate2(dt);
}
//--------------------------------------------------------
// post_initial_integrate1
// first time integration computations
// after Verlet step 1
//--------------------------------------------------------
void TimeIntegrator::post_initial_integrate1(double dt)
{
timeIntegrationMethod_->post_initial_integrate1(dt);
}
//--------------------------------------------------------
// post_initial_integrate2
// second time integration computations
// after Verlet step 1
//--------------------------------------------------------
void TimeIntegrator::post_initial_integrate2(double dt)
{
timeIntegrationMethod_->post_initial_integrate2(dt);
}
//--------------------------------------------------------
// pre_final_integrate1
// first time integration computations
// before Verlet step 2
//--------------------------------------------------------
void TimeIntegrator::pre_final_integrate1(double dt)
{
timeIntegrationMethod_->pre_final_integrate1(dt);
}
//--------------------------------------------------------
// pre_final_integrate2
// second time integration computations
// before Verlet step 2
//--------------------------------------------------------
void TimeIntegrator::pre_final_integrate2(double dt)
{
timeIntegrationMethod_->pre_final_integrate2(dt);
}
//--------------------------------------------------------
// post_final_integrate1
// first time integration computations
// after Verlet step 2
//--------------------------------------------------------
void TimeIntegrator::post_final_integrate1(double dt)
{
timeIntegrationMethod_->post_final_integrate1(dt);
}
//--------------------------------------------------------
// post_final_integrate2
// second time integration computations
// after Verlet step 2
//--------------------------------------------------------
void TimeIntegrator::post_final_integrate2(double dt)
{
timeIntegrationMethod_->post_final_integrate2(dt);
}
//--------------------------------------------------------
// post_final_integrate3
// third time integration computations
// after Verlet step 2
//--------------------------------------------------------
void TimeIntegrator::post_final_integrate3(double dt)
{
timeIntegrationMethod_->post_final_integrate3(dt);
}
//--------------------------------------------------------
// has_final_predictor
// checks to see if first RHS computation is needed
//--------------------------------------------------------
bool TimeIntegrator::has_final_predictor()
{
return timeIntegrationMethod_->has_final_predictor();
}
//--------------------------------------------------------
// has_final_corrector
// checks to see if second RHS computation is needed
//--------------------------------------------------------
bool TimeIntegrator::has_final_corrector()
{
return timeIntegrationMethod_->has_final_corrector();
}
//--------------------------------------------------------
// add_to_rhs
// add any needed contributions to RHS
//--------------------------------------------------------
void TimeIntegrator::add_to_rhs()
{
timeIntegrationMethod_->add_to_rhs();
}
//--------------------------------------------------------
// post_process
// perform any post processing calculations
//--------------------------------------------------------
void TimeIntegrator::post_process()
{
timeIntegrationMethod_->post_process();
}
//--------------------------------------------------------
// output
// add variables to output list
//--------------------------------------------------------
void TimeIntegrator::output(OUTPUT_LIST & outputData)
{
timeIntegrationMethod_->output(outputData);
}
//--------------------------------------------------------
// pack_fields
// add persistent variables to data list
//--------------------------------------------------------
void TimeIntegrator::pack_fields(RESTART_LIST & data)
{
timeIntegrationMethod_->pack_fields(data);
//timeFilter_->pack_fields(data);
}
//--------------------------------------------------------
// finish
// perform any final state setting
//--------------------------------------------------------
void TimeIntegrator::finish()
{
timeIntegrationMethod_->finish();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class TimeIntegrationMethod
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
// Grab data from ATC
//--------------------------------------------------------
TimeIntegrationMethod::TimeIntegrationMethod(TimeIntegrator * timeIntegrator) :
timeIntegrator_(timeIntegrator),
atc_(timeIntegrator_->atc())
{
// do nothing
}
};
diff --git a/lib/atc/TimeIntegrator.h b/lib/atc/TimeIntegrator.h
index 9bca8af94..5c29a6e12 100644
--- a/lib/atc/TimeIntegrator.h
+++ b/lib/atc/TimeIntegrator.h
@@ -1,305 +1,390 @@
#ifndef TIME_INTEGRATOR_H
#define TIME_INTEGRATOR_H
-// ATC headers
#include "MatrixLibrary.h"
#include "TimeFilter.h"
#include "ATC_TypeDefs.h"
-using namespace std;
namespace ATC {
// forward declarations
+ class ATC_Method;
class ATC_Coupling;
class TimeIntegrationMethod;
+ /**
+ * @class AtomTimeIntegrator
+ * @brief Base class for various time integrators for atomic quantities (replacing other lammps fixes)
+ */
+
+ class AtomTimeIntegrator {
+
+ public:
+
+ // constructor
+ AtomTimeIntegrator(){};
+
+ // destructor
+ virtual ~AtomTimeIntegrator(){};
+
+ /** create and get necessary transfer operators */
+ virtual void construct_transfers(){};
+
+ /** Predictor phase, Verlet first step for velocity */
+ virtual void init_integrate_velocity(double dt){};
+
+ /** Predictor phase, Verlet first step for position */
+ virtual void init_integrate_position(double dt){};
+
+ /** Corrector phase, Verlet second step for velocity */
+ virtual void final_integrate(double dt){};
+
+ };
+
+ /**
+ * @class AtomTimeIntegratorType
+ * @brief class for applying velocity-verlet based on atom type
+ */
+
+ class AtomTimeIntegratorType : public AtomTimeIntegrator {
+
+ public:
+
+ // constructor
+ AtomTimeIntegratorType(ATC_Method * atc, AtomType atomType);
+
+ // destructor
+ virtual ~AtomTimeIntegratorType(){};
+
+ /** create and get necessary transfer operators */
+ virtual void construct_transfers();
+
+ /** Predictor phase, Verlet first step for velocity */
+ virtual void init_integrate_velocity(double dt);
+
+ /** Predictor phase, Verlet first step for position */
+ virtual void init_integrate_position(double dt);
+
+ /** Corrector phase, Verlet second step for velocity */
+ virtual void final_integrate(double dt);
+
+ protected:
+
+ /** pointer to atc object */
+ ATC_Method * atc_;
+
+ /** atom type this is applied to */
+ AtomType atomType_;
+
+ /** atomic masses */
+ DENS_MAN * mass_;
+
+ /** atomic positions */
+ DENS_MAN * position_;
+
+ /** atomic velocities */
+ DENS_MAN * velocity_;
+
+ /** atomic forces */
+ DENS_MAN * force_;
+
+ // workspace
+ DENS_MAT _deltaQuantity_;
+
+ private:
+
+ // DO NOT define this
+ AtomTimeIntegratorType();
+
+ };
+
/**
* @class TimeIntegrator
* @brief Base class for various time integrators for FE quantities
*/
class TimeIntegrator {
public:
/** types of time integration */
enum TimeIntegrationType {
STEADY,
VERLET,
GEAR,
FRACTIONAL_STEP,
EXPLICIT,
IMPLICIT,
CRANK_NICOLSON
};
// constructor
TimeIntegrator(ATC_Coupling * atc,
TimeIntegrationType timeIntegrationType = STEADY);
// destructor
virtual ~TimeIntegrator();
/** parser/modifier */
virtual bool modify(int narg, char **arg){return false;};
/** create objects to implement requested numerical method */
virtual void construct_methods() = 0;
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** pre time integration initialization of data */
virtual void initialize();
/** flag if reset is needed */
bool need_reset() const {return needReset_;};
// time step methods, corresponding to ATC_Coupling
/** first part of pre_initial_integrate */
virtual void pre_initial_integrate1(double dt);
/** second part of pre_initial_integrate */
virtual void pre_initial_integrate2(double dt);
/** first part of mid_initial_integrate */
virtual void mid_initial_integrate1(double dt);
/** second part of mid_initial_integrate */
virtual void mid_initial_integrate2(double dt);
/** first part of post_initial_integrate */
virtual void post_initial_integrate1(double dt);
/** second part of post_initial_integrate */
virtual void post_initial_integrate2(double dt);
/** first part of pre_final_integrate */
virtual void pre_final_integrate1(double dt);
/** second part of pre_final_integrate */
virtual void pre_final_integrate2(double dt);
/** first part of post_final_integrate */
virtual void post_final_integrate1(double dt);
/** second part of post_final_integrate */
virtual void post_final_integrate2(double dt);
/** third part of post_final_integrate */
virtual void post_final_integrate3(double dt);
/** checks to see if first RHS computation is needed */
virtual bool has_final_predictor();
/** checks to see if second RHS computation is needed */
virtual bool has_final_corrector();
/** adds any contributions from time integrator to RHS */
virtual void add_to_rhs();
/** post processing step prior to output */
virtual void post_process();
/** add output data */
virtual void output(OUTPUT_LIST & outputData);
/** pack persistent fields */
virtual void pack_fields(RESTART_LIST & data);
/** finalize any data */
virtual void finish();
// Member data access
/** access to time integration type */
TimeIntegrationType time_integration_type() const
{ return timeIntegrationType_; };
/** access to ATC Transfer object */
ATC_Coupling * atc() {return atc_;};
/** access to time filter object */
TimeFilter * time_filter() {return timeFilter_;};
/** access to time filter manager object */
TimeFilterManager * time_filter_manager() {return timeFilterManager_;};
/** force the integrator to be reset */
void force_reset() {needReset_ = true;};
/** force the integrator not to be reset */
void force_no_reset() {needReset_ = false;};
protected:
/** pointer to time integrator method */
TimeIntegrationMethod * timeIntegrationMethod_;
/** pointer to access ATC methods */
ATC_Coupling * atc_;
/** time filter for specific updates */
TimeFilter * timeFilter_;
/** time filter manager for getting time filtering info */
TimeFilterManager * timeFilterManager_;
/** type of integration scheme being used */
TimeIntegrationType timeIntegrationType_;
/** flat to reset data */
bool needReset_;
private:
// DO NOT define this
TimeIntegrator();
};
/**
* @class TimeIntegrationMethod
* @brief Base class for time integration methods which update FE quantities
*/
class TimeIntegrationMethod {
public:
// constructor
TimeIntegrationMethod(TimeIntegrator * timeIntegrator);
// destructor
virtual ~TimeIntegrationMethod(){};
/** create and get necessary transfer operators */
virtual void construct_transfers(){};
/** pre time integration */
virtual void initialize(){};
// time step methods, corresponding to ATC_Coupling and TimeIntegrator
/** first part of pre_initial_integrate */
virtual void pre_initial_integrate1(double dt){};
/** second part of pre_initial_integrate */
virtual void pre_initial_integrate2(double dt){};
/** first part of mid_initial_integrate */
virtual void mid_initial_integrate1(double dt){};
/** second part of mid_initial_integrate */
virtual void mid_initial_integrate2(double dt){};
/** first part of post_initial_integrate */
virtual void post_initial_integrate1(double dt){};
/** second part of post_initial_integrate */
virtual void post_initial_integrate2(double dt){};
/** first part of pre_final_integrate */
virtual void pre_final_integrate1(double dt){};
/** second part of pre_final_integrate */
virtual void pre_final_integrate2(double dt){};
/** first part of post_final_integrate */
virtual void post_final_integrate1(double dt){};
/** second part of post_final_integrate */
virtual void post_final_integrate2(double dt){};
/** third part of post_final_integrate */
virtual void post_final_integrate3(double dt){};
/** checks to see if first RHS computation is needed */
virtual bool has_final_predictor() {return false;};
/** checks to see if second RHS computation is needed */
virtual bool has_final_corrector() {return false;};
/** adds any contributions from time integrator to RHS */
virtual void add_to_rhs() {};
/** post processing step */
virtual void post_process(){};
/** add output data */
virtual void output(OUTPUT_LIST & outputData){};
/** pack persistent fields */
virtual void pack_fields(RESTART_LIST & data){};
/** finalize any states */
virtual void finish(){};
protected:
/** owning time integrator */
TimeIntegrator * timeIntegrator_;
/** associated ATC transfer object */
ATC_Coupling * atc_;
private:
// DO NOT define this
TimeIntegrationMethod();
};
//--------------------------------------------------------
//--------------------------------------------------------
// time integration functions not associated
// with any particular class
//--------------------------------------------------------
//--------------------------------------------------------
inline void gear1_4_predict(MATRIX & f,
MATRIX & dot_f,
MATRIX & ddot_f,
const MATRIX & dddot_f,
double dt)
// 4th order Gear integrator for 1rst order ODE predictor step
{
f = f + dot_f*dt + ddot_f*(1./2.*dt*dt) + dddot_f*(1./6.*dt*dt*dt);
dot_f = dot_f + ddot_f*dt+dddot_f*(1./2.*dt*dt);
ddot_f = ddot_f + dddot_f*dt;
};
inline void gear1_3_predict(MATRIX & f,
MATRIX & dot_f,
const MATRIX & ddot_f,
double dt)
// 3rd order Gear integrator for 1rst order ODE predictor step
{
f = f + dot_f*dt + ddot_f*(1./2.*dt*dt);
dot_f = dot_f + ddot_f*dt;
};
inline void gear1_4_correct(MATRIX & f,
MATRIX & dot_f,
MATRIX & ddot_f,
MATRIX & dddot_f,
const MATRIX & R_f,
double dt)
// 4th order Gear integrator for 1rst order ODE corrector step
{
f = f + (3./8.)*R_f;
dot_f = dot_f + (1./dt)*R_f;
ddot_f = ddot_f + (3./2./dt/dt)*R_f;
dddot_f = dddot_f + (1./dt/dt/dt)*R_f;
};
inline void gear1_3_correct(MATRIX & f,
MATRIX & dot_f,
MATRIX & ddot_f,
const MATRIX & R_f,
double dt)
// 3rd order Gear integrator for 1rst order ODE corrector step
{
f = f + (5./12.)*R_f;
dot_f = dot_f + (1./dt)*R_f;
ddot_f = ddot_f + (1./dt/dt)*R_f;
};
inline void explicit_1(MATRIX & f,
const MATRIX & dot_f,
double dt)
// 1rst order explict ODE update
{
f = f + dt*dot_f;
};
inline void explicit_2(MATRIX & f,
const MATRIX & dot_f,
const MATRIX & ddot_f,
double dt)
// 2nd order explict ODE update
{
f = f + dt*dot_f + .5*dt*dt*ddot_f;
};
};
#endif
diff --git a/lib/atc/TransferLibrary.cpp b/lib/atc/TransferLibrary.cpp
index e921875e4..f4cdb172a 100644
--- a/lib/atc/TransferLibrary.cpp
+++ b/lib/atc/TransferLibrary.cpp
@@ -1,1872 +1,2008 @@
// ATC headers
#include "TransferLibrary.h"
#include "ATC_Coupling.h"
#include "PrescribedDataManager.h"
#include "LinearSolver.h"
#include "PerAtomQuantityLibrary.h"
#include "KernelFunction.h"
#include "MoleculeSet.h"
//#include <typeinfo>
+#include <set>
+#include <sstream>
+#include <utility>
+#include <vector>
+
+using std::set;
+using std::map;
+using std::string;
+using std::stringstream;
+using std::pair;
+using std::vector;
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class NodalAtomVolume
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
NodalAtomVolume::NodalAtomVolume(ATC_Method * atc,
SPAR_MAN * shapeFunction) :
atc_(atc),
shapeFunction_(shapeFunction),
lammpsInterface_(atc->lammps_interface()),
feEngine_(atc->fe_engine()),
tol_(1.e-10)
{
shapeFunction_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void NodalAtomVolume::reset_quantity() const
{
// solve equation \sum_a N_Ia \sum_J N_Ja dV_J = \int_Omega N_I dV
// form left-hand side
int nNodes = shapeFunction_->nCols();
SPAR_MAT lhs(nNodes,nNodes);
atc_->compute_consistent_md_mass_matrix(shapeFunction_->quantity(),lhs);
// form right-hand side
_rhsMatrix_.resize(nNodes,nNodes);
feEngine_->compute_lumped_mass_matrix(_rhsMatrix_);
_rhs_.resize(nNodes);
_rhs_.copy(_rhsMatrix_.ptr(),_rhsMatrix_.size(),1);
// change entries for all entries if no atoms in shape function support
double totalVolume = _rhs_.sum();
double averageVolume = averaging_operation(totalVolume);
_scale_.resize(nNodes);
for (int i = 0; i < nNodes; i++) {
if ((abs(lhs(i,i)) > 0.))
_scale_(i) = 1.;
else
_scale_(i) = 0.;
}
lhs.row_scale(_scale_);
for (int i = 0; i < nNodes; i++) {
if (_scale_(i) < 0.5) {
lhs.set(i,i,1.);
_rhs_(i) = averageVolume;
}
}
lhs.compress();
// solve equation
LinearSolver solver(lhs, ATC::LinearSolver::ITERATIVE_SOLVE_SYMMETRIC, true);
solver.set_max_iterations(lhs.nRows());
solver.set_tolerance(tol_);
quantity_.reset(nNodes,1);
CLON_VEC tempQuantity(quantity_,CLONE_COL,0);
solver.solve(tempQuantity,_rhs_);
}
//--------------------------------------------------------
// averaging_operation
//--------------------------------------------------------
double NodalAtomVolume::averaging_operation(const double totalVolume) const
{
int nLocal[1] = {shapeFunction_->nRows()};
int nGlobal[1] = {0};
lammpsInterface_->int_allsum(nLocal,nGlobal,1);
return totalVolume/(double(nGlobal[0]));
}
//--------------------------------------------------------
// overloading operation to get number of rows
//--------------------------------------------------------
int NodalAtomVolume::nRows() const
{
return atc_->num_nodes();
}
//--------------------------------------------------------
// overloading operation to get number of columns
//--------------------------------------------------------
int NodalAtomVolume::nCols() const
{
return 1;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class NodalVolume
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// averaging_operation
//--------------------------------------------------------
double NodalVolume::averaging_operation(const double totalVolume) const
{
int nNodes = shapeFunction_->nCols();
return totalVolume/nNodes;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class NodalAtomVolumeElement
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
NodalAtomVolumeElement::NodalAtomVolumeElement(ATC_Method * atc,
SPAR_MAN * shapeFunction,
PerAtomQuantity<int> * atomElement) :
atc_(atc),
shapeFunction_(shapeFunction),
atomElement_(atomElement),
feEngine_(atc->fe_engine()),
tol_(1.e-10)
{
shapeFunction_->register_dependence(this);
if (!atomElement_) {
InterscaleManager & interscaleManager = atc_->interscale_manager();
atomElement_ = interscaleManager.per_atom_int_quantity("AtomElement");
}
atomElement_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void NodalAtomVolumeElement::reset_quantity() const
{
// Using analyses by G. Wagner and J. Templeton, weights ~ phi*M^{-1}*V
// where phi are the dimensionless shape/weighting functions,
// M is the "mass" matrix M_IJ,
// V is the vector of nodal and element volumes
//
//
// form atom-element shape functions and elemental volumes
const FE_Mesh * feMesh = feEngine_->fe_mesh();
int nElts = feMesh->num_elements();
int nNodes = shapeFunction_->nCols();
int nLocal = shapeFunction_->nRows();
// form "mass" matrix M_IJ (I,J = 0, 1, ..., nNodes+nElts-1)
int neSize = nNodes+nElts;
const INT_ARRAY & atomElement(atomElement_->quantity());
SPAR_MAT nodEltShpFcnMatrix(nLocal,neSize);
const SPAR_MAT & shapeFunction(shapeFunction_->quantity());
for(int a = 0; a < nLocal; a++) {
for(int I = 0; I < nNodes; I++) {
nodEltShpFcnMatrix.set(a,I,shapeFunction(a,I));
}
int thisCol = nNodes+atomElement(a,0);
nodEltShpFcnMatrix.set(a,thisCol,1);
}
SPAR_MAT neMassMatrix(neSize,neSize);
atc_->compute_consistent_md_mass_matrix(nodEltShpFcnMatrix,neMassMatrix);
// form vector of nodal and elemental volumes
_nodeVolumesMatrix_.resize(nNodes,nNodes);
feEngine_->compute_lumped_mass_matrix(_nodeVolumesMatrix_);
_nodeVolumes_.resize(nNodes);
_nodeVolumes_.copy(_nodeVolumesMatrix_.ptr(),_nodeVolumesMatrix_.size(),1);
DENS_VEC _nodeElementVolumes_(neSize);
for(int I = 0; I < nNodes; I++) {
_nodeElementVolumes_(I) = _nodeVolumes_(I);
}
double averageEltVolume = 0.0;
for(int E = 0; E < nElts; E++) {
double minx, maxx, miny, maxy, minz, maxz;
feMesh->element_coordinates(E,_nodalCoords_);
minx = _nodalCoords_(0,0); maxx = _nodalCoords_(0,0);
miny = _nodalCoords_(1,0); maxy = _nodalCoords_(1,0);
minz = _nodalCoords_(2,0); maxz = _nodalCoords_(2,0);
for (int j = 1; j < _nodalCoords_.nCols(); ++j) {
if (_nodalCoords_(0,j)<minx) minx = _nodalCoords_(0,j);
if (_nodalCoords_(0,j)>maxx) maxx = _nodalCoords_(0,j);
if (_nodalCoords_(1,j)<miny) miny = _nodalCoords_(1,j);
if (_nodalCoords_(1,j)>maxy) maxy = _nodalCoords_(1,j);
if (_nodalCoords_(2,j)<minz) minz = _nodalCoords_(2,j);
if (_nodalCoords_(2,j)>maxz) maxz = _nodalCoords_(2,j);
}
_nodeElementVolumes_(nNodes+E) = (maxx-minx)*(maxy-miny)*(maxz-minz);
averageEltVolume += (maxx-minx)*(maxy-miny)*(maxz-minz);
}
averageEltVolume /= nElts;
// correct entries of mass matrix if no atoms in shape function support
double totalNodalVolume = _nodeVolumes_.sum();
double averageNodalVolume = totalNodalVolume/nNodes;
_scale_.resize(neSize);
for (int i = 0; i < neSize; i++) {
if ((abs(neMassMatrix(i,i)) > 0.)) {
_scale_(i) = 1.;
} else {
printf("No atoms are in support of node/element %i\n",i);
_scale_(i) = 0.;
}
}
neMassMatrix.row_scale(_scale_);
for (int i = 0; i < neSize; i++) {
if (_scale_(i) < 0.5) {
neMassMatrix.set(i,i,1.);
if (i < nNodes) {
_nodeElementVolumes_(i) = averageNodalVolume;
} else {
_nodeElementVolumes_(i) = averageEltVolume;
}
}
}
neMassMatrix.compress();
// solve equation
LinearSolver solver(neMassMatrix, ATC::LinearSolver::ITERATIVE_SOLVE_SYMMETRIC, true);
solver.set_max_iterations(neMassMatrix.nRows());
double myTol = 1.e-10;
solver.set_tolerance(myTol);
quantity_.resize(neSize,0);
CLON_VEC tempQuantity(quantity_,CLONE_COL,0);
solver.solve(tempQuantity,_nodeElementVolumes_);
}
//--------------------------------------------------------
// overloading operation to get number of rows
//--------------------------------------------------------
int NodalAtomVolumeElement::nRows() const
{
return atc_->num_nodes();
}
//--------------------------------------------------------
// overloading operation to get number of columns
//--------------------------------------------------------
int NodalAtomVolumeElement::nCols() const
{
return 1;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomTypeElement
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomTypeElement::AtomTypeElement(ATC_Coupling * atc,
PerAtomQuantity<int> * atomElement) :
atomElement_(atomElement),
nElts_((atc->fe_engine())->num_elements())
{
if (!atomElement_) {
atomElement_ = (atc->interscale_manager()).per_atom_int_quantity("AtomElement");
}
atomElement_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AtomTypeElement::reset_quantity() const
{
// determine which elements contain internal atoms
quantity_.resize(nElts_,1);
_quantityLocal_.resize(nElts_,1);
_quantityLocal_ = 0;
const INT_ARRAY & atomElement(atomElement_->quantity());
for (int i = 0; i < atomElement_->nRows(); ++i) {
_quantityLocal_(atomElement(i,0),0) = 1;
}
// swap contributions
lammpsInterface_->logical_or(_quantityLocal_.ptr(),
quantity_.ptr(),nElts_);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ElementMask
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ElementMask::ElementMask(ATC_Coupling * atc,
MatrixDependencyManager<DenseMatrix, int> * hasInternal,
MatrixDependencyManager<DenseMatrix, int> * hasGhost) :
hasInternal_(hasInternal),
hasGhost_(hasGhost),
feEngine_(atc->fe_engine())
{
if (!hasInternal_) {
hasInternal_ = (atc->interscale_manager()).dense_matrix_int("ElementHasInternal");
}
if (!hasGhost_) {
hasGhost_ = (atc->interscale_manager()).dense_matrix_int("ElementHasGhost");
}
hasInternal_->register_dependence(this);
if (hasGhost_) hasGhost_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void ElementMask::reset_quantity() const
{
const INT_ARRAY & hasInternal(hasInternal_->quantity());
int nElts = hasInternal.size();
quantity_.resize(nElts,1);
if (hasGhost_) {
const INT_ARRAY & hasGhost(hasGhost_->quantity());
for (int i = 0; i < nElts; ++i) {
quantity_(i,0) = !hasInternal(i,0) || hasGhost(i,0);
}
}
else {
for (int i = 0; i < nElts; ++i) {
quantity_(i,0) = !hasInternal(i,0);
}
}
const set<int> & nullElements = feEngine_->null_elements();
set<int>::const_iterator iset;
for (iset = nullElements.begin(); iset != nullElements.end(); iset++) {
int ielem = *iset;
quantity_(ielem,0) = false;
}
}
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+ // Class AtomElementMask
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+
+ //--------------------------------------------------------
+ // Constructor
+ //--------------------------------------------------------
+ AtomElementMask::AtomElementMask(ATC_Coupling * atc,
+ MatrixDependencyManager<DenseMatrix, int> * hasAtoms) :
+ hasAtoms_(hasAtoms),
+ feEngine_(atc->fe_engine())
+ {
+ if (!hasAtoms_) {
+ hasAtoms_ = (atc->interscale_manager()).dense_matrix_int("ElementHasInternal");
+ }
+ if (!hasAtoms_) {
+ throw ATC_Error("AtomElementMask::AtomElementMask - no element has atoms transfer provided");
+ }
+ hasAtoms_->register_dependence(this);
+ }
+
+ //--------------------------------------------------------
+ // reset_quantity
+ //--------------------------------------------------------
+ void AtomElementMask::reset_quantity() const
+ {
+ const INT_ARRAY & hasAtoms(hasAtoms_->quantity());
+ int nElts = hasAtoms.size();
+ quantity_.resize(nElts,1);
+
+ for (int i = 0; i < nElts; ++i) {
+ quantity_(i,0) = hasAtoms(i,0);
+ }
+
+ // this seems to cause problems because many materials end up being null
+ const set<int> & nullElements = feEngine_->null_elements();
+ set<int>::const_iterator iset;
+ for (iset = nullElements.begin(); iset != nullElements.end(); iset++) {
+ int ielem = *iset;
+ quantity_(ielem,0) = false;
+ }
+ }
+
//--------------------------------------------------------
//--------------------------------------------------------
// Class ElementMaskNodeSet
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ElementMaskNodeSet::ElementMaskNodeSet(ATC_Coupling * atc,
RegulatedNodes * nodeSet) :
nodeSet_(nodeSet),
feMesh_((atc->fe_engine())->fe_mesh())
{
nodeSet_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void ElementMaskNodeSet::reset_quantity() const
{
quantity_.resize(feMesh_->num_elements(),1);
quantity_ = false;
// get the maximal element set corresponding to those nodes
set<int> elementSet;
feMesh_->nodeset_to_maximal_elementset(nodeSet_->quantity(),elementSet);
set<int>::const_iterator iset;
for (iset = elementSet.begin(); iset != elementSet.end(); iset++) {
quantity_(*iset,0) = true;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class NodalGeometryType
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
NodalGeometryType::NodalGeometryType(ATC_Coupling * atc,
MatrixDependencyManager<DenseMatrix, int> * hasInternal,
MatrixDependencyManager<DenseMatrix, int> * hasGhost) :
hasInternal_(hasInternal),
hasGhost_(hasGhost),
feEngine_(atc->fe_engine()),
nNodes_(atc->num_nodes()),
nElts_((atc->fe_engine())->num_elements())
{
if (!hasInternal_) {
hasInternal_ = (atc->interscale_manager()).dense_matrix_int("ElementHasInternal");
}
if (!hasGhost_) {
hasGhost_ = (atc->interscale_manager()).dense_matrix_int("ElementHasGhost");
}
hasInternal_->register_dependence(this);
if (hasGhost_) hasGhost_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void NodalGeometryType::reset_quantity() const
{
const INT_ARRAY & hasInternal(hasInternal_->quantity());
_nodesInternal_.resize(nNodes_);
_nodesInternal_ = 0;
_nodesGhost_.reset(nNodes_);
_nodesGhost_ = 0;
Array<int> nodes;
vector<int> myElems = feEngine_->fe_mesh()->owned_elts();
if (hasGhost_) {
const INT_ARRAY & hasGhost(hasGhost_->quantity()) ;
// iterate through all elements owned by this processor
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
if (hasInternal(ielem,0) || hasGhost(ielem,0)) {
feEngine_->element_connectivity(ielem,nodes);
for (int j = 0; j < nodes.size(); j++) {
if (hasInternal(ielem,0)) {
_nodesInternal_(nodes(j)) = 1;
}
if (hasGhost(ielem,0)) {
_nodesGhost_(nodes(j)) = 1;
}
}
}
}
// sum up partial result arrays
lammpsInterface_->logical_or(MPI_IN_PLACE, _nodesInternal_.ptr(), _nodesInternal_.size());
lammpsInterface_->logical_or(MPI_IN_PLACE, _nodesGhost_.ptr(), _nodesGhost_.size());
}
else {
// iterate through all elements owned by this processor
for (vector<int>::iterator elemsIter = myElems.begin();
elemsIter != myElems.end();
++elemsIter)
{
int ielem = *elemsIter;
if (hasInternal(ielem,0)) {
feEngine_->element_connectivity(ielem,nodes);
for (int j = 0; j < nodes.size(); j++) {
_nodesInternal_(nodes(j)) = 1;
}
}
}
// sum up partial result arrays
lammpsInterface_->logical_or(MPI_IN_PLACE, _nodesInternal_.ptr(), _nodesInternal_.size());
}
quantity_.resize(nNodes_,1);
for (int i = 0; i < nNodes_; i++) {
if (_nodesInternal_(i) && _nodesGhost_(i)) {
quantity_(i,0) = BOUNDARY;
}
else if (_nodesInternal_(i)) {
quantity_(i,0) = MD_ONLY;
}
else {
quantity_(i,0) = FE_ONLY;
}
}
}
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+ // Class NodalGeometryTypeElementSet
+ //--------------------------------------------------------
+ //--------------------------------------------------------
+
+ //--------------------------------------------------------
+ // Constructor
+ //--------------------------------------------------------
+ NodalGeometryTypeElementSet::NodalGeometryTypeElementSet(ATC_Coupling * atc,
+ MatrixDependencyManager<DenseMatrix, int> * hasInternal) :
+ hasInternal_(hasInternal),
+ feEngine_(atc->fe_engine()),
+ nNodes_(atc->num_nodes()),
+ nElts_((atc->fe_engine())->num_elements())
+ {
+ if (!hasInternal_) {
+ hasInternal_ = (atc->interscale_manager()).dense_matrix_int("ElementHasInternal");
+ }
+ if (!hasInternal_) {
+ throw ATC_Error("NodalGeometryTypeElementSet: No ElementHasInternal object provided or exists");
+ }
+ hasInternal_->register_dependence(this);
+ }
+
+ //--------------------------------------------------------
+ // reset_quantity
+ //--------------------------------------------------------
+ void NodalGeometryTypeElementSet::reset_quantity() const
+ {
+ const INT_ARRAY & hasInternal(hasInternal_->quantity());
+ _nodesInternal_.resize(nNodes_);
+ _nodesInternal_ = 0;
+ _nodesGhost_.reset(nNodes_);
+ _nodesGhost_ = 0;
+ Array<int> nodes;
+
+
+
+ vector<int> myElems = feEngine_->fe_mesh()->owned_elts();
+ // iterate through all elements owned by this processor
+ for (vector<int>::iterator elemsIter = myElems.begin();
+ elemsIter != myElems.end();
+ ++elemsIter)
+ {
+ int ielem = *elemsIter;
+ if (hasInternal(ielem,0)) {
+ feEngine_->element_connectivity(ielem,nodes);
+ for (int j = 0; j < nodes.size(); j++) {
+ _nodesInternal_(nodes(j)) = 1;
+ }
+ }
+ else {
+ feEngine_->element_connectivity(ielem,nodes);
+ for (int j = 0; j < nodes.size(); j++) {
+ _nodesGhost_(nodes(j)) = 1;
+ }
+ }
+ }
+
+ // sum up partial result arrays
+ lammpsInterface_->logical_or(MPI_IN_PLACE, _nodesInternal_.ptr(), _nodesInternal_.size());
+ lammpsInterface_->logical_or(MPI_IN_PLACE, _nodesGhost_.ptr(), _nodesGhost_.size());
+
+ quantity_.resize(nNodes_,1);
+ for (int i = 0; i < nNodes_; i++) {
+ if (_nodesInternal_(i) && _nodesGhost_(i)) {
+ quantity_(i,0) = BOUNDARY;
+ }
+ else if (_nodesInternal_(i)) {
+ quantity_(i,0) = MD_ONLY;
+ }
+ else {
+ quantity_(i,0) = FE_ONLY;
+ }
+ }
+ }
+
//--------------------------------------------------------
//--------------------------------------------------------
// Class NodeToSubset
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
NodeToSubset::NodeToSubset(ATC_Method * atc,
SetDependencyManager<int> * subsetNodes) :
LargeToSmallMap(),
atc_(atc),
subsetNodes_(subsetNodes)
{
subsetNodes_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void NodeToSubset::reset_quantity() const
{
int nNodes = atc_->num_nodes();
const set<int> & subsetNodes(subsetNodes_->quantity());
quantity_.resize(nNodes,1);
size_ = 0;
for (int i = 0; i < nNodes; i++) {
if (subsetNodes.find(i) != subsetNodes.end()) {
quantity_(i,0) = size_;
size_++;
}
else {
quantity_(i,0) = -1;
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class SubsetToNode
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
SubsetToNode::SubsetToNode(NodeToSubset * nodeToSubset) :
nodeToSubset_(nodeToSubset)
{
nodeToSubset_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void SubsetToNode::reset_quantity() const
{
const INT_ARRAY & nodeToSubset(nodeToSubset_->quantity());
int nNodes = nodeToSubset.nRows();
int count = 0;
quantity_.resize(nodeToSubset_->size(),1);
for (int i = 0; i < nNodes; i++) {
if (nodeToSubset(i,0) > -1) {
quantity_(count,0) = i;
count++;
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class ReducedSparseMatrix
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
ReducedSparseMatrix::ReducedSparseMatrix(ATC_Method * atc,
SPAR_MAN * source,
LargeToSmallAtomMap * map) :
SparseMatrixTransfer<double>(),
source_(source),
map_(map)
{
source_->register_dependence(this);
map_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
ReducedSparseMatrix::~ReducedSparseMatrix()
{
source_->remove_dependence(this);
map_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void ReducedSparseMatrix::reset_quantity() const
{
const SPAR_MAT & source(source_->quantity());
const INT_ARRAY & map(map_->quantity());
quantity_.reset(source.nRows(),source.nCols());
for (int i = 0; i < source.nRows(); i++) {
int idx = map(i,0);
if (idx > -1) {
source.row(i,_row_,_index_);
for (int j = 0; j < _row_.size(); j++) {
quantity_.set(i,_index_(j),_row_(j));
}
}
}
quantity_.compress();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class RowMappedSparseMatrix
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void RowMappedSparseMatrix::reset_quantity() const
{
const SPAR_MAT & source(source_->quantity());
const INT_ARRAY & map(map_->quantity());
quantity_.reset(map_->size(),source.nCols());
for (int i = 0; i < source.nRows(); i++) {
int idx = map(i,0);
if (idx > -1) {
source.row(i,_row_,_index_);
for (int j = 0; j < _row_.size(); j++) {
quantity_.set(idx,_index_(j),_row_(j));
}
}
}
quantity_.compress();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class RowMappedSparseMatrixVector
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
RowMappedSparseMatrixVector::RowMappedSparseMatrixVector(ATC_Method * atc,
VectorDependencyManager<SPAR_MAT * > * source,
LargeToSmallAtomMap * map) :
VectorTransfer<SPAR_MAT * >(),
source_(source),
map_(map)
{
source_->register_dependence(this);
map_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
RowMappedSparseMatrixVector::~RowMappedSparseMatrixVector()
{
source_->remove_dependence(this);
map_->remove_dependence(this);
for (unsigned i = 0; i < quantity_.size(); ++i) {
if (quantity_[i]) delete quantity_[i];
}
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void RowMappedSparseMatrixVector::reset_quantity() const
{
const vector<SPAR_MAT * > & source(source_->quantity());
const INT_ARRAY & map(map_->quantity());
for (unsigned i = 0; i < quantity_.size(); ++i) {
if (quantity_[i]) delete quantity_[i];
}
quantity_.resize(source.size(),NULL);
for (unsigned i = 0; i < source.size(); i++) {
quantity_[i] = new SPAR_MAT(map_->size(),source[i]->nCols());
}
for (unsigned i = 0; i < source.size(); i++) {
for (int j = 0; j < source[i]->nRows(); j++) {
int idx = map(j,0);
if (idx > -1) {
source[i]->row(j,_row_,_index_);
for (int k = 0; k < _row_.size(); k++) {
quantity_[i]->set(idx,_index_(k),_row_(k));
}
}
}
}
for (unsigned i = 0; i < source.size(); i++) {
quantity_[i]->compress();
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class MappedDiagonalMatrix
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
MappedDiagonalMatrix::MappedDiagonalMatrix(ATC_Method * atc,
DIAG_MAN * source,
LargeToSmallAtomMap * map) :
DiagonalMatrixTransfer<double>(),
source_(source),
map_(map)
{
source_->register_dependence(this);
map_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
MappedDiagonalMatrix::~MappedDiagonalMatrix()
{
source_->remove_dependence(this);
map_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void MappedDiagonalMatrix::reset_quantity() const
{
const DIAG_MAT & source(source_->quantity());
const INT_ARRAY & map(map_->quantity());
quantity_.resize(map_->size(),map_->size());
for (int i = 0; i < source.nRows(); i++) {
int idx = map(i,0);
if (idx > -1) {
quantity_(idx,idx) = source(i,i);
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class MappedQuantity
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
MappedQuantity::MappedQuantity(ATC_Method * atc,
DENS_MAN * source,
LargeToSmallMap * map) :
DenseMatrixTransfer<double>(),
source_(source),
map_(map)
{
source_->register_dependence(this);
map_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void MappedQuantity::reset_quantity() const
{
const DENS_MAT & source(source_->quantity());
const INT_ARRAY & map(map_->quantity());
quantity_.resize(map_->size(),source.nCols());
for (int i = 0; i < source.nRows(); i++) {
int idx = map(i,0);
if (idx > -1) {
for (int j = 0; j < source.nCols(); j++) {
quantity_(idx,j) = source(i,j);
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class RegulatedNodes
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
RegulatedNodes::RegulatedNodes(ATC_Coupling * atc,
FieldName fieldName,
MatrixDependencyManager<DenseMatrix, int> * nodalGeometryType) :
SetTransfer<int>(),
nodalGeometryType_(nodalGeometryType),
atc_(atc),
feEngine_(atc->fe_engine()),
prescribedDataManager_(atc->prescribed_data_manager())
{
if (!nodalGeometryType_) {
nodalGeometryType_ = (atc_->interscale_manager()).dense_matrix_int("NodalGeometryType");
}
if (nodalGeometryType_) {
nodalGeometryType_->register_dependence(this);
}
else {
throw ATC_Error("TransferLibrary::RegulatedNodes - No Nodal Geometry Type provided");
}
const map<FieldName,int> & atcFieldSizes(atc_->field_sizes());
if (fieldName == NUM_TOTAL_FIELDS) {
fieldSizes_ = atcFieldSizes;
}
else {
map<FieldName,int>::const_iterator fs_iter = atcFieldSizes.find(fieldName);
fieldSizes_.insert(pair<FieldName,int>(fieldName,fs_iter->second));
}
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void RegulatedNodes::reset_quantity() const
{
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
quantity_.clear();
for (int i = 0; i < nodeType.size(); ++i) {
if (nodeType(i,0) != FE_ONLY) {
quantity_.insert(i);
}
}
}
//--------------------------------------------------------
// insert_boundary_nodes
//--------------------------------------------------------
void RegulatedNodes::insert_boundary_nodes() const
{
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
for (int i = 0; i < nodeType.size(); ++i) {
if (nodeType(i,0) == BOUNDARY) {
quantity_.insert(i);
}
}
}
//--------------------------------------------------------
// insert_boundary_faces
//--------------------------------------------------------
void RegulatedNodes::insert_boundary_faces() const
{
const set<string> & boundaryFaceNames(atc_->boundary_face_names());
set<string>::const_iterator iter;
set<int>::const_iterator nodeIter;
for (iter = boundaryFaceNames.begin(); iter != boundaryFaceNames.end(); iter++) {
set<int> nodeSet;
feEngine_->fe_mesh()->faceset_to_nodeset(*iter,nodeSet);
for (nodeIter = nodeSet.begin(); nodeIter != nodeSet.end(); nodeIter++) {
quantity_.insert(*nodeIter);
}
}
}
//--------------------------------------------------------
// insert_fixed_nodes
//--------------------------------------------------------
void RegulatedNodes::insert_fixed_nodes() const
{
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
map<FieldName,int>::const_iterator fs_iter;
for (int i = 0; i < nodeType.size(); ++i) {
bool isFixed = false;
for (fs_iter = fieldSizes_.begin(); fs_iter != fieldSizes_.end(); fs_iter++) {
for (int j = 0; j < fs_iter->second; j++) {
isFixed = prescribedDataManager_->is_fixed(i,fs_iter->first,j);
if (isFixed) break;
}
}
if (isFixed && ((nodeType(i,0)==MD_ONLY) || (nodeType(i,0)==BOUNDARY))) {
quantity_.insert(i);
}
}
}
//--------------------------------------------------------
// insert_face_fluxes
//--------------------------------------------------------
void RegulatedNodes::insert_face_fluxes() const
{
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
set<int>::const_iterator inode;
map<FieldName,int>::const_iterator fs_iter;
for (fs_iter = fieldSizes_.begin(); fs_iter != fieldSizes_.end(); fs_iter++) {
for (int j = 0; j < fs_iter->second; j++) {
set<int> faceFluxNodes = prescribedDataManager_->flux_face_nodes(fs_iter->first,j);
for (inode = faceFluxNodes.begin(); inode != faceFluxNodes.end(); inode++) {
if (((nodeType(*inode,0)==MD_ONLY) || (nodeType(*inode,0)==BOUNDARY))) {
quantity_.insert(*inode);
}
}
}
}
}
//--------------------------------------------------------
// insert_element_fluxes
//--------------------------------------------------------
void RegulatedNodes::insert_element_fluxes() const
{
const INT_ARRAY & nodeType(nodalGeometryType_->quantity());
set<int>::const_iterator inode;
map<FieldName,int>::const_iterator fs_iter;
for (fs_iter = fieldSizes_.begin(); fs_iter != fieldSizes_.end(); fs_iter++) {
for (int j = 0; j < fs_iter->second; j++) {
set<int> elementFluxNodes = prescribedDataManager_->flux_element_nodes(fs_iter->first,j);
for (inode = elementFluxNodes.begin(); inode != elementFluxNodes.end(); inode++) {
if (((nodeType(*inode,0)==MD_ONLY) || (nodeType(*inode,0)==BOUNDARY))) {
quantity_.insert(*inode);
}
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class BoundaryNodes
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void BoundaryNodes::reset_quantity() const
{
quantity_.clear();
// a) they are a boundary node
RegulatedNodes::insert_boundary_nodes();
// b) they are in a specified boundary faceset
RegulatedNodes::insert_boundary_faces();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FluxNodes
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void FluxNodes::reset_quantity() const
{
quantity_.clear();
// a) they have a fixed face flux
RegulatedNodes::insert_face_fluxes();
// b) they have a fixed element flux
RegulatedNodes::insert_element_fluxes();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FluxBoundaryNodes
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void FluxBoundaryNodes::reset_quantity() const
{
FluxNodes::reset_quantity();
// a) they are a boundary node
RegulatedNodes::insert_boundary_nodes();
// b) they are in a specified boundary faceset
RegulatedNodes::insert_boundary_faces();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AllRegulatedNodes
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AllRegulatedNodes::reset_quantity() const
{
FluxBoundaryNodes::reset_quantity();
// a) they are a fixed node
RegulatedNodes::insert_fixed_nodes();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FixedNodes
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void FixedNodes::reset_quantity() const
{
quantity_.clear();
// a) they are a fixed node
RegulatedNodes::insert_fixed_nodes();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FixedBoundaryNodes
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void FixedBoundaryNodes::reset_quantity() const
{
FixedNodes::reset_quantity();
// a) they are a boundary node
RegulatedNodes::insert_boundary_nodes();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class DenseMatrixQuotient
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
DenseMatrixQuotient::DenseMatrixQuotient(DENS_MAN* matrixNumerator,
DENS_MAN* matrixDenominator):
matrixNumerator_(matrixNumerator),
matrixDenominator_(matrixDenominator)
{
matrixNumerator_->register_dependence(this);
matrixDenominator_->register_dependence(this);
}
//--------------------------------------------------------
// Reset_quantity
//--------------------------------------------------------
void DenseMatrixQuotient::reset_quantity() const
{
quantity_ = matrixNumerator_->quantity();
quantity_.divide_zero_safe(matrixDenominator_->quantity());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class DenseMatrixSum
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
DenseMatrixSum::DenseMatrixSum(DENS_MAN* matrixOne,
DENS_MAN* matrixTwo):
matrixOne_(matrixOne), matrixTwo_(matrixTwo)
{
matrixOne_->register_dependence(this);
matrixTwo_->register_dependence(this);
}
//--------------------------------------------------------
// Reset_quantity
//--------------------------------------------------------
void DenseMatrixSum::reset_quantity() const
{
quantity_ = matrixOne_->quantity();
quantity_ += (matrixTwo_->quantity());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class DenseMatrixDelta
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
DenseMatrixDelta::DenseMatrixDelta(DENS_MAN* matrix,
DENS_MAT* reference):
matrix_(matrix), reference_(reference)
{
matrix_->register_dependence(this);
}
//--------------------------------------------------------
// Reset_quantity
//--------------------------------------------------------
void DenseMatrixDelta::reset_quantity() const
{
quantity_ = matrix_->quantity();
quantity_ -= *reference_;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class PointToElementMap
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
PointToElementMap::PointToElementMap(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, double> * pointPositions) :
DenseMatrixTransfer<int>(),
pointPositions_(pointPositions),
feMesh_((atc->fe_engine())->fe_mesh())
{
pointPositions_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
PointToElementMap::~PointToElementMap()
{
pointPositions_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void PointToElementMap::reset_quantity() const
{
const DENS_MAT & position(pointPositions_->quantity());
int nsd = position.nCols();
int nRows = position.nRows();
quantity_.resize(nRows,nsd);
DENS_VEC coords(nsd);
for (int i = 0; i < nRows; i++) {
for (int j = 0; j < nsd; j++) {
coords(j) = position(i,j);
}
quantity_(i,0) = feMesh_->map_to_element(coords);
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class Interpolant
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
Interpolant::Interpolant(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int>* pointToElementMap,
DENS_MAN* pointPositions) :
SparseMatrixTransfer<double>(),
pointToElementMap_(pointToElementMap),
pointPositions_(pointPositions),
feEngine_(atc->fe_engine())
{
pointToElementMap_->register_dependence(this);
pointPositions_->register_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void Interpolant::reset_quantity() const
{
const DENS_MAT & positions(pointPositions_->quantity());
const INT_ARRAY & elements(pointToElementMap_->quantity());
if (positions.nRows() > 0) {
feEngine_->evaluate_shape_functions(positions,
elements,
this->quantity_);
}
else {
quantity_.resize(0,feEngine_->num_nodes());
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class InterpolantGradient
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
InterpolantGradient::InterpolantGradient(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int>* pointToElementMap,
DENS_MAN* pointPositions) :
VectorTransfer<SPAR_MAT * >(),
pointToElementMap_(pointToElementMap),
pointPositions_(pointPositions),
feEngine_(atc->fe_engine())
{
pointToElementMap_->register_dependence(this);
pointPositions_->register_dependence(this);
quantity_.resize(atc->nsd(),NULL);
for (int i = 0; i < atc->nsd(); ++i) {
quantity_[i] = new SPAR_MAT();
}
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
InterpolantGradient::~InterpolantGradient() {
pointToElementMap_->remove_dependence(this);
pointPositions_->remove_dependence(this);
for (unsigned i = 0; i < quantity_.size(); ++i) {
if (quantity_[i]) delete quantity_[i];
}
}
//--------------------------------------------------------
// reset_quantity()
//--------------------------------------------------------
void InterpolantGradient::reset_quantity() const
{
const DENS_MAT & positions(pointPositions_->quantity());
const INT_ARRAY & elements(pointToElementMap_->quantity());
if (positions.nRows() > 0) {
feEngine_->evaluate_shape_function_derivatives(positions,
elements,
this->quantity_);
}
else {
for (unsigned i = 0; i < quantity_.size(); ++i) {
(this->quantity_)[i]->resize(0,feEngine_->num_nodes());
}
}
}
//--------------------------------------------------------
// Class PerAtomShapeFunctionGradient
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
PerAtomShapeFunctionGradient::PerAtomShapeFunctionGradient(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int>* atomToElementMap,
DENS_MAN* atomPositions,
const string & tag,
AtomType atomType) :
VectorTransfer<SPAR_MAT * >(),
atomToElementMap_(atomToElementMap),
atomPositions_(atomPositions),
feEngine_(atc->fe_engine())
{
InterscaleManager & interscaleManager(atc->interscale_manager());
if (!atomToElementMap_) {
atomToElementMap_ = interscaleManager.per_atom_int_quantity("AtomElement");
}
if (!atomPositions_) {
atomPositions_ = interscaleManager.per_atom_quantity("AtomicCoarseGrainingPositions");
}
atomToElementMap_->register_dependence(this);
atomPositions_->register_dependence(this);
// storage container
matrices_.resize(atc->nsd(),NULL);
for (int i = 0; i < atc->nsd(); ++i) {
matrices_[i] = new AtcAtomSparseMatrix<double>(atc,feEngine_->num_nodes(),
feEngine_->num_nodes_per_element(),
atomType);
stringstream myint;
myint << i;
interscaleManager.add_per_atom_sparse_matrix(matrices_[i],
tag+myint.str());
matrices_[i]->register_dependence(this);
}
quantity_.resize(atc->nsd(),NULL);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
PerAtomShapeFunctionGradient::~PerAtomShapeFunctionGradient() {
atomToElementMap_->remove_dependence(this);
atomPositions_->remove_dependence(this);
for (unsigned i = 0; i < matrices_.size(); ++i) {
matrices_[i]->remove_dependence(this);
}
}
//--------------------------------------------------------
// reset_quantity()
//--------------------------------------------------------
void PerAtomShapeFunctionGradient::reset_quantity() const
{
const DENS_MAT & positions(atomPositions_->quantity());
const INT_ARRAY & elements(atomToElementMap_->quantity());
for (unsigned i = 0; i < quantity_.size(); ++i) {
(this->quantity_)[i] = & matrices_[i]->set_quantity();
}
if (positions.nRows() > 0) {
feEngine_->evaluate_shape_function_derivatives(positions,
elements,
this->quantity_);
}
else {
for (unsigned i = 0; i < quantity_.size(); ++i) {
(this->quantity_)[i]->resize(0,feEngine_->num_nodes());
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class InterpolantSmallMolecule
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
InterpolantSmallMolecule::InterpolantSmallMolecule(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int>* moleculeToElementMap,
DENS_MAN* moleculePositions,
MoleculeSet * moleculeSet) :
Interpolant(atc,moleculeToElementMap,moleculePositions),
moleculeSet_(moleculeSet)
{
moleculeSet_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
InterpolantSmallMolecule::~InterpolantSmallMolecule()
{
moleculeSet_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void InterpolantSmallMolecule::reset_quantity() const
{
Interpolant::reset_quantity();
// scale rows by fraction of molecules on this proc
_fractions_.resize((this->quantity_).nRows());
for (int i = 0; i < moleculeSet_->local_molecule_count(); i++)
_fractions_(i) = moleculeSet_->local_fraction(i);
(this->quantity_).row_scale(_fractions_);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class OnTheFlyKernelAccumulation
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
OnTheFlyKernelAccumulation::OnTheFlyKernelAccumulation(ATC_Method * atc,
PerAtomQuantity<double> * source,
KernelFunction* kernelFunction,
DENS_MAN* atomCoarseGrainingPositions):
atc_(atc),
source_(source),
kernelFunction_(kernelFunction),
atomCoarseGrainingPositions_(atomCoarseGrainingPositions),
feMesh_((atc_->fe_engine())->fe_mesh())
{
source_->register_dependence(this);
atomCoarseGrainingPositions_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void OnTheFlyKernelAccumulation::reset_quantity() const
{
const DENS_MAT & positions(atomCoarseGrainingPositions_->quantity());
const DENS_MAT & source(source_->quantity());
int nNodes = feMesh_->num_nodes_unique();
quantity_.resize(nNodes,source.nCols());
_quantityLocal_.reset(nNodes,source.nCols());
if (source.nRows()>0) {
DENS_VEC xI(positions.nCols()),xa(positions.nCols()),xaI(positions.nCols());
double val;
for (int i = 0; i < nNodes; i++) {
xI = feMesh_->nodal_coordinates(i);
for (int j = 0; j < positions.nRows(); j++) {
for (int k = 0; k < positions.nCols(); ++k) {
xa(k) = positions(j,k);
}
xaI = xa - xI;
atc_->lammps_interface()->periodicity_correction(xaI.ptr());
val = kernelFunction_->value(xaI);
if (val > 0) {
for (int k=0; k < source.nCols(); k++) {
_quantityLocal_(i,k) += val*source(j,k);
}
}
}
}
}
// accumulate across processors
int count = quantity_.nRows()*quantity_.nCols();
lammpsInterface_->allsum(_quantityLocal_.ptr(),quantity_.ptr(),count);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class OnTheFlyKernelAccumulationNormalized
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
OnTheFlyKernelAccumulationNormalized::OnTheFlyKernelAccumulationNormalized(ATC_Method * atc,
PerAtomQuantity<double> * source,
KernelFunction* kernelFunction,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN * weights):
OnTheFlyKernelAccumulation(atc,source,kernelFunction,atomCoarseGrainingPositions),
weights_(weights)
{
weights_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void OnTheFlyKernelAccumulationNormalized::reset_quantity() const
{
OnTheFlyKernelAccumulation::reset_quantity();
quantity_ *= weights_->quantity();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class OnTheFlyKernelAccumulationNormalizedReferenced
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
OnTheFlyKernelAccumulationNormalizedReferenced::OnTheFlyKernelAccumulationNormalizedReferenced(ATC_Method * atc,
PerAtomQuantity<double> * source,
KernelFunction* kernelFunction,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN* weights,
- const DENS_MAT * reference):
+ DENS_MAN * reference):
OnTheFlyKernelAccumulationNormalized(atc,source,kernelFunction,atomCoarseGrainingPositions,weights),
reference_(reference)
{
+ reference_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void OnTheFlyKernelAccumulationNormalizedReferenced::reset_quantity() const
{
OnTheFlyKernelAccumulationNormalized::reset_quantity();
- quantity_ -= *reference_;
+ quantity_ -= reference_->quantity();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class OnTheFlyKernelAccumulationNormalizedScaled
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
OnTheFlyKernelAccumulationNormalizedScaled::OnTheFlyKernelAccumulationNormalizedScaled(ATC_Method * atc,
PerAtomQuantity<double> * source,
KernelFunction* kernelFunction,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN* weights,
const double scale):
OnTheFlyKernelAccumulationNormalized(atc,source,kernelFunction,atomCoarseGrainingPositions,weights),
scale_(scale)
{
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void OnTheFlyKernelAccumulationNormalizedScaled::reset_quantity() const
{
OnTheFlyKernelAccumulationNormalized::reset_quantity();
quantity_ *= scale_;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AccumulantWeights
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AccumulantWeights::AccumulantWeights(SPAR_MAN* accumulant):
DiagonalMatrixTransfer<double>(),
accumulant_(accumulant)
{
accumulant_->register_dependence(this);
}
//--------------------------------------------------------
// Reset_quantity
//--------------------------------------------------------
void AccumulantWeights::reset_quantity() const
{
const SPAR_MAT accumulant(accumulant_->quantity());
int nNodes = accumulant.nCols();
// get summation of atoms per node
_localWeights_.reset(nNodes); _weights_.resize(nNodes);
if (accumulant.nRows()>0) {
_localWeights_ = (accumulant_->quantity()).col_sum();
}
lammpsInterface_->allsum(_localWeights_.ptr(),_weights_.ptr(),nNodes);
// assign weights
quantity_.resize(nNodes,nNodes);
for (int i = 0; i < nNodes; i++) {
if (_weights_(i) > 0.) {
quantity_(i,i) = 1./_weights_(i);
}
else {
quantity_(i,i) = 0.;
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class OnTheFlyKernelWeights
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
OnTheFlyKernelWeights::OnTheFlyKernelWeights(DENS_MAN* weights):
DiagonalMatrixTransfer<double>(),
weights_(weights)
{
weights_->register_dependence(this);
}
//--------------------------------------------------------
// Reset_quantity
//--------------------------------------------------------
void OnTheFlyKernelWeights::reset_quantity() const
{
const DENS_MAT & weights(weights_->quantity());
int nNodes = weights.nRows();
// assign weights
quantity_.resize(nNodes,nNodes);
for (int i = 0; i < nNodes; i++) {
if (weights(i,0) > 0.) {
quantity_(i,i) = 1./weights(i,0);
}
else {
quantity_(i,i) = 0.;
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class KernelInverseVolumes
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
KernelInverseVolumes::KernelInverseVolumes(ATC_Method * atc,
KernelFunction* kernelFunction):
kernelFunction_(kernelFunction),
feMesh_((atc->fe_engine())->fe_mesh())
{
// do nothing
}
//--------------------------------------------------------
// multiplication by transpose
//--------------------------------------------------------
void KernelInverseVolumes::reset_quantity() const
{
int nNodes = feMesh_->num_nodes_unique();
quantity_.resize(nNodes,nNodes);
quantity_ = kernelFunction_->inv_vol();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class OnTheFlyMeshAccumulation
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
OnTheFlyMeshAccumulation::OnTheFlyMeshAccumulation(ATC_Method * atc,
PerAtomQuantity<double> * source,
DENS_MAN* atomCoarseGrainingPositions):
atc_(atc),
source_(source),
atomCoarseGrainingPositions_(atomCoarseGrainingPositions),
feMesh_((atc_->fe_engine())->fe_mesh())
{
source_->register_dependence(this);
atomCoarseGrainingPositions_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void OnTheFlyMeshAccumulation::reset_quantity() const
{
const DENS_MAT & positions(atomCoarseGrainingPositions_->quantity());
const DENS_MAT & source(source_->quantity());
int nNodes = feMesh_->num_nodes_unique();
int nodesPerElement = feMesh_->num_nodes_per_element();
Array<int> node_list(nodesPerElement);
DENS_VEC shp(nodesPerElement);
quantity_.resize(nNodes,source.nCols());
_quantityLocal_.reset(nNodes,source.nCols());
DENS_VEC xj(atc_->nsd());
if (source.nRows()>0) {
for (int j = 0; j < source.nRows(); j++) {
for (int k = 0; k < atc_->nsd(); k++) {
xj(k) = positions(j,k);
}
feMesh_->shape_functions(xj,shp,node_list);
for (int I = 0; I < nodesPerElement; I++) {
int inode = node_list(I);
for (int k = 0; k < source.nCols(); k++) {
//quantity_(inode,k) += shp(I)*source(j,k);
_quantityLocal_(inode,k) += shp(I)*source(j,k);
}
}
}
}
// accumulate across processors
int count = quantity_.nRows()*quantity_.nCols();
lammpsInterface_->allsum(_quantityLocal_.ptr(),quantity_.ptr(),count);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class OnTheFlyMeshAccumulationNormalized
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
OnTheFlyMeshAccumulationNormalized::OnTheFlyMeshAccumulationNormalized(ATC_Method * atc,
PerAtomQuantity<double> * source,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN * weights):
OnTheFlyMeshAccumulation(atc,source,atomCoarseGrainingPositions),
weights_(weights)
{
weights_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void OnTheFlyMeshAccumulationNormalized::reset_quantity() const
{
OnTheFlyMeshAccumulation::reset_quantity();
quantity_ *= weights_->quantity();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class OnTheFlyMeshAccumulationNormalizedReferenced
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
OnTheFlyMeshAccumulationNormalizedReferenced::OnTheFlyMeshAccumulationNormalizedReferenced(ATC_Method * atc,
PerAtomQuantity<double> * source,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN* weights,
- const DENS_MAT * reference):
+ DENS_MAN * reference):
OnTheFlyMeshAccumulationNormalized(atc,source,atomCoarseGrainingPositions,weights),
reference_(reference)
{
+ reference_->register_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void OnTheFlyMeshAccumulationNormalizedReferenced::reset_quantity() const
{
OnTheFlyMeshAccumulationNormalized::reset_quantity();
- quantity_ -= *reference_;
+ quantity_ -= reference_->quantity();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class OnTheFlyMeshAccumulationNormalizedScaled
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
OnTheFlyMeshAccumulationNormalizedScaled::OnTheFlyMeshAccumulationNormalizedScaled(ATC_Method * atc,
PerAtomQuantity<double> * source,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN* weights,
const double scale):
OnTheFlyMeshAccumulationNormalized(atc,source,atomCoarseGrainingPositions,weights),
scale_(scale)
{
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void OnTheFlyMeshAccumulationNormalizedScaled::reset_quantity() const
{
OnTheFlyMeshAccumulationNormalized::reset_quantity();
quantity_ *= scale_;
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class NativeShapeFunctionGradient
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// constructor
//--------------------------------------------------------
NativeShapeFunctionGradient::NativeShapeFunctionGradient(ATC_Method * atc) :
VectorTransfer<SPAR_MAT * >(),
feEngine_(atc->fe_engine())
{
quantity_.resize(atc->nsd(),NULL);
for (int i = 0; i < atc->nsd(); ++i) {
quantity_[i] = new SPAR_MAT();
}
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
NativeShapeFunctionGradient::~NativeShapeFunctionGradient() {
for (unsigned i = 0; i < quantity_.size(); ++i) {
if (quantity_[i]) delete quantity_[i];
}
}
//--------------------------------------------------------
// reset_quantity()
//--------------------------------------------------------
void NativeShapeFunctionGradient::reset_quantity() const
{
feEngine_->compute_gradient_matrix(quantity_);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class OnTheFlyShapeFunctionProlongation
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
OnTheFlyShapeFunctionProlongation::OnTheFlyShapeFunctionProlongation(ATC_Method * atc,
DENS_MAN * source,
DENS_MAN * atomCoarseGrainingPositions):
FeToAtomTransfer(atc,source),
atomCoarseGrainingPositions_(atomCoarseGrainingPositions),
feMesh_((atc->fe_engine())->fe_mesh())
{
atomCoarseGrainingPositions_->register_dependence(this);
}
//--------------------------------------------------------
// destructor
//--------------------------------------------------------
OnTheFlyShapeFunctionProlongation::~OnTheFlyShapeFunctionProlongation()
{
atomCoarseGrainingPositions_->remove_dependence(this);
};
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void OnTheFlyShapeFunctionProlongation::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
const DENS_MAT & positions(atomCoarseGrainingPositions_->quantity());
const DENS_MAT & source(source_->quantity());
int nodesPerElement = feMesh_->num_nodes_per_element();
Array<int> node_list(nodesPerElement);
DENS_VEC shp(nodesPerElement);
DENS_VEC xj(positions.nCols());
int nLocal = positions.nRows();
quantity_ = 0.;
for (int j = 0; j < nLocal; j++) {
for (int k = 0; k < source.nCols(); k++) {
xj(k) = positions(j,k);
}
feMesh_->shape_functions(xj,shp,node_list);
for (int I = 0; I < nodesPerElement; I++) {
int inode = node_list(I);
for (int k = 0; k < source.nCols(); k++) {
quantity_(j,k) += shp(I)*source(inode,k);
}
}
}
}
}
}
diff --git a/lib/atc/TransferLibrary.h b/lib/atc/TransferLibrary.h
index 6f615bdb9..380cb6dcf 100644
--- a/lib/atc/TransferLibrary.h
+++ b/lib/atc/TransferLibrary.h
@@ -1,1639 +1,1724 @@
// a library for the various transfer operators used in ATC
#ifndef TRANSFER_LIBRARY_H
#define TRANSFER_LIBRARY_H
+#include <string>
+#include <map>
+#include <vector>
+
// ATC_Method headers
#include "TransferOperator.h"
-using namespace std;
-
namespace ATC {
// forward declarations
class ATC_Method;
class ATC_Coupling;
class FE_Engine;
class FE_Mesh;
class PrescribedDataManager;
class LargeToSmallAtomMap;
class MoleculeSet;
/**
* @class NodalAtomVolume
* @brief Computes the nodal volumes which coarse grain the volume per atom
*/
class NodalAtomVolume : public DenseMatrixTransfer<double> {
public:
// constructor
NodalAtomVolume(ATC_Method * atc, SPAR_MAN * shapeFunction);
// destructor
virtual ~NodalAtomVolume() {shapeFunction_->remove_dependence(this);};
/** apply transfer operator */
virtual void reset_quantity() const;
/** overload function to get the number rows */
virtual int nRows() const;
/** overload function to get the number columns */
virtual int nCols() const;
protected:
/** applies the needed averaging operation to get the appropriate average volume */
virtual double averaging_operation(const double totalVolume) const;
/** pointer to atc method object */
const ATC_Method * atc_;
/** shape function matrix used to base volumes on */
SPAR_MAN * shapeFunction_;
/** pointer to lammps interface */
const LammpsInterface * lammpsInterface_;
/** pointer to the FE engine */
const FE_Engine * feEngine_;
/** tolerance used in the linear solver */
const double tol_;
// workspace variables
mutable DIAG_MAT _rhsMatrix_;
mutable DENS_VEC _rhs_;
mutable DENS_VEC _scale_;
private:
// do not define
NodalAtomVolume();
};
/**
* @class NodalVolume
* @brief Computes the nodal volumes associated with the support of each nodal shape function
*/
class NodalVolume : public NodalAtomVolume {
public:
// constructor
NodalVolume(ATC_Method * atc, SPAR_MAN * shapeFunction) : NodalAtomVolume(atc,shapeFunction) {};
// destructor
virtual ~NodalVolume() {};
protected:
/** applies the needed averaging operation to get the appropriate average volume */
virtual double averaging_operation(const double totalVolume) const;
private:
// do not define
NodalVolume();
};
/**
* @class NodalAtomVolumeElement
* @brief Computes the nodal volumes which coarse grain the volume per atom based on element volumes
*/
class NodalAtomVolumeElement : public DenseMatrixTransfer<double> {
public:
// constructor
NodalAtomVolumeElement(ATC_Method * atc, SPAR_MAN * shapeFunction,
PerAtomQuantity<int> * atomElement=NULL);
// destructor
virtual ~NodalAtomVolumeElement() {
shapeFunction_->remove_dependence(this);
atomElement_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
/** overload function to get the number rows */
virtual int nRows() const;
/** overload function to get the number columns */
virtual int nCols() const;
protected:
/** pointer to atc method object */
ATC_Method * atc_;
/** shape function matrix used to base volumes on */
SPAR_MAN * shapeFunction_;
/** object containing the elements associated with each atom */
PerAtomQuantity<int> * atomElement_;
/** pointer to the FE engine */
const FE_Engine * feEngine_;
/** tolerance used in the linear solver */
const double tol_;
// workspace variables
mutable DIAG_MAT _nodeVolumesMatrix_;
mutable DENS_VEC _nodeVolumes_;
mutable DENS_VEC _nodeElementVolumes_;
mutable DENS_MAT _nodalCoords_;
mutable DENS_VEC _scale_;
private:
// do not define
NodalAtomVolumeElement();
};
/**
* @class AtomTypeElement
* @brief determines if the given atom type is in each element
*/
class AtomTypeElement : public DenseMatrixTransfer<int> {
public:
// constructor
AtomTypeElement(ATC_Coupling * atc,
PerAtomQuantity<int> * atomElement = NULL);
// destructor
virtual ~AtomTypeElement() {
atomElement_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** map from atom to the element in which it resides */
PerAtomQuantity<int> * atomElement_;
/** number of element */
int nElts_;
// workspace
mutable INT_ARRAY _quantityLocal_;
private:
// do not define
AtomTypeElement();
};
/**
* @class ElementMask
* @brief determines which elements should be used for FE quadrature
*/
class ElementMask : public DenseMatrixTransfer<bool> {
public:
// constructor
ElementMask(ATC_Coupling * atc,
MatrixDependencyManager<DenseMatrix, int> * hasInternal = NULL,
MatrixDependencyManager<DenseMatrix, int> * hasGhost = NULL);
// destructor
virtual ~ElementMask() {
hasInternal_->remove_dependence(this);
if (hasGhost_) hasGhost_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** shape function matrix over the internal atoms used to help define the geometry */
MatrixDependencyManager<DenseMatrix, int> * hasInternal_;
/** shape function matrix over the ghost atoms used to help define the geometry */
MatrixDependencyManager<DenseMatrix, int> * hasGhost_;
/** finite element engine */
const FE_Engine * feEngine_;
private:
// do not define
ElementMask();
};
+ /**
+ * @class AtomElementMask
+ * @brief determines which elements should be used for FE quadrature based on presence of atoms
+ */
+ class AtomElementMask : public DenseMatrixTransfer<bool> {
+
+ public:
+
+ // constructor
+ AtomElementMask(ATC_Coupling * atc,
+ MatrixDependencyManager<DenseMatrix, int> * hasAtoms = NULL);
+
+ // destructor
+ virtual ~AtomElementMask() {
+ hasAtoms_->remove_dependence(this);
+ };
+
+ /** apply transfer operator */
+ virtual void reset_quantity() const;
+
+ protected:
+
+ /** shape function matrix over the atoms used to help define the geometry */
+ MatrixDependencyManager<DenseMatrix, int> * hasAtoms_;
+
+ /** finite element engine */
+ const FE_Engine * feEngine_;
+
+ private:
+
+ // do not define
+ AtomElementMask();
+
+ };
+
/**
* @class NodalGeometryType
* @brief Computes the computational geometry associated with each node with respect to the FE and MD regions
*/
class NodalGeometryType : public DenseMatrixTransfer<int> {
public:
// constructor
NodalGeometryType(ATC_Coupling * atc,
MatrixDependencyManager<DenseMatrix, int> * hasInternal = NULL,
MatrixDependencyManager<DenseMatrix, int> * hasGhost = NULL);
// destructor
virtual ~NodalGeometryType() {
hasInternal_->remove_dependence(this);
if (hasGhost_) hasGhost_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** shape function matrix over the internal atoms used to help define the geometry */
MatrixDependencyManager<DenseMatrix, int> * hasInternal_;
/** shape function matrix over the ghost atoms used to help define the geometry */
MatrixDependencyManager<DenseMatrix, int> * hasGhost_;
/** finite element engine */
const FE_Engine * feEngine_;
/** number of nodes in the mesh */
int nNodes_;
/** number of elements in the mesh */
int nElts_;
// workspace
// ints so they can be shared through MPI
mutable Array<int> _nodesInternal_, _nodesGhost_;
private:
// do not define
NodalGeometryType();
};
+ /**
+ * @class NodalGeometryTypeElementSet
+ * @brief Divdes nodes into MD, FE, and boundary based on if they are connected to nodes in internal and not internal
+ */
+
+ class NodalGeometryTypeElementSet : public DenseMatrixTransfer<int> {
+
+ public:
+
+ // constructor
+ NodalGeometryTypeElementSet(ATC_Coupling * atc,
+ MatrixDependencyManager<DenseMatrix, int> * hasInternal = NULL);
+
+ // destructor
+ virtual ~NodalGeometryTypeElementSet() {
+ hasInternal_->remove_dependence(this);
+ };
+
+ /** apply transfer operator */
+ virtual void reset_quantity() const;
+
+ protected:
+
+ /** shape function matrix over the internal atoms used to help define the geometry */
+ MatrixDependencyManager<DenseMatrix, int> * hasInternal_;
+
+ /** finite element engine */
+ const FE_Engine * feEngine_;
+
+ /** number of nodes in the mesh */
+ int nNodes_;
+
+ /** number of elements in the mesh */
+ int nElts_;
+
+ // workspace
+ // ints so they can be shared through MPI
+ mutable Array<int> _nodesInternal_, _nodesGhost_;
+
+ private:
+
+ // do not define
+ NodalGeometryTypeElementSet();
+
+ };
+
/**
* @class LargeToSmallMap
* @brief mapping from a larger set to a smaller set
*/
class LargeToSmallMap : public DenseMatrixTransfer<int> {
public:
// constructor
LargeToSmallMap() : size_(0) {};
// destructor
virtual ~LargeToSmallMap() {};
/** get the number of elements associated with the map */
virtual int size() const {this->quantity(); return size_;};
protected:
/** number of nodes in the map */
mutable int size_;
};
/**
* @class NodeToSubset
* @brief mapping from all nodes to a subset
*/
class NodeToSubset : public LargeToSmallMap {
public:
// constructor
NodeToSubset(ATC_Method * atc,
SetDependencyManager<int> * subsetNodes);
// destructor
virtual ~NodeToSubset() {
subsetNodes_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** pointer to atc to get the number of nodes */
const ATC_Method * atc_;
/** map from atom to the element in which it resides */
SetDependencyManager<int> * subsetNodes_;
private:
// do not define
NodeToSubset();
};
/**
* @class SubsetToNode
* @brief mapping from a subset of nodes to all nodes
*/
class SubsetToNode : public DenseMatrixTransfer<int> {
public:
// constructor
SubsetToNode(NodeToSubset * nodeToSubset);
// destructor
virtual ~SubsetToNode() {
nodeToSubset_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** map from atom to the element in which it resides */
NodeToSubset * nodeToSubset_;
private:
// do not define
SubsetToNode();
};
/**
* @class ReducedSparseMatrix
* @brief reduction of a sparse matrix to only those columns consistent with the map
*/
class ReducedSparseMatrix : public SparseMatrixTransfer<double> {
public:
// constructor
ReducedSparseMatrix(ATC_Method * atc,
SPAR_MAN * source,
LargeToSmallAtomMap * map);
// destructor
virtual ~ReducedSparseMatrix();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** original quantity */
SPAR_MAN * source_;
/** mapping transfer */
LargeToSmallAtomMap * map_;
// workspace
mutable DenseVector<double> _row_; // vector storing the row values of a matrix
mutable DenseVector<INDEX> _index_; // vector storing the column indices of the values
private:
// do not define
ReducedSparseMatrix();
};
/**
* @class RowMappedSparseMatrix
* @brief mapping of rows from a sparse matrix to a new sparse matrix
*/
class RowMappedSparseMatrix : public ReducedSparseMatrix {
public:
// constructor
RowMappedSparseMatrix(ATC_Method * atc,
SPAR_MAN * source,
LargeToSmallAtomMap * map) :
ReducedSparseMatrix(atc,source,map) {};
// destructor
virtual ~RowMappedSparseMatrix() {};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
private:
// do not define
RowMappedSparseMatrix();
};
/**
* @class RowMappedSparseMatrixVector
* @brief mapping of rows from a vector sparse matrices to a new vector of sparse matrices
*/
class RowMappedSparseMatrixVector : public VectorTransfer<SPAR_MAT * > {
public:
// constructor
RowMappedSparseMatrixVector(ATC_Method * atc,
VectorDependencyManager<SPAR_MAT * > * source,
LargeToSmallAtomMap * map);
// destructor
virtual ~RowMappedSparseMatrixVector();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** original quantity */
VectorDependencyManager<SPAR_MAT * > * source_;
/** mapping transfer */
LargeToSmallAtomMap * map_;
// workspace
mutable DenseVector<double> _row_; // vector storing the row values of a matrix
mutable DenseVector<INDEX> _index_; // vector storing the column indices of the values
private:
// do not define
RowMappedSparseMatrixVector();
};
/**
* @class MappedDiagonalMatrix
* @brief mapping of a diagonal matrix to a new diagronal matrix
*/
class MappedDiagonalMatrix : public DiagonalMatrixTransfer<double> {
public:
// constructor
MappedDiagonalMatrix(ATC_Method * atc,
DIAG_MAN * source,
LargeToSmallAtomMap * map);
// destructor
virtual ~MappedDiagonalMatrix();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** original quantity */
DIAG_MAN * source_;
/** mapping transfer */
LargeToSmallAtomMap * map_;
private:
// do not define
MappedDiagonalMatrix();
};
/**
* @class MappedQuantity
* @brief generic reduced mapping
*/
class MappedQuantity : public DenseMatrixTransfer<double> {
public:
// constructor
MappedQuantity(ATC_Method * atc,
DENS_MAN * source,
LargeToSmallMap * map);
// destructor
virtual ~MappedQuantity() {
source_->remove_dependence(this);
map_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** original quantity */
DENS_MAN * source_;
/** mapping transfer */
LargeToSmallMap * map_;
private:
// do not define
MappedQuantity();
};
/**
* @class RegulatedNodes
* @brief set of all nodes being controlled by an atomic regulator
*/
class RegulatedNodes : public SetTransfer<int> {
public:
// constructor
RegulatedNodes(ATC_Coupling * atc,
FieldName fieldName = NUM_TOTAL_FIELDS,
MatrixDependencyManager<DenseMatrix, int> * nodalGeometryType = NULL);
// destructor
virtual ~RegulatedNodes() {
nodalGeometryType_->remove_dependence(this);
};
protected:
/** recomputes the set of regulated nodes based on prescribed data and atom locations */
virtual void reset_quantity() const;
/** map from fields to their sizes */
- map<FieldName,int> fieldSizes_;
+ std::map<FieldName,int> fieldSizes_;
/** map from atom to element in which it resides */
MatrixDependencyManager<DenseMatrix, int> * nodalGeometryType_;
/** pointer to atc object */
ATC_Coupling * atc_;
/** pointer to the finite element engine */
const FE_Engine * feEngine_;
/** pointer to the prescribed data manager */
const PrescribedDataManager * prescribedDataManager_;
// methods
/** adds boundary nodes */
void insert_boundary_nodes() const;
/** adds nodes associated with boundary facesets */
void insert_boundary_faces() const;
/** adds fixed nodes */
void insert_fixed_nodes() const;
/** adds nodes associated with face fluxes */
void insert_face_fluxes() const;
/** adds nodes associated with element fluxes */
void insert_element_fluxes() const;
private:
// do not define
RegulatedNodes();
};
/**
* @class FluxNodes
* @brief set of all nodes being controlled by an atomic regulator for fluxes
*/
class FluxNodes : public RegulatedNodes {
public:
// constructor
FluxNodes(ATC_Coupling * atc,
FieldName fieldName = NUM_TOTAL_FIELDS,
MatrixDependencyManager<DenseMatrix, int> * nodalGeometryType = NULL) :
RegulatedNodes(atc,fieldName,nodalGeometryType) {};
// destructor
virtual ~FluxNodes() {};
protected:
/** recomputes the set of regulated nodes based on prescribed data and atom locations */
virtual void reset_quantity() const;
private:
// do not define
FluxNodes();
};
/**
* @class BoundaryNodes
* @brief set of all nodes associated with the FE/MD boundary
*/
class BoundaryNodes : public RegulatedNodes {
public:
// constructor
BoundaryNodes(ATC_Coupling * atc,
FieldName fieldName = NUM_TOTAL_FIELDS,
MatrixDependencyManager<DenseMatrix, int> * nodalGeometryType = NULL) :
RegulatedNodes(atc,fieldName,nodalGeometryType) {};
// destructor
virtual ~BoundaryNodes() {};
protected:
/** recomputes the set of regulated nodes based on prescribed data and atom locations */
virtual void reset_quantity() const;
private:
// do not define
BoundaryNodes();
};
/**
* @class FluxBoundaryNodes
* @brief set of all nodes being controlled by an atomic regulator for fluxes
*/
class FluxBoundaryNodes : public FluxNodes {
public:
// constructor
FluxBoundaryNodes(ATC_Coupling * atc,
FieldName fieldName = NUM_TOTAL_FIELDS,
MatrixDependencyManager<DenseMatrix, int> * nodalGeometryType = NULL) :
FluxNodes(atc,fieldName,nodalGeometryType) {};
// destructor
virtual ~FluxBoundaryNodes() {};
protected:
/** recomputes the set of regulated nodes based on prescribed data and atom locations */
virtual void reset_quantity() const;
private:
// do not define
FluxBoundaryNodes();
};
/**
* @class AllRegulatedNodes
* @brief set of all nodes being controlled by an atomic regulator when localization is used
*/
class AllRegulatedNodes : public FluxBoundaryNodes {
public:
// constructor
AllRegulatedNodes(ATC_Coupling * atc,
FieldName fieldName = NUM_TOTAL_FIELDS,
MatrixDependencyManager<DenseMatrix, int> * nodalGeometryType = NULL) :
FluxBoundaryNodes(atc,fieldName,nodalGeometryType) {};
// destructor
virtual ~AllRegulatedNodes() {};
protected:
/** recomputes the set of regulated nodes based on prescribed data and atom locations */
virtual void reset_quantity() const;
private:
// do not define
AllRegulatedNodes();
};
/**
* @class FixedNodes
* @brief set of all nodes being controlled by an atomic regulator which are fixed
*/
class FixedNodes : public RegulatedNodes {
public:
// constructor
FixedNodes(ATC_Coupling * atc,
FieldName fieldName = NUM_TOTAL_FIELDS,
MatrixDependencyManager<DenseMatrix, int> * nodalGeometryType = NULL) :
RegulatedNodes(atc,fieldName,nodalGeometryType) {};
// destructor
virtual ~FixedNodes() {};
protected:
/** recomputes the set of regulated nodes based on prescribed data and atom locations */
virtual void reset_quantity() const;
private:
// do not define
FixedNodes();
};
/**
* @class FixedBoundaryNodes
* @brief set of all nodes being controlled by an atomic regulator which are fixed, including for coupling
*/
class FixedBoundaryNodes : public FixedNodes {
public:
// constructor
FixedBoundaryNodes(ATC_Coupling * atc,
FieldName fieldName = NUM_TOTAL_FIELDS,
MatrixDependencyManager<DenseMatrix, int> * nodalGeometryType = NULL) :
FixedNodes(atc,fieldName,nodalGeometryType) {};
// destructor
virtual ~FixedBoundaryNodes() {};
protected:
/** recomputes the set of regulated nodes based on prescribed data and atom locations */
virtual void reset_quantity() const;
private:
// do not define
FixedBoundaryNodes();
};
/**
* @class ElementMaskNodeSet
* @brief determines which elements should be used for FE quadrature based on them possessing certain nodes
*/
class ElementMaskNodeSet : public DenseMatrixTransfer<bool> {
public:
// constructor
ElementMaskNodeSet(ATC_Coupling * atc,
RegulatedNodes * nodeSet);
// destructor
virtual ~ElementMaskNodeSet() {
nodeSet_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** transfer determining used nodes */
RegulatedNodes * nodeSet_;
/** finite element mesh */
const FE_Mesh * feMesh_;
private:
// do not define
ElementMaskNodeSet();
};
/**
* @class PointToElementMap
* @brief Class for identifying the element associated with a given point
*/
class PointToElementMap : public DenseMatrixTransfer<int> {
public:
// constructor
PointToElementMap(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, double> * pointPositions);
// destructor
virtual ~PointToElementMap();
protected:
/** resets the data if necessary */
virtual void reset_quantity() const;
/** point positions */
MatrixDependencyManager<DenseMatrix, double> * pointPositions_;
/** pointer to finite element mesh */
const FE_Mesh * feMesh_;
private:
// do not define
PointToElementMap();
};
/**
* @class Interpolant
* @brief constructs the spatial values of the shape functions
*/
class Interpolant : public SparseMatrixTransfer<double> {
public:
// constructor
Interpolant(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int>* pointToElementMap,
DENS_MAN* pointPositions);
// destructor
virtual ~Interpolant() {
pointToElementMap_->remove_dependence(this);
pointPositions_->remove_dependence(this);
};
protected:
/** does the actual computation of the quantity */
virtual void reset_quantity() const;
protected:
/** map from point coordinates to element */
MatrixDependencyManager<DenseMatrix, int>* pointToElementMap_;
/** coordinates used to evaluate shape functions */
DENS_MAN* pointPositions_;
/** pointer to the FE engine */
const FE_Engine * feEngine_;
private:
// do not define
Interpolant();
};
/**
* @class InterpolantGradient
* @brief constructs the spatial derivatives of the shape functions
*/
class InterpolantGradient : public VectorTransfer<SPAR_MAT * > {
public:
// constructor
InterpolantGradient(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int>* pointToElementMap,
DENS_MAN* pointPositions);
// destructor
virtual ~InterpolantGradient();
protected:
/** does the actual computation of the quantity */
virtual void reset_quantity() const;
protected:
/** map from point coordinates to element */
MatrixDependencyManager<DenseMatrix, int>* pointToElementMap_;
/** coordinates used to evaluate shape functions */
DENS_MAN* pointPositions_;
/** pointer to the FE engine */
const FE_Engine * feEngine_;
private:
// do not define
InterpolantGradient();
};
/**
* @class PerAtomShapeFunctionGradient
* @brief constructs the spatial derivatives of the shape functions at each atom
*/
class PerAtomShapeFunctionGradient : public VectorTransfer<SPAR_MAT * > {
public:
// constructor
PerAtomShapeFunctionGradient(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int>* atomToElementMap = NULL,
DENS_MAN* atomPositions = NULL,
- const string & tag = "AtomicShapeFunctionGradient",
+ const std::string & tag = "AtomicShapeFunctionGradient",
AtomType atomType = INTERNAL);
// destructor
virtual ~PerAtomShapeFunctionGradient();
protected:
/** does the actual computation of the quantity */
virtual void reset_quantity() const;
protected:
/** map from point coordinates to element */
MatrixDependencyManager<DenseMatrix, int>* atomToElementMap_;
/** coordinates used to evaluate shape functions */
DENS_MAN* atomPositions_;
/** pointer to the FE engine */
const FE_Engine * feEngine_;
/** container for dependency managers */
- vector<AtcAtomSparseMatrix<double> * > matrices_;
+ std::vector<AtcAtomSparseMatrix<double> * > matrices_;
private:
// do not define
PerAtomShapeFunctionGradient();
};
/**
* @class InterpolantSmallMolecule
* @brief constructs the spatial values of the shape functions for small molecules
*/
class InterpolantSmallMolecule : public Interpolant {
public:
// constructor
InterpolantSmallMolecule(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int>* moleculeToElementMap,
DENS_MAN* moleculePositions,
MoleculeSet * moleculeSet);
// destructor
virtual ~InterpolantSmallMolecule();
protected:
/** does the actual computation of the quantity */
virtual void reset_quantity() const;
protected:
/** pointer to atc base class */
MoleculeSet * moleculeSet_;
// workspace
mutable DENS_VEC _fractions_;
private:
// do not define
InterpolantSmallMolecule();
};
/**
* @class DenseMatrixQuotient
* @brief quotient of two matrices
*/
class DenseMatrixQuotient : public DenseMatrixTransfer<double> {
public:
// constructor
DenseMatrixQuotient(DENS_MAN * matrixNumerator, DENS_MAN * matrixDenominator);
// destructor
virtual ~DenseMatrixQuotient() {
matrixNumerator_->remove_dependence(this);
matrixDenominator_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
/** get number of columns */
virtual int nCols() const {return matrixNumerator_->nCols();};
protected:
DENS_MAN* matrixNumerator_;
DENS_MAN* matrixDenominator_;
private:
// do not define
DenseMatrixQuotient();
};
/**
* @class DenseMatrixSum
* @brief sum of two matrices
*/
class DenseMatrixSum : public DenseMatrixTransfer<double> {
public:
// constructor
DenseMatrixSum(DENS_MAN * matrixOne, DENS_MAN * matrixTwo);
// destructor
virtual ~DenseMatrixSum() {
matrixOne_->remove_dependence(this);
matrixTwo_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
/** get number of columns */
virtual int nCols() const {return matrixOne_->nCols();};
protected:
DENS_MAN* matrixOne_;
DENS_MAN* matrixTwo_;
private:
// do not define
DenseMatrixSum();
};
/**
* @class DenseMatrixDelta
* @brief change relative to a reference value
*/
class DenseMatrixDelta : public DenseMatrixTransfer<double> {
public:
// constructor
DenseMatrixDelta(DENS_MAN * current, DENS_MAT * reference);
// destructor
virtual ~DenseMatrixDelta() {
matrix_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
DENS_MAN* matrix_;
DENS_MAT* reference_;
private:
// do not define
DenseMatrixDelta();
};
/**
* @class OnTheFlyKernelAccumulation
* @brief implements the accumulant on the fly
*/
class OnTheFlyKernelAccumulation : public DenseMatrixTransfer<double> {
public:
// constructor
OnTheFlyKernelAccumulation(ATC_Method * atc,
PerAtomQuantity<double> * source,
KernelFunction* kernelFunction,
DENS_MAN* atomCoarseGrainingPositions);
// destructor
virtual ~OnTheFlyKernelAccumulation() {
source_->remove_dependence(this);
atomCoarseGrainingPositions_->remove_dependence(this);
};
/** do nothing */
virtual void reset_quantity() const;
protected:
/** pointer to atc base class */
const ATC_Method * atc_;
/** pointer to source data */
PerAtomQuantity<double> * source_;
/** map from atom coordinates to element */
KernelFunction* kernelFunction_;
/** atomic coordinates used for coarse graining operations */
DENS_MAN* atomCoarseGrainingPositions_;
/** access to mesh */
const FE_Mesh * feMesh_;
// workspace
mutable DENS_MAT _quantityLocal_;
private:
// do not define
OnTheFlyKernelAccumulation();
};
/**
* @class OnTheFlyKernelAccumulationNormalized
* @brief implements a normalized accumulant on the fly
*/
class OnTheFlyKernelAccumulationNormalized : public OnTheFlyKernelAccumulation {
public:
// constructor
OnTheFlyKernelAccumulationNormalized(ATC_Method * atc,
PerAtomQuantity<double> * source,
KernelFunction* kernelFunction,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN* weights);
// destructor
virtual ~OnTheFlyKernelAccumulationNormalized() {
weights_->remove_dependence(this);
};
/** do nothing */
virtual void reset_quantity() const;
protected:
DIAG_MAN * weights_;
private:
// do not define
OnTheFlyKernelAccumulationNormalized();
};
/**
* @class OnTheFlyKernelAccumulationNormalizedReferenced
* @brief implements a normalized referenced accumulant on the fly
*/
class OnTheFlyKernelAccumulationNormalizedReferenced : public OnTheFlyKernelAccumulationNormalized {
public:
// constructor
OnTheFlyKernelAccumulationNormalizedReferenced(ATC_Method * atc,
PerAtomQuantity<double> * source,
KernelFunction* kernelFunction,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN* weights,
- const DENS_MAT * reference);
+ DENS_MAN * reference);
// destructor
virtual ~OnTheFlyKernelAccumulationNormalizedReferenced() {
- atomCoarseGrainingPositions_->remove_dependence(this);
+ reference_->remove_dependence(this);
};
/** do nothing */
virtual void reset_quantity() const;
protected:
- const DENS_MAT * reference_;
+ /** reference value */
+ DENS_MAN * reference_;
private:
// do not define
OnTheFlyKernelAccumulationNormalizedReferenced();
};
/**
* @class OnTheFlyKernelNormalizedAccumulationScaled
* @brief implements a scaled accumulant on the fly
*/
class OnTheFlyKernelAccumulationNormalizedScaled : public OnTheFlyKernelAccumulationNormalized {
public:
// constructor
OnTheFlyKernelAccumulationNormalizedScaled(ATC_Method * atc,
PerAtomQuantity<double> * source,
KernelFunction* kernelFunction,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN* weights,
const double scale);
// destructor
virtual ~OnTheFlyKernelAccumulationNormalizedScaled() {
atomCoarseGrainingPositions_->remove_dependence(this);
};
/** do nothing */
virtual void reset_quantity() const;
protected:
const double scale_;
private:
// do not define
OnTheFlyKernelAccumulationNormalizedScaled();
};
/**
* @class AccumulantWeights
* @brief weights for kernel function accumulants
*/
class AccumulantWeights : public DiagonalMatrixTransfer<double> {
public:
// constructor
AccumulantWeights(SPAR_MAN * accumulant);
// destructor
virtual ~AccumulantWeights() {
accumulant_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
SPAR_MAN* accumulant_;
// workspace
mutable DENS_VEC _localWeights_;
mutable DENS_VEC _weights_;
private:
// do not define
AccumulantWeights();
};
/**
* @class OnTheFlyKernelWeights
* @brief weights for on-the-fly kernel function
*/
class OnTheFlyKernelWeights : public DiagonalMatrixTransfer<double> {
public:
// constructor
OnTheFlyKernelWeights(DENS_MAN * weights);
// destructor
virtual ~OnTheFlyKernelWeights() {
weights_->remove_dependence(this);
};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
DENS_MAN* weights_;
private:
// do not define
OnTheFlyKernelWeights();
};
/**
* @class KernelInverseVolumes
* @brief inverse volumes for kernel function accumulants
*/
class KernelInverseVolumes : public DiagonalMatrixTransfer<double> {
public:
// constructor
KernelInverseVolumes(ATC_Method * atc,
KernelFunction* kernelFunction);
// destructor
virtual ~KernelInverseVolumes() {};
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** kernel function being used */
KernelFunction* kernelFunction_;
/** access to mesh */
const FE_Mesh * feMesh_;
private:
// do not define
KernelInverseVolumes();
};
/**
* @class OnTheFlyMeshAccumulation
* @brief implements the mesh-based accumulant on the fly
*/
class OnTheFlyMeshAccumulation : public DenseMatrixTransfer<double> {
public:
// constructor
OnTheFlyMeshAccumulation(ATC_Method * atc,
PerAtomQuantity<double> * source,
DENS_MAN* atomCoarseGrainingPositions);
// destructor
virtual ~OnTheFlyMeshAccumulation() {
source_->remove_dependence(this);
atomCoarseGrainingPositions_->remove_dependence(this);
};
/** do nothing */
virtual void reset_quantity() const;
/** access nCols_ */
virtual int nCols() const { return source_->nCols(); }
protected:
/** pointer to atc base class */
const ATC_Method * atc_;
/** pointer to source data */
PerAtomQuantity<double> * source_;
/** atomic coordinates used for coarse graining operations */
DENS_MAN* atomCoarseGrainingPositions_;
/** access to mesh */
const FE_Mesh * feMesh_;
// workspace
mutable DENS_MAT _quantityLocal_;
private:
// do not define
OnTheFlyMeshAccumulation();
};
/**
* @class OnTheFlyMeshAccumulationNormalized
* @brief implements a normalized mesh-based accumulant on the fly
*/
class OnTheFlyMeshAccumulationNormalized : public OnTheFlyMeshAccumulation {
public:
// constructor
OnTheFlyMeshAccumulationNormalized(ATC_Method * atc,
PerAtomQuantity<double> * source,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN* weights);
// destructor
virtual ~OnTheFlyMeshAccumulationNormalized() {
weights_->remove_dependence(this);
};
/** do nothing */
virtual void reset_quantity() const;
protected:
DIAG_MAN * weights_;
private:
// do not define
OnTheFlyMeshAccumulationNormalized();
};
/**
* @class OnTheFlyMeshAccumulationNormalizedReferenced
* @brief implements a normalized referenced mesh-based accumulant on the fly
*/
class OnTheFlyMeshAccumulationNormalizedReferenced : public OnTheFlyMeshAccumulationNormalized {
public:
// constructor
OnTheFlyMeshAccumulationNormalizedReferenced(ATC_Method * atc,
PerAtomQuantity<double> * source,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN* weights,
- const DENS_MAT * reference);
+ DENS_MAN * reference);
// destructor
virtual ~OnTheFlyMeshAccumulationNormalizedReferenced() {
- atomCoarseGrainingPositions_->remove_dependence(this);
+ reference_->remove_dependence(this);
};
/** do nothing */
virtual void reset_quantity() const;
protected:
- const DENS_MAT * reference_;
+ /** reference value */
+ DENS_MAN * reference_;
private:
// do not define
OnTheFlyMeshAccumulationNormalizedReferenced();
};
/**
* @class OnTheFlyMeshAccumulationNormalizedScaled
* @brief implements a scaled mesh-based accumulant on the fly
*/
class OnTheFlyMeshAccumulationNormalizedScaled : public OnTheFlyMeshAccumulationNormalized {
public:
// constructor
OnTheFlyMeshAccumulationNormalizedScaled(ATC_Method * atc,
PerAtomQuantity<double> * source,
DENS_MAN* atomCoarseGrainingPositions,
DIAG_MAN* weights,
const double scale);
// destructor
virtual ~OnTheFlyMeshAccumulationNormalizedScaled() {
atomCoarseGrainingPositions_->remove_dependence(this);
};
/** do nothing */
virtual void reset_quantity() const;
protected:
const double scale_;
private:
// do not define
OnTheFlyMeshAccumulationNormalizedScaled();
};
/**
* @class NativeShapeFunctionGradient
* @brief constructs the spatial derivatives of the shape functions
*/
class NativeShapeFunctionGradient : public VectorTransfer<SPAR_MAT * > {
public:
// constructor
NativeShapeFunctionGradient(ATC_Method * atc);
// destructor
virtual ~NativeShapeFunctionGradient();
protected:
/** does the actual computation of the quantity */
virtual void reset_quantity() const;
protected:
/** pointer to the FE engine */
const FE_Engine * feEngine_;
private:
// do not define
NativeShapeFunctionGradient();
};
/**
* @class OnTheFlyShapeFunctionProlongation
* @brief implements the interpolant on the fly
*/
class OnTheFlyShapeFunctionProlongation : public FeToAtomTransfer {
public:
// constructor
OnTheFlyShapeFunctionProlongation(ATC_Method * atc,
DENS_MAN * source,
DENS_MAN * atomCoarseGrainingPositions);
// destructor
virtual ~OnTheFlyShapeFunctionProlongation();
/** do nothing */
virtual void reset() const;
protected:
/** pointer to atc base class */
//const ATC_Method * atc_;
/** pointer to source data */
//DENS_MAN * source_;
/** atomic coordinates used for coarse graining operations */
DENS_MAN* atomCoarseGrainingPositions_;
/** access to mesh */
const FE_Mesh * feMesh_;
// workspace
//mutable DENS_MAT _quantityLocal_;
private:
// do not define
OnTheFlyShapeFunctionProlongation();
};
}
#endif
diff --git a/lib/atc/TransferOperator.cpp b/lib/atc/TransferOperator.cpp
index a562d9c25..efa4bc1da 100644
--- a/lib/atc/TransferOperator.cpp
+++ b/lib/atc/TransferOperator.cpp
@@ -1,905 +1,911 @@
// ATC headers
#include "TransferOperator.h"
#include "ATC_Method.h"
#include "ATC_Coupling.h"
#include "KernelFunction.h"
#include "FE_Mesh.h"
//#include "AtomToMoleculeTransfer.h"
//#include <typeinfo>
namespace ATC {
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomToFeTransfer
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomToFeTransfer::AtomToFeTransfer(ATC_Method * atc,
PerAtomQuantity<double> * source) :
DenseMatrixTransfer<double>(),
atc_(atc),
source_(source)
{
source_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtomToFeTransfer::~AtomToFeTransfer()
{
source_->remove_dependence(this);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtomDiagonalMatrixToFeTransfer
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtomDiagonalMatrixToFeTransfer::AtomDiagonalMatrixToFeTransfer(ATC_Method * atc,
PerAtomDiagonalMatrix<double> * source) :
DenseMatrixTransfer<double>(),
atc_(atc),
source_(source)
{
source_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtomDiagonalMatrixToFeTransfer::~AtomDiagonalMatrixToFeTransfer()
{
source_->remove_dependence(this);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FeToAtomTransfer
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
FeToAtomTransfer::FeToAtomTransfer(ATC_Method * atc,
- DENS_MAN * source) :
- ProtectedAtomQuantity<double>(atc,source->nCols()),
+ DENS_MAN * source,
+ AtomType atomType) :
+ ProtectedAtomQuantity<double>(atc,source->nCols(),atomType),
source_(source)
{
source_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
FeToAtomTransfer::~FeToAtomTransfer()
{
source_->remove_dependence(this);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FeToAtomDiagonalMatrix
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
FeToAtomDiagonalMatrix::FeToAtomDiagonalMatrix(ATC_Method * atc,
DENS_MAN * source) :
ProtectedAtomDiagonalMatrix<double>(atc),
source_(source)
{
source_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
FeToAtomDiagonalMatrix::~FeToAtomDiagonalMatrix()
{
source_->remove_dependence(this);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtfShapeFunctionRestriction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfShapeFunctionRestriction::AtfShapeFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * shapeFunction) :
AtomToFeTransfer(atc,source),
shapeFunction_(shapeFunction)
{
shapeFunction_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtfShapeFunctionRestriction::~AtfShapeFunctionRestriction()
{
shapeFunction_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AtfShapeFunctionRestriction::reset_quantity() const
{
global_restriction();
}
//--------------------------------------------------------
// global_restriction
//--------------------------------------------------------
void AtfShapeFunctionRestriction::global_restriction() const
{
// computes nodeData = N*atomData where N are the shape functions
const DENS_MAT & sourceMatrix(source_->quantity());
// reallocate memory only if sizing has changed
const SPAR_MAT & shapeFunctionMatrix(shapeFunction_->quantity());
quantity_.resize(shapeFunctionMatrix.nCols(),sourceMatrix.nCols());
local_restriction(sourceMatrix,shapeFunctionMatrix);
// communicate for total restriction
int count = quantity_.nRows()*quantity_.nCols();
lammpsInterface_->allsum(_workspace_.ptr(),quantity_.ptr(),count);
}
//--------------------------------------------------------
// local_restriction
//--------------------------------------------------------
void AtfShapeFunctionRestriction::local_restriction(const DENS_MAT & sourceMatrix,
const SPAR_MAT & shapeFunctionMatrix) const
{
if (sourceMatrix.nRows() > 0)
_workspace_ = shapeFunctionMatrix.transMat(sourceMatrix);
else
_workspace_.reset(quantity_.nRows(),quantity_.nCols());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AdmtfShapeFunctionRestriction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AdmtfShapeFunctionRestriction::AdmtfShapeFunctionRestriction(ATC_Method * atc,
PerAtomDiagonalMatrix<double> * source,
SPAR_MAN * shapeFunction) :
AtomDiagonalMatrixToFeTransfer(atc,source),
shapeFunction_(shapeFunction)
{
shapeFunction_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AdmtfShapeFunctionRestriction::~AdmtfShapeFunctionRestriction()
{
shapeFunction_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AdmtfShapeFunctionRestriction::reset_quantity() const
{
global_restriction();
}
//--------------------------------------------------------
// global_restriction
//--------------------------------------------------------
void AdmtfShapeFunctionRestriction::global_restriction() const
{
// computes nodeData = N*atomData where N are the shape functions
const CLON_VEC & sourceMatrix(source_->quantity());
// reallocate memory only if sizing has changed
const SPAR_MAT & shapeFunctionMatrix(shapeFunction_->quantity());
quantity_.resize(shapeFunctionMatrix.nCols(),sourceMatrix.nCols());
local_restriction(sourceMatrix,shapeFunctionMatrix);
// communicate for total restriction
int count = quantity_.nRows()*quantity_.nCols();
lammpsInterface_->allsum(_workspace_.ptr(),quantity_.ptr(),count);
}
//--------------------------------------------------------
// local_restriction
//--------------------------------------------------------
void AdmtfShapeFunctionRestriction::local_restriction(const DENS_MAT & sourceMatrix,
const SPAR_MAT & shapeFunctionMatrix) const
{
if (sourceMatrix.nRows() > 0)
_workspace_ = shapeFunctionMatrix.transMat(sourceMatrix);
else
_workspace_.reset(quantity_.nRows(),quantity_.nCols());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class DiagonalMatrixMultiply
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
DiagonalMatrixMultiply::DiagonalMatrixMultiply(DENS_MAN * source,
DIAG_MAN * diagonalMatrix) :
MatToMatTransfer<double>(source),
diagonalMatrix_(diagonalMatrix)
{
diagonalMatrix_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
DiagonalMatrixMultiply::~DiagonalMatrixMultiply()
{
diagonalMatrix_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void DiagonalMatrixMultiply::reset_quantity() const
{
quantity_ = (diagonalMatrix_->quantity())*(source_->quantity());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtfProjection
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfProjection::AtfProjection(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * accumulant,
DIAG_MAN * weights) :
AtomToFeTransfer(atc,source),
accumulant_(accumulant),
weights_(weights)
{
if(accumulant_) accumulant_->register_dependence(this);
if(weights_) weights_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtfProjection::~AtfProjection()
{
if(accumulant_) accumulant_->remove_dependence(this);
if(weights_) weights_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AtfProjection::reset_quantity() const
{
global_restriction();
}
//--------------------------------------------------------
// global_restriction
//--------------------------------------------------------
void AtfProjection::global_restriction() const
{
// computes nodeData = N*atomData where N are the shape functions
const DENS_MAT & sourceMatrix(source_->quantity());
// reallocate memory only if sizing has changed
const SPAR_MAT & accumulantMatrix(accumulant_->quantity());
quantity_.resize(accumulantMatrix.nCols(),sourceMatrix.nCols());
local_restriction(sourceMatrix,accumulantMatrix);
// communicate for total restriction
int count = quantity_.nRows()*quantity_.nCols();
lammpsInterface_->allsum(_workspace_.ptr(),quantity_.ptr(),count);
if (weights_) {
CLON_VEC w(weights_->quantity());
quantity_ *= w;
}
}
//--------------------------------------------------------
// local_restriction
//--------------------------------------------------------
void AtfProjection::local_restriction(const DENS_MAT & sourceMatrix,
const SPAR_MAT & accumulantMatrix) const
{
if (sourceMatrix.nRows() > 0)
_workspace_ = accumulantMatrix.transMat(sourceMatrix);
else
_workspace_.reset(quantity_.nRows(),quantity_.nCols());
}
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfProjectionScaled::AtfProjectionScaled(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * accumulant,
const double scale,
DIAG_MAN * weights) :
AtfProjection(atc,source,accumulant,weights),
scale_(scale)
{
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtfProjectionScaled::~AtfProjectionScaled()
{
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AtfProjectionScaled::reset_quantity() const
{
global_restriction();
quantity_ *= scale_;
}
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfProjectionReferenced::AtfProjectionReferenced(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * accumulant,
- const DENS_MAT * reference,
+ DENS_MAN * reference,
DIAG_MAN * weights) :
AtfProjection(atc,source,accumulant,weights),
reference_(reference)
{
+ if(reference_) reference_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtfProjectionReferenced::~AtfProjectionReferenced()
{
+ if(reference_) reference_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AtfProjectionReferenced::reset_quantity() const
{
global_restriction();
- quantity_ -= *reference_;
+ quantity_ -= (reference_->quantity());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtfWeightedShapeFunctionRestriction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfWeightedShapeFunctionRestriction::AtfWeightedShapeFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * shapeFunction,
DIAG_MAN * weights) :
AtfShapeFunctionRestriction(atc,source,shapeFunction),
weights_(weights)
{
weights_->register_dependence(this);
}
//--------------------------------------------------------
// local_restriction
//--------------------------------------------------------
void AtfWeightedShapeFunctionRestriction::local_restriction(const DENS_MAT & sourceMatrix,
const SPAR_MAT & shapeFunctionMatrix) const
{
if (sourceMatrix.nRows() > 0) {
const DIAG_MAT & weightsMatrix(weights_->quantity());
_workspace_ = shapeFunctionMatrix.transMat(weightsMatrix*sourceMatrix);
}
else {
_workspace_.reset(quantity_.nRows(),quantity_.nCols());
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtfNodeWeightedShapeFunctionRestriction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfNodeWeightedShapeFunctionRestriction::AtfNodeWeightedShapeFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * shapeFunction,
DIAG_MAN * weights) :
AtfShapeFunctionRestriction(atc,source,shapeFunction),
weights_(weights)
{
weights_->register_dependence(this);
}
//--------------------------------------------------------
// global_restriction
//--------------------------------------------------------
void AtfNodeWeightedShapeFunctionRestriction::global_restriction() const
{
AtfShapeFunctionRestriction::global_restriction();
quantity_ *= weights_->quantity();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtfShapeFunctionProjection
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfShapeFunctionProjection::AtfShapeFunctionProjection(ATC_Method * atc,
DENS_MAN * source,
FieldName thisField) :
MatToMatTransfer<double>(source),
atc_(atc),
thisField_(thisField)
{
DIAG_MAN & massMat(atc_->mass_mat(thisField_));
massMat.register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtfShapeFunctionProjection::~AtfShapeFunctionProjection()
{
DIAG_MAN & massMat(atc_->mass_mat(thisField_));
massMat.remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AtfShapeFunctionProjection::reset_quantity() const
{
const DENS_MAT & sourceMatrix(source_->quantity());
atc_->apply_inverse_mass_matrix(sourceMatrix,quantity_,thisField_);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtfKernelFunctionRestriction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfKernelFunctionRestriction::AtfKernelFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
PerAtomQuantity<double> * coarseGrainingPositions,
KernelFunction * kernelFunction) :
AtomToFeTransfer(atc,source),
kernelFunction_(kernelFunction),
coarseGrainingPositions_(coarseGrainingPositions),
feMesh_(((atc->fe_engine())->fe_mesh()))
{
coarseGrainingPositions_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtfKernelFunctionRestriction::~AtfKernelFunctionRestriction()
{
coarseGrainingPositions_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AtfKernelFunctionRestriction::reset_quantity() const
{
global_restriction();
}
//--------------------------------------------------------
// global_restriction
//--------------------------------------------------------
void AtfKernelFunctionRestriction::global_restriction() const
{
// computes nodeData = N*atomData where N are the shape functions
const DENS_MAT & sourceMatrix(source_->quantity());
const DENS_MAT & positions(coarseGrainingPositions_->quantity());
// reallocate memory only if sizing has changed
quantity_.resize(atc_->num_nodes(),sourceMatrix.nCols());
local_restriction(sourceMatrix,positions,
kernelFunction_);
// communicate for total restriction
int count = quantity_.nRows()*quantity_.nCols();
lammpsInterface_->allsum(_workspace_.ptr(),quantity_.ptr(),count);
}
//--------------------------------------------------------
// local_restriction
//--------------------------------------------------------
void AtfKernelFunctionRestriction::local_restriction(const DENS_MAT & sourceMatrix,
const DENS_MAT & positions,
const KernelFunction * kernelFunction) const
{
if (sourceMatrix.nRows() > 0) {
_xI_.resize(positions.nCols()); _xaI_.resize(positions.nCols());
_workspace_.reset(quantity_.nRows(),quantity_.nCols());
double val;
for (int i = 0; i < quantity_.nRows(); i++) {
_xI_ = feMesh_->nodal_coordinates(i);
for (int j = 0; j < sourceMatrix.nRows(); j++) {
for (int k = 0; k < positions.nCols(); k++)
_xaI_(k) = _xI_(k) - positions(j,k);
atc_->lammps_interface()->periodicity_correction(_xaI_.ptr());
val = kernelFunction->value(_xaI_);
if (val > 0) {
for (int k = 0; k < sourceMatrix.nCols(); k++)
_workspace_(i,k) += val*sourceMatrix(j,k);
}
}
}
}
else
_workspace_.reset(quantity_.nRows(),quantity_.nCols());
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtfWeightedKernelFunctionRestriction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfWeightedKernelFunctionRestriction::AtfWeightedKernelFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
PerAtomQuantity<double> * coarseGrainingPositions,
KernelFunction * kernelFunction,
DIAG_MAN * weights) :
AtfKernelFunctionRestriction(atc,source,coarseGrainingPositions,kernelFunction),
weights_(weights)
{
weights_->register_dependence(this);
}
//--------------------------------------------------------
// local_restriction
//--------------------------------------------------------
void AtfWeightedKernelFunctionRestriction::local_restriction(const DENS_MAT & sourceMatrix,
const DENS_MAT & positions,
const KernelFunction * kernelFunction) const
{
const DIAG_MAT & weights(weights_->quantity());
if (sourceMatrix.nRows() > 0) {
_xI_.resize(positions.nCols()); _xaI_.resize(positions.nCols());
_workspace_.reset(quantity_.nRows(),quantity_.nCols());
double val;
for (int i = 0; i < quantity_.nRows(); i++) {
_xI_ = feMesh_->nodal_coordinates(i);
for (int j = 0; j < sourceMatrix.nRows(); j++) {
for (int k = 0; k < positions.nCols(); k++)
_xaI_(k) = _xI_(k) - positions(j,k);
atc_->lammps_interface()->periodicity_correction(_xaI_.ptr());
val = kernelFunction->value(_xaI_);
if (val > 0) {
val *= weights(j,j);
for (int k = 0; k < sourceMatrix.nCols(); k++)
_workspace_(i,k) += val*sourceMatrix(j,k);
}
}
}
}
else {
_workspace_.reset(quantity_.nRows(),quantity_.nCols());
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtfNodeWeightedKernelFunctionRestriction
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfNodeWeightedKernelFunctionRestriction::AtfNodeWeightedKernelFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
PerAtomQuantity<double> * coarseGrainingPositions,
KernelFunction * kernelFunction,
DIAG_MAN * weights) :
AtfKernelFunctionRestriction(atc,source,coarseGrainingPositions,kernelFunction),
weights_(weights)
{
weights_->register_dependence(this);
}
//--------------------------------------------------------
// global_restriction
//--------------------------------------------------------
void AtfNodeWeightedKernelFunctionRestriction::global_restriction() const
{
AtfKernelFunctionRestriction::global_restriction();
quantity_ *= weights_->quantity();
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtfShapeFunctionMdProjection
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfShapeFunctionMdProjection::AtfShapeFunctionMdProjection(ATC_Method * atc,
DENS_MAN * source,
FieldName thisField) :
MatToMatTransfer<double>(source),
atc_(atc),
thisField_(thisField)
{
DIAG_MAN & massMat(atc_->set_mass_mat_md(thisField_));
massMat.register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtfShapeFunctionMdProjection::~AtfShapeFunctionMdProjection()
{
DIAG_MAN & massMat(atc_->set_mass_mat_md(thisField_));
massMat.remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AtfShapeFunctionMdProjection::reset_quantity() const
{
const DENS_MAT & sourceMatrix(source_->quantity());
atc_->apply_inverse_md_mass_matrix(sourceMatrix,quantity_,thisField_);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtfShapeFunctionMdProjectionScaled
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfShapeFunctionMdProjectionScaled::AtfShapeFunctionMdProjectionScaled(ATC_Method * atc,
DENS_MAN * source,
double scale,
FieldName thisField) :
AtfShapeFunctionMdProjection(atc,source,thisField),
scale_(scale)
{
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtfShapeFunctionMdProjectionScaled::~AtfShapeFunctionMdProjectionScaled()
{
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AtfShapeFunctionMdProjectionScaled::reset_quantity() const
{
AtfShapeFunctionMdProjection::reset_quantity();
quantity_ *= scale_;
}
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
AtfShapeFunctionMdProjectionReferenced::AtfShapeFunctionMdProjectionReferenced(ATC_Method * atc,
- DENS_MAN * source,
- const DENS_MAT * reference,
- FieldName thisField) :
+ DENS_MAN * source,
+ DENS_MAN * reference,
+ FieldName thisField) :
AtfShapeFunctionMdProjection(atc,source,thisField),
reference_(reference)
{
+ reference_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
AtfShapeFunctionMdProjectionReferenced::~AtfShapeFunctionMdProjectionReferenced()
{
+ reference_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void AtfShapeFunctionMdProjectionReferenced::reset_quantity() const
{
quantity_ = source_->quantity();
- quantity_ -= *reference_;
+ quantity_ -= reference_->quantity();
atc_->apply_inverse_md_mass_matrix(quantity_,thisField_);
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FtaShapeFunctionProlongation
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
FtaShapeFunctionProlongation::FtaShapeFunctionProlongation(ATC_Method * atc,
DENS_MAN * source,
- SPAR_MAN * shapeFunction) :
- FeToAtomTransfer(atc,source),
+ SPAR_MAN * shapeFunction,
+ AtomType atomType) :
+ FeToAtomTransfer(atc,source,atomType),
shapeFunction_(shapeFunction)
{
shapeFunction_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
FtaShapeFunctionProlongation::~FtaShapeFunctionProlongation()
{
shapeFunction_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void FtaShapeFunctionProlongation::reset() const
{
if (need_reset()) {
PerAtomQuantity<double>::reset();
if (atc_.nlocal() > 0) {
const DENS_MAT & sourceMatrix(source_->quantity());
const SPAR_MAT & shapeFunctionMatrix(shapeFunction_->quantity());
quantity_ = shapeFunctionMatrix*sourceMatrix;
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class FtaShapeFunctionProlongationDiagonalMatrix
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
FtaShapeFunctionProlongationDiagonalMatrix::FtaShapeFunctionProlongationDiagonalMatrix(ATC_Method * atc,
DENS_MAN * source,
SPAR_MAN * shapeFunction) :
FeToAtomDiagonalMatrix(atc,source),
shapeFunction_(shapeFunction)
{
shapeFunction_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
FtaShapeFunctionProlongationDiagonalMatrix::~FtaShapeFunctionProlongationDiagonalMatrix()
{
shapeFunction_->remove_dependence(this);
}
//--------------------------------------------------------
// reset
//--------------------------------------------------------
void FtaShapeFunctionProlongationDiagonalMatrix::reset() const
{
if (need_reset()) {
PerAtomDiagonalMatrix<double>::reset();
if (atc_.nlocal() > 0) {
const DENS_MAT & sourceMatrix(source_->quantity());
const SPAR_MAT & shapeFunctionMatrix(shapeFunction_->quantity());
_temp_ = shapeFunctionMatrix*sourceMatrix;
for (int i = 0; i < quantity_.size(); ++i) {
quantity_(i,i) = _temp_(i,0);
}
}
}
}
//--------------------------------------------------------
//--------------------------------------------------------
// Class MatToGradBySparse
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
// Constructor
//--------------------------------------------------------
MatToGradBySparse::MatToGradBySparse(ATC_Method * atc,
DENS_MAN * source,
VectorDependencyManager<SPAR_MAT * > * gradientMatrices) :
MatToMatTransfer<double>(source),
gradientMatrices_(gradientMatrices)
{
gradientMatrices_->register_dependence(this);
}
//--------------------------------------------------------
// Destructor
//--------------------------------------------------------
MatToGradBySparse::~MatToGradBySparse()
{
gradientMatrices_->remove_dependence(this);
}
//--------------------------------------------------------
// reset_quantity
//--------------------------------------------------------
void MatToGradBySparse::reset_quantity() const
{
const DENS_MAT & source(source_->quantity());
const SPAR_MAT_VEC & gradientMatrices(gradientMatrices_->quantity());
int nsd = gradientMatrices.size();
int nNodes = source.nRows();
int nCols = source.nCols();
quantity_.reset(nNodes,nCols*nsd);
int index = 0;
for (int n = 0; n < nCols; n++) {
for (int m = 0; m < nsd; m++) {
CLON_VEC inData(source,CLONE_COL,n);
CLON_VEC outData(quantity_,CLONE_COL,index);
outData = (*(gradientMatrices[m]))*inData;
++index;
}
}
}
}
diff --git a/lib/atc/TransferOperator.h b/lib/atc/TransferOperator.h
index bf85b2081..333e8d2a6 100644
--- a/lib/atc/TransferOperator.h
+++ b/lib/atc/TransferOperator.h
@@ -1,1145 +1,1145 @@
// A class for defining transfer operations
#ifndef TRANSFER_OPERATOR_H
#define TRANSFER_OPERATOR_H
-// ATC_Method headers
#include "PerAtomQuantityLibrary.h"
#include <set>
#include <vector>
-using namespace std;
-
namespace ATC {
// forward declarations
class ATC_Method;
class KernelFunction;
class FE_Mesh;
/**
* @class DenseMatrixTransfer
* @brief Class for defining objects that generate dense matrix quantities from other matrix quantities
*/
template <typename T>
class DenseMatrixTransfer : public MatrixDependencyManager<DenseMatrix, T> {
public:
// constructor
DenseMatrixTransfer() :
MatrixDependencyManager<DenseMatrix, T>(),
lammpsInterface_(LammpsInterface::instance()) {};
// destructor
virtual ~DenseMatrixTransfer() {};
/** apply transfer operator */
virtual const DenseMatrix<T> & quantity() const {
if (this->need_reset()) {
this->reset_quantity();
MatrixDependencyManager<DenseMatrix, T>::needReset_ = false;
}
return MatrixDependencyManager<DenseMatrix, T>::quantity_;
};
/** sets the quantity to a given value */
virtual void operator=(const DenseMatrix<T> & target)
{throw ATC_Error("DenseMatrixTransfer::set_quantity - Cannot modify transfer-based matrices");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & target)
{throw ATC_Error("DenseMatrixTransfer::operator= - Cannot modify transfer-based matrices");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DenseMatrix<T> & addition)
{throw ATC_Error("DenseMatrixTransfer::operator+= - Cannot modify transfer-based matrices");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition)
{throw ATC_Error("DenseMatrixTransfer::operator+= - Cannot modify transfer-based matrices");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DenseMatrix<T> & subtraction)
{throw ATC_Error("DenseMatrixTransfer::operator-= - Cannot modify transfer-based matrices");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T subtraction)
{throw ATC_Error("DenseMatrixTransfer::operator-= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & multiplier)
{throw ATC_Error("DenseMatrixTransfer::operator*= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier)
{throw ATC_Error("DenseMatrixTransfer::operator*= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & divisor)
{throw ATC_Error("DenseMatrixTransfer::operator/= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor)
{throw ATC_Error("DenseMatrixTransfer::operator/= - Cannot modify transfer-based matrices");};
protected:
/** does the actual computation of the quantity */
virtual void reset_quantity() const = 0;
/** pointer to LammpsInterface for MPI */
LammpsInterface * lammpsInterface_;
};
/**
* @class SparseMatrixTransfer
* @brief Class for defining objects that generate dense matrix quantities from other matrix quantities
*/
template <typename T>
class SparseMatrixTransfer : public MatrixDependencyManager<SparseMatrix, T> {
public:
// constructor
SparseMatrixTransfer() :
MatrixDependencyManager<SparseMatrix, T>(),
lammpsInterface_(LammpsInterface::instance()) {};
// destructor
virtual ~SparseMatrixTransfer() {};
/** apply transfer operator */
virtual const SparseMatrix<T> & quantity() const {if (this->need_reset()) {this->reset_quantity(); MatrixDependencyManager<SparseMatrix, T>::needReset_ = false;} return MatrixDependencyManager<SparseMatrix, T>::quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const SparseMatrix<T> & target)
{throw ATC_Error("SparseMatrixTransfer::set_quantity - Cannot modify transfer-based matrices");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & target)
{throw ATC_Error("SparseMatrixTransfer::operator= - Cannot modify transfer-based matrices");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const SparseMatrix<T> & addition)
{throw ATC_Error("SparseMatrixTransfer::operator+= - Cannot modify transfer-based matrices");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition)
{throw ATC_Error("SparseMatrixTransfer::operator+= - Cannot modify transfer-based matrices");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const SparseMatrix<T> & subtraction)
{throw ATC_Error("SparseMatrixTransfer::operator-= - Cannot modify transfer-based matrices");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T subtraction)
{throw ATC_Error("SparseMatrixTransfer::operator-= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const SparseMatrix<T> & multiplier)
{throw ATC_Error("SparseMatrixTransfer::operator*= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier)
{throw ATC_Error("SparseMatrixTransfer::operator*= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const SparseMatrix<T> & divisor)
{throw ATC_Error("SparseMatrixTransfer::operator/= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor)
{throw ATC_Error("SparseMatrixTransfer::operator/= - Cannot modify transfer-based matrices");};
protected:
/** does the actual computation of the quantity */
virtual void reset_quantity() const = 0;
/** pointer to LammpsInterface for MPI */
LammpsInterface * lammpsInterface_;
};
/**
* @class DiagonalMatrixTransfer
* @brief Class for defining objects that generate diagonal matrix quantities from other matrix quantities
*/
template <typename T>
class DiagonalMatrixTransfer : public MatrixDependencyManager<DiagonalMatrix, T> {
public:
// constructor
DiagonalMatrixTransfer() :
MatrixDependencyManager<DiagonalMatrix, T>(),
lammpsInterface_(LammpsInterface::instance()) {};
// destructor
virtual ~DiagonalMatrixTransfer() {};
/** apply transfer operator */
virtual const DiagonalMatrix<T> & quantity() const {if (this->need_reset()) {this->reset_quantity(); MatrixDependencyManager<DiagonalMatrix, T>::needReset_ = false;} return MatrixDependencyManager<DiagonalMatrix, T>::quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const DiagonalMatrix<T> & target)
{throw ATC_Error("DiagonalMatrixTransfer::set_quantity - Cannot modify transfer-based matrices");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & target)
{throw ATC_Error("DiagonalMatrixTransfer::operator= - Cannot modify transfer-based matrices");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DiagonalMatrix<T> & addition)
{throw ATC_Error("DiagonalMatrixTransfer::operator+= - Cannot modify transfer-based matrices");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition)
{throw ATC_Error("DiagonalMatrixTransfer::operator+= - Cannot modify transfer-based matrices");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DiagonalMatrix<T> & subtraction)
{throw ATC_Error("DiagonalMatrixTransfer::operator-= - Cannot modify transfer-based matrices");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T subtraction)
{throw ATC_Error("DiagonalMatrixTransfer::operator-= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DiagonalMatrix<T> & multiplier)
{throw ATC_Error("DiagonalMatrixTransfer::operator*= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier)
{throw ATC_Error("DiagonalMatrixTransfer::operator*= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DiagonalMatrix<T> & divisor)
{throw ATC_Error("DiagonalMatrixTransfer::operator/= - Cannot modify transfer-based matrices");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor)
{throw ATC_Error("DiagonalMatrixTransfer::operator/= - Cannot modify transfer-based matrices");};
protected:
/** does the actual computation of the quantity */
virtual void reset_quantity() const = 0;
/** pointer to LammpsInterface for MPI */
LammpsInterface * lammpsInterface_;
};
/**
* @class SetTransfer
* @brief Class for defining objects that generate sets using prescribed algorithms
*/
template <typename T>
class SetTransfer : public SetDependencyManager<T> {
public:
// constructor
SetTransfer() :
SetDependencyManager<T>() {};
// destructor
virtual ~SetTransfer() {};
/** apply transfer operator */
- virtual const set<T> & quantity() const {if (this->need_reset()) {this->reset_quantity(); SetDependencyManager<T>::needReset_ = false;} return SetDependencyManager<T>::quantity_;};
+ virtual const std::set<T> & quantity() const {if (this->need_reset()) {this->reset_quantity(); SetDependencyManager<T>::needReset_ = false;} return SetDependencyManager<T>::quantity_;};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
- virtual set<T> & set_quantity()
+ virtual std::set<T> & set_quantity()
{throw ATC_Error("SetTransfer::set_quantity - Cannot modify protected quantities"); return this->quantity_;};
protected:
/** does the actual computation of the quantity */
virtual void reset_quantity() const = 0;
};
/**
* @class VectorTransfer
* @brief Class for defining objects that generate sets using prescribed algorithms
*/
template <typename T>
class VectorTransfer : public VectorDependencyManager<T> {
public:
// constructor
VectorTransfer() :
VectorDependencyManager<T>() {};
// destructor
virtual ~VectorTransfer() {};
/** apply transfer operator */
- virtual const vector<T> & quantity() const {if (this->need_reset()) {this->reset_quantity(); VectorDependencyManager<T>::needReset_ = false;} return VectorDependencyManager<T>::quantity_;};
+ virtual const std::vector<T> & quantity() const {if (this->need_reset()) {this->reset_quantity(); VectorDependencyManager<T>::needReset_ = false;} return VectorDependencyManager<T>::quantity_;};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
- virtual vector<T> & set_quantity()
+ virtual std::vector<T> & set_quantity()
{throw ATC_Error("VectorTransfer::set_quantity - Cannot modify protected quantities"); return this->quantity_;};
protected:
/** does the actual computation of the quantity */
virtual void reset_quantity() const = 0;
};
/**
* @class AtomToFeTransfer
* @brief Class for defining objects to transfer atomistic quantities to FE quantities
*/
class AtomToFeTransfer : public DenseMatrixTransfer<double> {
public:
// constructor
AtomToFeTransfer(ATC_Method * atc,
PerAtomQuantity<double> * source);
// destructor
virtual ~AtomToFeTransfer();
protected:
/** pointer to atc */
ATC_Method * atc_;
/** pointer to source atomic quantity data */
PerAtomQuantity<double> * source_;
private:
// do not define
AtomToFeTransfer();
};
/**
* @class AtomDiagonalMatrixToFeTransfer
* @brief Class for defining objects to transfer atomistic quantities to FE quantities
*/
class AtomDiagonalMatrixToFeTransfer : public DenseMatrixTransfer<double> {
public:
// constructor
AtomDiagonalMatrixToFeTransfer(ATC_Method * atc,
PerAtomDiagonalMatrix<double> * source);
// destructor
virtual ~AtomDiagonalMatrixToFeTransfer();
protected:
/** pointer to atc */
ATC_Method * atc_;
/** pointer to source atomic quantity data */
PerAtomDiagonalMatrix<double> * source_;
private:
// do not define
AtomDiagonalMatrixToFeTransfer();
};
/**
* @class FeToAtomTransfer
* @brief Class for defining objects to transfer FE quantities to atomistic quantities
*/
class FeToAtomTransfer : public ProtectedAtomQuantity<double> {
public:
// constructor
FeToAtomTransfer(ATC_Method * atc,
- DENS_MAN * source);
+ DENS_MAN * source,
+ AtomType atomType = INTERNAL);
// destructor
virtual ~FeToAtomTransfer();
protected:
/** pointer to source Fe matrix data */
DENS_MAN * source_;
private:
// do not define
FeToAtomTransfer();
};
/**
* @class FeToAtomDiagonalMatrix
* @brief Class for defining objects to transfer FE quantities to atomistic diagonal matrices
*/
class FeToAtomDiagonalMatrix : public ProtectedAtomDiagonalMatrix<double> {
public:
// constructor
FeToAtomDiagonalMatrix(ATC_Method * atc,
DENS_MAN * source);
// destructor
virtual ~FeToAtomDiagonalMatrix();
protected:
/** pointer to source Fe matrix data */
DENS_MAN * source_;
private:
// do not define
FeToAtomDiagonalMatrix();
};
/**
* @class MatToMatTransfer
* @brief Class for defining objects that transfer quantities between materials
*/
template <typename T>
class MatToMatTransfer : public DenseMatrixTransfer<T> {
public:
// constructor
MatToMatTransfer(MatrixDependencyManager<DenseMatrix, T> * source) :
source_(source) {source_->register_dependence(this);};
// destructor
virtual ~MatToMatTransfer() {source_->remove_dependence(this);};
protected:
/** pointer to source matrix data */
MatrixDependencyManager<DenseMatrix, T> * source_;
private:
// do not define
MatToMatTransfer();
};
/**
* @class AtfShapeFunctionRestriction
* @brief Class for defining objects that transfer atomistic quantities to FE using shape functions
* (implements restrict_volumetric_quantity)
*/
class AtfShapeFunctionRestriction : public AtomToFeTransfer {
public:
// constructor
AtfShapeFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * shapeFunction);
// destructor
virtual ~AtfShapeFunctionRestriction();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** reference to shape function matrix */
SPAR_MAN * shapeFunction_;
/** persistant workspace */
mutable DENS_MAT _workspace_;
/** applies restriction operation across all processors */
virtual void global_restriction() const;
/** applies restriction operation on this processor */
virtual void local_restriction(const DENS_MAT & sourceMatrix,
const SPAR_MAT & shapeFunctionMatrix) const;
private:
// do not define
AtfShapeFunctionRestriction();
};
/**
* @class AdmtfShapeFunctionRestriction
* @brief Class for defining objects that transfer atomistic diagonal matrices to FE using shape functions=
*/
class AdmtfShapeFunctionRestriction : public AtomDiagonalMatrixToFeTransfer {
public:
// constructor
AdmtfShapeFunctionRestriction(ATC_Method * atc,
PerAtomDiagonalMatrix<double> * source,
SPAR_MAN * shapeFunction);
// destructor
virtual ~AdmtfShapeFunctionRestriction();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** reference to shape function matrix */
SPAR_MAN * shapeFunction_;
/** persistant workspace */
mutable DENS_MAT _workspace_;
/** applies restriction operation across all processors */
virtual void global_restriction() const;
/** applies restriction operation on this processor */
virtual void local_restriction(const DENS_MAT & sourceMatrix,
const SPAR_MAT & shapeFunctionMatrix) const;
private:
// do not define
AdmtfShapeFunctionRestriction();
};
/**
* @class AtfProjection
* @brief
*/
class AtfProjection : public AtomToFeTransfer {
public:
// constructor
AtfProjection(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * accumulant,
DIAG_MAN * weights = NULL);
// destructor
virtual ~AtfProjection();
/** apply transfer operator */
virtual void reset_quantity() const;
/** get number of columns */
virtual int nCols() const {return source_->nCols();};
protected:
/** reference to shape function matrix */
SPAR_MAN * accumulant_;
DIAG_MAN * weights_;
DENS_MAT * reference_;
/** persistant workspace */
mutable DENS_MAT _workspace_;
/** applies restriction operation across all processors */
virtual void global_restriction() const;
/** applies restriction operation on this processor */
virtual void local_restriction(const DENS_MAT & sourceMatrix,
const SPAR_MAT & shapeFunctionMatrix) const;
private:
// do not define
AtfProjection();
};
class AtfProjectionScaled : public AtfProjection {
public:
// constructor
AtfProjectionScaled(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * accumulant,
const double scale,
DIAG_MAN * weights = NULL);
// destructor
virtual ~AtfProjectionScaled();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** reference to shape function matrix */
double scale_;
private:
// do not define
AtfProjectionScaled();
};
/**
* @class AtfProjectionReferenced
* @brief
*/
class AtfProjectionReferenced : public AtfProjection {
public:
// constructor
AtfProjectionReferenced(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * accumulant,
- const DENS_MAT * reference,
+ DENS_MAN * reference,
DIAG_MAN * weights = NULL);
// destructor
virtual ~AtfProjectionReferenced();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
- const DENS_MAT * reference_;
+ /** reference value */
+ DENS_MAN * reference_;
private:
// do not define
AtfProjectionReferenced();
};
/**
* @class AtfWeightedShapeFunctionRestriction
* @brief Class for defining objects that transfer atomistic quantities to FE using shape functions
* including approximate quadrature weights
* (implements restrict_unscaled)
*/
class AtfWeightedShapeFunctionRestriction : public AtfShapeFunctionRestriction {
public:
// constructor
AtfWeightedShapeFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * shapeFunction,
DIAG_MAN * weights);
// destructor
virtual ~AtfWeightedShapeFunctionRestriction() {weights_->remove_dependence(this);};
protected:
/** reference to diagonal weighting matrix */
DIAG_MAN * weights_;
/** applies restriction operation on this processor */
virtual void local_restriction(const DENS_MAT & sourceMatrix,
const SPAR_MAT & shapeFunctionMatrix) const;
private:
// do not define
AtfWeightedShapeFunctionRestriction();
};
/**
* @class AtfNodeWeightedShapeFunctionRestriction
* @brief Class for defining objects that transfer atomistic quantities to FE using shape functions
* including weighting at the mesh nodes
*/
class AtfNodeWeightedShapeFunctionRestriction : public AtfShapeFunctionRestriction {
public:
// constructor
AtfNodeWeightedShapeFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
SPAR_MAN * shapeFunction,
DIAG_MAN * weights);
// destructor
virtual ~AtfNodeWeightedShapeFunctionRestriction() {weights_->remove_dependence(this);};
protected:
/** reference to diagonal weighting matrix */
DIAG_MAN * weights_;
/** applies restriction operation across all processors */
virtual void global_restriction() const;
private:
// do not define
AtfNodeWeightedShapeFunctionRestriction();
};
/**
* @class AtfShapeFunctionProjection
* @brief Class for defining objects that transfer restricted atomistic quantities to FE using shape functions
* (implements project/project_volumetric_quantity assuming restrict_unscaled/
* restrict_volumetric_quantity has been applied)
*/
class AtfShapeFunctionProjection : public MatToMatTransfer<double> {
public:
// constructor
AtfShapeFunctionProjection(ATC_Method * atc,
DENS_MAN * source,
FieldName thisField);
// destructor
virtual ~AtfShapeFunctionProjection();
/** apply transfer operator */
virtual void reset_quantity() const ;
protected:
/** pointer to atc object for mass matrix inversion */
ATC_Method * atc_;
/** field name to define mass matrix to use */
FieldName thisField_;
private:
// do not define
AtfShapeFunctionProjection();
};
/**
* @class AtfShapeFunctionMdProjection
* @brief Class for defining objects that transfer restricted atomistic quantities to FE using shape functions for the MD region
* (implements project_md/project_md_volumetric_quantity assuming
* restrict_unscaled/restrict_volumetric_quantity has been applied)
*/
class AtfShapeFunctionMdProjection : public MatToMatTransfer<double> {
public:
// constructor
AtfShapeFunctionMdProjection(ATC_Method * atc,
DENS_MAN * source,
FieldName thisField);
// destructor
virtual ~AtfShapeFunctionMdProjection();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** pointer to atc object for mass matrix inversion */
ATC_Method * atc_;
/** field name to define mass matrix to use */
FieldName thisField_;
private:
// do not define
AtfShapeFunctionMdProjection();
};
/**
* @class AtfShapeFunctionMdProjectionScaled
* @brief Class for defining objects that transfer restricted atomistic quantities to FE using shape functions for the MD region with a scaling factor
* (implements project_md/project_md_volumetric_quantity assuming
* restrict_unscaled/restrict_volumetric_quantity has been applied)
*/
class AtfShapeFunctionMdProjectionScaled : public AtfShapeFunctionMdProjection {
public:
// constructor
AtfShapeFunctionMdProjectionScaled(ATC_Method * atc,
DENS_MAN * source,
double scale,
FieldName thisField);
// destructor
virtual ~AtfShapeFunctionMdProjectionScaled();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** scale multiplier */
double scale_;
private:
// do not define
AtfShapeFunctionMdProjectionScaled();
};
/**
* @class AtfShapeFunctionMdProjectionReferenced
* @brief Class for defining objects that transfer restricted atomistic quantities to FE using shape functions for the MD region with respect to a reference
* (implements project_md/project_md_volumetric_quantity assuming
* restrict_unscaled/restrict_volumetric_quantity has been applied)
*/
class AtfShapeFunctionMdProjectionReferenced : public AtfShapeFunctionMdProjection {
public:
// constructor
AtfShapeFunctionMdProjectionReferenced(ATC_Method * atc,
DENS_MAN * source,
- const DENS_MAT * reference,
+ DENS_MAN * reference,
FieldName thisField);
// destructor
virtual ~AtfShapeFunctionMdProjectionReferenced();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** reference value */
- const DENS_MAT * reference_;
+ DENS_MAN * reference_;
private:
// do not define
AtfShapeFunctionMdProjectionReferenced();
};
/**
* @class AtfKernelFunctionRestriction
* @brief Class for defining objects that transfer atomistic quantities to FE using kernel functions
*/
class AtfKernelFunctionRestriction : public AtomToFeTransfer {
public:
// constructor
AtfKernelFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
PerAtomQuantity<double> * coarseGrainingPositions,
KernelFunction * kernelFunction);
// destructor
virtual ~AtfKernelFunctionRestriction();
/** apply transfer operator */
virtual void reset_quantity() const;
protected:
/** pointer to the kernel function evaluator */
KernelFunction * kernelFunction_;
/** reference positions for coarse graining operations */
PerAtomQuantity<double> * coarseGrainingPositions_;
/** pointer to the mesh being used */
const FE_Mesh * feMesh_;
/** persistant workspace */
mutable DENS_MAT _workspace_;
mutable DENS_VEC _xI_, _xa_, _xaI_;
/** applies restriction operation across all processors */
virtual void global_restriction() const;
/** applies restriction operation on this processor */
virtual void local_restriction(const DENS_MAT & sourceMatrix,
const DENS_MAT & positions,
const KernelFunction * kernelFunction) const;
private:
// do not define
AtfKernelFunctionRestriction();
};
/**
* @class AtfWeightedKernelFunctionRestriction
* @brief Class for defining objects that transfer atomistic quantities to mesh using kernel functions
* including approximate quadrature weights
*/
class AtfWeightedKernelFunctionRestriction : public AtfKernelFunctionRestriction {
public:
// constructor
AtfWeightedKernelFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
PerAtomQuantity<double> * coarseGrainingPositions,
KernelFunction * kernelFunction,
DIAG_MAN * weights);
// destructor
virtual ~AtfWeightedKernelFunctionRestriction() {weights_->remove_dependence(this);};
protected:
/** reference to diagonal weighting matrix */
DIAG_MAN * weights_;
/** applies restriction operation on this processor */
virtual void local_restriction(const DENS_MAT & sourceMatrix,
const DENS_MAT & positions,
const KernelFunction * kernelFunction) const;
private:
// do not define
AtfWeightedKernelFunctionRestriction();
};
/**
* @class AtfNodeWeightedKernelFunctionRestriction
* @brief Class for defining objects that transfer atomistic quantities to a mesh using kernel functions
* including weighting at the mesh nodes
*/
class AtfNodeWeightedKernelFunctionRestriction : public AtfKernelFunctionRestriction {
public:
// constructor
AtfNodeWeightedKernelFunctionRestriction(ATC_Method * atc,
PerAtomQuantity<double> * source,
PerAtomQuantity<double> * coarseGrainingPositions,
KernelFunction * kernelFunction,
DIAG_MAN * weights);
// destructor
virtual ~AtfNodeWeightedKernelFunctionRestriction() {weights_->remove_dependence(this);};
protected:
/** reference to diagonal weighting matrix */
DIAG_MAN * weights_;
/** applies restriction operation across all processors */
virtual void global_restriction() const;
private:
// do not define
AtfNodeWeightedKernelFunctionRestriction();
};
/**
* @class FtaShapeFunctionProlongation
* @brief Class for defining objects that transfer FE quantities to atoms using shape functions
* (implements prolong)
*/
class FtaShapeFunctionProlongation : public FeToAtomTransfer {
public:
// constructor
FtaShapeFunctionProlongation(ATC_Method * atc,
DENS_MAN * source,
- SPAR_MAN * shapeFunction);
+ SPAR_MAN * shapeFunction,
+ AtomType atomType = INTERNAL);
// destructor
virtual ~FtaShapeFunctionProlongation();
protected:
/** apply transfer operator if needed */
virtual void reset() const;
/** reference to shape function matrix */
SPAR_MAN * shapeFunction_;
private:
// do not define
FtaShapeFunctionProlongation();
};
/**
* @class FtaShapeFunctionProlongationDiagonalMatrix
* @brief Class for defining objects that transfer FE quantities to atomic diagonal matrices using shape functions
* (implements prolong)
*/
class FtaShapeFunctionProlongationDiagonalMatrix : public FeToAtomDiagonalMatrix {
public:
// constructor
FtaShapeFunctionProlongationDiagonalMatrix(ATC_Method * atc,
DENS_MAN * source,
SPAR_MAN * shapeFunction);
// destructor
virtual ~FtaShapeFunctionProlongationDiagonalMatrix();
protected:
/** apply transfer operator if needed */
virtual void reset() const;
/** reference to shape function matrix */
SPAR_MAN * shapeFunction_;
// workspace
mutable DENS_MAT _temp_; // temporary storage for dense matrix
private:
// do not define
FtaShapeFunctionProlongationDiagonalMatrix();
};
/**
* transfer for a matrix to a gradient mitigated by sparse matrices
*
*/
class MatToGradBySparse : public MatToMatTransfer<double> {
public:
//constructor
MatToGradBySparse(ATC_Method * atc,
DENS_MAN * source,
VectorDependencyManager<SPAR_MAT * > * gradientMatrices);
//destructor
virtual ~MatToGradBySparse();
// apply transfer operator
virtual void reset_quantity() const;
protected:
// pointer to sparseMatrix
VectorDependencyManager<SPAR_MAT * > * gradientMatrices_;
private:
// do not define
MatToGradBySparse();
};
/**
* transfer from dense to dense by diagonal matrix multiplier for anything
**/
class DiagonalMatrixMultiply : public MatToMatTransfer<double> {
public:
//constructor
DiagonalMatrixMultiply(DENS_MAN * source,
DIAG_MAN * diagonalMatrix);
//destructor
virtual ~DiagonalMatrixMultiply();
// apply transfer operator
virtual void reset_quantity() const;
protected:
// pointer to sparseMatrix
DIAG_MAN * diagonalMatrix_;
private:
// do not define
DiagonalMatrixMultiply();
};
#ifdef ATC_WHO
/**
// class sparse matrix multiplier for anything
//delete later
**/
class SparseMatrixMultiply : public MatToMatTransfer<double> {
public:
//constructor
SparseMatrixMultiply(ATC_Method * atc,
DENS_MAN * source,
SPAR_MAN * sparseMatrix);
//destructor
virtual ~SparseMatrixMultiply();
protected:
// pointer to sparseMatrix
SPAR_MAN * sparseMatrix_;
// apply transfer operator
virtual const DENS_MAT & quantity() const;
private:
// do not define
SparseMatrixMultiply();
};
#endif
}
#endif
diff --git a/lib/atc/Utility.h b/lib/atc/Utility.h
index 1b7017d51..aa5104293 100644
--- a/lib/atc/Utility.h
+++ b/lib/atc/Utility.h
@@ -1,312 +1,305 @@
#ifndef UTILITY_H
#define UTILITY_H
#include <iostream>
#include <ctime>
#include <limits>
#undef near
#include <vector>
-using std::vector;
#include <fstream>
#include <cstring>
#include <string>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include "math.h"
#include "ATC_Error.h"
-using std::transform;
-using std::fstream;
-using std::vector;
-using std::string;
-using std::strcmp;
-
-
namespace ATC_Utility
{
/** constants */
static const double Pi = 4.0*atan(1.0);
static const double Big = 1.e20;
const static double parsetol = 1.0e-10;
const static double parsebig = 1.0e10;
/** scalar triple product */
inline double det3(double * v1, double * v2, double * v3) {
return
-v1[2]*v2[1]*v3[0] + v1[1]*v2[2]*v3[0] + v1[2]*v2[0]*v3[1]
-v1[0]*v2[2]*v3[1] - v1[1]*v2[0]*v3[2] + v1[0]*v2[1]*v3[2];
}
inline void plane_coords(int i, int & i1, int & i2) {
if (i==0) { i1 = 1; i2 = 2; }
else if (i==1) { i1 = 2; i2 = 0; }
else if (i==2) { i1 = 0; i2 = 1; }
}
/** 2d cross product */
inline double cross2(double * v1, double * v2) {
return v1[0]*v2[1] - v1[1]*v2[0];
}
/** 3d cross product */
inline void cross3(double * v1, double * v2, double * v) {
v[0] = v1[1]*v2[2] - v1[2]*v2[1];
v[1] = v1[2]*v2[0] - v1[0]*v2[3];
v[2] = v1[0]*v2[1] - v1[1]*v2[0];
}
inline double norm3(double * v) {return sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); }
inline int sgn(double x) { return (int) ((x>0) - (x<0)); }
inline int rnd(double x) { return (int) (x+sgn(x)*0.5); }
/** Compares doubles acceptably */
inline bool dbl_geq(double dblL, double dblR, int tolMult=2)
{
return ( (dblL > dblR) ||
((dblL <= (dblR + \
std::numeric_limits<double>::epsilon() * \
tolMult * std::max(abs(dblL), abs(dblR)))) &&
(dblR <= (dblL + \
std::numeric_limits<double>::epsilon() * \
tolMult * std::max(abs(dblL), abs(dblR))))));
}
inline double parse_min(const char * arg) {
- if (strcmp(arg,"INF") == 0) return -parsebig;
+ if (std::strcmp(arg,"INF") == 0) return -parsebig;
else return atof(arg); }
inline double parse_max(const char * arg) {
- if (strcmp(arg,"INF") == 0) return parsebig;
+ if (std::strcmp(arg,"INF") == 0) return parsebig;
else return atof(arg);
}
inline double parse_minmax(const char * arg) {
- if (strcmp(arg,"-INF") == 0) return -parsebig;
- else if (strcmp(arg,"INF") == 0) return parsebig;
+ if (std::strcmp(arg,"-INF") == 0) return -parsebig;
+ else if (std::strcmp(arg,"INF") == 0) return parsebig;
else return atof(arg); }
inline void split_values(double & min, double & max) {
double eps = std::max(parsetol,parsetol*fabs(min));
min -= eps;
max += eps;
}
/** Returns true if the value v is between min & max */
template<typename T>
inline bool in_range(const T &v, const T &min, const T &max)
{
return v >= min && v <= max;
}
/** Returns true if the value v is between min & max within tolerance TOL */
template<typename T>
inline bool in_range(const T &v, const T &min, const T &max, const T &tol)
{
return in_range(v, min-tol, max+tol);
}
/** Returns the value with the larger absolute value */
template<typename T>
inline T max_abs(const T &a, const T &b)
{
return (a*a > b*b) ? a : b;
}
/** Returns the value with the smaller absolute value */
template<typename T>
inline T min_abs(const T &a, const T &b)
{
return (a*a < b*b) ? a : b;
}
/** A simple Matlab like timing function */
inline double tictoc()
{
double t_new = clock() / (double) CLOCKS_PER_SEC;
static double t = t_new;
double dt = t_new - t;
t = t_new;
return dt;
}
/** A simple timer */
inline double timer()
{
double t_new = clock() / (double) CLOCKS_PER_SEC;
static double t = t_new; // done once at first time the function is evoked
double dt = t_new - t;
return dt;
}
/** Binary search between low & high for value (assumes array is sorted) */
template<typename T>
inline int search_sorted(const T* A, T value, int low, int high)
{
int mid;
while (low < high)
{
mid = (low + high) >> 1; // set mid to mean of high and low, ">>" is a bit shift which divides by 2, rounding down
if (A[mid] > value) high = mid; // mid was too high, reduce high
else if (A[mid] < value) low = mid+1; // mid was too low, increase low
else return mid;
}
return -1; // value not found in array, return -1
}
/** Flat search between low & high for value (assumes array is NOT sorted) */
template<typename T>
inline int search_unsorted(const T* A, T value, int low, int high)
{
for (int i=low; i<high; i++) if (A[i] == value) return i;
return -1;
}
/** Regular swap */
template<typename T>
inline void swap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
//===================================================================
/** A collection of string convesion/manipulation routines */
//===================================================================
+
/** converts anything that has iostream::<< defined to a string */
template<typename T>
- inline string to_string(const T &v, int precision=0)
+ inline std::string to_string(const T &v, int precision=0)
{
std::ostringstream out;
if (precision) out << std::setprecision(precision);
out << v;
return out.str();
}
/** conversion to string */
- inline string true_false(const double &v)
+ inline std::string true_false(const double &v)
{
if (v) return "TRUE";
else return "FALSE";
}
/** test conversion to double */
- inline bool is_numeric(const string &s)
+ inline bool is_numeric(const std::string &s)
{
double v;
std::istringstream in(s);
return (in >> v);
}
- /** convert a string to anything that has iostream::>> defined */
+ /** convert a string to anything that has iostream::>> defined, second arg is to disambibuate type */
template<typename T>
- inline T str2T(const string &s, T v)
+ inline T str2T(const std::string &s, T v)
{
std::istringstream in(s);
if (!(in >> v)) throw ATC::ATC_Error("str2T invalid string conversion");
return v;
}
/** convert a string to a double */
- inline double str2dbl(const string &s) { return str2T(s, double(0.0)); }
+ inline double str2dbl(const std::string &s) { return str2T(s, double(0.0)); }
/** tests if conversion to double is possible */
- inline bool is_dbl(const string &s)
+ inline bool is_dbl(const std::string &s)
{
char *endptr;
strtod(s.c_str(), &endptr);
if(endptr != NULL && *endptr == '\0') return true;
return false;
}
/** convert a string to an int */
- inline int str2int(const string &s) { return str2T(s, int(0)); }
+ inline int str2int(const std::string &s) { return str2T(s, int(4)); }
//* replaces all characters in a set of characters with a character
//* @param str input string
//* @param *s pointer to array of characters that will be replaced
//* @param r character to replace characters in s[] with
- static void replace_all_of(string &str, const char *s, const char r)
+ static void replace_all_of(std::string &str, const char *s, const char r)
{
size_t found;
found = str.find_first_of(s);
- while (found != string::npos)
+ while (found != std::string::npos)
{
str[found] = r;
found = str.find_first_of(s, found+1);
}
}
/** converts the string to lowercase */
- inline string& to_lower(string &s)
+ inline std::string& to_lower(std::string &s)
{
- transform(s.begin(),s.end(),s.begin(),static_cast<int(*)(int)>(tolower));
+ std::transform(s.begin(),s.end(),s.begin(),static_cast<int(*)(int)>(tolower));
return s;
}
/** converts the string to uppercase */
- inline string& to_upper(string &s)
+ inline std::string& to_upper(std::string &s)
{
- transform(s.begin(),s.end(),s.begin(),static_cast<int(*)(int)>(toupper));
+ std::transform(s.begin(),s.end(),s.begin(),static_cast<int(*)(int)>(toupper));
return s;
}
/** removes any whitespace from the beginning or end of string */
- static string& trim(string &s)
+ static std::string& trim(std::string &s)
{
if (s.empty()) return s;
size_t found = s.find_last_not_of(" \t\n");
if (found < s.size()-1) s.erase(found+1);
found = s.find_first_not_of(" \t\n");
- if (found != string::npos) s = s.substr(found);
+ if (found != std::string::npos) s = s.substr(found);
return s;
}
/** splits delimited string into a vector of strings */
- static void split(const string &s, vector<string> &ss, char del=' ')
+ static void split(const std::string &s, std::vector<std::string> &ss, char del=' ')
{
ss.clear();
size_t begin=0, end=0;
- while (end != string::npos)
+ while (end != std::string::npos)
{
begin = s.find_first_not_of(del, end); // find beginning of fragment
end = s.find_first_of(del,begin);
- if (begin != string::npos) // safe if end is npos-1
+ if (begin != std::string::npos) // safe if end is npos-1
ss.push_back(s.substr(begin,end-begin));
}
}
- static string cap(string & s) {
+ static std::string cap(std::string & s) {
s[0] = toupper(s[0]);
return s;
}
/* turns Aa_Bb_Cc into aa_bb_cc */
- static string to_cap(const string &s) {
- vector<string> words;
- string delimiter = "_";
+ static std::string to_cap(const std::string &s) {
+ std::vector<std::string> words;
+ std::string delimiter = "_";
split(s,words,(delimiter.c_str())[0]);
- string name = "";
+ std::string name = "";
for (unsigned int i = 0; i < words.size(); i++) {
name = name + cap(words[i]);
}
return name;
}
//* scans a string for a list of commands delimited by ', \t' with # comments
//* @param line The input line to be parsed
//* @cs A vector of strings parsed from the input line
- static void command_strings(string line, vector<string> &cs)
+ static void command_strings(std::string line, std::vector<std::string> &cs)
{
- if (line.find('#') != string::npos) line.erase(line.find("#"));
+ if (line.find('#') != std::string::npos) line.erase(line.find("#"));
replace_all_of(line, "\t,", ' ');
to_lower(trim(line));
split(line, cs);
}
//* reads a single line from a file and splits it into a vector of strings
//* returns the number of strings in the vector
- inline int command_line(fstream &fid, vector<string> &cs)
+ inline int command_line(std::fstream &fid, std::vector<std::string> &cs)
{
- string line;
+ std::string line;
getline(fid, line);
command_strings(line, cs);
return cs.size();
}
}
#endif
diff --git a/lib/atc/Vector.h b/lib/atc/Vector.h
index 2d4482ce4..5630b0ee1 100644
--- a/lib/atc/Vector.h
+++ b/lib/atc/Vector.h
@@ -1,206 +1,206 @@
#ifndef VECTOR_H
#define VECTOR_H
#include "Matrix.h"
namespace ATC_matrix {
///////////////////////////////////////////////////////////////////////////////
// forward declarations ///////////////////////////////////////////////////////
//* Matrix-vector product
//template<typename T>
//void MultMv(const Matrix<T> &A, const Vector<T> &v, DenseVector<T> &c,
// const bool At=0, T a=1, T b=0);
/******************************************************************************
* abstract class Vector
******************************************************************************/
template<typename T>
class Vector : public Matrix<T>
{
public:
Vector() {}
Vector(const Vector<T> &c); // do not implement!
virtual ~Vector() {}
- string to_string() const;
+ std::string to_string() const;
// pure virtual functions
virtual T operator()(INDEX i, INDEX j=0) const=0;
virtual T& operator()(INDEX i, INDEX j=0) =0;
virtual T operator[](INDEX i) const=0;
virtual T& operator[](INDEX i) =0;
virtual INDEX nRows() const=0;
virtual T* ptr() const=0;
virtual void resize(INDEX nRows, INDEX nCols=1, bool copy=0)=0;
virtual void reset(INDEX nRows, INDEX nCols=1, bool zero=0)=0;
virtual void copy(const T * ptr, INDEX nRows, INDEX nCols=1)=0;
void write_restart(FILE *f) const; // will be virtual
// output to matlab
using Matrix<T>::matlab;
- void matlab(ostream &o, const string &s="v") const;
+ void matlab(std::ostream &o, const std::string &s="v") const;
using Matrix<T>::operator=;
INDEX nCols() const;
bool in_range(INDEX i) const;
bool same_size(const Vector &m) const;
static bool same_size(const Vector &a, const Vector &b);
protected:
//* don't allow this
Vector& operator=(const Vector &r);
};
///////////////////////////////////////////////////////////////////////////////
//* performs a matrix-vector multiply with default naive implementation
template<typename T>
void MultMv(const Matrix<T> &A, const Vector<T> &v, DenseVector<T> &c,
const bool At, T a, T b)
{
const INDEX sA[2] = {A.nRows(), A.nCols()}; // m is sA[At] k is sA[!At]
const INDEX M=sA[At], K=sA[!At];
GCK(A, v, v.size()!=K, "MultAb<T>: matrix-vector multiply");
if (c.size() != M)
{
c.resize(M); // set size of C
c.zero(); // do not add result to C
}
else c *= b;
for (INDEX p=0; p<M; p++)
for (INDEX r=0; r<K; r++)
c[p] += A(p*!At+r*At, p*At+r*!At) * v[r];
}
///////////////////////////////////////////////////////////////////////////////
//* Operator for Matrix-vector product
template<typename T>
DenseVector<T> operator*(const Matrix<T> &A, const Vector<T> &b)
{
DenseVector<T> c;
MultMv(A, b, c, 0, 1.0, 0.0);
return c;
}
///////////////////////////////////////////////////////////////////////////////
//* Operator for Vector-matrix product
template<typename T>
DenseVector<T> operator*(const Vector<T> &a, const Matrix<T> &B)
{
DenseVector<T> c;
MultMv(B, a, c, 1, 1.0, 0.0);
return c;
}
///////////////////////////////////////////////////////////////////////////////
//* Multiply a vector by a scalar
template<typename T>
DenseVector<T> operator*(const Vector<T> &v, const T s)
{
DenseVector<T> r(v);
r*=s;
return r;
}
///////////////////////////////////////////////////////////////////////////////
//* Multiply a vector by a scalar - communitive
template<typename T>
DenseVector<T> operator*(const T s, const Vector<T> &v)
{
DenseVector<T> r(v);
r*=s;
return r;
}
///////////////////////////////////////////////////////////////////////////////
//* inverse scaling operator - must always create memory
template<typename T>
DenseMatrix<T> operator/(const Vector<T> &v, const T s)
{
DenseVector<T> r(v);
r*=(1.0/s); // for integer types this may be worthless
return ;
}
///////////////////////////////////////////////////////////////////////////////
//* Operator for Vector-Vector sum
template<typename T>
DenseVector<T> operator+(const Vector<T> &a, const Vector<T> &b)
{
DenseVector<T> c(a);
c+=b;
return c;
}
///////////////////////////////////////////////////////////////////////////////
//* Operator for Vector-Vector subtraction
template<typename T>
DenseVector<T> operator-(const Vector<T> &a, const Vector<T> &b)
{
DenseVector<T> c(a);
c-=b;
return c;
}
///////////////////////////////////////////////////////////////////////////////
// Template definitions ///////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//* output operator
template<typename T>
-string Vector<T>::to_string() const
+std::string Vector<T>::to_string() const
{
- string s;
+ std::string s;
int sz = this->size();
for (INDEX i = 0; i < sz; i++)
- s += string(i?"\t":"") + ATC_Utility::to_string((*this)[i],myPrecision);
+ s += std::string(i?"\t":"") + ATC_Utility::to_string((*this)[i],myPrecision);
return s;
}
///////////////////////////////////////////////////////////////////////////////
//* Writes a matlab script defining the vector to the stream
template<typename T>
-void Vector<T>::matlab(ostream &o, const string &s) const
+void Vector<T>::matlab(std::ostream &o, const std::string &s) const
{
o << s <<"=zeros(" << this->size() << ",1);\n";
int sz = this->size();
for (INDEX i = 0; i < sz; i++)
o << s << "("<<i+1<<") = " << (*this)[i] << ";\n";
}
///////////////////////////////////////////////////////////////////////////////
//* writes the vector data to a file
template <typename T>
void Vector<T>::write_restart(FILE *f) const
{
INDEX size = this->size();
fwrite(&size, sizeof(INDEX),1,f);
if (size) fwrite(this->ptr(), sizeof(T), this->size(), f);
}
///////////////////////////////////////////////////////////////////////////////
//* returns the number of columns; always 1
template<typename T>
inline INDEX Vector<T>::nCols() const
{
return 1;
}
///////////////////////////////////////////////////////////////////////////////
//* returns true if INDEX i is within the range of the vector
template<typename T>
bool Vector<T>::in_range(INDEX i) const
{
return i<this->size();
}
///////////////////////////////////////////////////////////////////////////////
//* returns true if m has the same number of elements this vector
template<typename T>
bool Vector<T>::same_size(const Vector &m) const
{
return this->size() == m.size();
}
///////////////////////////////////////////////////////////////////////////////
//* returns true if a and b have the same number of elements
template<typename T>
inline bool Vector<T>::same_size(const Vector &a, const Vector &b)
{
return a.same_size(b);
}
} // end namespace
#endif
diff --git a/lib/atc/ViscousStress.cpp b/lib/atc/ViscousStress.cpp
index 77c789b8d..4053cf6cb 100644
--- a/lib/atc/ViscousStress.cpp
+++ b/lib/atc/ViscousStress.cpp
@@ -1,77 +1,82 @@
#include "ViscousStress.h"
#include "ATC_Error.h"
#include "LammpsInterface.h"
#include <iostream>
-#include <fstream>
+
+using ATC_Utility::command_line;
+using ATC_Utility::str2dbl;
+using std::string;
+using std::vector;
+using std::fstream;
namespace ATC {
//=============================================================================
// isotropic constant viscosity
//=============================================================================
ViscousStressConstant::ViscousStressConstant(fstream &fileId)
: ViscousStress(), viscosity_(0)
{
if (!fileId.is_open()) throw ATC_Error("cannot open material file");
vector<string> line;
while(fileId.good()) {
command_line(fileId, line);
if (line[0] == "end") {
if (viscosity_ < 0.0)
throw ATC_Error("ViscousStressConstant:: bad constant viscosity");
return;
}
else if (line[0]=="viscosity") viscosity_ = str2dbl(line[1]);
else throw ATC_Error( "viscosity constant - unrecognized material function");
}
}
//=============================================================================
// compute the stress at N integration points from the velocity gradients
// T_{ij} = viscosity * du_i/dx_j
//=============================================================================
void ViscousStressConstant::viscous_stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &sigma)
{
GRAD_FIELD_MATS::const_iterator du_itr = gradFields.find(VELOCITY);
const DENS_MAT_VEC &du = du_itr->second;
CLON_VEC DuxDx(du[0],CLONE_COL,0);
CLON_VEC DuxDy(du[1],CLONE_COL,0);
CLON_VEC DuxDz(du[2],CLONE_COL,0);
CLON_VEC DuyDx(du[0],CLONE_COL,1);
CLON_VEC DuyDy(du[1],CLONE_COL,1);
CLON_VEC DuyDz(du[2],CLONE_COL,1);
CLON_VEC DuzDx(du[0],CLONE_COL,2);
CLON_VEC DuzDy(du[1],CLONE_COL,2);
CLON_VEC DuzDz(du[2],CLONE_COL,2);
const INDEX N = DuxDx.size(); // # of integration pts
sigma.assign(3, DENS_MAT(N,3));
// precompute the pressure and copy to the diagonal
column(sigma[0],0) = DuxDx;
column(sigma[0],1) = DuyDx;
column(sigma[0],2) = DuzDx;
column(sigma[1],0) = DuxDy;
column(sigma[1],1) = DuyDy;
column(sigma[1],2) = DuzDy;
column(sigma[2],0) = DuxDz;
column(sigma[2],1) = DuyDz;
column(sigma[2],2) = DuzDz;
sigma[0] *= -1.*viscosity_;
sigma[1] *= -1.*viscosity_;
sigma[2] *= -1.*viscosity_;
}
void ViscousStressConstant::viscosity(const FIELD_MATS &fields,
DENS_MAT &coefs) const
{
const DENS_MAT & v = (fields.find(VELOCITY))->second;
coefs.resize(v.nRows(),v.nCols());
coefs = -1.*viscosity_;
}
}// end atc namespace
diff --git a/lib/atc/ViscousStress.h b/lib/atc/ViscousStress.h
index 3a51702a6..d9da27045 100644
--- a/lib/atc/ViscousStress.h
+++ b/lib/atc/ViscousStress.h
@@ -1,70 +1,64 @@
#ifndef VISCOUS_STRESS_H
#define VISCOUS_STRESS_H
#include <map>
#include <string>
#include <vector>
-
-using std::map;
-using std::string;
-
+#include <fstream>
#include "MatrixLibrary.h"
#include "ATC_TypeDefs.h"
-using ATC_Utility::command_line;
-using ATC_Utility::str2dbl;
-
namespace ATC {
/**
* @class ViscousStress
* @brief Base class that defines interface for a constitutive law
* @brief that computes viscous stresses given all field and gradient information.
*/
class ViscousStress
{
public:
ViscousStress() {};
virtual ~ViscousStress() {};
virtual void initialize(void){};
//* Returns parameter values, (Nothing uses this).
- virtual void parameters(map<string,double> &parameters) {}
+ virtual void parameters(std::map<std::string,double> &parameters) {}
//* Computes viscous stress given a strain rate tensor.
//* Units: mvv/L^3 (i.e. for units Real: g/(mol ps^2 A^2) )
virtual void viscous_stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &stress)=0;
virtual void viscosity(const FIELD_MATS & fields,
DENS_MAT & coefs) const
{throw ATC_Error("ViscousStress::viscosity: unimplemented function");}
//* Returns the derivative of the stress tensor for a given strain-rate tensor.
virtual void tangent(const MATRIX &F, MATRIX &C) const
{throw ATC_Error("ViscousStress::tangent: unimplemented function");}
};
/**
* @class ViscousStressConstant
* @brief Class for computing stress for a constant viscosity material
* assuming divergence-free flow
*/
class ViscousStressConstant : public ViscousStress
{
public:
ViscousStressConstant():viscosity_(0.){};
- ViscousStressConstant(fstream &matfile);
+ ViscousStressConstant(std::fstream &matfile);
ViscousStressConstant(double viscosity)
: viscosity_(viscosity) {};
void viscous_stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
DENS_MAT_VEC &flux);
void viscosity(const FIELD_MATS & fields,
DENS_MAT & coefs) const;
protected:
double viscosity_;
void set_tangent();
};
}
#endif
diff --git a/lib/atc/WeakEquation.h b/lib/atc/WeakEquation.h
index 9e10832fc..606f09c83 100644
--- a/lib/atc/WeakEquation.h
+++ b/lib/atc/WeakEquation.h
@@ -1,105 +1,108 @@
#ifndef WEAK_EQUATION_H
#define WEAK_EQUATION_H
+#include <string>
+#include <set>
+
#include "ATC_TypeDefs.h"
namespace ATC{
class Material;
/**
* @class WeakEquation
* @brief WeakEquation is a template for adapting FE weak equations
* for the FE_Engine. It wrappers the correct material functions for
* integration over elements
*/
class WeakEquation {
public:
/** type of equation */
enum PDE_Type {DYNAMIC_PDE=0, STATIC_PDE, EIGENVALUE_PDE, PROJECTION_PDE};
// constructor
WeakEquation(PDE_Type type, FieldName fieldName, int fieldSize) :
type_(type), fieldName_(fieldName), fieldSize_(fieldSize), nsd_(3) {};
// destructor
virtual ~WeakEquation(){};
/** integrand that used to form the energy */
virtual bool has_E_integrand(void) const {return false;}
virtual void E_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &energy ) const {};
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return false;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const {};
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return false;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const {};
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return false;}
// N_integrand bool is for masking in FE_Engine
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const {return false;};
/** stiffness matrix */
// linear
virtual void BB_tangent_coefficients(const FieldName field,
const Material * material,
DENS_MAT &coefs) const {};
virtual void NN_tangent_coefficients(const FieldName field,
const Material * material,
DENS_MAT &coefs) const {};
// non-linear
virtual bool has_BB_tangent_coefficients(void) const {return false;}
virtual void BB_tangent_coefficients(const FieldName field,
const FIELD_MATS &fields,
const Material * material,
DENS_MAT &coefs) const {};
virtual bool has_NN_tangent_coefficients(void) const {return false;}
virtual void NN_tangent_coefficients(const FieldName field,
const FIELD_MATS &fields,
const Material * material,
DENS_MAT &coefs) const {};
/** type of equation */
PDE_Type type(void) const {return type_;}
/** primary field */
FieldName field_name(void) const {return fieldName_;}
int field_size(void) const {return fieldSize_;}
/** list of require interfaces */
- virtual set<string> needs_material_functions(void) const = 0;
+ virtual std::set<std::string> needs_material_functions(void) const = 0;
protected:
/** type of equation */
PDE_Type type_;
/** field */
FieldName fieldName_;
/** field size */
int fieldSize_;
/** number of spatial dimensions */
int nsd_;
};
};
#endif
diff --git a/lib/atc/WeakEquationChargeDiffusion.cpp b/lib/atc/WeakEquationChargeDiffusion.cpp
index fae0617ad..05152579f 100644
--- a/lib/atc/WeakEquationChargeDiffusion.cpp
+++ b/lib/atc/WeakEquationChargeDiffusion.cpp
@@ -1,40 +1,39 @@
#include "ATC_Transfer.h"
#include "WeakEquationChargeDiffusion.h"
#include "Material.h"
-#include <string>
#include <iostream>
#include <fstream>
namespace ATC {
//==============================================================
// Class WeakEquationChargeDiffusion
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationChargeDiffusion::WeakEquationChargeDiffusion()
: WeakEquation(PROJECTION_PDE,CHARGE_DENSITY,1)
{}
//--------------------------------------------------------------
// Destructor
//--------------------------------------------------------------
WeakEquationChargeDiffusion::~WeakEquationChargeDiffusion(void)
{}
//---------------------------------------------------------------------
// compute capacity
//---------------------------------------------------------------------
void WeakEquationChargeDiffusion::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT & capacity ) const
{
FIELD_MATS::const_iterator rhoField = fields.find(CHARGE_DENSITY);
const DENS_MAT & rho = rhoField->second;
capacity.reset(rho.nRows(),rho.nCols());
capacity = 1.;
}
}; // end namespace
diff --git a/lib/atc/WeakEquationChargeDiffusion.h b/lib/atc/WeakEquationChargeDiffusion.h
index 7dbe98bdb..314790b63 100644
--- a/lib/atc/WeakEquationChargeDiffusion.h
+++ b/lib/atc/WeakEquationChargeDiffusion.h
@@ -1,38 +1,41 @@
#ifndef WEAK_EQUATION_CHARGE_DIFFUSION_H
#define WEAK_EQUATION_CHARGE_DIFFUSION_H
+#include <set>
+#include <string>
+
#include "WeakEquation.h"
namespace ATC{
/**
* @class WeakEquationChargeDiffusion
* @brief Charge density computation
* int M q = sum_s N q_s
*/
class WeakEquationChargeDiffusion : public WeakEquation {
public:
// constructor
WeakEquationChargeDiffusion();
// destructor
virtual ~WeakEquationChargeDiffusion();
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs;
+ std::set<std::string> needs;
return needs;
}
};
};
#endif
diff --git a/lib/atc/WeakEquationDiffusion.cpp b/lib/atc/WeakEquationDiffusion.cpp
index 6ad167d2a..1af7d2f7f 100644
--- a/lib/atc/WeakEquationDiffusion.cpp
+++ b/lib/atc/WeakEquationDiffusion.cpp
@@ -1,51 +1,50 @@
#include "ATC_Transfer.h"
#include "WeakEquationDiffusion.h"
#include "Material.h"
-#include <string>
#include <iostream>
#include <fstream>
namespace ATC {
//==============================================================
// Class WeakEquationDiffusion
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationDiffusion::WeakEquationDiffusion()
: WeakEquation(DYNAMIC_PDE,SPECIES_CONCENTRATION,1)
{}
//--------------------------------------------------------------
// Destructor
//--------------------------------------------------------------
WeakEquationDiffusion::~WeakEquationDiffusion(void)
{}
//---------------------------------------------------------------------
// compute capacity
//---------------------------------------------------------------------
void WeakEquationDiffusion::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT & capacity ) const
{
FIELD_MATS::const_iterator rhoField = fields.find(SPECIES_CONCENTRATION);
const DENS_MAT & rho = rhoField->second;
capacity.reset(rho.nRows(),rho.nCols());
capacity = 1.;
}
//--------------------------------------------------------------
// compute flux
//--------------------------------------------------------------
void WeakEquationDiffusion::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
// material->diffusion_flux(fields, grad_fields, flux[SPECIES_CONCENTRATION]);
}
}; // end namespace
diff --git a/lib/atc/WeakEquationDiffusion.h b/lib/atc/WeakEquationDiffusion.h
index 26d2c8a48..057f49938 100644
--- a/lib/atc/WeakEquationDiffusion.h
+++ b/lib/atc/WeakEquationDiffusion.h
@@ -1,47 +1,50 @@
#ifndef WEAK_EQUATION_DIFFUSION_H
#define WEAK_EQUATION_DIFFUSION_H
+#include <set>
+#include <string>
+
#include "WeakEquation.h"
namespace ATC{
/**
* @class WeakEquationDiffusion
* @brief species diffusion
* c q,t = div q -->
* int M c q,t = int B q
*/
class WeakEquationDiffusion : public WeakEquation {
public:
// constructor
WeakEquationDiffusion();
// destructor
virtual ~WeakEquationDiffusion();
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return false;} // note true
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const ;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs;
+ std::set<std::string> needs;
return needs;
}
};
};
#endif
diff --git a/lib/atc/WeakEquationElectronContinuity.cpp b/lib/atc/WeakEquationElectronContinuity.cpp
index e066b2a84..67ffc581d 100644
--- a/lib/atc/WeakEquationElectronContinuity.cpp
+++ b/lib/atc/WeakEquationElectronContinuity.cpp
@@ -1,106 +1,105 @@
#include "WeakEquationElectronContinuity.h"
#include "Material.h"
-#include <string>
#include <iostream>
#include <fstream>
namespace ATC {
//==============================================================
// Class WeakEquationElectronContinuity
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationElectronContinuity::WeakEquationElectronContinuity()
: WeakEquation(DYNAMIC_PDE,ELECTRON_DENSITY,1)
{}
//--------------------------------------------------------------
// Destructor
//---------------------------------------------------------------------
WeakEquationElectronContinuity::~WeakEquationElectronContinuity(void)
{}
//---------------------------------------------------------------------
void WeakEquationElectronContinuity::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT & density ) const
{
FIELD_MATS::const_iterator nField = fields.find(ELECTRON_DENSITY);
const DENS_MAT & n = nField->second;
density.resize(n.nRows(),n.nCols());
density = 1;
}
//---------------------------------------------------------------------
void WeakEquationElectronContinuity::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
material->electron_flux(fields, grad_fields, flux);
}
//---------------------------------------------------------------------
bool WeakEquationElectronContinuity::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &recombination) const
{
return material->electron_recombination(fields, grad_fields, recombination);
}
//==============================================================
// Class WeakEquationElectronEquilbrium
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationElectronEquilibrium::WeakEquationElectronEquilibrium()
: WeakEquation(PROJECTION_PDE,ELECTRON_DENSITY,1)
{}
//--------------------------------------------------------------
// Destructor
//---------------------------------------------------------------------
WeakEquationElectronEquilibrium::~WeakEquationElectronEquilibrium(void)
{}
//---------------------------------------------------------------------
void WeakEquationElectronEquilibrium::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT & density ) const
{
FIELD_MATS::const_iterator nField = fields.find(ELECTRON_DENSITY);
const DENS_MAT & n = nField->second;
density.reset(n.nRows(),n.nCols());
density = 1;
}
//---------------------------------------------------------------------
bool WeakEquationElectronEquilibrium::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const
{
bool flag = material->electron_charge_density(fields, flux);
flux *= -1.; // transform from charge density to number density
return flag;
}
//---------------------------------------------------------------------
void WeakEquationElectronEquilibrium::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
material->electron_flux(fields, grad_fields, flux);
}
};
diff --git a/lib/atc/WeakEquationElectronContinuity.h b/lib/atc/WeakEquationElectronContinuity.h
index f6be1336d..e12dce45a 100644
--- a/lib/atc/WeakEquationElectronContinuity.h
+++ b/lib/atc/WeakEquationElectronContinuity.h
@@ -1,105 +1,108 @@
#ifndef WEAK_EQUATION_ELECTRON_CONTINUITY_H
#define WEAK_EQUATION_ELECTRON_CONTINUITY_H
+#include <set>
+#include <string>
+
#include "WeakEquation.h"
namespace ATC{
/**
* @class WeakEquationElectronContinuity
* @brief Electron continuity
* n,t = div J + (G-R) -->
* M n,t = int B J + int N (G-R)
*/
class WeakEquationElectronContinuity : public WeakEquation {
public:
// constructor
WeakEquationElectronContinuity();
// destructor
virtual ~WeakEquationElectronContinuity();
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const;
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- string list[2] = {"electron_flux","electron_recombination"};
- set<string> needs(list,list+2);
+ std::string list[2] = {"electron_flux","electron_recombination"};
+ std::set<std::string> needs(list,list+2);
return needs;
}
};
/**
* @class WeakEquationElectronEquilibrium
* @brief Electron continuity from equilibrium
* n = n(\phi)
* M n = int N n(\phi)
*/
class WeakEquationElectronEquilibrium : public WeakEquation {
public:
// constructor
WeakEquationElectronEquilibrium();
// destructor
virtual ~WeakEquationElectronEquilibrium();
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const;
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs;
+ std::set<std::string> needs;
needs.insert("electron_charge_density");
return needs;
}
};
};
#endif
diff --git a/lib/atc/WeakEquationElectronMomentum.h b/lib/atc/WeakEquationElectronMomentum.h
index e1fb13561..a3bc62bef 100644
--- a/lib/atc/WeakEquationElectronMomentum.h
+++ b/lib/atc/WeakEquationElectronMomentum.h
@@ -1,114 +1,117 @@
#ifndef WEAK_EQUATION_ELECTRON_MOMENTUM_H
#define WEAK_EQUATION_ELECTRON_MOMENTUM_H
+#include <set>
+#include <string>
+
#include "WeakEquation.h"
namespace ATC{
class Material;
/**
* @class WeakEquationElectronMomentum
* @brief Electron momentum
* rho v,t = div P -->
* int M rho v,t = int B P
*/
class WeakEquationElectronMomentum : public WeakEquation {
public:
// constructor
WeakEquationElectronMomentum();
// destructor
virtual ~WeakEquationElectronMomentum();
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** convection for flux */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const ;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- string list[2] = {"inv_effective_mass","electron_heat_capacity"};
- set<string> needs(list,list+2);
+ std::string list[2] = {"inv_effective_mass","electron_heat_capacity"};
+ std::set<std::string> needs(list,list+2);
return needs;
}
protected:
/** computes standard velocity convective fluxes */
virtual void convection(const FIELD_MATS &fields,
const Material * material,
DENS_MAT_VEC & flux) const ;
};
/**
* @class WeakEquationElectronMomentumDDM
* @brief Electron momentum - drift diffusion
* rho v,t = div P -->
* int M rho v,t = int B P
*/
class WeakEquationElectronMomentumDDM : public WeakEquationElectronMomentum {
public:
// constructor
WeakEquationElectronMomentumDDM();
// destructor
virtual ~WeakEquationElectronMomentumDDM();
/** density that used to form the mass matrix */
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** flux that is integrated with grad N as its weight */
virtual bool has_B_integrand(void) const {return false;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const {};
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const ;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs
+ std::set<std::string> needs
= WeakEquationElectronMomentum::needs_material_functions();
needs.insert("electron_drag_coefficient");
needs.insert("electron_heat_capacity");
needs.insert("electric_displacement");
return needs;
}
protected:
/** computes thermal stresses arising from convection */
virtual void thermal_stress(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT &flux) const ;
/** workspace variables */
mutable DENS_MAT_VEC _dnCp_;
mutable DENS_MAT_VEC _electricForce_;
};
};
#endif
diff --git a/lib/atc/WeakEquationElectronTemperature.cpp b/lib/atc/WeakEquationElectronTemperature.cpp
index 182dd61a0..3841f619a 100644
--- a/lib/atc/WeakEquationElectronTemperature.cpp
+++ b/lib/atc/WeakEquationElectronTemperature.cpp
@@ -1,228 +1,227 @@
#include "WeakEquationElectronTemperature.h"
#include "Material.h"
-#include <string>
#include <iostream>
#include <fstream>
namespace ATC {
//==============================================================
// Class WeakEquationElectronTemperature
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationElectronTemperature::WeakEquationElectronTemperature()
: WeakEquation(DYNAMIC_PDE,ELECTRON_TEMPERATURE,1)
{
}
//--------------------------------------------------------------
// Destructor
//---------------------------------------------------------------------
WeakEquationElectronTemperature::~WeakEquationElectronTemperature(void)
{}
//---------------------------------------------------------------------
// compute energy
//---------------------------------------------------------------------
void WeakEquationElectronTemperature::E_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT & energy ) const
{
material->electron_thermal_energy(fields, energy);
}
//---------------------------------------------------------------------
// compute heat capacities
//---------------------------------------------------------------------
void WeakEquationElectronTemperature::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT & capacity ) const
{
material->electron_heat_capacity(fields, capacity);
}
//---------------------------------------------------------------------
// compute heat fluxes
//---------------------------------------------------------------------
void WeakEquationElectronTemperature::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
material->electron_heat_flux(fields, grad_fields, flux);
}
//---------------------------------------------------------------------
// compute exchange fluxes
//---------------------------------------------------------------------
bool WeakEquationElectronTemperature::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const
{
DENS_MAT exchange_flux;
bool has = material->electron_phonon_exchange(fields, exchange_flux);
if (has) flux = -1.*exchange_flux;
return has;
}
//==============================================================
// Class WeakEquationElectronJouleHeating
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationElectronTemperatureJouleHeating::WeakEquationElectronTemperatureJouleHeating()
: WeakEquationElectronTemperature()
{
// convert charge * voltage --> mass length^2 / time^2
//eV2E_ = (ATC::LammpsInterface::instance()->qe2f())
// * (ATC::LammpsInterface::instance()->ftm2v());
eV2E_ = ATC::LammpsInterface::instance()->qv2e();
int nSD = 3;
_J_.assign(nSD, DENS_MAT());
_E_.assign(nSD, DENS_MAT());
}
//--------------------------------------------------------------
// Destructor
//---------------------------------------------------------------------
WeakEquationElectronTemperatureJouleHeating::~WeakEquationElectronTemperatureJouleHeating(void)
{}
//---------------------------------------------------------------------
void WeakEquationElectronTemperatureJouleHeating::E_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &energy) const
{
WeakEquationElectronTemperature::E_integrand(fields, grad_fields, material, energy);
}
//---------------------------------------------------------------------
void WeakEquationElectronTemperatureJouleHeating::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT &capacity) const
{
WeakEquationElectronTemperature::M_integrand(fields, material, capacity);
}
//---------------------------------------------------------------------
void WeakEquationElectronTemperatureJouleHeating::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
WeakEquationElectronTemperature::B_integrand(fields, grad_fields, material, flux);
}
//---------------------------------------------------------------------
bool WeakEquationElectronTemperatureJouleHeating::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const
{
// call base class to get electron_temperature terms
WeakEquationElectronTemperature::N_integrand(fields, grad_fields, material, flux);
DENS_MAT jouleHeating;
material->electron_flux (fields, grad_fields, _J_);
material->electric_field(fields, grad_fields, _E_);
jouleHeating = _J_[0].mult_by_element(_E_[0]);
for (DENS_MAT_VEC::size_type i=1; i < _J_.size(); i++)
jouleHeating += _J_[i].mult_by_element(_E_[i]);
jouleHeating *= eV2E_;
flux += jouleHeating;
return true;
}
//==============================================================
// Class WeakEquationElectronConvection
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationElectronTemperatureConvection::WeakEquationElectronTemperatureConvection()
: WeakEquationElectronTemperature()
{
int nSD = 3;
_convectiveFlux_.assign(nSD, DENS_MAT());
}
//--------------------------------------------------------------
// Destructor
//---------------------------------------------------------------------
WeakEquationElectronTemperatureConvection::~WeakEquationElectronTemperatureConvection(void)
{
// do nothing
}
//---------------------------------------------------------------------
void WeakEquationElectronTemperatureConvection::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
// add diffusion term
WeakEquationElectronTemperature::B_integrand(fields, grad_fields, material, flux);
//flux[0] = 0.;
//flux[1] = 0.;
//flux[2] = 0.;
// add convection term
DENS_MAT_VEC convectiveFlux;
material->electron_heat_convection(fields,_convectiveFlux_);
flux[0] += _convectiveFlux_[0];
flux[1] += _convectiveFlux_[1];
flux[2] += _convectiveFlux_[2];
}
//---------------------------------------------------------------------
bool WeakEquationElectronTemperatureConvection::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const
{
// call base class to get electron_temperature terms
WeakEquationElectronTemperature::N_integrand(fields, grad_fields, material, flux);
// add exchange with kinetic energy
DENS_MAT keExchange;
DENS_MAT capacity;
material->electron_heat_capacity(fields, capacity);
capacity *= 2./3.; // correction in DDM equations
//FIELD_MATS::const_iterator dField = fields.find(ELECTRON_DENSITY);
FIELD_MATS::const_iterator tField = fields.find(ELECTRON_TEMPERATURE);
//const DENS_MAT & density = dField->second;
const DENS_MAT & temperature = tField->second;
GRAD_FIELD_MATS::const_iterator velocityGradients = grad_fields.find(ELECTRON_VELOCITY);
const DENS_MAT_VEC & dv = velocityGradients->second;
CLON_VEC vxx(dv[0],CLONE_COL,0);
CLON_VEC vyy(dv[1],CLONE_COL,1);
CLON_VEC vzz(dv[2],CLONE_COL,2);
keExchange = vxx + vyy + vzz;
//keExchange *= density;
keExchange *= temperature;
keExchange *= capacity;
flux -= keExchange;
return true;
}
}; // end namespace
diff --git a/lib/atc/WeakEquationElectronTemperature.h b/lib/atc/WeakEquationElectronTemperature.h
index c27a0d080..8680de31a 100644
--- a/lib/atc/WeakEquationElectronTemperature.h
+++ b/lib/atc/WeakEquationElectronTemperature.h
@@ -1,177 +1,180 @@
#ifndef WEAK_EQUATION_ELECTRON_TEMPERATURE_H
#define WEAK_EQUATION_ELECTRON_TEMPERATURE_H
+#include <set>
+#include <string>
+
#include "WeakEquation.h"
namespace ATC{
/**
* @class WeakEquationElectronTemperature
* @brief Electron temperature
* c T_e,t = div q_e + g(T_e-T_p) -->
* int M c T_e,t = int B q_e + int N g
*/
class WeakEquationElectronTemperature : public WeakEquation {
public:
// constructor
WeakEquationElectronTemperature();
// destructor
virtual ~WeakEquationElectronTemperature();
/** integrand that used to form the energy */
virtual bool has_E_integrand(void) const {return true;}
virtual void E_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &energy ) const ;
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const ;
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const ;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- string list[4] = {"electron_thermal_energy",
+ std::string list[4] = {"electron_thermal_energy",
"electron_heat_capacity",
"electron_phonon_exchange",
"electron_heat_flux"};
- set<string> needs(list,list+4);
+ std::set<std::string> needs(list,list+4);
return needs;
}
};
/**
* @class WeakEquationElectronTemperatureJouleHeating
* @brief Electron temperature with Joule heating
* c T_e,t = div q_e + g(T_e-T_p) + J.E -->
* int M c T_e,t = int B q_e + int N ( g + J.E)
*/
class WeakEquationElectronTemperatureJouleHeating :
public WeakEquationElectronTemperature
{
public:
// constructor
WeakEquationElectronTemperatureJouleHeating();
// destructor
virtual ~WeakEquationElectronTemperatureJouleHeating();
/** integrand that used to form the energy */
virtual bool has_E_integrand(void) const {return true;}
virtual void E_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &energy ) const;
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const;
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const;
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs
+ std::set<std::string> needs
= WeakEquationElectronTemperature::needs_material_functions();
needs.insert("electric_field");
return needs;
}
protected:
/** conversion factor for charge * voltage --> mass length^2 / time^2 */
double eV2E_;
mutable DENS_MAT_VEC _J_, _E_;
};
/**
* @class WeakEquationElectronTemperatureConvection
* @brief Electron temperature with convection
* c ( T_e,t + grad m_e J.E T_e / e ) = div q_e + g(T_e-T_p) + c n T_e grad J.E/(n e) -->
* int M c T_e,t = int B ( q_e - c m_e J.E T_e / e ) + int N ( g + c n T_e grad J.E/(n e) )
*/
class WeakEquationElectronTemperatureConvection :
public WeakEquationElectronTemperature
{
public:
// constructor
WeakEquationElectronTemperatureConvection();
// destructor
virtual ~WeakEquationElectronTemperatureConvection();
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const;
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs
+ std::set<std::string> needs
= WeakEquationElectronTemperature::needs_material_functions();
needs.insert("electron_drag_power");
return needs;
}
protected:
/** workspace variable for the convective flux */
mutable DENS_MAT_VEC _convectiveFlux_;
};
}; // end namespace
#endif
diff --git a/lib/atc/WeakEquationMassDiffusion.cpp b/lib/atc/WeakEquationMassDiffusion.cpp
index fd501bb42..5e4445442 100644
--- a/lib/atc/WeakEquationMassDiffusion.cpp
+++ b/lib/atc/WeakEquationMassDiffusion.cpp
@@ -1,51 +1,50 @@
#include "ATC_Transfer.h"
#include "WeakEquationMassDiffusion.h"
#include "Material.h"
-#include <string>
#include <iostream>
#include <fstream>
namespace ATC {
//==============================================================
// Class WeakEquationMassDiffusion
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationMassDiffusion::WeakEquationMassDiffusion()
: WeakEquation(DYNAMIC_PDE,MASS_DENSITY,1)
{}
//--------------------------------------------------------------
// Destructor
//--------------------------------------------------------------
WeakEquationMassDiffusion::~WeakEquationMassDiffusion(void)
{}
//---------------------------------------------------------------------
// compute capacity
//---------------------------------------------------------------------
void WeakEquationMassDiffusion::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT & capacity ) const
{
FIELD_MATS::const_iterator dField = fields.find(MASS_DENSITY);
const DENS_MAT & rho = dField->second;
capacity.reset(rho.nRows(),rho.nCols());
capacity = 1.;
}
//--------------------------------------------------------------
// compute flux
//--------------------------------------------------------------
void WeakEquationMassDiffusion::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
// material->mass_flux(fields, grad_fields, flux[MASS_DENSITY]);
}
}; // end namespace
diff --git a/lib/atc/WeakEquationMassDiffusion.h b/lib/atc/WeakEquationMassDiffusion.h
index 70e5be537..5b3a65430 100644
--- a/lib/atc/WeakEquationMassDiffusion.h
+++ b/lib/atc/WeakEquationMassDiffusion.h
@@ -1,49 +1,52 @@
#ifndef WEAK_EQUATION_MASS_DIFFUSION_H
#define WEAK_EQUATION_MASS_DIFFUSION_H
+#include <set>
+#include <string>
+
#include "WeakEquation.h"
namespace ATC{
/**
* @class WeakEquationMassDiffusion
* @brief Mass diffusion
* c rho,t = div rho -->
* int M c rho,t = int B rho
*/
class WeakEquationMassDiffusion : public WeakEquation {
public:
// constructor
WeakEquationMassDiffusion();
// destructor
virtual ~WeakEquationMassDiffusion();
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const ;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- string list[1] = {"mass_density"};
- set<string> needs(list,list+1);
+ std::string list[1] = {"mass_density"};
+ std::set<std::string> needs(list,list+1);
return needs;
}
};
};
#endif
diff --git a/lib/atc/WeakEquationMomentum.h b/lib/atc/WeakEquationMomentum.h
index 2fdb8671d..cb1e829e9 100644
--- a/lib/atc/WeakEquationMomentum.h
+++ b/lib/atc/WeakEquationMomentum.h
@@ -1,171 +1,174 @@
#ifndef WEAK_EQUATION_MOMENTUM_H
#define WEAK_EQUATION_MOMENTUM_H
+#include <set>
+#include <string>
+
#include "WeakEquation.h"
namespace ATC{
class Material;
/**
* @class WeakEquationMomentum
* @brief Momentum
* rho v,t = div P -->
* int M rho v,t = int B P
*/
class WeakEquationMomentum : public WeakEquation {
public:
// constructor
WeakEquationMomentum();
// destructor
virtual ~WeakEquationMomentum();
/** integrand that used to form the energy */
virtual bool has_E_integrand(void) const {return true;}
virtual void E_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &energy ) const;
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const ;
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const ;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- string list[4] = {"mass_density","stress","elastic_energy","body_force"};
- set<string> needs(list,list+4);
+ std::string list[4] = {"mass_density","stress","elastic_energy","body_force"};
+ std::set<std::string> needs(list,list+4);
return needs;
}
};
/**
* @class WeakEquationMomentumElectrostatic
* @brief Momentum with electrostatic forces
* rho v,t = div P + b -->
* int M rho v,t = int B P + N b
*/
class WeakEquationMomentumElectrostatic : public WeakEquationMomentum {
public:
// constructor
WeakEquationMomentumElectrostatic();
// destructor
virtual ~WeakEquationMomentumElectrostatic(){};
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const
{ WeakEquationMomentum::M_integrand(fields, material, density ); }
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{ WeakEquationMomentum::B_integrand(fields, grad_fields, material, flux); }
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const ;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs
+ std::set<std::string> needs
= WeakEquationMomentum::needs_material_functions();
needs.insert("electric_field");
return needs;
}
protected:
/** conversion factor charge * electric field --> force */
double qE2f_;
mutable DENS_MAT_VEC _E_;
};
class WeakEquationMomentumDiffusion : public WeakEquation {
public:
// constructor
WeakEquationMomentumDiffusion();
// destructor
virtual ~WeakEquationMomentumDiffusion();
/** integrand that used to form the energy */
virtual bool has_E_integrand(void) const {return false;}
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const ;
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const ;
/** linear RHS stiffness matrix */
virtual bool has_BB_tangent_coefficients(void) const {return true;}
virtual void BB_tangent_coefficients(const FieldName field,
const FIELD_MATS &fields,
const Material * material,
DENS_MAT &coefs) const;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- string list[4] = {"mass_density","viscous_stress","body_force"};
- set<string> needs(list,list+3);
+ std::string list[4] = {"mass_density","viscous_stress","body_force"};
+ std::set<std::string> needs(list,list+3);
return needs;
}
};
} // NAMESPACE
#endif
diff --git a/lib/atc/WeakEquationPhononTemperature.cpp b/lib/atc/WeakEquationPhononTemperature.cpp
index 51aa7f362..aef1cd4c5 100644
--- a/lib/atc/WeakEquationPhononTemperature.cpp
+++ b/lib/atc/WeakEquationPhononTemperature.cpp
@@ -1,125 +1,124 @@
#include "ATC_Transfer.h"
#include "WeakEquationPhononTemperature.h"
#include "Material.h"
-#include <string>
#include <iostream>
#include <fstream>
namespace ATC {
//==============================================================
// Class WeakEquationElectronTemperature
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationPhononTemperature::WeakEquationPhononTemperature()
: WeakEquation(DYNAMIC_PDE,TEMPERATURE,1)
{}
//--------------------------------------------------------------
// Destructor
//--------------------------------------------------------------
WeakEquationPhononTemperature::~WeakEquationPhononTemperature(void)
{}
//---------------------------------------------------------------------
// compute total energy
//---------------------------------------------------------------------
void WeakEquationPhononTemperature::E_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT &energy) const
{
material->thermal_energy(fields, energy);
}
//---------------------------------------------------------------------
// compute heat capacity
//---------------------------------------------------------------------
void WeakEquationPhononTemperature::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT & capacity ) const
{
material->heat_capacity(fields, capacity);
}
//--------------------------------------------------------------
// compute heat flux
//--------------------------------------------------------------
void WeakEquationPhononTemperature::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT_VEC &flux) const
{
material->heat_flux(fields, gradFields, flux);
}
//==============================================================
// Class WeakEquationPhononTemperatureExchange
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationPhononTemperatureExchange::WeakEquationPhononTemperatureExchange()
: WeakEquationPhononTemperature()
{}
//--------------------------------------------------------------
// Destructor
//---------------------------------------------------------------------
WeakEquationPhononTemperatureExchange::~WeakEquationPhononTemperatureExchange(void)
{}
//---------------------------------------------------------------------
// compute energy
//---------------------------------------------------------------------
void WeakEquationPhononTemperatureExchange::E_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT &energy ) const
{
WeakEquationPhononTemperature::E_integrand(fields,gradFields,material,energy);
}
//---------------------------------------------------------------------
// compute heat capacities
//---------------------------------------------------------------------
void WeakEquationPhononTemperatureExchange::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT & density ) const
{
WeakEquationPhononTemperature::M_integrand(fields,material,density);
}
//---------------------------------------------------------------------
// compute heat fluxes
//---------------------------------------------------------------------
void WeakEquationPhononTemperatureExchange::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT_VEC &flux) const
{
WeakEquationPhononTemperature::B_integrand(fields,gradFields,material,flux);
}
//---------------------------------------------------------------------
// compute exchange fluxes
//---------------------------------------------------------------------
bool WeakEquationPhononTemperatureExchange::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT &flux) const
{
bool has = material->electron_phonon_exchange(fields, flux);
has = has || material->electron_drag_power(fields, gradFields, flux);
return has;
}
}; // end namespace
diff --git a/lib/atc/WeakEquationPhononTemperature.h b/lib/atc/WeakEquationPhononTemperature.h
index 6b1a625a0..f3dfcac52 100644
--- a/lib/atc/WeakEquationPhononTemperature.h
+++ b/lib/atc/WeakEquationPhononTemperature.h
@@ -1,113 +1,116 @@
#ifndef WEAK_EQUATION_PHONON_TEMPERATURE_H
#define WEAK_EQUATION_PHONON_TEMPERATURE_H
+#include <set>
+#include <string>
+
#include "WeakEquation.h"
namespace ATC{
/**
* @class WeakEquationPhononTemperature
* @brief Phonon temperature
* c T_p,t = div q_p -->
* int M c T_p,t = int B q_p
*/
class WeakEquationPhononTemperature : public WeakEquation {
public:
// constructor
WeakEquationPhononTemperature();
// destructor
virtual ~WeakEquationPhononTemperature();
/** integrand that used to form the energy */
virtual bool has_E_integrand(void) const {return true;}
virtual void E_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT &energy ) const ;
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const ;
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT_VEC &flux) const ;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- string list[3] = {"thermal_energy","heat_capacity","heat_flux"};
- set<string> needs(list,list+3);
+ std::string list[3] = {"thermal_energy","heat_capacity","heat_flux"};
+ std::set<std::string> needs(list,list+3);
return needs;
}
};
/**
* @class WeakEquationPhononTemperatureExchange
* @brief Phonon temperature with exchange to electrons
* c T_p,t = div q_p + g(T_p-T_e) -->
* int M c T_p,t = int B q_p + int N g
*/
class WeakEquationPhononTemperatureExchange :
public WeakEquationPhononTemperature {
public:
// constructor
WeakEquationPhononTemperatureExchange();
// destructor
virtual ~WeakEquationPhononTemperatureExchange();
/** integrand that used to form the energy */
virtual bool has_E_integrand(void) const {return true;}
virtual void E_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT &energy ) const;
/** density that used to form the mass matrix */
virtual bool has_M_integrand(void) const {return true;}
virtual void M_integrand(const FIELD_MATS &fields,
const Material * material,
DENS_MAT &density ) const;
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT_VEC &flux) const;
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &gradFields,
const Material * material,
DENS_MAT &flux) const;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs
+ std::set<std::string> needs
= WeakEquationPhononTemperature::needs_material_functions();
needs.insert("electron_phonon_exchange");
return needs;
}
};
}; // namespace
#endif
diff --git a/lib/atc/WeakEquationPoisson.cpp b/lib/atc/WeakEquationPoisson.cpp
index 6970a138a..02e8655dc 100644
--- a/lib/atc/WeakEquationPoisson.cpp
+++ b/lib/atc/WeakEquationPoisson.cpp
@@ -1,95 +1,94 @@
#include "WeakEquationPoisson.h"
#include "Material.h"
-#include <string>
#include <iostream>
#include <fstream>
namespace ATC {
//==============================================================
// Class WeakEquationPoisson
//==============================================================
// R = B^T flux + N source = 0
// 0 = B^T perm B phi - N rho_+
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationPoisson::WeakEquationPoisson()
: WeakEquation(STATIC_PDE,ELECTRIC_POTENTIAL,1)
{}
//---------------------------------------------------------------------
void WeakEquationPoisson::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
// flux = - perm D_x phi
material->electric_displacement(fields, grad_fields, flux);
flux[0] *= -1;
flux[1] *= -1;
flux[2] *= -1;
}
//---------------------------------------------------------------------
void WeakEquationPoisson::BB_tangent_coefficients(
const FieldName field,
const FIELD_MATS &fields,
const Material* material,
DENS_MAT &coefs) const
{
material->permittivity(fields,coefs); // convention evalues (B^T perm B) > 0
}
//---------------------------------------------------------------------
bool WeakEquationPoisson::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const
{
return material->electron_charge_density(fields,flux); // - N rho_+ = N n
}
//---------------------------------------------------------------------
void WeakEquationPoisson::NN_tangent_coefficients(
const FieldName field,
const FIELD_MATS &fields,
const Material* material,
DENS_MAT &coefs) const
{
material->D_electron_charge_density(ELECTRIC_POTENTIAL,fields,coefs);
}
//==============================================================
// Class WeakEquationPoissonConstantRHS
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationPoissonConstantRHS::WeakEquationPoissonConstantRHS()
: WeakEquationPoisson()
{}
//---------------------------------------------------------------------
bool WeakEquationPoissonConstantRHS::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const
{
FIELD_MATS::const_iterator nIter = fields.find(ELECTRON_DENSITY);
if (nIter != fields.end()) {
const DENS_MAT & n = nIter->second;
flux = -1.0*n;
return true;
}
return false;
}
};
diff --git a/lib/atc/WeakEquationPoisson.h b/lib/atc/WeakEquationPoisson.h
index 434090d68..667034525 100644
--- a/lib/atc/WeakEquationPoisson.h
+++ b/lib/atc/WeakEquationPoisson.h
@@ -1,113 +1,116 @@
#ifndef WEAK_EQUATION_POISSON_H
#define WEAK_EQUATION_POISSON_H
+#include <set>
+#include <string>
+
#include "WeakEquation.h"
namespace ATC{
/**
* @class WeakEquationPoisson
* @brief Poisson equation
* 0 = perm grad^2 \phi + \rho -->
* \int B^T perm B dv \phi = \int N^T \rho dv
*/
class WeakEquationPoisson : public WeakEquation {
public:
// constructor
WeakEquationPoisson();
// destructor
virtual ~WeakEquationPoisson(){};
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const ;
/** flux that is integrated with N as its weight */
//virtual bool has_N_integrand(void) const {return false;}
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const ;
/** linear RHS stiffness matrix */
virtual bool has_BB_tangent_coefficients(void) const {return true;}
virtual void BB_tangent_coefficients(const FieldName field,
const FIELD_MATS &fields,
const Material * material,
DENS_MAT &coefs) const;
/** linear RHS stiffness matrix */
virtual bool has_NN_tangent_coefficients(void) const {return true;}
virtual void NN_tangent_coefficients(const FieldName field,
const FIELD_MATS &fields,
const Material * material,
DENS_MAT &coefs) const;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs;
+ std::set<std::string> needs;
needs.insert("electric_displacement");
needs.insert("electron_charge_density");
return needs;
}
};
/**
* @class WeakEquationPoissonConstantRHS
* @brief Poisson equation with constant RHS
*/
class WeakEquationPoissonConstantRHS : public WeakEquationPoisson {
public:
// constructor
WeakEquationPoissonConstantRHS();
// destructor
virtual ~WeakEquationPoissonConstantRHS(){};
/** flux that is integrated with B = Grad N as its weight */
virtual bool has_B_integrand(void) const {return true;}
virtual void B_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{ WeakEquationPoisson::B_integrand(fields, grad_fields, material, flux) ; }
/** flux that is integrated with N as its weight */
virtual bool has_N_integrand(void) const {return true;}
virtual bool N_integrand(const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const ;
/** rhs is constant */
virtual bool has_NN_tangent_coefficients(void) const {return false;}
virtual void NN_tangent_coefficients(const FieldName field,
const FIELD_MATS &fields,
const Material * material,
DENS_MAT &coefs) const {};
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs;
+ std::set<std::string> needs;
needs.insert("electric_displacement");
return needs;
}
};
}; // namespace
#endif
diff --git a/lib/atc/WeakEquationSchrodinger.cpp b/lib/atc/WeakEquationSchrodinger.cpp
index 3163a8336..3663b8c80 100644
--- a/lib/atc/WeakEquationSchrodinger.cpp
+++ b/lib/atc/WeakEquationSchrodinger.cpp
@@ -1,48 +1,47 @@
#include "WeakEquationSchrodinger.h"
#include "Material.h"
-#include <string>
#include <iostream>
#include <fstream>
namespace ATC {
//==============================================================
// Class WeakEquationSchrodinger
//==============================================================
//--------------------------------------------------------------
// Constructor
//--------------------------------------------------------------
WeakEquationSchrodinger::WeakEquationSchrodinger()
: WeakEquation(EIGENVALUE_PDE,ELECTRON_WAVEFUNCTION,1) // w=0 inhomo soln
{}
//--------------------------------------------------------------
// Destructor
//---------------------------------------------------------------------
WeakEquationSchrodinger::~WeakEquationSchrodinger(void)
{}
//---------------------------------------------------------------------
void WeakEquationSchrodinger::BB_tangent_coefficients(
const FieldName field,
const FIELD_MATS & fields,
const Material* material,
DENS_MAT &coefs) const
{
material->inv_effective_mass(fields, coefs);// scaled by 1/2 hbar^2
}
//---------------------------------------------------------------------
void WeakEquationSchrodinger::NN_tangent_coefficients(
const FieldName field,
const FIELD_MATS & fields,
const Material* material,
DENS_MAT & V) const
{
material->band_edge_potential(fields,V);
FIELD_MATS::const_iterator phiField = fields.find(ELECTRIC_POTENTIAL);
const DENS_MAT & phi = phiField->second;
V -= phi; // phi in volts equals |e|*phi in [eV]'s
}
};
diff --git a/lib/atc/WeakEquationSchrodinger.h b/lib/atc/WeakEquationSchrodinger.h
index f5fe81901..c7d46fa5d 100644
--- a/lib/atc/WeakEquationSchrodinger.h
+++ b/lib/atc/WeakEquationSchrodinger.h
@@ -1,49 +1,52 @@
#ifndef WEAK_EQUATION_SCHRODINGER_H
#define WEAK_EQUATION_SCHRODINGER_H
+#include <set>
+#include <string>
+
#include "WeakEquation.h"
namespace ATC{
/**
* @class WeakEquationSchrodinger
* @brief Schrodinger equation
* -hbar^2 /2 1/m^* psi,xx + phi psi = E psi
* (-c*B^T B + phi N^T N) psi = E N^T N psi
*/
class WeakEquationSchrodinger : public WeakEquation {
public:
// constructor
WeakEquationSchrodinger();
// destructor
virtual ~WeakEquationSchrodinger();
/** RHS stiffness matrix */
virtual bool has_BB_tangent_coefficients(void) const {return true;}
virtual void BB_tangent_coefficients(const FieldName field,
const FIELD_MATS & fields,
const Material * material,
DENS_MAT &coefs) const;
virtual bool has_NN_tangent_coefficients(void) const {return true;}
virtual void NN_tangent_coefficients(const FieldName field,
const FIELD_MATS & fields,
const Material * material,
DENS_MAT &coefs) const;
/** necessary interfaces */
- virtual set<string> needs_material_functions(void) const
+ virtual std::set<std::string> needs_material_functions(void) const
{
- set<string> needs;
+ std::set<std::string> needs;
needs.insert("inv_effective_mass");
needs.insert("band_edge_potential");
return needs;
}
};
};
#endif
diff --git a/regress/benchmark.py b/regress/benchmark.py
new file mode 100755
index 000000000..0227f1431
--- /dev/null
+++ b/regress/benchmark.py
@@ -0,0 +1,235 @@
+#!/usr/bin/env python
+"""
+ function: numerical comparisions of logs and corresponding benchmarks
+ usage: benchmark.py <nprocs> <njobs> <dirs>
+"""
+import sys
+import os
+import math
+import re
+from operator import itemgetter
+from glob import glob
+import time
+import multiprocessing as mp
+try:
+ import Queue as queue # 2.6
+except ImportError:
+ import queue # 3.0
+
+#====================================================
+### constants
+#====================================================
+thermo_pattern = re.compile("^Step "); # fragile
+data_pattern = re.compile("\s*\d"); # fragile
+fail_pattern = re.compile("FAIL");
+tol = 1.e-6 # 1.e-10
+arch = "openmpi"
+src_path = "../src/" #relative to home
+exe_path = "../"+src_path
+
+#====================================================
+### date
+#====================================================
+def date():
+ return time.asctime()
+
+#====================================================
+### timer
+#====================================================
+## NOTE these don't seem to work how I expect them to
+def start():
+ global dt
+ dt = -(time.clock())
+def stop():
+ global dt
+ dt += (time.clock())
+ return dt
+
+#====================================================
+### run a benchmark
+#====================================================
+def run_test(test):
+ input = "in."+test;
+ log = "log."+test
+ stdout = "stdout."+test
+ ref = (glob(log+"*."+str(np)))[0];
+ msg = "==== comparing "+log+" with "+ref+" ====\n"
+ if (os.path.isfile(log)): os.remove(log)
+ if (os.path.isfile(stdout)): os.remove(stdout)
+ os.system(lmps+input+" >& "+stdout);
+ if (not os.path.isfile(log)) :
+ msg += "!!! no "+log+"\n";
+ msg += "!!! test "+test+" FAILED\n"
+ return msg
+ [cdict,cdata] = extract_data(log);
+ [bdict,bdata] = extract_data(ref);
+ cols = range(len(bdict))
+ if (len(cdata) != len(bdata)):
+ msg += "!!! data size "+str(len(cdata))+" does not match data "+str(len(bdata))+" in "+ref+"\n";
+ msg += "!!! test "+test+" FAILED\n"
+ return msg
+ fail = False
+ i = 0
+ for name in bdict:
+ [passing,cmsg] = compare(name,cdata[cols[i]],bdata[cols[i]]);
+ i += 1
+ msg += cmsg
+ if (not passing) : fail = True
+ if (fail) :
+ msg += "!!! test "+test+" FAILED\n"
+ else :
+ msg += "*** test "+test+" passed\n"
+ return msg
+
+#====================================================
+### extract data from log file
+#====================================================
+def extract_data(file):
+ dictionary = [];
+ data = []
+ read = False
+ for line in open(file):
+ if (read and data_pattern.match(line)) :
+ cols = line.split();
+ data.append(cols)
+ else :
+ read = False
+ if (thermo_pattern.match(line)):
+ dictionary = line.split();
+ read = True
+ return [dictionary,data]
+
+#====================================================
+### compare columns of current and benchmark
+#====================================================
+def compare(name,col1,col2):
+ err = 0.
+ norm1 = 0.
+ norm2 = 0.
+ n = len(col2)
+ for i in range(n):
+ v1 = float(col1[i])
+ v2 = float(col2[i])
+ norm1 += v1*v1
+ norm2 += v2*v2
+ dv = v1-v2
+ err += dv*dv
+ norm1 /= n
+ norm2 /= n
+ err /= n
+ if (norm2 > tol) :
+ msg = "{0:7s} relative error {1:4} wrt norm {2:7}\n".format(name,err,norm2)
+ else :
+ msg = "{0:7s} error {1:4}\n" .format(name,err)
+ return [(err < tol),msg];
+
+#################################################################
+class Worker(mp.Process):
+ def __init__(self, work_queue, result_queue):
+ mp.Process.__init__(self)
+ self.work_queue = work_queue
+ self.result_queue = result_queue
+ def run(self):
+ while True:
+ try:
+ job = self.work_queue.get_nowait()
+ except queue.Empty:
+ break
+ #print(">>> starting " + str(job[1]) + " ...")
+ os.chdir(job[0])
+ start()
+ msg = run_test(job[1])
+ elapsed_time = stop()
+ msg += "elapsed time "+str(elapsed_time)+"\n"
+ os.chdir(home)
+ self.result_queue.put([job[1],msg])
+
+#====================================================
+### parse
+#====================================================
+def init() :
+ global np, njobs, ntests, lmps, arch, home
+ home = os.getcwd()
+ if (len(sys.argv) < 4) :
+ print "usage: benchmark.py <nprocs> <njobs> <test_dirs>"
+ sys.exit(1)
+ np = int(sys.argv[1])
+ njobs = int(sys.argv[2])
+ lmps = "../"+src_path+"lmp_"+arch+" -in "
+ if (np > 1):
+ lmps = "mpirun -np "+str(np)+" "+lmps
+ else:
+ arch = "serial"
+ lmps = exe_path+"lmp_"+arch+" -in "
+ pool = mp.Pool(njobs)
+ dirs = sys.argv[3:]
+ tests = []
+ for dir in dirs:
+ os.chdir(dir);
+ for path in glob("./in.*"):
+ test = path[5:];
+ tests.append([dir,test])
+ os.chdir(home)
+ ntests = len(tests)
+ print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+ print "start: ",date()
+ print "arch:",arch,
+ print "nprocs:",np
+ print "ntests:",ntests,
+ print "njobs:",njobs
+ print "relative tolerance:",tol
+ print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+ print
+ return tests
+
+#====================================================
+### build executable
+#====================================================
+def build(arch):
+ os.system("cd ..; svn update >& svn_update.log")
+ os.system("cd ../src; make no-atc >& /dev/null")
+ os.system("cd ../src; make clean-all >& /dev/null")
+ #os.system("cd ../src; make yes-all >& /dev/null")
+ os.system("cd ../src; make yes-dipole >& /dev/null")
+ sys.stdout.flush()
+ print "** building ",arch,"...",
+ os.system("cd "+src_path+"; make -j "+str(np)+" "+arch+" >& build_"+arch+".log")
+ if (not os.path.isfile(src_path+"lmp_"+arch)) :
+ print "!!! build ",arch," FAILED"
+ sys.exit()
+ else:
+ print "done"
+ print
+
+#====================================================
+### main
+#====================================================
+if __name__ == '__main__':
+ tests = init()
+ #build(arch)
+ work_queue = mp.Queue()
+ for test in tests:
+ work_queue.put(test)
+ result_queue = mp.Queue()
+ nfails = 0
+ fail_list = []
+ for i in range(njobs):
+ w = Worker(work_queue, result_queue)
+ w.start()
+ for i in range(ntests):
+ [test,msg] = result_queue.get()
+ if (fail_pattern.search(msg)) :
+ nfails += 1
+ fail_list.append(test)
+ #print msg # can print only if failed
+ print msg # can print only if failed
+ #print test, " passed"
+ print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+ print "end:",date()
+ if (nfails == 0):
+ print "*** no failures ***"
+ else :
+ print "!!!",nfails,"of",ntests,"tests failed"
+ for test in fail_list:
+ print test
+ print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
diff --git a/regress/min/in.min b/regress/min/in.min
new file mode 100644
index 000000000..c7cf9f0f1
--- /dev/null
+++ b/regress/min/in.min
@@ -0,0 +1,26 @@
+# author: sjplimp@sandia.gov
+# packages:
+# 2d Lennard-Jones melt and subsequent energy minimization
+log log.min
+thermo_modify format float %22.16g
+units lj
+dimension 2
+atom_style atomic
+lattice sq2 0.8442
+region box block 0 20 0 20 -0.1 0.1
+create_box 1 box
+create_atoms 1 box
+mass 1 1.0
+velocity all create 5.0 87287 loop geom
+pair_style lj/cut 2.5
+pair_coeff 1 1 1.0 1.0 2.5
+pair_modify shift yes
+neighbor 0.3 bin
+neigh_modify delay 0 every 1 check yes
+fix 1 all nve
+fix 2 all enforce2d
+thermo 100
+run 1000
+neigh_modify delay 0 every 1 check yes
+thermo 50
+minimize 1.0e-6 0.001 1000 10000
diff --git a/regress/min/in.min.box b/regress/min/in.min.box
new file mode 100644
index 000000000..17f120679
--- /dev/null
+++ b/regress/min/in.min.box
@@ -0,0 +1,31 @@
+# author: sjplimp@sandia.gov
+# packages:
+# 2d Lennard-Jones melt and subsequent energy minimization
+log log.min.box
+thermo_modify format float %22.16g
+units lj
+dimension 2
+atom_style atomic
+lattice sq2 0.8442
+region box block 0 20 0 20 -0.1 0.1
+create_box 1 box
+create_atoms 1 box
+mass 1 1.0
+velocity all create 5.0 87287 loop geom
+pair_style lj/cut 2.5
+pair_coeff 1 1 1.0 1.0 2.5
+pair_modify shift yes
+neighbor 0.3 bin
+neigh_modify delay 0 every 1 check yes
+fix 1 all nve
+fix 2 all enforce2d
+thermo 100
+run 1000
+neigh_modify delay 0 every 1 check yes
+velocity all create 0.0 1
+thermo 50
+minimize 1.0e-6 0.001 1000 10000
+fix 3 all box/relax x 1.0 y 2.0 vmax 1.0e-4 nreset 100
+thermo_style custom step temp pe pxx pyy pxy
+min_modify line quadratic
+minimize 0.0 1.0e-6 10000 100000
diff --git a/regress/min/log.min.18Feb13.linux.1 b/regress/min/log.min.18Feb13.linux.1
new file mode 100644
index 000000000..7b6d28c0e
--- /dev/null
+++ b/regress/min/log.min.18Feb13.linux.1
@@ -0,0 +1,115 @@
+LAMMPS (18 Feb 2013)
+# 2d Lennard-Jones melt and subsequent energy minimization
+
+units lj
+dimension 2
+atom_style atomic
+
+lattice sq2 0.8442
+Lattice spacing in x,y,z = 1.53919 1.53919 1.53919
+region box block 0 20 0 20 -0.1 0.1
+create_box 1 box
+Created orthogonal box = (0 0 -0.153919) to (30.7838 30.7838 0.153919)
+ 1 by 1 by 1 MPI processor grid
+create_atoms 1 box
+Created 800 atoms
+mass 1 1.0
+
+velocity all create 5.0 87287 loop geom
+
+pair_style lj/cut 2.5
+pair_coeff 1 1 1.0 1.0 2.5
+pair_modify shift yes
+
+neighbor 0.3 bin
+neigh_modify delay 0 every 1 check yes
+
+fix 1 all nve
+fix 2 all enforce2d
+
+#dump 1 all atom 100 dump.min
+
+#dump 1 all image 50 image.*.jpg type type # zoom 1.6 adiam 1.5
+#dump_modify 1 pad 4
+
+thermo 100
+
+run 1000
+Memory usage per processor = 2.06282 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 0 5 -2.461717 0 2.532033 5.0190509
+ 100 3.2788864 -0.74311698 0 2.5316708 15.912832
+ 200 3.3041082 -0.77000277 0 2.5299752 15.602653
+ 300 3.3840228 -0.84859211 0 2.5312006 15.188203
+ 400 3.3916063 -0.85694601 0 2.5304208 15.383853
+ 500 3.3136052 -0.77935263 0 2.5301106 15.833296
+ 600 3.3888915 -0.85213741 0 2.532518 15.162759
+ 700 3.2123662 -0.67642106 0 2.5319297 16.310578
+ 800 3.3016847 -0.76574936 0 2.5318082 15.639067
+ 900 3.463125 -0.92707601 0 2.5317201 14.770608
+ 1000 3.3134849 -0.7783474 0 2.5309957 15.658702
+Loop time of 0.198333 on 1 procs for 1000 steps with 800 atoms
+
+Pair time (%) = 0.127439 (64.2553)
+Neigh time (%) = 0.0468309 (23.6123)
+Comm time (%) = 0.00531244 (2.67855)
+Outpt time (%) = 0.000103712 (0.052292)
+Other time (%) = 0.0186465 (9.40161)
+
+Nlocal: 800 ave 800 max 800 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 316 ave 316 max 316 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 7747 ave 7747 max 7747 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 7747
+Ave neighs/atom = 9.68375
+Neighbor list builds = 203
+Dangerous builds = 0
+
+neigh_modify delay 0 every 1 check yes
+
+#dump_modify 1 every 25
+
+thermo 50
+minimize 1.0e-6 0.001 1000 10000
+Memory usage per processor = 2.74947 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 1000 3.3134849 -0.7783474 0 2.5309957 15.658702
+ 1050 3.3134849 -2.808351 0 0.50099208 1.7334413
+ 1100 3.3134849 -2.8586611 0 0.45068195 1.6058414
+ 1150 3.3134849 -2.8712625 0 0.43808058 1.6049732
+ 1200 3.3134849 -2.8785429 0 0.43080018 1.5883814
+ 1250 3.3134849 -2.8832131 0 0.42612994 1.6155122
+ 1300 3.3134849 -2.8882533 0 0.42108976 1.6323994
+ 1350 3.3134849 -2.8953262 0 0.41401689 1.5991374
+ 1365 3.3134849 -2.895477 0 0.41386606 1.5988878
+Loop time of 0.27736 on 1 procs for 365 steps with 800 atoms
+
+Minimization stats:
+ Stopping criterion = energy tolerance
+ Energy initial, next-to-last, final =
+ -0.778347402608 -2.89547454669 -2.89547702741
+ Force two-norm initial, final = 1921.37 0.684479
+ Force max component initial, final = 298.456 0.229696
+ Final line search alpha, max atom move = 0.00501944 0.00115295
+ Iterations, force evaluations = 365 1305
+
+Pair time (%) = 0.231267 (83.3816)
+Neigh time (%) = 0.0190115 (6.85445)
+Comm time (%) = 0.00438023 (1.57926)
+Outpt time (%) = 6.41346e-05 (0.0231232)
+Other time (%) = 0.0226369 (8.16156)
+
+Nlocal: 800 ave 800 max 800 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 319 ave 319 max 319 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 7040 ave 7040 max 7040 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 7040
+Ave neighs/atom = 8.8
+Neighbor list builds = 83
+Dangerous builds = 0
diff --git a/regress/min/log.min.18Feb13.linux.4 b/regress/min/log.min.18Feb13.linux.4
new file mode 100644
index 000000000..23c82f329
--- /dev/null
+++ b/regress/min/log.min.18Feb13.linux.4
@@ -0,0 +1,115 @@
+LAMMPS (18 Feb 2013)
+# 2d Lennard-Jones melt and subsequent energy minimization
+
+units lj
+dimension 2
+atom_style atomic
+
+lattice sq2 0.8442
+Lattice spacing in x,y,z = 1.53919 1.53919 1.53919
+region box block 0 20 0 20 -0.1 0.1
+create_box 1 box
+Created orthogonal box = (0 0 -0.153919) to (30.7838 30.7838 0.153919)
+ 2 by 2 by 1 MPI processor grid
+create_atoms 1 box
+Created 800 atoms
+mass 1 1.0
+
+velocity all create 5.0 87287 loop geom
+
+pair_style lj/cut 2.5
+pair_coeff 1 1 1.0 1.0 2.5
+pair_modify shift yes
+
+neighbor 0.3 bin
+neigh_modify delay 0 every 1 check yes
+
+fix 1 all nve
+fix 2 all enforce2d
+
+#dump 1 all atom 100 dump.min
+
+#dump 1 all image 50 image.*.jpg type type # zoom 1.6 adiam 1.5
+#dump_modify 1 pad 4
+
+thermo 100
+
+run 1000
+Memory usage per processor = 2.06116 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 0 5 -2.461717 0 2.532033 5.0190509
+ 100 3.2788864 -0.74311698 0 2.5316708 15.912832
+ 200 3.3041082 -0.77000277 0 2.5299752 15.602653
+ 300 3.3840228 -0.84859211 0 2.5312006 15.188203
+ 400 3.3916063 -0.85694601 0 2.5304208 15.383853
+ 500 3.3136052 -0.77935264 0 2.5301106 15.833296
+ 600 3.3888915 -0.85213742 0 2.532518 15.162759
+ 700 3.2123632 -0.67641807 0 2.5319297 16.310592
+ 800 3.3016497 -0.76571656 0 2.531806 15.639198
+ 900 3.4621454 -0.9260857 0 2.531732 14.772965
+ 1000 3.2803075 -0.74465936 0 2.5315477 15.835597
+Loop time of 0.067068 on 4 procs for 1000 steps with 800 atoms
+
+Pair time (%) = 0.0325241 (48.4942)
+Neigh time (%) = 0.0122744 (18.3014)
+Comm time (%) = 0.0142534 (21.2521)
+Outpt time (%) = 0.000184894 (0.275681)
+Other time (%) = 0.00783122 (11.6765)
+
+Nlocal: 200 ave 202 max 198 min
+Histogram: 1 0 1 0 0 0 0 1 0 1
+Nghost: 170.25 ave 176 max 167 min
+Histogram: 1 0 2 0 0 0 0 0 0 1
+Neighs: 1936.75 ave 1963 max 1896 min
+Histogram: 1 0 0 0 0 1 0 0 1 1
+
+Total # of neighbors = 7747
+Ave neighs/atom = 9.68375
+Neighbor list builds = 203
+Dangerous builds = 0
+
+neigh_modify delay 0 every 1 check yes
+
+#dump_modify 1 every 25
+
+thermo 50
+minimize 1.0e-6 0.001 1000 10000
+Memory usage per processor = 2.7478 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 1000 3.2803075 -0.74465936 0 2.5315477 15.835597
+ 1050 3.2803075 -2.8198371 0 0.45636995 1.6553949
+ 1100 3.2803075 -2.8554989 0 0.42070813 1.6571551
+ 1150 3.2803075 -2.8646695 0 0.41153758 1.7045388
+ 1200 3.2803075 -2.8688213 0 0.40738582 1.6922085
+ 1250 3.2803075 -2.8764988 0 0.39970826 1.6948532
+ 1300 3.2803075 -2.8776606 0 0.39854651 1.6821387
+ 1350 3.2803075 -2.8789379 0 0.39726915 1.6715024
+ 1365 3.2803075 -2.879076 0 0.3971311 1.66923
+Loop time of 0.103431 on 4 procs for 365 steps with 800 atoms
+
+Minimization stats:
+ Stopping criterion = energy tolerance
+ Energy initial, next-to-last, final =
+ -0.744659361981 -2.87907436106 -2.8790759758
+ Force two-norm initial, final = 2006.88 0.477401
+ Force max component initial, final = 395.193 0.0879763
+ Final line search alpha, max atom move = 0.00334856 0.000294593
+ Iterations, force evaluations = 365 1437
+
+Pair time (%) = 0.0645013 (62.3616)
+Neigh time (%) = 0.0046317 (4.47805)
+Comm time (%) = 0.0178814 (17.2882)
+Outpt time (%) = 0.000117421 (0.113526)
+Other time (%) = 0.0162994 (15.7587)
+
+Nlocal: 200 ave 204 max 194 min
+Histogram: 1 0 0 0 0 1 0 0 0 2
+Nghost: 171.75 ave 173 max 170 min
+Histogram: 1 0 0 1 0 0 0 0 0 2
+Neighs: 1762.75 ave 1797 max 1711 min
+Histogram: 1 0 0 0 0 0 1 1 0 1
+
+Total # of neighbors = 7051
+Ave neighs/atom = 8.81375
+Neighbor list builds = 78
+Dangerous builds = 0
diff --git a/regress/min/log.min.box.18Feb13.linux.1 b/regress/min/log.min.box.18Feb13.linux.1
new file mode 100644
index 000000000..a5d7d4070
--- /dev/null
+++ b/regress/min/log.min.box.18Feb13.linux.1
@@ -0,0 +1,353 @@
+LAMMPS (18 Feb 2013)
+# 2d Lennard-Jones melt and subsequent energy minimization
+
+units lj
+dimension 2
+atom_style atomic
+
+lattice sq2 0.8442
+Lattice spacing in x,y,z = 1.53919 1.53919 1.53919
+region box block 0 20 0 20 -0.1 0.1
+create_box 1 box
+Created orthogonal box = (0 0 -0.153919) to (30.7838 30.7838 0.153919)
+ 1 by 1 by 1 MPI processor grid
+create_atoms 1 box
+Created 800 atoms
+mass 1 1.0
+
+velocity all create 5.0 87287 loop geom
+
+pair_style lj/cut 2.5
+pair_coeff 1 1 1.0 1.0 2.5
+pair_modify shift yes
+
+neighbor 0.3 bin
+neigh_modify delay 0 every 1 check yes
+
+fix 1 all nve
+fix 2 all enforce2d
+
+#dump 1 all atom 500 dump.min
+
+#dump 1 all image 500 image.*.jpg type type # zoom 1.6 adiam 1.5
+#dump_modify 1 pad 4
+
+thermo 100
+
+run 1000
+Memory usage per processor = 2.06282 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 0 5 -2.461717 0 2.532033 5.0190509
+ 100 3.2788864 -0.74311698 0 2.5316708 15.912832
+ 200 3.3041082 -0.77000277 0 2.5299752 15.602653
+ 300 3.3840228 -0.84859211 0 2.5312006 15.188203
+ 400 3.3916063 -0.85694601 0 2.5304208 15.383853
+ 500 3.3136052 -0.77935263 0 2.5301106 15.833296
+ 600 3.3888915 -0.85213741 0 2.532518 15.162759
+ 700 3.2123662 -0.67642106 0 2.5319297 16.310578
+ 800 3.3016847 -0.76574936 0 2.5318082 15.639067
+ 900 3.463125 -0.92707601 0 2.5317201 14.770608
+ 1000 3.3134849 -0.7783474 0 2.5309957 15.658702
+Loop time of 0.198071 on 1 procs for 1000 steps with 800 atoms
+
+Pair time (%) = 0.12724 (64.2398)
+Neigh time (%) = 0.0467253 (23.5902)
+Comm time (%) = 0.00525904 (2.65513)
+Outpt time (%) = 0.000102282 (0.0516388)
+Other time (%) = 0.018744 (9.46327)
+
+Nlocal: 800 ave 800 max 800 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 316 ave 316 max 316 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 7747 ave 7747 max 7747 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 7747
+Ave neighs/atom = 9.68375
+Neighbor list builds = 203
+Dangerous builds = 0
+
+neigh_modify delay 0 every 1 check yes
+
+velocity all create 0.0 1
+thermo 50
+minimize 1.0e-6 0.001 1000 10000
+Memory usage per processor = 2.75634 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 1000 0 -0.7783474 0 -0.7783474 12.864955
+ 1050 0 -2.808351 0 -2.808351 -1.0603061
+ 1100 0 -2.8586611 0 -2.8586611 -1.1879061
+ 1150 0 -2.8712625 0 -2.8712625 -1.1887742
+ 1200 0 -2.8785429 0 -2.8785429 -1.205366
+ 1250 0 -2.8832131 0 -2.8832131 -1.1782352
+ 1300 0 -2.8882533 0 -2.8882533 -1.1613481
+ 1350 0 -2.8953262 0 -2.8953262 -1.19461
+ 1365 0 -2.895477 0 -2.895477 -1.1948596
+Loop time of 0.277047 on 1 procs for 365 steps with 800 atoms
+
+Minimization stats:
+ Stopping criterion = energy tolerance
+ Energy initial, next-to-last, final =
+ -0.778347402608 -2.89547454669 -2.89547702741
+ Force two-norm initial, final = 1921.37 0.684479
+ Force max component initial, final = 298.456 0.229696
+ Final line search alpha, max atom move = 0.00501944 0.00115295
+ Iterations, force evaluations = 365 1305
+
+Pair time (%) = 0.231153 (83.4348)
+Neigh time (%) = 0.0189683 (6.84662)
+Comm time (%) = 0.00435162 (1.57071)
+Outpt time (%) = 6.58035e-05 (0.0237518)
+Other time (%) = 0.0225077 (8.12414)
+
+Nlocal: 800 ave 800 max 800 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 319 ave 319 max 319 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 7040 ave 7040 max 7040 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 7040
+Ave neighs/atom = 8.8
+Neighbor list builds = 83
+Dangerous builds = 0
+
+fix 3 all box/relax x 1.0 y 2.0 vmax 1.0e-4 nreset 100
+
+thermo_style custom step temp pe pxx pyy pxy
+
+min_modify line quadratic
+minimize 0.0 1.0e-6 10000 100000
+Memory usage per processor = 2.75634 Mbytes
+Step Temp PotEng Pxx Pyy Pxy
+ 1365 0 -2.895477 -1.2253391 -1.16438 0.0029844696
+ 1400 0 -2.9030976 -1.037803 -0.93005749 0.0031404612
+ 1450 0 -2.9111551 -0.7499331 -0.56417894 0.0034000612
+ 1500 0 -2.9156519 -0.43747438 -0.15725876 0.0035241132
+ 1550 0 -2.9163188 -0.10113405 0.29275665 0.0032578192
+ 1600 0 -2.9129142 0.25786755 0.78857369 0.0031418378
+ 1650 0 -2.9052907 0.63122126 1.3305275 0.0027036138
+ 1700 0 -2.8938515 0.97940259 1.9066628 0.0017474185
+ 1750 0 -2.8934608 0.9929599 1.9909561 0.0022591527
+ 1800 0 -2.8938899 1.0037689 2.0049399 0.0031549929
+ 1850 0 -2.8950206 0.99253195 1.9899581 0.0044014083
+ 1900 0 -2.8954835 0.99574288 1.9942509 0.0052643914
+ 1950 0 -2.8957658 1.0003472 2.0004684 0.0058490005
+ 2000 0 -2.8970438 0.97690958 1.9714991 0.0067217987
+ 2050 0 -2.897073 0.99072137 1.9920898 0.0072873033
+ 2100 0 -2.8972746 0.99651146 1.995402 0.0075817227
+ 2150 0 -2.8975964 0.99381046 1.991681 0.007627454
+ 2200 0 -2.8979803 0.99274725 1.9904104 0.007749339
+ 2250 0 -2.8982086 0.99172995 1.9905936 0.0077177074
+ 2300 0 -2.8983994 0.99377061 1.9899673 0.0076946648
+ 2350 0 -2.8985769 0.99172845 1.9896457 0.0074117889
+ 2400 0 -2.8986693 0.99578192 1.992246 0.0071806046
+ 2450 0 -2.8988819 0.99128252 1.9903378 0.0069177704
+ 2500 0 -2.8989812 0.99522115 1.991489 0.0068121239
+ 2550 0 -2.8991564 0.99146083 1.990657 0.0065352609
+ 2600 0 -2.8992555 0.99538317 1.9914926 0.0062558371
+ 2650 0 -2.8994204 0.99157917 1.9907942 0.0059727799
+ 2700 0 -2.8995111 0.9953798 1.9917332 0.0057516669
+ 2750 0 -2.899661 0.9919244 1.9913158 0.005332134
+ 2800 0 -2.8997549 0.99504761 1.9916688 0.0050046256
+ 2850 0 -2.8999018 0.99193526 1.9912547 0.004492394
+ 2900 0 -2.8999871 0.99565899 1.9922087 0.0040528402
+ 2950 0 -2.9001422 0.99213366 1.9916425 0.0035862563
+ 3000 0 -2.9002325 0.99582487 1.9924604 0.0032829497
+ 3050 0 -2.9003895 0.99227644 1.9918388 0.0029100217
+ 3100 0 -2.9004934 0.9954142 1.9922624 0.0026581626
+ 3150 0 -2.9006459 0.99232395 1.9918443 0.0023680976
+ 3200 0 -2.9007414 0.99623688 1.99297 0.0020662395
+ 3250 0 -2.9009264 0.99256898 1.991983 0.0018040717
+ 3300 0 -2.9009986 0.99800399 1.9945846 0.0015930444
+ 3350 0 -2.9011372 0.99321268 1.9969898 0.001407703
+ 3400 0 -2.9013641 0.99622318 1.9930656 0.0014563979
+ 3450 0 -2.9015832 0.99282311 1.9924118 0.0014454286
+ 3500 0 -2.9017596 0.99595378 1.992875 0.0016105573
+ 3550 0 -2.9020182 0.99269026 1.9918179 0.0017633837
+ 3600 0 -2.9022093 0.99607639 1.9930845 0.0020441612
+ 3650 0 -2.9024948 0.99278561 1.9922635 0.0022606286
+ 3700 0 -2.9027328 0.99606872 1.9930129 0.0026414228
+ 3750 0 -2.9030541 0.99270955 1.9922055 0.0030676238
+ 3800 0 -2.9033283 0.99509621 1.9917886 0.0034492628
+ 3850 0 -2.9036436 0.99265445 1.9918333 0.0039194462
+ 3900 0 -2.9039245 0.99611739 1.9930579 0.0043794142
+ 3950 0 -2.9043033 0.99262403 1.9918954 0.0048733419
+ 4000 0 -2.9046124 0.99585905 1.9928584 0.0054448584
+ 4050 0 -2.9050077 0.99265871 1.9918589 0.0059527585
+ 4100 0 -2.9053408 0.99596017 1.992967 0.0066819293
+ 4150 0 -2.9057612 0.99271888 1.9920143 0.0074538661
+ 4200 0 -2.9061208 0.99585342 1.9928494 0.0083030126
+ 4250 0 -2.9065583 0.99276056 1.9921715 0.0091760837
+ 4300 0 -2.9069587 0.99569608 1.9928109 0.010563215
+ 4350 0 -2.9074386 0.99294112 1.9923317 0.012242263
+ 4400 0 -2.9079159 0.99617793 1.9929836 0.014425511
+ 4450 0 -2.9084828 0.99335369 1.9912818 0.017137841
+ 4500 0 -2.9088005 0.99954722 1.9956616 0.019873686
+ 4550 0 -2.9092238 0.99844962 1.9944461 0.022380697
+ 4600 0 -2.9096299 0.99300644 1.9925264 0.024687168
+ 4650 0 -2.9100061 0.99370577 1.9934207 0.027508267
+ 4700 0 -2.9104263 0.99565636 1.9926298 0.030664353
+ 4750 0 -2.9109614 0.99284169 1.9919846 0.034334378
+ 4800 0 -2.9114155 0.9960171 1.9931707 0.038040635
+ 4850 0 -2.9119649 0.99287594 1.9919796 0.041618415
+ 4900 0 -2.9125125 0.99631202 1.9935981 0.046177605
+ 4950 0 -2.9134822 0.99545012 1.9963436 0.055551769
+ 5000 0 -2.9138087 1.0016464 1.9978697 0.059129043
+ 5050 0 -2.9138895 1.0005328 2.0066685 0.060919794
+ 5100 0 -2.9144557 0.99415884 1.9925195 0.062934069
+ 5150 0 -2.9143897 0.99900082 2.0070401 0.06446803
+ 5200 0 -2.9150165 0.99737915 1.9943189 0.066857536
+ 5250 0 -2.9154332 0.9999712 2.0021875 0.069632138
+ 5300 0 -2.9157558 0.99795158 1.9974044 0.070422281
+ 5350 0 -2.9158439 1.0016699 2.0035502 0.071049397
+ 5400 0 -2.9164666 0.99255654 1.9908929 0.071776886
+ 5450 0 -2.9168846 1.0018915 1.9938812 0.072677356
+ 5500 0 -2.9173241 0.99707078 1.9957969 0.072868177
+ 5550 0 -2.9179842 0.99391224 1.9978813 0.073182143
+ 5600 0 -2.9184699 0.99532518 1.9933732 0.073208315
+ 5650 0 -2.9188477 1.0063118 2.0052442 0.073258803
+ 5700 0 -2.919468 1.0026929 2.0041254 0.073010391
+ 5750 0 -2.9202844 1.0035994 2.0008607 0.072352512
+ 5800 0 -2.9204309 1.0072764 2.008335 0.072056645
+ 5850 0 -2.9213742 0.99720824 1.9925634 0.071173036
+ 5900 0 -2.9216129 1.0000335 2.001122 0.070609448
+ 5950 0 -2.9223916 1.0003501 2.0032975 0.069559273
+ 6000 0 -2.9227892 1.0043807 2.0050332 0.069077943
+ 6050 0 -2.9233982 1.004802 2.0050324 0.068450588
+ 6100 0 -2.9237721 1.0066363 2.0070477 0.06823504
+ 6150 0 -2.9245074 1.0063392 2.0068761 0.068112243
+ 6200 0 -2.9258589 0.99455185 1.9953413 0.06865518
+ 6250 0 -2.9261201 1.0042987 2.0031819 0.069636648
+ 6300 0 -2.9270045 0.99564956 1.9901358 0.071020033
+ 6350 0 -2.9270282 1.007771 2.0049483 0.072360652
+ 6400 0 -2.9279953 0.99228232 1.9927028 0.074781454
+ 6450 0 -2.9280616 1.0017566 2.0022453 0.076142216
+ 6500 0 -2.9288249 0.99408967 1.9888019 0.078305191
+ 6550 0 -2.9286973 1.0065411 2.0049519 0.079618619
+ 6600 0 -2.9291183 0.99372953 1.9985414 0.080448942
+ 6650 0 -2.9292204 1.0023178 2.0050015 0.081907164
+ 6700 0 -2.9301292 0.99992006 2.0016415 0.085917352
+ 6750 0 -2.9302372 1.00613 2.004525 0.086946884
+ 6800 0 -2.9305702 1.0074557 1.9965127 0.087976601
+ 6850 0 -2.9313326 1.0050252 2.0080944 0.092584504
+ 6900 0 -2.9317498 1.0087999 1.9958456 0.094058095
+ 6950 0 -2.9318279 0.99688134 2.002508 0.094400121
+ 7000 0 -2.9318978 1.0034321 2.0052797 0.095451664
+ 7050 0 -2.9322652 0.99758568 2.0037109 0.097238969
+ 7100 0 -2.9327121 0.99815697 1.9914701 0.098802948
+ 7150 0 -2.9327437 1.0038622 2.0011895 0.10050304
+ 7200 0 -2.9329063 1.004612 2.0032044 0.10185804
+ 7250 0 -2.9335997 0.98168701 1.9864884 0.10300105
+ 7300 0 -2.9336515 0.99279141 1.992742 0.10470943
+ 7350 0 -2.9337138 1.003092 2.000106 0.10653676
+ 7400 0 -2.9340414 1.0023845 1.9946755 0.10808147
+ 7450 0 -2.9342536 0.99920061 1.9983417 0.10966697
+ 7500 0 -2.9344657 0.99656006 2.002306 0.11134193
+ 7550 0 -2.9346812 1.0009774 2.0059445 0.11345836
+ 7600 0 -2.9352073 0.99664019 2.0028997 0.116237
+ 7650 0 -2.9355092 1.0067299 2.0052137 0.11889963
+ 7700 0 -2.9359369 1.000096 2.0038144 0.12089102
+ 7750 0 -2.936237 1.0071591 2.0077241 0.12334687
+ 7800 0 -2.9367687 1.0047286 2.0037322 0.12562793
+ 7850 0 -2.9372513 0.99839299 2.0008738 0.1271966
+ 7900 0 -2.93781 1.0013489 1.9924309 0.12900725
+ 7950 0 -2.9382206 0.99271028 1.9910513 0.12995672
+ 8000 0 -2.9385111 0.99261038 1.9917151 0.13094744
+ 8050 0 -2.9388605 0.99256847 1.9933576 0.13194246
+ 8100 0 -2.9391752 0.99421545 1.9941225 0.13291935
+ 8150 0 -2.9394092 0.9997332 1.9965286 0.13397127
+ 8200 0 -2.939821 0.99876146 1.9939496 0.13501447
+ 8250 0 -2.9403015 0.99313692 1.9903144 0.13588404
+ 8300 0 -2.9406524 0.99504174 1.9916891 0.13709102
+ 8350 0 -2.9411077 0.99272049 1.9917049 0.13823709
+ 8400 0 -2.9414976 0.99650126 1.9935111 0.13948558
+ 8450 0 -2.9419844 0.9928859 1.9921827 0.14058516
+ 8500 0 -2.9424055 0.9957698 1.9928898 0.14199174
+ 8550 0 -2.9428963 0.99297812 1.9922564 0.14329168
+ 8600 0 -2.9431968 0.99693087 1.9947462 0.14458722
+ 8650 0 -2.9435631 0.99940154 1.9944064 0.14582129
+ 8700 0 -2.9441466 0.99396641 1.9935763 0.14733962
+ 8750 0 -2.9449093 0.99592155 1.9932061 0.15025209
+ 8800 0 -2.9461707 0.99237436 1.9925136 0.15595847
+ 8850 0 -2.9462853 1.000815 2.007233 0.15828028
+ 8900 0 -2.9469511 1.0000829 1.9986375 0.16055827
+ 8950 0 -2.9473161 1.0004185 1.9954916 0.16178098
+ 9000 0 -2.9476848 1.0002902 1.9955333 0.16283909
+ 9050 0 -2.9476782 1.0024581 2.0035957 0.16324604
+ 9100 0 -2.9477989 1.0030916 2.0059473 0.16365445
+ 9150 0 -2.9482536 0.99281175 1.9946546 0.16370039
+ 9200 0 -2.9481416 1.00865 2.0073808 0.16435272
+ 9250 0 -2.9486901 0.99494204 1.9953024 0.16410446
+ 9300 0 -2.9486493 0.99953893 2.0056513 0.16419403
+ 9350 0 -2.949079 1.003429 1.997895 0.16444925
+ 9400 0 -2.9491509 1.0064853 2.0082985 0.16432267
+ 9450 0 -2.9494699 1.0048863 2.001313 0.16433478
+ 9500 0 -2.9496103 1.0059455 2.0060809 0.16420418
+ 9550 0 -2.9499432 1.0037986 1.9989587 0.16406824
+ 9600 0 -2.9501927 1.0010447 2.0005638 0.16375939
+ 9650 0 -2.9511285 0.98322543 1.9801177 0.16290463
+ 9700 0 -2.9506509 1.0102419 2.0082163 0.16328052
+ 9750 0 -2.9511779 0.99511265 1.9950262 0.16251764
+ 9800 0 -2.9512164 0.99608392 2.0052439 0.16186521
+ 9850 0 -2.9517206 0.99656506 1.9966162 0.16144425
+ 9900 0 -2.9519451 1.0066635 2.0043954 0.16101155
+ 9950 0 -2.9520952 1.0051178 2.0087197 0.16058558
+ 10000 0 -2.9531155 1.0041379 2.0031534 0.15982682
+ 10050 0 -2.9537418 0.99448829 1.9904993 0.15928106
+ 10100 0 -2.9540875 1.0000256 1.9948928 0.1590648
+ 10150 0 -2.9545724 0.99595476 1.9920689 0.15859113
+ 10200 0 -2.9550866 0.9945366 1.9940695 0.15788443
+ 10250 0 -2.955721 0.99319075 1.9905041 0.15710363
+ 10300 0 -2.9560458 0.99598109 1.9939645 0.15650198
+ 10350 0 -2.9565093 0.99480453 1.9979782 0.15542386
+ 10400 0 -2.9570486 0.99396171 1.9942613 0.15473357
+ 10450 0 -2.9576457 0.99301571 1.9922208 0.1541236
+ 10500 0 -2.9583596 0.9956042 1.992646 0.15365553
+ 10550 0 -2.9591414 0.99318206 1.9923162 0.15326877
+ 10600 0 -2.959942 0.99596727 1.9933176 0.15282597
+ 10650 0 -2.9609186 0.99353471 1.9930306 0.1521666
+ 10700 0 -2.9620307 0.99594782 1.9932886 0.1508232
+ 10750 0 -2.9637166 0.99482397 1.9947588 0.14649906
+ 10800 0 -2.9662462 0.99407822 1.9953083 0.13351206
+ 10850 0 -2.9665593 1.0027673 1.9995492 0.13140588
+ 10900 0 -2.9667709 1.0023406 2.0013835 0.12981724
+ 10950 0 -2.9670159 1.0033354 2.0040861 0.12797651
+ 11000 0 -2.9672441 1.0037572 2.004755 0.12647524
+ 11050 0 -2.967593 0.99874092 1.9995822 0.12495147
+ 11100 0 -2.9681165 0.99125559 1.9863869 0.1236617
+ 11150 0 -2.9679478 1.0024409 2.0014347 0.12298067
+ 11200 0 -2.968096 1.0083556 2.0040025 0.12211851
+ 11250 0 -2.96854 0.99060368 1.9933029 0.12097655
+ 11300 0 -2.968643 0.99899132 2.0034915 0.11986456
+ 11350 0 -2.9687697 1.0018133 2.0075949 0.11899469
+ 11365 0 -2.9688638 1.0116402 2.005578 0.11895715
+Loop time of 2.59322 on 1 procs for 10000 steps with 800 atoms
+
+Minimization stats:
+ Stopping criterion = max iterations
+ Energy initial, next-to-last, final =
+ -2.89547702741 -2.96928950062 -2.96886378746
+ Force two-norm initial, final = 3665.97 11.745
+ Force max component initial, final = 2998.7 10.1406
+ Final line search alpha, max atom move = 6.36291e-05 0.00064524
+ Iterations, force evaluations = 10000 10063
+
+Pair time (%) = 1.93249 (74.5208)
+Neigh time (%) = 0.00828385 (0.319442)
+Comm time (%) = 0.0284746 (1.09804)
+Outpt time (%) = 0.00297451 (0.114703)
+Other time (%) = 0.621 (23.947)
+
+Nlocal: 800 ave 800 max 800 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 330 ave 330 max 330 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 7336 ave 7336 max 7336 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 7336
+Ave neighs/atom = 9.17
+Neighbor list builds = 36
+Dangerous builds = 0
diff --git a/regress/min/log.min.box.18Feb13.linux.4 b/regress/min/log.min.box.18Feb13.linux.4
new file mode 100644
index 000000000..7a54d0392
--- /dev/null
+++ b/regress/min/log.min.box.18Feb13.linux.4
@@ -0,0 +1,353 @@
+LAMMPS (18 Feb 2013)
+# 2d Lennard-Jones melt and subsequent energy minimization
+
+units lj
+dimension 2
+atom_style atomic
+
+lattice sq2 0.8442
+Lattice spacing in x,y,z = 1.53919 1.53919 1.53919
+region box block 0 20 0 20 -0.1 0.1
+create_box 1 box
+Created orthogonal box = (0 0 -0.153919) to (30.7838 30.7838 0.153919)
+ 2 by 2 by 1 MPI processor grid
+create_atoms 1 box
+Created 800 atoms
+mass 1 1.0
+
+velocity all create 5.0 87287 loop geom
+
+pair_style lj/cut 2.5
+pair_coeff 1 1 1.0 1.0 2.5
+pair_modify shift yes
+
+neighbor 0.3 bin
+neigh_modify delay 0 every 1 check yes
+
+fix 1 all nve
+fix 2 all enforce2d
+
+#dump 1 all atom 500 dump.min
+
+#dump 1 all image 500 image.*.jpg type type # zoom 1.6 adiam 1.5
+#dump_modify 1 pad 4
+
+thermo 100
+
+run 1000
+Memory usage per processor = 2.06116 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 0 5 -2.461717 0 2.532033 5.0190509
+ 100 3.2788864 -0.74311698 0 2.5316708 15.912832
+ 200 3.3041082 -0.77000277 0 2.5299752 15.602653
+ 300 3.3840228 -0.84859211 0 2.5312006 15.188203
+ 400 3.3916063 -0.85694601 0 2.5304208 15.383853
+ 500 3.3136052 -0.77935264 0 2.5301106 15.833296
+ 600 3.3888915 -0.85213742 0 2.532518 15.162759
+ 700 3.2123632 -0.67641807 0 2.5319297 16.310592
+ 800 3.3016497 -0.76571656 0 2.531806 15.639198
+ 900 3.4621454 -0.9260857 0 2.531732 14.772965
+ 1000 3.2803075 -0.74465936 0 2.5315477 15.835597
+Loop time of 0.0670121 on 4 procs for 1000 steps with 800 atoms
+
+Pair time (%) = 0.0326686 (48.7503)
+Neigh time (%) = 0.0121983 (18.2032)
+Comm time (%) = 0.0145113 (21.6547)
+Outpt time (%) = 0.000176668 (0.263636)
+Other time (%) = 0.0074572 (11.1281)
+
+Nlocal: 200 ave 202 max 198 min
+Histogram: 1 0 1 0 0 0 0 1 0 1
+Nghost: 170.25 ave 176 max 167 min
+Histogram: 1 0 2 0 0 0 0 0 0 1
+Neighs: 1936.75 ave 1963 max 1896 min
+Histogram: 1 0 0 0 0 1 0 0 1 1
+
+Total # of neighbors = 7747
+Ave neighs/atom = 9.68375
+Neighbor list builds = 203
+Dangerous builds = 0
+
+neigh_modify delay 0 every 1 check yes
+
+velocity all create 0.0 1
+thermo 50
+minimize 1.0e-6 0.001 1000 10000
+Memory usage per processor = 2.75239 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 1000 0 -0.74465936 0 -0.74465936 13.069823
+ 1050 0 -2.8198371 0 -2.8198371 -1.1103791
+ 1100 0 -2.8554989 0 -2.8554989 -1.1086189
+ 1150 0 -2.8646695 0 -2.8646695 -1.0612352
+ 1200 0 -2.8688213 0 -2.8688213 -1.0735655
+ 1250 0 -2.8764988 0 -2.8764988 -1.0709208
+ 1300 0 -2.8776606 0 -2.8776606 -1.0836353
+ 1350 0 -2.8789379 0 -2.8789379 -1.0942716
+ 1365 0 -2.879076 0 -2.879076 -1.096544
+Loop time of 0.102816 on 4 procs for 365 steps with 800 atoms
+
+Minimization stats:
+ Stopping criterion = energy tolerance
+ Energy initial, next-to-last, final =
+ -0.744659361981 -2.87907436106 -2.8790759758
+ Force two-norm initial, final = 2006.88 0.477401
+ Force max component initial, final = 395.193 0.0879763
+ Final line search alpha, max atom move = 0.00334856 0.000294593
+ Iterations, force evaluations = 365 1437
+
+Pair time (%) = 0.06445 (62.685)
+Neigh time (%) = 0.00459725 (4.47135)
+Comm time (%) = 0.0176167 (17.1343)
+Outpt time (%) = 0.0001086 (0.105626)
+Other time (%) = 0.0160431 (15.6037)
+
+Nlocal: 200 ave 204 max 194 min
+Histogram: 1 0 0 0 0 1 0 0 0 2
+Nghost: 171.75 ave 173 max 170 min
+Histogram: 1 0 0 1 0 0 0 0 0 2
+Neighs: 1762.75 ave 1797 max 1711 min
+Histogram: 1 0 0 0 0 0 1 1 0 1
+
+Total # of neighbors = 7051
+Ave neighs/atom = 8.81375
+Neighbor list builds = 78
+Dangerous builds = 0
+
+fix 3 all box/relax x 1.0 y 2.0 vmax 1.0e-4 nreset 100
+
+thermo_style custom step temp pe pxx pyy pxy
+
+min_modify line quadratic
+minimize 0.0 1.0e-6 10000 100000
+Memory usage per processor = 2.75239 Mbytes
+Step Temp PotEng Pxx Pyy Pxy
+ 1365 0 -2.879076 -1.0493949 -1.1436932 0.037565201
+ 1400 0 -2.8859021 -0.86433583 -0.91383427 0.038857701
+ 1450 0 -2.8929425 -0.58254768 -0.55566103 0.040538566
+ 1500 0 -2.8966088 -0.28118754 -0.15988163 0.042020855
+ 1550 0 -2.8967125 0.036820191 0.27480302 0.04324269
+ 1600 0 -2.8931249 0.36718787 0.74943653 0.044424741
+ 1650 0 -2.8858731 0.69688815 1.2623711 0.044835267
+ 1700 0 -2.8755822 0.98073679 1.7977638 0.043907813
+ 1750 0 -2.8722618 0.99796906 1.9978937 0.040932086
+ 1800 0 -2.8731203 0.9972851 1.9960832 0.039723601
+ 1850 0 -2.8733692 1.0063823 2.0084146 0.038402341
+ 1900 0 -2.8747209 0.98521911 1.9798435 0.03629572
+ 1950 0 -2.874625 1.0055823 2.0075042 0.034193545
+ 2000 0 -2.8752902 0.99350208 1.9911933 0.03326557
+ 2050 0 -2.8752769 1.0018946 2.0024682 0.03231859
+ 2100 0 -2.8758319 0.99169935 1.9887983 0.031437471
+ 2150 0 -2.8761892 0.99301192 1.9906401 0.029831022
+ 2200 0 -2.8765018 0.99825416 1.9982587 0.027754052
+ 2250 0 -2.8768461 0.99326761 1.9910275 0.027115046
+ 2300 0 -2.8767423 1.0035487 2.0046857 0.026126393
+ 2350 0 -2.8770655 0.99795811 1.9973107 0.025614851
+ 2400 0 -2.877445 0.99163396 1.9870033 0.025156704
+ 2450 0 -2.8774865 0.99148327 1.9905808 0.024719242
+ 2500 0 -2.8775546 0.9950178 1.9915017 0.024486868
+ 2550 0 -2.877691 0.9916018 1.9905624 0.02421693
+ 2600 0 -2.8777627 0.99470414 1.9910618 0.023930399
+ 2650 0 -2.8778782 0.99170595 1.9907118 0.023475253
+ 2700 0 -2.877945 0.99480447 1.9913566 0.023271004
+ 2750 0 -2.8780803 0.99164504 1.9902596 0.023000125
+ 2800 0 -2.8781378 0.99501379 1.9915144 0.022773904
+ 2850 0 -2.8782474 0.99219164 1.9915607 0.022481218
+ 2900 0 -2.8783151 0.99550644 1.9921431 0.022359954
+ 2950 0 -2.8784484 0.99224048 1.9913612 0.022193155
+ 3000 0 -2.8785175 0.99532849 1.9920577 0.021941569
+ 3050 0 -2.8786568 0.99222235 1.9910476 0.021737518
+ 3100 0 -2.8787309 0.99525548 1.9920127 0.021688272
+ 3150 0 -2.8788689 0.99228052 1.9913905 0.021446146
+ 3200 0 -2.8789303 0.99616583 1.992901 0.021394358
+ 3250 0 -2.8790946 0.99232091 1.9915574 0.02118161
+ 3300 0 -2.8791847 0.99541221 1.9921056 0.021194771
+ 3350 0 -2.8793341 0.9922686 1.9915267 0.021013055
+ 3400 0 -2.8794452 0.99516725 1.9917199 0.021036976
+ 3450 0 -2.8795969 0.99227386 1.9913259 0.021052828
+ 3500 0 -2.8797075 0.99538375 1.9920724 0.02124209
+ 3550 0 -2.8798796 0.99230271 1.9914458 0.021226686
+ 3600 0 -2.8800015 0.99546439 1.9922124 0.02149345
+ 3650 0 -2.880188 0.99227706 1.9913914 0.021617113
+ 3700 0 -2.880312 0.99546322 1.9922772 0.021954501
+ 3750 0 -2.8805126 0.99224941 1.991302 0.02213367
+ 3800 0 -2.8806831 0.99459806 1.9906732 0.022675671
+ 3850 0 -2.8808636 0.9921438 1.9909899 0.022992462
+ 3900 0 -2.8810051 0.99533223 1.9921709 0.023485422
+ 3950 0 -2.881225 0.99232174 1.9914377 0.023944603
+ 4000 0 -2.8813892 0.99554805 1.992182 0.024545033
+ 4050 0 -2.8816257 0.99218933 1.9910408 0.025105298
+ 4100 0 -2.8817867 0.99546861 1.9923568 0.025863634
+ 4150 0 -2.8820302 0.99242518 1.9914814 0.026365444
+ 4200 0 -2.8822192 0.99526027 1.9919315 0.027062527
+ 4250 0 -2.8824692 0.99223247 1.9913085 0.027610787
+ 4300 0 -2.8826625 0.99537467 1.9921185 0.028217161
+ 4350 0 -2.882922 0.99239179 1.9914342 0.028679998
+ 4400 0 -2.8831241 0.99556357 1.9922663 0.029235596
+ 4450 0 -2.8833989 0.9921938 1.9912448 0.029596184
+ 4500 0 -2.8836067 0.99557381 1.9922188 0.030181
+ 4550 0 -2.8838874 0.99214405 1.9912047 0.030371361
+ 4600 0 -2.8840891 0.99568228 1.9925689 0.030873328
+ 4650 0 -2.8843766 0.99222214 1.991537 0.031107839
+ 4700 0 -2.8846039 0.99540851 1.9920535 0.031397701
+ 4750 0 -2.8849039 0.99221886 1.9907361 0.031483457
+ 4800 0 -2.8851163 0.99551704 1.9923517 0.031579764
+ 4850 0 -2.8854144 0.99225442 1.9913169 0.031526446
+ 4900 0 -2.8856452 0.99550052 1.9922005 0.031417289
+ 4950 0 -2.8859485 0.99210587 1.9910919 0.03118115
+ 5000 0 -2.8861801 0.99535546 1.9921671 0.030985542
+ 5050 0 -2.8864881 0.99209875 1.9911885 0.030438838
+ 5100 0 -2.8867336 0.99520939 1.9919538 0.029911151
+ 5150 0 -2.8870413 0.99225176 1.9913023 0.029087623
+ 5200 0 -2.8873039 0.99488953 1.9914722 0.0283991
+ 5250 0 -2.8876062 0.99228521 1.991158 0.027574033
+ 5300 0 -2.8878541 0.99556088 1.9922986 0.026813081
+ 5350 0 -2.8881769 0.99220208 1.9912481 0.025847812
+ 5400 0 -2.8884304 0.99556208 1.9922152 0.02492658
+ 5450 0 -2.8887574 0.99219343 1.9912168 0.023790678
+ 5500 0 -2.8890085 0.99566139 1.9925529 0.022691755
+ 5550 0 -2.8893435 0.99223125 1.9912108 0.021332027
+ 5600 0 -2.8895985 0.99555806 1.9925205 0.019969308
+ 5650 0 -2.8899325 0.99238332 1.9915515 0.018334611
+ 5700 0 -2.8902024 0.9950743 1.9920344 0.016688965
+ 5750 0 -2.8905116 0.99266165 1.9920244 0.014675128
+ 5800 0 -2.8907908 0.99538343 1.9922424 0.012898355
+ 5850 0 -2.8911238 0.99274659 1.9916141 0.010718854
+ 5900 0 -2.891395 0.99586743 1.992946 0.0084079793
+ 5950 0 -2.8917377 0.99323184 1.9923269 0.0058847015
+ 6000 0 -2.8920318 0.99618703 1.9931886 0.0031743443
+ 6050 0 -2.8924173 0.99312644 1.9919607 0.00036370652
+ 6100 0 -2.8927403 0.99609392 1.9932028 -0.0023282997
+ 6150 0 -2.8931582 0.99334969 1.9924865 -0.0052253296
+ 6200 0 -2.8931737 1.0044374 2.0036405 -0.0073374891
+ 6250 0 -2.8933601 1.0053494 2.0084308 -0.0095543493
+ 6300 0 -2.8937021 1.0040228 2.0072436 -0.011528379
+ 6350 0 -2.8941162 1.0040963 2.0067291 -0.014066056
+ 6400 0 -2.8946376 1.0056964 2.0065238 -0.016998255
+ 6450 0 -2.8952383 1.002655 2.0052962 -0.019179448
+ 6500 0 -2.8957747 1.0053824 2.0058467 -0.020794074
+ 6550 0 -2.8963468 1.0031095 2.0056915 -0.021771701
+ 6600 0 -2.8968938 1.0056478 2.0062435 -0.021988194
+ 6650 0 -2.8976105 1.0027738 2.0056577 -0.022097734
+ 6700 0 -2.8985813 1.0049044 2.0041091 -0.022978826
+ 6750 0 -2.8993763 1.0013212 2.0046643 -0.024685401
+ 6800 0 -2.8999352 0.99348555 1.9941849 -0.024745246
+ 6850 0 -2.9002761 0.99611648 1.9915352 -0.024953484
+ 6900 0 -2.9002655 1.0044443 2.0034446 -0.025004427
+ 6950 0 -2.9006942 1.0038737 2.0062629 -0.024954287
+ 7000 0 -2.9012609 1.0022744 2.0036566 -0.024819334
+ 7050 0 -2.9016604 1.0051803 2.0055167 -0.024458964
+ 7100 0 -2.9021771 1.0033287 2.0059127 -0.024041683
+ 7150 0 -2.9026446 1.0051909 2.0057434 -0.023513487
+ 7200 0 -2.9030997 1.003201 2.0057931 -0.022955905
+ 7250 0 -2.9035001 1.0053534 2.006177 -0.022222879
+ 7300 0 -2.9039398 1.003141 2.0056512 -0.021526869
+ 7350 0 -2.9043194 1.0053552 2.0062897 -0.020600969
+ 7400 0 -2.9047554 1.0029275 2.0053735 -0.019798089
+ 7450 0 -2.9051394 1.0050723 2.0057785 -0.018810517
+ 7500 0 -2.9055639 1.0030839 2.0056435 -0.018085221
+ 7550 0 -2.9059506 1.00542 2.006424 -0.01743443
+ 7600 0 -2.906389 1.0034617 2.0060075 -0.017038562
+ 7650 0 -2.9068088 1.0052048 2.0059319 -0.01659861
+ 7700 0 -2.907256 1.0032841 2.0057462 -0.016390423
+ 7750 0 -2.9076758 1.0050008 2.0056173 -0.01606256
+ 7800 0 -2.9081063 1.0033321 2.0058403 -0.016036071
+ 7850 0 -2.9085325 1.0050458 2.0057159 -0.015738035
+ 7900 0 -2.9089602 1.0033725 2.0057939 -0.015561818
+ 7950 0 -2.9093746 1.00496 2.0055106 -0.015498031
+ 8000 0 -2.9097997 1.0034291 2.0058947 -0.015471401
+ 8050 0 -2.9102208 1.0049791 2.0055274 -0.015258479
+ 8100 0 -2.9106489 1.0035304 2.0060557 -0.015178684
+ 8150 0 -2.9110829 1.0052492 2.0060114 -0.014964657
+ 8200 0 -2.9115393 1.0037164 2.006322 -0.014718896
+ 8250 0 -2.9120088 1.0051472 2.0058765 -0.014430597
+ 8300 0 -2.912515 1.0035172 2.0062174 -0.014197457
+ 8350 0 -2.9130749 1.0054557 2.0059921 -0.013814584
+ 8400 0 -2.9137199 1.0035594 2.0063641 -0.013128137
+ 8450 0 -2.914514 1.0053008 2.0055891 -0.012076819
+ 8500 0 -2.9153923 1.0020887 2.0048249 -0.010873863
+ 8550 0 -2.9161681 1.005124 2.0041437 -0.009983199
+ 8600 0 -2.9166232 1.0035103 2.0031583 -0.0098656588
+ 8650 0 -2.9168935 1.0017735 2.0032739 -0.010137246
+ 8700 0 -2.9176075 0.99350983 1.9942491 -0.010568888
+ 8750 0 -2.9176655 1.0037509 2.0042507 -0.010929755
+ 8800 0 -2.9180335 1.0034837 2.0006008 -0.011388
+ 8850 0 -2.9184726 0.99722599 1.9972524 -0.012308771
+ 8900 0 -2.9185896 1.0070137 2.0062244 -0.012981266
+ 8950 0 -2.9189395 0.99775846 2.0046927 -0.013843916
+ 9000 0 -2.9194348 0.99994718 1.9961545 -0.01430817
+ 9050 0 -2.9199623 0.99913876 1.9945451 -0.015066366
+ 9100 0 -2.9200915 1.0053667 2.0015458 -0.015628169
+ 9150 0 -2.9203602 1.0029844 1.9981877 -0.015943776
+ 9200 0 -2.9204472 1.007234 2.0012475 -0.01621898
+ 9250 0 -2.9207559 1.0000323 1.9994854 -0.01673357
+ 9300 0 -2.9208476 1.0070892 2.004772 -0.016969206
+ 9350 0 -2.9212065 0.9954353 2.002531 -0.017293607
+ 9400 0 -2.9213536 1.011464 1.9987715 -0.016468707
+ 9450 0 -2.9216568 1.0004584 1.992812 -0.016331783
+ 9500 0 -2.9215087 1.0030182 2.006723 -0.016328481
+ 9550 0 -2.9218914 1.0097858 1.9978241 -0.01513886
+ 9600 0 -2.9221223 1.0064187 1.9937476 -0.014411434
+ 9650 0 -2.9224212 1.0060439 1.9885122 -0.013032442
+ 9700 0 -2.9220952 1.00799 2.0115738 -0.012619136
+ 9750 0 -2.9226088 0.99323702 1.9948387 -0.011548183
+ 9800 0 -2.9225553 0.99626951 2.0047326 -0.010162452
+ 9850 0 -2.9227332 1.006235 2.0036748 -0.0075392887
+ 9900 0 -2.9232122 0.98911031 1.9917417 -0.0055326528
+ 9950 0 -2.9231491 0.99681615 1.9994126 -0.0037310254
+ 10000 0 -2.9235123 0.9884299 1.9875481 -0.0021912307
+ 10050 0 -2.9237223 0.9999364 1.9825867 0.00099300384
+ 10100 0 -2.9235973 0.99000996 1.9970993 0.0021504958
+ 10150 0 -2.9233485 1.0077913 2.0121611 0.004525478
+ 10200 0 -2.9236768 1.0032927 2.0035362 0.007071254
+ 10250 0 -2.9238478 1.0002834 2.003131 0.0096263035
+ 10300 0 -2.9240364 0.99131539 2.0026965 0.011952105
+ 10350 0 -2.9242833 0.99641849 1.9947521 0.014575055
+ 10400 0 -2.9244439 0.99508819 1.9965681 0.018000688
+ 10450 0 -2.9243187 1.0124534 2.0090192 0.021804357
+ 10500 0 -2.9246558 0.99263574 2.0030149 0.023531827
+ 10550 0 -2.9250009 0.99916756 1.9950546 0.027624091
+ 10600 0 -2.9248637 1.0079577 2.0069131 0.02964918
+ 10650 0 -2.9253535 1.0010931 1.994458 0.032931815
+ 10700 0 -2.925576 0.99564043 1.9973125 0.03610588
+ 10750 0 -2.9255597 1.0108614 2.0075111 0.0396819
+ 10800 0 -2.9261759 0.9865698 1.9969888 0.0427848
+ 10850 0 -2.9265088 0.99539121 1.9933442 0.046588103
+ 10900 0 -2.9270268 0.9946174 1.9930678 0.052105624
+ 10950 0 -2.9270626 1.0042522 2.0070013 0.055801296
+ 11000 0 -2.9274337 1.0073265 2.0057225 0.059701269
+ 11050 0 -2.927977 0.99674096 1.9951088 0.062406122
+ 11100 0 -2.9280496 1.0088979 2.0105292 0.066470787
+ 11150 0 -2.928782 0.99018003 1.990749 0.068640734
+ 11200 0 -2.9290447 0.99949136 2.0055469 0.073700453
+ 11250 0 -2.9297585 1.0015608 1.9941199 0.078090219
+ 11300 0 -2.929934 1.0057572 2.0034521 0.080757029
+ 11350 0 -2.9305123 0.99951982 1.9941245 0.083214206
+ 11365 0 -2.9302543 1.0058576 2.0105109 0.083648804
+Loop time of 1.04051 on 4 procs for 10000 steps with 800 atoms
+
+Minimization stats:
+ Stopping criterion = max iterations
+ Energy initial, next-to-last, final =
+ -2.8790759758 -2.93081588364 -2.93025426371
+ Force two-norm initial, final = 3556.23 12.2587
+ Force max component initial, final = 2979.1 9.18102
+ Final line search alpha, max atom move = 2.99243e-05 0.000274736
+ Iterations, force evaluations = 10000 10062
+
+Pair time (%) = 0.499169 (47.9735)
+Neigh time (%) = 0.00172853 (0.166124)
+Comm time (%) = 0.124863 (12.0002)
+Outpt time (%) = 0.00372344 (0.357848)
+Other time (%) = 0.411025 (39.5023)
+
+Nlocal: 200 ave 205 max 194 min
+Histogram: 1 0 0 0 0 1 1 0 0 1
+Nghost: 178 ave 181 max 173 min
+Histogram: 1 0 0 0 0 1 0 0 0 2
+Neighs: 1857.25 ave 1884 max 1824 min
+Histogram: 1 0 0 1 0 0 0 0 1 1
+
+Total # of neighbors = 7429
+Ave neighs/atom = 9.28625
+Neighbor list builds = 29
+Dangerous builds = 0
diff --git a/regress/regression.sh b/regress/regression.sh
new file mode 100755
index 000000000..8aac9612f
--- /dev/null
+++ b/regress/regression.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+cd /code/lammps-atc/regression
+./benchmark.py 4 12 min dipole >& latest
+fail=`grep -c FAIL latest`
+addrs="rjones@sandia.gov jatempl@sandia.gov jzimmer@sandia.gov sjplimp@sandia.gov akohlmey@gmail.com"
+if [ $fail == 0 ] ; then
+ mhmail $addrs -subject "LAMMPS regression passes" < latest
+else
+ mhmail $addrs -subject "LAMMPS regression $fail tests failed" < latest
+fi
+
diff --git a/src/PERI/fix_peri_neigh.cpp b/src/PERI/fix_peri_neigh.cpp
index a6ac8e288..a7ef29414 100644
--- a/src/PERI/fix_peri_neigh.cpp
+++ b/src/PERI/fix_peri_neigh.cpp
@@ -1,597 +1,597 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing authors: Mike Parks (SNL), Ezwanur Rahman, J.T. Foster (UTSA)
------------------------------------------------------------------------- */
#include "math.h"
#include "fix_peri_neigh.h"
#include "pair_peri_pmb.h"
#include "pair_peri_lps.h"
#include "pair_peri_ves.h"
#include "atom.h"
#include "domain.h"
#include "force.h"
#include "comm.h"
#include "update.h"
#include "neighbor.h"
#include "neigh_list.h"
#include "neigh_request.h"
#include "pair.h"
#include "lattice.h"
#include "memory.h"
#include "error.h"
using namespace LAMMPS_NS;
using namespace FixConst;
/* ---------------------------------------------------------------------- */
FixPeriNeigh::FixPeriNeigh(LAMMPS *lmp,int narg, char **arg) :
Fix(lmp, narg, arg)
{
isPMB = isLPS = isVES = 0;
if (force->pair_match("peri/pmb",1)) isPMB = 1;
if (force->pair_match("peri/lps",1)) isLPS = 1;
if (force->pair_match("peri/ves",1)) isVES = 1;
restart_global = 1;
restart_peratom = 1;
first = 1;
// perform initial allocation of atom-based arrays
// register with atom class
// set maxpartner = 1 as placeholder
maxpartner = 1;
npartner = NULL;
partner = NULL;
deviatorextention = NULL;
deviatorBackextention = NULL;
r0 = NULL;
vinter = NULL;
wvolume = NULL;
grow_arrays(atom->nmax);
atom->add_callback(0);
atom->add_callback(1);
// initialize npartner to 0 so atom migration is OK the 1st time
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) npartner[i] = 0;
// set comm sizes needed by this fix
comm_forward = 1;
}
/* ---------------------------------------------------------------------- */
FixPeriNeigh::~FixPeriNeigh()
{
// unregister this fix so atom class doesn't invoke it any more
atom->delete_callback(id,0);
atom->delete_callback(id,1);
// delete locally stored arrays
memory->destroy(npartner);
memory->destroy(partner);
memory->destroy(deviatorextention);
memory->destroy(deviatorBackextention);
memory->destroy(r0);
memory->destroy(vinter);
memory->destroy(wvolume);
}
/* ---------------------------------------------------------------------- */
int FixPeriNeigh::setmask()
{
int mask = 0;
return mask;
}
/* ---------------------------------------------------------------------- */
void FixPeriNeigh::init()
{
if (!first) return;
// need a full neighbor list once
int irequest = neighbor->request((void *) this);
neighbor->requests[irequest]->pair = 0;
neighbor->requests[irequest]->fix = 1;
neighbor->requests[irequest]->half = 0;
neighbor->requests[irequest]->full = 1;
neighbor->requests[irequest]->occasional = 1;
}
/* ---------------------------------------------------------------------- */
void FixPeriNeigh::init_list(int id, NeighList *ptr)
{
list = ptr;
}
/* ----------------------------------------------------------------------
For minimization: setup as with dynamics
------------------------------------------------------------------------- */
void FixPeriNeigh::min_setup(int vflag)
{
setup(vflag);
}
/* ----------------------------------------------------------------------
create initial list of neighbor partners via call to neighbor->build()
must be done in setup (not init) since fix init comes before neigh init
------------------------------------------------------------------------- */
void FixPeriNeigh::setup(int vflag)
{
int i,j,ii,jj,itype,jtype,inum,jnum;
double xtmp,ytmp,ztmp,delx,dely,delz,rsq;
int *ilist,*jlist,*numneigh;
int **firstneigh;
double **x = atom->x;
double *vfrac = atom->vfrac;
int *type = atom->type;
int *tag = atom->tag;
int nlocal = atom->nlocal;
// only build list of bonds on very first run
if (!first) return;
first = 0;
// invoke full neighbor list (will copy or build if necessary)
neighbor->build_one(list->index);
inum = list->inum;
ilist = list->ilist;
numneigh = list->numneigh;
firstneigh = list->firstneigh;
// scan neighbor list to set maxpartner
Pair *anypair = force->pair_match("peri",0);
double **cutsq = anypair->cutsq;
for (ii = 0; ii < inum; ii++) {
i = ilist[ii];
xtmp = x[i][0];
ytmp = x[i][1];
ztmp = x[i][2];
itype = type[i];
jlist = firstneigh[i];
jnum = numneigh[i];
for (jj = 0; jj < jnum; jj++) {
j = jlist[jj];
j &= NEIGHMASK;
delx = xtmp - x[j][0];
dely = ytmp - x[j][1];
delz = ztmp - x[j][2];
rsq = delx*delx + dely*dely + delz*delz;
jtype = type[j];
if (rsq <= cutsq[itype][jtype]) npartner[i]++;
}
}
maxpartner = 0;
for (i = 0; i < nlocal; i++) maxpartner = MAX(maxpartner,npartner[i]);
int maxall;
MPI_Allreduce(&maxpartner,&maxall,1,MPI_INT,MPI_MAX,world);
maxpartner = maxall;
// realloc arrays with correct value for maxpartner
memory->destroy(partner);
memory->destroy(deviatorextention);
memory->destroy(deviatorBackextention);
memory->destroy(r0);
memory->destroy(npartner);
npartner = NULL;
partner = NULL;
deviatorextention = NULL;
deviatorBackextention = NULL;
r0 = NULL;
grow_arrays(atom->nmax);
// create partner list and r0 values from neighbor list
// compute vinter for each atom
for (i = 0; i < nlocal; i++) {
npartner[i] = 0;
vinter[i] = 0.0;
wvolume[i] = 0.0;
}
for (ii = 0; ii < inum; ii++) {
i = ilist[ii];
xtmp = x[i][0];
ytmp = x[i][1];
ztmp = x[i][2];
itype = type[i];
jlist = firstneigh[i];
jnum = numneigh[i];
for (jj = 0; jj < jnum; jj++) {
j = jlist[jj];
j &= NEIGHMASK;
delx = xtmp - x[j][0];
dely = ytmp - x[j][1];
delz = ztmp - x[j][2];
rsq = delx*delx + dely*dely + delz*delz;
jtype = type[j];
if (rsq <= cutsq[itype][jtype]) {
partner[i][npartner[i]] = tag[j];
if (isVES)
deviatorextention[i][npartner[i]] =
deviatorBackextention[i][npartner[i]] = 0.0;
r0[i][npartner[i]] = sqrt(rsq);
npartner[i]++;
vinter[i] += vfrac[j];
}
}
}
// sanity check: does any atom appear twice in any neigborlist?
// should only be possible if using pbc and domain < 2*delta
if (domain->xperiodic || domain->yperiodic || domain->zperiodic) {
for (i = 0; i < nlocal; i++) {
jnum = npartner[i];
for (jj = 0; jj < jnum; jj++) {
for (int kk = jj+1; kk < jnum; kk++) {
if (partner[i][jj] == partner[i][kk])
error->one(FLERR,"Duplicate particle in PeriDynamic bond - "
"simulation box is too small");
}
}
}
}
// compute wvolume for each atom
double **x0 = atom->x0;
double half_lc = 0.5*(domain->lattice->xlattice);
double vfrac_scale;
PairPeriLPS *pairlps = static_cast<PairPeriLPS*>(anypair);
PairPeriPMB *pairpmb = static_cast<PairPeriPMB*>(anypair);
PairPeriVES *pairves = static_cast<PairPeriVES*>(anypair);
for (i = 0; i < nlocal; i++) {
double xtmp0 = x0[i][0];
double ytmp0 = x0[i][1];
double ztmp0 = x0[i][2];
jnum = npartner[i];
itype = type[i];
// loop over partners of particle i
for (jj = 0; jj < jnum; jj++) {
// if bond already broken, skip this partner
if (partner[i][jj] == 0) continue;
// lookup local index of partner particle
j = atom->map(partner[i][jj]);
// skip if particle is "lost"
if (j < 0) continue;
double delx0 = xtmp0 - x0[j][0];
double dely0 = ytmp0 - x0[j][1];
double delz0 = ztmp0 - x0[j][2];
double rsq0 = delx0*delx0 + dely0*dely0 + delz0*delz0;
jtype = type[j];
double delta = sqrt(cutsq[itype][jtype]);
// scale vfrac[j] if particle j near the horizon
if ((fabs(r0[i][jj] - delta)) <= half_lc)
vfrac_scale = (-1.0/(2*half_lc))*(r0[i][jj]) +
(1.0 + ((delta - half_lc)/(2*half_lc) ) );
else vfrac_scale = 1.0;
// for PMB, influence = 1.0, otherwise invoke influence function
if (isPMB)
wvolume[i] += 1.0 * rsq0 * vfrac[j] * vfrac_scale;
else if (isLPS)
wvolume[i] += pairlps->influence_function(delx0,dely0,delz0) *
rsq0 * vfrac[j] * vfrac_scale;
else if (isVES)
wvolume[i] += pairves->influence_function(delx0,dely0,delz0) *
rsq0 * vfrac[j] * vfrac_scale;
}
}
// communicate wvolume to ghosts
comm->forward_comm_fix(this);
// bond statistics
int n = 0;
for (i = 0; i < nlocal; i++) n += npartner[i];
int nall;
MPI_Allreduce(&n,&nall,1,MPI_INT,MPI_SUM,world);
if (comm->me == 0) {
if (screen) {
fprintf(screen,"Peridynamic bonds:\n");
fprintf(screen," total # of bonds = %d\n",nall);
fprintf(screen," bonds/atom = %g\n",(double)nall/atom->natoms);
}
if (logfile) {
fprintf(logfile,"Peridynamic bonds:\n");
fprintf(logfile," total # of bonds = %d\n",nall);
fprintf(logfile," bonds/atom = %g\n",(double)nall/atom->natoms);
}
}
}
/* ----------------------------------------------------------------------
memory usage of local atom-based arrays
------------------------------------------------------------------------- */
double FixPeriNeigh::memory_usage()
{
int nmax = atom->nmax;
int bytes = nmax * sizeof(int);
bytes += nmax*maxpartner * sizeof(int);
bytes += nmax*maxpartner * sizeof(double);
if (isVES) {
bytes += nmax*maxpartner * sizeof(double);
bytes += nmax*maxpartner * sizeof(double);
}
bytes += nmax * sizeof(double);
bytes += nmax * sizeof(double);
return bytes;
}
/* ----------------------------------------------------------------------
allocate local atom-based arrays
------------------------------------------------------------------------- */
void FixPeriNeigh::grow_arrays(int nmax)
{
memory->grow(npartner,nmax,"peri_neigh:npartner");
memory->grow(partner,nmax,maxpartner,"peri_neigh:partner");
if (isVES) {
memory->grow(deviatorextention,nmax,maxpartner,
"peri_neigh:deviatorextention");
memory->grow(deviatorBackextention,nmax,maxpartner,
"peri_neigh:deviatorBackextention");
}
memory->grow(r0,nmax,maxpartner,"peri_neigh:r0");
memory->grow(vinter,nmax,"peri_neigh:vinter");
memory->grow(wvolume,nmax,"peri_neigh:wvolume");
}
/* ----------------------------------------------------------------------
copy values within local atom-based arrays
------------------------------------------------------------------------- */
-void FixPeriNeigh::copy_arrays(int i, int j)
+void FixPeriNeigh::copy_arrays(int i, int j, int delflag)
{
npartner[j] = npartner[i];
for (int m = 0; m < npartner[j]; m++) {
partner[j][m] = partner[i][m];
if (isVES) {
deviatorextention[j][m] = deviatorextention[i][m];
deviatorBackextention[j][m] = deviatorBackextention[i][m];
}
r0[j][m] = r0[i][m];
}
vinter[j] = vinter[i];
wvolume[j] = wvolume[i];
}
/* ----------------------------------------------------------------------
pack values in local atom-based arrays for exchange with another proc
------------------------------------------------------------------------- */
int FixPeriNeigh::pack_exchange(int i, double *buf)
{
// compact list by eliminating partner = 0 entries
// set buf[0] after compaction
int m = 1;
for (int n = 0; n < npartner[i]; n++) {
if (partner[i][n] == 0) continue;
buf[m++] = partner[i][n];
if (isVES) {
buf[m++] = deviatorextention[i][n];
buf[m++] = deviatorBackextention[i][n];
}
buf[m++] = r0[i][n];
}
if (isVES) buf[0] = m/4;
else buf[0] = m/2;
buf[m++] = vinter[i];
buf[m++] = wvolume[i];
return m;
}
/* ----------------------------------------------------------------------
unpack values in local atom-based arrays from exchange with another proc
------------------------------------------------------------------------- */
int FixPeriNeigh::unpack_exchange(int nlocal, double *buf)
{
int m = 0;
npartner[nlocal] = static_cast<int> (buf[m++]);
for (int n = 0; n < npartner[nlocal]; n++) {
partner[nlocal][n] = static_cast<int> (buf[m++]);
if (isVES) {
deviatorextention[nlocal][n] = buf[m++];
deviatorBackextention[nlocal][n] = buf[m++];
}
r0[nlocal][n] = buf[m++];
}
vinter[nlocal] = buf[m++];
wvolume[nlocal] = buf[m++];
return m;
}
/* ---------------------------------------------------------------------- */
int FixPeriNeigh::pack_comm(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j,m;
m = 0;
for (i = 0; i < n; i++) {
j = list[i];
buf[m++] = wvolume[j];
}
return 1;
}
/* ---------------------------------------------------------------------- */
void FixPeriNeigh::unpack_comm(int n, int first, double *buf)
{
int i,m,last;
m = 0;
last = first + n;
for (i = first; i < last; i++)
wvolume[i] = buf[m++];
}
/* ----------------------------------------------------------------------
pack entire state of Fix into one write
------------------------------------------------------------------------- */
void FixPeriNeigh::write_restart(FILE *fp)
{
int n = 0;
double list[2];
list[n++] = first;
list[n++] = maxpartner;
if (comm->me == 0) {
int size = n * sizeof(double);
fwrite(&size,sizeof(int),1,fp);
fwrite(list,sizeof(double),n,fp);
}
}
/* ----------------------------------------------------------------------
use state info from restart file to restart the Fix
------------------------------------------------------------------------- */
void FixPeriNeigh::restart(char *buf)
{
int n = 0;
double *list = (double *) buf;
first = static_cast<int> (list[n++]);
maxpartner = static_cast<int> (list[n++]);
// grow 2D arrays now, cannot change size of 2nd array index later
grow_arrays(atom->nmax);
}
/* ----------------------------------------------------------------------
pack values in local atom-based arrays for restart file
------------------------------------------------------------------------- */
int FixPeriNeigh::pack_restart(int i, double *buf)
{
int m = 0;
if (isVES) buf[m++] = 4*npartner[i] + 4;
else buf[m++] = 2*npartner[i] + 4;
buf[m++] = npartner[i];
for (int n = 0; n < npartner[i]; n++) {
buf[m++] = partner[i][n];
if (isVES) {
buf[m++] = deviatorextention[i][n];
buf[m++] = deviatorBackextention[i][n];
}
buf[m++] = r0[i][n];
}
buf[m++] = vinter[i];
buf[m++] = wvolume[i];
return m;
}
/* ----------------------------------------------------------------------
unpack values from atom->extra array to restart the fix
------------------------------------------------------------------------- */
void FixPeriNeigh::unpack_restart(int nlocal, int nth)
{
double **extra = atom->extra;
// skip to Nth set of extra values
int m = 0;
for (int i = 0; i < nth; i++) m += static_cast<int> (extra[nlocal][m]);
m++;
npartner[nlocal] = static_cast<int> (extra[nlocal][m++]);
for (int n = 0; n < npartner[nlocal]; n++) {
partner[nlocal][n] = static_cast<int> (extra[nlocal][m++]);
if (isVES) {
deviatorextention[nlocal][n] = extra[nlocal][m++];
deviatorBackextention[nlocal][n] = extra[nlocal][m++];
}
r0[nlocal][n] = extra[nlocal][m++];
}
vinter[nlocal] = extra[nlocal][m++];
wvolume[nlocal] = extra[nlocal][m++];
}
/* ----------------------------------------------------------------------
maxsize of any atom's restart data
------------------------------------------------------------------------- */
int FixPeriNeigh::maxsize_restart()
{
if (isVES) return 4*maxpartner + 4;
return 2*maxpartner + 4;
}
/* ----------------------------------------------------------------------
size of atom nlocal's restart data
------------------------------------------------------------------------- */
int FixPeriNeigh::size_restart(int nlocal)
{
if (isVES) return 4*npartner[nlocal] + 4;
return 2*npartner[nlocal] + 4;
}
diff --git a/src/PERI/fix_peri_neigh.h b/src/PERI/fix_peri_neigh.h
index 872c760b4..70a50131e 100644
--- a/src/PERI/fix_peri_neigh.h
+++ b/src/PERI/fix_peri_neigh.h
@@ -1,90 +1,90 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef FIX_CLASS
FixStyle(PERI_NEIGH,FixPeriNeigh)
#else
#ifndef LMP_FIX_PERI_NEIGH_H
#define LMP_FIX_PERI_NEIGH_H
#include "fix.h"
namespace LAMMPS_NS {
class FixPeriNeigh : public Fix {
friend class PairPeriPMB;
friend class PairPeriPMBOMP;
friend class PairPeriLPS;
friend class PairPeriVES; //NEW
friend class PairPeriLPSOMP;
friend class ComputeDamageAtom;
public:
FixPeriNeigh(class LAMMPS *,int, char **);
virtual ~FixPeriNeigh();
int setmask();
void init();
void init_list(int, class NeighList *);
void setup(int);
void min_setup(int);
double memory_usage();
void grow_arrays(int);
- void copy_arrays(int, int);
+ void copy_arrays(int, int, int);
int pack_exchange(int, double *);
int unpack_exchange(int, double *);
void write_restart(FILE *);
void restart(char *);
int pack_restart(int, double *);
void unpack_restart(int, int);
int size_restart(int);
int maxsize_restart();
int pack_comm(int, int *, double *, int, int *);
void unpack_comm(int, int, double *);
protected:
int first; // flag for first time initialization
int maxpartner; // max # of peridynamic neighs for any atom
int *npartner; // # of neighbors for each atom
int **partner; // neighs for each atom, stored as global IDs
double **deviatorextention; // Deviatoric extention
double **deviatorBackextention; // Deviatoric back extention
double **r0; // initial distance to partners
double **r1; // Instanteneous distance to partners *** NEW ***
double *thetaOld; // Dilatation Old one
double *vinter; // sum of vfrac for bonded neighbors
double *wvolume; // weighted volume of particle
int isPMB;
int isLPS;
int isVES;
class NeighList *list;
};
}
#endif
#endif
/* ERROR/WARNING messages:
E: Duplicate particle in PeriDynamic bond - simulation box is too small
This is likely because your box length is shorter than 2 times
the bond length.
*/
diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp
index 9263c4906..9c58c4dad 100644
--- a/src/RIGID/fix_rigid.cpp
+++ b/src/RIGID/fix_rigid.cpp
@@ -1,2352 +1,2412 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "math.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "fix_rigid.h"
#include "math_extra.h"
#include "atom.h"
#include "atom_vec_ellipsoid.h"
#include "atom_vec_line.h"
#include "atom_vec_tri.h"
#include "domain.h"
#include "update.h"
#include "respa.h"
#include "modify.h"
#include "group.h"
#include "comm.h"
#include "random_mars.h"
#include "force.h"
#include "output.h"
#include "math_const.h"
#include "memory.h"
#include "error.h"
using namespace LAMMPS_NS;
using namespace FixConst;
using namespace MathConst;
enum{SINGLE,MOLECULE,GROUP};
enum{NONE,XYZ,XY,YZ,XZ};
enum{ISO,ANISO,TRICLINIC};
#define MAXLINE 256
#define CHUNK 1024
#define ATTRIBUTE_PERBODY 11
#define TOLERANCE 1.0e-6
#define EPSILON 1.0e-7
#define SINERTIA 0.4 // moment of inertia prefactor for sphere
#define EINERTIA 0.4 // moment of inertia prefactor for ellipsoid
#define LINERTIA (1.0/12.0) // moment of inertia prefactor for line segment
/* ---------------------------------------------------------------------- */
FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg)
{
int i,ibody;
scalar_flag = 1;
extscalar = 0;
time_integrate = 1;
rigid_flag = 1;
virial_flag = 1;
create_attribute = 1;
MPI_Comm_rank(world,&me);
MPI_Comm_size(world,&nprocs);
// perform initial allocation of atom-based arrays
// register with Atom class
extended = orientflag = dorientflag = 0;
body = NULL;
displace = NULL;
eflags = NULL;
orient = NULL;
dorient = NULL;
grow_arrays(atom->nmax);
atom->add_callback(0);
// parse args for rigid body specification
// set nbody and body[i] for each atom
if (narg < 4) error->all(FLERR,"Illegal fix rigid command");
int iarg;
mol2body = NULL;
+ body2mol = NULL;
// single rigid body
// nbody = 1
// all atoms in fix group are part of body
if (strcmp(arg[3],"single") == 0) {
rstyle = SINGLE;
iarg = 4;
nbody = 1;
int *mask = atom->mask;
int nlocal = atom->nlocal;
for (i = 0; i < nlocal; i++) {
body[i] = -1;
if (mask[i] & groupbit) body[i] = 0;
}
// each molecule in fix group is a rigid body
// maxmol = largest molecule #
// ncount = # of atoms in each molecule (have to sum across procs)
// nbody = # of non-zero ncount values
// use nall as incremented ptr to set body[] values for each atom
} else if (strcmp(arg[3],"molecule") == 0) {
rstyle = MOLECULE;
iarg = 4;
if (atom->molecule_flag == 0)
error->all(FLERR,"Fix rigid molecule requires atom attribute molecule");
int *mask = atom->mask;
int *molecule = atom->molecule;
int nlocal = atom->nlocal;
maxmol = -1;
for (i = 0; i < nlocal; i++)
if (mask[i] & groupbit) maxmol = MAX(maxmol,molecule[i]);
int itmp;
MPI_Allreduce(&maxmol,&itmp,1,MPI_INT,MPI_MAX,world);
maxmol = itmp;
int *ncount;
memory->create(ncount,maxmol+1,"rigid:ncount");
for (i = 0; i <= maxmol; i++) ncount[i] = 0;
for (i = 0; i < nlocal; i++)
if (mask[i] & groupbit) ncount[molecule[i]]++;
- memory->create(mol2body,maxmol+1,"rigid:ncount");
+ memory->create(mol2body,maxmol+1,"rigid:mol2body");
MPI_Allreduce(ncount,mol2body,maxmol+1,MPI_INT,MPI_SUM,world);
nbody = 0;
for (i = 0; i <= maxmol; i++)
if (mol2body[i]) mol2body[i] = nbody++;
else mol2body[i] = -1;
+ memory->create(body2mol,nbody,"rigid:body2mol");
+
+ nbody = 0;
+ for (i = 0; i <= maxmol; i++)
+ if (mol2body[i] >= 0) body2mol[nbody++] = i;
+
for (i = 0; i < nlocal; i++) {
body[i] = -1;
if (mask[i] & groupbit) body[i] = mol2body[molecule[i]];
}
memory->destroy(ncount);
// each listed group is a rigid body
// check if all listed groups exist
// an atom must belong to fix group and listed group to be in rigid body
// error if atom belongs to more than 1 rigid body
} else if (strcmp(arg[3],"group") == 0) {
if (narg < 5) error->all(FLERR,"Illegal fix rigid command");
rstyle = GROUP;
nbody = force->inumeric(FLERR,arg[4]);
if (nbody <= 0) error->all(FLERR,"Illegal fix rigid command");
if (narg < 5+nbody) error->all(FLERR,"Illegal fix rigid command");
iarg = 5+nbody;
int *igroups = new int[nbody];
for (ibody = 0; ibody < nbody; ibody++) {
igroups[ibody] = group->find(arg[5+ibody]);
if (igroups[ibody] == -1)
error->all(FLERR,"Could not find fix rigid group ID");
}
int *mask = atom->mask;
int nlocal = atom->nlocal;
int flag = 0;
for (i = 0; i < nlocal; i++) {
body[i] = -1;
if (mask[i] & groupbit)
for (ibody = 0; ibody < nbody; ibody++)
if (mask[i] & group->bitmask[igroups[ibody]]) {
if (body[i] >= 0) flag = 1;
body[i] = ibody;
}
}
int flagall;
MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world);
if (flagall)
error->all(FLERR,"One or more atoms belong to multiple rigid bodies");
delete [] igroups;
} else error->all(FLERR,"Illegal fix rigid command");
// error check on nbody
if (nbody == 0) error->all(FLERR,"No rigid bodies defined");
// create all nbody-length arrays
memory->create(nrigid,nbody,"rigid:nrigid");
memory->create(masstotal,nbody,"rigid:masstotal");
memory->create(xcm,nbody,3,"rigid:xcm");
memory->create(vcm,nbody,3,"rigid:vcm");
memory->create(fcm,nbody,3,"rigid:fcm");
memory->create(inertia,nbody,3,"rigid:inertia");
memory->create(ex_space,nbody,3,"rigid:ex_space");
memory->create(ey_space,nbody,3,"rigid:ey_space");
memory->create(ez_space,nbody,3,"rigid:ez_space");
memory->create(angmom,nbody,3,"rigid:angmom");
memory->create(omega,nbody,3,"rigid:omega");
memory->create(torque,nbody,3,"rigid:torque");
memory->create(quat,nbody,4,"rigid:quat");
memory->create(imagebody,nbody,"rigid:imagebody");
memory->create(fflag,nbody,3,"rigid:fflag");
memory->create(tflag,nbody,3,"rigid:tflag");
memory->create(langextra,nbody,6,"rigid:langextra");
memory->create(sum,nbody,6,"rigid:sum");
memory->create(all,nbody,6,"rigid:all");
memory->create(remapflag,nbody,4,"rigid:remapflag");
// initialize force/torque flags to default = 1.0
// for 2d: fz, tx, ty = 0.0
array_flag = 1;
size_array_rows = nbody;
size_array_cols = 15;
global_freq = 1;
extarray = 0;
for (i = 0; i < nbody; i++) {
fflag[i][0] = fflag[i][1] = fflag[i][2] = 1.0;
tflag[i][0] = tflag[i][1] = tflag[i][2] = 1.0;
if (domain->dimension == 2) fflag[i][2] = tflag[i][0] = tflag[i][1] = 0.0;
}
// parse optional args
int seed;
langflag = 0;
tstat_flag = 0;
pstat_flag = 0;
allremap = 1;
id_dilate = NULL;
t_chain = 10;
t_iter = 1;
t_order = 3;
p_chain = 10;
infile = NULL;
pcouple = NONE;
pstyle = ANISO;
dimension = domain->dimension;
for (int i = 0; i < 3; i++) {
p_start[i] = p_stop[i] = p_period[i] = 0.0;
p_flag[i] = 0;
}
while (iarg < narg) {
if (strcmp(arg[iarg],"force") == 0) {
if (iarg+5 > narg) error->all(FLERR,"Illegal fix rigid command");
int mlo,mhi;
force->bounds(arg[iarg+1],nbody,mlo,mhi);
double xflag,yflag,zflag;
if (strcmp(arg[iarg+2],"off") == 0) xflag = 0.0;
else if (strcmp(arg[iarg+2],"on") == 0) xflag = 1.0;
else error->all(FLERR,"Illegal fix rigid command");
if (strcmp(arg[iarg+3],"off") == 0) yflag = 0.0;
else if (strcmp(arg[iarg+3],"on") == 0) yflag = 1.0;
else error->all(FLERR,"Illegal fix rigid command");
if (strcmp(arg[iarg+4],"off") == 0) zflag = 0.0;
else if (strcmp(arg[iarg+4],"on") == 0) zflag = 1.0;
else error->all(FLERR,"Illegal fix rigid command");
if (domain->dimension == 2 && zflag == 1.0)
error->all(FLERR,"Fix rigid z force cannot be on for 2d simulation");
int count = 0;
for (int m = mlo; m <= mhi; m++) {
fflag[m-1][0] = xflag;
fflag[m-1][1] = yflag;
fflag[m-1][2] = zflag;
count++;
}
if (count == 0) error->all(FLERR,"Illegal fix rigid command");
iarg += 5;
} else if (strcmp(arg[iarg],"torque") == 0) {
if (iarg+5 > narg) error->all(FLERR,"Illegal fix rigid command");
int mlo,mhi;
force->bounds(arg[iarg+1],nbody,mlo,mhi);
double xflag,yflag,zflag;
if (strcmp(arg[iarg+2],"off") == 0) xflag = 0.0;
else if (strcmp(arg[iarg+2],"on") == 0) xflag = 1.0;
else error->all(FLERR,"Illegal fix rigid command");
if (strcmp(arg[iarg+3],"off") == 0) yflag = 0.0;
else if (strcmp(arg[iarg+3],"on") == 0) yflag = 1.0;
else error->all(FLERR,"Illegal fix rigid command");
if (strcmp(arg[iarg+4],"off") == 0) zflag = 0.0;
else if (strcmp(arg[iarg+4],"on") == 0) zflag = 1.0;
else error->all(FLERR,"Illegal fix rigid command");
if (domain->dimension == 2 && (xflag == 1.0 || yflag == 1.0))
error->all(FLERR,"Fix rigid xy torque cannot be on for 2d simulation");
int count = 0;
for (int m = mlo; m <= mhi; m++) {
tflag[m-1][0] = xflag;
tflag[m-1][1] = yflag;
tflag[m-1][2] = zflag;
count++;
}
if (count == 0) error->all(FLERR,"Illegal fix rigid command");
iarg += 5;
} else if (strcmp(arg[iarg],"langevin") == 0) {
if (iarg+5 > narg) error->all(FLERR,"Illegal fix rigid command");
if (strcmp(style,"rigid") != 0 && strcmp(style,"rigid/nve") != 0)
error->all(FLERR,"Illegal fix rigid command");
langflag = 1;
t_start = force->numeric(FLERR,arg[iarg+1]);
t_stop = force->numeric(FLERR,arg[iarg+2]);
t_period = force->numeric(FLERR,arg[iarg+3]);
seed = force->inumeric(FLERR,arg[iarg+4]);
if (t_period <= 0.0)
error->all(FLERR,"Fix rigid langevin period must be > 0.0");
if (seed <= 0) error->all(FLERR,"Illegal fix rigid command");
iarg += 5;
} else if (strcmp(arg[iarg],"temp") == 0) {
if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command");
if (strcmp(style,"rigid/nvt") != 0 && strcmp(style,"rigid/npt") != 0)
error->all(FLERR,"Illegal fix rigid command");
tstat_flag = 1;
t_start = force->numeric(FLERR,arg[iarg+1]);
t_stop = force->numeric(FLERR,arg[iarg+2]);
t_period = force->numeric(FLERR,arg[iarg+3]);
iarg += 4;
} else if (strcmp(arg[iarg],"iso") == 0) {
if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command");
if (strcmp(style,"rigid/npt") != 0 && strcmp(style,"rigid/nph") != 0)
error->all(FLERR,"Illegal fix rigid command");
pcouple = XYZ;
p_start[0] = p_start[1] = p_start[2] = force->numeric(FLERR,arg[iarg+1]);
p_stop[0] = p_stop[1] = p_stop[2] = force->numeric(FLERR,arg[iarg+2]);
- p_period[0] = p_period[1] = p_period[2] = force->numeric(FLERR,arg[iarg+3]);
+ p_period[0] = p_period[1] = p_period[2] =
+ force->numeric(FLERR,arg[iarg+3]);
p_flag[0] = p_flag[1] = p_flag[2] = 1;
if (dimension == 2) {
p_start[2] = p_stop[2] = p_period[2] = 0.0;
p_flag[2] = 0;
}
iarg += 4;
} else if (strcmp(arg[iarg],"aniso") == 0) {
if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command");
if (strcmp(style,"rigid/npt") != 0 && strcmp(style,"rigid/nph") != 0)
error->all(FLERR,"Illegal fix rigid command");
p_start[0] = p_start[1] = p_start[2] = force->numeric(FLERR,arg[iarg+1]);
p_stop[0] = p_stop[1] = p_stop[2] = force->numeric(FLERR,arg[iarg+2]);
- p_period[0] = p_period[1] = p_period[2] = force->numeric(FLERR,arg[iarg+3]);
+ p_period[0] = p_period[1] = p_period[2] =
+ force->numeric(FLERR,arg[iarg+3]);
p_flag[0] = p_flag[1] = p_flag[2] = 1;
if (dimension == 2) {
p_start[2] = p_stop[2] = p_period[2] = 0.0;
p_flag[2] = 0;
}
iarg += 4;
} else if (strcmp(arg[iarg],"x") == 0) {
if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command");
p_start[0] = force->numeric(FLERR,arg[iarg+1]);
p_stop[0] = force->numeric(FLERR,arg[iarg+2]);
p_period[0] = force->numeric(FLERR,arg[iarg+3]);
p_flag[0] = 1;
iarg += 4;
} else if (strcmp(arg[iarg],"y") == 0) {
if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command");
p_start[1] = force->numeric(FLERR,arg[iarg+1]);
p_stop[1] = force->numeric(FLERR,arg[iarg+2]);
p_period[1] = force->numeric(FLERR,arg[iarg+3]);
p_flag[1] = 1;
iarg += 4;
} else if (strcmp(arg[iarg],"z") == 0) {
if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command");
p_start[2] = force->numeric(FLERR,arg[iarg+1]);
p_stop[2] = force->numeric(FLERR,arg[iarg+2]);
p_period[2] = force->numeric(FLERR,arg[iarg+3]);
p_flag[2] = 1;
iarg += 4;
} else if (strcmp(arg[iarg],"couple") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid command");
if (strcmp(arg[iarg+1],"xyz") == 0) pcouple = XYZ;
else if (strcmp(arg[iarg+1],"xy") == 0) pcouple = XY;
else if (strcmp(arg[iarg+1],"yz") == 0) pcouple = YZ;
else if (strcmp(arg[iarg+1],"xz") == 0) pcouple = XZ;
else if (strcmp(arg[iarg+1],"none") == 0) pcouple = NONE;
else error->all(FLERR,"Illegal fix rigid command");
iarg += 2;
} else if (strcmp(arg[iarg],"dilate") == 0) {
if (iarg+2 > narg)
error->all(FLERR,"Illegal fix rigid nvt/npt/nph command");
if (strcmp(arg[iarg+1],"all") == 0) allremap = 1;
else {
allremap = 0;
delete [] id_dilate;
int n = strlen(arg[iarg+1]) + 1;
id_dilate = new char[n];
strcpy(id_dilate,arg[iarg+1]);
int idilate = group->find(id_dilate);
if (idilate == -1)
error->all(FLERR,
"Fix rigid npt/nph dilate group ID does not exist");
}
iarg += 2;
} else if (strcmp(arg[iarg],"tparam") == 0) {
if (iarg+4 > narg) error->all(FLERR,"Illegal fix rigid command");
if (strcmp(style,"rigid/nvt") != 0 && strcmp(style,"rigid/npt") != 0)
error->all(FLERR,"Illegal fix rigid command");
t_chain = force->inumeric(FLERR,arg[iarg+1]);
t_iter = force->inumeric(FLERR,arg[iarg+2]);
t_order = force->inumeric(FLERR,arg[iarg+3]);
iarg += 4;
} else if (strcmp(arg[iarg],"pchain") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid command");
if (strcmp(style,"rigid/npt") != 0 && strcmp(style,"rigid/nph") != 0)
error->all(FLERR,"Illegal fix rigid command");
p_chain = force->inumeric(FLERR,arg[iarg+1]);
iarg += 2;
} else if (strcmp(arg[iarg],"infile") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid command");
delete [] infile;
int n = strlen(arg[iarg+1]) + 1;
infile = new char[n];
strcpy(infile,arg[iarg+1]);
+ restart_file = 1;
iarg += 2;
} else error->all(FLERR,"Illegal fix rigid command");
}
// set pstat_flag
pstat_flag = 0;
for (int i = 0; i < 3; i++)
if (p_flag[i]) pstat_flag = 1;
if (pcouple == XYZ || (dimension == 2 && pcouple == XY)) pstyle = ISO;
else pstyle = ANISO;
// initialize Marsaglia RNG with processor-unique seed
if (langflag) random = new RanMars(lmp,seed + me);
else random = NULL;
// initialize vector output quantities in case accessed before run
for (i = 0; i < nbody; i++) {
xcm[i][0] = xcm[i][1] = xcm[i][2] = 0.0;
vcm[i][0] = vcm[i][1] = vcm[i][2] = 0.0;
fcm[i][0] = fcm[i][1] = fcm[i][2] = 0.0;
torque[i][0] = torque[i][1] = torque[i][2] = 0.0;
}
// nrigid[n] = # of atoms in Nth rigid body
// error if one or zero atoms
int *ncount = new int[nbody];
for (ibody = 0; ibody < nbody; ibody++) ncount[ibody] = 0;
int nlocal = atom->nlocal;
for (i = 0; i < nlocal; i++)
if (body[i] >= 0) ncount[body[i]]++;
MPI_Allreduce(ncount,nrigid,nbody,MPI_INT,MPI_SUM,world);
delete [] ncount;
for (ibody = 0; ibody < nbody; ibody++)
if (nrigid[ibody] <= 1) error->all(FLERR,"One or zero atoms in rigid body");
// bitmasks for properties of extended particles
POINT = 1;
SPHERE = 2;
ELLIPSOID = 4;
LINE = 8;
TRIANGLE = 16;
DIPOLE = 32;
OMEGA = 64;
ANGMOM = 128;
TORQUE = 256;
MINUSPI = -MY_PI;
TWOPI = 2.0*MY_PI;
// print statistics
int nsum = 0;
for (ibody = 0; ibody < nbody; ibody++) nsum += nrigid[ibody];
if (me == 0) {
if (screen) fprintf(screen,"%d rigid bodies with %d atoms\n",nbody,nsum);
if (logfile) fprintf(logfile,"%d rigid bodies with %d atoms\n",nbody,nsum);
}
// firstflag = 1 triggers one-time initialization of rigid body attributes
firstflag = 1;
}
/* ---------------------------------------------------------------------- */
FixRigid::~FixRigid()
{
// unregister callbacks to this fix from Atom class
atom->delete_callback(id,0);
delete random;
delete [] infile;
memory->destroy(mol2body);
+ memory->destroy(body2mol);
// delete locally stored arrays
memory->destroy(body);
memory->destroy(displace);
memory->destroy(eflags);
memory->destroy(orient);
memory->destroy(dorient);
// delete nbody-length arrays
memory->destroy(nrigid);
memory->destroy(masstotal);
memory->destroy(xcm);
memory->destroy(vcm);
memory->destroy(fcm);
memory->destroy(inertia);
memory->destroy(ex_space);
memory->destroy(ey_space);
memory->destroy(ez_space);
memory->destroy(angmom);
memory->destroy(omega);
memory->destroy(torque);
memory->destroy(quat);
memory->destroy(imagebody);
memory->destroy(fflag);
memory->destroy(tflag);
memory->destroy(langextra);
memory->destroy(sum);
memory->destroy(all);
memory->destroy(remapflag);
}
/* ---------------------------------------------------------------------- */
int FixRigid::setmask()
{
int mask = 0;
mask |= INITIAL_INTEGRATE;
mask |= FINAL_INTEGRATE;
if (langflag) mask |= POST_FORCE;
mask |= PRE_NEIGHBOR;
mask |= INITIAL_INTEGRATE_RESPA;
mask |= FINAL_INTEGRATE_RESPA;
return mask;
}
/* ---------------------------------------------------------------------- */
void FixRigid::init()
{
int i,ibody;
triclinic = domain->triclinic;
// atom style pointers to particles that store extra info
avec_ellipsoid = (AtomVecEllipsoid *) atom->style_match("ellipsoid");
avec_line = (AtomVecLine *) atom->style_match("line");
avec_tri = (AtomVecTri *) atom->style_match("tri");
// warn if more than one rigid fix
int count = 0;
for (i = 0; i < modify->nfix; i++)
if (strcmp(modify->fix[i]->style,"rigid") == 0) count++;
if (count > 1 && me == 0) error->warning(FLERR,"More than one fix rigid");
// error if npt,nph fix comes before rigid fix
for (i = 0; i < modify->nfix; i++) {
if (strcmp(modify->fix[i]->style,"npt") == 0) break;
if (strcmp(modify->fix[i]->style,"nph") == 0) break;
}
if (i < modify->nfix) {
for (int j = i; j < modify->nfix; j++)
if (strcmp(modify->fix[j]->style,"rigid") == 0)
error->all(FLERR,"Rigid fix must come before NPT/NPH fix");
}
// timestep info
dtv = update->dt;
dtf = 0.5 * update->dt * force->ftm2v;
dtq = 0.5 * update->dt;
if (strstr(update->integrate_style,"respa"))
step_respa = ((Respa *) update->integrate)->step;
// one-time initialization of rigid body attributes
// extended flags, masstotal, COM, inertia tensor
if (firstflag) setup_bodies();
firstflag = 0;
// temperature scale factor
double ndof = 0.0;
for (ibody = 0; ibody < nbody; ibody++) {
ndof += fflag[ibody][0] + fflag[ibody][1] + fflag[ibody][2];
ndof += tflag[ibody][0] + tflag[ibody][1] + tflag[ibody][2];
}
if (ndof > 0.0) tfactor = force->mvv2e / (ndof * force->boltz);
else tfactor = 0.0;
}
/* ---------------------------------------------------------------------- */
void FixRigid::setup(int vflag)
{
int i,n,ibody;
double massone,radone;
// vcm = velocity of center-of-mass of each rigid body
// fcm = force on center-of-mass of each rigid body
double **v = atom->v;
double **f = atom->f;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int nlocal = atom->nlocal;
for (ibody = 0; ibody < nbody; ibody++)
for (i = 0; i < 6; i++) sum[ibody][i] = 0.0;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
sum[ibody][0] += v[i][0] * massone;
sum[ibody][1] += v[i][1] * massone;
sum[ibody][2] += v[i][2] * massone;
sum[ibody][3] += f[i][0];
sum[ibody][4] += f[i][1];
sum[ibody][5] += f[i][2];
}
MPI_Allreduce(sum[0],all[0],6*nbody,MPI_DOUBLE,MPI_SUM,world);
for (ibody = 0; ibody < nbody; ibody++) {
vcm[ibody][0] = all[ibody][0]/masstotal[ibody];
vcm[ibody][1] = all[ibody][1]/masstotal[ibody];
vcm[ibody][2] = all[ibody][2]/masstotal[ibody];
fcm[ibody][0] = all[ibody][3];
fcm[ibody][1] = all[ibody][4];
fcm[ibody][2] = all[ibody][5];
}
// angmom = angular momentum of each rigid body
// torque = torque on each rigid body
tagint *image = atom->image;
double **x = atom->x;
double dx,dy,dz;
double unwrap[3];
for (ibody = 0; ibody < nbody; ibody++)
for (i = 0; i < 6; i++) sum[ibody][i] = 0.0;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
domain->unmap(x[i],image[i],unwrap);
dx = unwrap[0] - xcm[ibody][0];
dy = unwrap[1] - xcm[ibody][1];
dz = unwrap[2] - xcm[ibody][2];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
sum[ibody][0] += dy * massone*v[i][2] - dz * massone*v[i][1];
sum[ibody][1] += dz * massone*v[i][0] - dx * massone*v[i][2];
sum[ibody][2] += dx * massone*v[i][1] - dy * massone*v[i][0];
sum[ibody][3] += dy * f[i][2] - dz * f[i][1];
sum[ibody][4] += dz * f[i][0] - dx * f[i][2];
sum[ibody][5] += dx * f[i][1] - dy * f[i][0];
}
// extended particles add their rotation/torque to angmom/torque of body
if (extended) {
AtomVecLine::Bonus *lbonus;
if (avec_line) lbonus = avec_line->bonus;
double **omega_one = atom->omega;
double **angmom_one = atom->angmom;
double **torque_one = atom->torque;
double *radius = atom->radius;
int *line = atom->line;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
if (eflags[i] & OMEGA) {
if (eflags[i] & SPHERE) {
radone = radius[i];
sum[ibody][0] += SINERTIA*rmass[i] * radone*radone * omega_one[i][0];
sum[ibody][1] += SINERTIA*rmass[i] * radone*radone * omega_one[i][1];
sum[ibody][2] += SINERTIA*rmass[i] * radone*radone * omega_one[i][2];
} else if (eflags[i] & LINE) {
radone = lbonus[line[i]].length;
sum[ibody][2] += LINERTIA*rmass[i] * radone*radone * omega_one[i][2];
}
}
if (eflags[i] & ANGMOM) {
sum[ibody][0] += angmom_one[i][0];
sum[ibody][1] += angmom_one[i][1];
sum[ibody][2] += angmom_one[i][2];
}
if (eflags[i] & TORQUE) {
sum[ibody][3] += torque_one[i][0];
sum[ibody][4] += torque_one[i][1];
sum[ibody][5] += torque_one[i][2];
}
}
}
MPI_Allreduce(sum[0],all[0],6*nbody,MPI_DOUBLE,MPI_SUM,world);
for (ibody = 0; ibody < nbody; ibody++) {
angmom[ibody][0] = all[ibody][0];
angmom[ibody][1] = all[ibody][1];
angmom[ibody][2] = all[ibody][2];
torque[ibody][0] = all[ibody][3];
torque[ibody][1] = all[ibody][4];
torque[ibody][2] = all[ibody][5];
}
// zero langextra in case Langevin thermostat not used
// no point to calling post_force() here since langextra
// is only added to fcm/torque in final_integrate()
for (ibody = 0; ibody < nbody; ibody++)
for (i = 0; i < 6; i++) langextra[ibody][i] = 0.0;
// virial setup before call to set_v
if (vflag) v_setup(vflag);
else evflag = 0;
// set velocities from angmom & omega
for (ibody = 0; ibody < nbody; ibody++)
MathExtra::angmom_to_omega(angmom[ibody],ex_space[ibody],ey_space[ibody],
ez_space[ibody],inertia[ibody],omega[ibody]);
set_v();
// guesstimate virial as 2x the set_v contribution
if (vflag_global)
for (n = 0; n < 6; n++) virial[n] *= 2.0;
if (vflag_atom) {
for (i = 0; i < nlocal; i++)
for (n = 0; n < 6; n++)
vatom[i][n] *= 2.0;
}
}
/* ---------------------------------------------------------------------- */
void FixRigid::initial_integrate(int vflag)
{
double dtfm;
for (int ibody = 0; ibody < nbody; ibody++) {
// update vcm by 1/2 step
dtfm = dtf / masstotal[ibody];
vcm[ibody][0] += dtfm * fcm[ibody][0] * fflag[ibody][0];
vcm[ibody][1] += dtfm * fcm[ibody][1] * fflag[ibody][1];
vcm[ibody][2] += dtfm * fcm[ibody][2] * fflag[ibody][2];
// update xcm by full step
xcm[ibody][0] += dtv * vcm[ibody][0];
xcm[ibody][1] += dtv * vcm[ibody][1];
xcm[ibody][2] += dtv * vcm[ibody][2];
// update angular momentum by 1/2 step
angmom[ibody][0] += dtf * torque[ibody][0] * tflag[ibody][0];
angmom[ibody][1] += dtf * torque[ibody][1] * tflag[ibody][1];
angmom[ibody][2] += dtf * torque[ibody][2] * tflag[ibody][2];
// compute omega at 1/2 step from angmom at 1/2 step and current q
// update quaternion a full step via Richardson iteration
// returns new normalized quaternion, also updated omega at 1/2 step
// update ex,ey,ez to reflect new quaternion
MathExtra::angmom_to_omega(angmom[ibody],ex_space[ibody],ey_space[ibody],
ez_space[ibody],inertia[ibody],omega[ibody]);
MathExtra::richardson(quat[ibody],angmom[ibody],omega[ibody],
inertia[ibody],dtq);
MathExtra::q_to_exyz(quat[ibody],
ex_space[ibody],ey_space[ibody],ez_space[ibody]);
}
// virial setup before call to set_xv
if (vflag) v_setup(vflag);
else evflag = 0;
// set coords/orient and velocity/rotation of atoms in rigid bodies
// from quarternion and omega
set_xv();
}
/* ----------------------------------------------------------------------
apply Langevin thermostat to all 6 DOF of rigid bodies
computed by proc 0, broadcast to other procs
unlike fix langevin, this stores extra force in extra arrays,
which are added in when final_integrate() calculates a new fcm/torque
------------------------------------------------------------------------- */
void FixRigid::post_force(int vflag)
{
if (me == 0) {
double gamma1,gamma2;
double delta = update->ntimestep - update->beginstep;
if (delta != 0.0) delta /= update->endstep - update->beginstep;
t_target = t_start + delta * (t_stop-t_start);
double tsqrt = sqrt(t_target);
double boltz = force->boltz;
double dt = update->dt;
double mvv2e = force->mvv2e;
double ftm2v = force->ftm2v;
for (int i = 0; i < nbody; i++) {
gamma1 = -masstotal[i] / t_period / ftm2v;
gamma2 = sqrt(masstotal[i]) * tsqrt *
sqrt(24.0*boltz/t_period/dt/mvv2e) / ftm2v;
langextra[i][0] = gamma1*vcm[i][0] + gamma2*(random->uniform()-0.5);
langextra[i][1] = gamma1*vcm[i][1] + gamma2*(random->uniform()-0.5);
langextra[i][2] = gamma1*vcm[i][2] + gamma2*(random->uniform()-0.5);
gamma1 = -1.0 / t_period / ftm2v;
gamma2 = tsqrt * sqrt(24.0*boltz/t_period/dt/mvv2e) / ftm2v;
langextra[i][3] = inertia[i][0]*gamma1*omega[i][0] +
sqrt(inertia[i][0])*gamma2*(random->uniform()-0.5);
langextra[i][4] = inertia[i][1]*gamma1*omega[i][1] +
sqrt(inertia[i][1])*gamma2*(random->uniform()-0.5);
langextra[i][5] = inertia[i][2]*gamma1*omega[i][2] +
sqrt(inertia[i][2])*gamma2*(random->uniform()-0.5);
}
}
MPI_Bcast(&langextra[0][0],6*nbody,MPI_DOUBLE,0,world);
}
/* ---------------------------------------------------------------------- */
void FixRigid::final_integrate()
{
int i,ibody;
double dtfm;
// sum over atoms to get force and torque on rigid body
tagint *image = atom->image;
double **x = atom->x;
double **f = atom->f;
int nlocal = atom->nlocal;
double dx,dy,dz;
double unwrap[3];
for (ibody = 0; ibody < nbody; ibody++)
for (i = 0; i < 6; i++) sum[ibody][i] = 0.0;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
sum[ibody][0] += f[i][0];
sum[ibody][1] += f[i][1];
sum[ibody][2] += f[i][2];
domain->unmap(x[i],image[i],unwrap);
dx = unwrap[0] - xcm[ibody][0];
dy = unwrap[1] - xcm[ibody][1];
dz = unwrap[2] - xcm[ibody][2];
sum[ibody][3] += dy*f[i][2] - dz*f[i][1];
sum[ibody][4] += dz*f[i][0] - dx*f[i][2];
sum[ibody][5] += dx*f[i][1] - dy*f[i][0];
}
// extended particles add their torque to torque of body
if (extended) {
double **torque_one = atom->torque;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
if (eflags[i] & TORQUE) {
sum[ibody][3] += torque_one[i][0];
sum[ibody][4] += torque_one[i][1];
sum[ibody][5] += torque_one[i][2];
}
}
}
MPI_Allreduce(sum[0],all[0],6*nbody,MPI_DOUBLE,MPI_SUM,world);
// update vcm and angmom
// include Langevin thermostat forces
// fflag,tflag = 0 for some dimensions in 2d
for (ibody = 0; ibody < nbody; ibody++) {
fcm[ibody][0] = all[ibody][0] + langextra[ibody][0];
fcm[ibody][1] = all[ibody][1] + langextra[ibody][1];
fcm[ibody][2] = all[ibody][2] + langextra[ibody][2];
torque[ibody][0] = all[ibody][3] + langextra[ibody][3];
torque[ibody][1] = all[ibody][4] + langextra[ibody][4];
torque[ibody][2] = all[ibody][5] + langextra[ibody][5];
// update vcm by 1/2 step
dtfm = dtf / masstotal[ibody];
vcm[ibody][0] += dtfm * fcm[ibody][0] * fflag[ibody][0];
vcm[ibody][1] += dtfm * fcm[ibody][1] * fflag[ibody][1];
vcm[ibody][2] += dtfm * fcm[ibody][2] * fflag[ibody][2];
// update angular momentum by 1/2 step
angmom[ibody][0] += dtf * torque[ibody][0] * tflag[ibody][0];
angmom[ibody][1] += dtf * torque[ibody][1] * tflag[ibody][1];
angmom[ibody][2] += dtf * torque[ibody][2] * tflag[ibody][2];
MathExtra::angmom_to_omega(angmom[ibody],ex_space[ibody],ey_space[ibody],
ez_space[ibody],inertia[ibody],omega[ibody]);
}
// set velocity/rotation of atoms in rigid bodies
// virial is already setup from initial_integrate
set_v();
}
/* ----------------------------------------------------------------------
apply evolution operators to quat, quat momentum
see Miller paper cited in fix rigid/nvt and fix rigid/npt
------------------------------------------------------------------------- */
void FixRigid::no_squish_rotate(int k, double *p, double *q,
double *inertia, double dt) const
{
double phi,c_phi,s_phi,kp[4],kq[4];
// apply permuation operator on p and q, get kp and kq
if (k == 1) {
kq[0] = -q[1]; kp[0] = -p[1];
kq[1] = q[0]; kp[1] = p[0];
kq[2] = q[3]; kp[2] = p[3];
kq[3] = -q[2]; kp[3] = -p[2];
} else if (k == 2) {
kq[0] = -q[2]; kp[0] = -p[2];
kq[1] = -q[3]; kp[1] = -p[3];
kq[2] = q[0]; kp[2] = p[0];
kq[3] = q[1]; kp[3] = p[1];
} else if (k == 3) {
kq[0] = -q[3]; kp[0] = -p[3];
kq[1] = q[2]; kp[1] = p[2];
kq[2] = -q[1]; kp[2] = -p[1];
kq[3] = q[0]; kp[3] = p[0];
}
// obtain phi, cosines and sines
phi = p[0]*kq[0] + p[1]*kq[1] + p[2]*kq[2] + p[3]*kq[3];
if (fabs(inertia[k-1]) < 1e-6) phi *= 0.0;
else phi /= 4.0 * inertia[k-1];
c_phi = cos(dt * phi);
s_phi = sin(dt * phi);
// advance p and q
p[0] = c_phi*p[0] + s_phi*kp[0];
p[1] = c_phi*p[1] + s_phi*kp[1];
p[2] = c_phi*p[2] + s_phi*kp[2];
p[3] = c_phi*p[3] + s_phi*kp[3];
q[0] = c_phi*q[0] + s_phi*kq[0];
q[1] = c_phi*q[1] + s_phi*kq[1];
q[2] = c_phi*q[2] + s_phi*kq[2];
q[3] = c_phi*q[3] + s_phi*kq[3];
}
/* ---------------------------------------------------------------------- */
void FixRigid::initial_integrate_respa(int vflag, int ilevel, int iloop)
{
dtv = step_respa[ilevel];
dtf = 0.5 * step_respa[ilevel] * force->ftm2v;
dtq = 0.5 * step_respa[ilevel];
if (ilevel == 0) initial_integrate(vflag);
else final_integrate();
}
/* ---------------------------------------------------------------------- */
void FixRigid::final_integrate_respa(int ilevel, int iloop)
{
dtf = 0.5 * step_respa[ilevel] * force->ftm2v;
final_integrate();
}
/* ----------------------------------------------------------------------
remap xcm of each rigid body back into periodic simulation box
done during pre_neighbor so will be after call to pbc()
and after fix_deform::pre_exchange() may have flipped box
use domain->remap() in case xcm is far away from box
due to 1st definition of rigid body or due to box flip
if don't do this, then atoms of a body which drifts far away
from a triclinic box will be remapped back into box
with huge displacements when the box tilt changes via set_x()
adjust image flag of body and image flags of all atoms in body
------------------------------------------------------------------------- */
void FixRigid::pre_neighbor()
{
tagint original,oldimage,newimage;
for (int ibody = 0; ibody < nbody; ibody++) {
original = imagebody[ibody];
domain->remap(xcm[ibody],imagebody[ibody]);
if (original == imagebody[ibody]) remapflag[ibody][3] = 0;
else {
oldimage = original & IMGMASK;
newimage = imagebody[ibody] & IMGMASK;
remapflag[ibody][0] = newimage - oldimage;
oldimage = (original >> IMGBITS) & IMGMASK;
newimage = (imagebody[ibody] >> IMGBITS) & IMGMASK;
remapflag[ibody][1] = newimage - oldimage;
oldimage = original >> IMG2BITS;
newimage = imagebody[ibody] >> IMG2BITS;
remapflag[ibody][2] = newimage - oldimage;
remapflag[ibody][3] = 1;
}
}
// adjust image flags of any atom in a rigid body whose xcm was remapped
// subtracting remapflag = new-old keeps ix,iy,iz near 0
// so body is always in central simulation box
tagint *image = atom->image;
int nlocal = atom->nlocal;
int ibody;
tagint idim,otherdims;
for (int i = 0; i < nlocal; i++) {
if (body[i] == -1) continue;
if (remapflag[body[i]][3] == 0) continue;
ibody = body[i];
if (remapflag[ibody][0]) {
idim = image[i] & IMGMASK;
otherdims = image[i] ^ idim;
idim -= remapflag[ibody][0];
idim &= IMGMASK;
image[i] = otherdims | idim;
}
if (remapflag[ibody][1]) {
idim = (image[i] >> IMGBITS) & IMGMASK;
otherdims = image[i] ^ (idim << IMGBITS);
idim -= remapflag[ibody][1];
idim &= IMGMASK;
image[i] = otherdims | (idim << IMGBITS);
}
if (remapflag[ibody][2]) {
idim = image[i] >> IMG2BITS;
otherdims = image[i] ^ (idim << IMG2BITS);
idim -= remapflag[ibody][2];
idim &= IMGMASK;
image[i] = otherdims | (idim << IMG2BITS);
}
}
}
/* ----------------------------------------------------------------------
count # of DOF removed by rigid bodies for atoms in igroup
return total count of DOF
------------------------------------------------------------------------- */
int FixRigid::dof(int tgroup)
{
// cannot count DOF correctly unless setup_bodies() has been called
if (firstflag) {
if (comm->me == 0)
error->warning(FLERR,"Cannot count rigid body degrees-of-freedom "
"before bodies are fully initialized");
return 0;
}
int tgroupbit = group->bitmask[tgroup];
// nall = # of point particles in each rigid body
// mall = # of finite-size particles in each rigid body
// particles must also be in temperature group
int *mask = atom->mask;
int nlocal = atom->nlocal;
int *ncount = new int[nbody];
int *mcount = new int[nbody];
for (int ibody = 0; ibody < nbody; ibody++)
ncount[ibody] = mcount[ibody] = 0;
for (int i = 0; i < nlocal; i++)
if (body[i] >= 0 && mask[i] & tgroupbit) {
if (extended && eflags[i]) mcount[body[i]]++;
else ncount[body[i]]++;
}
int *nall = new int[nbody];
int *mall = new int[nbody];
MPI_Allreduce(ncount,nall,nbody,MPI_INT,MPI_SUM,world);
MPI_Allreduce(mcount,mall,nbody,MPI_INT,MPI_SUM,world);
// warn if nall+mall != nrigid for any body included in temperature group
int flag = 0;
for (int ibody = 0; ibody < nbody; ibody++) {
if (nall[ibody]+mall[ibody] > 0 &&
nall[ibody]+mall[ibody] != nrigid[ibody]) flag = 1;
}
if (flag && me == 0)
error->warning(FLERR,"Computing temperature of portions of rigid bodies");
// remove appropriate DOFs for each rigid body wholly in temperature group
// N = # of point particles in body
// M = # of finite-size particles in body
// 3d body has 3N + 6M dof to start with
// 2d body has 2N + 3M dof to start with
// 3d point-particle body with all non-zero I should have 6 dof, remove 3N-6
// 3d point-particle body (linear) with a 0 I should have 5 dof, remove 3N-5
// 2d point-particle body should have 3 dof, remove 2N-3
// 3d body with any finite-size M should have 6 dof, remove (3N+6M) - 6
// 2d body with any finite-size M should have 3 dof, remove (2N+3M) - 3
int n = 0;
if (domain->dimension == 3) {
for (int ibody = 0; ibody < nbody; ibody++)
if (nall[ibody]+mall[ibody] == nrigid[ibody]) {
n += 3*nall[ibody] + 6*mall[ibody] - 6;
if (inertia[ibody][0] == 0.0 || inertia[ibody][1] == 0.0 ||
inertia[ibody][2] == 0.0) n++;
}
} else if (domain->dimension == 2) {
for (int ibody = 0; ibody < nbody; ibody++)
if (nall[ibody]+mall[ibody] == nrigid[ibody])
n += 2*nall[ibody] + 3*mall[ibody] - 3;
}
delete [] ncount;
delete [] mcount;
delete [] nall;
delete [] mall;
return n;
}
/* ----------------------------------------------------------------------
adjust xcm of each rigid body due to box deformation
called by various fixes that change box size/shape
flag = 0/1 means map from box to lamda coords or vice versa
------------------------------------------------------------------------- */
void FixRigid::deform(int flag)
{
if (flag == 0)
for (int ibody = 0; ibody < nbody; ibody++)
domain->x2lamda(xcm[ibody],xcm[ibody]);
else
for (int ibody = 0; ibody < nbody; ibody++)
domain->lamda2x(xcm[ibody],xcm[ibody]);
}
/* ----------------------------------------------------------------------
set space-frame coords and velocity of each atom in each rigid body
set orientation and rotation of extended particles
x = Q displace + Xcm, mapped back to periodic box
v = Vcm + (W cross (x - Xcm))
------------------------------------------------------------------------- */
void FixRigid::set_xv()
{
int ibody;
int xbox,ybox,zbox;
double x0,x1,x2,v0,v1,v2,fc0,fc1,fc2,massone;
double xy,xz,yz;
double ione[3],exone[3],eyone[3],ezone[3],vr[6],p[3][3];
tagint *image = atom->image;
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int nlocal = atom->nlocal;
double xprd = domain->xprd;
double yprd = domain->yprd;
double zprd = domain->zprd;
if (triclinic) {
xy = domain->xy;
xz = domain->xz;
yz = domain->yz;
}
// set x and v of each atom
for (int i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
xbox = (image[i] & IMGMASK) - IMGMAX;
ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX;
zbox = (image[i] >> IMG2BITS) - IMGMAX;
// save old positions and velocities for virial
if (evflag) {
if (triclinic == 0) {
x0 = x[i][0] + xbox*xprd;
x1 = x[i][1] + ybox*yprd;
x2 = x[i][2] + zbox*zprd;
} else {
x0 = x[i][0] + xbox*xprd + ybox*xy + zbox*xz;
x1 = x[i][1] + ybox*yprd + zbox*yz;
x2 = x[i][2] + zbox*zprd;
}
v0 = v[i][0];
v1 = v[i][1];
v2 = v[i][2];
}
// x = displacement from center-of-mass, based on body orientation
// v = vcm + omega around center-of-mass
MathExtra::matvec(ex_space[ibody],ey_space[ibody],
ez_space[ibody],displace[i],x[i]);
v[i][0] = omega[ibody][1]*x[i][2] - omega[ibody][2]*x[i][1] +
vcm[ibody][0];
v[i][1] = omega[ibody][2]*x[i][0] - omega[ibody][0]*x[i][2] +
vcm[ibody][1];
v[i][2] = omega[ibody][0]*x[i][1] - omega[ibody][1]*x[i][0] +
vcm[ibody][2];
// add center of mass to displacement
// map back into periodic box via xbox,ybox,zbox
// for triclinic, add in box tilt factors as well
if (triclinic == 0) {
x[i][0] += xcm[ibody][0] - xbox*xprd;
x[i][1] += xcm[ibody][1] - ybox*yprd;
x[i][2] += xcm[ibody][2] - zbox*zprd;
} else {
x[i][0] += xcm[ibody][0] - xbox*xprd - ybox*xy - zbox*xz;
x[i][1] += xcm[ibody][1] - ybox*yprd - zbox*yz;
x[i][2] += xcm[ibody][2] - zbox*zprd;
}
// virial = unwrapped coords dotted into body constraint force
// body constraint force = implied force due to v change minus f external
// assume f does not include forces internal to body
// 1/2 factor b/c final_integrate contributes other half
// assume per-atom contribution is due to constraint force on that atom
if (evflag) {
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
fc0 = massone*(v[i][0] - v0)/dtf - f[i][0];
fc1 = massone*(v[i][1] - v1)/dtf - f[i][1];
fc2 = massone*(v[i][2] - v2)/dtf - f[i][2];
vr[0] = 0.5*x0*fc0;
vr[1] = 0.5*x1*fc1;
vr[2] = 0.5*x2*fc2;
vr[3] = 0.5*x0*fc1;
vr[4] = 0.5*x0*fc2;
vr[5] = 0.5*x1*fc2;
v_tally(1,&i,1.0,vr);
}
}
// set orientation, omega, angmom of each extended particle
if (extended) {
double theta_body,theta;
double *shape,*quatatom,*inertiaatom;
AtomVecEllipsoid::Bonus *ebonus;
if (avec_ellipsoid) ebonus = avec_ellipsoid->bonus;
AtomVecLine::Bonus *lbonus;
if (avec_line) lbonus = avec_line->bonus;
AtomVecTri::Bonus *tbonus;
if (avec_tri) tbonus = avec_tri->bonus;
double **omega_one = atom->omega;
double **angmom_one = atom->angmom;
double **mu = atom->mu;
int *ellipsoid = atom->ellipsoid;
int *line = atom->line;
int *tri = atom->tri;
for (int i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
if (eflags[i] & SPHERE) {
omega_one[i][0] = omega[ibody][0];
omega_one[i][1] = omega[ibody][1];
omega_one[i][2] = omega[ibody][2];
} else if (eflags[i] & ELLIPSOID) {
shape = ebonus[ellipsoid[i]].shape;
quatatom = ebonus[ellipsoid[i]].quat;
MathExtra::quatquat(quat[ibody],orient[i],quatatom);
MathExtra::qnormalize(quatatom);
ione[0] = EINERTIA*rmass[i] * (shape[1]*shape[1] + shape[2]*shape[2]);
ione[1] = EINERTIA*rmass[i] * (shape[0]*shape[0] + shape[2]*shape[2]);
ione[2] = EINERTIA*rmass[i] * (shape[0]*shape[0] + shape[1]*shape[1]);
MathExtra::q_to_exyz(quatatom,exone,eyone,ezone);
MathExtra::omega_to_angmom(omega[ibody],exone,eyone,ezone,ione,
angmom_one[i]);
} else if (eflags[i] & LINE) {
if (quat[ibody][3] >= 0.0) theta_body = 2.0*acos(quat[ibody][0]);
else theta_body = -2.0*acos(quat[ibody][0]);
theta = orient[i][0] + theta_body;
while (theta <= MINUSPI) theta += TWOPI;
while (theta > MY_PI) theta -= TWOPI;
lbonus[line[i]].theta = theta;
omega_one[i][0] = omega[ibody][0];
omega_one[i][1] = omega[ibody][1];
omega_one[i][2] = omega[ibody][2];
} else if (eflags[i] & TRIANGLE) {
inertiaatom = tbonus[tri[i]].inertia;
quatatom = tbonus[tri[i]].quat;
MathExtra::quatquat(quat[ibody],orient[i],quatatom);
MathExtra::qnormalize(quatatom);
MathExtra::q_to_exyz(quatatom,exone,eyone,ezone);
MathExtra::omega_to_angmom(omega[ibody],exone,eyone,ezone,
inertiaatom,angmom_one[i]);
}
if (eflags[i] & DIPOLE) {
MathExtra::quat_to_mat(quat[ibody],p);
MathExtra::matvec(p,dorient[i],mu[i]);
MathExtra::snormalize3(mu[i][3],mu[i],mu[i]);
}
}
}
}
/* ----------------------------------------------------------------------
set space-frame velocity of each atom in a rigid body
set omega and angmom of extended particles
v = Vcm + (W cross (x - Xcm))
------------------------------------------------------------------------- */
void FixRigid::set_v()
{
int xbox,ybox,zbox;
double x0,x1,x2,v0,v1,v2,fc0,fc1,fc2,massone;
double xy,xz,yz;
double ione[3],exone[3],eyone[3],ezone[3],delta[3],vr[6];
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
tagint *image = atom->image;
int nlocal = atom->nlocal;
double xprd = domain->xprd;
double yprd = domain->yprd;
double zprd = domain->zprd;
if (triclinic) {
xy = domain->xy;
xz = domain->xz;
yz = domain->yz;
}
// set v of each atom
for (int i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
const int ibody = body[i];
MathExtra::matvec(ex_space[ibody],ey_space[ibody],
ez_space[ibody],displace[i],delta);
// save old velocities for virial
if (evflag) {
v0 = v[i][0];
v1 = v[i][1];
v2 = v[i][2];
}
v[i][0] = omega[ibody][1]*delta[2] - omega[ibody][2]*delta[1] +
vcm[ibody][0];
v[i][1] = omega[ibody][2]*delta[0] - omega[ibody][0]*delta[2] +
vcm[ibody][1];
v[i][2] = omega[ibody][0]*delta[1] - omega[ibody][1]*delta[0] +
vcm[ibody][2];
// virial = unwrapped coords dotted into body constraint force
// body constraint force = implied force due to v change minus f external
// assume f does not include forces internal to body
// 1/2 factor b/c initial_integrate contributes other half
// assume per-atom contribution is due to constraint force on that atom
if (evflag) {
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
fc0 = massone*(v[i][0] - v0)/dtf - f[i][0];
fc1 = massone*(v[i][1] - v1)/dtf - f[i][1];
fc2 = massone*(v[i][2] - v2)/dtf - f[i][2];
xbox = (image[i] & IMGMASK) - IMGMAX;
ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX;
zbox = (image[i] >> IMG2BITS) - IMGMAX;
if (triclinic == 0) {
x0 = x[i][0] + xbox*xprd;
x1 = x[i][1] + ybox*yprd;
x2 = x[i][2] + zbox*zprd;
} else {
x0 = x[i][0] + xbox*xprd + ybox*xy + zbox*xz;
x1 = x[i][1] + ybox*yprd + zbox*yz;
x2 = x[i][2] + zbox*zprd;
}
vr[0] = 0.5*x0*fc0;
vr[1] = 0.5*x1*fc1;
vr[2] = 0.5*x2*fc2;
vr[3] = 0.5*x0*fc1;
vr[4] = 0.5*x0*fc2;
vr[5] = 0.5*x1*fc2;
v_tally(1,&i,1.0,vr);
}
}
// set omega, angmom of each extended particle
if (extended) {
double *shape,*quatatom,*inertiaatom;
AtomVecEllipsoid::Bonus *ebonus;
if (avec_ellipsoid) ebonus = avec_ellipsoid->bonus;
AtomVecTri::Bonus *tbonus;
if (avec_tri) tbonus = avec_tri->bonus;
double **omega_one = atom->omega;
double **angmom_one = atom->angmom;
int *ellipsoid = atom->ellipsoid;
int *tri = atom->tri;
for (int i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
const int ibody = body[i];
if (eflags[i] & SPHERE) {
omega_one[i][0] = omega[ibody][0];
omega_one[i][1] = omega[ibody][1];
omega_one[i][2] = omega[ibody][2];
} else if (eflags[i] & ELLIPSOID) {
shape = ebonus[ellipsoid[i]].shape;
quatatom = ebonus[ellipsoid[i]].quat;
ione[0] = EINERTIA*rmass[i] * (shape[1]*shape[1] + shape[2]*shape[2]);
ione[1] = EINERTIA*rmass[i] * (shape[0]*shape[0] + shape[2]*shape[2]);
ione[2] = EINERTIA*rmass[i] * (shape[0]*shape[0] + shape[1]*shape[1]);
MathExtra::q_to_exyz(quatatom,exone,eyone,ezone);
MathExtra::omega_to_angmom(omega[ibody],exone,eyone,ezone,ione,
angmom_one[i]);
} else if (eflags[i] & LINE) {
omega_one[i][0] = omega[ibody][0];
omega_one[i][1] = omega[ibody][1];
omega_one[i][2] = omega[ibody][2];
} else if (eflags[i] & TRIANGLE) {
inertiaatom = tbonus[tri[i]].inertia;
quatatom = tbonus[tri[i]].quat;
MathExtra::q_to_exyz(quatatom,exone,eyone,ezone);
MathExtra::omega_to_angmom(omega[ibody],exone,eyone,ezone,
inertiaatom,angmom_one[i]);
}
}
}
}
/* ----------------------------------------------------------------------
one-time initialization of rigid body attributes
extended flags, masstotal, center-of-mass
Cartesian and diagonalized inertia tensor
read per-body attributes from infile if specified
------------------------------------------------------------------------- */
void FixRigid::setup_bodies()
{
int i,ibody;
// extended = 1 if any particle in a rigid body is finite size
// or has a dipole moment
extended = orientflag = dorientflag = 0;
AtomVecEllipsoid::Bonus *ebonus;
if (avec_ellipsoid) ebonus = avec_ellipsoid->bonus;
AtomVecLine::Bonus *lbonus;
if (avec_line) lbonus = avec_line->bonus;
AtomVecTri::Bonus *tbonus;
if (avec_tri) tbonus = avec_tri->bonus;
double **mu = atom->mu;
double *radius = atom->radius;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *ellipsoid = atom->ellipsoid;
int *line = atom->line;
int *tri = atom->tri;
int *type = atom->type;
int nlocal = atom->nlocal;
if (atom->radius_flag || atom->ellipsoid_flag || atom->line_flag ||
atom->tri_flag || atom->mu_flag) {
int flag = 0;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
if (radius && radius[i] > 0.0) flag = 1;
if (ellipsoid && ellipsoid[i] >= 0) flag = 1;
if (line && line[i] >= 0) flag = 1;
if (tri && tri[i] >= 0) flag = 1;
if (mu && mu[i][3] > 0.0) flag = 1;
}
MPI_Allreduce(&flag,&extended,1,MPI_INT,MPI_MAX,world);
}
// grow extended arrays and set extended flags for each particle
// orientflag = 4 if any particle stores ellipsoid or tri orientation
// orientflag = 1 if any particle stores line orientation
// dorientflag = 1 if any particle stores dipole orientation
if (extended) {
if (atom->ellipsoid_flag) orientflag = 4;
if (atom->line_flag) orientflag = 1;
if (atom->tri_flag) orientflag = 4;
if (atom->mu_flag) dorientflag = 1;
grow_arrays(atom->nmax);
for (i = 0; i < nlocal; i++) {
eflags[i] = 0;
if (body[i] < 0) continue;
// set to POINT or SPHERE or ELLIPSOID or LINE
if (radius && radius[i] > 0.0) {
eflags[i] |= SPHERE;
eflags[i] |= OMEGA;
eflags[i] |= TORQUE;
} else if (ellipsoid && ellipsoid[i] >= 0) {
eflags[i] |= ELLIPSOID;
eflags[i] |= ANGMOM;
eflags[i] |= TORQUE;
} else if (line && line[i] >= 0) {
eflags[i] |= LINE;
eflags[i] |= OMEGA;
eflags[i] |= TORQUE;
} else if (tri && tri[i] >= 0) {
eflags[i] |= TRIANGLE;
eflags[i] |= ANGMOM;
eflags[i] |= TORQUE;
} else eflags[i] |= POINT;
// set DIPOLE if atom->mu and mu[3] > 0.0
if (atom->mu_flag && mu[i][3] > 0.0)
eflags[i] |= DIPOLE;
}
}
// compute masstotal & center-of-mass of each rigid body
// error if image flag is not 0 in a non-periodic dim
double **x = atom->x;
tagint *image = atom->image;
int *periodicity = domain->periodicity;
double xprd = domain->xprd;
double yprd = domain->yprd;
double zprd = domain->zprd;
double xy = domain->xy;
double xz = domain->xz;
double yz = domain->yz;
for (ibody = 0; ibody < nbody; ibody++)
for (i = 0; i < 6; i++) sum[ibody][i] = 0.0;
int xbox,ybox,zbox;
double massone,xunwrap,yunwrap,zunwrap;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
xbox = (image[i] & IMGMASK) - IMGMAX;
ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX;
zbox = (image[i] >> IMG2BITS) - IMGMAX;
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
if ((xbox && !periodicity[0]) || (ybox && !periodicity[1]) ||
(zbox && !periodicity[2]))
error->one(FLERR,"Fix rigid atom has non-zero image flag "
"in a non-periodic dimension");
if (triclinic == 0) {
xunwrap = x[i][0] + xbox*xprd;
yunwrap = x[i][1] + ybox*yprd;
zunwrap = x[i][2] + zbox*zprd;
} else {
xunwrap = x[i][0] + xbox*xprd + ybox*xy + zbox*xz;
yunwrap = x[i][1] + ybox*yprd + zbox*yz;
zunwrap = x[i][2] + zbox*zprd;
}
sum[ibody][0] += xunwrap * massone;
sum[ibody][1] += yunwrap * massone;
sum[ibody][2] += zunwrap * massone;
sum[ibody][3] += massone;
}
MPI_Allreduce(sum[0],all[0],6*nbody,MPI_DOUBLE,MPI_SUM,world);
for (ibody = 0; ibody < nbody; ibody++) {
masstotal[ibody] = all[ibody][3];
xcm[ibody][0] = all[ibody][0]/masstotal[ibody];
xcm[ibody][1] = all[ibody][1]/masstotal[ibody];
xcm[ibody][2] = all[ibody][2]/masstotal[ibody];
}
// overwrite masstotal and center-of-mass with file values
// inbody[i] = 0/1 if Ith rigid body is initialized by file
int *inbody;
if (infile) {
memory->create(inbody,nbody,"rigid:inbody");
for (ibody = 0; ibody < nbody; ibody++) inbody[ibody] = 0;
readfile(0,masstotal,xcm,inbody);
}
// set image flags for each rigid body to default values
// then remap the xcm of each body back into simulation box if needed
for (ibody = 0; ibody < nbody; ibody++)
imagebody[ibody] = ((tagint) IMGMAX << IMG2BITS) |
((tagint) IMGMAX << IMGBITS) | IMGMAX;
pre_neighbor();
// compute 6 moments of inertia of each body in Cartesian reference frame
// dx,dy,dz = coords relative to center-of-mass
// symmetric 3x3 inertia tensor stored in Voigt notation as 6-vector
double dx,dy,dz;
for (ibody = 0; ibody < nbody; ibody++)
for (i = 0; i < 6; i++) sum[ibody][i] = 0.0;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
xbox = (image[i] & IMGMASK) - IMGMAX;
ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX;
zbox = (image[i] >> IMG2BITS) - IMGMAX;
if (triclinic == 0) {
xunwrap = x[i][0] + xbox*xprd;
yunwrap = x[i][1] + ybox*yprd;
zunwrap = x[i][2] + zbox*zprd;
} else {
xunwrap = x[i][0] + xbox*xprd + ybox*xy + zbox*xz;
yunwrap = x[i][1] + ybox*yprd + zbox*yz;
zunwrap = x[i][2] + zbox*zprd;
}
dx = xunwrap - xcm[ibody][0];
dy = yunwrap - xcm[ibody][1];
dz = zunwrap - xcm[ibody][2];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
sum[ibody][0] += massone * (dy*dy + dz*dz);
sum[ibody][1] += massone * (dx*dx + dz*dz);
sum[ibody][2] += massone * (dx*dx + dy*dy);
sum[ibody][3] -= massone * dy*dz;
sum[ibody][4] -= massone * dx*dz;
sum[ibody][5] -= massone * dx*dy;
}
// extended particles may contribute extra terms to moments of inertia
if (extended) {
double ivec[6];
double *shape,*quatatom,*inertiaatom;
double length,theta;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
if (eflags[i] & SPHERE) {
sum[ibody][0] += SINERTIA*massone * radius[i]*radius[i];
sum[ibody][1] += SINERTIA*massone * radius[i]*radius[i];
sum[ibody][2] += SINERTIA*massone * radius[i]*radius[i];
} else if (eflags[i] & ELLIPSOID) {
shape = ebonus[ellipsoid[i]].shape;
quatatom = ebonus[ellipsoid[i]].quat;
MathExtra::inertia_ellipsoid(shape,quatatom,massone,ivec);
sum[ibody][0] += ivec[0];
sum[ibody][1] += ivec[1];
sum[ibody][2] += ivec[2];
sum[ibody][3] += ivec[3];
sum[ibody][4] += ivec[4];
sum[ibody][5] += ivec[5];
} else if (eflags[i] & LINE) {
length = lbonus[line[i]].length;
theta = lbonus[line[i]].theta;
MathExtra::inertia_line(length,theta,massone,ivec);
sum[ibody][0] += ivec[0];
sum[ibody][1] += ivec[1];
sum[ibody][2] += ivec[2];
sum[ibody][3] += ivec[3];
sum[ibody][4] += ivec[4];
sum[ibody][5] += ivec[5];
} else if (eflags[i] & TRIANGLE) {
inertiaatom = tbonus[tri[i]].inertia;
quatatom = tbonus[tri[i]].quat;
MathExtra::inertia_triangle(inertiaatom,quatatom,massone,ivec);
sum[ibody][0] += ivec[0];
sum[ibody][1] += ivec[1];
sum[ibody][2] += ivec[2];
sum[ibody][3] += ivec[3];
sum[ibody][4] += ivec[4];
sum[ibody][5] += ivec[5];
}
}
}
MPI_Allreduce(sum[0],all[0],6*nbody,MPI_DOUBLE,MPI_SUM,world);
// overwrite Cartesian inertia tensor with file values
if (infile) readfile(1,NULL,all,inbody);
// diagonalize inertia tensor for each body via Jacobi rotations
// inertia = 3 eigenvalues = principal moments of inertia
// evectors and exzy_space = 3 evectors = principal axes of rigid body
int ierror;
double cross[3];
double tensor[3][3],evectors[3][3];
for (ibody = 0; ibody < nbody; ibody++) {
tensor[0][0] = all[ibody][0];
tensor[1][1] = all[ibody][1];
tensor[2][2] = all[ibody][2];
tensor[1][2] = tensor[2][1] = all[ibody][3];
tensor[0][2] = tensor[2][0] = all[ibody][4];
tensor[0][1] = tensor[1][0] = all[ibody][5];
ierror = MathExtra::jacobi(tensor,inertia[ibody],evectors);
if (ierror) error->all(FLERR,
"Insufficient Jacobi rotations for rigid body");
ex_space[ibody][0] = evectors[0][0];
ex_space[ibody][1] = evectors[1][0];
ex_space[ibody][2] = evectors[2][0];
ey_space[ibody][0] = evectors[0][1];
ey_space[ibody][1] = evectors[1][1];
ey_space[ibody][2] = evectors[2][1];
ez_space[ibody][0] = evectors[0][2];
ez_space[ibody][1] = evectors[1][2];
ez_space[ibody][2] = evectors[2][2];
// if any principal moment < scaled EPSILON, set to 0.0
double max;
max = MAX(inertia[ibody][0],inertia[ibody][1]);
max = MAX(max,inertia[ibody][2]);
if (inertia[ibody][0] < EPSILON*max) inertia[ibody][0] = 0.0;
if (inertia[ibody][1] < EPSILON*max) inertia[ibody][1] = 0.0;
if (inertia[ibody][2] < EPSILON*max) inertia[ibody][2] = 0.0;
// enforce 3 evectors as a right-handed coordinate system
// flip 3rd vector if needed
MathExtra::cross3(ex_space[ibody],ey_space[ibody],cross);
if (MathExtra::dot3(cross,ez_space[ibody]) < 0.0)
MathExtra::negate3(ez_space[ibody]);
// create initial quaternion
MathExtra::exyz_to_q(ex_space[ibody],ey_space[ibody],ez_space[ibody],
quat[ibody]);
}
// displace = initial atom coords in basis of principal axes
// set displace = 0.0 for atoms not in any rigid body
// for extended particles, set their orientation wrt to rigid body
double qc[4],delta[3];
double *quatatom;
double theta_body;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) {
displace[i][0] = displace[i][1] = displace[i][2] = 0.0;
continue;
}
ibody = body[i];
xbox = (image[i] & IMGMASK) - IMGMAX;
ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX;
zbox = (image[i] >> IMG2BITS) - IMGMAX;
if (triclinic == 0) {
xunwrap = x[i][0] + xbox*xprd;
yunwrap = x[i][1] + ybox*yprd;
zunwrap = x[i][2] + zbox*zprd;
} else {
xunwrap = x[i][0] + xbox*xprd + ybox*xy + zbox*xz;
yunwrap = x[i][1] + ybox*yprd + zbox*yz;
zunwrap = x[i][2] + zbox*zprd;
}
delta[0] = xunwrap - xcm[ibody][0];
delta[1] = yunwrap - xcm[ibody][1];
delta[2] = zunwrap - xcm[ibody][2];
MathExtra::transpose_matvec(ex_space[ibody],ey_space[ibody],
ez_space[ibody],delta,displace[i]);
if (extended) {
if (eflags[i] & ELLIPSOID) {
quatatom = ebonus[ellipsoid[i]].quat;
MathExtra::qconjugate(quat[ibody],qc);
MathExtra::quatquat(qc,quatatom,orient[i]);
MathExtra::qnormalize(orient[i]);
} else if (eflags[i] & LINE) {
if (quat[ibody][3] >= 0.0) theta_body = 2.0*acos(quat[ibody][0]);
else theta_body = -2.0*acos(quat[ibody][0]);
orient[i][0] = lbonus[line[i]].theta - theta_body;
while (orient[i][0] <= MINUSPI) orient[i][0] += TWOPI;
while (orient[i][0] > MY_PI) orient[i][0] -= TWOPI;
if (orientflag == 4) orient[i][1] = orient[i][2] = orient[i][3] = 0.0;
} else if (eflags[i] & TRIANGLE) {
quatatom = tbonus[tri[i]].quat;
MathExtra::qconjugate(quat[ibody],qc);
MathExtra::quatquat(qc,quatatom,orient[i]);
MathExtra::qnormalize(orient[i]);
} else if (orientflag == 4) {
orient[i][0] = orient[i][1] = orient[i][2] = orient[i][3] = 0.0;
} else if (orientflag == 1)
orient[i][0] = 0.0;
if (eflags[i] & DIPOLE) {
MathExtra::transpose_matvec(ex_space[ibody],ey_space[ibody],
ez_space[ibody],mu[i],dorient[i]);
MathExtra::snormalize3(mu[i][3],dorient[i],dorient[i]);
} else if (dorientflag)
dorient[i][0] = dorient[i][1] = dorient[i][2] = 0.0;
}
}
// test for valid principal moments & axes
// recompute moments of inertia around new axes
// 3 diagonal moments should equal principal moments
// 3 off-diagonal moments should be 0.0
// extended particles may contribute extra terms to moments of inertia
for (ibody = 0; ibody < nbody; ibody++)
for (i = 0; i < 6; i++) sum[ibody][i] = 0.0;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
sum[ibody][0] += massone *
(displace[i][1]*displace[i][1] + displace[i][2]*displace[i][2]);
sum[ibody][1] += massone *
(displace[i][0]*displace[i][0] + displace[i][2]*displace[i][2]);
sum[ibody][2] += massone *
(displace[i][0]*displace[i][0] + displace[i][1]*displace[i][1]);
sum[ibody][3] -= massone * displace[i][1]*displace[i][2];
sum[ibody][4] -= massone * displace[i][0]*displace[i][2];
sum[ibody][5] -= massone * displace[i][0]*displace[i][1];
}
if (extended) {
double ivec[6];
double *shape,*inertiaatom;
double length;
for (i = 0; i < nlocal; i++) {
if (body[i] < 0) continue;
ibody = body[i];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
if (eflags[i] & SPHERE) {
sum[ibody][0] += SINERTIA*massone * radius[i]*radius[i];
sum[ibody][1] += SINERTIA*massone * radius[i]*radius[i];
sum[ibody][2] += SINERTIA*massone * radius[i]*radius[i];
} else if (eflags[i] & ELLIPSOID) {
shape = ebonus[ellipsoid[i]].shape;
MathExtra::inertia_ellipsoid(shape,orient[i],massone,ivec);
sum[ibody][0] += ivec[0];
sum[ibody][1] += ivec[1];
sum[ibody][2] += ivec[2];
sum[ibody][3] += ivec[3];
sum[ibody][4] += ivec[4];
sum[ibody][5] += ivec[5];
} else if (eflags[i] & LINE) {
length = lbonus[line[i]].length;
MathExtra::inertia_line(length,orient[i][0],massone,ivec);
sum[ibody][0] += ivec[0];
sum[ibody][1] += ivec[1];
sum[ibody][2] += ivec[2];
sum[ibody][3] += ivec[3];
sum[ibody][4] += ivec[4];
sum[ibody][5] += ivec[5];
} else if (eflags[i] & TRIANGLE) {
inertiaatom = tbonus[tri[i]].inertia;
MathExtra::inertia_triangle(inertiaatom,orient[i],massone,ivec);
sum[ibody][0] += ivec[0];
sum[ibody][1] += ivec[1];
sum[ibody][2] += ivec[2];
sum[ibody][3] += ivec[3];
sum[ibody][4] += ivec[4];
sum[ibody][5] += ivec[5];
}
}
}
MPI_Allreduce(sum[0],all[0],6*nbody,MPI_DOUBLE,MPI_SUM,world);
// error check that re-computed momemts of inertia match diagonalized ones
// do not do test for bodies with params read from infile
double norm;
for (ibody = 0; ibody < nbody; ibody++) {
if (infile && inbody[ibody]) continue;
if (inertia[ibody][0] == 0.0) {
if (fabs(all[ibody][0]) > TOLERANCE)
error->all(FLERR,"Fix rigid: Bad principal moments");
} else {
if (fabs((all[ibody][0]-inertia[ibody][0])/inertia[ibody][0]) >
TOLERANCE) error->all(FLERR,"Fix rigid: Bad principal moments");
}
if (inertia[ibody][1] == 0.0) {
if (fabs(all[ibody][1]) > TOLERANCE)
error->all(FLERR,"Fix rigid: Bad principal moments");
} else {
if (fabs((all[ibody][1]-inertia[ibody][1])/inertia[ibody][1]) >
TOLERANCE) error->all(FLERR,"Fix rigid: Bad principal moments");
}
if (inertia[ibody][2] == 0.0) {
if (fabs(all[ibody][2]) > TOLERANCE)
error->all(FLERR,"Fix rigid: Bad principal moments");
} else {
if (fabs((all[ibody][2]-inertia[ibody][2])/inertia[ibody][2]) >
TOLERANCE) error->all(FLERR,"Fix rigid: Bad principal moments");
}
norm = (inertia[ibody][0] + inertia[ibody][1] + inertia[ibody][2]) / 3.0;
if (fabs(all[ibody][3]/norm) > TOLERANCE ||
fabs(all[ibody][4]/norm) > TOLERANCE ||
fabs(all[ibody][5]/norm) > TOLERANCE)
error->all(FLERR,"Fix rigid: Bad principal moments");
}
if (infile) memory->destroy(inbody);
}
/* ----------------------------------------------------------------------
read per rigid body info from user-provided file
which = 0 to read total mass and center-of-mass, store in vec and array
which = 1 to read 6 moments of inertia, store in array
flag inbody = 0 for bodies whose info is read from file
nlines = # of lines of rigid body info
one line = rigid-ID mass xcm ycm zcm ixx iyy izz ixy ixz iyz
------------------------------------------------------------------------- */
void FixRigid::readfile(int which, double *vec, double **array, int *inbody)
{
int i,j,m,nchunk,id,eofflag;
int nlines;
FILE *fp;
char *eof,*start,*next,*buf;
char line[MAXLINE];
if (me == 0) {
fp = fopen(infile,"r");
if (fp == NULL) {
char str[128];
sprintf(str,"Cannot open fix rigid infile %s",infile);
error->one(FLERR,str);
}
while (1) {
eof = fgets(line,MAXLINE,fp);
if (eof == NULL) error->one(FLERR,"Unexpected end of fix rigid file");
start = &line[strspn(line," \t\n\v\f\r")];
if (*start != '\0' && *start != '#') break;
}
sscanf(line,"%d",&nlines);
}
MPI_Bcast(&nlines,1,MPI_INT,0,world);
char *buffer = new char[CHUNK*MAXLINE];
char **values = new char*[ATTRIBUTE_PERBODY];
int nread = 0;
while (nread < nlines) {
nchunk = MIN(nlines-nread,CHUNK);
eofflag = comm->read_lines_from_file(fp,nchunk,MAXLINE,buffer);
- if (eofflag) error->all(FLERR,"Unexpected end of data file");
+ if (eofflag) error->all(FLERR,"Unexpected end of fix rigid file");
buf = buffer;
next = strchr(buf,'\n');
*next = '\0';
int nwords = atom->count_words(buf);
*next = '\n';
if (nwords != ATTRIBUTE_PERBODY)
error->all(FLERR,"Incorrect rigid body format in fix rigid file");
// loop over lines of rigid body attributes
// tokenize the line into values
// id = rigid body ID
// use ID as-is for SINGLE, as mol-ID for MOLECULE, as-is for GROUP
// for which = 0, store mass/com in vec/array
// for which = 1, store interia tensor array, invert 3,4,5 values to Voigt
for (int i = 0; i < nchunk; i++) {
next = strchr(buf,'\n');
values[0] = strtok(buf," \t\n\r\f");
for (j = 1; j < nwords; j++)
values[j] = strtok(NULL," \t\n\r\f");
id = atoi(values[0]);
if (rstyle == MOLECULE) {
if (id <= 0 || id > maxmol)
error->all(FLERR,"Invalid rigid body ID in fix rigid file");
id = mol2body[id];
} else id--;
if (id < 0 || id >= nbody)
error->all(FLERR,"Invalid rigid body ID in fix rigid file");
inbody[id] = 1;
if (which == 0) {
vec[id] = atof(values[1]);
array[id][0] = atof(values[2]);
array[id][1] = atof(values[3]);
array[id][2] = atof(values[4]);
} else {
array[id][0] = atof(values[5]);
array[id][1] = atof(values[6]);
array[id][2] = atof(values[7]);
array[id][3] = atof(values[10]);
array[id][4] = atof(values[9]);
array[id][5] = atof(values[8]);
}
buf = next + 1;
}
nread += nchunk;
}
if (me == 0) fclose(fp);
delete [] buffer;
delete [] values;
}
+/* ----------------------------------------------------------------------
+ write out restart info for mass, COM, inertia tensor to file
+ identical format to infile option, so info can be read in when restarting
+ only proc 0 writes list of global bodies to file
+------------------------------------------------------------------------- */
+
+void FixRigid::write_restart_file(char *file)
+{
+ if (me) return;
+
+ char outfile[128];
+ sprintf(outfile,"%s.rigid",file);
+ FILE *fp = fopen(outfile,"w");
+ if (fp == NULL) {
+ char str[128];
+ sprintf(str,"Cannot open fix rigid restart file %s",outfile);
+ error->one(FLERR,str);
+ }
+
+ fprintf(fp,"fix rigid mass, COM, inertia tensor info for "
+ "%d bodies on timestep " BIGINT_FORMAT "\n\n",
+ nbody,update->ntimestep);
+ fprintf(fp,"%d\n",nbody);
+
+ // compute I tensor against xyz axes from diagonalized I and current quat
+ // Ispace = P Idiag P_transpose
+ // P is stored column-wise in exyz_space
+
+ double p[3][3],pdiag[3][3],ispace[3][3];
+
+ int id;
+ for (int i = 0; i < nbody; i++) {
+ if (rstyle == SINGLE || rstyle == GROUP) id = i;
+ else id = body2mol[i];
+
+ MathExtra::col2mat(ex_space[i],ey_space[i],ez_space[i],p);
+ MathExtra::times3_diag(p,inertia[i],pdiag);
+ MathExtra::times3_transpose(pdiag,p,ispace);
+
+ fprintf(fp,"%d %-1.16e %-1.16e %-1.16e %-1.16e "
+ "%-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e\n",
+ id,masstotal[i],xcm[i][0],xcm[i][1],xcm[i][2],
+ ispace[0][0],ispace[1][1],ispace[2][2],
+ ispace[0][1],ispace[0][2],ispace[1][2]);
+ }
+
+ fclose(fp);
+}
+
/* ----------------------------------------------------------------------
memory usage of local atom-based arrays
------------------------------------------------------------------------- */
double FixRigid::memory_usage()
{
int nmax = atom->nmax;
double bytes = nmax * sizeof(int);
bytes += nmax*3 * sizeof(double);
bytes += maxvatom*6 * sizeof(double); // vatom
if (extended) {
bytes += nmax * sizeof(int);
if (orientflag) bytes = nmax*orientflag * sizeof(double);
if (dorientflag) bytes = nmax*3 * sizeof(double);
}
return bytes;
}
/* ----------------------------------------------------------------------
allocate local atom-based arrays
------------------------------------------------------------------------- */
void FixRigid::grow_arrays(int nmax)
{
memory->grow(body,nmax,"rigid:body");
memory->grow(displace,nmax,3,"rigid:displace");
if (extended) {
memory->grow(eflags,nmax,"rigid:eflags");
if (orientflag) memory->grow(orient,nmax,orientflag,"rigid:orient");
if (dorientflag) memory->grow(dorient,nmax,3,"rigid:dorient");
}
}
/* ----------------------------------------------------------------------
copy values within local atom-based arrays
------------------------------------------------------------------------- */
void FixRigid::copy_arrays(int i, int j, int delflag)
{
body[j] = body[i];
displace[j][0] = displace[i][0];
displace[j][1] = displace[i][1];
displace[j][2] = displace[i][2];
if (extended) {
eflags[j] = eflags[i];
for (int k = 0; k < orientflag; k++)
orient[j][k] = orient[i][k];
if (dorientflag) {
dorient[j][0] = dorient[i][0];
dorient[j][1] = dorient[i][1];
dorient[j][2] = dorient[i][2];
}
}
}
/* ----------------------------------------------------------------------
initialize one atom's array values, called when atom is created
------------------------------------------------------------------------- */
void FixRigid::set_arrays(int i)
{
body[i] = -1;
displace[i][0] = 0.0;
displace[i][1] = 0.0;
displace[i][2] = 0.0;
}
/* ----------------------------------------------------------------------
pack values in local atom-based arrays for exchange with another proc
------------------------------------------------------------------------- */
int FixRigid::pack_exchange(int i, double *buf)
{
buf[0] = body[i];
buf[1] = displace[i][0];
buf[2] = displace[i][1];
buf[3] = displace[i][2];
if (!extended) return 4;
int m = 4;
buf[m++] = eflags[i];
for (int j = 0; j < orientflag; j++)
buf[m++] = orient[i][j];
if (dorientflag) {
buf[m++] = dorient[i][0];
buf[m++] = dorient[i][1];
buf[m++] = dorient[i][2];
}
return m;
}
/* ----------------------------------------------------------------------
unpack values in local atom-based arrays from exchange with another proc
------------------------------------------------------------------------- */
int FixRigid::unpack_exchange(int nlocal, double *buf)
{
body[nlocal] = static_cast<int> (buf[0]);
displace[nlocal][0] = buf[1];
displace[nlocal][1] = buf[2];
displace[nlocal][2] = buf[3];
if (!extended) return 4;
int m = 4;
eflags[nlocal] = static_cast<int> (buf[m++]);
for (int j = 0; j < orientflag; j++)
orient[nlocal][j] = buf[m++];
if (dorientflag) {
dorient[nlocal][0] = buf[m++];
dorient[nlocal][1] = buf[m++];
dorient[nlocal][2] = buf[m++];
}
return m;
}
/* ---------------------------------------------------------------------- */
void FixRigid::reset_dt()
{
dtv = update->dt;
dtf = 0.5 * update->dt * force->ftm2v;
dtq = 0.5 * update->dt;
}
/* ----------------------------------------------------------------------
return temperature of collection of rigid bodies
non-active DOF are removed by fflag/tflag and in tfactor
------------------------------------------------------------------------- */
double FixRigid::compute_scalar()
{
double wbody[3],rot[3][3];
double t = 0.0;
for (int i = 0; i < nbody; i++) {
t += masstotal[i] * (fflag[i][0]*vcm[i][0]*vcm[i][0] +
fflag[i][1]*vcm[i][1]*vcm[i][1] +
fflag[i][2]*vcm[i][2]*vcm[i][2]);
// wbody = angular velocity in body frame
MathExtra::quat_to_mat(quat[i],rot);
MathExtra::transpose_matvec(rot,angmom[i],wbody);
if (inertia[i][0] == 0.0) wbody[0] = 0.0;
else wbody[0] /= inertia[i][0];
if (inertia[i][1] == 0.0) wbody[1] = 0.0;
else wbody[1] /= inertia[i][1];
if (inertia[i][2] == 0.0) wbody[2] = 0.0;
else wbody[2] /= inertia[i][2];
t += tflag[i][0]*inertia[i][0]*wbody[0]*wbody[0] +
tflag[i][1]*inertia[i][1]*wbody[1]*wbody[1] +
tflag[i][2]*inertia[i][2]*wbody[2]*wbody[2];
}
t *= tfactor;
return t;
}
/* ---------------------------------------------------------------------- */
void *FixRigid::extract(const char *str, int &dim)
{
if (strcmp(str,"body") == 0) {
dim = 1;
return body;
}
if (strcmp(str,"masstotal") == 0) {
dim = 1;
return masstotal;
}
if (strcmp(str,"t_target") == 0) {
dim = 0;
return &t_target;
}
return NULL;
}
/* ----------------------------------------------------------------------
return attributes of a rigid body
15 values per body
xcm = 0,1,2; vcm = 3,4,5; fcm = 6,7,8; torque = 9,10,11; image = 12,13,14
------------------------------------------------------------------------- */
double FixRigid::compute_array(int i, int j)
{
if (j < 3) return xcm[i][j];
if (j < 6) return vcm[i][j-3];
if (j < 9) return fcm[i][j-6];
if (j < 12) return torque[i][j-9];
if (j == 12) return (imagebody[i] & IMGMASK) - IMGMAX;
if (j == 13) return (imagebody[i] >> IMGBITS & IMGMASK) - IMGMAX;
return (imagebody[i] >> IMG2BITS) - IMGMAX;
}
diff --git a/src/RIGID/fix_rigid.h b/src/RIGID/fix_rigid.h
index 8d01401bd..6b86d677d 100644
--- a/src/RIGID/fix_rigid.h
+++ b/src/RIGID/fix_rigid.h
@@ -1,240 +1,242 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef FIX_CLASS
FixStyle(rigid,FixRigid)
#else
#ifndef LMP_FIX_RIGID_H
#define LMP_FIX_RIGID_H
#include "fix.h"
namespace LAMMPS_NS {
class FixRigid : public Fix {
public:
FixRigid(class LAMMPS *, int, char **);
virtual ~FixRigid();
virtual int setmask();
virtual void init();
virtual void setup(int);
virtual void initial_integrate(int);
void post_force(int);
virtual void final_integrate();
void initial_integrate_respa(int, int, int);
void final_integrate_respa(int, int);
+ void write_restart_file(char *);
virtual double compute_scalar();
virtual int modify_param(int, char **) {return 0;}
double memory_usage();
void grow_arrays(int);
void copy_arrays(int, int, int);
void set_arrays(int);
int pack_exchange(int, double *);
int unpack_exchange(int, double *);
void pre_neighbor();
int dof(int);
void deform(int);
void reset_dt();
virtual void *extract(const char*,int &);
double compute_array(int, int);
protected:
int me,nprocs;
double dtv,dtf,dtq;
double *step_respa;
int triclinic;
double MINUSPI,TWOPI;
char *infile; // file to read rigid body attributes from
int rstyle; // SINGLE,MOLECULE,GROUP
int firstflag; // 1 for first-time setup of rigid bodies
int dimension; // # of dimensions
int nbody; // # of rigid bodies
int *nrigid; // # of atoms in each rigid body
int *mol2body; // convert mol-ID to rigid body index
+ int *body2mol; // convert rigid body index to mol-ID
int maxmol; // size of mol2body = max mol-ID
int *body; // which body each atom is part of (-1 if none)
double **displace; // displacement of each atom in body coords
double *masstotal; // total mass of each rigid body
double **xcm; // coords of center-of-mass of each rigid body
double **vcm; // velocity of center-of-mass of each
double **fcm; // force on center-of-mass of each
double **inertia; // 3 principal components of inertia of each
double **ex_space,**ey_space,**ez_space;
// principal axes of each in space coords
double **angmom; // angular momentum of each in space coords
double **omega; // angular velocity of each in space coords
double **torque; // torque on each rigid body in space coords
double **quat; // quaternion of each rigid body
tagint *imagebody; // image flags of xcm of each rigid body
double **fflag; // flag for on/off of center-of-mass force
double **tflag; // flag for on/off of center-of-mass torque
double **langextra; // Langevin thermostat forces and torques
double **sum,**all; // work vectors for each rigid body
int **remapflag; // PBC remap flags for each rigid body
int extended; // 1 if any particles have extended attributes
int orientflag; // 1 if particles store spatial orientation
int dorientflag; // 1 if particles store dipole orientation
int *eflags; // flags for extended particles
double **orient; // orientation vector of particle wrt rigid body
double **dorient; // orientation of dipole mu wrt rigid body
double tfactor; // scale factor on temperature of rigid bodies
int langflag; // 0/1 = no/yes Langevin thermostat
int tstat_flag; // NVT settings
double t_start,t_stop,t_target;
double t_period,t_freq;
int t_chain,t_iter,t_order;
int pstat_flag; // NPT settings
double p_start[3],p_stop[3];
double p_period[3],p_freq[3];
int p_flag[3];
int pcouple,pstyle;
int p_chain;
int allremap; // remap all atoms
int dilate_group_bit; // mask for dilation group
char *id_dilate; // group name to dilate
class RanMars *random;
class AtomVecEllipsoid *avec_ellipsoid;
class AtomVecLine *avec_line;
class AtomVecTri *avec_tri;
int POINT,SPHERE,ELLIPSOID,LINE,TRIANGLE,DIPOLE; // bitmasks for eflags
int OMEGA,ANGMOM,TORQUE;
void no_squish_rotate(int, double *, double *, double *, double) const;
void set_xv();
void set_v();
void setup_bodies();
void readfile(int, double *, double **, int *);
};
}
#endif
#endif
/* ERROR/WARNING messages:
E: Illegal ... command
Self-explanatory. Check the input script syntax and compare to the
documentation for the command. You can use -echo screen as a
command-line option when running LAMMPS to see the offending line.
E: Fix rigid molecule requires atom attribute molecule
Self-explanatory.
E: Could not find fix rigid group ID
A group ID used in the fix rigid command does not exist.
E: One or more atoms belong to multiple rigid bodies
Two or more rigid bodies defined by the fix rigid command cannot
contain the same atom.
E: No rigid bodies defined
The fix specification did not end up defining any rigid bodies.
E: Fix rigid z force cannot be on for 2d simulation
Self-explanatory.
E: Fix rigid xy torque cannot be on for 2d simulation
Self-explanatory.
E: Fix rigid langevin period must be > 0.0
Self-explanatory.
E: Fix rigid npt/nph dilate group ID does not exist
Self-explanatory.
E: One or zero atoms in rigid body
Any rigid body defined by the fix rigid command must contain 2 or more
atoms.
W: More than one fix rigid
It is not efficient to use fix rigid more than once.
E: Rigid fix must come before NPT/NPH fix
NPT/NPH fix must be defined in input script after all rigid fixes,
else the rigid fix contribution to the pressure virial is
incorrect.
W: Cannot count rigid body degrees-of-freedom before bodies are fully initialized
UNDOCUMENTED
W: Computing temperature of portions of rigid bodies
The group defined by the temperature compute does not encompass all
the atoms in one or more rigid bodies, so the change in
degrees-of-freedom for the atoms in those partial rigid bodies will
not be accounted for.
E: Fix rigid atom has non-zero image flag in a non-periodic dimension
Image flags for non-periodic dimensions should not be set.
E: Insufficient Jacobi rotations for rigid body
Eigensolve for rigid body was not sufficiently accurate.
E: Fix rigid: Bad principal moments
The principal moments of inertia computed for a rigid body
are not within the required tolerances.
E: Cannot open fix rigid infile %s
The specified file cannot be opened. Check that the path and name are
correct.
E: Unexpected end of fix rigid file
A read operation from the file failed.
E: Incorrect rigid body format in fix rigid file
The number of fields per line is not what expected.
E: Invalid rigid body ID in fix rigid file
The ID does not match the number or an existing ID of rigid bodies
that are defined by the fix rigid command.
*/
diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp
index cf6a6db26..2e589a730 100644
--- a/src/RIGID/fix_rigid_small.cpp
+++ b/src/RIGID/fix_rigid_small.cpp
@@ -1,2851 +1,2961 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "math.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "fix_rigid_small.h"
#include "math_extra.h"
#include "atom.h"
#include "atom_vec_ellipsoid.h"
#include "atom_vec_line.h"
#include "atom_vec_tri.h"
#include "domain.h"
#include "update.h"
#include "respa.h"
#include "modify.h"
#include "group.h"
#include "comm.h"
#include "force.h"
#include "output.h"
#include "random_mars.h"
#include "math_const.h"
#include "memory.h"
#include "error.h"
#include <map>
using namespace LAMMPS_NS;
using namespace FixConst;
using namespace MathConst;
// allocate space for static class variable
FixRigidSmall *FixRigidSmall::frsptr;
#define MAXLINE 256
#define CHUNK 1024
#define ATTRIBUTE_PERBODY 11
#define TOLERANCE 1.0e-6
#define EPSILON 1.0e-7
#define BIG 1.0e20
#define SINERTIA 0.4 // moment of inertia prefactor for sphere
#define EINERTIA 0.4 // moment of inertia prefactor for ellipsoid
#define LINERTIA (1.0/12.0) // moment of inertia prefactor for line segment
#define DELTA_BODY 10000
enum{FULL_BODY,INITIAL,FINAL,FORCE_TORQUE,VCM_ANGMOM,XCM_MASS,ITENSOR,DOF};
/* ---------------------------------------------------------------------- */
FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg)
{
int i;
scalar_flag = 1;
extscalar = 0;
global_freq = 1;
time_integrate = 1;
rigid_flag = 1;
virial_flag = 1;
create_attribute = 1;
MPI_Comm_rank(world,&me);
MPI_Comm_size(world,&nprocs);
// perform initial allocation of atom-based arrays
// register with Atom class
extended = orientflag = dorientflag = 0;
bodyown = NULL;
bodytag = NULL;
atom2body = NULL;
displace = NULL;
eflags = NULL;
orient = NULL;
dorient = NULL;
grow_arrays(atom->nmax);
atom->add_callback(0);
// parse args for rigid body specification
if (narg < 4) error->all(FLERR,"Illegal fix rigid/small command");
if (strcmp(arg[3],"molecule") != 0)
error->all(FLERR,"Illegal fix rigid/small command");
// maxmol = largest molecule #
int *mask = atom->mask;
int *molecule = atom->molecule;
int nlocal = atom->nlocal;
maxmol = -1;
for (i = 0; i < nlocal; i++)
if (mask[i] & groupbit) maxmol = MAX(maxmol,molecule[i]);
int itmp;
MPI_Allreduce(&maxmol,&itmp,1,MPI_INT,MPI_MAX,world);
maxmol = itmp;
// parse optional args
int seed;
langflag = 0;
infile = NULL;
int iarg = 4;
while (iarg < narg) {
if (strcmp(arg[iarg],"langevin") == 0) {
if (iarg+5 > narg) error->all(FLERR,"Illegal fix rigid/small command");
if (strcmp(style,"rigid/small") != 0)
error->all(FLERR,"Illegal fix rigid/small command");
langflag = 1;
t_start = force->numeric(FLERR,arg[iarg+1]);
t_stop = force->numeric(FLERR,arg[iarg+2]);
t_period = force->numeric(FLERR,arg[iarg+3]);
seed = force->inumeric(FLERR,arg[iarg+4]);
if (t_period <= 0.0)
error->all(FLERR,"Fix rigid/small langevin period must be > 0.0");
if (seed <= 0) error->all(FLERR,"Illegal fix rigid/small command");
iarg += 5;
} else if (strcmp(arg[iarg],"infile") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid/small command");
delete [] infile;
int n = strlen(arg[iarg+1]) + 1;
infile = new char[n];
strcpy(infile,arg[iarg+1]);
+ restart_file = 1;
iarg += 2;
} else error->all(FLERR,"Illegal fix rigid/small command");
}
// create rigid bodies based on molecule ID
// sets bodytag for owned atoms
// body attributes are computed later by setup_bodies()
if (atom->molecule_flag == 0)
error->all(FLERR,"Fix rigid/small requires atom attribute molecule");
if (atom->map_style == 0)
error->all(FLERR,"Fix rigid/small requires an atom map, see atom_modify");
create_bodies();
// set nlocal_body and allocate bodies I own
int *tag = atom->tag;
nlocal_body = nghost_body = 0;
for (i = 0; i < nlocal; i++)
if (bodytag[i] == tag[i]) nlocal_body++;
nmax_body = 0;
while (nmax_body < nlocal_body) nmax_body += DELTA_BODY;
body = (Body *) memory->smalloc(nmax_body*sizeof(Body),
"rigid/small:body");
// set bodyown for owned atoms
nlocal_body = 0;
for (i = 0; i < nlocal; i++)
if (bodytag[i] == tag[i]) {
body[nlocal_body].ilocal = i;
bodyown[i] = nlocal_body++;
} else bodyown[i] = -1;
// bodysize = sizeof(Body) in doubles
bodysize = sizeof(Body)/sizeof(double);
if (bodysize*sizeof(double) != sizeof(Body)) bodysize++;
// set max comm sizes needed by this fix
comm_forward = 1 + bodysize;
comm_reverse = 6;
// bitmasks for properties of extended particles
POINT = 1;
SPHERE = 2;
ELLIPSOID = 4;
LINE = 8;
TRIANGLE = 16;
DIPOLE = 32;
OMEGA = 64;
ANGMOM = 128;
TORQUE = 256;
MINUSPI = -MY_PI;
TWOPI = 2.0*MY_PI;
// atom style pointers to particles that store extra info
avec_ellipsoid = (AtomVecEllipsoid *) atom->style_match("ellipsoid");
avec_line = (AtomVecLine *) atom->style_match("line");
avec_tri = (AtomVecTri *) atom->style_match("tri");
// print statistics
int one = 0;
bigint atomone = 0;
for (int i = 0; i < nlocal; i++) {
if (bodyown[i] >= 0) one++;
if (bodytag[i] > 0) atomone++;
}
MPI_Allreduce(&one,&nbody,1,MPI_INT,MPI_SUM,world);
bigint atomall;
MPI_Allreduce(&atomone,&atomall,1,MPI_LMP_BIGINT,MPI_SUM,world);
if (nbody == 0) error->all(FLERR,"No rigid bodies defined");
if (me == 0) {
if (screen) {
fprintf(screen,"%d rigid bodies with " BIGINT_FORMAT " atoms\n",
nbody,atomall);
fprintf(screen," %g = max distance from body owner to body atom\n",
maxextent);
}
if (logfile) {
fprintf(logfile,"%d rigid bodies with " BIGINT_FORMAT " atoms\n",
nbody,atomall);
fprintf(logfile," %g = max distance from body owner to body atom\n",
maxextent);
}
}
// initialize Marsaglia RNG with processor-unique seed
maxlang = 0;
langextra = NULL;
random = NULL;
if (langflag) random = new RanMars(lmp,seed + comm->me);
// mass vector for granular pair styles
mass_body = NULL;
nmax_mass = 0;
// firstflag = 1 triggers one-time initialization of rigid body attributes
firstflag = 1;
}
/* ---------------------------------------------------------------------- */
FixRigidSmall::~FixRigidSmall()
{
// unregister callbacks to this fix from Atom class
atom->delete_callback(id,0);
// delete locally stored arrays
memory->sfree(body);
memory->destroy(bodyown);
memory->destroy(bodytag);
memory->destroy(atom2body);
memory->destroy(displace);
memory->destroy(eflags);
memory->destroy(orient);
memory->destroy(dorient);
delete random;
delete [] infile;
memory->destroy(langextra);
memory->destroy(mass_body);
}
/* ---------------------------------------------------------------------- */
int FixRigidSmall::setmask()
{
int mask = 0;
mask |= INITIAL_INTEGRATE;
mask |= FINAL_INTEGRATE;
if (langflag) mask |= POST_FORCE;
mask |= PRE_NEIGHBOR;
mask |= INITIAL_INTEGRATE_RESPA;
mask |= FINAL_INTEGRATE_RESPA;
return mask;
}
/* ---------------------------------------------------------------------- */
void FixRigidSmall::init()
{
int i;
triclinic = domain->triclinic;
// warn if more than one rigid fix
int count = 0;
for (i = 0; i < modify->nfix; i++)
if (strcmp(modify->fix[i]->style,"rigid") == 0) count++;
if (count > 1 && me == 0) error->warning(FLERR,"More than one fix rigid");
// error if npt,nph fix comes before rigid fix
for (i = 0; i < modify->nfix; i++) {
if (strcmp(modify->fix[i]->style,"npt") == 0) break;
if (strcmp(modify->fix[i]->style,"nph") == 0) break;
}
if (i < modify->nfix) {
for (int j = i; j < modify->nfix; j++)
if (strcmp(modify->fix[j]->style,"rigid") == 0)
error->all(FLERR,"Rigid fix must come before NPT/NPH fix");
}
// timestep info
dtv = update->dt;
dtf = 0.5 * update->dt * force->ftm2v;
dtq = 0.5 * update->dt;
if (strstr(update->integrate_style,"respa"))
step_respa = ((Respa *) update->integrate)->step;
}
/* ----------------------------------------------------------------------
one-time initialization of rigid body attributes via local comm
extended flags, mass, COM, inertia tensor, displacement of each atom
- require communication stencil have been setup by comm->borders()
+ requires communication stencil has been setup by comm->borders()
------------------------------------------------------------------------- */
void FixRigidSmall::setup_pre_neighbor()
{
if (firstflag) {
firstflag = 0;
setup_bodies();
} else pre_neighbor();
}
/* ---------------------------------------------------------------------- */
void FixRigidSmall::setup(int vflag)
{
int i,n,ibody;
double massone,radone;
//check(1);
// sum vcm, fcm, angmom, torque across all rigid bodies
// vcm = velocity of COM
// fcm = force on COM
// angmom = angular momentum around COM
// torque = torque around COM
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int *image = atom->image;
int nlocal = atom->nlocal;
double *xcm,*vcm,*fcm,*acm,*tcm;
double dx,dy,dz;
double unwrap[3];
for (ibody = 0; ibody < nlocal_body+nghost_body; ibody++) {
vcm = body[ibody].vcm;
vcm[0] = vcm[1] = vcm[2] = 0.0;
fcm = body[ibody].fcm;
fcm[0] = fcm[1] = fcm[2] = 0.0;
acm = body[ibody].angmom;
acm[0] = acm[1] = acm[2] = 0.0;
tcm = body[ibody].torque;
tcm[0] = tcm[1] = tcm[2] = 0.0;
}
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
Body *b = &body[atom2body[i]];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
vcm = b->vcm;
vcm[0] += v[i][0] * massone;
vcm[1] += v[i][1] * massone;
vcm[2] += v[i][2] * massone;
fcm = b->fcm;
fcm[0] += f[i][0];
fcm[1] += f[i][1];
fcm[2] += f[i][2];
domain->unmap(x[i],image[i],unwrap);
xcm = b->xcm;
dx = unwrap[0] - xcm[0];
dy = unwrap[1] - xcm[1];
dz = unwrap[2] - xcm[2];
acm = b->angmom;
acm[0] += dy * massone*v[i][2] - dz * massone*v[i][1];
acm[1] += dz * massone*v[i][0] - dx * massone*v[i][2];
acm[2] += dx * massone*v[i][1] - dy * massone*v[i][0];
tcm = b->torque;
tcm[0] += dy * f[i][2] - dz * f[i][1];
tcm[1] += dz * f[i][0] - dx * f[i][2];
tcm[2] += dx * f[i][1] - dy * f[i][0];
}
// extended particles add their rotation/torque to angmom/torque of body
if (extended) {
AtomVecLine::Bonus *lbonus;
if (avec_line) lbonus = avec_line->bonus;
double **omega = atom->omega;
double **angmom = atom->angmom;
double **torque = atom->torque;
double *radius = atom->radius;
int *line = atom->line;
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
Body *b = &body[atom2body[i]];
if (eflags[i] & OMEGA) {
if (eflags[i] & SPHERE) {
radone = radius[i];
acm = b->angmom;
acm[0] += SINERTIA*rmass[i] * radone*radone * omega[i][0];
acm[1] += SINERTIA*rmass[i] * radone*radone * omega[i][1];
acm[2] += SINERTIA*rmass[i] * radone*radone * omega[i][2];
} else if (eflags[i] & LINE) {
radone = lbonus[line[i]].length;
b->angmom[2] += LINERTIA*rmass[i] * radone*radone * omega[i][2];
}
}
if (eflags[i] & ANGMOM) {
acm = b->angmom;
acm[0] += angmom[i][0];
acm[1] += angmom[i][1];
acm[2] += angmom[i][2];
}
if (eflags[i] & TORQUE) {
tcm = b->torque;
tcm[0] += torque[i][0];
tcm[1] += torque[i][1];
tcm[2] += torque[i][2];
}
}
}
// reverse communicate vcm, fcm, angmom, torque of all bodies
commflag = VCM_ANGMOM;
comm->reverse_comm_variable_fix(this);
commflag = FORCE_TORQUE;
comm->reverse_comm_variable_fix(this);
// normalize velocity of COM
for (ibody = 0; ibody < nlocal_body; ibody++) {
vcm = body[ibody].vcm;
vcm[0] /= body[ibody].mass;
vcm[1] /= body[ibody].mass;
vcm[2] /= body[ibody].mass;
}
// virial setup before call to set_v
if (vflag) v_setup(vflag);
else evflag = 0;
// compute and forward communicate updated info of all bodies
for (ibody = 0; ibody < nlocal_body; ibody++) {
Body *b = &body[ibody];
MathExtra::angmom_to_omega(b->angmom,b->ex_space,b->ey_space,
b->ez_space,b->inertia,b->omega);
}
commflag = FINAL;
comm->forward_comm_variable_fix(this);
// set velocity/rotation of atoms in rigid bodues
set_v();
// guesstimate virial as 2x the set_v contribution
if (vflag_global)
for (n = 0; n < 6; n++) virial[n] *= 2.0;
if (vflag_atom) {
for (i = 0; i < nlocal; i++)
for (n = 0; n < 6; n++)
vatom[i][n] *= 2.0;
}
}
/* ---------------------------------------------------------------------- */
void FixRigidSmall::initial_integrate(int vflag)
{
double dtfm;
//check(2);
for (int ibody = 0; ibody < nlocal_body; ibody++) {
Body *b = &body[ibody];
// update vcm by 1/2 step
dtfm = dtf / b->mass;
b->vcm[0] += dtfm * b->fcm[0];
b->vcm[1] += dtfm * b->fcm[1];
b->vcm[2] += dtfm * b->fcm[2];
// update xcm by full step
b->xcm[0] += dtv * b->vcm[0];
b->xcm[1] += dtv * b->vcm[1];
b->xcm[2] += dtv * b->vcm[2];
// update angular momentum by 1/2 step
b->angmom[0] += dtf * b->torque[0];
b->angmom[1] += dtf * b->torque[1];
b->angmom[2] += dtf * b->torque[2];
// compute omega at 1/2 step from angmom at 1/2 step and current q
// update quaternion a full step via Richardson iteration
// returns new normalized quaternion, also updated omega at 1/2 step
// update ex,ey,ez to reflect new quaternion
MathExtra::angmom_to_omega(b->angmom,b->ex_space,b->ey_space,
b->ez_space,b->inertia,b->omega);
MathExtra::richardson(b->quat,b->angmom,b->omega,b->inertia,dtq);
MathExtra::q_to_exyz(b->quat,b->ex_space,b->ey_space,b->ez_space);
}
// virial setup before call to set_xv
if (vflag) v_setup(vflag);
else evflag = 0;
// forward communicate updated info of all bodies
commflag = INITIAL;
comm->forward_comm_variable_fix(this);
// set coords/orient and velocity/rotation of atoms in rigid bodies
set_xv();
}
/* ----------------------------------------------------------------------
apply Langevin thermostat to all 6 DOF of rigid bodies I own
unlike fix langevin, this stores extra force in extra arrays,
which are added in when final_integrate() calculates a new fcm/torque
------------------------------------------------------------------------- */
void FixRigidSmall::post_force(int vflag)
{
double gamma1,gamma2;
// grow langextra if needed
if (nlocal_body > maxlang) {
memory->destroy(langextra);
maxlang = nlocal_body + nghost_body;
memory->create(langextra,maxlang,6,"rigid/small:langextra");
}
double delta = update->ntimestep - update->beginstep;
delta /= update->endstep - update->beginstep;
double t_target = t_start + delta * (t_stop-t_start);
double tsqrt = sqrt(t_target);
double boltz = force->boltz;
double dt = update->dt;
double mvv2e = force->mvv2e;
double ftm2v = force->ftm2v;
double *vcm,*omega,*inertia;
for (int ibody = 0; ibody < nlocal_body; ibody++) {
vcm = body[ibody].vcm;
omega = body[ibody].omega;
inertia = body[ibody].inertia;
gamma1 = -body[ibody].mass / t_period / ftm2v;
gamma2 = sqrt(body[ibody].mass) * tsqrt *
sqrt(24.0*boltz/t_period/dt/mvv2e) / ftm2v;
langextra[ibody][0] = gamma1*vcm[0] + gamma2*(random->uniform()-0.5);
langextra[ibody][1] = gamma1*vcm[1] + gamma2*(random->uniform()-0.5);
langextra[ibody][2] = gamma1*vcm[2] + gamma2*(random->uniform()-0.5);
gamma1 = -1.0 / t_period / ftm2v;
gamma2 = tsqrt * sqrt(24.0*boltz/t_period/dt/mvv2e) / ftm2v;
langextra[ibody][3] = inertia[0]*gamma1*omega[0] +
sqrt(inertia[0])*gamma2*(random->uniform()-0.5);
langextra[ibody][4] = inertia[1]*gamma1*omega[1] +
sqrt(inertia[1])*gamma2*(random->uniform()-0.5);
langextra[ibody][5] = inertia[2]*gamma1*omega[2] +
sqrt(inertia[2])*gamma2*(random->uniform()-0.5);
}
}
/* ---------------------------------------------------------------------- */
void FixRigidSmall::final_integrate()
{
int i,ibody;
double dtfm;
//check(3);
// sum over atoms to get force and torque on rigid body
tagint *image = atom->image;
double **x = atom->x;
double **f = atom->f;
int nlocal = atom->nlocal;
double dx,dy,dz;
double unwrap[3];
double *xcm,*fcm,*tcm;
for (ibody = 0; ibody < nlocal_body+nghost_body; ibody++) {
fcm = body[ibody].fcm;
fcm[0] = fcm[1] = fcm[2] = 0.0;
tcm = body[ibody].torque;
tcm[0] = tcm[1] = tcm[2] = 0.0;
}
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
Body *b = &body[atom2body[i]];
fcm = b->fcm;
fcm[0] += f[i][0];
fcm[1] += f[i][1];
fcm[2] += f[i][2];
domain->unmap(x[i],image[i],unwrap);
xcm = b->xcm;
dx = unwrap[0] - xcm[0];
dy = unwrap[1] - xcm[1];
dz = unwrap[2] - xcm[2];
tcm = b->torque;
tcm[0] += dy*f[i][2] - dz*f[i][1];
tcm[1] += dz*f[i][0] - dx*f[i][2];
tcm[2] += dx*f[i][1] - dy*f[i][0];
}
// extended particles add their torque to torque of body
if (extended) {
double **torque = atom->torque;
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
if (eflags[i] & TORQUE) {
tcm = body[atom2body[i]].torque;
tcm[0] += torque[i][0];
tcm[1] += torque[i][1];
tcm[2] += torque[i][2];
}
}
}
// reverse communicate fcm, torque of all bodies
commflag = FORCE_TORQUE;
comm->reverse_comm_variable_fix(this);
// include Langevin thermostat forces and torques
if (langflag) {
for (int ibody = 0; ibody < nlocal_body; ibody++) {
fcm = body[ibody].fcm;
fcm[0] += langextra[ibody][0];
fcm[1] += langextra[ibody][1];
fcm[2] += langextra[ibody][2];
tcm = body[ibody].torque;
tcm[0] += langextra[ibody][3];
tcm[1] += langextra[ibody][4];
tcm[2] += langextra[ibody][5];
}
}
// update vcm and angmom, recompute omega
for (int ibody = 0; ibody < nlocal_body; ibody++) {
Body *b = &body[ibody];
// update vcm by 1/2 step
dtfm = dtf / b->mass;
b->vcm[0] += dtfm * b->fcm[0];
b->vcm[1] += dtfm * b->fcm[1];
b->vcm[2] += dtfm * b->fcm[2];
// update angular momentum by 1/2 step
b->angmom[0] += dtf * b->torque[0];
b->angmom[1] += dtf * b->torque[1];
b->angmom[2] += dtf * b->torque[2];
MathExtra::angmom_to_omega(b->angmom,b->ex_space,b->ey_space,
b->ez_space,b->inertia,b->omega);
}
// forward communicate updated info of all bodies
commflag = FINAL;
comm->forward_comm_variable_fix(this);
// set velocity/rotation of atoms in rigid bodies
// virial is already setup from initial_integrate
set_v();
}
/* ---------------------------------------------------------------------- */
void FixRigidSmall::initial_integrate_respa(int vflag, int ilevel, int iloop)
{
dtv = step_respa[ilevel];
dtf = 0.5 * step_respa[ilevel] * force->ftm2v;
dtq = 0.5 * step_respa[ilevel];
if (ilevel == 0) initial_integrate(vflag);
else final_integrate();
}
/* ---------------------------------------------------------------------- */
void FixRigidSmall::final_integrate_respa(int ilevel, int iloop)
{
dtf = 0.5 * step_respa[ilevel] * force->ftm2v;
final_integrate();
}
/* ----------------------------------------------------------------------
atom to processor assignments have changed,
so acquire ghost bodies and setup atom2body
remap xcm of each rigid body back into periodic simulation box
done during pre_neighbor so will be after call to pbc()
and after fix_deform::pre_exchange() may have flipped box
use domain->remap() in case xcm is far away from box
due to 1st definition of rigid body or due to box flip
if don't do this, then atoms of a body which drifts far away
from a triclinic box will be remapped back into box
with huge displacements when the box tilt changes via set_x()
adjust image flag of body and image flags of all atoms in body
------------------------------------------------------------------------- */
void FixRigidSmall::pre_neighbor()
{
// remap xcm and image flags of each body as needed
tagint original,oldimage,newimage;
for (int ibody = 0; ibody < nlocal_body; ibody++) {
Body *b = &body[ibody];
original = b->image;
domain->remap(b->xcm,b->image);
if (original == b->image) b->remapflag[3] = 0;
else {
oldimage = original & IMGMASK;
newimage = b->image & IMGMASK;
b->remapflag[0] = newimage - oldimage;
oldimage = (original >> IMGBITS) & IMGMASK;
newimage = (b->image >> IMGBITS) & IMGMASK;
b->remapflag[1] = newimage - oldimage;
oldimage = original >> IMG2BITS;
newimage = b->image >> IMG2BITS;
b->remapflag[2] = newimage - oldimage;
b->remapflag[3] = 1;
}
}
// acquire ghost bodies via forward comm
// also gets new remapflags needed for adjusting atom image flags
// reset atom2body for owned atoms
// forward comm sets atom2body for ghost atoms
nghost_body = 0;
commflag = FULL_BODY;
comm->forward_comm_variable_fix(this);
reset_atom2body();
//check(4);
// adjust image flags of any atom in a rigid body whose xcm was remapped
tagint *image = atom->image;
int nlocal = atom->nlocal;
tagint idim,otherdims;
for (int i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
Body *b = &body[atom2body[i]];
if (b->remapflag[3] == 0) continue;
if (b->remapflag[0]) {
idim = image[i] & IMGMASK;
otherdims = image[i] ^ idim;
idim -= b->remapflag[0];
idim &= IMGMASK;
image[i] = otherdims | idim;
}
if (b->remapflag[1]) {
idim = (image[i] >> IMGBITS) & IMGMASK;
otherdims = image[i] ^ (idim << IMGBITS);
idim -= b->remapflag[1];
idim &= IMGMASK;
image[i] = otherdims | (idim << IMGBITS);
}
if (b->remapflag[2]) {
idim = image[i] >> IMG2BITS;
otherdims = image[i] ^ (idim << IMG2BITS);
idim -= b->remapflag[2];
idim &= IMGMASK;
image[i] = otherdims | (idim << IMG2BITS);
}
}
}
/* ----------------------------------------------------------------------
count # of DOF removed by rigid bodies for atoms in igroup
return total count of DOF
------------------------------------------------------------------------- */
int FixRigidSmall::dof(int tgroup)
{
int i,j;
// cannot count DOF correctly unless setup_bodies() has been called
if (firstflag) {
if (comm->me == 0)
error->warning(FLERR,"Cannot count rigid body degrees-of-freedom "
"before bodies are fully initialized");
return 0;
}
int tgroupbit = group->bitmask[tgroup];
// counts = 3 values per rigid body I own
// 0 = # of point particles in rigid body and in temperature group
// 1 = # of finite-size particles in rigid body and in temperature group
// 2 = # of particles in rigid body, disregarding temperature group
memory->create(counts,nlocal_body+nghost_body,3,"rigid/small:counts");
for (int i = 0; i < nlocal_body+nghost_body; i++)
counts[i][0] = counts[i][1] = counts[i][2] = 0;
// tally counts from my owned atoms
// 0 = # of point particles in rigid body and in temperature group
// 1 = # of finite-size particles in rigid body and in temperature group
// 2 = # of particles in rigid body, disregarding temperature group
int *mask = atom->mask;
int nlocal = atom->nlocal;
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
j = atom2body[i];
counts[j][2]++;
if (mask[i] & tgroupbit) {
if (extended && eflags[i]) counts[j][1]++;
else counts[j][0]++;
}
}
commflag = DOF;
comm->reverse_comm_variable_fix(this);
// nall = count0 = # of point particles in each rigid body
// mall = count1 = # of finite-size particles in each rigid body
// warn if nall+mall != nrigid for any body included in temperature group
int flag = 0;
for (int ibody = 0; ibody < nlocal_body; ibody++) {
if (counts[ibody][0]+counts[ibody][1] > 0 &&
counts[ibody][0]+counts[ibody][1] != counts[ibody][2]) flag = 1;
}
int flagall;
MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_MAX,world);
if (flagall && me == 0)
error->warning(FLERR,"Computing temperature of portions of rigid bodies");
// remove appropriate DOFs for each rigid body wholly in temperature group
// N = # of point particles in body
// M = # of finite-size particles in body
// 3d body has 3N + 6M dof to start with
// 2d body has 2N + 3M dof to start with
// 3d point-particle body with all non-zero I should have 6 dof, remove 3N-6
// 3d point-particle body (linear) with a 0 I should have 5 dof, remove 3N-5
// 2d point-particle body should have 3 dof, remove 2N-3
// 3d body with any finite-size M should have 6 dof, remove (3N+6M) - 6
// 2d body with any finite-size M should have 3 dof, remove (2N+3M) - 3
double *inertia;
int n = 0;
if (domain->dimension == 3) {
for (int ibody = 0; ibody < nlocal_body; ibody++) {
if (counts[ibody][0]+counts[ibody][1] == counts[ibody][2]) {
n += 3*counts[ibody][0] + 6*counts[ibody][1] - 6;
inertia = body[ibody].inertia;
if (inertia[0] == 0.0 || inertia[1] == 0.0 || inertia[2] == 0.0) n++;
}
}
} else if (domain->dimension == 2) {
for (int ibody = 0; ibody < nlocal_body; ibody++)
if (counts[ibody][0]+counts[ibody][1] == counts[ibody][2])
n += 2*counts[ibody][0] + 3*counts[ibody][1] - 3;
}
memory->destroy(counts);
int nall;
MPI_Allreduce(&n,&nall,1,MPI_INT,MPI_SUM,world);
return nall;
}
/* ----------------------------------------------------------------------
adjust xcm of each rigid body due to box deformation
called by various fixes that change box size/shape
flag = 0/1 means map from box to lamda coords or vice versa
------------------------------------------------------------------------- */
void FixRigidSmall::deform(int flag)
{
if (flag == 0)
for (int ibody = 0; ibody < nlocal_body; ibody++)
domain->x2lamda(body[ibody].xcm,body[ibody].xcm);
else
for (int ibody = 0; ibody < nlocal_body; ibody++)
domain->lamda2x(body[ibody].xcm,body[ibody].xcm);
}
/* ----------------------------------------------------------------------
set space-frame coords and velocity of each atom in each rigid body
set orientation and rotation of extended particles
x = Q displace + Xcm, mapped back to periodic box
v = Vcm + (W cross (x - Xcm))
------------------------------------------------------------------------- */
void FixRigidSmall::set_xv()
{
int xbox,ybox,zbox;
double x0,x1,x2,v0,v1,v2,fc0,fc1,fc2,massone;
double ione[3],exone[3],eyone[3],ezone[3],vr[6],p[3][3];
double xprd = domain->xprd;
double yprd = domain->yprd;
double zprd = domain->zprd;
double xy = domain->xy;
double xz = domain->xz;
double yz = domain->yz;
tagint *image = atom->image;
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int nlocal = atom->nlocal;
// set x and v of each atom
for (int i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
Body *b = &body[atom2body[i]];
xbox = (image[i] & IMGMASK) - IMGMAX;
ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX;
zbox = (image[i] >> IMG2BITS) - IMGMAX;
// save old positions and velocities for virial
if (evflag) {
if (triclinic == 0) {
x0 = x[i][0] + xbox*xprd;
x1 = x[i][1] + ybox*yprd;
x2 = x[i][2] + zbox*zprd;
} else {
x0 = x[i][0] + xbox*xprd + ybox*xy + zbox*xz;
x1 = x[i][1] + ybox*yprd + zbox*yz;
x2 = x[i][2] + zbox*zprd;
}
v0 = v[i][0];
v1 = v[i][1];
v2 = v[i][2];
}
// x = displacement from center-of-mass, based on body orientation
// v = vcm + omega around center-of-mass
MathExtra::matvec(b->ex_space,b->ey_space,b->ez_space,displace[i],x[i]);
v[i][0] = b->omega[1]*x[i][2] - b->omega[2]*x[i][1] + b->vcm[0];
v[i][1] = b->omega[2]*x[i][0] - b->omega[0]*x[i][2] + b->vcm[1];
v[i][2] = b->omega[0]*x[i][1] - b->omega[1]*x[i][0] + b->vcm[2];
// add center of mass to displacement
// map back into periodic box via xbox,ybox,zbox
// for triclinic, add in box tilt factors as well
if (triclinic == 0) {
x[i][0] += b->xcm[0] - xbox*xprd;
x[i][1] += b->xcm[1] - ybox*yprd;
x[i][2] += b->xcm[2] - zbox*zprd;
} else {
x[i][0] += b->xcm[0] - xbox*xprd - ybox*xy - zbox*xz;
x[i][1] += b->xcm[1] - ybox*yprd - zbox*yz;
x[i][2] += b->xcm[2] - zbox*zprd;
}
// virial = unwrapped coords dotted into body constraint force
// body constraint force = implied force due to v change minus f external
// assume f does not include forces internal to body
// 1/2 factor b/c final_integrate contributes other half
// assume per-atom contribution is due to constraint force on that atom
if (evflag) {
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
fc0 = massone*(v[i][0] - v0)/dtf - f[i][0];
fc1 = massone*(v[i][1] - v1)/dtf - f[i][1];
fc2 = massone*(v[i][2] - v2)/dtf - f[i][2];
vr[0] = 0.5*x0*fc0;
vr[1] = 0.5*x1*fc1;
vr[2] = 0.5*x2*fc2;
vr[3] = 0.5*x0*fc1;
vr[4] = 0.5*x0*fc2;
vr[5] = 0.5*x1*fc2;
v_tally(1,&i,1.0,vr);
}
}
// set orientation, omega, angmom of each extended particle
if (extended) {
double theta_body,theta;
double *shape,*quatatom,*inertiaatom;
AtomVecEllipsoid::Bonus *ebonus;
if (avec_ellipsoid) ebonus = avec_ellipsoid->bonus;
AtomVecLine::Bonus *lbonus;
if (avec_line) lbonus = avec_line->bonus;
AtomVecTri::Bonus *tbonus;
if (avec_tri) tbonus = avec_tri->bonus;
double **omega = atom->omega;
double **angmom = atom->angmom;
double **mu = atom->mu;
int *ellipsoid = atom->ellipsoid;
int *line = atom->line;
int *tri = atom->tri;
for (int i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
Body *b = &body[atom2body[i]];
if (eflags[i] & SPHERE) {
omega[i][0] = b->omega[0];
omega[i][1] = b->omega[1];
omega[i][2] = b->omega[2];
} else if (eflags[i] & ELLIPSOID) {
shape = ebonus[ellipsoid[i]].shape;
quatatom = ebonus[ellipsoid[i]].quat;
MathExtra::quatquat(b->quat,orient[i],quatatom);
MathExtra::qnormalize(quatatom);
ione[0] = EINERTIA*rmass[i] * (shape[1]*shape[1] + shape[2]*shape[2]);
ione[1] = EINERTIA*rmass[i] * (shape[0]*shape[0] + shape[2]*shape[2]);
ione[2] = EINERTIA*rmass[i] * (shape[0]*shape[0] + shape[1]*shape[1]);
MathExtra::q_to_exyz(quatatom,exone,eyone,ezone);
MathExtra::omega_to_angmom(b->omega,exone,eyone,ezone,ione,angmom[i]);
} else if (eflags[i] & LINE) {
if (b->quat[3] >= 0.0) theta_body = 2.0*acos(b->quat[0]);
else theta_body = -2.0*acos(b->quat[0]);
theta = orient[i][0] + theta_body;
while (theta <= MINUSPI) theta += TWOPI;
while (theta > MY_PI) theta -= TWOPI;
lbonus[line[i]].theta = theta;
omega[i][0] = b->omega[0];
omega[i][1] = b->omega[1];
omega[i][2] = b->omega[2];
} else if (eflags[i] & TRIANGLE) {
inertiaatom = tbonus[tri[i]].inertia;
quatatom = tbonus[tri[i]].quat;
MathExtra::quatquat(b->quat,orient[i],quatatom);
MathExtra::qnormalize(quatatom);
MathExtra::q_to_exyz(quatatom,exone,eyone,ezone);
MathExtra::omega_to_angmom(b->omega,exone,eyone,ezone,
inertiaatom,angmom[i]);
}
if (eflags[i] & DIPOLE) {
MathExtra::quat_to_mat(b->quat,p);
MathExtra::matvec(p,dorient[i],mu[i]);
MathExtra::snormalize3(mu[i][3],mu[i],mu[i]);
}
}
}
}
/* ----------------------------------------------------------------------
set space-frame velocity of each atom in a rigid body
set omega and angmom of extended particles
v = Vcm + (W cross (x - Xcm))
------------------------------------------------------------------------- */
void FixRigidSmall::set_v()
{
int xbox,ybox,zbox;
double x0,x1,x2,v0,v1,v2,fc0,fc1,fc2,massone;
double ione[3],exone[3],eyone[3],ezone[3],delta[3],vr[6];
double xprd = domain->xprd;
double yprd = domain->yprd;
double zprd = domain->zprd;
double xy = domain->xy;
double xz = domain->xz;
double yz = domain->yz;
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
tagint *image = atom->image;
int nlocal = atom->nlocal;
// set v of each atom
for (int i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
Body *b = &body[atom2body[i]];
MathExtra::matvec(b->ex_space,b->ey_space,b->ez_space,displace[i],delta);
// save old velocities for virial
if (evflag) {
v0 = v[i][0];
v1 = v[i][1];
v2 = v[i][2];
}
v[i][0] = b->omega[1]*delta[2] - b->omega[2]*delta[1] + b->vcm[0];
v[i][1] = b->omega[2]*delta[0] - b->omega[0]*delta[2] + b->vcm[1];
v[i][2] = b->omega[0]*delta[1] - b->omega[1]*delta[0] + b->vcm[2];
// virial = unwrapped coords dotted into body constraint force
// body constraint force = implied force due to v change minus f external
// assume f does not include forces internal to body
// 1/2 factor b/c initial_integrate contributes other half
// assume per-atom contribution is due to constraint force on that atom
if (evflag) {
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
fc0 = massone*(v[i][0] - v0)/dtf - f[i][0];
fc1 = massone*(v[i][1] - v1)/dtf - f[i][1];
fc2 = massone*(v[i][2] - v2)/dtf - f[i][2];
xbox = (image[i] & IMGMASK) - IMGMAX;
ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX;
zbox = (image[i] >> IMG2BITS) - IMGMAX;
if (triclinic == 0) {
x0 = x[i][0] + xbox*xprd;
x1 = x[i][1] + ybox*yprd;
x2 = x[i][2] + zbox*zprd;
} else {
x0 = x[i][0] + xbox*xprd + ybox*xy + zbox*xz;
x1 = x[i][1] + ybox*yprd + zbox*yz;
x2 = x[i][2] + zbox*zprd;
}
vr[0] = 0.5*x0*fc0;
vr[1] = 0.5*x1*fc1;
vr[2] = 0.5*x2*fc2;
vr[3] = 0.5*x0*fc1;
vr[4] = 0.5*x0*fc2;
vr[5] = 0.5*x1*fc2;
v_tally(1,&i,1.0,vr);
}
}
// set omega, angmom of each extended particle
if (extended) {
double *shape,*quatatom,*inertiaatom;
AtomVecEllipsoid::Bonus *ebonus;
if (avec_ellipsoid) ebonus = avec_ellipsoid->bonus;
AtomVecTri::Bonus *tbonus;
if (avec_tri) tbonus = avec_tri->bonus;
double **omega = atom->omega;
double **angmom = atom->angmom;
int *ellipsoid = atom->ellipsoid;
int *tri = atom->tri;
for (int i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
Body *b = &body[atom2body[i]];
if (eflags[i] & SPHERE) {
omega[i][0] = b->omega[0];
omega[i][1] = b->omega[1];
omega[i][2] = b->omega[2];
} else if (eflags[i] & ELLIPSOID) {
shape = ebonus[ellipsoid[i]].shape;
quatatom = ebonus[ellipsoid[i]].quat;
ione[0] = EINERTIA*rmass[i] * (shape[1]*shape[1] + shape[2]*shape[2]);
ione[1] = EINERTIA*rmass[i] * (shape[0]*shape[0] + shape[2]*shape[2]);
ione[2] = EINERTIA*rmass[i] * (shape[0]*shape[0] + shape[1]*shape[1]);
MathExtra::q_to_exyz(quatatom,exone,eyone,ezone);
MathExtra::omega_to_angmom(b->omega,exone,eyone,ezone,ione,
angmom[i]);
} else if (eflags[i] & LINE) {
omega[i][0] = b->omega[0];
omega[i][1] = b->omega[1];
omega[i][2] = b->omega[2];
} else if (eflags[i] & TRIANGLE) {
inertiaatom = tbonus[tri[i]].inertia;
quatatom = tbonus[tri[i]].quat;
MathExtra::q_to_exyz(quatatom,exone,eyone,ezone);
MathExtra::omega_to_angmom(b->omega,exone,eyone,ezone,
inertiaatom,angmom[i]);
}
}
}
}
/* ----------------------------------------------------------------------
one-time identification of which atoms are in which rigid bodies
set bodytag for all owned atoms
------------------------------------------------------------------------- */
void FixRigidSmall::create_bodies()
{
int i,m,n;
double unwrap[3];
// error check on image flags of atoms in rigid bodies
int *image = atom->image;
int *mask = atom->mask;
int nlocal = atom->nlocal;
int *periodicity = domain->periodicity;
int xbox,ybox,zbox;
int flag = 0;
for (i = 0; i < nlocal; i++) {
if (!(mask[i] & groupbit)) continue;
xbox = (image[i] & IMGMASK) - IMGMAX;
ybox = (image[i] >> IMGBITS & IMGMASK) - IMGMAX;
zbox = (image[i] >> IMG2BITS) - IMGMAX;
if ((xbox && !periodicity[0]) || (ybox && !periodicity[1]) ||
(zbox && !periodicity[2])) flag = 1;
}
int flagall;
MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world);
if (flagall) error->all(FLERR,"Fix rigid/small atom has non-zero image flag "
"in a non-periodic dimension");
// allocate buffer for passing messages around ring of procs
// percount = max number of values to put in buffer for each of ncount
int ncount = 0;
for (i = 0; i < nlocal; i++)
if (mask[i] & groupbit) ncount++;
int percount = 5;
double *buf;
memory->create(buf,ncount*percount,"rigid/small:buf");
// create map hash for storing unique molecule IDs of my atoms
// key = molecule ID
// value = index into per-body data structure
// n = # of entries in hash
hash = new std::map<int,int>();
hash->clear();
// setup hash
// key = body ID
// value = index into N-length data structure
// n = count of unique bodies my atoms are part of
int *molecule = atom->molecule;
n = 0;
for (i = 0; i < nlocal; i++) {
if (!(mask[i] & groupbit)) continue;
if (hash->find(molecule[i]) == hash->end()) (*hash)[molecule[i]] = n++;
}
// bbox = bounding box of each rigid body my atoms are part of
memory->create(bbox,n,6,"rigid/small:bbox");
for (i = 0; i < n; i++) {
bbox[i][0] = bbox[i][2] = bbox[i][4] = BIG;
bbox[i][1] = bbox[i][3] = bbox[i][5] = -BIG;
}
// pack my atoms into buffer as molecule ID, unwrapped coords
double **x = atom->x;
m = 0;
for (i = 0; i < nlocal; i++) {
if (!(mask[i] & groupbit)) continue;
domain->unmap(x[i],image[i],unwrap);
buf[m++] = molecule[i];
buf[m++] = unwrap[0];
buf[m++] = unwrap[1];
buf[m++] = unwrap[2];
}
// pass buffer around ring of procs
// func = update bbox with atom coords from every proc
// when done, have full bbox for every rigid body my atoms are part of
frsptr = this;
comm->ring(m,sizeof(double),buf,1,ring_bbox,NULL);
// ctr = center pt of each rigid body my atoms are part of
memory->create(ctr,n,6,"rigid/small:bbox");
for (i = 0; i < n; i++) {
ctr[i][0] = 0.5 * (bbox[i][0] + bbox[i][1]);
ctr[i][1] = 0.5 * (bbox[i][2] + bbox[i][3]);
ctr[i][2] = 0.5 * (bbox[i][4] + bbox[i][5]);
}
// idclose = ID of atom in body closest to center pt (smaller ID if tied)
// rsqclose = distance squared from idclose to center pt
memory->create(idclose,n,"rigid/small:idclose");
memory->create(rsqclose,n,"rigid/small:rsqclose");
for (i = 0; i < n; i++) rsqclose[i] = BIG;
// pack my atoms into buffer as molecule ID, atom ID, unwrapped coords
int *tag = atom->tag;
m = 0;
for (i = 0; i < nlocal; i++) {
if (!(mask[i] & groupbit)) continue;
domain->unmap(x[i],image[i],unwrap);
buf[m++] = molecule[i];
buf[m++] = tag[i];
buf[m++] = unwrap[0];
buf[m++] = unwrap[1];
buf[m++] = unwrap[2];
}
// pass buffer around ring of procs
// func = update idclose,rsqclose with atom IDs from every proc
// when done, have idclose for every rigid body my atoms are part of
frsptr = this;
comm->ring(m,sizeof(double),buf,2,ring_nearest,NULL);
// set bodytag of all owned atoms, based on idclose
// find max value of rsqclose across all procs
double rsqmax = 0.0;
for (i = 0; i < nlocal; i++) {
bodytag[i] = 0;
if (!(mask[i] & groupbit)) continue;
m = hash->find(molecule[i])->second;
bodytag[i] = idclose[m];
rsqmax = MAX(rsqmax,rsqclose[m]);
}
// pack my atoms into buffer as bodytag of owning atom, unwrapped coords
m = 0;
for (i = 0; i < nlocal; i++) {
if (!(mask[i] & groupbit)) continue;
domain->unmap(x[i],image[i],unwrap);
buf[m++] = bodytag[i];
buf[m++] = unwrap[0];
buf[m++] = unwrap[1];
buf[m++] = unwrap[2];
}
// pass buffer around ring of procs
// func = update rsqfar for atoms belonging to bodies I own
// when done, have rsqfar for all atoms in bodies I own
rsqfar = 0.0;
frsptr = this;
comm->ring(m,sizeof(double),buf,3,ring_farthest,NULL);
// find maxextent of rsqfar across all procs
MPI_Allreduce(&rsqfar,&maxextent,1,MPI_DOUBLE,MPI_MAX,world);
maxextent = sqrt(maxextent);
// clean up
delete hash;
memory->destroy(buf);
memory->destroy(bbox);
memory->destroy(ctr);
memory->destroy(idclose);
memory->destroy(rsqclose);
}
/* ----------------------------------------------------------------------
process rigid body atoms from another proc
update bounding box for rigid bodies my atoms are part of
------------------------------------------------------------------------- */
void FixRigidSmall::ring_bbox(int n, char *cbuf)
{
std::map<int,int> *hash = frsptr->hash;
double **bbox = frsptr->bbox;
double *buf = (double *) cbuf;
int ndatums = n/4;
int j,imol;
double *x;
int m = 0;
for (int i = 0; i < ndatums; i++, m += 4) {
imol = static_cast<int> (buf[m]);
if (hash->find(imol) != hash->end()) {
j = hash->find(imol)->second;
x = &buf[m+1];
bbox[j][0] = MIN(bbox[j][0],x[0]);
bbox[j][1] = MAX(bbox[j][1],x[0]);
bbox[j][2] = MIN(bbox[j][2],x[1]);
bbox[j][3] = MAX(bbox[j][3],x[1]);
bbox[j][4] = MIN(bbox[j][4],x[2]);
bbox[j][5] = MAX(bbox[j][5],x[2]);
}
}
}
/* ----------------------------------------------------------------------
process rigid body atoms from another proc
update nearest atom to body center for rigid bodies my atoms are part of
------------------------------------------------------------------------- */
void FixRigidSmall::ring_nearest(int n, char *cbuf)
{
std::map<int,int> *hash = frsptr->hash;
double **ctr = frsptr->ctr;
int *idclose = frsptr->idclose;
double *rsqclose = frsptr->rsqclose;
double *buf = (double *) cbuf;
int ndatums = n/5;
int j,imol,tag;
double delx,dely,delz,rsq;
double *x;
int m = 0;
for (int i = 0; i < ndatums; i++, m += 5) {
imol = static_cast<int> (buf[m]);
if (hash->find(imol) != hash->end()) {
j = hash->find(imol)->second;
tag = static_cast<int> (buf[m+1]);
x = &buf[m+2];
delx = x[0] - ctr[j][0];
dely = x[1] - ctr[j][1];
delz = x[2] - ctr[j][2];
rsq = delx*delx + dely*dely + delz*delz;
if (rsq <= rsqclose[j]) {
if (rsq == rsqclose[j] && tag > idclose[j]) continue;
idclose[j] = tag;
rsqclose[j] = rsq;
}
}
}
}
/* ----------------------------------------------------------------------
process rigid body atoms from another proc
update rsqfar = distance from owning atom to other atom
------------------------------------------------------------------------- */
void FixRigidSmall::ring_farthest(int n, char *cbuf)
{
double **x = frsptr->atom->x;
int *image = frsptr->atom->image;
int nlocal = frsptr->atom->nlocal;
double *buf = (double *) cbuf;
int ndatums = n/4;
int itag,iowner;
double delx,dely,delz,rsq;
double *xx;
double unwrap[3];
int m = 0;
for (int i = 0; i < ndatums; i++, m += 4) {
itag = static_cast<int> (buf[m]);
iowner = frsptr->atom->map(itag);
if (iowner < 0 || iowner >= nlocal) continue;
frsptr->domain->unmap(x[iowner],image[iowner],unwrap);
xx = &buf[m+1];
delx = xx[0] - unwrap[0];
dely = xx[1] - unwrap[1];
delz = xx[2] - unwrap[2];
rsq = delx*delx + dely*dely + delz*delz;
frsptr->rsqfar = MAX(frsptr->rsqfar,rsq);
}
}
/* ----------------------------------------------------------------------
one-time initialization of rigid body attributes
extended flags, mass, center-of-mass
Cartesian and diagonalized inertia tensor
read per-body attributes from infile if specified
------------------------------------------------------------------------- */
void FixRigidSmall::setup_bodies()
{
int i,ibody;
// extended = 1 if any particle in a rigid body is finite size
// or has a dipole moment
extended = orientflag = dorientflag = 0;
AtomVecEllipsoid::Bonus *ebonus;
if (avec_ellipsoid) ebonus = avec_ellipsoid->bonus;
AtomVecLine::Bonus *lbonus;
if (avec_line) lbonus = avec_line->bonus;
AtomVecTri::Bonus *tbonus;
if (avec_tri) tbonus = avec_tri->bonus;
double **mu = atom->mu;
double *radius = atom->radius;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *ellipsoid = atom->ellipsoid;
int *line = atom->line;
int *tri = atom->tri;
int *type = atom->type;
int nlocal = atom->nlocal;
if (atom->radius_flag || atom->ellipsoid_flag || atom->line_flag ||
atom->tri_flag || atom->mu_flag) {
int flag = 0;
for (i = 0; i < nlocal; i++) {
if (bodytag[i] == 0) continue;
if (radius && radius[i] > 0.0) flag = 1;
if (ellipsoid && ellipsoid[i] >= 0) flag = 1;
if (line && line[i] >= 0) flag = 1;
if (tri && tri[i] >= 0) flag = 1;
if (mu && mu[i][3] > 0.0) flag = 1;
}
MPI_Allreduce(&flag,&extended,1,MPI_INT,MPI_MAX,world);
}
// grow extended arrays and set extended flags for each particle
// orientflag = 4 if any particle stores ellipsoid or tri orientation
// orientflag = 1 if any particle stores line orientation
// dorientflag = 1 if any particle stores dipole orientation
if (extended) {
if (atom->ellipsoid_flag) orientflag = 4;
if (atom->line_flag) orientflag = 1;
if (atom->tri_flag) orientflag = 4;
if (atom->mu_flag) dorientflag = 1;
grow_arrays(atom->nmax);
for (i = 0; i < nlocal; i++) {
eflags[i] = 0;
if (bodytag[i] == 0) continue;
// set to POINT or SPHERE or ELLIPSOID or LINE
if (radius && radius[i] > 0.0) {
eflags[i] |= SPHERE;
eflags[i] |= OMEGA;
eflags[i] |= TORQUE;
} else if (ellipsoid && ellipsoid[i] >= 0) {
eflags[i] |= ELLIPSOID;
eflags[i] |= ANGMOM;
eflags[i] |= TORQUE;
} else if (line && line[i] >= 0) {
eflags[i] |= LINE;
eflags[i] |= OMEGA;
eflags[i] |= TORQUE;
} else if (tri && tri[i] >= 0) {
eflags[i] |= TRIANGLE;
eflags[i] |= ANGMOM;
eflags[i] |= TORQUE;
} else eflags[i] |= POINT;
// set DIPOLE if atom->mu and mu[3] > 0.0
if (atom->mu_flag && mu[i][3] > 0.0)
eflags[i] |= DIPOLE;
}
}
// acquire ghost bodies via forward comm
// set atom2body for ghost atoms via forward comm
// set atom2body for other owned atoms via reset_atom2body()
nghost_body = 0;
commflag = FULL_BODY;
comm->forward_comm_variable_fix(this);
reset_atom2body();
// compute mass & center-of-mass of each rigid body
double **x = atom->x;
tagint *image = atom->image;
double *xcm;
for (ibody = 0; ibody < nlocal_body+nghost_body; ibody++) {
xcm = body[ibody].xcm;
xcm[0] = xcm[1] = xcm[2] = 0.0;
body[ibody].mass = 0.0;
}
double unwrap[3];
double massone;
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
Body *b = &body[atom2body[i]];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
domain->unmap(x[i],image[i],unwrap);
xcm = b->xcm;
xcm[0] += unwrap[0] * massone;
xcm[1] += unwrap[1] * massone;
xcm[2] += unwrap[2] * massone;
b->mass += massone;
}
// reverse communicate xcm, mass of all bodies
commflag = XCM_MASS;
comm->reverse_comm_variable_fix(this);
for (ibody = 0; ibody < nlocal_body; ibody++) {
xcm = body[ibody].xcm;
xcm[0] /= body[ibody].mass;
xcm[1] /= body[ibody].mass;
xcm[2] /= body[ibody].mass;
}
// overwrite masstotal and center-of-mass with file values
// inbody[i] = 0/1 if Ith rigid body is initialized by file
int *inbody;
if (infile) {
memory->create(inbody,nlocal_body,"rigid/small:inbody");
for (ibody = 0; ibody < nlocal_body; ibody++) inbody[ibody] = 0;
readfile(0,NULL,inbody);
}
// set image flags for each rigid body to default values
// then remap the xcm of each body back into simulation box if needed
for (ibody = 0; ibody < nlocal_body; ibody++)
body[ibody].image = ((tagint) IMGMAX << IMG2BITS) |
((tagint) IMGMAX << IMGBITS) | IMGMAX;
pre_neighbor();
// compute 6 moments of inertia of each body in Cartesian reference frame
// dx,dy,dz = coords relative to center-of-mass
// symmetric 3x3 inertia tensor stored in Voigt notation as 6-vector
memory->create(itensor,nlocal_body+nghost_body,6,"rigid/small:itensor");
for (ibody = 0; ibody < nlocal_body+nghost_body; ibody++)
for (i = 0; i < 6; i++) itensor[ibody][i] = 0.0;
double dx,dy,dz;
double *inertia;
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
Body *b = &body[atom2body[i]];
domain->unmap(x[i],image[i],unwrap);
xcm = b->xcm;
dx = unwrap[0] - xcm[0];
dy = unwrap[1] - xcm[1];
dz = unwrap[2] - xcm[2];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
inertia = itensor[atom2body[i]];
inertia[0] += massone * (dy*dy + dz*dz);
inertia[1] += massone * (dx*dx + dz*dz);
inertia[2] += massone * (dx*dx + dy*dy);
inertia[3] -= massone * dy*dz;
inertia[4] -= massone * dx*dz;
inertia[5] -= massone * dx*dy;
}
// extended particles may contribute extra terms to moments of inertia
if (extended) {
double ivec[6];
double *shape,*quatatom,*inertiaatom;
double length,theta;
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
inertia = itensor[atom2body[i]];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
if (eflags[i] & SPHERE) {
inertia[0] += SINERTIA*massone * radius[i]*radius[i];
inertia[1] += SINERTIA*massone * radius[i]*radius[i];
inertia[2] += SINERTIA*massone * radius[i]*radius[i];
} else if (eflags[i] & ELLIPSOID) {
shape = ebonus[ellipsoid[i]].shape;
quatatom = ebonus[ellipsoid[i]].quat;
MathExtra::inertia_ellipsoid(shape,quatatom,massone,ivec);
inertia[0] += ivec[0];
inertia[1] += ivec[1];
inertia[2] += ivec[2];
inertia[3] += ivec[3];
inertia[4] += ivec[4];
inertia[5] += ivec[5];
} else if (eflags[i] & LINE) {
length = lbonus[line[i]].length;
theta = lbonus[line[i]].theta;
MathExtra::inertia_line(length,theta,massone,ivec);
inertia[0] += ivec[0];
inertia[1] += ivec[1];
inertia[2] += ivec[2];
inertia[3] += ivec[3];
inertia[4] += ivec[4];
inertia[5] += ivec[5];
} else if (eflags[i] & TRIANGLE) {
inertiaatom = tbonus[tri[i]].inertia;
quatatom = tbonus[tri[i]].quat;
MathExtra::inertia_triangle(inertiaatom,quatatom,massone,ivec);
inertia[0] += ivec[0];
inertia[1] += ivec[1];
inertia[2] += ivec[2];
inertia[3] += ivec[3];
inertia[4] += ivec[4];
inertia[5] += ivec[5];
}
}
}
// reverse communicate inertia tensor of all bodies
commflag = ITENSOR;
comm->reverse_comm_variable_fix(this);
// overwrite Cartesian inertia tensor with file values
if (infile) readfile(1,itensor,inbody);
// diagonalize inertia tensor for each body via Jacobi rotations
// inertia = 3 eigenvalues = principal moments of inertia
// evectors and exzy_space = 3 evectors = principal axes of rigid body
int ierror;
double cross[3];
double tensor[3][3],evectors[3][3];
double *ex,*ey,*ez;
for (ibody = 0; ibody < nlocal_body; ibody++) {
tensor[0][0] = itensor[ibody][0];
tensor[1][1] = itensor[ibody][1];
tensor[2][2] = itensor[ibody][2];
tensor[1][2] = tensor[2][1] = itensor[ibody][3];
tensor[0][2] = tensor[2][0] = itensor[ibody][4];
tensor[0][1] = tensor[1][0] = itensor[ibody][5];
inertia = body[ibody].inertia;
ierror = MathExtra::jacobi(tensor,inertia,evectors);
if (ierror) error->all(FLERR,
"Insufficient Jacobi rotations for rigid body");
ex = body[ibody].ex_space;
ex[0] = evectors[0][0];
ex[1] = evectors[1][0];
ex[2] = evectors[2][0];
ey = body[ibody].ey_space;
ey[0] = evectors[0][1];
ey[1] = evectors[1][1];
ey[2] = evectors[2][1];
ez = body[ibody].ez_space;
ez[0] = evectors[0][2];
ez[1] = evectors[1][2];
ez[2] = evectors[2][2];
// if any principal moment < scaled EPSILON, set to 0.0
double max;
max = MAX(inertia[0],inertia[1]);
max = MAX(max,inertia[2]);
if (inertia[0] < EPSILON*max) inertia[0] = 0.0;
if (inertia[1] < EPSILON*max) inertia[1] = 0.0;
if (inertia[2] < EPSILON*max) inertia[2] = 0.0;
// enforce 3 evectors as a right-handed coordinate system
// flip 3rd vector if needed
MathExtra::cross3(ex,ey,cross);
if (MathExtra::dot3(cross,ez) < 0.0) MathExtra::negate3(ez);
// create initial quaternion
MathExtra::exyz_to_q(ex,ey,ez,body[ibody].quat);
}
// forward communicate updated info of all bodies
commflag = INITIAL;
comm->forward_comm_variable_fix(this);
// displace = initial atom coords in basis of principal axes
// set displace = 0.0 for atoms not in any rigid body
// for extended particles, set their orientation wrt to rigid body
double qc[4],delta[3];
double *quatatom;
double theta_body;
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) {
displace[i][0] = displace[i][1] = displace[i][2] = 0.0;
continue;
}
Body *b = &body[atom2body[i]];
domain->unmap(x[i],image[i],unwrap);
xcm = b->xcm;
delta[0] = unwrap[0] - xcm[0];
delta[1] = unwrap[1] - xcm[1];
delta[2] = unwrap[2] - xcm[2];
MathExtra::transpose_matvec(b->ex_space,b->ey_space,b->ez_space,
delta,displace[i]);
if (extended) {
if (eflags[i] & ELLIPSOID) {
quatatom = ebonus[ellipsoid[i]].quat;
MathExtra::qconjugate(b->quat,qc);
MathExtra::quatquat(qc,quatatom,orient[i]);
MathExtra::qnormalize(orient[i]);
} else if (eflags[i] & LINE) {
if (b->quat[3] >= 0.0) theta_body = 2.0*acos(b->quat[0]);
else theta_body = -2.0*acos(b->quat[0]);
orient[i][0] = lbonus[line[i]].theta - theta_body;
while (orient[i][0] <= MINUSPI) orient[i][0] += TWOPI;
while (orient[i][0] > MY_PI) orient[i][0] -= TWOPI;
if (orientflag == 4) orient[i][1] = orient[i][2] = orient[i][3] = 0.0;
} else if (eflags[i] & TRIANGLE) {
quatatom = tbonus[tri[i]].quat;
MathExtra::qconjugate(b->quat,qc);
MathExtra::quatquat(qc,quatatom,orient[i]);
MathExtra::qnormalize(orient[i]);
} else if (orientflag == 4) {
orient[i][0] = orient[i][1] = orient[i][2] = orient[i][3] = 0.0;
} else if (orientflag == 1)
orient[i][0] = 0.0;
if (eflags[i] & DIPOLE) {
MathExtra::transpose_matvec(b->ex_space,b->ey_space,b->ez_space,
mu[i],dorient[i]);
MathExtra::snormalize3(mu[i][3],dorient[i],dorient[i]);
} else if (dorientflag)
dorient[i][0] = dorient[i][1] = dorient[i][2] = 0.0;
}
}
// test for valid principal moments & axes
// recompute moments of inertia around new axes
// 3 diagonal moments should equal principal moments
// 3 off-diagonal moments should be 0.0
// extended particles may contribute extra terms to moments of inertia
for (ibody = 0; ibody < nlocal_body+nghost_body; ibody++)
for (i = 0; i < 6; i++) itensor[ibody][i] = 0.0;
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
inertia = itensor[atom2body[i]];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
inertia[0] += massone *
(displace[i][1]*displace[i][1] + displace[i][2]*displace[i][2]);
inertia[1] += massone *
(displace[i][0]*displace[i][0] + displace[i][2]*displace[i][2]);
inertia[2] += massone *
(displace[i][0]*displace[i][0] + displace[i][1]*displace[i][1]);
inertia[3] -= massone * displace[i][1]*displace[i][2];
inertia[4] -= massone * displace[i][0]*displace[i][2];
inertia[5] -= massone * displace[i][0]*displace[i][1];
}
if (extended) {
double ivec[6];
double *shape,*inertiaatom;
double length;
for (i = 0; i < nlocal; i++) {
if (atom2body[i] < 0) continue;
inertia = itensor[atom2body[i]];
if (rmass) massone = rmass[i];
else massone = mass[type[i]];
if (eflags[i] & SPHERE) {
inertia[0] += SINERTIA*massone * radius[i]*radius[i];
inertia[1] += SINERTIA*massone * radius[i]*radius[i];
inertia[2] += SINERTIA*massone * radius[i]*radius[i];
} else if (eflags[i] & ELLIPSOID) {
shape = ebonus[ellipsoid[i]].shape;
MathExtra::inertia_ellipsoid(shape,orient[i],massone,ivec);
inertia[0] += ivec[0];
inertia[1] += ivec[1];
inertia[2] += ivec[2];
inertia[3] += ivec[3];
inertia[4] += ivec[4];
inertia[5] += ivec[5];
} else if (eflags[i] & LINE) {
length = lbonus[line[i]].length;
MathExtra::inertia_line(length,orient[i][0],massone,ivec);
inertia[0] += ivec[0];
inertia[1] += ivec[1];
inertia[2] += ivec[2];
inertia[3] += ivec[3];
inertia[4] += ivec[4];
inertia[5] += ivec[5];
} else if (eflags[i] & TRIANGLE) {
inertiaatom = tbonus[tri[i]].inertia;
MathExtra::inertia_triangle(inertiaatom,orient[i],massone,ivec);
inertia[0] += ivec[0];
inertia[1] += ivec[1];
inertia[2] += ivec[2];
inertia[3] += ivec[3];
inertia[4] += ivec[4];
inertia[5] += ivec[5];
}
}
}
// reverse communicate inertia tensor of all bodies
commflag = ITENSOR;
comm->reverse_comm_variable_fix(this);
// error check that re-computed momemts of inertia match diagonalized ones
// do not do test for bodies with params read from infile
double norm;
for (ibody = 0; ibody < nlocal_body; ibody++) {
if (infile && inbody[ibody]) continue;
inertia = body[ibody].inertia;
if (inertia[0] == 0.0) {
if (fabs(itensor[ibody][0]) > TOLERANCE)
error->all(FLERR,"Fix rigid: Bad principal moments");
} else {
if (fabs((itensor[ibody][0]-inertia[0])/inertia[0]) >
TOLERANCE) error->all(FLERR,"Fix rigid: Bad principal moments");
}
if (inertia[1] == 0.0) {
if (fabs(itensor[ibody][1]) > TOLERANCE)
error->all(FLERR,"Fix rigid: Bad principal moments");
} else {
if (fabs((itensor[ibody][1]-inertia[1])/inertia[1]) >
TOLERANCE) error->all(FLERR,"Fix rigid: Bad principal moments");
}
if (inertia[2] == 0.0) {
if (fabs(itensor[ibody][2]) > TOLERANCE)
error->all(FLERR,"Fix rigid: Bad principal moments");
} else {
if (fabs((itensor[ibody][2]-inertia[2])/inertia[2]) >
TOLERANCE) error->all(FLERR,"Fix rigid: Bad principal moments");
}
norm = (inertia[0] + inertia[1] + inertia[2]) / 3.0;
if (fabs(itensor[ibody][3]/norm) > TOLERANCE ||
fabs(itensor[ibody][4]/norm) > TOLERANCE ||
fabs(itensor[ibody][5]/norm) > TOLERANCE)
error->all(FLERR,"Fix rigid: Bad principal moments");
}
// clean up
memory->destroy(itensor);
if (infile) memory->destroy(inbody);
}
/* ----------------------------------------------------------------------
read per rigid body info from user-provided file
which = 0 to read total mass and center-of-mass
which = 1 to read 6 moments of inertia, store in array
flag inbody = 0 for local bodies whose info is read from file
nlines = # of lines of rigid body info
one line = rigid-ID mass xcm ycm zcm ixx iyy izz ixy ixz iyz
and rigid-ID = mol-ID for fix rigid/small
------------------------------------------------------------------------- */
void FixRigidSmall::readfile(int which, double **array, int *inbody)
{
int i,j,m,nchunk,id,eofflag;
int nlines;
FILE *fp;
char *eof,*start,*next,*buf;
char line[MAXLINE];
// create local hash with key/value pairs
// key = mol ID of bodies my atoms own
// value = index into local body array
int *molecule = atom->molecule;
int nlocal = atom->nlocal;
hash = new std::map<int,int>();
for (int i = 0; i < nlocal; i++)
- if (bodyown[i] >= 0) (*hash)[molecule[i]] = bodyown[i];
+ if (bodyown[i] >= 0) (*hash)[atom->molecule[i]] = bodyown[i];
// open file and read header
if (me == 0) {
fp = fopen(infile,"r");
if (fp == NULL) {
char str[128];
sprintf(str,"Cannot open fix rigid/small infile %s",infile);
error->one(FLERR,str);
}
while (1) {
eof = fgets(line,MAXLINE,fp);
if (eof == NULL)
error->one(FLERR,"Unexpected end of fix rigid/small file");
start = &line[strspn(line," \t\n\v\f\r")];
if (*start != '\0' && *start != '#') break;
}
sscanf(line,"%d",&nlines);
}
MPI_Bcast(&nlines,1,MPI_INT,0,world);
char *buffer = new char[CHUNK*MAXLINE];
char **values = new char*[ATTRIBUTE_PERBODY];
int nread = 0;
while (nread < nlines) {
nchunk = MIN(nlines-nread,CHUNK);
eofflag = comm->read_lines_from_file(fp,nchunk,MAXLINE,buffer);
if (eofflag) error->all(FLERR,"Unexpected end of fix rigid/small file");
buf = buffer;
next = strchr(buf,'\n');
*next = '\0';
int nwords = atom->count_words(buf);
*next = '\n';
if (nwords != ATTRIBUTE_PERBODY)
error->all(FLERR,"Incorrect rigid body format in fix rigid/small file");
// loop over lines of rigid body attributes
// tokenize the line into values
// id = rigid body ID = mol-ID
// for which = 0, store mass/com in vec/array
// for which = 1, store interia tensor array, invert 3,4,5 values to Voigt
for (int i = 0; i < nchunk; i++) {
next = strchr(buf,'\n');
values[0] = strtok(buf," \t\n\r\f");
for (j = 1; j < nwords; j++)
values[j] = strtok(NULL," \t\n\r\f");
-
+
id = atoi(values[0]);
if (id <= 0 || id > maxmol)
error->all(FLERR,"Invalid rigid body ID in fix rigid/small file");
- if (hash->find(id) == hash->end()) continue;
+ if (hash->find(id) == hash->end()) {
+ buf = next + 1;
+ continue;
+ }
id = (*hash)[id];
inbody[id] = 1;
if (which == 0) {
body[id].mass = atof(values[1]);
body[id].xcm[0] = atof(values[2]);
body[id].xcm[1] = atof(values[3]);
body[id].xcm[2] = atof(values[4]);
} else {
array[id][0] = atof(values[5]);
array[id][1] = atof(values[6]);
array[id][2] = atof(values[7]);
array[id][3] = atof(values[10]);
array[id][4] = atof(values[9]);
array[id][5] = atof(values[8]);
}
buf = next + 1;
}
nread += nchunk;
}
if (me == 0) fclose(fp);
delete [] buffer;
delete [] values;
delete hash;
}
+/* ----------------------------------------------------------------------
+ write out restart info for mass, COM, inertia tensor to file
+ identical format to infile option, so info can be read in when restarting
+ each proc contributes info for rigid bodies it owns
+------------------------------------------------------------------------- */
+
+void FixRigidSmall::write_restart_file(char *file)
+{
+ FILE *fp;
+
+ // do not write file if bodies have not yet been intialized
+
+ if (firstflag) return;
+
+ // proc 0 opens file and writes header
+
+ if (me == 0) {
+ char outfile[128];
+ sprintf(outfile,"%s.rigid",file);
+ fp = fopen(outfile,"w");
+ if (fp == NULL) {
+ char str[128];
+ sprintf(str,"Cannot open fix rigid restart file %s",outfile);
+ error->one(FLERR,str);
+ }
+
+ fprintf(fp,"fix rigid mass, COM, inertia tensor info for "
+ "%d bodies on timestep " BIGINT_FORMAT "\n\n",
+ nbody,update->ntimestep);
+ fprintf(fp,"%d\n",nbody);
+ }
+
+ // communication buffer for all my rigid body info
+ // max_size = largest buffer needed by any proc
+
+ int ncol = 11;
+ int sendrow = nlocal_body;
+ int maxrow;
+ MPI_Allreduce(&sendrow,&maxrow,1,MPI_INT,MPI_MAX,world);
+
+ double **buf;
+ if (me == 0) memory->create(buf,MAX(1,maxrow),ncol,"rigid/small:buf");
+ else memory->create(buf,MAX(1,sendrow),ncol,"rigid/small:buf");
+
+ // pack my rigid body info into buf
+ // compute I tensor against xyz axes from diagonalized I and current quat
+ // Ispace = P Idiag P_transpose
+ // P is stored column-wise in exyz_space
+
+ double p[3][3],pdiag[3][3],ispace[3][3];
+
+ for (int i = 0; i < nlocal_body; i++) {
+ MathExtra::col2mat(body[i].ex_space,body[i].ey_space,body[i].ez_space,p);
+ MathExtra::times3_diag(p,body[i].inertia,pdiag);
+ MathExtra::times3_transpose(pdiag,p,ispace);
+
+ buf[i][0] = atom->molecule[body[i].ilocal];
+ buf[i][1] = body[i].mass;
+ buf[i][2] = body[i].xcm[0];
+ buf[i][3] = body[i].xcm[1];
+ buf[i][4] = body[i].xcm[2];
+ buf[i][5] = ispace[0][0];
+ buf[i][6] = ispace[1][1];
+ buf[i][7] = ispace[2][2];
+ buf[i][8] = ispace[0][1];
+ buf[i][9] = ispace[0][2];
+ buf[i][10] = ispace[1][2];
+ }
+
+ // write one chunk of rigid body info per proc to file
+ // proc 0 pings each proc, receives its chunk, writes to file
+ // all other procs wait for ping, send their chunk to proc 0
+
+ int tmp,recvrow;
+ MPI_Status status;
+ MPI_Request request;
+
+ if (me == 0) {
+ for (int iproc = 0; iproc < nprocs; iproc++) {
+ if (iproc) {
+ MPI_Irecv(&buf[0][0],maxrow*ncol,MPI_DOUBLE,iproc,0,world,&request);
+ MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
+ MPI_Wait(&request,&status);
+ MPI_Get_count(&status,MPI_DOUBLE,&recvrow);
+ recvrow /= ncol;
+ } else recvrow = sendrow;
+
+ for (int i = 0; i < recvrow; i++)
+ fprintf(fp,"%d %-1.16e %-1.16e %-1.16e %-1.16e "
+ "%-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e\n",
+ static_cast<int> (buf[i][0]),buf[i][1],
+ buf[i][2],buf[i][3],buf[i][4],
+ buf[i][5],buf[i][6],buf[i][7],buf[i][8],buf[i][9],buf[i][10]);
+ }
+
+ } else {
+ MPI_Recv(&tmp,0,MPI_INT,0,0,world,&status);
+ MPI_Rsend(&buf[0][0],sendrow*ncol,MPI_DOUBLE,0,0,world);
+ }
+
+ // clean up and close file
+
+ memory->destroy(buf);
+ if (me == 0) fclose(fp);
+}
+
/* ----------------------------------------------------------------------
allocate local atom-based arrays
------------------------------------------------------------------------- */
void FixRigidSmall::grow_arrays(int nmax)
{
memory->grow(bodyown,nmax,"rigid/small:bodyown");
memory->grow(bodytag,nmax,"rigid/small:bodytag");
memory->grow(atom2body,nmax,"rigid/small:atom2body");
memory->grow(displace,nmax,3,"rigid/small:displace");
if (extended) {
memory->grow(eflags,nmax,"rigid/small:eflags");
if (orientflag) memory->grow(orient,nmax,orientflag,"rigid/small:orient");
if (dorientflag) memory->grow(dorient,nmax,3,"rigid/small:dorient");
}
}
/* ----------------------------------------------------------------------
copy values within local atom-based arrays
------------------------------------------------------------------------- */
void FixRigidSmall::copy_arrays(int i, int j, int delflag)
{
bodytag[j] = bodytag[i];
displace[j][0] = displace[i][0];
displace[j][1] = displace[i][1];
displace[j][2] = displace[i][2];
if (extended) {
eflags[j] = eflags[i];
for (int k = 0; k < orientflag; k++)
orient[j][k] = orient[i][k];
if (dorientflag) {
dorient[j][0] = dorient[i][0];
dorient[j][1] = dorient[i][1];
dorient[j][2] = dorient[i][2];
}
}
// if deleting atom J via delflag and J owns a body, then delete it
if (delflag && bodyown[j] >= 0) {
bodyown[body[nlocal_body-1].ilocal] = bodyown[j];
memcpy(&body[bodyown[j]],&body[nlocal_body-1],sizeof(Body));
nlocal_body--;
}
// if atom I owns a body, reset I's body.ilocal to loc J
// do NOT do this if self-copy (I=J) since I's body is already deleted
if (bodyown[i] >= 0 && i != j) body[bodyown[i]].ilocal = j;
bodyown[j] = bodyown[i];
}
/* ----------------------------------------------------------------------
initialize one atom's array values, called when atom is created
------------------------------------------------------------------------- */
void FixRigidSmall::set_arrays(int i)
{
bodyown[i] = -1;
bodytag[i] = 0;
atom2body[i] = -1;
displace[i][0] = 0.0;
displace[i][1] = 0.0;
displace[i][2] = 0.0;
}
/* ----------------------------------------------------------------------
pack values in local atom-based arrays for exchange with another proc
------------------------------------------------------------------------- */
int FixRigidSmall::pack_exchange(int i, double *buf)
{
buf[0] = bodytag[i];
buf[1] = displace[i][0];
buf[2] = displace[i][1];
buf[3] = displace[i][2];
// extended attribute info
int m = 4;
if (extended) {
buf[m++] = eflags[i];
for (int j = 0; j < orientflag; j++)
buf[m++] = orient[i][j];
if (dorientflag) {
buf[m++] = dorient[i][0];
buf[m++] = dorient[i][1];
buf[m++] = dorient[i][2];
}
}
// atom not in a rigid body
if (!bodytag[i]) return m;
// atom does not own its rigid body
if (bodyown[i] < 0) {
buf[m++] = 0;
return m;
}
// body info for atom that owns a rigid body
buf[m++] = 1;
memcpy(&buf[m],&body[bodyown[i]],sizeof(Body));
m += bodysize;
return m;
}
/* ----------------------------------------------------------------------
unpack values in local atom-based arrays from exchange with another proc
------------------------------------------------------------------------- */
int FixRigidSmall::unpack_exchange(int nlocal, double *buf)
{
bodytag[nlocal] = static_cast<int> (buf[0]);
displace[nlocal][0] = buf[1];
displace[nlocal][1] = buf[2];
displace[nlocal][2] = buf[3];
// extended attribute info
int m = 4;
if (extended) {
eflags[nlocal] = static_cast<int> (buf[m++]);
for (int j = 0; j < orientflag; j++)
orient[nlocal][j] = buf[m++];
if (dorientflag) {
dorient[nlocal][0] = buf[m++];
dorient[nlocal][1] = buf[m++];
dorient[nlocal][2] = buf[m++];
}
}
// atom not in a rigid body
if (!bodytag[nlocal]) {
bodyown[nlocal] = -1;
return m;
}
// atom does not own its rigid body
bodyown[nlocal] = static_cast<int> (buf[m++]);
if (bodyown[nlocal] == 0) {
bodyown[nlocal] = -1;
return m;
}
// body info for atom that owns a rigid body
if (nlocal_body == nmax_body) grow_body();
memcpy(&body[nlocal_body],&buf[m],sizeof(Body));
m += bodysize;
body[nlocal_body].ilocal = nlocal;
bodyown[nlocal] = nlocal_body++;
return m;
}
/* ----------------------------------------------------------------------
only pack body info if own or ghost atom owns the body
for FULL_BODY, send 0/1 flag with every atom
------------------------------------------------------------------------- */
int FixRigidSmall::pack_comm(int n, int *list, double *buf,
int pbc_flag, int *pbc)
{
int i,j;
double *xcm,*vcm,*quat,*omega,*ex_space,*ey_space,*ez_space;
int m = 0;
if (commflag == INITIAL) {
for (i = 0; i < n; i++) {
j = list[i];
if (bodyown[j] < 0) continue;
xcm = body[bodyown[j]].xcm;
buf[m++] = xcm[0];
buf[m++] = xcm[1];
buf[m++] = xcm[2];
vcm = body[bodyown[j]].vcm;
buf[m++] = vcm[0];
buf[m++] = vcm[1];
buf[m++] = vcm[2];
quat = body[bodyown[j]].quat;
buf[m++] = quat[0];
buf[m++] = quat[1];
buf[m++] = quat[2];
buf[m++] = quat[3];
omega = body[bodyown[j]].omega;
buf[m++] = omega[0];
buf[m++] = omega[1];
buf[m++] = omega[2];
ex_space = body[bodyown[j]].ex_space;
buf[m++] = ex_space[0];
buf[m++] = ex_space[1];
buf[m++] = ex_space[2];
ey_space = body[bodyown[j]].ey_space;
buf[m++] = ey_space[0];
buf[m++] = ey_space[1];
buf[m++] = ey_space[2];
ez_space = body[bodyown[j]].ez_space;
buf[m++] = ez_space[0];
buf[m++] = ez_space[1];
buf[m++] = ez_space[2];
}
} else if (commflag == FINAL) {
for (i = 0; i < n; i++) {
j = list[i];
if (bodyown[j] < 0) continue;
vcm = body[bodyown[j]].vcm;
buf[m++] = vcm[0];
buf[m++] = vcm[1];
buf[m++] = vcm[2];
omega = body[bodyown[j]].omega;
buf[m++] = omega[0];
buf[m++] = omega[1];
buf[m++] = omega[2];
}
} else if (commflag == FULL_BODY) {
for (i = 0; i < n; i++) {
j = list[i];
if (bodyown[j] < 0) buf[m++] = 0;
else {
buf[m++] = 1;
memcpy(&buf[m],&body[bodyown[j]],sizeof(Body));
m += bodysize;
}
}
}
return m;
}
/* ----------------------------------------------------------------------
only ghost atoms are looped over
for FULL_BODY, store a new ghost body if this atom owns it
for other commflag values, only unpack body info if atom owns it
------------------------------------------------------------------------- */
void FixRigidSmall::unpack_comm(int n, int first, double *buf)
{
int i,j,last;
double *xcm,*vcm,*quat,*omega,*ex_space,*ey_space,*ez_space;
int m = 0;
last = first + n;
if (commflag == INITIAL) {
for (i = first; i < last; i++) {
if (bodyown[i] < 0) continue;
xcm = body[bodyown[i]].xcm;
xcm[0] = buf[m++];
xcm[1] = buf[m++];
xcm[2] = buf[m++];
vcm = body[bodyown[i]].vcm;
vcm[0] = buf[m++];
vcm[1] = buf[m++];
vcm[2] = buf[m++];
quat = body[bodyown[i]].quat;
quat[0] = buf[m++];
quat[1] = buf[m++];
quat[2] = buf[m++];
quat[3] = buf[m++];
omega = body[bodyown[i]].omega;
omega[0] = buf[m++];
omega[1] = buf[m++];
omega[2] = buf[m++];
ex_space = body[bodyown[i]].ex_space;
ex_space[0] = buf[m++];
ex_space[1] = buf[m++];
ex_space[2] = buf[m++];
ey_space = body[bodyown[i]].ey_space;
ey_space[0] = buf[m++];
ey_space[1] = buf[m++];
ey_space[2] = buf[m++];
ez_space = body[bodyown[i]].ez_space;
ez_space[0] = buf[m++];
ez_space[1] = buf[m++];
ez_space[2] = buf[m++];
}
} else if (commflag == FINAL) {
for (i = first; i < last; i++) {
if (bodyown[i] < 0) continue;
vcm = body[bodyown[i]].vcm;
vcm[0] = buf[m++];
vcm[1] = buf[m++];
vcm[2] = buf[m++];
omega = body[bodyown[i]].omega;
omega[0] = buf[m++];
omega[1] = buf[m++];
omega[2] = buf[m++];
}
} else if (commflag == FULL_BODY) {
for (i = first; i < last; i++) {
bodyown[i] = static_cast<int> (buf[m++]);
if (bodyown[i] == 0) bodyown[i] = -1;
else {
j = nlocal_body + nghost_body;
if (j == nmax_body) grow_body();
memcpy(&body[j],&buf[m],sizeof(Body));
m += bodysize;
body[j].ilocal = i;
bodyown[i] = j;
nghost_body++;
}
}
}
}
/* ----------------------------------------------------------------------
only ghost atoms are looped over
only pack body info if atom owns it
------------------------------------------------------------------------- */
int FixRigidSmall::pack_reverse_comm(int n, int first, double *buf)
{
int i,j,m,last;
double *fcm,*torque,*vcm,*angmom,*xcm;
m = 0;
last = first + n;
if (commflag == FORCE_TORQUE) {
for (i = first; i < last; i++) {
if (bodyown[i] < 0) continue;
fcm = body[bodyown[i]].fcm;
buf[m++] = fcm[0];
buf[m++] = fcm[1];
buf[m++] = fcm[2];
torque = body[bodyown[i]].torque;
buf[m++] = torque[0];
buf[m++] = torque[1];
buf[m++] = torque[2];
}
} else if (commflag == VCM_ANGMOM) {
for (i = first; i < last; i++) {
if (bodyown[i] < 0) continue;
vcm = body[bodyown[i]].vcm;
buf[m++] = vcm[0];
buf[m++] = vcm[1];
buf[m++] = vcm[2];
angmom = body[bodyown[i]].angmom;
buf[m++] = angmom[0];
buf[m++] = angmom[1];
buf[m++] = angmom[2];
}
} else if (commflag == XCM_MASS) {
for (i = first; i < last; i++) {
if (bodyown[i] < 0) continue;
xcm = body[bodyown[i]].xcm;
buf[m++] = xcm[0];
buf[m++] = xcm[1];
buf[m++] = xcm[2];
buf[m++] = body[bodyown[i]].mass;
}
} else if (commflag == ITENSOR) {
for (i = first; i < last; i++) {
if (bodyown[i] < 0) continue;
j = bodyown[i];
buf[m++] = itensor[j][0];
buf[m++] = itensor[j][1];
buf[m++] = itensor[j][2];
buf[m++] = itensor[j][3];
buf[m++] = itensor[j][4];
buf[m++] = itensor[j][5];
}
} else if (commflag == DOF) {
for (i = first; i < last; i++) {
if (bodyown[i] < 0) continue;
j = bodyown[i];
buf[m++] = counts[j][0];
buf[m++] = counts[j][1];
buf[m++] = counts[j][2];
}
}
return m;
}
/* ----------------------------------------------------------------------
only unpack body info if own or ghost atom owns the body
------------------------------------------------------------------------- */
void FixRigidSmall::unpack_reverse_comm(int n, int *list, double *buf)
{
int i,j,k;
double *fcm,*torque,*vcm,*angmom,*xcm;
int m = 0;
if (commflag == FORCE_TORQUE) {
for (i = 0; i < n; i++) {
j = list[i];
if (bodyown[j] < 0) continue;
fcm = body[bodyown[j]].fcm;
fcm[0] += buf[m++];
fcm[1] += buf[m++];
fcm[2] += buf[m++];
torque = body[bodyown[j]].torque;
torque[0] += buf[m++];
torque[1] += buf[m++];
torque[2] += buf[m++];
}
} else if (commflag == VCM_ANGMOM) {
for (i = 0; i < n; i++) {
j = list[i];
if (bodyown[j] < 0) continue;
vcm = body[bodyown[j]].vcm;
vcm[0] += buf[m++];
vcm[1] += buf[m++];
vcm[2] += buf[m++];
angmom = body[bodyown[j]].angmom;
angmom[0] += buf[m++];
angmom[1] += buf[m++];
angmom[2] += buf[m++];
}
} else if (commflag == XCM_MASS) {
for (i = 0; i < n; i++) {
j = list[i];
if (bodyown[j] < 0) continue;
xcm = body[bodyown[j]].xcm;
xcm[0] += buf[m++];
xcm[1] += buf[m++];
xcm[2] += buf[m++];
body[bodyown[j]].mass += buf[m++];
}
} else if (commflag == ITENSOR) {
for (i = 0; i < n; i++) {
j = list[i];
if (bodyown[j] < 0) continue;
k = bodyown[j];
itensor[k][0] += buf[m++];
itensor[k][1] += buf[m++];
itensor[k][2] += buf[m++];
itensor[k][3] += buf[m++];
itensor[k][4] += buf[m++];
itensor[k][5] += buf[m++];
}
} else if (commflag == DOF) {
for (i = 0; i < n; i++) {
j = list[i];
if (bodyown[j] < 0) continue;
k = bodyown[j];
counts[k][0] += buf[m++];
counts[k][1] += buf[m++];
counts[k][2] += buf[m++];
}
}
}
/* ----------------------------------------------------------------------
grow body data structure
------------------------------------------------------------------------- */
void FixRigidSmall::grow_body()
{
nmax_body += DELTA_BODY;
body = (Body *) memory->srealloc(body,nmax_body*sizeof(Body),
"rigid/small:body");
}
/* ----------------------------------------------------------------------
reset atom2body for all owned atoms
do this via bodyown of atom that owns the body the owned atom is in
atom2body values can point to original body or any image of the body
------------------------------------------------------------------------- */
void FixRigidSmall::reset_atom2body()
{
int iowner;
// iowner = index of atom that owns the body that atom I is in
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) {
atom2body[i] = -1;
if (bodytag[i]) {
iowner = atom->map(bodytag[i]);
if (iowner == -1) {
char str[128];
sprintf(str,
"Rigid body atoms %d %d missing on proc %d at step "
BIGINT_FORMAT,
atom->tag[i],bodytag[i],comm->me,update->ntimestep);
error->one(FLERR,str);
}
atom2body[i] = bodyown[iowner];
}
}
}
/* ---------------------------------------------------------------------- */
void FixRigidSmall::reset_dt()
{
dtv = update->dt;
dtf = 0.5 * update->dt * force->ftm2v;
dtq = 0.5 * update->dt;
}
/* ---------------------------------------------------------------------- */
void *FixRigidSmall::extract(const char *str, int &dim)
{
if (strcmp(str,"body") == 0) {
dim = 1;
return atom2body;
}
// return vector of rigid body masses, for owned+ghost bodies
// used by granular pair styles, indexed by atom2body
if (strcmp(str,"masstotal") == 0) {
dim = 1;
if (nmax_mass < nmax_body) {
memory->destroy(mass_body);
nmax_mass = nmax_body;
memory->create(mass_body,nmax_mass,"rigid:mass_body");
}
int n = nlocal_body + nghost_body;
for (int i = 0; i < n; i++)
mass_body[i] = body[i].mass;
return mass_body;
}
return NULL;
}
/* ----------------------------------------------------------------------
return temperature of collection of rigid bodies
non-active DOF are removed by fflag/tflag and in tfactor
------------------------------------------------------------------------- */
double FixRigidSmall::compute_scalar()
{
double wbody[3],rot[3][3];
double *vcm,*inertia;
double t = 0.0;
for (int i = 0; i < nlocal_body; i++) {
vcm = body[i].vcm;
t += body[i].mass * (vcm[0]*vcm[0] + vcm[1]*vcm[1] + vcm[2]*vcm[2]);
// for Iw^2 rotational term, need wbody = angular velocity in body frame
// not omega = angular velocity in space frame
inertia = body[i].inertia;
MathExtra::quat_to_mat(body[i].quat,rot);
MathExtra::transpose_matvec(rot,body[i].angmom,wbody);
if (inertia[0] == 0.0) wbody[0] = 0.0;
else wbody[0] /= inertia[0];
if (inertia[1] == 0.0) wbody[1] = 0.0;
else wbody[1] /= inertia[1];
if (inertia[2] == 0.0) wbody[2] = 0.0;
else wbody[2] /= inertia[2];
t += inertia[0]*wbody[0]*wbody[0] + inertia[1]*wbody[1]*wbody[1] +
inertia[2]*wbody[2]*wbody[2];
}
double tall;
MPI_Allreduce(&t,&tall,1,MPI_DOUBLE,MPI_SUM,world);
double tfactor = force->mvv2e / (6.0*nbody * force->boltz);
tall *= tfactor;
return tall;
}
/* ----------------------------------------------------------------------
memory usage of local atom-based arrays
------------------------------------------------------------------------- */
double FixRigidSmall::memory_usage()
{
int nmax = atom->nmax;
double bytes = 2 * nmax * sizeof(int);
bytes += nmax*3 * sizeof(double);
bytes += maxvatom*6 * sizeof(double); // vatom
if (extended) {
bytes += nmax * sizeof(int);
if (orientflag) bytes = nmax*orientflag * sizeof(double);
if (dorientflag) bytes = nmax*3 * sizeof(double);
}
bytes += nmax_body * sizeof(Body);
return bytes;
}
/* ----------------------------------------------------------------------
debug method for sanity checking of atom/body data pointers
------------------------------------------------------------------------- */
/*
void FixRigidSmall::check(int flag)
{
for (int i = 0; i < atom->nlocal; i++) {
if (bodyown[i] >= 0) {
if (bodytag[i] != atom->tag[i]) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD AAA");
}
if (bodyown[i] < 0 || bodyown[i] >= nlocal_body) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD BBB");
}
if (atom2body[i] != bodyown[i]) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD CCC");
}
if (body[bodyown[i]].ilocal != i) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD DDD");
}
}
}
for (int i = 0; i < atom->nlocal; i++) {
if (bodyown[i] < 0 && bodytag[i] > 0) {
if (atom2body[i] < 0 || atom2body[i] >= nlocal_body+nghost_body) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD EEE");
}
if (bodytag[i] != atom->tag[body[atom2body[i]].ilocal]) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD FFF");
}
}
}
for (int i = atom->nlocal; i < atom->nlocal + atom->nghost; i++) {
if (bodyown[i] >= 0) {
if (bodyown[i] < nlocal_body ||
bodyown[i] >= nlocal_body+nghost_body) {
printf("Values %d %d: %d %d %d\n",
i,atom->tag[i],bodyown[i],nlocal_body,nghost_body);
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD GGG");
}
if (body[bodyown[i]].ilocal != i) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD HHH");
}
}
}
for (int i = 0; i < nlocal_body; i++) {
if (body[i].ilocal < 0 || body[i].ilocal >= atom->nlocal) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD III");
}
if (bodytag[body[i].ilocal] != atom->tag[body[i].ilocal] ||
bodyown[body[i].ilocal] != i) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD JJJ");
}
}
for (int i = nlocal_body; i < nlocal_body + nghost_body; i++) {
if (body[i].ilocal < atom->nlocal ||
body[i].ilocal >= atom->nlocal + atom->nghost) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD KKK");
}
if (bodyown[body[i].ilocal] != i) {
printf("Proc %d, step %ld, flag %d\n",comm->me,update->ntimestep,flag);
errorx->one(FLERR,"BAD LLL");
}
}
}
*/
diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h
index 76d5770b1..e2761b035 100644
--- a/src/RIGID/fix_rigid_small.h
+++ b/src/RIGID/fix_rigid_small.h
@@ -1,242 +1,243 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef FIX_CLASS
FixStyle(rigid/small,FixRigidSmall)
#else
#ifndef LMP_FIX_RIGID_SMALL_H
#define LMP_FIX_RIGID_SMALL_H
#include "fix.h"
// replace this later
#include <map>
namespace LAMMPS_NS {
class FixRigidSmall : public Fix {
public:
// static variable for ring communication callback to access class data
static FixRigidSmall *frsptr;
FixRigidSmall(class LAMMPS *, int, char **);
virtual ~FixRigidSmall();
virtual int setmask();
virtual void init();
virtual void setup(int);
virtual void initial_integrate(int);
void post_force(int);
virtual void final_integrate();
void initial_integrate_respa(int, int, int);
void final_integrate_respa(int, int);
+ void write_restart_file(char *);
void grow_arrays(int);
void copy_arrays(int, int, int);
void set_arrays(int);
int pack_exchange(int, double *);
int unpack_exchange(int, double *);
int pack_comm(int, int *, double *, int, int *);
void unpack_comm(int, int, double *);
int pack_reverse_comm(int, int, double *);
void unpack_reverse_comm(int, int *, double *);
void setup_pre_neighbor();
void pre_neighbor();
int dof(int);
void deform(int);
void reset_dt();
void *extract(const char*,int &);
double compute_scalar();
double memory_usage();
protected:
int me,nprocs;
double dtv,dtf,dtq;
double *step_respa;
int triclinic;
double MINUSPI,TWOPI;
char *infile; // file to read rigid body attributes from
int firstflag; // 1 for first-time setup of rigid bodies
int commflag; // various modes of forward/reverse comm
int nbody; // total # of rigid bodies
int maxmol; // max mol-ID
double maxextent; // furthest distance from body owner to body atom
struct Body {
double mass; // total mass of body
double xcm[3]; // COM position
double vcm[3]; // COM velocity
double fcm[3]; // force on COM
double torque[3]; // torque around COM
double quat[4]; // quaternion for orientation of body
double inertia[3]; // 3 principal components of inertia
double ex_space[3]; // principal axes in space coords
double ey_space[3];
double ez_space[3];
double angmom[3]; // space-frame angular momentum of body
double omega[3]; // space-frame omega of body
tagint image; // image flags of xcm
int remapflag[4]; // PBC remap flags
int ilocal; // index of owning atom
};
Body *body; // list of rigid bodies, owned and ghost
int nlocal_body; // # of owned rigid bodies
int nghost_body; // # of ghost rigid bodies
int nmax_body; // max # of bodies that body can hold
int bodysize; // sizeof(Body) in doubles
// per-atom quantities
// only defined for owned atoms, except bodyown for own+ghost
int *bodyown; // index of body if atom owns a body, -1 if not
int *bodytag; // ID of body this atom is in, 0 if none
// ID = tag of atom that owns body
int *atom2body; // index of owned/ghost body this atom is in, -1 if not
// can point to original or any image of the body
double **displace; // displacement of each atom in body coords
int *eflags; // flags for extended particles
double **orient; // orientation vector of particle wrt rigid body
double **dorient; // orientation of dipole mu wrt rigid body
int extended; // 1 if any particles have extended attributes
int orientflag; // 1 if particles store spatial orientation
int dorientflag; // 1 if particles store dipole orientation
int POINT,SPHERE,ELLIPSOID,LINE,TRIANGLE,DIPOLE; // bitmasks for eflags
int OMEGA,ANGMOM,TORQUE;
class AtomVecEllipsoid *avec_ellipsoid;
class AtomVecLine *avec_line;
class AtomVecTri *avec_tri;
// temporary per-body storage
int **counts; // counts of atom types in bodies
double **itensor; // 6 space-frame components of inertia tensor
// mass per body, accessed by granular pair styles
double *mass_body;
int nmax_mass;
// Langevin thermostatting
int langflag; // 0/1 = no/yes Langevin thermostat
double t_start,t_stop,t_period; // thermostat params
double **langextra; // Langevin thermostat forces and torques
int maxlang; // max size of langextra
class RanMars *random; // RNG
// class data used by ring communication callbacks
std::map<int,int> *hash;
double **bbox;
double **ctr;
int *idclose;
double *rsqclose;
double rsqfar;
void set_xv();
void set_v();
void create_bodies();
void setup_bodies();
void readfile(int, double **, int *);
void grow_body();
void reset_atom2body();
// callback functions for ring communication
static void ring_bbox(int, char *);
static void ring_nearest(int, char *);
static void ring_farthest(int, char *);
// debug
//void check(int);
};
}
#endif
#endif
/* ERROR/WARNING messages:
E: Illegal ... command
Self-explanatory. Check the input script syntax and compare to the
documentation for the command. You can use -echo screen as a
command-line option when running LAMMPS to see the offending line.
E: Fix rigid/small langevin period must be > 0.0
Self-explanatory.
E: Fix rigid/small requires atom attribute molecule
Self-explanatory.
E: No rigid bodies defined
The fix specification did not end up defining any rigid bodies.
W: More than one fix rigid
It is not efficient to use fix rigid more than once.
E: Rigid fix must come before NPT/NPH fix
NPT/NPH fix must be defined in input script after all rigid fixes,
else the rigid fix contribution to the pressure virial is
incorrect.
W: Cannot count rigid body degrees-of-freedom before bodies are fully initialized
UNDOCUMENTED
W: Computing temperature of portions of rigid bodies
The group defined by the temperature compute does not encompass all
the atoms in one or more rigid bodies, so the change in
degrees-of-freedom for the atoms in those partial rigid bodies will
not be accounted for.
E: Fix rigid/small atom has non-zero image flag in a non-periodic dimension
Image flags for non-periodic dimensions should not be set.
E: Insufficient Jacobi rotations for rigid body
Eigensolve for rigid body was not sufficiently accurate.
E: Fix rigid: Bad principal moments
The principal moments of inertia computed for a rigid body
are not within the required tolerances.
E: Rigid body atoms %d %d missing on proc %d at step %ld
This means that an atom cannot find the atom that owns the rigid body
it is part of, or vice versa. The solution is to use the communicate
cutoff command to insure ghost atoms are acquired from far enough away
to encompass the max distance printed when the fix rigid/small command
was invoked.
*/
diff --git a/src/USER-ATC/fix_atc.cpp b/src/USER-ATC/fix_atc.cpp
index 1a8e0797c..1d440b976 100644
--- a/src/USER-ATC/fix_atc.cpp
+++ b/src/USER-ATC/fix_atc.cpp
@@ -1,957 +1,970 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
www.cs.sandia.gov/~sjplimp/lammps.html
Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
// LAMMPS
#include "fix_atc.h"
#include "fix_nve.h"
#include "atom.h"
#include "force.h"
#include "update.h"
#include "respa.h"
#include "error.h"
#include "neighbor.h"
#include "neigh_request.h"
#include "pointers.h"
#include "comm.h"
#include "group.h"
// ATC
#include "ATC_Method.h"
#include "ATC_Transfer.h"
#include "ATC_TransferKernel.h"
#include "ATC_TransferPartitionOfUnity.h"
#include "ATC_CouplingEnergy.h"
#include "ATC_CouplingMomentum.h"
#include "ATC_CouplingMass.h"
#include "ATC_CouplingMomentumEnergy.h"
#include "LammpsInterface.h"
// other
#include "stdio.h"
#include "string.h"
#include <sstream>
#include <string>
using namespace LAMMPS_NS;
using namespace FixConst;
+using std::string;
// main page of doxygen documentation
/*! \mainpage AtC : Atom-to-Continuum methods
fix commands:
- \ref man_fix_atc (links to all related commands)
*/
/* ------------------------------------------------------------------------- */
FixATC::FixATC(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg),
lammps_(lmp), atc_(NULL)
{
// ID GROUP atc PHYSICSTYPE [PARAMETERFILE]
if (narg < 4 || narg > 5) lmp->error->all(FLERR,"Illegal fix atc command");
// Set LAMMPS pointer on LammpsInterface
ATC::LammpsInterface::instance()->set_lammps(lmp);
/*! \page man_fix_atc fix atc command
\section syntax
fix <fixID> <group> atc <type> <parameter_file>
- fixID = name of fix
- group = name of group fix is to be applied
- type\n
= thermal : thermal coupling with fields: temperature \n
= two_temperature : electron-phonon coupling with field: temperature and electron_temperature \n
= hardy : on-the-fly post-processing using kernel localization functions (see "related" section for possible fields) \n
= field : on-the-fly post-processing using mesh-based localization functions (see "related" section for possible fields) \n
- parameter_file = name of the file with material parameters. \n
note: Neither hardy nor field requires a parameter file
\section examples
<TT> fix AtC internal atc thermal Ar_thermal.dat </TT> \n
<TT> fix AtC internal atc two_temperature Ar_ttm.mat </TT> \n
<TT> fix AtC internal atc hardy </TT> \n
<TT> fix AtC internal atc field </TT> \n
\section description
This fix is the beginning to creating a coupled FE/MD simulation and/or
an on-the-fly estimation of continuum fields. The coupled versions of this
fix do Verlet integration and the /post-processing does not.
After instantiating this fix, several other fix_modify commands will be
needed to set up the problem, e.g. define the finite element mesh and
prescribe initial and boundary conditions.
The following coupling example is typical, but non-exhaustive:\n
<TT>
# ... commands to create and initialize the MD system \n
# initial fix to designate coupling type and group to apply it to \n
# tag group physics material_file \n
fix AtC internal atc thermal Ar_thermal.mat\n \n
# create a uniform 12 x 2 x 2 mesh that covers region contain the group \n
# nx ny nz region periodicity \n
fix_modify AtC mesh create 12 2 2 mdRegion f p p\n \n
# specify the control method for the type of coupling \n
# physics control_type \n
fix_modify AtC thermal control flux \n \n
# specify the initial values for the empirical field "temperature" \n
# field node_group value \n
fix_modify AtC initial temperature all 30.\n \n
# create an output stream for nodal fields \n
# filename output_frequency \n
fix_modify AtC output atc_fe_output 100\n \n
run 1000 \n
</TT>
likewise for this post-processing example: \n
<TT>
# ... commands to create and initialize the MD system \n
# initial fix to designate post-processing and the group to apply it to \n
# no material file is allowed nor required \n
fix AtC internal atc hardy \n \n
# for hardy fix, specific kernel function (function type and range) to
# be used as a localization function \n
fix AtC kernel quartic_sphere 10.0 \n \n
# create a uniform 1 x 1 x 1 mesh that covers region contain the group \n
# with periodicity this effectively creats a system average \n
fix_modify AtC mesh create 1 1 1 box p p p \n\n
# change from default lagrangian map to eulerian \n
# refreshed every 100 steps \n
fix_modify AtC atom_element_map eulerian 100 \n \n
# start with no field defined \n
# add mass density, potential energy density, stress and temperature \n
fix_modify AtC fields add density energy stress temperature \n\n
# create an output stream for nodal fields \n
# filename output_frequency \n
fix_modify AtC output nvtFE 100 text \n
run 1000 \n
</TT>
the mesh's linear interpolation functions can be used as the localization function \n
by using the field option: \n
<TT>
fix AtC internal atc field \n \n
fix_modify AtC mesh create 1 1 1 box p p p \n\n
... \n\n
</TT>
Note coupling and post-processing can be combined in the same simulations
using separate fixes.
\n
For detailed exposition of the theory and algorithms please see:\n
- - Wagner, GJ; Jones, RE; Templeton, JA; Parks, MA. <VAR> An
+ - Wagner, GJ; Jones, RE; Templeton, JA; Parks, MA, <VAR> An
atomistic-to-continuum coupling method for heat transfer in solids. </VAR>
Special Issue of Computer Methods and Applied Mechanics (2008) 197:3351. \n
- Zimmerman, JA; Webb, EB; Hoyt, JJ;. Jones, RE; Klein, PA; Bammann, DJ,
<VAR> Calculation of stress in atomistic simulation. </VAR>
Special Issue of Modelling and Simulation in Materials Science and
Engineering (2004), 12:S319. \n
- Zimmerman, JA; Jones, RE; Templeton, JA,
<VAR> A material frame approach for evaluating continuum variables in
atomistic simulations. </VAR>
Journal of Computational Physics (2010), 229:2364. \n
+ - Templeton, JA; Jones, RE; Wagner, GJ, <VAR> Application of a field-based method
+ to spatially varying thermal transport problems in molecular dynamics. </VAR>
+ Modelling and Simulation in Materials Science and Engineering (2010), 18:085007. \n
+ - Jones, RE; Templeton, JA; Wagner, GJ; Olmsted, D; Modine, JA, <VAR>
+ Electron transport enhanced molecular dynamics for metals and semi-metals. </VAR>
+ International Journal for Numerical Methods in Engineering (2010), 83:940. \n
+ - Templeton, JA; Jones, RE; Lee, JW; Zimmerman, JA; Wong, BM,
+ <VAR> A long-range electric field solver for molecular dynamics based on
+ atomistic-to-continuum modeling. </VAR>
+ Journal of Chemical Theory and Computation (2011), 7:1736. \n
+ - Mandadapu, KK; Templeton, JA; Lee, JW, <VAR> Polarization as a field variable
+ from molecular dynamics simulations. </VAR>
+ Journal of Chemical Physics (2013), 139:054115. \n
Please refer to the standard
finite element (FE) texts, e.g. T.J.R Hughes <VAR> The finite element
method </VAR>, Dover 2003, for the basics of FE simulation.
\section restrictions
Thermal and two_temperature (coupling) types use a Verlet time-integration
algorithm.
The hardy type does not contain its own time-integrator and must be used
with a separate fix that does contain one, e.g. nve, nvt, etc.
Currently,
- the coupling is restricted to thermal physics
- the FE computations are done in serial on each processor.
\section related
fix_modify commands for setup: \n
- \ref man_mesh_create
- \ref man_mesh_quadrature
- \ref man_mesh_read
- \ref man_mesh_write
- \ref man_mesh_create_nodeset
- \ref man_mesh_add_to_nodeset
- \ref man_mesh_create_faceset_box
- \ref man_mesh_create_faceset_plane
- \ref man_mesh_create_elementset
- \ref man_mesh_delete_elements
- \ref man_mesh_nodeset_to_elementset
- \ref man_boundary
- \ref man_internal_quadrature
- \ref man_thermal_time_integration
- \ref man_momentum_time_integration
- \ref man_electron_integration
- \ref man_internal_element_set
- \ref man_decomposition
fix_modify commands for boundary and initial conditions:\n
- \ref man_initial
- \ref man_fix_nodes
- \ref man_unfix_nodes
- \ref man_fix_flux
- \ref man_unfix_flux
- \ref man_source
- \ref man_remove_source
fix_modify commands for control and filtering: \n
- \ref man_control
- \ref man_control_thermal
- \ref man_control_thermal_correction_max_iterations
- \ref man_control_momentum
- \ref man_localized_lambda
- \ref man_lumped_lambda_solve
- \ref man_mask_direction
- \ref man_time_filter
- \ref man_filter_scale
- \ref man_filter_type
- \ref man_equilibrium_start
- \ref man_extrinsic_exchange
- \ref man_charge_control
- \ref man_poisson_solver
fix_modify commands for output: \n
- \ref man_output
- \ref man_output_nodeset
- \ref man_output_elementset
- \ref man_boundary_integral
- \ref man_contour_integral
- \ref man_mesh_output
- \ref man_write_restart
- \ref man_read_restart
fix_modify commands for post-processing: \n
- \ref man_hardy_kernel
- \ref man_hardy_fields
- \ref man_hardy_gradients
- \ref man_hardy_rates
- \ref man_hardy_computes
- \ref man_hardy_on_the_fly
- \ref man_pair_interactions
- \ref man_sample_frequency
- \ref man_set
miscellaneous fix_modify commands: \n
- \ref man_atom_element_map
- \ref man_atom_weight
- \ref man_write_atom_weights
- \ref man_reset_time
- \ref man_reset_atomic_reference_positions
- \ref man_fe_md_boundary
- \ref man_boundary_faceset
- \ref man_consistent_fe_initialization
- \ref man_mass_matrix
- \ref man_material
- \ref man_atomic_charge
- \ref man_source_integration
- \ref man_temperature_definition
- \ref man_track_displacement
- \ref man_boundary_dynamics
- \ref man_add_species
- \ref man_add_molecule
- \ref man_remove_species
- \ref man_remove_molecule
Note: a set of example input files with the attendant material files are
included with this package
\section default
none
*/
// Construct new ATC_Method object
// note use "unfix" to destroy
int me = ATC::LammpsInterface::instance()->comm_rank();
std::string groupName(arg[1]);
int igroup = group->find(groupName.c_str());
int atomCount = group->count(igroup);
try {
// Postprocessing
if (strcmp(arg[3],"field")==0)
{
if (atomCount == 0) {
if (me==0) printf("ATC: can't construct transfer, no atoms in group \n");
throw;
}
if (narg < 5) {
if (me==0) printf("ATC: constructing shape function field estimate\n");
atc_ = new ATC::ATC_TransferPartitionOfUnity(groupName,
array_atom,
this);
}
else {
if (me==0) printf("ATC: constructing shape function field estimate with parameter file %s\n",arg[4]);
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
atc_ = new ATC::ATC_TransferPartitionOfUnity(groupName,
array_atom, this,
matParamFile);
}
}
else if (strcmp(arg[3],"hardy")==0)
{
if (atomCount == 0) {
if (me==0) printf("ATC: Can't construct transfer, no atoms in group \n");
throw;
}
if (narg < 5) {
if (me==0) printf("ATC: constructing kernel field estimate\n");
atc_ = new ATC::ATC_TransferKernel(groupName,
array_atom,
this);
}
else {
if (me==0) printf("ATC: constructing kernel field estimate with parameter file %s\n",arg[4]);
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
atc_ = new ATC::ATC_TransferKernel(groupName,
array_atom, this,
matParamFile);
}
}
// PhysicsTypes
else if (strcmp(arg[3],"thermal")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing thermal coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingEnergy(groupName,
array_atom, this,
matParamFile);
}
else if (strcmp(arg[3],"two_temperature")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing two_temperature coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingEnergy(groupName,
array_atom, this,
matParamFile, ATC::TWO_TEMPERATURE);
}
else if (strcmp(arg[3],"drift_diffusion")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing drift_diffusion coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingEnergy(groupName,
array_atom, this,
matParamFile, ATC::DRIFT_DIFFUSION);
}
else if (strcmp(arg[3],"drift_diffusion-equilibrium")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing drift_diffusion-equilibrium coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingEnergy(groupName,
array_atom, this,
matParamFile, ATC::DRIFT_DIFFUSION_EQUILIBRIUM);
}
else if (strcmp(arg[3],"drift_diffusion-schrodinger")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing drift_diffusion-schrodinger coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingEnergy(groupName,
array_atom, this,
matParamFile, ATC::DRIFT_DIFFUSION_SCHRODINGER);
}
else if (strcmp(arg[3],"drift_diffusion-schrodinger-slice")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("Constructing ATC transfer (drift_diffusion-schrodinger-slice) with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingEnergy(groupName,
array_atom, this,
matParamFile, ATC::DRIFT_DIFFUSION_SCHRODINGER_SLICE);
}
else if (strcmp(arg[3],"convective_drift_diffusion")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing convective_drift_diffusion coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingEnergy(groupName,
array_atom, this,
matParamFile, ATC::CONVECTIVE_DRIFT_DIFFUSION);
}
else if (strcmp(arg[3],"convective_drift_diffusion-equilibrium")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing convective_drift_diffusion-equilibrium coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingEnergy(groupName,
array_atom, this,
matParamFile, ATC::CONVECTIVE_DRIFT_DIFFUSION_EQUILIBRIUM);
}
else if (strcmp(arg[3],"convective_drift_diffusion-schrodinger")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing convective_drift_diffusion-schrodinger coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingEnergy(groupName,
array_atom, this,
matParamFile, ATC::CONVECTIVE_DRIFT_DIFFUSION_SCHRODINGER);
}
else if (strcmp(arg[3],"elastic")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing elastic coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingMomentum(groupName,
array_atom, this,
matParamFile,
ATC::ELASTIC);
}
else if (strcmp(arg[3],"electrostatic")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing electrostatic mechanical coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingMomentum(groupName,
array_atom, this,
matParamFile,
ATC::ELASTIC,
ATC::ELECTROSTATIC);
}
else if (strcmp(arg[3],"electrostatic-equilibrium")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing equilibrium electrostatic coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingMomentum(groupName,
array_atom, this,
matParamFile,
ATC::ELASTIC,
ATC::ELECTROSTATIC_EQUILIBRIUM);
}
else if (strcmp(arg[3],"shear")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing viscous/shear coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingMomentum(groupName,
array_atom, this,
matParamFile,
ATC::SHEAR);
}
else if (strcmp(arg[3],"electrostatic_equilibrium")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("Constructing ATC transfer (electrostatic_equilibrium) with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingMomentum(groupName,
array_atom, this,
matParamFile,
ATC::ELASTIC,
ATC::ELECTROSTATIC_EQUILIBRIUM);
}
else if (strcmp(arg[3],"species")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing species diffusion coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingMass(groupName,
array_atom, this,
matParamFile);
}
else if (strcmp(arg[3],"species_electrostatic")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing electrostatic species coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingMass(groupName,
array_atom, this,
matParamFile, ATC::FEM_EFIELD);
}
else if (strcmp(arg[3],"thermo_elastic")==0)
{
- std::string matParamFile = arg[4];
+ string matParamFile = arg[4];
if (me==0) printf("ATC: constructing thermo-mechanical coupling with parameter file %s\n",arg[4]);
atc_ = new ATC::ATC_CouplingMomentumEnergy(groupName,
array_atom, this,
matParamFile);
}
else
{
lmp->error->all(FLERR,"Unknown physics type in ATC");
}
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
lmp->atom->add_callback(0);
// we write our own restart file
restart_global = 0;
// Set output computation data based on transfer info
scalar_flag = atc_->scalar_flag();
vector_flag = atc_->vector_flag();
size_vector = atc_->size_vector();
global_freq = atc_->global_freq();
extscalar = atc_->extscalar();
extvector = atc_->extvector();
extlist = atc_->extlist();
thermo_energy = atc_->thermo_energy_flag();
// set pointer for output
peratom_flag = atc_->peratom_flag();
size_peratom_cols = atc_->size_peratom_cols();
peratom_freq = atc_->peratom_freq();
// set comm size needed by this fix
comm_forward = atc_->comm_forward();
// call this fix every step
nevery = 1;
}
/*----------------------------------------------------------------------- */
FixATC::~FixATC()
{
if (lmp->atom) lmp->atom->delete_callback(id,0);
if (atc_) delete atc_;
}
/* ---------------------------------------------------------------------- */
int FixATC::setmask()
{
int mask = 0;
mask |= INITIAL_INTEGRATE;
mask |= FINAL_INTEGRATE;
mask |= PRE_EXCHANGE;
mask |= PRE_NEIGHBOR;
mask |= PRE_FORCE;
mask |= POST_FORCE;
mask |= MIN_PRE_EXCHANGE;
mask |= MIN_PRE_NEIGHBOR;
mask |= MIN_PRE_FORCE;
mask |= MIN_POST_FORCE;
mask |= THERMO_ENERGY;
mask |= POST_RUN;
mask |= END_OF_STEP;
return mask;
}
/* ---------------------------------------------------------------------- */
int FixATC::modify_param(int narg, char** arg)
{
bool match;
// pass on to transfer layer
try {
match = atc_->modify(narg,arg);
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
if (!match) return 0;
return narg;
}
/* ----------------------------------------------------------------------
create initial list of neighbor partners via call to neighbor->build()
must be done in setup (not init) since fix init comes before neigh init
------------------------------------------------------------------------- */
void FixATC::init()
{
// Guarantee construction of full neighborlist
int irequest = neighbor->request((void *) this);
neighbor->requests[irequest]->pair = 0;
neighbor->requests[irequest]->fix = 1;
neighbor->requests[irequest]->half = 0;
neighbor->requests[irequest]->full = 1;
// create computes, if necessary
atc_->init_computes();
}
void FixATC::min_setup(int vflag)
{
setup(vflag);
}
void FixATC::setup(int vflag)
{
comm->forward_comm_fix(this);
try {
atc_->initialize();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
/* ----------------------------------------------------------------------
pass throughs to atc functions to handle swapping atom data on
when they move processors
------------------------------------------------------------------------- */
void FixATC::pre_exchange()
{
try {
atc_->pre_exchange();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
void FixATC::setup_pre_exchange()
{
if (atc_->is_initialized()) {
try {
atc_->setup_pre_exchange();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
}
void FixATC::min_pre_exchange()
{
try {
atc_->pre_exchange();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
void FixATC::min_setup_pre_exchange()
{
try {
atc_->pre_exchange();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
double FixATC::memory_usage()
{
double bytes = (double) atc_->memory_usage() * sizeof(double);
return bytes;
}
void FixATC::grow_arrays(int nmax)
{
atc_->grow_arrays(nmax);
}
void FixATC::copy_arrays(int i, int j, int delflag)
{
atc_->copy_arrays(i,j);
}
int FixATC::pack_exchange(int i, double * buf)
{
int num = atc_->pack_exchange(i,buf);
return num;
}
int FixATC::unpack_exchange(int nlocal, double * buf)
{
int num = atc_->unpack_exchange(nlocal,buf);
return num;
}
int FixATC::pack_comm(int n, int *list, double *buf, int pbc_flag, int *pbc)
{
int num = atc_->pack_comm(n, list, buf, pbc_flag, pbc);
return num;
}
void FixATC::unpack_comm(int n, int first, double *buf)
{
atc_->unpack_comm(n, first, buf);
}
/* ----------------------------------------------------------------------
pack values in local atom-based arrays for restart file
------------------------------------------------------------------------- */
int FixATC::pack_restart(int i, double *buf){
return 0;
}
/* ----------------------------------------------------------------------
unpack values from atom->extra array to restart the fix
------------------------------------------------------------------------- */
void FixATC::unpack_restart(int nlocal, int nth){
}
/* ----------------------------------------------------------------------
maxsize of any atom's restart data
------------------------------------------------------------------------- */
int FixATC::maxsize_restart(){
return 0;
}
/* ----------------------------------------------------------------------
size of atom nlocal's restart data
------------------------------------------------------------------------- */
int FixATC::size_restart(int nlocal){
return 0;
}
/* ----------------------------------------------------------------------
pack entire state of Fix into one write
------------------------------------------------------------------------- */
void FixATC::write_restart(FILE *fp){
char ** args = new char*[2];
args[0] = new char[50];
args[1] = new char[50];
sprintf(args[0],"write_restart");
sprintf(args[1],"ATC.restart");
// Then call all objects I own to write their data
if (comm->me == 0) {
atc_->modify(2,args);
}
delete [] args[0];
delete [] args[1];
delete [] args;
}
/* ----------------------------------------------------------------------
use state info from restart file to restart the Fix
------------------------------------------------------------------------- */
void FixATC::restart(char *buf){
char ** args = new char*[2];
args[0] = new char[50];
args[1] = new char[50];
sprintf(args[0],"read_restart");
sprintf(args[1],"ATC.restart");
// Then call all objects I own to write their data
if (comm->me == 0) {
atc_->modify(2,args);
}
delete [] args[0];
delete [] args[1];
delete [] args;
}
/* ----------------------------------------------------------------------
allow for both per-type and per-atom mass
------------------------------------------------------------------------- */
void FixATC::initial_integrate(int vflag)
{
try {
atc_->pre_init_integrate();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
try {
atc_->init_integrate_velocity();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
try {
atc_->mid_init_integrate();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
try {
atc_->init_integrate_position();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
try {
atc_->post_init_integrate();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
-
/* ---------------------------------------------------------------------- */
void FixATC::final_integrate()
{
try {
atc_->pre_final_integrate();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
try {
atc_->final_integrate();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
try {
atc_->post_final_integrate();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
/* ---------------------------------------------------------------------- */
void FixATC::init_list(int id, NeighList *ptr) {
ATC::LammpsInterface::instance()->set_list(id,ptr);
}
/* ---------------------------------------------------------------------- */
void FixATC::pre_neighbor()
{
try {
atc_->pre_neighbor();
comm->forward_comm_fix(this);
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
/* ---------------------------------------------------------------------- */
void FixATC::pre_force(int vflag)
{
try {
atc_->pre_force();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
/* ---------------------------------------------------------------------- */
void FixATC::post_force(int vflag)
{
try {
atc_->post_force();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
/* ---------------------------------------------------------------------- */
void FixATC::end_of_step()
{
try {
atc_->end_of_step();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
/* ---------------------------------------------------------------------- */
void FixATC::post_run()
{
try {
atc_->finish();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
/* ---------------------------------------------------------------------- */
void FixATC::setup_pre_neighbor()
{
if (atc_->is_initialized()) {
try {
atc_->pre_neighbor();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
}
/* ---------------------------------------------------------------------- */
void FixATC::min_setup_pre_neighbor()
{
if (atc_->is_initialized()) {
try {
atc_->pre_neighbor();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
}
/* ---------------------------------------------------------------------- */
void FixATC::min_pre_force(int vflag)
{
try {
atc_->min_pre_force();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
/* ---------------------------------------------------------------------- */
void FixATC::min_post_force(int vflag)
{
try {
atc_->min_post_force();
}
catch (ATC::ATC_Error& atcError) {
ATC::LammpsInterface::instance()->print_msg(atcError.error_description());
throw;
}
}
/* ---------------------------------------------------------------------- */
double FixATC::compute_scalar()
{
return atc_->compute_scalar();
}
/* ---------------------------------------------------------------------- */
double FixATC::compute_vector(int n)
{
return atc_->compute_vector(n);
}
/* ---------------------------------------------------------------------- */
double FixATC::compute_array(int irow, int icol)
{
return atc_->compute_array(irow,icol);
}
diff --git a/src/USER-ATC/fix_atc.h b/src/USER-ATC/fix_atc.h
index 971325f2d..11c5b909e 100644
--- a/src/USER-ATC/fix_atc.h
+++ b/src/USER-ATC/fix_atc.h
@@ -1,129 +1,128 @@
#ifdef FIX_CLASS
FixStyle(atc,FixATC)
#else
#ifndef FIX_ATC_H
#define FIX_ATC_H
#include "fix.h"
#include "pointers.h" // access to lammps pointers
namespace ATC {
class ATC_Method;
}
namespace LAMMPS_NS {
class NeighList;
/**
* @class FixATC
* @brief Class for an atom-to-continuum (ATC) Lammps fix.
*/
class FixATC : public Fix {
public:
/** constructor & destructor */
FixATC(class LAMMPS *, int, char **);
~FixATC();
/** initialization functions */
void init();
void init_list(int id, NeighList *ptr) ;
void setup(int vflag);
void min_setup(int vflag);
/** setmask: tell LAMMPS which fix methods to call */
int setmask();
/** initial_integrate */
void initial_integrate(int vflag);
-
/** final_integrate */
void final_integrate();
/** end of step for run or minimize */
void end_of_step();
/** pre_exchange is used to modify fix-specific data
and is called before domain->pbc() and comm->exchange(). */
void setup_pre_exchange();
void pre_exchange();
void min_setup_pre_exchange();
void min_pre_exchange();
double memory_usage();
void grow_arrays(int);
void copy_arrays(int, int, int);
/** pack_exchange called from atom_vec->pack_exchange()
and packs fix-specific data for a given real (local)
atom being sent to another processor. */
int pack_exchange(int, double *);
/** unpack_exchange called from atom_vec->unpack_exchange()
and unpacks fix-specific data for a given real (local)
atom received from another processor. */
int unpack_exchange(int, double *);
/** pack_comm called from comm->forward_comm_fix and
packs fix-specific data for a given ghost atom
from exchange with another proc */
int pack_comm(int , int *, double *, int, int *);
/** unpack_comm called from comm->forward_comm_fix and
unpacks fix-specific data for a given ghost atom
from exchange with another proc */
void unpack_comm(int, int, double *);
/** pre_neighbor is used to modify fix-specific data
and is called before neighbor list is built in
neighbor->build(). */
void pre_neighbor();
void setup_pre_neighbor();
void min_setup_pre_neighbor();
/** pre/post_force is used to modify fix-specific data
and is before/after the various force computations. */
void pre_force(int vflag);
void post_force(int vflag);
/** post_run is called after a run completes */
void post_run();
/** min_pre_force is called before forces are calculated in minimize */
void min_pre_force(int vflag);
/** min_post_force is called after forces are calculated in minimize */
void min_post_force(int vflag);
/** modify atc parameters (parser) */
int modify_param(int narg, char** arg);
/** calls ATC_Method to handle restarting/checkpointing */
/** these four methods are for writing per-atom quantities */
int pack_restart(int, double *);
void unpack_restart(int, int);
int size_restart(int);
int maxsize_restart();
/** these two methods are for writing all other quantities */
void write_restart(FILE *);
void restart(char *);
/** accessor function for ATC_Method class pointer */
const ATC::ATC_Method* atc() { return atc_; }
protected:
LAMMPS * lammps_;
/** functions for "thermo" output */
virtual double compute_scalar() ;
virtual double compute_vector(int n) ;
virtual double compute_array(int irow, int icol) ;
double dtv,dtf;
ATC::ATC_Method *atc_;
};
}
#endif
#endif
diff --git a/src/fix.cpp b/src/fix.cpp
index b88f3b70a..1fb1c43f7 100644
--- a/src/fix.cpp
+++ b/src/fix.cpp
@@ -1,184 +1,183 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "string.h"
#include "ctype.h"
#include "fix.h"
#include "atom.h"
#include "group.h"
#include "atom_masks.h"
#include "memory.h"
#include "error.h"
using namespace LAMMPS_NS;
using namespace FixConst;
/* ---------------------------------------------------------------------- */
Fix::Fix(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp)
{
// fix ID, group, and style
// ID must be all alphanumeric chars or underscores
int n = strlen(arg[0]) + 1;
id = new char[n];
strcpy(id,arg[0]);
for (int i = 0; i < n-1; i++)
if (!isalnum(id[i]) && id[i] != '_')
error->all(FLERR,"Fix ID must be alphanumeric or underscore characters");
igroup = group->find(arg[1]);
if (igroup == -1) error->all(FLERR,"Could not find fix group ID");
groupbit = group->bitmask[igroup];
n = strlen(arg[2]) + 1;
style = new char[n];
strcpy(style,arg[2]);
- restart_global = 0;
- restart_peratom = 0;
+ restart_global = restart_peratom = restart_file = 0;
force_reneighbor = 0;
box_change_size = box_change_shape = box_change_domain = 0;
thermo_energy = 0;
rigid_flag = 0;
virial_flag = 0;
no_change_box = 0;
time_integrate = 0;
time_depend = 0;
create_attribute = 0;
restart_pbc = 0;
wd_header = wd_section = 0;
cudable_comm = 0;
scalar_flag = vector_flag = array_flag = 0;
peratom_flag = local_flag = 0;
comm_forward = comm_reverse = comm_border = 0;
restart_reset = 0;
maxvatom = 0;
vatom = NULL;
datamask = ALL_MASK;
datamask_ext = ALL_MASK;
}
/* ---------------------------------------------------------------------- */
Fix::~Fix()
{
delete [] id;
delete [] style;
memory->destroy(vatom);
}
/* ----------------------------------------------------------------------
process params common to all fixes here
if unknown param, call modify_param specific to the fix
------------------------------------------------------------------------- */
void Fix::modify_params(int narg, char **arg)
{
if (narg == 0) error->all(FLERR,"Illegal fix_modify command");
int iarg = 0;
while (iarg < narg) {
if (strcmp(arg[iarg],"energy") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix_modify command");
if (strcmp(arg[iarg+1],"no") == 0) thermo_energy = 0;
else if (strcmp(arg[iarg+1],"yes") == 0) thermo_energy = 1;
else error->all(FLERR,"Illegal fix_modify command");
iarg += 2;
} else {
int n = modify_param(narg-iarg,&arg[iarg]);
if (n == 0) error->all(FLERR,"Illegal fix_modify command");
iarg += n;
}
}
}
/* ----------------------------------------------------------------------
setup for virial computation
see integrate::ev_set() for values of vflag (0-6)
------------------------------------------------------------------------- */
void Fix::v_setup(int vflag)
{
int i,n;
evflag = 1;
vflag_global = vflag % 4;
vflag_atom = vflag / 4;
// reallocate per-atom array if necessary
if (vflag_atom && atom->nlocal > maxvatom) {
maxvatom = atom->nmax;
memory->destroy(vatom);
memory->create(vatom,maxvatom,6,"fix:vatom");
}
// zero accumulators
if (vflag_global) for (i = 0; i < 6; i++) virial[i] = 0.0;
if (vflag_atom) {
n = atom->nlocal;
for (i = 0; i < n; i++) {
vatom[i][0] = 0.0;
vatom[i][1] = 0.0;
vatom[i][2] = 0.0;
vatom[i][3] = 0.0;
vatom[i][4] = 0.0;
vatom[i][5] = 0.0;
}
}
}
/* ----------------------------------------------------------------------
tally virial into global and per-atom accumulators
v = total virial for the interaction involving total atoms
n = # of local atoms involved, with local indices in list
increment global virial by n/total fraction
increment per-atom virial of each atom in list by 1/total fraction
assumes other procs will tally left-over fractions
------------------------------------------------------------------------- */
void Fix::v_tally(int n, int *list, double total, double *v)
{
int m;
if (vflag_global) {
double fraction = n/total;
virial[0] += fraction*v[0];
virial[1] += fraction*v[1];
virial[2] += fraction*v[2];
virial[3] += fraction*v[3];
virial[4] += fraction*v[4];
virial[5] += fraction*v[5];
}
if (vflag_atom) {
double fraction = 1.0/total;
for (int i = 0; i < n; i++) {
m = list[i];
vatom[m][0] += fraction*v[0];
vatom[m][1] += fraction*v[1];
vatom[m][2] += fraction*v[2];
vatom[m][3] += fraction*v[3];
vatom[m][4] += fraction*v[4];
vatom[m][5] += fraction*v[5];
}
}
}
diff --git a/src/fix.h b/src/fix.h
index c66552dfe..002027e4f 100644
--- a/src/fix.h
+++ b/src/fix.h
@@ -1,237 +1,239 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifndef LMP_FIX_H
#define LMP_FIX_H
#include "pointers.h"
namespace LAMMPS_NS {
class Fix : protected Pointers {
public:
char *id,*style;
int igroup,groupbit;
int restart_global; // 1 if Fix saves global state, 0 if not
int restart_peratom; // 1 if Fix saves peratom state, 0 if not
+ int restart_file; // 1 if Fix writes own restart file, 0 if not
int force_reneighbor; // 1 if Fix forces reneighboring, 0 if not
int box_change_size; // 1 if Fix changes box size, 0 if not
int box_change_shape; // 1 if Fix changes box shape, 0 if not
int box_change_domain; // 1 if Fix changes proc sub-domains, 0 if not
bigint next_reneighbor; // next timestep to force a reneighboring
int thermo_energy; // 1 if fix_modify enabled ThEng, 0 if not
int nevery; // how often to call an end_of_step fix
int rigid_flag; // 1 if Fix integrates rigid bodies, 0 if not
int virial_flag; // 1 if Fix contributes to virial, 0 if not
int no_change_box; // 1 if cannot swap ortho <-> triclinic
int time_integrate; // 1 if fix performs time integration, 0 if no
int time_depend; // 1 if requires continuous timestepping
int create_attribute; // 1 if fix stores attributes that need
// setting when a new atom is created
int restart_pbc; // 1 if fix moves atoms (except integrate)
// so write_restart must remap to PBC
int wd_header; // # of header values fix writes to data file
int wd_section; // # of sections fix writes to data file
int cudable_comm; // 1 if fix has CUDA-enabled communication
int scalar_flag; // 0/1 if compute_scalar() function exists
int vector_flag; // 0/1 if compute_vector() function exists
int array_flag; // 0/1 if compute_array() function exists
int size_vector; // length of global vector
int size_array_rows; // rows in global array
int size_array_cols; // columns in global array
int global_freq; // frequency s/v data is available at
int peratom_flag; // 0/1 if per-atom data is stored
int size_peratom_cols; // 0 = vector, N = columns in peratom array
int peratom_freq; // frequency per-atom data is available at
int local_flag; // 0/1 if local data is stored
int size_local_rows; // rows in local vector or array
int size_local_cols; // 0 = vector, N = columns in local array
int local_freq; // frequency local data is available at
int extscalar; // 0/1 if global scalar is intensive/extensive
int extvector; // 0/1/-1 if global vector is all int/ext/extlist
int *extlist; // list of 0/1 int/ext for each vec component
int extarray; // 0/1 if global array is intensive/extensive
double *vector_atom; // computed per-atom vector
double **array_atom; // computed per-atom array
double *vector_local; // computed local vector
double **array_local; // computed local array
int comm_forward; // size of forward communication (0 if none)
int comm_reverse; // size of reverse communication (0 if none)
int comm_border; // size of border communication (0 if none)
double virial[6]; // accumlated virial
double **vatom; // accumulated per-atom virial
int restart_reset; // 1 if restart just re-initialized fix
unsigned int datamask;
unsigned int datamask_ext;
Fix(class LAMMPS *, int, char **);
virtual ~Fix();
void modify_params(int, char **);
virtual int setmask() = 0;
virtual void init() {}
virtual void init_list(int, class NeighList *) {}
virtual void setup(int) {}
virtual void setup_pre_exchange() {}
virtual void setup_pre_neighbor() {}
virtual void setup_pre_force(int) {}
virtual void min_setup(int) {}
virtual void initial_integrate(int) {}
virtual void post_integrate() {}
virtual void pre_exchange() {}
virtual void pre_neighbor() {}
virtual void pre_force(int) {}
virtual void post_force(int) {}
virtual void final_integrate() {}
virtual void end_of_step() {}
virtual void post_run() {}
virtual void write_restart(FILE *) {}
+ virtual void write_restart_file(char *) {}
virtual void restart(char *) {}
virtual void grow_arrays(int) {}
virtual void copy_arrays(int, int, int) {}
virtual void set_arrays(int) {}
virtual void update_arrays(int, int) {}
virtual int pack_border(int, int *, double *) {return 0;}
virtual int unpack_border(int, int, double *) {return 0;}
virtual int pack_exchange(int, double *) {return 0;}
virtual int unpack_exchange(int, double *) {return 0;}
virtual int pack_restart(int, double *) {return 0;}
virtual void unpack_restart(int, int) {}
virtual int size_restart(int) {return 0;}
virtual int maxsize_restart() {return 0;}
virtual void setup_pre_force_respa(int, int) {}
virtual void initial_integrate_respa(int, int, int) {}
virtual void post_integrate_respa(int, int) {}
virtual void pre_force_respa(int, int, int) {}
virtual void post_force_respa(int, int, int) {}
virtual void final_integrate_respa(int, int) {}
virtual void min_setup_pre_exchange() {}
virtual void min_setup_pre_neighbor() {}
virtual void min_setup_pre_force(int) {}
virtual void min_pre_exchange() {}
virtual void min_pre_neighbor() {}
virtual void min_pre_force(int) {}
virtual void min_post_force(int) {}
virtual double min_energy(double *) {return 0.0;}
virtual void min_store() {}
virtual void min_clearstore() {}
virtual void min_pushstore() {}
virtual void min_popstore() {}
virtual int min_reset_ref() {return 0;}
virtual void min_step(double, double *) {}
virtual double max_alpha(double *) {return 0.0;}
virtual int min_dof() {return 0;}
virtual int pack_comm(int, int *, double *, int, int *) {return 0;}
virtual void unpack_comm(int, int, double *) {}
virtual int pack_reverse_comm(int, int, double *) {return 0;}
virtual void unpack_reverse_comm(int, int *, double *) {}
virtual double compute_scalar() {return 0.0;}
virtual double compute_vector(int) {return 0.0;}
virtual double compute_array(int,int) {return 0.0;}
virtual int dof(int) {return 0;}
virtual void deform(int) {}
virtual void reset_target(double) {}
virtual void reset_dt() {}
virtual void reset_timestep(bigint) {}
virtual void read_data_header(char *) {}
virtual void read_data_section(char *, int, char *) {}
virtual bigint read_data_skip_lines(char *) {return 0;}
virtual void write_data_header(FILE *, int) {}
virtual void write_data_section_size(int, int &, int &) {}
virtual void write_data_section_pack(int, double **) {}
virtual void write_data_section_keyword(int, FILE *) {}
virtual void write_data_section(int, FILE *, int, double **, int) {}
virtual int modify_param(int, char **) {return 0;}
virtual void *extract(const char *, int &) {return NULL;}
virtual double memory_usage() {return 0.0;}
virtual unsigned int data_mask() {return datamask;}
virtual unsigned int data_mask_ext() {return datamask_ext;}
protected:
int evflag;
int vflag_global,vflag_atom;
int maxvatom;
void v_setup(int);
void v_tally(int, int *, double, double *);
};
namespace FixConst {
static const int INITIAL_INTEGRATE = 1<<0;
static const int POST_INTEGRATE = 1<<1;
static const int PRE_EXCHANGE = 1<<2;
static const int PRE_NEIGHBOR = 1<<3;
static const int PRE_FORCE = 1<<4;
static const int POST_FORCE = 1<<5;
static const int FINAL_INTEGRATE = 1<<6;
static const int END_OF_STEP = 1<<7;
static const int THERMO_ENERGY = 1<<8;
static const int INITIAL_INTEGRATE_RESPA = 1<<9;
static const int POST_INTEGRATE_RESPA = 1<<10;
static const int PRE_FORCE_RESPA = 1<<11;
static const int POST_FORCE_RESPA = 1<<12;
static const int FINAL_INTEGRATE_RESPA = 1<<13;
static const int MIN_PRE_EXCHANGE = 1<<14;
static const int MIN_PRE_NEIGHBOR = 1<<15;
static const int MIN_PRE_FORCE = 1<<16;
static const int MIN_POST_FORCE = 1<<17;
static const int MIN_ENERGY = 1<<18;
static const int POST_RUN = 1<<19;
static const int FIX_CONST_LAST = 1<<20;
}
}
#endif
/* ERROR/WARNING messages:
E: Fix ID must be alphanumeric or underscore characters
Self-explanatory.
E: Could not find fix group ID
A group ID used in the fix command does not exist.
E: Illegal ... command
Self-explanatory. Check the input script syntax and compare to the
documentation for the command. You can use -echo screen as a
command-line option when running LAMMPS to see the offending line.
*/
diff --git a/src/math_extra.h b/src/math_extra.h
index 11e4fb69e..00186b705 100644
--- a/src/math_extra.h
+++ b/src/math_extra.h
@@ -1,612 +1,650 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing author: Mike Brown (SNL)
------------------------------------------------------------------------- */
#ifndef LMP_MATH_EXTRA_H
#define LMP_MATH_EXTRA_H
#include "math.h"
#include "stdio.h"
#include "string.h"
#include "error.h"
namespace MathExtra {
// 3 vector operations
inline void norm3(double *v);
inline void normalize3(const double *v, double *ans);
inline void snormalize3(const double, const double *v, double *ans);
inline void negate3(double *v);
inline void scale3(double s, double *v);
inline void add3(const double *v1, const double *v2, double *ans);
inline void sub3(const double *v1, const double *v2, double *ans);
inline double len3(const double *v);
inline double lensq3(const double *v);
inline double dot3(const double *v1, const double *v2);
inline void cross3(const double *v1, const double *v2, double *ans);
// 3x3 matrix operations
+ inline void col2mat(const double *ex, const double *ey, const double *ez,
+ double m[3][3]);
inline double det3(const double mat[3][3]);
- inline void diag_times3(const double *diagonal, const double mat[3][3],
+ inline void diag_times3(const double *d, const double m[3][3],
+ double ans[3][3]);
+ inline void times3_diag(const double m[3][3], const double *d,
double ans[3][3]);
inline void plus3(const double m[3][3], const double m2[3][3],
double ans[3][3]);
inline void times3(const double m[3][3], const double m2[3][3],
double ans[3][3]);
- inline void transpose_times3(const double mat1[3][3],
- const double mat2[3][3],
+ inline void transpose_times3(const double m[3][3], const double m2[3][3],
double ans[3][3]);
- inline void times3_transpose(const double mat1[3][3],
- const double mat2[3][3],
+ inline void times3_transpose(const double m[3][3], const double m2[3][3],
double ans[3][3]);
inline void invert3(const double mat[3][3], double ans[3][3]);
inline void matvec(const double mat[3][3], const double *vec, double *ans);
inline void matvec(const double *ex, const double *ey, const double *ez,
const double *vec, double *ans);
- inline void transpose_matvec(const double mat[3][3], const double*vec,
+ inline void transpose_matvec(const double mat[3][3], const double *vec,
double *ans);
inline void transpose_matvec(const double *ex, const double *ey,
const double *ez, const double *v,
double *ans);
- inline void transpose_diag3(const double mat[3][3], const double*vec,
+ inline void transpose_diag3(const double m[3][3], const double *d,
double ans[3][3]);
inline void vecmat(const double *v, const double m[3][3], double *ans);
inline void scalar_times3(const double f, double m[3][3]);
void write3(const double mat[3][3]);
int mldivide3(const double mat[3][3], const double *vec, double *ans);
int jacobi(double matrix[3][3], double *evalues, double evectors[3][3]);
void rotate(double matrix[3][3], int i, int j, int k, int l,
double s, double tau);
void richardson(double *q, double *m, double *w, double *moments, double dtq);
// shape matrix operations
// upper-triangular 3x3 matrix stored in Voigt notation as 6-vector
inline void multiply_shape_shape(const double *one, const double *two,
double *ans);
// quaternion operations
inline void qnormalize(double *q);
inline void qconjugate(double *q, double *qc);
inline void vecquat(double *a, double *b, double *c);
inline void quatvec(double *a, double *b, double *c);
inline void quatquat(double *a, double *b, double *c);
inline void invquatvec(double *a, double *b, double *c);
inline void axisangle_to_quat(const double *v, const double angle,
double *quat);
void angmom_to_omega(double *m, double *ex, double *ey, double *ez,
double *idiag, double *w);
void omega_to_angmom(double *w, double *ex, double *ey, double *ez,
double *idiag, double *m);
void mq_to_omega(double *m, double *q, double *moments, double *w);
void exyz_to_q(double *ex, double *ey, double *ez, double *q);
void q_to_exyz(double *q, double *ex, double *ey, double *ez);
void quat_to_mat(const double *quat, double mat[3][3]);
void quat_to_mat_trans(const double *quat, double mat[3][3]);
// rotation operations
inline void rotation_generator_x(const double m[3][3], double ans[3][3]);
inline void rotation_generator_y(const double m[3][3], double ans[3][3]);
inline void rotation_generator_z(const double m[3][3], double ans[3][3]);
// moment of inertia operations
void inertia_ellipsoid(double *shape, double *quat, double mass,
double *inertia);
void inertia_line(double length, double theta, double mass,
double *inertia);
void inertia_triangle(double *v0, double *v1, double *v2,
double mass, double *inertia);
void inertia_triangle(double *idiag, double *quat, double mass,
double *inertia);
}
/* ----------------------------------------------------------------------
normalize a vector in place
------------------------------------------------------------------------- */
inline void MathExtra::norm3(double *v)
{
double scale = 1.0/sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
v[0] *= scale;
v[1] *= scale;
v[2] *= scale;
}
/* ----------------------------------------------------------------------
normalize a vector, return in ans
------------------------------------------------------------------------- */
inline void MathExtra::normalize3(const double *v, double *ans)
{
double scale = 1.0/sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
ans[0] = v[0]*scale;
ans[1] = v[1]*scale;
ans[2] = v[2]*scale;
}
/* ----------------------------------------------------------------------
scale a vector to length
------------------------------------------------------------------------- */
inline void MathExtra::snormalize3(const double length, const double *v, double *ans)
{
double scale = length/sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
ans[0] = v[0]*scale;
ans[1] = v[1]*scale;
ans[2] = v[2]*scale;
}
/* ----------------------------------------------------------------------
negate vector v
------------------------------------------------------------------------- */
inline void MathExtra::negate3(double *v)
{
v[0] = -v[0];
v[1] = -v[1];
v[2] = -v[2];
}
/* ----------------------------------------------------------------------
scale vector v by s
------------------------------------------------------------------------- */
inline void MathExtra::scale3(double s, double *v)
{
v[0] *= s;
v[1] *= s;
v[2] *= s;
}
/* ----------------------------------------------------------------------
ans = v1 + v2
------------------------------------------------------------------------- */
inline void MathExtra::add3(const double *v1, const double *v2, double *ans)
{
ans[0] = v1[0] + v2[0];
ans[1] = v1[1] + v2[1];
ans[2] = v1[2] + v2[2];
}
/* ----------------------------------------------------------------------
ans = v1 - v2
------------------------------------------------------------------------- */
inline void MathExtra::sub3(const double *v1, const double *v2, double *ans)
{
ans[0] = v1[0] - v2[0];
ans[1] = v1[1] - v2[1];
ans[2] = v1[2] - v2[2];
}
/* ----------------------------------------------------------------------
length of vector v
------------------------------------------------------------------------- */
inline double MathExtra::len3(const double *v)
{
return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
}
/* ----------------------------------------------------------------------
squared length of vector v, or dot product of v with itself
------------------------------------------------------------------------- */
inline double MathExtra::lensq3(const double *v)
{
return v[0]*v[0] + v[1]*v[1] + v[2]*v[2];
}
/* ----------------------------------------------------------------------
dot product of 2 vectors
------------------------------------------------------------------------- */
inline double MathExtra::dot3(const double *v1, const double *v2)
{
return v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2];
}
/* ----------------------------------------------------------------------
cross product of 2 vectors
------------------------------------------------------------------------- */
inline void MathExtra::cross3(const double *v1, const double *v2, double *ans)
{
ans[0] = v1[1]*v2[2] - v1[2]*v2[1];
ans[1] = v1[2]*v2[0] - v1[0]*v2[2];
ans[2] = v1[0]*v2[1] - v1[1]*v2[0];
}
+/* ----------------------------------------------------------------------
+ construct matrix from 3 column vectors
+------------------------------------------------------------------------- */
+
+void MathExtra::col2mat(const double *ex, const double *ey, const double *ez,
+ double m[3][3])
+{
+ m[0][0] = ex[0];
+ m[1][0] = ex[1];
+ m[2][0] = ex[2];
+ m[0][1] = ey[0];
+ m[1][1] = ey[1];
+ m[2][1] = ey[2];
+ m[0][2] = ez[0];
+ m[1][2] = ez[1];
+ m[2][2] = ez[2];
+}
+
/* ----------------------------------------------------------------------
determinant of a matrix
------------------------------------------------------------------------- */
inline double MathExtra::det3(const double m[3][3])
{
double ans = m[0][0]*m[1][1]*m[2][2] - m[0][0]*m[1][2]*m[2][1] -
m[1][0]*m[0][1]*m[2][2] + m[1][0]*m[0][2]*m[2][1] +
m[2][0]*m[0][1]*m[1][2] - m[2][0]*m[0][2]*m[1][1];
return ans;
}
/* ----------------------------------------------------------------------
diagonal matrix times a full matrix
------------------------------------------------------------------------- */
inline void MathExtra::diag_times3(const double *d, const double m[3][3],
double ans[3][3])
{
ans[0][0] = d[0]*m[0][0];
ans[0][1] = d[0]*m[0][1];
ans[0][2] = d[0]*m[0][2];
ans[1][0] = d[1]*m[1][0];
ans[1][1] = d[1]*m[1][1];
ans[1][2] = d[1]*m[1][2];
ans[2][0] = d[2]*m[2][0];
ans[2][1] = d[2]*m[2][1];
ans[2][2] = d[2]*m[2][2];
}
+/* ----------------------------------------------------------------------
+ full matrix times a diagonal matrix
+------------------------------------------------------------------------- */
+
+void MathExtra::times3_diag(const double m[3][3], const double *d,
+ double ans[3][3])
+{
+ ans[0][0] = m[0][0]*d[0];
+ ans[0][1] = m[0][1]*d[1];
+ ans[0][2] = m[0][2]*d[2];
+ ans[1][0] = m[1][0]*d[0];
+ ans[1][1] = m[1][1]*d[1];
+ ans[1][2] = m[1][2]*d[2];
+ ans[2][0] = m[2][0]*d[0];
+ ans[2][1] = m[2][1]*d[1];
+ ans[2][2] = m[2][2]*d[2];
+}
+
/* ----------------------------------------------------------------------
add two matrices
------------------------------------------------------------------------- */
inline void MathExtra::plus3(const double m[3][3], const double m2[3][3],
double ans[3][3])
{
ans[0][0] = m[0][0]+m2[0][0];
ans[0][1] = m[0][1]+m2[0][1];
ans[0][2] = m[0][2]+m2[0][2];
ans[1][0] = m[1][0]+m2[1][0];
ans[1][1] = m[1][1]+m2[1][1];
ans[1][2] = m[1][2]+m2[1][2];
ans[2][0] = m[2][0]+m2[2][0];
ans[2][1] = m[2][1]+m2[2][1];
ans[2][2] = m[2][2]+m2[2][2];
}
/* ----------------------------------------------------------------------
multiply mat1 times mat2
------------------------------------------------------------------------- */
inline void MathExtra::times3(const double m[3][3], const double m2[3][3],
double ans[3][3])
{
ans[0][0] = m[0][0]*m2[0][0] + m[0][1]*m2[1][0] + m[0][2]*m2[2][0];
ans[0][1] = m[0][0]*m2[0][1] + m[0][1]*m2[1][1] + m[0][2]*m2[2][1];
ans[0][2] = m[0][0]*m2[0][2] + m[0][1]*m2[1][2] + m[0][2]*m2[2][2];
ans[1][0] = m[1][0]*m2[0][0] + m[1][1]*m2[1][0] + m[1][2]*m2[2][0];
ans[1][1] = m[1][0]*m2[0][1] + m[1][1]*m2[1][1] + m[1][2]*m2[2][1];
ans[1][2] = m[1][0]*m2[0][2] + m[1][1]*m2[1][2] + m[1][2]*m2[2][2];
ans[2][0] = m[2][0]*m2[0][0] + m[2][1]*m2[1][0] + m[2][2]*m2[2][0];
ans[2][1] = m[2][0]*m2[0][1] + m[2][1]*m2[1][1] + m[2][2]*m2[2][1];
ans[2][2] = m[2][0]*m2[0][2] + m[2][1]*m2[1][2] + m[2][2]*m2[2][2];
}
/* ----------------------------------------------------------------------
multiply the transpose of mat1 times mat2
------------------------------------------------------------------------- */
inline void MathExtra::transpose_times3(const double m[3][3], const double m2[3][3],
double ans[3][3])
{
ans[0][0] = m[0][0]*m2[0][0] + m[1][0]*m2[1][0] + m[2][0]*m2[2][0];
ans[0][1] = m[0][0]*m2[0][1] + m[1][0]*m2[1][1] + m[2][0]*m2[2][1];
ans[0][2] = m[0][0]*m2[0][2] + m[1][0]*m2[1][2] + m[2][0]*m2[2][2];
ans[1][0] = m[0][1]*m2[0][0] + m[1][1]*m2[1][0] + m[2][1]*m2[2][0];
ans[1][1] = m[0][1]*m2[0][1] + m[1][1]*m2[1][1] + m[2][1]*m2[2][1];
ans[1][2] = m[0][1]*m2[0][2] + m[1][1]*m2[1][2] + m[2][1]*m2[2][2];
ans[2][0] = m[0][2]*m2[0][0] + m[1][2]*m2[1][0] + m[2][2]*m2[2][0];
ans[2][1] = m[0][2]*m2[0][1] + m[1][2]*m2[1][1] + m[2][2]*m2[2][1];
ans[2][2] = m[0][2]*m2[0][2] + m[1][2]*m2[1][2] + m[2][2]*m2[2][2];
}
/* ----------------------------------------------------------------------
multiply mat1 times transpose of mat2
------------------------------------------------------------------------- */
inline void MathExtra::times3_transpose(const double m[3][3], const double m2[3][3],
double ans[3][3])
{
ans[0][0] = m[0][0]*m2[0][0] + m[0][1]*m2[0][1] + m[0][2]*m2[0][2];
ans[0][1] = m[0][0]*m2[1][0] + m[0][1]*m2[1][1] + m[0][2]*m2[1][2];
ans[0][2] = m[0][0]*m2[2][0] + m[0][1]*m2[2][1] + m[0][2]*m2[2][2];
ans[1][0] = m[1][0]*m2[0][0] + m[1][1]*m2[0][1] + m[1][2]*m2[0][2];
ans[1][1] = m[1][0]*m2[1][0] + m[1][1]*m2[1][1] + m[1][2]*m2[1][2];
ans[1][2] = m[1][0]*m2[2][0] + m[1][1]*m2[2][1] + m[1][2]*m2[2][2];
ans[2][0] = m[2][0]*m2[0][0] + m[2][1]*m2[0][1] + m[2][2]*m2[0][2];
ans[2][1] = m[2][0]*m2[1][0] + m[2][1]*m2[1][1] + m[2][2]*m2[1][2];
ans[2][2] = m[2][0]*m2[2][0] + m[2][1]*m2[2][1] + m[2][2]*m2[2][2];
}
/* ----------------------------------------------------------------------
invert a matrix
does NOT checks for singular or badly scaled matrix
------------------------------------------------------------------------- */
inline void MathExtra::invert3(const double m[3][3], double ans[3][3])
{
double den = m[0][0]*m[1][1]*m[2][2]-m[0][0]*m[1][2]*m[2][1];
den += -m[1][0]*m[0][1]*m[2][2]+m[1][0]*m[0][2]*m[2][1];
den += m[2][0]*m[0][1]*m[1][2]-m[2][0]*m[0][2]*m[1][1];
ans[0][0] = (m[1][1]*m[2][2]-m[1][2]*m[2][1]) / den;
ans[0][1] = -(m[0][1]*m[2][2]-m[0][2]*m[2][1]) / den;
ans[0][2] = (m[0][1]*m[1][2]-m[0][2]*m[1][1]) / den;
ans[1][0] = -(m[1][0]*m[2][2]-m[1][2]*m[2][0]) / den;
ans[1][1] = (m[0][0]*m[2][2]-m[0][2]*m[2][0]) / den;
ans[1][2] = -(m[0][0]*m[1][2]-m[0][2]*m[1][0]) / den;
ans[2][0] = (m[1][0]*m[2][1]-m[1][1]*m[2][0]) / den;
ans[2][1] = -(m[0][0]*m[2][1]-m[0][1]*m[2][0]) / den;
ans[2][2] = (m[0][0]*m[1][1]-m[0][1]*m[1][0]) / den;
}
/* ----------------------------------------------------------------------
matrix times vector
------------------------------------------------------------------------- */
inline void MathExtra::matvec(const double m[3][3], const double *v, double *ans)
{
ans[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];
ans[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];
ans[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];
}
/* ----------------------------------------------------------------------
matrix times vector
------------------------------------------------------------------------- */
inline void MathExtra::matvec(const double *ex, const double *ey, const double *ez,
const double *v, double *ans)
{
ans[0] = ex[0]*v[0] + ey[0]*v[1] + ez[0]*v[2];
ans[1] = ex[1]*v[0] + ey[1]*v[1] + ez[1]*v[2];
ans[2] = ex[2]*v[0] + ey[2]*v[1] + ez[2]*v[2];
}
/* ----------------------------------------------------------------------
transposed matrix times vector
------------------------------------------------------------------------- */
inline void MathExtra::transpose_matvec(const double m[3][3], const double *v,
double *ans)
{
ans[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2];
ans[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2];
ans[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2];
}
/* ----------------------------------------------------------------------
transposed matrix times vector
------------------------------------------------------------------------- */
inline void MathExtra::transpose_matvec(const double *ex, const double *ey,
const double *ez, const double *v,
double *ans)
{
ans[0] = ex[0]*v[0] + ex[1]*v[1] + ex[2]*v[2];
ans[1] = ey[0]*v[0] + ey[1]*v[1] + ey[2]*v[2];
ans[2] = ez[0]*v[0] + ez[1]*v[1] + ez[2]*v[2];
}
/* ----------------------------------------------------------------------
transposed matrix times diagonal matrix
------------------------------------------------------------------------- */
inline void MathExtra::transpose_diag3(const double m[3][3], const double *d,
double ans[3][3])
{
ans[0][0] = m[0][0]*d[0];
ans[0][1] = m[1][0]*d[1];
ans[0][2] = m[2][0]*d[2];
ans[1][0] = m[0][1]*d[0];
ans[1][1] = m[1][1]*d[1];
ans[1][2] = m[2][1]*d[2];
ans[2][0] = m[0][2]*d[0];
ans[2][1] = m[1][2]*d[1];
ans[2][2] = m[2][2]*d[2];
}
/* ----------------------------------------------------------------------
row vector times matrix
------------------------------------------------------------------------- */
inline void MathExtra::vecmat(const double *v, const double m[3][3], double *ans)
{
ans[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0];
ans[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1];
ans[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2];
}
/* ----------------------------------------------------------------------
matrix times scalar, in place
------------------------------------------------------------------------- */
inline void MathExtra::scalar_times3(const double f, double m[3][3])
{
m[0][0] *= f; m[0][1] *= f; m[0][2] *= f;
m[1][0] *= f; m[1][1] *= f; m[1][2] *= f;
m[2][0] *= f; m[2][1] *= f; m[2][2] *= f;
}
/* ----------------------------------------------------------------------
multiply 2 shape matrices
upper-triangular 3x3, stored as 6-vector in Voigt notation
------------------------------------------------------------------------- */
inline void MathExtra::multiply_shape_shape(const double *one, const double *two,
double *ans)
{
ans[0] = one[0]*two[0];
ans[1] = one[1]*two[1];
ans[2] = one[2]*two[2];
ans[3] = one[1]*two[3] + one[3]*two[2];
ans[4] = one[0]*two[4] + one[5]*two[3] + one[4]*two[2];
ans[5] = one[0]*two[5] + one[5]*two[1];
}
/* ----------------------------------------------------------------------
normalize a quaternion
------------------------------------------------------------------------- */
inline void MathExtra::qnormalize(double *q)
{
double norm = 1.0 / sqrt(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);
q[0] *= norm;
q[1] *= norm;
q[2] *= norm;
q[3] *= norm;
}
/* ----------------------------------------------------------------------
conjugate of a quaternion: qc = conjugate of q
assume q is of unit length
------------------------------------------------------------------------- */
inline void MathExtra::qconjugate(double *q, double *qc)
{
qc[0] = q[0];
qc[1] = -q[1];
qc[2] = -q[2];
qc[3] = -q[3];
}
/* ----------------------------------------------------------------------
vector-quaternion multiply: c = a*b, where a = (0,a)
------------------------------------------------------------------------- */
inline void MathExtra::vecquat(double *a, double *b, double *c)
{
c[0] = -a[0]*b[1] - a[1]*b[2] - a[2]*b[3];
c[1] = b[0]*a[0] + a[1]*b[3] - a[2]*b[2];
c[2] = b[0]*a[1] + a[2]*b[1] - a[0]*b[3];
c[3] = b[0]*a[2] + a[0]*b[2] - a[1]*b[1];
}
/* ----------------------------------------------------------------------
quaternion-vector multiply: c = a*b, where b = (0,b)
------------------------------------------------------------------------- */
inline void MathExtra::quatvec(double *a, double *b, double *c)
{
c[0] = -a[1]*b[0] - a[2]*b[1] - a[3]*b[2];
c[1] = a[0]*b[0] + a[2]*b[2] - a[3]*b[1];
c[2] = a[0]*b[1] + a[3]*b[0] - a[1]*b[2];
c[3] = a[0]*b[2] + a[1]*b[1] - a[2]*b[0];
}
/* ----------------------------------------------------------------------
quaternion-quaternion multiply: c = a*b
------------------------------------------------------------------------- */
inline void MathExtra::quatquat(double *a, double *b, double *c)
{
c[0] = a[0]*b[0] - a[1]*b[1] - a[2]*b[2] - a[3]*b[3];
c[1] = a[0]*b[1] + b[0]*a[1] + a[2]*b[3] - a[3]*b[2];
c[2] = a[0]*b[2] + b[0]*a[2] + a[3]*b[1] - a[1]*b[3];
c[3] = a[0]*b[3] + b[0]*a[3] + a[1]*b[2] - a[2]*b[1];
}
/* ----------------------------------------------------------------------
quaternion multiply: c = inv(a)*b
a is a quaternion
b is a four component vector
c is a three component vector
------------------------------------------------------------------------- */
inline void MathExtra::invquatvec(double *a, double *b, double *c)
{
c[0] = -a[1]*b[0] + a[0]*b[1] + a[3]*b[2] - a[2]*b[3];
c[1] = -a[2]*b[0] - a[3]*b[1] + a[0]*b[2] + a[1]*b[3];
c[2] = -a[3]*b[0] + a[2]*b[1] - a[1]*b[2] + a[0]*b[3];
}
/* ----------------------------------------------------------------------
compute quaternion from axis-angle rotation
v MUST be a unit vector
------------------------------------------------------------------------- */
inline void MathExtra::axisangle_to_quat(const double *v, const double angle,
double *quat)
{
double halfa = 0.5*angle;
double sina = sin(halfa);
quat[0] = cos(halfa);
quat[1] = v[0]*sina;
quat[2] = v[1]*sina;
quat[3] = v[2]*sina;
}
/* ----------------------------------------------------------------------
Apply principal rotation generator about x to rotation matrix m
------------------------------------------------------------------------- */
inline void MathExtra::rotation_generator_x(const double m[3][3], double ans[3][3])
{
ans[0][0] = 0;
ans[0][1] = -m[0][2];
ans[0][2] = m[0][1];
ans[1][0] = 0;
ans[1][1] = -m[1][2];
ans[1][2] = m[1][1];
ans[2][0] = 0;
ans[2][1] = -m[2][2];
ans[2][2] = m[2][1];
}
/* ----------------------------------------------------------------------
Apply principal rotation generator about y to rotation matrix m
------------------------------------------------------------------------- */
inline void MathExtra::rotation_generator_y(const double m[3][3], double ans[3][3])
{
ans[0][0] = m[0][2];
ans[0][1] = 0;
ans[0][2] = -m[0][0];
ans[1][0] = m[1][2];
ans[1][1] = 0;
ans[1][2] = -m[1][0];
ans[2][0] = m[2][2];
ans[2][1] = 0;
ans[2][2] = -m[2][0];
}
/* ----------------------------------------------------------------------
Apply principal rotation generator about z to rotation matrix m
------------------------------------------------------------------------- */
inline void MathExtra::rotation_generator_z(const double m[3][3], double ans[3][3])
{
ans[0][0] = -m[0][1];
ans[0][1] = m[0][0];
ans[0][2] = 0;
ans[1][0] = -m[1][1];
ans[1][1] = m[1][0];
ans[1][2] = 0;
ans[2][0] = -m[2][1];
ans[2][1] = m[2][0];
ans[2][2] = 0;
}
#endif
diff --git a/src/version.h b/src/version.h
index 04ec6eb77..0cf8063e7 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define LAMMPS_VERSION "22 Aug 2013"
+#define LAMMPS_VERSION "24 Aug 2013"
diff --git a/src/write_restart.cpp b/src/write_restart.cpp
index ce6c4b962..b494203ea 100644
--- a/src/write_restart.cpp
+++ b/src/write_restart.cpp
@@ -1,499 +1,506 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "lmptype.h"
#include "mpi.h"
#include "string.h"
#include "write_restart.h"
#include "atom.h"
#include "atom_vec.h"
#include "atom_vec_hybrid.h"
#include "group.h"
#include "force.h"
#include "pair.h"
#include "bond.h"
#include "angle.h"
#include "dihedral.h"
#include "improper.h"
#include "update.h"
#include "neighbor.h"
#include "domain.h"
#include "modify.h"
+#include "fix.h"
#include "universe.h"
#include "comm.h"
#include "output.h"
#include "thermo.h"
#include "memory.h"
#include "error.h"
using namespace LAMMPS_NS;
// same as read_restart.cpp and tools/restart2data.cpp
enum{VERSION,SMALLINT,TAGINT,BIGINT,
UNITS,NTIMESTEP,DIMENSION,NPROCS,PROCGRID_0,PROCGRID_1,PROCGRID_2,
NEWTON_PAIR,NEWTON_BOND,XPERIODIC,YPERIODIC,ZPERIODIC,
BOUNDARY_00,BOUNDARY_01,BOUNDARY_10,BOUNDARY_11,BOUNDARY_20,BOUNDARY_21,
ATOM_STYLE,NATOMS,NTYPES,
NBONDS,NBONDTYPES,BOND_PER_ATOM,
NANGLES,NANGLETYPES,ANGLE_PER_ATOM,
NDIHEDRALS,NDIHEDRALTYPES,DIHEDRAL_PER_ATOM,
NIMPROPERS,NIMPROPERTYPES,IMPROPER_PER_ATOM,
BOXLO_0,BOXHI_0,BOXLO_1,BOXHI_1,BOXLO_2,BOXHI_2,
SPECIAL_LJ_1,SPECIAL_LJ_2,SPECIAL_LJ_3,
SPECIAL_COUL_1,SPECIAL_COUL_2,SPECIAL_COUL_3,
XY,XZ,YZ};
enum{MASS};
enum{PAIR,BOND,ANGLE,DIHEDRAL,IMPROPER};
enum{IGNORE,WARN,ERROR}; // same as thermo.cpp
/* ---------------------------------------------------------------------- */
WriteRestart::WriteRestart(LAMMPS *lmp) : Pointers(lmp)
{
MPI_Comm_rank(world,&me);
MPI_Comm_size(world,&nprocs);
}
/* ----------------------------------------------------------------------
called as write_restart command in input script
------------------------------------------------------------------------- */
void WriteRestart::command(int narg, char **arg)
{
if (domain->box_exist == 0)
error->all(FLERR,"Write_restart command before simulation box is defined");
if (narg != 1) error->all(FLERR,"Illegal write_restart command");
// if filename contains a "*", replace with current timestep
char *ptr;
int n = strlen(arg[0]) + 16;
char *file = new char[n];
if ((ptr = strchr(arg[0],'*'))) {
*ptr = '\0';
sprintf(file,"%s" BIGINT_FORMAT "%s",arg[0],update->ntimestep,ptr+1);
} else strcpy(file,arg[0]);
// init entire system since comm->exchange is done
// comm::init needs neighbor::init needs pair::init needs kspace::init, etc
if (comm->me == 0 && screen)
fprintf(screen,"System init for write_restart ...\n");
lmp->init();
// move atoms to new processors before writing file
// do setup_pre_exchange to force update of per-atom info if needed
// enforce PBC in case atoms are outside box
// call borders() to rebuild atom map since exchange() destroys map
modify->setup_pre_exchange();
if (domain->triclinic) domain->x2lamda(atom->nlocal);
domain->pbc();
domain->reset_box();
comm->setup();
comm->exchange();
comm->borders();
if (domain->triclinic) domain->lamda2x(atom->nlocal+atom->nghost);
write(file);
delete [] file;
}
/* ----------------------------------------------------------------------
called from command() and directly from output within run/minimize loop
file = final file name to write, except may contain a "%"
------------------------------------------------------------------------- */
void WriteRestart::write(char *file)
{
// special case where reneighboring is not done in integrator
// on timestep restart file is written (due to build_once being set)
// if box is changing, must be reset, else restart file will have
// wrong box size and atoms will be lost when restart file is read
// other calls to pbc and domain and comm are not made,
// b/c they only make sense if reneighboring is actually performed
if (neighbor->build_once) domain->reset_box();
// natoms = sum of nlocal = value to write into restart file
// if unequal and thermo lostflag is "error", don't write restart file
bigint nblocal = atom->nlocal;
MPI_Allreduce(&nblocal,&natoms,1,MPI_LMP_BIGINT,MPI_SUM,world);
if (natoms != atom->natoms && output->thermo->lostflag == ERROR)
error->all(FLERR,"Atom count is inconsistent, cannot write restart file");
// check if filename contains "%"
int multiproc;
if (strchr(file,'%')) multiproc = 1;
else multiproc = 0;
// open single restart file or base file for multiproc case
if (me == 0) {
char *hfile;
if (multiproc) {
hfile = new char[strlen(file) + 16];
char *ptr = strchr(file,'%');
*ptr = '\0';
sprintf(hfile,"%s%s%s",file,"base",ptr+1);
*ptr = '%';
} else hfile = file;
fp = fopen(hfile,"wb");
if (fp == NULL) {
char str[128];
sprintf(str,"Cannot open restart file %s",hfile);
error->one(FLERR,str);
}
if (multiproc) delete [] hfile;
}
// proc 0 writes header, groups, ntype-length arrays, force field
// all procs write fix info
if (me == 0) {
header();
group->write_restart(fp);
type_arrays();
force_fields();
}
modify->write_restart(fp);
// communication buffer for all my atom's info
// max_size = largest buffer needed by any proc
int max_size;
int send_size = atom->avec->size_restart();
MPI_Allreduce(&send_size,&max_size,1,MPI_INT,MPI_MAX,world);
double *buf;
if (me == 0) memory->create(buf,max_size,"write_restart:buf");
else memory->create(buf,send_size,"write_restart:buf");
// pack my atom data into buf
AtomVec *avec = atom->avec;
int n = 0;
for (int i = 0; i < atom->nlocal; i++) n += avec->pack_restart(i,&buf[n]);
// if any fix requires it, remap each atom's coords via PBC
// is because fix changes atom coords (excepting an integrate fix)
// just remap in buffer, not actual atoms
if (modify->restart_pbc_any) {
int triclinic = domain->triclinic;
double *lo,*hi,*period;
if (triclinic == 0) {
lo = domain->boxlo;
hi = domain->boxhi;
period = domain->prd;
} else {
lo = domain->boxlo_lamda;
hi = domain->boxhi_lamda;
period = domain->prd_lamda;
}
int xperiodic = domain->xperiodic;
int yperiodic = domain->yperiodic;
int zperiodic = domain->zperiodic;
double *x;
int m = 0;
for (int i = 0; i < atom->nlocal; i++) {
x = &buf[m+1];
if (triclinic) domain->x2lamda(x,x);
if (xperiodic) {
if (x[0] < lo[0]) x[0] += period[0];
if (x[0] >= hi[0]) x[0] -= period[0];
x[0] = MAX(x[0],lo[0]);
}
if (yperiodic) {
if (x[1] < lo[1]) x[1] += period[1];
if (x[1] >= hi[1]) x[1] -= period[1];
x[1] = MAX(x[1],lo[1]);
}
if (zperiodic) {
if (x[2] < lo[2]) x[2] += period[2];
if (x[2] >= hi[2]) x[2] -= period[2];
x[2] = MAX(x[2],lo[2]);
}
if (triclinic) domain->lamda2x(x,x);
m += static_cast<int> (buf[m]);
}
}
// if single file:
// write one chunk of atoms per proc to file
// proc 0 pings each proc, receives its chunk, writes to file
// all other procs wait for ping, send their chunk to proc 0
// else if one file per proc:
// each proc opens its own file and writes its chunk directly
if (multiproc == 0) {
int tmp,recv_size;
MPI_Status status;
MPI_Request request;
if (me == 0) {
for (int iproc = 0; iproc < nprocs; iproc++) {
if (iproc) {
MPI_Irecv(buf,max_size,MPI_DOUBLE,iproc,0,world,&request);
MPI_Send(&tmp,0,MPI_INT,iproc,0,world);
MPI_Wait(&request,&status);
MPI_Get_count(&status,MPI_DOUBLE,&recv_size);
} else recv_size = send_size;
fwrite(&recv_size,sizeof(int),1,fp);
fwrite(buf,sizeof(double),recv_size,fp);
}
fclose(fp);
} else {
MPI_Recv(&tmp,0,MPI_INT,0,0,world,&status);
MPI_Rsend(buf,send_size,MPI_DOUBLE,0,0,world);
}
} else {
if (me == 0) fclose(fp);
char *perproc = new char[strlen(file) + 16];
char *ptr = strchr(file,'%');
*ptr = '\0';
sprintf(perproc,"%s%d%s",file,me,ptr+1);
*ptr = '%';
fp = fopen(perproc,"wb");
if (fp == NULL) {
char str[128];
sprintf(str,"Cannot open restart file %s",perproc);
error->one(FLERR,str);
}
delete [] perproc;
fwrite(&send_size,sizeof(int),1,fp);
fwrite(buf,sizeof(double),send_size,fp);
fclose(fp);
}
memory->destroy(buf);
+
+ // invoke any fixes that write their own restart file
+
+ for (int ifix = 0; ifix < modify->nfix; ifix++)
+ if (modify->fix[ifix]->restart_file)
+ modify->fix[ifix]->write_restart_file(file);
}
/* ----------------------------------------------------------------------
proc 0 writes out problem description
------------------------------------------------------------------------- */
void WriteRestart::header()
{
write_char(VERSION,universe->version);
write_int(SMALLINT,sizeof(smallint));
write_int(TAGINT,sizeof(tagint));
write_int(BIGINT,sizeof(bigint));
write_char(UNITS,update->unit_style);
write_bigint(NTIMESTEP,update->ntimestep);
write_int(DIMENSION,domain->dimension);
write_int(NPROCS,nprocs);
write_int(PROCGRID_0,comm->procgrid[0]);
write_int(PROCGRID_1,comm->procgrid[1]);
write_int(PROCGRID_2,comm->procgrid[2]);
write_int(NEWTON_PAIR,force->newton_pair);
write_int(NEWTON_BOND,force->newton_bond);
write_int(XPERIODIC,domain->xperiodic);
write_int(YPERIODIC,domain->yperiodic);
write_int(ZPERIODIC,domain->zperiodic);
write_int(BOUNDARY_00,domain->boundary[0][0]);
write_int(BOUNDARY_01,domain->boundary[0][1]);
write_int(BOUNDARY_10,domain->boundary[1][0]);
write_int(BOUNDARY_11,domain->boundary[1][1]);
write_int(BOUNDARY_20,domain->boundary[2][0]);
write_int(BOUNDARY_21,domain->boundary[2][1]);
// atom_style must be written before atom class values
// so read_restart can create class before reading class values
// if style = hybrid, also write sub-class styles
// avec->write_restart() writes atom_style specific info
write_char(ATOM_STYLE,atom->atom_style);
if (strcmp(atom->atom_style,"hybrid") == 0) {
AtomVecHybrid *avec_hybrid = (AtomVecHybrid *) atom->avec;
int nstyles = avec_hybrid->nstyles;
char **keywords = avec_hybrid->keywords;
fwrite(&nstyles,sizeof(int),1,fp);
for (int i = 0; i < nstyles; i++) {
int n = strlen(keywords[i]) + 1;
fwrite(&n,sizeof(int),1,fp);
fwrite(keywords[i],sizeof(char),n,fp);
}
}
if (me == 0) atom->avec->write_restart_settings(fp);
write_bigint(NATOMS,natoms);
write_int(NTYPES,atom->ntypes);
write_bigint(NBONDS,atom->nbonds);
write_int(NBONDTYPES,atom->nbondtypes);
write_int(BOND_PER_ATOM,atom->bond_per_atom);
write_bigint(NANGLES,atom->nangles);
write_int(NANGLETYPES,atom->nangletypes);
write_int(ANGLE_PER_ATOM,atom->angle_per_atom);
write_bigint(NDIHEDRALS,atom->ndihedrals);
write_int(NDIHEDRALTYPES,atom->ndihedraltypes);
write_int(DIHEDRAL_PER_ATOM,atom->dihedral_per_atom);
write_bigint(NIMPROPERS,atom->nimpropers);
write_int(NIMPROPERTYPES,atom->nimpropertypes);
write_int(IMPROPER_PER_ATOM,atom->improper_per_atom);
write_double(BOXLO_0,domain->boxlo[0]);
write_double(BOXHI_0,domain->boxhi[0]);
write_double(BOXLO_1,domain->boxlo[1]);
write_double(BOXHI_1,domain->boxhi[1]);
write_double(BOXLO_2,domain->boxlo[2]);
write_double(BOXHI_2,domain->boxhi[2]);
write_double(SPECIAL_LJ_1,force->special_lj[1]);
write_double(SPECIAL_LJ_2,force->special_lj[2]);
write_double(SPECIAL_LJ_3,force->special_lj[3]);
write_double(SPECIAL_COUL_1,force->special_coul[1]);
write_double(SPECIAL_COUL_2,force->special_coul[2]);
write_double(SPECIAL_COUL_3,force->special_coul[3]);
if (domain->triclinic) {
write_double(XY,domain->xy);
write_double(XZ,domain->xz);
write_double(YZ,domain->yz);
}
// -1 flag signals end of header
int flag = -1;
fwrite(&flag,sizeof(int),1,fp);
}
/* ----------------------------------------------------------------------
proc 0 writes out any type-based arrays that are defined
------------------------------------------------------------------------- */
void WriteRestart::type_arrays()
{
if (atom->mass) {
int flag = MASS;
fwrite(&flag,sizeof(int),1,fp);
fwrite(&atom->mass[1],sizeof(double),atom->ntypes,fp);
}
// -1 flag signals end of type arrays
int flag = -1;
fwrite(&flag,sizeof(int),1,fp);
}
/* ----------------------------------------------------------------------
proc 0 writes out and force field styles and data that are defined
------------------------------------------------------------------------- */
void WriteRestart::force_fields()
{
if (force->pair) {
int flag = PAIR;
fwrite(&flag,sizeof(int),1,fp);
int n = strlen(force->pair_style) + 1;
fwrite(&n,sizeof(int),1,fp);
fwrite(force->pair_style,sizeof(char),n,fp);
force->pair->write_restart(fp);
}
if (atom->avec->bonds_allow && force->bond) {
int flag = BOND;
fwrite(&flag,sizeof(int),1,fp);
int n = strlen(force->bond_style) + 1;
fwrite(&n,sizeof(int),1,fp);
fwrite(force->bond_style,sizeof(char),n,fp);
force->bond->write_restart(fp);
}
if (atom->avec->angles_allow && force->angle) {
int flag = ANGLE;
fwrite(&flag,sizeof(int),1,fp);
int n = strlen(force->angle_style) + 1;
fwrite(&n,sizeof(int),1,fp);
fwrite(force->angle_style,sizeof(char),n,fp);
force->angle->write_restart(fp);
}
if (atom->avec->dihedrals_allow && force->dihedral) {
int flag = DIHEDRAL;
fwrite(&flag,sizeof(int),1,fp);
int n = strlen(force->dihedral_style) + 1;
fwrite(&n,sizeof(int),1,fp);
fwrite(force->dihedral_style,sizeof(char),n,fp);
force->dihedral->write_restart(fp);
}
if (atom->avec->impropers_allow && force->improper) {
int flag = IMPROPER;
fwrite(&flag,sizeof(int),1,fp);
int n = strlen(force->improper_style) + 1;
fwrite(&n,sizeof(int),1,fp);
fwrite(force->improper_style,sizeof(char),n,fp);
force->improper->write_restart(fp);
}
// -1 flag signals end of force field info
int flag = -1;
fwrite(&flag,sizeof(int),1,fp);
}
/* ----------------------------------------------------------------------
write a flag and an int into restart file
------------------------------------------------------------------------- */
void WriteRestart::write_int(int flag, int value)
{
fwrite(&flag,sizeof(int),1,fp);
fwrite(&value,sizeof(int),1,fp);
}
/* ----------------------------------------------------------------------
write a flag and a double into restart file
------------------------------------------------------------------------- */
void WriteRestart::write_double(int flag, double value)
{
fwrite(&flag,sizeof(int),1,fp);
fwrite(&value,sizeof(double),1,fp);
}
/* ----------------------------------------------------------------------
write a flag and a char str into restart file
------------------------------------------------------------------------- */
void WriteRestart::write_char(int flag, char *value)
{
fwrite(&flag,sizeof(int),1,fp);
int n = strlen(value) + 1;
fwrite(&n,sizeof(int),1,fp);
fwrite(value,sizeof(char),n,fp);
}
/* ----------------------------------------------------------------------
write a flag and a bigint into restart file
------------------------------------------------------------------------- */
void WriteRestart::write_bigint(int flag, bigint value)
{
fwrite(&flag,sizeof(int),1,fp);
fwrite(&value,sizeof(bigint),1,fp);
}

Event Timeline