wiki:DevelopmentActivities/MergeHydro/Interpolation_note

Version 4 (modified by ajornet, 5 years ago) (diff)

--

Amélioration de l'interpolation

Description

Réduire les temps de projection des cartes en entrée du modèle ORCHIDEE. Cette réduction est particulièrement nécessaire lorsque le forçage (et donc le modèle) ont des grilles très fines.

Modules affectés

Dans ORCHIDEE, pluiseurs modules contiennent des projections :

  • slowproc, 4 projections : vegetation (5kms vector map and 2D LAND USE maps), LAI, soil texture.
  • condveg : soil color
  • routing : rivers, irrigations and floodplains
  • stomate_io (fonction get_reftemp)

Pour l'instant, seuls les trois premiers ont été améliorés.

La normalisation de la carte de LAI introduite dans la version LMD a été commentée car tant que l'on a pas travaillé sur les llaimax/llaimin, elle supprime la variation saisonnière des PFTs 2,4,5 et 7. Voyez la note DevelopmentActivities/MergeHydro/lai_note pour la justification.

Programmation

Calcul de la résolution de chaque point de la carte lue en latitude et longitude :

          ! Resolution in longitude
          !
          coslat = MAX( COS( lat(ip,jp) * pi/180. ), mincos )     
          IF ( ip .EQ. 1 ) THEN
             resol_lu(ip,jp,1) = ABS( lon(ip+1,jp) - lon(ip,jp) ) * pi/180. * R_Earth * coslat
          ELSEIF ( ip .EQ. iml ) THEN
             resol_lu(ip,jp,1) = ABS( lon(ip,jp) - lon(ip-1,jp) ) * pi/180. * R_Earth * coslat
          ELSE
             resol_lu(ip,jp,1) = ABS( lon(ip+1,jp) - lon(ip-1,jp) )/2. * pi/180. * R_Earth * coslat
          ENDIF
          !
          ! Resolution in latitude
          !
          IF ( jp .EQ. 1 ) THEN
             resol_lu(ip,jp,2) = ABS( lat(ip,jp) - lat(ip,jp+1) ) * pi/180. * R_Earth
          ELSEIF ( jp .EQ. jml ) THEN
             resol_lu(ip,jp,2) = ABS( lat(ip,jp-1) - lat(ip,jp) ) * pi/180. * R_Earth
          ELSE
             resol_lu(ip,jp,2) =  ABS( lat(ip,jp-1) - lat(ip,jp+1) )/2. * pi/180. * R_Earth
          ENDIF
          !

Au lieu de fixer arbitrairement un nombre maximum de recouvrement des points de la grille de la carte lue par rapport aux points de la grille du modèle (nbvmax), on calcule une valeur précise :

     ! The number of maximum vegetation map points in the GCM grid is estimated.
    ! Some lmargin is taken.
    !
    IF (is_root_prc) THEN
       nix=INT(MAXVAL(resolution_g(:,1))/MAXVAL(resol_lu(:,:,1)))+2
       njx=INT(MAXVAL(resolution_g(:,2))/MAXVAL(resol_lu(:,:,2)))+2
       nbvmax = nix*njx
    ENDIF
    CALL bcast(nbvmax)

Après vérification avec un nombre important de correspondances carte/grille de modèle (dont des sites), on pourra supprimer la boucle sur les interpolations utilisées auparavant pour éviter l'arrêt du modèle lorsque les nbvmax était définit avec des valeurs trop petites :

    ok_interpol = .FALSE.
    DO WHILE ( .NOT. ok_interpol )
[...]
       IF ( .NOT. ok_interpol ) THEN
          DEALLOCATE(sub_area)
          DEALLOCATE(sub_index)
          !
          nbvmax = nbvmax * 2
       ENDIF
    ENDDO

La procédure get_reftemp doit être réécrite pour utiliser la projection de interpol_help et cette optimisation.

tests

Vérifier que les projections ne sont pas modifiées et évaluer les impacts sur les résultats du modèle en cas de changement (SPINUP et run historique).