• Aucun résultat trouvé

Avec un adjoint et une assimilation variationnelle

8.4 Algorithme de la VRF dans OOPS

8.4.2 Avec un adjoint et une assimilation variationnelle

Les diérentes étapes pour le calcul en utilisant une assimilation variationnelle et le modèle adjoint sont décrites ci-dessous,

1. Création de l'état de référence (décrit précédemment),

2. Création des observations à partir de l'état de référence (décrit précédemment), 3. Création de l'état initial,

8.4. ALGORITHME DE LA VRF DANS OOPS 123 4. Analyse variationnelle en utilisant l'algorithme Lanczos pour obtenir une estimation de A,

5. Calcul de la trajectoire jusqu'à Tverif, du gradient de la fonction score à Tverif ∇xfS et du gradient

de la fonction score à Tobs via l'adjoint ∇xaS,

6. Estimation de la variance d'erreur d'analyse,

7. Calcul du champ de sensibilité V RF à partir de s = A∇xaS.

Le script déroulant les diérents binaires pour réaliser la simulation est de la forme, # Création de l'état de référence

qg_forecast.x truth.xml > truth.fc.out

# Génération des observations 4D à partir de l'état de référence qg_makeobs.x makeobs4d.xml > qg.makeobs4d.out

# Création de la condition initiale qg_forecast.x state.xml > state.fc.out # Assimilation de données

qg_4dvar.x 4dvar.xml > qg.4dvar.out # Calcul de la VRF

qg_VRF.x VRF_adjoint.xml > VRF.out

La description de la conguration de chaque état est réalisée ci-dessous. Création de l'état initial

Le chier invent_state.f90 qui est utilisé pour générer l'état initial est construit de manière à produire toujours le même état de référence, sauf si le paramètre perturb est diérent de 0. La condition initiale n'est donc pas directement reprise à partir du chier truth mais construite de la même manière que l'état de référence. <initial> <date>2014-01-19T00:00:00Z</date> <read_from_file>0</read_from_file> <top_layer_depth> 6000.0</top_layer_depth> <bottom_layer_depth>4000.0</bottom_layer_depth> <perturb>20</perturb> </initial>

L'assimilation 4D-Var et la VRF eectuent eux-mêmes l'intégration temporelle dont ils ont besoin. Comme pour l'état de référence, les balises forecast et output sont renseignées pour disposer des fonctions d'écriture des chiers de sortie.

<forecast> <begin>2014-01-19T00:00:00Z</begin> <end>2014-01-19T01:00:00Z</end> </forecast> <output> <frequency>PT1H</frequency> <datadir>Data</datadir> <exp>state</exp>

<date>2014-01-19T03:00:00Z</date> <type>fc</type>

</output>

Le chier de sortie produit est Data/state.fc.2014-01-19T00:00:00Z.PT0S, le second chier est encore inutile. La commande exécutée dans le script est :

qg_forecast.x state.xml > state.fc.out Assimilation variationnelle

Pour eectuer l'assimilation, l'état initial créé précédemment est déni comme l'ébauche (background) et le chier d'observation commun est spécié en ObsFileIn.

<background> <states> <state> <filename>Data/state.fc.2014-01-19T00:00:00Z.PT0S</filename> <date>2014-01-19T03:00:00Z</date> </state> </states> </background> <Observations> <Observation> <ObsType>Wind</ObsType> <ObsOperator>OnTheFly</ObsOperator> <ObsData> <ObsHandler>ObsHelpQG</ObsHandler> <ObsFileIn>Data/qg.truth4d.obt</ObsFileIn> <ObsFileOut>Data/qg.4dvar.obt</ObsFileOut> <obsvalue>ObsVal</obsvalue> <obserror>ObsErr</obserror> </ObsData> <Covariance>diagonal</Covariance> </Observation> <Observations>

Les congurations relatives à la variable de contrôle, à la fonction coût et au 4D-Var ne sont décrites ici. Le seul élément spécique pour le calcul de la VRF est le choix du minimiseur qui doit être l'algorithme de Lanczos :

<minimizer>

<algorithm>DPLanczos</algorithm> </minimizer>

C'est un élément important pour le calcul de la VRF, Cependant, il est encore absent dans la version du code OOPS que nous utilisons ici. L'algorithme du Lanczos doit permettre de construire une estimation de la matrice de covariance A à partir des termes alpha_ et beta_ du code calculés lors de la minimisation, mais l'export de ces valeurs n'est pas codé. Il s'agit d'une évolution à réaliser pour que l'implémentation déterministe de la VRF soit possible.

8.4. ALGORITHME DE LA VRF DANS OOPS 125 Calcul de la VRF via l'adjoint

Pour eectuer le calcul de la VRF, il est nécessaire de disposer du vecteur de la condition initiale pour le calcul du gradient de la fonction score et des éléments issus de l'algorithme de Lanczos pour modéliser la matrice A. Le choix de la fonction score doit aussi être déni dans le chier XML.

<initial>

<date>2014-01-19T00:00:00Z</date>

<filename>Data/state.fc.2014-01-19T00:00:00Z.PT0S</filename> </initial>

Le calcul de la trajectoire jusqu'à tverif est réalisé à ce niveau en utilisant la méthode forecast associée

à l'objet QgState. <forecast>

<begin>2014-01-19T00:00:00Z</begin> <end>2014-01-21T00:00:00Z</end> </forecast>

Il n'existe pas de classe pour le calcul d'une fonction score ou de son gradient. Dans le cas d'une implé- mentation pour le QG, on contourne le problème en choisissant l'enstrophie comme fonction score, car son gradient est la vorticité. La vorticité est obtenue comme le laplacien de la fonction courant (la fonction en FORTRAN est laplacian_2d).

Pour ramener le gradient à tobs, on passe par la classe QgTLM pour le QG, qui regroupe les modèles

tangent linaire et l'adjoint. L'intégration temporelle de l'adjoint se fait via le méthode stepAD appliquée au gradient de S à tverif.

La construction de la matrice A sous forme d'opérateur est décrite dans l'annexe B et le calcul de la variance d'erreur d'analyse associé dans l'annexe D. Ces calculs peuvent être codés directement en C++. Comme A est construit sous la forme A ≈ B +Pr

k=1(λ −1

k − 1)(Luk)(Luk)T, le produit matrice vecteur

entre le gradient et A peut donc être réalisé à partir de la fonction dot_product et d'additions. <VRF>

<VRF_algo>adjoint</VRF_algo>

<ScoreFunction>enstrophy</ScoreFunction> <ALanczosIn>qg.4dvar.out</ALanczosIn> </VRF>

Le champ de réduction de variance ainsi obtenu doit être sauvegardé dans un chier. L'écriture des chiers est traitée par un PostProcessor.