source: palm/trunk/SOURCE/advec_s_up.f90 @ 1010

Last change on this file since 1010 was 1010, checked in by raasch, 12 years ago

pointer free version can be generated with cpp switch nopointer

  • Property svn:keywords set to Id
File size: 4.8 KB
Line 
1 MODULE advec_s_up_mod
2
3!------------------------------------------------------------------------------!
4! Current revisions:
5! -----------------
6! cpp switch __nopointer added for pointer free version
7!
8! Former revisions:
9! -----------------
10! $Id: advec_s_up.f90 1010 2012-09-20 07:59:54Z raasch $
11!
12! 981 2012-08-09 14:57:44Z maronga
13! Typo removed
14!
15! RCS Log replace by Id keyword, revision history cleaned up
16!
17! Revision 1.11  2006/02/23 09:43:44  raasch
18! nzb_2d replaced by nzb_s_inner
19!
20! Revision 1.1  1997/08/29 08:54:33  raasch
21! Initial revision
22!
23!
24! Description:
25! ------------
26! Advection term for scalar quantities using the Upstream scheme.
27! NOTE: vertical advection at k=1 still has wrong grid spacing for w>0!
28!       The same problem occurs for all topography boundaries!
29!------------------------------------------------------------------------------!
30
31    PRIVATE
32    PUBLIC advec_s_up
33
34    INTERFACE advec_s_up
35       MODULE PROCEDURE advec_s_up
36       MODULE PROCEDURE advec_s_up_ij
37    END INTERFACE advec_s_up
38
39 CONTAINS
40
41
42!------------------------------------------------------------------------------!
43! Call for all grid points
44!------------------------------------------------------------------------------!
45    SUBROUTINE advec_s_up( sk )
46
47       USE arrays_3d
48       USE control_parameters
49       USE grid_variables
50       USE indices
51
52       IMPLICIT NONE
53
54       INTEGER ::  i, j, k
55
56       REAL ::  ukomp, vkomp, wkomp
57#if defined( __nopointer )
58       REAL, DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ::  sk
59#else
60       REAL, DIMENSION(:,:,:), POINTER ::  sk
61#endif
62
63
64       DO  i = nxl, nxr
65          DO  j = nys, nyn
66             DO  k = nzb_s_inner(j,i)+1, nzt
67!
68!--             x-direction
69                ukomp = 0.5 * ( u(k,j,i) + u(k,j,i+1) ) - u_gtrans
70                IF ( ukomp > 0.0 )  THEN
71                   tend(k,j,i) = tend(k,j,i) - ukomp * &
72                                         ( sk(k,j,i) - sk(k,j,i-1) ) * ddx
73                ELSE
74                   tend(k,j,i) = tend(k,j,i) - ukomp * &
75                                         ( sk(k,j,i+1) - sk(k,j,i) ) * ddx
76                ENDIF
77!
78!--             y-direction
79                vkomp = 0.5 * ( v(k,j,i) + v(k,j+1,i) ) - v_gtrans
80                IF ( vkomp > 0.0 )  THEN
81                   tend(k,j,i) = tend(k,j,i) - vkomp * &
82                                         ( sk(k,j,i) - sk(k,j-1,i) ) * ddy
83                ELSE
84                   tend(k,j,i) = tend(k,j,i) - vkomp * &
85                                         ( sk(k,j+1,i) - sk(k,j,i) ) * ddy
86                ENDIF
87!
88!--             z-direction
89                wkomp = 0.5 * ( w(k,j,i) + w(k-1,j,i) )
90                IF ( wkomp > 0.0 )  THEN
91                   tend(k,j,i) = tend(k,j,i) - wkomp * &
92                                         ( sk(k,j,i) - sk(k-1,j,i) ) * ddzu(k)
93                ELSE
94                   tend(k,j,i) = tend(k,j,i) - wkomp * &
95                                         ( sk(k+1,j,i)-sk(k,j,i) ) * ddzu(k+1)
96                ENDIF
97
98             ENDDO
99          ENDDO
100       ENDDO
101
102    END SUBROUTINE advec_s_up
103
104
105!------------------------------------------------------------------------------!
106! Call for grid point i,j
107!------------------------------------------------------------------------------!
108    SUBROUTINE advec_s_up_ij( i, j, sk )
109
110       USE arrays_3d
111       USE control_parameters
112       USE grid_variables
113       USE indices
114
115       IMPLICIT NONE
116
117       INTEGER ::  i, j, k
118
119       REAL ::  ukomp, vkomp, wkomp
120#if defined( __nopointer )
121       REAL, DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ::  sk
122#else
123       REAL, DIMENSION(:,:,:), POINTER ::  sk
124#endif
125
126
127       DO  k = nzb_s_inner(j,i)+1, nzt
128!
129!--       x-direction
130          ukomp = 0.5 * ( u(k,j,i) + u(k,j,i+1) ) - u_gtrans
131          IF ( ukomp > 0.0 )  THEN
132             tend(k,j,i) = tend(k,j,i) - ukomp * &
133                                         ( sk(k,j,i) - sk(k,j,i-1) ) * ddx
134          ELSE
135             tend(k,j,i) = tend(k,j,i) - ukomp * &
136                                         ( sk(k,j,i+1) - sk(k,j,i) ) * ddx
137          ENDIF
138!
139!--       y-direction
140          vkomp = 0.5 * ( v(k,j,i) + v(k,j+1,i) ) - v_gtrans
141          IF ( vkomp > 0.0 )  THEN
142             tend(k,j,i) = tend(k,j,i) - vkomp * &
143                                         ( sk(k,j,i) - sk(k,j-1,i) ) * ddy
144          ELSE
145             tend(k,j,i) = tend(k,j,i) - vkomp * &
146                                         ( sk(k,j+1,i) - sk(k,j,i) ) * ddy
147          ENDIF
148!
149!--       z-direction
150          wkomp = 0.5 * ( w(k,j,i) + w(k-1,j,i) )
151          IF ( wkomp > 0.0 )  THEN
152             tend(k,j,i) = tend(k,j,i) - wkomp * &
153                                         ( sk(k,j,i) - sk(k-1,j,i) ) * ddzu(k)
154          ELSE
155             tend(k,j,i) = tend(k,j,i) - wkomp * &
156                                         ( sk(k+1,j,i)-sk(k,j,i) ) * ddzu(k+1)
157          ENDIF
158
159       ENDDO
160
161    END SUBROUTINE advec_s_up_ij
162
163 END MODULE advec_s_up_mod
Note: See TracBrowser for help on using the repository browser.