diff --git a/src/rt.c b/src/rt.c new file mode 100644 index 0000000000000000000000000000000000000000..b8930553c3af4d05387e807f04c8458fe9be7988 --- /dev/null +++ b/src/rt.c @@ -0,0 +1,185 @@ +/** @file rt.c + * @brief Module of the Kinetics. */ + +#include +#include +#include +#include +#include + +#include "parameters.h" +#include "proto.h" +#include "species.h" +#include "reaction.h" + +#define MAX_SPECIES 15 +#define MAX_REACTIONS 30 +#define MAX_SEEDS 15 + +/** @brief Photoionization */ +reaction_t react_photo = {TRUE, 0, 0, {0}, {0}, {""}, {""}, NULL, NULL, NULL, 0.0, NULL}; + +species_t *spec_index[MAX_SPECIES]; +reaction_t *reaction_index[MAX_REACTIONS]; +seed_t *seed_index[MAX_SEEDS]; +int no_reactions; + +/** @brief Any initialization required by the kinetic model, has to be done + * in this function. + */ +void +kinetic_init (void) +{ + int cnt; + const char *filename; + + read_input_file(kin_input,filename); + + if (has_photoionization == 1) + { + react_add(&react_photo); + ions = find_species_by_name("dummyplus"); + photo_ions = find_species_by_name("xplus"); + } + + printf("\n"); + for (cnt = no_reactions; cnt > 0; cnt--) + react_add(reaction_index[cnt-1]); + + electrons = find_species_by_name("electrons"); +} + +/** @brief Reads the kinetic parameters (species, reactions) from file + * @a filename */ +void +read_input_file(const char *f_kinetic_name, const char *filename) +{ + config_t cfg_kinetic; + config_setting_t *setting; + species_t *temp_s; + reaction_t *temp_r; + seed_t *temp_se; + int i,cnt,cnt2; + + config_init(&cfg_kinetic); + + /* Read the file f_kinetic_name. If there is an error, report it and exit. */ + if(! config_read_file(&cfg_kinetic,f_kinetic_name)) + { + fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg_kinetic), + config_error_line(&cfg_kinetic), config_error_text(&cfg_kinetic)); + config_destroy(&cfg_kinetic); + exit(EXIT_FAILURE); + } + + /* Get the program name. */ + if(config_lookup_string(&cfg_kinetic, "filename", &filename)) + printf("Example : %s\n\n", filename); + else + fprintf(stdout, "No ' program name' setting in configuration file.\n"); + + /* Output a list of all species parameters in the file. */ + setting = config_lookup(&cfg_kinetic, "species"); + if(setting != NULL) + { + no_species = config_setting_length(setting); + + printf("# species = %i\n",no_species); + + for(i = 0; i < no_species; ++i) + { + temp_s = (species_t*) malloc(sizeof(species_t)); + temp_s->charge = 0.0; + temp_s->mass = 0.0; + temp_s->name = ""; + if (read_specie(setting,i,temp_s)) + spec_index[i]=temp_s; + printf("Species '%10s' has mass %10.1e and charge %10.1e\n", + spec_index[i]->name, + spec_index[i]->mass, + spec_index[i]->charge); + continue; + } + } + + /* Output a list of all seed parameters in the file. */ + setting = config_lookup(&cfg_kinetic, "seed"); + if(setting != NULL) + { + no_seed = config_setting_length(setting); + + printf("# seed = %i\n",no_seed); + printf("\n"); + + for(i = 0; i < no_seed; ++i) + { + temp_se = (seed_t*) malloc(sizeof(seed_t)); + temp_se->species = -1; + temp_se->value = 0.0; + temp_se->type = -1; + temp_se->x0 = 0.0; + temp_se->y0 = 0.0; + temp_se->z0 = 0.0; + temp_se->sigma_x = 0.0; + temp_se->sigma_y = 0.0; + temp_se->sigma_z = 0.0; + if (read_seed(setting,i,temp_se)) + seed_index[i]=temp_se; + printf("Found a seed of species %s and type %s\n", + seed_index[i]->kind_species, + seed_index[i]->kind_type); + printf("It has value %10.1e, z-position %10.1e and y-sigma %10.1e\n", + seed_index[i]->value, + seed_index[i]->z0, + seed_index[i]->sigma_y); + continue; + } + } + + /* Output a list of all reaction parameters in the file. */ + setting = config_lookup(&cfg_kinetic, "reactions"); + if(setting != NULL) + { + no_reactions = config_setting_length(setting); + + printf("# reactions = %i\n",no_reactions); + + for(i = 0; i < no_reactions; ++i) + { + temp_r = (reaction_t*) malloc(sizeof(reaction_t)); + temp_r->is_photo = 0; + temp_r->nin = 0; + temp_r->nout = 0; + temp_r->f = NULL; + temp_r->rt = NULL; + temp_r->tablefile = ""; + temp_r->k = 0.0; + temp_r->next = NULL; + if (read_reaction(setting,i,temp_r)) + reaction_index[i]=temp_r; + + continue; + } + } + + printf("\n"); + for (cnt = 0; cnt < no_reactions; cnt++) + { + printf("Reaction #%i has %i input-species, %i output-species.\n", + cnt,reaction_index[cnt]->nin,reaction_index[cnt]->nout); + printf("The rates are defined in %s\n", + reaction_index[cnt]->tablefile); + printf("Input species are:\t"); + for (cnt2 = 0; cnt2 < reaction_index[cnt]->nin; cnt2++) { + printf("(%i) %s\t", + reaction_index[cnt]->input[cnt2], + reaction_index[cnt]->inname[cnt2]); + } + printf("\nOutput species are:\t"); + for (cnt2 = 0; cnt2 < reaction_index[cnt]->nout; cnt2++) { + printf("(%i) %s\t",reaction_index[cnt]->output[cnt2], + reaction_index[cnt]->outname[cnt2]); + } + printf("\n"); + } +}