source: LMDZ6/trunk/libf/dyn3dmem/friction_loc.F90 @ 5267

Last change on this file since 5267 was 5267, checked in by abarral, 2 days ago

Remove CPP_IOIPSL cpp keys uses

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
File size: 4.7 KB
Line 
1!
2! $Id: friction_p.F 1299 2010-01-20 14:27:21Z fairhead $
3!
4!=======================================================================
5SUBROUTINE friction_loc(ucov,vcov,pdt)
6  USE parallel_lmdz
7  USE control_mod
8  USE IOIPSL
9
10  USE comconst_mod, ONLY: pi
11  IMPLICIT NONE
12
13  !=======================================================================
14  !
15  !   Friction for the Newtonian case:
16  !   --------------------------------
17  !    2 possibilities (depending on flag 'friction_type'
18  ! friction_type=0 : A friction that is only applied to the lowermost
19  !                   atmospheric layer
20  ! friction_type=1 : Friction applied on all atmospheric layer (but
21  !   (default)       with stronger magnitude near the surface; see
22  !                   iniacademic.F)
23  !=======================================================================
24
25  include "dimensions.h"
26  include "paramet.h"
27  include "comgeom2.h"
28  include "iniprint.h"
29  include "academic.h"
30
31  ! arguments:
32  REAL,INTENT(inout) :: ucov( iip1,jjb_u:jje_u,llm )
33  REAL,INTENT(inout) :: vcov( iip1,jjb_v:jje_v,llm )
34  REAL,INTENT(in) :: pdt ! time step
35
36  ! local variables:
37
38  REAL :: modv(iip1,jjb_u:jje_u),zco,zsi
39  REAL :: vpn,vps,upoln,upols,vpols,vpoln
40  REAL :: u2(iip1,jjb_u:jje_u),v2(iip1,jjb_v:jje_v)
41  INTEGER :: i,j,l
42  REAL,PARAMETER :: cfric=1.e-5
43  LOGICAL,SAVE :: firstcall=.true.
44  INTEGER,SAVE :: friction_type=1
45  CHARACTER(len=20) :: modname="friction_p"
46  CHARACTER(len=80) :: abort_message
47!$OMP THREADPRIVATE(firstcall,friction_type)
48  integer :: jjb,jje
49
50!$OMP SINGLE
51  IF (firstcall) THEN
52    ! ! set friction type
53    call getin("friction_type",friction_type)
54    if ((friction_type.lt.0).or.(friction_type.gt.1)) then
55      abort_message="wrong friction type"
56      write(lunout,*)'Friction: wrong friction type',friction_type
57      call abort_gcm(modname,abort_message,42)
58    endif
59    firstcall=.false.
60  ENDIF
61!$OMP END SINGLE COPYPRIVATE(friction_type,firstcall)
62
63  if (friction_type.eq.0) then ! friction on first layer only
64!$OMP SINGLE
65  !   calcul des composantes au carre du vent naturel
66  jjb=jj_begin
67  jje=jj_end+1
68  if (pole_sud) jje=jj_end
69
70  do j=jjb,jje
71     do i=1,iip1
72        u2(i,j)=ucov(i,j,1)*ucov(i,j,1)*unscu2(i,j)
73     enddo
74  enddo
75
76  jjb=jj_begin-1
77  jje=jj_end+1
78  if (pole_nord) jjb=jj_begin
79  if (pole_sud) jje=jj_end-1
80
81  do j=jjb,jje
82     do i=1,iip1
83        v2(i,j)=vcov(i,j,1)*vcov(i,j,1)*unscv2(i,j)
84     enddo
85  enddo
86
87  !   calcul du module de V en dehors des poles
88  jjb=jj_begin
89  jje=jj_end+1
90  if (pole_nord) jjb=jj_begin+1
91  if (pole_sud) jje=jj_end-1
92
93  do j=jjb,jje
94     do i=2,iip1
95        modv(i,j)=sqrt(0.5*(u2(i-1,j)+u2(i,j)+v2(i,j-1)+v2(i,j)))
96     enddo
97     modv(1,j)=modv(iip1,j)
98  enddo
99
100  !   les deux composantes du vent au pole sont obtenues comme
101  !   premiers modes de fourier de v pres du pole
102  if (pole_nord) then
103
104    upoln=0.
105    vpoln=0.
106
107    do i=2,iip1
108       zco=cos(rlonv(i))*(rlonu(i)-rlonu(i-1))
109       zsi=sin(rlonv(i))*(rlonu(i)-rlonu(i-1))
110       vpn=vcov(i,1,1)/cv(i,1)
111       upoln=upoln+zco*vpn
112       vpoln=vpoln+zsi*vpn
113    enddo
114    vpn=sqrt(upoln*upoln+vpoln*vpoln)/pi
115    do i=1,iip1
116       ! modv(i,1)=vpn
117       modv(i,1)=modv(i,2)
118    enddo
119
120  endif
121
122  if (pole_sud) then
123
124    upols=0.
125    vpols=0.
126    do i=2,iip1
127       zco=cos(rlonv(i))*(rlonu(i)-rlonu(i-1))
128       zsi=sin(rlonv(i))*(rlonu(i)-rlonu(i-1))
129       vps=vcov(i,jjm,1)/cv(i,jjm)
130       upols=upols+zco*vps
131       vpols=vpols+zsi*vps
132    enddo
133    vps=sqrt(upols*upols+vpols*vpols)/pi
134    do i=1,iip1
135     ! modv(i,jjp1)=vps
136     modv(i,jjp1)=modv(i,jjm)
137    enddo
138
139  endif
140
141  !   calcul du frottement au sol.
142
143  jjb=jj_begin
144  jje=jj_end
145  if (pole_nord) jjb=jj_begin+1
146  if (pole_sud) jje=jj_end-1
147
148  do j=jjb,jje
149     do i=1,iim
150        ucov(i,j,1)=ucov(i,j,1) &
151              -cfric*pdt*0.5*(modv(i+1,j)+modv(i,j))*ucov(i,j,1)
152     enddo
153     ucov(iip1,j,1)=ucov(1,j,1)
154  enddo
155
156  jjb=jj_begin
157  jje=jj_end
158  if (pole_sud) jje=jj_end-1
159
160  do j=jjb,jje
161     do i=1,iip1
162        vcov(i,j,1)=vcov(i,j,1) &
163              -cfric*pdt*0.5*(modv(i,j+1)+modv(i,j))*vcov(i,j,1)
164     enddo
165     vcov(iip1,j,1)=vcov(1,j,1)
166  enddo
167!$OMP END SINGLE
168  endif ! of if (friction_type.eq.0)
169
170  if (friction_type.eq.1) then
171   ! ! for ucov()
172    jjb=jj_begin
173    jje=jj_end
174    if (pole_nord) jjb=jj_begin+1
175    if (pole_sud) jje=jj_end-1
176
177!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
178    do l=1,llm
179      ucov(1:iip1,jjb:jje,l)=ucov(1:iip1,jjb:jje,l)* &
180            (1.-pdt*kfrict(l))
181    enddo
182!$OMP END DO NOWAIT
183
184   ! ! for vcoc()
185    jjb=jj_begin
186    jje=jj_end
187    if (pole_sud) jje=jj_end-1
188
189!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
190    do l=1,llm
191      vcov(1:iip1,jjb:jje,l)=vcov(1:iip1,jjb:jje,l)* &
192            (1.-pdt*kfrict(l))
193    enddo
194!$OMP END DO
195  endif ! of if (friction_type.eq.1)
196
197  RETURN
198END SUBROUTINE friction_loc
199
Note: See TracBrowser for help on using the repository browser.