Parsing doubles from file.
Former-commit-id: 4971114cd2ae5e5fba598fff4286d2629ad23523
This commit is contained in:
parent
9d93b93ce9
commit
7218a8ce4b
|
@ -143,6 +143,50 @@ qpms_parse_doubles_cleanup:
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Parse doubles from a file.
|
||||||
|
*
|
||||||
|
* The doubles can be separated by whitespaces, comma or semicolon.
|
||||||
|
* The parsed numbers are saved into an array specified by *target
|
||||||
|
* that has been preallocated with malloc() to contain at least start_index
|
||||||
|
* members. If start_index is nonzero, the newly parsed numbers are
|
||||||
|
* saved to the positions starting from start_index.
|
||||||
|
*
|
||||||
|
* If *target is NULL, the function allocates the necessary space.
|
||||||
|
*
|
||||||
|
* If filepath is NULL, "" or "-", read from stdin.
|
||||||
|
*
|
||||||
|
* \return Number of newly parsed doubles + start_index.
|
||||||
|
*/
|
||||||
|
size_t qpms_parse_doubles_fromfile(
|
||||||
|
double **target,
|
||||||
|
size_t start_index, //< Starting index for writing the parsed values.
|
||||||
|
const char *filepath //< File to read from, or NULL, "", "-" to read from stdin.
|
||||||
|
) {
|
||||||
|
QPMS_ENSURE(target, "The target parameter must not be NULL");
|
||||||
|
|
||||||
|
FILE *src;
|
||||||
|
|
||||||
|
if (!filepath || !strcmp(filepath, "-") || filepath[0]=='\0')
|
||||||
|
src = stdin;
|
||||||
|
else
|
||||||
|
QPMS_ENSURE(src = fopen(filepath, "f"),
|
||||||
|
"Could not open file %s: %s", filepath, strerror(errno));
|
||||||
|
|
||||||
|
char buf[1024];
|
||||||
|
int scanresult;
|
||||||
|
while (1 == (scanresult = fscanf(src, "%1023s", buf)))
|
||||||
|
start_index = qpms_parse_doubles(target, start_index, buf);
|
||||||
|
|
||||||
|
if (errno) QPMS_WARN("Problem reading %s: %s",
|
||||||
|
(src==stdin) ? "stdin" : filepath, strerror(errno));
|
||||||
|
|
||||||
|
qpms_parse_doubles_files_cleanup:
|
||||||
|
if (src != stdin)
|
||||||
|
QPMS_ENSURE(!fclose(src),
|
||||||
|
"Could not close file %s: %s", filepath, strerror(errno));
|
||||||
|
|
||||||
|
return start_index;
|
||||||
|
}
|
||||||
#define MAXKCOUNT 200 // 200 // serves as klist default buffer size
|
#define MAXKCOUNT 200 // 200 // serves as klist default buffer size
|
||||||
//#define KMINCOEFF 0.783 //0.9783 // 0.783 // not used if KSTDIN defined
|
//#define KMINCOEFF 0.783 //0.9783 // 0.783 // not used if KSTDIN defined
|
||||||
//#define KMAXCOEFF 1.217 //1.0217 // 1.217 // not used if KSTDIN defined
|
//#define KMAXCOEFF 1.217 //1.0217 // 1.217 // not used if KSTDIN defined
|
||||||
|
@ -179,6 +223,10 @@ int main (int argc, char **argv) {
|
||||||
i, gotnumbers, latdim);
|
i, gotnumbers, latdim);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// N.B. this is 2D specific, TODO generalize when Nd sum supported
|
||||||
|
const double unitcell_area = l2d_unitcell_area(b[0], b[1]);
|
||||||
|
l2d_reduceBasis(b[0], b[1], b, b+1);
|
||||||
|
|
||||||
const qpms_l_t lMax = args_info.lMax_arg;
|
const qpms_l_t lMax = args_info.lMax_arg;
|
||||||
QPMS_ENSURE(lMax > 0, "invalid value of lMax: %d", (int)lMax);
|
QPMS_ENSURE(lMax > 0, "invalid value of lMax: %d", (int)lMax);
|
||||||
|
|
||||||
|
@ -202,7 +250,18 @@ int main (int argc, char **argv) {
|
||||||
QPMS_ENSURE(!args_info.k_omega_meshgrid_mode_counter != !args_info.k_omega_points_mode_counter,
|
QPMS_ENSURE(!args_info.k_omega_meshgrid_mode_counter != !args_info.k_omega_points_mode_counter,
|
||||||
"THIS IS A BUG. Only one mode ((k, ω) tuples, or k, ω lists) allowed.");
|
"THIS IS A BUG. Only one mode ((k, ω) tuples, or k, ω lists) allowed.");
|
||||||
if (args_info.k_omega_meshgrid_mode_counter) { // grid mode
|
if (args_info.k_omega_meshgrid_mode_counter) { // grid mode
|
||||||
TODO;
|
size_t omegacount = 0;
|
||||||
|
double *omegalist = NULL;
|
||||||
|
for (int i = 0; i < args_info.omega_given; ++i)
|
||||||
|
omegacount = qpms_parse_doubles(&omegalist, omegacount,
|
||||||
|
args_info.omega_arg[i]);
|
||||||
|
|
||||||
|
for (int i = 0; i < args_info.omegafile_given; ++i) {
|
||||||
|
FILE *f omegaf = fopen(args_info.omegafile_arg[i], "r");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} else if (args_info.k_omega_points_mode_counter) { // explic. point mode
|
} else if (args_info.k_omega_points_mode_counter) { // explic. point mode
|
||||||
TODO;
|
TODO;
|
||||||
}
|
}
|
||||||
|
@ -231,8 +290,6 @@ int main (int argc, char **argv) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const double unitcell_area = l2d_unitcell_area(b1, b2);
|
|
||||||
l2d_reduceBasis(b1, b2, &b1, &b2);
|
|
||||||
|
|
||||||
// TODO more clever way of determining the cutoff
|
// TODO more clever way of determining the cutoff
|
||||||
const double a = sqrt(unitcell_area); // N.B. different meaning than before
|
const double a = sqrt(unitcell_area); // N.B. different meaning than before
|
||||||
|
|
Loading…
Reference in New Issue