Skip to content

Commit

Permalink
Implement a seperate parser for the &scph field.
Browse files Browse the repository at this point in the history
  • Loading branch information
ttadano committed Nov 2, 2017
1 parent b64d1c3 commit 725383e
Show file tree
Hide file tree
Showing 3 changed files with 161 additions and 102 deletions.
255 changes: 153 additions & 102 deletions anphon/parsephon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,45 +91,45 @@ void Input::parce_input(int narg, char **arg)
error->exit("parse_input",
"&kpoint entry not found in the input file");
parse_kpoints();

if (phon->mode == "SCPH") {
if (!locate_tag("&scph"))
error->exit("parse_input",
"&scph entry not found in the input file");
parse_scph_vars();
}
}


void Input::parse_general_vars()
{
// Read input parameters in the &general-field.

int i;
int nsym, nbands, ismear, nkd;
unsigned int maxiter;
unsigned int nonanalytic;
unsigned int ialgo_scph;
double *masskd;
double Tmin, Tmax, dT, na_sigma, epsilon;
double emin, emax, delta_e;
double tolerance, tolerance_scph;
double mixalpha;
double tolerance;
double prec_ewald;
bool printsymmetry;
bool restart, restart_scph;
bool restart;
bool sym_time_reversal, use_triplet_symmetry;
bool selenergy_offdiagonal;
bool update_fc2;
bool lower_temp, warm_start;

struct stat st;
std::string prefix, mode, fcsinfo, fc2info;
std::string borninfo, file_result;
std::string file_dymat;
std::string *kdname;
std::string str_tmp;
std::string str_allowed_list = "PREFIX MODE NSYM TOLERANCE PRINTSYM FCSXML FC2XML TMIN TMAX DT \
NBANDS NONANALYTIC BORNINFO NA_SIGMA ISMEAR EPSILON EMIN EMAX DELTA_E \
RESTART TREVSYM NKD KD MASS TRISYM KMESH_SCPH KMESH_INTERPOLATE \
MIXALPHA MAXITER RESTART_SCPH IALGO SELF_OFFDIAG PREC_EWALD TOL_SCPH \
LOWER_TEMP WARMSTART";
RESTART TREVSYM NKD KD MASS TRISYM PREC_EWALD";
std::string str_no_defaults = "PREFIX MODE FCSXML NKD KD MASS";
std::vector<std::string> no_defaults, celldim_v;
std::vector<std::string> no_defaults;
std::vector<std::string> kdname_v, masskd_v;
std::vector<int> kmesh_v, kmesh_interpolate_v;
std::map<std::string, std::string> general_var_dict;

if (from_stdin) {
Expand Down Expand Up @@ -157,7 +157,6 @@ void Input::parse_general_vars()
mode = general_var_dict["MODE"];

file_result = prefix + ".result";
file_dymat = prefix + ".scph_dymat";

std::transform(mode.begin(), mode.end(), mode.begin(), toupper);
assign_val(nsym, "NSYM", general_var_dict);
Expand Down Expand Up @@ -202,7 +201,6 @@ void Input::parse_general_vars()
nonanalytic = 0;
nsym = 0;
tolerance = 1.0e-6;
tolerance_scph = 1.0e-10;
printsymmetry = false;
sym_time_reversal = false;
use_triplet_symmetry = true;
Expand All @@ -218,15 +216,6 @@ void Input::parse_general_vars()
restart = false;
}

// if file_dymat exists in the current directory,
// restart mode will be automatically turned on for SCPH calculations.

if (stat(file_dymat.c_str(), &st) == 0) {
restart_scph = true;
} else {
restart_scph = false;
}

nbands = -1;
borninfo = "";
fc2info = "";
Expand All @@ -235,13 +224,6 @@ void Input::parse_general_vars()
epsilon = 10.0;
na_sigma = 0.1;

maxiter = 1000;
mixalpha = 0.1;
selenergy_offdiagonal = true;
ialgo_scph = 0;
lower_temp = true;
warm_start = true;

// Assign given values

assign_val(Tmin, "TMIN", general_var_dict);
Expand All @@ -259,7 +241,6 @@ void Input::parse_general_vars()

assign_val(nonanalytic, "NONANALYTIC", general_var_dict);
assign_val(restart, "RESTART", general_var_dict);
assign_val(restart_scph, "RESTART_SCPH", general_var_dict);

assign_val(nbands, "NBANDS", general_var_dict);
assign_val(borninfo, "BORNINFO", general_var_dict);
Expand All @@ -269,18 +250,8 @@ void Input::parse_general_vars()
assign_val(epsilon, "EPSILON", general_var_dict);
assign_val(na_sigma, "NA_SIGMA", general_var_dict);


assign_val(use_triplet_symmetry, "TRISYM", general_var_dict);

assign_val(maxiter, "MAXITER", general_var_dict);
assign_val(mixalpha, "MIXALPHA", general_var_dict);
assign_val(selenergy_offdiagonal, "SELF_OFFDIAG", general_var_dict);
assign_val(ialgo_scph, "IALGO", general_var_dict);
assign_val(tolerance_scph, "TOL_SCPH", general_var_dict);
assign_val(lower_temp, "LOWER_TEMP", general_var_dict);
assign_val(warm_start, "WARMSTART", general_var_dict);

// Inserted part
if (nonanalytic == 3) {
assign_val(prec_ewald, "PREC_EWALD", general_var_dict);
if (prec_ewald <= 0.0 || prec_ewald >= 1.0) {
Expand All @@ -295,54 +266,6 @@ void Input::parse_general_vars()
} else {
ewald->is_longrange = 0;
}
// Inserted part end

str_tmp = general_var_dict["KMESH_SCPH"];

if (!str_tmp.empty()) {

std::istringstream is(str_tmp);

while (1) {
str_tmp.clear();
is >> str_tmp;
if (str_tmp.empty()) {
break;
}
kmesh_v.push_back(my_cast<unsigned int>(str_tmp));
}

if (kmesh_v.size() != 3) {
error->exit("parse_general_vars", "The number of entries for KMESH_SCPH has to be 3.");
}
} else {
if (mode == "SCPH") {
error->exit("parse_general_vars", "Please specify KMESH_SCPH for mode = SCPH");
}
}

str_tmp = general_var_dict["KMESH_INTERPOLATE"];
if (!str_tmp.empty()) {

std::istringstream is(str_tmp);

while (1) {
str_tmp.clear();
is >> str_tmp;
if (str_tmp.empty()) {
break;
}
kmesh_interpolate_v.push_back(my_cast<unsigned int>(str_tmp));
}

if (kmesh_interpolate_v.size() != 3) {
error->exit("parse_general_vars", "The number of entries for KMESH_INTERPOLATE has to be 3.");
}
} else {
if (mode == "SCPH") {
error->exit("parse_general_vars", "Please specify KMESH_INTERPOLATE for mode = SCPH");
}
}

if (nonanalytic > 3) {
error->exit("parse_general_vars", "NONANALYTIC-tag can take 0, 1, 2, or 3.");
Expand Down Expand Up @@ -394,26 +317,154 @@ void Input::parse_general_vars()
integration->ismear = ismear;
relaxation->use_triplet_symmetry = use_triplet_symmetry;

if (mode == "SCPH") {
for (i = 0; i < 3; ++i) {
scph->kmesh_scph[i] = kmesh_v[i];
scph->kmesh_interpolate[i] = kmesh_interpolate_v[i];
general_var_dict.clear();
}

void Input::parse_scph_vars()
{
// Read input parameters in the &scph-field.

int i;
unsigned int maxiter;
unsigned int ialgo_scph;
double tolerance_scph;
double mixalpha;
bool restart_scph;
bool selenergy_offdiagonal;
bool lower_temp, warm_start;

struct stat st;
std::string file_dymat;
std::string str_tmp;
std::string str_allowed_list = "KMESH_SCPH KMESH_INTERPOLATE MIXALPHA MAXITER RESTART_SCPH IALGO \
SELF_OFFDIAG TOL_SCPH LOWER_TEMP WARMSTART";
std::string str_no_defaults = "KMESH_SCPH KMESH_INTERPOLATE";
std::vector<std::string> no_defaults;
std::vector<int> kmesh_v, kmesh_interpolate_v;
std::map<std::string, std::string> scph_var_dict;

if (from_stdin) {
std::cin.ignore();
} else {
ifs_input.ignore();
}

get_var_dict(str_allowed_list, scph_var_dict);
#if _USE_BOOST
boost::split(no_defaults, str_no_defaults, boost::is_space());
#else
no_defaults = my_split(str_no_defaults, ' ');
#endif

for (auto it = no_defaults.begin(); it != no_defaults.end(); ++it) {
if (scph_var_dict.find(*it) == scph_var_dict.end()) {
error->exit("parse_general_vars",
"The following variable is not found in &scph input region: ",
(*it).c_str());
}
}

file_dymat = this->job_title + ".scph_dymat";

// Default values

tolerance_scph = 1.0e-10;
maxiter = 1000;
mixalpha = 0.1;
selenergy_offdiagonal = true;
ialgo_scph = 0;
lower_temp = true;
warm_start = true;

// if file_dymat exists in the current directory,
// restart mode will be automatically turned on for SCPH calculations.

if (stat(file_dymat.c_str(), &st) == 0) {
restart_scph = true;
} else {
restart_scph = false;
}

// Assign given values

assign_val(restart_scph, "RESTART_SCPH", scph_var_dict);
assign_val(maxiter, "MAXITER", scph_var_dict);
assign_val(mixalpha, "MIXALPHA", scph_var_dict);
assign_val(selenergy_offdiagonal, "SELF_OFFDIAG", scph_var_dict);
assign_val(ialgo_scph, "IALGO", scph_var_dict);
assign_val(tolerance_scph, "TOL_SCPH", scph_var_dict);
assign_val(lower_temp, "LOWER_TEMP", scph_var_dict);
assign_val(warm_start, "WARMSTART", scph_var_dict);

str_tmp = scph_var_dict["KMESH_SCPH"];

if (!str_tmp.empty()) {

std::istringstream is(str_tmp);

while (1) {
str_tmp.clear();
is >> str_tmp;
if (str_tmp.empty()) {
break;
}
kmesh_v.push_back(my_cast<unsigned int>(str_tmp));
}

if (kmesh_v.size() != 3) {
error->exit("parse_general_vars",
"The number of entries for KMESH_SCPH has to be 3.");
}
} else {
error->exit("parse_general_vars",
"Please specify KMESH_SCPH for mode = SCPH");
}

str_tmp = scph_var_dict["KMESH_INTERPOLATE"];
if (!str_tmp.empty()) {

std::istringstream is(str_tmp);

while (1) {
str_tmp.clear();
is >> str_tmp;
if (str_tmp.empty()) {
break;
}
kmesh_interpolate_v.push_back(my_cast<unsigned int>(str_tmp));
}
scph->mixalpha = mixalpha;
scph->maxiter = maxiter;
scph->restart_scph = restart_scph;
scph->selfenergy_offdiagonal = selenergy_offdiagonal;
scph->ialgo = ialgo_scph;
scph->tolerance_scph = tolerance_scph;
scph->lower_temp = lower_temp;
scph->warmstart_scph = warm_start;

if (kmesh_interpolate_v.size() != 3) {
error->exit("parse_general_vars",
"The number of entries for KMESH_INTERPOLATE has to be 3.");
}
} else {
error->exit("parse_general_vars",
"Please specify KMESH_INTERPOLATE for mode = SCPH");
}

// Copy the values to appropriate classes.

for (i = 0; i < 3; ++i) {
scph->kmesh_scph[i] = kmesh_v[i];
scph->kmesh_interpolate[i] = kmesh_interpolate_v[i];
}
scph->mixalpha = mixalpha;
scph->maxiter = maxiter;
scph->restart_scph = restart_scph;
scph->selfenergy_offdiagonal = selenergy_offdiagonal;
scph->ialgo = ialgo_scph;
scph->tolerance_scph = tolerance_scph;
scph->lower_temp = lower_temp;
scph->warmstart_scph = warm_start;

kmesh_v.clear();
kmesh_interpolate_v.clear();

general_var_dict.clear();
scph_var_dict.clear();
}


void Input::parse_analysis_vars(const bool use_default_values)
{
// Read input parameters in the &analysis field.
Expand Down
1 change: 1 addition & 0 deletions anphon/parsephon.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ namespace PHON_NS
int locate_tag(std::string);
void parse_general_vars();
void parse_analysis_vars(const bool);
void parse_scph_vars();
void parse_cell_parameter();
void parse_kpoints();
void get_var_dict(std::string, std::map<std::string, std::string> &);
Expand Down
7 changes: 7 additions & 0 deletions anphon/write_phonons.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,13 @@ void Writes::write_input_vars()
std::cout << " TRISYM = " << relaxation->use_triplet_symmetry << std::endl;
std::cout << std::endl;
} else if (phon->mode == "SCPH") {
std::cout << " Scph:" << std::endl;
std::cout << " KMESH_INTERPOLATE = ";
for (i = 0; i < 3; ++i) std::cout << std::setw(5) << scph->kmesh_interpolate[i];
std::cout << std::endl;
std::cout << " KMESH_SCPH = ";
for (i = 0; i < 3; ++i) std::cout << std::setw(5) << scph->kmesh_scph[i];
std::cout << std::endl;
std::cout << " SELF_OFFDIAG = " << scph->selfenergy_offdiagonal << std::endl;
std::cout << " IALGO = " << scph->ialgo << std::endl << std::endl;
std::cout << " RESTART_SCPH = " << scph->restart_scph << std::endl;
Expand Down

0 comments on commit 725383e

Please sign in to comment.