source: codes/icosagcm/devel/src/kernels_hex/caldyn_vert.k90 @ 724

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

devel : introduced kernels for caldyn_vert (optional)

File size: 3.4 KB
Line 
1   !--------------------------------------------------------------------------
2   !---------------------------- caldyn_vert ----------------------------------
3   DO iq=1,nqdyn
4      DO l = ll_beginp1, ll_end
5         !DIR$ SIMD
6         DO ij=ij_begin, ij_end
7            dtheta_rhodz(ij,l,iq) = dtheta_rhodz(ij,l,iq) + 0.5*(theta(ij,l,iq)+theta(ij,l-1,iq))*wflux(ij,l)
8         END DO
9      END DO
10      DO l = ll_begin, ll_endm1
11         !DIR$ SIMD
12         DO ij=ij_begin, ij_end
13            dtheta_rhodz(ij,l,iq) = dtheta_rhodz(ij,l,iq) - 0.5*(theta(ij,l,iq)+theta(ij,l+1,iq))*wflux(ij,l+1)
14         END DO
15      END DO
16   END DO
17   IF(caldyn_vert_variant == caldyn_vert_cons) THEN
18      ! conservative vertical transport of momentum : (F/m)du/deta = 1/m (d/deta(Fu)-u.dF/deta)
19      DO l = ll_beginp1, ll_end
20         !DIR$ SIMD
21         DO ij=ij_begin, ij_end
22            wwuu(ij+u_right,l) = .25*(wflux(ij,l)+wflux(ij+t_right,l))*(u(ij+u_right,l)+u(ij+u_right,l-1)) ! Fu
23            wwuu(ij+u_lup,l) = .25*(wflux(ij,l)+wflux(ij+t_lup,l))*(u(ij+u_lup,l)+u(ij+u_lup,l-1)) ! Fu
24            wwuu(ij+u_ldown,l) = .25*(wflux(ij,l)+wflux(ij+t_ldown,l))*(u(ij+u_ldown,l)+u(ij+u_ldown,l-1)) ! Fu
25         END DO
26      END DO
27      ! make sure wwuu is up to date
28      !$OMP BARRIER
29      DO l = ll_begin, ll_end
30         !DIR$ SIMD
31         DO ij=ij_begin, ij_end
32            dFu_deta = wwuu(ij+u_right,l+1)-wwuu(ij+u_right,l) ! d/deta (F*u)
33            dF_deta = .5*(wflux(ij,l+1)+wflux(ij+t_right,l+1)-(wflux(ij,l)+wflux(ij+t_right,l))) ! d/deta(F)
34            du(ij+u_right,l) = du(ij+u_right,l) - (dFu_deta-u(ij+u_right,l)*dF_deta) / (.5*(rhodz(ij,l)+rhodz(ij+t_right,l))) ! (F/m)du/deta
35            dFu_deta = wwuu(ij+u_lup,l+1)-wwuu(ij+u_lup,l) ! d/deta (F*u)
36            dF_deta = .5*(wflux(ij,l+1)+wflux(ij+t_lup,l+1)-(wflux(ij,l)+wflux(ij+t_lup,l))) ! d/deta(F)
37            du(ij+u_lup,l) = du(ij+u_lup,l) - (dFu_deta-u(ij+u_lup,l)*dF_deta) / (.5*(rhodz(ij,l)+rhodz(ij+t_lup,l))) ! (F/m)du/deta
38            dFu_deta = wwuu(ij+u_ldown,l+1)-wwuu(ij+u_ldown,l) ! d/deta (F*u)
39            dF_deta = .5*(wflux(ij,l+1)+wflux(ij+t_ldown,l+1)-(wflux(ij,l)+wflux(ij+t_ldown,l))) ! d/deta(F)
40            du(ij+u_ldown,l) = du(ij+u_ldown,l) - (dFu_deta-u(ij+u_ldown,l)*dF_deta) / (.5*(rhodz(ij,l)+rhodz(ij+t_ldown,l))) ! (F/m)du/deta
41         END DO
42      END DO
43   ELSE
44      DO l = ll_beginp1, ll_end
45         !DIR$ SIMD
46         DO ij=ij_begin, ij_end
47            wwuu(ij+u_right,l) = .5*(wflux(ij,l)+wflux(ij+t_right,l))*(u(ij+u_right,l)-u(ij+u_right,l-1))
48            wwuu(ij+u_lup,l) = .5*(wflux(ij,l)+wflux(ij+t_lup,l))*(u(ij+u_lup,l)-u(ij+u_lup,l-1))
49            wwuu(ij+u_ldown,l) = .5*(wflux(ij,l)+wflux(ij+t_ldown,l))*(u(ij+u_ldown,l)-u(ij+u_ldown,l-1))
50         END DO
51      END DO
52      ! make sure wwuu is up to date
53      !$OMP BARRIER
54      DO l = ll_begin, ll_end
55         !DIR$ SIMD
56         DO ij=ij_begin, ij_end
57            du(ij+u_right,l) = du(ij+u_right,l) - (wwuu(ij+u_right,l)+wwuu(ij+u_right,l+1)) / (rhodz(ij,l)+rhodz(ij+t_right,l))
58            du(ij+u_lup,l) = du(ij+u_lup,l) - (wwuu(ij+u_lup,l)+wwuu(ij+u_lup,l+1)) / (rhodz(ij,l)+rhodz(ij+t_lup,l))
59            du(ij+u_ldown,l) = du(ij+u_ldown,l) - (wwuu(ij+u_ldown,l)+wwuu(ij+u_ldown,l+1)) / (rhodz(ij,l)+rhodz(ij+t_ldown,l))
60         END DO
61      END DO
62   END IF
63   !---------------------------- caldyn_vert ----------------------------------
64   !--------------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.