/[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 104 by guez, Thu Sep 4 10:05:52 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, klon, knon, knindex, &    SUBROUTINE interfoce_lim(itime, dtime, jour, knindex, debut, lmt_sst, &
8         debut, lmt_sst, pctsrf_new)         pctsrf_new)
9    
10      ! Cette routine sert d'interface entre le modèle atmosphérique 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.
# Line 13  contains Line 13  contains
13      ! Laurent FAIRHEAD, February 2000      ! Laurent FAIRHEAD, February 2000
14    
15      use abort_gcm_m, only: abort_gcm      use abort_gcm_m, only: abort_gcm
16        USE dimphy, ONLY: klon
17      USE indicesol, ONLY: is_lic, is_oce, is_sic, is_ter, nbsrf      USE indicesol, ONLY: is_lic, is_oce, is_sic, is_ter, nbsrf
18      USE netcdf, ONLY: nf90_noerr, nf90_nowrite      USE netcdf, ONLY: nf90_noerr, nf90_nowrite
19      use netcdf95, only: NF95_CLOSE, nf95_get_var, NF95_INQ_VARID, nf95_open      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
     integer, intent(IN):: klon ! taille de la grille  
     integer, intent(IN):: knon ! nombre de points dans le domaine a traiter  
25    
26      integer, intent(in):: knindex(klon)      integer, intent(in):: knindex(:) ! (knon)
27      ! index des points de la surface a traiter      ! index des points de la surface a traiter
28    
29      logical, intent(IN):: debut ! 1er appel a la physique (initialisation)      logical, intent(IN):: debut ! 1er appel a la physique (initialisation)
30    
31      real, intent(out), dimension(knon):: lmt_sst      real, intent(out):: lmt_sst(:) ! (knon)
32      ! SST lues dans le fichier de CL      ! SST lues dans le fichier de conditions aux limites
33    
34      real, intent(out), dimension(klon, nbsrf):: pctsrf_new      real, intent(out):: pctsrf_new(:, :) ! (klon, nbsrf)
35      ! sous-maille fractionnelle      ! sous-maille fractionnelle
36    
37      ! Local:      ! Local:
38    
39      integer ii      integer knon ! nombre de points dans le domaine a traiter
40    
41      INTEGER, save:: lmt_pas ! frequence de lecture des conditions limites      INTEGER, save:: lmt_pas ! frequence de lecture des conditions limites
42      ! (en pas de physique)      ! (en pas de physique)
43    
44      logical, save:: deja_lu ! pour indiquer que le jour a lire a deja      logical, save:: deja_lu
45      ! lu pour une surface precedente      ! pour indiquer que le jour à lire a déjà été lu pour une surface
46        ! précédente
47    
48      integer, save:: jour_lu      integer, save:: jour_lu
49    
50      ! Champs lus dans le fichier de conditions aux limites :      ! Champs lus dans le fichier de conditions aux limites :
51      real, allocatable, save, dimension(:):: sst_lu      real, allocatable, save:: sst_lu(:)
52      real, allocatable, save, dimension(:, :):: pct_tmp      real, allocatable, save:: pct_tmp(:, :)
53    
54      ! Pour Netcdf :      integer ncid, varid ! pour NetCDF
     integer nid, nvarid  
     integer, dimension(2):: start, epais  
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))
64         allocate(pct_tmp(klon, nbsrf))         allocate(pct_tmp(klon, nbsrf))
# Line 67  contains Line 68  contains
68    
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, nid)         call NF95_OPEN ('limit.nc', NF90_NOWRITE, ncid)
   
        ! La tranche de donnees a lire:  
        start(1) = 1  
        start(2) = jour  
        epais(1) = klon  
        epais(2) = 1  
72    
73         ! Fraction "ocean"         ! Fraction "ocean"
74         call NF95_INQ_VARID(nid, 'FOCE', nvarid)         call NF95_INQ_VARID(ncid, 'FOCE', varid)
75         call NF95_GET_VAR(nid, nvarid, pct_tmp(:, is_oce), start, epais)         call NF95_GET_VAR(ncid, varid, pct_tmp(:, is_oce), start = (/1, jour/))
76    
77         ! Fraction "glace de mer"         ! Fraction "glace de mer"
78         call NF95_INQ_VARID(nid, 'FSIC', nvarid)         call NF95_INQ_VARID(ncid, 'FSIC', varid)
79         call NF95_GET_VAR(nid, nvarid, pct_tmp(:, is_sic), start, epais)         call NF95_GET_VAR(ncid, varid, pct_tmp(:, is_sic), start = (/1, jour/))
80    
81         ! Fraction "terre"         ! Fraction "terre"
82         call NF95_INQ_VARID(nid, 'FTER', nvarid)         call NF95_INQ_VARID(ncid, 'FTER', varid)
83         call NF95_GET_VAR(nid, nvarid, pct_tmp(:, is_ter), start, epais)         call NF95_GET_VAR(ncid, varid, pct_tmp(:, is_ter), start = (/1, jour/))
84    
85         ! Fraction "glacier terre"         ! Fraction "glacier terre"
86         call NF95_INQ_VARID(nid, 'FLIC', nvarid)         call NF95_INQ_VARID(ncid, 'FLIC', varid)
87         call NF95_GET_VAR(nid, nvarid, pct_tmp(:, is_lic), start, epais)         call NF95_GET_VAR(ncid, varid, pct_tmp(:, is_lic), start = (/1, jour/))
88    
89         call NF95_INQ_VARID(nid, 'SST', nvarid)         call NF95_INQ_VARID(ncid, 'SST', varid)
90         call NF95_GET_VAR(nid, nvarid, sst_lu, start, epais)         call NF95_GET_VAR(ncid, varid, sst_lu, start = (/1, jour/))
91    
92         call NF95_CLOSE(nid)         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)
     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.104  
changed lines
  Added in v.106

  ViewVC Help
Powered by ViewVC 1.1.21