source: LMDZ6/trunk/libf/dyn3d/friction.F90 @ 5248

Last change on this file since 5248 was 5246, checked in by abarral, 23 hours ago

Convert fixed-form to free-form sources .F -> .{f,F}90
(WIP: some .F remain, will be handled in subsequent commits)

  • 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
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.5 KB
RevLine 
[524]1!
[1403]2! $Id: friction.F90 5246 2024-10-21 12:58:45Z abarral $
[524]3!
[5246]4!=======================================================================
5SUBROUTINE friction(ucov,vcov,pdt)
[1403]6
[5246]7  USE control_mod
[1454]8#ifdef CPP_IOIPSL
[5246]9  USE IOIPSL
[1454]10#else
[5246]11  ! if not using IOIPSL, we still need to use (a local version of) getin
12  USE ioipsl_getincom
[1454]13#endif
[5246]14  USE comconst_mod, ONLY: pi
15  IMPLICIT NONE
[524]16
[5246]17  !=======================================================================
18  !
19  !   Friction for the Newtonian case:
20  !   --------------------------------
21  !    2 possibilities (depending on flag 'friction_type'
22  ! friction_type=0 : A friction that is only applied to the lowermost
23  !                   atmospheric layer
24  ! friction_type=1 : Friction applied on all atmospheric layer (but
25  !   (default)       with stronger magnitude near the surface; see
26  !                   iniacademic.F)
27  !=======================================================================
[524]28
[5246]29  include "dimensions.h"
30  include "paramet.h"
31  include "comgeom2.h"
32  include "iniprint.h"
33  include "academic.h"
[524]34
[5246]35  ! arguments:
36  REAL,INTENT(out) :: ucov( iip1,jjp1,llm )
37  REAL,INTENT(out) :: vcov( iip1,jjm,llm )
38  REAL,INTENT(in) :: pdt ! time step
[1454]39
[5246]40  ! local variables:
[1454]41
[5246]42  REAL :: modv(iip1,jjp1),zco,zsi
43  REAL :: vpn,vps,upoln,upols,vpols,vpoln
44  REAL :: u2(iip1,jjp1),v2(iip1,jjm)
45  INTEGER :: i,j,l
46  REAL,PARAMETER :: cfric=1.e-5
47  LOGICAL,SAVE :: firstcall=.true.
48  INTEGER,SAVE :: friction_type=1
49  CHARACTER(len=20) :: modname="friction"
50  CHARACTER(len=80) :: abort_message
[524]51
[5246]52  IF (firstcall) THEN
53    ! ! set friction type
54    call getin("friction_type",friction_type)
55    if ((friction_type.lt.0).or.(friction_type.gt.1)) then
56      abort_message="wrong friction type"
57      write(lunout,*)'Friction: wrong friction type',friction_type
58      call abort_gcm(modname,abort_message,42)
59    endif
60    firstcall=.false.
61  ENDIF
[524]62
[5246]63  if (friction_type.eq.0) then
64  !   calcul des composantes au carre du vent naturel
65  do j=1,jjp1
66     do i=1,iip1
67        u2(i,j)=ucov(i,j,1)*ucov(i,j,1)*unscu2(i,j)
68     enddo
69  enddo
70  do j=1,jjm
71     do i=1,iip1
72        v2(i,j)=vcov(i,j,1)*vcov(i,j,1)*unscv2(i,j)
73     enddo
74  enddo
[524]75
[5246]76  !   calcul du module de V en dehors des poles
77  do j=2,jjm
78     do i=2,iip1
79        modv(i,j)=sqrt(0.5*(u2(i-1,j)+u2(i,j)+v2(i,j-1)+v2(i,j)))
80     enddo
81     modv(1,j)=modv(iip1,j)
82  enddo
[524]83
[5246]84  !   les deux composantes du vent au pole sont obtenues comme
85  !   premiers modes de fourier de v pres du pole
86  upoln=0.
87  vpoln=0.
88  upols=0.
89  vpols=0.
90  do i=2,iip1
91     zco=cos(rlonv(i))*(rlonu(i)-rlonu(i-1))
92     zsi=sin(rlonv(i))*(rlonu(i)-rlonu(i-1))
93     vpn=vcov(i,1,1)/cv(i,1)
94     vps=vcov(i,jjm,1)/cv(i,jjm)
95     upoln=upoln+zco*vpn
96     vpoln=vpoln+zsi*vpn
97     upols=upols+zco*vps
98     vpols=vpols+zsi*vps
99  enddo
100  vpn=sqrt(upoln*upoln+vpoln*vpoln)/pi
101  vps=sqrt(upols*upols+vpols*vpols)/pi
102  do i=1,iip1
103     ! modv(i,1)=vpn
104     ! modv(i,jjp1)=vps
105     modv(i,1)=modv(i,2)
106     modv(i,jjp1)=modv(i,jjm)
107  enddo
[524]108
[5246]109  !   calcul du frottement au sol.
110  do j=2,jjm
111     do i=1,iim
112        ucov(i,j,1)=ucov(i,j,1) &
113              -cfric*pdt*0.5*(modv(i+1,j)+modv(i,j))*ucov(i,j,1)
114     enddo
115     ucov(iip1,j,1)=ucov(1,j,1)
116  enddo
117  do j=1,jjm
118     do i=1,iip1
119        vcov(i,j,1)=vcov(i,j,1) &
120              -cfric*pdt*0.5*(modv(i,j+1)+modv(i,j))*vcov(i,j,1)
121     enddo
122     vcov(iip1,j,1)=vcov(1,j,1)
123  enddo
124  endif ! of if (friction_type.eq.0)
[524]125
[5246]126  if (friction_type.eq.1) then
127    do l=1,llm
128      ucov(:,:,l)=ucov(:,:,l)*(1.-pdt*kfrict(l))
129      vcov(:,:,l)=vcov(:,:,l)*(1.-pdt*kfrict(l))
130    enddo
131  endif
132
133  RETURN
134END SUBROUTINE friction
135
Note: See TracBrowser for help on using the repository browser.