Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
lammps
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
multiscale
lammps
Commits
14251948
Commit
14251948
authored
6 years ago
by
dilkins
Browse files
Options
Downloads
Patches
Plain Diff
LAMMPS coding conventions
parent
799ffc58
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/USER-MISC/fix_ffl.cpp
+303
-353
303 additions, 353 deletions
src/USER-MISC/fix_ffl.cpp
with
303 additions
and
353 deletions
src/USER-MISC/fix_ffl.cpp
+
303
−
353
View file @
14251948
...
@@ -17,7 +17,7 @@
...
@@ -17,7 +17,7 @@
------------------------------------------------------------------------- */
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
/* ----------------------------------------------------------------------
Contributing authors: Lionel Constantin (EPFL), David M. Wilkins (EPFL),
Contributing authors: Lionel Constantin (EPFL), David M. Wilkins (EPFL),
Michele Ceriotti (EPFL)
Michele Ceriotti (EPFL)
------------------------------------------------------------------------- */
------------------------------------------------------------------------- */
...
@@ -62,143 +62,132 @@ enum {CONSTANT,EQUAL,ATOM};
...
@@ -62,143 +62,132 @@ enum {CONSTANT,EQUAL,ATOM};
FixFFL
::
FixFFL
(
LAMMPS
*
lmp
,
int
narg
,
char
**
arg
)
:
FixFFL
::
FixFFL
(
LAMMPS
*
lmp
,
int
narg
,
char
**
arg
)
:
Fix
(
lmp
,
narg
,
arg
)
Fix
(
lmp
,
narg
,
arg
)
{
{
if
(
narg
<
7
)
if
(
narg
<
7
)
error
->
all
(
FLERR
,
"Illegal fix ffl command. Expecting: fix <fix-ID>"
error
->
all
(
FLERR
,
"Illegal fix ffl command. Expecting: fix <fix-ID>"
" <group-ID> ffl <tau> <Tstart> <Tstop> <seed> "
);
" <group-ID> ffl <tau> <Tstart> <Tstop> <seed> "
);
restart_peratom
=
1
;
restart_pe
rat
om
=
1
;
time_integ
rat
e
=
1
;
time_integrate
=
1
;
scalar_flag
=
1
;
scalar_flag
=
1
;
//gamma = 1/ time constant(tau)
//gamma = 1/ time constant(tau
)
if
(
force
->
numeric
(
FLERR
,
arg
[
3
])
<=
0
)
if
(
force
->
numeric
(
FLERR
,
arg
[
3
])
<=
0
)
error
->
all
(
FLERR
,
"Illegal fix ffl tau value, should be greater than 0"
);
error
->
all
(
FLERR
,
"Illegal fix ffl tau value, should be greater than 0"
);
gamma
=
1.0
/
force
->
numeric
(
FLERR
,
arg
[
3
]
);
gamma
=
1.0
/
force
->
numeric
(
FLERR
,
arg
[
3
])
;
ffl_every
=
1
;
ffl_
every
=
1
;
ffl_
step
=
0
;
ffl_step
=
0
;
// start temperature (t ramp)
//
start
temperature (t ramp)
t_
start
=
force
->
numeric
(
FLERR
,
arg
[
4
]);
t_start
=
force
->
numeric
(
FLERR
,
arg
[
4
]);
// final temperature (t ramp)
// final temperature (t ramp)
t_stop
=
force
->
numeric
(
FLERR
,
arg
[
5
]);
t_stop
=
force
->
numeric
(
FLERR
,
arg
[
5
]);
// PRNG seed
// PRNG seed
int
seed
=
force
->
inumeric
(
FLERR
,
arg
[
6
]);
int
seed
=
force
->
inumeric
(
FLERR
,
arg
[
6
]);
// Flip type used, uses rescale if no flip is given
// Flip type used, uses rescale if no flip is given
if
(
narg
==
8
)
{
if
(
narg
==
8
)
{
if
(
strcmp
(
arg
[
7
],
"no_flip"
)
==
0
)
{
if
(
strcmp
(
arg
[
7
],
"no_flip"
)
==
0
)
{
flip_int
=
0
;
}
flip_int
=
0
;
else
if
(
(
strcmp
(
arg
[
7
],
"rescale"
)
==
0
)
{
flip_int
=
1
;}
}
else
if
(
strcmp
(
arg
[
7
],
"rescale"
)
==
0
)
{
else
if
((
strcmp
(
arg
[
7
],
"hard"
)
==
0
)
{
flip_int
=
2
;}
flip_int
=
1
;
else
if
(
(
strcmp
(
arg
[
7
],
"
soft
"
)
==
0
)
{
flip_int
=
3
;}
}
else
if
(
strcmp
(
arg
[
7
],
"
hard
"
)
==
0
)
{
else
{
flip_int
=
2
;
error
->
all
(
FLERR
,
"Illegal fix ffl flip type, only accepts : rescale - hard - soft - no_flip"
);
}
else
if
(
strcmp
(
arg
[
7
],
"soft"
)
==
0
)
{
}
flip_int
=
3
;
}
else
{
}
else
{
flip_int
=
1
;
error
->
all
(
FLERR
,
"Illegal fix ffl flip type, only accepts : rescale - hard - soft - no_flip"
)
;
}
}
}
else
{
flip_int
=
1
;
}
t_target
=
t_start
;
const
double
kT
=
t_target
*
force
->
boltz
/
force
->
mvv2e
;
// if ( strcmp(flip_type,"no_flip") == 0 ) flip_int = 0;
// initialize Marsaglia RNG with processor-unique seed
//
if ( strcmp(flip_type,"rescale") == 0 ) flip_int = 1;
//
NB: this means runs will not be the same with different numbers of processors
//
if (
strcmp(flip_type,"hard") == 0 ) flip_int = 2
;
if
(
seed
<=
0
)
error
->
all
(
FLERR
,
"Illegal fix ffl command"
)
;
// if ( strcmp(flip_type,"soft") == 0 ) flip_int = 3
;
random
=
new
RanMars
(
lmp
,
seed
+
comm
->
me
)
;
t_target
=
t_start
;
// allocate per-type arrays for mass-scaling
const
double
kT
=
t_target
*
force
->
boltz
/
force
->
mvv2e
;
sqrt_m
=
NULL
;
memory
->
grow
(
sqrt_m
,
atom
->
ntypes
+
1
,
"ffl:sqrt_m"
);
// allocates space for temporaries
ffl_tmp1
=
ffl_tmp2
=
NULL
;
// initialize Marsaglia RNG with processor-unique seed
grow_arrays
(
atom
->
nmax
);
// NB: this means runs will not be the same with different numbers of processors
if
(
seed
<=
0
)
error
->
all
(
FLERR
,
"Illegal fix ffl command"
);
random
=
new
RanMars
(
lmp
,
seed
+
comm
->
me
);
// a
llocate per-type arrays for mass-scaling
// a
dd callbacks to enable restarts
sqrt_m
=
NULL
;
atom
->
add_callback
(
0
)
;
memory
->
grow
(
sqrt_m
,
atom
->
ntypes
+
1
,
"ffl:sqrt_m"
);
atom
->
add_callback
(
1
);
// allocates space for temporaries
energy
=
0.0
;
ffl_tmp1
=
ffl_tmp2
=
NULL
;
grow_arrays
(
atom
->
nmax
);
// add callbacks to enable restarts
atom
->
add_callback
(
0
);
atom
->
add_callback
(
1
);
energy
=
0.0
;
}
}
/* --- Frees up memory used by temporaries and buffers ------------------ */
/* --- Frees up memory used by temporaries and buffers ------------------ */
FixFFL
::~
FixFFL
()
FixFFL
::~
FixFFL
()
{
{
delete
random
;
delete
random
;
memory
->
destroy
(
sqrt_m
);
memory
->
destroy
(
sqrt_m
);
memory
->
destroy
(
ffl_tmp1
);
memory
->
destroy
(
ffl_tmp1
);
memory
->
destroy
(
ffl_tmp2
);
memory
->
destroy
(
ffl_tmp2
);
}
}
/* ---------------------------------------------------------------------- */
/* ---------------------------------------------------------------------- */
int
FixFFL
::
setmask
()
int
FixFFL
::
setmask
()
{
{
int
mask
=
0
;
int
mask
=
0
;
mask
|=
INITIAL_INTEGRATE
;
mask
|=
INITIAL_INTEGRATE
;
mask
|=
FINAL_INTEGRATE
;
mask
|=
FINAL_INTEGRATE
;
mask
|=
INITIAL_INTEGRATE_RESPA
;
mask
|=
INITIAL_INTEGRATE_RESPA
;
mask
|=
FINAL_INTEGRATE_RESPA
;
mask
|=
FINAL_INTEGRATE_RESPA
;
mask
|=
THERMO_ENERGY
;
mask
|=
THERMO_ENERGY
;
return
mask
;
return
mask
;
}
}
/* ------- Initializes one-time quantities for FFL ---------------------- */
/* ------- Initializes one-time quantities for FFL ---------------------- */
void
FixFFL
::
init
()
void
FixFFL
::
init
()
{
{
doffl
=
1
;
doffl
=
1
;
dtv
=
update
->
dt
;
dtv
=
update
->
dt
;
dtf
=
0.5
*
update
->
dt
*
force
->
ftm2v
;
dtf
=
0.5
*
update
->
dt
*
force
->
ftm2v
;
// set force prefactors
if
(
!
atom
->
rmass
)
{
for
(
int
i
=
1
;
i
<=
atom
->
ntypes
;
i
++
)
{
sqrt_m
[
i
]
=
sqrt
(
atom
->
mass
[
i
]);
}
}
if
(
strstr
(
update
->
integrate_style
,
"respa"
))
// set force prefactors
{
if
(
!
atom
->
rmass
)
{
nlevels_respa
=
((
Respa
*
)
update
->
i
nt
egrate
)
->
nlevels
;
for
(
int
i
=
1
;
i
<=
atom
->
nt
ypes
;
i
++
)
{
step_respa
=
((
Respa
*
)
update
->
integrate
)
->
step
;
sqrt_m
[
i
]
=
sqrt
(
atom
->
mass
[
i
])
;
}
}
}
init_ffl
();
if
(
strstr
(
update
->
integrate_style
,
"respa"
))
{
nlevels_respa
=
((
Respa
*
)
update
->
integrate
)
->
nlevels
;
step_respa
=
((
Respa
*
)
update
->
integrate
)
->
step
;
}
init_ffl
();
}
}
/* ------- Initializes constants for FFL (change with T and dt) ------- */
/* ------- Initializes constants for FFL (change with T and dt) ------- */
void
FixFFL
::
init_ffl
()
void
FixFFL
::
init_ffl
()
{
{
const
double
kT
=
t_target
*
force
->
boltz
/
force
->
mvv2e
;
const
double
kT
=
t_target
*
force
->
boltz
/
force
->
mvv2e
;
// compute constants for FFL
// compute constants for FFL
c1
=
exp
(
-
gamma
*
0.5
*
dtv
);
c1
=
exp
(
-
gamma
*
0.5
*
dtv
);
c2
=
sqrt
(
(
1.0
-
c1
*
c1
)
*
kT
);
//without the mass term
c2
=
sqrt
(
(
1.0
-
c1
*
c1
)
*
kT
);
//without the mass term
}
}
...
@@ -207,279 +196,244 @@ void FixFFL::init_ffl()
...
@@ -207,279 +196,244 @@ void FixFFL::init_ffl()
/* ---------------------------------------------------------------------- */
/* ---------------------------------------------------------------------- */
void
FixFFL
::
setup
(
int
vflag
)
void
FixFFL
::
setup
(
int
vflag
)
{
{
if
(
strstr
(
update
->
integrate_style
,
"verlet"
))
if
(
strstr
(
update
->
integrate_style
,
"verlet"
))
post_force
(
vflag
);
post_force
(
vflag
);
else
{
else
((
Respa
*
)
update
->
integrate
)
->
copy_flevel_f
(
nlevels_respa
-
1
);
{
post_force_respa
(
vflag
,
nlevels_respa
-
1
,
0
);
((
Respa
*
)
update
->
integrate
)
->
copy_flevel_f
(
nlevels_respa
-
1
);
((
Respa
*
)
update
->
integrate
)
->
copy_f_flevel
(
nlevels_respa
-
1
);
post_force_respa
(
vflag
,
nlevels_respa
-
1
,
0
);
}
((
Respa
*
)
update
->
integrate
)
->
copy_f_flevel
(
nlevels_respa
-
1
);
}
}
}
void
FixFFL
::
ffl_integrate
()
void
FixFFL
::
ffl_integrate
()
{
{
double
**
v
=
atom
->
v
;
double
**
v
=
atom
->
v
;
double
*
rmass
=
atom
->
rmass
,
smi
,
ismi
;
double
*
rmass
=
atom
->
rmass
,
smi
,
ismi
;
double
factor
;
double
factor
;
int
*
type
=
atom
->
type
;
int
*
type
=
atom
->
type
;
int
*
mask
=
atom
->
mask
;
int
*
mask
=
atom
->
mask
;
int
nlocal
=
atom
->
nlocal
;
int
nlocal
=
atom
->
nlocal
;
if
(
igroup
==
atom
->
firstgroup
)
nlocal
=
atom
->
nfirst
;
if
(
igroup
==
atom
->
firstgroup
)
nlocal
=
atom
->
nfirst
;
// loads momentum data (mass-scaled) into the temporary vectors for the propagation
// loads momentum data (mass-scaled) into the temporary vectors for the propagation
int
nk
=
0
;
int
nk
=
0
;
double
deltae
=
0.0
;
double
deltae
=
0.0
;
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
{
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
{
if
(
rmass
)
smi
=
sqrt
(
rmass
[
i
]);
if
(
mask
[
i
]
&
groupbit
)
else
smi
=
sqrt_m
[
type
[
i
]];
{
if
(
rmass
)
smi
=
sqrt
(
rmass
[
i
]);
for
(
int
k
=
0
;
k
<
3
;
k
++
)
{
else
smi
=
sqrt_m
[
type
[
i
]];
// first loads velocities and accumulates conserved quantity
ffl_tmp2
[
nk
]
=
v
[
i
][
k
]
*
smi
;
for
(
int
k
=
0
;
k
<
3
;
k
++
)
deltae
+=
ffl_tmp2
[
nk
]
*
ffl_tmp2
[
nk
];
{
nk
++
;
// first loads velocities and accumulates conserved quantity
}
ffl_tmp2
[
nk
]
=
v
[
i
][
k
]
*
smi
;
deltae
+=
ffl_tmp2
[
nk
]
*
ffl_tmp2
[
nk
];
nk
++
;
}
}
}
}
}
//fills up a vector of random numbers
//fills up a vector of random numbers
for
(
int
i
=
0
;
i
<
nk
;
i
++
)
ffl_tmp1
[
i
]
=
random
->
gaussian
();
for
(
int
i
=
0
;
i
<
nk
;
i
++
)
ffl_tmp1
[
i
]
=
random
->
gaussian
();
// unloads momentum data (mass-scaled) from the temporary vectors
// unloads momentum data (mass-scaled) from the temporary vectors
nk
=
0
;
nk
=
0
;
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
{
if
(
rmass
)
ismi
=
1.0
/
sqrt
(
rmass
[
i
]);
if
(
rmass
)
ismi
=
1.0
/
sqrt
(
rmass
[
i
]);
else
ismi
=
1.0
/
sqrt_m
[
type
[
i
]];
else
ismi
=
1.0
/
sqrt_m
[
type
[
i
]];
for
(
int
k
=
0
;
k
<
3
;
k
++
)
{
for
(
int
k
=
0
;
k
<
3
;
k
++
)
// fetches new velocities and completes computation of the conserved quantity change
{
v
[
i
][
k
]
=
c1
*
v
[
i
][
k
]
+
c2
*
ffl_tmp1
[
nk
]
*
ismi
;
// fetches new velocities and completes computation of the conserved quantity change
v
[
i
][
k
]
=
c1
*
v
[
i
][
k
]
+
c2
*
ffl_tmp1
[
nk
]
*
ismi
;
deltae
-=
v
[
i
][
k
]
*
v
[
i
][
k
]
/
ismi
/
ismi
;
deltae
-=
v
[
i
][
k
]
*
v
[
i
][
k
]
/
ismi
/
ismi
;
//flips the sign of the momentum (HARD FLIP)
if
(
flip_int
==
2
)
{
//flips the sign of the momentum (HARD FLIP)
if
(
v
[
i
][
k
]
*
ffl_tmp2
[
nk
]
<
0.0
)
v
[
i
][
k
]
=
-
v
[
i
][
k
];
if
(
flip_int
==
2
)
{
if
(
v
[
i
][
k
]
*
ffl_tmp2
[
nk
]
<
0.0
)
v
[
i
][
k
]
=
-
v
[
i
][
k
];
}
nk
++
;
}
}
}
//rescale operation (RESCALE FLIP)
nk
++
;
if
(
flip_int
==
1
)
}
{
nk
=
0
;
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
factor
=
sqrt
((
v
[
i
][
0
]
*
v
[
i
][
0
]
+
v
[
i
][
1
]
*
v
[
i
][
1
]
+
v
[
i
][
2
]
*
v
[
i
][
2
])
/
(
ffl_tmp2
[
nk
]
*
ffl_tmp2
[
nk
]
+
ffl_tmp2
[
nk
+
1
]
*
ffl_tmp2
[
nk
+
1
]
+
ffl_tmp2
[
nk
+
2
]
*
ffl_tmp2
[
nk
+
2
]));
for
(
int
k
=
0
;
k
<
3
;
k
++
)
{
v
[
i
][
k
]
=
factor
*
ffl_tmp2
[
nk
];
nk
++
;
}
}
}
}
//rescale operation (RESCALE FLIP)
if
(
flip_int
==
1
)
{
nk
=
0
;
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
factor
=
sqrt
((
v
[
i
][
0
]
*
v
[
i
][
0
]
+
v
[
i
][
1
]
*
v
[
i
][
1
]
+
v
[
i
][
2
]
*
v
[
i
][
2
])
/
(
ffl_tmp2
[
nk
]
*
ffl_tmp2
[
nk
]
+
ffl_tmp2
[
nk
+
1
]
*
ffl_tmp2
[
nk
+
1
]
+
ffl_tmp2
[
nk
+
2
]
*
ffl_tmp2
[
nk
+
2
]));
for
(
int
k
=
0
;
k
<
3
;
k
++
)
{
v
[
i
][
k
]
=
factor
*
ffl_tmp2
[
nk
];
nk
++
;
}
}
}
//soft flip operation (SOFT FLIP)
//soft flip operation (SOFT FLIP)
if
(
flip_int
==
3
)
if
(
flip_int
==
3
)
{
{
nk
=
0
;
nk
=
0
;
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
factor
=
v
[
i
][
0
]
*
ffl_tmp2
[
nk
]
+
v
[
i
][
1
]
*
ffl_tmp2
[
nk
+
1
]
+
v
[
i
][
2
]
*
ffl_tmp2
[
nk
+
2
];
{
if
(
factor
<
0
)
{
factor
=
v
[
i
][
0
]
*
ffl_tmp2
[
nk
]
+
v
[
i
][
1
]
*
ffl_tmp2
[
nk
+
1
]
+
v
[
i
][
2
]
*
ffl_tmp2
[
nk
+
2
];
factor
=
factor
/
(
ffl_tmp2
[
nk
]
*
ffl_tmp2
[
nk
]
+
ffl_tmp2
[
nk
+
1
]
*
ffl_tmp2
[
nk
+
1
]
if
(
factor
<
0
)
+
ffl_tmp2
[
nk
+
2
]
*
ffl_tmp2
[
nk
+
2
]);
{
factor
=
factor
/
(
ffl_tmp2
[
nk
]
*
ffl_tmp2
[
nk
]
+
ffl_tmp2
[
nk
+
1
]
*
ffl_tmp2
[
nk
+
1
]
for
(
int
k
=
0
;
k
<
3
;
k
++
)
{
+
ffl_tmp2
[
nk
+
2
]
*
ffl_tmp2
[
nk
+
2
]);
v
[
i
][
k
]
-=
2.0
*
factor
*
ffl_tmp2
[
nk
];
nk
++
;
for
(
int
k
=
0
;
k
<
3
;
k
++
)
}
{
}
else
{
v
[
i
][
k
]
-=
2.0
*
factor
*
ffl_tmp2
[
nk
];
nk
+=
3
;
nk
++
;
}
}
}
else
nk
+=
3
;
}
}
}
energy
+=
deltae
*
0.5
*
force
->
mvv2e
;
}
energy
+=
deltae
*
0.5
*
force
->
mvv2e
;
}
}
void
FixFFL
::
initial_integrate
(
int
vflag
)
void
FixFFL
::
initial_integrate
(
int
vflag
)
{
{
double
dtfm
;
double
dtfm
;
// update v and x of atoms in group
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
*
mask
=
atom
->
mask
;
int
nlocal
=
atom
->
nlocal
;
if
(
igroup
==
atom
->
firstgroup
)
nlocal
=
atom
->
nfirst
;
ffl_step
--
;
if
(
doffl
&&
ffl_step
<
1
)
ffl_integrate
();
if
(
rmass
)
{
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
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
];
}
}
// update v and x of atoms in group
else
double
**
x
=
atom
->
x
;
{
double
**
v
=
atom
->
v
;
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
double
**
f
=
atom
->
f
;
if
(
mask
[
i
]
&
groupbit
)
double
*
rmass
=
atom
->
rmass
;
{
double
*
mass
=
atom
->
mass
;
dtfm
=
dtf
/
mass
[
type
[
i
]];
int
*
type
=
atom
->
type
;
v
[
i
][
0
]
+=
dtfm
*
f
[
i
][
0
];
int
*
mask
=
atom
->
mask
;
v
[
i
][
1
]
+=
dtfm
*
f
[
i
][
1
];
int
nlocal
=
atom
->
nlocal
;
v
[
i
][
2
]
+=
dtfm
*
f
[
i
][
2
];
if
(
igroup
==
atom
->
firstgroup
)
nlocal
=
atom
->
nfirst
;
x
[
i
][
0
]
+=
dtv
*
v
[
i
][
0
];
x
[
i
][
1
]
+=
dtv
*
v
[
i
][
1
];
ffl_step
--
;
x
[
i
][
2
]
+=
dtv
*
v
[
i
][
2
];
if
(
doffl
&&
ffl_step
<
1
)
ffl_integrate
();
}
}
if
(
rmass
)
{
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
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
];
}
}
else
{
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
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
];
}
}
}
}
void
FixFFL
::
final_integrate
()
void
FixFFL
::
final_integrate
()
{
{
double
dtfm
;
double
dtfm
;
// update v of atoms in group
double
**
v
=
atom
->
v
;
double
**
f
=
atom
->
f
;
double
*
rmass
=
atom
->
rmass
;
double
*
mass
=
atom
->
mass
;
int
*
type
=
atom
->
type
;
int
*
mask
=
atom
->
mask
;
int
nlocal
=
atom
->
nlocal
;
if
(
igroup
==
atom
->
firstgroup
)
nlocal
=
atom
->
nfirst
;
if
(
rmass
)
{
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
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
];
}
}
// update v of atoms in group
else
{
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
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
];
}
}
if
(
doffl
&&
ffl_step
<
1
)
double
**
v
=
atom
->
v
;
{
double
**
f
=
atom
->
f
;
ffl_integrate
();
double
*
rmass
=
atom
->
rmass
;
ffl_step
=
ffl_every
;
double
*
mass
=
atom
->
mass
;
}
int
*
type
=
atom
->
type
;
int
*
mask
=
atom
->
mask
;
int
nlocal
=
atom
->
nlocal
;
if
(
igroup
==
atom
->
firstgroup
)
nlocal
=
atom
->
nfirst
;
// Change the temperature for the next step
if
(
rmass
)
{
double
delta
=
update
->
ntimestep
-
update
->
beginstep
;
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
delta
/=
update
->
endstep
-
update
->
beginstep
;
if
(
mask
[
i
]
&
groupbit
)
{
t_target
=
t_start
+
delta
*
(
t_stop
-
t_start
);
dtfm
=
dtf
/
rmass
[
i
];
if
(
t_stop
!=
t_start
)
v
[
i
][
0
]
+=
dtfm
*
f
[
i
][
0
];
{
v
[
i
][
1
]
+=
dtfm
*
f
[
i
][
1
];
// only updates if it is really necessary
v
[
i
][
2
]
+=
dtfm
*
f
[
i
][
2
];
init_ffl
();
}
}
}
else
{
for
(
int
i
=
0
;
i
<
nlocal
;
i
++
)
if
(
mask
[
i
]
&
groupbit
)
{
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
];
}
}
if
(
doffl
&&
ffl_step
<
1
)
{
ffl_integrate
();
ffl_step
=
ffl_every
;
}
// Change the temperature for the next step
double
delta
=
update
->
ntimestep
-
update
->
beginstep
;
delta
/=
update
->
endstep
-
update
->
beginstep
;
t_target
=
t_start
+
delta
*
(
t_stop
-
t_start
);
if
(
t_stop
!=
t_start
)
{
// only updates if it is really necessary
init_ffl
();
}
}
}
/* ---------------------------------------------------------------------- */
/* ---------------------------------------------------------------------- */
void
FixFFL
::
initial_integrate_respa
(
int
vflag
,
int
ilevel
,
int
iloop
)
void
FixFFL
::
initial_integrate_respa
(
int
vflag
,
int
ilevel
,
int
iloop
)
{
{
dtv
=
step_respa
[
ilevel
];
dtv
=
step_respa
[
ilevel
];
dtf
=
0.5
*
step_respa
[
ilevel
]
*
force
->
ftm2v
;
dtf
=
0.5
*
step_respa
[
ilevel
]
*
force
->
ftm2v
;
// innermost level - NVE update of v and x
// innermost level - NVE update of v and x
// all other levels - NVE update of v
// all other levels - NVE update of v
if
(
ilevel
==
nlevels_respa
-
1
)
ffl_integrate
();
if
(
ilevel
==
nlevels_respa
-
1
)
ffl_integrate
();
doffl
=
0
;
doffl
=
0
;
if
(
ilevel
==
0
)
initial_integrate
(
vflag
);
if
(
ilevel
==
0
)
initial_integrate
(
vflag
);
else
else
{
{
final_integrate
();
final_integrate
();
}
}
}
}
void
FixFFL
::
final_integrate_respa
(
int
ilevel
,
int
iloop
)
void
FixFFL
::
final_integrate_respa
(
int
ilevel
,
int
iloop
)
{
{
dtv
=
step_respa
[
ilevel
];
dtv
=
step_respa
[
ilevel
];
dtf
=
0.5
*
step_respa
[
ilevel
]
*
force
->
ftm2v
;
dtf
=
0.5
*
step_respa
[
ilevel
]
*
force
->
ftm2v
;
doffl
=
0
;
doffl
=
0
;
final_integrate
();
final_integrate
();
if
(
ilevel
==
nlevels_respa
-
1
)
ffl_integrate
();
if
(
ilevel
==
nlevels_respa
-
1
)
ffl_integrate
();
}
}
double
FixFFL
::
compute_scalar
()
double
FixFFL
::
compute_scalar
()
{
{
double
energy_me
=
energy
;
double
energy_me
=
energy
;
double
energy_all
;
double
energy_all
;
MPI_Allreduce
(
&
energy_me
,
&
energy_all
,
1
,
MPI_DOUBLE
,
MPI_SUM
,
world
);
MPI_Allreduce
(
&
energy_me
,
&
energy_all
,
1
,
MPI_DOUBLE
,
MPI_SUM
,
world
);
return
energy_all
;
return
energy_all
;
}
}
/* ----------------------------------------------------------------------
/* ----------------------------------------------------------------------
extract thermostat properties
extract thermostat properties
------------------------------------------------------------------------- */
------------------------------------------------------------------------- */
void
*
FixFFL
::
extract
(
const
char
*
str
,
int
&
dim
)
void
*
FixFFL
::
extract
(
const
char
*
str
,
int
&
dim
)
{
{
dim
=
0
;
dim
=
0
;
if
(
strcmp
(
str
,
"t_target"
)
==
0
)
{
if
(
strcmp
(
str
,
"t_target"
)
==
0
)
return
&
t_target
;
{
}
return
&
t_target
;
return
NULL
;
}
return
NULL
;
}
}
...
@@ -487,32 +441,29 @@ void *FixFFL::extract(const char *str, int &dim)
...
@@ -487,32 +441,29 @@ void *FixFFL::extract(const char *str, int &dim)
Called when a change to the target temperature is requested mid-run
Called when a change to the target temperature is requested mid-run
------------------------------------------------------------------------- */
------------------------------------------------------------------------- */
void
FixFFL
::
reset_target
(
double
t_new
)
void
FixFFL
::
reset_target
(
double
t_new
)
{
{
t_target
=
t_start
=
t_stop
=
t_new
;
t_target
=
t_start
=
t_stop
=
t_new
;
}
}
/* ----------------------------------------------------------------------
/* ----------------------------------------------------------------------
Called when a change to the timestep is requested mid-run
Called when a change to the timestep is requested mid-run
------------------------------------------------------------------------- */
------------------------------------------------------------------------- */
void
FixFFL
::
reset_dt
()
void
FixFFL
::
reset_dt
()
{
{
// set the time integration constants
// set the time integration constants
dtv
=
update
->
dt
;
dtv
=
update
->
dt
;
dtf
=
0.5
*
update
->
dt
*
(
force
->
ftm2v
);
dtf
=
0.5
*
update
->
dt
*
(
force
->
ftm2v
);
init_ffl
();
init_ffl
();
}
}
/* ----------------------------------------------------------------------
/* ----------------------------------------------------------------------
memory usage of local atom-based arrays
memory usage of local atom-based arrays
------------------------------------------------------------------------- */
------------------------------------------------------------------------- */
double
FixFFL
::
memory_usage
()
double
FixFFL
::
memory_usage
()
{
{
double
bytes
=
atom
->
nmax
*
(
3
*
2
)
*
sizeof
(
double
);
double
bytes
=
atom
->
nmax
*
(
3
*
2
)
*
sizeof
(
double
);
return
bytes
;
return
bytes
;
}
}
...
@@ -520,13 +471,12 @@ double FixFFL::memory_usage()
...
@@ -520,13 +471,12 @@ double FixFFL::memory_usage()
allocate local atom-based arrays
allocate local atom-based arrays
------------------------------------------------------------------------- */
------------------------------------------------------------------------- */
void
FixFFL
::
grow_arrays
(
int
nmax
)
void
FixFFL
::
grow_arrays
(
int
nmax
)
{
{
memory
->
grow
(
ffl_tmp1
,
nmax
*
3
,
"ffl:tmp1"
);
memory
->
grow
(
ffl_tmp1
,
nmax
*
3
,
"ffl:tmp1"
);
memory
->
grow
(
ffl_tmp2
,
nmax
*
3
,
"ffl:tmp2"
);
memory
->
grow
(
ffl_tmp2
,
nmax
*
3
,
"ffl:tmp2"
);
//zeroes out temporary buffers
//zeroes out temporary buffers
for
(
int
i
=
0
;
i
<
nmax
*
3
;
++
i
)
ffl_tmp1
[
i
]
=
0.0
;
for
(
int
i
=
0
;
i
<
nmax
*
3
;
++
i
)
ffl_tmp1
[
i
]
=
0.0
;
for
(
int
i
=
0
;
i
<
nmax
*
3
;
++
i
)
ffl_tmp2
[
i
]
=
0.0
;
for
(
int
i
=
0
;
i
<
nmax
*
3
;
++
i
)
ffl_tmp2
[
i
]
=
0.0
;
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment