[3274] | 1 | SUBROUTINE MACv2SP(pphis,pplay,paprs,xlon,xlat,tau_allaer,piz_allaer,cg_allaer) |
---|
| 2 | ! |
---|
| 3 | !--routine to read the MACv2SP plume and compute optical properties |
---|
| 4 | !--requires flag_aerosol = 7 |
---|
| 5 | !--feeds into aerosol optical properties and newmicro cloud droplet size if ok_cdnc activated |
---|
| 6 | !--for this one needs to feed natural (pre-industrial) aerosols twice for nat and 1980 files |
---|
| 7 | !--pre-ind aerosols (index=1) are not changed, present-day aerosols (index=2) are incremented |
---|
| 8 | !--uses model year so year_cur needs to be correct in the model simulation |
---|
| 9 | ! |
---|
| 10 | !--aod_prof = AOD per layer |
---|
| 11 | !--ssa_prof = SSA |
---|
| 12 | !--asy_prof = asymetry parameter |
---|
| 13 | !--dNovrN = enhancement factor for CDNC |
---|
| 14 | ! |
---|
| 15 | USE mo_simple_plumes, ONLY: sp_aop_profile |
---|
| 16 | USE phys_cal_mod, ONLY : year_cur, day_cur, year_len |
---|
| 17 | USE dimphy |
---|
| 18 | USE aero_mod |
---|
| 19 | USE phys_local_var_mod, ONLY: t_seri, od443aer, od550aer, od865aer, ec550aer, dryod550aer, od550lt1aer, dNovrN |
---|
[3287] | 20 | !!USE YOMCST, ONLY : RD, RG |
---|
[3274] | 21 | ! |
---|
[5285] | 22 | USE yomcst_mod_h |
---|
[5274] | 23 | IMPLICIT NONE |
---|
[3287] | 24 | ! |
---|
[5274] | 25 | |
---|
[3274] | 26 | ! |
---|
| 27 | REAL,DIMENSION(klon),INTENT(IN) :: pphis ! Geopotentiel de surface |
---|
| 28 | REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression pour le mileu de chaque couche (en Pa) |
---|
| 29 | REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs ! pression pour les interfaces de chaque couche (en Pa) |
---|
| 30 | REAL,DIMENSION(klon),INTENT(IN) :: xlat ! latitudes pour chaque point |
---|
| 31 | REAL,DIMENSION(klon),INTENT(IN) :: xlon ! longitudes pour chaque point |
---|
| 32 | ! |
---|
| 33 | REAL, DIMENSION(klon,klev,2,nbands_sw_rrtm), INTENT(OUT) :: tau_allaer ! epaisseur optique aerosol |
---|
| 34 | REAL, DIMENSION(klon,klev,2,nbands_sw_rrtm), INTENT(OUT) :: piz_allaer ! single scattering albedo aerosol |
---|
| 35 | REAL, DIMENSION(klon,klev,2,nbands_sw_rrtm), INTENT(OUT) :: cg_allaer ! asymmetry parameter aerosol |
---|
| 36 | ! |
---|
| 37 | REAL,DIMENSION(klon,klev) :: aod_prof, ssa_prof, asy_prof |
---|
| 38 | REAL,DIMENSION(klon,klev) :: z, dz |
---|
[3296] | 39 | REAL,DIMENSION(klon) :: oro, zrho, zt |
---|
[3274] | 40 | ! |
---|
| 41 | INTEGER, PARAMETER :: nmon = 12 |
---|
| 42 | ! |
---|
| 43 | REAL, PARAMETER :: l443 = 443.0, l550 = 550.0, l865 = 865.0 !--wavelengths in nm |
---|
| 44 | ! |
---|
| 45 | INTEGER, PARAMETER :: Nwvmax=25 |
---|
| 46 | REAL, DIMENSION(0:Nwvmax), PARAMETER :: lambda=(/ 240.0, & !--this one is for band 1 |
---|
| 47 | 280.0, 300.0, 330.0, 360.0, 400.0, & !--these are bounds of Streamer bands |
---|
| 48 | 440.0, 480.0, 520.0, 570.0, 640.0, & |
---|
| 49 | 690.0, 750.0, 780.0, 870.0, 1000.0, & |
---|
| 50 | 1100.0, 1190.0, 1280.0, 1530.0, 1640.0, & |
---|
| 51 | 2130.0, 2380.0, 2910.0, 3420.0, 4000.0 /) |
---|
| 52 | ! |
---|
| 53 | REAL, DIMENSION(1:Nwvmax-1), PARAMETER :: weight =(/ & !--and the weights to be given to the bands |
---|
| 54 | 0.01, 4.05, 9.51, 15.99, 26.07, 33.10, & !--corresponding to a typical solar spectrum |
---|
| 55 | 33.07, 39.91, 52.67, 27.89, 43.60, 13.67, & |
---|
| 56 | 42.22, 40.12, 32.70, 14.44, 19.48, 14.23, & |
---|
| 57 | 13.43, 16.42, 8.33, 0.95, 0.65, 2.76 /) |
---|
| 58 | ! |
---|
| 59 | REAL :: zlambda, zweight |
---|
| 60 | REAL :: year_fr |
---|
| 61 | ! |
---|
| 62 | INTEGER band, i, k, Nwv |
---|
| 63 | ! |
---|
| 64 | ! define the height and dheight arrays |
---|
| 65 | ! |
---|
[3296] | 66 | oro(:) = pphis(:)/RG ! surface height in m |
---|
| 67 | ! |
---|
| 68 | DO k = 1, klev |
---|
| 69 | zrho(:) = pplay(:,k)/t_seri(:,k)/RD ! air density in kg/m3 |
---|
| 70 | dz(:,k) = (paprs(:,k)-paprs(:,k+1))/zrho(:)/RG ! layer thickness in m |
---|
| 71 | IF (k==1) THEN |
---|
| 72 | z(:,1) = oro(:) + (paprs(:,1)-pplay(:,1))/zrho(:)/RG ! altitude middle of first layer in m |
---|
| 73 | zt(:) = oro(:) + dz(:,1) ! altitude top of first layer in m |
---|
| 74 | ELSE |
---|
| 75 | z(:,k) = zt(:) + (paprs(:,k)-pplay(:,k))/zrho(:)/RG ! altitude middle of layer k in m |
---|
| 76 | zt(:) = zt(:) + dz(:,k) ! altitude top of layer k in m |
---|
| 77 | ENDIF |
---|
[3274] | 78 | ENDDO |
---|
| 79 | ! |
---|
| 80 | !--fractional year |
---|
| 81 | ! |
---|
| 82 | year_fr = FLOAT(year_cur) + (FLOAT(day_cur)-0.5) / FLOAT(year_len) |
---|
[3404] | 83 | IF (year_fr.LT.1850.0.OR.year_fr.GE.2017.0) THEN |
---|
| 84 | CALL abort_physic ('macv2sp','year not supported by plume model',1) |
---|
| 85 | ENDIF |
---|
[3274] | 86 | ! |
---|
| 87 | !--call to sp routine -- 443 nm |
---|
| 88 | ! |
---|
| 89 | CALL sp_aop_profile ( & |
---|
| 90 | klev ,klon ,l443 ,oro ,xlon ,xlat , & |
---|
| 91 | year_fr ,z ,dz ,dNovrN ,aod_prof ,ssa_prof , & |
---|
| 92 | asy_prof ) |
---|
| 93 | ! |
---|
| 94 | !--AOD calculations for diagnostics |
---|
| 95 | od443aer(:)= od443aer(:)+SUM(aod_prof(:,:),dim=2) |
---|
| 96 | ! |
---|
| 97 | !--call to sp routine -- 550 nm |
---|
| 98 | ! |
---|
| 99 | CALL sp_aop_profile ( & |
---|
| 100 | klev ,klon ,l550 ,oro ,xlon ,xlat , & |
---|
| 101 | year_fr ,z ,dz ,dNovrN ,aod_prof ,ssa_prof , & |
---|
| 102 | asy_prof ) |
---|
| 103 | ! |
---|
| 104 | !--AOD calculations for diagnostics |
---|
| 105 | od550aer(:)=od550aer(:)+SUM(aod_prof(:,:),dim=2) |
---|
| 106 | ! |
---|
| 107 | !--dry AOD calculation for diagnostics |
---|
| 108 | dryod550aer(:)=dryod550aer(:)+od550aer(:) |
---|
| 109 | ! |
---|
| 110 | !--fine-mode AOD calculation for diagnostics |
---|
| 111 | od550lt1aer(:)=od550lt1aer(:)+od550aer(:) |
---|
| 112 | ! |
---|
| 113 | !--extinction coefficient for diagnostic |
---|
| 114 | ec550aer(:,:)=ec550aer(:,:)+aod_prof(:,:)/dz(:,:) |
---|
| 115 | ! |
---|
| 116 | !--call to sp routine -- 865 nm |
---|
| 117 | ! |
---|
| 118 | CALL sp_aop_profile ( & |
---|
| 119 | klev ,klon ,l865 ,oro ,xlon ,xlat , & |
---|
| 120 | year_fr ,z ,dz ,dNovrN ,aod_prof ,ssa_prof , & |
---|
| 121 | asy_prof ) |
---|
| 122 | ! |
---|
| 123 | !--AOD calculations for diagnostics |
---|
| 124 | od865aer(:)=od865aer(:)+SUM(aod_prof(:,:),dim=2) |
---|
| 125 | ! |
---|
| 126 | !--re-weighting of piz and cg arrays before adding the anthropogenic aerosols |
---|
| 127 | !--index 2 = all natural + anthropogenic aerosols |
---|
| 128 | piz_allaer(:,:,2,:)=piz_allaer(:,:,2,:)*tau_allaer(:,:,2,:) |
---|
| 129 | cg_allaer(:,:,2,:) =cg_allaer(:,:,2,:)*piz_allaer(:,:,2,:) |
---|
| 130 | ! |
---|
| 131 | !--now computing the same at many wavelengths to fill the model bands |
---|
| 132 | ! |
---|
| 133 | DO Nwv=0,Nwvmax-1 |
---|
| 134 | |
---|
| 135 | IF (Nwv.EQ.0) THEN !--RRTM spectral band 1 |
---|
| 136 | zlambda=lambda(Nwv) |
---|
| 137 | zweight=1.0 |
---|
| 138 | band=1 |
---|
| 139 | ELSEIF (Nwv.LE.5) THEN !--RRTM spectral band 2 |
---|
| 140 | zlambda=0.5*(lambda(Nwv)+lambda(Nwv+1)) |
---|
| 141 | zweight=weight(Nwv)/SUM(weight(1:5)) |
---|
| 142 | band=2 |
---|
| 143 | ELSEIF (Nwv.LE.10) THEN !--RRTM spectral band 3 |
---|
| 144 | zlambda=0.5*(lambda(Nwv)+lambda(Nwv+1)) |
---|
| 145 | zweight=weight(Nwv)/SUM(weight(6:10)) |
---|
| 146 | band=3 |
---|
| 147 | ELSEIF (Nwv.LE.16) THEN !--RRTM spectral band 4 |
---|
| 148 | zlambda=0.5*(lambda(Nwv)+lambda(Nwv+1)) |
---|
| 149 | zweight=weight(Nwv)/SUM(weight(11:16)) |
---|
| 150 | band=4 |
---|
| 151 | ELSEIF (Nwv.LE.21) THEN !--RRTM spectral band 5 |
---|
| 152 | zlambda=0.5*(lambda(Nwv)+lambda(Nwv+1)) |
---|
| 153 | zweight=weight(Nwv)/SUM(weight(17:21)) |
---|
| 154 | band=5 |
---|
| 155 | ELSE !--RRTM spectral band 6 |
---|
| 156 | zlambda=0.5*(lambda(Nwv)+lambda(Nwv+1)) |
---|
| 157 | zweight=weight(Nwv)/SUM(weight(22:Nwvmax-1)) |
---|
| 158 | band=6 |
---|
| 159 | ENDIF |
---|
| 160 | ! |
---|
| 161 | CALL sp_aop_profile ( & |
---|
| 162 | klev ,klon ,zlambda ,oro ,xlon ,xlat , & |
---|
| 163 | year_fr ,z ,dz ,dNovrN ,aod_prof ,ssa_prof , & |
---|
| 164 | asy_prof ) |
---|
| 165 | ! |
---|
| 166 | !--adding up the quantities tau, piz*tau and cg*piz*tau |
---|
| 167 | tau_allaer(:,:,2,band)=tau_allaer(:,:,2,band)+zweight*MAX(aod_prof(:,:),1.e-15) |
---|
| 168 | piz_allaer(:,:,2,band)=piz_allaer(:,:,2,band)+zweight*MAX(aod_prof(:,:),1.e-15)*ssa_prof(:,:) |
---|
| 169 | cg_allaer(:,:,2,band) =cg_allaer(:,:,2,band) +zweight*MAX(aod_prof(:,:),1.e-15)*ssa_prof(:,:)*asy_prof(:,:) |
---|
| 170 | ! |
---|
| 171 | ENDDO |
---|
| 172 | ! |
---|
| 173 | !--renpomalizing cg and piz now that MACv2SP increments have been added |
---|
| 174 | cg_allaer(:,:,2,:) =cg_allaer(:,:,2,:) /piz_allaer(:,:,2,:) |
---|
| 175 | piz_allaer(:,:,2,:)=piz_allaer(:,:,2,:)/tau_allaer(:,:,2,:) |
---|
| 176 | ! |
---|
| 177 | END SUBROUTINE MACv2SP |
---|