diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..02b13c8ee5 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +.gitattributes export-ignore +.gitignore export-ignore +.github export-ignore diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index f505057b6c..cc4c1cc905 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -747,6 +747,12 @@ if (${_index} GREATER -1) endif() message(STATUS "<<< Linker flags: >>>") 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) message(STATUS "Executable linker flags: ${CMAKE_EXE_LINKER_FLAGS}") endif() diff --git a/cmake/Modules/Testing.cmake b/cmake/Modules/Testing.cmake index a36067938f..29f8b61802 100644 --- a/cmake/Modules/Testing.cmake +++ b/cmake/Modules/Testing.cmake @@ -16,6 +16,33 @@ if(ENABLE_TESTING) set(MEMORYCHECK_COMMAND "${VALGRIND_BINARY}" CACHE FILEPATH "Memory Check Command") 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) enable_testing() diff --git a/doc/src/Build_development.rst b/doc/src/Build_development.rst index 6b72a73cd0..1569723357 100644 --- a/doc/src/Build_development.rst +++ b/doc/src/Build_development.rst @@ -259,6 +259,23 @@ and working. of mis-compiled code (or an undesired large loss of precision due 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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 9aa5954986..2bf3e917cf 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -236,6 +236,7 @@ bilayer bilayers binsize binstyle +binutils biomolecular biomolecule Biomolecules diff --git a/lib/gpu/geryon/ocl_device.h b/lib/gpu/geryon/ocl_device.h index e414e7b69c..10e84a436a 100644 --- a/lib/gpu/geryon/ocl_device.h +++ b/lib/gpu/geryon/ocl_device.h @@ -625,9 +625,9 @@ int UCL_Device::set_platform_accelerator(int pid) { for (int n=0; n<_num_platforms; n++) { set_platform(n); for (int i=0; iall(FLERR,"Illegal fix ttm command"); @@ -67,14 +68,6 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : nxnodes = force->inumeric(FLERR,arg[10]); nynodes = force->inumeric(FLERR,arg[11]); 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]); if (nfileevery) { @@ -115,12 +108,14 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : gfactor2 = new double[atom->ntypes+1]; // 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_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_mass_vsq,nxnodes,nynodes,nznodes,"ttm:sum_mass_vsq"); 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 - 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); } @@ -157,7 +152,7 @@ FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : FixTTM::~FixTTM() { - if (nfileevery && me == 0) fclose(fp); + if (fp) fclose(fp); delete random; @@ -166,7 +161,6 @@ FixTTM::~FixTTM() memory->destroy(nsum); memory->destroy(nsum_all); - memory->destroy(T_initial_set); memory->destroy(sum_vsq); memory->destroy(sum_mass_vsq); memory->destroy(sum_vsq_all); @@ -221,9 +215,9 @@ void FixTTM::init() void FixTTM::setup(int vflag) { - if (strstr(update->integrate_style,"verlet")) + if (utils::strmatch(update->integrate_style,"^verlet")) { post_force_setup(vflag); - else { + } else { ((Respa *) update->integrate)->copy_flevel_f(nlevels_respa-1); post_force_respa_setup(vflag,nlevels_respa-1,0); ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1); @@ -329,27 +323,48 @@ void FixTTM::reset_dt() 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++) - for (int iynode = 0; iynode < nynodes; iynode++) - 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 + char line[MAXLINE]; int ixnode,iynode,iznode; double T_tmp; while (1) { 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) error->one(FLERR,"Fix ttm electron temperatures must be > 0.0"); + T_electron[ixnode][iynode][iznode] = T_tmp; T_initial_set[ixnode][iynode][iznode] = 1; } + fclose(fpr); + + // check completeness of input data for (int ixnode = 0; ixnode < nxnodes; ixnode++) 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) error->one(FLERR,"Initial temperatures not all set in fix ttm"); - // close file - - fclose(fpr); + memory->destroy(T_initial_set); } /* ---------------------------------------------------------------------- */ @@ -463,7 +476,7 @@ void FixTTM::end_of_step() (T_electron_old[ixnode][iynode][right_znode] + T_electron_old[ixnode][iynode][left_znode] - 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], total_nnodes,MPI_DOUBLE,MPI_SUM,world); - if (me == 0) { + if (comm->me == 0) { fmt::print(fp,"{}",update->ntimestep); double T_a; @@ -525,15 +538,15 @@ void FixTTM::end_of_step() if (nsum_all[ixnode][iynode][iznode] > 0) T_a = sum_mass_vsq_all[ixnode][iynode][iznode]/ (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 iynode = 0; iynode < nynodes; iynode++) for (int iznode = 0; iznode < nznodes; iznode++) - fprintf(fp,"%f ",T_electron[ixnode][iynode][iznode]); - fprintf(fp,"\n"); + fmt::print(fp," {}",T_electron[ixnode][iynode][iznode]); + 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 ------------------------------------------------------------------------- */ @@ -582,7 +595,7 @@ double FixTTM::compute_vector(int n) electronic_density*del_vol; transfer_energy += net_energy_transfer_all[ixnode][iynode][iznode]*update->dt; - } + } if (n == 0) return e_energy; if (n == 1) return transfer_energy; diff --git a/src/MISC/fix_ttm.h b/src/MISC/fix_ttm.h index 9fbae2a418..76631dbf57 100644 --- a/src/MISC/fix_ttm.h +++ b/src/MISC/fix_ttm.h @@ -48,17 +48,15 @@ class FixTTM : public Fix { double compute_vector(int); private: - int me; int nfileevery; int nlevels_respa; int seed; class RanMars *random; - FILE *fp,*fpr; - int nxnodes,nynodes,nznodes,total_nnodes; - int ***nsum; - int ***nsum_all,***T_initial_set; - double *gfactor1,*gfactor2,*ratio; - double **flangevin; + FILE *fp; + int nxnodes,nynodes,nznodes; + bigint total_nnodes; + int ***nsum, ***nsum_all; + double *gfactor1,*gfactor2,*ratio,**flangevin; double ***T_electron,***T_electron_old; double ***sum_vsq,***sum_mass_vsq; double ***sum_vsq_all,***sum_mass_vsq_all; @@ -67,7 +65,7 @@ class FixTTM : public Fix { double electronic_thermal_conductivity; double gamma_p,gamma_s,v_0,v_0_sq; - void read_initial_electron_temperatures(); + void read_initial_electron_temperatures(const char *); }; } diff --git a/src/USER-MISC/fix_ttm_mod.cpp b/src/USER-MISC/fix_ttm_mod.cpp index 9051414d07..cd3fbaa721 100644 --- a/src/USER-MISC/fix_ttm_mod.cpp +++ b/src/USER-MISC/fix_ttm_mod.cpp @@ -34,6 +34,7 @@ #include "math_const.h" #include "utils.h" #include "fmt/format.h" +#include "tokenizer.h" using namespace LAMMPS_NS; using namespace FixConst; @@ -65,7 +66,12 @@ static const char cite_fix_ttm_mod[] = /* ---------------------------------------------------------------------- */ 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); @@ -82,32 +88,20 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) : if (seed <= 0) 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]); nynodes = force->inumeric(FLERR,arg[6]); nznodes = force->inumeric(FLERR,arg[7]); if (nxnodes <= 0 || nynodes <= 0 || nznodes <= 0) error->all(FLERR,"Fix ttm/mod number of nodes must be > 0"); - const char *filename = arg[8]; - FILE *fpr = force->open_potential(filename); - if (fpr == NULL) { - char str[128]; - snprintf(str,128,"Cannot open file %s",filename); - error->all(FLERR,str); - } + total_nnodes = (bigint)nxnodes * (bigint)nynodes * (bigint)nznodes; + if (total_nnodes > MAXSMALLINT) + error->all(FLERR,"Too many nodes in fix ttm/mod"); nfileevery = force->inumeric(FLERR,arg[9]); if (nfileevery > 0) { if (narg != 11) error->all(FLERR,"Illegal fix ttm/mod command"); - MPI_Comm_rank(world,&me); - if (me == 0) { + if (comm->me == 0) { fp = fopen(arg[10],"w"); if (fp == NULL) { char str[128]; @@ -116,121 +110,11 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) : } } } - char linee[MAXLINE]; - double tresh_d; - int tresh_i; - // C0 (metal) - 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) + + read_parameters(arg[4]); + + // t_surface is determined by electronic temperature (not constant) + t_surface_l = surface_l; mult_factor = intensity; duration = 0.0; @@ -255,7 +139,6 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) : total_nnodes = nxnodes*nynodes*nznodes; memory->create(nsum,nxnodes,nynodes,nznodes,"ttm/mod:nsum"); 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_mass_vsq,nxnodes,nynodes,nznodes,"ttm/mod:sum_mass_vsq"); 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"); flangevin = NULL; grow_arrays(atom->nmax); + // zero out the flangevin array + for (int i = 0; i < atom->nmax; i++) { flangevin[i][0] = 0; flangevin[i][1] = 0; flangevin[i][2] = 0; } + atom->add_callback(0); atom->add_callback(1); + // 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); - fclose(fpr); } /* ---------------------------------------------------------------------- */ FixTTMMod::~FixTTMMod() { - if (nfileevery && me == 0) fclose(fp); + if (fp) fclose(fp); delete random; + delete [] gfactor1; delete [] gfactor2; + memory->destroy(nsum); memory->destroy(nsum_all); - memory->destroy(T_initial_set); memory->destroy(sum_vsq); memory->destroy(sum_mass_vsq); memory->destroy(sum_vsq_all); @@ -328,16 +216,20 @@ void FixTTMMod::init() error->all(FLERR,"Cannot use non-periodic boundares with fix ttm/mod"); if (domain->triclinic) error->all(FLERR,"Cannot use fix ttm/mod with triclinic box"); + // set force prefactors + for (int i = 1; i <= atom->ntypes; i++) { gfactor1[i] = - gamma_p / force->ftm2v; gfactor2[i] = sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v; } + for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int iynode = 0; iynode < nynodes; iynode++) for (int iznode = 0; iznode < nznodes; iznode++) net_energy_transfer_all[ixnode][iynode][iznode] = 0; + if (strstr(update->integrate_style,"respa")) nlevels_respa = ((Respa *) update->integrate)->nlevels; } @@ -346,7 +238,7 @@ void FixTTMMod::init() void FixTTMMod::setup(int vflag) { - if (strstr(update->integrate_style,"verlet")) { + if (utils::strmatch(update->integrate_style,"^verlet")) { post_force_setup(vflag); } else { ((Respa *) update->integrate)->copy_flevel_f(nlevels_respa-1); @@ -365,13 +257,17 @@ void FixTTMMod::post_force(int /*vflag*/) int *type = atom->type; int *mask = atom->mask; int nlocal = atom->nlocal; + double dx = domain->xprd/nxnodes; double dy = domain->yprd/nynodes; double dz = domain->zprd/nynodes; double gamma1,gamma2; + // apply damping and thermostat to all atoms in fix group + for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { + double xscale = (x[i][0] - domain->boxlo[0])/domain->xprd; double yscale = (x[i][1] - domain->boxlo[1])/domain->yprd; 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 (iynode < 0) iynode += nynodes; while (iznode < 0) iznode += nznodes; + if (T_electron[ixnode][iynode][iznode] < 0) error->all(FLERR,"Electronic temperature dropped below zero"); + double tsqrt = sqrt(T_electron[ixnode][iynode][iznode]); + gamma1 = gfactor1[type[i]]; 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; @@ -455,7 +354,9 @@ void FixTTMMod::post_force_setup(int /*vflag*/) double **f = atom->f; int *mask = atom->mask; int nlocal = atom->nlocal; + // apply langevin forces that have been stored from previous run + for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { 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; } +/* ---------------------------------------------------------------------- + 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 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]; - for (int ixnode = 0; ixnode < nxnodes; ixnode++) - for (int iynode = 0; iynode < nynodes; iynode++) - for (int iznode = 0; iznode < nznodes; iznode++) - T_initial_set[ixnode][iynode][iznode] = 0; + int ***T_initial_set; + memory->create(T_initial_set,nxnodes,nynodes,nznodes,"ttm/mod:T_initial_set"); + memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(int)); + + 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 + + char line[MAXLINE]; int ixnode,iynode,iznode; double T_tmp; while (1) { if (fgets(line,MAXLINE,fpr) == NULL) break; - sscanf(line,"%d %d %d %lg",&ixnode,&iynode,&iznode,&T_tmp); - if (T_tmp < 0.0) error->one(FLERR,"Fix ttm/mod electron temperatures must be >= 0.0"); + 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) + error->one(FLERR,"Fix ttm electron temperatures must be > 0.0"); + T_electron[ixnode][iynode][iznode] = T_tmp; T_initial_set[ixnode][iynode][iznode] = 1; } + fclose(fpr); + + // check completeness of input data + for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int iynode = 0; iynode < nynodes; iynode++) for (int iznode = 0; iznode < nznodes; iznode++) 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 *mask = atom->mask; int nlocal = atom->nlocal; + if (movsur == 1){ for (int ixnode = 0; ixnode < nxnodes; ixnode++) 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 iznode = 0; iznode < nznodes; iznode++) net_energy_transfer[ixnode][iynode][iznode] = 0; + for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { 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]); } } + MPI_Allreduce(&net_energy_transfer[0][0][0], &net_energy_transfer_all[0][0][0], total_nnodes,MPI_DOUBLE,MPI_SUM,world); + double dx = domain->xprd/nxnodes; double dy = domain->yprd/nynodes; double dz = domain->zprd/nznodes; @@ -611,6 +692,7 @@ void FixTTMMod::end_of_step() } // num_inner_timesteps = # of inner steps (thermal solves) // required this MD step to maintain a stable explicit solve + int num_inner_timesteps = 1; double inner_dt = update->dt; 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)); } while (stability_criterion < 0.0); + // output nodal temperatures for current timestep + if ((nfileevery) && !(update->ntimestep % nfileevery)) { + // compute atomic Ta for each grid point + for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int iynode = 0; iynode < nynodes; iynode++) 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_mass_vsq_all[ixnode][iynode][iznode] = 0.0; } + double massone; for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { @@ -755,36 +842,39 @@ void FixTTMMod::end_of_step() sum_vsq[ixnode][iynode][iznode] += vsq; sum_mass_vsq[ixnode][iynode][iznode] += massone*vsq; } + MPI_Allreduce(&nsum[0][0][0],&nsum_all[0][0][0],total_nnodes, MPI_INT,MPI_SUM,world); MPI_Allreduce(&sum_vsq[0][0][0],&sum_vsq_all[0][0][0],total_nnodes, MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&sum_mass_vsq[0][0][0],&sum_mass_vsq_all[0][0][0], total_nnodes,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&t_surface_l,&surface_l, - 1,MPI_INT,MPI_MIN,world); - if (me == 0) { + MPI_Allreduce(&t_surface_l,&surface_l,1,MPI_INT,MPI_MIN,world); + + if (comm->me == 0) { fmt::print(fp,"{}",update->ntimestep); + double T_a; for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int iynode = 0; iynode < nynodes; iynode++) for (int iznode = 0; iznode < nznodes; iznode++) { 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]/ (3.0*force->boltz*nsum_all[ixnode][iynode][iznode]/force->mvv2e); if (movsur == 1){ 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 iynode = 0; iynode < nynodes; iynode++) for (int iznode = 0; iznode < nznodes; iznode++) - fprintf(fp,"%f ",T_electron[ixnode][iynode][iznode]); - fprintf(fp,"\n"); + fmt::print(fp," {}",T_electron[ixnode][iynode][iznode]); + fputs("\n",fp); } } } @@ -817,10 +907,12 @@ double FixTTMMod::compute_vector(int n) { double e_energy = 0.0; double transfer_energy = 0.0; + double dx = domain->xprd/nxnodes; double dy = domain->yprd/nynodes; double dz = domain->zprd/nznodes; double del_vol = dx*dy*dz; + for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int iynode = 0; iynode < nynodes; iynode++) for (int iznode = 0; iznode < nznodes; iznode++) { @@ -828,6 +920,7 @@ double FixTTMMod::compute_vector(int n) transfer_energy += net_energy_transfer_all[ixnode][iynode][iznode]*update->dt; } + if (n == 0) return e_energy; if (n == 1) return transfer_energy; return 0.0; @@ -841,17 +934,21 @@ void FixTTMMod::write_restart(FILE *fp) { double *rlist; memory->create(rlist,nxnodes*nynodes*nznodes+1,"ttm/mod:rlist"); + int n = 0; rlist[n++] = seed; + for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int iynode = 0; iynode < nynodes; iynode++) 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) { int size = n * sizeof(double); fwrite(&size,sizeof(int),1,fp); fwrite(rlist,sizeof(double),n,fp); } + memory->destroy(rlist); } @@ -863,12 +960,16 @@ void FixTTMMod::restart(char *buf) { int n = 0; double *rlist = (double *) buf; + // the seed must be changed from the initial seed + seed = static_cast (0.5*rlist[n++]); + for (int ixnode = 0; ixnode < nxnodes; ixnode++) for (int iynode = 0; iynode < nynodes; iynode++) for (int iznode = 0; iznode < nznodes; iznode++) T_electron[ixnode][iynode][iznode] = rlist[n++]; + delete random; 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) { double **extra = atom->extra; + // skip to Nth set of extra values + int m = 0; for (int i = 0; i < nth; i++) m += static_cast (extra[nlocal][m]); m++; + flangevin[nlocal][0] = extra[nlocal][m++]; flangevin[nlocal][1] = extra[nlocal][m++]; flangevin[nlocal][2] = extra[nlocal][m++]; diff --git a/src/USER-MISC/fix_ttm_mod.h b/src/USER-MISC/fix_ttm_mod.h index 21f6e57e04..84d976ec07 100644 --- a/src/USER-MISC/fix_ttm_mod.h +++ b/src/USER-MISC/fix_ttm_mod.h @@ -53,17 +53,15 @@ class FixTTMMod : public Fix { double compute_vector(int); private: - int me; int nfileevery; int nlevels_respa; int seed; class RanMars *random; FILE *fp; - int nxnodes,nynodes,nznodes,total_nnodes; - int ***nsum; - int ***nsum_all,***T_initial_set; - double *gfactor1,*gfactor2,*ratio; - double **flangevin; + int nxnodes,nynodes,nznodes; + bigint total_nnodes; + int ***nsum, ***nsum_all; + double *gfactor1,*gfactor2,*ratio,**flangevin; double ***T_electron,***T_electron_old,***T_electron_first; double ***sum_vsq,***sum_mass_vsq; double ***sum_vsq_all,***sum_mass_vsq_all; @@ -79,7 +77,8 @@ class FixTTMMod : public Fix { double electron_temperature_min; el_heat_capacity_thermal_conductivity el_properties(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 *); }; } diff --git a/src/utils.cpp b/src/utils.cpp index 7e1229dc0f..3369f684ba 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -348,6 +348,19 @@ tagint utils::tnumeric(const char *file, int line, const char *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 ------------------------------------------------------------------------- */ diff --git a/src/utils.h b/src/utils.h index 91001c0fb0..9762087ca4 100644 --- a/src/utils.h +++ b/src/utils.h @@ -143,6 +143,13 @@ namespace LAMMPS_NS { tagint tnumeric(const char *file, int line, const char *str, 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 * \param line string that should be trimmed diff --git a/unittest/force-styles/tests/mol-pair-born.yaml b/unittest/force-styles/tests/mol-pair-born.yaml new file mode 100644 index 0000000000..ed7b5976b0 --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-born.yaml @@ -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 +... diff --git a/unittest/force-styles/tests/mol-pair-buck.yaml b/unittest/force-styles/tests/mol-pair-buck.yaml new file mode 100644 index 0000000000..5421ba43e2 --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-buck.yaml @@ -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 +... diff --git a/unittest/force-styles/tests/mol-pair-lj96_cut.yaml b/unittest/force-styles/tests/mol-pair-lj96_cut.yaml new file mode 100644 index 0000000000..b2d6102199 --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-lj96_cut.yaml @@ -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 +... diff --git a/unittest/force-styles/tests/mol-pair-mie_cut.yaml b/unittest/force-styles/tests/mol-pair-mie_cut.yaml new file mode 100644 index 0000000000..c766f0041c --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-mie_cut.yaml @@ -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 +... diff --git a/unittest/utils/test_utils.cpp b/unittest/utils/test_utils.cpp index 22a647f460..08aa5df1ff 100644 --- a/unittest/utils/test_utils.cpp +++ b/unittest/utils/test_utils.cpp @@ -25,6 +25,24 @@ using ::testing::EndsWith; using ::testing::Eq; 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) { auto trimmed = utils::trim_comment("some text # comment");