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