source: codes/icosagcm/devel/src/kernels_unst/compute_geopot.k90 @ 686

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

devel/unstructured : piecewise-constant vertical remapping

File size: 3.7 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      !$OMP DO SCHEDULE(STATIC)
7      DO ij=1,primal_num
8         pk(llm,ij) = ptop + .5*g* theta(llm,ij,1)*rhodz(llm,ij)
9         DO l = llm-1,1,-1
10            pk(l,ij) = pk(l+1,ij) + (.5*g)*( theta(l,ij,1)*rhodz(l,ij) + theta(l+1,ij,1)*rhodz(l+1,ij) )
11         END DO
12         IF(caldyn_eta == eta_lag) THEN
13            ps(ij) = pk(1,ij) + .5*g* theta(1,ij,1)*rhodz(1,ij)
14         END IF
15      END DO
16      !$OMP END DO
17      ! now pk contains the Lagrange multiplier (pressure)
18      ! specific volume 1 = dphi/g/rhodz
19      !$OMP DO SCHEDULE(STATIC)
20      DO ij=1,primal_num
21         DO l = 1,llm
22            geopot(l+1,ij) = geopot(l,ij) + g*rhodz(l,ij)
23         END DO
24      END DO
25      !$OMP END DO
26   CASE(thermo_theta)
27      !$OMP DO SCHEDULE(STATIC)
28      DO ij=1,primal_num
29         pk(llm,ij) = ptop + .5*g* rhodz(llm,ij)
30         DO l = llm-1,1,-1
31            pk(l,ij) = pk(l+1,ij) + (.5*g)*( rhodz(l,ij) + rhodz(l+1,ij) )
32         END DO
33         IF(caldyn_eta == eta_lag) THEN
34            ps(ij) = pk(1,ij) + .5*g* rhodz(1,ij)
35         END IF
36      END DO
37      !$OMP END DO
38      !$OMP DO SCHEDULE(STATIC)
39      DO ij=1,primal_num
40         DO l = 1,llm
41            p_ik = pk(l,ij)
42            exner_ik = cpp * (p_ik/preff) ** kappa
43            gv = (g*kappa)*theta(l,ij,1)*exner_ik/p_ik
44            pk(l,ij) = exner_ik
45            geopot(l+1,ij) = geopot(l,ij) + gv*rhodz(l,ij)
46         END DO
47      END DO
48      !$OMP END DO
49   CASE(thermo_entropy)
50      !$OMP DO SCHEDULE(STATIC)
51      DO ij=1,primal_num
52         pk(llm,ij) = ptop + .5*g* rhodz(llm,ij)
53         DO l = llm-1,1,-1
54            pk(l,ij) = pk(l+1,ij) + (.5*g)*( rhodz(l,ij) + rhodz(l+1,ij) )
55         END DO
56         IF(caldyn_eta == eta_lag) THEN
57            ps(ij) = pk(1,ij) + .5*g* rhodz(1,ij)
58         END IF
59      END DO
60      !$OMP END DO
61      !$OMP DO SCHEDULE(STATIC)
62      DO ij=1,primal_num
63         DO l = 1,llm
64            p_ik = pk(l,ij)
65            temp_ik = Treff*exp((theta(l,ij,1) + Rd*log(p_ik/preff))/cpp)
66            gv = (g*Rd)*temp_ik/p_ik ! specific volume v = Rd*T/p
67            pk(l,ij) = temp_ik
68            geopot(l+1,ij) = geopot(l,ij) + gv*rhodz(l,ij)
69         END DO
70      END DO
71      !$OMP END DO
72   CASE(thermo_moist)
73      !$OMP DO SCHEDULE(STATIC)
74      DO ij=1,primal_num
75         pk(llm,ij) = ptop + .5*g* rhodz(llm,ij)*(1.+theta(llm,ij,2))
76         DO l = llm-1,1,-1
77            pk(l,ij) = pk(l+1,ij) + (.5*g)*( rhodz(l,ij)*(1.+theta(l,ij,2)) + rhodz(l+1,ij)*(1.+theta(l+1,ij,2)) )
78         END DO
79         IF(caldyn_eta == eta_lag) THEN
80            ps(ij) = pk(1,ij) + .5*g* rhodz(1,ij)*(1.+theta(1,ij,2))
81         END IF
82      END DO
83      !$OMP END DO
84      !$OMP DO SCHEDULE(STATIC)
85      DO ij=1,primal_num
86         DO l = 1,llm
87            p_ik = pk(l,ij)
88            qv = theta(l,ij,2) ! water vaper mixing ratio = mv/md
89            Rmix = Rd+qv*Rv
90            chi = ( theta(l,ij,1) + Rmix*log(p_ik/preff) ) / (cpp + qv*cppv) ! log(T/Treff)
91            temp_ik = Treff*exp(chi)
92            ! specific volume v = R*T/p
93            ! R = (Rd + qv.Rv)/(1+qv)
94            gv = g*Rmix*temp_ik/(p_ik*(1+qv))
95            pk(l,ij) = temp_ik
96            geopot(l+1,ij) = geopot(l,ij) + gv*rhodz(l,ij)
97         END DO
98      END DO
99      !$OMP END DO
100   END SELECT
101   !---------------------------- compute_geopot ----------------------------------
102   !--------------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.