[690] | 1 | SUBROUTINE co2snow (ngrid,nlayer,ptimestep,emisref,condsub |
---|
| 2 | & ,pplev,pcondicea,pcondices,pfallice,pemisurf) |
---|
[38] | 3 | |
---|
[1047] | 4 | use surfdat_h, only: iceradius, dtemisice |
---|
[1543] | 5 | use geometry_mod, only: latitude ! grid point latitudes (rad) |
---|
[1524] | 6 | use time_phylmdz_mod, only: daysec |
---|
[1047] | 7 | IMPLICIT NONE |
---|
[38] | 8 | |
---|
| 9 | c======================================================================= |
---|
| 10 | c Program for simulate the impact of the CO2 snow fall on |
---|
| 11 | c the surface infrared emission (emissivity) and on |
---|
| 12 | c the airborne dust |
---|
| 13 | c F.Forget 1996 |
---|
| 14 | c======================================================================= |
---|
| 15 | |
---|
| 16 | c Declarations |
---|
| 17 | c ------------ |
---|
| 18 | |
---|
| 19 | #include "callkeys.h" |
---|
| 20 | |
---|
[890] | 21 | c Arguments |
---|
| 22 | c --------- |
---|
[38] | 23 | |
---|
[890] | 24 | INTEGER,INTENT(IN) :: ngrid ! number of atmospheric columns |
---|
| 25 | INTEGER,INTENT(IN) :: nlayer ! number of atmospheric layers |
---|
| 26 | REAL,INTENT(IN) :: ptimestep ! timestep of the physics (s) |
---|
| 27 | REAL,INTENT(IN) :: emisref(ngrid) ! grd or ice emissivity without snow |
---|
| 28 | logical,intent(in) :: condsub(ngrid) ! true if there is CO2 condensation |
---|
| 29 | ! or sublimation in the column |
---|
| 30 | REAL,INTENT(IN) :: pplev(ngrid,nlayer+1) ! interlayer pressure (Pa) |
---|
| 31 | REAL,INTENT(IN) :: pcondicea(ngrid,nlayer) ! CO2 condensation rate (kg/m2/s) |
---|
| 32 | REAL,INTENT(IN) :: pcondices(ngrid) ! CO2 condensation rate (kg/m2/s) |
---|
| 33 | ! on the surface |
---|
| 34 | REAL,INTENT(IN) :: pfallice(ngrid,nlayer+1) ! falling CO2 ice (kg/m2/s) |
---|
[38] | 35 | |
---|
[890] | 36 | REAL,INTENT(OUT) :: pemisurf(ngrid) ! surface emissivity |
---|
[38] | 37 | |
---|
| 38 | c local |
---|
| 39 | c ----- |
---|
| 40 | integer ig , l , icap |
---|
| 41 | |
---|
| 42 | REAL zdemisurf ,dtemis |
---|
| 43 | REAL sumdaer |
---|
| 44 | |
---|
| 45 | c saved |
---|
| 46 | c ----- |
---|
[890] | 47 | REAL,save :: Kscat(2), scaveng |
---|
| 48 | LOGICAL,SAVE :: firstcall=.true. |
---|
[38] | 49 | |
---|
| 50 | c -------------- |
---|
| 51 | c Initialisation |
---|
| 52 | c -------------- |
---|
| 53 | |
---|
[1779] | 54 | ! AS: firstcall OK absolute |
---|
[38] | 55 | if (firstcall) then |
---|
| 56 | |
---|
| 57 | c Kscat : coefficient for decreasing the surface emissivity |
---|
| 58 | c =(0.001/3.)*alpha/iceradius , |
---|
| 59 | c with 0.3< alpha < 0.6, set to 0.45 (coeff from emis = f (tau)) |
---|
| 60 | c and iceradius the mean radius of the |
---|
| 61 | c scaterring particles (200.e-6<iceradius<10.e-6) |
---|
| 62 | |
---|
| 63 | Kscat(1)=(0.001/3.)*0.45/iceradius(1) |
---|
| 64 | Kscat(2)=(0.001/3.)*0.45/iceradius(2) |
---|
| 65 | |
---|
| 66 | c Scavenging Ratio (dust concentration in the air / in the snow) |
---|
| 67 | scaveng = 100.0 |
---|
| 68 | |
---|
| 69 | c Collision Scavenging coefficient (m2.kg-1) |
---|
| 70 | c Csca = 2.3 ! not used yet !!!!!!!!!!! |
---|
| 71 | firstcall = .false. |
---|
| 72 | |
---|
| 73 | end if |
---|
| 74 | |
---|
| 75 | |
---|
| 76 | c LOOP on grid points |
---|
| 77 | c ------------------- |
---|
| 78 | do ig=1,ngrid |
---|
| 79 | if (condsub(ig)) then |
---|
| 80 | |
---|
| 81 | c IF (scavenging) then |
---|
| 82 | c Airborne Dust |
---|
| 83 | c ------------- |
---|
| 84 | c sumdaer=0. |
---|
| 85 | c do l=nlayer, 1, -1 |
---|
| 86 | c pdaerosol(ig,l)= -paerosol(ig,l,1)* |
---|
| 87 | c & (1-exp(-scaveng*pcondicea(ig,l)*ptimestep*g/ |
---|
| 88 | c & (pplev(ig,l)-pplev(ig,l+1))))/ptimestep |
---|
| 89 | |
---|
| 90 | c & - Csca*paerosol(ig,l,1) ! Scavenging by collision |
---|
| 91 | c & * 0.5*(pfallice(ig,l)) ! not included |
---|
| 92 | |
---|
| 93 | c test to avoid releasing to much dust when subliming: |
---|
| 94 | c if(pdaerosol(ig,l).gt.-sumdaer)pdaerosol(ig,l)=-sumdaer |
---|
| 95 | c sumdaer=sumdaer + pdaerosol(ig,l) |
---|
| 96 | |
---|
| 97 | c if (-pdaerosol(ig,l)*ptimestep.gt.paerosol(ig,l,1)) then |
---|
| 98 | c write(*,*) 'ds co2snow: aerosol < 0.0 !!!' |
---|
| 99 | c write(*,*) 'ig =' , ig |
---|
| 100 | c end if |
---|
| 101 | c end do |
---|
| 102 | c END IF |
---|
| 103 | |
---|
| 104 | c Surface emissivity |
---|
| 105 | c ------------------ |
---|
| 106 | c dtemis: Time scale for increasing the ice emissivity |
---|
| 107 | |
---|
[1541] | 108 | IF(latitude(ig).LT. 0.) THEN |
---|
[1130] | 109 | icap=2 ! Southern hemisphere |
---|
[38] | 110 | ELSE |
---|
[1130] | 111 | icap=1 ! Northern Hemisphere |
---|
[38] | 112 | ENDIF |
---|
| 113 | |
---|
| 114 | zdemisurf = |
---|
| 115 | & (emisref(ig)-pemisurf(ig))/(dtemisice(icap)*daysec) |
---|
| 116 | c Using directly the diferential equation: |
---|
| 117 | c & -Kscat(icap)*emisref(ig)* |
---|
| 118 | c & (pemisurf(ig)/emisref(ig))**4 *pfallice(ig,1) |
---|
| 119 | c Using an integrated form for numerical safety instead |
---|
| 120 | & +(emisref(ig)* ((pemisurf(ig)/emisref(ig))**(-3)+3.*Kscat(icap)* |
---|
| 121 | & pfallice(ig,1)*ptimestep)**(-1/3.) -pemisurf(ig))/ptimestep |
---|
| 122 | |
---|
| 123 | |
---|
| 124 | pemisurf(ig) = pemisurf(ig) + zdemisurf*ptimestep |
---|
| 125 | |
---|
| 126 | if (pemisurf(ig).lt.0.1) then |
---|
| 127 | write(*,*) 'ds co2snow: emis < 0.1 !!!' |
---|
| 128 | write(*,*) 'ig =' , ig |
---|
| 129 | write(*,*)'pemisurf(ig)',pemisurf(ig) |
---|
| 130 | write(*,*) 'zdemisurf*ptimestep',zdemisurf*ptimestep |
---|
| 131 | end if |
---|
| 132 | else |
---|
| 133 | pemisurf(ig) = emisref(ig) |
---|
| 134 | end if |
---|
| 135 | end do |
---|
| 136 | |
---|
| 137 | return |
---|
| 138 | end |
---|