source: codes/icosagcm/trunk/src/omega.f90 @ 146

Last change on this file since 146 was 96, checked in by dubos, 12 years ago

Computation and output of omega=Dp/Dt?

File size: 4.8 KB
Line 
1MODULE omega_mod
2
3  USE icosa
4  PRIVATE
5
6  PUBLIC :: w_omega, compute_omega
7
8CONTAINS
9
10  SUBROUTINE w_omega(f_ps, f_u, f_omega) ! Compute omega = Dp/Dt
11    TYPE(t_field),POINTER :: f_ps(:), f_u(:), f_omega(:)
12    INTEGER :: ind
13    REAL(rstd),POINTER :: ps(:), u(:,:), om(:,:)
14    DO ind=1,ndomain
15       CALL swap_dimensions(ind)
16       CALL swap_geometry(ind)
17       ps=f_ps(ind)
18       u=f_u(ind)
19       om=f_omega(ind)
20       CALL compute_omega(ps,u,om)
21    END DO
22  END SUBROUTINE W_omega
23
24  SUBROUTINE compute_omega(ps,u, w)
25    USE disvert_mod, ONLY : ap,bp
26    REAL(rstd),INTENT(IN) :: u(iim*3*jjm,llm), ps(iim*jjm)
27    REAL(rstd),INTENT(OUT):: w(iim*jjm,llm)
28    REAL(rstd):: convm(iim*jjm,llm+1)
29    REAL(rstd):: p(iim*jjm,llm+1), rhodz(iim*jjm,llm), Fe(iim*3*jjm,llm)
30    REAL(rstd):: ugradps
31    DO    l    = 1, llm+1
32       DO j=jj_begin-1,jj_end+1
33          DO i=ii_begin-1,ii_end+1
34             ij=(j-1)*iim+i
35             p(ij,l) = ap(l) + bp(l) * ps(ij)
36          ENDDO
37       ENDDO
38    ENDDO
39   
40!!! Compute mass
41    DO l = 1, llm
42       DO j=jj_begin-1,jj_end+1
43          DO i=ii_begin-1,ii_end+1
44             ij=(j-1)*iim+i
45             rhodz(ij,l) = ( p(ij,l) - p(ij,l+1) ) / g
46          ENDDO
47       ENDDO
48    ENDDO
49   
50!!!  Compute mass flux
51    DO l = 1, llm
52       DO j=jj_begin-1,jj_end+1
53          DO i=ii_begin-1,ii_end+1
54             ij=(j-1)*iim+i
55             Fe(ij+u_right,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_right,l))*u(ij+u_right,l)*le(ij+u_right)
56             Fe(ij+u_lup,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_lup,l))*u(ij+u_lup,l)*le(ij+u_lup)
57             Fe(ij+u_ldown,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_ldown,l))*u(ij+u_ldown,l)*le(ij+u_ldown)
58          ENDDO
59       ENDDO
60    ENDDO
61   
62!!! mass flux convergence computation 
63   
64    ! horizontal convergence
65    DO l = 1, llm
66       DO j=jj_begin,jj_end
67          DO i=ii_begin,ii_end
68             ij=(j-1)*iim+i
69             ! convm = +div(mass flux), sign convention as in Ringler et al. 2012, eq. 21
70             convm(ij,l)= 1./Ai(ij)*(ne(ij,right)*Fe(ij+u_right,l)   +  &
71                  ne(ij,rup)*Fe(ij+u_rup,l)       +  & 
72                  ne(ij,lup)*Fe(ij+u_lup,l)       +  & 
73                  ne(ij,left)*Fe(ij+u_left,l)     +  & 
74                  ne(ij,ldown)*Fe(ij+u_ldown,l)   +  & 
75                  ne(ij,rdown)*Fe(ij+u_rdown,l))
76          ENDDO
77       ENDDO
78    ENDDO
79   
80    ! vertical integration from up to down
81    DO  l = llm-1, 1, -1
82       DO j=jj_begin,jj_end
83          DO i=ii_begin,ii_end
84             ij=(j-1)*iim+i
85             convm(ij,l) = convm(ij,l) + convm(ij,l+1)
86          ENDDO
87       ENDDO
88    ENDDO
89    convm(:,llm+1)=0.
90
91!!! Compute dps
92    !  DO j=jj_begin,jj_end
93    !    DO i=ii_begin,ii_end
94    !      ij=(j-1)*iim+i
95    !      ! dps/dt = -int(div flux)dz
96    !      dps(ij)=-convm(ij,1) * g
97    !      convm(ij,llm+1)=0.
98    !    ENDDO
99    !  ENDDO
100   
101    ! Compute Omega = Dp/Dt
102    ! with p = A(eta)+B(eta)ps
103    !      Dp/Dt = dp/deta.Deta/Dt + B(eta)Dps/Dt
104    !            = -mg.Deta/Dt + B.Dps/Dt
105    ! By definition the mass flux through model levels is W=m.Deta/Dt with m=-1/g dp/deta
106    ! therefore
107    !  Dp/Dt = -g.W + B.dps/dt + Bu.grad ps
108    !        = B.u.grad ps - g*convm
109   
110!!! Compute vertical flux through model layers
111    !  DO l = 1,llm-1
112    !    DO j=jj_begin,jj_end
113    !      DO i=ii_begin,ii_end
114    !        ij=(j-1)*iim+i
115    !        ! w = int(z,ztop,div(flux)dz) + B(eta)dps/dt
116    !        ! => w>0 for upward transport
117    !        w( ij, l+1 ) = convm( ij, l+1 ) - bp(l+1) * convm( ij, 1 ) ! g.W = g.convm + B dps/dt
118    !      ENDDO
119    !    ENDDO
120    !  ENDDO
121   
122   
123!!! Compute omega
124    ! -grad ps : ( ne(ij,ldown)*ps(ij,l) + ne(ij+t_ldown,rup)*ps(ij+t_ldown,l) ) ) / de(ij+u_ldown)
125
126    DO l = 1,llm
127       DO j=jj_begin,jj_end
128          DO i=ii_begin,ii_end
129             toto = 1
130             ij=(j-1)*iim+i
131             ugradps = &
132                  le(ij+u_right)*u(ij+u_right,l)*( ne(ij,right)*ps(ij) + ne(ij+t_right,left)*ps(ij+t_right) )  &
133                  + le(ij+u_rup)*u(ij+u_rup,l)*( ne(ij,rup)*ps(ij) + ne(ij+t_rup,ldown)*ps(ij+t_rup) )  &
134                  + le(ij+u_lup)*u(ij+u_lup,l)*( ne(ij,lup)*ps(ij) + ne(ij+t_lup,rdown)*ps(ij+t_lup) )         &
135                  + le(ij+u_left)*u(ij+u_left,l)*( ne(ij,left)*ps(ij) + ne(ij+t_left,right)*ps(ij+t_left) )    &
136                  + le(ij+u_ldown)*u(ij+u_ldown,l)*( ne(ij,ldown)*ps(ij) + ne(ij+t_ldown,rup)*ps(ij+t_ldown) ) &
137                  + le(ij+u_rdown)*u(ij+u_rdown,l)*( ne(ij,rdown)*ps(ij) + ne(ij+t_rdown,lup)*ps(ij+t_rdown) )
138             ugradps = .5*(bp(l)+bp(l+1)) *ugradps/(-4*Ai(ij))  ! sign convention as in Ringler et al. 2010, Eq. 22 p.3072
139             w( ij, l) =  ugradps - .5*(convm( ij,l+1)+convm(ij,l)) 
140          ENDDO
141       ENDDO
142    ENDDO
143   
144  END SUBROUTINE compute_omega
145 
146END MODULE omega_mod
Note: See TracBrowser for help on using the repository browser.