Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F88389718
pair_tip4p_cut.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Fri, Oct 18, 13:33
Size
16 KB
Mime Type
text/x-c
Expires
Sun, Oct 20, 13:33 (2 d)
Engine
blob
Format
Raw Data
Handle
21764015
Attached To
rLAMMPS lammps
pair_tip4p_cut.cpp
View Options
/* ----------------------------------------------------------------------
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: Pavel Elkind (Gothenburg University)
------------------------------------------------------------------------- */
#include "math.h"
#include "stdlib.h"
#include "pair_tip4p_cut.h"
#include "atom.h"
#include "force.h"
#include "neighbor.h"
#include "neigh_list.h"
#include "domain.h"
#include "angle.h"
#include "bond.h"
#include "comm.h"
#include "math_const.h"
#include "memory.h"
#include "error.h"
using
namespace
LAMMPS_NS
;
using
namespace
MathConst
;
/* ---------------------------------------------------------------------- */
PairTIP4PCut
::
PairTIP4PCut
(
LAMMPS
*
lmp
)
:
Pair
(
lmp
)
{
single_enable
=
0
;
nmax
=
0
;
hneigh
=
NULL
;
newsite
=
NULL
;
// TIP4P cannot compute virial as F dot r
// due to finding bonded H atoms which are not near O atom
no_virial_fdotr_compute
=
1
;
}
/* ---------------------------------------------------------------------- */
PairTIP4PCut
::~
PairTIP4PCut
()
{
if
(
allocated
)
{
memory
->
destroy
(
setflag
);
memory
->
destroy
(
cutsq
);
}
memory
->
destroy
(
hneigh
);
memory
->
destroy
(
newsite
);
}
/* ---------------------------------------------------------------------- */
void
PairTIP4PCut
::
compute
(
int
eflag
,
int
vflag
)
{
int
i
,
j
,
ii
,
jj
,
inum
,
jnum
,
itype
,
jtype
;
double
qtmp
,
xtmp
,
ytmp
,
ztmp
,
delx
,
dely
,
delz
,
ecoul
;
double
rsq
,
r2inv
,
forcecoul
,
factor_coul
;
int
*
ilist
,
*
jlist
,
*
numneigh
,
**
firstneigh
;
int
key
;
int
n
,
vlist
[
6
];
int
iH1
,
iH2
,
jH1
,
jH2
;
double
cforce
;
double
fO
[
3
],
fH
[
3
],
fd
[
3
],
v
[
6
],
xH1
[
3
],
xH2
[
3
];
double
*
x1
,
*
x2
;
ecoul
=
0.0
;
if
(
eflag
||
vflag
)
ev_setup
(
eflag
,
vflag
);
else
evflag
=
vflag_fdotr
=
0
;
// reallocate hneigh & newsite if necessary
// initialize hneigh[0] to -1 on steps when reneighboring occurred
// initialize hneigh[2] to 0 every step
int
nlocal
=
atom
->
nlocal
;
int
nall
=
nlocal
+
atom
->
nghost
;
if
(
atom
->
nmax
>
nmax
)
{
nmax
=
atom
->
nmax
;
memory
->
destroy
(
hneigh
);
memory
->
create
(
hneigh
,
nmax
,
3
,
"pair:hneigh"
);
memory
->
destroy
(
newsite
);
memory
->
create
(
newsite
,
nmax
,
3
,
"pair:newsite"
);
}
if
(
neighbor
->
ago
==
0
)
for
(
i
=
0
;
i
<
nall
;
i
++
)
hneigh
[
i
][
0
]
=
-
1
;
for
(
i
=
0
;
i
<
nall
;
i
++
)
hneigh
[
i
][
2
]
=
0
;
double
**
f
=
atom
->
f
;
double
**
x
=
atom
->
x
;
double
*
q
=
atom
->
q
;
tagint
*
tag
=
atom
->
tag
;
int
*
type
=
atom
->
type
;
double
*
special_coul
=
force
->
special_coul
;
double
qqrd2e
=
force
->
qqrd2e
;
inum
=
list
->
inum
;
ilist
=
list
->
ilist
;
numneigh
=
list
->
numneigh
;
firstneigh
=
list
->
firstneigh
;
// loop over neighbors of my atoms
for
(
ii
=
0
;
ii
<
inum
;
ii
++
)
{
i
=
ilist
[
ii
];
qtmp
=
q
[
i
];
xtmp
=
x
[
i
][
0
];
ytmp
=
x
[
i
][
1
];
ztmp
=
x
[
i
][
2
];
itype
=
type
[
i
];
if
(
itype
==
typeO
)
{
if
(
hneigh
[
i
][
0
]
<
0
)
{
hneigh
[
i
][
0
]
=
iH1
=
atom
->
map
(
tag
[
i
]
+
1
);
hneigh
[
i
][
1
]
=
iH2
=
atom
->
map
(
tag
[
i
]
+
2
);
hneigh
[
i
][
2
]
=
1
;
if
(
iH1
==
-
1
||
iH2
==
-
1
)
error
->
one
(
FLERR
,
"TIP4P hydrogen is missing"
);
if
(
atom
->
type
[
iH1
]
!=
typeH
||
atom
->
type
[
iH2
]
!=
typeH
)
error
->
one
(
FLERR
,
"TIP4P hydrogen has incorrect atom type"
);
compute_newsite
(
x
[
i
],
x
[
iH1
],
x
[
iH2
],
newsite
[
i
]);
}
else
{
iH1
=
hneigh
[
i
][
0
];
iH2
=
hneigh
[
i
][
1
];
if
(
hneigh
[
i
][
2
]
==
0
)
{
hneigh
[
i
][
2
]
=
1
;
compute_newsite
(
x
[
i
],
x
[
iH1
],
x
[
iH2
],
newsite
[
i
]);
}
}
x1
=
newsite
[
i
];
}
else
x1
=
x
[
i
];
jlist
=
firstneigh
[
i
];
jnum
=
numneigh
[
i
];
for
(
jj
=
0
;
jj
<
jnum
;
jj
++
)
{
j
=
jlist
[
jj
];
factor_coul
=
special_coul
[
sbmask
(
j
)];
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
];
// adjust rsq and delxyz for off-site O charge(s) if necessary
// but only if they are within reach
if
(
rsq
<
cut_coulsqplus
)
{
if
(
itype
==
typeO
||
jtype
==
typeO
)
{
// if atom J = water O, set x2 = offset charge site
// else x2 = x of atom J
if
(
jtype
==
typeO
)
{
if
(
hneigh
[
j
][
0
]
<
0
)
{
hneigh
[
j
][
0
]
=
jH1
=
atom
->
map
(
tag
[
j
]
+
1
);
hneigh
[
j
][
1
]
=
jH2
=
atom
->
map
(
tag
[
j
]
+
2
);
hneigh
[
j
][
2
]
=
1
;
if
(
jH1
==
-
1
||
jH2
==
-
1
)
error
->
one
(
FLERR
,
"TIP4P hydrogen is missing"
);
if
(
atom
->
type
[
jH1
]
!=
typeH
||
atom
->
type
[
jH2
]
!=
typeH
)
error
->
one
(
FLERR
,
"TIP4P hydrogen has incorrect atom type"
);
compute_newsite
(
x
[
j
],
x
[
jH1
],
x
[
jH2
],
newsite
[
j
]);
}
else
{
jH1
=
hneigh
[
j
][
0
];
jH2
=
hneigh
[
j
][
1
];
if
(
hneigh
[
j
][
2
]
==
0
)
{
hneigh
[
j
][
2
]
=
1
;
compute_newsite
(
x
[
j
],
x
[
jH1
],
x
[
jH2
],
newsite
[
j
]);
}
}
x2
=
newsite
[
j
];
}
else
x2
=
x
[
j
];
delx
=
x1
[
0
]
-
x2
[
0
];
dely
=
x1
[
1
]
-
x2
[
1
];
delz
=
x1
[
2
]
-
x2
[
2
];
rsq
=
delx
*
delx
+
dely
*
dely
+
delz
*
delz
;
}
// Coulombic interaction based on modified rsq
if
(
rsq
<
cut_coulsq
)
{
r2inv
=
1.0
/
rsq
;
forcecoul
=
qqrd2e
*
qtmp
*
q
[
j
]
*
sqrt
(
r2inv
);
cforce
=
factor_coul
*
forcecoul
*
r2inv
;
// if i,j are not O atoms, force is applied directly;
// if i or j are O atoms, force is on fictitious atom & partitioned
// force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999)
// f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f
// preserves total force and torque on water molecule
// virial = sum(r x F) where each water's atoms are near xi and xj
// vlist stores 2,4,6 atoms whose forces contribute to virial
n
=
0
;
key
=
0
;
if
(
itype
!=
typeO
)
{
f
[
i
][
0
]
+=
delx
*
cforce
;
f
[
i
][
1
]
+=
dely
*
cforce
;
f
[
i
][
2
]
+=
delz
*
cforce
;
if
(
vflag
)
{
v
[
0
]
=
x
[
i
][
0
]
*
delx
*
cforce
;
v
[
1
]
=
x
[
i
][
1
]
*
dely
*
cforce
;
v
[
2
]
=
x
[
i
][
2
]
*
delz
*
cforce
;
v
[
3
]
=
x
[
i
][
0
]
*
dely
*
cforce
;
v
[
4
]
=
x
[
i
][
0
]
*
delz
*
cforce
;
v
[
5
]
=
x
[
i
][
1
]
*
delz
*
cforce
;
}
vlist
[
n
++
]
=
i
;
}
else
{
key
++
;
fd
[
0
]
=
delx
*
cforce
;
fd
[
1
]
=
dely
*
cforce
;
fd
[
2
]
=
delz
*
cforce
;
fO
[
0
]
=
fd
[
0
]
*
(
1.0
-
alpha
);
fO
[
1
]
=
fd
[
1
]
*
(
1.0
-
alpha
);
fO
[
2
]
=
fd
[
2
]
*
(
1.0
-
alpha
);
fH
[
0
]
=
0.5
*
alpha
*
fd
[
0
];
fH
[
1
]
=
0.5
*
alpha
*
fd
[
1
];
fH
[
2
]
=
0.5
*
alpha
*
fd
[
2
];
f
[
i
][
0
]
+=
fO
[
0
];
f
[
i
][
1
]
+=
fO
[
1
];
f
[
i
][
2
]
+=
fO
[
2
];
f
[
iH1
][
0
]
+=
fH
[
0
];
f
[
iH1
][
1
]
+=
fH
[
1
];
f
[
iH1
][
2
]
+=
fH
[
2
];
f
[
iH2
][
0
]
+=
fH
[
0
];
f
[
iH2
][
1
]
+=
fH
[
1
];
f
[
iH2
][
2
]
+=
fH
[
2
];
if
(
vflag
)
{
domain
->
closest_image
(
x
[
i
],
x
[
iH1
],
xH1
);
domain
->
closest_image
(
x
[
i
],
x
[
iH2
],
xH2
);
v
[
0
]
=
x
[
i
][
0
]
*
fO
[
0
]
+
xH1
[
0
]
*
fH
[
0
]
+
xH2
[
0
]
*
fH
[
0
];
v
[
1
]
=
x
[
i
][
1
]
*
fO
[
1
]
+
xH1
[
1
]
*
fH
[
1
]
+
xH2
[
1
]
*
fH
[
1
];
v
[
2
]
=
x
[
i
][
2
]
*
fO
[
2
]
+
xH1
[
2
]
*
fH
[
2
]
+
xH2
[
2
]
*
fH
[
2
];
v
[
3
]
=
x
[
i
][
0
]
*
fO
[
1
]
+
xH1
[
0
]
*
fH
[
1
]
+
xH2
[
0
]
*
fH
[
1
];
v
[
4
]
=
x
[
i
][
0
]
*
fO
[
2
]
+
xH1
[
0
]
*
fH
[
2
]
+
xH2
[
0
]
*
fH
[
2
];
v
[
5
]
=
x
[
i
][
1
]
*
fO
[
2
]
+
xH1
[
1
]
*
fH
[
2
]
+
xH2
[
1
]
*
fH
[
2
];
}
vlist
[
n
++
]
=
i
;
vlist
[
n
++
]
=
iH1
;
vlist
[
n
++
]
=
iH2
;
}
if
(
jtype
!=
typeO
)
{
f
[
j
][
0
]
-=
delx
*
cforce
;
f
[
j
][
1
]
-=
dely
*
cforce
;
f
[
j
][
2
]
-=
delz
*
cforce
;
if
(
vflag
)
{
v
[
0
]
-=
x
[
j
][
0
]
*
delx
*
cforce
;
v
[
1
]
-=
x
[
j
][
1
]
*
dely
*
cforce
;
v
[
2
]
-=
x
[
j
][
2
]
*
delz
*
cforce
;
v
[
3
]
-=
x
[
j
][
0
]
*
dely
*
cforce
;
v
[
4
]
-=
x
[
j
][
0
]
*
delz
*
cforce
;
v
[
5
]
-=
x
[
j
][
1
]
*
delz
*
cforce
;
}
vlist
[
n
++
]
=
j
;
}
else
{
key
+=
2
;
fd
[
0
]
=
-
delx
*
cforce
;
fd
[
1
]
=
-
dely
*
cforce
;
fd
[
2
]
=
-
delz
*
cforce
;
fO
[
0
]
=
fd
[
0
]
*
(
1
-
alpha
);
fO
[
1
]
=
fd
[
1
]
*
(
1
-
alpha
);
fO
[
2
]
=
fd
[
2
]
*
(
1
-
alpha
);
fH
[
0
]
=
0.5
*
alpha
*
fd
[
0
];
fH
[
1
]
=
0.5
*
alpha
*
fd
[
1
];
fH
[
2
]
=
0.5
*
alpha
*
fd
[
2
];
f
[
j
][
0
]
+=
fO
[
0
];
f
[
j
][
1
]
+=
fO
[
1
];
f
[
j
][
2
]
+=
fO
[
2
];
f
[
jH1
][
0
]
+=
fH
[
0
];
f
[
jH1
][
1
]
+=
fH
[
1
];
f
[
jH1
][
2
]
+=
fH
[
2
];
f
[
jH2
][
0
]
+=
fH
[
0
];
f
[
jH2
][
1
]
+=
fH
[
1
];
f
[
jH2
][
2
]
+=
fH
[
2
];
if
(
vflag
)
{
domain
->
closest_image
(
x
[
j
],
x
[
jH1
],
xH1
);
domain
->
closest_image
(
x
[
j
],
x
[
jH2
],
xH2
);
v
[
0
]
+=
x
[
j
][
0
]
*
fO
[
0
]
+
xH1
[
0
]
*
fH
[
0
]
+
xH2
[
0
]
*
fH
[
0
];
v
[
1
]
+=
x
[
j
][
1
]
*
fO
[
1
]
+
xH1
[
1
]
*
fH
[
1
]
+
xH2
[
1
]
*
fH
[
1
];
v
[
2
]
+=
x
[
j
][
2
]
*
fO
[
2
]
+
xH1
[
2
]
*
fH
[
2
]
+
xH2
[
2
]
*
fH
[
2
];
v
[
3
]
+=
x
[
j
][
0
]
*
fO
[
1
]
+
xH1
[
0
]
*
fH
[
1
]
+
xH2
[
0
]
*
fH
[
1
];
v
[
4
]
+=
x
[
j
][
0
]
*
fO
[
2
]
+
xH1
[
0
]
*
fH
[
2
]
+
xH2
[
0
]
*
fH
[
2
];
v
[
5
]
+=
x
[
j
][
1
]
*
fO
[
2
]
+
xH1
[
1
]
*
fH
[
2
]
+
xH2
[
1
]
*
fH
[
2
];
}
vlist
[
n
++
]
=
j
;
vlist
[
n
++
]
=
jH1
;
vlist
[
n
++
]
=
jH2
;
}
if
(
eflag
)
{
ecoul
=
qqrd2e
*
qtmp
*
q
[
j
]
*
sqrt
(
r2inv
);
ecoul
*=
factor_coul
;
}
else
ecoul
=
0.0
;
if
(
evflag
)
ev_tally_tip4p
(
key
,
vlist
,
v
,
ecoul
,
alpha
);
}
}
}
}
}
/* ----------------------------------------------------------------------
allocate all arrays
------------------------------------------------------------------------- */
void
PairTIP4PCut
::
allocate
()
{
allocated
=
1
;
int
n
=
atom
->
ntypes
;
memory
->
create
(
setflag
,
n
+
1
,
n
+
1
,
"pair:setflag"
);
for
(
int
i
=
1
;
i
<=
n
;
i
++
)
for
(
int
j
=
i
;
j
<=
n
;
j
++
)
setflag
[
i
][
j
]
=
0
;
memory
->
create
(
cutsq
,
n
+
1
,
n
+
1
,
"pair:cutsq"
);
}
/* ----------------------------------------------------------------------
global settings
------------------------------------------------------------------------- */
void
PairTIP4PCut
::
settings
(
int
narg
,
char
**
arg
)
{
if
(
narg
!=
6
)
error
->
all
(
FLERR
,
"Illegal pair_style command"
);
typeO
=
force
->
inumeric
(
FLERR
,
arg
[
0
]);
typeH
=
force
->
inumeric
(
FLERR
,
arg
[
1
]);
typeB
=
force
->
inumeric
(
FLERR
,
arg
[
2
]);
typeA
=
force
->
inumeric
(
FLERR
,
arg
[
3
]);
qdist
=
force
->
numeric
(
FLERR
,
arg
[
4
]);
cut_coul
=
force
->
numeric
(
FLERR
,
arg
[
5
]);
cut_coulsq
=
cut_coul
*
cut_coul
;
cut_coulsqplus
=
(
cut_coul
+
2.0
*
qdist
)
*
(
cut_coul
+
2.0
*
qdist
);
}
/* ----------------------------------------------------------------------
set coeffs for one or more type pairs
------------------------------------------------------------------------- */
void
PairTIP4PCut
::
coeff
(
int
narg
,
char
**
arg
)
{
if
(
narg
!=
2
)
error
->
all
(
FLERR
,
"Incorrect args for pair coefficients"
);
if
(
!
allocated
)
allocate
();
int
ilo
,
ihi
,
jlo
,
jhi
;
force
->
bounds
(
arg
[
0
],
atom
->
ntypes
,
ilo
,
ihi
);
force
->
bounds
(
arg
[
1
],
atom
->
ntypes
,
jlo
,
jhi
);
int
count
=
0
;
for
(
int
i
=
ilo
;
i
<=
ihi
;
i
++
)
{
for
(
int
j
=
MAX
(
jlo
,
i
);
j
<=
jhi
;
j
++
)
{
setflag
[
i
][
j
]
=
1
;
count
++
;
}
}
if
(
count
==
0
)
error
->
all
(
FLERR
,
"Incorrect args for pair coefficients"
);
}
/* ----------------------------------------------------------------------
init specific to this pair style
------------------------------------------------------------------------- */
void
PairTIP4PCut
::
init_style
()
{
if
(
atom
->
tag_enable
==
0
)
error
->
all
(
FLERR
,
"Pair style tip4p/cut requires atom IDs"
);
if
(
!
force
->
newton_pair
)
error
->
all
(
FLERR
,
"Pair style tip4p/cut requires newton pair on"
);
if
(
!
atom
->
q_flag
)
error
->
all
(
FLERR
,
"Pair style tip4p/cut requires atom attribute q"
);
if
(
force
->
bond
==
NULL
)
error
->
all
(
FLERR
,
"Must use a bond style with TIP4P potential"
);
if
(
force
->
angle
==
NULL
)
error
->
all
(
FLERR
,
"Must use an angle style with TIP4P potential"
);
neighbor
->
request
(
this
);
// set alpha parameter
double
theta
=
force
->
angle
->
equilibrium_angle
(
typeA
);
double
blen
=
force
->
bond
->
equilibrium_distance
(
typeB
);
alpha
=
qdist
/
(
cos
(
0.5
*
theta
)
*
blen
);
}
/* ----------------------------------------------------------------------
init for one type pair i,j and corresponding j,i
------------------------------------------------------------------------- */
double
PairTIP4PCut
::
init_one
(
int
i
,
int
j
)
{
// include TIP4P qdist in full cutoff, qdist = 0.0 if not TIP4P
return
cut_coul
+
2.0
*
qdist
;
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void
PairTIP4PCut
::
write_restart
(
FILE
*
fp
)
{
write_restart_settings
(
fp
);
int
i
,
j
;
for
(
i
=
1
;
i
<=
atom
->
ntypes
;
i
++
)
for
(
j
=
i
;
j
<=
atom
->
ntypes
;
j
++
)
fwrite
(
&
setflag
[
i
][
j
],
sizeof
(
int
),
1
,
fp
);
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void
PairTIP4PCut
::
read_restart
(
FILE
*
fp
)
{
read_restart_settings
(
fp
);
allocate
();
int
i
,
j
;
int
me
=
comm
->
me
;
for
(
i
=
1
;
i
<=
atom
->
ntypes
;
i
++
)
for
(
j
=
i
;
j
<=
atom
->
ntypes
;
j
++
)
{
if
(
me
==
0
)
fread
(
&
setflag
[
i
][
j
],
sizeof
(
int
),
1
,
fp
);
MPI_Bcast
(
&
setflag
[
i
][
j
],
1
,
MPI_INT
,
0
,
world
);
}
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void
PairTIP4PCut
::
write_restart_settings
(
FILE
*
fp
)
{
fwrite
(
&
typeO
,
sizeof
(
int
),
1
,
fp
);
fwrite
(
&
typeH
,
sizeof
(
int
),
1
,
fp
);
fwrite
(
&
typeB
,
sizeof
(
int
),
1
,
fp
);
fwrite
(
&
typeA
,
sizeof
(
int
),
1
,
fp
);
fwrite
(
&
qdist
,
sizeof
(
double
),
1
,
fp
);
fwrite
(
&
cut_coul
,
sizeof
(
double
),
1
,
fp
);
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void
PairTIP4PCut
::
read_restart_settings
(
FILE
*
fp
)
{
if
(
comm
->
me
==
0
)
{
fread
(
&
typeO
,
sizeof
(
int
),
1
,
fp
);
fread
(
&
typeH
,
sizeof
(
int
),
1
,
fp
);
fread
(
&
typeB
,
sizeof
(
int
),
1
,
fp
);
fread
(
&
typeA
,
sizeof
(
int
),
1
,
fp
);
fread
(
&
qdist
,
sizeof
(
double
),
1
,
fp
);
fread
(
&
cut_coul
,
sizeof
(
double
),
1
,
fp
);
}
MPI_Bcast
(
&
typeO
,
1
,
MPI_INT
,
0
,
world
);
MPI_Bcast
(
&
typeH
,
1
,
MPI_INT
,
0
,
world
);
MPI_Bcast
(
&
typeB
,
1
,
MPI_INT
,
0
,
world
);
MPI_Bcast
(
&
typeA
,
1
,
MPI_INT
,
0
,
world
);
MPI_Bcast
(
&
qdist
,
1
,
MPI_DOUBLE
,
0
,
world
);
MPI_Bcast
(
&
cut_coul
,
1
,
MPI_DOUBLE
,
0
,
world
);
cut_coulsq
=
cut_coul
*
cut_coul
;
cut_coulsqplus
=
(
cut_coul
+
2.0
*
qdist
)
*
(
cut_coul
+
2.0
*
qdist
);
}
/* ----------------------------------------------------------------------
compute position xM of fictitious charge site for O atom and 2 H atoms
return it as xM
------------------------------------------------------------------------- */
void
PairTIP4PCut
::
compute_newsite
(
double
*
xO
,
double
*
xH1
,
double
*
xH2
,
double
*
xM
)
{
double
delx1
=
xH1
[
0
]
-
xO
[
0
];
double
dely1
=
xH1
[
1
]
-
xO
[
1
];
double
delz1
=
xH1
[
2
]
-
xO
[
2
];
domain
->
minimum_image
(
delx1
,
dely1
,
delz1
);
double
delx2
=
xH2
[
0
]
-
xO
[
0
];
double
dely2
=
xH2
[
1
]
-
xO
[
1
];
double
delz2
=
xH2
[
2
]
-
xO
[
2
];
domain
->
minimum_image
(
delx2
,
dely2
,
delz2
);
xM
[
0
]
=
xO
[
0
]
+
alpha
*
0.5
*
(
delx1
+
delx2
);
xM
[
1
]
=
xO
[
1
]
+
alpha
*
0.5
*
(
dely1
+
dely2
);
xM
[
2
]
=
xO
[
2
]
+
alpha
*
0.5
*
(
delz1
+
delz2
);
}
/* ----------------------------------------------------------------------
memory usage of hneigh
------------------------------------------------------------------------- */
double
PairTIP4PCut
::
memory_usage
()
{
double
bytes
=
maxeatom
*
sizeof
(
double
);
bytes
+=
maxvatom
*
6
*
sizeof
(
double
);
bytes
+=
2
*
nmax
*
sizeof
(
double
);
return
bytes
;
}
Event Timeline
Log In to Comment