Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F77551735
c++_driver.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
Thu, Aug 15, 03:29
Size
3 KB
Mime Type
text/x-c
Expires
Sat, Aug 17, 03:29 (2 d)
Engine
blob
Format
Raw Data
Handle
19746397
Attached To
rLAMMPS lammps
c++_driver.cpp
View Options
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
www.cs.sandia.gov/~sjplimp/lammps.html
Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
// c++_driver = simple example of how an umbrella program
// can invoke LAMMPS as a library on some subset of procs
// Syntax: c++_driver P in.lammps
// P = # of procs to run LAMMPS on
// must be <= # of procs the driver code itself runs on
// in.lammps = LAMMPS input script
// See README for compilation instructions
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "mpi.h"
#include "lammps.h"
// these are LAMMPS include files
#include "input.h"
#include "atom.h"
#include "library.h"
using
namespace
LAMMPS_NS
;
int
main
(
int
narg
,
char
**
arg
)
{
// setup MPI and various communicators
// driver runs on all procs in MPI_COMM_WORLD
// comm_lammps only has 1st P procs (could be all or any subset)
MPI_Init
(
&
narg
,
&
arg
);
if
(
narg
!=
3
)
{
printf
(
"Syntax: c++_driver P in.lammps
\n
"
);
exit
(
1
);
}
int
me
,
nprocs
;
MPI_Comm_rank
(
MPI_COMM_WORLD
,
&
me
);
MPI_Comm_size
(
MPI_COMM_WORLD
,
&
nprocs
);
int
nprocs_lammps
=
atoi
(
arg
[
1
]);
if
(
nprocs_lammps
>
nprocs
)
{
if
(
me
==
0
)
printf
(
"ERROR: LAMMPS cannot use more procs than available
\n
"
);
MPI_Abort
(
MPI_COMM_WORLD
,
1
);
}
int
lammps
;
if
(
me
<
nprocs_lammps
)
lammps
=
1
;
else
lammps
=
MPI_UNDEFINED
;
MPI_Comm
comm_lammps
;
MPI_Comm_split
(
MPI_COMM_WORLD
,
lammps
,
0
,
&
comm_lammps
);
// open LAMMPS input script
FILE
*
fp
;
if
(
me
==
0
)
{
fp
=
fopen
(
arg
[
2
],
"r"
);
if
(
fp
==
NULL
)
{
printf
(
"ERROR: Could not open LAMMPS input script
\n
"
);
MPI_Abort
(
MPI_COMM_WORLD
,
1
);
}
}
// run the input script thru LAMMPS one line at a time until end-of-file
// driver proc 0 reads a line, Bcasts it to all procs
// (could just send it to proc 0 of comm_lammps and let it Bcast)
// all LAMMPS procs call input->one() on the line
LAMMPS
*
lmp
;
if
(
lammps
==
1
)
lmp
=
new
LAMMPS
(
0
,
NULL
,
comm_lammps
);
int
n
;
char
line
[
1024
];
while
(
1
)
{
if
(
me
==
0
)
{
if
(
fgets
(
line
,
1024
,
fp
)
==
NULL
)
n
=
0
;
else
n
=
strlen
(
line
)
+
1
;
if
(
n
==
0
)
fclose
(
fp
);
}
MPI_Bcast
(
&
n
,
1
,
MPI_INT
,
0
,
MPI_COMM_WORLD
);
if
(
n
==
0
)
break
;
MPI_Bcast
(
line
,
n
,
MPI_CHAR
,
0
,
MPI_COMM_WORLD
);
if
(
lammps
==
1
)
lmp
->
input
->
one
(
line
);
}
// run 10 more steps
// get coords from LAMMPS
// change coords of 1st atom
// put coords back into LAMMPS
// run a single step with changed coords
if
(
lammps
==
1
)
{
lmp
->
input
->
one
(
"run 10"
);
int
natoms
=
static_cast
<
int
>
(
lmp
->
atom
->
natoms
);
double
*
x
=
new
double
[
3
*
natoms
];
lammps_get_coords
(
lmp
,
x
);
// no LAMMPS class function for this
double
epsilon
=
0.1
;
x
[
0
]
+=
epsilon
;
lammps_put_coords
(
lmp
,
x
);
// no LAMMPS class function for this
delete
[]
x
;
lmp
->
input
->
one
(
"run 1"
);
}
if
(
lammps
==
1
)
delete
lmp
;
// close down MPI
MPI_Finalize
();
}
Event Timeline
Log In to Comment