Merge branch 'master' into collected-small-changes

This commit is contained in:
Axel Kohlmeyer
2020-07-31 21:51:10 -04:00
17 changed files with 804 additions and 212 deletions

3
.gitattributes vendored Normal file
View File

@ -0,0 +1,3 @@
.gitattributes export-ignore
.gitignore export-ignore
.github export-ignore

View File

@ -747,6 +747,12 @@ if (${_index} GREATER -1)
endif() endif()
message(STATUS "<<< Linker flags: >>>") message(STATUS "<<< Linker flags: >>>")
message(STATUS "Executable name: ${LAMMPS_BINARY}") message(STATUS "Executable name: ${LAMMPS_BINARY}")
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
get_target_property(OPTIONS lammps LINK_OPTIONS)
if(OPTIONS)
message(STATUS "Linker options: ${OPTIONS}")
endif()
endif()
if(CMAKE_EXE_LINKER_FLAGS) if(CMAKE_EXE_LINKER_FLAGS)
message(STATUS "Executable linker flags: ${CMAKE_EXE_LINKER_FLAGS}") message(STATUS "Executable linker flags: ${CMAKE_EXE_LINKER_FLAGS}")
endif() endif()

View File

@ -16,6 +16,33 @@ if(ENABLE_TESTING)
set(MEMORYCHECK_COMMAND "${VALGRIND_BINARY}" CACHE FILEPATH "Memory Check Command") set(MEMORYCHECK_COMMAND "${VALGRIND_BINARY}" CACHE FILEPATH "Memory Check Command")
set(MEMORYCHECK_COMMAND_OPTIONS "${VALGRIND_DEFAULT_OPTIONS}" CACHE STRING "Memory Check Command Options") set(MEMORYCHECK_COMMAND_OPTIONS "${VALGRIND_DEFAULT_OPTIONS}" CACHE STRING "Memory Check Command Options")
# check if a faster linker is available.
# only verified with GNU and Clang compilers and new CMake
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
if((${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
OR (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang"))
include(CheckCXXCompilerFlag)
set(CMAKE_CUSTOM_LINKER_DEFAULT default)
check_cxx_compiler_flag(-fuse-ld=lld HAVE_LLD_LINKER)
check_cxx_compiler_flag(-fuse-ld=gold HAVE_GOLD_LINKER)
check_cxx_compiler_flag(-fuse-ld=bfd HAVE_BFD_LINKER)
if(HAVE_LLD_LINKER)
set(CMAKE_CUSTOM_LINKER_DEFAULT lld)
elseif(HAVE_GOLD_LINKER)
set(CMAKE_CUSTOM_LINKER_DEFAULT gold)
elseif(HAVE_BFD_LINKER)
set(CMAKE_CUSTOM_LINKER_DEFAULT bfd)
endif()
set(CMAKE_CUSTOM_LINKER_VALUES lld gold bfd default)
set(CMAKE_CUSTOM_LINKER ${CMAKE_CUSTOM_LINKER_DEFAULT} CACHE STRING "Choose a custom linker for faster linking (lld, gold, bfd, default)")
validate_option(CMAKE_CUSTOM_LINKER CMAKE_CUSTOM_LINKER_VALUES)
mark_as_advanced(CMAKE_CUSTOM_LINKER)
if(NOT "${CMAKE_CUSTOM_LINKER}" STREQUAL "default")
target_link_options(lammps PUBLIC -fuse-ld=${CMAKE_CUSTOM_LINKER})
endif()
endif()
endif()
include(CTest) include(CTest)
enable_testing() enable_testing()

View File

@ -259,6 +259,23 @@ and working.
of mis-compiled code (or an undesired large loss of precision due of mis-compiled code (or an undesired large loss of precision due
to significant reordering of operations and thus less error cancellation). to significant reordering of operations and thus less error cancellation).
Use custom linker for faster link times when ENABLE_TESTING is active
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
When compiling LAMMPS with enabled tests, most test executables will
need to be linked against the LAMMPS library. Since this can be a
large with many C++ objects when many packages are enabled, link times
can become very long on machines that use the GNU BFD linker (e.g.
Linux systems). Alternatives like the ``lld`` linker of the LLVM project
or the ``gold`` linker available with GNU binutils can speed up this step
substantially. CMake will by default test if any of the two can be
enabled and use it when ``ENABLE_TESTING`` is active. It can also be
selected manually through the ``CMAKE_CUSTOM_LINKER`` CMake variable.
Allowed values are ``lld``, ``gold``, ``bfd``, or ``default``. The
``default`` option will use the system default linker otherwise, the
linker is chosen explicitly. This option is only available for the
GNU or Clang C++ compiler.
Tests for other components and utility functions Tests for other components and utility functions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -236,6 +236,7 @@ bilayer
bilayers bilayers
binsize binsize
binstyle binstyle
binutils
biomolecular biomolecular
biomolecule biomolecule
Biomolecules Biomolecules

View File

@ -625,9 +625,9 @@ int UCL_Device::set_platform_accelerator(int pid) {
for (int n=0; n<_num_platforms; n++) { for (int n=0; n<_num_platforms; n++) {
set_platform(n); set_platform(n);
for (int i=0; i<num_devices(); i++) { for (int i=0; i<num_devices(); i++) {
if (_properties[i].device_type==CL_DEVICE_TYPE_CPU || if ((_properties[i].device_type & CL_DEVICE_TYPE_CPU) ||
_properties[i].device_type==CL_DEVICE_TYPE_GPU || (_properties[i].device_type & CL_DEVICE_TYPE_GPU) ||
_properties[i].device_type==CL_DEVICE_TYPE_ACCELERATOR) { (_properties[i].device_type & CL_DEVICE_TYPE_ACCELERATOR)) {
found = 1; found = 1;
break; break;
} }

View File

@ -31,6 +31,7 @@
#include "error.h" #include "error.h"
#include "utils.h" #include "utils.h"
#include "fmt/format.h" #include "fmt/format.h"
#include "tokenizer.h"
using namespace LAMMPS_NS; using namespace LAMMPS_NS;
using namespace FixConst; using namespace FixConst;
@ -41,11 +42,11 @@ using namespace FixConst;
FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg), Fix(lmp, narg, arg),
random(NULL), fp(NULL), fpr(NULL), nsum(NULL), nsum_all(NULL), random(NULL), fp(NULL), nsum(NULL), nsum_all(NULL),
T_initial_set(NULL), gfactor1(NULL), gfactor2(NULL), ratio(NULL), gfactor1(NULL), gfactor2(NULL), ratio(NULL), flangevin(NULL),
flangevin(NULL), T_electron(NULL), T_electron_old(NULL), sum_vsq(NULL), T_electron(NULL), T_electron_old(NULL), sum_vsq(NULL), sum_mass_vsq(NULL),
sum_mass_vsq(NULL), sum_vsq_all(NULL), sum_mass_vsq_all(NULL), sum_vsq_all(NULL), sum_mass_vsq_all(NULL), net_energy_transfer(NULL),
net_energy_transfer(NULL), net_energy_transfer_all(NULL) net_energy_transfer_all(NULL)
{ {
if (narg < 15) error->all(FLERR,"Illegal fix ttm command"); if (narg < 15) error->all(FLERR,"Illegal fix ttm command");
@ -67,14 +68,6 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
nxnodes = force->inumeric(FLERR,arg[10]); nxnodes = force->inumeric(FLERR,arg[10]);
nynodes = force->inumeric(FLERR,arg[11]); nynodes = force->inumeric(FLERR,arg[11]);
nznodes = force->inumeric(FLERR,arg[12]); nznodes = force->inumeric(FLERR,arg[12]);
if (comm->me == 0) {
fpr = fopen(arg[13],"r");
if (fpr == NULL)
error->all(FLERR,fmt::format("Cannot open input file {}: {}",
arg[13], utils::getsyserror()));
}
nfileevery = force->inumeric(FLERR,arg[14]); nfileevery = force->inumeric(FLERR,arg[14]);
if (nfileevery) { if (nfileevery) {
@ -115,12 +108,14 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
gfactor2 = new double[atom->ntypes+1]; gfactor2 = new double[atom->ntypes+1];
// allocate 3d grid variables // allocate 3d grid variables
// check for allowed maxium number of total grid nodes
total_nnodes = nxnodes*nynodes*nznodes; total_nnodes = (bigint)nxnodes * (bigint)nynodes * (bigint)nznodes;
if (total_nnodes > MAXSMALLINT)
error->all(FLERR,"Too many nodes in fix ttm");
memory->create(nsum,nxnodes,nynodes,nznodes,"ttm:nsum"); memory->create(nsum,nxnodes,nynodes,nznodes,"ttm:nsum");
memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm:nsum_all"); memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm:nsum_all");
memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set");
memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm:sum_vsq"); memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm:sum_vsq");
memory->create(sum_mass_vsq,nxnodes,nynodes,nznodes,"ttm:sum_mass_vsq"); memory->create(sum_mass_vsq,nxnodes,nynodes,nznodes,"ttm:sum_mass_vsq");
memory->create(sum_vsq_all,nxnodes,nynodes,nznodes,"ttm:sum_vsq_all"); memory->create(sum_vsq_all,nxnodes,nynodes,nznodes,"ttm:sum_vsq_all");
@ -149,7 +144,7 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
// set initial electron temperatures from user input file // set initial electron temperatures from user input file
if (me == 0) read_initial_electron_temperatures(); if (comm->me == 0) read_initial_electron_temperatures(arg[13]);
MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world); MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world);
} }
@ -157,7 +152,7 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) :
FixTTM::~FixTTM() FixTTM::~FixTTM()
{ {
if (nfileevery && me == 0) fclose(fp); if (fp) fclose(fp);
delete random; delete random;
@ -166,7 +161,6 @@ FixTTM::~FixTTM()
memory->destroy(nsum); memory->destroy(nsum);
memory->destroy(nsum_all); memory->destroy(nsum_all);
memory->destroy(T_initial_set);
memory->destroy(sum_vsq); memory->destroy(sum_vsq);
memory->destroy(sum_mass_vsq); memory->destroy(sum_mass_vsq);
memory->destroy(sum_vsq_all); memory->destroy(sum_vsq_all);
@ -221,9 +215,9 @@ void FixTTM::init()
void FixTTM::setup(int vflag) void FixTTM::setup(int vflag)
{ {
if (strstr(update->integrate_style,"verlet")) if (utils::strmatch(update->integrate_style,"^verlet")) {
post_force_setup(vflag); post_force_setup(vflag);
else { } else {
((Respa *) update->integrate)->copy_flevel_f(nlevels_respa-1); ((Respa *) update->integrate)->copy_flevel_f(nlevels_respa-1);
post_force_respa_setup(vflag,nlevels_respa-1,0); post_force_respa_setup(vflag,nlevels_respa-1,0);
((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1); ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1);
@ -329,27 +323,48 @@ void FixTTM::reset_dt()
only called by proc 0 only called by proc 0
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
void FixTTM::read_initial_electron_temperatures() void FixTTM::read_initial_electron_temperatures(const char *filename)
{ {
char line[MAXLINE]; int ***T_initial_set;
memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm:T_initial_set");
memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int));
for (int ixnode = 0; ixnode < nxnodes; ixnode++) std::string name = utils::get_potential_file_path(filename);
for (int iynode = 0; iynode < nynodes; iynode++) if (name.empty())
for (int iznode = 0; iznode < nznodes; iznode++) error->one(FLERR,fmt::format("Cannot open input file: {}",
T_initial_set[ixnode][iynode][iznode] = 0; filename));
FILE *fpr = fopen(name.c_str(),"r");
// read initial electron temperature values from file // read initial electron temperature values from file
char line[MAXLINE];
int ixnode,iynode,iznode; int ixnode,iynode,iznode;
double T_tmp; double T_tmp;
while (1) { while (1) {
if (fgets(line,MAXLINE,fpr) == NULL) break; if (fgets(line,MAXLINE,fpr) == NULL) break;
sscanf(line,"%d %d %d %lg",&ixnode,&iynode,&iznode,&T_tmp); ValueTokenizer values(line);
if (values.has_next()) ixnode = values.next_int();
if (values.has_next()) iynode = values.next_int();
if (values.has_next()) iznode = values.next_int();
if (values.has_next()) T_tmp = values.next_double();
else error->one(FLERR,"Incorrect format in fix ttm input file");
// check correctness of input data
if ((ixnode < 0) || (ixnode >= nxnodes)
|| (iynode < 0) || (iynode >= nynodes)
|| (iznode < 0) || (iznode >= nznodes))
error->one(FLERR,"Fix ttm invalide node index in fix ttm input");
if (T_tmp < 0.0) if (T_tmp < 0.0)
error->one(FLERR,"Fix ttm electron temperatures must be > 0.0"); error->one(FLERR,"Fix ttm electron temperatures must be > 0.0");
T_electron[ixnode][iynode][iznode] = T_tmp; T_electron[ixnode][iynode][iznode] = T_tmp;
T_initial_set[ixnode][iynode][iznode] = 1; T_initial_set[ixnode][iynode][iznode] = 1;
} }
fclose(fpr);
// check completeness of input data
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
@ -357,9 +372,7 @@ void FixTTM::read_initial_electron_temperatures()
if (T_initial_set[ixnode][iynode][iznode] == 0) if (T_initial_set[ixnode][iynode][iznode] == 0)
error->one(FLERR,"Initial temperatures not all set in fix ttm"); error->one(FLERR,"Initial temperatures not all set in fix ttm");
// close file memory->destroy(T_initial_set);
fclose(fpr);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -463,7 +476,7 @@ void FixTTM::end_of_step()
(T_electron_old[ixnode][iynode][right_znode] + (T_electron_old[ixnode][iynode][right_znode] +
T_electron_old[ixnode][iynode][left_znode] - T_electron_old[ixnode][iynode][left_znode] -
2*T_electron_old[ixnode][iynode][iznode])/dz/dz) - 2*T_electron_old[ixnode][iynode][iznode])/dz/dz) -
(net_energy_transfer_all[ixnode][iynode][iznode])/del_vol); (net_energy_transfer_all[ixnode][iynode][iznode])/del_vol);
} }
} }
@ -514,7 +527,7 @@ void FixTTM::end_of_step()
MPI_Allreduce(&sum_mass_vsq[0][0][0],&sum_mass_vsq_all[0][0][0], MPI_Allreduce(&sum_mass_vsq[0][0][0],&sum_mass_vsq_all[0][0][0],
total_nnodes,MPI_DOUBLE,MPI_SUM,world); total_nnodes,MPI_DOUBLE,MPI_SUM,world);
if (me == 0) { if (comm->me == 0) {
fmt::print(fp,"{}",update->ntimestep); fmt::print(fp,"{}",update->ntimestep);
double T_a; double T_a;
@ -525,15 +538,15 @@ void FixTTM::end_of_step()
if (nsum_all[ixnode][iynode][iznode] > 0) if (nsum_all[ixnode][iynode][iznode] > 0)
T_a = sum_mass_vsq_all[ixnode][iynode][iznode]/ T_a = sum_mass_vsq_all[ixnode][iynode][iznode]/
(3.0*force->boltz*nsum_all[ixnode][iynode][iznode]/force->mvv2e); (3.0*force->boltz*nsum_all[ixnode][iynode][iznode]/force->mvv2e);
fprintf(fp," %f",T_a); fmt::print(fp," {}",T_a);
} }
fprintf(fp,"\t"); fputs("\t",fp);
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
for (int iznode = 0; iznode < nznodes; iznode++) for (int iznode = 0; iznode < nznodes; iznode++)
fprintf(fp,"%f ",T_electron[ixnode][iynode][iznode]); fmt::print(fp," {}",T_electron[ixnode][iynode][iznode]);
fprintf(fp,"\n"); fputs("\n",fp);
} }
} }
} }
@ -560,7 +573,7 @@ void FixTTM::grow_arrays(int ngrow)
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
return the energy of the electronic subsystem or the net_energy transfer return the energy of the electronic subsystem or the net_energy transfer
between the subsystems between the subsystems
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
@ -582,7 +595,7 @@ double FixTTM::compute_vector(int n)
electronic_density*del_vol; electronic_density*del_vol;
transfer_energy += transfer_energy +=
net_energy_transfer_all[ixnode][iynode][iznode]*update->dt; net_energy_transfer_all[ixnode][iynode][iznode]*update->dt;
} }
if (n == 0) return e_energy; if (n == 0) return e_energy;
if (n == 1) return transfer_energy; if (n == 1) return transfer_energy;

View File

@ -48,17 +48,15 @@ class FixTTM : public Fix {
double compute_vector(int); double compute_vector(int);
private: private:
int me;
int nfileevery; int nfileevery;
int nlevels_respa; int nlevels_respa;
int seed; int seed;
class RanMars *random; class RanMars *random;
FILE *fp,*fpr; FILE *fp;
int nxnodes,nynodes,nznodes,total_nnodes; int nxnodes,nynodes,nznodes;
int ***nsum; bigint total_nnodes;
int ***nsum_all,***T_initial_set; int ***nsum, ***nsum_all;
double *gfactor1,*gfactor2,*ratio; double *gfactor1,*gfactor2,*ratio,**flangevin;
double **flangevin;
double ***T_electron,***T_electron_old; double ***T_electron,***T_electron_old;
double ***sum_vsq,***sum_mass_vsq; double ***sum_vsq,***sum_mass_vsq;
double ***sum_vsq_all,***sum_mass_vsq_all; double ***sum_vsq_all,***sum_mass_vsq_all;
@ -67,7 +65,7 @@ class FixTTM : public Fix {
double electronic_thermal_conductivity; double electronic_thermal_conductivity;
double gamma_p,gamma_s,v_0,v_0_sq; double gamma_p,gamma_s,v_0,v_0_sq;
void read_initial_electron_temperatures(); void read_initial_electron_temperatures(const char *);
}; };
} }

View File

@ -34,6 +34,7 @@
#include "math_const.h" #include "math_const.h"
#include "utils.h" #include "utils.h"
#include "fmt/format.h" #include "fmt/format.h"
#include "tokenizer.h"
using namespace LAMMPS_NS; using namespace LAMMPS_NS;
using namespace FixConst; using namespace FixConst;
@ -65,7 +66,12 @@ static const char cite_fix_ttm_mod[] =
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) : FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
Fix(lmp, narg, arg) Fix(lmp, narg, arg),
random(NULL), fp(NULL), nsum(NULL), nsum_all(NULL),
gfactor1(NULL), gfactor2(NULL), ratio(NULL), flangevin(NULL),
T_electron(NULL), T_electron_old(NULL), sum_vsq(NULL), sum_mass_vsq(NULL),
sum_vsq_all(NULL), sum_mass_vsq_all(NULL), net_energy_transfer(NULL),
net_energy_transfer_all(NULL)
{ {
if (lmp->citeme) lmp->citeme->add(cite_fix_ttm_mod); if (lmp->citeme) lmp->citeme->add(cite_fix_ttm_mod);
@ -82,32 +88,20 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
if (seed <= 0) if (seed <= 0)
error->all(FLERR,"Invalid random number seed in fix ttm/mod command"); error->all(FLERR,"Invalid random number seed in fix ttm/mod command");
FILE *fpr_2 = force->open_potential(arg[4]);
if (fpr_2 == NULL) {
char str[128];
snprintf(str,128,"Cannot open file %s",arg[4]);
error->all(FLERR,str);
}
nxnodes = force->inumeric(FLERR,arg[5]); nxnodes = force->inumeric(FLERR,arg[5]);
nynodes = force->inumeric(FLERR,arg[6]); nynodes = force->inumeric(FLERR,arg[6]);
nznodes = force->inumeric(FLERR,arg[7]); nznodes = force->inumeric(FLERR,arg[7]);
if (nxnodes <= 0 || nynodes <= 0 || nznodes <= 0) if (nxnodes <= 0 || nynodes <= 0 || nznodes <= 0)
error->all(FLERR,"Fix ttm/mod number of nodes must be > 0"); error->all(FLERR,"Fix ttm/mod number of nodes must be > 0");
const char *filename = arg[8]; total_nnodes = (bigint)nxnodes * (bigint)nynodes * (bigint)nznodes;
FILE *fpr = force->open_potential(filename); if (total_nnodes > MAXSMALLINT)
if (fpr == NULL) { error->all(FLERR,"Too many nodes in fix ttm/mod");
char str[128];
snprintf(str,128,"Cannot open file %s",filename);
error->all(FLERR,str);
}
nfileevery = force->inumeric(FLERR,arg[9]); nfileevery = force->inumeric(FLERR,arg[9]);
if (nfileevery > 0) { if (nfileevery > 0) {
if (narg != 11) error->all(FLERR,"Illegal fix ttm/mod command"); if (narg != 11) error->all(FLERR,"Illegal fix ttm/mod command");
MPI_Comm_rank(world,&me); if (comm->me == 0) {
if (me == 0) {
fp = fopen(arg[10],"w"); fp = fopen(arg[10],"w");
if (fp == NULL) { if (fp == NULL) {
char str[128]; char str[128];
@ -116,121 +110,11 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
} }
} }
} }
char linee[MAXLINE];
double tresh_d; read_parameters(arg[4]);
int tresh_i;
// C0 (metal) // t_surface is determined by electronic temperature (not constant)
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
esheat_0 = tresh_d;
// C1 (metal*10^3)
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
esheat_1 = tresh_d;
// C2 (metal*10^6)
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
esheat_2 = tresh_d;
// C3 (metal*10^9)
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
esheat_3 = tresh_d;
// C4 (metal*10^12)
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
esheat_4 = tresh_d;
// C_limit
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
C_limit = tresh_d;
//Temperature damping factor
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
T_damp = tresh_d;
// rho_e
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
electronic_density = tresh_d;
//thermal_diffusion
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
el_th_diff = tresh_d;
// gamma_p
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
gamma_p = tresh_d;
// gamma_s
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
gamma_s = tresh_d;
// v0
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
v_0 = tresh_d;
// average intensity of pulse (source of energy) (metal units)
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
intensity = tresh_d;
// coordinate of 1st surface in x-direction (in box units) - constant
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%d",&tresh_i);
surface_l = tresh_i;
// coordinate of 2nd surface in x-direction (in box units) - constant
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%d",&tresh_i);
surface_r = tresh_i;
// skin_layer = intensity is reduced (I=I0*exp[-x/skin_layer])
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%d",&tresh_i);
skin_layer = tresh_i;
// width of pulse (picoseconds)
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
width = tresh_d;
// factor of electronic pressure (PF) Pe = PF*Ce*Te
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
pres_factor = tresh_d;
// effective free path of electrons (angstrom)
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
free_path = tresh_d;
// ionic density (ions*angstrom^{-3})
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
ionic_density = tresh_d;
// if movsur = 0: surface is freezed
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%d",&tresh_i);
movsur = tresh_i;
// electron_temperature_min
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
utils::sfgets(FLERR,linee,MAXLINE,fpr_2,filename,error);
sscanf(linee,"%lg",&tresh_d);
electron_temperature_min = tresh_d;
fclose(fpr_2);
//t_surface is determined by electronic temperature (not constant)
t_surface_l = surface_l; t_surface_l = surface_l;
mult_factor = intensity; mult_factor = intensity;
duration = 0.0; duration = 0.0;
@ -255,7 +139,6 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
total_nnodes = nxnodes*nynodes*nznodes; total_nnodes = nxnodes*nynodes*nznodes;
memory->create(nsum,nxnodes,nynodes,nznodes,"ttm/mod:nsum"); memory->create(nsum,nxnodes,nynodes,nznodes,"ttm/mod:nsum");
memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm/mod:nsum_all"); memory->create(nsum_all,nxnodes,nynodes,nznodes,"ttm/mod:nsum_all");
memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm/mod:T_initial_set");
memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm/mod:sum_vsq"); memory->create(sum_vsq,nxnodes,nynodes,nznodes,"ttm/mod:sum_vsq");
memory->create(sum_mass_vsq,nxnodes,nynodes,nznodes,"ttm/mod:sum_mass_vsq"); memory->create(sum_mass_vsq,nxnodes,nynodes,nznodes,"ttm/mod:sum_mass_vsq");
memory->create(sum_vsq_all,nxnodes,nynodes,nznodes,"ttm/mod:sum_vsq_all"); memory->create(sum_vsq_all,nxnodes,nynodes,nznodes,"ttm/mod:sum_vsq_all");
@ -270,31 +153,36 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
"ttm/mod:net_energy_transfer_all"); "ttm/mod:net_energy_transfer_all");
flangevin = NULL; flangevin = NULL;
grow_arrays(atom->nmax); grow_arrays(atom->nmax);
// zero out the flangevin array // zero out the flangevin array
for (int i = 0; i < atom->nmax; i++) { for (int i = 0; i < atom->nmax; i++) {
flangevin[i][0] = 0; flangevin[i][0] = 0;
flangevin[i][1] = 0; flangevin[i][1] = 0;
flangevin[i][2] = 0; flangevin[i][2] = 0;
} }
atom->add_callback(0); atom->add_callback(0);
atom->add_callback(1); atom->add_callback(1);
// set initial electron temperatures from user input file // set initial electron temperatures from user input file
if (me == 0) read_initial_electron_temperatures(fpr);
if (comm->me == 0) read_initial_electron_temperatures(arg[8]);
MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world); MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world);
fclose(fpr);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
FixTTMMod::~FixTTMMod() FixTTMMod::~FixTTMMod()
{ {
if (nfileevery && me == 0) fclose(fp); if (fp) fclose(fp);
delete random; delete random;
delete [] gfactor1; delete [] gfactor1;
delete [] gfactor2; delete [] gfactor2;
memory->destroy(nsum); memory->destroy(nsum);
memory->destroy(nsum_all); memory->destroy(nsum_all);
memory->destroy(T_initial_set);
memory->destroy(sum_vsq); memory->destroy(sum_vsq);
memory->destroy(sum_mass_vsq); memory->destroy(sum_mass_vsq);
memory->destroy(sum_vsq_all); memory->destroy(sum_vsq_all);
@ -328,16 +216,20 @@ void FixTTMMod::init()
error->all(FLERR,"Cannot use non-periodic boundares with fix ttm/mod"); error->all(FLERR,"Cannot use non-periodic boundares with fix ttm/mod");
if (domain->triclinic) if (domain->triclinic)
error->all(FLERR,"Cannot use fix ttm/mod with triclinic box"); error->all(FLERR,"Cannot use fix ttm/mod with triclinic box");
// set force prefactors // set force prefactors
for (int i = 1; i <= atom->ntypes; i++) { for (int i = 1; i <= atom->ntypes; i++) {
gfactor1[i] = - gamma_p / force->ftm2v; gfactor1[i] = - gamma_p / force->ftm2v;
gfactor2[i] = gfactor2[i] =
sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v; sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v;
} }
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
for (int iznode = 0; iznode < nznodes; iznode++) for (int iznode = 0; iznode < nznodes; iznode++)
net_energy_transfer_all[ixnode][iynode][iznode] = 0; net_energy_transfer_all[ixnode][iynode][iznode] = 0;
if (strstr(update->integrate_style,"respa")) if (strstr(update->integrate_style,"respa"))
nlevels_respa = ((Respa *) update->integrate)->nlevels; nlevels_respa = ((Respa *) update->integrate)->nlevels;
} }
@ -346,7 +238,7 @@ void FixTTMMod::init()
void FixTTMMod::setup(int vflag) void FixTTMMod::setup(int vflag)
{ {
if (strstr(update->integrate_style,"verlet")) { if (utils::strmatch(update->integrate_style,"^verlet")) {
post_force_setup(vflag); post_force_setup(vflag);
} else { } else {
((Respa *) update->integrate)->copy_flevel_f(nlevels_respa-1); ((Respa *) update->integrate)->copy_flevel_f(nlevels_respa-1);
@ -365,13 +257,17 @@ void FixTTMMod::post_force(int /*vflag*/)
int *type = atom->type; int *type = atom->type;
int *mask = atom->mask; int *mask = atom->mask;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
double dx = domain->xprd/nxnodes; double dx = domain->xprd/nxnodes;
double dy = domain->yprd/nynodes; double dy = domain->yprd/nynodes;
double dz = domain->zprd/nynodes; double dz = domain->zprd/nynodes;
double gamma1,gamma2; double gamma1,gamma2;
// apply damping and thermostat to all atoms in fix group // apply damping and thermostat to all atoms in fix group
for (int i = 0; i < nlocal; i++) { for (int i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd;
double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd; double zscale = (x[i][2] - domain->boxlo[2])/domain->zprd;
@ -384,9 +280,12 @@ void FixTTMMod::post_force(int /*vflag*/)
while (ixnode < 0) ixnode += nxnodes; while (ixnode < 0) ixnode += nxnodes;
while (iynode < 0) iynode += nynodes; while (iynode < 0) iynode += nynodes;
while (iznode < 0) iznode += nznodes; while (iznode < 0) iznode += nznodes;
if (T_electron[ixnode][iynode][iznode] < 0) if (T_electron[ixnode][iynode][iznode] < 0)
error->all(FLERR,"Electronic temperature dropped below zero"); error->all(FLERR,"Electronic temperature dropped below zero");
double tsqrt = sqrt(T_electron[ixnode][iynode][iznode]); double tsqrt = sqrt(T_electron[ixnode][iynode][iznode]);
gamma1 = gfactor1[type[i]]; gamma1 = gfactor1[type[i]];
double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2];
if (vsq > v_0_sq) gamma1 *= (gamma_p + gamma_s)/gamma_p; if (vsq > v_0_sq) gamma1 *= (gamma_p + gamma_s)/gamma_p;
@ -455,7 +354,9 @@ void FixTTMMod::post_force_setup(int /*vflag*/)
double **f = atom->f; double **f = atom->f;
int *mask = atom->mask; int *mask = atom->mask;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
// apply langevin forces that have been stored from previous run // apply langevin forces that have been stored from previous run
for (int i = 0; i < nlocal; i++) { for (int i = 0; i < nlocal; i++) {
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
f[i][0] += flangevin[i][0]; f[i][0] += flangevin[i][0];
@ -488,33 +389,209 @@ void FixTTMMod::reset_dt()
sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v; sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v;
} }
/* ----------------------------------------------------------------------
read in ttm/mod parameters from a user-specified file
only called by proc 0
------------------------------------------------------------------------- */
void FixTTMMod::read_parameters(const char *filename)
{
char line[MAXLINE];
std::string name = utils::get_potential_file_path(filename);
if (name.empty())
error->one(FLERR,fmt::format("Cannot open input file: {}",
filename));
FILE *fpr = fopen(name.c_str(),"r");
// C0 (metal)
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
esheat_0 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// C1 (metal*10^3)
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
esheat_1 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// C2 (metal*10^6)
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
esheat_2 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// C3 (metal*10^9)
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
esheat_3 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// C4 (metal*10^12)
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
esheat_4 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// C_limit
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
C_limit = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// Temperature damping factor
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
T_damp = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// rho_e
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
electronic_density = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// thermal_diffusion
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
el_th_diff = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// gamma_p
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
gamma_p = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// gamma_s
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
gamma_s = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// v0
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
v_0 = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// average intensity of pulse (source of energy) (metal units)
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
intensity = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// coordinate of 1st surface in x-direction (in box units) - constant
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
surface_l = utils::inumeric(FLERR,utils::trim(line).c_str(),true,lmp);
// coordinate of 2nd surface in x-direction (in box units) - constant
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
surface_r = utils::inumeric(FLERR,utils::trim(line).c_str(),true,lmp);
// skin_layer = intensity is reduced (I=I0*exp[-x/skin_layer])
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
skin_layer = utils::inumeric(FLERR,utils::trim(line).c_str(),true,lmp);
// width of pulse (picoseconds)
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
width = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// factor of electronic pressure (PF) Pe = PF*Ce*Te
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
pres_factor = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// effective free path of electrons (angstrom)
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
free_path = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// ionic density (ions*angstrom^{-3})
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
ionic_density = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
// if movsur = 0: surface is frozen
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
movsur = utils::inumeric(FLERR,utils::trim(line).c_str(),true,lmp);
// electron_temperature_min
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
electron_temperature_min = utils::numeric(FLERR,utils::trim(line).c_str(),true,lmp);
fclose(fpr);
}
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
read in initial electron temperatures from a user-specified file read in initial electron temperatures from a user-specified file
only called by proc 0 only called by proc 0
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
void FixTTMMod::read_initial_electron_temperatures(FILE *fpr) void FixTTMMod::read_initial_electron_temperatures(const char *filename)
{ {
char line[MAXLINE]; int ***T_initial_set;
for (int ixnode = 0; ixnode < nxnodes; ixnode++) memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm/mod:T_initial_set");
for (int iynode = 0; iynode < nynodes; iynode++) memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int));
for (int iznode = 0; iznode < nznodes; iznode++)
T_initial_set[ixnode][iynode][iznode] = 0; std::string name = utils::get_potential_file_path(filename);
if (name.empty())
error->one(FLERR,fmt::format("Cannot open input file: {}",
filename));
FILE *fpr = fopen(name.c_str(),"r");
// read initial electron temperature values from file // read initial electron temperature values from file
char line[MAXLINE];
int ixnode,iynode,iznode; int ixnode,iynode,iznode;
double T_tmp; double T_tmp;
while (1) { while (1) {
if (fgets(line,MAXLINE,fpr) == NULL) break; if (fgets(line,MAXLINE,fpr) == NULL) break;
sscanf(line,"%d %d %d %lg",&ixnode,&iynode,&iznode,&T_tmp); ValueTokenizer values(line);
if (T_tmp < 0.0) error->one(FLERR,"Fix ttm/mod electron temperatures must be >= 0.0"); if (values.has_next()) ixnode = values.next_int();
if (values.has_next()) iynode = values.next_int();
if (values.has_next()) iznode = values.next_int();
if (values.has_next()) T_tmp = values.next_double();
else error->one(FLERR,"Incorrect format in fix ttm input file");
// check correctness of input data
if ((ixnode < 0) || (ixnode >= nxnodes)
|| (iynode < 0) || (iynode >= nynodes)
|| (iznode < 0) || (iznode >= nznodes))
error->one(FLERR,"Fix ttm invalide node index in fix ttm input");
if (T_tmp < 0.0)
error->one(FLERR,"Fix ttm electron temperatures must be > 0.0");
T_electron[ixnode][iynode][iznode] = T_tmp; T_electron[ixnode][iynode][iznode] = T_tmp;
T_initial_set[ixnode][iynode][iznode] = 1; T_initial_set[ixnode][iynode][iznode] = 1;
} }
fclose(fpr);
// check completeness of input data
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
for (int iznode = 0; iznode < nznodes; iznode++) for (int iznode = 0; iznode < nznodes; iznode++)
if (T_initial_set[ixnode][iynode][iznode] == 0) if (T_initial_set[ixnode][iynode][iznode] == 0)
error->one(FLERR,"Initial temperatures not all set in fix ttm/mod"); error->one(FLERR,"Initial temperatures not all set in fix ttm");
memory->destroy(T_initial_set);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -551,6 +628,7 @@ void FixTTMMod::end_of_step()
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 (movsur == 1){ if (movsur == 1){
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
@ -566,6 +644,7 @@ void FixTTMMod::end_of_step()
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
for (int iznode = 0; iznode < nznodes; iznode++) for (int iznode = 0; iznode < nznodes; iznode++)
net_energy_transfer[ixnode][iynode][iznode] = 0; net_energy_transfer[ixnode][iynode][iznode] = 0;
for (int i = 0; i < nlocal; i++) for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd;
@ -587,9 +666,11 @@ void FixTTMMod::end_of_step()
flangevin[i][2]*v[i][2]); flangevin[i][2]*v[i][2]);
} }
} }
MPI_Allreduce(&net_energy_transfer[0][0][0], MPI_Allreduce(&net_energy_transfer[0][0][0],
&net_energy_transfer_all[0][0][0], &net_energy_transfer_all[0][0][0],
total_nnodes,MPI_DOUBLE,MPI_SUM,world); total_nnodes,MPI_DOUBLE,MPI_SUM,world);
double dx = domain->xprd/nxnodes; double dx = domain->xprd/nxnodes;
double dy = domain->yprd/nynodes; double dy = domain->yprd/nynodes;
double dz = domain->zprd/nznodes; double dz = domain->zprd/nznodes;
@ -611,6 +692,7 @@ void FixTTMMod::end_of_step()
} }
// num_inner_timesteps = # of inner steps (thermal solves) // num_inner_timesteps = # of inner steps (thermal solves)
// required this MD step to maintain a stable explicit solve // required this MD step to maintain a stable explicit solve
int num_inner_timesteps = 1; int num_inner_timesteps = 1;
double inner_dt = update->dt; double inner_dt = update->dt;
double stability_criterion = 0.0; double stability_criterion = 0.0;
@ -720,9 +802,13 @@ void FixTTMMod::end_of_step()
(el_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz)); (el_thermal_conductivity*(1.0/dx/dx + 1.0/dy/dy + 1.0/dz/dz));
} while (stability_criterion < 0.0); } while (stability_criterion < 0.0);
// output nodal temperatures for current timestep // output nodal temperatures for current timestep
if ((nfileevery) && !(update->ntimestep % nfileevery)) { if ((nfileevery) && !(update->ntimestep % nfileevery)) {
// compute atomic Ta for each grid point // compute atomic Ta for each grid point
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
for (int iznode = 0; iznode < nznodes; iznode++) { for (int iznode = 0; iznode < nznodes; iznode++) {
@ -733,6 +819,7 @@ void FixTTMMod::end_of_step()
sum_vsq_all[ixnode][iynode][iznode] = 0.0; sum_vsq_all[ixnode][iynode][iznode] = 0.0;
sum_mass_vsq_all[ixnode][iynode][iznode] = 0.0; sum_mass_vsq_all[ixnode][iynode][iznode] = 0.0;
} }
double massone; double massone;
for (int i = 0; i < nlocal; i++) for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
@ -755,36 +842,39 @@ void FixTTMMod::end_of_step()
sum_vsq[ixnode][iynode][iznode] += vsq; sum_vsq[ixnode][iynode][iznode] += vsq;
sum_mass_vsq[ixnode][iynode][iznode] += massone*vsq; sum_mass_vsq[ixnode][iynode][iznode] += massone*vsq;
} }
MPI_Allreduce(&nsum[0][0][0],&nsum_all[0][0][0],total_nnodes, MPI_Allreduce(&nsum[0][0][0],&nsum_all[0][0][0],total_nnodes,
MPI_INT,MPI_SUM,world); MPI_INT,MPI_SUM,world);
MPI_Allreduce(&sum_vsq[0][0][0],&sum_vsq_all[0][0][0],total_nnodes, MPI_Allreduce(&sum_vsq[0][0][0],&sum_vsq_all[0][0][0],total_nnodes,
MPI_DOUBLE,MPI_SUM,world); MPI_DOUBLE,MPI_SUM,world);
MPI_Allreduce(&sum_mass_vsq[0][0][0],&sum_mass_vsq_all[0][0][0], MPI_Allreduce(&sum_mass_vsq[0][0][0],&sum_mass_vsq_all[0][0][0],
total_nnodes,MPI_DOUBLE,MPI_SUM,world); total_nnodes,MPI_DOUBLE,MPI_SUM,world);
MPI_Allreduce(&t_surface_l,&surface_l, MPI_Allreduce(&t_surface_l,&surface_l,1,MPI_INT,MPI_MIN,world);
1,MPI_INT,MPI_MIN,world);
if (me == 0) { if (comm->me == 0) {
fmt::print(fp,"{}",update->ntimestep); fmt::print(fp,"{}",update->ntimestep);
double T_a; double T_a;
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
for (int iznode = 0; iznode < nznodes; iznode++) { for (int iznode = 0; iznode < nznodes; iznode++) {
T_a = 0; T_a = 0;
if (nsum_all[ixnode][iynode][iznode] > 0){ if (nsum_all[ixnode][iynode][iznode] > 0) {
T_a = sum_mass_vsq_all[ixnode][iynode][iznode]/ T_a = sum_mass_vsq_all[ixnode][iynode][iznode]/
(3.0*force->boltz*nsum_all[ixnode][iynode][iznode]/force->mvv2e); (3.0*force->boltz*nsum_all[ixnode][iynode][iznode]/force->mvv2e);
if (movsur == 1){ if (movsur == 1){
if (T_electron[ixnode][iynode][iznode]==0.0) T_electron[ixnode][iynode][iznode] = electron_temperature_min; if (T_electron[ixnode][iynode][iznode]==0.0) T_electron[ixnode][iynode][iznode] = electron_temperature_min;
} }
} }
fprintf(fp," %f",T_a); fmt::print(fp," {}",T_a);
} }
fprintf(fp,"\t");
fputs("\t",fp);
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
for (int iznode = 0; iznode < nznodes; iznode++) for (int iznode = 0; iznode < nznodes; iznode++)
fprintf(fp,"%f ",T_electron[ixnode][iynode][iznode]); fmt::print(fp," {}",T_electron[ixnode][iynode][iznode]);
fprintf(fp,"\n"); fputs("\n",fp);
} }
} }
} }
@ -817,10 +907,12 @@ double FixTTMMod::compute_vector(int n)
{ {
double e_energy = 0.0; double e_energy = 0.0;
double transfer_energy = 0.0; double transfer_energy = 0.0;
double dx = domain->xprd/nxnodes; double dx = domain->xprd/nxnodes;
double dy = domain->yprd/nynodes; double dy = domain->yprd/nynodes;
double dz = domain->zprd/nznodes; double dz = domain->zprd/nznodes;
double del_vol = dx*dy*dz; double del_vol = dx*dy*dz;
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
for (int iznode = 0; iznode < nznodes; iznode++) { for (int iznode = 0; iznode < nznodes; iznode++) {
@ -828,6 +920,7 @@ double FixTTMMod::compute_vector(int n)
transfer_energy += transfer_energy +=
net_energy_transfer_all[ixnode][iynode][iznode]*update->dt; net_energy_transfer_all[ixnode][iynode][iznode]*update->dt;
} }
if (n == 0) return e_energy; if (n == 0) return e_energy;
if (n == 1) return transfer_energy; if (n == 1) return transfer_energy;
return 0.0; return 0.0;
@ -841,17 +934,21 @@ void FixTTMMod::write_restart(FILE *fp)
{ {
double *rlist; double *rlist;
memory->create(rlist,nxnodes*nynodes*nznodes+1,"ttm/mod:rlist"); memory->create(rlist,nxnodes*nynodes*nznodes+1,"ttm/mod:rlist");
int n = 0; int n = 0;
rlist[n++] = seed; rlist[n++] = seed;
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
for (int iznode = 0; iznode < nznodes; iznode++) for (int iznode = 0; iznode < nznodes; iznode++)
rlist[n++] = T_electron[ixnode][iynode][iznode]; rlist[n++] = T_electron[ixnode][iynode][iznode];
if (comm->me == 0) { if (comm->me == 0) {
int size = n * sizeof(double); int size = n * sizeof(double);
fwrite(&size,sizeof(int),1,fp); fwrite(&size,sizeof(int),1,fp);
fwrite(rlist,sizeof(double),n,fp); fwrite(rlist,sizeof(double),n,fp);
} }
memory->destroy(rlist); memory->destroy(rlist);
} }
@ -863,12 +960,16 @@ void FixTTMMod::restart(char *buf)
{ {
int n = 0; int n = 0;
double *rlist = (double *) buf; double *rlist = (double *) buf;
// the seed must be changed from the initial seed // the seed must be changed from the initial seed
seed = static_cast<int> (0.5*rlist[n++]); seed = static_cast<int> (0.5*rlist[n++]);
for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int ixnode = 0; ixnode < nxnodes; ixnode++)
for (int iynode = 0; iynode < nynodes; iynode++) for (int iynode = 0; iynode < nynodes; iynode++)
for (int iznode = 0; iznode < nznodes; iznode++) for (int iznode = 0; iznode < nznodes; iznode++)
T_electron[ixnode][iynode][iznode] = rlist[n++]; T_electron[ixnode][iynode][iznode] = rlist[n++];
delete random; delete random;
random = new RanMars(lmp,seed+comm->me); random = new RanMars(lmp,seed+comm->me);
} }
@ -893,10 +994,13 @@ int FixTTMMod::pack_restart(int i, double *buf)
void FixTTMMod::unpack_restart(int nlocal, int nth) void FixTTMMod::unpack_restart(int nlocal, int nth)
{ {
double **extra = atom->extra; double **extra = atom->extra;
// skip to Nth set of extra values // skip to Nth set of extra values
int m = 0; int m = 0;
for (int i = 0; i < nth; i++) m += static_cast<int> (extra[nlocal][m]); for (int i = 0; i < nth; i++) m += static_cast<int> (extra[nlocal][m]);
m++; m++;
flangevin[nlocal][0] = extra[nlocal][m++]; flangevin[nlocal][0] = extra[nlocal][m++];
flangevin[nlocal][1] = extra[nlocal][m++]; flangevin[nlocal][1] = extra[nlocal][m++];
flangevin[nlocal][2] = extra[nlocal][m++]; flangevin[nlocal][2] = extra[nlocal][m++];

View File

@ -53,17 +53,15 @@ class FixTTMMod : public Fix {
double compute_vector(int); double compute_vector(int);
private: private:
int me;
int nfileevery; int nfileevery;
int nlevels_respa; int nlevels_respa;
int seed; int seed;
class RanMars *random; class RanMars *random;
FILE *fp; FILE *fp;
int nxnodes,nynodes,nznodes,total_nnodes; int nxnodes,nynodes,nznodes;
int ***nsum; bigint total_nnodes;
int ***nsum_all,***T_initial_set; int ***nsum, ***nsum_all;
double *gfactor1,*gfactor2,*ratio; double *gfactor1,*gfactor2,*ratio,**flangevin;
double **flangevin;
double ***T_electron,***T_electron_old,***T_electron_first; double ***T_electron,***T_electron_old,***T_electron_first;
double ***sum_vsq,***sum_mass_vsq; double ***sum_vsq,***sum_mass_vsq;
double ***sum_vsq_all,***sum_mass_vsq_all; double ***sum_vsq_all,***sum_mass_vsq_all;
@ -79,7 +77,8 @@ class FixTTMMod : public Fix {
double electron_temperature_min; double electron_temperature_min;
el_heat_capacity_thermal_conductivity el_properties(double); el_heat_capacity_thermal_conductivity el_properties(double);
double el_sp_heat_integral(double); double el_sp_heat_integral(double);
void read_initial_electron_temperatures(FILE *); void read_parameters(const char *);
void read_initial_electron_temperatures(const char *);
}; };
} }

View File

@ -348,6 +348,19 @@ tagint utils::tnumeric(const char *file, int line, const char *str,
return ATOTAGINT(str); return ATOTAGINT(str);
} }
/* ----------------------------------------------------------------------
Return string without leading or trailing whitespace
------------------------------------------------------------------------- */
std::string utils::trim(const std::string & line) {
int beg = re_match(line.c_str(),"\\S+");
int end = re_match(line.c_str(),"\\s+$");
if (beg < 0) beg = 0;
if (end < 0) end = line.size();
return line.substr(beg,end-beg);
}
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
Return string without trailing # comment Return string without trailing # comment
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */

View File

@ -143,6 +143,13 @@ namespace LAMMPS_NS {
tagint tnumeric(const char *file, int line, const char *str, tagint tnumeric(const char *file, int line, const char *str,
bool do_abort, LAMMPS *lmp); bool do_abort, LAMMPS *lmp);
/**
* \brief Trim leading and trailing whitespace. Like TRIM() in Fortran.
* \param line string that should be trimmed
* \return new string without whitespace (string)
*/
std::string trim(const std::string &line);
/** /**
* \brief Trim anything from '#' onward * \brief Trim anything from '#' onward
* \param line string that should be trimmed * \param line string that should be trimmed

View File

@ -0,0 +1,101 @@
---
lammps_version: 21 Jul 2020
date_generated: Fri Jul 31 11:30:59 202
epsilon: 5e-14
prerequisites: ! |
atom full
pair born
pre_commands: ! ""
post_commands: ! ""
input_file: in.fourmol
pair_style: born 8.0
pair_coeff: ! |
1 1 2.51937098847838 0.148356076521964 1.82166848001002 29.0375806150613 141.547923828784
1 2 2.87560097202631 0.103769845319212 1.18949647259382 1.7106306969663 4.09225030876458
1 3 2.73333746288062 0.169158133709025 2.06291417638668 63.7180294456725 403.51858739517
1 4 2.51591531388789 0.166186965980131 2.01659390849669 49.622913109061 303.336540547726
1 5 2.51591531388789 0.166186965980131 2.01659390849669 49.622913109061 303.336540547726
2 2 1.0594557710255 0.281261664467988 0.314884389172266 0.271080184997071 0.177172207445923
2 3 2.12127488295383 0.124576922646243 1.46526793359105 5.10367785279284 17.5662073921955
2 4 0.523836115049206 0.140093804714855 0.262040872137659 0.00432916334694855 0.000703093129207124
2 5 2.36887234111228 0.121604450909563 1.39946581861656 3.82529730669145 12.548008396489
3 3 2.81831917530019 0.189944649028137 2.31041576143228 127.684271782117 1019.38354056979
3 4 2.5316180773506 0.186976803503293 2.26748506873271 100.602835334624 778.254162800904
3 5 2.5316180773506 0.186976803503293 2.26748506873271 100.602835334624 778.254162800904
4 4 2.63841820292211 0.184008285863681 2.19742633928911 79.1465822481912 592.979935420722
4 5 2.63841820292211 0.184008285863681 2.19742633928911 79.1465822481912 592.979935420722
5 5 2.63841820292211 0.184008285863681 2.19742633928911 79.1465822481912 592.979935420722
extract: ! |
a 2
c 2
d 2
natoms: 29
init_vdwl: 225.01325775005
init_coul: 0
init_stress: ! |2-
4.8890135912686276e+02 4.9476399950851692e+02 8.2928912031456082e+02 -1.0579437249928866e+02 4.4179413858812438e+01 9.5101960701751082e+01
init_forces: ! |2
1 -6.9893383802546962e+00 6.6029484782767952e+01 8.3756568617383323e+01
2 4.0451866140633364e+01 3.3281238501966307e+01 -4.7609572091467101e+01
3 -3.3554420459361133e+01 -9.0366128102758736e+01 -3.5316607577134356e+01
4 -5.4073880610506162e+00 1.4446970275947606e+00 -3.8476430305660450e+00
5 -1.6945125260616778e+00 -2.7877656601727141e+00 7.9522401328715366e+00
6 -1.3632256873869170e+02 1.4939600552520452e+02 1.3659626640534242e+02
7 3.3654149102999633e+00 -4.3825682948657864e+01 -2.4770247768336748e+02
8 9.4256799970526348e+00 -1.2748610635504216e+01 6.3401042922319014e+01
9 1.8214255707343796e+01 1.9634013462823493e+01 8.0627903889311966e+01
10 9.3246929195512337e+01 -1.1604313193477655e+02 -3.3499092894518185e+01
11 -1.5551881794825244e+00 -3.9302596365151383e+00 -6.4152106265937565e+00
12 1.1280784656332765e+01 5.7304267382999692e+00 -4.8408891298437595e+00
13 5.6681661555106224e+00 -2.2485598040323831e+00 -1.0337527359002666e-01
14 -2.3386018881230815e+00 4.7373017575312287e-01 -6.0367036404675947e+00
15 -1.3919036266533302e-01 5.9086314064227237e+00 2.0961592452498299e+00
16 7.5982502517085123e+01 -5.7865285413867682e+01 -1.7681361314063858e+02
17 -6.9601631652927367e+01 4.7943078126464606e+01 1.8773972338580970e+02
18 -1.7638834547123915e-02 -3.1951813093162265e-02 2.9618331655533261e-02
19 -2.7917883175529663e-04 -1.0814182946186390e-03 2.2202001768571464e-03
20 -5.7104234747899134e-04 -7.8074218300731402e-04 7.2628317005618385e-04
21 -1.8437130720809485e+01 -2.1632915199788872e+01 6.1464911328600842e+01
22 -2.9579890614400888e+01 -7.1679619383431872e+00 -4.6407011665270588e+01
23 4.8006251756481980e+01 2.8813363350657969e+01 -1.5046330694799972e+01
24 1.1355386172593194e+01 -5.6677213697182935e+01 3.1221909936704108e+01
25 -4.1170774220209523e+01 6.6256133865767302e+00 -3.4614250263817894e+01
26 2.9803365929697637e+01 5.0039673341961418e+01 3.3685284865566483e+00
27 1.1754339453870926e+01 -6.1391797882279533e+01 2.3297502014340736e+01
28 -4.7133554549788215e+01 2.0256243416311925e+01 -3.1891313669103603e+01
29 3.5387736817138148e+01 4.1142927584645129e+01 8.5887702016863265e+00
run_vdwl: 156.543264192972
run_coul: 0
run_stress: ! |2-
3.8217409303560629e+02 3.9644927104438381e+02 5.4741622167620551e+02 -9.9916269275610532e+01 3.6853516322661612e+01 6.7569991842117304e+01
run_forces: ! |2
1 1.0395674707735731e+00 5.5256813605008816e+01 5.6773276352200661e+01
2 2.4481921282193845e+01 1.9879632440195810e+01 -2.8528936799032302e+01
3 -3.0770161776503635e+01 -6.2238142906829239e+01 -2.4064417240263371e+01
4 -5.1681544316504038e+00 1.4863747534138627e+00 -3.7546490114181550e+00
5 -1.4671781617695223e+00 -2.3821362963461601e+00 7.2672287644994524e+00
6 -9.8499362763180983e+01 1.0257804525013071e+02 5.3495439213952984e+01
7 4.2001835596160104e+00 -2.6937041762260563e+01 -1.3607048811616696e+02
8 4.6511093906491512e+00 -5.1080518517972804e+00 5.5257861257710744e+01
9 1.1843202778068722e+01 1.2416390727106398e+01 5.1473652467930826e+01
10 7.0145695491089597e+01 -8.9295009657311510e+01 -2.9634434514715853e+01
11 -1.7228090610547173e+00 -3.6991390929261971e+00 -6.3108366948469161e+00
12 1.0660819163349736e+01 5.8147700758899523e+00 -5.4355772152867248e+00
13 5.2924774467636020e+00 -2.0068724896508732e+00 -7.8093372156985835e-02
14 -2.0358243249672157e+00 3.2827307490873597e-01 -5.1944474119957285e+00
15 -2.6827906151865294e-01 5.7618640647259713e+00 2.1709750862347468e+00
16 4.7636632061962267e+01 -3.9810879273462064e+01 -9.6151504817851247e+01
17 -3.9986659907067860e+01 2.7980343203916043e+01 1.0876993658623469e+02
18 -1.7426743545211711e-02 -3.1530831655227590e-02 2.9358218896064495e-02
19 -3.2185264613315649e-04 -1.1165230646128495e-03 2.2446047347148388e-03
20 -5.4449298929830944e-04 -7.4700830397387554e-04 7.2352482859877815e-04
21 -1.2591458573727806e+01 -1.3846681617243361e+01 4.1802224946997235e+01
22 -2.0391390443413155e+01 -5.1794508883407548e+00 -3.1545667320662130e+01
23 3.2971780932048034e+01 1.9038950539781588e+01 -1.0244642035304839e+01
24 1.0960784435729556e+01 -4.0895918302034367e+01 2.4332900990266868e+01
25 -3.2019961323106763e+01 4.8905379432638307e+00 -2.7175126429424967e+01
26 2.1046878688704115e+01 3.5993356715466817e+01 2.8179811510290729e+00
27 7.6414241493444806e+00 -4.2201314723630858e+01 1.4744843719921445e+01
28 -3.1401246838529225e+01 1.3739835837624105e+01 -2.0945633715119591e+01
29 2.3768302905377848e+01 2.8468844993424415e+01 6.1958078088075466e+00
...

View File

@ -0,0 +1,101 @@
---
lammps_version: 21 Jul 2020
date_generated: Fri Jul 31 12:07:29 202
epsilon: 5e-14
prerequisites: ! |
atom full
pair buck
pre_commands: ! ""
post_commands: ! |
pair_modify mix arithmetic
input_file: in.fourmol
pair_style: buck 8.0
pair_coeff: ! |
1 1 170339.505032359 0.166879344173798 13.642356513989
1 2 85988.1490021027 0.116722557424471 0.80085535265993
1 3 169866.420176425 0.190286500706475 29.9623467274028
1 4 147160.913151695 0.186942613268455 23.3320434749744
1 5 147160.913151695 0.186942613268455 23.3320434749744
2 2 43972.4676803832 0.0665738276248451 0.0138732735747516
2 3 85535.686235147 0.140128612516736 2.39406114840173
2 4 45975.8370021332 0.0331639834863857 0.000214673167591639
2 5 74124.142292174 0.136784828511181 1.79395952625758
3 3 169504.649065961 0.213692863412526 60.0617510100503
3 4 146835.114678908 0.210349185259049 47.3225728524629
3 5 146835.114678908 0.210349185259049 47.3225728524629
4 4 127198.698386798 0.207005479340455 37.2289658745028
4 5 127198.698386798 0.207005479340455 37.2289658745028
5 5 127198.698386798 0.207005479340455 37.2289658745028
extract: ! |
a 2
c 2
natoms: 29
init_vdwl: 143.749538808172
init_coul: 0
init_stress: ! |2-
2.8546063261749947e+02 2.8737384899658309e+02 4.6113105064788800e+02 -5.4335721921076150e+01 3.0318888748596905e+01 4.6619308801703639e+01
init_forces: ! |2
1 -4.1623312328968973e+00 3.8386614428046357e+01 4.8751961502428443e+01
2 2.3627361581160311e+01 1.9437613549333786e+01 -2.7808992075045698e+01
3 -1.9523183463523988e+01 -5.0755464292132672e+01 -2.0167041215602033e+01
4 -4.2090793543049374e+00 1.1066643676095793e+00 -2.9972422908039085e+00
5 -1.3267826706072230e+00 -2.2204322651025663e+00 6.0778809239934031e+00
6 -7.1123146444528984e+01 7.7052674244983237e+01 6.6070828458754377e+01
7 1.0820695183752402e-01 -2.1456209303205753e+01 -1.2988794014127086e+02
8 2.7685557706153210e+00 -6.4055292922227114e+00 3.5054112799000308e+01
9 1.0385287876594045e+01 1.1200082574985384e+01 4.5981266271691283e+01
10 4.8483646678620808e+01 -6.2863078092157814e+01 -1.7919415564214969e+01
11 -1.1854585526102190e+00 -3.0186873903081461e+00 -4.9190342962819997e+00
12 8.7532668786692849e+00 4.0320399320855103e+00 -3.6940200610553369e+00
13 4.4340021275893049e+00 -1.7594799545276503e+00 -8.0344014115374854e-02
14 -1.8210427053902465e+00 3.6741358935389795e-01 -4.6918194401673006e+00
15 -1.0513684115705089e-01 4.6130019283969581e+00 1.6347276488933093e+00
16 4.1042300863600815e+01 -3.2293537348976294e+01 -9.0261473702885723e+01
17 -3.6114856830930577e+01 2.4604092710226865e+01 9.8841500263570012e+01
18 -1.8830057555437815e-02 -3.1807694496772947e-02 2.8355454534004447e-02
19 2.6053607178351323e-04 -1.3620418845373267e-04 1.2427459444534828e-03
20 -7.4132921210516805e-04 -7.5129738985115445e-04 2.4973630220728152e-04
21 -1.0785432870565986e+01 -1.2742946265488097e+01 3.6432133538627276e+01
22 -1.7555577697607394e+01 -4.2541329162364496e+00 -2.7543137610931119e+01
23 2.8333543503091875e+01 1.7005758896986869e+01 -8.8808421884931406e+00
24 6.9230417127829202e+00 -3.3463292262284696e+01 1.8600914290859674e+01
25 -2.4509700096241421e+01 3.9444180063920515e+00 -2.0606959828990203e+01
26 1.7575838201618030e+01 2.9510218159180141e+01 1.9863483973633074e+00
27 6.6485844671195089e+00 -3.6337865162938726e+01 1.3616306220323644e+01
28 -2.7672101461511541e+01 1.1892759906164907e+01 -1.8723455368858552e+01
29 2.1029504459272502e+01 2.4449997447911123e+01 5.1038895464304854e+00
run_vdwl: 120.389680224171
run_coul: 0
run_stress: ! |2-
2.5557166389926206e+02 2.5949417167124227e+02 3.7925104786399675e+02 -5.4331393627941310e+01 2.7328919467287310e+01 4.1740569884135837e+01
run_forces: ! |2
1 -9.5102708897346455e-01 3.5351062606429096e+01 3.9457733214248897e+01
2 1.8087890515496976e+01 1.4881434680716316e+01 -2.0866808731191739e+01
3 -1.9025508531664734e+01 -4.1963948953355988e+01 -1.6664473721320441e+01
4 -3.9859936185258591e+00 1.0788564827143394e+00 -2.9029989743807403e+00
5 -1.2023708529709598e+00 -2.0086879656199623e+00 5.6818744336161462e+00
6 -6.0409772126459337e+01 6.4308106551875014e+01 4.2296815285620539e+01
7 9.3621550069352033e-01 -1.7314144864058704e+01 -9.7141526659041332e+01
8 8.4374361809492626e-01 -3.2803089626972723e+00 3.3704954165999396e+01
9 8.3054222825151562e+00 8.6081913892167101e+00 3.6111642840146494e+01
10 4.2561465006293496e+01 -5.5914110438197461e+01 -1.7451020505581198e+01
11 -1.1800071294153933e+00 -2.7475347695713208e+00 -4.5818357717762055e+00
12 8.4355441219410157e+00 3.9902239161298425e+00 -4.1474152018012402e+00
13 4.1920543033657660e+00 -1.5869427440184440e+00 -6.2698395028072312e-02
14 -1.6199437861441099e+00 2.6216625984075043e-01 -4.1331730392715746e+00
15 -2.0331861757557249e-01 4.5411724061177665e+00 1.7063136735856890e+00
16 3.3204342242339152e+01 -2.7557624751669067e+01 -6.8101189912981496e+01
17 -2.7956860933621105e+01 1.9379541761121082e+01 7.7078954287050578e+01
18 -1.8741424461778945e-02 -3.1649884712668143e-02 2.8217417081434781e-02
19 1.9029936416168166e-04 -1.9563725068207617e-04 1.2476265945711711e-03
20 -6.5715774497830453e-04 -6.7847978231991518e-04 2.5322071517207300e-04
21 -9.1337259194023357e+00 -9.9740863798564536e+00 2.9985619540557138e+01
22 -1.4775512665496439e+01 -3.7890914376536640e+00 -2.2670107265406628e+01
23 2.3901611003748002e+01 1.3772048119294055e+01 -7.3071693693756625e+00
24 7.5921975362095528e+00 -2.9274148880351355e+01 1.7211334413645822e+01
25 -2.2853219834051913e+01 3.3601430585201730e+00 -1.9347508542196454e+01
26 1.5250009909775976e+01 2.5905316887603249e+01 2.1161976888390273e+00
27 5.7137029453806143e+00 -3.0279106879537387e+01 1.0695172767212116e+01
28 -2.2862798673549364e+01 9.8830244186589091e+00 -1.5214423020169862e+01
29 1.7155069074839023e+01 2.0400972490095437e+01 4.5160185346096364e+00
...

View File

@ -0,0 +1,90 @@
---
lammps_version: 21 Jul 2020
date_generated: Thu Jul 30 17:50:31 202
epsilon: 5e-14
prerequisites: ! |
atom full
pair lj96/cut
pre_commands: ! ""
post_commands: ! |
pair_modify mix arithmetic
input_file: in.fourmol
pair_style: lj96/cut 8.0
pair_coeff: ! |
1 1 0.03375 2.5
2 2 0.0084375 1
2 4 0.0084375 0.5
3 3 0.03375 3.2
4 4 0.0253125 3.1
5 5 0.0253125 3.1
extract: ! ""
natoms: 29
init_vdwl: 112.146791176334
init_coul: 0
init_stress: ! |2-
2.7158278777258107e+02 2.7440178205574091e+02 5.0791544617614926e+02 -7.4064553668076726e+01 1.5914543736637080e+01 6.4534029091470870e+01
init_forces: ! |2
1 -3.3777973593212809e+00 3.5545635438901954e+01 4.4314877326597234e+01
2 2.1246234898362292e+01 1.7476299423941875e+01 -2.5004215116563586e+01
3 -1.7927412817149385e+01 -4.9190396814315186e+01 -1.8896792785801519e+01
4 -2.2072043093017770e+00 5.6842818236266046e-01 -1.5742728020277861e+00
5 -7.0744981952807140e-01 -1.1922469268168869e+00 3.2437916035884831e+00
6 -8.6998267867026087e+01 9.7764473706343594e+01 1.0202986522306712e+02
7 3.9192203160616295e+00 -3.1196459404458086e+01 -1.6755500605471892e+02
8 1.0139684351085185e+01 -9.5490259386372500e+00 4.1301764730680418e+01
9 9.9859714866559290e+00 1.0771120636870165e+01 4.4213809582690985e+01
10 5.7818139733358116e+01 -6.9212661516922012e+01 -2.0461125385983994e+01
11 -6.2546377610776427e-01 -1.6067042936894926e+00 -2.6099632289340895e+00
12 4.7897264025969228e+00 2.3727904946045775e+00 -2.0472597104356356e+00
13 2.2916772472287570e+00 -9.1302577057923795e-01 -3.9825164685891618e-02
14 -9.5096714582282216e-01 1.9180313565563914e-01 -2.4414141103510900e+00
15 -4.9279341465817569e-02 2.3995669963138120e+00 8.4564728773676301e-01
16 4.8376700948044835e+01 -3.5754311268858402e+01 -1.1815109107161469e+02
17 -4.5689033351786698e+01 3.1549948855298439e+01 1.2281501700916789e+02
18 -1.7514642520770635e-02 -3.3311189388567079e-02 3.2078054477722696e-02
19 3.2652628216664009e-04 -5.1136464273309173e-04 2.5633332577917165e-03
20 -1.3444915196834763e-03 -1.4148545154393395e-03 6.1115167010809552e-04
21 -9.6598953585397211e+00 -1.1184810497697173e+01 3.1489525753831362e+01
22 -1.5114902822373411e+01 -3.6623747925443664e+00 -2.3714004395622915e+01
23 2.4761710640921983e+01 1.4862303459806434e+01 -7.7614857580049508e+00
24 5.5277946924940053e+00 -2.9228307700364422e+01 1.5836163373784084e+01
25 -2.0934231598109697e+01 3.3680636165303528e+00 -1.7602286256960230e+01
26 1.5393201782168342e+01 2.5846154974687341e+01 1.7391904339691853e+00
27 6.4971923893309373e+00 -3.1514490531631594e+01 1.2213590546072449e+01
28 -2.4531453852672385e+01 1.0543491079658937e+01 -1.6598700916460793e+01
29 1.8044637138654299e+01 2.0979972864085106e+01 4.3789473475744867e+00
run_vdwl: 85.3637858985071
run_coul: 0
run_stress: ! |2-
2.2754228627541102e+02 2.3244361909607221e+02 3.4720338018814073e+02 -6.2752907332006977e+01 2.0031328703307860e+01 4.5642299883984968e+01
run_forces: ! |2
1 -1.7102885069784018e-01 3.1533956108996044e+01 3.3930989107796911e+01
2 1.5242712436518843e+01 1.2559448850532041e+01 -1.7559550179061056e+01
3 -1.6411191452119652e+01 -3.9259275347259468e+01 -1.5175265603764856e+01
4 -2.1129024607003992e+00 5.5899779277359796e-01 -1.5412444123368652e+00
5 -6.5399311226949464e-01 -1.0992854083637122e+00 3.0847441904927702e+00
6 -6.6956140190141298e+01 7.0695358389850611e+01 4.4363555461094826e+01
7 3.2006694637513582e+00 -1.9015134117876272e+01 -9.4508817328761609e+01
8 4.3709804685094014e+00 -3.7828942844862610e+00 3.4420665964407604e+01
9 7.4255513265294741e+00 7.7714111044319969e+00 3.2469284047194634e+01
10 4.7868465571922641e+01 -5.7873993481240355e+01 -1.8445892867106085e+01
11 -6.4282354742693992e-01 -1.4901411864631078e+00 -2.4825345769459188e+00
12 4.6644382526129480e+00 2.3675273515613648e+00 -2.3210885143837441e+00
13 2.1755706764185181e+00 -8.2537435725404673e-01 -3.1764318332116126e-02
14 -8.4883782554397047e-01 1.3856669869330718e-01 -2.1638310551977069e+00
15 -9.8065086650338654e-02 2.4014804591867152e+00 8.9535982313950302e-01
16 3.1356115121770181e+01 -2.4553533117975913e+01 -7.1922364887796476e+01
17 -2.8374813038610231e+01 1.9897527415171968e+01 7.6971515508623952e+01
18 -1.7388092460317611e-02 -3.2978151143102555e-02 3.1978967188726254e-02
19 2.3207237645516519e-04 -5.8898238853603954e-04 2.5835874691380401e-03
20 -1.2239441378849943e-03 -1.3073743382692831e-03 6.0511915291252378e-04
21 -7.9294050694887739e+00 -8.5054797415804853e+00 2.5228413587702210e+01
22 -1.2417380443045314e+01 -3.1901494132514641e+00 -1.9020413060598994e+01
23 2.0333472638959208e+01 1.1711012905410914e+01 -6.1937024286615507e+00
24 6.6338736703656007e+00 -2.5347184037135683e+01 1.4941978068506790e+01
25 -1.9872316686870089e+01 2.8994801273220521e+00 -1.6817508030632830e+01
26 1.3225082814853838e+01 2.2433588031877850e+01 1.8484145884308429e+00
27 5.2058354737312715e+00 -2.5482655118182759e+01 9.2158010863084936e+00
28 -1.9559411413838472e+01 8.4316105041505196e+00 -1.3009506428903164e+01
29 1.4363921225681294e+01 1.7060008378980431e+01 3.7875945849736650e+00
...

View File

@ -0,0 +1,94 @@
---
lammps_version: 21 Jul 2020
date_generated: Fri Jul 31 12:10:52 202
epsilon: 5e-14
prerequisites: ! |
atom full
pair mie/cut
pre_commands: ! ""
post_commands: ! |
pair_modify mix arithmetic
input_file: in.fourmol
pair_style: mie/cut 8.0
pair_coeff: ! |
1 1 0.02 2.5 11.5 5.5
2 2 0.005 1.0 12.1 6.1
2 4 0.005 0.5 9.9 4.5
3 3 0.02 3.2 12.0 6.0
4 4 0.015 3.1 12.0 6.0
5 5 0.015 3.1 10.0 4.0
extract: ! |
epsilon 2
sigma 2
gamR 2
gamA 2
natoms: 29
init_vdwl: 572.65241169595
init_coul: 0
init_stress: ! |2-
1.5112451012221711e+03 1.6108090633309916e+03 3.6313538023188962e+03 -6.4519502381294672e+02 -7.6958115438443343e+01 5.2466156989449894e+02
init_forces: ! |2
1 -5.8786571485479342e+01 1.8079827320037572e+02 3.1108122148297724e+02
2 1.6574996599907652e+02 1.3639265892510775e+02 -1.9508174911047740e+02
3 -1.0556575177787515e+02 -3.0729492394021275e+02 -1.1643018530218110e+02
4 -6.9158847940436274e+00 1.8664536146166713e+00 -4.9177442130271061e+00
5 -2.2248911785940653e+00 -3.6055135301391625e+00 1.0645222793281134e+01
6 -6.4739901889394866e+02 7.4789819096880626e+02 8.8208297564676764e+02
7 4.2919652255963356e+01 -2.5769485911509145e+02 -1.3268558183204348e+03
8 8.9866897586934840e+01 -1.0626205537451992e+02 2.2132900964911838e+02
9 8.2981710277616131e+01 8.9392264033153111e+01 3.6724719266511363e+02
10 4.1798278249930138e+02 -4.7681101220557474e+02 -1.4267988158912885e+02
11 -2.0577291614058821e+00 -5.1770783338667874e+00 -8.4596450760102062e+00
12 1.2337038002060897e+01 6.4169814744056826e+00 -4.9357284141731874e+00
13 7.1191539550966878e+00 -2.8226358529509912e+00 -1.3071562684536020e-01
14 -2.9736757302518346e+00 6.0252756310798461e-01 -7.6831662329025932e+00
15 -1.7791849135049803e-01 7.4570683924340813e+00 2.6470427995260137e+00
16 3.5794281297583314e+02 -2.5516822690129456e+02 -9.2142059046624001e+02
17 -3.5076369676215467e+02 2.4403684457822652e+02 9.3354755530799275e+02
18 -1.8951126964912624e-02 -3.3993774502566194e-02 3.1533886412968185e-02
19 3.8800476434765256e-04 -2.7384118126890476e-04 1.9063062358782470e-03
20 -1.0827812240089239e-03 -1.1248902198540479e-03 4.6233482511654996e-04
21 -2.9561501874580159e+01 -3.3892173691417348e+01 9.4342070297487950e+01
22 -4.5192259597879939e+01 -1.0951488661627819e+01 -7.0902011595602801e+01
23 7.4740580624735912e+01 4.4858870593803836e+01 -2.3426093582270489e+01
24 1.5723489061598853e+01 -8.8155103130920935e+01 4.7060897039215362e+01
25 -6.2263260825297202e+01 1.0021822827689149e+01 -5.2346230791335181e+01
26 4.6527181452726950e+01 7.8119145678909035e+01 5.2589263025731130e+00
27 2.0888442237096100e+01 -9.4688431023944986e+01 3.7478527939720465e+01
28 -7.4711699859811475e+01 3.2108421478054176e+01 -5.0551006653560087e+01
29 5.3833799408056237e+01 6.2589370938775232e+01 1.3066022522941514e+01
run_vdwl: 131.819620520303
run_coul: 0
run_stress: ! |2-
5.2376360693642835e+02 5.7808495843346577e+02 4.5321969785624492e+02 -2.2533910749543824e+02 2.5446238074471928e+01 9.3000624407488445e+01
run_forces: ! |2
1 1.5269882261159061e+01 8.5457734305401502e+01 6.0203135045526906e+01
2 1.7309256021708190e+01 1.3327906939297119e+01 -2.0973172027242693e+01
3 -1.1348668391073240e+02 -1.6907934425683319e+01 8.8304974127351166e+00
4 -7.2611685656686955e+00 2.5440247467996895e+00 -5.2310253850736599e+00
5 -1.6331788851006233e+00 -2.4563580828052327e+00 9.1291658252154164e+00
6 -3.6304751097556647e+01 3.5989039476331882e+01 -6.1606249993575794e+01
7 4.4576729445436856e+00 -1.3824126675019009e+01 -5.7320638969633400e+01
8 -1.2611247591832864e+01 1.9534487230325507e+01 7.5227958247422706e+01
9 9.2896774614026967e+00 1.0731713246245308e+01 4.1288720638654937e+01
10 9.4327776819515861e+01 -1.0894475298691272e+02 -5.8475394508772112e+01
11 -4.5695652120382260e+00 -6.5415420663552508e+00 -1.2704215257635372e+01
12 1.0795905949967926e+01 7.6703950291745073e+00 -5.7682240949128900e+00
13 6.4628140331599777e+00 -2.4523641841992529e+00 -9.5484896445262660e-02
14 -2.4700568763322290e+00 3.9611003778965026e-01 -6.3058734689697280e+00
15 -3.3806295897988964e-01 7.1471351946850925e+00 2.6960805597741961e+00
16 4.0160220118648304e+01 -4.5015800901539421e+01 -2.2343490283291196e+01
17 -1.9362591683165103e+01 1.3367106544264416e+01 5.3433992362426636e+01
18 -1.8269471792509578e-02 -3.2492174873532322e-02 3.0338390664931467e-02
19 3.2503350050501191e-04 -2.8639278101074735e-04 1.8513053603820379e-03
20 -9.6205495509295920e-04 -1.0114694627461503e-03 4.4443061856092806e-04
21 -1.2403203032317574e+01 -1.3904861539263642e+01 4.2624743908416868e+01
22 -2.0606176232885055e+01 -5.1765533341392338e+00 -3.2178356967253826e+01
23 3.2995214962355504e+01 1.9097540785043826e+01 -1.0431241015469915e+01
24 1.2353976144502097e+01 -4.1826884116759601e+01 2.5796189871409752e+01
25 -3.3536020084019192e+01 5.3434177835053038e+00 -2.8542923861815211e+01
26 2.1168768190727246e+01 3.6468979949788483e+01 2.7194251563161034e+00
27 6.7596879628888722e+00 -4.2934067896212120e+01 1.4454254639022803e+01
28 -3.0946671037079934e+01 1.3715958306415276e+01 -2.0695277777595567e+01
29 2.4197430790376114e+01 2.9227486670938596e+01 6.2347707141212778e+00
...

View File

@ -25,6 +25,24 @@ using ::testing::EndsWith;
using ::testing::Eq; using ::testing::Eq;
using ::testing::StrEq; using ::testing::StrEq;
TEST(Utils, trim)
{
auto trimmed = utils::trim("\t some text");
ASSERT_THAT(trimmed, StrEq("some text"));
trimmed = utils::trim("some text \r\n");
ASSERT_THAT(trimmed, StrEq("some text"));
trimmed = utils::trim("\v some text \f");
ASSERT_THAT(trimmed, StrEq("some text"));
trimmed = utils::trim(" some\t text ");
ASSERT_THAT(trimmed, StrEq("some\t text"));
trimmed = utils::trim(" \t\n ");
ASSERT_THAT(trimmed, StrEq(""));
}
TEST(Utils, trim_comment) TEST(Utils, trim_comment)
{ {
auto trimmed = utils::trim_comment("some text # comment"); auto trimmed = utils::trim_comment("some text # comment");