RAPPORT
DE STAGE EFFECTUE AU CNRM/GMAP TOULOUSE
CANARI utilisant le cycle 25 et ODB sur la machine IBM
RS/6000
Elaboration de scripts pour l’utilisation des IDFI dans
ALADIN
Service Prévision Numérique
Direction de la Météorologie Nationale (CASABLANCA/MAROC)
Superviseurs :
Claude FISCHER
Elisabeth GERARD
Le travail que j’ai effectué le long de mon séjour
à Toulouse du 22 Décembre 2002 au 22 Février 2003 a comporté deux grandes
parties. La première concernait le portage du code ODB du cycle 25 et la
réussite du tournage de l’analyse de surface CANARI sur la machine IBM/RS6000
utilisant ODB comme système de gestion des observations. La seconde étape était
consacrée à la participation dans l’élaboration des scripts pour l’utilisation
des initialisations par les filtres digitaux DFI. J’ai travaillé en parallèle
sur la mise à jour des programmes du prétraitement installés à CASABLANCA et
aussi à la création de fichiers climatologiques et aux tests pour la nouvelle
configuration du modèle ALBACHIR Nord Afrique.
1. Portage du code ODB du cycle 25
Les applications suivantes
ont été testées par Radi et sont opérationnelles maintenant à CASABLANCA :
BATODB
MANDAODB
SHUFFLE (pour tout type de
transformation)
LAMFLAG
SCREENING
MINIMISATION
CANARI (pour l’analyse de
surface et d’altitude)
Je n’ai pas fais de test scientifique pour
comparer les résultats de l’analyse CANARI du cycle cy25t1 et ceux de
l’opérationnel. L’objectif du stage était juste le portage du code et le temps
ne permet pas de faire de telles expériences.
2. Scripts d’assimilation 3DVAR, Blending et BlendVar.
Durant la deuxième partie de
mon stage j’ai travaillé en collaboration avec Pascale Riber et Claude
Fischer sur l’outil de génération de scripts pour des expériences
d’assimilation 3DVAR, du Blending ou du BlendVar dans ALADIN. Nous avons
apporté des modifications aux scripts originaux pour tenir compte
principalement du cas d’un blendvar et aussi de l’application des filtres
digitaux lors de la production. L’initialisation se faisait par un filtrage
digitale simple appliqué à l’analyse. Les expériences ont montrées que ce type
d’initialisation est un peu fort et a pour conséquence la destruction des
incréments d’analyse. Pour remédier à cet inconvénient on a appliqué un nouveau
mode d’initialisation en ajoutant des incréments filtrés à l’analyse. Cette
initialisation se fait en deux étapes :
La première étape consiste à
calculer un biais en partant d’une prévision 6 heures (un guess) en mettant la
clé LBIAS=.TRUE. dans la namelist NAMINI. Ceci permet de récupérer dans le
fichier ICMSH${CNMEXP}BIAS le biais
G – F(G). F étant le filtre
digitale choisi et G désigne le guess.
La deuxième étape consiste à
ajouter ce biais à l’analyse filtrée. Ce qui revient à calculer F(A) + G – F(G)
en mettant la clé LINCR=.TRUE. dans la namelist NAMINI. A étant l’analyse.
Les scripts ont été testés en
lançant plusieurs expériences. Dans chaque expérience on a choisi de faire soit
une analyse 3DVAR, soit un blending ou un blendvar accompagné d’une prévision
24 heures. Pour les expériences classiques permettant de faire un cycle
d’assimilation 3DVAR ou un blending, nous n’avons pas eu de surprise. Les
cycles tournent normalement. Pour le cycle blendvar on a apporté des
modifications aux scripts pour tenir compte de l’alternance entre le blending
normale et l’assimilation de données. La version finale de ces scripts se
trouve sous kami à l’emplacement suivant : ~mrpe729/cy25/analyse/src
On a ajouté un script qui
permet de réaliser une initialisation à base de filtres digitaux comme expliqué
ci-dessus. Le script s’appelle aldincr et se trouve au même emplacement
que les autres scripts. J’ai lancé un cycle d’assimilation de 24 heures en
utilisant ce mode d’initialisation pour tester si le script et son insertion
dans le package est informatiquement correcte. Pour le réglage du filtre
(fenêtre et fréquence de coupure) il faut lancer un cycle d’assimilation de 15
jours avec une prévision de 48 heures. Le temps de mon stage ne m’a pas permis
d’aller jusqu’au là. Je me suis contenté de faire les tests informatiques.
Fichiers clim. et coupleurs
pour ALBACHIR Nord Afrique
Durant mon séjour à Toulouse
j’ai été sollicité par Radi pour créer et tester des fichiers
climatologiques ainsi que des coupleurs pour le modèle ALBACHIR Nord Afrique et
aussi pour le modèle ALBACHIR qui couvre le territoire marocain. Les
caractéristiques du domaine ALBACHIR Nord Afrique sur lequel la DMN a commencé
dès le 18/02/2003 à tourner une chaîne en double sont les suivantes :
Latitude Nord : 45.192449202570210
Latitude Sud : -3.678988513812508
Longitude Est : 62.641606799769940
Longitude Ouest : 322.828781350508600
La grille correspondante a
les caractéristiques suivantes (la zone d’extension comprise) :
Nombre de points sur l’axe
zonale : 240
Nombre de points sur l’axe
méridional : 160
Nombre de niveaux
verticaux : 41
Soit une résolution de
42225.19405092247 m.
J’ai préparé les fichiers
climatologiques du domaine ALBACHIR Nord Afrique et les namelists pour produire
des fichiers de couplage sous le cycle cy25t1 à partir d’ARPEGE. Ces fichiers
se trouvent sous delage à l’emplacement suivant :
/cnrm2_a/mrpe/mrpe729/e923/albach_na_new
Les scripts et les namelists
se trouvent sous kami : ~mrpe729/cy25/e923 et ~mrpe729/cy25/e927
La création de ce nouveau
domaine va nous permettre de tourner un modèle sur l’ancien domaine d’ALBACHIR
mais avec une résolution plus fine. Nous avons commencé par tester ALBACHIR 9
km qui s’est avéré gourmand en temps de calcule (d’après Radi). J’ai
préparé des fichiers climatologiques sur le même domaine mais à une résolution
de 11 km et de 13 km pour les ramener à CASABLANCA afin de faire les tests
préliminaires en couplant le modèle ALBACHIR avec ALBACHIR Nord Afrique. Ces
tests pourront nous amener à choisir la résolution adéquate du modèle ALBACHIR.
Les fichiers préparés se trouvent sous delage aux emplacements suivants :
/cnrm2_a/mrpe/mrpe729/e923/albach_11km_new
/cnrm2_a/mrpe/mrpe729/e923/albach_13km_new
Les scripts et les namelists
utilisés se trouvent sous kami ~mrpe729/cy25/e923
J’ai fais des tests en créant
des fichiers coupleurs pour la résolution 11 km et 13 km en partant des
fichiers d’ALBACHIR Nord Afrique (configuration ee927)
BDM et prétraitement
Durant ces deux mois j’ai
travaillé avec Gilles Geley, Dominique Paulais et Philippe Caille sur la mise à
jour des programmes du prétraitement que nous avons à CASABLANCA. Les sources
installés datent, pour la plupart d’entre eux, de 1997 ou 1998 et ne tiennent
pas compte des dernières modifications faites à Météo France surtout pour le
décodage des SHIP, des SYNOP et des SYNOR. J’ai pris la dernière version de ces
codes pour mettre à jour nos programmes tout en gardant les modifications qui
ont été faites à CASABLANCA surtout pour l’introduction de certains paramètres
dans les tables pour des besoins locaux.
Annexe 1 : Modifications du code
odb25t1
Dans les fichiers qui suivent
on a ajouté #include "RS6K.h" pour remédier aux problèmes des
externals. Le contenu le l’include RS6K.h est donné en annexe 2.
obd/aux/binio.c
obd/aux/kmg.c
obd/aux/pseudo_main.c
obd/include/cmaio.h
obd/include/codb.h
obd/include/hdr.h
obd/include/odb.h
obd/include/pcma_extern.h
obd/include/svipc.h
Le
compilateur C de la machine IBM confond la variable n et le retour à la ligne
\n et aussi la variable s et le format d’écriture d’une chaîne de caractères
%s. Nous avons modifié les programmes suivants pour remédier à ce problème.
obd/compiler/genc.c
#ifdef
RS6K
#define
NL(i) { int l; for(l=0; l<(i); l++)
fputc('\n',cfp); }
#define
TAB(i) { int l; for(l=0; l<(i); l++) fputs(" ",cfp); }
#define
LB(i) { TAB(1);
fputs("{\"",cfp); TAB(i); }
#define
RB(i) { int l, lmax=(i); for(l=1;
l<=lmax; l++) { \
#endif
obd/compiler/lex.l
#ifdef
RS6K
#define
SRC(r) { if (fpsrc) { fprintf(fpsrc,"%s%s ",r,yytext); } }
#endif
obd/compiler/odb98.c
#ifdef
RS6K
#define
SYSTEM_NAME "(RS6000/SP/IBM)"
obd/include/codb.h
#ifdef
RS6K
#define
GEN_GET codb_dget
#define
GEN_PUT codb_dput
#endif
obd/include/timerdefs.h
&(tbytes / (max(1E-20,timediff(t1,t2))
* 1048576D0 ))
&max(1E-20,timediff(t1,t2)) ) * 100D0
Dans errtrap.c on a utilisé le xl__trbk au lieu de errtra pour faire un
traceback dans le cas d’une erreur.
obd/lib/errtrap.c
#ifdef RS6K
xl__trbk();
sleep(5);
#endif
Annexe 2 : RS6K.h
#ifdef RS6K
/*odb.h*/
#define
codb_trace_ codb_trace
#define
codb_trace_end_ codb_trace_end
#define
codb_abort_func_ codb_abort_func
#define
codb_register_abort_func_ codb_register_abort_func
#define
codb_init_ codb_init
#define
codb_trace_init_ codb_trace_init
#define
codb_set_signals_ codb_set_signals
#define odb_inlist_ odb_inlist
#define
odb_notinlist_ odb_notinlist
#define
odb_debug_print_ odb_debug_print
#define
cma_readb_ cma_readb
#define
codb_twindow_ codb_twindow
#define
codb_tdiff_ codb_tdiff
#define
codb_trace_ codb_trace
#define
codb_filesize_ codb_filesize
#define
codb_datetime_ codb_datetime
#define
codb_abort_func_ codb_abort_func
#define
cdummy_load_ cdummy_load
#define
codb_write_metadata_ codb_write_metadata
#define
codb_twindow_ codb_twindow
#define
codb_tdiff_ codb_tdiff
#define
codb_getnames_ codb_getnames
#define
codb_getprecision_ codb_getprecision
#define
codb_setval_ codb_setval
#define
codb_getval_ codb_getval
#define
codb_hash_init_ codb_hash_init
#define
codb_vechash_ codb_vechash
#define codb_ui_unique_ codb_ui_unique
#define codb_d_unique_ codb_d_unique
#define codb_r_unique_ codb_r_unique
#define
codb_tablesize_ codb_tablesize
#define
codb_write_metadata2_ codb_write_metadata2
#define
codb_write_metadata3_ codb_write_metadata3
#define
codb_close_ codb_close
#define
codb_store_ codb_store
#define
codb_load_ codb_load
#define
codb_makeview_ codb_makeview
#define
codb_linkview_ codb_linkview
#define
codb_save_peinfo_ codb_save_peinfo
#define
codb_mp_select_ codb_mp_select
#define
codb_select_ codb_select
#define
codb_cancel_ codb_cancel
#define
codb_swapout_ codb_swapout
#define
codb_getsize_ codb_getsize
#define
codb_get_view_info_ codb_get_view_info
#define
codb_restore_peinfo_ codb_restore_peinfo
#define
codb_iget_ codb_iget
#define
codb_get_rowvec_ codb_get_rowvec
#define
codb_sortkeys_ codb_sortkeys
#define
codb_put_control_word_ codb_put_control_word
#define
codb_get_npes_ codb_get_npes
#define
codb_get_poolnos_ codb_get_poolnos
#define
codb_mask_control_word_ codb_mask_control_word
#define
codb_get_control_word_ codb_get_control_word
#define
codb_iput_ codb_iput
#define
codb_dget_ codb_dget
#define
codb_rget_ codb_rget
#define
codb_rput_ codb_rput
#define
codb_static_init_ codb_static_init
#define
codb_linkdb_ codb_linkdb
#define
codb_read_metadata_ codb_read_metadata
#define
codb_datetime_ codb_datetime
#define
codb_analysis_datetime_ codb_analysis_datetime
#define
codb_create_pool_ codb_create_pool
#define
codb_read_metadata2_ codb_read_metadata2
#define
codb_openprt_ codb_openprt
#define
codb_d2u_ codb_d2u
#define
codb_lineprt_ codb_lineprt
#define
codb_sqlprint_ codb_sqlprint
#define
codb_closeprt_ codb_closeprt
#define
codb_packer_ codb_packer
#define
codb_gethandle_ codb_gethandle
#define
codb_pc_filter_ codb_pc_filter
#define
codb_print_vars_ codb_print_vars
#define
codb_getindex_ codb_getindex
#define
codb_putindex_ codb_putindex
#define
get_thread_id_ get_thread_id
#define
get_max_threads_ get_max_threads
#define cmdb_reg_ cmdb_reg
#define
cmdb_vecreg_ cmdb_vecreg
#define cmdb_debug_ cmdb_debug
#define
cmdb_set_ cmdb_set
#define
cmdb_reset_ cmdb_reset
#define
cmdb_name_ cmdb_name
#define
cmdb_get_ cmdb_get
/*cmaio.h*/
#define cma_open_ cma_open
#define
cma_attach_ cma_attach
#define
cma_detach_ cma_detach
#define
cma_read_ cma_read
#define
cma_write_ cma_write
#define cma_info_ cma_info
#define
cma_close_ cma_close
#define cma_debug_ cma_debug
#define cma_stat_ cma_stat
#define
cma_get_report_ cma_get_report
#define
cma_get_ddrs_ cma_get_ddrs
#define
cma_wrapup_ cma_wrapup
#define
cma_prt_stat_ cma_prt_stat
#define
cma_rewind_ cma_rewind
#define
cma_readi_ cma_readi
#define
cma_readb_ cma_readb
#define
cma_writei_ cma_writei
#define
cma_writeb_ cma_writeb
#define cma_bin_info_ cma_bin_info
#define cma_bin_file_ cma_bin_file
#define
cma_is_packed_ cma_is_packed
#define
cma_on_mrfs_ cma_on_mrfs
#define
cma_get_concat_ cma_get_conca
#define
cma_get_concat_byname_ cma_get_concat_byname
#define
cma_flpcheck_ cma_flpcheck
#define cma_flperr_ cma_flperr
/*pcma_extern.h*/
#define upcma_info_ upcma_info
#define pcma2cma_ pcma2cma
/*svipc.h*/
#define
svipc_open_ svipc_open
#define
svipc_close_ svipc_close
#define
svipc_write_ svipc_write
#define
svipc_read_ svipc_read
#define
svipc_inquire_ svipc_inquire
#define
svipc_setvar_ svipc_setvar
#define
svipc_debug_ svipc_debug
/*odb.h*/
#define
ctxprint_ ctxprint
#define
ctxreg_ ctxreg
#define
ctxdebug_ ctxdebug
#define
ctxid_ ctxid
/*odb.h*/
#define
write_ddl_ write_ddl
/*odb.h*/
#define
iolockdb_ iolockdb
/*odb.h*/
#define
cmpl_abort_ cmpl_abort
/*odb.h*/
#define
util_walltime_ util_walltime
#define
util_cputime_ util_cputime
#define
util_ihpstat_ util_ihpstat
#define ctransfer_ ctransfer
#define kmg_ kmg
#define
pseudo_main_ pseudo_main
#define
binary_open_ binary_open
#define
binary_flush_ binary_flush
#define
binary_close_ binary_close
#define
binary_put_ binary_put
#define
binary_get_ binary_get
#endif