source: codes/icosagcm/devel/src/dynamics/compute_caldyn_slow_hydro.F90 @ 876

Last change on this file since 876 was 851, checked in by jisesh, 5 years ago

devel: included USE module trace in compute_caldyn_slow_NH and compute_caldyn_slow_hydro

File size: 4.5 KB
Line 
1MODULE compute_caldyn_slow_hydro_mod
2  USE grid_param, ONLY : llm
3  IMPLICIT NONE
4  PRIVATE
5
6  PUBLIC :: compute_caldyn_slow_hydro
7
8CONTAINS
9
10  SUBROUTINE compute_caldyn_slow_hydro(u,rhodz,hv, hflux,Kv,du, zero)
11    USE icosa
12    USE trace
13    USE omp_para, ONLY : ll_begin, ll_end
14    USE caldyn_vars_mod
15    LOGICAL, INTENT(IN) :: zero
16    REAL(rstd),INTENT(IN)  :: u(3*iim*jjm,llm)    ! prognostic "velocity"
17    REAL(rstd),INTENT(IN)  :: Kv(2*iim*jjm,llm)   ! kinetic energy at vertices
18    REAL(rstd),INTENT(IN)  :: hv(2*iim*jjm,llm)   ! height/mass averaged to vertices
19    REAL(rstd),INTENT(IN)  :: rhodz(iim*jjm,llm)
20    REAL(rstd),INTENT(OUT) :: hflux(3*iim*jjm,llm) ! hflux in kg/s
21    REAL(rstd),INTENT(INOUT) :: du(3*iim*jjm,llm)
22   
23    REAL(rstd) :: berni(iim*jjm,llm)  ! Bernoulli function
24    REAL(rstd) :: berni1(iim*jjm)  ! Bernoulli function
25    REAL(rstd) :: uu_right, uu_lup, uu_ldown, ke, uu
26    INTEGER :: ij,l
27
28    CALL trace_start("compute_caldyn_slow_hydro")
29
30    IF(dysl_slow_hydro) THEN
31
32#define BERNI(ij,l) berni(ij,l)
33#include "../kernels_hex/caldyn_slow_hydro.k90"
34#undef BERNI
35
36     ELSE
37
38#define BERNI(ij) berni1(ij)
39
40    DO l = ll_begin, ll_end
41       !  Compute mass fluxes
42       IF (caldyn_conserv==conserv_energy) CALL test_message(req_qu) 
43
44       IF(caldyn_kinetic==kinetic_trisk) THEN
45          !DIR$ SIMD
46          DO ij=ij_begin_ext,ij_end_ext
47             uu_right=0.5*(rhodz(ij,l)+rhodz(ij+t_right,l))*u(ij+u_right,l)
48             uu_lup=0.5*(rhodz(ij,l)+rhodz(ij+t_lup,l))*u(ij+u_lup,l)
49             uu_ldown=0.5*(rhodz(ij,l)+rhodz(ij+t_ldown,l))*u(ij+u_ldown,l)
50             uu_right= uu_right*le_de(ij+u_right)
51             uu_lup  = uu_lup  *le_de(ij+u_lup)
52             uu_ldown= uu_ldown*le_de(ij+u_ldown)
53             hflux(ij+u_right,l)=uu_right
54             hflux(ij+u_lup,l)  =uu_lup
55             hflux(ij+u_ldown,l)=uu_ldown
56          ENDDO
57       ELSE ! mass flux deriving from consistent kinetic energy
58          !DIR$ SIMD
59          DO ij=ij_begin_ext,ij_end_ext
60             uu_right=0.5*(hv(ij+z_rup,l)+hv(ij+z_rdown,l))*u(ij+u_right,l)
61             uu_lup=0.5*(hv(ij+z_up,l)+hv(ij+z_lup,l))*u(ij+u_lup,l)
62             uu_ldown=0.5*(hv(ij+z_ldown,l)+hv(ij+z_down,l))*u(ij+u_ldown,l)
63             uu_right= uu_right*le_de(ij+u_right)
64             uu_lup  = uu_lup  *le_de(ij+u_lup)
65             uu_ldown= uu_ldown*le_de(ij+u_ldown)
66             hflux(ij+u_right,l)=uu_right
67             hflux(ij+u_lup,l)  =uu_lup
68             hflux(ij+u_ldown,l)=uu_ldown
69          ENDDO
70       END IF
71
72       ! Compute Bernoulli=kinetic energy
73       IF(caldyn_kinetic==kinetic_trisk) THEN
74          !DIR$ SIMD
75          DO ij=ij_begin,ij_end         
76             BERNI(ij) = &
77                  1/(4*Ai(ij))*(le_de(ij+u_right)*u(ij+u_right,l)**2 +    &
78                                le_de(ij+u_rup)*u(ij+u_rup,l)**2     +    &
79                                le_de(ij+u_lup)*u(ij+u_lup,l)**2     +    &
80                                le_de(ij+u_left)*u(ij+u_left,l)**2   +    &
81                                le_de(ij+u_ldown)*u(ij+u_ldown,l)**2 +    &
82                                le_de(ij+u_rdown)*u(ij+u_rdown,l)**2 ) 
83          ENDDO
84       ELSE
85          !DIR$ SIMD
86          DO ij=ij_begin,ij_end
87             BERNI(ij) = Riv(ij,vup)   *Kv(ij+z_up,l)    + &
88                         Riv(ij,vlup)  *Kv(ij+z_lup,l)   + &
89                         Riv(ij,vldown)*Kv(ij+z_ldown,l) + &
90                         Riv(ij,vdown) *Kv(ij+z_down,l)  + &
91                         Riv(ij,vrdown)*Kv(ij+z_rdown,l) + &
92                         Riv(ij,vrup)  *Kv(ij+z_rup,l)
93          END DO
94       END IF
95       ! Compute du=-grad(Bernoulli)
96       IF(zero) THEN
97          !DIR$ SIMD
98          DO ij=ij_begin,ij_end
99             du(ij+u_right,l) = ne_right*(BERNI(ij)-BERNI(ij+t_right))
100             du(ij+u_lup,l)   = ne_lup*(BERNI(ij)-BERNI(ij+t_lup))
101             du(ij+u_ldown,l) = ne_ldown*(BERNI(ij)-BERNI(ij+t_ldown))
102          END DO
103       ELSE
104          !DIR$ SIMD
105          DO ij=ij_begin,ij_end
106             du(ij+u_right,l) = du(ij+u_right,l) + &
107                  ne_right*(BERNI(ij)-BERNI(ij+t_right))
108             du(ij+u_lup,l)   = du(ij+u_lup,l) + &
109                  ne_lup*(BERNI(ij)-BERNI(ij+t_lup))
110             du(ij+u_ldown,l) = du(ij+u_ldown,l) + &
111                  ne_ldown*(BERNI(ij)-BERNI(ij+t_ldown))
112          END DO
113       END IF
114    END DO
115
116#undef BERNI
117
118    END IF ! dysl
119    CALL trace_end("compute_caldyn_slow_hydro")   
120  END SUBROUTINE compute_caldyn_slow_hydro
121
122END MODULE compute_caldyn_slow_hydro_mod
Note: See TracBrowser for help on using the repository browser.