source: trunk/LMDZ.MARS/libf/phymars/dust_windstress_lift.F90

Last change on this file was 3292, checked in by emillour, 8 months ago

Mars PCM:
Code cleanup to prepare the addition of new schemes for dust lifting by
wind stress and dust devils. Renamed "dustlift" routine "dust_windstress_lift"
and made it a module; also made dustdevil a module.
EM

File size: 5.5 KB
Line 
1MODULE dust_windstress_lift_mod
2
3IMPLICIT NONE
4
5INTEGER,SAVE :: windstress_lift_scheme ! wind stress lifting scheme number
6! 0 (default): old scheme
7
8!$OMP THREADPRIVATE(windstress_lift_scheme)
9
10CONTAINS
11
12  SUBROUTINE dust_windstress_lift(ngrid,nlay,nq,rho, &
13                                pcdh_true,pcdh,co2ice, &
14                                dqslift)
15
16#ifndef MESOSCALE
17  use tracer_mod, only: alpha_lift, radius
18#else
19  use tracer_mod, only: alpha_lift, radius, &
20                      igcm_dust_mass, igcm_dust_number, &
21                      ref_r0,r3n_q
22#endif
23  use comcstfi_h, only: g
24  USE ioipsl_getin_p_mod, ONLY : getin_p
25  IMPLICIT NONE
26
27!=======================================================================
28!
29!  Dust lifting by surface winds
30!  Computing flux to the middle of the first layer
31!  (Called by vdifc)
32!
33!=======================================================================
34
35!
36!   arguments:
37!   ----------
38
39  integer,intent(in) :: ngrid, nlay, nq 
40  real,intent(in) ::  rho(ngrid)  ! density (kg.m-3) at surface
41  real,intent(in) ::  pcdh_true(ngrid) ! Cd
42  real,intent(in) ::  pcdh(ngrid) ! Cd * |V|
43  real,intent(in) ::  co2ice(ngrid) ! surface CO2 ice (kg/m2)
44
45  real,intent(out) ::  dqslift(ngrid,nq) !surface dust flux to mid-layer (<0 when lifing)
46
47!   local:
48!   ------
49  INTEGER :: ig,iq
50  REAL :: fhoriz(ngrid)  ! Horizontal dust flux
51  REAL :: ust,us
52  REAL,SAVE :: stress_seuil=0.0225 ! stress lifting threshold (N.m2)
53!$OMP THREADPRIVATE(stress_seuil)
54
55  LOGICAL,SAVE :: firstcall=.true.
56!$OMP THREADPRIVATE(firstcall)
57
58  character(len=20),parameter :: rname="dust_windstress_lift"
59
60#ifdef MESOSCALE
61!!!! AS: In the mesoscale model we'd like to easily set
62!!!! AS: ... stress for lifting
63!!!! AS: you have to compile with -DMESOSCALE to do so
64  REAL :: alpha
65  REAL :: r0_lift
66  INTEGER :: ierr
67  REAL :: ulim
68
69    OPEN(99,file='stress.def',status='old',form='formatted',iostat=ierr)
70    !!! no file => default values
71    IF(ierr.EQ.0) THEN
72      READ(99,*) ulim !ulim = sqrt(stress_seuil/rho) avec rho = 0.02.
73                      !prendre ulim = 1.061 m/s pour avoir stress_seuil = 0.0225
74      READ(99,*) alpha
75      stress_seuil = 0.02 * ulim * ulim
76      write(*,*) 'USER-DEFINED threshold: ', stress_seuil, alpha
77      CLOSE(99)
78      alpha_lift(igcm_dust_mass) = alpha
79      r0_lift = radius(igcm_dust_mass) / ref_r0
80      alpha_lift(igcm_dust_number)=r3n_q* &
81                              alpha_lift(igcm_dust_mass)/r0_lift**3
82      write(*,*) 'set dust number: ', alpha_lift(igcm_dust_number)
83    ENDIF
84#endif
85
86    if (firstcall) then
87      ! get wind stress lifting scheme number (default 0)
88      windstress_lift_scheme=0 ! default
89      call getin_p("windstress_lift_scheme",windstress_lift_scheme)
90     
91      ! sanity check on available windstress_lift_scheme values
92      if (windstress_lift_scheme.ne.0) then
93        write(*,*) trim(rname)//" wrong value for windstress_lift_scheme:",&
94                   windstress_lift_scheme
95        call abort_physic(rname,"bad windstress_lift_scheme value",1)
96      endif
97     
98      firstcall=.false.
99    endif ! of if (firstcall)
100
101
102    if (windstress_lift_scheme==0) then
103
104!   ---------------------------------
105!   1. Compute horizontal flux: fhoriz
106!   ---------------------------------
107
108      do ig=1,ngrid
109        fhoriz(ig) = 0.      ! initialisation
110
111!         Selection of points where surface dust is available
112!         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
113!         if (latid(ig).ge.80.) goto 99  ! N permanent  polar caps
114!         if (latid(ig).le.-80.) goto 99 ! S polar deposits
115!         if  ((longd(ig).ge.-141. .and. longd(ig).le.-127.)
116!    &   .and.(latid(ig).ge.12.   .and. latid(ig).le.23.))goto 99 ! olympus
117!         if  ((longd(ig).ge.-125. .and. longd(ig).le.-118.)
118!    &   .and.(latid(ig).ge.-12.   .and. latid(ig).le.-6.))goto 99 ! Arsia
119!         if  ((longd(ig).ge.-116. .and. longd(ig).le.-109.)
120!    &   .and.(latid(ig).ge.-5.   .and. latid(ig).le. 5.))goto 99 ! pavonis
121!         if  ((longd(ig).ge.-109. .and. longd(ig).le.-100.)
122!    &   .and.(latid(ig).ge. 7.   .and. latid(ig).le. 16.))goto 99 ! ascraeus
123!         if  ((longd(ig).ge.  61. .and. longd(ig).le.  63.)
124!    &   .and.(latid(ig).ge. 63. .and. latid(ig).le. 64.))goto 99 !weird point
125        if (co2ice(ig).gt.0.) goto 99
126
127
128!       Is the wind strong enough ?
129!       ~~~~~~~~~~~~~~~~~~~~~~~~~~~
130        ust = sqrt(stress_seuil/rho(ig))
131        us = pcdh(ig) /  sqrt(pcdh_true(ig)) ! ustar=cd*v /sqrt(cd)
132        if (us.gt.ust) then
133!         If lifting ?
134!         Compute flux according to Marticorena (in fact white (1979))
135
136          fhoriz(ig) = 2.61*(rho(ig)/g) * (us -ust) * (us + ust)**2
137         endif
138
139 99   continue
140      enddo ! of do ig=1,ngrid
141
142!     -------------------------------------
143!     2. Compute vertical flux and diffusion
144!     -------------------------------------
145 
146      do iq=1,nq
147        do ig=1,ngrid
148          dqslift(ig,iq)= -alpha_lift(iq)* fhoriz(ig)
149
150!   the vertical flux replaces the turbulent diffusion term which is set to zero
151!            zb(ig,1) = 0.
152!c           If surface deposition by turbulence diffusion (impaction...)
153!c           if(fhoriz(ig).ne.0) then
154!c           zb(ig,1) = zcdh(ig)*zb0(ig,1)
155!c           AMount of Surface deposition !
156!c           pdqs_dif(ig,iq)=pdqs_dif(ig,iq) +
157!c    &      zb(ig,1)*zq(ig,1,iq)/ptimestep
158!c          write(*,*) 'zb(1)  = ' ,  zb(ig,1),zcdh(ig),zb0(ig,1)
159!c
160
161        enddo
162      enddo
163
164    endif ! of if (windstress_lift_scheme==0)
165   
166  END SUBROUTINE dust_windstress_lift
167
168END MODULE dust_windstress_lift_mod
Note: See TracBrowser for help on using the repository browser.