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

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

pointer free version can be generated with cpp switch nopointer

  • Property svn:keywords set to Id
File size: 4.0 KB
Line 
1 MODULE advec_s_pw_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_pw.f90 1010 2012-09-20 07:59:54Z raasch $
11!
12! 19 2007-02-23 04:53:48Z raasch
13! Calculation extended for gridpoint nzt
14!
15! RCS Log replace by Id keyword, revision history cleaned up
16!
17! Revision 1.12  2006/02/23 09:42:55  raasch
18! nzb_2d replaced by nzb_s_inner
19!
20! Revision 1.1  1997/08/29 08:54:20  raasch
21! Initial revision
22!
23!
24! Description:
25! ------------
26! Advection term for scalar variables using the Piacsek and Williams scheme
27! (form C3). Contrary to PW itself, for reasons of accuracy their scheme is
28! slightly modified as follows: the values of those scalars that are used for
29! the computation of the flux divergence are reduced by the value of the
30! relevant scalar at the location where the difference is computed (sk(k,j,i)).
31! NOTE: at the first grid point above the surface computation still takes place!
32!------------------------------------------------------------------------------!
33
34    PRIVATE
35    PUBLIC advec_s_pw
36
37    INTERFACE advec_s_pw
38       MODULE PROCEDURE advec_s_pw
39       MODULE PROCEDURE advec_s_pw_ij
40    END INTERFACE
41 
42 CONTAINS
43
44
45!------------------------------------------------------------------------------!
46! Call for all grid points
47!------------------------------------------------------------------------------!
48    SUBROUTINE advec_s_pw( sk )
49
50       USE arrays_3d
51       USE control_parameters
52       USE grid_variables
53       USE indices
54
55       IMPLICIT NONE
56
57       INTEGER ::  i, j, k
58
59#if defined( __nopointer )
60       REAL, DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ::  sk
61#else
62       REAL, DIMENSION(:,:,:), POINTER ::  sk
63#endif
64 
65
66       DO  i = nxl, nxr
67          DO  j = nys, nyn
68             DO  k = nzb_s_inner(j,i)+1, nzt
69                tend(k,j,i) = tend(k,j,i)                                      &
70              -0.5 * ( ( u(k,j,i+1) - u_gtrans ) * ( sk(k,j,i+1) - sk(k,j,i) ) &
71                     - ( u(k,j,i)   - u_gtrans ) * ( sk(k,j,i-1) - sk(k,j,i) ) &
72                     ) * ddx                                                   &
73              -0.5 * ( ( v(k,j+1,i) - v_gtrans ) * ( sk(k,j+1,i) - sk(k,j,i) ) &
74                     - ( v(k,j,i)   - v_gtrans ) * ( sk(k,j-1,i) - sk(k,j,i) ) &
75                     ) * ddy                                                   &
76              -      (   w(k,j,i)                * ( sk(k+1,j,i) - sk(k,j,i) ) &
77                     -   w(k-1,j,i)              * ( sk(k-1,j,i) - sk(k,j,i) ) &
78                     ) * dd2zu(k)
79             ENDDO
80          ENDDO
81       ENDDO
82
83    END SUBROUTINE advec_s_pw
84
85
86!------------------------------------------------------------------------------!
87! Call for grid point i,j
88!------------------------------------------------------------------------------!
89    SUBROUTINE advec_s_pw_ij( i, j, sk )
90
91       USE arrays_3d
92       USE control_parameters
93       USE grid_variables
94       USE indices
95
96       IMPLICIT NONE
97
98       INTEGER ::  i, j, k
99
100#if defined( __nopointer )
101       REAL, DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ::  sk
102#else
103       REAL, DIMENSION(:,:,:), POINTER ::  sk
104#endif
105
106
107       DO  k = nzb_s_inner(j,i)+1, nzt
108          tend(k,j,i) = tend(k,j,i)                                            &
109              -0.5 * ( ( u(k,j,i+1) - u_gtrans ) * ( sk(k,j,i+1) - sk(k,j,i) ) &
110                     - ( u(k,j,i)   - u_gtrans ) * ( sk(k,j,i-1) - sk(k,j,i) ) &
111                     ) * ddx                                                   &
112              -0.5 * ( ( v(k,j+1,i) - v_gtrans ) * ( sk(k,j+1,i) - sk(k,j,i) ) &
113                     - ( v(k,j,i)   - v_gtrans ) * ( sk(k,j-1,i) - sk(k,j,i) ) &
114                     ) * ddy                                                   &
115              -      (   w(k,j,i)                * ( sk(k+1,j,i) - sk(k,j,i) ) &
116                     -   w(k-1,j,i)              * ( sk(k-1,j,i) - sk(k,j,i) ) &
117                     ) * dd2zu(k)
118       ENDDO
119
120    END SUBROUTINE advec_s_pw_ij
121
122 END MODULE advec_s_pw_mod
Note: See TracBrowser for help on using the repository browser.