source: LMDZ.3.3/trunk/libf/phylmd/condsurf.F @ 3

Last change on this file since 3 was 2, checked in by lmdz, 25 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 10.3 KB
Line 
1      SUBROUTINE condsurf( jour, jourvrai, pctsrf,
2     s                    lmt_sst,lmt_alb,lmt_rug,lmt_bils )
3      IMPLICIT none
4c
5c Lire les conditions aux limites du modele.
6c -----------------------------------------
7c jour     : input  , numero du jour a lire
8c jourvrai : input  , vrai jour de la simulation 
9c
10c pctsrf:  sous-maille fractionnelle, la somme doit = 1
11c lmt_sst: temperature de la surface oceanique
12c lmt_alb: albedo du sol
13c lmt_rug: longeur de rugosite du sol
14c lmt_bils: bilan chaleur au sol (a utiliser pour "slab-ocean")
15c
16#include "netcdf.inc"
17      INTEGER nid, nvarid
18      INTEGER debut(2)
19      INTEGER epais(2)
20      INTEGER lnblnk
21      EXTERNAL lnblnk
22c
23#include "dimensions.h"
24#include "dimphy.h"
25#include "indicesol.h"
26#include "temps.h"
27#include "clesphys.h"
28c
29c newlmt indique l'utilisation de la sous-maille fractionnelle,
30c tandis que l'ancien regime utilisait l'indicateur du sol (0,1,2,3).
31
32      LOGICAL newlmt
33      PARAMETER (newlmt=.FALSE.)
34
35      INTEGER     nannemax
36      PARAMETER ( nannemax = 60 )
37c
38      INTEGER jour,jourvrai
39      REAL lmt_nat(klon) ! indicateur de la nature du sol
40      REAL pctsrf(klon,nbsrf) ! sous-maille fractionnelle
41      REAL lmt_sst(klon) ! temperature de la surface oceanique
42      REAL lmt_alb(klon) ! albedo du sol
43      REAL lmt_rug(klon) ! longeur de rugosite du sol
44      REAL lmt_bils(klon)
45c
46c Couplage OASIS:
47#include "oasis.h"
48      REAL cpl_sst(iim,jjm+1), cpl_sic(iim,jjm+1)
49      REAL cpl_alb_sst(iim,jjm+1), cpl_alb_sic(iim,jjm+1)
50c
51c Variables locales:
52      INTEGER ig, i, j, kt, ierr
53      LOGICAL ok
54      INTEGER anneelim,anneemax
55      CHARACTER*20 fich
56cc
57cc   .....................................................................
58cc
59cc    Pour lire le fichier limit correspondant vraiment  a l'annee de la
60cc     simulation en cours , il suffit de mettre  ok_limitvrai = .TRUE.
61cc
62cc   ......................................................................
63c
64c
65      IF (jour.LT.0 .OR. jour.GT.(360-1)) THEN
66         PRINT*,'Le jour demande n est pas correct: ', jour
67         CALL ABORT
68      ENDIF
69c
70c  .............   modif  (  P. Le Van )  ...........
71
72       anneelim  = anne_ini
73       anneemax  = anne_ini + nannemax
74c
75c
76       IF( ok_limitvrai )       THEN
77          DO  kt = 1, nannemax
78            IF(jourvrai.LE. (kt-1)*360 + 359  )  THEN
79              WRITE(fich,'("limit",i4,".nc")') anneelim
80              PRINT *,' Fichier  Limite ',fich
81              GO TO 100
82             ENDIF
83           anneelim = anneelim + 1
84          ENDDO
85
86         PRINT *,' PBS ! Le jour a lire sur le fichier limit ne se '
87         PRINT *,' trouve pas sur les ',nannemax,' annees a partir de '
88         PRINT *,' l annee de debut', anne_ini
89           CALL EXIT(1)
90c
91100     CONTINUE
92c
93       ELSE
94     
95            WRITE(fich,'("limit.nc")')
96            PRINT *,' Fichier  Limite ',fich
97       ENDIF
98c
99c  ........... ( fin   modif   P. Le Van  ) ............
100c
101c Ouvrir le fichier en format NetCDF:
102c
103      ierr = NF_OPEN (fich, NF_NOWRITE,nid)
104      IF (ierr.NE.NF_NOERR) THEN
105        WRITE(6,*)' Pb d''ouverture du fichier ', fich
106        WRITE(6,*)' Le fichier limit ',fich,' (avec 4 chiffres , pour'
107        WRITE(6,*)'       l an 2000 )  ,  n existe  pas !  '
108        WRITE(6,*)' ierr = ', ierr
109        CALL EXIT(1)
110      ENDIF
111c
112c La tranche de donnees a lire:
113c
114      debut(1) = 1
115      debut(2) = jour + 1
116      epais(1) = klon
117      epais(2) = 1
118c
119      IF (newlmt) THEN
120c
121c Fraction "ocean":
122      ierr = NF_INQ_VARID (nid, "FOCE", nvarid)
123      IF (ierr .NE. NF_NOERR) THEN
124         PRINT*, "condsurf: Le champ <FOCE> est absent"
125         CALL abort
126      ENDIF
127#ifdef NC_DOUBLE
128      ierr = NF_GET_VARA_DOUBLE(nid,nvarid,debut,epais,pctsrf(1,is_oce))
129#else
130      ierr = NF_GET_VARA_REAL(nid,nvarid,debut,epais,pctsrf(1,is_oce))
131#endif
132      IF (ierr .NE. NF_NOERR) THEN
133         PRINT*, "condsurf: Lecture echouee pour <FOCE>"
134         CALL abort
135      ENDIF
136c
137c Fraction "glace de mer":
138      ierr = NF_INQ_VARID (nid, "FSIC", nvarid)
139      IF (ierr .NE. NF_NOERR) THEN
140         PRINT*, "condsurf: Le champ <FSIC> est absent"
141         CALL abort
142      ENDIF
143#ifdef NC_DOUBLE
144      ierr = NF_GET_VARA_DOUBLE(nid,nvarid,debut,epais,pctsrf(1,is_sic))
145#else
146      ierr = NF_GET_VARA_REAL(nid,nvarid,debut,epais,pctsrf(1,is_sic))
147#endif
148      IF (ierr .NE. NF_NOERR) THEN
149         PRINT*, "condsurf: Lecture echouee pour <FSIC>"
150         CALL abort
151      ENDIF
152c
153c Fraction "terre":
154      ierr = NF_INQ_VARID (nid, "FTER", nvarid)
155      IF (ierr .NE. NF_NOERR) THEN
156         PRINT*, "condsurf: Le champ <FTER> est absent"
157         CALL abort
158      ENDIF
159#ifdef NC_DOUBLE
160      ierr = NF_GET_VARA_DOUBLE(nid,nvarid,debut,epais,pctsrf(1,is_ter))
161#else
162      ierr = NF_GET_VARA_REAL(nid,nvarid,debut,epais,pctsrf(1,is_ter))
163#endif
164      IF (ierr .NE. NF_NOERR) THEN
165         PRINT*, "condsurf: Lecture echouee pour <FTER>"
166         CALL abort
167      ENDIF
168c
169c Fraction "glacier terre":
170      ierr = NF_INQ_VARID (nid, "FLIC", nvarid)
171      IF (ierr .NE. NF_NOERR) THEN
172         PRINT*, "condsurf: Le champ <FLIC> est absent"
173         CALL abort
174      ENDIF
175#ifdef NC_DOUBLE
176      ierr = NF_GET_VARA_DOUBLE(nid,nvarid,debut,epais,pctsrf(1,is_lic))
177#else
178      ierr = NF_GET_VARA_REAL(nid,nvarid,debut,epais,pctsrf(1,is_lic))
179#endif
180      IF (ierr .NE. 0) THEN
181         PRINT*, "condsurf: Lecture echouee pour <FLIC>"
182         CALL abort
183      ENDIF
184c
185      ELSE ! test sur newlmt
186c
187c Indicateur de la nature du sol (0,1,2,3):
188      ierr = NF_INQ_VARID (nid, "NAT", nvarid)
189      IF (ierr .NE. NF_NOERR) THEN
190         PRINT*, "condsurf: Le champ <NAT> est absent"
191         CALL abort
192      ENDIF
193#ifdef NC_DOUBLE
194      ierr = NF_GET_VARA_DOUBLE(nid, nvarid,debut,epais,lmt_nat)
195#else
196      ierr = NF_GET_VARA_REAL(nid, nvarid,debut,epais,lmt_nat)
197#endif
198      IF (ierr .NE. NF_NOERR) THEN
199         PRINT*, "condsurf: Lecture echouee pour <NAT>"
200         CALL abort
201      ENDIF
202c
203      DO ig = 1, klon
204         pctsrf(ig,is_oce) = 0.0
205         pctsrf(ig,is_ter) = 0.0
206         pctsrf(ig,is_lic) = 0.0
207         pctsrf(ig,is_sic) = 0.0
208      ENDDO
209      ok = .TRUE.
210      DO ig = 1, klon
211      IF (NINT(lmt_nat(ig)).EQ.0) THEN
212         pctsrf(ig,is_oce) = 1.0
213      ELSE IF (NINT(lmt_nat(ig)).EQ.1) THEN
214         pctsrf(ig,is_ter) = 1.0
215      ELSE IF (NINT(lmt_nat(ig)).EQ.2) THEN
216         pctsrf(ig,is_lic) = 1.0
217      ELSE IF (NINT(lmt_nat(ig)).EQ.3) THEN
218         pctsrf(ig,is_sic) = 1.0
219      ELSE
220         ok = .FALSE.
221      ENDIF
222      ENDDO
223      IF (.NOT.ok) THEN
224         PRINT*, "valeur fausse pour lmt_nat:", lmt_nat
225         CALL abort
226      ENDIF
227c
228      ENDIF ! fin de test sur newlmt
229c
230c Sea surface temperature:
231      ierr = NF_INQ_VARID (nid, "SST", nvarid)
232      IF (ierr .NE. NF_NOERR) THEN
233         PRINT*, "condsurf: Le champ <SST> est absent"
234         CALL abort
235      ENDIF
236#ifdef NC_DOUBLE
237      ierr = NF_GET_VARA_DOUBLE(nid, nvarid,debut,epais,lmt_sst)
238#else
239      ierr = NF_GET_VARA_REAL(nid, nvarid,debut,epais,lmt_sst)
240#endif
241      IF (ierr .NE. NF_NOERR) THEN
242         PRINT*, "condsurf: Lecture echouee pour <SST>"
243         CALL abort
244      ENDIF
245c
246c Albedo de surface:
247      ierr = NF_INQ_VARID (nid, "ALB", nvarid)
248      IF (ierr .NE. NF_NOERR) THEN
249         PRINT*, "condsurf: Le champ <ALB> est absent"
250         CALL abort
251      ENDIF
252#ifdef NC_DOUBLE
253      ierr = NF_GET_VARA_DOUBLE(nid, nvarid,debut,epais,lmt_alb)
254#else
255      ierr = NF_GET_VARA_REAL(nid, nvarid,debut,epais,lmt_alb)
256#endif
257      IF (ierr .NE. NF_NOERR) THEN
258         PRINT*, "condsurf: Lecture echouee pour <ALB>"
259         CALL abort
260      ENDIF
261c
262c Longueur de rugosite au sol:
263      ierr = NF_INQ_VARID (nid, "RUG", nvarid)
264      IF (ierr .NE. NF_NOERR) THEN
265         PRINT*, "condsurf: Le champ <RUG> est absent"
266         CALL abort
267      ENDIF
268#ifdef NC_DOUBLE
269      ierr = NF_GET_VARA_DOUBLE(nid, nvarid,debut,epais,lmt_rug)
270#else
271      ierr = NF_GET_VARA_REAL(nid, nvarid,debut,epais,lmt_rug)
272#endif
273      IF (ierr .NE. NF_NOERR) THEN
274         PRINT*, "condsurf: Lecture echouee pour <RUG>"
275         CALL abort
276      ENDIF
277c
278c Bilan flux de chaleur au sol:
279      ierr = NF_INQ_VARID (nid, "BILS", nvarid)
280      IF (ierr .NE. NF_NOERR) THEN
281         PRINT*, "condsurf: Le champ <BILS> est absent"
282         CALL abort
283      ENDIF
284#ifdef NC_DOUBLE
285      ierr = NF_GET_VARA_DOUBLE(nid, nvarid,debut,epais,lmt_bils)
286#else
287      ierr = NF_GET_VARA_REAL(nid, nvarid,debut,epais,lmt_bils)
288#endif
289      IF (ierr .NE. NF_NOERR) THEN
290         PRINT*, "condsurf: Lecture echouee pour <BILS>"
291         CALL abort
292      ENDIF
293c
294c Fermer le fichier:
295c
296      ierr = NF_CLOSE(nid)
297c
298c
299      PRINT*, 'SST, ALB, RUG, etc. sont lus pour jour: ', jour
300c
301      IF (ok_oasis) THEN
302C
303         CALL fromcpl(jour,(jjm+1)*iim,
304     .        cpl_sst,cpl_sic,cpl_alb_sst,cpl_alb_sic)
305         DO i = 1, iim-1 ! un seul point pour le pole nord
306            cpl_sst(i,1) = cpl_sst(iim,1)
307            cpl_sic(i,1) = cpl_sic(iim,1)
308            cpl_alb_sst(i,1) = cpl_alb_sst(iim,1)
309            cpl_alb_sic(i,1) = cpl_alb_sic(iim,1)
310         ENDDO
311         DO i = 2, iim ! un seul point pour le pole sud
312            cpl_sst(i,jjm+1) = cpl_sst(1,jjm+1)
313            cpl_sic(i,jjm+1) = cpl_sic(1,jjm+1)
314            cpl_alb_sst(i,jjm+1) = cpl_alb_sst(1,jjm+1)
315            cpl_alb_sic(i,jjm+1) = cpl_alb_sic(1,jjm+1)
316         ENDDO
317c
318         ig = 1
319         IF (pctsrf(ig,is_oce).GT.epsfra .OR.
320     .       pctsrf(ig,is_sic).GT.epsfra) THEN
321            pctsrf(ig,is_oce) = pctsrf(ig,is_oce)
322     .                        - (cpl_sic(1,1)-pctsrf(ig,is_sic))
323            pctsrf(ig,is_sic) = cpl_sic(1,1)
324            lmt_sst(ig) = cpl_sst(1,1)
325         ENDIF
326         DO j = 2, jjm
327         DO i = 1, iim
328         ig = ig + 1
329         IF (pctsrf(ig,is_oce).GT.epsfra .OR.
330     .       pctsrf(ig,is_sic).GT.epsfra) THEN
331           pctsrf(ig,is_oce) = pctsrf(ig,is_oce)
332     .                       - (cpl_sic(i,j)-pctsrf(ig,is_sic))
333           pctsrf(ig,is_sic) = cpl_sic(i,j)
334           lmt_sst(ig) = cpl_sst(i,j)
335         ENDIF
336         ENDDO
337         ENDDO
338         ig = ig + 1
339         IF (pctsrf(ig,is_oce).GT.epsfra .OR.
340     .       pctsrf(ig,is_sic).GT.epsfra) THEN
341            pctsrf(ig,is_oce) = pctsrf(ig,is_oce)
342     .                        - (cpl_sic(1,jjm+1)-pctsrf(ig,is_sic))
343            pctsrf(ig,is_sic) = cpl_sic(1,jjm+1)
344            lmt_sst(ig) = cpl_sst(1,jjm+1)
345         ENDIF
346c
347      ENDIF ! ok_oasis
348c
349      RETURN
350      END
Note: See TracBrowser for help on using the repository browser.