29 USE netcdf
, ONLY : NF90_OPEN, NF90_NOWRITE, NF90_CLOSE, NF90_NOERR
34 #include "dimensions.h"
37 LOGICAL,
INTENT(IN) :: ib
38 REAL,
DIMENSION(iip1,jjp1),
INTENT(INOUT) :: masque
39 REAL,
DIMENSION(iip1,jjp1),
INTENT(OUT) ::
phis
40 LOGICAL,
INTENT(IN) :: letat0
42 WRITE(
lunout,*)
'limit_netcdf: Earth-specific routine, needs Earth physics'
49 #include "indicesol.h"
53 REAL,
DIMENSION(klon) :: sn, rugmer, run_off_lic_0
54 REAL,
DIMENSION(iip1,jjp1) :: orog, rugo, psol
55 REAL,
DIMENSION(iip1,jjp1,llm+1) :: p3d
56 REAL,
DIMENSION(iip1,jjp1,llm) :: uvent, t3d, tpot, qsat, qd
57 REAL,
DIMENSION(iip1,jjm ,llm) :: vvent
58 REAL,
DIMENSION(:,:,:,:),
ALLOCATABLE :: q3d
59 REAL,
DIMENSION(klon,nbsrf) :: qsolsrf, snsrf, evap
60 REAL,
DIMENSION(klon,nbsrf) :: frugs, agesno
61 REAL,
DIMENSION(klon,nsoilmx,nbsrf) :: tsoil
64 INTEGER :: iml_lic, jml_lic, llm_tmp
65 INTEGER :: ttm_tmp, iret, fid
66 INTEGER,
DIMENSION(1) :: itaul
67 REAL,
DIMENSION(1) :: lev
69 REAL,
DIMENSION(:,:),
ALLOCATABLE :: lon_lic, lat_lic, fraclic
70 REAL,
DIMENSION(:),
ALLOCATABLE :: dlon_lic, dlat_lic
71 REAL,
DIMENSION(iip1,jjp1) :: flic_tmp
74 CHARACTER(LEN=80) ::
x, fmt
75 INTEGER ::
i,
j,
l, ji
76 REAL,
DIMENSION(iip1,jjp1,llm) ::
alpha,
beta, pk, pls, y
77 REAL,
DIMENSION(ip1jmp1) :: pks
79 #include "comdissnew.h"
83 REAL,
DIMENSION(iip1,jjp1,llm) :: masse
85 REAL :: xpn, xps,
time, phystep
86 REAL,
DIMENSION(iim) :: xppn, xpps
87 REAL,
DIMENSION(ip1jmp1,llm) :: pbaru, phi, w
88 REAL,
DIMENSION(ip1jm ,llm) :: pbarv
89 REAL,
DIMENSION(klon) :: fder
92 INTEGER :: nid_o2a, iml_omask, jml_omask
93 LOGICAL :: couple=.
false.
94 REAL,
DIMENSION(:,:),
ALLOCATABLE :: lon_omask, lat_omask, ocemask, ocetmp
95 REAL,
DIMENSION(:),
ALLOCATABLE :: dlon_omask,dlat_omask
96 REAL,
DIMENSION(klon) :: ocemask_fi
97 INTEGER,
DIMENSION(klon-2) :: isst
100 LOGICAL :: ok_newmicro, ok_journe, ok_mensuel, ok_instan, ok_hf
101 LOGICAL :: ok_les, ok_ade, ok_aie, ok_cdnc, aerosol_couple, new_aod, callstats
102 INTEGER :: iflag_radia, flag_aerosol
103 LOGICAL :: flag_aerosol_strat
104 REAL :: bl95_b0, bl95_b1, fact_cldcon, facttemps, ratqsbas, ratqshaut
110 INTEGER :: read_climoz
133 CALL
conf_phys( ok_journe, ok_mensuel, ok_instan, ok_hf, ok_les, &
135 solarlong0,seuil_inversion, &
136 fact_cldcon, facttemps,ok_newmicro,iflag_radia, &
138 iflag_ratqs,ratqsbas,ratqshaut,tau_ratqs, &
139 ok_ade, ok_aie, ok_cdnc, aerosol_couple, &
140 flag_aerosol, flag_aerosol_strat, new_aod, &
156 ALLOCATE(q3d(iip1,
jjp1,llm,nqtot))
163 rlat(klon) = - asin(1.0)
175 WRITE(
lunout,*)
'Essai de lecture masque ocean'
176 iret = nf90_open(
"o2a.nc", nf90_nowrite, nid_o2a)
177 IF(iret/=nf90_noerr)
THEN
178 WRITE(
lunout,*)
'ATTENTION!! pas de fichier o2a.nc trouve'
179 WRITE(
lunout,*)
'Run force'
184 WRITE(
lunout,*)
'MASQUE construit : Masque'
185 WRITE(
lunout,
'(97I1)') nint(masque)
187 WHERE( zmasq(:)<epsfra) zmasq(:)=0.
188 WHERE(1.-zmasq(:)<epsfra) zmasq(:)=1.
190 WRITE(
lunout,*)
'ATTENTION!! fichier o2a.nc trouve'
191 WRITE(
lunout,*)
'Run couple'
193 iret=nf90_close(nid_o2a)
194 CALL flininfo(
"o2a.nc", iml_omask, jml_omask, llm_tmp, ttm_tmp, nid_o2a)
195 IF(iml_omask/=
iim .OR.jml_omask/=
jjp1)
THEN
196 WRITE(
lunout,*)
'Dimensions non compatibles pour masque ocean'
197 WRITE(
lunout,*)
'iim = ',
iim,
' iml_omask = ',iml_omask
198 WRITE(
lunout,*)
'jjp1 = ',
jjp1,
' jml_omask = ',jml_omask
200 'Dimensions non compatibles pour masque oc& &ean',1)
202 ALLOCATE( ocemask(iml_omask,jml_omask), ocetmp(iml_omask,jml_omask))
203 ALLOCATE( lon_omask(iml_omask,jml_omask),lat_omask(iml_omask,jml_omask))
204 ALLOCATE(dlon_omask(iml_omask), dlat_omask(jml_omask))
205 CALL flinopen(
"o2a.nc", .
false., iml_omask, jml_omask, llm_tmp, lon_omask,&
206 & lat_omask, lev, ttm_tmp, itaul, date,
dt, fid)
207 CALL flinget(fid,
'OceMask', iml_omask, jml_omask, llm_tmp, ttm_tmp, &
210 dlon_omask(1:iml_omask) = lon_omask(1:iml_omask,1)
211 dlat_omask(1:jml_omask) = lat_omask(1,1:jml_omask)
213 IF(dlat_omask(1)<dlat_omask(jml_omask))
THEN
215 ocemask(:,
j) = ocetmp(:,jml_omask-
j+1)
222 WRITE(fmt,
"(i4,'i1)')")iml_omask ; fmt=
'('//adjustl(fmt)
223 WRITE(
lunout,fmt)int(ocemask)
224 ocemask_fi(1)=ocemask(1,1)
225 DO j=2,jjm; ocemask_fi((
j-2)*
iim+2:(
j-1)*
iim+1)=ocemask(1:
iim,
j);
END DO
226 ocemask_fi(klon)=ocemask(1,
jjp1)
234 x =
'relief'; orog(:,:) = 0.0
235 CALL startget_phys2d(
x,iip1,
jjp1,
rlonv,
rlatu, orog, 0.0,jjm,
rlonu,
rlatv,ib,&
238 x =
'rugosite'; rugo(:,:) = 0.0
239 CALL startget_phys2d(
x,iip1,
jjp1,
rlonv,
rlatu, rugo, 0.0,jjm,
rlonu,
rlatv,ib)
246 x =
'psol'; psol(:,:) = 0.0
247 CALL startget_phys2d(
x,iip1,
jjp1,
rlonv,
rlatu,psol,0.0,jjm,
rlonu,
rlatv,ib)
254 if (pressure_exner)
then
264 x =
'surfgeo';
phis(:,:) = 0.0
265 CALL startget_phys2d(
x,iip1,
jjp1,
rlonv,
rlatu,
phis, 0.0,jjm,
rlonu,
rlatv,ib)
267 x =
'u'; uvent(:,:,:) = 0.0
271 x =
'v'; vvent(:,:,:) = 0.0
272 CALL startget_dyn(
x,
rlonv,
rlatv,pls(:, :jjm, :),y(:, :jjm, :),vvent,0.0, &
275 x =
't'; t3d(:,:,:) = 0.0
279 x =
'tpot'; tpot(:,:,:) = 0.0
283 WRITE(
lunout,*)
'T3D min,max:',minval(t3d(:,:,:)),maxval(t3d(:,:,:))
284 WRITE(
lunout,*)
'PLS min,max:',minval(pls(:,:,:)),maxval(pls(:,:,:))
288 WRITE(
lunout,*)
'avant q_sat'
289 CALL
q_sat(llm*
jjp1*iip1, t3d, pls, qsat)
290 WRITE(
lunout,*)
'apres q_sat'
291 WRITE(
lunout,*)
'QSAT min,max:',minval(qsat(:,:,:)),maxval(qsat(:,:,:))
294 x =
'q'; qd(:,:,:) = 0.0
296 q3d(:,:,:,:) = 0.0 ; q3d(:,:,:,1) = qd(:,:,:)
302 found = tname(
i)==
"O3" .OR. tname(
i)==
"o3"
303 if (found .or.
i == nqtot)
exit
311 q3d(:, :, :,
i) = q3d(:, :, :,
i) * 48. / 29.
317 x =
'tsol';
tsol(:) = 0.0
318 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,
tsol,0.0,jjm,
rlonu,
rlatv,ib)
320 x =
'qsol';
qsol(:) = 0.0
321 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,
qsol,0.0,jjm,
rlonu,
rlatv,ib)
323 x =
'snow'; sn(:) = 0.0
324 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,sn,0.0,jjm,
rlonu,
rlatv,ib)
326 x =
'rads'; radsol(:) = 0.0
327 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,radsol,0.0,jjm,
rlonu,
rlatv,ib)
329 x =
'rugmer'; rugmer(:) = 0.0
330 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,rugmer,0.0,jjm,
rlonu,
rlatv,ib)
332 x =
'zmea'; zmea(:) = 0.0
333 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,zmea,0.0,jjm,
rlonu,
rlatv,ib)
335 x =
'zstd'; zstd(:) = 0.0
336 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,zstd,0.0,jjm,
rlonu,
rlatv,ib)
338 x =
'zsig'; zsig(:) = 0.0
339 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,zsig,0.0,jjm,
rlonu,
rlatv,ib)
341 x =
'zgam'; zgam(:) = 0.0
342 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,zgam,0.0,jjm,
rlonu,
rlatv,ib)
344 x =
'zthe'; zthe(:) = 0.0
345 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,zthe,0.0,jjm,
rlonu,
rlatv,ib)
347 x =
'zpic'; zpic(:) = 0.0
348 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,zpic,0.0,jjm,
rlonu,
rlatv,ib)
350 x =
'zval'; zval(:) = 0.0
351 CALL startget_phys1d(
x,iip1,
jjp1,
rlonv,
rlatu,klon,zval,0.0,jjm,
rlonu,
rlatv,ib)
357 CALL flininfo(
"landiceref.nc", iml_lic, jml_lic, llm_tmp, ttm_tmp, fid)
358 ALLOCATE( lat_lic(iml_lic,jml_lic),lon_lic(iml_lic, jml_lic))
359 ALLOCATE(dlat_lic(jml_lic), dlon_lic(iml_lic))
360 ALLOCATE( fraclic(iml_lic,jml_lic))
361 CALL flinopen(
"landiceref.nc", .
false., iml_lic, jml_lic, llm_tmp, &
362 & lon_lic, lat_lic, lev, ttm_tmp, itaul, date,
dt, fid)
363 CALL flinget(fid,
'landice', iml_lic, jml_lic, llm_tmp, ttm_tmp, 1,1, fraclic)
368 WRITE(
lunout,*)
'dimensions de landice iml_lic, jml_lic : ',iml_lic,jml_lic
370 IF(maxval(lon_lic)>
pi) lon_lic=lon_lic*
pi/180.
371 IF(maxval(lat_lic)>
pi) lat_lic=lat_lic*
pi/180.
372 dlon_lic(:)=lon_lic(:,1)
373 dlat_lic(:)=lat_lic(1,:)
374 CALL
grille_m( iml_lic, jml_lic, dlon_lic, dlat_lic, fraclic,
iim,
jjp1, &
376 flic_tmp(iip1,:)=flic_tmp(1,:)
379 CALL
gr_dyn_fi(1, iip1,
jjp1, klon, flic_tmp, pctsrf(:,is_lic))
382 WHERE(pctsrf(:,is_lic)<epsfra) pctsrf(:,is_lic)=0.
383 WHERE(zmasq(:)<epsfra) pctsrf(:,is_lic)=0.
384 pctsrf(:,is_ter)=zmasq(:)
386 IF(zmasq(ji)>epsfra)
THEN
387 IF(pctsrf(ji,is_lic)>=zmasq(ji))
THEN
388 pctsrf(ji,is_lic)=zmasq(ji)
391 pctsrf(ji,is_ter)=zmasq(ji)-pctsrf(ji,is_lic)
392 IF(pctsrf(ji,is_ter)<epsfra)
THEN
394 pctsrf(ji,is_lic)=zmasq(ji)
402 pctsrf(:,is_oce)=(1.-zmasq(:))
403 WHERE(pctsrf(:,is_oce)<epsfra) pctsrf(:,is_oce)=0.
404 IF(couple) pctsrf(:,is_oce)=ocemask_fi(:)
406 WHERE(pctsrf(2:klon-1,is_oce)>0.) isst=1
410 ji=count((abs(sum(pctsrf(:,:),dim=2))-1.0)>epsfra)
411 IF(ji/=0)
WRITE(
lunout,*)
'pb repartition sous maille pour ',ji,
' points'
417 WRITE(fmt,
"(i4,'i1)')")iip1 ; fmt=
'('//adjustl(fmt)
418 WRITE(
lunout,*)
'MASQUE construit : Masque'
419 WRITE(
lunout,trim(fmt))nint(masque(:,:))
433 q3d(iip1,:,:,:)=q3d(1,:,:,:)
436 IF(.NOT.letat0)
RETURN
442 WRITE(
lunout,*)
'sortie inidissip'
446 iday=dayref+itau/day_step
447 time=float(itau-(iday-dayref)*day_step)/day_step
456 WRITE(
lunout,*)
'sortie geopot'
458 CALL
caldyn0( itau, uvent, vvent, tpot, psol, masse, pk,
phis, &
459 phi, w, pbaru, pbarv,
time+iday-dayref)
460 WRITE(
lunout,*)
'sortie caldyn0'
462 WRITE(
lunout,*)
'sortie dynredem0'
463 CALL
dynredem1(
"start.nc", 0.0, vvent, uvent, tpot, q3d, masse, psol)
464 WRITE(
lunout,*)
'sortie dynredem1'
469 phystep =
dtvr * float(iphysiq)
470 radpas = nint(86400./phystep/ float(
nbapp_rad) )
471 WRITE(
lunout,*)
'phystep =', phystep, radpas
475 DO i=1,nbsrf; ftsol(:,
i) =
tsol;
END DO
476 DO i=1,nbsrf; snsrf(:,
i) = sn;
END DO
477 falb1(:,is_ter) = 0.08; falb1(:,is_lic) = 0.6
478 falb1(:,is_oce) = 0.5; falb1(:,is_sic) = 0.6
481 DO i=1,nbsrf; qsolsrf(:,
i)=150.;
END DO
482 DO i=1,nbsrf;
DO j=1,nsoilmx; tsoil(:,
j,
i) =
tsol;
END do;
END DO
483 rain_fall = 0.; snow_fall = 0.
484 solsw = 165.; sollw = -53.
488 frugs(:,is_oce) = rugmer(:)
489 frugs(:,is_ter) = max(1.0e-05,zstd(:)*zsig(:)/2.0)
490 frugs(:,is_lic) = max(1.0e-05,zstd(:)*zsig(:)/2.0)
491 frugs(:,is_sic) = 0.001
503 pbl_tke(:,:,:) = 1.e-8
508 wake_deltat(:,:) = 0.
509 wake_deltaq(:,:) = 0.