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