Ignore:
Timestamp:
Sep 24, 2016, 7:14:59 PM (8 years ago)
Author:
oboucher
Message:

Quicker way to compute aerosol optical properties.
Does not converge with previous version but results are close.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/rrtm/aeropt_5wv_rrtm.F90

    r2550 r2634  
    9494  REAL :: od670aer(klon)  ! epaisseur optique aerosol extinction 670 nm
    9595  REAL :: fac
    96   REAL :: zdp1(klon,klev)
    9796  INTEGER, ALLOCATABLE, DIMENSION(:)  :: aerosol_name
    9897  INTEGER :: nb_aer, itau
    9998  LOGICAL :: ok_itau
    10099 
    101   REAL :: dh(KLON,KLEV)
     100  REAL :: zdh(klon,klev)
    102101 
    103102   ! Soluble components 1- BC soluble; 2- POM soluble; 3- SO4 acc.; 4- SO4 coarse; 5 seasalt super-coarse; 6 seasalt coarse; 7 seasalt acc.
     
    106105  REAL :: alpha_aeri_5wv(las,naero_insoluble)         ! Ext. coeff. ** m2/g
    107106
    108   REAL, DIMENSION(klon,klev,naero_tot) :: mass_temp
    109  
    110107  !
    111108  ! Proprietes optiques
    112109  !
    113110  REAL :: fact_RH(nbre_RH)
    114   LOGICAL :: used_tau(naero_tot)
    115111  INTEGER :: n
    116112
     
    209205  ai(:) = 0.
    210206  tausum(:,:,:) = 0.
     207  tau(:,:,:,:)=0.
    211208
    212209  DO k=1, klev
    213210    DO i=1, klon
    214211      zrho=pplay(i,k)/t_seri(i,k)/RD                  ! kg/m3
    215       dh(i,k)=pdel(i,k)/(RG*zrho)
    216 !CDIR UNROLL=naero_spc
    217       mass_temp(i,k,:) = m_allaer(i,k,:) / zrho / 1.e+9
    218       zdp1(i,k)=pdel(i,k)/(RG*delt)     ! air mass auxiliary  variable --> zdp1 [kg/(m^2 *s)]
     212      zdh(i,k)=pdel(i,k)/(RG*zrho)                    ! m
    219213    ENDDO
    220214  ENDDO
     
    270264  !     
    271265
    272 !CDIR ON_ADB(RH_tab)
    273 !CDIR ON_ADB(fact_RH)
    274 !CDIR NOVECTOR
    275266  DO n=1,nbre_RH-1
    276267    fact_RH(n)=1./(RH_tab(n+1)-RH_tab(n))
    277268  ENDDO
    278269   
    279   DO k=1, KLEV
    280 !CDIR ON_ADB(RH_tab)
    281 !CDIR ON_ADB(fact_RH)
    282     DO i=1, KLON
     270  DO k=1, klev
     271    DO i=1, klon
    283272      rh(i,k)=MIN(RHcl(i,k)*100.,RH_MAX)
    284273      RH_num(i,k) = INT( rh(i,k)/10. + 1.)
     
    289278  ENDDO
    290279
    291 !CDIR SHORTLOOP 
    292   used_tau(:)=.FALSE.
    293    
    294280  DO m=1,nb_aer   ! tau is only computed for each mass   
    295281    fac=1.0
     
    330316    ENDIF
    331317
    332     IF (soluble) then
    333       used_tau(spsol)=.TRUE.
    334     ELSE
    335       used_tau(naero_soluble+spinsol)=.TRUE.
    336     ENDIF
    337 
    338318    aerindex=aerosol_name(m)
    339319
    340320    DO la=1,las
    341321
     322    !--only 550, 670 and 865 nm are used
     323    IF (la.NE.la550.AND.la.NE.la670.AND.la.NE.la865) CYCLE
     324
    342325      IF (soluble) THEN            ! For soluble aerosol
    343326
    344           DO k=1, KLEV
    345             DO i=1, KLON
     327          DO k=1, klev
     328            DO i=1, klon
    346329              tau_ae5wv_int = alpha_aers_5wv(RH_num(i,k),la,spsol)+DELTA(i,k)* &
    347330                             (alpha_aers_5wv(RH_num(i,k)+1,la,spsol) - &
    348331                              alpha_aers_5wv(RH_num(i,k),la,spsol))
    349               tau(i,k,la,aerindex) = mass_temp(i,k,aerindex)*1000.*zdp1(i,k)*   &
    350                                     tau_ae5wv_int*delt*fac
     332              tau(i,k,la,aerindex) = m_allaer(i,k,aerindex)/1.e6*zdh(i,k)*tau_ae5wv_int*fac
    351333              tausum(i,la,aerindex)=tausum(i,la,aerindex)+tau(i,k,la,aerindex)
    352334            ENDDO
     
    355337      ELSE                         ! For insoluble aerosol
    356338
    357         DO k=1, KLEV
    358           DO i=1, KLON
     339        DO k=1, klev
     340          DO i=1, klon
    359341            tau_ae5wv_int = alpha_aeri_5wv(la,spinsol)
    360             tau(i,k,la,aerindex) = mass_temp(i,k,aerindex)*1000.*zdp1(i,k)* &
    361                                    tau_ae5wv_int*delt*fac
     342            tau(i,k,la,aerindex) = m_allaer(i,k,aerindex)/1.e6*zdh(i,k)*tau_ae5wv_int*fac
    362343            tausum(i,la,aerindex)= tausum(i,la,aerindex)+tau(i,k,la,aerindex)
    363344          ENDDO
     
    369350  ENDDO     ! Boucle sur les masses de traceurs
    370351
    371   DO m=1,naero_tot
    372     IF (.NOT.used_tau(m)) tau(:,:,:,m)=0.
    373   ENDDO 
    374 
    375   DO i=1, klon
    376      od550aer(i)=0.
    377      DO m=1,naero_tot
    378         od550aer(i)=od550aer(i)+tausum(i,la550,m)
    379      END DO
    380   END DO
    381 
    382   DO i=1, klon
    383      od670aer(i)=0.
    384      DO m=1,naero_tot
    385         od670aer(i)=od670aer(i)+tausum(i,la670,m)
    386      END DO
    387   END DO
    388 
    389   DO i=1, klon
    390      od865aer(i)=0.
    391      DO m=1,naero_tot
    392         od865aer(i)=od865aer(i)+tausum(i,la865,m)
    393      END DO
    394   END DO
    395 
    396   DO i=1, klon
    397      DO k=1, KLEV
    398         ec550aer(i,k)=0.
    399         DO m=1,naero_tot
    400            ec550aer(i,k)=ec550aer(i,k)+tau(i,k,la550,m)/dh(i,k)
    401         END DO
    402      END DO
    403   END DO
    404  
    405   DO i=1, klon
    406     ai(i)=-LOG(MAX(od670aer(i),1.e-8)/MAX(od865aer(i),1.e-8))/LOG(670./865.)
    407   ENDDO
     352!--AOD calculations for diagnostics
     353  od550aer(:)=SUM(tausum(:,la550,:),dim=2)
     354  od670aer(:)=SUM(tausum(:,la670,:),dim=2)
     355  od865aer(:)=SUM(tausum(:,la865,:),dim=2)
     356
     357!--extinction coefficient for diagnostic
     358  ec550aer(:,:)=SUM(tau(:,:,la550,:),dim=3)/zdh(:,:)
     359
     360!--aerosol index
     361  ai(:)=-LOG(MAX(od670aer(:),1.e-8)/MAX(od865aer(:),1.e-8))/LOG(670./865.)
    408362
    409363  od550lt1aer(:)=tausum(:,la550,id_ASSO4M_phy)+tausum(:,la550,id_ASBCM_phy) +tausum(:,la550,id_AIBCM_phy)+ &
Note: See TracChangeset for help on using the changeset viewer.