Ce fichier est lu (et son contenu exploité) par un appel à la fonction ParseSimulationFile, avant l'exécution de la simulation. Cette fonction prend en argument le nom physique du fichier.
Cet appel peut figurer dans le programme principal ... :int main(int argc, char* argv[]) { ... ParseParameterFile(argv[1]); ParseSimulationFile(argv[2]); ... pCurrentSim->Run(); ... }..., auquel cas le nom du fichier peut être passé en argument de la ligne de commande :
./main sim1.par sim1.sim ...L'appel peut aussi résulter d'une directive de simulation écrite sur un fichier externe (voir le lien 'Les fichiers des directives de la simulation'), auquel cas le nom du fichier sera un des éléments de la directive.
Le fichier des spécifications de simulation est une suite de phrases, dont la syntaxe est la suivante :
<fichier> ::= <phrase>* <phrase> ::= <ligne_trace> | <comment> | <set_ivar> <init_rand> | <init_sim> | <open_file> <ligne_trace> ::= TRACE <mode_trace> <fin> <mode_trace> ::= PARSING | NO_PARSING <comment> ::= <l_comment> | <ls_comment> <l_comment> ::= <symb_comment> <any> <symb_comment> ::= // | # <any> ::= .* <ls_comment> ::= '/''*'(<any>\n)*<any>'/''*' <set_ivar> ::= <ref_ivar> = <int_expr> <fin> <entier> ::= [0-9]+ <int_expr> ::= <entier> | <ref_ivar> | <ref_iparam> | <int_expr> <op> <int_expr> | (<int_expr>) | RANDOM(<int_expr>) <op> ::= < | <= | > | >= <ref_ivar> ::= {i<entier>} <ref_iparam> ::= '<'pi'>' '<' <param_str> <param_str> <'>' <param_str> ::= <chaine> | <multichaine> <init_rand> ::= INITRAND <entier> <fin> | INITRAND <ref_iparam> <fin> | INITRAND <fin> <init_sim> ::= INITIALISATION SIMULATION <spec>+ <fin> <spec> ::= <spec_unite>|<spec_step>|<spec_beg>|<spec_end>| <spec_in>|<spec_out> <spec_unite> ::= UNITE_TPS <unite_tps> <fin> <unite_tps> ::= DAY ... <spec_step> ::= NB_UNITE_TPS <entier> <fin> <spec_beg> ::= DATE_DEBUT <date> <fin> <spec_end> ::= DATE_FIN <date> <fin> <date> ::= <entier> <mois> <entier> [<entier> <entier> <entier>] <mois> ::= JAN .... DEC <spec_in> ::= IN_DIR <dir_path> <fin> <spec_out> ::= OUT_DIR <dir_path> <fin> <dir_path> ::= "[(~ | . | .. |)/<etage>]*" <etage> ::= <chaine_rep>/ <chaine> ::= [a-zA-Z][a-zA-Z0-9\_\.]* <chaine_rep> ::= [a-zA-Z][a-zA-Z0-9\_\.\:]* <multichaine> ::= "(<chaine>" ")*<chaine>" <open_file> ::= OUVERTURE <file_type> <spec_file>+ <fin> <file_type> ::= FICHIER_SERIEL|FICHIER_SEQUENTIEL <spec_file> ::= <spec_nom>|<spec_fkey>|<spec_fdata>|<spec_f>| <spec_com>|<spec_skip> <spec_nom_s> ::= NOM_SIMPLE_FICHIER <simple_name> <fin> <simple_name> ::= "<chaine>" | <ref_svar> <ref_svar> ::= "<chaine>" <spec_nom_c> ::= NOM_COMPLET_FICHIER <full_name> <fin> <full_name> ::= "<dir_path><simple_name>" <spec_fkey> ::= FORMAT_CLES <format> <fin> <spec_fdata> ::= FORMAT_DONNEES <format> <fin> <spec_f> ::= FORMAT_CHAMPS <format> <fin> <spec_com> ::= LIGNES_ENTETE <entier> <fin> <spec_skip> ::= SKIP_ENTETE <fin> <format> ::= "<chaine>" <fin> ::= ;
- <ligne_trace> permet d'activer ou de désactiver une fonction de trace des actions de lecture/interprétation.
- <init_rand> initialise une série de nombres pseudo-aléatoires par un appel à srand(<entier>) ou srand(<valeur de paramètre>), ou bien par un appel à srand((int)getpid()) si l'entier n'est pas fourni ou est égal à 0. Utile pour provoquer des séries différentes (par la fonction RandomInteger) lors de simulations successives. On rappelle que si aucune directive <init_rand> n'est donnée, la génération de la série aléatoire commence en utilisant la valeur 1.
- <init_sim> encapsule une ou plusieurs des spécifications suivantes pour la simulation. On rappelle qu'une instance de la classe Simulation, laquelle est la valeur de la variable globale pCurrentSim (voir pages 'Variables globales' et 'La classe des simulations'), a été créée par un appel à InitSimulation au début de la fonction main.
- <spec_unite> spécifie l'unité de temps naturelle (minute, seconde, ) en laquelle est mesurée la longueur de l'unité de temps simulé (voir page 'Types et fonctions pour la gestion du temps simulé'). Les indications valides pour <spec_unit> sont celles de l'énumération TimeUnit (voir page 'Unités de temps simulé'). Il n'y a pas de valeur par défaut : cette spécification est donc nécessaire.
- <spec_step> spécifie la longueur de l'unité de temps simulé, avec l'unité de mesure ci-dessus. Comme ci-dessus, il n'y a pas de valeur par défaut.
- <spec_beg> et <spec_end> déterminent les instants de début et de fin au plus tard de la simulation. Dans la <date>, les <entier> représentent, dans l'ordre, le jour, l'année puis, éventuellement, l'heure, la minute et la seconde. Les indications valides pour <mois> sont celles de l'énumération ShortMonthName (voir page 'Constantes, structures et fonctions pour les dates et le temps en général'). Les années avant 2000 doivent être données avec leurs 4 chiffres (e.g. 1997). Celles à partir de 2000 peuvent être données avec leurs deux derniers chiffres (e.g. 03 pour 2003).
- <spec_out> désigne, entre guillemets et relativement au répertoire dans lequel est lancée la commande d'exécution, le répertoire dans lequel seront éventuellement créés les fichiers de sortie selon les indications portées dans le fichier de spécifications de sortie. Cette valeur sera celle renvoyée par la méthode GetOutDir de la classe Simulation.
- <spec_in> désigne, entre guillemets et relativement au répertoire dans lequel est lancée la commande d'exécution, le répertoire dans lequel seront éventuellement recherchés les fichiers d'entrée. Cette valeur sera celle renvoyée par la méthode GetInDir de la classe Simulation.
- le mot-clé RANDOM, suivi d'une expresion entre parenthèses, renvoie un nombre entier aléatoire positif inférieur à la valeur de l'expression.
- <open_file> déclare les propriétés d'un fichier en série d'enregistrements. Noter bien que ce genre de spécifications peuvent être écrites dans le {\en fichier de la structure du système}. On peut indiquer ici :
- le ou les formats des champs de clé et des champs de donnée, ou le format global (clés et données);
- le nombre de lignes d'entête qui ne sont pas des lignes de données (<spec_com>) et demander de les sauter immédiatement (<spec_skip>), c'est-à-dire pendant la lecture du fichier des paramètres de simulation (on peut aussi avoir programmé ce saut ailleurs dans le simulateur, et donc ne pas le demander ici). ;
- quant au nom du fichier physique (<spec_nom_*>), on peut indiquer le nom complet ou le nom simple. Dans le second cas, le fichier sera recherché dans le répertoire désigné dans la spécification <spec_in>.
Des exemples valides pour <dir_path> sont : "/home/anyuser/dir","~/dir/", "dir/", "../dir/", "./dir/". Si la chaîne entre les guillemets (non compris) est une spécification absolue (commençant par un /), elle constitue directement le chemin complet du répertoire des fichiers de sortie. Si c'est une spécification relative, elle est interprétée relativement au répertoire courant.
Toute fin de ligne après // ou # est ignorée, de même que tout passage entre /
et
/.
Un exemple de fichier de spécification de la simulation est le suivant :
//TRACE NO_PARSING; {i1} = 97; INITIALISATION SIMULATION UNITE_TPS MINUTE; NB_UNITE_TPS 1; //UNITE_TPS SECOND; //NB_UNITE_TPS 30; DATE_DEBUT 1 JAN {i1} <pi><Simulation "heure deb"> <pi><Simulation "minut deb"> 0; DATE_FIN 1 JAN {i1} <pi><Simulation "heure fin"> <pi><Simulation "minut fin"> 0; OUT_DIR "../out/minute/"; OUVERTURE FICHIER_SEQUENTIEL FICHIER_METEO NOM_PHYSIQUE "../in/meteo_alenya.15min.txt"; FORMAT_CHAMPS "%d %d %d %d %lf %lf %lf %lf %lf"; LIGNES_ENTETE 1; //SKIP_ENTETE; // le saut est programmé ailleurs ; ;