source: codes/icosagcm/devel/src/dynamics/compute_caldyn_kv.F90 @ 843

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

devel: separate module for compute_caldyn_kv

File size: 1.9 KB
Line 
1MODULE compute_caldyn_kv_mod
2  USE grid_param, ONLY : llm
3  IMPLICIT NONE
4  PRIVATE
5
6  PUBLIC :: compute_caldyn_kv
7
8CONTAINS
9
10  SUBROUTINE compute_caldyn_kv(ue, Kv)
11    USE icosa
12    USE omp_para, ONLY : ll_begin, ll_end 
13    REAL(rstd),INTENT(IN) :: ue(3*iim*jjm,llm)
14    REAL(rstd),INTENT(OUT) :: Kv(2*iim*jjm,llm)
15    REAL(rstd) :: ue2(3*iim*jjm), dem2(3*iim*jjm), r2_Av(2*iim*jjm), rad2
16    INTEGER :: ij,l, u_up, u_down
17   
18    u_up    = t_lup + u_right
19    u_down  = t_rdown + u_left
20   
21    rad2=radius**2
22
23    !DIR$ SIMD
24    DO ij=ij_begin_ext,ij_end_ext
25       dem2(ij+u_right) = de(ij+u_right)**(-2)
26       dem2(ij+u_lup)   = de(ij+u_lup)**(-2)
27       dem2(ij+u_ldown) = de(ij+u_ldown)**(-2)
28       r2_Av(ij+z_up)   = rad2*(1./Av(ij+z_up))
29       r2_Av(ij+z_down) = rad2*(1./Av(ij+z_down))
30    END DO
31
32    DO l=ll_begin,ll_end
33       ! compute squared normal component from 1-form
34       !DIR$ SIMD
35       DO ij=ij_begin_ext,ij_end_ext
36          ue2(ij+u_right) = dem2(ij+u_right)* (ue(ij+u_right,l)**2)
37          ue2(ij+u_lup)   = dem2(ij+u_lup)  * (ue(ij+u_lup,l)**2)
38          ue2(ij+u_ldown) = dem2(ij+u_ldown)* (ue(ij+u_ldown,l)**2)
39       END DO
40       ! average squared normal component to vertices
41       !DIR$ SIMD
42       DO ij=ij_begin_ext,ij_end_ext
43          Kv(ij+z_up,l) = r2_Av(ij+z_up)*(                       &
44                               S1(ij,vup)*ue2(ij+u_rup) +        &
45                               S2(ij,vup)*ue2(ij+u_lup) +        &
46                               S2(ij+t_lup,vrdown)*ue2(ij+u_up))
47
48          Kv(ij+z_down,l) = r2_Av(ij+z_down)*(                   &
49                               S1(ij,vdown)*ue2(ij+u_ldown) +    &   
50                               S2(ij,vdown)*ue2(ij+u_rdown) +    &
51                               S2(ij+t_rdown,vlup)*ue2(ij+u_down) )
52       ENDDO
53    ENDDO
54  END SUBROUTINE compute_caldyn_kv
55
56END MODULE compute_caldyn_kv_mod
Note: See TracBrowser for help on using the repository browser.