My Project
 All Classes Files Functions Variables Macros
cv3_buoy.F
Go to the documentation of this file.
1  SUBROUTINE cv3_buoy (nloc,ncum,nd,icb,inb
2  : ,pbase,plcl,p,ph,ale,cin
3  : ,tv,tvp
4  : ,buoy )
5 ***************************************************************
6 * *
7 * cv3_buoy *
8 * buoyancy corrections to account for ale *
9 * *
10 * written by : moreau cecile, 07/08/2003, 15.55.48 *
11 * modified by : *
12 ***************************************************************
13 *
14  implicit none
15 
16 #include "cvthermo.h"
17 #include "cv3param.h"
18 
19 c input:
20  integer ncum, nd, nloc
21  integer icb(nloc), inb(nloc)
22  real pbase(nloc),plcl(nloc)
23  real p(nloc,nd), ph(nloc,nd+1)
24  real ale(nloc), cin(nloc)
25  real tv(nloc,nd), tvp(nloc,nd)
26 
27 c output:
28  real buoy(nloc,nd)
29 
30 c local variables:
31  integer il, k
32  integer kmx(nloc)
33  real bll(nloc), bmx(nloc)
34  real gamma(nloc)
35  logical ok(nloc)
36 
37  real dgamma
38  real buoymin
39  parameter(dgamma = 2.e-03) !dgamma gamma
40  parameter(buoymin = 2.)
41 
42  logical fixed_bll
43  SAVE fixed_bll
44  data fixed_bll /.true./
45 c$omp threadprivate(fixed_bll)
46 
47 
48 c print *,' Ale+cin ',ale(1)+cin(1)
49 c--------------------------------------------------------------
50 c recompute buoyancies
51 c--------------------------------------------------------------
52  DO k = 1,nl
53  DO il = 1,ncum
54  buoy(il,k) = tvp(il,k) - tv(il,k)
55  ENDDO
56  ENDDO
57 
58 c -------------------------------------------------------------
59 c -- compute low level buoyancy( function of ale+cin )
60 c -------------------------------------------------------------
61  IF (fixed_bll) THEN
62 c
63  do il = 1,ncum
64  bll(il) = 0.5
65  end DO
66  else
67 
68  do il = 1,ncum
69  IF (ale(il)+cin(il) .GT. 0.) THEN
70  gamma(il) = 4.*buoy(il,icb(il))**2
71  : + 8.*dgamma*(ale(il)+cin(il))*tv(il,icb(il))/grav
72  gamma(il) = max(gamma(il),1.e-10)
73  ENDIF
74  end do
75 
76  do il = 1,ncum
77  IF (ale(il)+cin(il) .GT. 0.) THEN
78  bll(il) = 4.*dgamma*(ale(il)+cin(il))*tv(il,icb(il))
79  : /(grav*(abs(buoy(il,icb(il))+0.5*sqrt(gamma(il)))))
80  ENDIF
81  end do
82 
83  do il = 1,ncum
84  IF (ale(il)+cin(il) .GT. 0.) THEN
85  bll(il) = min(bll(il),buoymin)
86  ENDIF
87  end DO
88 c
89  ENDIF !(fixed_bll)
90 
91 
92 c -------------------------------------------------------------
93 c --get highest buoyancy among levels below lcl-200hpa
94 c -------------------------------------------------------------
95 
96  do il = 1,ncum
97  bmx(il) =-1000.
98  kmx(il) = icb(il)
99  ok(il) = .true.
100  end do
101 
102  do k = 1,nl
103  do il = 1,ncum
104  IF (ale(il)+cin(il) .GT. 0. .AND. ok(il)) THEN
105  IF (k .GT. icb(il) .AND. k .LE. inb(il)) THEN
106 cc print *,'k,p(il,k),plcl(il)-200. ', k,p(il,k),plcl(il)-200.
107  IF (p(il,k) .GT. plcl(il)-200.) THEN
108  IF (buoy(il,k) .GT. bmx(il)) THEN
109  bmx(il) = buoy(il,k)
110  kmx(il) = k
111  IF (bmx(il) .GE. bll(il)) ok(il)=.false.
112  ENDIF
113  ENDIF
114  ENDIF
115  ENDIF
116  end do
117  end do
118 
119 c print *,' ==cv3_buoy== bll(1),bmx(1),icb(1),kmx(1) '
120 c $ ,bll(1),bmx(1),icb(1),kmx(1)
121 
122 c -------------------------------------------------------------
123 c --calculate modified buoyancies
124 c -------------------------------------------------------------
125 
126  do il = 1,ncum
127  IF (ale(il)+cin(il) .GT. 0.) THEN
128  bll(il) = min(bll(il),bmx(il))
129  ENDIF
130  end do
131 
132  do k = 1,nl
133  do il = 1,ncum
134  IF (ale(il)+cin(il) .GT. 0.) THEN
135  IF (k .GE. icb(il) .AND. k .LE. kmx(il)-1) THEN
136  buoy(il,k) = bll(il)
137  ENDIF
138  ENDIF
139  end do
140  end do
141 
142 
143 
144  RETURN
145  END