/*************************************************************************************************************************************/ /* */ /* D I F F U S I O N B I D I M E N S I O N N E L L E : */ /* */ /* */ /* Author of '$xci/diffus_2D.21$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20070207142910). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ @define PRAGMA_CL_____MODULE_NON_OPTIMISABLE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE #include image_image_IMAGESF_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xci/sequence.01.I" #define MARQUER_LES_PARTICULES_LORS_DE_LA_DIFFUSION \ FAUX \ /* Doit-on marquer la diffusion ('VRAI') ou pas ('FAUX') ? Cela fut introduit le */ \ /* 20070308094727 afin de permettre le suivi quasi-individuel de chaque particule... */ #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 IMPOSER_LES_EXTREMA_DES_CONDITIONS_INITIALES \ FAUX \ /* Faut-il imposer ('VRAI') ou pas ('FAUX') les extrema des conditions initiales ? */ #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 CONSTANTE_DE_BOLTZMANN_ETCHE______COTES_2D \ 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') ? Ceci fut introduit le 20070208140326... */ #define NOMBRE_DE_CHIFFRES_A_EDITER \ NOMBRE_DE_CHIFFRES \ /* Nombre de chiffres a editer pour les numeros d'image (introduit le 20070208140326). */ #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=" /* Titres utiles. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I F F U S I O N B 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_imageRM),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageAM),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageS),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageSM),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageT),NOM_PIPE)); DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE)); /* Numero de la derniere image. */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES)); /* Nombre de chiffres codant le numero des images de la serie... */ DEFV(Int,INIT(numero_d_image,UNDEF)); /* Numero de l'image courante. */ DEFV(Logical,INIT(marquer_les_particules_lors_de_la_diffusion,MARQUER_LES_PARTICULES_LORS_DE_LA_DIFFUSION)); /* Doit-on marquer la diffusion ('VRAI') ou pas ('FAUX') ? Cela fut introduit le */ /* 20070308094727 afin de permettre le suivi quasi-individuel de chaque particule... */ DEFV(Logical,INIT(generer_les_conditions_initiales,GENERER_LES_CONDITIONS_INITIALES)); /* Doit-on generer les conditions initiales en tant que premiere image ('VRAI') ou bien */ /* le premier resultat du modele ('FAUX') ? */ DEFV(Logical,INIT(imposer_les_extrema_des_conditions_initiales,IMPOSER_LES_EXTREMA_DES_CONDITIONS_INITIALES)); /* Faut-il imposer ('VRAI') ou pas ('FAUX') les extrema des conditions initiales ? */ 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(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') ? Ceci fut introduit le 20070208140326... */ DEFV(Int,INIT(nombre_de_chiffres_a_editer,NOMBRE_DE_CHIFFRES_A_EDITER)); /* Nombre de chiffres a editer pour les numeros (introduit le 20070208140326). */ 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(Idiffusion_2D_a_temperatures_locales_____constante_de_Boltzmann,CONSTANTE_DE_BOLTZMANN_ETCHE______COTES_2D); GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA); GET_ARGUMENT_C("imageS=""S=",nom_imageS); GET_ARGUMENT_C("imageT=""T=",nom_imageT); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_C("imageAM=""AM=",nom_imageAM); GET_ARGUMENT_C("imageSM=""SM=",nom_imageSM); GET_ARGUMENT_C("imageRM=""RM=",nom_imageRM); GET_ARGUMENT_I("premiere=",premiere_image); GET_ARGUMENT_I("derniere=",derniere_image); GET_ARGUMENT_I("pas=",pas_des_images); GET_ARGUMENT_I("chiffres=",nombre_de_chiffres); GET_ARGUMENT_L("marquer_particules=""marquer_diffusion=""marquer=" ,marquer_les_particules_lors_de_la_diffusion ); GET_ARGUMENT_P("mm=""marqueur_mer=" ,Idiffusion_2D_a_temperatures_locales_____marqueur_des_cases_de_la___mer ); /* Parametres introduits le 20070308143719... */ GET_ARGUMENT_L("initiales=",generer_les_conditions_initiales); GET_ARGUMENT_L("periodiser_X=""periodX=",Idiffusion_2D_a_temperatures_locales_____periodiser_X); GET_ARGUMENT_L("periodiser_Y=""periodY=",Idiffusion_2D_a_temperatures_locales_____periodiser_Y); GET_ARGUMENT_L("symetriser_X=""symetrX=",Idiffusion_2D_a_temperatures_locales_____symetriser_X); GET_ARGUMENT_L("symetriser_Y=""symetrY=",Idiffusion_2D_a_temperatures_locales_____symetriser_Y); GET_ARGUMENT_L("prolonger_X=""prolX=",Idiffusion_2D_a_temperatures_locales_____prolonger_X); GET_ARGUMENT_L("prolonger_Y=""prolY=",Idiffusion_2D_a_temperatures_locales_____prolonger_Y); GET_ARGUMENT_P("niveau_hors_image=""niveau=",Idiffusion_2D_a_temperatures_locales_____niveau_hors_image); GET_ARGUMENT_I("npasX=""nX=""NpasX=""NX=" ,Idiffusion_2D_a_temperatures_locales_____nombre_de_pasX ); GET_ARGUMENT_I("npasY=""nY=""NpasY=""NY=" ,Idiffusion_2D_a_temperatures_locales_____nombre_de_pasY ); /* Parametres introduits le 20070313155117... */ GET_ARGUMENT_L("shuffler=",Idiffusion_2D_a_temperatures_locales_____shuffler_les_coordonnees); GET_ARGUMENT_I(TITRE_graine_initiale_de_shuffling_de_X ,Idiffusion_2D_a_temperatures_locales_____graine_de_shuffling_de_X ); GET_ARGUMENT_I(TITRE_graine_initiale_de_shuffling_de_Y ,Idiffusion_2D_a_temperatures_locales_____graine_de_shuffling_de_Y ); /* Parametres introduits le 20070210085909... */ GET_ARGUMENT_L("reinjecter_source=""reinjecter=" ,Idiffusion_2D_a_temperatures_locales_____reinjecter_la_Source_a_chaque_iteration ); /* Parametres introduits le 20070212120033... */ GET_ARGUMENT_L("imposer_extrema=""extrema=",imposer_les_extrema_des_conditions_initiales); GET_ARGUMENT_P("mer=",Idiffusion_2D_a_temperatures_locales_____niveau_de_la___mer); GET_ARGUMENT_P("mer_nouvelle=",Idiffusion_2D_a_temperatures_locales_____niveau_de_la___mer_nouvelle_nee); GET_ARGUMENT_P("terre_nouvelle=",Idiffusion_2D_a_temperatures_locales_____niveau_de_la_terre_nouvelle_nee); GET_ARGUMENT_P("terre=",Idiffusion_2D_a_temperatures_locales_____niveau_de_la_terre); GET_ARGUMENT_L("editer_extrema=",editer_les_extrema_des_conditions_initiales); 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); /* Parametres introduits le 20070208140326... */ GET_ARGUMENT_L("editer_graine=",editer_l_eventuelle_graine_initiale_suivante); GET_ARGUMENT_F("frequence=""f=",Idiffusion_2D_a_temperatures_locales_____frequence_de_la_diffusion); GET_ARGUMENT_F("energie_minimale=""em=",Idiffusion_2D_a_temperatures_locales_____energie_minimale); GET_ARGUMENT_F("energie_maximale=""eM=",Idiffusion_2D_a_temperatures_locales_____energie_maximale); GET_ARGUMENT_F("lambda=",Idiffusion_2D_a_temperatures_locales_____lambda); GET_ARGUMENT_F("temperature=""t=",temperature_globale); ) ); begin_nouveau_block Bblock 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(Inoir(ImageR)); /* Initialisation de l'image Resultat... */ LOAD_D_UNE_IMAGE_FLOTTANTE_DE_PARAMETRAGE(IFmageA1,nom_imageT,temperature_globale,"temperature globale"); Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA1,nom_imageA)))) /* Chargement de l'etat initial. */ Bblock Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA2,nom_imageS)))) /* Chargement de la definition de la source. */ Bblock CALS(Imove(ImageA3,ImageA1)); CALS(Imove(ImageA4,ImageA2)); /* Initialisation des images de marquage (meme si le marquage n'est pas demande et ce pour */ /* de simples raisons d'"hygiene"...) ; cela sera en particulier plus qu'utile ci-apres */ /* dans le cas ou il y aurait des erreurs avec 'Iload_image(...)'... */ CALi(Inoir(ImageR1)); /* Initialisation de l'image Resultat du marquage (meme si le marquage n'est pas demande */ /* et ce pour de simples raisons d'"hygiene"...). */ Test(IL_FAUT(marquer_les_particules_lors_de_la_diffusion)) /* Test introduit le 20070308094727... */ Bblock Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA3,nom_imageAM)))) /* Chargement de l'etat initial de marquage... */ Bblock Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA4,nom_imageSM)))) /* Chargement de la definition de la source de marquage... */ Bblock Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_NE_FAUT_PAS(imposer_les_extrema_des_conditions_initiales)) Bblock DEFV(pointF_2D,point_minimum); DEFV(genere_p,INIT(niveau_minimum_de_ImageA1,NIVEAU_UNDEF)); DEFV(pointF_2D,point_maximum); DEFV(genere_p,INIT(niveau_maximum_de_ImageA1,NIVEAU_UNDEF)); /* Extrema du champ initial ('ImageA1'). */ CALS(Inivo_extrema(ImageA1 ,ADRESSE(niveau_minimum_de_ImageA1),ADRESSE(point_minimum) ,ADRESSE(niveau_maximum_de_ImageA1),ADRESSE(point_maximum) ) ); /* Recherche des extrema de 'ImageA1'. */ EGAL(Idiffusion_2D_a_temperatures_locales_____niveau_de_la___mer,niveau_minimum_de_ImageA1); EGAL(Idiffusion_2D_a_temperatures_locales_____niveau_de_la_terre,niveau_maximum_de_ImageA1); /* Mise a jour du modele : le minimum et le maximum devenant respectivement les niveaux */ /* de la mer et de la terre... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(editer_les_extrema_des_conditions_initiales)) Bblock CAL3(Prme1("niveau de la mer..=%d\n",Idiffusion_2D_a_temperatures_locales_____niveau_de_la___mer)); CAL3(Prme1("niveau de la terre=%d\n",Idiffusion_2D_a_temperatures_locales_____niveau_de_la_terre)); /* Edition des extrema de 'ImageA1'. */ Eblock ATes Bblock Eblock ETes DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images) Bblock DEFV(CHAR,INIC(POINTERc(nom_imagesR),NOM_PIPE)); Test(IFET(IL_FAUT(generer_les_conditions_initiales),IFEQ(numero_d_image,premiere_image))) Bblock CALS(Imove(ImageR,ImageA1)); CALS(Imove(ImageR1,ImageA3)); 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 ) ); /* Edition introduite le 20070208140326... */ Eblock ATes Bblock Eblock ETes CALS(Idiffusion_2D_a_temperatures_locales(ImageR,ImageR1 ,ImageA1,ImageA3 ,ImageA2,ImageA4 ,IFmageA1 ,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, avec : */ /* */ /* temperature_locale = IFmageA1 */ /* */ Test(IZEQ(Idiffusion_2D_a_temperatures_locales_____nombre_de_points_diffuses)) /* Test introduit le 20070208135408... */ 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}, il est */ /* fondamental qu'a l'iteration suivante, il ne redonne pas la meme serie... */ Test(IL_FAUT(Idiffusion_2D_a_temperatures_locales_____shuffler_les_coordonnees)) /* Sequence introduite le 20070210085909... */ Bblock INCR(Idiffusion_2D_a_temperatures_locales_____graine_de_shuffling_de_X,INCREMENT_DES_GRAINES); INCR(Idiffusion_2D_a_temperatures_locales_____graine_de_shuffling_de_Y,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... */ Eblock ATes Bblock Eblock ETes CALS(Imove(ImageA1,ImageR)); CALS(Imove(ImageA3,ImageR1)); /* Preparation de l'iteration suivante... */ Eblock ERep Eblock ETes EGAL(nom_imagesR ,chain_Aconcaten2_sauf_nom_pipe(nom_imageR ,chain_numero(numero_d_image,nombre_de_chiffres) ) ); CALi(Iupdate_image(nom_imagesR,ImageR)); CALZ_FreCC(nom_imagesR); Test(IL_FAUT(marquer_les_particules_lors_de_la_diffusion)) /* Test introduit le 20070308094727... */ Bblock DEFV(CHAR,INIC(POINTERc(nom_imagesRM),NOM_PIPE)); EGAL(nom_imagesRM ,chain_Aconcaten2_sauf_nom_pipe(nom_imageRM ,chain_numero(numero_d_image,nombre_de_chiffres) ) ); CALi(Iupdate_image(nom_imagesRM,ImageR1)); CALZ_FreCC(nom_imagesRM); Eblock ATes Bblock Eblock ETes Eblock EDoI 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(Idiffusion_2D_a_temperatures_locales_____shuffler_les_coordonnees)) /* Sequence introduite le 20070210085909... */ Bblock CAL3(Prme2("%s%d\n" ,TITRE_graine_initiale_de_shuffling_de_X ,Idiffusion_2D_a_temperatures_locales_____graine_de_shuffling_de_X ) ); CAL3(Prme2("%s%d\n" ,TITRE_graine_initiale_de_shuffling_de_Y ,Idiffusion_2D_a_temperatures_locales_____graine_de_shuffling_de_Y ) ); 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 Eblock end_nouveau_block RETU_Commande; Eblock ECommande