git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@2952 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp 2009-07-02 16:38:31 +00:00
parent d3cbb24f81
commit 214d346bdc
14 changed files with 676 additions and 4 deletions

BIN
doc/Eqs/heat_flux_J.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

14
doc/Eqs/heat_flux_J.tex Normal file
View File

@ -0,0 +1,14 @@
\documentclass[12pt]{article}
\begin{document}
$$
\mathbf{J}
= \sum_i e_i \mathbf{v}_i
+ \sum_{i<j} \left( \mathbf{f}_{ij} \cdot \mathbf{v}_j \right) \mathbf{x}_{ij}
= \sum_i e_i \mathbf{v}_i
+ \frac{1}{2} \sum_{i<j} \left( \mathbf{f}_{ij} \cdot \left(\mathbf{v}_i + \mathbf{v}_j \right) \right) \mathbf{x}_{ij}
$$
\end{document}

BIN
doc/Eqs/heat_flux_k.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

11
doc/Eqs/heat_flux_k.tex Normal file
View File

@ -0,0 +1,11 @@
\documentclass[12pt]{article}
\begin{document}
$$
\kappa = \frac{V}{k_B T^2} \int_0^\infty \langle J_x(0) J_x(t) \rangle \, dt
= \frac{V}{3 k_B T^2} \int_0^\infty \langle \mathbf{J}(0) \cdot \mathbf{J}(t) \rangle \, dt
$$
\end{document}

89
doc/Scripts/correlate.py Normal file
View File

@ -0,0 +1,89 @@
#!/usr/bin/python
"""
function:
parse the block of thermo data in a lammps logfile and perform auto- and
cross correlation of the specified column data. The total sum of the
correlation is also computed which can be converted to an integral by
multiplying by the timestep.
output:
standard output contains column data for the auto- & cross correlations
plus the total sum of each. Note, only the upper triangle of the
correlation matrix is computed.
usage:
correlate.py [-c col] <-c col2> <-s max_correlation_time> [logfile]
"""
import sys
import re
import array
# parse command line
maxCorrelationTime = 0
cols = array.array("I")
nCols = 0
args = sys.argv[1:]
index = 0
while index < len(args):
arg = args[index]
index += 1
if (arg == "-c"):
cols.append(int(args[index])-1)
nCols += 1
index += 1
elif (arg == "-s"):
maxCorrelationTime = int(args[index])
index += 1
else :
filename = arg
if (nCols < 1): raise RuntimeError, 'no data columns requested'
data = [array.array("d")]
for s in range(1,nCols) : data.append( array.array("d") )
# read data block from log file
start = False
input = open(filename)
nSamples = 0
pattern = re.compile('\d')
line = input.readline()
while line :
columns = line.split()
if (columns and pattern.match(columns[0])) :
for i in range(nCols):
data[i].append( float(columns[cols[i]]) )
nSamples += 1
start = True
else :
if (start) : break
line = input.readline()
print "# read :",nSamples," samples of ", nCols," data"
if( maxCorrelationTime < 1): maxCorrelationTime = int(nSamples/2);
# correlate and integrate
correlationPairs = []
for i in range(0,nCols):
for j in range(i,nCols): # note only upper triangle of the correlation matrix
correlationPairs.append([i,j])
header = "# "
for k in range(len(correlationPairs)):
i = str(correlationPairs[k][0]+1)
j = str(correlationPairs[k][1]+1)
header += " C"+i+j+" sum_C"+i+j
print header
nCorrelationPairs = len(correlationPairs)
sum = [0.0] * nCorrelationPairs
for s in range(maxCorrelationTime) :
correlation = [0.0] * nCorrelationPairs
nt = nSamples-s
for t in range(0,nt) :
for p in range(nCorrelationPairs):
i = correlationPairs[p][0]
j = correlationPairs[p][1]
correlation[p] += data[i][t]*data[j][s+t]
output = ""
for p in range(0,nCorrelationPairs):
correlation[p] /= nt
sum[p] += correlation[p]
output += str(correlation[p]) + " " + str(sum[p]) + " "
print output

View File

@ -343,10 +343,10 @@ description:
</P>
<DIV ALIGN=center><TABLE BORDER=1 >
<TR ALIGN="center"><TD ><A HREF = "compute_centro_atom.html">centro/atom</A></TD><TD ><A HREF = "compute_cna_atom.html">cna/atom</A></TD><TD ><A HREF = "compute_coord_atom.html">coord/atom</A></TD><TD ><A HREF = "compute_damage_atom.html">damage/atom</A></TD><TD ><A HREF = "compute_displace_atom.html">displace/atom</A></TD><TD ><A HREF = "compute_erotate_asphere.html">erotate/asphere</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "compute_erotate_sphere.html">erotate/sphere</A></TD><TD ><A HREF = "compute_group_group.html">group/group</A></TD><TD ><A HREF = "compute_ke.html">ke</A></TD><TD ><A HREF = "compute_ke_atom.html">ke/atom</A></TD><TD ><A HREF = "compute_pe.html">pe</A></TD><TD ><A HREF = "compute_pe_atom.html">pe/atom</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "compute_pressure.html">pressure</A></TD><TD ><A HREF = "compute_reduce.html">reduce</A></TD><TD ><A HREF = "compute_reduce.html">reduce/region</A></TD><TD ><A HREF = "compute_stress_atom.html">stress/atom</A></TD><TD ><A HREF = "compute_temp.html">temp</A></TD><TD ><A HREF = "compute_temp_asphere.html">temp/asphere</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "compute_temp_com.html">temp/com</A></TD><TD ><A HREF = "compute_temp_deform.html">temp/deform</A></TD><TD ><A HREF = "compute_temp_partial.html">temp/partial</A></TD><TD ><A HREF = "compute_temp_profile.html">temp/profile</A></TD><TD ><A HREF = "compute_temp_ramp.html">temp/ramp</A></TD><TD ><A HREF = "compute_temp_region.html">temp/region</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "compute_temp_sphere.html">temp/sphere</A>
<TR ALIGN="center"><TD ><A HREF = "compute_erotate_sphere.html">erotate/sphere</A></TD><TD ><A HREF = "compute_group_group.html">group/group</A></TD><TD ><A HREF = "compute_heat_flux.html">heat/flux</A></TD><TD ><A HREF = "compute_ke.html">ke</A></TD><TD ><A HREF = "compute_ke_atom.html">ke/atom</A></TD><TD ><A HREF = "compute_pe.html">pe</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "compute_pe_atom.html">pe/atom</A></TD><TD ><A HREF = "compute_pressure.html">pressure</A></TD><TD ><A HREF = "compute_reduce.html">reduce</A></TD><TD ><A HREF = "compute_reduce.html">reduce/region</A></TD><TD ><A HREF = "compute_stress_atom.html">stress/atom</A></TD><TD ><A HREF = "compute_temp.html">temp</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "compute_temp_asphere.html">temp/asphere</A></TD><TD ><A HREF = "compute_temp_com.html">temp/com</A></TD><TD ><A HREF = "compute_temp_deform.html">temp/deform</A></TD><TD ><A HREF = "compute_temp_partial.html">temp/partial</A></TD><TD ><A HREF = "compute_temp_profile.html">temp/profile</A></TD><TD ><A HREF = "compute_temp_ramp.html">temp/ramp</A></TD></TR>
<TR ALIGN="center"><TD ><A HREF = "compute_temp_region.html">temp/region</A></TD><TD ><A HREF = "compute_temp_sphere.html">temp/sphere</A>
</TD></TR></TABLE></DIV>
<P>These are compute styles contributed by users, which can be used if

View File

@ -462,6 +462,7 @@ description:
"erotate/asphere"_compute_erotate_asphere.html,
"erotate/sphere"_compute_erotate_sphere.html,
"group/group"_compute_group_group.html,
"heat/flux"_compute_heat_flux.html,
"ke"_compute_ke.html,
"ke/atom"_compute_ke_atom.html,
"pe"_compute_pe.html,

View File

@ -117,6 +117,7 @@ available in LAMMPS:
<LI><A HREF = "compute_erotate_asphere.html">erotate/asphere</A> - rotational energy of aspherical particles
<LI><A HREF = "compute_erotate_sphere.html">erotate/sphere</A> - rotational energy of spherical particles
<LI><A HREF = "compute_group_group.html">group/group</A> - energy/force between two groups of atoms
<LI><A HREF = "compute_heat_flux.html">heat/flux</A> - heat flux through a group of atoms
<LI><A HREF = "compute_ke.html">ke</A> - translational kinetic energy
<LI><A HREF = "compute_ke_atom.html">ke/atom</A> - kinetic energy for each atom
<LI><A HREF = "compute_pe.html">pe</A> - potential energy

View File

@ -114,6 +114,7 @@ available in LAMMPS:
"erotate/asphere"_compute_erotate_asphere.html - rotational energy of aspherical particles
"erotate/sphere"_compute_erotate_sphere.html - rotational energy of spherical particles
"group/group"_compute_group_group.html - energy/force between two groups of atoms
"heat/flux"_compute_heat_flux.html - heat flux through a group of atoms
"ke"_compute_ke.html - translational kinetic energy
"ke/atom"_compute_ke_atom.html - kinetic energy for each atom
"pe"_compute_pe.html - potential energy

147
doc/compute_heat_flux.html Normal file
View File

@ -0,0 +1,147 @@
<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>compute heat/flux command
</H3>
<P><B>Syntax:</B>
</P>
<PRE>compute ID group-ID heat/flux pe-ID
</PRE>
<UL><LI>ID, group-ID are documented in <A HREF = "compute.html">compute</A> command
<LI>heat/flux = style name of this compute command
<LI>pe-ID = ID of a compute that calculates per-atom potential energy
</UL>
<P><B>Examples:</B>
</P>
<PRE>compute myFlux all heat/flux myPE
</PRE>
<P><B>Description:</B>
</P>
<P>Define a computation that calculates the heat flux vector based on
interactions between atoms in the specified group. This can be used
by itself to measure the heat flux between a hot and cold reservoir of
particles or to calculate a thermal conductivity using the Green-Kubo
formalism.
</P>
<P>The compute takes a <I>pe-ID</I> argument which is the ID of a <A HREF = "compute_pe_atom.html">compute
pe/atom</A> that calculates per-atom potential
energy. It should be defined for the same group used by compute
heat/flux, though LAMMPS does not check for this.
</P>
<P>The Green-Kubo formulas relate the ensemble average of the
auto-correlation of the heat flux J to the thermal conductivity kappa.
</P>
<CENTER><IMG SRC = "Eqs/heat_flux_k.jpg">
</CENTER>
<CENTER><IMG SRC = "Eqs/heat_flux_J.jpg">
</CENTER>
<P>Ei is the per-atom energy (potential and kinetic). The potential term
is calculated by the compute <I>pe-ID</I> specified as an argument to
the compute heat/flux command.
</P>
<P>IMPORTANT NOTE: The per-atom potential energy calculated by the
<I>pe-ID</I> compute should only include pairwise energy, to be consistent
with the full heat-flux calculation. Thus if any bonds, angles, etc
exist in the system, the compute should limit its calculation to only
the pair contribution. E.g. it could be defined as
</P>
<PRE>compute myPE all pe/atom pair
</PRE>
<P>Note that if <I>pair</I> is not listed as the last argument, it will be
included by default, but so will other contributions such as bond,
angle, etc.
</P>
<P>The heat flux J is calculated by this compute for pairwise
interactions for any I,J pair where one of the 2 atoms in is the
compute group. It can be output every so many timesteps (e.g. via the
thermo_style custom command). Then as post-processing steps, an
autocorrelation can be performed, its integral estimated, and the
Green-Kubo formula evaluated.
</P>
<P>Here is an example of this procedure. First a LAMMPS input script for
solid Ar is appended below. A Python script
<A HREF = "Scripts/correlate.py">correlate.py</A> is also given, which calculates
the autocorrelation of the flux output in the logfile flux.log,
produced by the LAMMPS run. It is invoked as
</P>
<PRE>correlate.py flux.log -c 3 -s 200
</PRE>
<P>The resulting data lists the autocorrelation in column 1 and the
integral of the autocorrelation in column 2. The integral of the
correlation needs to be multiplied by V/(kB T^2) times the sample
interval and the appropriate unit conversion factors. For real
<A HREF = "units.html">units</A> in LAMMPS, this is 2917703220.0 in this case. The
final thermal conductivity value obtained is 0.25 W/mK.
</P>
<P><B>Output info:</B>
</P>
<P>This compute calculates a vector of length 6. The 6 components are
the x, y, z components of the full heat flux, followed by the x, y, z
components of just the convective portion of the flux, which is the
energy per atom times the velocity of the atom.
</P>
<P>The vector values calculated by this compute are "extensive", meaning
they scale with the number of atoms in the simulation. They should be
divided by the appropriate volume to get a flux.
</P>
<P><B>Restrictions:</B>
</P>
<P>Only pairwise interactions, as defined by the pair_style command, are
included in this calculation.
</P>
<P>To use this compute you must define an atom_style, such as dpd or
granular, that communicates the velocites of ghost atoms.
</P>
<P><B>Related commands:</B> none
</P>
<P><B>Default:</B> none
</P>
<HR>
<H4>Sample LAMMPS input script
</H4>
<PRE>atom_style dpd
units real
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
region box block 0 4 0 4 0 4
create_box 1 box
create_atoms 1 box
mass 1 39.948
pair_style lj/cut 13.0
pair_coeff * * 0.2381 3.405
group every region box
velocity all create 70 102486 mom yes rot yes dist gaussian
timestep 4.0
thermo 10
</PRE>
<PRE># ------------- Equilibration and thermalisation ----------------
</PRE>
<PRE>fix NPT all npt 70 70 10 xyz 0.0 0.0 100.0 drag 0.2
run 8000
unfix NPT
</PRE>
<PRE># --------------- Equilibration in nve -----------------
</PRE>
<PRE>fix NVE all nve
run 8000
</PRE>
<PRE># -------------- Flux calculation in nve ---------------
</PRE>
<PRE>reset_timestep 0
compute flux all heat_flux
log flux.log
variable J equal c_flux<B>1</B>/vol
thermo_style custom step temp v_J
run 100000
</PRE>
</HTML>

142
doc/compute_heat_flux.txt Normal file
View File

@ -0,0 +1,142 @@
"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
compute heat/flux command :h3
[Syntax:]
compute ID group-ID heat/flux pe-ID :pre
ID, group-ID are documented in "compute"_compute.html command
heat/flux = style name of this compute command
pe-ID = ID of a compute that calculates per-atom potential energy :ul
[Examples:]
compute myFlux all heat/flux myPE :pre
[Description:]
Define a computation that calculates the heat flux vector based on
interactions between atoms in the specified group. This can be used
by itself to measure the heat flux between a hot and cold reservoir of
particles or to calculate a thermal conductivity using the Green-Kubo
formalism.
The compute takes a {pe-ID} argument which is the ID of a "compute
pe/atom"_compute_pe_atom.html that calculates per-atom potential
energy. Normally, it should be defined for the same group used by
compute heat/flux, though LAMMPS does not check for this.
The Green-Kubo formulas relate the ensemble average of the
auto-correlation of the heat flux J to the thermal conductivity kappa.
:c,image(Eqs/heat_flux_k.jpg)
:c,image(Eqs/heat_flux_J.jpg)
Ei is the per-atom energy (potential and kinetic). The potential
portion is calculated by the compute {pe-ID} specified as an argument
to the compute heat/flux command.
IMPORTANT NOTE: The per-atom potential energy calculated by the
{pe-ID} compute should only include pairwise energy, to be consistent
with the second virial-like term in the formula for J. Thus if any
bonds, angles, etc exist in the system, the compute should limit its
calculation to only the pair contribution. E.g. it could be defined
as follows. Note that if {pair} is not listed as the last argument,
it will be included by default, but so will other contributions such
as bond, angle, etc.
compute myPE all pe/atom pair :pre
The second term of the heat flux equation for J is calculated by
compute heat/flux for pairwise interactions for any I,J pair where one
of the 2 atoms in is the compute group. It can be output every so
many timesteps (e.g. via the thermo_style custom command). Then as
post-processing steps, an autocorrelation can be performed, its
integral estimated, and the Green-Kubo formula evaluated.
Here is an example of this procedure. First a LAMMPS input script for
solid Ar is appended below. A Python script
"correlate.py"_Scripts/correlate.py is also given, which calculates
the autocorrelation of the flux output in the logfile flux.log,
produced by the LAMMPS run. It is invoked as
correlate.py flux.log -c 3 -s 200 :pre
The resulting data lists the autocorrelation in column 1 and the
integral of the autocorrelation in column 2. The integral of the
correlation needs to be multiplied by V/(kB T^2) times the sample
interval and the appropriate unit conversion factors. For real
"units"_units.html in LAMMPS, this is 2917703220.0 in this case. The
final thermal conductivity value obtained is 0.25 W/mK.
[Output info:]
This compute calculates a vector of length 6. The 6 components are
the x, y, z components of the full heat flux, followed by the x, y, z
components of just the convective portion of the flux, which is the
energy per atom times the velocity of the atom.
The vector values calculated by this compute are "extensive", meaning
they scale with the number of atoms in the simulation. They should be
divided by the appropriate volume to get a flux.
[Restrictions:]
Only pairwise interactions, as defined by the pair_style command, are
included in this calculation.
To use this compute you must define an atom_style, such as dpd or
granular, that communicates the velocites of ghost atoms.
[Related commands:] none
[Default:] none
:line
Sample LAMMPS input script :h4
atom_style dpd
units real
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
region box block 0 4 0 4 0 4
create_box 1 box
create_atoms 1 box
mass 1 39.948
pair_style lj/cut 13.0
pair_coeff * * 0.2381 3.405
group every region box
velocity all create 70 102486 mom yes rot yes dist gaussian
timestep 4.0
thermo 10 :pre
# ------------- Equilibration and thermalisation ---------------- :pre
fix NPT all npt 70 70 10 xyz 0.0 0.0 100.0 drag 0.2
run 8000
unfix NPT :pre
# --------------- Equilibration in nve ----------------- :pre
fix NVE all nve
run 8000 :pre
# -------------- Flux calculation in nve --------------- :pre
reset_timestep 0
compute flux all heat_flux
log flux.log
variable J equal c_flux[1]/vol
thermo_style custom step temp v_J
run 100000 :pre

225
src/compute_heat_flux.cpp Normal file
View File

@ -0,0 +1,225 @@
/* ----------------------------------------------------------------------
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-93AL85000 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: Reese Jones (Sandia)
Philip Howell (Siemens)
Vikas Varsney (Air Force Research Laboratory)
------------------------------------------------------------------------- */
#include "math.h"
#include "string.h"
#include "compute_heat_flux.h"
#include "atom.h"
#include "atom_vec.h"
#include "update.h"
#include "force.h"
#include "pair.h"
#include "modify.h"
#include "group.h"
#include "neighbor.h"
#include "neigh_list.h"
#include "neigh_request.h"
#include "error.h"
using namespace LAMMPS_NS;
enum{DUMMY0,INVOKED_SCALAR,INVOKED_VECTOR,DUMMMY3,INVOKED_PERATOM};
/* ---------------------------------------------------------------------- */
ComputeHeatFlux::ComputeHeatFlux(LAMMPS *lmp, int narg, char **arg) :
Compute(lmp, narg, arg)
{
if (narg != 4) error->all("Illegal compute heat/flux command");
vector_flag = 1;
size_vector = 6;
extvector = 1;
// store pe/atom ID used by heat flux computation
// insure it is valid for pe/atom computation
int n = strlen(arg[3]) + 1;
id_atomPE = new char[n];
strcpy(id_atomPE,arg[3]);
int icompute = modify->find_compute(id_atomPE);
if (icompute < 0) error->all("Could not find compute heat/flux pe/atom ID");
if (modify->compute[icompute]->peatomflag == 0)
error->all("Compute heat/flux compute ID does not compute pe/atom");
vector = new double[6];
}
/* ---------------------------------------------------------------------- */
ComputeHeatFlux::~ComputeHeatFlux()
{
delete [] vector;
}
/* ---------------------------------------------------------------------- */
void ComputeHeatFlux::init()
{
// error checks
if (atom->avec->ghost_velocity == 0)
error->all("Compute heat/flux requires ghost atoms store velocity");
if (force->pair == NULL || force->pair->single_enable == 0)
error->all("Pair style does not support compute heat/flux");
int icompute = modify->find_compute(id_atomPE);
if (icompute < 0)
error->all("Pe/atom ID for compute heat/flux does not exist");
atomPE = modify->compute[icompute];
pair = force->pair;
cutsq = force->pair->cutsq;
// need an occasional half neighbor list
int irequest = neighbor->request((void *) this);
neighbor->requests[irequest]->pair = 0;
neighbor->requests[irequest]->compute = 1;
neighbor->requests[irequest]->occasional = 1;
}
/* ---------------------------------------------------------------------- */
void ComputeHeatFlux::init_list(int id, NeighList *ptr)
{
list = ptr;
}
/* ---------------------------------------------------------------------- */
void ComputeHeatFlux::compute_vector()
{
int i,j,ii,jj,inum,jnum,itype,jtype;
double xtmp,ytmp,ztmp,delx,dely,delz;
double rsq,eng,fpair,factor_coul,factor_lj,factor;
double fdotv,massone,ke,pe;
int *ilist,*jlist,*numneigh,**firstneigh;
invoked_vector = update->ntimestep;
double **x = atom->x;
double **v = atom->v;
int *type = atom->type;
int *mask = atom->mask;
int nlocal = atom->nlocal;
int nall = nlocal + atom->nghost;
double *special_coul = force->special_coul;
double *special_lj = force->special_lj;
int newton_pair = force->newton_pair;
// invoke half 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;
// heat flux J = \sum_i e_i v_i + \sum_{i<j} (f_ij . v_j) x_ij
// virial-like contribution
// loop over neighbors of my atoms
// require either i or j be in compute group
double Jv[3] = {0.0,0.0,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];
if (j < nall) factor_coul = factor_lj = 1.0;
else {
factor_coul = special_coul[j/nall];
factor_lj = special_lj[j/nall];
j %= nall;
}
if (!(mask[i] & groupbit) && !(mask[j] & groupbit)) continue;
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]) {
eng = pair->single(i,j,itype,jtype,rsq,factor_coul,factor_lj,fpair);
if (newton_pair || j < nlocal) factor = 1.0;
else factor = 0.5;
// symmetrize velocities
double vx = 0.5*(v[i][0]+v[j][0]);
double vy = 0.5*(v[i][1]+v[j][1]);
double vz = 0.5*(v[i][2]+v[j][2]);
fdotv = factor * fpair * (delx*vx + dely*vy + delz*vz);
Jv[0] += fdotv*delx;
Jv[1] += fdotv*dely;
Jv[2] += fdotv*delz;
}
}
}
// energy convection contribution
// uses per-atom potential energy
if (!(atomPE->invoked_flag & INVOKED_PERATOM)) {
atomPE->compute_peratom();
atomPE->invoked_flag |= INVOKED_PERATOM;
}
double *mass = atom->mass;
double *rmass = atom->rmass;
double mvv2e = force->mvv2e;
double Jc[3] = {0.0,0.0,0.0};
for (int i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) {
massone = (rmass) ? rmass[i] : mass[type[i]];
ke = mvv2e * 0.5 * massone *
(v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]);
pe = atomPE->scalar_atom[i];
eng = pe + ke;
Jc[0] += v[i][0]*eng;
Jc[1] += v[i][1]*eng;
Jc[2] += v[i][2]*eng;
}
}
// total flux
double data[6] = {Jv[0]+Jc[0],Jv[1]+Jc[1],Jv[2]+Jc[2],
Jc[0],Jc[1],Jc[2]};
MPI_Allreduce(data,vector,6,MPI_DOUBLE,MPI_SUM,world);
}

39
src/compute_heat_flux.h Normal file
View File

@ -0,0 +1,39 @@
/* ----------------------------------------------------------------------
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 COMPUTE_HEATFLUX_H
#define COMPUTE_HEATFLUX_H
#include "compute.h"
namespace LAMMPS_NS {
class ComputeHeatFlux : public Compute {
public:
ComputeHeatFlux(class LAMMPS *, int, char **);
~ComputeHeatFlux();
void init();
void init_list(int, class NeighList *);
void compute_vector();
private:
double **cutsq;
class Pair *pair;
class NeighList *list;
class Compute *atomPE;
char *id_atomPE;
};
}
#endif

View File

@ -81,6 +81,7 @@ CommandStyle(write_restart,WriteRestart)
#include "compute_coord_atom.h"
#include "compute_displace_atom.h"
#include "compute_group_group.h"
#include "compute_heat_flux.h"
#include "compute_ke.h"
#include "compute_ke_atom.h"
#include "compute_pe.h"
@ -106,6 +107,7 @@ ComputeStyle(cna/atom,ComputeCNAAtom)
ComputeStyle(coord/atom,ComputeCoordAtom)
ComputeStyle(displace/atom,ComputeDisplaceAtom)
ComputeStyle(group/group,ComputeGroupGroup)
ComputeStyle(heat/flux,ComputeHeatFlux)
ComputeStyle(ke,ComputeKE)
ComputeStyle(ke/atom,ComputeKEAtom)
ComputeStyle(pe,ComputePE)