convert fix ttm and fix ttm/mod to use tokenizer class for parsing files
This commit is contained in:
@ -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,7 +42,7 @@ 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),
|
T_initial_set(NULL), gfactor1(NULL), gfactor2(NULL), ratio(NULL),
|
||||||
flangevin(NULL), T_electron(NULL), T_electron_old(NULL), sum_vsq(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),
|
sum_mass_vsq(NULL), sum_vsq_all(NULL), sum_mass_vsq_all(NULL),
|
||||||
@ -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,8 +108,11 @@ 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");
|
||||||
@ -149,7 +145,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 (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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,36 +325,52 @@ 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];
|
memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(double));
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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");
|
error->one(FLERR,"Initial temperatures not all set in fix ttm");
|
||||||
|
|
||||||
// close file
|
|
||||||
|
|
||||||
fclose(fpr);
|
fclose(fpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -525,15 +537,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -53,8 +53,9 @@ class FixTTM : public Fix {
|
|||||||
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;
|
||||||
|
bigint total_nnodes;
|
||||||
int ***nsum;
|
int ***nsum;
|
||||||
int ***nsum_all,***T_initial_set;
|
int ***nsum_all,***T_initial_set;
|
||||||
double *gfactor1,*gfactor2,*ratio;
|
double *gfactor1,*gfactor2,*ratio;
|
||||||
@ -67,7 +68,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 *);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
@ -82,26 +83,15 @@ 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) {
|
||||||
@ -116,121 +106,11 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
char linee[MAXLINE];
|
|
||||||
double tresh_d;
|
read_parameters(arg[4]);
|
||||||
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)
|
// 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;
|
||||||
@ -279,9 +159,8 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
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 (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);
|
||||||
fclose(fpr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -488,33 +367,197 @@ 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,line,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,line,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,line,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,line,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,line,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,line,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,line,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,line,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,line,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,line,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,line,true,lmp);
|
||||||
|
|
||||||
|
// v0
|
||||||
|
|
||||||
|
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
|
||||||
|
utils::sfgets(FLERR,line,MAXLINE,fpr,filename,error);
|
||||||
|
v_0 = utils::numeric(FLERR,line,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,line,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,line,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,line,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,line,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,line,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,line,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,line,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,line,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,line,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,line,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];
|
memset(&T_initial_set[0][0][0],0,total_nnodes*sizeof(double));
|
||||||
for (int ixnode = 0; ixnode < nxnodes; ixnode++)
|
|
||||||
for (int iynode = 0; iynode < nynodes; iynode++)
|
std::string name = utils::get_potential_file_path(filename);
|
||||||
for (int iznode = 0; iznode < nznodes; iznode++)
|
if (name.empty())
|
||||||
T_initial_set[ixnode][iynode][iznode] = 0;
|
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;
|
||||||
}
|
}
|
||||||
for (int ixnode = 0; ixnode < nxnodes; ixnode++)
|
fclose(fpr);
|
||||||
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");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|||||||
@ -79,7 +79,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 *);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user