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

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

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

trunk/phylmd/Interface_surf/interfoce_lim.f revision 104 by guez, Thu Sep 4 10:05:52 2014 UTC trunk/Sources/phylmd/Interface_surf/interfoce_lim.f revision 191 by guez, Mon May 9 19:56:28 2016 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(dtime, jour, knindex, debut, lmt_sst, pctsrf_new)
        debut, lmt_sst, pctsrf_new)  
8    
9        ! lecture conditions limites
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.
12    
13      ! Laurent FAIRHEAD, February 2000      ! Laurent FAIRHEAD, February 2000
14    
15      use abort_gcm_m, only: abort_gcm      USE dimphy, ONLY: klon
16      USE indicesol, ONLY: is_lic, is_oce, is_sic, is_ter, nbsrf      USE indicesol, ONLY: is_lic, is_oce, is_sic, is_ter, nbsrf
17      USE netcdf, ONLY: nf90_noerr, nf90_nowrite      USE netcdf, ONLY: nf90_nowrite
18      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
19        use nr_util, only: assert
20        use time_phylmdz, only: itap
21    
     integer, intent(IN):: itime ! numero du pas de temps courant  
22      real, intent(IN):: dtime ! pas de temps de la physique (en s)      real, intent(IN):: dtime ! pas de temps de la physique (en s)
23      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  
24    
25      integer, intent(in):: knindex(klon)      integer, intent(in):: knindex(:) ! (knon)
26      ! index des points de la surface a traiter      ! index des points de la surface a traiter
27    
28      logical, intent(IN):: debut ! 1er appel a la physique (initialisation)      logical, intent(IN):: debut ! 1er appel a la physique (initialisation)
29    
30      real, intent(out), dimension(knon):: lmt_sst      real, intent(out):: lmt_sst(:) ! (knon)
31      ! SST lues dans le fichier de CL      ! SST lues dans le fichier de conditions aux limites
32    
33      real, intent(out), dimension(klon, nbsrf):: pctsrf_new      real, intent(out):: pctsrf_new(:, :) ! (klon, nbsrf)
34      ! sous-maille fractionnelle      ! sous-maille fractionnelle
35    
36      ! Local:      ! Local:
37    
     integer ii  
   
38      INTEGER, save:: lmt_pas ! frequence de lecture des conditions limites      INTEGER, save:: lmt_pas ! frequence de lecture des conditions limites
39      ! (en pas de physique)      ! (en pas de physique)
40    
41      logical, save:: deja_lu ! pour indiquer que le jour a lire a deja      logical, save:: deja_lu
42      ! lu pour une surface precedente      ! pour indiquer que le jour à lire a déjà été lu pour une surface
43        ! précédente
44    
45      integer, save:: jour_lu      integer, save:: jour_lu
46    
47      ! Champs lus dans le fichier de conditions aux limites :      ! Champs lus dans le fichier de conditions aux limites :
48      real, allocatable, save, dimension(:):: sst_lu      real, allocatable, save:: sst_lu(:)
49      real, allocatable, save, dimension(:, :):: pct_tmp      real, allocatable, save:: pct_tmp(:, :)
50    
51      ! Pour Netcdf :      integer ncid, varid ! pour NetCDF
     integer nid, nvarid  
     integer, dimension(2):: start, epais  
52    
53      ! --------------------------------------------------      ! --------------------------------------------------
54    
55        call assert(size(knindex) == size(lmt_sst), "interfoce_lim knon")
56    
57      if (debut .and. .not. allocated(sst_lu)) then      if (debut .and. .not. allocated(sst_lu)) then
58         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
59         jour_lu = jour - 1         jour_lu = jour - 1
60         allocate(sst_lu(klon))         allocate(sst_lu(klon))
61         allocate(pct_tmp(klon, nbsrf))         allocate(pct_tmp(klon, nbsrf))
# Line 66  contains Line 64  contains
64      if ((jour - jour_lu) /= 0) deja_lu = .false.      if ((jour - jour_lu) /= 0) deja_lu = .false.
65    
66      ! Tester d'abord si c'est le moment de lire le fichier      ! Tester d'abord si c'est le moment de lire le fichier
67      if (mod(itime - 1, lmt_pas) == 0 .and. .not. deja_lu) then      if (mod(itap - 1, lmt_pas) == 0 .and. .not. deja_lu) then
68         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  
69    
70         ! Fraction "ocean"         ! Fraction "ocean"
71         call NF95_INQ_VARID(nid, 'FOCE', nvarid)         call NF95_INQ_VARID(ncid, 'FOCE', varid)
72         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/))
73    
74         ! Fraction "glace de mer"         ! Fraction "glace de mer"
75         call NF95_INQ_VARID(nid, 'FSIC', nvarid)         call NF95_INQ_VARID(ncid, 'FSIC', varid)
76         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/))
77    
78         ! Fraction "terre"         ! Fraction "terre"
79         call NF95_INQ_VARID(nid, 'FTER', nvarid)         call NF95_INQ_VARID(ncid, 'FTER', varid)
80         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/))
81    
82         ! Fraction "glacier terre"         ! Fraction "glacier terre"
83         call NF95_INQ_VARID(nid, 'FLIC', nvarid)         call NF95_INQ_VARID(ncid, 'FLIC', varid)
84         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/))
85    
86         call NF95_INQ_VARID(nid, 'SST', nvarid)         call NF95_INQ_VARID(ncid, 'SST', varid)
87         call NF95_GET_VAR(nid, nvarid, sst_lu, start, epais)         call NF95_GET_VAR(ncid, varid, sst_lu, start = (/1, jour/))
88    
89         call NF95_CLOSE(nid)         call NF95_CLOSE(ncid)
90         deja_lu = .true.         deja_lu = .true.
91         jour_lu = jour         jour_lu = jour
92      endif      endif
93    
94      ! Recopie des variables dans les champs de sortie      ! Recopie des variables dans les champs de sortie
95        lmt_sst = sst_lu(knindex)
     do ii = 1, knon  
        lmt_sst(ii) = sst_lu(knindex(ii))  
     enddo  
   
96      pctsrf_new(:, is_oce) = pct_tmp(:, is_oce)      pctsrf_new(:, is_oce) = pct_tmp(:, is_oce)
97      pctsrf_new(:, is_sic) = pct_tmp(:, is_sic)      pctsrf_new(:, is_sic) = pct_tmp(:, is_sic)
98    

Legend:
Removed from v.104  
changed lines
  Added in v.191

  ViewVC Help
Powered by ViewVC 1.1.21