1 | SUBROUTINE co2snow (ngrid,nlayer,ptimestep,emisref,condsub |
---|
2 | & ,pplev,pcondicea,pcondices,pfallice,pemisurf) |
---|
3 | |
---|
4 | use surfdat_h, only: iceradius, dtemisice |
---|
5 | use geometry_mod, only: latitude ! grid point latitudes (rad) |
---|
6 | use time_phylmdz_mod, only: daysec |
---|
7 | IMPLICIT NONE |
---|
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 | |
---|
21 | c Arguments |
---|
22 | c --------- |
---|
23 | |
---|
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) |
---|
35 | |
---|
36 | REAL,INTENT(OUT) :: pemisurf(ngrid) ! surface emissivity |
---|
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 ----- |
---|
47 | REAL,save :: Kscat(2), scaveng |
---|
48 | LOGICAL,SAVE :: firstcall=.true. |
---|
49 | |
---|
50 | c -------------- |
---|
51 | c Initialisation |
---|
52 | c -------------- |
---|
53 | |
---|
54 | ! AS: firstcall OK absolute |
---|
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 | |
---|
108 | IF(latitude(ig).LT. 0.) THEN |
---|
109 | icap=2 ! Southern hemisphere |
---|
110 | ELSE |
---|
111 | icap=1 ! Northern Hemisphere |
---|
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 |
---|