7 lmt_sst_p, pctsrf_new_p)
40 INTEGER,
INTENT(IN) :: itime
41 INTEGER,
INTENT(IN) :: jour
42 INTEGER,
INTENT(IN) :: knon
43 INTEGER,
DIMENSION(klon_loc),
INTENT(IN) :: knindex
44 REAL ,
INTENT(IN) :: dtime
45 LOGICAL,
INTENT(IN) :: debut
49 REAL,
INTENT(OUT),
DIMENSION(klon_loc) :: lmt_sst_p
50 REAL,
INTENT(OUT),
DIMENSION(klon_loc,nbsrf) :: pctsrf_new_p
56 INTEGER,
SAVE :: lmt_pas
59 LOGICAL,
SAVE :: deja_lu
61 INTEGER,
SAVE :: jour_lu
63 CHARACTER (len = 20),
SAVE :: fich =
'limit.nc'
65 LOGICAL,
SAVE :: newlmt = .
true.
67 LOGICAL,
SAVE :: check = .
false.
69 REAL,
ALLOCATABLE ,
SAVE,
DIMENSION(:) :: sst_lu_p
71 REAL,
ALLOCATABLE ,
SAVE,
DIMENSION(:,:) :: pct_tmp_p
76 INTEGER :: nid, nvarid
79 INTEGER,
DIMENSION(2) :: start, epais
80 CHARACTER (len = 20) :: modname =
'interfoce_lim'
81 CHARACTER (len = 80) :: abort_message
82 REAL,
DIMENSION(klon_glo,nbsrf) :: pctsrf_new
83 REAL,
DIMENSION(klon_glo,nbsrf) :: pct_tmp
84 REAL,
DIMENSION(klon_glo) :: sst_lu
85 REAL,
DIMENSION(klon_glo) :: nat_lu
94 IF (debut .AND. .NOT.
ALLOCATED(sst_lu_p))
THEN
95 lmt_pas = nint(86400./dtime * 1.0)
101 IF ((jour - jour_lu) /= 0) deja_lu = .
false.
103 IF (check)
WRITE(*,*) modname,
' :: jour, jour_lu, deja_lu', jour, jour_lu, deja_lu
104 IF (check)
WRITE(*,*) modname,
' :: itime, lmt_pas ', itime, lmt_pas,dtime
111 IF (mod(itime-1, lmt_pas) == 0 .AND. .NOT. deja_lu)
THEN
114 IF (is_mpi_root)
THEN
117 ierr = nf_open(fich, nf_nowrite,nid)
118 IF (ierr.NE.nf_noerr)
THEN
119 abort_message =
'Pb d''ouverture du fichier de conditions aux limites'
134 ierr = nf_inq_varid(nid,
'FOCE', nvarid)
135 IF (ierr /= nf_noerr)
THEN
136 abort_message =
'Le champ <FOCE> est absent'
140 ierr = nf_get_vara_double(nid,nvarid,start,epais,pct_tmp(1,
is_oce))
142 ierr = nf_get_vara_real(nid,nvarid,start,epais,pct_tmp(1,
is_oce))
144 IF (ierr /= nf_noerr)
THEN
145 abort_message =
'Lecture echouee pour <FOCE>'
151 ierr = nf_inq_varid(nid,
'FSIC', nvarid)
152 IF (ierr /= nf_noerr)
THEN
153 abort_message =
'Le champ <FSIC> est absent'
157 ierr = nf_get_vara_double(nid,nvarid,start,epais,pct_tmp(1,
is_sic))
159 ierr = nf_get_vara_real(nid,nvarid,start,epais,pct_tmp(1,
is_sic))
161 IF (ierr /= nf_noerr)
THEN
162 abort_message =
'Lecture echouee pour <FSIC>'
168 ierr = nf_inq_varid(nid,
'FTER', nvarid)
169 IF (ierr /= nf_noerr)
THEN
170 abort_message =
'Le champ <FTER> est absent'
174 ierr = nf_get_vara_double(nid,nvarid,start,epais,pct_tmp(1,
is_ter))
176 ierr = nf_get_vara_real(nid,nvarid,start,epais,pct_tmp(1,
is_ter))
178 IF (ierr /= nf_noerr)
THEN
179 abort_message =
'Lecture echouee pour <FTER>'
185 ierr = nf_inq_varid(nid,
'FLIC', nvarid)
186 IF (ierr /= nf_noerr)
THEN
187 abort_message =
'Le champ <FLIC> est absent'
191 ierr = nf_get_vara_double(nid,nvarid,start,epais,pct_tmp(1,
is_lic))
193 ierr = nf_get_vara_real(nid,nvarid,start,epais,pct_tmp(1,
is_lic))
195 IF (ierr /= nf_noerr)
THEN
196 abort_message =
'Lecture echouee pour <FLIC>'
202 ierr = nf_inq_varid(nid,
'NAT', nvarid)
203 IF (ierr /= nf_noerr)
THEN
204 abort_message =
'Le champ <NAT> est absent'
208 ierr = nf_get_vara_double(nid,nvarid,start,epais, nat_lu)
210 ierr = nf_get_vara_real(nid,nvarid,start,epais, nat_lu)
212 IF (ierr /= nf_noerr)
THEN
213 abort_message =
'Lecture echouee pour <NAT>'
222 pct_tmp(ii,nint(nat_lu(ii)) + 1) = 1.
229 pctsrf_new(:,2)= pct_tmp(:,1)
230 pctsrf_new(:,1)= pct_tmp(:,2)
236 ierr = nf_inq_varid(nid,
'SST', nvarid)
237 IF (ierr /= nf_noerr)
THEN
238 abort_message =
'Le champ <SST> est absent'
242 ierr = nf_get_vara_double(nid,nvarid,start,epais, sst_lu)
244 ierr = nf_get_vara_real(nid,nvarid,start,epais, sst_lu)
246 IF (ierr /= nf_noerr)
THEN
247 abort_message =
'Lecture echouee pour <SST>'
266 CALL scatter(sst_lu,sst_lu_p)
277 lmt_sst_p = 999999999.
280 lmt_sst_p(ii) = sst_lu_p(knindex(ii))
integer, parameter is_ter
subroutine interfoce_lim(itime, dtime, jour, knon, knindex, debut, lmt_sst_p, pctsrf_new_p)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
integer, parameter is_lic
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
integer, parameter is_sic
subroutine abort_physic(modname, message, ierr)
integer, parameter is_oce