/*************************************************************************************************************************************/ /* */ /* M O D E L E T R I D I M E N S I O N N E L D E C O T E S A V E C " E T C H I N G " : */ /* */ /* */ /* Author of '$xci/CoastL_3D.21$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20020519175926). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_DI_ALBUM_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xci/sequence.01.I" /* ATTENTION, on definit ainsi le symbole 'DERNIERE_IMAGE' qui ne sert a rien ici, puisque */ /* c'est en effet 'Zmax' qui joue ce role... */ #define EDITER_LES_PARAMETRES_DU_NOYAU \ FAUX \ /* Faut-il editer les parametres du noyau et sortir immediatement ('VRAI') ou exploiter */ \ /* le modele d'etching de cotes tridimensionnel ('FAUX') ? */ #define LISTER_LE_CONTENU_DU_NOYAU \ FAUX \ /* Faut-il lister le contenu du noyau ('VRAI') ou pas ('FAUX') ? */ #define IMPOSER_LES_EXTREMA_DES_CONDITIONS_INITIALES \ FAUX #define MINIMUM_IMPOSE_POUR_LES_CONDITIONS_INITIALES \ NIVEAU_DE_LA_TERRE_DANS_Aetche__CoastLines_3D #define MAXIMUM_IMPOSE_POUR_LES_CONDITIONS_INITIALES \ NIVEAU_DE_LA___MER_DANS_Aetche__CoastLines_3D /* Faut-il imposer ('VRAI') ou pas ('FAUX') les extrema des conditions initiales, et si */ /* 'IL_FAUT(imposer_les_extrema_des_conditions_initiales)', valeurs implicites ? */ #define EDITER_LES_EXTREMA_DES_CONDITIONS_INITIALES \ FAUX \ /* Faut-il editer les extrema des des conditions initiales, ('VRAI') ou pas ('FAUX') ? */ #define NOMBRE_MINIMAL_D_ITERATIONS \ ZERO \ /* Nombre minimal d'iterations utilise dans le cas ou c'est le temps ou le pas de temps */ \ /* qui est utilise pour stopper les iterations. */ #define NOMBRE_MAXIMAL_D_ITERATIONS \ UN \ /* Nombre maximal d'iterations. */ #define SEUIL_DU_PAS_DE_TEMPS \ F_INFINI \ /* Seuil du pas de temps au-dela duquel on arrete d'iterer pour generer une image. Ce */ \ /* dispositif a ete introduit le 20020711162203 afin de tenter de visualiser le phenomene */ \ /* d'avalanche. Ainsi, on devrait regrouper dans une meme image tous les petits de temps */ \ /* et laisser plutot isoles les grands pas de temps. */ #define SEUIL_DU_CUMUL_DES_PAS_DE_TEMPS \ F_INFINI \ /* De meme pour le cumul des pas de temps reinitialise au debut de chaque nouvelle image. */ #define ARRETER_D_ITERER_S_IL_N_Y_A_PAS_EU_DE_POINTS_ETCHES \ FAUX \ /* Faut-il s'arreter ('VRAI') ou continuer d'iterer ('FAUX') lorsqu'a l'iteration courante */ \ /* aucun point n'a ete "etche" ? */ #define DECREMENTER_LE_MARQUEUR_DES_POINTS_ETCHES_APRES_L_ETCHING \ VRAI \ /* Pour decrementer 'Aetche__CoastLines_3D_____marqueur_des_points_etches' apres chaque */ \ /* iteration ('VRAI') ou avant ('FAUX'). En decrementant avant, on garantit ainsi que le */ \ /* niveau de marquage de la mer est strictement superieur a celui de la cote. Ceci a ete */ \ /* introduit le 20040909133245... */ #define DECREMENT_DU_MARQUEUR_DES_POINTS_ETCHES \ FZERO \ /* Decrement de 'Aetche__CoastLines_3D_____marqueur_des_points_etches' avant ou apres */ \ /* chaque iteration... */ #define NOMBRE_MAXIMAL_D_ETCHERS \ FLOT(CENT_MILLE) \ /* Nombre maximal (et initial) d'"etcher"s. */ #define CONSTANTE_DE_BOLTZMANN_ETCHE______COTES_3D \ FU \ /* Afin de simplifier l'utilisation et eviter les echelles physiques. */ #define TEMPERATURE_GLOBALE \ FU \ /* Temperature globale. */ #define GRAINE_INITIALE_DE_SELECTION_DES_POINTS_A_ETCHER \ TROIS \ /* Pour choisir les points a "etcher". */ #define EDITER_QUELQUES_NOMBRES_UTILES \ FAUX \ /* Faut-il editer le nombre d'"etchers" avant "etching" et le nombre de points "etches" */ \ /* apres "etching" ('VRAI') ou pas ('FAUX') ? */ #define CONVERTIR_EN_IMAGES_STANDARDS \ VRAI \ /* Faut-il convertir les images Resultats en images standards ('VRAI') ou les laisser */ \ /* sous forme d'images flottantes ('FAUX') ? */ #define EDITER_L_EVENTUELLE_GRAINE_INITIALE_SUIVANTE \ FAUX \ /* Doit-on editer ('VRAI') ou pas ('FAUX') la graine 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 : */ /* */ /*************************************************************************************************************************************/ #define INCREMENT_DES_GRAINES \ CENT_MILLE \ /* Pour incrementer les graines du generateur aleatoire apres chaque iteration, en */ \ /* particulier pour 'v $xiii/di_album$FON valeur_aleatoire_de_selection_du_point_a_etcher'. */ \ /* ATTENTION : avant le 20020603140135, 'INCREMENT_DES_GRAINES' valait 'I'. Mais a cause */ \ /* de la modification 'v $xiii/di_album$FON ADD2.graine_de_selection_des_points_a_etcher', */ \ /* il est essentiel que 'graine_de_selection_des_points_a_etcher' progresse (de +1 via */ \ /* 'index_valeur_aleatoire' dans '$xiii/di_album$FON') differemment que progresse */ \ /* 'graine_initiale_de_selection_des_points_a_etcher' (de 'INCREMENT_DES_GRAINES' ici) car */ \ /* sinon on retrouverait a chaque iteration quasiment toutes le valeurs aleatoires trouvees */ \ /* a l'iteration precedente decalees d'un "cran"... */ #define TITRE_graine_initiale_de_selection_des_points_a_etcher \ "graine=" \ /* Titre utile. */ #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 20051210183904. Les */ \ /* deux 'TRPU(...)' furent donc remplaces par 'un 'ADD2(...,UN)'... */ #define DECREMENTATION_DU_MARQUEUR_DES_POINTS_ETCHES(decrementer) \ Bblock \ Test(IL_FAUT(decrementer)) \ Bblock \ Test(IL_FAUT(Aetche__CoastLines_3D_____marquer_les_points_etches_arbitrairement)) \ Bblock \ DECR(Aetche__CoastLines_3D_____marqueur_des_points_etches \ ,decrement_du_marqueur_des_points_etches \ ); \ /* Gestion du marqueur des points etches lorsqu'il est utile... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Decrementation du marqueur des points etches. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M O D E L E T R I D I M E N S I O N N E L D E C O T E S A V E C " E T C H I N G " : */ /* */ /*************************************************************************************************************************************/ 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_imageF),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_postfixe),NOM_UNDEF_VIDE)); /* Nom d'un eventuel postfixe a placer derriere <nom_imageA><numero> (par exemple '$ROUGE'). */ DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); DEFV(Int,INIT(premiere_imageN,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); DEFV(Int,INIT(pas_des_imagesN,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES)); DEFV(Int,INIT(nombre_de_chiffresN,NOMBRE_DE_CHIFFRES)); /* Nombre de chiffres codant le numero des images de la serie... */ DEFV(Logical,INIT(editer_les_parametres_du_noyau,EDITER_LES_PARAMETRES_DU_NOYAU)); /* Faut-il editer les parametres du noyau et sortir immediatement ('VRAI') ou exploiter */ /* le modele d'etching de cotes tridimensionnel ('FAUX') ? */ 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(imposer_les_extrema_des_conditions_initiales,IMPOSER_LES_EXTREMA_DES_CONDITIONS_INITIALES)); DEFV(genere_Float,INIT(minimum_impose_pour_les_conditions_initiales,MINIMUM_IMPOSE_POUR_LES_CONDITIONS_INITIALES)); DEFV(genere_Float,INIT(maximum_impose_pour_les_conditions_initiales,MAXIMUM_IMPOSE_POUR_LES_CONDITIONS_INITIALES)); /* Faut-il imposer ('VRAI') ou pas ('FAUX') les extrema des conditions initiales, et si */ /* 'IL_FAUT(imposer_les_extrema_des_conditions_initiales)', valeurs implicites ? */ DEFV(Logical,INIT(editer_les_extrema_des_conditions_initiales,EDITER_LES_EXTREMA_DES_CONDITIONS_INITIALES)); /* Faut-il editer les extrema des des conditions initiales, ('VRAI') ou pas ('FAUX') ? */ DEFV(Positive,INIT(nombre_minimal_d_iterations,NOMBRE_MINIMAL_D_ITERATIONS)); /* Nombre minimal d'iterations utilise dans le cas ou c'est le temps ou le pas de temps */ /* qui est utilise pour stopper les iterations. */ DEFV(Positive,INIT(nombre_maximal_d_iterations,NOMBRE_MAXIMAL_D_ITERATIONS)); /* Nombre maximal d'iterations. */ DEFV(Float,INIT(seuil_du_pas_de_temps,SEUIL_DU_PAS_DE_TEMPS)); /* Seuil du pas de temps au-dela duquel on arrete d'iterer pour generer une image. Ce */ /* dispositif a ete introduit le 20020711162203 afin de tenter de visualiser le phenomene */ /* d'avalanche. Ainsi, on devrait regrouper dans une meme image tous les petits de temps */ /* et laisser plutot isoles les grands pas de temps. */ DEFV(Float,INIT(seuil_du_cumul_des_pas_de_temps,SEUIL_DU_CUMUL_DES_PAS_DE_TEMPS)); /* De meme pour le cumul des pas de temps reinitialise au debut de chaque nouvelle image. */ DEFV(Logical,INIT(arreter_d_iterer_s_il_n_y_a_pas_eu_de_points_etches,ARRETER_D_ITERER_S_IL_N_Y_A_PAS_EU_DE_POINTS_ETCHES)); /* Faut-il s'arreter ('VRAI') ou continuer d'iterer ('FAUX') lorsqu'a l'iteration courante */ /* aucun point n'a ete "etche" ? */ DEFV(Logical,INIT(decrementer_le_marqueur_des_points_etches_apres_l_etching ,DECREMENTER_LE_MARQUEUR_DES_POINTS_ETCHES_APRES_L_ETCHING ) ); /* Pour decrementer 'Aetche__CoastLines_3D_____marqueur_des_points_etches' apres chaque */ /* iteration ('VRAI') ou avant ('FAUX'). En decrementant avant, on garantit ainsi que le */ /* niveau de marquage de la mer est strictement superieur a celui de la cote. Ceci a ete */ /* introduit le 20040909133245... */ DEFV(Float,INIT(decrement_du_marqueur_des_points_etches,DECREMENT_DU_MARQUEUR_DES_POINTS_ETCHES)); /* Decrement de 'Aetche__CoastLines_3D_____marqueur_des_points_etches' avant ou apres */ /* chaque iteration... */ DEFV(Float,INIT(nombre_maximal_d_etchers,NOMBRE_MAXIMAL_D_ETCHERS)); /* Ombre maximal (et initial) d'"etcher"s. */ DEFV(Int,INIT(graine_initiale_de_selection_des_points_a_etcher,GRAINE_INITIALE_DE_SELECTION_DES_POINTS_A_ETCHER)); /* Pour choisir les points a "etcher". */ DEFV(Float,INIT(temperature_globale,TEMPERATURE_GLOBALE)); /* Temperature globale. */ DEFV(Logical,INIT(editer_quelques_nombres_utiles,EDITER_QUELQUES_NOMBRES_UTILES)); /* Faut-il editer le nombre d'"etchers" avant "etching" et le nombre de points "etches" */ /* apres "etching" ('VRAI') ou pas ('FAUX') ? */ DEFV(Logical,INIT(convertir_en_images_standards,CONVERTIR_EN_IMAGES_STANDARDS)); /* Faut-il convertir les images Resultats en images standards ('VRAI') ou les laisser */ /* sous forme d'images flottantes ('FAUX') ? */ DEFV(Logical,INIT(editer_l_eventuelle_graine_initiale_suivante,EDITER_L_EVENTUELLE_GRAINE_INITIALE_SUIVANTE)); /* Doit-on editer ('VRAI') ou pas ('FAUX') la graine a re-injecter dans le modele pour */ /* poursuivre de facon coherente la generation ? */ /*..............................................................................................................................*/ EGAL(Aetche__CoastLines_3D_____constante_de_Boltzmann,CONSTANTE_DE_BOLTZMANN_ETCHE______COTES_3D); GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("imageN=""N=",nom_imageN); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_C("imageF=""F=",nom_imageF); GET_ARGUMENT_C("postfixe=",nom_postfixe); GET_ARGUMENT_I("premiere=",premiere_image); GET_ARGUMENT_I("premiereN=",premiere_imageN); GET_ARGUMENT_I("pas=",pas_des_images); GET_ARGUMENT_I("pasN=",pas_des_imagesN); GET_ARGUMENT_I("chiffres=",nombre_de_chiffres); GET_ARGUMENT_I("chiffresN=",nombre_de_chiffresN); GET_ARGUMENT_L("periodiser_X=""periodX=",Aetche__CoastLines_3D_____periodiser_X); GET_ARGUMENT_L("periodiser_Y=""periodY=",Aetche__CoastLines_3D_____periodiser_Y); GET_ARGUMENT_L("periodiser_Z=""periodZ=",Aetche__CoastLines_3D_____periodiser_Z); GET_ARGUMENT_L("symetriser_X=""symetrX=",Aetche__CoastLines_3D_____symetriser_X); GET_ARGUMENT_L("symetriser_Y=""symetrY=",Aetche__CoastLines_3D_____symetriser_Y); GET_ARGUMENT_L("symetriser_Z=""symetrZ=",Aetche__CoastLines_3D_____symetriser_Z); GET_ARGUMENT_L("prolonger_X=""prolX=",Aetche__CoastLines_3D_____prolonger_X); GET_ARGUMENT_L("prolonger_Y=""prolY=",Aetche__CoastLines_3D_____prolonger_Y); GET_ARGUMENT_L("prolonger_Z=""prolZ=",Aetche__CoastLines_3D_____prolonger_Z); GET_ARGUMENT_F("niveau_hors_album=""niveau=",Aetche__CoastLines_3D_____niveau_hors_album); GET_ARGUMENT_L("imposer_extrema=""extrema=",imposer_les_extrema_des_conditions_initiales); GET_ARGUMENT_F("minimum=",minimum_impose_pour_les_conditions_initiales); GET_ARGUMENT_F("maximum=",maximum_impose_pour_les_conditions_initiales); GET_ARGUMENT_L("editer_extrema=",editer_les_extrema_des_conditions_initiales); GET_ARGUMENT_L("parallele=",Aetche__CoastLines_3D_____explorer_parallelement_la_cote); GET_ARGUMENT_I("nombre_maximal=""nmpe=",Aetche__CoastLines_3D_____nombre_maximal_de_points_a_etcher); GET_ARGUMENT_I("minimum_iterations=",nombre_minimal_d_iterations); GET_ARGUMENT_I("ni=""maximum_iterations=""iterations=",nombre_maximal_d_iterations); GET_ARGUMENT_F("seuil_dt=",seuil_du_pas_de_temps); GET_ARGUMENT_F("seuil_cdt=",seuil_du_cumul_des_pas_de_temps); GET_ARGUMENT_L("arreter=""arret=",arreter_d_iterer_s_il_n_y_a_pas_eu_de_points_etches); GET_ARGUMENT_L("noyau=",Aetche__CoastLines_3D_____utiliser_un_noyau); GET_ARGUMENT_I("demi_dimension=""dd=",Aetche__CoastLines_3D_____demi_dimension_effective_du_noyau); GET_ARGUMENT_L("editer_noyau=",editer_les_parametres_du_noyau); GET_ARGUMENT_L("lister_noyau=",lister_le_contenu_du_noyau); GET_ARGUMENT_F("sX__Y__Z=""sXYZ=",Aetche__CoastLines_3D_____ponderation_du_point_sX__Y__Z); GET_ARGUMENT_F("_X_sY__Z=""XsYZ=",Aetche__CoastLines_3D_____ponderation_du_point__X_sY__Z); GET_ARGUMENT_F("_X__Y_sZ=""XYsZ=",Aetche__CoastLines_3D_____ponderation_du_point__X__Y_sZ); GET_ARGUMENT_F("pX__Y__Z=""pXYZ=",Aetche__CoastLines_3D_____ponderation_du_point_pX__Y__Z); GET_ARGUMENT_F("_X_pY__Z=""XpYZ=",Aetche__CoastLines_3D_____ponderation_du_point__X_pY__Z); GET_ARGUMENT_F("_X__Y_pZ=""XYpZ=",Aetche__CoastLines_3D_____ponderation_du_point__X__Y_pZ); GET_ARGUMENT_I("dx=""dX=",Aetche__CoastLines_3D_____delta_X); GET_ARGUMENT_I("dy=""dY=",Aetche__CoastLines_3D_____delta_Y); GET_ARGUMENT_I("dz=""dZ=",Aetche__CoastLines_3D_____delta_Z); GET_ARGUMENT_L("marquer_taux=",Aetche__CoastLines_3D_____marquer_les_points_etches_avec_le_taux); GET_ARGUMENT_L("marquer_temps=""marquer_pas_de_temps=" ,Aetche__CoastLines_3D_____marquer_les_points_etches_avec_le_temps_simule ); GET_ARGUMENT_L("marquer_arbitraire=",Aetche__CoastLines_3D_____marquer_les_points_etches_arbitrairement); GET_ARGUMENT_F("points_etches=""mpe=",Aetche__CoastLines_3D_____marqueur_des_points_etches); GET_ARGUMENT_L("decrementer_apres=""dap=",decrementer_le_marqueur_des_points_etches_apres_l_etching); GET_ARGUMENT_N("decrementer_avant=""dav=",decrementer_le_marqueur_des_points_etches_apres_l_etching); GET_ARGUMENT_F("dmpe=""decrement_points_etches=",decrement_du_marqueur_des_points_etches); GET_ARGUMENT_I(TITRE_graine_initiale_de_selection_des_points_a_etcher ,graine_initiale_de_selection_des_points_a_etcher ); GET_ARGUMENT_L("editer_graine=",editer_l_eventuelle_graine_initiale_suivante); GET_ARGUMENT_F("etchers=""Metchers=",nombre_maximal_d_etchers); GET_ARGUMENT_F("Cetchers=",Aetche__CoastLines_3D_____nombre_courant_d_etchers); GET_ARGUMENT_F("concentration=""c=",Aetche__CoastLines_3D_____concentration_initiale_d_etchers); GET_ARGUMENT_F("frequence=""f=",Aetche__CoastLines_3D_____frequence_de_la_reaction); /* ATTENTION : ces deux parametres sont inutiles ('v $xiii/di_album$FON 20020604114847'). */ GET_ARGUMENT_F("energie_minimale=""em=",Aetche__CoastLines_3D_____energie_minimale); GET_ARGUMENT_F("energie_maximale=""eM=",Aetche__CoastLines_3D_____energie_maximale); GET_ARGUMENT_F("temperature=""t=",temperature_globale); GET_ARGUMENT_L("editer_nombres=",editer_quelques_nombres_utiles); GET_ARGUMENT_L("editer_coordonnees=" ,Aetche__CoastLines_3D_____editer_les_coordonnees_des_points_parmi_les_nombres_utiles ); GET_ARGUMENT_L("convertir=",convertir_en_images_standards); ) ); Test(IL_FAUT(editer_les_parametres_du_noyau)) Bblock CAL3(Prme6("Xmin=%d Xmax=%d Ymin=%d Ymax=%d Zmin=%d Zmax=%d\n" ,PINTE(Aetche__CoastLines_3D_____XYZmin),PINTE(Aetche__CoastLines_3D_____XYZmax) ,PINTE(Aetche__CoastLines_3D_____XYZmin),PINTE(Aetche__CoastLines_3D_____XYZmax) ,PINTE(Aetche__CoastLines_3D_____XYZmin),PINTE(Aetche__CoastLines_3D_____XYZmax) ) ); CAL3(Prme4("XminR=%d XmaxR=%d YminR=%d YmaxR=%d\n" ,PINTE(Aetche__CoastLines_3D_____XYZmin),PINTE(Aetche__CoastLines_3D_____XYZmax) ,PINTE(Aetche__CoastLines_3D_____XYZmin),PINTE(Aetche__CoastLines_3D_____XYZmax) ) ); CALS(Fsauts_de_lignes(UN)); CAL3(Prme4("XYmaxNe %d %d %d %d\n" ,PINTE(Aetche__CoastLines_3D_____XYZmin),PINTE(Aetche__CoastLines_3D_____XYZmax) ,PINTE(Aetche__CoastLines_3D_____XYZmin),PINTE(Aetche__CoastLines_3D_____XYZmax) ) ); /* 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_Aetche__CoastLines_3D', en */ /* se rappelant que l'on passe a 'DimNo_Aetche__CoastLines_3D' 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 20020909113038. */ /* */ /* Pour l'usage de 'PINTE(...)' voir 'v $xil/defi_K2$vv$DEF 20230311135805' qui a ete */ /* introduit pour ces impressions le 20230311144302... */ Eblock ATes Bblock BDEFV(albumF,Falbum_d_imagesA); BDEFV(albumF,Falbum_d_imagesR); BDEFV(album,album_d_imagesR); /* Definition des albums d'images Argument et Resultat... */ DEFV(Int,INIT(graine_courante_de_selection_des_points_a_etcher ,graine_initiale_de_selection_des_points_a_etcher ) ); /* Pour choisir les points a "etcher". */ Test(IFNE_chaine(nom_imageN,NOM_PIPE)) Bblock PUSH_DIMENSIONS_3D; SET_DIMENSIONS_3D_SANS_VALIDATION(Aetche__CoastLines_3D_____XYZmin,Aetche__CoastLines_3D_____XYZmax ,Aetche__CoastLines_3D_____XYZmin,Aetche__CoastLines_3D_____XYZmax ,Aetche__CoastLines_3D_____XYZmin,Aetche__CoastLines_3D_____XYZmax ); /* Le noyau va etre recupere comme une "petite" image dont les dimensions sont definies */ /* par {Aetche__CoastLines_3D_____XYZmin,Aetche__CoastLines_3D_____XYZmax} et ce */ /* independemment de 'Aetche__CoastLines_3D_____demi_dimension_effective_du_noyau'... */ CALi(dAloadF_album(PAetche__CoastLines_3D_____noyau ,nom_imageN,C_VIDE ,premiere_imageN,pas_des_imagesN,nombre_de_chiffresN ,FAUX ,UNDEF ,FAUX ) ); /* Chargement de l'album du noyau... */ /* */ /* ATTENTION : on notera que l'album 'nom_imageN' doit avoir comme taille la taille */ /* maximale du noyau correspondant a 'v $xiii/di_album$DEF DimNo_Aetche__CoastLines_3D', */ /* et non pas celle qui correspond a la taille effective de ce meme noyau */ /* 'v $xiii/di_album$FON Aetche__CoastLines_3D_____demi_dimension_effective_du_noyau'. */ /* */ /* ATTENTION : on notera de plus que l'on passe par 'PAetche__CoastLines_3D_____noyau' car, */ /* en effet, 'Aetche__CoastLines_3D_____noyau' n'est pas un vrai 'albumF' puisqu'il n'est */ /* pas cree par une allocation dynamique et variable... */ /* */ /* L'argument 'Inv' (='FAUX') a ete introduit le 20091125133404... */ Test(PAS_D_ERREUR(CODE_ERREUR)) Bblock EGAL(Aetche__CoastLines_3D_____initialiser_le_noyau,FAUX); /* Evidemment, l'initialisation est faite... */ Test(IL_FAUT(lister_le_contenu_du_noyau)) Bblock begin_albumQ(DoIn,Aetche__CoastLines_3D_____XYZmin_effectif,Aetche__CoastLines_3D_____XYZmax_effectif,PasZ ,DoIn,Aetche__CoastLines_3D_____XYZmin_effectif,Aetche__CoastLines_3D_____XYZmax_effectif,PasY ,DoIn,Aetche__CoastLines_3D_____XYZmin_effectif,Aetche__CoastLines_3D_____XYZmax_effectif,PasX ) Bblock CAL3(Prme7("noyau(%+0*d,%+0*d,%+0*d)=%+.^^^\n" ,NOMBRE_DE_CHIFFRES_NECESSAIRES(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Aetche__CoastLines_3D),X ,NOMBRE_DE_CHIFFRES_NECESSAIRES(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Aetche__CoastLines_3D),Y ,NOMBRE_DE_CHIFFRES_NECESSAIRES(DEMI_DIMENSION_MAXIMALE_DU_NOYAU_DANS_Aetche__CoastLines_3D),Z ,ACCES_NOYAU_DANS_Aetche__CoastLines_3D(X,Y,Z) ) ); /* Le 20060105154008, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123118, le format "^^g" est passe a "^^^" pour plus de souplesse... */ Eblock end_albumQ(EDoI,EDoI,EDoI) Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; INITIALISATION_EVENTUELLE_DU_NOYAU_DANS_Aetche__CoastLines_3D; /* Initialisation du noyau en cas d'erreur... */ Eblock ETes PULL_DIMENSIONS_3D; /* Restauration des dimensions de travail... */ Eblock ATes Bblock Eblock ETes CALi(dAFinitialisation(Falbum_d_imagesR,FZERO)); /* Initialisation de l'image Resultat flottante (dans tous les cas car elle est calculee */ /* meme si 'IL_FAUT(convertir_en_images_standards)'). */ Test(IL_FAUT(convertir_en_images_standards)) Bblock CALi(dAnoir(album_d_imagesR)); /* Initialisation de l'album Resultat... */ Eblock ATes Bblock Eblock ETes CALi(dAloadF_album(Falbum_d_imagesA ,nom_imageA ,nom_postfixe ,premiere_image ,pas_des_images ,nombre_de_chiffres ,FAUX ,UNDEF ,FAUX ) ); /* Chargement de l'album Argument... */ /* */ /* L'argument 'Inv' (='FAUX') a ete introduit le 20091125133404... */ Test(PAS_D_ERREUR(CODE_ERREUR)) Bblock DEFV(genere_Float,INIT(niveau_minimum_de_Falbum_d_imagesA,minimum_impose_pour_les_conditions_initiales)); DEFV(genere_Float,INIT(niveau_maximum_de_Falbum_d_imagesA,maximum_impose_pour_les_conditions_initiales)); /* Extrema du champ initial ('Falbum_d_imagesA'). */ DEFV(Logical,INIT(iterer_l_etching,VRAI)); DEFV(Int,INIT(compteur_des_iterations_d_etching,PREMIERE_ITERATION_D_UN_Repe)); /* Afin de simuler un 'Repe(...)' a nombre variable d'iterations... */ DEFV(Float,INIT(cumul_des_pas_de_temps,FZERO)); /* Afin de pouvoir eventuellement s'arreter lorsque le cumul des pas de temps depasse */ /* son seuil... */ Test(IL_NE_FAUT_PAS(imposer_les_extrema_des_conditions_initiales)) Bblock CALS(AFnivo_extrema(Falbum_d_imagesA ,ADRESSE(niveau_minimum_de_Falbum_d_imagesA) ,ADRESSE(niveau_maximum_de_Falbum_d_imagesA) ) ); /* Recherche des extrema de 'Falbum_d_imagesA'. */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(editer_les_extrema_des_conditions_initiales)) Bblock CAL3(Prme1("minimum des conditions initiales=%+.^^^\n",niveau_minimum_de_Falbum_d_imagesA)); CAL3(Prme1("maximum des conditions initiales=%+.^^^\n",niveau_maximum_de_Falbum_d_imagesA)); /* Edition des extrema de 'Falbum_d_imagesA'. */ /* */ /* Le 20060105154008, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123118, le format "^^g" est passe a "^^^" pour plus de souplesse... */ Eblock ATes Bblock Eblock ETes EGAL(Aetche__CoastLines_3D_____niveau_de_la___mer,niveau_maximum_de_Falbum_d_imagesA); EGAL(Aetche__CoastLines_3D_____niveau_de_la_terre,niveau_minimum_de_Falbum_d_imagesA); /* Mise a jour du modele... */ Test(IL_FAUT(Aetche__CoastLines_3D_____marquer_les_points_etches_arbitrairement)) Bblock Test(IFOU(SONT_DE_MEME_SIGNE(NEUT(Aetche__CoastLines_3D_____marqueur_des_points_etches) ,Aetche__CoastLines_3D_____niveau_de_la_terre ) ,SONT_DE_MEME_SIGNE(SOUS(Aetche__CoastLines_3D_____marqueur_des_points_etches ,MUL2(PRED(nombre_maximal_d_iterations) ,decrement_du_marqueur_des_points_etches ) ) ,Aetche__CoastLines_3D_____niveau_de_la_terre ) ) ) Bblock PRINT_ATTENTION("il va y avoir confusion entre le marqueur des points etches et le niveau de la terre"); CAL3(Prme1("niveau de la terre................=%+.^^^\n",Aetche__CoastLines_3D_____niveau_de_la_terre)); /* Le 20060105154008, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123118, le format "^^g" est passe a "^^^" pour plus de souplesse... */ CAL3(Prme1("nombre total d'iterations.........=%d\n" ,nombre_maximal_d_iterations ) ); CAL3(Prme1("marqueur initial des points etches=%+.^^^\n" ,NEUT(Aetche__CoastLines_3D_____marqueur_des_points_etches) ) ); /* Le 20060105154008, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123118, le format "^^g" est passe a "^^^" pour plus de souplesse... */ CAL3(Prme1("marqueur final des points etches..=%+.^^^\n" ,SOUS(Aetche__CoastLines_3D_____marqueur_des_points_etches ,MUL2(PRED(nombre_maximal_d_iterations) ,decrement_du_marqueur_des_points_etches ) ) ) ); /* Le 20060105154008, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123118, le format "^^g" est passe a "^^^" pour plus de souplesse... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Tant(IL_FAUT(iterer_l_etching)) Bblock Test(IZGT(Aetche__CoastLines_3D_____nombre_courant_d_etchers)) /* 'Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante' n'est */ /* pas teste par rapport a sa nullite afin d'arreter dans ce cas les iterations car, en */ /* effet, il s'agit d'un processus aleatoire et s'il reste des "etchers", rien ne prouve */ /* qu'a l'iteration suivante il n'y aura pas de points "etches" meme s'il n'y en a pas eu a */ /* l'iteration courante. Malgre la remarque precedente, le 20020524090327, l'indicateur */ /* 'arreter_d_iterer_s_il_n_y_a_pas_eu_de_points_etches' a ete introduit... */ Bblock Test(IL_FAUT(editer_quelques_nombres_utiles)) Bblock CAL3(Prme1("iteration %d :" ,compteur_des_iterations_d_etching ) ); Eblock ATes Bblock Eblock ETes #define decrementer_apres_l_etching \ decrementer_le_marqueur_des_points_etches_apres_l_etching \ /* Pour raccourcir certaines lignes qui suivent... */ DECREMENTATION_DU_MARQUEUR_DES_POINTS_ETCHES(NOTL(decrementer_apres_l_etching)); CALS(Aetche__CoastLines_3D(Falbum_d_imagesR ,Falbum_d_imagesA ,nombre_maximal_d_etchers ,graine_courante_de_selection_des_points_a_etcher ,temperature_globale ,editer_quelques_nombres_utiles ) ); /* Et calcul de la generation suivante... */ INCR(cumul_des_pas_de_temps,Aetche__CoastLines_3D_____pas_de_temps_simule); /* Cumul des pas de temps... */ INCR(graine_courante_de_selection_des_points_a_etcher,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, principalement */ /* pour 'v $xiii/di_album$FON valeur_aleatoire_de_selection_du_point_a_etcher'. */ CALS(AFmove(Falbum_d_imagesA,Falbum_d_imagesR)); /* Preparation de l'iteration suivante sans optimiser par rapport a la derniere ou cette */ /* operation est inutile. */ INCR(compteur_des_iterations_d_etching,I); /* Simulation du 'Repe(...)' d'"etching"... */ DECREMENTATION_DU_MARQUEUR_DES_POINTS_ETCHES(NEUL(decrementer_apres_l_etching)); #undef decrementer_apres_l_etching Test(I4OU(IFGT(compteur_des_iterations_d_etching,nombre_maximal_d_iterations) ,IFET(IFGT(Aetche__CoastLines_3D_____pas_de_temps_simule,seuil_du_pas_de_temps) ,IFGT(compteur_des_iterations_d_etching,nombre_minimal_d_iterations) ) ,IFET(IFGT(cumul_des_pas_de_temps,seuil_du_cumul_des_pas_de_temps) ,IFGT(compteur_des_iterations_d_etching,nombre_minimal_d_iterations) ) ,IFET(IL_FAUT(arreter_d_iterer_s_il_n_y_a_pas_eu_de_points_etches) ,IZEQ(Aetche__CoastLines_3D_____nombre_de_points_etches_lors_de_l_iteration_courante) ) ) ) /* Dans le cas ou c'est le temps ou le pas de temps qui sont utilises pour arreter le */ /* processus, j'ai ajoute le 20020712092756 la possibilite d'exiger d'avoir effectue au */ /* moins 'nombre_minimal_d_iterations' iterations... */ Bblock EGAL(iterer_l_etching,FAUX); /* On a fait le nombre d'iterations demandees ou bien il n'y a pas eu de nouveaux points */ /* "etches" ce qui peut provoquer un arret si cela est demande... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock EGAL(iterer_l_etching,FAUX); /* En fait, il est devenu impossible d'iterer... */ Eblock ETes Eblock ETan Test(IL_FAUT(convertir_en_images_standards)) Bblock CALS(Afloat_std(album_d_imagesR ,Falbum_d_imagesR ,niveau_minimum_de_Falbum_d_imagesA,niveau_maximum_de_Falbum_d_imagesA ) ); /* Renormalisation avec forcage des extrema en utilisant ceux de l'image initiale */ /* 'Falbum_d_imagesA'. */ CALi(dAupdate_album(nom_imageR ,nom_postfixe ,premiere_image ,pas_des_images ,album_d_imagesR ,nombre_de_chiffres ,FAUX ) ); /* Generation de l'album Resultat... */ /* */ /* L'argument 'Inv' (='FAUX') a ete introduit le 20100624090926... */ Eblock ATes Bblock CALi(dAupdateF_album(nom_imageR ,nom_postfixe ,premiere_image ,pas_des_images ,Falbum_d_imagesR ,nombre_de_chiffres ,FAUX ) ); /* Generation de l'album Resultat... */ /* */ /* L'argument 'Inv' (='FAUX') a ete introduit le 20100624090926... */ Eblock ETes Test(IFET(IFNE_chaine(nom_imageF,NOM_PIPE),IL_FAUT(convertir_en_images_standards))) Bblock CALi(dAupdateF_album(nom_imageF ,nom_postfixe ,premiere_image ,pas_des_images ,Falbum_d_imagesR ,nombre_de_chiffres ,FAUX ) ); /* Dans le cas ou la sortie est du type "image standard", la possibilite est offerte de */ /* generer les conditions Finales en mode "non standard" afin qu'elles puissent servir */ /* eventuellement de conditions initiales dans un autre calcul... */ /* */ /* L'argument 'Inv' (='FAUX') a ete introduit le 20100624090926... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(editer_l_eventuelle_graine_initiale_suivante)) Bblock CAL3(Prme2("%s%d\n" ,TITRE_graine_initiale_de_selection_des_points_a_etcher ,graine_courante_de_selection_des_points_a_etcher ) ); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes EDEFV(album,album_d_imagesR); EDEFV(albumF,Falbum_d_imagesR); EDEFV(albumF,Falbum_d_imagesA); /* Definition des albums d'images Argument et Resultat... */ Eblock ETes RETU_Commande; Eblock ECommande