1 | SUBROUTINE dustlift(ngrid,nlay,nq,rho, |
---|
2 | $ pcdh_true,pcdh,co2ice, |
---|
3 | $ dqslift) |
---|
4 | |
---|
5 | #ifndef MESOSCALE |
---|
6 | use tracer_mod, only: alpha_lift, radius |
---|
7 | #else |
---|
8 | use tracer_mod, only: alpha_lift, radius, |
---|
9 | & igcm_dust_mass, igcm_dust_number, |
---|
10 | & ref_r0,r3n_q |
---|
11 | #endif |
---|
12 | IMPLICIT NONE |
---|
13 | |
---|
14 | c======================================================================= |
---|
15 | c |
---|
16 | c Dust lifting by surface winds |
---|
17 | c Computing flux to the middle of the first layer |
---|
18 | c (Called by vdifc) |
---|
19 | c |
---|
20 | c======================================================================= |
---|
21 | |
---|
22 | c----------------------------------------------------------------------- |
---|
23 | c declarations: |
---|
24 | c ------------- |
---|
25 | |
---|
26 | !#include "dimensions.h" |
---|
27 | !#include "dimphys.h" |
---|
28 | #include "comcstfi.h" |
---|
29 | !#include "tracer.h" |
---|
30 | |
---|
31 | c |
---|
32 | c arguments: |
---|
33 | c ---------- |
---|
34 | |
---|
35 | c INPUT |
---|
36 | integer ngrid, nlay, nq |
---|
37 | real rho(ngrid) ! density (kg.m-3) at surface |
---|
38 | real pcdh_true(ngrid) ! Cd |
---|
39 | real pcdh(ngrid) ! Cd * |V| |
---|
40 | real co2ice(ngrid) |
---|
41 | |
---|
42 | c OUTPUT |
---|
43 | real dqslift(ngrid,nq) !surface dust flux to mid-layer (<0 when lifing) |
---|
44 | c real pb(ngrid,nlay) ! diffusion to surface coeff. |
---|
45 | |
---|
46 | c local: |
---|
47 | c ------ |
---|
48 | INTEGER ig,iq |
---|
49 | REAL fhoriz(ngrid) ! Horizontal dust flux |
---|
50 | REAL ust,us |
---|
51 | REAL stress_seuil |
---|
52 | SAVE stress_seuil |
---|
53 | DATA stress_seuil/0.0225/ ! stress seuil soulevement (N.m2) |
---|
54 | |
---|
55 | #ifdef MESOSCALE |
---|
56 | !!!! AS: In the mesoscale model we'd like to easily set |
---|
57 | !!!! AS: ... stress for lifting |
---|
58 | !!!! AS: you have to compile with -DMESOSCALE to do so |
---|
59 | REAL alpha |
---|
60 | REAL r0_lift |
---|
61 | INTEGER ierr |
---|
62 | REAL ulim |
---|
63 | OPEN(99,file='stress.def',status='old',form='formatted' |
---|
64 | . ,iostat=ierr) |
---|
65 | !!! no file => default values |
---|
66 | IF(ierr.EQ.0) THEN |
---|
67 | READ(99,*) ulim !ulim = sqrt(stress_seuil/rho) avec rho = 0.02. |
---|
68 | !prendre ulim = 1.061 m/s pour avoir stress_seuil = 0.0225 |
---|
69 | READ(99,*) alpha |
---|
70 | stress_seuil = 0.02 * ulim * ulim |
---|
71 | write(*,*) 'USER-DEFINED threshold: ', stress_seuil, alpha |
---|
72 | CLOSE(99) |
---|
73 | alpha_lift(igcm_dust_mass) = alpha |
---|
74 | r0_lift = radius(igcm_dust_mass) / ref_r0 |
---|
75 | alpha_lift(igcm_dust_number)=r3n_q* |
---|
76 | & alpha_lift(igcm_dust_mass)/r0_lift**3 |
---|
77 | write(*,*) 'set dust number: ', alpha_lift(igcm_dust_number) |
---|
78 | ENDIF |
---|
79 | #endif |
---|
80 | |
---|
81 | c --------------------------------- |
---|
82 | c Computing horizontal flux: fhoriz |
---|
83 | c --------------------------------- |
---|
84 | |
---|
85 | do ig=1,ngrid |
---|
86 | fhoriz(ig) = 0. ! initialisation |
---|
87 | |
---|
88 | c Selection of points where surface dust is available |
---|
89 | c ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
---|
90 | c if (latid(ig).ge.80.) goto 99 ! N permanent polar caps |
---|
91 | c if (latid(ig).le.-80.) goto 99 ! S polar deposits |
---|
92 | c if ((longd(ig).ge.-141. .and. longd(ig).le.-127.) |
---|
93 | c & .and.(latid(ig).ge.12. .and. latid(ig).le.23.))goto 99 ! olympus |
---|
94 | c if ((longd(ig).ge.-125. .and. longd(ig).le.-118.) |
---|
95 | c & .and.(latid(ig).ge.-12. .and. latid(ig).le.-6.))goto 99 ! Arsia |
---|
96 | c if ((longd(ig).ge.-116. .and. longd(ig).le.-109.) |
---|
97 | c & .and.(latid(ig).ge.-5. .and. latid(ig).le. 5.))goto 99 ! pavonis |
---|
98 | c if ((longd(ig).ge.-109. .and. longd(ig).le.-100.) |
---|
99 | c & .and.(latid(ig).ge. 7. .and. latid(ig).le. 16.))goto 99 ! ascraeus |
---|
100 | c if ((longd(ig).ge. 61. .and. longd(ig).le. 63.) |
---|
101 | c & .and.(latid(ig).ge. 63. .and. latid(ig).le. 64.))goto 99 !weird point |
---|
102 | if (co2ice(ig).gt.0.) goto 99 |
---|
103 | |
---|
104 | |
---|
105 | c Is the wind strong enough ? |
---|
106 | c ~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
---|
107 | ust = sqrt(stress_seuil/rho(ig)) |
---|
108 | us = pcdh(ig) / sqrt(pcdh_true(ig)) ! ustar=cd*v /sqrt(cd) |
---|
109 | if (us.gt.ust) then |
---|
110 | c If lifting ? |
---|
111 | c Calcul du flux suivant Marticorena ( en fait white (1979)) |
---|
112 | |
---|
113 | fhoriz(ig) = 2.61*(rho(ig)/g) * |
---|
114 | & (us -ust) * (us + ust)**2 |
---|
115 | end if |
---|
116 | 99 continue |
---|
117 | end do |
---|
118 | |
---|
119 | c ------------------------------------- |
---|
120 | c Computing vertical flux and diffusion |
---|
121 | c ------------------------------------- |
---|
122 | |
---|
123 | do iq=1,nq |
---|
124 | do ig=1,ngrid |
---|
125 | dqslift(ig,iq)= -alpha_lift(iq)* fhoriz(ig) |
---|
126 | |
---|
127 | |
---|
128 | cc le flux vertical remplace le terme de diffusion turb. qui est mis a zero |
---|
129 | c zb(ig,1) = 0. |
---|
130 | cc If surface deposition by turbulence diffusion (impaction...) |
---|
131 | cc if(fhoriz(ig).ne.0) then |
---|
132 | cc zb(ig,1) = zcdh(ig)*zb0(ig,1) |
---|
133 | cc AMount of Surface deposition ! |
---|
134 | cc pdqs_dif(ig,iq)=pdqs_dif(ig,iq) + |
---|
135 | cc & zb(ig,1)*zq(ig,1,iq)/ptimestep |
---|
136 | cc write(*,*) 'zb(1) = ' , zb(ig,1),zcdh(ig),zb0(ig,1) |
---|
137 | cc |
---|
138 | |
---|
139 | enddo |
---|
140 | enddo |
---|
141 | |
---|
142 | RETURN |
---|
143 | END |
---|
144 | |
---|