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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.