/*************************************************************************************************************************************/ /* */ /* M A R C H E A L E A T O I R E D A N S L ' E S P A C E T R I D I M E N S I O N N E L : */ /* */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * ** * * * * * ** * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * ** * * * * * ** */ /* * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* */ /* ATTENTION : */ /* */ /* Le programme '$xrk/rdn_walk.11$K' ne doit */ /* pas etre confondu avec '$xrk/rdn_walk.21$K' */ /* dont il est en fait l'ancetre... */ /* */ /* */ /* Author of '$xrk/rdn_walk.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 hXmin_ESPACE \ PARE(-1.0) #define hYmin_ESPACE \ PARE(-1.0) #define hZmin_ESPACE \ PARE(-1.0) /* Definition du "coin" inferieur-gauche-arriere de l'espace physique. */ #define hXmax_ESPACE \ PARE(1.0) #define hYmax_ESPACE \ PARE(1.0) #define hZmax_ESPACE \ PARE(1.0) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 \ FRA1(FRA10(FU)) 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 \ FRA5(FRA10(mhXYZlongueur_ESPACE)) DEFV(Local,DEFV(Float,INIT(rayon_de_visualisation,RAYON_DE_VISUALISATION))); /* Rayon du disque materialisant une iteration. */ 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 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 20030313145557). 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'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A M A R C H E A L E A T O I R E : */ /* */ /* */ /* Definition : */ /* */ /* Soit la famille {C ,C ,...,C } de 'N' */ /* 1 2 N */ /* corps. A chaque pas de temps, et en coordonnees */ /* spheriques, les coordonnees de ceux-ci sont */ /* translatees a l'aide de trois increments en */ /* 'theta', 'phi' et 'rho'. */ /* */ /* */ /*************************************************************************************************************************************/ #define LIMITER_AUTOMATIQUEMENT_LES_TENTATIVES_DE_RECHERCHE_D_UNE_BONNE_PERTURBATION \ VRAI DEFV(Local,DEFV(Logical,INIT(limiter_automatiquement_les_tentatives_de_recherche_d_une_bonne_perturbation ,LIMITER_AUTOMATIQUEMENT_LES_TENTATIVES_DE_RECHERCHE_D_UNE_BONNE_PERTURBATION ) ) ); #define NOMBRE_MAXIMAL_DE_TENTATIVES_DE_RECHERCHE_D_UNE_BONNE_PERTURBATION \ CENT DEFV(Local,DEFV(Int,INIT(nombre_maximal_de_tentatives_de_recherche_d_une_bonne_perturbation ,NOMBRE_MAXIMAL_DE_TENTATIVES_DE_RECHERCHE_D_UNE_BONNE_PERTURBATION ) ) ); /* Lors de la recherche d'une vitesse perturbee satisfaisant aux contraintes imposees (dues */ /* au champ de force et a la distance maximale par rapport a l'origine), lorsque celles-ci */ /* ne peuvent etre satisfaites, il faut imposer un nombre maximal de tentatives afin de ne */ /* pas boucler. Ce nombre peut etre calcule automatiquement a partir des parametres, ou bien */ /* etre impose arbitrairement (l'etat implicite est 'VRAI' afin d'assurer la compatibilite */ /* avec les anciennes sequences generees avant le 1995110200). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S C O N S T A N T E S D U P R O B L E M E : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_MINIMUM_DELTA_RHO ,fichier_LISTE_MINIMUM_DELTA_RHO ,MINIMUM_DELTA_RHO_IMPLICITE ,NEGA(FRA4(FRA10(mhXYZlongueur_ESPACE))) ) dfTRANSFORMAT_31(liste_initiale_des_MAXIMUM_DELTA_RHO ,fichier_LISTE_MAXIMUM_DELTA_RHO ,MAXIMUM_DELTA_RHO_IMPLICITE ,NEUT(FRA4(FRA10(mhXYZlongueur_ESPACE))) ) /* Definition des fichiers de listes de variations des 'rho's. */ dfTRANSFORMAT_31(liste_initiale_des_MINIMUM_N_PHI,fichier_LISTE_MINIMUM_N_PHI,MINIMUM_N_PHI_IMPLICITE,NEGA(DEUX)) dfTRANSFORMAT_31(liste_initiale_des_MAXIMUM_N_PHI,fichier_LISTE_MAXIMUM_N_PHI,MAXIMUM_N_PHI_IMPLICITE,NEUT(DEUX)) dfTRANSFORMAT_31(liste_initiale_des_DELTA_PHI,fichier_LISTE_DELTA_PHI,DELTA_PHI_IMPLICITE,PI_SUR_2) /* Definition des fichiers de listes de variations des 'phi's (ou "longitude"). */ /* */ /* ATTENTION, par la suite, les quantites du type 'MINIMUM_N_?' et 'MAXIMUM_N_?' sont */ /* traitees comme des quantites entieres (en particulier, on fait des 'ARRO(...)' sur les */ /* nombres aleatoires 'variation_de_phi' et 'variation_de_theta' qu'elles permettent de */ /* generer... */ dfTRANSFORMAT_31(liste_initiale_des_MINIMUM_N_THETA,fichier_LISTE_MINIMUM_N_THETA,MINIMUM_N_THETA_IMPLICITE,NEGA(DEUX)) dfTRANSFORMAT_31(liste_initiale_des_MAXIMUM_N_THETA,fichier_LISTE_MAXIMUM_N_THETA,MAXIMUM_N_THETA_IMPLICITE,NEUT(DEUX)) dfTRANSFORMAT_31(liste_initiale_des_DELTA_THETA,fichier_LISTE_DELTA_THETA,DELTA_THETA_IMPLICITE,PI_SUR_2) /* Definition des fichiers de listes de variations des 'theta's (ou "distance polaire"). */ dfTRANSFORMAT_31(liste_initiale_des_DISTANCE_MAXIMALE ,fichier_LISTE_DISTANCE_MAXIMALE ,DISTANCE_MAXIMALE_IMPLICITE ,MOIT(mhXYZlongueur_ESPACE) ) /* Definition des fichiers de listes de distances maximales. */ dfTRANSFORMAT_31(liste_initiale_des_STABILITE,fichier_LISTE_STABILITE,STABILITE_IMPLICITE,HUIT) /* Definition des fichiers de listes de stabilite. La "stabilite" est le nombre de */ /* periodes pendant lequel un corps ne changera pas de direction). */ 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_ROUGE,fichier_LISTE_ROUGE,ROUGE_IMPLICITE,BLANC) dfTRANSFORMAT_31(liste_initiale_des_VERTE,fichier_LISTE_VERTE,VERTE_IMPLICITE,BLANC) dfTRANSFORMAT_31(liste_initiale_des_BLEUE,fichier_LISTE_BLEUE,BLEUE_IMPLICITE,BLANC) /* Definition des fichiers de listes de couleurs. */ /* */ /* ATTENTION, les couleurs des points a visualiser doivent etre definies ainsi : */ /* */ /* ROUGE E [NOIR,BLANC] */ /* VERTE E [NOIR,BLANC] */ /* BLEUE E [NOIR,BLANC] */ /* */ #define NOMBRE_DE_PAS_DE_TEMPS_PAR_PERIODE \ GRO1(GRO1(UN)) 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). */ #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 ) ); /* Definition de l'instant precedent. */ DEFV(deltaF_3D,DdTb1(POINTERs ,liste_des_vitesses_a_l_instant_courant ,nombre_de_corps ,ADRESSE_NON_ENCORE_DEFINIE ) ); DEFV(pointF_3D,DdTb1(POINTERs ,liste_des_coordonnees_a_l_instant_courant ,nombre_de_corps ,ADRESSE_NON_ENCORE_DEFINIE ) ); DEFV(Int,DdTb1(POINTERi ,liste_des_stabilites_a_l_instant_courant ,nombre_de_corps ,ADRESSE_NON_ENCORE_DEFINIE ) ); /* Definition de l'instant courant. */ DEFV(pointF_3D,DdTb2(POINTERs ,liste_des_coordonnees_cumule_sur_toute_la_duree ,nombre_de_corps ,nombre_de_periodes_de_la_simulation ,ADRESSE_NON_ENCORE_DEFINIE ) ); /* Definition de l'ensemble des instants cumules. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' I N T E G R A T I O N D U S Y S T E M E */ /* D ' E Q U A T I O N S D I F F E R E N T I E L L E S : */ /* */ /*************************************************************************************************************************************/ #include xrk/integr.2B.vv.I" /* Uniquement afin de definir {cx,cy,cz}. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 \ ) /* Definition de l'instant precedent. */ #define ACCES_VITESSE_COURANTE(corps) \ IdTb1(liste_des_vitesses_a_l_instant_courant \ ,INDX(corps,PREMIER_POINT_DES_LISTES) \ ,nombre_de_corps \ ) #define ACCES_COORDONNEES_COURANTES(corps) \ IdTb1(liste_des_coordonnees_a_l_instant_courant \ ,INDX(corps,PREMIER_POINT_DES_LISTES) \ ,nombre_de_corps \ ) #define ACCES_STABILITES_COURANTES(corps) \ IdTb1(liste_des_stabilites_a_l_instant_courant \ ,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. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 20030313145557, '__VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' etait defini */ /* ici, mais cela est contraire aux tests dont il est l'objet dans */ /* 'v $xrv/champs_5.12$I __VERSION__PERMETTRE_L_UTILISATION_D_UN_FOND' via */ /* 'v $xrk/attractor.17$I champs_5.12', d'ou son deplacement a cette date... */ #include xrk/attractor.18.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A R C H E A L E A T O I R E D A N S L ' E S P A C E T R I D I M E N S I O N N E L : */ /* */ /*************************************************************************************************************************************/ 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_MINIMUM_DELTA_RHO,MINIMUM_DELTA_RHO_IMPLICITE); iTRANSFORMAT_31(liste_initiale_des_MAXIMUM_DELTA_RHO,MAXIMUM_DELTA_RHO_IMPLICITE); /* Initialisation des fichiers de listes de variations des 'rho's. */ iTRANSFORMAT_31(liste_initiale_des_MINIMUM_N_PHI,MINIMUM_N_PHI_IMPLICITE); iTRANSFORMAT_31(liste_initiale_des_MAXIMUM_N_PHI,MAXIMUM_N_PHI_IMPLICITE); iTRANSFORMAT_31(liste_initiale_des_DELTA_PHI,DELTA_PHI_IMPLICITE); /* Initialisation des fichiers de listes de variations des 'phi's (ou "longitude"). */ iTRANSFORMAT_31(liste_initiale_des_MINIMUM_N_THETA,MINIMUM_N_THETA_IMPLICITE); iTRANSFORMAT_31(liste_initiale_des_MAXIMUM_N_THETA,MAXIMUM_N_THETA_IMPLICITE); iTRANSFORMAT_31(liste_initiale_des_DELTA_THETA,DELTA_THETA_IMPLICITE); /* Initialisation des fichiers de listes de variations des 'theta's (ou "distance polaire"). */ iTRANSFORMAT_31(liste_initiale_des_DISTANCE_MAXIMALE,DISTANCE_MAXIMALE_IMPLICITE); /* Initialisation des fichiers de listes de distances maximales. */ iTRANSFORMAT_31(liste_initiale_des_STABILITE,STABILITE_IMPLICITE); /* Initialisation des fichiers de listes de stabilite. */ iTRANSFORMAT_31(liste_initiale_des_RAYON,RAYON_IMPLICITE); /* Initialisation du fichier de liste des rayons. */ 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. */ #include xrv/champs_5.1A.I" GET_ARGUMENTSv(nombre_d_arguments ,BLOC(PROCESS_ARGUMENT_I("nombre_points=""npoints=""iterations=""corps=",nombre_de_corps /* Le 20111211100020, 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_MINIMUM_DELTA_RHO=" ,fichier_LISTE_MINIMUM_DELTA_RHO ,liste_initiale_des_MINIMUM_DELTA_RHO ,MINIMUM_DELTA_RHO_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_MAXIMUM_DELTA_RHO=" ,fichier_LISTE_MAXIMUM_DELTA_RHO ,liste_initiale_des_MAXIMUM_DELTA_RHO ,MAXIMUM_DELTA_RHO_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_MINIMUM_N_PHI=" ,fichier_LISTE_MINIMUM_N_PHI ,liste_initiale_des_MINIMUM_N_PHI ,MINIMUM_N_PHI_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_MAXIMUM_N_PHI=" ,fichier_LISTE_MAXIMUM_N_PHI ,liste_initiale_des_MAXIMUM_N_PHI ,MAXIMUM_N_PHI_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_DELTA_PHI=" ,fichier_LISTE_DELTA_PHI ,liste_initiale_des_DELTA_PHI ,DELTA_PHI_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_MINIMUM_N_THETA=" ,fichier_LISTE_MINIMUM_N_THETA ,liste_initiale_des_MINIMUM_N_THETA ,MINIMUM_N_THETA_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_MAXIMUM_N_THETA=" ,fichier_LISTE_MAXIMUM_N_THETA ,liste_initiale_des_MAXIMUM_N_THETA ,MAXIMUM_N_THETA_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_DELTA_THETA=" ,fichier_LISTE_DELTA_THETA ,liste_initiale_des_DELTA_THETA ,DELTA_THETA_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_DISTANCE_MAXIMALE=" ,fichier_LISTE_DISTANCE_MAXIMALE ,liste_initiale_des_DISTANCE_MAXIMALE ,DISTANCE_MAXIMALE_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_STABILITE=" ,fichier_LISTE_STABILITE ,liste_initiale_des_STABILITE ,STABILITE_IMPLICITE ,lTRANSFORMAT_11 ); PROCESS_ARGUMENT_FICHIER("LISTE_RAYON=" ,fichier_LISTE_RAYON ,liste_initiale_des_RAYON ,RAYON_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 ); GET_ARGUMENT_I("graine=""g=",graine_du_generateur_d_evenements); GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation); GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation); GET_ARGUMENT_L("automatique=",limiter_automatiquement_les_tentatives_de_recherche_d_une_bonne_perturbation); GET_ARGUMENT_I("tentatives=",nombre_maximal_de_tentatives_de_recherche_d_une_bonne_perturbation); GET_ARGUMENT_F("dt=""dct=",dct); GET_ARGUMENT_I("nombre=",nombre_de_pas_de_temps_par_periode); PROCESS_ARGUMENTS_DE_VISUALISATION; PROCESS_ARGUMENTS_DE_VISUALISATION_DES_AXES_DE_COORDONNEES; GET_ARGUMENT_L("ensemble=",visualiser_l_ensemble_des_instants); 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); ) ); #include xrv/champs_5.19.I" /* Pour eviter le message : */ /* */ /* Static function is not referenced. */ /* */ /* sur 'SYSTEME_ES9000_AIX_CC'... */ #include xrk/attractor.19.I" /* Validations et definition de l'espace physique. */ INITIALISATION_DE_LA_SYNTHESE_D_IMAGE; /* Initialisation eventuelle du calcul des trainees... */ Test(IFET(IL_NE_FAUT_PAS(definir_la_scene_par_rapport_au_centre_de_l_espace) ,NINCff(corps_de_reference,PREMIER_POINT_DES_LISTES,nombre_de_corps) ) ) Bblock PRINT_ATTENTION("le corps de reference demande n'existe pas, on lui substitue la valeur par defaut"); EGAL(corps_de_reference,CORPS_DE_REFERENCE); Eblock ATes Bblock Eblock ETes MdTb1(liste_des_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 ); /* 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 ); MdTb1(liste_des_stabilites_a_l_instant_courant ,nombre_de_corps ,Int ,ADRESSE_NON_ENCORE_DEFINIE ); /* Definition de l'ensemble des instants cumules. */ Komp(corps,nombre_de_corps) Bblock /* Initialisation des listes relatives aux differents corps arguments meme celles pour */ /* lesquelles cela n'a pas de sens... */ 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) ); Test(IFOU(IFNE(ACCES_LISTE(liste_initiale_des_STABILITE,corps) ,INTE(ACCES_LISTE(liste_initiale_des_STABILITE,corps)) ) ,IZLE(ACCES_LISTE(liste_initiale_des_STABILITE,corps)) ) ) Bblock PRINT_ATTENTION("la 'stabilite' d'un corps n'est pas un nombre entier, ou est negative ou nulle"); CAL1(Prer1("corps=%d\n",corps)); EGAL(ACCES_STABILITES_COURANTES(corps),STABILITE_IMPLICITE); Eblock ATes Bblock EGAL(ACCES_STABILITES_COURANTES(corps),INTE(ACCES_LISTE(liste_initiale_des_STABILITE,corps))); Eblock ETes #define UN_TOUR_DE_PLUS \ UN EGAL(ACCES_STABILITES_COURANTES(corps),ADD2(ACCES_STABILITES_COURANTES(corps),UN_TOUR_DE_PLUS)); /* Et ce a cause du probleme lie a la visualisation des conditions initiales... */ Eblock EKom 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... */ INITIALISATIONS_RELATIVES_A_CHAQUE_NOUVELLE_IMAGE(numero_de_la_periode_courante); /* Initialisations necessaires avant le calcul et la generation de chaque nouvelle image. */ DoIn(periode ,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_de_la_periode_courante_de_la_simulation ,I ) Bblock Komp(corps,nombre_de_corps) Bblock EGAL(rayon_de_visualisation,ACCES_LISTE(liste_initiale_des_RAYON,corps)); /* Recuperation eventuelle du rayon de chaque point... */ 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(dcx,ACCES_LISTE(liste_initiale_des_ROUGE,corps)); EGAL(dcy,ACCES_LISTE(liste_initiale_des_VERTE,corps)); EGAL(dcz,ACCES_LISTE(liste_initiale_des_BLEUE,corps)); CALS(memorisation_1_point_07(DECENTRAGE_DES_COORDONNEES(cx,X,x) ,DECENTRAGE_DES_COORDONNEES(cy,Y,y) ,DECENTRAGE_DES_COORDONNEES(cz,Z,z) ,dcx ,dcy ,dcz ,corps ) ); /* Memorisation du corps courant, la premiere image donnant les conditions initiales... */ 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... */ Eblock EKom Eblock EDoI 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 ,ADD2(nombre_de_pas_de_temps_par_periode,UN_TOUR_DE_PLUS) ) ) /* 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...). */ Bblock Komp(corps,nombre_de_corps) Bblock TRANSFERT_POINT_3D(ACCES_COORDONNEES_PRECEDENTES(corps) ,ACCES_COORDONNEES_COURANTES(corps) ); Test(IZEQ(ACCES_STABILITES_COURANTES(corps))) Bblock DEFV(Int,INIT(decompteur_de_recherche_d_une_bonne_perturbation ,COND(IL_FAUT(limiter_automatiquement_les_tentatives_de_recherche_d_une_bonne_perturbation) ,EXP2(MUL3(NBRE(ACCES_LISTE(liste_initiale_des_MINIMUM_DELTA_RHO,corps) ,ACCES_LISTE(liste_initiale_des_MAXIMUM_DELTA_RHO,corps) ) ,NBRE(ACCES_LISTE(liste_initiale_des_MINIMUM_N_PHI,corps) ,ACCES_LISTE(liste_initiale_des_MAXIMUM_N_PHI,corps) ) ,NBRE(ACCES_LISTE(liste_initiale_des_MINIMUM_N_THETA,corps) ,ACCES_LISTE(liste_initiale_des_MAXIMUM_N_THETA,corps) ) ) ) ,nombre_maximal_de_tentatives_de_recherche_d_une_bonne_perturbation ) ) ); DEFV(Logical,INIT(chercher_une_bonne_perturbation,VRAI)); /* Afin de boucler tant que l'on n'a pas trouve une perturbation qui ne nous eloigne */ /* pas trop du centre de l'espace. La valeur du decompteur est relativement arbitraire */ /* et est destinee a eviter des bouclages sans fin... */ DEFV(Float,INIT(rho ,Rho_3D(ASD1(ACCES_VITESSE_COURANTE(corps),dx) ,ASD1(ACCES_VITESSE_COURANTE(corps),dy) ,ASD1(ACCES_VITESSE_COURANTE(corps),dz) ) ) ); DEFV(Float,INIT(phi ,Phi_3D(ASD1(ACCES_VITESSE_COURANTE(corps),dx) ,ASD1(ACCES_VITESSE_COURANTE(corps),dy) ,ASD1(ACCES_VITESSE_COURANTE(corps),dz) ) ) ); DEFV(Float,INIT(theta ,Theta_3D(ASD1(ACCES_VITESSE_COURANTE(corps),dx) ,ASD1(ACCES_VITESSE_COURANTE(corps),dy) ,ASD1(ACCES_VITESSE_COURANTE(corps),dz) ) ) ); /* Passage des coordonnees cartesiennes aux coordonnees spheriques pour le vecteur vitesse */ /* du corps courant. */ DEFV(deltaF_3D,vitesse_perturbee); /* Vitesse perturbee (et eventuellement provisoire) du corps courant en coordonnees */ /* cartesiennes. */ Test(IZLE(decompteur_de_recherche_d_une_bonne_perturbation)) Bblock EGAL(decompteur_de_recherche_d_une_bonne_perturbation ,COND(IZGT(nombre_maximal_de_tentatives_de_recherche_d_une_bonne_perturbation) ,nombre_maximal_de_tentatives_de_recherche_d_une_bonne_perturbation ,NOMBRE_MAXIMAL_DE_TENTATIVES_DE_RECHERCHE_D_UNE_BONNE_PERTURBATION ) ); Eblock ATes Bblock Eblock ETes Tant(IL_FAUT(chercher_une_bonne_perturbation)) Bblock DEFV(Float,INIT(distance_courante_a_l_origine,FLOT__UNDEF)); DEFV(Float,INIT(distance_precedente_a_l_origine,FLOT__UNDEF)); /* Afin de savoir si l'on s'eloigne de l'origine... */ DEFV(Float,INIT(rho_perturbe,FLOT__UNDEF)); DEFV(Float,INIT(phi_perturbe,FLOT__UNDEF)); DEFV(Float,INIT(theta_perturbe,FLOT__UNDEF)); /* Vitesse perturbee (et eventuellement provisoire) du corps courant en coordonnees */ /* spheriques. */ DEFV(Float,INIT(variation_de_rho,FLOT__UNDEF)); DEFV(Float,INIT(variation_de_phi,FLOT__UNDEF)); DEFV(Float,INIT(variation_de_theta,FLOT__UNDEF)); GENERATION_D_UNE_VALEUR(variation_de_rho ,ACCES_LISTE(liste_initiale_des_MINIMUM_DELTA_RHO,corps) ,ACCES_LISTE(liste_initiale_des_MAXIMUM_DELTA_RHO,corps) ); GENERATION_D_UNE_VALEUR(variation_de_phi ,ACCES_LISTE(liste_initiale_des_MINIMUM_N_PHI,corps) ,ACCES_LISTE(liste_initiale_des_MAXIMUM_N_PHI,corps) ); GENERATION_D_UNE_VALEUR(variation_de_theta ,ACCES_LISTE(liste_initiale_des_MINIMUM_N_THETA,corps) ,ACCES_LISTE(liste_initiale_des_MAXIMUM_N_THETA,corps) ); EGAL(variation_de_phi,MUL2(ARRO(variation_de_phi),ACCES_LISTE(liste_initiale_des_DELTA_PHI,corps))); EGAL(variation_de_theta,MUL2(ARRO(variation_de_theta),ACCES_LISTE(liste_initiale_des_DELTA_THETA,corps))); /* Variations aleatoires des coordonnees spheriques du vecteur vitesse du corps courant. */ EGAL(rho_perturbe,ADD2(rho,variation_de_rho)); EGAL(phi_perturbe,ADD2(phi,variation_de_phi)); EGAL(theta_perturbe,ADD2(theta,variation_de_theta)); /* Vitesse perturbee (et eventuellement provisoire) du corps courant (en coordonnees */ /* spheriques). */ INITIALISATION_ACCROISSEMENT_3D(vitesse_perturbee ,Xcartesienne_3D(rho_perturbe,phi_perturbe,theta_perturbe) ,Ycartesienne_3D(rho_perturbe,phi_perturbe,theta_perturbe) ,Zcartesienne_3D(rho_perturbe,phi_perturbe,theta_perturbe) ); /* Vitesse perturbee (et eventuellement provisoire) du corps courant (en coordonnees */ /* cartesiennes). */ INITIALISATION_POINT_3D(ACCES_COORDONNEES_COURANTES(corps) ,AXPB(ASD1(vitesse_perturbee,dx) ,dct ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),x) ) ,AXPB(ASD1(vitesse_perturbee,dy) ,dct ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),y) ) ,AXPB(ASD1(vitesse_perturbee,dz) ,dct ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),z) ) ); /* Nouvelle position provisoire et perturbee du corps courant... */ EGAL(distance_precedente_a_l_origine ,RdisF3D(ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),x) ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),y) ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),z) ,Xcentre_ESPACE ,Ycentre_ESPACE ,Zcentre_ESPACE ) ); EGAL(distance_courante_a_l_origine ,RdisF3D(ASD1(ACCES_COORDONNEES_COURANTES(corps),x) ,ASD1(ACCES_COORDONNEES_COURANTES(corps),y) ,ASD1(ACCES_COORDONNEES_COURANTES(corps),z) ,Xcentre_ESPACE ,Ycentre_ESPACE ,Zcentre_ESPACE ) ); /* Afin de savoir si l'on s'eloigne de l'origine... */ Test(I3OU(IFLE(distance_courante_a_l_origine ,ACCES_LISTE(liste_initiale_des_DISTANCE_MAXIMALE,corps) ) ,IFLE(distance_courante_a_l_origine ,distance_precedente_a_l_origine ) ,IZLE(decompteur_de_recherche_d_une_bonne_perturbation) ) ) Bblock Test(IZLE(decompteur_de_recherche_d_une_bonne_perturbation)) Bblock PRINT_ATTENTION("apparemment, nous sommes en train de boucler"); CAL1(Prer3("position precedente = (%f,%f,%f)\n" ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),x) ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),y) ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),z) ) ); CAL1(Prer1("distance precedente = %f\n",distance_precedente_a_l_origine)); CAL1(Prer3("position courante = (%f,%f,%f)\n" ,ASD1(ACCES_COORDONNEES_COURANTES(corps),x) ,ASD1(ACCES_COORDONNEES_COURANTES(corps),y) ,ASD1(ACCES_COORDONNEES_COURANTES(corps),z) ) ); CAL1(Prer1("distance courante = %f\n",distance_courante_a_l_origine)); Eblock ATes Bblock Eblock ETes EGAL(chercher_une_bonne_perturbation,FAUX); /* Et cela n'est plus necessaire d'iterer lorsque, soit on n'est pas sorti du "volume" */ /* dans lequel on peut se deplacer, soit on se rapproche de l'origine... */ Eblock ATes Bblock DECR(decompteur_de_recherche_d_une_bonne_perturbation,I); /* Pour eviter de boucler... */ Eblock ETes Eblock ETan TRANSFERT_ACCROISSEMENT_3D(ACCES_VITESSE_COURANTE(corps) ,vitesse_perturbee ); EGAL(ACCES_STABILITES_COURANTES(corps),INTE(ACCES_LISTE(liste_initiale_des_STABILITE,corps))); /* Et reinitialisation de la stabilite... */ Eblock ATes Bblock /* Ici, la 'ACCES_VITESSE_COURANTE(...)' ne change pas... */ INITIALISATION_POINT_3D(ACCES_COORDONNEES_COURANTES(corps) ,AXPB(ASD1(ACCES_VITESSE_COURANTE(corps),dx) ,dct ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),x) ) ,AXPB(ASD1(ACCES_VITESSE_COURANTE(corps),dy) ,dct ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),y) ) ,AXPB(ASD1(ACCES_VITESSE_COURANTE(corps),dz) ,dct ,ASD1(ACCES_COORDONNEES_PRECEDENTES(corps),z) ) ); /* Nouvelle position non perturbee du corps courant... */ DECR(ACCES_STABILITES_COURANTES(corps),I); /* Et decrementation de la stabilite... */ Eblock ETes 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... */ Eblock ERep #include xrk/attractor.1A.I" VISUALISATION_DES_AXES_DE_COORDONNEES; /* Visualisation si necessaire des trois axes de coordonnees. */ GENERATION_D_UNE_IMAGE_ET_PASSAGE_A_LA_SUIVANTE(BLOC(VIDE;)); /* Generation de l'image courante... */ Eblock EKom FdTb2(liste_des_coordonnees_cumule_sur_toute_la_duree ,nombre_de_corps ,nombre_de_periodes_de_la_simulation ,pointF_3D ,ADRESSE_NON_ENCORE_DEFINIE ); FdTb1(liste_des_stabilites_a_l_instant_courant ,nombre_de_corps ,Int ,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 ); 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 20050221171423... */ EDITION_DES_EXTREMA_DES_COORDONNEES_ET_DES_DERIVEES; /* Edition facultative des extrema des coordonnees et des derivees. */ RETU_Commande; Eblock ECommande