|
new file 100644
|
|
|
/**i @file main.c
|
|
|
* @brief Code regarding input of parameters + starting of the code. */
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
#include <time.h>
|
|
|
#include <stdio.h>
|
|
|
#include <string.h>
|
|
|
#include <errno.h>
|
|
|
//#include <getopt.h>
|
|
|
#include <math.h>
|
|
|
|
|
|
#include "cdr.h"
|
|
|
#include "cstream.h"
|
|
|
#include "grid.h"
|
|
|
#include "parameters.h"
|
|
|
#include "proto.h"
|
|
|
#include "species.h"
|
|
|
|
|
|
int main (int argc, char *argv[]);
|
|
|
void start_process (cdr_grid_t *cdr);
|
|
|
void output_tree (cdr_grid_t *cdr, int step, double t);
|
|
|
void check_params (void);
|
|
|
|
|
|
/** @brief The main program */
|
|
|
int
|
|
|
main (int argc, char *argv[])
|
|
|
{
|
|
|
// param_t **p;
|
|
|
// char *s;
|
|
|
// struct option *opt;
|
|
|
// struct option *long_options;
|
|
|
// int c;
|
|
|
cdr_grid_t *cdr;
|
|
|
int count,count_user;
|
|
|
static const char *output_file;
|
|
|
config_t cfg,cfg_user;
|
|
|
config_setting_t *setting,*setting_user;
|
|
|
const char *prog_name,*f_defname,*f_username;
|
|
|
|
|
|
f_defname = "input/default.cfg";
|
|
|
f_username = "input/user_init.cfg";
|
|
|
output_file = "input/user_continue.cfg";
|
|
|
|
|
|
/* Open configuration cfg */
|
|
|
config_init(&cfg);
|
|
|
|
|
|
/* Read the default file.
|
|
|
* The default file might be a result of a previous run, containing values
|
|
|
* for all global variables.
|
|
|
* If there is an error, report it and exit. */
|
|
|
if(! config_read_file(&cfg, f_defname))
|
|
|
{
|
|
|
fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg),
|
|
|
config_error_line(&cfg), config_error_text(&cfg));
|
|
|
config_destroy(&cfg);
|
|
|
return(EXIT_FAILURE);
|
|
|
}
|
|
|
|
|
|
/* Get the program name. */
|
|
|
if(config_lookup_string(&cfg, "name", &prog_name))
|
|
|
printf("Example : %s\n\n", prog_name);
|
|
|
else
|
|
|
fprintf(stderr, "No ' program name' setting in configuration file.\n");
|
|
|
|
|
|
/* Output a list of all parameters in the file. */
|
|
|
setting = config_lookup(&cfg, "param");
|
|
|
if(setting != NULL)
|
|
|
{
|
|
|
int i;
|
|
|
count = config_setting_length(setting);
|
|
|
|
|
|
fprintf(stdout, "# params: count=%i\n",count);
|
|
|
|
|
|
for(i = 0; i < count; ++i)
|
|
|
{
|
|
|
if (read_parameter(setting,setting,i,count,FALSE))
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
/* Write out the updated configuration. */
|
|
|
if(! config_write_file(&cfg, output_file))
|
|
|
{
|
|
|
fprintf(stderr, "Error while writing file.\n");
|
|
|
config_destroy(&cfg);
|
|
|
return(EXIT_FAILURE);
|
|
|
}
|
|
|
putchar('\n');
|
|
|
}
|
|
|
fprintf(stdout, "Default configuration successfully written to: %s\n",
|
|
|
output_file);
|
|
|
|
|
|
/* ========================================================================== */
|
|
|
|
|
|
/* Open configuration cfg_user */
|
|
|
config_init(&cfg_user);
|
|
|
|
|
|
/* Read the file made by the user, with adapted values.
|
|
|
* This file does not have to contain entries for variables which remain
|
|
|
* unchanged.
|
|
|
* If there is an error, report it and exit. */
|
|
|
if(! config_read_file(&cfg_user, f_username))
|
|
|
{
|
|
|
fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg_user),
|
|
|
config_error_line(&cfg_user), config_error_text(&cfg_user));
|
|
|
config_destroy(&cfg_user);
|
|
|
return(EXIT_FAILURE);
|
|
|
}
|
|
|
|
|
|
/* Output a list of all parameters in the file. */
|
|
|
setting_user = config_lookup(&cfg_user, "param");
|
|
|
if(setting_user)
|
|
|
{
|
|
|
int i;
|
|
|
count_user = config_setting_length(setting_user);
|
|
|
|
|
|
fprintf(stdout, "# params: count_user=%i\n",count_user);
|
|
|
|
|
|
for(i = 0; i < count_user; ++i)
|
|
|
{
|
|
|
if (read_parameter(setting,setting_user,i,count,TRUE))
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
/* Write out the updated configuration. */
|
|
|
if(! config_write_file(&cfg, output_file))
|
|
|
{
|
|
|
fprintf(stderr, "Error while writing file.\n");
|
|
|
config_destroy(&cfg);
|
|
|
return(EXIT_FAILURE);
|
|
|
} else {
|
|
|
fprintf(stdout, "Updated configuration successfully written to: %s\n",
|
|
|
output_file);
|
|
|
}
|
|
|
putchar('\n');
|
|
|
}
|
|
|
|
|
|
check_params ();
|
|
|
|
|
|
cstream_init ();
|
|
|
|
|
|
if (restart) {
|
|
|
if (0 == strcmp (load_file, "")) {
|
|
|
printf("restart file is empty\n");
|
|
|
return 1;
|
|
|
} else
|
|
|
cdr = cdr_load_tree_r (output_dir, load_file, NULL);
|
|
|
} else
|
|
|
cdr = cdr_scratch_init ();
|
|
|
|
|
|
start_process(cdr);
|
|
|
|
|
|
/* Destroy both configurations */
|
|
|
config_destroy(&cfg_user);
|
|
|
config_destroy(&cfg);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/** @brief Starts a given run on a given @a cdr tree. */
|
|
|
void
|
|
|
start_process (cdr_grid_t *cdr)
|
|
|
{
|
|
|
int i, i0;
|
|
|
double t, dt;
|
|
|
double t0, t1;
|
|
|
struct timeval tv;
|
|
|
FILE *fp;
|
|
|
|
|
|
i0 = (int) (start_t / output_dt);
|
|
|
|
|
|
debug(1,"before loop :start_t= %e; t = %e; dt = %e\n",start_t,t, dt);
|
|
|
/* This is the main loop of the code. */
|
|
|
for (i = i0, t = start_t; t < end_t; t += dt)
|
|
|
{
|
|
|
debug(1,"inside loop: i, t, dt : %d %e %e\n",i,t,dt);
|
|
|
/* Set the field and the fixed charge when we have time-dependent
|
|
|
external fields (controled by rise_time) */
|
|
|
cstream_set_field_at_time (t);
|
|
|
dt = cdr_rk2 (cdr, attempt_dt, t);
|
|
|
cdr_update_refined (&cdr);
|
|
|
printf("t = %lf\tdt = %lf\tnext output at: %lf\n",t,dt,i * output_dt);
|
|
|
if (output_dt <= 0.0 || t >= output_dt * i)
|
|
|
{
|
|
|
output_tree (cdr, i, t);
|
|
|
if (cdr->ntheta > 1)
|
|
|
{
|
|
|
dft_out_weights (cdr, output_dir, t);
|
|
|
}
|
|
|
i++;
|
|
|
}
|
|
|
}
|
|
|
cdr_dump (cdr, output_dir, "C");
|
|
|
cdr_free_r (cdr);
|
|
|
cstream_end ();
|
|
|
}
|
|
|
|
|
|
/** @brief Outputs the tree contained in cdr.
|
|
|
*
|
|
|
* If pois_output (global parameter) is true, it also dumps the Poisson tree.
|
|
|
*/
|
|
|
void
|
|
|
output_tree (cdr_grid_t *cdr, int step, double t)
|
|
|
{
|
|
|
char *gname;
|
|
|
pois_grid_t **pois_modes;
|
|
|
FILE *fp;
|
|
|
char logfile[100];
|
|
|
|
|
|
asprintf (&gname, "C%.3d", step);
|
|
|
cdr_set_ext_bnd_r (cdr);
|
|
|
|
|
|
/* !!!!!!!!!!!! */
|
|
|
if (1 || t > start_t || 0 == strcmp (load_file, "")) {
|
|
|
cdr_dump_r (cdr, output_dir, gname, NULL, t);
|
|
|
cdr_dump_frames (cdr, output_dir, gname);
|
|
|
|
|
|
printf ("CDR grid %s saved\n", gname);
|
|
|
}
|
|
|
|
|
|
free (gname);
|
|
|
|
|
|
if (pois_output) {
|
|
|
int mode;
|
|
|
pois_modes = cdr_calc_field_r (cdr, TRUE);
|
|
|
|
|
|
for (mode = 0; mode < max_ntheta; mode++) {
|
|
|
asprintf (&gname, "P%.3d%.2d", step, mode);
|
|
|
pois_dump_r (pois_modes[mode], output_dir, gname);
|
|
|
pois_free_r (pois_modes[mode]);
|
|
|
printf ("Poisson grid %s saved\n", gname);
|
|
|
free (gname);
|
|
|
}
|
|
|
|
|
|
free (pois_modes);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/** @brief Checks for some errors in the parameters that will produce
|
|
|
* nonsense output.
|
|
|
*/
|
|
|
void
|
|
|
check_params ()
|
|
|
{
|
|
|
if ((gridpoints_z % 4) != 0 && pois_inhom == 1) {
|
|
|
fatal ("To use inhomogeneous fields, gridpoints_z must be a"
|
|
|
" multiple of 4\n");
|
|
|
}
|
|
|
}
|