sandbox/bderembl/libs/extra.h
Read input parameters
char dpath[80]; // name of output dir
char file_param[80] = "params.in"; // name param file
// for mkdir
#include <sys/stat.h>
#include <sys/types.h>
void trim_whitespace(char* s) {
const char* d = s;
do {
while (*d == ' ')
++d;
} while ((*s++ = *d++));
*s = '\0';
}
void str2array(char *tmps2, double *array){
// overwrite newline character with string terminator
char *newline = strchr( tmps2, '\n' );
if ( newline )
*newline = 0;
char* p;
int n = 0;
p = strtok(tmps2,"[,]");
while (p != NULL){
array[n] = atof(p);
fprintf (stderr, "array[%d] = %g \n", n, array[n]);
p = strtok(NULL, ",");
n += 1;
}
}
Params global variable
Array * params;
typedef struct {
char * name;
void * ptr;
char * type;
int len;
} ParamItem;
void add_param(char * name, void * ptr, char * type, int len = 0)
{
ParamItem p;
p.name = strdup(name);
p.ptr = ptr;
p.type = strdup(type);
p.len = len;
array_append (params, &p, sizeof (ParamItem));
}
void read_params(char* path2file)
{
FILE * fp;
if ((fp = fopen(path2file, "rt"))) {
char tempbuff[300];
while(fgets(tempbuff,300,fp)) { // loop over file lines
trim_whitespace(tempbuff);
char* tmps1 = strtok(tempbuff, "=");
char* tmps2 = strtok(NULL, "=");
ParamItem * d2 = params->p;
for (int i = 0; i < params->len/sizeof(ParamItem); i++, d2++) { // loop over parameters
if (strcmp(d2->name, tmps1) == 0) {
//check for type and assign value
if (strcmp(d2->type, "int") == 0) {
*( (int*) d2->ptr) = atoi(tmps2);
fprintf (stderr, "scan param %s: %d\n", d2->name, *( (int*) d2->ptr));}
else if (strcmp(d2->type, "double") == 0){
*( (double*) d2->ptr) = atof(tmps2);
fprintf (stderr, "scan param %s: %e\n", d2->name, *( (double*) d2->ptr));}
else if (strcmp(d2->type, "array") == 0){
fprintf (stderr, "scan param %s:\n", d2->name);
str2array(tmps2, (double*) d2->ptr);
}
}
}
}
fclose(fp);
} else {
fprintf(stdout, "file %s not found\n", path2file);
exit(0);
}
}
Create output directory and copy input parameter file for backup
void create_outdir()
{
if (pid() == 0) {
for (int i=1; i<10000; i++) {
sprintf(dpath, "outdir_%04d/", i);
if (mkdir(dpath, 0777) == 0) {
fprintf(stdout,"Writing output in %s\n",dpath);
break;
}
}
}
@if _MPI
MPI_Bcast(&dpath, 80, MPI_CHAR, 0, MPI_COMM_WORLD);
@endif
}
void backup_config(char* path2file)
{
fprintf(stdout, "Backup config\n");
if (pid() == 0) {
char ch;
char name[90];
sprintf (name,"%sparams.in", dpath);
FILE * source = fopen(path2file, "r");
FILE * target = fopen(name, "w");
while ((ch = fgetc(source)) != EOF)
fputc(ch, target);
fclose(source);
fclose(target);
}
}
Copy file from: https://stackoverflow.com/questions/29079011/copy-file-function-in-c
void backup_file(char FileSource[])
{
if (pid() == 0) {
char FileDestination[100];
sprintf (FileDestination,"%s%s", dpath, FileSource);
char c[4096]; // or any other constant you like
FILE *stream_R = fopen(FileSource, "r");
FILE *stream_W = fopen(FileDestination, "w"); //create and write to file
while (!feof(stream_R)) {
size_t bytes = fread(c, 1, sizeof(c), stream_R);
if (bytes) {
fwrite(c, 1, bytes, stream_W);
}
}
//close streams
fclose(stream_R);
fclose(stream_W);
}
}