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

Last change on this file since 834 was 724, checked in by dubos, 6 years ago

devel : updated generated kernels ; added missing SIMD directives

File size: 4.2 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_moist)
85      !DIR$ SIMD
86      DO ij=ij_omp_begin_ext,ij_omp_end_ext
87         pk(ij,llm) = ptop + .5*g* rhodz(ij,llm)*(1.+theta(ij,llm,2))
88      END DO
89      DO l = llm-1,1,-1
90         !DIR$ SIMD
91         DO ij=ij_omp_begin_ext,ij_omp_end_ext
92            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)) )
93         END DO
94      END DO
95      IF(caldyn_eta == eta_lag) THEN
96         !DIR$ SIMD
97         DO ij=ij_omp_begin_ext,ij_omp_end_ext
98            ps(ij) = pk(ij,1) + .5*g* rhodz(ij,1)*(1.+theta(ij,1,2))
99         END DO
100      END IF
101      DO l = 1,llm
102         !DIR$ SIMD
103         DO ij=ij_omp_begin_ext,ij_omp_end_ext
104            p_ik = pk(ij,l)
105            qv = theta(ij,l,2) ! water vaper mixing ratio = mv/md
106            Rmix = Rd+qv*Rv
107            chi = ( theta(ij,l,1) + Rmix*log(p_ik/preff) ) / (cpp + qv*cppv) ! log(T/Treff)
108            temp_ik = Treff*exp(chi)
109            ! specific volume v = R*T/p
110            ! R = (Rd + qv.Rv)/(1+qv)
111            gv = g*Rmix*temp_ik/(p_ik*(1+qv))
112            pk(ij,l) = temp_ik
113            geopot(ij,l+1) = geopot(ij,l) + gv*rhodz(ij,l)
114         END DO
115      END DO
116   END SELECT
117   !---------------------------- compute_geopot ----------------------------------
118   !--------------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.