Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F121797473
reaxc_io_tools.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
Sun, Jul 13, 23:48
Size
58 KB
Mime Type
text/x-c
Expires
Tue, Jul 15, 23:48 (2 d)
Engine
blob
Format
Raw Data
Handle
27361062
Attached To
rLAMMPS lammps
reaxc_io_tools.cpp
View Options
/*----------------------------------------------------------------------
PuReMD - Purdue ReaxFF Molecular Dynamics Program
Copyright (2010) Purdue University
Hasan Metin Aktulga, hmaktulga@lbl.gov
Joseph Fogarty, jcfogart@mail.usf.edu
Sagar Pandit, pandit@usf.edu
Ananth Y Grama, ayg@cs.purdue.edu
Please cite the related publication:
H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama,
"Parallel Reactive Molecular Dynamics: Numerical Methods and
Algorithmic Techniques", Parallel Computing, in press.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details:
<http://www.gnu.org/licenses/>.
----------------------------------------------------------------------*/
#include "pair_reax_c.h"
#include "update.h"
#if defined(PURE_REAX)
#include "io_tools.h"
#include "basic_comm.h"
#include "list.h"
#include "reset_tools.h"
#include "system_props.h"
#include "tool_box.h"
#include "traj.h"
#include "vector.h"
#elif defined(LAMMPS_REAX)
#include "reaxc_io_tools.h"
#include "reaxc_basic_comm.h"
#include "reaxc_list.h"
#include "reaxc_reset_tools.h"
#include "reaxc_system_props.h"
#include "reaxc_tool_box.h"
#include "reaxc_traj.h"
#include "reaxc_vector.h"
#endif
print_interaction
Print_Interactions
[
NUM_INTRS
];
/************************ initialize output controls ************************/
int
Init_Output_Files
(
reax_system
*
system
,
control_params
*
control
,
output_controls
*
out_control
,
mpi_datatypes
*
mpi_data
,
char
*
msg
)
{
char
temp
[
MAX_STR
];
int
ret
;
if
(
out_control
->
write_steps
>
0
){
ret
=
Init_Traj
(
system
,
control
,
out_control
,
mpi_data
,
msg
);
if
(
ret
==
FAILURE
)
return
ret
;
}
if
(
system
->
my_rank
==
MASTER_NODE
)
{
/* These files are written only by the master node */
if
(
out_control
->
energy_update_freq
>
0
)
{
#if defined(PURE_REAX)
/* init out file */
sprintf
(
temp
,
"%s.out"
,
control
->
sim_name
);
if
(
(
out_control
->
out
=
fopen
(
temp
,
"w"
))
!=
NULL
)
{
#if !defined(DEBUG) && !defined(DEBUG_FOCUS)
fprintf
(
out_control
->
out
,
"%-6s%14s%14s%14s%11s%13s%13s
\n
"
,
"step"
,
"total energy"
,
"potential"
,
"kinetic"
,
"T(K)"
,
"V(A^3)"
,
"P(Gpa)"
);
#else
fprintf
(
out_control
->
out
,
"%-6s%24s%24s%24s%13s%16s%13s
\n
"
,
"step"
,
"total energy"
,
"potential"
,
"kinetic"
,
"T(K)"
,
"V(A^3)"
,
"P(GPa)"
);
#endif
fflush
(
out_control
->
out
);
}
else
{
strcpy
(
msg
,
"init_out_controls: .out file could not be opened
\n
"
);
return
FAILURE
;
}
#endif
/* init potentials file */
sprintf
(
temp
,
"%s.pot"
,
control
->
sim_name
);
if
(
(
out_control
->
pot
=
fopen
(
temp
,
"w"
))
!=
NULL
)
{
#if !defined(DEBUG) && !defined(DEBUG_FOCUS)
fprintf
(
out_control
->
pot
,
"%-6s%14s%14s%14s%14s%14s%14s%14s%14s%14s%14s%14s
\n
"
,
"step"
,
"ebond"
,
"eatom"
,
"elp"
,
"eang"
,
"ecoa"
,
"ehb"
,
"etor"
,
"econj"
,
"evdw"
,
"ecoul"
,
"epol"
);
#else
fprintf
(
out_control
->
pot
,
"%-6s%24s%24s%24s%24s%24s%24s%24s%24s%24s%24s%24s
\n
"
,
"step"
,
"ebond"
,
"eatom"
,
"elp"
,
"eang"
,
"ecoa"
,
"ehb"
,
"etor"
,
"econj"
,
"evdw"
,
"ecoul"
,
"epol"
);
#endif
fflush
(
out_control
->
pot
);
}
else
{
strcpy
(
msg
,
"init_out_controls: .pot file could not be opened
\n
"
);
return
FAILURE
;
}
/* init log file */
#if defined(LOG_PERFORMANCE)
sprintf
(
temp
,
"%s.log"
,
control
->
sim_name
);
if
(
(
out_control
->
log
=
fopen
(
temp
,
"w"
))
!=
NULL
)
{
fprintf
(
out_control
->
log
,
"%6s%8s%8s%8s%8s%8s%8s%8s%8s
\n
"
,
"step"
,
"total"
,
"comm"
,
"nbrs"
,
"init"
,
"bonded"
,
"nonb"
,
"qeq"
,
"matvecs"
);
fflush
(
out_control
->
log
);
}
else
{
strcpy
(
msg
,
"init_out_controls: .log file could not be opened
\n
"
);
return
FAILURE
;
}
#endif
}
/* init pressure file */
if
(
control
->
ensemble
==
NPT
||
control
->
ensemble
==
iNPT
||
control
->
ensemble
==
sNPT
)
{
sprintf
(
temp
,
"%s.prs"
,
control
->
sim_name
);
if
(
(
out_control
->
prs
=
fopen
(
temp
,
"w"
))
!=
NULL
)
{
fprintf
(
out_control
->
prs
,
"%8s%13s%13s%13s%13s%13s%13s%13s
\n
"
,
"step"
,
"Pint/norm[x]"
,
"Pint/norm[y]"
,
"Pint/norm[z]"
,
"Pext/Ptot[x]"
,
"Pext/Ptot[y]"
,
"Pext/Ptot[z]"
,
"Pkin/V"
);
fflush
(
out_control
->
prs
);
}
else
{
strcpy
(
msg
,
"init_out_controls: .prs file couldn't be opened
\n
"
);
return
FAILURE
;
}
}
/* init electric dipole moment analysis file */
// not yet implemented in the parallel version!!!
// if( control->dipole_anal ) {
// sprintf( temp, "%s.dpl", control->sim_name );
// if( (out_control->dpl = fopen( temp, "w" )) != NULL ) {
// fprintf( out_control->dpl, "%6s%20s%30s",
// "step", "molecule count", "avg dipole moment norm" );
// fflush( out_control->dpl );
// }
// else {
// strcpy(msg, "init_out_controls: .dpl file couldn't be opened\n");
// return FAILURE;
// }
// }
/* init diffusion coef analysis file */
// not yet implemented in the parallel version!!!
// if( control->diffusion_coef ) {
// sprintf( temp, "%s.drft", control->sim_name );
// if( (out_control->drft = fopen( temp, "w" )) != NULL ) {
// fprintf( out_control->drft, "%7s%20s%20s\n",
// "step", "type count", "avg disp^2" );
// fflush( out_control->drft );
// }
// else {
// strcpy(msg,"init_out_controls: .drft file couldn't be opened\n");
// return FAILURE;
// }
// }
}
/* init molecular analysis file */
/* proc0 opens this file and shares it with everyone.
then all processors write into it in a round-robin
fashion controlled by their rank */
/*if( control->molecular_analysis ) {
if( system->my_rank == MASTER_NODE ) {
sprintf( temp, "%s.mol", control->sim_name );
if( (out_control->mol = fopen( temp, "w" )) == NULL ) {
strcpy(msg,"init_out_controls: .mol file could not be opened\n");
return FAILURE;
}
}
MPI_Bcast( &(out_control->mol), 1, MPI_LONG, 0, MPI_COMM_WORLD );
}*/
#ifdef TEST_ENERGY
/* open bond energy file */
sprintf
(
temp
,
"%s.ebond.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
ebond
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .ebond file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open lone-pair energy file */
sprintf
(
temp
,
"%s.elp.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
elp
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .elp file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open overcoordination energy file */
sprintf
(
temp
,
"%s.eov.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
eov
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .eov file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open undercoordination energy file */
sprintf
(
temp
,
"%s.eun.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
eun
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .eun file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open angle energy file */
sprintf
(
temp
,
"%s.eval.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
eval
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .eval file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open coalition energy file */
sprintf
(
temp
,
"%s.ecoa.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
ecoa
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .ecoa file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open penalty energy file */
sprintf
(
temp
,
"%s.epen.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
epen
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .epen file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open torsion energy file */
sprintf
(
temp
,
"%s.etor.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
etor
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .etor file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open conjugation energy file */
sprintf
(
temp
,
"%s.econ.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
econ
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .econ file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open hydrogen bond energy file */
sprintf
(
temp
,
"%s.ehb.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
ehb
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .ehb file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open vdWaals energy file */
sprintf
(
temp
,
"%s.evdw.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
evdw
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .evdw file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open coulomb energy file */
sprintf
(
temp
,
"%s.ecou.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
ecou
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .ecou file couldn't be opened
\n
"
);
return
FAILURE
;
}
#endif
#ifdef TEST_FORCES
/* open bond orders file */
sprintf
(
temp
,
"%s.fbo.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
fbo
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fbo file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open bond orders derivatives file */
sprintf
(
temp
,
"%s.fdbo.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
fdbo
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fdbo file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* produce a single force file - to be written by p0 */
if
(
system
->
my_rank
==
MASTER_NODE
)
{
/* open bond forces file */
sprintf
(
temp
,
"%s.fbond"
,
control
->
sim_name
);
if
(
(
out_control
->
fbond
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fbond file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open lone-pair forces file */
sprintf
(
temp
,
"%s.flp"
,
control
->
sim_name
);
if
(
(
out_control
->
flp
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .flp file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open overcoordination forces file */
sprintf
(
temp
,
"%s.fov"
,
control
->
sim_name
);
if
(
(
out_control
->
fov
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fov file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open undercoordination forces file */
sprintf
(
temp
,
"%s.fun"
,
control
->
sim_name
);
if
(
(
out_control
->
fun
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fun file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open angle forces file */
sprintf
(
temp
,
"%s.fang"
,
control
->
sim_name
);
if
(
(
out_control
->
fang
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fang file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open coalition forces file */
sprintf
(
temp
,
"%s.fcoa"
,
control
->
sim_name
);
if
(
(
out_control
->
fcoa
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fcoa file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open penalty forces file */
sprintf
(
temp
,
"%s.fpen"
,
control
->
sim_name
);
if
(
(
out_control
->
fpen
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fpen file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open torsion forces file */
sprintf
(
temp
,
"%s.ftor"
,
control
->
sim_name
);
if
(
(
out_control
->
ftor
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .ftor file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open conjugation forces file */
sprintf
(
temp
,
"%s.fcon"
,
control
->
sim_name
);
if
(
(
out_control
->
fcon
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fcon file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open hydrogen bond forces file */
sprintf
(
temp
,
"%s.fhb"
,
control
->
sim_name
);
if
(
(
out_control
->
fhb
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fhb file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open vdw forces file */
sprintf
(
temp
,
"%s.fvdw"
,
control
->
sim_name
);
if
(
(
out_control
->
fvdw
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fvdw file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open nonbonded forces file */
sprintf
(
temp
,
"%s.fele"
,
control
->
sim_name
);
if
(
(
out_control
->
fele
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fele file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open total force file */
sprintf
(
temp
,
"%s.ftot"
,
control
->
sim_name
);
if
(
(
out_control
->
ftot
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .ftot file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open force comprison file */
sprintf
(
temp
,
"%s.fcomp"
,
control
->
sim_name
);
if
(
(
out_control
->
fcomp
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .fcomp file couldn't be opened
\n
"
);
return
FAILURE
;
}
}
#endif
#if defined(PURE_REAX)
#if defined(TEST_FORCES) || defined(TEST_ENERGY)
/* open far neighbor list file */
sprintf
(
temp
,
"%s.far_nbrs_list.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
flist
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .far_nbrs_list file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open bond list file */
sprintf
(
temp
,
"%s.bond_list.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
blist
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .bond_list file couldn't be opened
\n
"
);
return
FAILURE
;
}
/* open near neighbor list file */
sprintf
(
temp
,
"%s.near_nbrs_list.%d"
,
control
->
sim_name
,
system
->
my_rank
);
if
(
(
out_control
->
nlist
=
fopen
(
temp
,
"w"
))
==
NULL
)
{
strcpy
(
msg
,
"Init_Out_Files: .near_nbrs_list file couldn't be opened
\n
"
);
return
FAILURE
;
}
#endif
#endif
return
SUCCESS
;
}
/************************ close output files ************************/
int
Close_Output_Files
(
reax_system
*
system
,
control_params
*
control
,
output_controls
*
out_control
,
mpi_datatypes
*
mpi_data
)
{
if
(
out_control
->
write_steps
>
0
)
End_Traj
(
system
->
my_rank
,
out_control
);
if
(
system
->
my_rank
==
MASTER_NODE
)
{
if
(
out_control
->
energy_update_freq
>
0
)
{
#if defined(PURE_REAX)
fclose
(
out_control
->
out
);
#endif
fclose
(
out_control
->
pot
);
#if defined(LOG_PERFORMANCE)
fclose
(
out_control
->
log
);
#endif
}
if
(
control
->
ensemble
==
NPT
||
control
->
ensemble
==
iNPT
||
control
->
ensemble
==
sNPT
)
fclose
(
out_control
->
prs
);
// not yet implemented in the parallel version
//if( control->dipole_anal ) fclose( out_control->dpl );
//if( control->diffusion_coef ) fclose( out_control->drft );
//if( control->molecular_analysis ) fclose( out_control->mol );
}
#ifdef TEST_ENERGY
fclose
(
out_control
->
ebond
);
fclose
(
out_control
->
elp
);
fclose
(
out_control
->
eov
);
fclose
(
out_control
->
eun
);
fclose
(
out_control
->
eval
);
fclose
(
out_control
->
epen
);
fclose
(
out_control
->
ecoa
);
fclose
(
out_control
->
ehb
);
fclose
(
out_control
->
etor
);
fclose
(
out_control
->
econ
);
fclose
(
out_control
->
evdw
);
fclose
(
out_control
->
ecou
);
#endif
#ifdef TEST_FORCES
fclose
(
out_control
->
fbo
);
fclose
(
out_control
->
fdbo
);
if
(
system
->
my_rank
==
MASTER_NODE
)
{
fclose
(
out_control
->
fbond
);
fclose
(
out_control
->
flp
);
fclose
(
out_control
->
fov
);
fclose
(
out_control
->
fun
);
fclose
(
out_control
->
fang
);
fclose
(
out_control
->
fcoa
);
fclose
(
out_control
->
fpen
);
fclose
(
out_control
->
ftor
);
fclose
(
out_control
->
fcon
);
fclose
(
out_control
->
fhb
);
fclose
(
out_control
->
fvdw
);
fclose
(
out_control
->
fele
);
fclose
(
out_control
->
ftot
);
fclose
(
out_control
->
fcomp
);
}
#endif
#if defined(PURE_REAX)
#if defined(TEST_FORCES) || defined(TEST_ENERGY)
fclose
(
out_control
->
flist
);
fclose
(
out_control
->
blist
);
fclose
(
out_control
->
nlist
);
#endif
#endif
return
SUCCESS
;
}
void
Print_Box
(
simulation_box
*
box
,
char
*
name
,
FILE
*
out
)
{
// int i, j;
fprintf
(
out
,
"%s:
\n
"
,
name
);
fprintf
(
out
,
"
\t
min[%8.3f %8.3f %8.3f]
\n
"
,
box
->
min
[
0
],
box
->
min
[
1
],
box
->
min
[
2
]
);
fprintf
(
out
,
"
\t
max[%8.3f %8.3f %8.3f]
\n
"
,
box
->
max
[
0
],
box
->
max
[
1
],
box
->
max
[
2
]
);
fprintf
(
out
,
"
\t
dims[%8.3f%8.3f%8.3f]
\n
"
,
box
->
box_norms
[
0
],
box
->
box_norms
[
1
],
box
->
box_norms
[
2
]
);
// fprintf( out, "box: {" );
// for( i = 0; i < 3; ++i )
// {
// fprintf( out, "{" );
// for( j = 0; j < 3; ++j )
// fprintf( out, "%8.3f ", box->box[i][j] );
// fprintf( out, "}" );
// }
// fprintf( out, "}\n" );
// fprintf( out, "box_trans: {" );
// for( i = 0; i < 3; ++i )
// {
// fprintf( out, "{" );
// for( j = 0; j < 3; ++j )
// fprintf( out, "%8.3f ", box->trans[i][j] );
// fprintf( out, "}" );
// }
// fprintf( out, "}\n" );
// fprintf( out, "box_trinv: {" );
// for( i = 0; i < 3; ++i )
// {
// fprintf( out, "{" );
// for( j = 0; j < 3; ++j )
// fprintf( out, "%8.3f ", box->trans_inv[i][j] );
// fprintf( out, "}" );
// }
// fprintf( out, "}\n" );
}
void
Print_Grid
(
grid
*
g
,
FILE
*
out
)
{
int
x
,
y
,
z
,
gc_type
;
ivec
gc_str
;
char
gcell_type_text
[
10
][
12
]
=
{
"NO_NBRS"
,
"NEAR_ONLY"
,
"HBOND_ONLY"
,
"FAR_ONLY"
,
"NEAR_HBOND"
,
"NEAR_FAR"
,
"HBOND_FAR"
,
"FULL_NBRS"
,
"NATIVE"
};
fprintf
(
out
,
"
\t
number of grid cells: %d %d %d
\n
"
,
g
->
ncells
[
0
],
g
->
ncells
[
1
],
g
->
ncells
[
2
]
);
fprintf
(
out
,
"
\t
gcell lengths: %8.3f %8.3f %8.3f
\n
"
,
g
->
cell_len
[
0
],
g
->
cell_len
[
1
],
g
->
cell_len
[
2
]
);
fprintf
(
out
,
"
\t
inverses of gcell lengths: %8.3f %8.3f %8.3f
\n
"
,
g
->
inv_len
[
0
],
g
->
inv_len
[
1
],
g
->
inv_len
[
2
]
);
fprintf
(
out
,
"
\t
---------------------------------
\n
"
);
fprintf
(
out
,
"
\t
number of native gcells: %d %d %d
\n
"
,
g
->
native_cells
[
0
],
g
->
native_cells
[
1
],
g
->
native_cells
[
2
]
);
fprintf
(
out
,
"
\t
native gcell span: %d-%d %d-%d %d-%d
\n
"
,
g
->
native_str
[
0
],
g
->
native_end
[
0
],
g
->
native_str
[
1
],
g
->
native_end
[
1
],
g
->
native_str
[
2
],
g
->
native_end
[
2
]
);
fprintf
(
out
,
"
\t
---------------------------------
\n
"
);
fprintf
(
out
,
"
\t
vlist gcell stretch: %d %d %d
\n
"
,
g
->
vlist_span
[
0
],
g
->
vlist_span
[
1
],
g
->
vlist_span
[
2
]
);
fprintf
(
out
,
"
\t
nonbonded nbrs gcell stretch: %d %d %d
\n
"
,
g
->
nonb_span
[
0
],
g
->
nonb_span
[
1
],
g
->
nonb_span
[
2
]
);
fprintf
(
out
,
"
\t
bonded nbrs gcell stretch: %d %d %d
\n
"
,
g
->
bond_span
[
0
],
g
->
bond_span
[
1
],
g
->
bond_span
[
2
]
);
fprintf
(
out
,
"
\t
---------------------------------
\n
"
);
fprintf
(
out
,
"
\t
ghost gcell span: %d %d %d
\n
"
,
g
->
ghost_span
[
0
],
g
->
ghost_span
[
1
],
g
->
ghost_span
[
2
]
);
fprintf
(
out
,
"
\t
nonbonded ghost gcell span: %d %d %d
\n
"
,
g
->
ghost_nonb_span
[
0
],
g
->
ghost_nonb_span
[
1
],
g
->
ghost_nonb_span
[
2
]);
fprintf
(
out
,
"
\t
hbonded ghost gcell span: %d %d %d
\n
"
,
g
->
ghost_hbond_span
[
0
],
g
->
ghost_hbond_span
[
1
],
g
->
ghost_hbond_span
[
2
]);
fprintf
(
out
,
"
\t
bonded ghost gcell span: %d %d %d
\n
"
,
g
->
ghost_bond_span
[
0
],
g
->
ghost_bond_span
[
1
],
g
->
ghost_bond_span
[
2
]);
//fprintf(out, "\t---------------------------------\n" );
//fprintf(out, "\tmax number of gcells at the boundary: %d\n", g->gcell_cap);
fprintf
(
out
,
"
\t
---------------------------------
\n
"
);
fprintf
(
stderr
,
"GCELL MARKS:
\n
"
);
gc_type
=
g
->
cells
[
0
][
0
][
0
].
type
;
ivec_MakeZero
(
gc_str
);
x
=
y
=
z
=
0
;
for
(
x
=
0
;
x
<
g
->
ncells
[
0
];
++
x
)
for
(
y
=
0
;
y
<
g
->
ncells
[
1
];
++
y
)
for
(
z
=
0
;
z
<
g
->
ncells
[
2
];
++
z
)
if
(
g
->
cells
[
x
][
y
][
z
].
type
!=
gc_type
){
fprintf
(
stderr
,
"
\t
gcells from(%2d %2d %2d) to (%2d %2d %2d): %d - %s
\n
"
,
gc_str
[
0
],
gc_str
[
1
],
gc_str
[
2
],
x
,
y
,
z
,
gc_type
,
gcell_type_text
[
gc_type
]
);
gc_type
=
g
->
cells
[
x
][
y
][
z
].
type
;
gc_str
[
0
]
=
x
;
gc_str
[
1
]
=
y
;
gc_str
[
2
]
=
z
;
}
fprintf
(
stderr
,
"
\t
gcells from(%2d %2d %2d) to (%2d %2d %2d): %d - %s
\n
"
,
gc_str
[
0
],
gc_str
[
1
],
gc_str
[
2
],
x
,
y
,
z
,
gc_type
,
gcell_type_text
[
gc_type
]
);
fprintf
(
out
,
"-------------------------------------
\n
"
);
}
#if 0
void Print_GCell_Exchange_Bounds( int my_rank, neighbor_proc *my_nbrs )
{
ivec r;
int nbr;
neighbor_proc *nbr_pr;
char fname[100];
FILE *f;
char exch[3][10] = { "NONE", "NEAR_EXCH", "FULL_EXCH" };
sprintf( fname, "gcell_exchange_bounds%d", my_rank );
f = fopen( fname, "w" );
/* loop over neighbor processes */
for( r[0] = -1; r[0] <= 1; ++r[0])
for( r[1] = -1; r[1] <= 1; ++r[1] )
for( r[2] = -1; r[2] <= 1; ++r[2] )
if( r[0]!=0 || r[1]!=0 || r[2]!=0 ) {
nbr_pr = &(my_nbrs[nbr]);
fprintf( f, "p%-2d GCELL BOUNDARIES with r(%2d %2d %2d):\n",
my_rank, r[0], r[1], r[2] );
fprintf( f, "\tsend_type %s: send(%d %d %d) to (%d %d %d)\n",
exch[nbr_pr->send_type],
nbr_pr->str_send[0], nbr_pr->str_send[1],
nbr_pr->str_send[2],
nbr_pr->end_send[0], nbr_pr->end_send[1],
nbr_pr->end_send[2] );
fprintf( f, "\trecv_type %s: recv(%d %d %d) to (%d %d %d)\n",
exch[nbr_pr->recv_type],
nbr_pr->str_recv[0], nbr_pr->str_recv[1],
nbr_pr->str_recv[2],
nbr_pr->end_recv[0], nbr_pr->end_recv[1],
nbr_pr->end_recv[2] );
}
fclose(f);
}
#endif
void
Print_Native_GCells
(
reax_system
*
system
)
{
int
i
,
j
,
k
,
l
;
char
fname
[
100
];
FILE
*
f
;
grid
*
g
;
grid_cell
*
gc
;
char
gcell_type_text
[
10
][
12
]
=
{
"NO_NBRS"
,
"NEAR_ONLY"
,
"HBOND_ONLY"
,
"FAR_ONLY"
,
"NEAR_HBOND"
,
"NEAR_FAR"
,
"HBOND_FAR"
,
"FULL_NBRS"
,
"NATIVE"
};
sprintf
(
fname
,
"native_gcells.%d"
,
system
->
my_rank
);
f
=
fopen
(
fname
,
"w"
);
g
=
&
(
system
->
my_grid
);
for
(
i
=
g
->
native_str
[
0
];
i
<
g
->
native_end
[
0
];
i
++
)
for
(
j
=
g
->
native_str
[
1
];
j
<
g
->
native_end
[
1
];
j
++
)
for
(
k
=
g
->
native_str
[
2
];
k
<
g
->
native_end
[
2
];
k
++
)
{
gc
=
&
(
g
->
cells
[
i
][
j
][
k
]
);
fprintf
(
f
,
"p%d gcell(%2d %2d %2d) of type %d(%s)
\n
"
,
system
->
my_rank
,
i
,
j
,
k
,
gc
->
type
,
gcell_type_text
[
gc
->
type
]
);
fprintf
(
f
,
"
\t
atom list start: %d, end: %d
\n\t
"
,
gc
->
str
,
gc
->
end
);
for
(
l
=
gc
->
str
;
l
<
gc
->
end
;
++
l
)
fprintf
(
f
,
TAGINT_FORMAT
,
system
->
my_atoms
[
l
].
orig_id
);
fprintf
(
f
,
"
\n
"
);
}
fclose
(
f
);
}
void
Print_All_GCells
(
reax_system
*
system
)
{
int
i
,
j
,
k
,
l
;
char
fname
[
100
];
FILE
*
f
;
grid
*
g
;
grid_cell
*
gc
;
char
gcell_type_text
[
10
][
12
]
=
{
"NO_NBRS"
,
"NEAR_ONLY"
,
"HBOND_ONLY"
,
"FAR_ONLY"
,
"NEAR_HBOND"
,
"NEAR_FAR"
,
"HBOND_FAR"
,
"FULL_NBRS"
,
"NATIVE"
};
sprintf
(
fname
,
"all_gcells.%d"
,
system
->
my_rank
);
f
=
fopen
(
fname
,
"w"
);
g
=
&
(
system
->
my_grid
);
for
(
i
=
0
;
i
<
g
->
ncells
[
0
];
i
++
)
for
(
j
=
0
;
j
<
g
->
ncells
[
1
];
j
++
)
for
(
k
=
0
;
k
<
g
->
ncells
[
2
];
k
++
)
{
gc
=
&
(
g
->
cells
[
i
][
j
][
k
]
);
fprintf
(
f
,
"p%d gcell(%2d %2d %2d) of type %d(%s)
\n
"
,
system
->
my_rank
,
i
,
j
,
k
,
gc
->
type
,
gcell_type_text
[
gc
->
type
]
);
fprintf
(
f
,
"
\t
atom list start: %d, end: %d
\n\t
"
,
gc
->
str
,
gc
->
end
);
for
(
l
=
gc
->
str
;
l
<
gc
->
end
;
++
l
)
fprintf
(
f
,
TAGINT_FORMAT
,
system
->
my_atoms
[
l
].
orig_id
);
fprintf
(
f
,
"
\n
"
);
}
fclose
(
f
);
}
void
Print_My_Atoms
(
reax_system
*
system
)
{
int
i
;
char
fname
[
100
];
FILE
*
fh
;
sprintf
(
fname
,
"my_atoms.%d"
,
system
->
my_rank
);
if
(
(
fh
=
fopen
(
fname
,
"w"
))
==
NULL
)
{
fprintf
(
stderr
,
"error in opening my_atoms file"
);
MPI_Abort
(
MPI_COMM_WORLD
,
FILE_NOT_FOUND
);
}
// fprintf( stderr, "p%d had %d atoms\n",
// system->my_rank, system->n );
for
(
i
=
0
;
i
<
system
->
n
;
++
i
)
fprintf
(
fh
,
"p%-2d %-5d %2d %24.15e%24.15e%24.15e
\n
"
,
system
->
my_rank
,
system
->
my_atoms
[
i
].
orig_id
,
system
->
my_atoms
[
i
].
type
,
system
->
my_atoms
[
i
].
x
[
0
],
system
->
my_atoms
[
i
].
x
[
1
],
system
->
my_atoms
[
i
].
x
[
2
]
);
fclose
(
fh
);
}
void
Print_My_Ext_Atoms
(
reax_system
*
system
)
{
int
i
;
char
fname
[
100
];
FILE
*
fh
;
sprintf
(
fname
,
"my_ext_atoms.%d"
,
system
->
my_rank
);
if
(
(
fh
=
fopen
(
fname
,
"w"
))
==
NULL
)
{
fprintf
(
stderr
,
"error in opening my_ext_atoms file"
);
MPI_Abort
(
MPI_COMM_WORLD
,
FILE_NOT_FOUND
);
}
// fprintf( stderr, "p%d had %d atoms\n",
// system->my_rank, system->n );
for
(
i
=
0
;
i
<
system
->
N
;
++
i
)
fprintf
(
fh
,
"p%-2d %-5d imprt%-5d %2d %24.15e%24.15e%24.15e
\n
"
,
system
->
my_rank
,
system
->
my_atoms
[
i
].
orig_id
,
system
->
my_atoms
[
i
].
imprt_id
,
system
->
my_atoms
[
i
].
type
,
system
->
my_atoms
[
i
].
x
[
0
],
system
->
my_atoms
[
i
].
x
[
1
],
system
->
my_atoms
[
i
].
x
[
2
]
);
fclose
(
fh
);
}
void
Print_Far_Neighbors
(
reax_system
*
system
,
reax_list
**
lists
,
control_params
*
control
)
{
char
fname
[
100
];
int
i
,
j
,
nbr
,
natoms
;
tagint
id_i
,
id_j
;
FILE
*
fout
;
reax_list
*
far_nbrs
;
sprintf
(
fname
,
"%s.far_nbrs.%d"
,
control
->
sim_name
,
system
->
my_rank
);
fout
=
fopen
(
fname
,
"w"
);
far_nbrs
=
(
*
lists
)
+
FAR_NBRS
;
natoms
=
system
->
N
;
for
(
i
=
0
;
i
<
natoms
;
++
i
)
{
id_i
=
system
->
my_atoms
[
i
].
orig_id
;
for
(
j
=
Start_Index
(
i
,
far_nbrs
);
j
<
End_Index
(
i
,
far_nbrs
);
++
j
)
{
nbr
=
far_nbrs
->
select
.
far_nbr_list
[
j
].
nbr
;
id_j
=
system
->
my_atoms
[
nbr
].
orig_id
;
fprintf
(
fout
,
"%6d%6d%24.15e%24.15e%24.15e%24.15e
\n
"
,
id_i
,
id_j
,
far_nbrs
->
select
.
far_nbr_list
[
j
].
d
,
far_nbrs
->
select
.
far_nbr_list
[
j
].
dvec
[
0
],
far_nbrs
->
select
.
far_nbr_list
[
j
].
dvec
[
1
],
far_nbrs
->
select
.
far_nbr_list
[
j
].
dvec
[
2
]
);
fprintf
(
fout
,
"%6d%6d%24.15e%24.15e%24.15e%24.15e
\n
"
,
id_j
,
id_i
,
far_nbrs
->
select
.
far_nbr_list
[
j
].
d
,
-
far_nbrs
->
select
.
far_nbr_list
[
j
].
dvec
[
0
],
-
far_nbrs
->
select
.
far_nbr_list
[
j
].
dvec
[
1
],
-
far_nbrs
->
select
.
far_nbr_list
[
j
].
dvec
[
2
]
);
}
}
fclose
(
fout
);
}
void
Print_Sparse_Matrix
(
reax_system
*
system
,
sparse_matrix
*
A
)
{
int
i
,
j
;
for
(
i
=
0
;
i
<
A
->
n
;
++
i
)
for
(
j
=
A
->
start
[
i
];
j
<
A
->
end
[
i
];
++
j
)
fprintf
(
stderr
,
"%d %d %.15e
\n
"
,
system
->
my_atoms
[
i
].
orig_id
,
system
->
my_atoms
[
A
->
entries
[
j
].
j
].
orig_id
,
A
->
entries
[
j
].
val
);
}
void
Print_Sparse_Matrix2
(
reax_system
*
system
,
sparse_matrix
*
A
,
char
*
fname
)
{
int
i
,
j
;
FILE
*
f
=
fopen
(
fname
,
"w"
);
for
(
i
=
0
;
i
<
A
->
n
;
++
i
)
for
(
j
=
A
->
start
[
i
];
j
<
A
->
end
[
i
];
++
j
)
fprintf
(
f
,
"%d %d %.15e
\n
"
,
system
->
my_atoms
[
i
].
orig_id
,
system
->
my_atoms
[
A
->
entries
[
j
].
j
].
orig_id
,
A
->
entries
[
j
].
val
);
fclose
(
f
);
}
void
Print_Symmetric_Sparse
(
reax_system
*
system
,
sparse_matrix
*
A
,
char
*
fname
)
{
int
i
,
j
;
reax_atom
*
ai
,
*
aj
;
FILE
*
f
=
fopen
(
fname
,
"w"
);
for
(
i
=
0
;
i
<
A
->
n
;
++
i
)
{
ai
=
&
(
system
->
my_atoms
[
i
]);
for
(
j
=
A
->
start
[
i
];
j
<
A
->
end
[
i
];
++
j
)
{
aj
=
&
(
system
->
my_atoms
[
A
->
entries
[
j
].
j
]);
fprintf
(
f
,
"%d %d %.15e
\n
"
,
ai
->
renumber
,
aj
->
renumber
,
A
->
entries
[
j
].
val
);
if
(
A
->
entries
[
j
].
j
<
system
->
n
&&
ai
->
renumber
!=
aj
->
renumber
)
fprintf
(
f
,
"%d %d %.15e
\n
"
,
aj
->
renumber
,
ai
->
renumber
,
A
->
entries
[
j
].
val
);
}
}
fclose
(
f
);
}
void
Print_Linear_System
(
reax_system
*
system
,
control_params
*
control
,
storage
*
workspace
,
int
step
)
{
int
i
;
char
fname
[
100
];
reax_atom
*
ai
;
FILE
*
out
;
// print rhs and init guesses for QEq
sprintf
(
fname
,
"%s.p%dstate%d"
,
control
->
sim_name
,
system
->
my_rank
,
step
);
out
=
fopen
(
fname
,
"w"
);
for
(
i
=
0
;
i
<
system
->
n
;
i
++
)
{
ai
=
&
(
system
->
my_atoms
[
i
]);
fprintf
(
out
,
"%6d%2d%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e
\n
"
,
ai
->
renumber
,
ai
->
type
,
ai
->
x
[
0
],
ai
->
x
[
1
],
ai
->
x
[
2
],
workspace
->
s
[
i
],
workspace
->
b_s
[
i
],
workspace
->
t
[
i
],
workspace
->
b_t
[
i
]
);
}
fclose
(
out
);
// print QEq coef matrix
sprintf
(
fname
,
"%s.p%dH%d"
,
control
->
sim_name
,
system
->
my_rank
,
step
);
Print_Symmetric_Sparse
(
system
,
workspace
->
H
,
fname
);
// print the incomplete H matrix
/*sprintf( fname, "%s.p%dHinc%d", control->sim_name, system->my_rank, step );
out = fopen( fname, "w" );
H = workspace->H;
for( i = 0; i < H->n; ++i ) {
ai = &(system->my_atoms[i]);
for( j = H->start[i]; j < H->end[i]; ++j )
if( H->entries[j].j < system->n ) {
aj = &(system->my_atoms[H->entries[j].j]);
fprintf( out, "%d %d %.15e\n",
ai->orig_id, aj->orig_id, H->entries[j].val );
if( ai->orig_id != aj->orig_id )
fprintf( out, "%d %d %.15e\n",
aj->orig_id, ai->orig_id, H->entries[j].val );
}
}
fclose( out );*/
// print the L from incomplete cholesky decomposition
/*sprintf( fname, "%s.p%dL%d", control->sim_name, system->my_rank, step );
Print_Sparse_Matrix2( system, workspace->L, fname );*/
}
void
Print_LinSys_Soln
(
reax_system
*
system
,
real
*
x
,
real
*
b_prm
,
real
*
b
)
{
int
i
;
char
fname
[
100
];
FILE
*
fout
;
sprintf
(
fname
,
"qeq.%d.out"
,
system
->
my_rank
);
fout
=
fopen
(
fname
,
"w"
);
for
(
i
=
0
;
i
<
system
->
n
;
++
i
)
fprintf
(
fout
,
"%6d%10.4f%10.4f%10.4f
\n
"
,
system
->
my_atoms
[
i
].
orig_id
,
x
[
i
],
b_prm
[
i
],
b
[
i
]
);
fclose
(
fout
);
}
void
Print_Charges
(
reax_system
*
system
)
{
int
i
;
char
fname
[
100
];
FILE
*
fout
;
sprintf
(
fname
,
"q.%d.out"
,
system
->
my_rank
);
fout
=
fopen
(
fname
,
"w"
);
for
(
i
=
0
;
i
<
system
->
n
;
++
i
)
fprintf
(
fout
,
"%6d %10.7f %10.7f %10.7f
\n
"
,
system
->
my_atoms
[
i
].
orig_id
,
system
->
my_atoms
[
i
].
s
[
0
],
system
->
my_atoms
[
i
].
t
[
0
],
system
->
my_atoms
[
i
].
q
);
fclose
(
fout
);
}
void
Print_Bonds
(
reax_system
*
system
,
reax_list
*
bonds
,
char
*
fname
)
{
int
i
,
j
,
pj
;
bond_data
*
pbond
;
bond_order_data
*
bo_ij
;
FILE
*
f
=
fopen
(
fname
,
"w"
);
for
(
i
=
0
;
i
<
system
->
N
;
++
i
)
for
(
pj
=
Start_Index
(
i
,
bonds
);
pj
<
End_Index
(
i
,
bonds
);
++
pj
)
{
pbond
=
&
(
bonds
->
select
.
bond_list
[
pj
]);
bo_ij
=
&
(
pbond
->
bo_data
);
j
=
pbond
->
nbr
;
//fprintf( f, "%6d%6d%23.15e%23.15e%23.15e%23.15e%23.15e\n",
// system->my_atoms[i].orig_id, system->my_atoms[j].orig_id,
// pbond->d, bo_ij->BO, bo_ij->BO_s, bo_ij->BO_pi, bo_ij->BO_pi2 );
fprintf
(
f
,
"%8d%8d %24.15f %24.15f
\n
"
,
i
,
j
,
//system->my_atoms[i].orig_id, system->my_atoms[j].orig_id,
pbond
->
d
,
bo_ij
->
BO
);
}
fclose
(
f
);
}
int
fn_qsort_intcmp
(
const
void
*
a
,
const
void
*
b
)
{
return
(
*
(
int
*
)
a
-
*
(
int
*
)
b
);
}
void
Print_Bond_List2
(
reax_system
*
system
,
reax_list
*
bonds
,
char
*
fname
)
{
int
i
,
j
,
nbr
,
pj
;
tagint
id_i
,
id_j
;
FILE
*
f
=
fopen
(
fname
,
"w"
);
int
temp
[
500
];
int
num
=
0
;
for
(
i
=
0
;
i
<
system
->
n
;
++
i
)
{
num
=
0
;
id_i
=
system
->
my_atoms
[
i
].
orig_id
;
fprintf
(
f
,
"%6d:"
,
id_i
);
for
(
pj
=
Start_Index
(
i
,
bonds
);
pj
<
End_Index
(
i
,
bonds
);
++
pj
)
{
nbr
=
bonds
->
select
.
bond_list
[
pj
].
nbr
;
id_j
=
system
->
my_atoms
[
nbr
].
orig_id
;
if
(
id_i
<
id_j
)
temp
[
num
++
]
=
id_j
;
}
qsort
(
&
temp
,
num
,
sizeof
(
int
),
fn_qsort_intcmp
);
for
(
j
=
0
;
j
<
num
;
j
++
)
fprintf
(
f
,
"%6d"
,
temp
[
j
]
);
fprintf
(
f
,
"
\n
"
);
}
}
void
Print_Total_Force
(
reax_system
*
system
,
simulation_data
*
data
,
storage
*
workspace
)
{
int
i
;
fprintf
(
stderr
,
"step: %d
\n
"
,
data
->
step
);
fprintf
(
stderr
,
"%6s
\t
%-38s
\n
"
,
"atom"
,
"atom.f[0,1,2]"
);
for
(
i
=
0
;
i
<
system
->
N
;
++
i
)
fprintf
(
stderr
,
"%6d %f %f %f
\n
"
,
//"%6d%24.15e%24.15e%24.15e\n",
system
->
my_atoms
[
i
].
orig_id
,
workspace
->
f
[
i
][
0
],
workspace
->
f
[
i
][
1
],
workspace
->
f
[
i
][
2
]
);
}
void
Output_Results
(
reax_system
*
system
,
control_params
*
control
,
simulation_data
*
data
,
reax_list
**
lists
,
output_controls
*
out_control
,
mpi_datatypes
*
mpi_data
)
{
#if defined(LOG_PERFORMANCE)
real
t_elapsed
,
denom
;
#endif
if
((
out_control
->
energy_update_freq
>
0
&&
data
->
step
%
out_control
->
energy_update_freq
==
0
)
||
(
out_control
->
write_steps
>
0
&&
data
->
step
%
out_control
->
write_steps
==
0
)){
/* update system-wide energies */
Compute_System_Energy
(
system
,
data
,
mpi_data
->
world
);
/* output energies */
if
(
system
->
my_rank
==
MASTER_NODE
&&
out_control
->
energy_update_freq
>
0
&&
data
->
step
%
out_control
->
energy_update_freq
==
0
)
{
#if !defined(DEBUG) && !defined(DEBUG_FOCUS)
#if defined(PURE_REAX)
fprintf
(
out_control
->
out
,
"%-6d%14.2f%14.2f%14.2f%11.2f%13.2f%13.5f
\n
"
,
data
->
step
,
data
->
sys_en
.
e_tot
,
data
->
sys_en
.
e_pot
,
E_CONV
*
data
->
sys_en
.
e_kin
,
data
->
therm
.
T
,
system
->
big_box
.
V
,
data
->
iso_bar
.
P
);
fflush
(
out_control
->
out
);
#endif
fprintf
(
out_control
->
pot
,
"%-6d%14.2f%14.2f%14.2f%14.2f%14.2f%14.2f%14.2f%14.2f%14.2f%14.2f%14.2f
\n
"
,
data
->
step
,
data
->
sys_en
.
e_bond
,
data
->
sys_en
.
e_ov
+
data
->
sys_en
.
e_un
,
data
->
sys_en
.
e_lp
,
data
->
sys_en
.
e_ang
+
data
->
sys_en
.
e_pen
,
data
->
sys_en
.
e_coa
,
data
->
sys_en
.
e_hb
,
data
->
sys_en
.
e_tor
,
data
->
sys_en
.
e_con
,
data
->
sys_en
.
e_vdW
,
data
->
sys_en
.
e_ele
,
data
->
sys_en
.
e_pol
);
fflush
(
out_control
->
pot
);
#else
#if defined(PURE_REAX)
fprintf
(
out_control
->
out
,
"%-6d%24.15e%24.15e%24.15e%13.5f%16.5f%13.5f
\n
"
,
data
->
step
,
data
->
sys_en
.
e_tot
,
data
->
sys_en
.
e_pot
,
E_CONV
*
data
->
sys_en
.
e_kin
,
data
->
therm
.
T
,
system
->
big_box
.
V
,
data
->
iso_bar
.
P
);
fflush
(
out_control
->
out
);
#endif
fprintf
(
out_control
->
pot
,
"%-6d%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e
\n
"
,
data
->
step
,
data
->
sys_en
.
e_bond
,
data
->
sys_en
.
e_ov
+
data
->
sys_en
.
e_un
,
data
->
sys_en
.
e_lp
,
data
->
sys_en
.
e_ang
+
data
->
sys_en
.
e_pen
,
data
->
sys_en
.
e_coa
,
data
->
sys_en
.
e_hb
,
data
->
sys_en
.
e_tor
,
data
->
sys_en
.
e_con
,
data
->
sys_en
.
e_vdW
,
data
->
sys_en
.
e_ele
,
data
->
sys_en
.
e_pol
);
fflush
(
out_control
->
pot
);
#endif
//DEBUG
#if defined(LOG_PERFORMANCE)
t_elapsed
=
Get_Timing_Info
(
data
->
timing
.
total
);
if
(
data
->
step
-
data
->
prev_steps
>
0
)
denom
=
1.0
/
out_control
->
energy_update_freq
;
else
denom
=
1
;
fprintf
(
out_control
->
log
,
"%6d%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%6d
\n
"
,
data
->
step
,
t_elapsed
*
denom
,
data
->
timing
.
comm
*
denom
,
data
->
timing
.
nbrs
*
denom
,
data
->
timing
.
init_forces
*
denom
,
data
->
timing
.
bonded
*
denom
,
data
->
timing
.
nonb
*
denom
,
data
->
timing
.
qEq
*
denom
,
(
int
)((
data
->
timing
.
s_matvecs
+
data
->
timing
.
t_matvecs
)
*
denom
)
);
Reset_Timing
(
&
(
data
->
timing
)
);
fflush
(
out_control
->
log
);
#endif
//LOG_PERFORMANCE
if
(
control
->
virial
){
fprintf
(
out_control
->
prs
,
"%8d%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f
\n
"
,
data
->
step
,
data
->
int_press
[
0
],
data
->
int_press
[
1
],
data
->
int_press
[
2
],
data
->
ext_press
[
0
],
data
->
ext_press
[
1
],
data
->
ext_press
[
2
],
data
->
kin_press
);
fprintf
(
out_control
->
prs
,
"%8s%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f
\n
"
,
""
,
system
->
big_box
.
box_norms
[
0
],
system
->
big_box
.
box_norms
[
1
],
system
->
big_box
.
box_norms
[
2
],
data
->
tot_press
[
0
],
data
->
tot_press
[
1
],
data
->
tot_press
[
2
],
system
->
big_box
.
V
);
fflush
(
out_control
->
prs
);
}
}
/* write current frame */
if
(
out_control
->
write_steps
>
0
&&
(
data
->
step
-
data
->
prev_steps
)
%
out_control
->
write_steps
==
0
)
{
Append_Frame
(
system
,
control
,
data
,
lists
,
out_control
,
mpi_data
);
}
}
#if defined(DEBUG)
fprintf
(
stderr
,
"output_results... done
\n
"
);
#endif
}
#ifdef TEST_ENERGY
void
Debug_Marker_Bonded
(
output_controls
*
out_control
,
int
step
)
{
fprintf
(
out_control
->
ebond
,
"step: %d
\n
%6s%6s%12s%12s%12s
\n
"
,
step
,
"atom1"
,
"atom2"
,
"bo"
,
"ebond"
,
"total"
);
fprintf
(
out_control
->
elp
,
"step: %d
\n
%6s%12s%12s%12s
\n
"
,
step
,
"atom"
,
"nlp"
,
"elp"
,
"total"
);
fprintf
(
out_control
->
eov
,
"step: %d
\n
%6s%12s%12s
\n
"
,
step
,
"atom"
,
"eov"
,
"total"
);
fprintf
(
out_control
->
eun
,
"step: %d
\n
%6s%12s%12s
\n
"
,
step
,
"atom"
,
"eun"
,
"total"
);
fprintf
(
out_control
->
eval
,
"step: %d
\n
%6s%6s%6s%12s%12s%12s%12s%12s%12s
\n
"
,
step
,
"atom1"
,
"atom2"
,
"atom3"
,
"angle"
,
"theta0"
,
"bo(12)"
,
"bo(23)"
,
"eval"
,
"total"
);
fprintf
(
out_control
->
epen
,
"step: %d
\n
%6s%6s%6s%12s%12s%12s%12s%12s
\n
"
,
step
,
"atom1"
,
"atom2"
,
"atom3"
,
"angle"
,
"bo(12)"
,
"bo(23)"
,
"epen"
,
"total"
);
fprintf
(
out_control
->
ecoa
,
"step: %d
\n
%6s%6s%6s%12s%12s%12s%12s%12s
\n
"
,
step
,
"atom1"
,
"atom2"
,
"atom3"
,
"angle"
,
"bo(12)"
,
"bo(23)"
,
"ecoa"
,
"total"
);
fprintf
(
out_control
->
ehb
,
"step: %d
\n
%6s%6s%6s%12s%12s%12s%12s%12s
\n
"
,
step
,
"atom1"
,
"atom2"
,
"atom3"
,
"r(23)"
,
"angle"
,
"bo(12)"
,
"ehb"
,
"total"
);
fprintf
(
out_control
->
etor
,
"step: %d
\n
%6s%6s%6s%6s%12s%12s%12s%12s
\n
"
,
step
,
"atom1"
,
"atom2"
,
"atom3"
,
"atom4"
,
"phi"
,
"bo(23)"
,
"etor"
,
"total"
);
fprintf
(
out_control
->
econ
,
"step:%d
\n
%6s%6s%6s%6s%12s%12s%12s%12s%12s%12s
\n
"
,
step
,
"atom1"
,
"atom2"
,
"atom3"
,
"atom4"
,
"phi"
,
"bo(12)"
,
"bo(23)"
,
"bo(34)"
,
"econ"
,
"total"
);
}
void
Debug_Marker_Nonbonded
(
output_controls
*
out_control
,
int
step
)
{
fprintf
(
out_control
->
evdw
,
"step: %d
\n
%6s%6s%12s%12s%12s
\n
"
,
step
,
"atom1"
,
"atom2"
,
"r12"
,
"evdw"
,
"total"
);
fprintf
(
out_control
->
ecou
,
"step: %d
\n
%6s%6s%12s%12s%12s%12s%12s
\n
"
,
step
,
"atom1"
,
"atom2"
,
"r12"
,
"q1"
,
"q2"
,
"ecou"
,
"total"
);
}
#endif
#ifdef TEST_FORCES
void
Dummy_Printer
(
reax_system
*
system
,
control_params
*
control
,
simulation_data
*
data
,
storage
*
workspace
,
reax_list
**
lists
,
output_controls
*
out_control
)
{
}
void
Print_Bond_Orders
(
reax_system
*
system
,
control_params
*
control
,
simulation_data
*
data
,
storage
*
workspace
,
reax_list
**
lists
,
output_controls
*
out_control
)
{
int
i
,
pj
,
pk
;
bond_order_data
*
bo_ij
;
dbond_data
*
dbo_k
;
reax_list
*
bonds
=
(
*
lists
)
+
BONDS
;
reax_list
*
dBOs
=
(
*
lists
)
+
DBOS
;
/* bond orders */
fprintf
(
out_control
->
fbo
,
"step: %d
\n
"
,
data
->
step
);
fprintf
(
out_control
->
fbo
,
"%6s%6s%12s%12s%12s%12s%12s
\n
"
,
"atom1"
,
"atom2"
,
"r_ij"
,
"total_bo"
,
"bo_s"
,
"bo_p"
,
"bo_pp"
);
for
(
i
=
0
;
i
<
system
->
N
;
++
i
)
for
(
pj
=
Start_Index
(
i
,
bonds
);
pj
<
End_Index
(
i
,
bonds
);
++
pj
)
{
bo_ij
=
&
(
bonds
->
select
.
bond_list
[
pj
].
bo_data
);
fprintf
(
out_control
->
fbo
,
"%6d%6d%24.15e%24.15e%24.15e%24.15e%24.15e
\n
"
,
system
->
my_atoms
[
i
].
orig_id
,
system
->
my_atoms
[
bonds
->
select
.
bond_list
[
pj
].
nbr
].
orig_id
,
bonds
->
select
.
bond_list
[
pj
].
d
,
bo_ij
->
BO
,
bo_ij
->
BO_s
,
bo_ij
->
BO_pi
,
bo_ij
->
BO_pi2
);
}
/* derivatives of bond orders */
fprintf
(
out_control
->
fdbo
,
"step: %d
\n
"
,
data
->
step
);
fprintf
(
out_control
->
fdbo
,
"%6s%6s%6s%24s%24s%24s
\n
"
,
"atom1"
,
"atom2"
,
"atom2"
,
"dBO"
,
"dBOpi"
,
"dBOpi2"
);
for
(
i
=
0
;
i
<
system
->
N
;
++
i
)
for
(
pj
=
Start_Index
(
i
,
bonds
);
pj
<
End_Index
(
i
,
bonds
);
++
pj
)
{
/* fprintf( out_control->fdbo, "%6d %6d\tstart: %6d\tend: %6d\n",
system->my_atoms[i].orig_id,
system->my_atoms[bonds->select.bond_list[pj].nbr].orig_id,
Start_Index( pj, dBOs ), End_Index( pj, dBOs ) ); */
for
(
pk
=
Start_Index
(
pj
,
dBOs
);
pk
<
End_Index
(
pj
,
dBOs
);
++
pk
)
{
dbo_k
=
&
(
dBOs
->
select
.
dbo_list
[
pk
]);
fprintf
(
out_control
->
fdbo
,
"%6d%6d%6d%24.15e%24.15e%24.15e
\n
"
,
system
->
my_atoms
[
i
].
orig_id
,
system
->
my_atoms
[
bonds
->
select
.
bond_list
[
pj
].
nbr
].
orig_id
,
system
->
my_atoms
[
dbo_k
->
wrt
].
orig_id
,
dbo_k
->
dBO
[
0
],
dbo_k
->
dBO
[
1
],
dbo_k
->
dBO
[
2
]
);
fprintf
(
out_control
->
fdbo
,
"%6d%6d%6d%24.15e%24.15e%24.15e
\n
"
,
system
->
my_atoms
[
i
].
orig_id
,
system
->
my_atoms
[
bonds
->
select
.
bond_list
[
pj
].
nbr
].
orig_id
,
system
->
my_atoms
[
dbo_k
->
wrt
].
orig_id
,
dbo_k
->
dBOpi
[
0
],
dbo_k
->
dBOpi
[
1
],
dbo_k
->
dBOpi
[
2
]
);
fprintf
(
out_control
->
fdbo
,
"%6d%6d%6d%24.15e%24.15e%24.15e
\n
"
,
system
->
my_atoms
[
i
].
orig_id
,
system
->
my_atoms
[
bonds
->
select
.
bond_list
[
pj
].
nbr
].
orig_id
,
system
->
my_atoms
[
dbo_k
->
wrt
].
orig_id
,
dbo_k
->
dBOpi2
[
0
],
dbo_k
->
dBOpi2
[
1
],
dbo_k
->
dBOpi2
[
2
]
);
}
}
}
void
Print_Forces
(
FILE
*
f
,
storage
*
workspace
,
int
N
,
int
step
)
{
int
i
;
fprintf
(
f
,
"step: %d
\n
"
,
step
);
for
(
i
=
0
;
i
<
N
;
++
i
)
//fprintf( f, "%6d %23.15e %23.15e %23.15e\n",
//fprintf( f, "%6d%12.6f%12.6f%12.6f\n",
fprintf
(
f
,
"%6d %19.9e %19.9e %19.9e
\n
"
,
workspace
->
id_all
[
i
],
workspace
->
f_all
[
i
][
0
],
workspace
->
f_all
[
i
][
1
],
workspace
->
f_all
[
i
][
2
]
);
}
void
Print_Force_Files
(
reax_system
*
system
,
control_params
*
control
,
simulation_data
*
data
,
storage
*
workspace
,
reax_list
**
lists
,
output_controls
*
out_control
,
mpi_datatypes
*
mpi_data
)
{
int
i
,
d
;
Coll_ids_at_Master
(
system
,
workspace
,
mpi_data
);
Print_Bond_Orders
(
system
,
control
,
data
,
workspace
,
lists
,
out_control
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_be
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fbond
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_lp
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
flp
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_ov
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fov
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_un
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fun
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_ang
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fang
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_coa
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fcoa
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_pen
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fpen
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_tor
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
ftor
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_con
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fcon
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_hb
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fhb
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_vdw
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fvdw
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_ele
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fele
,
workspace
,
system
->
bigN
,
data
->
step
);
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
ftot
,
workspace
,
system
->
bigN
,
data
->
step
);
for
(
i
=
0
;
i
<
system
->
n
;
++
i
)
{
for
(
d
=
0
;
d
<
3
;
++
d
)
workspace
->
f_tot
[
i
][
d
]
=
workspace
->
f_be
[
i
][
d
]
+
workspace
->
f_lp
[
i
][
d
]
+
workspace
->
f_ov
[
i
][
d
]
+
workspace
->
f_un
[
i
][
d
]
+
workspace
->
f_ang
[
i
][
d
]
+
workspace
->
f_pen
[
i
][
d
]
+
workspace
->
f_coa
[
i
][
d
]
+
workspace
->
f_tor
[
i
][
d
]
+
workspace
->
f_con
[
i
][
d
]
+
workspace
->
f_vdw
[
i
][
d
]
+
workspace
->
f_ele
[
i
][
d
]
+
workspace
->
f_hb
[
i
][
d
];
}
Coll_rvecs_at_Master
(
system
,
workspace
,
mpi_data
,
workspace
->
f_tot
);
if
(
system
->
my_rank
==
MASTER_NODE
)
Print_Forces
(
out_control
->
fcomp
,
workspace
,
system
->
bigN
,
data
->
step
);
}
#endif
#if defined(TEST_FORCES) || defined(TEST_ENERGY)
void
Print_Far_Neighbors_List
(
reax_system
*
system
,
reax_list
**
lists
,
control_params
*
control
,
simulation_data
*
data
,
output_controls
*
out_control
)
{
int
i
,
j
,
nbr
,
natoms
;
tagint
id_i
,
id_j
;
int
num
=
0
;
int
temp
[
500
];
reax_list
*
far_nbrs
;
far_nbrs
=
(
*
lists
)
+
FAR_NBRS
;
fprintf
(
out_control
->
flist
,
"step: %d
\n
"
,
data
->
step
);
fprintf
(
out_control
->
flist
,
"%6s
\t
%-38s
\n
"
,
"atom"
,
"Far_nbrs_list"
);
natoms
=
system
->
n
;
for
(
i
=
0
;
i
<
natoms
;
++
i
)
{
id_i
=
system
->
my_atoms
[
i
].
orig_id
;
fprintf
(
out_control
->
flist
,
"%6d:"
,
id_i
);
num
=
0
;
for
(
j
=
Start_Index
(
i
,
far_nbrs
);
j
<
End_Index
(
i
,
far_nbrs
);
++
j
)
{
nbr
=
far_nbrs
->
select
.
far_nbr_list
[
j
].
nbr
;
id_j
=
system
->
my_atoms
[
nbr
].
orig_id
;
temp
[
num
++
]
=
id_j
;
}
qsort
(
&
temp
,
num
,
sizeof
(
int
),
fn_qsort_intcmp
);
for
(
j
=
0
;
j
<
num
;
j
++
)
fprintf
(
out_control
->
flist
,
"%6d"
,
temp
[
j
]);
fprintf
(
out_control
->
flist
,
"
\n
"
);
}
}
void
Print_Bond_List
(
reax_system
*
system
,
control_params
*
control
,
simulation_data
*
data
,
reax_list
**
lists
,
output_controls
*
out_control
)
{
int
i
,
j
,
nbr
,
pj
;
tagint
id_i
,
id_j
;
reax_list
*
bonds
=
(
*
lists
)
+
BONDS
;
int
temp
[
500
];
int
num
=
0
;
fprintf
(
out_control
->
blist
,
"step: %d
\n
"
,
data
->
step
);
fprintf
(
out_control
->
blist
,
"%6s
\t
%-38s
\n
"
,
"atom"
,
"Bond_list"
);
/* bond list */
for
(
i
=
0
;
i
<
system
->
n
;
++
i
)
{
num
=
0
;
id_i
=
system
->
my_atoms
[
i
].
orig_id
;
fprintf
(
out_control
->
blist
,
"%6d:"
,
id_i
);
for
(
pj
=
Start_Index
(
i
,
bonds
);
pj
<
End_Index
(
i
,
bonds
);
++
pj
)
{
nbr
=
bonds
->
select
.
bond_list
[
pj
].
nbr
;
id_j
=
system
->
my_atoms
[
nbr
].
orig_id
;
if
(
id_i
<
id_j
)
temp
[
num
++
]
=
id_j
;
}
qsort
(
&
temp
,
num
,
sizeof
(
int
),
fn_qsort_intcmp
);
for
(
j
=
0
;
j
<
num
;
j
++
)
fprintf
(
out_control
->
blist
,
"%6d"
,
temp
[
j
]);
fprintf
(
out_control
->
blist
,
"
\n
"
);
}
}
#endif
#ifdef OLD_VERSION
void
Print_Init_Atoms
(
reax_system
*
system
,
storage
*
workspace
)
{
int
i
;
fprintf
(
stderr
,
"p%d had %d atoms
\n
"
,
system
->
my_rank
,
workspace
->
init_cnt
);
for
(
i
=
0
;
i
<
workspace
->
init_cnt
;
++
i
)
fprintf
(
stderr
,
"p%d, atom%d: %d %s %8.3f %8.3f %8.3f
\n
"
,
system
->
my_rank
,
i
,
workspace
->
init_atoms
[
i
].
type
,
workspace
->
init_atoms
[
i
].
name
,
workspace
->
init_atoms
[
i
].
x
[
0
],
workspace
->
init_atoms
[
i
].
x
[
1
],
workspace
->
init_atoms
[
i
].
x
[
2
]
);
}
#endif
//OLD_VERSION
/*void Print_Bond_Forces( reax_system *system, control_params *control,
simulation_data *data, storage *workspace,
reax_list **lists, output_controls *out_control )
{
int i;
fprintf( out_control->fbond, "step: %d\n", data->step );
fprintf( out_control->fbond, "%6s%24s%24s%24s\n",
"atom", "f_be[0]", "f_be[1]", "f_be[2]" );
for( i = 0; i < system->bigN; ++i )
fprintf(out_control->fbond, "%6d%24.15e%24.15e%24.15e\n",
system->my_atoms[i].orig_id,
workspace->f_all[i][0], workspace->f_all[i][1],
workspace->f_all[i][2]);
}
void Print_LonePair_Forces( reax_system *system, control_params *control,
simulation_data *data, storage *workspace,
reax_list **lists, output_controls *out_control )
{
int i;
fprintf( out_control->flp, "step: %d\n", data->step );
fprintf( out_control->flp, "%6s%24s\n", "atom", "f_lonepair" );
for( i = 0; i < system->bigN; ++i )
fprintf(out_control->flp, "%6d%24.15e%24.15e%24.15e\n",
system->my_atoms[i].orig_id,
workspace->f_all[i][0], workspace->f_all[i][1],
workspace->f_all[i][2]);
}
void Print_OverCoor_Forces( reax_system *system, control_params *control,
simulation_data *data, storage *workspace,
reax_list **lists, output_controls *out_control )
{
int i;
fprintf( out_control->fov, "step: %d\n", data->step );
fprintf( out_control->fov, "%6s%-38s%-38s%-38s\n",
"atom","f_over[0]", "f_over[1]", "f_over[2]" );
for( i = 0; i < system->bigN; ++i )
fprintf( out_control->fov,
"%6d %24.15e%24.15e%24.15e 0 0 0\n",
system->my_atoms[i].orig_id,
workspace->f_all[i][0], workspace->f_all[i][1],
workspace->f_all[i][2] );
}
void Print_UnderCoor_Forces( reax_system *system, control_params *control,
simulation_data *data, storage *workspace,
reax_list **lists, output_controls *out_control )
{
int i;
fprintf( out_control->fun, "step: %d\n", data->step );
fprintf( out_control->fun, "%6s%-38s%-38s%-38s\n",
"atom","f_under[0]", "f_under[1]", "f_under[2]" );
for( i = 0; i < system->bigN; ++i )
fprintf( out_control->fun,
"%6d %24.15e%24.15e%24.15e 0 0 0\n",
system->my_atoms[i].orig_id,
workspace->f_all[i][0], workspace->f_all[i][1],
workspace->f_all[i][2] );
}
void Print_ValAngle_Forces( reax_system *system, control_params *control,
simulation_data *data, storage *workspace,
reax_list **lists, output_controls *out_control )
{
int j;
fprintf( out_control->f3body, "step: %d\n", data->step );
fprintf( out_control->f3body, "%6s%-37s%-37s%-37s%-38s\n",
"atom", "3-body total", "f_ang", "f_pen", "f_coa" );
for( j = 0; j < system->N; ++j ){
if( rvec_isZero(workspace->f_pen[j]) && rvec_isZero(workspace->f_coa[j]) )
fprintf( out_control->f3body,
"%6d %24.15e%24.15e%24.15e 0 0 0 0 0 0\n",
system->my_atoms[j].orig_id,
workspace->f_ang[j][0], workspace->f_ang[j][1],
workspace->f_ang[j][2] );
else if( rvec_isZero(workspace->f_coa[j]) )
fprintf( out_control->f3body,
"%6d %24.15e%24.15e%24.15e %24.15e%24.15e%24.15e " \
"%24.15e%24.15e%24.15e\n",
system->my_atoms[j].orig_id,
workspace->f_ang[j][0] + workspace->f_pen[j][0],
workspace->f_ang[j][1] + workspace->f_pen[j][1],
workspace->f_ang[j][2] + workspace->f_pen[j][2],
workspace->f_ang[j][0], workspace->f_ang[j][1],
workspace->f_ang[j][2],
workspace->f_pen[j][0], workspace->f_pen[j][1],
workspace->f_pen[j][2] );
else{
fprintf( out_control->f3body, "%6d %24.15e%24.15e%24.15e ",
system->my_atoms[j].orig_id,
workspace->f_ang[j][0] + workspace->f_pen[j][0] +
workspace->f_coa[j][0],
workspace->f_ang[j][1] + workspace->f_pen[j][1] +
workspace->f_coa[j][1],
workspace->f_ang[j][2] + workspace->f_pen[j][2] +
workspace->f_coa[j][2] );
fprintf( out_control->f3body,
"%24.15e%24.15e%24.15e %24.15e%24.15e%24.15e "\
"%24.15e%24.15e%24.15e\n",
workspace->f_ang[j][0], workspace->f_ang[j][1],
workspace->f_ang[j][2],
workspace->f_pen[j][0], workspace->f_pen[j][1],
workspace->f_pen[j][2],
workspace->f_coa[j][0], workspace->f_coa[j][1],
workspace->f_coa[j][2] );
}
}
}
void Print_Hydrogen_Bond_Forces( reax_system *system, control_params *control,
simulation_data *data, storage *workspace,
reax_list **lists, output_controls *out_control)
{
int j;
fprintf( out_control->fhb, "step: %d\n", data->step );
fprintf( out_control->fhb, "%6s\t%-38s\n", "atom", "f_hb[0,1,2]" );
for( j = 0; j < system->N; ++j )
fprintf(out_control->fhb, "%6d%24.15e%24.15e%24.15e\n",
system->my_atoms[j].orig_id,
workspace->f_hb[j][0],
workspace->f_hb[j][1],
workspace->f_hb[j][2] );
}
void Print_Four_Body_Forces( reax_system *system, control_params *control,
simulation_data *data, storage *workspace,
reax_list **lists, output_controls *out_control )
{
int j;
fprintf( out_control->f4body, "step: %d\n", data->step );
fprintf( out_control->f4body, "%6s\t%-38s%-38s%-38s\n",
"atom", "4-body total", "f_tor", "f_con" );
for( j = 0; j < system->N; ++j ){
if( !rvec_isZero( workspace->f_con[j] ) )
fprintf( out_control->f4body,
"%6d %24.15e%24.15e%24.15e %24.15e%24.15e%24.15e "\
"%24.15e%24.15e%24.15e\n",
system->my_atoms[j].orig_id,
workspace->f_tor[j][0] + workspace->f_con[j][0],
workspace->f_tor[j][1] + workspace->f_con[j][1],
workspace->f_tor[j][2] + workspace->f_con[j][2],
workspace->f_tor[j][0], workspace->f_tor[j][1],
workspace->f_tor[j][2],
workspace->f_con[j][0], workspace->f_con[j][1],
workspace->f_con[j][2] );
else
fprintf( out_control->f4body,
"%6d %24.15e%24.15e%24.15e 0 0 0\n",
system->my_atoms[j].orig_id, workspace->f_tor[j][0],
workspace->f_tor[j][1], workspace->f_tor[j][2] );
}
}
void Print_vdW_Coulomb_Forces( reax_system *system, control_params *control,
simulation_data *data, storage *workspace,
reax_list **lists, output_controls *out_control )
{
int i;
return;
fprintf( out_control->fnonb, "step: %d\n", data->step );
fprintf( out_control->fnonb, "%6s\t%-38s%-38s%-38s\n",
"atom", "nonbonded_total[0,1,2]", "f_vdw[0,1,2]", "f_ele[0,1,2]" );
for( i = 0; i < system->N; ++i )
fprintf( out_control->fnonb,
"%6d%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e\n",
system->my_atoms[i].orig_id,
workspace->f_vdw[i][0] + workspace->f_ele[i][0],
workspace->f_vdw[i][1] + workspace->f_ele[i][1],
workspace->f_vdw[i][2] + workspace->f_ele[i][2],
workspace->f_vdw[i][0],
workspace->f_vdw[i][1],
workspace->f_vdw[i][2],
workspace->f_ele[i][0],
workspace->f_ele[i][1],
workspace->f_ele[i][2] );
}
void Print_Total_Force( reax_system *system, control_params *control,
simulation_data *data, storage *workspace,
reax_list **lists, output_controls *out_control )
{
int i;
return;
fprintf( out_control->ftot, "step: %d\n", data->step );
fprintf( out_control->ftot, "%6s\t%-38s\n", "atom", "atom.f[0,1,2]");
for( i = 0; i < system->n; ++i )
fprintf( out_control->ftot, "%6d%24.15e%24.15e%24.15e\n",
system->my_atoms[i].orig_id,
system->my_atoms[i].f[0],
system->my_atoms[i].f[1],
system->my_atoms[i].f[2] );
}
void Compare_Total_Forces( reax_system *system, control_params *control,
simulation_data *data, storage *workspace,
reax_list **lists, output_controls *out_control )
{
int i;
return;
fprintf( out_control->ftot2, "step: %d\n", data->step );
fprintf( out_control->ftot2, "%6s\t%-38s%-38s\n",
"atom", "f_total[0,1,2]", "test_force_total[0,1,2]" );
for( i = 0; i < system->N; ++i )
fprintf( out_control->ftot2, "%6d%24.15e%24.15e%24.15e%24.15e%24.15e%24.15e\n",
system->my_atoms[i].orig_id,
system->my_atoms[i].f[0],
system->my_atoms[i].f[1],
system->my_atoms[i].f[2],
workspace->f_be[i][0] + workspace->f_lp[i][0] +
workspace->f_ov[i][0] + workspace->f_un[i][0] +
workspace->f_ang[i][0]+ workspace->f_pen[i][0]+
workspace->f_coa[i][0]+ + workspace->f_hb[i][0] +
workspace->f_tor[i][0] + workspace->f_con[i][0] +
workspace->f_vdw[i][0] + workspace->f_ele[i][0],
workspace->f_be[i][1] + workspace->f_lp[i][1] +
workspace->f_ov[i][1] + workspace->f_un[i][1] +
workspace->f_ang[i][1]+ workspace->f_pen[i][1]+
workspace->f_coa[i][1]+ + workspace->f_hb[i][1] +
workspace->f_tor[i][1] + workspace->f_con[i][1] +
workspace->f_vdw[i][1] + workspace->f_ele[i][1],
workspace->f_be[i][2] + workspace->f_lp[i][2] +
workspace->f_ov[i][2] + workspace->f_un[i][2] +
workspace->f_ang[i][2]+ workspace->f_pen[i][2] +
workspace->f_coa[i][2]+ + workspace->f_hb[i][2] +
workspace->f_tor[i][2] + workspace->f_con[i][2] +
workspace->f_vdw[i][2] + workspace->f_ele[i][2] );
}*/
/*void Init_Force_Test_Functions( )
{
Print_Interactions[0] = Print_Bond_Orders;
Print_Interactions[1] = Print_Bond_Forces;
Print_Interactions[2] = Print_LonePair_Forces;
Print_Interactions[3] = Print_OverUnderCoor_Forces;
Print_Interactions[4] = Print_Three_Body_Forces;
Print_Interactions[5] = Print_Four_Body_Forces;
Print_Interactions[6] = Print_Hydrogen_Bond_Forces;
Print_Interactions[7] = Print_vdW_Coulomb_Forces;
Print_Interactions[8] = Print_Total_Force;
Print_Interactions[9] = Compare_Total_Forces;
}*/
Event Timeline
Log In to Comment