/[lmdze]/trunk/dyn3d/advect.f
ViewVC logotype

Contents of /trunk/dyn3d/advect.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 43 - (show annotations)
Fri Apr 8 12:43:31 2011 UTC (13 years, 1 month ago) by guez
Original Path: trunk/libf/dyn3d/advect.f90
File size: 4694 byte(s)
"start_init_phys" is now called directly by "etat0" instead of through
"start_init_dyn". "qsol_2d" is no longer a variable of module
"start_init_phys_m", it is an argument of
"start_init_phys". "start_init_dyn" now receives "tsol_2d" from
"etat0".

Split file "vlspltqs.f" into "vlspltqs.f90", "vlxqs.f90" and
""vlyqs.f90".

In "start_init_orog", replaced calls to "flin*" by calls to NetCDF95.

1 SUBROUTINE advect(ucov, vcov, teta, w, massebx, masseby, du, dv, dteta, conser)
2
3 ! From dyn3d/advect.F, v 1.1.1.1 2004/05/19 12:53:06
4 ! Auteurs: P. Le Van , Fr. Hourdin .
5 ! Objet:
6 ! .... calcul des termes d'advection vertic.pour u, v, teta, q ...
7 ! ces termes sont ajoutes a du, dv, dteta et dq .
8 ! Modif F.Forget 03/94 : on retire q de advect
9
10 USE dimens_m
11 USE paramet_m
12 USE comconst
13 USE comvert
14 USE comgeom
15 USE ener
16
17 IMPLICIT NONE
18
19 ! Arguments:
20
21 REAL vcov(ip1jm, llm), ucov(ip1jmp1, llm)
22 real, intent(in):: teta(ip1jmp1, llm)
23 REAL massebx(ip1jmp1, llm), masseby(ip1jm, llm)
24 real, INTENT (IN):: w(ip1jmp1, llm)
25 REAL dv(ip1jm, llm), du(ip1jmp1, llm), dteta(ip1jmp1, llm)
26 LOGICAL, INTENT (IN):: conser
27
28 ! Local:
29
30 REAL uav(ip1jmp1, llm), vav(ip1jm, llm), wsur2(ip1jmp1)
31 REAL unsaire2(ip1jmp1), ge(ip1jmp1)
32 REAL deuxjour, ww, gt, uu, vv
33
34 INTEGER ij, l
35
36 REAL ssum
37
38 !-----------------------------------------------------------------------
39 ! 2. Calculs preliminaires:
40 ! -------------------------
41
42 IF (conser) THEN
43 deuxjour = 2.*daysec
44
45 DO ij = 1, ip1jmp1
46 unsaire2(ij) = unsaire(ij)*unsaire(ij)
47 end DO
48 END IF
49
50
51 !------------------ -yy ----------------------------------------------
52 ! . Calcul de u
53
54 DO l = 1, llm
55 DO ij = iip2, ip1jmp1
56 uav(ij, l) = 0.25*(ucov(ij, l)+ucov(ij-iip1, l))
57 END DO
58 DO ij = iip2, ip1jm
59 uav(ij, l) = uav(ij, l) + uav(ij+iip1, l)
60 END DO
61 DO ij = 1, iip1
62 uav(ij, l) = 0.
63 uav(ip1jm+ij, l) = 0.
64 END DO
65 END DO
66
67 !------------------ -xx ----------------------------------------------
68 ! . Calcul de v
69
70 DO l = 1, llm
71 DO ij = 2, ip1jm
72 vav(ij, l) = 0.25*(vcov(ij, l)+vcov(ij-1, l))
73 END DO
74 DO ij = 1, ip1jm, iip1
75 vav(ij, l) = vav(ij+iim, l)
76 END DO
77 DO ij = 1, ip1jm - 1
78 vav(ij, l) = vav(ij, l) + vav(ij+1, l)
79 END DO
80 DO ij = 1, ip1jm, iip1
81 vav(ij+iim, l) = vav(ij, l)
82 END DO
83 END DO
84
85 !-----------------------------------------------------------------------
86
87
88 DO l = 1, llmm1
89
90
91 ! ...... calcul de - w/2. au niveau l+1 .......
92
93 DO ij = 1, ip1jmp1
94 wsur2(ij) = -0.5*w(ij, l+1)
95 END DO
96
97
98 ! ..................... calcul pour du ..................
99
100 DO ij = iip2, ip1jm - 1
101 ww = wsur2(ij) + wsur2(ij+1)
102 uu = 0.5*(ucov(ij, l)+ucov(ij, l+1))
103 du(ij, l) = du(ij, l) - ww*(uu-uav(ij, l))/massebx(ij, l)
104 du(ij, l+1) = du(ij, l+1) + ww*(uu-uav(ij, l+1))/massebx(ij, l+1)
105 END DO
106
107 ! ..... correction pour du(iip1, j, l) ........
108 ! ..... du(iip1, j, l)= du(1, j, l) .....
109
110 !DIR$ IVDEP
111 DO ij = iip1 + iip1, ip1jm, iip1
112 du(ij, l) = du(ij-iim, l)
113 du(ij, l+1) = du(ij-iim, l+1)
114 END DO
115
116 ! ................. calcul pour dv .....................
117
118 DO ij = 1, ip1jm
119 ww = wsur2(ij+iip1) + wsur2(ij)
120 vv = 0.5*(vcov(ij, l)+vcov(ij, l+1))
121 dv(ij, l) = dv(ij, l) - ww*(vv-vav(ij, l))/masseby(ij, l)
122 dv(ij, l+1) = dv(ij, l+1) + ww*(vv-vav(ij, l+1))/masseby(ij, l+1)
123 END DO
124
125
126
127 ! ............................................................
128 ! ............... calcul pour dh ...................
129 ! ............................................................
130
131 ! ---z
132 ! calcul de - d( teta * w ) qu'on ajoute a dh
133 ! ...............
134
135 DO ij = 1, ip1jmp1
136 ww = wsur2(ij)*(teta(ij, l)+teta(ij, l+1))
137 dteta(ij, l) = dteta(ij, l) - ww
138 dteta(ij, l+1) = dteta(ij, l+1) + ww
139 end DO
140
141 IF (conser) THEN
142 DO ij = 1, ip1jmp1
143 ge(ij) = wsur2(ij)*wsur2(ij)*unsaire2(ij)
144 end DO
145 gt = ssum(ip1jmp1, ge, 1)
146 gtot(l) = deuxjour*sqrt(gt/ip1jmp1)
147 END IF
148
149 END DO
150
151 END SUBROUTINE advect

  ViewVC Help
Powered by ViewVC 1.1.21