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