Hi,
I am confused why the handle of Reaxff ffield file ffield.reax still exists after then command “pair_coeff * * ffield.reax C H” have been carried out.
I write a call_lammps.cpp:
#define LAMMPS_LIB_MPI
#include
#include
#include
#include
#include
#include
#include
#include “mpi.h”
#include “lammps.h”
#include “input.h”
#include “atom.h”
#include “output.h”
#include “thermo.h”
using namespace std;
using namespace LAMMPS_NS;
int main(int argc, char *argv[])
{
int comm_size,rank;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&comm_size);
string cmd="";
const char *lmpargv[] = { "liblammps","-screen", "none"};
int lmpargc = sizeof(lmpargv)/sizeof(const char *);
LAMMPS *lmp = new LAMMPS(lmpargc, (char **)lmpargv, MPI_COMM_WORLD);
lmp->input->one("units real");
lmp->input->one("atom_style charge");
lmp->input->one("box tilt large");
lmp->input->one("read_data data.input");
lmp->input->one("pair_style reaxff NULL safezone 10 mincap 100 minhbonds 100");
cmd="pair_coeff * * ffield.reax C H";
cout<<"a0 "<<endl;
lmp->input->one(cmd);
cout<<"a1 "<<endl;
lmp->input->one("neighbor 2 bin");
lmp->input->one("neigh_modify every 10 delay 0 check no");
lmp->input->one("timestep 0.25");
lmp->input->one("fix 1 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff");
lmp->input->one("thermo_style custom step elapsed elaplong dt time temp epair ke pe etotal press");
lmp->input->one("thermo 1");
lmp->input->one("fix 2 all nvt temp 300.0 300.0 100.0");
lmp->input->one("run 1000000");
cout<<"a2 "<<endl;
delete lmp;
cout<<"a3 "<<endl;
MPI_Finalize();
return 0;
}
and revise the text_file_reader.cpp:
TextFileReader::~TextFileReader()
{
std::cout<<textfilename<<" file1 “<<std::endl; // I have added “textfilename” in text_file_reader.h file
if (closefp)
{
std::cout<<textfilename<<” file2 “<<std::endl;
fclose(fp);
std::cout<<textfilename<<” file3 “<<std::endl;
}
std::cout<<textfilename<<” file4 "<<std::endl;
}
after I run ./a.out , it immediately print:
ffield.reax file1
ffield.reax file2
ffield.reax file3
ffield.reax file4
ffield.reax file1
ffield.reax file2
ffield.reax file3
ffield.reax file4
file1
file4
a1
This indicates that ffield.reax file has been closed. But I use lsof -p 143846 and found:
a.out 143846 hongchang 0u CHR 136,6 0t0 9 /dev/pts/6
a.out 143846 hongchang 1u CHR 136,6 0t0 9 /dev/pts/6
a.out 143846 hongchang 2u CHR 136,6 0t0 9 /dev/pts/6
a.out 143846 hongchang 3w REG 8,32 28270592 127143174 /home/hongchang/wangjie/ffopt/ts-search/lammps-29Sep2021-3/src/test/CH/log.lammps
a.out 143846 hongchang 4r REG 8,32 9057 127143177 /home/hongchang/wangjie/ffopt/ts-search/lammps-29Sep2021-3/src/test/CH/ffield.reax
The handle of ffield.reax file still exists!
So if I produce ffield.reax files many times according to different parameters and use these files in the cpp , the handles will exceed max number of files that can be opened (such as 65535) and then errors
like “ERROR: Cannot open file data.Rh_dc_bulk: Too many open files” occur.
How can I close the handle of ffield.reax indeed?