3 SUBROUTINE readaerosol_interp(id_aero, itap, pdtphys, r_day, first, pplay, paprs, t_seri, mass_out, pi_mass_out, load_src)
34 INTEGER,
INTENT(IN) :: id_aero
35 INTEGER,
INTENT(IN) :: itap
36 REAL,
INTENT(IN) :: pdtphys
37 REAL,
INTENT(IN) :: r_day
38 LOGICAL,
INTENT(IN) :: first
39 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: pplay
40 REAL,
DIMENSION(klon,klev+1),
INTENT(IN):: paprs
41 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: t_seri
45 REAL,
INTENT(OUT) :: mass_out(
klon,
klev)
46 REAL,
INTENT(OUT) :: pi_mass_out(
klon,
klev)
47 REAL,
INTENT(OUT) :: load_src(
klon)
52 INTEGER :: iday, iyr, lmt_pas
56 INTEGER :: pi_klev_src
57 INTEGER,
SAVE :: klev_src
62 REAL,
DIMENSION(klon) :: psurf_day, pi_psurf_day
63 REAL,
DIMENSION(klon) :: pi_load_src
64 REAL,
DIMENSION(klon) :: load_tgt, load_tgt_test
65 REAL,
DIMENSION(klon,klev) :: delp
67 REAL,
ALLOCATABLE,
DIMENSION(:,:) :: pplay_src
68 REAL,
ALLOCATABLE,
DIMENSION(:,:) :: tmp1, tmp2
69 REAL,
ALLOCATABLE,
DIMENSION(:,:,:,:),
SAVE :: var_year
70 REAL,
ALLOCATABLE,
DIMENSION(:,:,:,:),
SAVE :: pi_var_year
72 REAL,
ALLOCATABLE,
DIMENSION(:,:,:),
SAVE :: var_day
73 REAL,
ALLOCATABLE,
DIMENSION(:,:,:),
SAVE :: pi_var_day
75 REAL,
ALLOCATABLE,
DIMENSION(:,:,:),
SAVE :: psurf_year, pi_psurf_year
77 REAL,
ALLOCATABLE,
DIMENSION(:,:,:),
SAVE :: load_year, pi_load_year
80 REAL,
DIMENSION(:,:,:),
POINTER :: pt_tmp
81 REAL,
POINTER,
DIMENSION(:),
SAVE :: pt_ap, pt_b
83 INTEGER,
SAVE :: nbr_tsteps
84 REAL,
DIMENSION(14),
SAVE :: month_len, month_start, month_mid
90 LOGICAL,
SAVE :: vert_interp
91 LOGICAL,
SAVE :: debug=.
false.
93 CHARACTER(len=8) :: type
94 CHARACTER(len=8) :: filename
104 IF(mpi_rank == 0 .AND. debug )
then
105 print*,
'CONTROL PANEL REGARDING TIME STEPING'
118 CALL ymds2ju(iyr, im, iday, 0., jday)
122 IF(mod(itap-1,nint(86400./pdtphys)) == 0)
THEN
128 IF(mpi_rank == 0 .AND. debug)
then
130 oldnewday = (r_day-
REAL(iday) < 0.02)
132 lmt_pas = nint(86400./pdtphys)
133 print*,
'r_day-REAL(iday) =',r_day-
REAL(iday)
135 print*,
'pdtphys =',pdtphys
136 print*,
'lmt_pas =',lmt_pas
138 print*,
'r_day =',r_day
142 print*,
'NINT(86400./pdtphys) =',nint(86400./pdtphys)
143 print*,
'MOD(0,1) =',mod(0,1)
144 print*,
'lnewday =',lnewday
145 print*,
'OLDNEWDAY =',oldnewday
148 IF (.NOT.
ALLOCATED(var_day))
THEN
150 IF (ierr /= 0)
CALL abort_physic(
'readaerosol_interp',
'pb in allocation 1',1)
152 IF (ierr /= 0)
CALL abort_physic(
'readaerosol_interp',
'pb in allocation 2',1)
155 IF (ierr /= 0)
CALL abort_physic(
'readaerosol_interp',
'pb in allocation 3',1)
158 IF (ierr /= 0)
CALL abort_physic(
'readaerosol_interp',
'pb in allocation 4',1)
171 IF ( (first .OR. iday==0) .AND. lnewday )
THEN
177 IF (aer_type==
'preind' .OR. aer_type==
'actuel' .OR. aer_type==
'annuel' .OR. aer_type==
'scenario')
THEN
181 ELSE IF (aer_type ==
'mix1')
THEN
183 IF (name_aero(id_aero) ==
'SO4')
THEN
190 ELSE IF (aer_type ==
'mix2')
THEN
192 IF (name_aero(id_aero) ==
'SO4')
THEN
199 ELSE IF (aer_type ==
'mix3')
THEN
201 IF (name_aero(id_aero) ==
'SO4')
THEN
209 CALL abort_physic(
'readaerosol_interp',
'this aer_type not supported',1)
212 CALL readaerosol(name_aero(id_aero),
type, filename, iyr, klev_src, pt_ap, pt_b, pt_tmp, &
213 psurf_year(:,:,id_aero), load_year(:,:,id_aero))
214 IF (.NOT.
ALLOCATED(var_year))
THEN
216 IF (ierr /= 0)
CALL abort_physic(
'readaerosol_interp',
'pb in allocation 5',1)
218 var_year(:,:,:,id_aero) = pt_tmp(:,:,:)
222 CALL readaerosol(name_aero(id_aero),
type, filename, iyr, pi_klev_src, pt_ap, pt_b, pt_tmp, &
223 pi_psurf_year(:,:,id_aero), pi_load_year(:,:,id_aero))
227 IF (pi_klev_src /= klev_src)
THEN
228 WRITE(
lunout,*)
'Error! All forcing files for the same aerosol must have the same vertical dimension'
229 WRITE(
lunout,*)
'Aerosol : ', name_aero(id_aero)
230 CALL abort_physic(
'readaerosol_interp',
'Differnt vertical axes in aerosol forcing files',1)
233 IF (.NOT.
ALLOCATED(pi_var_year))
THEN
234 ALLOCATE(pi_var_year(
klon, klev_src, 12,
naero_spc), stat=ierr)
235 IF (ierr /= 0)
CALL abort_physic(
'readaerosol_interp',
'pb in allocation 6',1)
237 pi_var_year(:,:,:,id_aero) = pt_tmp(:,:,:)
240 CALL writefield_phy(
'var_year_jan',var_year(:,:,1,id_aero),klev_src)
241 CALL writefield_phy(
'var_year_dec',var_year(:,:,12,id_aero),klev_src)
245 CALL writefield_phy(
'pi_load_year_src',pi_load_year(:,:,id_aero),1)
252 IF (psurf_year(1,1,id_aero)==
not_valid .OR. pi_psurf_year(1,1,id_aero)==
not_valid )
THEN
254 vert_interp = .
false.
257 IF ( psurf_year(1,1,id_aero) /= pi_psurf_year(1,1,id_aero) )
THEN
258 WRITE(
lunout,*)
'Warning! All forcing files for the same aerosol must have the same structure'
259 CALL abort_physic(
'readaerosol_interp',
'The aerosol files have not the same format',1)
262 IF (
klev /= klev_src)
THEN
263 WRITE(
lunout,*)
'Old format of aerosol file do not allowed vertical interpolation'
264 CALL abort_physic(
'readaerosol_interp',
'Old aerosol file not possible',1)
274 month_len(i) =
REAL(ioget_mon_len(
year_cur, i-1))
277 month_len(1) =
REAL(ioget_mon_len(
year_cur-1, 12))
279 month_len(14) =
REAL(ioget_mon_len(
year_cur+1, 1))
281 month_mid(:) = month_start(:) + month_len(:)/2.
284 write(
lunout,*)
' month_len = ',month_len
285 write(
lunout,*)
' month_mid = ',month_mid
303 IF (nbr_tsteps == 12)
then
304 IF (jday < month_mid(im+1))
THEN
306 day2 = month_mid(im2+1)
307 day1 = month_mid(im+1)
315 day2 = month_mid(im+1)
316 day1 = month_mid(im2+1)
322 ELSE IF (nbr_tsteps == 14)
then
324 IF (jday < month_mid(im))
THEN
327 day2 = month_mid(im2)
333 day1 = month_mid(im2)
336 CALL abort_physic(
'readaerosol_interp',
'number of months undefined',1)
339 write(
lunout,*)
' jDay, day1, day2, im, im2 = ', jday, day1, day2, im, im2
344 ALLOCATE(tmp1(
klon,klev_src), tmp2(
klon,klev_src),stat=ierr)
345 IF (ierr /= 0)
CALL abort_physic(
'readaerosol_interp',
'pb in allocation 7',1)
347 ALLOCATE(pplay_src(
klon,klev_src), stat=ierr)
348 IF (ierr /= 0)
CALL abort_physic(
'readaerosol_interp',
'pb in allocation 8',1)
354 var_year(i,k,im2,id_aero) - (jday-day2)/(day1-day2) * &
355 (var_year(i,k,im2,id_aero) - var_year(i,k,im,id_aero))
358 pi_var_year(i,k,im2,id_aero) - (jday-day2)/(day1-day2) * &
359 (pi_var_year(i,k,im2,id_aero) - pi_var_year(i,k,im,id_aero))
366 psurf_year(i,im2,id_aero) - (jday-day2)/(day1-day2) * &
367 (psurf_year(i,im2,id_aero) - psurf_year(i,im,id_aero))
370 pi_psurf_year(i,im2,id_aero) - (jday-day2)/(day1-day2) * &
371 (pi_psurf_year(i,im2,id_aero) - pi_psurf_year(i,im,id_aero))
377 load_year(i,im2,id_aero) - (jday-day2)/(day1-day2) * &
378 (load_year(i,im2,id_aero) - load_year(i,im,id_aero))
381 pi_load_year(i,im2,id_aero) - (jday-day2)/(day1-day2) * &
382 (pi_load_year(i,im2,id_aero) - pi_load_year(i,im,id_aero))
390 IF (vert_interp)
THEN
398 pplay_src(i,k)= pt_ap(k) + pt_b(k)*psurf_day(i)
411 CALL pres2lev(tmp1(:,:), var_day(:,:,id_aero), klev_src,
klev, pplay_src, pplay, &
423 delp(i,k) = paprs(i,k) - paprs(i,k+1)
431 zrho = pplay(i,k)/t_seri(i,k)/rd
432 volm = var_day(i,k,id_aero)*1.e-9/zrho
433 load_tgt(i) = load_tgt(i) + 1/
rg * volm *delp(i,k)
440 var_day(i,k,id_aero) = var_day(i,k,id_aero)*load_src(i)/load_tgt(i)
445 load_tgt_test(:) = 0.
448 zrho = pplay(i,k)/t_seri(i,k)/rd
449 volm = var_day(i,k,id_aero)*1.e-9/zrho
450 load_tgt_test(i) = load_tgt_test(i) + 1/
rg * volm*delp(i,k)
465 pplay_src(i,k)= pt_ap(k) + pt_b(k)*pi_psurf_day(i)
475 CALL pres2lev(tmp2(:,:), pi_var_day(:,:,id_aero), klev_src,
klev, pplay_src, pplay, &
488 zrho = pplay(i,k)/t_seri(i,k)/rd
489 volm = pi_var_day(i,k,id_aero)*1.e-9/zrho
490 load_tgt(i) = load_tgt(i) + 1/
rg * volm * delp(i,k)
496 pi_var_day(i,k,id_aero) = pi_var_day(i,k,id_aero)*pi_load_src(i)/load_tgt(i)
501 load_tgt_test(:) = 0.
504 zrho = pplay(i,k)/t_seri(i,k)/rd
505 volm = pi_var_day(i,k,id_aero)*1.e-9/zrho
506 load_tgt_test(i) = load_tgt_test(i) + 1/
rg * volm * delp(i,k)
518 var_day(:,:,id_aero) = tmp1(:,:)
519 pi_var_day(:,:,id_aero) = tmp2(:,:)
525 DEALLOCATE(tmp1, tmp2, pplay_src, stat=ierr)
531 IF (minval(var_day(:,:,id_aero)) < 0.)
THEN
535 IF (var_day(i,k,id_aero) < 0.)
THEN
536 IF (jday-day2 < 0.)
WRITE(
lunout,*)
'jDay-day2=',jday-day2
537 IF (var_year(i,k,im2,id_aero) - var_year(i,k,im,id_aero) < 0.)
THEN
538 WRITE(
lunout,*) trim(name_aero(id_aero)),
'(i,k,im2)-', &
539 trim(name_aero(id_aero)),
'(i,k,im)=', &
540 var_year(i,k,im2,id_aero) - var_year(i,k,im,id_aero)
542 WRITE(
lunout,*)
'stop for aerosol : ',name_aero(id_aero)
543 WRITE(
lunout,*)
'day1, day2, jDay = ', day1, day2, jday
544 CALL abort_physic(
'readaerosol_interp',
'Error in interpolation 1',1)
550 IF (minval(pi_var_day(:,:,id_aero)) < 0. )
THEN
554 IF (pi_var_day(i,k,id_aero) < 0.)
THEN
555 IF (jday-day2 < 0.)
WRITE(
lunout,*)
'jDay-day2=',jday-day2
556 IF (pi_var_year(i,k,im2,id_aero) - pi_var_year(i,k,im,id_aero) < 0.)
THEN
557 WRITE(
lunout,*) trim(name_aero(id_aero)),
'(i,k,im2)-', &
558 trim(name_aero(id_aero)),
'(i,k,im)=', &
559 pi_var_year(i,k,im2,id_aero) - pi_var_year(i,k,im,id_aero)
562 WRITE(
lunout,*)
'stop for aerosol : ',name_aero(id_aero)
563 CALL abort_physic(
'readaerosol_interp',
'Error in interpolation 2',1)
576 mass_out(:,:) = var_day(:,:,id_aero)
577 pi_mass_out(:,:) = pi_var_day(:,:,id_aero)
!$Id zjulian!correction pour l heure initiale!jyg!jyg CALL ymds2ju(annee_ref, 1, day_ref, hour, zjulian)!jyg CALL histbeg_phy("histrac"
subroutine pres2lev(varo, varn, lmo, lmn, po, pn, ni, nj, ok_invertp)
!$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
subroutine readaerosol_interp(id_aero, itap, pdtphys, r_day, first, pplay, paprs, t_seri, mass_out, pi_mass_out, load_src)
!$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 naero_spc
subroutine writefield_phy(name, Field, ll)
subroutine readaerosol(name_aero, type, filename, iyr_in, klev_src, pt_ap, pt_b, pt_out, psurf, load)
subroutine abort_physic(modname, message, ierr)
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout