1 | !-------------------------------------------------------------------------- |
---|
2 | !---------------------------- energy_fluxes ---------------------------------- |
---|
3 | ! First diagnose geopotential and temperature, column-wise |
---|
4 | !$OMP BARRIER |
---|
5 | !DIR$ SIMD |
---|
6 | DO ij=ij_omp_begin_ext,ij_omp_end_ext |
---|
7 | pk(ij,llm) = ptop + .5*g*rhodz(ij,llm) |
---|
8 | END DO |
---|
9 | DO l = llm-1,1,-1 |
---|
10 | !DIR$ SIMD |
---|
11 | DO ij=ij_omp_begin_ext,ij_omp_end_ext |
---|
12 | pk(ij,l) = pk(ij,l+1) + (.5*g)*( rhodz(ij,l)+rhodz(ij,l+1) ) |
---|
13 | END DO |
---|
14 | END DO |
---|
15 | ! NB : at this point pressure is stored in array pk |
---|
16 | ! pk then serves as buffer to store temperature |
---|
17 | SELECT CASE(caldyn_thermo) |
---|
18 | CASE(thermo_theta) |
---|
19 | DO l = 1,llm |
---|
20 | !DIR$ SIMD |
---|
21 | DO ij=ij_omp_begin_ext,ij_omp_end_ext |
---|
22 | p_ik = pk(ij,l) |
---|
23 | theta_ik = theta_rhodz(ij,l,1)/rhodz(ij,l) |
---|
24 | theta(ij,l) = theta_ik |
---|
25 | temp_ik = theta_ik*(p_ik/preff)**kappa |
---|
26 | gv = (g*Rd)*temp_ik/p_ik |
---|
27 | pk(ij,l) = temp_ik |
---|
28 | geopot(ij,l+1) = geopot(ij,l) + gv*rhodz(ij,l) |
---|
29 | END DO |
---|
30 | END DO |
---|
31 | CASE(thermo_entropy) |
---|
32 | DO l = 1,llm |
---|
33 | !DIR$ SIMD |
---|
34 | DO ij=ij_omp_begin_ext,ij_omp_end_ext |
---|
35 | p_ik = pk(ij,l) |
---|
36 | theta_ik = theta_rhodz(ij,l,1)/rhodz(ij,l) |
---|
37 | temp_ik = Treff*exp((theta_ik + Rd*log(p_ik/preff))/cpp) |
---|
38 | theta(ij,l) = Treff*exp(theta_ik/cpp) |
---|
39 | gv = (g*Rd)*temp_ik/p_ik ! specific volume v = Rd*T/p |
---|
40 | pk(ij,l) = temp_ik |
---|
41 | geopot(ij,l+1) = geopot(ij,l) + gv*rhodz(ij,l) |
---|
42 | END DO |
---|
43 | END DO |
---|
44 | END SELECT |
---|
45 | !$OMP BARRIER |
---|
46 | ! Now accumulate energies and energy fluxes |
---|
47 | ! NB : at this point temperature is stored in array pk |
---|
48 | ! pk then serves as buffer to store energy |
---|
49 | ! enthalpy |
---|
50 | DO l = ll_begin, ll_end |
---|
51 | !DIR$ SIMD |
---|
52 | DO ij=ij_begin_ext, ij_end_ext |
---|
53 | energy = cpp*pk(ij,l) |
---|
54 | enthalpy(ij,l) = enthalpy(ij,l) + frac*rhodz(ij,l)*energy |
---|
55 | pk(ij,l) = energy |
---|
56 | END DO |
---|
57 | END DO |
---|
58 | DO l = ll_begin, ll_end |
---|
59 | !DIR$ SIMD |
---|
60 | DO ij=ij_begin_ext, ij_end_ext |
---|
61 | enthalpy_flux(ij+u_right,l) = enthalpy_flux(ij+u_right,l) + .5*massflux(ij+u_right,l)*(pk(ij,l)+pk(ij+t_right,l)) |
---|
62 | enthalpy_flux(ij+u_lup,l) = enthalpy_flux(ij+u_lup,l) + .5*massflux(ij+u_lup,l)*(pk(ij,l)+pk(ij+t_lup,l)) |
---|
63 | enthalpy_flux(ij+u_ldown,l) = enthalpy_flux(ij+u_ldown,l) + .5*massflux(ij+u_ldown,l)*(pk(ij,l)+pk(ij+t_ldown,l)) |
---|
64 | END DO |
---|
65 | END DO |
---|
66 | ! potential energy |
---|
67 | DO l = ll_begin, ll_end |
---|
68 | !DIR$ SIMD |
---|
69 | DO ij=ij_begin_ext, ij_end_ext |
---|
70 | energy = .5*(geopot(ij,l+1)+geopot(ij,l)) |
---|
71 | epot(ij,l) = epot(ij,l) + frac*rhodz(ij,l)*energy |
---|
72 | pk(ij,l) = energy |
---|
73 | END DO |
---|
74 | END DO |
---|
75 | DO l = ll_begin, ll_end |
---|
76 | !DIR$ SIMD |
---|
77 | DO ij=ij_begin_ext, ij_end_ext |
---|
78 | epot_flux(ij+u_right,l) = epot_flux(ij+u_right,l) + .5*massflux(ij+u_right,l)*(pk(ij,l)+pk(ij+t_right,l)) |
---|
79 | epot_flux(ij+u_lup,l) = epot_flux(ij+u_lup,l) + .5*massflux(ij+u_lup,l)*(pk(ij,l)+pk(ij+t_lup,l)) |
---|
80 | epot_flux(ij+u_ldown,l) = epot_flux(ij+u_ldown,l) + .5*massflux(ij+u_ldown,l)*(pk(ij,l)+pk(ij+t_ldown,l)) |
---|
81 | END DO |
---|
82 | END DO |
---|
83 | ! theta |
---|
84 | DO l = ll_begin, ll_end |
---|
85 | !DIR$ SIMD |
---|
86 | DO ij=ij_begin_ext, ij_end_ext |
---|
87 | energy = theta(ij,l) |
---|
88 | thetat(ij,l) = thetat(ij,l) + frac*rhodz(ij,l)*energy |
---|
89 | pk(ij,l) = energy |
---|
90 | END DO |
---|
91 | END DO |
---|
92 | DO l = ll_begin, ll_end |
---|
93 | !DIR$ SIMD |
---|
94 | DO ij=ij_begin_ext, ij_end_ext |
---|
95 | thetat_flux(ij+u_right,l) = thetat_flux(ij+u_right,l) + .5*massflux(ij+u_right,l)*(pk(ij,l)+pk(ij+t_right,l)) |
---|
96 | thetat_flux(ij+u_lup,l) = thetat_flux(ij+u_lup,l) + .5*massflux(ij+u_lup,l)*(pk(ij,l)+pk(ij+t_lup,l)) |
---|
97 | thetat_flux(ij+u_ldown,l) = thetat_flux(ij+u_ldown,l) + .5*massflux(ij+u_ldown,l)*(pk(ij,l)+pk(ij+t_ldown,l)) |
---|
98 | END DO |
---|
99 | END DO |
---|
100 | ! kinetic energy |
---|
101 | DO l = ll_begin, ll_end |
---|
102 | !DIR$ SIMD |
---|
103 | DO ij=ij_begin_ext, ij_end_ext |
---|
104 | energy=0.d0 |
---|
105 | energy = energy + le(ij+u_rup)*de(ij+u_rup)*ue(ij+u_rup,l)**2 |
---|
106 | energy = energy + le(ij+u_lup)*de(ij+u_lup)*ue(ij+u_lup,l)**2 |
---|
107 | energy = energy + le(ij+u_left)*de(ij+u_left)*ue(ij+u_left,l)**2 |
---|
108 | energy = energy + le(ij+u_ldown)*de(ij+u_ldown)*ue(ij+u_ldown,l)**2 |
---|
109 | energy = energy + le(ij+u_rdown)*de(ij+u_rdown)*ue(ij+u_rdown,l)**2 |
---|
110 | energy = energy + le(ij+u_right)*de(ij+u_right)*ue(ij+u_right,l)**2 |
---|
111 | energy = energy * (.25/Ai(ij)) |
---|
112 | ekin(ij,l) = ekin(ij,l) + frac*rhodz(ij,l)*energy |
---|
113 | pk(ij,l) = energy |
---|
114 | END DO |
---|
115 | END DO |
---|
116 | DO l = ll_begin, ll_end |
---|
117 | !DIR$ SIMD |
---|
118 | DO ij=ij_begin_ext, ij_end_ext |
---|
119 | ekin_flux(ij+u_right,l) = ekin_flux(ij+u_right,l) + .5*massflux(ij+u_right,l)*(pk(ij,l)+pk(ij+t_right,l)) |
---|
120 | ekin_flux(ij+u_lup,l) = ekin_flux(ij+u_lup,l) + .5*massflux(ij+u_lup,l)*(pk(ij,l)+pk(ij+t_lup,l)) |
---|
121 | ekin_flux(ij+u_ldown,l) = ekin_flux(ij+u_ldown,l) + .5*massflux(ij+u_ldown,l)*(pk(ij,l)+pk(ij+t_ldown,l)) |
---|
122 | END DO |
---|
123 | END DO |
---|
124 | ! ulon |
---|
125 | DO l = ll_begin, ll_end |
---|
126 | !DIR$ SIMD |
---|
127 | DO ij=ij_begin_ext, ij_end_ext |
---|
128 | cx=centroid(ij,1) |
---|
129 | cy=centroid(ij,2) |
---|
130 | cz=centroid(ij,3) |
---|
131 | ux=0. ; uy=0. ; uz=0. |
---|
132 | ue_le = ne_rup*ue(ij+u_rup,l)*le(ij+u_rup) |
---|
133 | ux = ux + ue_le*(.5*(xyz_v(ij+z_rup,1)+xyz_v(ij+z_up,1))-cx) |
---|
134 | uy = uy + ue_le*(.5*(xyz_v(ij+z_rup,2)+xyz_v(ij+z_up,2))-cy) |
---|
135 | uz = uz + ue_le*(.5*(xyz_v(ij+z_rup,3)+xyz_v(ij+z_up,3))-cz) |
---|
136 | ue_le = ne_lup*ue(ij+u_lup,l)*le(ij+u_lup) |
---|
137 | ux = ux + ue_le*(.5*(xyz_v(ij+z_lup,1)+xyz_v(ij+z_up,1))-cx) |
---|
138 | uy = uy + ue_le*(.5*(xyz_v(ij+z_lup,2)+xyz_v(ij+z_up,2))-cy) |
---|
139 | uz = uz + ue_le*(.5*(xyz_v(ij+z_lup,3)+xyz_v(ij+z_up,3))-cz) |
---|
140 | ue_le = ne_left*ue(ij+u_left,l)*le(ij+u_left) |
---|
141 | ux = ux + ue_le*(.5*(xyz_v(ij+z_lup,1)+xyz_v(ij+z_ldown,1))-cx) |
---|
142 | uy = uy + ue_le*(.5*(xyz_v(ij+z_lup,2)+xyz_v(ij+z_ldown,2))-cy) |
---|
143 | uz = uz + ue_le*(.5*(xyz_v(ij+z_lup,3)+xyz_v(ij+z_ldown,3))-cz) |
---|
144 | ue_le = ne_ldown*ue(ij+u_ldown,l)*le(ij+u_ldown) |
---|
145 | ux = ux + ue_le*(.5*(xyz_v(ij+z_ldown,1)+xyz_v(ij+z_down,1))-cx) |
---|
146 | uy = uy + ue_le*(.5*(xyz_v(ij+z_ldown,2)+xyz_v(ij+z_down,2))-cy) |
---|
147 | uz = uz + ue_le*(.5*(xyz_v(ij+z_ldown,3)+xyz_v(ij+z_down,3))-cz) |
---|
148 | ue_le = ne_rdown*ue(ij+u_rdown,l)*le(ij+u_rdown) |
---|
149 | ux = ux + ue_le*(.5*(xyz_v(ij+z_rdown,1)+xyz_v(ij+z_down,1))-cx) |
---|
150 | uy = uy + ue_le*(.5*(xyz_v(ij+z_rdown,2)+xyz_v(ij+z_down,2))-cy) |
---|
151 | uz = uz + ue_le*(.5*(xyz_v(ij+z_rdown,3)+xyz_v(ij+z_down,3))-cz) |
---|
152 | ue_le = ne_right*ue(ij+u_right,l)*le(ij+u_right) |
---|
153 | ux = ux + ue_le*(.5*(xyz_v(ij+z_rup,1)+xyz_v(ij+z_rdown,1))-cx) |
---|
154 | uy = uy + ue_le*(.5*(xyz_v(ij+z_rup,2)+xyz_v(ij+z_rdown,2))-cy) |
---|
155 | uz = uz + ue_le*(.5*(xyz_v(ij+z_rup,3)+xyz_v(ij+z_rdown,3))-cz) |
---|
156 | ulon_i = ux*elon_i(ij,1) + uy*elon_i(ij,2) + uz*elon_i(ij,3) |
---|
157 | energy = ulon_i*(1./Ai(ij)) |
---|
158 | ulon(ij,l) = ulon(ij,l) + frac*rhodz(ij,l)*energy |
---|
159 | pk(ij,l) = energy |
---|
160 | END DO |
---|
161 | END DO |
---|
162 | DO l = ll_begin, ll_end |
---|
163 | !DIR$ SIMD |
---|
164 | DO ij=ij_begin_ext, ij_end_ext |
---|
165 | ulon_flux(ij+u_right,l) = ulon_flux(ij+u_right,l) + .5*massflux(ij+u_right,l)*(pk(ij,l)+pk(ij+t_right,l)) |
---|
166 | ulon_flux(ij+u_lup,l) = ulon_flux(ij+u_lup,l) + .5*massflux(ij+u_lup,l)*(pk(ij,l)+pk(ij+t_lup,l)) |
---|
167 | ulon_flux(ij+u_ldown,l) = ulon_flux(ij+u_ldown,l) + .5*massflux(ij+u_ldown,l)*(pk(ij,l)+pk(ij+t_ldown,l)) |
---|
168 | END DO |
---|
169 | END DO |
---|
170 | !---------------------------- energy_fluxes ---------------------------------- |
---|
171 | !-------------------------------------------------------------------------- |
---|