source: LMDZ6/branches/Amaury_dev/libf/dyn3d/advect.F90 @ 5136

Last change on this file since 5136 was 5136, checked in by abarral, 8 weeks ago

Put comgeom.h, comgeom2.h into modules

  • 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: 4.4 KB
Line 
1! $Header$
2
3SUBROUTINE advect(ucov, vcov, teta, w, massebx, masseby, du, dv, dteta)
4
5  USE comconst_mod, ONLY: daysec
6  USE logic_mod, ONLY: conser
7  USE ener_mod, ONLY: gtot
8  USE lmdz_ssum_scopy, ONLY: ssum
9  USE lmdz_comgeom
10
11  IMPLICIT NONE
12  !=======================================================================
13  !
14  !   Auteurs:  P. Le Van , Fr. Hourdin  .
15  !   -------
16  !
17  !   Objet:
18  !   ------
19  !
20  !   *************************************************************
21  !   .... calcul des termes d'advection vertic.pour u,v,teta,q ...
22  !   *************************************************************
23  !    ces termes sont ajoutes a du,dv,dteta et dq .
24  !  Modif F.Forget 03/94 : on retire q de advect
25  !
26  !=======================================================================
27  !-----------------------------------------------------------------------
28  !   Declarations:
29  !   -------------
30
31  INCLUDE "dimensions.h"
32  INCLUDE "paramet.h"
33
34  !   Arguments:
35  !   ----------
36
37  REAL :: vcov(ip1jm, llm), ucov(ip1jmp1, llm), teta(ip1jmp1, llm)
38  REAL :: massebx(ip1jmp1, llm), masseby(ip1jm, llm), w(ip1jmp1, llm)
39  REAL :: dv(ip1jm, llm), du(ip1jmp1, llm), dteta(ip1jmp1, llm)
40
41  !   Local:
42  !   ------
43
44  REAL :: uav(ip1jmp1, llm), vav(ip1jm, llm), wsur2(ip1jmp1)
45  REAL :: unsaire2(ip1jmp1), ge(ip1jmp1)
46  REAL :: deuxjour, ww, gt, uu, vv
47
48  INTEGER :: ij, l
49
50  !-----------------------------------------------------------------------
51  !   2. Calculs preliminaires:
52  !   -------------------------
53
54  IF (conser)  THEN
55    deuxjour = 2. * daysec
56
57    DO   ij = 1, ip1jmp1
58      unsaire2(ij) = unsaire(ij) * unsaire(ij)
59    END DO
60  END IF
61
62
63  !------------------  -yy ----------------------------------------------
64  !   .  Calcul de     u
65
66  DO  l = 1, llm
67    DO    ij = iip2, ip1jmp1
68      uav(ij, l) = 0.25 * (ucov(ij, l) + ucov(ij - iip1, l))
69    ENDDO
70    DO    ij = iip2, ip1jm
71      uav(ij, l) = uav(ij, l) + uav(ij + iip1, l)
72    ENDDO
73    DO      ij = 1, iip1
74      uav(ij, l) = 0.
75      uav(ip1jm + ij, l) = 0.
76    ENDDO
77  ENDDO
78
79  !------------------  -xx ----------------------------------------------
80  !   .  Calcul de     v
81
82  DO  l = 1, llm
83    DO    ij = 2, ip1jm
84      vav(ij, l) = 0.25 * (vcov(ij, l) + vcov(ij - 1, l))
85    ENDDO
86    DO    ij = 1, ip1jm, iip1
87      vav(ij, l) = vav(ij + iim, l)
88    ENDDO
89    DO    ij = 1, ip1jm - 1
90      vav(ij, l) = vav(ij, l) + vav(ij + 1, l)
91    ENDDO
92    DO    ij = 1, ip1jm, iip1
93      vav(ij + iim, l) = vav(ij, l)
94    ENDDO
95  ENDDO
96
97  !-----------------------------------------------------------------------
98
99  !
100  DO l = 1, llmm1
101
102
103    ! ......   calcul de  - w/2.    au niveau  l+1   .......
104
105    DO ij = 1, ip1jmp1
106      wsur2(ij) = - 0.5 * w(ij, l + 1)
107    END DO
108
109
110    ! .....................     calcul pour  du     ..................
111
112    DO ij = iip2, ip1jm - 1
113      ww = wsur2 (ij) + wsur2(ij + 1)
114      uu = 0.5 * (ucov(ij, l) + ucov(ij, l + 1))
115      du(ij, l) = du(ij, l) - ww * (uu - uav(ij, l)) / massebx(ij, l)
116      du(ij, l + 1) = du(ij, l + 1) + ww * (uu - uav(ij, l + 1)) / massebx(ij, l + 1)
117    END DO
118
119    ! .....  correction pour  du(iip1,j,l)  ........
120    ! .....     du(iip1,j,l)= du(1,j,l)   .....
121
122    !DIR$ IVDEP
123    DO   ij = iip1 + iip1, ip1jm, iip1
124      du(ij, l) = du(ij - iim, l)
125      du(ij, l + 1) = du(ij - iim, l + 1)
126    END DO
127
128    ! .................    calcul pour   dv      .....................
129
130    DO ij = 1, ip1jm
131      ww = wsur2(ij + iip1) + wsur2(ij)
132      vv = 0.5 * (vcov(ij, l) + vcov(ij, l + 1))
133      dv(ij, l) = dv(ij, l) - ww * (vv - vav(ij, l)) / masseby(ij, l)
134      dv(ij, l + 1) = dv(ij, l + 1) + ww * (vv - vav(ij, l + 1)) / masseby(ij, l + 1)
135    END DO
136
137    !
138
139    ! ............................................................
140    ! ...............    calcul pour   dh      ...................
141    ! ............................................................
142
143    !                   ---z
144    !   calcul de  - d( teta  * w )      qu'on ajoute a   dh
145    !               ...............
146
147    DO ij = 1, ip1jmp1
148      ww = wsur2(ij) * (teta(ij, l) + teta(ij, l + 1))
149      dteta(ij, l) = dteta(ij, l) - ww
150      dteta(ij, l + 1) = dteta(ij, l + 1) + ww
151    END DO
152
153    IF(conser)  THEN
154      DO ij = 1, ip1jmp1
155        ge(ij) = wsur2(ij) * wsur2(ij) * unsaire2(ij)
156      END DO
157      gt = SSUM(ip1jmp1, ge, 1)
158      gtot(l) = deuxjour * SQRT(gt / ip1jmp1)
159    END IF
160
161  END DO
162
163
164END SUBROUTINE advect
Note: See TracBrowser for help on using the repository browser.