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