/*************************************************************************************************************************************/ /* */ /* P R O B L E M E D I T D E S " N - C O R P S " : */ /* */ /* */ /* .:oOOoo-....-:oOOo:. */ /* .:O-. -:. */ /* .-::::.-:oOOOoooo:ooooOOOoo:..-:::-.. :. */ /* .-::..:oo- .-:ooooooooooooooooo:-oo. -oo:. .::- -. */ /* -:: .oo. .:oo--OOo:-. .:.. .-:oo:-: :oo- .o: ::. ... */ /* .:- -o. .:o..::-. .-.-.--oo---:o:-o.:- :-. .:- o: .:. -... */ /* -: -o -: .-. .-....-o o%%O. .-...-. -. -. o. -... */ /* - .: .-. .- --.--.:-. :--:-------. -- --. -....::.. */ /* .- -- o. .-- .--:- --:::::::::::-. -:::-.-::-. .:..... -.. */ /* .- .O.-- .--:::..-::oooooo::::::oooooo::-:ooo:-. .:--...--. -.. */ /* ...o. ..-:. .--::oooooOoOooOooooooo::--.. -o--....::-.. -... */ /* O ..... ..--:o:. oo:o:--...:o:-....--.... */ /* .O .......--. ...--::ooooOOOOOOOOOOo:-....---..----...... */ /* -- ........-----::::ooo:--.....::----........ */ /* .:-: .-:::---................ */ /* .. .................. */ /* */ /* */ /* (d'apres la representation 'v $xiirk/NCOR.U1.2048' */ /* du systeme solaire durant une annee plutonienne) */ /* */ /* */ /* Author of '$xrr/N_corps.11$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1995??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_ET_LES_VITESSES \ FAUX DEFV(Local,DEFV(Logical,INIT(editer_les_coordonnees_et_les_vitesses,EDITER_LES_COORDONNEES_ET_LES_VITESSES))); /* Indique si a chaque pas de temps on doit editer ('VRAI') ou pas ('FAUX') les coordonnees */ /* et les vitesses 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'. */ #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 \ PARE(4.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... */ #define RAYON_DE_VISUALISATION_D_UN_CORPS \ MUL2(facteur_du_rayon_de_visualisation \ ,COND(EST_VRAI(les_rayons_de_visualisation_sont_fonction_de_la_masse) \ ,MUL2(ACCES_LISTE(liste_initiale_des_RAYON,corps) \ ,RAC3(ACCES_MASSES(corps)) \ ) \ ,ACCES_LISTE(liste_initiale_des_RAYON,corps) \ ) \ ) \ /* Le 20070227143708, PUIX(...,INVE(TRI_DIMENSIONNEL))' fut remplace par 'RAC3(...)'. */ #define LES_RAYONS_DE_VISUALISATION_SONT_FONCTION_DE_LA_MASSE \ FAUX DEFV(Local,DEFV(Logical,INIT(les_rayons_de_visualisation_sont_fonction_de_la_masse ,LES_RAYONS_DE_VISUALISATION_SONT_FONCTION_DE_LA_MASSE ) ) ); /* Indique si le rayon de visualisation de chaque corps est defini de facon "absolue" */ /* ('FAUX') ou bien s'il est de plus fonction de la masse ('VRAI'). Dans ce dernier cas */ /* 'liste_initiale_des_RAYON' devient un facteur de proportionnalite. Afin de conserver */ /* tailles utilisees jusqu'a present, par exemple pour le Soleil, on pourra utiliser : */ /* */ /* LISTE_RAYON=32 */ /* */ /* cette constante ayant ete obtenue grace aux caracteristiques du Soleil. Jusqu'a present */ /* on utilisait : */ /* */ /* M(Soleil) = +2.0e30 */ /* R(Soleil) = +40e10 */ /* */ /* La constante '32' ci-dessus vient de : */ /* */ /* */ /* 40e10 */ /* ------------- ~ 31.7 ~ 32 */ /* 1 */ /* --- */ /* 3 */ /* (2.0e30) */ /* */ /* Malheureusement, l'experience montre que pour voir nettement les planetes, c'est */ /* plutot '256' qu'il faut utiliser : */ /* */ /* LISTE_RAYON=256 */ /* */ /* ce qui donne un soleil demesure (mais tres realiste...). */ 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 ,masse ,VXf,VYf,VZf ,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(Float,masse)); /* Masse de l'iteration courante... */ DEFV(Argument,DEFV(Float,VXf)); DEFV(Argument,DEFV(Float,VYf)); DEFV(Argument,DEFV(Float,VZf)); /* Definition de la vitesse (Vx,Vy,Vz) 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). */ DEFV(Argument,DEFV(Float,visibilite_du_point)); /* Indicateur introduit le 20061026114627 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_DE_LA_VITESSE_DE_LA_SPHERE_COURANTE(VXf,VYf,VZf); /* Memorisation de la masse du point courant. */ 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. */ DEFINITION_DE_LA_MASSE_DE_LA_SPHERE_COURANTE(masse); /* Memorisation de la masse du point courant. */ 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 20061026114627... */ 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 20030313151705). 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 20070821160427). */ #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). */ 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 20070821160427...). */ 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 20070827094840). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U D E P L A C E M E N T M I N I M A L V I S U A L I S A B L E : */ /* */ /*************************************************************************************************************************************/ #define FACTEUR_DU_DEPLACEMENT_MINIMAL_ACCEPTABLE \ FZERO DEFV(Local,DEFV(Float,INIT(facteur_du_deplacement_minimal_acceptable ,FACTEUR_DU_DEPLACEMENT_MINIMAL_ACCEPTABLE ) ) ); /* Permet a partir du rayon de chaque corps, de determiner le deplacement minimal entre */ /* deux positions successives. Ceci n'a de sens, bien entendu, que lorsque l'on doit */ /* visualiser l'ensemble des instants, soit 'IL_FAUT(visualiser_l_ensemble_des_instants)'. */ /* La valeur par defaut 'FZERO' a ete choisie afin d'assurer la compatibilite avec les */ /* versions anterieures... */ /*===================================================================================================================================*/ /* :Debut_listMN_PROBLEME_DES_N_CORPS_11: */ /*************************************************************************************************************************************/ /* */ /* D E F I N I 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 " : */ /* */ /* */ /* Definition : */ /* */ /* Soit la famille {C ,C ,...,C } de 'N' */ /* 1 2 N */ /* corps graves en interaction gravitationnelle. */ /* Pour l'un d'entre-eux, la loi fondamentale de */ /* la dynamique s'ecrit : */ /* */ /* ---> -------> */ /* F = M . Gamma */ /* i i i */ /* */ /* dans le cas present, la force 'F' est la */ /* resultante de l'interaction gravitationnelle */ /* des 'N-1' autres corps. On aura donc : */ /* */ /* -------> ---> */ /* M .Gamma = F */ /* i i i */ /* */ /* ou encore : */ /* */ /* 2 ----> ______ */ /* d OA \ M M */ /* i \ i k -----> */ /* M .--------- = G / ----------- A A */ /* i 2 /_____ |----->|3 i k */ /* dt k#i | A A | */ /* | i k | */ /* */ /* ou encore : */ /* */ /* 2 ----> ______ */ /* d OA \ M */ /* i \ k -----> */ /* --------- = G / ----------- A A */ /* 2 /_____ |----->|3 i k */ /* dt k#i | A A | */ /* | i k | */ /* */ /* On aboutit ainsi a un systeme d'equations */ /* differentielles non lineaires du second */ /* ordre utilisant les fonctions suivantes : */ /* */ /* F = 1 */ /* 3X */ /* i */ /* */ /* F = 0 */ /* 2X */ /* i */ /* ______ */ /* \ M X */ /* \ k k */ /* F = -G / -----------------------------------------(---- - 1) */ /* 1X /_____ | | 3 X */ /* i k#i | |--- i */ /* | 2 2 2| 2 */ /* |(X - X ) + (Y - Y ) + (Z - Z )| */ /* | k i k i k i | */ /* */ /* F = 0 */ /* 0X */ /* i */ /* */ /* avec bien entendu des formules equivalentes */ /* pour les coordonnees 'Y' et 'Z'... */ /* */ /* Pour integrer ce systeme non lineaire, on */ /* suppose que la condition suivante est respectee */ /* (elle est d'ailleurs verifiee a chaque iteration) : */ /* */ /* DISTANCE(C ,C ) >= |V |.dct \-/ i,j */ /* i j max */ /* */ /* ce qui signifie "grossierement" que deux corps */ /* quelconques sont toujours suffisamment eloignes */ /* pour ne pas pouvoir se rejoindre en un pas de */ /* temps (ou 'Vmax' designe le plus grand module */ /* des vitesses moyennes de l'ensemble des corps */ /* au cours du pas de temps precedent). */ /* */ /* Enfin, a l'instant 't' (ou l'on integre), les */ /* fonctions 'F1?(...)' ne peuvent etre evaluees */ /* puisque dependant de {X(t),Y(t),Z(t)}. Or leurs */ /* valeurs sont necessaires, on utilise donc leurs */ /* valeurs "retardees" {X(t-dt),Y(t-dt),Z(t-dt)}, */ /* ou 'dt' designe le pas de temps. */ /* */ /* Enfin, on se souviendra quel la troisieme */ /* loi de Kepler stipule que le carre de la periode */ /* 'T' de revolution est proportionnel au cube du */ /* (demi-)grand axe de la trajectoire 'R', soit : */ /* */ /* 2 3 */ /* T = k.R */ /* */ /* ou encore : */ /* */ /* 3 */ /* --- */ /* 2 */ /* T = k.R */ /* */ /* ce qui se retient en se souvenant que */ /* la periode 'T' croit plus vite que le */ /* rayon 'R'... */ /* */ /* */ /* En ce qui concerne les vitesses 'V' de */ /* revolution, en supposant un mouvement */ /* circulaire uniforme, on aura : */ /* */ /* 2.pi.R */ /* V = -------- */ /* T */ /* */ /* soit : */ /* */ /* 2.pi.R */ /* T = -------- */ /* V */ /* */ /* ce qui subistitue dans la troisieme loi */ /* de Kepler donne : */ /* */ /* 1 k */ /* ---- = -------.R */ /* 2 2 */ /* V 4.pi */ /* */ /* Ainsi, pour deux corps 'a' et 'b', on aura */ /* la relation : */ /* */ /* 2 */ /* V R */ /* b a */ /* ---- = ---- */ /* 2 R */ /* V b */ /* a */ /* */ /* C'est cette relation qui est utilisee dans les */ /* animations d'interpolation de points de vue */ /* dans le Systeme Solaire pour calculer la vitesse */ /* initiale de la planete virtuelle (dite "l'Errante" ou "The Wanderer") */ /* pour chacune de ses trajectoires possibles */ /* ('v _____xivPdf_09_1/$Fnota sqrt.OdistD.Odist.'). */ /* */ /* */ /*************************************************************************************************************************************/ /* :Fin_listMN_PROBLEME_DES_N_CORPS_11: */ /*===================================================================================================================================*/ /* :Debut_listMN_SYSTEME_SOLAIRE_11: */ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U S Y S T E M E S O L A I R E E N U N I T E S ' MKSA ' : */ /* */ /* */ /* Definition intemporelle du Systeme Solaire en unites MKSA : */ /* */ /* */ /* ------------------------------------------------------------------------------------------------------------------------ */ /* | Corps : | Diametre : | Masse : | Aphelie : | Perihelie : | Distance : | Vitesse : | Periode : | */ /* | ----- | -------- | ----- | ------- | --------- | -------- | ------- | ------- | */ /* | | | | | | | | | */ /* | | | | | | (moyenne) | (moyenne) | (en jours) | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | | | | | | | | | */ /* | Soleil | 1390.0000e6 | 20000000000.0e20 | | | | | | */ /* | | | | | | | | | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Mercure | 4.8800e6 | 3303.0e20 | 69.7e9 | 45.9e9 | 57.9e9 | 47.89e3 | 87.969 | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Venus | 12.1030e6 | 48700.0e20 | 109.0e9 | 107.4e9 | 108.2e9 | 35.03e3 | 224.701 | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Terre | 12.7560e6 | 59750.0e20 | 152.1e9 | 147.1e9 | 149.6e9 | 29.79e3 | 365.256 | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Lune | 3.4760e6 | 735.0e20 | | | 0.3844e9 / T | 0.96e3 / T | | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Mars | 6.7940e6 | 6418.0e20 | 249.1e9 | 206.7e9 | 227.9e9 | 24.13e3 | 686.980 | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Jupiter | 142.9840e6 | 18990000.0e20 | 815.7e9 | 740.9e9 | 778.3e9 | 13.06e3 | 4332.589 | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Saturne | 120.5360e6 | 5686000.0e20 | 1507.0e9 | 1347.0e9 | 1427.0e9 | 9.64e3 | 10759.220 | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Uranus | 51.1180e6 | 866000.0e20 | 3004.0e9 | 2735.0e9 | 2869.6e9 | 6.81e3 | 30685.400 | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Neptune | 49.5320e6 | 1030000.0e20 | 4537.0e9 | 4456.0e9 | 4496.6e9 | 5.43e3 | 60189.000 | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Pluton | 2.2740e6 | 66.0e20 | 7375.0e9 | 4425.0e9 | 5900.0e9 | 4.74e3 | 90465.000 | */ /* |----------|--------------|-------------------|--------------|--------------|--------------|--------------|--------------| */ /* | Eris | 2.4000e6 | ? | ? | ? | ? | ? | ? | */ /* ------------------------------------------------------------------------------------------------------------------------ */ /* */ /* */ /* Definition instantanee du Systeme Solaire (voir 'v $xtc/S_solaire.01$c') en unites MKSA : */ /* */ /* */ /* ------------------------------------------------------------------------------------------------------------------- */ /* | # : | Corps : | Coordonnees : | Vitesse : | */ /* | - | ----- | ----------- | ------- | */ /* | | | | | */ /* | | | (a une meme date t=JD 2433280.5) | (a une meme date t=JD 2433280.5) | */ /* |-----|-------------------|--------------------------------------------|--------------------------------------------| */ /* | | | | | */ /* | 01 | Soleil | 0,0,0 | 0,0,0 | */ /* | | | | | */ /* |-----|-------------------|--------------------------------------------|--------------------------------------------| */ /* | 02 | Mercure | +5.145066e10,+6.823979e09,-1.634213e09 | -1.465943e4,+4.435058e4,+2.525649e4 | */ /* |-----|-------------------|--------------------------------------------|--------------------------------------------| */ /* | 03 | Venus | +2.138729e10,+9.679058e10,+4.225877e10 | -3.444528e4,+5.390232e3,+4.604716e3 | */ /* |-----|-------------------|--------------------------------------------|--------------------------------------------| */ /* | 04 | BARY(Terre,Lune) | -2.039987e10,+1.336504e11,+5.796294e10 | -2.998883e4,-3.885917e3,-1.685333e3 | */ /* |-----|-------------------|--------------------------------------------|--------------------------------------------| */ /* | 05 | Mars | -2.049242e11,+1.261312e11,+6.340450e10 | -1.278605e4,-1.640964e4,-7.188412e3 | */ /* |-----|-------------------|--------------------------------------------|--------------------------------------------| */ /* | 06 | Jupiter | +5.010578e11,-5.196673e11,-2.351902e11 | +9.671300e3,+8.591941e3,+3.449541e3 | */ /* |-----|-------------------|--------------------------------------------|--------------------------------------------| */ /* | 07 | Saturne | -1.342268e12,+3.410356e11,+1.990158e11 | -3.217483e3,-8.629336e3,-3.428730e3 | */ /* |-----|-------------------|--------------------------------------------|--------------------------------------------| */ /* | 08 | Uranus | -1.500473e11,+2.591560e12,+1.137666e12 | -6.848352e3,-6.508785e2,-1.884691e2 | */ /* |-----|-------------------|--------------------------------------------|--------------------------------------------| */ /* | 09 | Neptune | -4.367447e12,-1.154789e12,-3.631107e11 | +1.421090e3,-4.799768e3,-2.001765e3 | */ /* |-----|-------------------|--------------------------------------------|--------------------------------------------| */ /* | 10 | Pluton | -3.924498e12,+3.076028e12,+2.160875e12 | -2.278404e3,-4.536639e3,-7.394764e2 | */ /* ------------------------------------------------------------------------------------------------------------------- */ /* */ /* */ /* Nota : */ /* */ /* Le 24/08/2006, Pluton a ete declassee et est */ /* devenue une "planete naine" apres un vote (conteste) */ /* de l'Union Atronomique Internationale. */ /* */ /* */ /* Definition de 'JD' ("Julian Day") : */ /* */ /* Le "Julian Day" est egal au nombre de jours ecoules */ /* depuis le 01/01 4713 BC a 12:00. On notera que le calendrier */ /* Julien fut utilise avant le 04/10/1582 et le calendrier Gregorien */ /* apres le 15/10/1582. */ /* */ /* La formule pour calculer 'JD' est la suivante) : */ /* */ /* JD = 2415020 + [365 x (AAAA - 1900)] + JJ + LEAP - 0.5 */ /* */ /* avec (la date a laquelle on s'interesse est {JJ,AAAA} : */ /* */ /* AAAA = l'annee a laquelle on s'interesse, */ /* JJ = le nombre de jours ecoules depuis le 01/01 de l'annee AAAA jusqu'a un */ /* certain jour de cette annee AAAA, */ /* LEAP = le nombre d'annees bissextiles entre 1901 et l'annee AAAA, */ /* 2415020 = le "Julian Day" du 01/01/1900, */ /* 0.5 = vient du fait que le "point de depart" est a 12:00 le 01/01 4713 BC. */ /* */ /* Le site 'https://keisan.casio.com/exec/system/1227779487' */ /* permet de faire le calcul inverse et de montrer que : */ /* */ /* JD Julian Day 2433282.5 = 01/01/1950 AD. */ /* */ /* BC = Before Christ, */ /* AD = Anno Domini (After Christ). */ /* */ /* */ /*************************************************************************************************************************************/ /* :Fin_SYSTEME_SOLAIRE_11: */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_X,fichier_LISTE_X,X_IMPLICITE,Xcentre_ESPACE) dfTRANSFORMAT_31(liste_initiale_des_Y,fichier_LISTE_Y,Y_IMPLICITE,Ycentre_ESPACE) dfTRANSFORMAT_31(liste_initiale_des_Z,fichier_LISTE_Z,Z_IMPLICITE,hZmin_ESPACE) /* Definition des fichiers de listes de coordonnees. */ /* Pour les coordonnees implicites, on notera l'utilisation de 'hZmin_ESPACE' et non */ /* pas de 'Zcentre_ESPACE' comme le voudrait la logique ; ceci est du au fait que cette */ /* derniere valeur interferait malheureusement avec la position de l'observateur dans le */ /* cube de visualisation, et rendrait invisible les particules... */ dfTRANSFORMAT_31(liste_initiale_des_VX,fichier_LISTE_VX,VX_IMPLICITE,FZERO) dfTRANSFORMAT_31(liste_initiale_des_VY,fichier_LISTE_VY,VY_IMPLICITE,FZERO) dfTRANSFORMAT_31(liste_initiale_des_VZ,fichier_LISTE_VZ,VZ_IMPLICITE,FZERO) /* Definition des fichiers de listes de vitesses. */ dfTRANSFORMAT_31(liste_initiale_des_MOBILITE,fichier_LISTE_MOBILITE,MOBILITE_IMPLICITE,VRAI) /* Definition du fichier de l'indicateur de mobilite des corps. */ 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_MASSE,fichier_LISTE_MASSE,MASSE_IMPLICITE,PARE(1.0e30)) /* Definition du fichier de liste des masses. */ dfTRANSFORMAT_31(liste_initiale_des_SOURCE_DU_POTENTIEL,fichier_LISTE_SOURCE_DU_POTENTIEL,SOURCE_DU_POTENTIEL_IMPLICITE,VRAI) /* Definition du fichier de liste des indicateurs de source gravitationnelle possible. */ 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 20061026114627. */ /* Par defaut, tous les corps sont evidemment visibles ('VRAI'). */ /* */ /* La valeur implicite est passee de 'VRAI' a 'COORDONNEE_BARYCENTRIQUE_MAXIMALE' le */ /* 20061106140813 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] */ /* */ #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(pointF_3D,DdTb1(POINTERs ,liste_des_coordonnees_a_l_instant_initial ,nombre_de_corps ,ADRESSE_NON_ENCORE_DEFINIE ) ); DEFV(deltaF_3D,DdTb1(POINTERs ,liste_des_vitesses_a_l_instant_initial ,nombre_de_corps ,ADRESSE_NON_ENCORE_DEFINIE ) ); /* Definition de l'instant initial. */ DEFV(pointF_3D,DdTb1(POINTERs ,liste_des_coordonnees_a_l_instant_precedent ,nombre_de_corps ,ADRESSE_NON_ENCORE_DEFINIE ) ); DEFV(Float,DdTb2(POINTERf ,matrice_des_distances_a_l_instant_precedent ,nombre_de_corps ,nombre_de_corps ,ADRESSE_NON_ENCORE_DEFINIE ) ); /* Definition de l'instant precedent. */ DEFV(pointF_3D,DdTb1(POINTERs ,liste_des_coordonnees_a_l_instant_courant ,nombre_de_corps ,ADRESSE_NON_ENCORE_DEFINIE ) ); DEFV(deltaF_3D,DdTb1(POINTERs ,liste_des_vitesses_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. */ DEFV(pointF_3D,DdTb1(POINTERs ,liste_des_coordonnees_au_veritable_instant_precedent_visualise ,nombre_de_corps ,ADRESSE_NON_ENCORE_DEFINIE ) ); /* Definition de l'instant precedent veritablement visualise. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_COORDONNEES_INITIALES(corps) \ IdTb1(liste_des_coordonnees_a_l_instant_initial \ ,INDX(corps,PREMIER_POINT_DES_LISTES) \ ,nombre_de_corps \ ) #define ACCES_VITESSE_INITIALE(corps) \ IdTb1(liste_des_vitesses_a_l_instant_initial \ ,INDX(corps,PREMIER_POINT_DES_LISTES) \ ,nombre_de_corps \ ) /* Acces aux caracteristiques du corps de numero donne 'corps' dans sa position initiale. */ #define ACCES_COORDONNEES_PRECEDENTES(corps) \ IdTb1(liste_des_coordonnees_a_l_instant_precedent \ ,INDX(corps,PREMIER_POINT_DES_LISTES) \ ,nombre_de_corps \ ) #define ACCES_DISTANCES_PRECEDENTES(corpsI,corpsJ) \ IdTb2(matrice_des_distances_a_l_instant_precedent \ ,INDX(corpsI,PREMIER_POINT_DES_LISTES) \ ,nombre_de_corps \ ,INDX(corpsJ,PREMIER_POINT_DES_LISTES) \ ,nombre_de_corps \ ) /* Acces aux caracteristiques du corps de numero donne 'corps' dans sa position precedente. */ #define ACCES_COORDONNEES_COURANTES(corps) \ IdTb1(liste_des_coordonnees_a_l_instant_courant \ ,INDX(corps,PREMIER_POINT_DES_LISTES) \ ,nombre_de_corps \ ) #define ACCES_VITESSE_COURANTE(corps) \ IdTb1(liste_des_vitesses_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_MASSES(corps) \ IdTb1(liste_initiale_des_MASSE \ ,INDX(corps,PREMIER_POINT_DES_LISTES) \ ,nombre_de_corps \ ) #define ACCES_SOURCES_DU_POTENTIEL(corps) \ LOGI(IdTb1(liste_initiale_des_SOURCE_DU_POTENTIEL \ ,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. */ #define ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps) \ IdTb1(liste_des_coordonnees_au_veritable_instant_precedent_visualise \ ,INDX(corps,PREMIER_POINT_DES_LISTES) \ ,nombre_de_corps \ ) /* Acces aux coordonnees dans sa position precedente veritablement visualisee. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' E V E N T U E L L E I N D E P E N D A N C E R E L A T I V E */ /* D E S C O R P S E N T R E - E U X : */ /* */ /*************************************************************************************************************************************/ #include xrr/N_corps.13.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E S C O L L I S I O N S : */ /* */ /*************************************************************************************************************************************/ #include xrk/rdn_walk.41.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S D O U Z E F O N C T I O N S ' F ' : */ /* ?? */ /* */ /*************************************************************************************************************************************/ #define F3(coordonnees) \ FU #define F2(coordonnees) \ FZERO #define F1(fonction,coordonnees) \ DEFV(Local,DEFV(FonctionF,fonction(corpsI))) \ DEFV(Argument,DEFV(Int,corpsI)); \ /* Numero du corps par rapport auquel on calcule l'inverse pondere de la somme des */ \ /* distances... */ \ /*-----------------------------------------------------------------------------------------------------------------------------------*/ \ Bblock \ DEFV(Float,INIT(cumul_courant,FZERO)); \ /* Valeur de la fonction. */ \ DEFV(Int,INIT(corpsK,UNDEF)); \ /* Index des corps... */ \ /*..............................................................................................................................*/ \ \ Komp(corpsK,nombre_de_corps) \ Bblock \ Test(IFNE(corpsK,corpsI)) \ Bblock \ Test(IFOU(IFET(EST_VRAI(toutes_les_interactions_2_a_2_sont_prises_en_compte) \ ,EST_VRAI(ACCES_SOURCES_DU_POTENTIEL(corpsK)) \ ) \ /* Cas ou toutes les interactions 2 a 2 sont calculees, et ou de plus, le corps courant */ \ /* 'corpsK' intervient dans ce calcul... */ \ ,IFET(EST_FAUX(toutes_les_interactions_2_a_2_sont_prises_en_compte) \ ,IFEQ(corpsK,corps_source_du_potentiel) \ ) \ /* Cas ou un seul corps ('corps_source_du_potentiel') genere le potentiel gravitationnel. */ \ ) \ ) \ Bblock \ Test(IZNE(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsK))) \ Bblock \ Test(IZNE(ASD1(ACCES_COORDONNEES_PRECEDENTES(corpsI),coordonnees))) \ Bblock \ INCR(cumul_courant \ ,MUL2(DIVI(ACCES_MASSES(corpsK) \ ,EXP3(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsK)) \ ) \ ,SOUS(DIVI(ASD1(ACCES_COORDONNEES_PRECEDENTES(corpsK),coordonnees) \ ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corpsI),coordonnees) \ ) \ ,FU \ ) \ ) \ ); \ Eblock \ ATes \ Bblock \ PRINT_ATTENTION("un corps est sur un axe"); \ CAL1(Prer1("pour la coordonnee coordonnees du corps %d\n",corpsI)); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Test(IL_FAUT(gerer_les_collisions)) \ Bblock \ Test(IFLT(corpsI,corpsK)) \ /* Ce test a ete ajoute le 19990430160515 car il semblait manquer. On pourra consulter */ \ /* l'etude des collisions dans 'v $xrk/rdn_walk.51$I IFLT.corpsI.corpsJ.' pour plus */ \ /* d'informations ; ce test est destine a traiter la collision {corpsI,corpsK} et */ \ /* et ne pas la traiter une deuxieme fois sous le nom {corpsK,corpsI}. */ \ Bblock \ COLLISION_ENTRE_DEUX_CORPS(corpsI,corpsK); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ PRINT_ATTENTION("deux corps sont rentres en collision"); \ CAL1(Prer2("(%d et %d)\n",corpsI,corpsK)); \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ EKom \ \ RETU(MUL2(NEGA(CONSTANTE_DE_LA_GRAVITATION),cumul_courant)); \ Eblock #define F0(coordonnees) \ FZERO /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S Q U A T R E F O N C T I O N S ' F ' : */ /* ?x */ /* */ /*************************************************************************************************************************************/ #define F3X(corpsI) \ F3(x) #define F2X(corpsI) \ F2(x) BFonctionF F1(F1X,x) EFonctionF #define F0X(corpsI) \ F0(x) #define F3x(cx,cy,cz,t) \ F3X(corps) #define F2x(cx,cy,cz,t) \ F2X(corps) #define F1x(cx,cy,cz,t) \ F1X(corps) #define F0x(t) \ F0X(corps) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S Q U A T R E F O N C T I O N S ' F ' : */ /* ?y */ /* */ /*************************************************************************************************************************************/ #define F3Y(corpsI) \ F3(y) #define F2Y(corpsI) \ F2(y) BFonctionF F1(F1Y,y) EFonctionF #define F0Y(corpsI) \ F0(y) #define F3y(cx,cy,cz,t) \ F3Y(corps) #define F2y(cx,cy,cz,t) \ F2Y(corps) #define F1y(cx,cy,cz,t) \ F1Y(corps) #define F0y(t) \ F0Y(corps) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S Q U A T R E F O N C T I O N S ' F ' : */ /* ?z */ /* */ /*************************************************************************************************************************************/ #define F3Z(corpsI) \ F3(z) #define F2Z(corpsI) \ F2(z) BFonctionF F1(F1Z,z) EFonctionF #define F0Z(corpsI) \ F0(z) #define F3z(cx,cy,cz,t) \ F3Z(corps) #define F2z(cx,cy,cz,t) \ F2Z(corps) #define F1z(cx,cy,cz,t) \ F1Z(corps) #define F0z(t) \ F0Z(corps) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 20030313151705, '__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" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O B L E M E D I T D E S " N - C O R P S " : */ /* */ /*************************************************************************************************************************************/ 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_X,X_IMPLICITE); iTRANSFORMAT_31(liste_initiale_des_Y,Y_IMPLICITE); iTRANSFORMAT_31(liste_initiale_des_Z,Z_IMPLICITE); /* Initialisation des fichiers de listes de coordonnees. */ iTRANSFORMAT_31(liste_initiale_des_VX,VX_IMPLICITE); iTRANSFORMAT_31(liste_initiale_des_VY,VY_IMPLICITE); iTRANSFORMAT_31(liste_initiale_des_VZ,VZ_IMPLICITE); /* Initialisation des fichiers de listes de vitesses implicites. */ iTRANSFORMAT_31(liste_initiale_des_MOBILITE,MOBILITE_IMPLICITE); /* Initialisation du fichier de l'indicateur de mobilite des corps. */ 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_MASSE,MASSE_IMPLICITE); /* Initialisation du fichier de liste des masses. */ iTRANSFORMAT_31(liste_initiale_des_COEFFICIENT_DE_RESTITUTION,COEFFICIENT_DE_RESTITUTION_IMPLICITE); /* Initialisation du fichier de liste de taux de restitution. */ iTRANSFORMAT_31(liste_initiale_des_SOURCE_DU_POTENTIEL,SOURCE_DU_POTENTIEL_IMPLICITE); /* Initialisation du fichier de liste des indicateurs de source gravitationnelle possible. */ 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 */ /* 20061026114627. */ 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 20070821160427). */ iTRANSFORMAT_31(liste_initiale_des_NOMBRES,NOMBRES_IMPLICITE); /* Initialisation du nombre variable (introduit le 20070821160427). */ 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 20070827094840). */ #include xrv/champs_5.1A.I" GET_ARGUMENTSv(nombre_d_arguments ,BLOC(PROCESS_ARGUMENT_I("nombre_points=""npoints=""iterations=""corps=",nombre_de_corps /* Le 20111211095930, 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_X=" ,fichier_LISTE_X ,liste_initiale_des_X ,X_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_Y=" ,fichier_LISTE_Y ,liste_initiale_des_Y ,Y_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_Z=" ,fichier_LISTE_Z ,liste_initiale_des_Z ,Z_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_VX=" ,fichier_LISTE_VX ,liste_initiale_des_VX ,VX_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_VY=" ,fichier_LISTE_VY ,liste_initiale_des_VY ,VY_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_VZ=" ,fichier_LISTE_VZ ,liste_initiale_des_VZ ,VZ_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_MOBILITE=" ,fichier_LISTE_MOBILITE ,liste_initiale_des_MOBILITE ,MOBILITE_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_MASSE=" ,fichier_LISTE_MASSE ,liste_initiale_des_MASSE ,MASSE_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_COEFFICIENT_DE_RESTITUTION=" ,fichier_LISTE_COEFFICIENT_DE_RESTITUTION ,liste_initiale_des_COEFFICIENT_DE_RESTITUTION ,COEFFICIENT_DE_RESTITUTION_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_SOURCE=" ,fichier_LISTE_SOURCE_DU_POTENTIEL ,liste_initiale_des_SOURCE_DU_POTENTIEL ,SOURCE_DU_POTENTIEL_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 20090617164242, 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_L("2_a_2=",toutes_les_interactions_2_a_2_sont_prises_en_compte); GET_ARGUMENT_I("source=",corps_source_du_potentiel); 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 ); PROCESS_ARGUMENTS_DE_VISUALISATION; PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES; GET_ARGUMENT_L("rayon_masse=",les_rayons_de_visualisation_sont_fonction_de_la_masse); 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("collisions=",gerer_les_collisions); GET_ARGUMENT_L("ponctuels=""chocs_ponctuels=",considerer_les_chocs_ponctuels); GET_ARGUMENT_F("restitution=""elasticite=",coefficient_de_restitution); GET_ARGUMENT_L("ensemble=",visualiser_l_ensemble_des_instants); GET_ARGUMENT_F("acceptable=",facteur_du_deplacement_minimal_acceptable); 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_vitesses=",editer_les_coordonnees_et_les_vitesses); ) ); #include xrv/champs_5.19.I" /* Pour eviter le message : */ /* */ /* Static function is not referenced. */ /* */ /* sur 'SYSTEME_ES9000_AIX_CC'... */ Test(IZLE(dct)) Bblock PRINT_ATTENTION("le pas de temps ne peut etre negatif ou nul, on lui substitue la valeur par defaut"); EGAL(dct,DCT); /* En particulier un pas de temps nul provoque des divisions par zero lors de l'integration. */ Eblock ATes Bblock Eblock ETes #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(EST_FAUX(toutes_les_interactions_2_a_2_sont_prises_en_compte) ,NINCff(corps_source_du_potentiel,PREMIER_POINT_DES_LISTES,nombre_de_corps) ) ) Bblock PRINT_ATTENTION("le corps source du potentiel demande n'existe pas, on lui substitue la valeur par defaut"); EGAL(corps_source_du_potentiel,CORPS_SOURCE_DU_POTENTIEL); Eblock ATes Bblock Eblock ETes 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_coordonnees_a_l_instant_initial ,nombre_de_corps ,pointF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); MdTb1(liste_des_vitesses_a_l_instant_initial ,nombre_de_corps ,deltaF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); /* Definition de l'instant initial. */ MdTb1(liste_des_coordonnees_a_l_instant_precedent ,nombre_de_corps ,pointF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); MdTb2(matrice_des_distances_a_l_instant_precedent ,nombre_de_corps ,nombre_de_corps ,Float ,ADRESSE_NON_ENCORE_DEFINIE ); /* Definition de l'instant precedent. */ MdTb1(liste_des_coordonnees_a_l_instant_courant ,nombre_de_corps ,pointF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); MdTb1(liste_des_vitesses_a_l_instant_courant ,nombre_de_corps ,deltaF_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. */ MdTb1(liste_des_coordonnees_au_veritable_instant_precedent_visualise ,nombre_de_corps ,pointF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); /* Definition de l'instant precedent veritablement visualise. */ Komp(corps,nombre_de_corps) Bblock INITIALISATION_POINT_3D(ACCES_COORDONNEES_INITIALES(corps) ,ACCES_LISTE(liste_initiale_des_X,corps) ,ACCES_LISTE(liste_initiale_des_Y,corps) ,ACCES_LISTE(liste_initiale_des_Z,corps) ); INITIALISATION_ACCROISSEMENT_3D(ACCES_VITESSE_INITIALE(corps) ,ACCES_LISTE(liste_initiale_des_VX,corps) ,ACCES_LISTE(liste_initiale_des_VY,corps) ,ACCES_LISTE(liste_initiale_des_VZ,corps) ); TRANSFERT_POINT_3D(ACCES_COORDONNEES_PRECEDENTES(corps) ,ACCES_COORDONNEES_INITIALES(corps) ); TRANSFERT_POINT_3D(ACCES_COORDONNEES_CUMULEES(corps,NUMERO_DE_LA_PREMIERE_PERIODE_DE_LA_SIMULATION) ,ACCES_COORDONNEES_INITIALES(corps) ); TRANSFERT_POINT_3D(ACCES_COORDONNEES_COURANTES(corps) ,ACCES_COORDONNEES_INITIALES(corps) ); TRANSFERT_ACCROISSEMENT_3D(ACCES_VITESSE_COURANTE(corps) ,ACCES_VITESSE_INITIALE(corps) ); /* Initialisation des listes relatives aux differents corps arguments meme celles pour */ /* lesquelles cela n'a pas de sens... */ Eblock EKom INITIALISATION_DE_L_INTEGRATION_D_UN_SYSTEME_D_EQUATIONS_DIFFERENTIELLES_O2; /* Initialisations necessaires a discriminer les deux premiers pas de temps... */ Komp(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation) Bblock DEFV(Int,INIT(periode,UNDEF)); /* Periode de parcours de 'ACCES_COORDONNEES_PRECEDENTES(...)' pour la visualisation... */ 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 20070821160427... */ 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 20070821160427... */ 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 20070827094840... */ 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. */ 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... */ DEFV(Float,INIT(deplacement_apparent_du_corps_courant,F_INFINI)); /* Afin d'evaluer le deplacement du corps courant entre l'instant present et le veritable */ /* instant precedent visualise. La valeur infinie implicite est choisie afin d'etre sur */ /* de visualiser le premier instant. Enfin ce deplacement est calcule apres "decentrage" */ /* eventuel car, en effet et par exemple, le Soleil dans une version "geocentrique" n'aurait */ /* pas de trajectoire... */ 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... */ Test(IFEQ(periode,numero_effectif_de_la_premiere_periode_de_la_simulation)) Bblock INITIALISATION_POINT_3D(ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps) ,cx_eventuellement_decentree ,cy_eventuellement_decentree ,cz_eventuellement_decentree ); Eblock ATes Bblock EGAL(deplacement_apparent_du_corps_courant ,RdisF3D(cx_eventuellement_decentree ,cy_eventuellement_decentree ,cz_eventuellement_decentree ,ASD1(ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps),x) ,ASD1(ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps),y) ,ASD1(ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps),z) ) ); /* Calcul du deplacement du corps courant entre l'instant present et le veritable instant */ /* precedent visualise... */ Test(IL_NE_FAUT_PAS(prendre_une_echelle_lineaire_pour_les_coordonnees)) Bblock /* On notera que l'on va transformer non lineairement la coordonnee spherique 'Rho'. Il */ /* pourrait etre utile d'en faire autant sur l'un au moins des deux angle {Phi,Theta}. En */ /* effet, on pourrait ainsi accentuer l'effet d'inclinaison, par exemple, dans le systeme */ /* solaire ou les 8 premieres planetes ne sont qu'a "epsilon" pres dans le plan de */ /* l'ecliptique. Malheureusement, ce plan est positionne d'une facon inconnue par rapport */ /* aux axes {OX,OY,OZ} utilises. Alors que faire ? Rien pour le moment (le 19971211095810). */ DEFV(Float,INIT(rho ,Rho_3D(cx_eventuellement_decentree ,cy_eventuellement_decentree ,cz_eventuellement_decentree ) ) ); DEFV(Float,INIT(rho_non_lineaire,FLOT__UNDEF)); EGAL(rho_non_lineaire,ECHELLE_NON_LINEAIRE(rho)); /* Passage en coordonnees spheriques lorsque des echelles non lineaires sont demandees. On */ /* notera que pour bien faire, il faudrait aussi calculer 'rho' et 'rho_non_lineaire' pour */ /* le point 'ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(...)', */ /* mais, on simplifie un peu... */ EGAL(deplacement_apparent_du_corps_courant ,SCAL(deplacement_apparent_du_corps_courant ,rho ,rho_non_lineaire ) ); /* Lorsque l'echelle n'est pas lineaire, il faut le prendre en compte dans ce test qui est */ /* un test sur la transformation des coordonnees pour la visualisation, cette transformation */ /* ne conservant pas les distances, d'ou cette regle de trois qui vient de la notion de */ /* "triangles semblables". */ Eblock ATes Bblock Eblock ETes Eblock ETes 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... */ Test(IFOU(IFEQ(periode,numero_de_la_periode_courante_de_la_simulation) ,IFGT(deplacement_apparent_du_corps_courant ,MUL2(facteur_du_deplacement_minimal_acceptable,rayon_de_visualisation) ) ) ) Bblock INITIALISATION_POINT_3D(ACCES_COORDONNEES_PRECEDENTES_VISUALISEES_ET_EVENTUELLEMENT_DECENTREES(corps) ,cx_eventuellement_decentree ,cy_eventuellement_decentree ,cz_eventuellement_decentree ); /* Lorsque le deplacement du corps courant entre l'instant present et le veritable instant */ /* precedent visualise est suffisamment important, on le visualise. Bien evidemment, on */ /* visualise la derniere position (qui est la position courante...). */ 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 ) ); BSaveModifyVariable(Int,identite_du_point_courant_complet,corps); BSaveModifyVariable(Logical,il_y_a_une_identite_pour_le_point_courant_complet,VRAI); /* Introduit le 20210101095317 car, en effet, cela peut etre utile de disposer de */ /* l'identite du corps au cas ou l'on voudrait, par exemple, calculer a posteriori des */ /* distances entre corps... */ /* */ /* L'usage de 'BSaveModifyVariable' a eu lieu le 20210104111031... */ CALS(memorisation_point_grave(cx_eventuellement_decentree ,cy_eventuellement_decentree ,cz_eventuellement_decentree ,dcx ,dcy ,dcz ,ACCES_PONDERATION_CENTRE_DE_GRAVITE(corps) ,ACCES_MASSES(corps) ,ASD1(ACCES_VITESSE_COURANTE(corps),dx) ,ASD1(ACCES_VITESSE_COURANTE(corps),dy) ,ASD1(ACCES_VITESSE_COURANTE(corps),dz) ,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... */ ESaveModifyVariable(Logical,il_y_a_une_identite_pour_le_point_courant_complet); ESaveModifyVariable(Int,identite_du_point_courant_complet); /* Introduits le 20210104111031... */ Eblock ATes Bblock Eblock ETes 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_et_les_vitesses)) 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(Prin3(" vitesse={%+.17f,%+.17f,%+.17f}" ,ASD1(ACCES_VITESSE_COURANTE(corps),dx) ,ASD1(ACCES_VITESSE_COURANTE(corps),dy) ,ASD1(ACCES_VITESSE_COURANTE(corps),dz) ) ); 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) ) ) /* Cette precaution evitant de visualiser deux fois les conditions initiales (ce qui se */ /* voit lorsque 'nombre_de_pas_de_temps_par_periode' est egal a un...). Cette correction a */ /* ete effectuee le 1995092900 lors de l'introduction de 'v $xrk/rdn_walk.11$K'. Les images */ /* generees apres cette date devraient etre tres legerement differentes (en fait d'autant */ /* moins que le parametre 'nombre_de_pas_de_temps_par_periode' reellement utilise a une */ /* grande valeur...). */ Bblock DEFV(Float,INIT(module_de_la_vitesse_maximale,F_MOINS_L_INFINI)); /* Afin de calculer la vitesse maximale actuelle. */ Komp(corps,nombre_de_corps) Bblock DEFV(Float,INIT(module_de_la_vitesse_courante ,DIVI(RpdisF3D(ACCES_COORDONNEES_PRECEDENTES(corps) ,ACCES_COORDONNEES_COURANTES(corps) ) ,MUL2(nombre_de_pas_de_temps_par_periode,dct) ) ) ); EGAL(module_de_la_vitesse_maximale,MAX2(module_de_la_vitesse_maximale,module_de_la_vitesse_courante)); /* Determination du module de la vitesse maximale... */ Eblock EKom Test(IFGE(module_de_la_vitesse_maximale,VITESSE_DE_LA_LUMIERE)) Bblock PRINT_ATTENTION("les corps semblent se deplacer a des vitesses supra-lumineuses"); CAL1(Prer1("module de la vitesse maximale = %f\n",module_de_la_vitesse_maximale)); CAL1(Prer1("vitesse de la lumiere........ = %f\n",VITESSE_DE_LA_LUMIERE)); Eblock ATes Bblock Test(IFGE(module_de_la_vitesse_maximale,FRA10(VITESSE_DE_LA_LUMIERE))) Bblock PRINT_ATTENTION("les corps semblent se deplacer a des vitesses relativistes"); CAL1(Prer1("module de la vitesse maximale = %f\n",module_de_la_vitesse_maximale)); CAL1(Prer1("vitesse de la lumiere........ = %f\n",VITESSE_DE_LA_LUMIERE)); Eblock ATes Bblock Eblock ETes Eblock ETes Komp(corpsI,nombre_de_corps) Bblock Komp(corpsJ,nombre_de_corps) Bblock EGAL(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsJ) ,RpdisF3D(ACCES_COORDONNEES_PRECEDENTES(corpsI) ,ACCES_COORDONNEES_PRECEDENTES(corpsJ) ) ); /* Initialisation de la matrice des distances de tous les corps 2 a 2... */ Test(I3ET(IFET(IFNE(corpsI,corpsJ) ,IFOU(EST_VRAI(toutes_les_interactions_2_a_2_sont_prises_en_compte) ,IFET(EST_FAUX(toutes_les_interactions_2_a_2_sont_prises_en_compte) ,IFOU(IFEQ(corpsI,corps_source_du_potentiel) ,IFEQ(corpsJ,corps_source_du_potentiel) ) ) ) ) ,IFOU(EST_VRAI(LOGI(ACCES_LISTE(liste_initiale_des_MOBILITE,corpsI))) ,EST_VRAI(LOGI(ACCES_LISTE(liste_initiale_des_MOBILITE,corpsJ))) ) ,IFLT(ACCES_DISTANCES_PRECEDENTES(corpsI,corpsJ),MUL2(module_de_la_vitesse_maximale,dct)) ) ) /* On utilise 'IFLT(...)' et non pas 'IFLE(...)' afin d'eviter des messages d'erreur lors */ /* de l'initialisation ou les coordonnees 'ACCES_COORDONNEES_PRECEDENTES(...)' et */ /* 'ACCES_COORDONNEES_COURANTES(...)' sont identiques... */ Bblock /* Dans ces circonstances, la valeur des fonctions 'F1?(...)' peut devenir demesuree. Par */ /* exemple, en temps normal, une valeur de 1.0e-12 est acceptable ; elle peut devenir plus */ /* grande, et c'est alors une catastrophe, les corps pouvant s'echapper... */ PRINT_ATTENTION("le pas de temps semble incompatible avec les distances entre les corps"); CAL1(Prer1("pas de temps................. = %f\n" ,dct ) ); CAL1(Prer1("module de la vitesse maximale = %f\n" ,module_de_la_vitesse_maximale ) ); CAL1(Prer3("distance(%04d,%04d).......... = %f\n" ,corpsI,corpsJ,ACCES_DISTANCES_PRECEDENTES(corpsI,corpsJ) ) ); Eblock ATes Bblock Eblock ETes Eblock EKom Eblock EKom Komp(corps,nombre_de_corps) Bblock #include xrr/N_corps.12.I" /* Integration du systeme d'equations differentielles pour le corps courant 'corps'. */ Test(IFLT(numero_de_la_periode_courante_de_la_simulation,nombre_de_periodes_de_la_simulation)) Bblock TRANSFERT_POINT_3D(ACCES_COORDONNEES_CUMULEES(corps ,SUCC(numero_de_la_periode_courante_de_la_simulation) ) ,ACCES_COORDONNEES_PRECEDENTES(corps) ); Eblock ATes Bblock Eblock ETes Eblock EKom INCREMENTATION_DE_L_HORLOGE(dct); /* Simulation du temps de la simulation... */ GESTION_DE_L_INTEGRATION_D_UN_SYSTEME_D_EQUATIONS_DIFFERENTIELLES_O2; /* Gestion de la discrimination des deux premiers pas de temps... */ 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 FdTb1(liste_des_coordonnees_au_veritable_instant_precedent_visualise ,nombre_de_corps ,pointF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); 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_vitesses_a_l_instant_courant ,nombre_de_corps ,deltaF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); FdTb1(liste_des_coordonnees_a_l_instant_courant ,nombre_de_corps ,pointF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); FdTb2(matrice_des_distances_a_l_instant_precedent ,nombre_de_corps ,nombre_de_corps ,Float ,ADRESSE_NON_ENCORE_DEFINIE ); FdTb1(liste_des_coordonnees_a_l_instant_precedent ,nombre_de_corps ,pointF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); FdTb1(liste_des_vitesses_a_l_instant_initial ,nombre_de_corps ,deltaF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); FdTb1(liste_des_coordonnees_a_l_instant_initial ,nombre_de_corps ,pointF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); /* Liberation des espaces alloues... */ /* */ /* Les 'ADRESSE_NON_ENCORE_DEFINIE's ont ete introduits le 20050221171122... */ EDITION_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; /* Edition facultative des extrema des coordonnees et des derivees. */ RETU_Commande; Eblock ECommande