/*************************************************************************************************************************************/ /* */ /* D I F F U S I O N T R I D I M E N S I O N N E L L E : */ /* */ /* */ /* Author of '$xci/diffus_3D.21$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20070213095631). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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" #define GENERER_LES_CONDITIONS_INITIALES \ VRAI \ /* Doit-on generer les conditions initiales en tant que premiere image ('VRAI') ou bien */ \ /* le premier resultat du modele ('FAUX') ? */ #define 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 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_DIFFUSER \ TROIS \ /* Pour choisir les points a diffuser. */ #define GRAINE_INITIALE_DE_SELECTION_DES_DIRECTIONS_DE_DIFFUSION \ SEPT \ /* Pour choisir les points a diffuser. */ #define EDITER_QUELQUES_NOMBRES_UTILES \ FAUX \ /* Faut-il editer le nombre des points de la mer, de la terre et ayant diffuses ('VRAI') */ \ /* ou pas ('FAUX') ? */ #define NOMBRE_DE_CHIFFRES_A_EDITER \ NOMBRE_DE_CHIFFRES \ /* Nombre de chiffres a editer pour les numeros d'image. */ #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 : */ /* */ /*************************************************************************************************************************************/ #include xci/Verhulst.01.I" #define INCREMENT_DES_GRAINES \ CENT_MILLE \ /* Pour incrementer les graines du generateur aleatoire apres chaque iteration. */ #define TITRE_graine_initiale_de_selection_des_points_a_diffuser \ "Pgraine=" #define TITRE_graine_initiale_de_selection_des_directions_de_diffusion \ "Dgraine=" #define TITRE_graine_initiale_de_shuffling_de_X \ "Xgraine=" #define TITRE_graine_initiale_de_shuffling_de_Y \ "Ygraine=" #define TITRE_graine_initiale_de_shuffling_de_Z \ "Zgraine=" /* Titres utiles. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I F F U S I O N T R I D I M E N S I O N N E L L E : */ /* */ /*************************************************************************************************************************************/ 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_imageS),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_imageR,PREMIERE_IMAGE)); DEFV(Int,INIT(premiere_imageA,PREMIERE_IMAGE)); DEFV(Int,INIT(premiere_imageS,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(pas_des_imagesR,PAS_DES_IMAGES)); DEFV(Int,INIT(pas_des_imagesA,PAS_DES_IMAGES)); DEFV(Int,INIT(pas_des_imagesS,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Int,INIT(nombre_de_chiffresR,NOMBRE_DE_CHIFFRES)); DEFV(Int,INIT(nombre_de_chiffresA,NOMBRE_DE_CHIFFRES)); DEFV(Int,INIT(nombre_de_chiffresS,NOMBRE_DE_CHIFFRES)); /* Nombre de chiffres codant le numero des images de la serie... */ DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE)); /* Numero de la derniere image. */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES)); /* Nombre de chiffres codant le numero des images de la serie... */ DEFV(Int,INIT(numero_d_image,UNDEF)); /* Numero de l'image courante. */ DEFV(Logical,INIT(generer_les_conditions_initiales,GENERER_LES_CONDITIONS_INITIALES)); /* Doit-on generer les conditions initiales en tant que premiere image ('VRAI') ou bien */ /* le premier resultat du modele ('FAUX') ? */ DEFV(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(Int,INIT(graine_initiale_de_selection_des_points_a_diffuser,GRAINE_INITIALE_DE_SELECTION_DES_POINTS_A_DIFFUSER)); /* Pour choisir les points a diffuser. */ DEFV(Int,INIT(graine_initiale_de_selection_des_directions_de_diffusion,GRAINE_INITIALE_DE_SELECTION_DES_DIRECTIONS_DE_DIFFUSION)); /* Pour choisir les points a diffuser. */ 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 des points de la mer, de la terre et ayant diffuses ('VRAI') */ /* ou pas ('FAUX') ? */ DEFV(Int,INIT(nombre_de_chiffres_a_editer,NOMBRE_DE_CHIFFRES_A_EDITER)); /* Nombre de chiffres a editer pour les numeros. */ 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(Adiffusion_3D_a_temperatures_locales_____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("imageS=""S=",nom_imageS); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_C("postfixe=",nom_postfixe); GET_ARGUMENT_I("premiereR=",premiere_imageR); GET_ARGUMENT_I("premiereA=",premiere_imageA); GET_ARGUMENT_I("premiereS=",premiere_imageS); GET_ARGUMENT_I("pasR=",pas_des_imagesR); GET_ARGUMENT_I("pasA=",pas_des_imagesA); GET_ARGUMENT_I("pasS=",pas_des_imagesS); GET_ARGUMENT_I("chiffresR=",nombre_de_chiffresR); GET_ARGUMENT_I("chiffresA=",nombre_de_chiffresA); GET_ARGUMENT_I("chiffresS=",nombre_de_chiffresS); GET_ARGUMENT_I("premiere=",premiere_image); GET_ARGUMENT_I("derniere=",derniere_image); GET_ARGUMENTS2_I("pas=",pas_des_images,pasZ); /* L'argument 'pasZ' fut introduit le 20110119140637... */ GET_ARGUMENT_I("chiffres=",nombre_de_chiffres); GET_ARGUMENT_L("initiales=",generer_les_conditions_initiales); GET_ARGUMENT_L("periodiser_X=""periodX=",Adiffusion_3D_a_temperatures_locales_____periodiser_X); GET_ARGUMENT_L("periodiser_Y=""periodY=",Adiffusion_3D_a_temperatures_locales_____periodiser_Y); GET_ARGUMENT_L("periodiser_Z=""periodZ=",Adiffusion_3D_a_temperatures_locales_____periodiser_Z); GET_ARGUMENT_L("symetriser_X=""symetrX=",Adiffusion_3D_a_temperatures_locales_____symetriser_X); GET_ARGUMENT_L("symetriser_Y=""symetrY=",Adiffusion_3D_a_temperatures_locales_____symetriser_Y); GET_ARGUMENT_L("symetriser_Z=""symetrZ=",Adiffusion_3D_a_temperatures_locales_____symetriser_Z); GET_ARGUMENT_L("prolonger_X=""prolX=",Adiffusion_3D_a_temperatures_locales_____prolonger_X); GET_ARGUMENT_L("prolonger_Y=""prolY=",Adiffusion_3D_a_temperatures_locales_____prolonger_Y); GET_ARGUMENT_L("prolonger_Z=""prolZ=",Adiffusion_3D_a_temperatures_locales_____prolonger_Z); GET_ARGUMENT_P("niveau_hors_album=""niveau=",Adiffusion_3D_a_temperatures_locales_____niveau_hors_album); GET_ARGUMENT_I("npasX=""nX=""NpasX=""NX=" ,Adiffusion_3D_a_temperatures_locales_____nombre_de_pasX ); GET_ARGUMENT_I("npasY=""nY=""NpasY=""NY=" ,Adiffusion_3D_a_temperatures_locales_____nombre_de_pasY ); GET_ARGUMENT_I("npasZ=""nZ=""NpasZ=""NZ=" ,Adiffusion_3D_a_temperatures_locales_____nombre_de_pasZ ); /* Parametres introduits le 20070313155127... */ GET_ARGUMENT_L("shuffler=",Adiffusion_3D_a_temperatures_locales_____shuffler_les_coordonnees); GET_ARGUMENT_I(TITRE_graine_initiale_de_shuffling_de_X ,Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_X ); GET_ARGUMENT_I(TITRE_graine_initiale_de_shuffling_de_Y ,Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_Y ); GET_ARGUMENT_I(TITRE_graine_initiale_de_shuffling_de_Z ,Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_Z ); GET_ARGUMENT_L("reinjecter_source=""reinjecter=" ,Adiffusion_3D_a_temperatures_locales_____reinjecter_la_Source_a_chaque_iteration ); GET_ARGUMENT_P("mer=",Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer); GET_ARGUMENT_P("mer_nouvelle=",Adiffusion_3D_a_temperatures_locales_____niveau_de_la___mer_nouvelle_nee); GET_ARGUMENT_P("terre_nouvelle=",Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre_nouvelle_nee); GET_ARGUMENT_P("terre=",Adiffusion_3D_a_temperatures_locales_____niveau_de_la_terre); GET_ARGUMENT_I("minimum_iterations=",nombre_minimal_d_iterations); GET_ARGUMENT_I("ni=""maximum_iterations=""iterations=",nombre_maximal_d_iterations); GET_ARGUMENT_I(TITRE_graine_initiale_de_selection_des_points_a_diffuser ,graine_initiale_de_selection_des_points_a_diffuser ); GET_ARGUMENT_I(TITRE_graine_initiale_de_selection_des_directions_de_diffusion ,graine_initiale_de_selection_des_directions_de_diffusion ); GET_ARGUMENT_L("editer_nombres=",editer_quelques_nombres_utiles); GET_ARGUMENT_I("nombre=""nc=",nombre_de_chiffres_a_editer); GET_ARGUMENT_L("editer_graine=",editer_l_eventuelle_graine_initiale_suivante); GET_ARGUMENT_F("frequence=""f=",Adiffusion_3D_a_temperatures_locales_____frequence_de_la_diffusion); GET_ARGUMENT_F("energie_minimale=""em=",Adiffusion_3D_a_temperatures_locales_____energie_minimale); GET_ARGUMENT_F("energie_maximale=""eM=",Adiffusion_3D_a_temperatures_locales_____energie_maximale); GET_ARGUMENT_F("lambda=",Adiffusion_3D_a_temperatures_locales_____lambda); GET_ARGUMENT_F("temperature=""t=",temperature_globale); ) ); begin_nouveau_block Bblock BDEFV(album,album_d_imagesA); BDEFV(album,album_d_imagesS); BDEFV(album,album_d_imagesR); /* Definition des albums d'images Argument et Resultat... */ DEFV(Int,INIT(graine_courante_de_selection_des_points_a_diffuser ,graine_initiale_de_selection_des_points_a_diffuser ) ); DEFV(Int,INIT(graine_courante_de_selection_des_directions_de_diffusion ,graine_initiale_de_selection_des_directions_de_diffusion ) ); /* Pour choisir les points a diffuser. */ CALi(dAnoir(album_d_imagesR)); /* Initialisation de l'image Resultat standard si elle est utile... */ CALi(dAload_album(album_d_imagesA ,nom_imageA ,nom_postfixe ,premiere_imageA ,pas_des_imagesA ,nombre_de_chiffresA ,FAUX ,UNDEF ,FAUX ) ); /* Chargement de l'etat initial. */ /* */ /* L'argument 'Inv' (='FAUX') a ete introduit le 20091125134209... */ Test(PAS_D_ERREUR(CODE_ERREUR)) Bblock CALi(dAload_album(album_d_imagesS ,nom_imageS ,nom_postfixe ,premiere_imageS ,pas_des_imagesS ,nombre_de_chiffresS ,FAUX ,UNDEF ,FAUX ) ); /* Chargement de la definition de la source. */ /* */ /* L'argument 'Inv' (='FAUX') a ete introduit le 20091125134209... */ Test(PAS_D_ERREUR(CODE_ERREUR)) Bblock DEFV(CHAR,INIC(POINTERc(nom_imagesR),NOM_PIPE)); DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images) Bblock Test(IFET(IL_FAUT(generer_les_conditions_initiales),IFEQ(numero_d_image,premiere_image))) Bblock CALS(Amove(album_d_imagesR,album_d_imagesA)); Eblock ATes Bblock Repe(nombre_maximal_d_iterations) Bblock Test(IL_FAUT(editer_quelques_nombres_utiles)) Bblock CAL3(Prme3("iteration %d de l'image %0*d :" ,compteur_des_repetitions_du_Repe ,nombre_de_chiffres_a_editer ,numero_d_image ) ); Eblock ATes Bblock Eblock ETes CALS(Adiffusion_3D(album_d_imagesR ,album_d_imagesA ,album_d_imagesS ,temperature_globale ,graine_initiale_de_selection_des_points_a_diffuser ,graine_initiale_de_selection_des_directions_de_diffusion ,editer_quelques_nombres_utiles ) ); /* Et calcul de la generation suivante. */ Test(IZEQ(Adiffusion_3D_a_temperatures_locales_____nombre_de_points_diffuses)) Bblock PRINT_ERREUR("il n'y a pas eu de points diffuses"); /* Message redondant avec 'v $xiii/di_image$FON PRINT_ERREUR..il.n.y.a.pas.eu.de.points.d'. */ CAL1(Prer1("(nous en sommes a l'image numero %d)\n",numero_d_image)); Eblock ATes Bblock Eblock ETes INCR(graine_courante_de_selection_des_points_a_diffuser,INCREMENT_DES_GRAINES); INCR(graine_courante_de_selection_des_directions_de_diffusion,INCREMENT_DES_GRAINES); /* Progression des graines du generateur aleatoire puisqu'etant fonction de {X,Y,Z}, il est */ /* fondamental qu'a l'iteration suivante, il ne redonne pas la meme serie... */ Test(IL_FAUT(Adiffusion_3D_a_temperatures_locales_____shuffler_les_coordonnees)) Bblock INCR(Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_X,INCREMENT_DES_GRAINES); INCR(Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_Y,INCREMENT_DES_GRAINES); INCR(Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_Z,INCREMENT_DES_GRAINES); /* Progression des graines du generateur aleatoire puisqu'etant fonction de {X,Y,Z}, il est */ /* fondamental qu'a l'iteration suivante, il ne redonne pas la meme serie... */ Eblock ATes Bblock Eblock ETes CALS(Amove(album_d_imagesA,album_d_imagesR)); /* Preparation de l'iteration suivante... */ Eblock ERep Eblock ETes Eblock EDoI EGAL(nom_imagesR ,chain_Aconcaten2_sauf_nom_pipe(nom_imageR ,chain_numero(numero_d_image,nombre_de_chiffres) ) ); CALi(dAupdate_album(nom_imageR ,nom_postfixe ,premiere_imageR ,pas_des_imagesR ,album_d_imagesR ,nombre_de_chiffres ,FAUX ) ); /* L'argument 'Inv' (='FAUX') a ete introduit le 20100624091456... */ CALZ_FreCC(nom_imagesR); Test(IL_FAUT(editer_l_eventuelle_graine_initiale_suivante)) Bblock CAL3(Prme2("%s%d\n" ,TITRE_graine_initiale_de_selection_des_points_a_diffuser ,graine_courante_de_selection_des_points_a_diffuser ) ); CAL3(Prme2("%s%d\n" ,TITRE_graine_initiale_de_selection_des_directions_de_diffusion ,graine_courante_de_selection_des_directions_de_diffusion ) ); Test(IL_FAUT(Adiffusion_3D_a_temperatures_locales_____shuffler_les_coordonnees)) Bblock CAL3(Prme2("%s%d\n" ,TITRE_graine_initiale_de_shuffling_de_X ,Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_X ) ); CAL3(Prme2("%s%d\n" ,TITRE_graine_initiale_de_shuffling_de_Y ,Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_Y ) ); CAL3(Prme2("%s%d\n" ,TITRE_graine_initiale_de_shuffling_de_Z ,Adiffusion_3D_a_temperatures_locales_____graine_de_shuffling_de_Z ) ); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes EDEFV(album,album_d_imagesR); EDEFV(album,album_d_imagesS); EDEFV(album,album_d_imagesA); /* Definition des albums d'images Argument et Resultat... */ Eblock end_nouveau_block RETU_Commande; Eblock ECommande