/*************************************************************************************************************************************/
/* */
/* M O U V E M E N T S E L L I P T I Q U E S D A N S L ' E S P A C E : */
/* */
/* */
/* Author of '$xrr/N_ellipso.11$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20051103130151). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R F A C E ' listG ' : */
/* */
/* */
/* :Debut_listG: */
/* :Fin_listG: */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */
/* */
/*************************************************************************************************************************************/
@define PRAGMA_CL_____MODULE_NON_OPTIMISABLE
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_BASE
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S D E B A S E E T U N I V E R S E L L E S : */
/* */
/*************************************************************************************************************************************/
#include xrk/attractor.11.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 3 */
/* D E F I N I T I O N D E L ' E S P A C E P H Y S I Q U E D A N S R ( D E B U T ) : */
/* */
/* */
/* Nota : */
/* */
/* Les extrema des coordonnees {x,y,z} */
/* ainsi que ceux de leurs differentielles */
/* {dx,dy,dz} sont fixees un peu arbitrairement */
/* et sans etre parametrees. */
/* */
/* */
/*************************************************************************************************************************************/
#define FACTEUR_D_EXTENSION_DE_L_ESPACE_PHYSIQUE \
FU \
/* Facteur d'extension de l'univers. Celui-ci a ete tout particulierement introduit a */ \
/* cause de 'v $xrr/N_corps.11$K' ; en effet, dans ce dernier l'univers defini initialement */ \
/* etait cinq fois trop petit pour contenir les planetes les plus exterieures. Pour assurer */ \
/* la compatibilite avec les sequences deja generees, il a suffi d'ajouter ce facteur avec */ \
/* comme valeur par defaut, l'unite. La valeur '5.0' permet de traiter le systeme solaire... */
#define hXmin_ESPACE \
PARE(-1.0e12)
#define hYmin_ESPACE \
PARE(-1.0e12)
#define hZmin_ESPACE \
PARE(-1.0e12)
/* Definition du "coin" inferieur-gauche-arriere de l'espace physique. */
#define hXmax_ESPACE \
PARE(1.0e12)
#define hYmax_ESPACE \
PARE(1.0e12)
#define hZmax_ESPACE \
PARE(1.0e12)
/* Definition du "coin" superieur-droit-avant de l'espace physique. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 3 */
/* D E F I N I T I O N D E L ' E S P A C E P H Y S I Q U E D A N S R ( D E B U T ) : */
/* */
/*************************************************************************************************************************************/
#include xrk/attractor.12.I"
#define dXmin_ESPACE \
FLOT__NOIR
#define dYmin_ESPACE \
FLOT__NOIR
#define dZmin_ESPACE \
FLOT__NOIR
/* Definition des minima des differentielles {dx,dy,dz}. */
#define dXmax_ESPACE \
FLOT__BLANC
#define dYmax_ESPACE \
FLOT__BLANC
#define dZmax_ESPACE \
FLOT__BLANC
/* Definition des maxima des differentielles {dx,dy,dz}. */
#include xrk/attractor.1D.I"
/* Formules de renormalisation des differentielles dans [0,1] ; elles sont utilisees lorsque */
/* la production d'images en couleurs est demandee (voir 'visualiser_en_RVB'). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E S D I F F E R E N T S E S P A C E S E T D E L ' E F F E T D E B R U M E : */
/* */
/*************************************************************************************************************************************/
#include xrk/attractor.13.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* A I D E A U C A D R A G E D E S I M A G E S : */
/* */
/*************************************************************************************************************************************/
#include xrk/attractor.1C.I"
DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES
/* Definition des extrema des coordonnees et des derivees. On notera bien l'absence de */
/* point-virgule apres 'DONNEES_DE_RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES'. */
#define EDITER_LES_COORDONNEES \
FAUX
DEFV(Local,DEFV(Logical,INIT(editer_les_coordonnees,EDITER_LES_COORDONNEES)));
/* Indique si a chaque pas de temps on doit editer ('VRAI') ou pas ('FAUX') les coordonnees */
/* de chaque corps... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D E S I M A G E S : */
/* */
/*************************************************************************************************************************************/
#include xrv/champs_5.14.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S G E N E R A L E S R E L A T I V E S A L A V I S U A L I S A T I O N : */
/* */
/*************************************************************************************************************************************/
#define nombre_de_corps \
nombre_d_iterations \
/* ATTENTION, a ne pas confondre : */ \
/* */ \
/* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que */ \
/* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par */ \
/* 'fTRANSFORMAT_31(...)', et */ \
/* */ \
/* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque */ \
/* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la */ \
/* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite */ \
/* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'... */ \
/* */
#define DCT \
CENT
DEFV(Local,DEFV(Float,INIT(dct,DCT)));
/* Definition de 'dt'. */
/* */
/* On notera l'inutilite de ce parametre qui est introduit pour des raisons de compatibilite */
/* avec 'v $xrr/N_corps.11$K'. */
#include xrk/attractor.14.I"
#define NOMBRE_MAXIMAL_DE_POINTS_GERABLES \
MIN2(NOMBRE_MAXIMAL_DE_POINTS_VISUALISABLES,NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION) \
/* Cette constante permet de gerer d'une facon homogene les listes de dimension */ \
/* 'nombre_de_periodes_de_la_simulation' comme celles de dimension 'nombre_d_iterations'. */
/* ATTENTION, a ne pas confondre : */
/* */
/* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que */
/* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par */
/* 'fTRANSFORMAT_31(...)', et */
/* */
/* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque */
/* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la */
/* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite */
/* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'... */
/* */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N D E M E M O R I S A T I O N D U P O I N T C O U R A N T : */
/* */
/*************************************************************************************************************************************/
#include xrk/attractor.16.I"
#define RAYON_DE_VISUALISATION_D_UN_CORPS \
ACCES_LISTE(liste_initiale_des_RAYON,corps)
#define RAYON_DE_VISUALISATION \
PARE(2.0e10)
DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,RAYON_DE_VISUALISATION)));
/* Rayon du disque materialisant une iteration. ATTENTION, cette variable n'est pas un */
/* parametre du programme ; il est mis a jour en permanence au cours des calculs... */
#define FACTEUR_DU_RAYON_DE_VISUALISATION \
FU
DEFV(Local,DEFV(Float,INIT(facteur_du_rayon_de_visualisation,FACTEUR_DU_RAYON_DE_VISUALISATION)));
/* Et facteur multiplicatif... */
BFonctionI
DEFV(Local,DEFV(FonctionI,memorisation_1_point_07(AXf,AYf,AZf,AdXf,AdYf,AdZf,numero_de_l_iteration_courante)))
DEFV(Argument,DEFV(Float,AXf));
DEFV(Argument,DEFV(Float,AYf));
DEFV(Argument,DEFV(Float,AZf));
/* Definition de la position {x,y,z} de l'iteration courante. */
DEFV(Argument,DEFV(Float,AdXf));
DEFV(Argument,DEFV(Float,AdYf));
DEFV(Argument,DEFV(Float,AdZf));
/* Definition des differentielles {dx,dy,dz} de la position de l'iteration courante. */
DEFV(Argument,DEFV(Int,numero_de_l_iteration_courante));
/* Numero de l'iteration courante afin d'attenuer eventuellement la luminance des points */
/* materialisant chaque iteration en fonction de leur numero (les premieres iterations etant */
/* plus sombres, et les dernieres etant plus lumineuses). */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
#include xrk/attractor.15.I"
INIT_ERROR;
/*..............................................................................................................................*/
MEMORISATION_DU_POINT_COURANT(X_DERIVEE_DANS_01(AdXf)
,Y_DERIVEE_DANS_01(AdYf)
,Z_DERIVEE_DANS_01(AdZf)
);
/* Memorisation du point courant en Noir et Blanc ou en Couleurs, mais uniquement s'il est */
/* visible en fonction des conditions de visualisation... */
RETU_ERROR;
Eblock
EFonctionI
#define VISIBILITE(niveau) \
MUL2(visibilite_du_point,niveau) \
/* Pour pouvoir attenuer {AdXf,AdYf,AdZf}... */
BFonctionI
DEFV(Local,DEFV(FonctionI,memorisation_point_grave(AXf,AYf,AZf
,AdXf,AdYf,AdZf
,pG
,numero_de_l_iteration_courante
,visibilite_du_point
)
)
)
DEFV(Argument,DEFV(Float,AXf));
DEFV(Argument,DEFV(Float,AYf));
DEFV(Argument,DEFV(Float,AZf));
/* Definition de la position {x,y,z} de l'iteration courante. */
DEFV(Argument,DEFV(Float,AdXf));
DEFV(Argument,DEFV(Float,AdYf));
DEFV(Argument,DEFV(Float,AdZf));
/* Definition des differentielles {dx,dy,dz} de la position de l'iteration courante. */
DEFV(Argument,DEFV(Float,pG));
/* Ponderation du point courant lors de l'eventuel calcul du centre de gravite (introduit */
/* le 19990608091843). */
DEFV(Argument,DEFV(Int,numero_de_l_iteration_courante));
/* Numero de l'iteration courante afin d'attenuer eventuellement la luminance des points */
/* materialisant chaque iteration en fonction de leur numero (les premieres iterations etant */
/* plus sombres, et les dernieres etant plus lumineuses). */
DEFV(Argument,DEFV(Float,visibilite_du_point));
/* Indicateur introduit le 20061026125547 qui precise si le point courant est visible */
/* ('VRAI') ou pas ('FAUX')... */
/* */
/* Le type est passe de 'Logical' a 'Float' le 20061106140813 afin d'en faire simultanement */
/* une attenuation des trois composantes chromatiques... */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
#include xrk/attractor.15.I"
INIT_ERROR;
/*..............................................................................................................................*/
Test(IZGT(visibilite_du_point))
Bblock
/* Cas ou le corps courant est visible : */
DEFINITION_PONDERATION_DU_PSEUDO_CENTRE_DE_GRAVITE_DE_LA_SPHERE_COURANTE(pG);
/* Memorisation de la ponderation du point courant lors de l'eventuel calcul du centre de */
/* gravite. */
CALS(memorisation_1_point_07(AXf,AYf,AZf
,VISIBILITE(AdXf),VISIBILITE(AdYf),VISIBILITE(AdZf)
,numero_de_l_iteration_courante
)
);
/* Memorisation du point courant en Noir et Blanc ou en Couleurs, mais uniquement s'il est */
/* visible en fonction des conditions de visualisation... */
Eblock
ATes
Bblock
/* Cas ou le corps courant n'est pas visible : rien a faire. Cette possibilite a ete */
/* introduite le 20061026125547... */
Eblock
ETes
RETU_ERROR;
Eblock
EFonctionI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N S D E V I S U A L I S A T I O N E T D ' I N T E R P O L A T I O N : */
/* */
/*************************************************************************************************************************************/
#define __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND \
/* Afin de permettre la mise en place d'un fond pour chaque image generee (definition */ \
/* deplacee ici le 20030313151750). D'autre part 'PERMETTRE_L_UTILISATION_D_UN_FOND' */ \
/* a ete change en '__VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' le 20030313145928 */ \
/* afin de permettre sa recuperation dans 'v $xcc/cpp$Z _VERSION_'. */
#include xrk/attractor.17.I"
#include xrv/particule.31.I"
#define VISUALISER_L_ENSEMBLE_DES_INSTANTS \
FAUX
DEFV(Local,DEFV(Logical,INIT(visualiser_l_ensemble_des_instants,VISUALISER_L_ENSEMBLE_DES_INSTANTS)));
/* Doit-on visualiser l'ensemble des instants ('VRAI') ou bien uniquement l'instant */
/* precedent ('FAUX'). */
#define REDUCTION_DES_INSTANTS_ANTERIEURS(grandeur,facteur_de_reduction) \
COND(IFEQ(periode,numero_de_la_periode_courante_de_la_simulation) \
,NEUT(grandeur) \
,MUL2(facteur_de_reduction,grandeur) \
) \
/* Procedure de reduction d'une grandeur en fonction de son "age"... */
#define FACTEUR_DE_REDUCTION_DES_RAYONS_DES_INSTANTS_ANTERIEURS \
FU
DEFV(Local,DEFV(Float,INIT(facteur_de_reduction_des_rayons_des_instants_anterieurs
,FACTEUR_DE_REDUCTION_DES_RAYONS_DES_INSTANTS_ANTERIEURS
)
)
);
/* Lorsque 'IL_FAUT(visualiser_l_ensemble_des_instants)' l'instant precedent doit etre */
/* visualise a l'aide 'ACCES_LISTE(liste_initiale_des_RAYON,corps)', alors que les instants */
/* anterieurs seront differencies a l'aide de ce facteur d'echelle (en general inferieur ou */
/* egal a 1). */
#define FACTEUR_DE_REDUCTION_DES_COULEURS_DES_INSTANTS_ANTERIEURS \
FU
DEFV(Local,DEFV(Float,INIT(facteur_de_reduction_des_couleurs_des_instants_anterieurs
,FACTEUR_DE_REDUCTION_DES_COULEURS_DES_INSTANTS_ANTERIEURS
)
)
);
/* Lorsque 'IL_FAUT(visualiser_l_ensemble_des_instants)' l'instant precedent doit etre */
/* visualise a l'aide 'ACCES_LISTE(liste_initiale_des_RVB,corps)', 'liste_initiale_des_RVB' */
/* symbolisant les listes 'liste_initiale_des_ROUGE', 'liste_initiale_des_VERTE' et */
/* 'liste_initiale_des_BLEUE', alors que les instants anterieurs seront differencies a */
/* l'aide de ce facteur d'echelle (en general inferieur ou egal a 1). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D U T E M P S */
/* E T D E C E Q U I P E U T V A R I E R A U C O U R S D U T E M P S : */
/* */
/*************************************************************************************************************************************/
dfTRANSFORMAT_31(liste_initiale_des_PAS_DE_TEMPS,fichier_LISTE_PAS_DE_TEMPS,PAS_DE_TEMPS_IMPLICITE,DCT)
#define ACCES_PAS_DE_TEMPS(numero_de_la_periode) \
sTRANSFORMAT_31(numero_de_la_periode \
,liste_initiale_des_PAS_DE_TEMPS \
) \
/* Definition du fichier de liste des pas de temps (introduit le 20070827100654). */
dfTRANSFORMAT_31(liste_initiale_des_FACTEUR_DU_RAYON
,fichier_LISTE_FACTEUR_DU_RAYON
,FACTEUR_DU_RAYON_DE_VISUALISATION_IMPLICITE
,FACTEUR_DU_RAYON_DE_VISUALISATION
)
#define ACCES_FACTEUR_DU_RAYON(numero_de_la_periode) \
sTRANSFORMAT_31(numero_de_la_periode \
,liste_initiale_des_FACTEUR_DU_RAYON \
) \
/* Definition du fichier de liste des facteurs multiplicatifs du rayon de visualisation */ \
/* (introduit le 20070827100654). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E L A S I M U L A T I O N */
/* D U P R O B L E M E D I T D E S " N C O R P S " A L ' A I D E D E */
/* M O U V E M E N T S E L L I P T I Q U E S D A N S L ' E S P A C E : */
/* */
/* */
/* Definition : */
/* */
/* Soit la famille {C ,C ,...,C } de 'N' */
/* 1 2 N */
/* corps en mouvement elliptique suivant les */
/* lois de Kepler, par rapport a un centre (appele */
/* 'centre_de_l_espace_pour_la_visualisation'). */
/* Chaque corps se deplace donc dans un plan */
/* dont l'orientation est definie grace aux */
/* trois angles d'Euler {theta,psi,phi} */
/* ('v $ximD/definit.1$DEF INITIALISATION_D_UNE_MATRICE_DE_ROTATION_D_EULER'). */
/* */
/* Le systeme fonctionne comme celui du */
/* 'N-corps'. Ainsi, on pourra definir comme */
/* premier corps, un corps dont le mouvement */
/* circulaire se reduit a un point grace a : */
/* */
/* DEMI_PETIT_AXE_2D=0 */
/* DEMI_GRAND_AXE_2D=0 */
/* TEMPS_INITIAL=0 */
/* FACTEUR_DU_TEMPS=0 */
/* */
/* sachant qu'en fait seuls 'DEMI_PETIT_AXE_2D' et 'DEMI_GRAND_AXE_2D' */
/* sont necessaires. Ceci aura pour principal */
/* avantage de materialiser ce centre dans */
/* les images. */
/* */
/* Chaque corps sera donc defini par le */
/* plan {OX2,OY2} ('OZ2' est donc la normale */
/* a ce plan) de son orbite defini par ses */
/* angles d'Euler : */
/* */
/* {THETA_3D,PSI_3D,PHI_3D} */
/* {TRANSLATION_X_3D,TRANSLATION_Y_3D,TRANSLATION_Z_3D} */
/* */
/* dans l'espace absolu {OX1,OY1,OZ1} (suivant evidemment les definitions de */
/* 'v $ximD/definit.1$DEF INITIALISATION_D_UNE_MATRICE_DE_ROTATION_D_EULER') */
/* et par son mouvement elliptique "gravitationnelle" : */
/* */
/* {DEMI_PETIT_AXE_2D,DEMI_GRAND_AXE_2D,TEMPS_INITIAL,FACTEUR_DU_TEMPS} */
/* */
/* Tout ceci est detaille dans l'Encyclopedia Universalis, */
/* Volume 10, Page 657. Ainsi, le mouvement gravitationnel */
/* elliptique d'un corps peut etre decrit a l'aide d'un */
/* mouvement circulaire sur le Cercle circonscrit a l'Ellipse. */
/* L'angle polaire 'thetaC' de parcours du Cercle satisfait a */
/* l'equation dite "de Kepler" : */
/* */
/* thetaC - e.sin(thetaC) = k.(t-t0) */
/* */
/* d'ou : */
/* */
/* thetaC = fonction1(temps) */
/* */
/* ou 'e' designe l'excentricite de l'Ellipse, 't' le */
/* temps courant, 't0' l'instant initial et 'k' une */
/* constante. En ce qui concerne l'Ellipse, son equation */
/* polaire est : */
/* */
/* p */
/* rhoE = ------------------- */
/* 1 + e.cos(thetaE) */
/* */
/* (l'origine etant le foyer de droite de l'Ellipse) d'ou, */
/* le points courants du Cercle et de l'Ellipse ayant meme */
/* abscisee : */
/* */
/* x = rhoC.cos(thetaC) = rhoE.cos(thetaE) + d */
/* */
/* (l'origine etant le centre de l'Ellipse -et du Cercle-) d'ou : */
/* */
/* thetaE = fonction2(thetaC). */
/* */
/* et enfin, les coordonnees {x,y} du point courant de l'Ellipse : */
/* */
/* x = rhoE.cos(thetaE) + d */
/* y = rhoE.sin(thetaE) */
/* */
/* (l'origine etant le centre de l'Ellipse -et du Cercle-) avec : */
/* */
/* a = demi-grand axe (= rhoC) */
/* b = demi-petit axe */
/* d = distance focale */
/* e = excentricite */
/* p = parametre focal */
/* */
/* avec les definitions suivantes : */
/* */
/* ________ */
/* / 2 2 */
/* d = \/ a - b */
/* */
/* d */
/* e = --- */
/* a */
/* */
/* 2 */
/* b */
/* p = ---- */
/* a */
/* */
/* On notera que : */
/* */
/* a = b ==> thetaE = thetaC */
/* */
/* la trajectoire est alors circulaire (l'Ellipse et son */
/* Cercle circonscrit sont confondus...). */
/* */
/* */
/* On pourra "simuler" la troisieme loi de */
/* Kepler qui stipule que le carre de la periode */
/* de revolution est proportionnel au cube du */
/* (demi-)grand axe de la trajectoire, soit : */
/* */
/* 2 3 */
/* T = k.a */
/* */
/* ou encore : */
/* */
/* 3 */
/* --- */
/* 2 */
/* T = k.a */
/* */
/* ce qui se retient en se souvenant que */
/* la periode 'T' croit plus vite que le */
/* (demi-)grand axe 'a'... */
/* */
/* On prendra alors : */
/* */
/* k */
/* FacteurTemps = ------ */
/* 3 */
/* --- */
/* 2 */
/* a */
/* */
/* ou 'FacteurTemps' designe le facteur de "conversion" */
/* du temps en un angle "circulaire". Mais, pour simplifier */
/* l'usage de ce programme, il y a deux jeux de parametres */
/* equivalents : */
/* */
/* {TEMPS_INITIAL,FACTEUR_DU_TEMPS} */
/* */
/* et : */
/* */
/* {THETA_2D,DELTA_THETA_2D} */
/* */
/* le second jeu venant de 'v $xrr/N_spheres.11$K DELTA_THETA_2D'. */
/* */
/* Ensuite, en jouant sur l'origine des */
/* coordonnees, on pourra obtenir tous */
/* les phenomenes vus avec le probleme */
/* des 'N-corps'... */
/* */
/* */
/*************************************************************************************************************************************/
#define COMPATIBILITE_20051107 \
FAUX
DEFV(Local,DEFV(Logical,INIT(compatibilite_20051107,COMPATIBILITE_20051107)));
/* Le 20051107155323, j'ai observe que des corps dont a priori les trajectoires devaient */
/* etre coplanaires ne l'etaient en fait pas dans les images. Cela venait du fait que passer */
/* de la matrice d'Euler directe a la matrice d'Euler inverse ne se fait pas en changenat le */
/* signe des angles {theta,psi,phi} ('v $ximD/definit.1$DEF psi..direct.et..psi..inverse'). */
/* Cela a conduit aussi aux modifications 'v $xrr/N_spheres.11$K compatibilite_20051107' */
/* et 'v $xiirk/.NCOR.f1.1.11.$U _____Compatibilite_20051107'... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E S L I S T E S D E S C R I P T I V E S I N I T I A L E S D E S C O R P S : */
/* */
/*************************************************************************************************************************************/
/* ATTENTION, a ne pas confondre : */
/* */
/* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que */
/* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par */
/* 'fTRANSFORMAT_31(...)', et */
/* */
/* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque */
/* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la */
/* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite */
/* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'... */
/* */
dfTRANSFORMAT_31(liste_initiale_des_THETA_3D,fichier_THETA_3D,THETA_3D_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_PSI_3D,fichier_PSI_3D,PSI_3D_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_PHI_3D,fichier_PHI_3D,PHI_3D_IMPLICITE,FZERO)
/* Definition des fichiers de definition des orientations des plans des trajectoires. */
dfTRANSFORMAT_31(liste_initiale_des_TRANSLATION_X_3D,fichier_TRANSLATION_X_3D,TRANSLATION_X_3D_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_TRANSLATION_Y_3D,fichier_TRANSLATION_Y_3D,TRANSLATION_Y_3D_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_TRANSLATION_Z_3D,fichier_TRANSLATION_Z_3D,TRANSLATION_Z_3D_IMPLICITE,FZERO)
/* Definition des fichiers de definition des translations des plans des trajectoires. */
dfTRANSFORMAT_31(liste_initiale_des_PONDERATION_CENTRE_DE_GRAVITE
,fichier_LISTE_PONDERATION_CENTRE_DE_GRAVITE
,PONDERATION_CENTRE_DE_GRAVITE_IMPLICITE
,FU
)
/* Definition du fichier de liste des ponderations lors du calcul eventuel du centre de */
/* gravite. Ce dispositif a ete introduit le 19990608091843 afin de permettre, par exemple, */
/* de calculer le centre de gravite des planetes du systeme solaire (en excluant donc dans */
/* ce calcul, le Soleil...). */
dfTRANSFORMAT_31(liste_initiale_des_DEMI_PETIT_AXE_2D
,fichier_LISTE_DEMI_PETIT_AXE_2D
,DEMI_PETIT_AXE_2D_IMPLICITE
,MUL2(FLOT(MILLE),FLOT(MILLIARD))
)
dfTRANSFORMAT_31(liste_initiale_des_DEMI_GRAND_AXE_2D
,fichier_LISTE_DEMI_GRAND_AXE_2D
,DEMI_GRAND_AXE_2D_IMPLICITE
,MUL2(FLOT(MILLE),FLOT(MILLIARD))
)
dfTRANSFORMAT_31(liste_initiale_des_TEMPS_INITIAL,fichier_LISTE_TEMPS_INITIAL,TEMPS_INITIAL_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_FACTEUR_DU_TEMPS,fichier_LISTE_FACTEUR_DU_TEMPS,FACTEUR_DU_TEMPS_IMPLICITE,FRA10(FRA10(FU)))
dfTRANSFORMAT_31(liste_initiale_des_THETA_2D,fichier_LISTE_THETA_2D,THETA_2D_IMPLICITE,FZERO)
dfTRANSFORMAT_31(liste_initiale_des_DELTA_THETA_2D,fichier_LISTE_DELTA_THETA_2D,DELTA_THETA_2D_IMPLICITE,FRA10(FRA10(FU)))
/* Definition du mouvement dans un plan par (rho,theta,TempsInitial), en notant que la */
/* possibilite d'introduire un 'theta' existe mais est exclue de l'introduction du */
/* 'TempsInitial'... */
dfTRANSFORMAT_31(liste_initiale_des_RAYON,fichier_LISTE_RAYON,RAYON_IMPLICITE,RAYON_DE_VISUALISATION)
/* Definition du fichier de liste des rayons. */
/* */
/* ATTENTION, le rayon est en unite d'ecran [0,1]. */
dfTRANSFORMAT_31(liste_initiale_des_VISIBILITE,fichier_LISTE_VISIBILITE,VISIBILITE_IMPLICITE,COORDONNEE_BARYCENTRIQUE_MAXIMALE)
/* Definition du fichier de la liste des visibilites des corps introduite le 20061026125547. */
/* Par defaut, tous les corps sont evidemment visibles ('VRAI'). */
/* */
/* La valeur implicite est passee de 'VRAI' a 'COORDONNEE_BARYCENTRIQUE_MAXIMALE' le */
/* 20061106140827 afin d'en faire simultanement une attenuation des trois composantes */
/* chromatiques... */
dfTRANSFORMAT_31(liste_initiale_des_ROUGE,fichier_LISTE_ROUGE,ROUGE_IMPLICITE,BLANC)
dfTRANSFORMAT_31(liste_initiale_des_VERTE,fichier_LISTE_VERTE,VERTE_IMPLICITE,BLANC)
dfTRANSFORMAT_31(liste_initiale_des_BLEUE,fichier_LISTE_BLEUE,BLEUE_IMPLICITE,BLANC)
/* Definition des fichiers de listes de couleurs. */
/* */
/* ATTENTION, les couleurs des points a visualiser doivent etre definies ainsi : */
/* */
/* ROUGE E [NOIR,BLANC] */
/* VERTE E [NOIR,BLANC] */
/* BLEUE E [NOIR,BLANC] */
/* */
#define PAS_DU_THETA_CIRCULAIRE \
FRA1(FU)
DEFV(Local,DEFV(Float,INIT(pas_du_theta_circulaire,PAS_DU_THETA_CIRCULAIRE)));
#define EPSILON_DE_RESOLUTION \
FRA10(FRA10(FRA10(FU)))
DEFV(Local,DEFV(Float,INIT(epsilon_de_resolution,EPSILON_DE_RESOLUTION)));
/* Pour resoudre iterativement l'equation de Kepler. Le 20051106115656, la valeur anterieure */
/* ('GRAND_EPSILON') a ete largement augmentee... */
#define FACTEUR_DE_CONVERSION__DELTA_THETA_2D__FACTEUR_DU_TEMPS \
FU
DEFV(Local,DEFV(Float,INIT(facteur_de_conversion__delta_theta_2d__facteur_du_temps
,FACTEUR_DE_CONVERSION__DELTA_THETA_2D__FACTEUR_DU_TEMPS
)
)
);
/* Facteur pour passer de 'ACCES_DELTA_THETA_2D(...)' a 'ACCES_FACTEUR_DU_TEMPS(...)' */
/* introduit le 20051104093939... */
#define NOMBRE_DE_PAS_DE_TEMPS_PAR_PERIODE \
GRO4(DIX_MILLE)
DEFV(Local,DEFV(Int,INIT(nombre_de_pas_de_temps_par_periode,NOMBRE_DE_PAS_DE_TEMPS_PAR_PERIODE)));
/* Definition du nombre de pas de temps que l'on effectue pour une periode (c'est-a-dire */
/* entre deux images calculees). */
/* */
/* On notera l'inutilite de ce parametre qui est introduit pour des raisons de compatibilite */
/* avec 'v $xrr/N_corps.11$K'. */
dfTRANSFORMAT_31(liste_initiale_des_NOMBRES,fichier_LISTE_NOMBRES,NOMBRES_IMPLICITE,NOMBRE_DE_PAS_DE_TEMPS_PAR_PERIODE)
#define ACCES_NOMBRES(numero_de_la_periode) \
sTRANSFORMAT_31(numero_de_la_periode \
,liste_initiale_des_NOMBRES \
) \
/* Definition du fichier de liste des nombres (introduit le 20070827100654...). */
#include xrv/particule.21.I"
/* ATTENTION, a ne pas confondre : */
/* */
/* 1-'nombre_de_periodes_de_la_simulation' qui definit finalement le nombre d'images que */
/* l'on va generer et qui conditionne toutes les listes (sans exception...) definies par */
/* 'fTRANSFORMAT_31(...)', et */
/* */
/* 2-'nombre_d_iterations' qui definit le nombre de particules visualisees dans chaque */
/* image ; les listes relatives aux particules sont definies elles-aussi a l'aide de la */
/* procedure 'dTRANSFORMAT_31(...)' ce qui signifie que 'nombre_d_iterations' est limite */
/* par 'NOMBRE_MAXIMAL_DE_PERIODES_DE_LA_SIMULATION'... */
/* */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E S L I S T E S D E S C R I P T I V E S C O U R A N T E S D E S C O R P S : */
/* */
/*************************************************************************************************************************************/
DEFV(Float,DdTb1(POINTERs
,liste_des_demi_petit_axe_effectif_a_l_instant_courant
,nombre_de_corps
,ADRESSE_NON_ENCORE_DEFINIE
)
);
DEFV(Float,DdTb1(POINTERs
,liste_des_demi_grand_axe_effectif_a_l_instant_courant
,nombre_de_corps
,ADRESSE_NON_ENCORE_DEFINIE
)
);
DEFV(Float,DdTb1(POINTERs
,liste_des_distance_focale_a_l_instant_courant
,nombre_de_corps
,ADRESSE_NON_ENCORE_DEFINIE
)
);
DEFV(Float,DdTb1(POINTERs
,liste_des_parametre_focal_a_l_instant_courant
,nombre_de_corps
,ADRESSE_NON_ENCORE_DEFINIE
)
);
DEFV(Float,DdTb1(POINTERs
,liste_des_excentricite_a_l_instant_courant
,nombre_de_corps
,ADRESSE_NON_ENCORE_DEFINIE
)
);
DEFV(Float,DdTb1(POINTERs
,liste_des_theta_circulaire_a_l_instant_courant
,nombre_de_corps
,ADRESSE_NON_ENCORE_DEFINIE
)
);
DEFV(pointF_3D,DdTb1(POINTERs
,liste_des_coordonnees_a_l_instant_courant
,nombre_de_corps
,ADRESSE_NON_ENCORE_DEFINIE
)
);
/* Definition de l'instant courant. */
DEFV(pointF_3D,DdTb2(POINTERs
,liste_des_coordonnees_cumule_sur_toute_la_duree
,nombre_de_corps
,nombre_de_periodes_de_la_simulation
,ADRESSE_NON_ENCORE_DEFINIE
)
);
/* Definition de l'ensemble des instants cumules. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E L ' I N T E G R A T I O N D U S Y S T E M E */
/* D ' E Q U A T I O N S D I F F E R E N T I E L L E S : */
/* */
/*************************************************************************************************************************************/
#include xrk/integr.2B.vv.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* A C C E S A U X L I S T E S : */
/* */
/*************************************************************************************************************************************/
#define DERNIER_POINT_DES_LISTES \
LSTX(PREMIER_POINT_DES_LISTES,nombre_de_corps) \
/* Definition du dernier point des listes. */
#define ACCES_THETA_3D(corps) \
IdTb1(liste_initiale_des_THETA_3D \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_PSI_3D(corps) \
IdTb1(liste_initiale_des_PSI_3D \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_PHI_3D(corps) \
IdTb1(liste_initiale_des_PHI_3D \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_TRANSLATION_X_3D(corps) \
IdTb1(liste_initiale_des_TRANSLATION_X_3D \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_TRANSLATION_Y_3D(corps) \
IdTb1(liste_initiale_des_TRANSLATION_Y_3D \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_TRANSLATION_Z_3D(corps) \
IdTb1(liste_initiale_des_TRANSLATION_Z_3D \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
/* Acces aux caracteristiques du corps de numero donne 'corps' dans sa position initiale. */
#define ACCES_DEMI_PETIT_AXE_EFFECTIF_COURANT(corps) \
IdTb1(liste_des_demi_petit_axe_effectif_a_l_instant_courant \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_DEMI_GRAND_AXE_EFFECTIF_COURANT(corps) \
IdTb1(liste_des_demi_grand_axe_effectif_a_l_instant_courant \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_DISTANCE_FOCALE_COURANT(corps) \
IdTb1(liste_des_distance_focale_a_l_instant_courant \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_PARAMETRE_FOCAL_COURANT(corps) \
IdTb1(liste_des_parametre_focal_a_l_instant_courant \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_EXCENTRICITE_COURANT(corps) \
IdTb1(liste_des_excentricite_a_l_instant_courant \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_THETA_CIRCULAIRE_COURANT(corps) \
IdTb1(liste_des_theta_circulaire_a_l_instant_courant \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_COORDONNEES_COURANTES(corps) \
IdTb1(liste_des_coordonnees_a_l_instant_courant \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_PONDERATION_CENTRE_DE_GRAVITE(corps) \
IdTb1(liste_initiale_des_PONDERATION_CENTRE_DE_GRAVITE \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_DEMI_PETIT_AXE_2D(corps) \
IdTb1(liste_initiale_des_DEMI_PETIT_AXE_2D \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_DEMI_GRAND_AXE_2D(corps) \
IdTb1(liste_initiale_des_DEMI_GRAND_AXE_2D \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_TEMPS_INITIAL(corps) \
IdTb1(liste_initiale_des_TEMPS_INITIAL \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_FACTEUR_DU_TEMPS(corps) \
IdTb1(liste_initiale_des_FACTEUR_DU_TEMPS \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_THETA_2D(corps) \
IdTb1(liste_initiale_des_THETA_2D \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_DELTA_THETA_2D(corps) \
IdTb1(liste_initiale_des_DELTA_THETA_2D \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
#define ACCES_RAYON(corps) \
IdTb1(liste_initiale_des_RAYON \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
)
/* Acces aux caracteristiques du corps de numero donne 'corps' dans sa position courante. */
#define ACCES_COORDONNEES_CUMULEES(corps,periode) \
IdTb2(liste_des_coordonnees_cumule_sur_toute_la_duree \
,INDX(corps,PREMIER_POINT_DES_LISTES) \
,nombre_de_corps \
,INDX(periode,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION) \
,nombre_de_periodes_de_la_simulation \
)
/* Acces aux coordonnees sur l'ensemble de la simulation. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S D ' U N E E L L I P S E : */
/* */
/*************************************************************************************************************************************/
#define SEUIL_DE_VALIDATION_DE_L_EXCENTRICITE \
FDU \
/* Ceci fut introduit le 20051107113951 afin de valider l'excentricite des ellipses dans */ \
/* le cas ou 'IL_NE_FAUT_PAS(prendre_une_echelle_lineaire_pour_les_coordonnees). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D U P O I N T D E R E F E R E N C E C O U R A N T : */
/* */
/*************************************************************************************************************************************/
#include xrr/N_corps.11.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D E S I N I T I A L I S A T I O N S : */
/* */
/*************************************************************************************************************************************/
/* Jusqu'au 20030313151750, '__VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' etait defini */
/* ici, mais cela est contraire aux tests dont il est l'objet dans */
/* 'v $xrv/champs_5.12$I __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' via */
/* 'v $xrk/attractor.17$I champs_5.12', d'ou son deplacement a cette date... */
#include xrk/attractor.18.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M O U V E M E N T S E L L I P T I Q U E S D A N S L ' E S P A C E : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DONNEES_NECESSAIRES_A_L_UTILISATION_D_UN_FOND;
DEFV(Int,INIT(corpsI,UNDEF));
DEFV(Int,INIT(corpsJ,UNDEF));
DEFV(Int,INIT(corps,UNDEF));
/* Pour manipuler les listes... */
/*..............................................................................................................................*/
INITIALISATIONS_GENERALES;
/* Initialisations generales faites au tout debut... */
iTRANSFORMAT_31(liste_initiale_des_THETA_3D,THETA_3D_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_PSI_3D,PSI_3D_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_PHI_3D,PHI_3D_IMPLICITE);
/* Initialisation des fichiers de definition des orientations des plans des trajectoires. */
iTRANSFORMAT_31(liste_initiale_des_TRANSLATION_X_3D,TRANSLATION_X_3D_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_TRANSLATION_Y_3D,TRANSLATION_Y_3D_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_TRANSLATION_Z_3D,TRANSLATION_Z_3D_IMPLICITE);
/* Initialisation des fichiers de definition des translations des plans des trajectoires. */
iTRANSFORMAT_31(liste_initiale_des_PONDERATION_CENTRE_DE_GRAVITE,PONDERATION_CENTRE_DE_GRAVITE_IMPLICITE);
/* Initialisation du fichier de liste des ponderations de calcul du centre de gravite. */
iTRANSFORMAT_31(liste_initiale_des_DEMI_PETIT_AXE_2D,DEMI_PETIT_AXE_2D_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_DEMI_GRAND_AXE_2D,DEMI_GRAND_AXE_2D_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_TEMPS_INITIAL,TEMPS_INITIAL_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_FACTEUR_DU_TEMPS,FACTEUR_DU_TEMPS_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_THETA_2D,THETA_2D_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_DELTA_THETA_2D,DELTA_THETA_2D_IMPLICITE);
/* Initialisation du fichier de definition du mouvement dans un plan par (rho,theta,Dtheta). */
iTRANSFORMAT_31(liste_initiale_des_RAYON,RAYON_IMPLICITE);
/* Initialisation du fichier de liste des rayons. */
iTRANSFORMAT_31(liste_initiale_des_VISIBILITE,VISIBILITE_IMPLICITE);
/* Initialisation du fichier de la liste des visibilites des corps introduite le */
/* 20061026125547. */
iTRANSFORMAT_31(liste_initiale_des_ROUGE,ROUGE_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_VERTE,VERTE_IMPLICITE);
iTRANSFORMAT_31(liste_initiale_des_BLEUE,BLEUE_IMPLICITE);
/* Initialisation des fichiers de listes de couleurs. */
iTRANSFORMAT_31(liste_initiale_des_PAS_DE_TEMPS,PAS_DE_TEMPS_IMPLICITE);
/* Initialisation du pas de temps variable (introduit le 20070827100654). */
iTRANSFORMAT_31(liste_initiale_des_NOMBRES,NOMBRES_IMPLICITE);
/* Initialisation du nombre variable (introduit le 20070827100654). */
iTRANSFORMAT_31(liste_initiale_des_FACTEUR_DU_RAYON,FACTEUR_DU_RAYON_DE_VISUALISATION_IMPLICITE);
/* Initialisation du fichier de liste des facteurs multiplicatifs du rayon de */
/* visualisation (introduit le 20070827100654). */
#include xrv/champs_5.1A.I"
GET_ARGUMENTSv(nombre_d_arguments
,BLOC(GET_ARGUMENT_L("compatibilite_20051107=",compatibilite_20051107);
PROCESS_ARGUMENT_I("nombre_points=""npoints=""iterations=""corps=",nombre_de_corps
/* Le 20111211095835, les parametres "nombre_points=""npoints=""iterations=" ont ete */
/* introduits par symetrie avec 'v $xrv/particule.10$K nombre_points= (par exemple...). */
,BLOC(VIDE;)
,BLOC(
Bblock
PRINT_AVERTISSEMENT("'corps=' doit etre defini avant tout fichier");
Test(IFGT(nombre_de_corps,NOMBRE_MAXIMAL_DE_POINTS_GERABLES))
Bblock
PRINT_ERREUR("le nombre de points a gerer est trop important");
PRINT_ERREUR("il va donc etre seuille");
CAL1(Prer2("Il vaut %d alors que le maximum est de %d\n"
,nombre_de_corps
,NOMBRE_MAXIMAL_DE_POINTS_GERABLES
)
);
EGAL(nombre_de_corps,NOMBRE_MAXIMAL_DE_POINTS_GERABLES);
/* Et on seuille le nombre de points... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
)
);
/* ATTENTION : la recuperation de 'nombre_de_corps' doit preceder les */
/* 'PROCESS_ARGUMENT_C(...)' qui suivent car ils l'utilisent. */
PROCESS_ARGUMENTS_GEOMETRIQUES;
PROCESS_ARGUMENT_FICHIER("LISTE_THETA_3D="
,fichier_THETA_3D
,liste_initiale_des_THETA_3D
,THETA_3D_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_PSI_3D="
,fichier_PSI_3D
,liste_initiale_des_PSI_3D
,PSI_3D_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_PHI_3D="
,fichier_PHI_3D
,liste_initiale_des_PHI_3D
,PHI_3D_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_TRANSLATION_X_3D="
,fichier_TRANSLATION_X_3D
,liste_initiale_des_TRANSLATION_X_3D
,TRANSLATION_X_3D_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_TRANSLATION_Y_3D="
,fichier_TRANSLATION_Y_3D
,liste_initiale_des_TRANSLATION_Y_3D
,TRANSLATION_Y_3D_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_TRANSLATION_Z_3D="
,fichier_TRANSLATION_Z_3D
,liste_initiale_des_TRANSLATION_Z_3D
,TRANSLATION_Z_3D_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_PONDERATION_CENTRE_DE_GRAVITE="
,fichier_LISTE_PONDERATION_CENTRE_DE_GRAVITE
,liste_initiale_des_PONDERATION_CENTRE_DE_GRAVITE
,PONDERATION_CENTRE_DE_GRAVITE_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_DEMI_PETIT_AXE_2D="
,fichier_LISTE_DEMI_PETIT_AXE_2D
,liste_initiale_des_DEMI_PETIT_AXE_2D
,DEMI_PETIT_AXE_2D_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_DEMI_GRAND_AXE_2D="
,fichier_LISTE_DEMI_GRAND_AXE_2D
,liste_initiale_des_DEMI_GRAND_AXE_2D
,DEMI_GRAND_AXE_2D_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_TEMPS_INITIAL="
,fichier_LISTE_TEMPS_INITIAL
,liste_initiale_des_TEMPS_INITIAL
,TEMPS_INITIAL_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_FACTEUR_DU_TEMPS="
,fichier_LISTE_FACTEUR_DU_TEMPS
,liste_initiale_des_FACTEUR_DU_TEMPS
,FACTEUR_DU_TEMPS_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_THETA_2D="
,fichier_LISTE_THETA_2D
,liste_initiale_des_THETA_2D
,THETA_2D_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_DELTA_THETA_2D="
,fichier_LISTE_DELTA_THETA_2D
,liste_initiale_des_DELTA_THETA_2D
,DELTA_THETA_2D_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_RAYON="
,fichier_LISTE_RAYON
,liste_initiale_des_RAYON
,RAYON_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_VISIBILITE="
,fichier_LISTE_VISIBILITE
,liste_initiale_des_VISIBILITE
,VISIBILITE_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_ROUGE="
,fichier_LISTE_ROUGE
,liste_initiale_des_ROUGE
,ROUGE_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_VERTE="
,fichier_LISTE_VERTE
,liste_initiale_des_VERTE
,VERTE_IMPLICITE
,lTRANSFORMAT_11
);
PROCESS_ARGUMENT_FICHIER("LISTE_BLEUE="
,fichier_LISTE_BLEUE
,liste_initiale_des_BLEUE
,BLEUE_IMPLICITE
,lTRANSFORMAT_11
);
/* Le 20090617163958, l'instruction : */
/* */
/* GET_ARGUMENT_F("extension=",facteur_d_extension_de_l_espace_physique); */
/* */
/* a ete mise dans 'v $xrv/champs_5.1A$I facteur_d_extension_de_l_espace_physique' de facon */
/* globale... */
GET_ARGUMENT_L("lineaire=",prendre_une_echelle_lineaire_pour_les_coordonnees);
GET_ARGUMENT_F("exposant=",exposant_de_l_echelle);
GET_ARGUMENT_F("dt=""dct=",dct);
PROCESS_ARGUMENT_FICHIER("DCT="
,fichier_LISTE_PAS_DE_TEMPS
,liste_initiale_des_PAS_DE_TEMPS
,PAS_DE_TEMPS_IMPLICITE
,gTRANSFORMAT_31
);
GET_ARGUMENT_I("nombre=",nombre_de_pas_de_temps_par_periode);
PROCESS_ARGUMENT_FICHIER("NOMBRE="
,fichier_LISTE_NOMBRES
,liste_initiale_des_NOMBRES
,NOMBRES_IMPLICITE
,gTRANSFORMAT_31
);
GET_ARGUMENT_F("facteur_conversion=""conversion=",facteur_de_conversion__delta_theta_2d__facteur_du_temps);
GET_ARGUMENT_F("ptc=""pas_theta_circulaire=",pas_du_theta_circulaire);
GET_ARGUMENT_F("epsilon=",epsilon_de_resolution);
PROCESS_ARGUMENTS_DE_VISUALISATION;
PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES;
GET_ARGUMENT_F("Ar=",facteur_du_rayon_de_visualisation);
PROCESS_ARGUMENT_FICHIER("FACTEUR="
,fichier_LISTE_FACTEUR_DU_RAYON
,liste_initiale_des_FACTEUR_DU_RAYON
,FACTEUR_DU_RAYON_DE_VISUALISATION_IMPLICITE
,gTRANSFORMAT_31
);
GET_ARGUMENT_L("ensemble=",visualiser_l_ensemble_des_instants);
GET_ARGUMENT_F("Ranterieurs=""Ranterieur=",facteur_de_reduction_des_rayons_des_instants_anterieurs);
GET_ARGUMENT_F("Canterieurs=""Canterieur=",facteur_de_reduction_des_couleurs_des_instants_anterieurs);
GET_ARGUMENT_L("centrer=",definir_la_scene_par_rapport_au_centre_de_l_espace);
GET_ARGUMENT_F("Xcentre=",X_centre_de_l_espace_pour_la_visualisation);
GET_ARGUMENT_F("Ycentre=",Y_centre_de_l_espace_pour_la_visualisation);
GET_ARGUMENT_F("Zcentre=",Z_centre_de_l_espace_pour_la_visualisation);
GET_ARGUMENT_I("reference=",corps_de_reference);
GET_ARGUMENT_L("derniere_position=",se_referer_a_la_derniere_position_du_corps_de_reference);
GET_ARGUMENT_L("trainees=",generer_les_trainees);
GET_ARGUMENT_L("renormaliser=",renormaliser_les_trainees);
GET_ARGUMENT_I("mode_des_trainees=""mode=",mode_de_generation_des_trainees);
GET_ARGUMENT_F("attenuation_des_trainees=",facteur_d_attenuation_des_trainees);
GET_ARGUMENT_F("attenuation_des_images=",facteur_d_attenuation_des_images);
GET_ARGUMENT_L("coordonnees=",editer_les_coordonnees);
)
);
#include xrv/champs_5.19.I"
/* Pour eviter le message : */
/* */
/* Static function is not referenced. */
/* */
/* sur 'SYSTEME_ES9000_AIX_CC'... */
#include xrk/attractor.19.I"
/* Validations et definition de l'espace physique. */
INITIALISATION_DE_LA_SYNTHESE_D_IMAGE;
/* Initialisation eventuelle du calcul des trainees... */
Test(IFET(IL_NE_FAUT_PAS(definir_la_scene_par_rapport_au_centre_de_l_espace)
,NINCff(corps_de_reference,PREMIER_POINT_DES_LISTES,nombre_de_corps)
)
)
Bblock
PRINT_ATTENTION("le corps de reference demande n'existe pas, on lui substitue la valeur par defaut");
EGAL(corps_de_reference,CORPS_DE_REFERENCE);
Eblock
ATes
Bblock
Eblock
ETes
MdTb1(liste_des_demi_petit_axe_effectif_a_l_instant_courant
,nombre_de_corps
,Float
,ADRESSE_NON_ENCORE_DEFINIE
);
MdTb1(liste_des_demi_grand_axe_effectif_a_l_instant_courant
,nombre_de_corps
,Float
,ADRESSE_NON_ENCORE_DEFINIE
);
MdTb1(liste_des_distance_focale_a_l_instant_courant
,nombre_de_corps
,Float
,ADRESSE_NON_ENCORE_DEFINIE
);
MdTb1(liste_des_parametre_focal_a_l_instant_courant
,nombre_de_corps
,Float
,ADRESSE_NON_ENCORE_DEFINIE
);
MdTb1(liste_des_excentricite_a_l_instant_courant
,nombre_de_corps
,Float
,ADRESSE_NON_ENCORE_DEFINIE
);
MdTb1(liste_des_theta_circulaire_a_l_instant_courant
,nombre_de_corps
,Float
,ADRESSE_NON_ENCORE_DEFINIE
);
MdTb1(liste_des_coordonnees_a_l_instant_courant
,nombre_de_corps
,pointF_3D
,ADRESSE_NON_ENCORE_DEFINIE
);
/* Definition de l'instant courant. */
MdTb2(liste_des_coordonnees_cumule_sur_toute_la_duree
,nombre_de_corps
,nombre_de_periodes_de_la_simulation
,pointF_3D
,ADRESSE_NON_ENCORE_DEFINIE
);
/* Definition de l'ensemble des instants cumules. */
Komp(corps,nombre_de_corps)
Bblock
DEFV(Float,INIT(demi_petit_axe,ACCES_DEMI_PETIT_AXE_2D(corps)));
DEFV(Float,INIT(demi_grand_axe,ACCES_DEMI_GRAND_AXE_2D(corps)));
/* Caracteristiques principales de l'ellipse du corps courant... */
DEFV(Float,INIT(demi_petit_axe_effectif,FLOT__UNDEF));
DEFV(Float,INIT(demi_grand_axe_effectif,FLOT__UNDEF));
DEFV(Float,INIT(distance_focale,FLOT__UNDEF));
DEFV(Float,INIT(parametre_focal,FLOT__UNDEF));
DEFV(Float,INIT(excentricite,FLOT__UNDEF));
/* Caracteristiques secondaires de l'ellipse du corps courant... */
EGAL(demi_petit_axe_effectif,MIN2(demi_petit_axe,demi_grand_axe));
EGAL(demi_grand_axe_effectif,MAX2(demi_petit_axe,demi_grand_axe));
EGAL(distance_focale,RACX(SOUS(EXP2(demi_grand_axe_effectif),EXP2(demi_petit_axe_effectif))));
EGAL(excentricite,DIVI(distance_focale,demi_grand_axe_effectif));
EGAL(parametre_focal,DIVI(EXP2(demi_petit_axe_effectif),demi_grand_axe_effectif));
/* Calcul des caracteristiques secondaires de l'ellipse du corps courant... */
EGAL(ACCES_DEMI_PETIT_AXE_EFFECTIF_COURANT(corps),demi_petit_axe_effectif);
EGAL(ACCES_DEMI_GRAND_AXE_EFFECTIF_COURANT(corps),demi_grand_axe_effectif);
EGAL(ACCES_DISTANCE_FOCALE_COURANT(corps),distance_focale);
EGAL(ACCES_PARAMETRE_FOCAL_COURANT(corps),parametre_focal);
EGAL(ACCES_EXCENTRICITE_COURANT(corps),excentricite);
/* Mise a jour des listes du corps courant... */
INITIALISATION_POINT_3D(ACCES_COORDONNEES_COURANTES(corps)
,FLOT__UNDEF
,FLOT__UNDEF
,FLOT__UNDEF
);
Test(IFET(IFEQ_chaine(fichier_LISTE_TEMPS_INITIAL,NOM_PIPE_Local)
,IFNE_chaine(fichier_LISTE_DELTA_THETA_2D,NOM_PIPE_Local)
)
)
Bblock
EGAL(ACCES_FACTEUR_DU_TEMPS(corps)
,SCAL(ACCES_DELTA_THETA_2D(corps)
,MUL2(nombre_de_pas_de_temps_par_periode,dct)
,facteur_de_conversion__delta_theta_2d__facteur_du_temps
)
);
/* Definition eventuelle du facteur du temps a partir d'une variation d'un 'theta' fictif. */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFET(IFEQ_chaine(fichier_LISTE_TEMPS_INITIAL,NOM_PIPE_Local)
,IFNE_chaine(fichier_LISTE_THETA_2D,NOM_PIPE_Local)
)
)
Bblock
Test(IZNE(ACCES_FACTEUR_DU_TEMPS(corps)))
Bblock
EGAL(ACCES_TEMPS_INITIAL(corps)
,NEGA(DIVI(SOUS(ACCES_THETA_2D(corps),SINX(ACCES_THETA_2D(corps))),ACCES_FACTEUR_DU_TEMPS(corps)))
);
/* Definition eventuelle du temps initial a partir d'un 'theta' fictif. */
Eblock
ATes
Bblock
EGAL(ACCES_TEMPS_INITIAL(corps),instant_initial);
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
EGAL(ACCES_THETA_CIRCULAIRE_COURANT(corps)
,MUL2(ACCES_FACTEUR_DU_TEMPS(corps),SOUS(instant_initial,ACCES_TEMPS_INITIAL(corps)))
);
/* Definition de la position angulaire initiale des corps dans leurs plan. */
Test(IL_NE_FAUT_PAS(prendre_une_echelle_lineaire_pour_les_coordonnees))
Bblock
Test(IFGT(excentricite,SEUIL_DE_VALIDATION_DE_L_EXCENTRICITE))
/* Ce test a ete introduit le 20051107113951 lorsque j'ai decouvert qu'evidemment */
/* l'utilisation d'echelles non lineaires ne pouvait pas conserver la forme des ellipses. */
/* Elles adoptent alors une forme ressemblant un peu a une galaxie vue par la tranche... */
Bblock
PRINT_ATTENTION("un corps a une excentricite trop importante, incompatible avec les echelles non lineaires");
CAL1(Prer1("Il s'agit du corps %d.\n",corps));
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
EKom
Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation)
Bblock
DEFV(Int,INIT(periode,UNDEF));
DEFV(Int,INIT(numero_effectif_de_la_premiere_periode_de_la_simulation
,COND(IL_FAUT(visualiser_l_ensemble_des_instants)
,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION
,numero_de_la_periode_courante_de_la_simulation
)
)
);
/* Numero effectif de la premiere periode a visualiser. */
Test(IFNE_chaine(fichier_LISTE_PAS_DE_TEMPS,NOM_PIPE_Local))
Bblock
EGAL(dct,ACCES_PAS_DE_TEMPS(numero_de_la_periode_courante_de_la_simulation));
/* Possibilite introduite le 20070827100654... */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFNE_chaine(fichier_LISTE_NOMBRES,NOM_PIPE_Local))
Bblock
Test(N_EST_PAS_ENTIER(ACCES_NOMBRES(numero_de_la_periode_courante_de_la_simulation)))
Bblock
PRINT_ATTENTION("un nombre de pas de temps n'est pas entier");
CAL1(Prer1("numero de la periode courante=%d\n",numero_de_la_periode_courante_de_la_simulation));
Eblock
ATes
Bblock
EGAL(nombre_de_pas_de_temps_par_periode,ACCES_NOMBRES(numero_de_la_periode_courante_de_la_simulation));
/* Possibilite introduite le 20070827100654... */
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(IFNE_chaine(fichier_LISTE_FACTEUR_DU_RAYON,NOM_PIPE_Local))
Bblock
EGAL(facteur_du_rayon_de_visualisation,ACCES_FACTEUR_DU_RAYON(numero_de_la_periode_courante_de_la_simulation));
/* Possibilite introduite le 20070827100654... */
Eblock
ATes
Bblock
Eblock
ETes
INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante);
/* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image. */
Komp(corps,nombre_de_corps)
Bblock
DEFV(Float,INIT(demi_petit_axe_effectif,ACCES_DEMI_PETIT_AXE_EFFECTIF_COURANT(corps)));
DEFV(Float,INIT(demi_grand_axe_effectif,ACCES_DEMI_GRAND_AXE_EFFECTIF_COURANT(corps)));
DEFV(Float,INIT(distance_focale,ACCES_DISTANCE_FOCALE_COURANT(corps)));
DEFV(Float,INIT(parametre_focal,ACCES_PARAMETRE_FOCAL_COURANT(corps)));
DEFV(Float,INIT(excentricite,ACCES_EXCENTRICITE_COURANT(corps)));
/* Caracteristiques secondaires de l'ellipse du corps courant... */
DEFV(pointF_2D,position_du_corps_dans_son_plan);
/* Definition bidimensionnelle du point en coordonnees polaires, puis cartesiennes. */
DEFV(deltaF_3D,vecteur_position_du_corps_dans_l_espace_relatif);
/* Definition tridimensionnelle du point dans un referentiel relatif lie a son plan. */
DEFV(deltaF_3D,vecteur_position_du_corps_dans_l_espace_absolu);
/* Definition tridimensionnelle du point dans un referentiel absolu. */
DEFV(matrixF_3D,matrice_de_rotation);
/* Matrice de rotation d'Euler permettant de passer du plan du corps courant a l'espace */
/* absolu. */
Test(IFET(IZNE(demi_petit_axe_effectif),IZNE(demi_grand_axe_effectif)))
Bblock
DEFV(Float,INIT(rho_circulaire_du_corps,FLOT__UNDEF));
DEFV(Float,INIT(theta_circulaire_du_corps,ACCES_THETA_CIRCULAIRE_COURANT(corps)));
DEFV(Float,INIT(pas_du_theta_circulaire_du_corps,pas_du_theta_circulaire));
/* Coordonnees {rhoC,thetaC} de parcours du cercle circonscrit a l'ellipse du corps courant. */
DEFV(Float,INIT(rho_elliptique_du_corps,FLOT__UNDEF));
DEFV(Float,INIT(theta_elliptique_du_corps,FLOT__UNDEF));
DEFV(Int,INIT(correction_du_theta_elliptique_du_corps,UNDEF));
/* Coordonnees {rhoE,thetaE} de parcours de l'ellipse du corps courant. */
DEFV(Float,INIT(temps_effectif
,MUL2(ACCES_FACTEUR_DU_TEMPS(corps),SOUS(temps_courant,ACCES_TEMPS_INITIAL(corps)))
)
);
/* Temps effectif dans l'equation de Kepler... */
DEFV(Logical,INIT(resoudre_l_equation_de_Kepler,VRAI));
/* Pour resoudre l'equation de Kepler iterativement... */
EGAL(rho_circulaire_du_corps,demi_grand_axe_effectif);
/* Caracteristiques du cercle circonscrit a l'ellipse du corps courant. */
Tant(IL_FAUT(resoudre_l_equation_de_Kepler))
Bblock
DEFV(Float,INIT(equation_de_kepler
,SOUS(theta_circulaire_du_corps
,MUL2(excentricite,SINX(theta_circulaire_du_corps))
)
)
);
/* Formule d'equivalence entre le temps (de parcours de l'ellipse) et le 'thetaC' du cercle */
/* circonscrit a l'ellipse : */
/* */
/* thetaC - e.sin(thetaC) = temps */
/* */
/* d'ou : */
/* */
/* thetaC = fonction1(temps). */
/* */
/* C'est l'equation de Kepler. Au passage, toute cette sequence de resolution est inspiree */
/* de 'v $xtc/EquKepler.01$c'... */
Test(IFLT(SOUA(equation_de_kepler,temps_effectif),epsilon_de_resolution))
Bblock
DEFV(Float,INIT(numerateur
,SOUS(MUL2(rho_circulaire_du_corps,COSX(theta_circulaire_du_corps)),distance_focale)
)
);
DEFV(Float,INIT(denominateur
,SOUS(AXPB(excentricite,distance_focale,parametre_focal)
,MUL3(rho_circulaire_du_corps,excentricite,COSX(theta_circulaire_du_corps))
)
)
);
DEFV(Float,INIT(quotient,FLOT__UNDEF));
/* On a : */
/* */
/* p */
/* rhoE = ------------------- */
/* 1 + e.cos(thetaE) */
/* */
/* (l'origine etant le foyer de droite de l'ellipse) d'ou : */
/* */
/* x = rhoC.cos(thetaC) = rhoE.cos(thetaE) + d */
/* */
/* (l'origine etant le centre de l'ellipse -et du cercle-) d'ou : */
/* */
/* thetaE = fonction2(thetaC). */
/* */
/* et enfin, les coordonnees {x,y} du point courant de l'ellipse : */
/* */
/* x = rhoE.cos(thetaE) + d */
/* y = rhoE.sin(thetaE) */
/* */
/* (l'origine etant le centre de l'ellipse -et du cercle-) avec : */
/* */
/* a = demi_grand_axe_effectif (= rhoC) */
/* b = demi_petit_axe_effectif */
/* d = distance_focale */
/* e = excentricite */
/* p = parametre_focal */
/* */
/* On notera que : */
/* */
/* a = b ==> thetaE = thetaC */
/* */
EGAL(quotient,DIVI(numerateur,denominateur));
Test(IFINff(quotient,COSX(PI),COSX(FZERO)))
Bblock
EGAL(theta_elliptique_du_corps,ACOX(quotient));
Eblock
ATes
Bblock
EGAL(theta_elliptique_du_corps,ACOX(MEME_SIGNE_QUE(quotient,COSX(FZERO))));
Eblock
ETes
EGAL(correction_du_theta_elliptique_du_corps,INTE(DIVI(theta_circulaire_du_corps,PI)));
/* En effet, 'ACOX(...)' renvoie des valeurs dans [0,pi]... */
Test(IZGE(correction_du_theta_elliptique_du_corps))
Bblock
Test(EST_PAIR(correction_du_theta_elliptique_du_corps))
Bblock
EGAL(theta_elliptique_du_corps
,ADD2(MUL2(FLOT(ADD2(correction_du_theta_elliptique_du_corps,ZERO)),PI)
,theta_elliptique_du_corps
)
);
/* Cas ou le point se situe sur le demi-cercle superieur... */
Eblock
ATes
Bblock
EGAL(theta_elliptique_du_corps
,SOUS(MUL2(FLOT(ADD2(correction_du_theta_elliptique_du_corps,UN)),PI)
,theta_elliptique_du_corps
)
);
/* Cas ou le point se situe sur le demi-cercle inferieur... */
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
EGAL(rho_elliptique_du_corps
,DIVI(parametre_focal,AXPB(excentricite,COSX(theta_elliptique_du_corps),FU))
);
/* Rappelons l'equation polaire de l'ellipse : */
/* */
/* p */
/* rhoE = ------------------- */
/* 1 + e.cos(thetaE) */
/* */
/* (l'origine etant le foyer de droite de l'ellipse)... */
EGAL(resoudre_l_equation_de_Kepler,FAUX);
/* Et l'equation de Kepler est resolue... */
Eblock
ATes
Bblock
Test(IFGT(equation_de_kepler,temps_effectif))
Bblock
EGAL(pas_du_theta_circulaire_du_corps,MOIT(pas_du_theta_circulaire_du_corps));
EGAL(theta_circulaire_du_corps,SOUS(theta_circulaire_du_corps,pas_du_theta_circulaire_du_corps));
/* Cas ou le point courant du cercle est en avance sur le temps, il faut le faire reculer... */
Eblock
ATes
Bblock
EGAL(theta_circulaire_du_corps,ADD2(theta_circulaire_du_corps,pas_du_theta_circulaire_du_corps));
/* Cas ou le point courant du cercle est en retard sur le temps, il faut le faire avancer... */
Eblock
ETes
Eblock
ETes
Eblock
ETan
EGAL(ACCES_THETA_CIRCULAIRE_COURANT(corps),theta_circulaire_du_corps);
/* Et ce pour l'iteration suivante de la simulation... */
INITIALISATION_POINT_2D(position_du_corps_dans_son_plan
,ADD2(Xcartesienne_2D(rho_elliptique_du_corps,theta_elliptique_du_corps),distance_focale)
,NEUT(Ycartesienne_2D(rho_elliptique_du_corps,theta_elliptique_du_corps))
);
Eblock
ATes
Bblock
INITIALISATION_POINT_2D(position_du_corps_dans_son_plan
,FZERO
,FZERO
);
Eblock
ETes
INITIALISATION_ACCROISSEMENT_3D(vecteur_position_du_corps_dans_l_espace_relatif
,ASD1(position_du_corps_dans_son_plan,x)
,ASD1(position_du_corps_dans_son_plan,y)
,FZERO
);
/* Position du corps dans un referentiel relatif lie a son plan {OX2,OY2}, la coordonnee */
/* 'Z' est donc nulle... */
Test(IL_FAUT(compatibilite_20051107))
Bblock
INITIALISATION_D_UNE_MATRICE_DE_ROTATION_D_EULER(matrice_de_rotation
,NEGA(ACCES_THETA_3D(corps))
,NEGA(ACCES_PSI_3D(corps))
,NEGA(ACCES_PHI_3D(corps))
);
/* Initialisation de la matrice de rotation d'Euler permettant de passer du plan {OX2,OY2} */
/* du corps courant a l'espace absolu {OX1,OY1,OZ1}. On notera les 'NEGA(...)' dus au fait */
/* qu'il s'agit donc ici de l'inverse de la rotation directe et habituelle. Ceci a ete */
/* reconnue comme une erreur grave le 20051107155323... */
Eblock
ATes
Bblock
INITIALISATION_D_UNE_MATRICE_DE_ROTATION_D_EULER(matrice_de_rotation
,NEUT(ACCES_THETA_3D(corps))
,NEUT(ACCES_PSI_3D(corps))
,NEUT(ACCES_PHI_3D(corps))
);
/* Initialisation de la matrice de rotation d'Euler permettant de passer du plan {OX2,OY2} */
/* du corps courant a l'espace absolu {OX1,OY1,OZ1}. */
Eblock
ETes
PRODUIT_MATRICE_ACCROISSEMENT_3D(vecteur_position_du_corps_dans_l_espace_absolu
,matrice_de_rotation
,vecteur_position_du_corps_dans_l_espace_relatif
);
/* Position du corps dans l'espace absolu {OX1,OY1,OZ1}. */
INITIALISATION_POINT_3D(ACCES_COORDONNEES_COURANTES(corps)
,ADD3(X_centre_de_l_espace_pour_la_visualisation
,ACCES_TRANSLATION_X_3D(corps)
,ASD1(vecteur_position_du_corps_dans_l_espace_absolu,dx)
)
,ADD3(Y_centre_de_l_espace_pour_la_visualisation
,ACCES_TRANSLATION_Y_3D(corps)
,ASD1(vecteur_position_du_corps_dans_l_espace_absolu,dy)
)
,ADD3(Z_centre_de_l_espace_pour_la_visualisation
,ACCES_TRANSLATION_Z_3D(corps)
,ASD1(vecteur_position_du_corps_dans_l_espace_absolu,dz)
)
);
/* Memorisation du point courant... */
TRANSFERT_POINT_3D(ACCES_COORDONNEES_CUMULEES(corps,numero_de_la_periode_courante_de_la_simulation)
,ACCES_COORDONNEES_COURANTES(corps)
);
/* Et enfin, memorisation de la trajectoire du corps courant. */
Eblock
EKom
Test(IFGE(numero_de_la_periode_courante,numero_de_la_premiere_periode_a_visualiser))
/* Cette optimisation assez inhabituelle (pour moi...) a ete introduite le 1996032400 car, */
/* en effet, lorsque la periode courante n'est pas encore a visualiser, il y a ci-apres */
/* beaucoup de calculs inutiles et assez penalisants... */
Bblock
DoIn(periode
,numero_effectif_de_la_premiere_periode_de_la_simulation
,numero_de_la_periode_courante_de_la_simulation
,I
)
Bblock
Komp(corps,nombre_de_corps)
Bblock
DEFV(Float,INIT(cx_eventuellement_decentree,FLOT__UNDEF));
DEFV(Float,INIT(cy_eventuellement_decentree,FLOT__UNDEF));
DEFV(Float,INIT(cz_eventuellement_decentree,FLOT__UNDEF));
/* Coordonnees eventuellement decentrees... */
EGAL(cx,ASD1(ACCES_COORDONNEES_CUMULEES(corps,periode),x));
EGAL(cy,ASD1(ACCES_COORDONNEES_CUMULEES(corps,periode),y));
EGAL(cz,ASD1(ACCES_COORDONNEES_CUMULEES(corps,periode),z));
/* A cause de 'RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES', il est necessaire */
/* de passer par {cx,cy,cz}. */
EGAL(cx_eventuellement_decentree,DECENTRAGE_DES_COORDONNEES(cx,X,x));
EGAL(cy_eventuellement_decentree,DECENTRAGE_DES_COORDONNEES(cy,Y,y));
EGAL(cz_eventuellement_decentree,DECENTRAGE_DES_COORDONNEES(cz,Z,z));
/* Et decentrage eventuel... */
EGAL(rayon_de_visualisation
,REDUCTION_DES_INSTANTS_ANTERIEURS(RAYON_DE_VISUALISATION_D_UN_CORPS
,facteur_de_reduction_des_rayons_des_instants_anterieurs
)
);
/* Recuperation eventuelle du rayon de chaque point... */
EGAL(dcx
,REDUCTION_DES_INSTANTS_ANTERIEURS(ACCES_LISTE(liste_initiale_des_ROUGE,corps)
,facteur_de_reduction_des_couleurs_des_instants_anterieurs
)
);
EGAL(dcy
,REDUCTION_DES_INSTANTS_ANTERIEURS(ACCES_LISTE(liste_initiale_des_VERTE,corps)
,facteur_de_reduction_des_couleurs_des_instants_anterieurs
)
);
EGAL(dcz
,REDUCTION_DES_INSTANTS_ANTERIEURS(ACCES_LISTE(liste_initiale_des_BLEUE,corps)
,facteur_de_reduction_des_couleurs_des_instants_anterieurs
)
);
CALS(memorisation_point_grave(cx_eventuellement_decentree
,cy_eventuellement_decentree
,cz_eventuellement_decentree
,dcx
,dcy
,dcz
,ACCES_PONDERATION_CENTRE_DE_GRAVITE(corps)
,periode
,ACCES_LISTE(liste_initiale_des_VISIBILITE,corps)
)
);
/* Memorisation du corps courant, la premiere image donnant les conditions initiales... */
/* ATTENTION, jusqu'au 19970401145229, on trouvait 'corps' a la place de 'periode' ; bien */
/* que ne servant a rien, j'ai corrige cette erreur... */
RECHERCHE_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES;
/* On notera que cette recherche n'est pas conditionnee par 'editer_les_extrema', car les */
/* extrema pourraient etre utilises pour la visualisation... */
Test(IL_FAUT(editer_les_coordonnees))
Bblock
Test(IFEQ(periode,numero_de_la_periode_courante_de_la_simulation))
Bblock
/* Edition des coordonnees et des vitesses d'une part lorsque cela est demandee et d'autre */
/* part lorsque 'IL_FAUT(visualiser_l_ensemble_des_instants)', c'est-a-dire si l'on est sur */
/* la "tete de la comete"... */
CAL2(Prin1("temps=%f",temps_courant));
CAL2(Prin1(" corps=%04d",corps));
CAL2(Prin3(" coordonnees={%+.17f,%+.17f,%+.17f}"
,ASD1(ACCES_COORDONNEES_COURANTES(corps),x)
,ASD1(ACCES_COORDONNEES_COURANTES(corps),y)
,ASD1(ACCES_COORDONNEES_COURANTES(corps),z)
)
);
CAL2(Prin0("\n"));
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
EKom
Eblock
EDoI
Eblock
ATes
Bblock
Eblock
ETes
Repe(COND(IFGT(numero_de_la_periode_courante_de_la_simulation,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION)
,nombre_de_pas_de_temps_par_periode
,SUCC(nombre_de_pas_de_temps_par_periode)
)
)
Bblock
INCREMENTATION_DE_L_HORLOGE(dct);
/* Simulation du temps de la simulation... */
Eblock
ERep
#include xrk/attractor.1A.I"
VISUALISATION_DES_AXES_DE_COORDONNEES;
/* Visualisation si necessaire des trois axes de coordonnees. */
GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE(BLOC(VIDE;));
/* Generation de l'image courante... */
Eblock
EKom
FdTb2(liste_des_coordonnees_cumule_sur_toute_la_duree
,nombre_de_corps
,nombre_de_periodes_de_la_simulation
,pointF_3D
,ADRESSE_NON_ENCORE_DEFINIE
);
FdTb1(liste_des_coordonnees_a_l_instant_courant
,nombre_de_corps
,pointF_3D
,ADRESSE_NON_ENCORE_DEFINIE
);
FdTb1(liste_des_theta_circulaire_a_l_instant_courant
,nombre_de_corps
,pointF_3D
,ADRESSE_NON_ENCORE_DEFINIE
);
FdTb1(liste_des_excentricite_a_l_instant_courant
,nombre_de_corps
,pointF_3D
,ADRESSE_NON_ENCORE_DEFINIE
);
FdTb1(liste_des_parametre_focal_a_l_instant_courant
,nombre_de_corps
,pointF_3D
,ADRESSE_NON_ENCORE_DEFINIE
);
FdTb1(liste_des_distance_focale_a_l_instant_courant
,nombre_de_corps
,pointF_3D
,ADRESSE_NON_ENCORE_DEFINIE
);
FdTb1(liste_des_demi_grand_axe_effectif_a_l_instant_courant
,nombre_de_corps
,pointF_3D
,ADRESSE_NON_ENCORE_DEFINIE
);
FdTb1(liste_des_demi_petit_axe_effectif_a_l_instant_courant
,nombre_de_corps
,pointF_3D
,ADRESSE_NON_ENCORE_DEFINIE
);
/* Liberation des espaces alloues... */
/* */
/* Les 'ADRESSE_NON_ENCORE_DEFINIE's ont ete introduits le 20050221173409... */
EDITION_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES;
/* Edition facultative des extrema des coordonnees et des derivees. */
RETU_Commande;
Eblock
ECommande