5 REAL,
SAVE :: not_valid=-333.
9 SUBROUTINE readaerosol(name_aero, type, filename, iyr_in, klev_src, pt_ap, pt_b, pt_out, psurf, load)
28 CHARACTER(len=7),
INTENT(IN) :: name_aero
29 CHARACTER(len=*),
INTENT(IN) :: type
30 CHARACTER(len=8),
INTENT(IN) :: filename
31 INTEGER,
INTENT(IN) :: iyr_in
34 INTEGER,
INTENT(OUT) :: klev_src
35 REAL,
POINTER,
DIMENSION(:) :: pt_ap
36 REAL,
POINTER,
DIMENSION(:) :: pt_b
37 REAL,
POINTER,
DIMENSION(:,:,:) :: pt_out
38 REAL,
DIMENSION(klon,12),
INTENT(OUT) ::
psurf
39 REAL,
DIMENSION(klon,12),
INTENT(OUT) :: load
42 CHARACTER(len=4) :: cyear
43 REAL,
POINTER,
DIMENSION(:,:,:) :: pt_2
44 REAL,
DIMENSION(klon,12) :: psurf2, load2
46 INTEGER :: iyr1, iyr2, klev_src2
48 LOGICAL,
PARAMETER :: lonlyone=.false.
55 IF (
type ==
'actuel') then
64 ELSE IF (
type ==
'preind') then
72 ELSE IF (
type ==
'annuel') then
75 WRITE(cyear,
'(I4)') iyr_in
76 WRITE(
lunout,*)
'get_aero 3 iyr_in=', iyr_in,
' ',cyear
81 ELSE IF (
type ==
'scenario') then
84 IF (iyr_in .LT. 1850)
THEN
86 WRITE(
lunout,*)
'get_aero 1 iyr_in=', iyr_in,
' ',cyear
91 ELSE IF (iyr_in .GE. 2100)
THEN
93 WRITE(
lunout,*)
'get_aero 2 iyr_in=', iyr_in,
' ',cyear
101 IF (iyr_in.LT.1900)
THEN
104 ELSE IF (iyr_in.GE.1900.AND.iyr_in.LT.1920)
THEN
108 iyr1 = int(iyr_in/10)*10
109 iyr2 = int(1+iyr_in/10)*10
112 WRITE(cyear,
'(I4)') iyr1
113 WRITE(
lunout,*)
'get_aero 3 iyr_in=', iyr_in,
' ',cyear
119 IF (.NOT.lonlyone)
THEN
122 WRITE(cyear,
'(I4)') iyr2
123 WRITE(
lunout,*)
'get_aero 4 iyr_in=', iyr_in,
' ',cyear
128 CALL
get_aero_fromfile(name_aero, cyear, filename, klev_src2, pt_ap, pt_b, p0, pt_2, psurf2, load2)
130 IF (klev_src /= klev_src2)
THEN
131 WRITE(
lunout,*)
'Two aerosols files with different number of vertical levels is not allowded'
132 CALL
abort_gcm(
'readaersosol',
'Error in number of vertical levels',1)
140 pt_out(
i,
k,
it) -
REAL(iyr_in-iyr1)/
REAL(iyr2-iyr1) * &
147 psurf(
i,
it) -
REAL(iyr_in-iyr1)/
REAL(iyr2-iyr1) * &
151 load(
i,
it) -
REAL(iyr_in-iyr1)/
REAL(iyr2-iyr1) * &
152 (load(
i,
it) - load2(
i,
it))
163 WRITE(
lunout,*)
'This option is not implemented : aer_type = ', type,
' name_aero=',name_aero
164 CALL
abort_gcm(
'readaerosol',
'Error : aer_type parameter not accepted',1)
171 SUBROUTINE get_aero_fromfile(varname, cyr, filename, klev_src, pt_ap, pt_b, p0, pt_year, psurf_out, load_out)
193 USE iophy, ONLY : io_lon, io_lat
197 include
"dimensions.h"
201 CHARACTER(len=7),
INTENT(IN) :: varname
202 CHARACTER(len=4),
INTENT(IN) :: cyr
203 CHARACTER(len=8),
INTENT(IN) :: filename
206 INTEGER,
INTENT(OUT) :: klev_src
207 REAL,
POINTER,
DIMENSION(:) :: pt_ap
208 REAL,
POINTER,
DIMENSION(:) :: pt_b
210 REAL,
POINTER,
DIMENSION(:,:,:) :: pt_year
211 REAL,
DIMENSION(klon,12),
INTENT(OUT) :: psurf_out
212 REAL,
DIMENSION(klon,12),
INTENT(OUT) :: load_out
213 INTEGER :: nbr_tsteps
216 CHARACTER(len=30) :: fname
217 CHARACTER(len=30) :: cvar
218 INTEGER :: ncid, dimid, varid
219 INTEGER :: imth,
i,
j,
k, ierr
221 REAL,
ALLOCATABLE,
DIMENSION(:,:,:) :: varmth
222 REAL,
ALLOCATABLE,
DIMENSION(:,:,:,:) :: varyear
223 REAL,
ALLOCATABLE,
DIMENSION(:,:,:) :: varyear_glo1d
224 REAL,
ALLOCATABLE,
DIMENSION(:) :: varktmp
226 REAL,
DIMENSION(iim,jjm+1,12) :: psurf_glo2d
227 REAL,
DIMENSION(klon_glo,12) :: psurf_glo1d
228 REAL,
DIMENSION(iim,jjm+1,12) :: load_glo2d
229 REAL,
DIMENSION(klon_glo,12) :: load_glo1d
230 REAL,
DIMENSION(iim,jjm+1) :: vartmp
231 REAL,
DIMENSION(iim) :: lon_src
232 REAL,
DIMENSION(jjm+1) :: lat_src, lat_src_inv
238 IF (
ASSOCIATED(pt_ap))
DEALLOCATE(pt_ap)
239 IF (
ASSOCIATED(pt_b))
DEALLOCATE(pt_b)
241 IF (is_mpi_root .AND. is_omp_root)
THEN
246 fname = trim(filename)//cyr//
'.nc'
248 WRITE(
lunout,*)
'reading variable ',trim(varname),
' in file ', trim(fname)
249 CALL
check_err( nf90_open(trim(fname), nf90_nowrite, ncid),
"pb open "//trim(varname) )
254 CALL
check_err( nf90_inq_varid(ncid,
'lon', varid),
"pb inq lon" )
255 CALL
check_err( nf90_get_var(ncid, varid, lon_src(:)),
"pb get lon" )
257 IF (maxval(abs(lon_src - io_lon)) > 0.001)
THEN
258 WRITE(
lunout,*)
'Problem in longitudes read from file : ',trim(fname)
259 WRITE(
lunout,*)
'longitudes in file ', trim(fname),
' : ', lon_src
260 WRITE(
lunout,*)
'longitudes in model :', io_lon
262 CALL
abort_gcm(
'get_aero_fromfile',
'longitudes are not the same in file and model',1)
266 CALL
check_err( nf90_inq_varid(ncid,
'lat', varid),
"pb inq lat" )
267 CALL
check_err( nf90_get_var(ncid, varid, lat_src(:)),
"pb get lat" )
271 lat_src_inv(
j) = lat_src(jjm+1 +1 -
j)
274 IF (maxval(abs(lat_src - io_lat)) < 0.001)
THEN
277 ELSE IF (maxval(abs(lat_src_inv - io_lat)) < 0.001)
THEN
279 WRITE(
lunout,*)
'latitudes will be inverted for file : ',trim(fname)
282 WRITE(
lunout,*)
'Problem in latitudes read from file : ',trim(fname)
283 WRITE(
lunout,*)
'latitudes in file ', trim(fname),
' : ', lat_src
284 WRITE(
lunout,*)
'latitudes in model :', io_lat
285 CALL
abort_gcm(
'get_aero_fromfile',
'latitudes do not correspond between file and model',1)
293 ierr = nf90_inq_dimid(ncid,
'lev', dimid)
294 IF (ierr /= nf90_noerr)
THEN
296 ierr = nf90_inq_dimid(ncid,
'PRESNIVS', dimid)
297 IF (ierr /= nf90_noerr)
THEN
299 CALL
abort_gcm(
'get_aero_fromfile',
'dimension lev or presnivs not in file',1)
303 WRITE(
lunout,*)
'Vertical interpolation for ',trim(varname),
' will not be done'
308 WRITE(
lunout,*)
'Vertical interpolation for ',trim(varname),
' will be done'
313 CALL
check_err( nf90_inquire_dimension(ncid, dimid, len = klev_src),
"pb inq dim for PRESNIVS or lev" )
316 ALLOCATE(varmth(
iim, jjm+1, klev_src), varyear(
iim, jjm+1, klev_src, 12), stat=ierr)
317 IF (ierr /= 0) CALL
abort_gcm(
'get_aero_fromfile',
'pb in allocation 1',1)
319 ALLOCATE(pt_ap(klev_src), pt_b(klev_src), varktmp(klev_src), stat=ierr)
320 IF (ierr /= 0) CALL
abort_gcm(
'get_aero_fromfile',
'pb in allocation 2',1)
331 ierr = nf90_inq_dimid(ncid,
'TIME',dimid)
332 CALL
check_err( nf90_inquire_dimension(ncid, dimid, len = nbr_tsteps),
"pb inq dim TIME" )
334 IF (nbr_tsteps /= 12 )
THEN
335 CALL
abort_gcm(
'get_aero_fromfile',
'not the right number of months in aerosol file read (should be 12 for the moment)',1)
341 CALL
check_err( nf90_inq_varid(ncid, trim(varname), varid),
"pb inq var "//trim(varname) )
344 CALL
check_err( nf90_get_var(ncid, varid, varyear(:,:,:,:)),
"pb get var "//trim(varname) )
349 CALL
check_err( nf90_inq_varid(ncid,
"ps", varid),
"pb inq var ps" )
351 CALL
check_err( nf90_get_var(ncid, varid, psurf_glo2d),
"pb get var ps" )
356 CALL
check_err( nf90_inq_varid(ncid,
"load_"//trim(varname), varid) ,
"pb inq var load_"//trim(varname))
358 CALL
check_err( nf90_get_var(ncid, varid, load_glo2d),
"pb get var load_"//trim(varname) )
363 CALL
check_err( nf90_inq_varid(ncid,
"ap", varid),
"pb inq var ap" )
365 CALL
check_err( nf90_get_var(ncid, varid, pt_ap),
"pb get var ap" )
370 CALL
check_err( nf90_inq_varid(ncid,
"b", varid),
"pb inq var b" )
372 CALL
check_err( nf90_get_var(ncid, varid, pt_b),
"pb get var b" )
377 CALL
check_err( nf90_inq_varid(ncid,
"p0", varid),
"pb inq var p0" )
379 CALL
check_err( nf90_get_var(ncid, varid, p0),
"pb get var p0" )
388 cvar=trim(varname)//
'JAN'
389 ELSE IF (imth.EQ.2)
THEN
390 cvar=trim(varname)//
'FEB'
391 ELSE IF (imth.EQ.3)
THEN
392 cvar=trim(varname)//
'MAR'
393 ELSE IF (imth.EQ.4)
THEN
394 cvar=trim(varname)//
'APR'
395 ELSE IF (imth.EQ.5)
THEN
396 cvar=trim(varname)//
'MAY'
397 ELSE IF (imth.EQ.6)
THEN
398 cvar=trim(varname)//
'JUN'
399 ELSE IF (imth.EQ.7)
THEN
400 cvar=trim(varname)//
'JUL'
401 ELSE IF (imth.EQ.8)
THEN
402 cvar=trim(varname)//
'AUG'
403 ELSE IF (imth.EQ.9)
THEN
404 cvar=trim(varname)//
'SEP'
405 ELSE IF (imth.EQ.10)
THEN
406 cvar=trim(varname)//
'OCT'
407 ELSE IF (imth.EQ.11)
THEN
408 cvar=trim(varname)//
'NOV'
409 ELSE IF (imth.EQ.12)
THEN
410 cvar=trim(varname)//
'DEC'
414 CALL
check_err( nf90_inq_varid(ncid, trim(cvar), varid),
"pb inq var "//trim(cvar) )
417 CALL
check_err( nf90_get_var(ncid, varid, varmth),
"pb get var "//trim(cvar) )
420 varyear(:,:,:,imth)=varmth(:,:,:)
425 psurf_glo2d(:,:,:) = not_valid
426 load_glo2d(:,:,:) = not_valid
434 CALL
check_err( nf90_close(ncid),
"pb in close" )
441 IF ((pt_b(1) < pt_b(klev_src)) .OR. .NOT. new_file)
THEN
448 varmth(:,:,:) = varyear(:,:,:,imth)
452 varyear(
i,
j,
k,imth) = varmth(
i,
j,klev_src+1-
k)
459 varktmp(:) = pt_ap(:)
461 pt_ap(
k) = varktmp(klev_src+1-
k)
466 pt_b(
k) = varktmp(klev_src+1-
k)
468 WRITE(
lunout,*)
'after pt_ap = ', pt_ap
469 WRITE(
lunout,*)
'after pt_b = ', pt_b
472 WRITE(
lunout,*)
'Vertical axis in file ',trim(fname),
' is ok, no vertical inversion is done'
473 WRITE(
lunout,*)
'pt_ap = ', pt_ap
474 WRITE(
lunout,*)
'pt_b = ', pt_b
482 varmth(:,:,:) = varyear(:,:,:,imth)
486 varyear(
i,
j,
k,imth) = varmth(
i,jjm+1+1-
j,
k)
492 vartmp(:,:) = psurf_glo2d(:,:,imth)
495 psurf_glo2d(
i,
j,imth)= vartmp(
i,jjm+1+1-
j)
500 vartmp(:,:) = load_glo2d(:,:,imth)
503 load_glo2d(
i,
j,imth)= vartmp(
i,jjm+1+1-
j)
513 npole = npole + varyear(
i,1,
k,imth)
514 spole = spole + varyear(
i,jjm+1,
k,imth)
516 npole = npole/
REAL(
iim)
517 spole = spole/
REAL(
iim)
518 varyear(:,1,
k,imth) = npole
519 varyear(:,jjm+1,
k,imth) = spole
523 ALLOCATE(varyear_glo1d(klon_glo, klev_src, 12), stat=ierr)
524 IF (ierr /= 0) CALL
abort_gcm(
'get_aero_fromfile',
'pb in allocation 3',1)
532 ALLOCATE(varyear_glo1d(0,0,0))
546 IF (.NOT.
ASSOCIATED(pt_ap))
THEN
547 ALLOCATE(pt_ap(klev_src), pt_b(klev_src), stat=ierr)
548 IF (ierr /= 0) CALL
abort_gcm(
'get_aero_fromfile',
'pb in allocation 4',1)
554 IF (
ASSOCIATED(pt_year))
DEALLOCATE(pt_year)
555 ALLOCATE(pt_year(klon, klev_src, 12), stat=ierr)
556 IF (ierr /= 0) CALL
abort_gcm(
'get_aero_fromfile',
'pb in allocation 5',1)
559 CALL
scatter(varyear_glo1d, pt_year)
560 CALL
scatter(psurf_glo1d, psurf_out)
561 CALL
scatter(load_glo1d, load_out)
565 IF (minval(pt_year) < 0.)
THEN
566 WRITE(
lunout,*)
'Warning! Negative values read from file :', fname
577 INTEGER,
INTENT (IN) :: status
578 CHARACTER(len=*),
INTENT (IN),
OPTIONAL :: text
580 IF (status /= nf90_noerr)
THEN
581 WRITE(
lunout,*)
'Error in get_aero_fromfile, netcdf error code = ',status
582 IF (present(text))
THEN
583 WRITE(
lunout,*)
'Error in get_aero_fromfile : ',text
585 CALL
abort_gcm(
'get_aero_fromfile',trim(nf90_strerror(status)),1)