source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/friction_loc.f90 @ 5120

Last change on this file since 5120 was 5118, checked in by abarral, 2 months ago

Replace iniprint.h by lmdz_iniprint.f90
(lint) along the way

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