/[lmdze]/trunk/Sources/phylmd/Interface_surf/interfoce_lim.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/Interface_surf/interfoce_lim.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 82 by guez, Wed Mar 5 14:57:53 2014 UTC revision 106 by guez, Tue Sep 9 12:54:30 2014 UTC
# Line 4  module interfoce_lim_m Line 4  module interfoce_lim_m
4    
5  contains  contains
6    
7    SUBROUTINE interfoce_lim(itime, dtime, jour,  &    SUBROUTINE interfoce_lim(itime, dtime, jour, knindex, debut, lmt_sst, &
8         klon, nisurf, knon, knindex,  &         pctsrf_new)
        debut,  &  
        lmt_sst, pctsrf_new)  
9    
10      ! Cette routine sert d'interface entre le modele atmospherique et      ! Cette routine sert d'interface entre le modèle atmosphérique et
11      ! un fichier de conditions aux limites      ! un fichier de conditions aux limites.
12    
13      ! L. Fairhead 02/2000      ! Laurent FAIRHEAD, February 2000
14    
15      use abort_gcm_m, only: abort_gcm      use abort_gcm_m, only: abort_gcm
16      use indicesol      USE dimphy, ONLY: klon
17      use netcdf      USE indicesol, ONLY: is_lic, is_oce, is_sic, is_ter, nbsrf
18        USE netcdf, ONLY: nf90_noerr, nf90_nowrite
19        use netcdf95, only: NF95_CLOSE, nf95_get_var, NF95_INQ_VARID, nf95_open
20        use nr_util, only: assert_eq
21    
22      integer, intent(IN) :: itime ! numero du pas de temps courant      integer, intent(IN):: itime ! numero du pas de temps courant
23      real , intent(IN) :: dtime ! pas de temps de la physique (en s)      real, intent(IN):: dtime ! pas de temps de la physique (en s)
24      integer, intent(IN) :: jour ! jour a lire dans l'annee      integer, intent(IN):: jour ! jour a lire dans l'annee
25      integer, intent(IN) :: nisurf ! index de la surface a traiter (1 = sol continental)  
26      integer, intent(IN) :: knon ! nombre de points dans le domaine a traiter      integer, intent(in):: knindex(:) ! (knon)
27      integer, intent(IN) :: klon ! taille de la grille      ! index des points de la surface a traiter
28      integer, dimension(klon), intent(in) :: knindex ! index des points de la surface a traiter  
29      logical, intent(IN) :: debut ! logical: 1er appel a la physique (initialisation)      logical, intent(IN):: debut ! 1er appel a la physique (initialisation)
30    
31      ! Parametres de sortie      real, intent(out):: lmt_sst(:) ! (knon)
32      ! output:      ! SST lues dans le fichier de conditions aux limites
33      ! lmt_sst SST lues dans le fichier de CL  
34      ! pctsrf_new sous-maille fractionnelle      real, intent(out):: pctsrf_new(:, :) ! (klon, nbsrf)
35      real, intent(out), dimension(klon) :: lmt_sst      ! sous-maille fractionnelle
36      real, intent(out), dimension(klon, nbsrf) :: pctsrf_new  
37        ! Local:
38      ! Variables locales  
39      integer :: ii      integer knon ! nombre de points dans le domaine a traiter
40      INTEGER, save :: lmt_pas ! frequence de lecture des conditions limites  
41        INTEGER, save:: lmt_pas ! frequence de lecture des conditions limites
42      ! (en pas de physique)      ! (en pas de physique)
     logical, save :: deja_lu ! pour indiquer que le jour a lire a deja  
     ! lu pour une surface precedente  
     integer, save :: jour_lu  
     integer :: ierr  
     character (len = 20) :: modname = 'interfoce_lim'  
     character (len = 80) :: abort_message  
     logical, save :: newlmt = .TRUE.  
     logical, save :: check = .FALSE.  
     ! Champs lus dans le fichier de CL  
     real, allocatable , save, dimension(:) :: sst_lu, rug_lu, nat_lu  
     real, allocatable , save, dimension(:, :) :: pct_tmp  
43    
44      ! quelques variables pour netcdf      logical, save:: deja_lu
45        ! pour indiquer que le jour à lire a déjà été lu pour une surface
46        ! précédente
47    
48      integer :: nid, nvarid      integer, save:: jour_lu
49      integer, dimension(2) :: start, epais  
50        ! Champs lus dans le fichier de conditions aux limites :
51        real, allocatable, save:: sst_lu(:)
52        real, allocatable, save:: pct_tmp(:, :)
53    
54        integer ncid, varid ! pour NetCDF
55    
56      ! --------------------------------------------------      ! --------------------------------------------------
57    
58        knon = assert_eq(size(knindex), size(lmt_sst), "interfoce_lim knon")
59    
60      if (debut .and. .not. allocated(sst_lu)) then      if (debut .and. .not. allocated(sst_lu)) then
61         lmt_pas = nint(86400./dtime * 1.0) ! pour une lecture une fois par jour         lmt_pas = nint(86400. / dtime) ! pour une lecture une fois par jour
62         jour_lu = jour - 1         jour_lu = jour - 1
63         allocate(sst_lu(klon))         allocate(sst_lu(klon))
        allocate(nat_lu(klon))  
64         allocate(pct_tmp(klon, nbsrf))         allocate(pct_tmp(klon, nbsrf))
65      endif      endif
66    
67      if ((jour - jour_lu) /= 0) deja_lu = .false.      if ((jour - jour_lu) /= 0) deja_lu = .false.
68    
     if (check) write(*, *)modname, ' :: jour, jour_lu, deja_lu', jour, jour_lu, &  
          deja_lu  
     if (check) write(*, *)modname, ' :: itime, lmt_pas ', itime, lmt_pas, dtime  
   
69      ! Tester d'abord si c'est le moment de lire le fichier      ! Tester d'abord si c'est le moment de lire le fichier
70      if (mod(itime-1, lmt_pas) == 0 .and. .not. deja_lu) then      if (mod(itime - 1, lmt_pas) == 0 .and. .not. deja_lu) then
71           call NF95_OPEN ('limit.nc', NF90_NOWRITE, ncid)
72    
73         ! Ouverture du fichier         ! Fraction "ocean"
74           call NF95_INQ_VARID(ncid, 'FOCE', varid)
75           call NF95_GET_VAR(ncid, varid, pct_tmp(:, is_oce), start = (/1, jour/))
76    
77         ierr = NF90_OPEN ('limit.nc', NF90_NOWRITE, nid)         ! Fraction "glace de mer"
78         if (ierr.NE.NF90_NOERR) then         call NF95_INQ_VARID(ncid, 'FSIC', varid)
79            abort_message &         call NF95_GET_VAR(ncid, varid, pct_tmp(:, is_sic), start = (/1, jour/))
                = 'Pb d''ouverture du fichier de conditions aux limites'  
           call abort_gcm(modname, abort_message, 1)  
        endif  
   
        ! La tranche de donnees a lire:  
   
        start(1) = 1  
        start(2) = jour  
        epais(1) = klon  
        epais(2) = 1  
   
        if (newlmt) then  
   
           ! Fraction "ocean"  
   
           ierr = NF90_INQ_VARID(nid, 'FOCE', nvarid)  
           if (ierr /= NF90_NOERR) then  
              abort_message = 'Le champ <FOCE> est absent'  
              call abort_gcm(modname, abort_message, 1)  
           endif  
           ierr = NF90_GET_VAR(nid, nvarid, pct_tmp(:, is_oce), start, epais)  
           if (ierr /= NF90_NOERR) then  
              abort_message = 'Lecture echouee pour <FOCE>'  
              call abort_gcm(modname, abort_message, 1)  
           endif  
   
           ! Fraction "glace de mer"  
   
           ierr = NF90_INQ_VARID(nid, 'FSIC', nvarid)  
           if (ierr /= NF90_NOERR) then  
              abort_message = 'Le champ <FSIC> est absent'  
              call abort_gcm(modname, abort_message, 1)  
           endif  
           ierr = NF90_GET_VAR(nid, nvarid, pct_tmp(:, is_sic), start, epais)  
           if (ierr /= NF90_NOERR) then  
              abort_message = 'Lecture echouee pour <FSIC>'  
              call abort_gcm(modname, abort_message, 1)  
           endif  
   
           ! Fraction "terre"  
   
           ierr = NF90_INQ_VARID(nid, 'FTER', nvarid)  
           if (ierr /= NF90_NOERR) then  
              abort_message = 'Le champ <FTER> est absent'  
              call abort_gcm(modname, abort_message, 1)  
           endif  
           ierr = NF90_GET_VAR(nid, nvarid, pct_tmp(:, is_ter), start, epais)  
           if (ierr /= NF90_NOERR) then  
              abort_message = 'Lecture echouee pour <FTER>'  
              call abort_gcm(modname, abort_message, 1)  
           endif  
   
           ! Fraction "glacier terre"  
   
           ierr = NF90_INQ_VARID(nid, 'FLIC', nvarid)  
           if (ierr /= NF90_NOERR) then  
              abort_message = 'Le champ <FLIC> est absent'  
              call abort_gcm(modname, abort_message, 1)  
           endif  
           ierr = NF90_GET_VAR(nid, nvarid, pct_tmp(:, is_lic), start, epais)  
           if (ierr /= NF90_NOERR) then  
              abort_message = 'Lecture echouee pour <FLIC>'  
              call abort_gcm(modname, abort_message, 1)  
           endif  
   
        else ! on en est toujours a rnatur  
   
           ierr = NF90_INQ_VARID(nid, 'NAT', nvarid)  
           if (ierr /= NF90_NOERR) then  
              abort_message = 'Le champ <NAT> est absent'  
              call abort_gcm(modname, abort_message, 1)  
           endif  
           ierr = NF90_GET_VAR(nid, nvarid, nat_lu, start, epais)  
           if (ierr /= NF90_NOERR) then  
              abort_message = 'Lecture echouee pour <NAT>'  
              call abort_gcm(modname, abort_message, 1)  
           endif  
   
           ! Remplissage des fractions de surface  
           ! nat = 0, 1, 2, 3 pour ocean, terre, glacier, seaice  
   
           pct_tmp = 0.0  
           do ii = 1, klon  
              pct_tmp(ii, nint(nat_lu(ii)) + 1) = 1.  
           enddo  
   
   
           ! On se retrouve avec ocean en 1 et terre en 2 alors qu'on veut le contraire  
   
           pctsrf_new = pct_tmp  
           pctsrf_new (:, 2)= pct_tmp (:, 1)  
           pctsrf_new (:, 1)= pct_tmp (:, 2)  
           pct_tmp = pctsrf_new  
        endif ! fin test sur newlmt  
   
        ! Lecture SST  
   
        ierr = NF90_INQ_VARID(nid, 'SST', nvarid)  
        if (ierr /= NF90_NOERR) then  
           abort_message = 'Le champ <SST> est absent'  
           call abort_gcm(modname, abort_message, 1)  
        endif  
        ierr = NF90_GET_VAR(nid, nvarid, sst_lu, start, epais)  
        if (ierr /= NF90_NOERR) then  
           abort_message = 'Lecture echouee pour <SST>'  
           call abort_gcm(modname, abort_message, 1)  
        endif  
80    
81           ! Fraction "terre"
82           call NF95_INQ_VARID(ncid, 'FTER', varid)
83           call NF95_GET_VAR(ncid, varid, pct_tmp(:, is_ter), start = (/1, jour/))
84    
85         ! Fin de lecture         ! Fraction "glacier terre"
86           call NF95_INQ_VARID(ncid, 'FLIC', varid)
87           call NF95_GET_VAR(ncid, varid, pct_tmp(:, is_lic), start = (/1, jour/))
88    
89         ierr = NF90_CLOSE(nid)         call NF95_INQ_VARID(ncid, 'SST', varid)
90           call NF95_GET_VAR(ncid, varid, sst_lu, start = (/1, jour/))
91    
92           call NF95_CLOSE(ncid)
93         deja_lu = .true.         deja_lu = .true.
94         jour_lu = jour         jour_lu = jour
95      endif      endif
96    
97      ! Recopie des variables dans les champs de sortie      ! Recopie des variables dans les champs de sortie
98        lmt_sst = sst_lu(knindex)
     lmt_sst = 999999999.  
     do ii = 1, knon  
        lmt_sst(ii) = sst_lu(knindex(ii))  
     enddo  
   
99      pctsrf_new(:, is_oce) = pct_tmp(:, is_oce)      pctsrf_new(:, is_oce) = pct_tmp(:, is_oce)
100      pctsrf_new(:, is_sic) = pct_tmp(:, is_sic)      pctsrf_new(:, is_sic) = pct_tmp(:, is_sic)
101    

Legend:
Removed from v.82  
changed lines
  Added in v.106

  ViewVC Help
Powered by ViewVC 1.1.21