source: codes/icosagcm/devel/src/kernels_hex/compute_geopot.k90 @ 836

Last change on this file since 836 was 836, checked in by dubos, 5 years ago

devel : Cp(T) thermodynamics (TBC)

File size: 5.3 KB
Line 
1   !--------------------------------------------------------------------------
2   !---------------------------- compute_geopot ----------------------------------
3   SELECT CASE(caldyn_thermo)
4   CASE(thermo_boussinesq)
5      ! use hydrostatic balance with theta*rhodz to find pk (=Lagrange multiplier=pressure)
6      !DIR$ SIMD
7      DO ij=ij_omp_begin_ext,ij_omp_end_ext
8         pk(ij,llm) = ptop + .5*g* theta(ij,llm,1)*rhodz(ij,llm)
9      END DO
10      DO l = llm-1,1,-1
11         !DIR$ SIMD
12         DO ij=ij_omp_begin_ext,ij_omp_end_ext
13            pk(ij,l) = pk(ij,l+1) + (.5*g)*( theta(ij,l,1)*rhodz(ij,l) + theta(ij,l+1,1)*rhodz(ij,l+1) )
14         END DO
15      END DO
16      IF(caldyn_eta == eta_lag) THEN
17         !DIR$ SIMD
18         DO ij=ij_omp_begin_ext,ij_omp_end_ext
19            ps(ij) = pk(ij,1) + .5*g* theta(ij,1,1)*rhodz(ij,1)
20         END DO
21      END IF
22      ! now pk contains the Lagrange multiplier (pressure)
23      ! specific volume 1 = dphi/g/rhodz
24      DO l = 1,llm
25         !DIR$ SIMD
26         DO ij=ij_omp_begin_ext,ij_omp_end_ext
27            geopot(ij,l+1) = geopot(ij,l) + g*rhodz(ij,l)
28         END DO
29      END DO
30   CASE(thermo_theta)
31      !DIR$ SIMD
32      DO ij=ij_omp_begin_ext,ij_omp_end_ext
33         pk(ij,llm) = ptop + .5*g* rhodz(ij,llm)
34      END DO
35      DO l = llm-1,1,-1
36         !DIR$ SIMD
37         DO ij=ij_omp_begin_ext,ij_omp_end_ext
38            pk(ij,l) = pk(ij,l+1) + (.5*g)*( rhodz(ij,l) + rhodz(ij,l+1) )
39         END DO
40      END DO
41      IF(caldyn_eta == eta_lag) THEN
42         !DIR$ SIMD
43         DO ij=ij_omp_begin_ext,ij_omp_end_ext
44            ps(ij) = pk(ij,1) + .5*g* rhodz(ij,1)
45         END DO
46      END IF
47      DO l = 1,llm
48         !DIR$ SIMD
49         DO ij=ij_omp_begin_ext,ij_omp_end_ext
50            p_ik = pk(ij,l)
51            exner_ik = cpp * (p_ik/preff) ** kappa
52            gv = (g*kappa)*theta(ij,l,1)*exner_ik/p_ik
53            pk(ij,l) = exner_ik
54            geopot(ij,l+1) = geopot(ij,l) + gv*rhodz(ij,l)
55         END DO
56      END DO
57   CASE(thermo_entropy)
58      !DIR$ SIMD
59      DO ij=ij_omp_begin_ext,ij_omp_end_ext
60         pk(ij,llm) = ptop + .5*g* rhodz(ij,llm)
61      END DO
62      DO l = llm-1,1,-1
63         !DIR$ SIMD
64         DO ij=ij_omp_begin_ext,ij_omp_end_ext
65            pk(ij,l) = pk(ij,l+1) + (.5*g)*( rhodz(ij,l) + rhodz(ij,l+1) )
66         END DO
67      END DO
68      IF(caldyn_eta == eta_lag) THEN
69         !DIR$ SIMD
70         DO ij=ij_omp_begin_ext,ij_omp_end_ext
71            ps(ij) = pk(ij,1) + .5*g* rhodz(ij,1)
72         END DO
73      END IF
74      DO l = 1,llm
75         !DIR$ SIMD
76         DO ij=ij_omp_begin_ext,ij_omp_end_ext
77            p_ik = pk(ij,l)
78            temp_ik = Treff*exp((theta(ij,l,1) + Rd*log(p_ik/preff))/cpp)
79            gv = (g*Rd)*temp_ik/p_ik ! specific volume v = Rd*T/p
80            pk(ij,l) = temp_ik
81            geopot(ij,l+1) = geopot(ij,l) + gv*rhodz(ij,l)
82         END DO
83      END DO
84   CASE(thermo_variable_Cp)
85      ! thermodynamics with variable Cp
86      ! Cp.dT = dh = Tds + vdp
87      ! pv = RT
88      ! => ds = (dh+v.dp)/T = Cp.dT/T - R dp/p
89      ! Cp(T) = Cp0 * (T/T0)^nu
90      ! => s(p,T) = Cp(T)/nu - R log(p/preff)
91      ! h = Cp(T).T/(nu+1)
92      !DIR$ SIMD
93      DO ij=ij_omp_begin_ext,ij_omp_end_ext
94         pk(ij,llm) = ptop + .5*g* rhodz(ij,llm)
95      END DO
96      DO l = llm-1,1,-1
97         !DIR$ SIMD
98         DO ij=ij_omp_begin_ext,ij_omp_end_ext
99            pk(ij,l) = pk(ij,l+1) + (.5*g)*( rhodz(ij,l) + rhodz(ij,l+1) )
100         END DO
101      END DO
102      IF(caldyn_eta == eta_lag) THEN
103         !DIR$ SIMD
104         DO ij=ij_omp_begin_ext,ij_omp_end_ext
105            ps(ij) = pk(ij,1) + .5*g* rhodz(ij,1)
106         END DO
107      END IF
108      DO l = 1,llm
109         !DIR$ SIMD
110         DO ij=ij_omp_begin_ext,ij_omp_end_ext
111            p_ik = pk(ij,l)
112            Cp_ik = nu*( theta(ij,l,1) + Rd*log(p_ik/preff) )
113            temp_ik = Treff* (Cp_ik/cpp)**(1./nu)
114            gv = (g*Rd)*temp_ik/p_ik ! specific volume v = Rd*T/p
115            pk(ij,l) = temp_ik
116            geopot(ij,l+1) = geopot(ij,l) + gv*rhodz(ij,l)
117         END DO
118      END DO
119   CASE(thermo_moist)
120      !DIR$ SIMD
121      DO ij=ij_omp_begin_ext,ij_omp_end_ext
122         pk(ij,llm) = ptop + .5*g* rhodz(ij,llm)*(1.+theta(ij,llm,2))
123      END DO
124      DO l = llm-1,1,-1
125         !DIR$ SIMD
126         DO ij=ij_omp_begin_ext,ij_omp_end_ext
127            pk(ij,l) = pk(ij,l+1) + (.5*g)*( rhodz(ij,l)*(1.+theta(ij,l,2)) + rhodz(ij,l+1)*(1.+theta(ij,l+1,2)) )
128         END DO
129      END DO
130      IF(caldyn_eta == eta_lag) THEN
131         !DIR$ SIMD
132         DO ij=ij_omp_begin_ext,ij_omp_end_ext
133            ps(ij) = pk(ij,1) + .5*g* rhodz(ij,1)*(1.+theta(ij,1,2))
134         END DO
135      END IF
136      DO l = 1,llm
137         !DIR$ SIMD
138         DO ij=ij_omp_begin_ext,ij_omp_end_ext
139            p_ik = pk(ij,l)
140            qv = theta(ij,l,2) ! water vaper mixing ratio = mv/md
141            Rmix = Rd+qv*Rv
142            chi = ( theta(ij,l,1) + Rmix*log(p_ik/preff) ) / (cpp + qv*cppv) ! log(T/Treff)
143            temp_ik = Treff*exp(chi)
144            ! specific volume v = R*T/p
145            ! R = (Rd + qv.Rv)/(1+qv)
146            gv = g*Rmix*temp_ik/(p_ik*(1+qv))
147            pk(ij,l) = temp_ik
148            geopot(ij,l+1) = geopot(ij,l) + gv*rhodz(ij,l)
149         END DO
150      END DO
151   END SELECT
152   !---------------------------- compute_geopot ----------------------------------
153   !--------------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.