/*************************************************************************************************************************************/ /* */ /* M O D E L E D E I S I N G B I D I M E N S I O N N E L : */ /* */ /* */ /* Definition : */ /* */ /* Cette commande applique le modele */ /* d'Ising bidimensionnel a une image. */ /* Il utilise deux graines 'gt' et 'gb'. */ /* Un calcul portant sur 'N' iterations */ /* (donnant donc une image 'I' comme Resultat), */ /* peut etre poursuivi ulterieurement de facon */ /* "coherente" en partant de 'I' a condition */ /* d'utiliser alors comme graines les valeurs */ /* 'gt+N' et 'gb+N'. */ /* */ /* */ /* Author of '$xci/Ising_2D.11$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20001206114953). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 #include image_image_IMAGESF_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xci/sequence.01.I" #define EDITER_LES_PARAMETRES_DU_NOYAU_ET_SORTIR_IMMEDIATEMENT \ FAUX \ /* Faut-il editer les parametres du noyau et sortir immediatement ('VRAI') ou exploiter */ \ /* le modele d'Ising bidimensionnel ('FAUX') ? */ #define LISTER_LE_CONTENU_DU_NOYAU \ FAUX \ /* Faut-il lister le contenu du noyau ('VRAI') ou pas ('FAUX') ? */ #define GENERER_LES_CONDITIONS_INITIALES \ VRAI \ /* Doit-on generer les conditions initiales en tant que premiere image ('VRAI') ou bien */ \ /* le premier resultat du modele ('FAUX') ? */ #define GENERER_LES_DIFFERENCES_ENTRE_DEUX_ETATS_SUCCESSIFS \ FAUX \ /* Doit-on generer les etats ('FAUX') ou bien les differences entre deux etats successifs */ \ /* ('VRAI') ? */ #define NOMBRE_D_ITERATIONS \ UN \ /* Nombre d'iterations. */ #define CONSTANTE_DE_BOLTZMANN_ISING_2D \ FU \ /* Afin de simplifier l'utilisation et eviter les echelles physiques. Le 20001209082100, */ \ /* passage donc de 'CONSTANTE_DE_BOLTZMANN' a 'FU'. */ #define CONSTANTE_DE_COUPLAGE_J \ FU \ /* Constante de couplage 'J'. */ #define TEMPERATURE_GLOBALE \ GRO4(FRA10(FU)) \ /* Temperature globale du modele. Le 20001211131922, passage de 'PARE(273.15)' a 'FU', puis */ \ /* a 'GRO4(FRA10(FU))', c'est-a-dire sous la temperature critique, le 20001213104918. */ #define GRAINE_INITIALE_DE_SELECTION_DES_POINTS_A_TESTER \ TROIS #define PROBABILITE_DE_SELECTION_DES_POINTS_A_TESTER \ FRA10(FU) /* Pour choisir les points a tester. */ /* */ /* Le 20050830122703, je note que la valeur par defaut (1/10) est certainement trop */ /* importante ('v $Dcourrier_in/20001208174958 N.est.trop.grand') ; une valeur plus */ /* faible (par exemple 1/100) semble mieux convenir, en particulier au voisinage de la */ /* temperature critique ('v $xiirk/ISIN.A2'). */ #define GRAINE_INITIALE_DE_SELECTION_DES_POINTS_A_FAIRE_BASCULER \ SEPT \ /* Pour determiner le basculement du spin des points a tester. */ #define EDITER_LES_EVENTUELLES_GRAINES_INITIALES_SUIVANTES \ FAUX \ /* Doit-on editer ('VRAI') ou pas ('FAUX') les graines a re-injecter dans le modele pour */ \ /* poursuivre de facon coherente la generation ? */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xci/Verhulst.01.I" /* Introduit le 20040916113000. */ #define INCREMENT_DES_GRAINES \ I \ /* Pour incrementer les graines du generateur aleatoire apres chaque iteration. */ #define TITRE_graine_initiale_de_selection_des_points_a_tester \ "graineT=" #define TITRE_graine_initiale_de_selection_des_points_a_faire_basculer \ "graineB=" /* Quelques titres utiles. */ #define NOMBRE_DE_CHIFFRES_NECESSAIRES(dimension) \ ADD2(NOMBRE_DE_CHIFFRES_DECIMAUX(dimension),UN) \ /* Choix du nombre de chiffres necessaires pour editer une dimension. On notera qu'il y */ \ /* a deux 'TRPU(...)', le deuxieme etant destine au signe qui compte pour un caractere. */ \ /* */ \ /* La procedure 'NOMBRE_DE_CHIFFRES_DECIMAUX(...)' fut introduite le 20051210183940. Les */ \ /* deux 'TRPU(...)' furent donc remplaces par 'un 'ADD2(...,UN)'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O D E L E D E I S I N G B I D I M E N S I O N N E L : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageN),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageT),NOM_PIPE)); DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE)); /* Numero de la derniere image. */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES)); /* Nombre de chiffres codant le numero des images de la serie... */ DEFV(Int,INIT(numero_d_image,UNDEF)); /* Numero de l'image courante. */ DEFV(Logical,INIT(editer_les_parametres_du_noyau_et_sortir_immediatement ,EDITER_LES_PARAMETRES_DU_NOYAU_ET_SORTIR_IMMEDIATEMENT ) ); /* Faut-il editer les parametres du noyau et sortir immediatement ('VRAI') ou exploiter */ /* le modele d'Ising bidimensionnel ('FAUX') ? */ /* */ /* Le 20050830094607, '_ET_SORTIR_IMMEDIATEMENT' et '_et_sortir_immediatement' ont ete */ /* ajoutes en queue des deux symboles precedents afin d'ameliorer la comprehension... */ DEFV(Logical,INIT(lister_le_contenu_du_noyau,LISTER_LE_CONTENU_DU_NOYAU)); /* Faut-il lister le contenu du noyau ('VRAI') ou pas ('FAUX') ? */ DEFV(Logical,INIT(generer_les_conditions_initiales,GENERER_LES_CONDITIONS_INITIALES)); /* Doit-on generer les conditions initiales en tant que premiere image ('VRAI') ou bien */ /* le premier resultat du modele ('FAUX') ? */ DEFV(Logical,INIT(generer_les_differences_entre_deux_etats_successifs,GENERER_LES_DIFFERENCES_ENTRE_DEUX_ETATS_SUCCESSIFS)); /* Doit-on generer les etats ('FAUX') ou bien les differences entre deux etats successifs */ /* ('VRAI') ? */ DEFV(Positive,INIT(nombre_d_iterations,NOMBRE_D_ITERATIONS)); /* Nombre d'iterations. */ DEFV(Float,INIT(constante_de_couplage_J,CONSTANTE_DE_COUPLAGE_J)); /* Constante de couplage 'J'. */ DEFV(Float,INIT(temperature_globale,TEMPERATURE_GLOBALE)); /* Temperature globale du modele. */ DEFV(Int,INIT(graine_initiale_de_selection_des_points_a_tester ,GRAINE_INITIALE_DE_SELECTION_DES_POINTS_A_TESTER ) ); DEFV(Float,INIT(probabilite_de_selection_des_points_a_tester,PROBABILITE_DE_SELECTION_DES_POINTS_A_TESTER)); /* Pour choisir les points a tester. */ /* */ /* Le 20050830122703, je note que la valeur par defaut (1/10) est certainement trop */ /* importante ('v $Dcourrier_in/20001208174958 N.est.trop.grand') ; une valeur plus */ /* faible (par exemple 1/100) semble mieux convenir, en particulier au voisinage de la */ /* temperature critique ('v $xiirk/ISIN.A2'). */ DEFV(Int,INIT(graine_initiale_de_selection_des_points_a_faire_basculer ,GRAINE_INITIALE_DE_SELECTION_DES_POINTS_A_FAIRE_BASCULER ) ); /* Pour determiner le basculement du spin des points a tester. */ DEFV(Logical,INIT(editer_les_eventuelles_graines_initiales_suivantes,EDITER_LES_EVENTUELLES_GRAINES_INITIALES_SUIVANTES)); /* Doit-on editer ('VRAI') ou pas ('FAUX') les graines a re-injecter dans le modele pour */ /* poursuivre de facon coherente la generation ? */ /*..............................................................................................................................*/ EGAL(Imodele_d_Ising_2D_____constante_de_Boltzmann,CONSTANTE_DE_BOLTZMANN_ISING_2D); GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("imageN=""N=",nom_imageN); GET_ARGUMENT_C("imageT=""T=",nom_imageT); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_I("premiere=",premiere_image); GET_ARGUMENT_I("derniere=",derniere_image); GET_ARGUMENT_I("pas=",pas_des_images); GET_ARGUMENT_I("chiffres=",nombre_de_chiffres); GET_ARGUMENT_L("parametres_noyau=""editer_noyau=",editer_les_parametres_du_noyau_et_sortir_immediatement); GET_ARGUMENT_L("lister_noyau=""contenu_noyau=",lister_le_contenu_du_noyau); GET_ARGUMENT_L("initiales=",generer_les_conditions_initiales); GET_ARGUMENT_L("differences=",generer_les_differences_entre_deux_etats_successifs); GET_ARGUMENT_L("periodiser_X=""periodX=",Imodele_d_Ising_2D_____periodiser_X); GET_ARGUMENT_L("periodiser_Y=""periodY=",Imodele_d_Ising_2D_____periodiser_Y); GET_ARGUMENT_L("symetriser_X=""symetrX=",Imodele_d_Ising_2D_____symetriser_X); GET_ARGUMENT_L("symetriser_Y=""symetrY=",Imodele_d_Ising_2D_____symetriser_Y); GET_ARGUMENT_L("prolonger_X=""prolX=",Imodele_d_Ising_2D_____prolonger_X); GET_ARGUMENT_L("prolonger_Y=""prolY=",Imodele_d_Ising_2D_____prolonger_Y); GET_ARGUMENT_P("niveau_hors_image=""niveau=",Imodele_d_Ising_2D_____niveau_hors_image); GET_ARGUMENT_F("spin_negatif=""sn=",Imodele_d_Ising_2D_____spin_negatif); GET_ARGUMENT_F("spin_positif=""sp=",Imodele_d_Ising_2D_____spin_positif); /* Introduit le 20050826113447 ('v $xiii/di_image$DEF 20050825111821')... */ GET_ARGUMENT_I("ni=""iterations=",nombre_d_iterations); /* Le 20050623142016, "n=" et "N=" ont ete remplaces par "ni=" (double definition...). */ GET_ARGUMENT_F("k=""K=""Boltzmann=""B=",Imodele_d_Ising_2D_____constante_de_Boltzmann); GET_ARGUMENT_F("temperature=""t=",temperature_globale); /* Le 20050623142016, "T=" a ete supprime (double definition...). */ GET_ARGUMENT_F("facteur=""f=",Imodele_d_Ising_2D_____facteur_de_la_variation_d_energie); GET_ARGUMENT_F("J=""C=",constante_de_couplage_J); /* Le 20050831113536, "E=" a ete remplace par "C=", le symbole 'energie_positive_J' */ /* ayant ete remplace par 'constante_de_couplage_J' (plus logique...). */ GET_ARGUMENT_I(TITRE_graine_initiale_de_selection_des_points_a_tester"gt=" ,graine_initiale_de_selection_des_points_a_tester ); GET_ARGUMENT_F("probabilite=""p=",probabilite_de_selection_des_points_a_tester); GET_ARGUMENT_I(TITRE_graine_initiale_de_selection_des_points_a_faire_basculer"gb=" ,graine_initiale_de_selection_des_points_a_faire_basculer ); GET_ARGUMENT_L("affiner_rdn=",rdnIFnD_____affiner_la_generation); GET_ARGUMENT_L("iterer_rdn=",rdnIFnD_____iterer_la_generation); GET_ARGUMENT_L("editer_graines=""editer=",editer_les_eventuelles_graines_initiales_suivantes); GET_ARGUMENT_L("noyau=",Imodele_d_Ising_2D_____utiliser_un_noyau); GET_ARGUMENT_I("demi_dimension=""dd=",Imodele_d_Ising_2D_____demi_dimension_effective_du_noyau); GET_ARGUMENT_F("sX__Y=""sXY=",Imodele_d_Ising_2D_____ponderation_du_point_sX__Y); GET_ARGUMENT_F("_X_sY=""XsY=",Imodele_d_Ising_2D_____ponderation_du_point__X_sY); GET_ARGUMENT_F("pX__Y=""pXY=",Imodele_d_Ising_2D_____ponderation_du_point_pX__Y); GET_ARGUMENT_F("_X_pY=""XpY=",Imodele_d_Ising_2D_____ponderation_du_point__X_pY); GET_ARGUMENT_I("dx=""dX=",Imodele_d_Ising_2D_____delta_X); GET_ARGUMENT_I("dy=""dY=",Imodele_d_Ising_2D_____delta_Y); ) ); Test(IL_FAUT(editer_les_parametres_du_noyau_et_sortir_immediatement)) Bblock CAL3(Prme4("Xmin=%d Xmax=%d Ymin=%d Ymax=%d\n" ,PINTE(Imodele_d_Ising_2D_____XYmin),PINTE(Imodele_d_Ising_2D_____XYmax) ,PINTE(Imodele_d_Ising_2D_____XYmin),PINTE(Imodele_d_Ising_2D_____XYmax) ) ); CAL3(Prme4("XminR=%d XmaxR=%d YminR=%d YmaxR=%d\n" ,PINTE(Imodele_d_Ising_2D_____XYmin),PINTE(Imodele_d_Ising_2D_____XYmax) ,PINTE(Imodele_d_Ising_2D_____XYmin),PINTE(Imodele_d_Ising_2D_____XYmax) ) ); CALS(Fsauts_de_lignes(UN)); CAL3(Prme4("XYmaxNe %d %d %d %d\n" ,PINTE(Imodele_d_Ising_2D_____XYmin),PINTE(Imodele_d_Ising_2D_____XYmax) ,PINTE(Imodele_d_Ising_2D_____XYmin),PINTE(Imodele_d_Ising_2D_____XYmax) ) ); /* ATTENTION : on ne devra pas etre surpris par les valeurs ainsi obtenues. Par exemple, on */ /* obtiendra : */ /* */ /* XYmax 128 128 */ /* */ /* avec la valeur 64 pour 'DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D', en */ /* se rappelant que l'on passe a 'DimNo_Imodele_d_Ising_2D' par un 'DOUP(...)'. Les */ /* extrema ainsi obtenus (128) different d'une unite de ceux fournis par 'Suq' (127) et */ /* les parites des deux dimensions respectives (129 et 128) sont elles-aussi differentes... */ /* */ /* ATTENTION : passage de 'XYmax' a 'XYmaxNe' le 20020909112152. */ /* */ /* Pour l'usage de 'PINTE(...)' voir 'v $xil/defi_K2$vv$DEF 20230311135805' qui a ete */ /* introduit pour ces impressions le 20230311140136... */ Eblock ATes Bblock CALi(Inoir(ImageR)); /* Initialisation de l'image Resultat. */ Test(IFET(IL_NE_FAUT_PAS(generer_les_conditions_initiales) ,IL_FAUT(generer_les_differences_entre_deux_etats_successifs) ) ) Bblock PRINT_ATTENTION("les options 'initiales=' et 'differences=' sont incompatibles"); PRINT_ATTENTION("les conditions initiales seront generees"); EGAL(generer_les_conditions_initiales,VRAI); Eblock ATes Bblock Eblock ETes Test(IFNE_chaine(nom_imageN,NOM_PIPE)) Bblock /* On notera le 20050920150050 que seul le centre du noyau (celui-ci etant defini grace a */ /* 'Imodele_d_Ising_2D_____demi_dimension_effective_du_noyau') est utilise. Ainsi, la */ /* matrice 'PImodele_d_Ising_2D_____noyau' pourra n'etre initialisee qu'en son centre (ce */ /* point existant bien puisque ses dimensions sont impaires...). A cette date, ce point */ /* central a pour d'indices {X=64,Y=64} et ses dimensions sont : */ /* */ /* XYmax 128 128 */ /* */ /* Je note de plus le 20050920150050, que si au lieu d'utiliser les quatre premiers voisins */ /* (cas par defaut 'v $xiii/di_image$FON Imodele_d_Ising_2D_____utiliser_un_noyau'), ce qui */ /* equivaut au noyau : */ /* */ /* ------- */ /* | 0 1 0 | */ /* | 1 0 1 | */ /* | 0 1 0 | */ /* ------- */ /* */ /* on utilise explicitement le noyau : */ /* */ /* ------- */ /* | 1 1 0 | */ /* | 1 0 1 | */ /* | 0 1 1 | */ /* ------- */ /* */ /* ou le noyau : */ /* */ /* ------- */ /* | 0 1 1 | */ /* | 1 0 1 | */ /* | 1 1 0 | */ /* ------- */ /* */ /* cela revient a utiliser les quatre premiers voisins et deux des quatre seconds voisins */ /* opposes, c'est-a-dire un maillage non plus carre, mais hexagonal (a base de triangles */ /* equilateraux...). On rappelera qu'alors dans une situation anti-ferromagnetique, ou */ /* l'on recherche des spins anti-paralleles en ce qui concerne les 6 voisins (sur le reseau */ /* hexagonal), il y a necessairement un tiers des couples de points qui sont "frustres", */ /* c'est-a-dire pour lesquels les spins sont paralleles... */ PUSH_DIMENSIONS_2D; SET_DIMENSIONS_2D_SANS_VALIDATION(Imodele_d_Ising_2D_____XYmin,Imodele_d_Ising_2D_____XYmax ,Imodele_d_Ising_2D_____XYmin,Imodele_d_Ising_2D_____XYmax ); /* Le noyau va etre recupere comme une "petite" image dont les dimensions sont definies */ /* par {Imodele_d_Ising_2D_____XYmin,Imodele_d_Ising_2D_____XYmax} et ce independemment */ /* de 'Imodele_d_Ising_2D_____demi_dimension_effective_du_noyau'... */ Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(PImodele_d_Ising_2D_____noyau,nom_imageN)))) /* Chargement de l'image du noyau... */ /* */ /* ATTENTION : on notera que l'image 'nom_imageN' doit avoir comme taille la taille */ /* maximale du noyau correspondant a 'v $xiii/di_image$DEF DimNo_Imodele_d_Ising_2D', */ /* et non pas celle qui correspond a la taille effective de ce meme noyau */ /* 'v $xiii/di_image$FON Imodele_d_Ising_2D_____demi_dimension_effective_du_noyau'. */ /* */ /* ATTENTION : on notera de plus que l'on passe par 'PImodele_d_Ising_2D_____noyau' car, en */ /* effet, 'Imodele_d_Ising_2D_____noyau' n'est pas un vrai 'albumF' puisqu'il n'est pas cree */ /* par une allocation dynamique et variable... */ Bblock EGAL(Imodele_d_Ising_2D_____initialiser_le_noyau,FAUX); /* Evidemment, l'initialisation est faite... */ Test(IL_FAUT(lister_le_contenu_du_noyau)) Bblock begin_imageQ(DoIn,Imodele_d_Ising_2D_____XYmin_effectif,Imodele_d_Ising_2D_____XYmax_effectif,PasY ,DoIn,Imodele_d_Ising_2D_____XYmin_effectif,Imodele_d_Ising_2D_____XYmax_effectif,PasX ) Bblock CAL3(Prme5("noyau(%+0*d,%+0*d)=%+.^^^\n" ,NOMBRE_DE_CHIFFRES_NECESSAIRES(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D),X ,NOMBRE_DE_CHIFFRES_NECESSAIRES(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Imodele_d_Ising_2D),Y ,ACCES_NOYAU_DANS_Imodele_d_Ising_2D(X,Y) ) ); /* Le 20060105154125, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123126, le format "^^g" est passe a "^^^" pour plus de souplesse... */ Eblock end_imageQ(EDoI,EDoI) Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_Imodele_d_Ising_2D; /* Initialisation du noyau en cas d'erreur... */ Eblock ETes PULL_DIMENSIONS_2D; /* Restauration des dimensions de travail... */ Eblock ATes Bblock Eblock ETes LOAD_D_UNE_IMAGE_FLOTTANTE_DE_PARAMETRAGE(IFmageA,nom_imageT,temperature_globale,"temperature globale"); Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA,nom_imageA)))) Bblock DEFV(Int,INIT(graine_courante_de_selection_des_points_a_tester ,graine_initiale_de_selection_des_points_a_tester ) ); /* Pour choisir les points a tester. */ DEFV(Int,INIT(graine_courante_de_selection_des_points_a_faire_basculer ,graine_initiale_de_selection_des_points_a_faire_basculer ) ); /* Pour determiner le basculement du spin des points a tester. */ DoIn(numero_d_image ,premiere_image ,COND(IL_NE_FAUT_PAS(generer_les_differences_entre_deux_etats_successifs) ,NEUT(derniere_image) ,SUCC(derniere_image) ) ,pas_des_images ) Bblock DEFV(CHAR,INIC(POINTERc(nom_imagesR),NOM_PIPE)); Test(IFET(IL_FAUT(generer_les_conditions_initiales),IFEQ(numero_d_image,premiere_image))) Bblock CALS(Imove(ImageR,ImageA)); Eblock ATes Bblock Repe(nombre_d_iterations) Bblock CALS(Imodele_d_Ising_2D_a_temperature_locale(ImageR ,ImageA ,graine_courante_de_selection_des_points_a_tester ,probabilite_de_selection_des_points_a_tester ,graine_courante_de_selection_des_points_a_faire_basculer ,constante_de_couplage_J ,IFmageA ) ); /* Et calcul de la generation suivante... */ INCR(graine_courante_de_selection_des_points_a_tester,INCREMENT_DES_GRAINES); INCR(graine_courante_de_selection_des_points_a_faire_basculer,INCREMENT_DES_GRAINES); /* Progression des graines du generateur aleatoire puisqu'etant fonction de {X,Y}, il est */ /* fondamental qu'a l'iteration suivante, il ne redonne pas la meme serie... */ CALS(Imove(ImageA,ImageR)); /* Preparation de l'iteration suivante... */ Eblock ERep Eblock ETes Test(IL_FAUT(generer_les_differences_entre_deux_etats_successifs)) Bblock Test(IFEQ(numero_d_image,premiere_image)) Bblock CALS(Imove(ImageA1,ImageR)); /* Initialisation du processus par memorisation du premier etat dans 'A1'. */ Eblock ATes Bblock CALS(Iminmax(ImageA2,ImageR,ImageA1)); /* Calcul de la difference entre l'etat precedent ('A1') et l'etat courant ('R'). */ CALS(Imove(ImageA1,ImageR)); /* Preparation du prochain etat precedent. */ CALS(Imove(ImageR,ImageA2)); /* Preparation de l'image a sortir. */ Eblock ETes Eblock ATes Bblock Eblock ETes Test(IFOU(IL_NE_FAUT_PAS(generer_les_differences_entre_deux_etats_successifs) ,IFET(IL_FAUT(generer_les_differences_entre_deux_etats_successifs) ,IFGT(numero_d_image,premiere_image) ) ) ) Bblock DEFV(Int,INIT(numero_d_image_effectif ,COND(IL_NE_FAUT_PAS(generer_les_differences_entre_deux_etats_successifs) ,NEUT(numero_d_image) ,SOUS(numero_d_image,pas_des_images) ) ) ); /* Numero effectif de l'image courante. */ EGAL(nom_imagesR ,chain_Aconcaten2_sauf_nom_pipe(nom_imageR ,chain_numero(numero_d_image_effectif,nombre_de_chiffres) ) ); CALi(Iupdate_image(nom_imagesR,ImageR)); CALZ_FreCC(nom_imagesR); Eblock ATes Bblock Eblock ETes Eblock EDoI Test(IL_FAUT(editer_les_eventuelles_graines_initiales_suivantes)) Bblock CAL3(Prme2("%s%d\n" ,TITRE_graine_initiale_de_selection_des_points_a_tester ,graine_courante_de_selection_des_points_a_tester ) ); CAL3(Prme2("%s%d\n" ,TITRE_graine_initiale_de_selection_des_points_a_faire_basculer ,graine_courante_de_selection_des_points_a_faire_basculer ) ); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ETes RETU_Commande; Eblock ECommande