diff --git a/src/fix_ttm.cpp b/src/fix_ttm.cpp new file mode 100644 index 0000000000..7e44d56821 --- /dev/null +++ b/src/fix_ttm.cpp @@ -0,0 +1,474 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "mpi.h" +#include "math.h" +#include "string.h" +#include "stdlib.h" +#include "fix_ttm.h" +#include "atom.h" +#include "force.h" +#include "update.h" +#include "domain.h" +#include "region.h" +#include "respa.h" +#include "comm.h" +#include "random_mars.h" +#include "memory.h" +#include "error.h" + +#define MAX(A,B) ((A) > (B)) ? (A) : (B) + +#define MAXLINE 1024 + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +FixTTM::FixTTM(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + if (narg < 15) error->all("Illegal fix TTM command"); + + int seed = atoi(arg[3]); + electronic_specific_heat = atof(arg[4]); + electronic_density = atof(arg[5]); + electronic_thermal_conductivity = atof(arg[6]); + gamma_p = atof(arg[7]); + gamma_s = atof(arg[8]); + v_0 = atof(arg[9]); + nxnodes = atoi(arg[10]); + nynodes = atoi(arg[11]); + nznodes = atoi(arg[12]); + + fpr = fopen(arg[13],"r"); + if (fpr == NULL) { + char str[128]; + sprintf(str,"Cannot open file %s",arg[13]); + error->one(str); + } + + nfileevery = atoi(arg[14]); + + if (nfileevery) { + if (narg != 16) error->all("Illegal fix ttm command"); + MPI_Comm_rank(world,&me); + if (me == 0) { + fp = fopen(arg[15],"w"); + if (fp == NULL) { + char str[128]; + sprintf(str,"Cannot open fix ttm file %s",arg[15]); + error->one(str); + } + } + } + + if (seed <= 0) error->all("Fix TTM seed must be >= 0"); + if (electronic_specific_heat <= 0.0) error->all("Fix TTM electronic_specific_heat must be > 0.0"); + if (electronic_density <= 0.0) error->all("Fix TTM electronic_density must be > 0.0"); + if (electronic_thermal_conductivity < 0.0) error->all("Fix TTM electronic_thermal_conductivity must be >= 0.0"); + if (gamma_p <= 0.0) error->all("Fix TTM gamma_p must be > 0.0"); + if (gamma_s < 0.0) error->all("Fix TTM gamma_s must be >= 0.0"); + if (v_0 < 0.0) error->all("Fix TTM v_0 must be >= 0.0"); + v_0_sq = v_0*v_0; + if ((nxnodes <= 0) or (nynodes <= 0) or (nznodes <= 0)) error->all("Fix TTM nnodes must be > 0"); + + nsum = nsum_prime = nsum_all = nsum_prime_all = T_initial_set = NULL; + sum_vsq = sum_vsq_prime = sum_mass_vsq = sum_mass_vsq_prime = sum_vsq_all = sum_vsq_prime_all = NULL; + sum_mass_vsq_all = sum_mass_vsq_prime_all = T_electron_old = T_electron = T_a = T_a_prime = g_s = g_p = NULL; + + // initialize Marsaglia RNG with processor-unique seed + + random = new RanMars(lmp,seed + comm->me); + + // allocate per-type arrays for force prefactors + + gfactor1 = new double[atom->ntypes+1]; + gfactor2 = new double[atom->ntypes+1]; + + total_nnodes = nxnodes*nynodes*nznodes; +} + +/* ---------------------------------------------------------------------- */ + +FixTTM::~FixTTM() +{ + if (nfileevery && me == 0) fclose(fp); + + delete random; + delete [] gfactor1; + delete [] gfactor2; + + memory->destroy_3d_int_array(nsum); + memory->destroy_3d_int_array(nsum_prime); + memory->destroy_3d_int_array(nsum_all); + memory->destroy_3d_int_array(nsum_prime_all); + memory->destroy_3d_int_array(T_initial_set); + memory->destroy_3d_double_array(sum_vsq); + memory->destroy_3d_double_array(sum_vsq_prime); + memory->destroy_3d_double_array(sum_mass_vsq); + memory->destroy_3d_double_array(sum_mass_vsq_prime); + memory->destroy_3d_double_array(sum_vsq_all); + memory->destroy_3d_double_array(sum_vsq_prime_all); + memory->destroy_3d_double_array(sum_mass_vsq_all); + memory->destroy_3d_double_array(sum_mass_vsq_prime_all); + memory->destroy_3d_double_array(T_electron_old); + memory->destroy_3d_double_array(T_electron); + memory->destroy_3d_double_array(T_a); + memory->destroy_3d_double_array(T_a_prime); + memory->destroy_3d_double_array(g_s); + memory->destroy_3d_double_array(g_p); +} + +/* ---------------------------------------------------------------------- */ + +int FixTTM::setmask() +{ + int mask = 0; + mask |= POST_FORCE; + mask |= POST_FORCE_RESPA; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixTTM::init() +{ + if (atom->mass == NULL) + error->all("Cannot use fix TTM without per-type mass defined"); + + // 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; + } + + if (strcmp(update->integrate_style,"respa") == 0) + nlevels_respa = ((Respa *) update->integrate)->nlevels; + + // allocate memory for 3d vectors + nsum = memory->create_3d_int_array(nxnodes,nynodes,nznodes,"TTM:nsum"); + nsum_prime = memory->create_3d_int_array(nxnodes,nynodes,nznodes,"TTM:nsum_prime"); + nsum_all = memory->create_3d_int_array(nxnodes,nynodes,nznodes,"TTM:nsum_all"); + nsum_prime_all = memory->create_3d_int_array(nxnodes,nynodes,nznodes,"TTM:nsum_prime_all"); + T_initial_set = memory->create_3d_int_array(nxnodes,nynodes,nznodes,"TTM:T_initial_set"); + sum_vsq = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:sum_vsq"); + sum_vsq_prime = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:sum_vsq_prime"); + sum_mass_vsq = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:sum_mass_vsq"); + sum_mass_vsq_prime = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:sum_mass_vsq_prime"); + sum_vsq_all = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:sum_vsq_all"); + sum_vsq_prime_all = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:sum_vsq_prime_all"); + sum_mass_vsq_all = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:sum_mass_vsq_all"); + sum_mass_vsq_prime_all = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:sum_mass_vsq_prime_all"); + T_electron_old = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:T_electron_old"); + T_electron = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:T_electron"); + T_a = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:T_a"); + T_a_prime = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:T_a_prime"); + g_s = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:g_s"); + g_p = memory->create_3d_double_array(nxnodes,nynodes,nznodes,"TTM:g_p"); + + // set initial electron temperatures from user-supplied file + + if (me == 0) read_initial_electron_temperatures(); + MPI_Bcast(&T_electron[0][0][0],total_nnodes,MPI_DOUBLE,0,world); +} + +/* ---------------------------------------------------------------------- + read in initial electron temperatures from a user-specified file + only called by proc 0 +------------------------------------------------------------------------- */ + +void FixTTM::read_initial_electron_temperatures() +{ + 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; + } + } + } + + // read initial electron temperature values from file + + 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->all("Fix TTM electron temperatures must be > 0.0"); + T_electron[ixnode][iynode][iznode] = T_tmp; + T_initial_set[ixnode][iynode][iznode] = 1; + } + + 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->all("All initial temperatures have not been set in the TTM fix."); + } + } + } + + // close file + + fclose(fpr); +} + +/* ---------------------------------------------------------------------- */ + +void FixTTM::setup(int vflag) +{ + if (strcmp(update->integrate_style,"verlet") == 0) + post_force(vflag); + else { + ((Respa *) update->integrate)->copy_flevel_f(nlevels_respa-1); + post_force_respa(vflag,nlevels_respa-1,0); + ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1); + } +} + +/* ---------------------------------------------------------------------- */ + +void FixTTM::post_force(int vflag) +{ + update_electron_temperatures(); + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + 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; + int ixnode = static_cast(xscale*nxnodes); + int iynode = static_cast(yscale*nynodes); + int iznode = static_cast(zscale*nznodes); + while (ixnode > nxnodes-1) ixnode -= nxnodes; + while (iynode > nynodes-1) iynode -= nynodes; + while (iznode > nznodes-1) iznode -= nznodes; + while (ixnode < 0) ixnode += nxnodes; + while (iynode < 0) iynode += nynodes; + while (iznode < 0) iznode += nznodes; + + 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; + gamma2 = gfactor2[type[i]] * tsqrt; + + f[i][0] += gamma1*v[i][0] + gamma2*(random->uniform()-0.5); + f[i][1] += gamma1*v[i][1] + gamma2*(random->uniform()-0.5); + f[i][2] += gamma1*v[i][2] + gamma2*(random->uniform()-0.5); + } + } +} + +/* ---------------------------------------------------------------------- */ + +void FixTTM::post_force_respa(int vflag, int ilevel, int iloop) +{ + if (ilevel == nlevels_respa-1) post_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixTTM::reset_dt() +{ + for (int i = 1; i <= atom->ntypes; i++) { + gfactor2[i] = sqrt(24.0*force->boltz*gamma_p/update->dt/force->mvv2e) / force->ftm2v; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixTTM::update_electron_temperatures() +{ + double **x = atom->x; + double **v = atom->v; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // compute atomic Ta, and Ta' (for high v atoms) for each node + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) { + for (int iynode = 0; iynode < nynodes; iynode++) { + for (int iznode = 0; iznode < nznodes; iznode++) { + nsum[ixnode][iynode][iznode] = 0; + nsum_prime[ixnode][iynode][iznode] = 0; + nsum_all[ixnode][iynode][iznode] = 0; + nsum_prime_all[ixnode][iynode][iznode] = 0; + sum_vsq[ixnode][iynode][iznode] = 0.0; + sum_vsq_prime[ixnode][iynode][iznode] = 0.0; + sum_mass_vsq[ixnode][iynode][iznode] = 0.0; + sum_mass_vsq_prime[ixnode][iynode][iznode] = 0.0; + sum_vsq_all[ixnode][iynode][iznode] = 0.0; + sum_vsq_prime_all[ixnode][iynode][iznode] = 0.0; + sum_mass_vsq_all[ixnode][iynode][iznode] = 0.0; + sum_mass_vsq_prime_all[ixnode][iynode][iznode] = 0.0; + } + } + } + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + double mass = atom->mass[type[i]]; + 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; + int ixnode = static_cast(xscale*nxnodes); + int iynode = static_cast(yscale*nynodes); + int iznode = static_cast(zscale*nznodes); + while (ixnode > nxnodes-1) ixnode -= nxnodes; + while (iynode > nynodes-1) iynode -= nynodes; + while (iznode > nznodes-1) iznode -= nznodes; + while (ixnode < 0) ixnode += nxnodes; + while (iynode < 0) iynode += nynodes; + while (iznode < 0) iznode += nznodes; + double vsq = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; + nsum[ixnode][iynode][iznode] += 1; + sum_vsq[ixnode][iynode][iznode] += vsq; + sum_mass_vsq[ixnode][iynode][iznode] += mass*vsq; + if (vsq > v_0_sq) { + nsum_prime[ixnode][iynode][iznode] += 1; + sum_vsq_prime[ixnode][iynode][iznode] += vsq; + sum_mass_vsq_prime[ixnode][iynode][iznode] += mass*vsq; + } + } + } + + double dx = domain->xprd/nxnodes; + double dy = domain->yprd/nynodes; + double dz = domain->zprd/nznodes; + double del_vol = dx*dy*dz; + + MPI_Allreduce(&nsum[0][0][0],&nsum_all[0][0][0],total_nnodes,MPI_INT,MPI_SUM,world); + MPI_Allreduce(&nsum_prime[0][0][0],&nsum_prime_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_vsq_prime[0][0][0],&sum_vsq_prime_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(&sum_mass_vsq_prime[0][0][0],&sum_mass_vsq_prime_all[0][0][0],total_nnodes,MPI_DOUBLE,MPI_SUM,world); + + double max_g_p = 0.0; + for (int ixnode = 0; ixnode < nxnodes; ixnode++) { + for (int iynode = 0; iynode < nynodes; iynode++) { + for (int iznode = 0; iznode < nznodes; iznode++) { + if (nsum_all[ixnode][iynode][iznode] > 0) { + T_a[ixnode][iynode][iznode] = sum_mass_vsq_all[ixnode][iynode][iznode]/ + (3*force->boltz*nsum_all[ixnode][iynode][iznode]/force->mvv2e); + double g_p_tmp = gamma_p*sum_vsq_all[ixnode][iynode][iznode]/ + T_a[ixnode][iynode][iznode]/del_vol; + max_g_p = MAX(max_g_p,g_p_tmp); + g_p[ixnode][iynode][iznode] = g_p_tmp; + } else { + T_a[ixnode][iynode][iznode] = 0; + g_p[ixnode][iynode][iznode] = 0; + } + if (nsum_prime_all[ixnode][iynode][iznode] > 0) { + T_a_prime[ixnode][iynode][iznode] = sum_mass_vsq_prime_all[ixnode][iynode][iznode]/ + (3*force->boltz*nsum_prime_all[ixnode][iynode][iznode]/force->mvv2e); + g_s[ixnode][iynode][iznode] = gamma_s*sum_vsq_prime_all[ixnode][iynode][iznode]/ + T_a_prime[ixnode][iynode][iznode]/del_vol; + } else { + T_a_prime[ixnode][iynode][iznode] = 0; + g_s[ixnode][iynode][iznode] = 0; + } + } + } + } + + // figure out how many inner steps (thermal solves) are required this MD timestep in order to maintain a stable explicit solve + int num_inner_timesteps = 1; + double inner_dt = update->dt; + double stability_criterion = 1.0 - 2.0*inner_dt/(electronic_specific_heat*electronic_density)* + (electronic_thermal_conductivity*(1/dx/dx + 1/dy/dy + 1/dz/dz) + 0.5*max_g_p); + if (stability_criterion < 0.0) { + inner_dt = 0.5*(electronic_specific_heat*electronic_density)/(electronic_thermal_conductivity*(1/dx/dx + 1/dy/dy + 1/dz/dz) + 0.5*max_g_p); + num_inner_timesteps = static_cast(update->dt/inner_dt) + 1; + inner_dt = update->dt/double(num_inner_timesteps); + if (num_inner_timesteps > 1e6) error->warning("In the TTM fix, trying to do more than a million inner timesteps!"); + } + + for (int ith_inner_timestep = 0; ith_inner_timestep < num_inner_timesteps; ith_inner_timestep++) { + + for (int ixnode = 0; ixnode < nxnodes; ixnode++) { + for (int iynode = 0; iynode < nynodes; iynode++) { + for (int iznode = 0; iznode < nznodes; iznode++) { + T_electron_old[ixnode][iynode][iznode] = T_electron[ixnode][iynode][iznode]; + } + } + } + + // compute new electron T profile + for (int ixnode = 0; ixnode < nxnodes; ixnode++) { + for (int iynode = 0; iynode < nynodes; iynode++) { + for (int iznode = 0; iznode < nznodes; iznode++) { + int right_xnode = ixnode + 1; + int right_ynode = iynode + 1; + int right_znode = iznode + 1; + if (right_xnode == nxnodes) right_xnode = 0; + if (right_ynode == nynodes) right_ynode = 0; + if (right_znode == nznodes) right_znode = 0; + int left_xnode = ixnode - 1; + int left_ynode = iynode - 1; + int left_znode = iznode - 1; + if (left_xnode == -1) left_xnode = nxnodes - 1; + if (left_ynode == -1) left_ynode = nynodes - 1; + if (left_znode == -1) left_znode = nznodes - 1; + T_electron[ixnode][iynode][iznode] = T_electron_old[ixnode][iynode][iznode] + + inner_dt/(electronic_specific_heat*electronic_density)*(electronic_thermal_conductivity* + ((T_electron_old[right_xnode][iynode][iznode] + T_electron_old[left_xnode][iynode][iznode] - 2*T_electron_old[ixnode][iynode][iznode])/dx/dx + + (T_electron_old[ixnode][right_ynode][iznode] + T_electron_old[ixnode][left_ynode][iznode] - 2*T_electron_old[ixnode][iynode][iznode])/dy/dy + + (T_electron_old[ixnode][iynode][right_znode] + T_electron_old[ixnode][iynode][left_znode] - 2*T_electron_old[ixnode][iynode][iznode])/dz/dz) + + g_p[ixnode][iynode][iznode]*(T_a[ixnode][iynode][iznode] - T_electron_old[ixnode][iynode][iznode]) + + g_s[ixnode][iynode][iznode]*T_a_prime[ixnode][iynode][iznode]); + } + } + } + } + + if (!(update->ntimestep % nfileevery) && (me == 0)) { + fprintf(fp,"%d ",update->ntimestep); + // print nodal temperatures for current timestep + 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_a[ixnode][iynode][iznode]); + } + } + } + fprintf(fp,"\t"); + 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"); + } +} diff --git a/src/fix_ttm.h b/src/fix_ttm.h new file mode 100644 index 0000000000..ecdd503793 --- /dev/null +++ b/src/fix_ttm.h @@ -0,0 +1,53 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifndef FIX_TTM_H +#define FIX_TTM_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixTTM : public Fix { + public: + FixTTM(class LAMMPS *, int, char **); + ~FixTTM(); + int setmask(); + void init(); + void read_initial_electron_temperatures(); + void setup(int); + void post_force(int); + void post_force_respa(int, int, int); + void reset_dt(); + void update_electron_temperatures(); + + private: + int me; + int nfileevery; + int nlevels_respa; + class RanMars *random; + FILE *fp, *fpr; + int nxnodes,nynodes,nznodes,total_nnodes; + int ***nsum, ***nsum_prime, ***nsum_all, ***nsum_prime_all, ***T_initial_set; + double *gfactor1,*gfactor2,*ratio; + double ***T_electron, ***T_a, ***T_a_prime, ***g_p, ***g_s; + double ***sum_vsq, ***sum_vsq_prime, ***sum_mass_vsq, ***sum_mass_vsq_prime; + double ***sum_vsq_all, ***sum_vsq_prime_all, ***sum_mass_vsq_all, ***sum_mass_vsq_prime_all; + double ***T_electron_old; + double electronic_specific_heat,electronic_density,electronic_thermal_conductivity; + double gamma_p,gamma_s,v_0,v_0_sq; +}; + +} + +#endif diff --git a/src/style.h b/src/style.h index c6bc3fecbb..8cd3a0ffcc 100644 --- a/src/style.h +++ b/src/style.h @@ -194,6 +194,7 @@ DumpStyle(xyz,DumpXYZ) #include "fix_temp_rescale.h" #include "fix_thermal_conductivity.h" #include "fix_tmd.h" +#include "fix_ttm.h" #include "fix_viscosity.h" #include "fix_viscous.h" #include "fix_wall_lj126.h" @@ -255,6 +256,7 @@ FixStyle(temp/berendsen,FixTempBerendsen) FixStyle(temp/rescale,FixTempRescale) FixStyle(thermal/conductivity,FixThermalConductivity) FixStyle(tmd,FixTMD) +FixStyle(ttm,FixTTM) FixStyle(viscosity,FixViscosity) FixStyle(viscous,FixViscous) FixStyle(wall/lj126,FixWallLJ126)