/*************************************************************************************************************************************/ /* */ /* 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