SICOPOLIS V3.2
 All Classes Files Functions Variables Macros
topograd_2.F90
Go to the documentation of this file.
1 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 !
3 ! Subroutine : t o p o g r a d _ 2
4 !
5 !> @file
6 !!
7 !! Calculation of topography gradients on the staggered grid and on the grid
8 !! points (the latter by fourth-order discretization).
9 !! Length rescaling with the corresponding components of the metric tensor is
10 !! already included.
11 !!
12 !! @section Copyright
13 !!
14 !! Copyright 2009-2016 Ralf Greve
15 !!
16 !! @section License
17 !!
18 !! This file is part of SICOPOLIS.
19 !!
20 !! SICOPOLIS is free software: you can redistribute it and/or modify
21 !! it under the terms of the GNU General Public License as published by
22 !! the Free Software Foundation, either version 3 of the License, or
23 !! (at your option) any later version.
24 !!
25 !! SICOPOLIS is distributed in the hope that it will be useful,
26 !! but WITHOUT ANY WARRANTY; without even the implied warranty of
27 !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 !! GNU General Public License for more details.
29 !!
30 !! You should have received a copy of the GNU General Public License
31 !! along with SICOPOLIS. If not, see <http://www.gnu.org/licenses/>.
32 !<
33 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
34 
35 !-------------------------------------------------------------------------------
36 !> Calculation of topography gradients on the staggered grid and on the grid
37 !! points (the latter by fourth-order discretization).
38 !! Length rescaling with the corresponding components of the metric tensor is
39 !! already included.
40 !<------------------------------------------------------------------------------
41 subroutine topograd_2(dxi, deta, n_switch)
42 
43 use sico_types
45 use sico_vars
46 
47 implicit none
48 
49 integer(i4b), intent(in) :: n_switch
50 real(dp), intent(in) :: dxi, deta
51 
52 integer(i4b) :: i, j
53 real(dp) :: dxi_inv, deta_inv, dxi12_inv, deta12_inv
54 real(dp) :: zs_help(0:jmax,0:imax), zm_help(0:jmax,0:imax), &
55  zb_help(0:jmax,0:imax)
56 
57 dxi_inv = 1.0_dp/dxi
58 deta_inv = 1.0_dp/deta
59 
60 dxi12_inv = 1.0_dp/(12.0_dp*dxi)
61 deta12_inv = 1.0_dp/(12.0_dp*deta)
62 
63 !-------- Distinguish between old and new topography data --------
64 
65 if (n_switch == 1) then
66 
67  do i=0, imax
68  do j=0, jmax
69  zs_help(j,i) = zs(j,i)
70  zm_help(j,i) = zm(j,i)
71  zb_help(j,i) = zb(j,i)
72  end do
73  end do
74 
75 else if (n_switch == 2) then
76 
77  do i=0, imax
78  do j=0, jmax
79  zs_help(j,i) = zs_neu(j,i)
80  zm_help(j,i) = zm_neu(j,i)
81  zb_help(j,i) = zb_neu(j,i)
82  end do
83  end do
84 
85 else
86  stop ' topograd_2: Wrong value for n_switch!'
87 end if
88 
89 !-------- Topography gradients on the staggered grid --------
90 
91 ! ------ x-derivatives
92 
93 do i=0, imax-1
94 do j=0, jmax
95  dzs_dxi(j,i) = (zs_help(j,i+1)-zs_help(j,i))*dxi_inv &
96  *insq_g11_sgx(j,i)
97  dzm_dxi(j,i) = (zm_help(j,i+1)-zm_help(j,i))*dxi_inv &
98  *insq_g11_sgx(j,i)
99  dzb_dxi(j,i) = (zb_help(j,i+1)-zb_help(j,i))*dxi_inv &
100  *insq_g11_sgx(j,i)
101  dh_c_dxi(j,i) = dzs_dxi(j,i)-dzm_dxi(j,i)
102  dh_t_dxi(j,i) = dzm_dxi(j,i)-dzb_dxi(j,i)
103 end do
104 end do
105 
106 ! ------ y-derivatives
107 
108 do i=0, imax
109 do j=0, jmax-1
110  dzs_deta(j,i) = (zs_help(j+1,i)-zs_help(j,i))*deta_inv &
111  *insq_g22_sgy(j,i)
112  dzm_deta(j,i) = (zm_help(j+1,i)-zm_help(j,i))*deta_inv &
113  *insq_g22_sgy(j,i)
114  dzb_deta(j,i) = (zb_help(j+1,i)-zb_help(j,i))*deta_inv &
115  *insq_g22_sgy(j,i)
116  dh_c_deta(j,i) = dzs_deta(j,i)-dzm_deta(j,i)
117  dh_t_deta(j,i) = dzm_deta(j,i)-dzb_deta(j,i)
118 end do
119 end do
120 
121 !-------- Topography gradients on the grid points --------
122 
123 ! ------ x-derivatives
124 
125 do i=2, imax-2
126 do j=0, jmax
127  dzs_dxi_g(j,i) &
128  = ( -zs_help(j,i+2) + 8.0_dp*zs_help(j,i+1) &
129  -8.0_dp*zs_help(j,i-1) + zs_help(j,i-2) ) &
130  *dxi12_inv &
131  *insq_g11_g(j,i)
132  dzm_dxi_g(j,i) &
133  = ( -zm_help(j,i+2) + 8.0_dp*zm_help(j,i+1) &
134  -8.0_dp*zm_help(j,i-1) + zm_help(j,i-2) ) &
135  *dxi12_inv &
136  *insq_g11_g(j,i)
137  dzb_dxi_g(j,i) &
138  = ( -zb_help(j,i+2) + 8.0_dp*zb_help(j,i+1) &
139  -8.0_dp*zb_help(j,i-1) + zb_help(j,i-2) ) &
140  *dxi12_inv &
141  *insq_g11_g(j,i)
142  dh_c_dxi_g(j,i) = dzs_dxi_g(j,i)-dzm_dxi_g(j,i)
143  dh_t_dxi_g(j,i) = dzm_dxi_g(j,i)-dzb_dxi_g(j,i)
144 end do
145 end do
146 
147 do j=0, jmax
148 
149  dzs_dxi_g(j,0) = (zs_help(j,1)-zs_help(j,0))*dxi_inv &
150  *insq_g11_g(j,0)
151  dzm_dxi_g(j,0) = (zm_help(j,1)-zm_help(j,0))*dxi_inv &
152  *insq_g11_g(j,0)
153  dzb_dxi_g(j,0) = (zb_help(j,1)-zb_help(j,0))*dxi_inv &
154  *insq_g11_g(j,0)
155  dh_c_dxi_g(j,0) = dzs_dxi_g(j,0)-dzm_dxi_g(j,0)
156  dh_t_dxi_g(j,0) = dzm_dxi_g(j,0)-dzb_dxi_g(j,0)
157 
158  dzs_dxi_g(j,1) = (zs_help(j,2)-zs_help(j,0)) &
159  *0.5_dp*dxi_inv &
160  *insq_g11_g(j,1)
161  dzm_dxi_g(j,1) = (zm_help(j,2)-zm_help(j,0)) &
162  *0.5_dp*dxi_inv &
163  *insq_g11_g(j,1)
164  dzb_dxi_g(j,1) = (zb_help(j,2)-zb_help(j,0)) &
165  *0.5_dp*dxi_inv &
166  *insq_g11_g(j,1)
167  dh_c_dxi_g(j,1) = dzs_dxi_g(j,1)-dzm_dxi_g(j,1)
168  dh_t_dxi_g(j,1) = dzm_dxi_g(j,1)-dzb_dxi_g(j,1)
169 
170  dzs_dxi_g(j,imax-1) = (zs_help(j,imax)-zs_help(j,imax-2)) &
171  *0.5_dp*dxi_inv &
172  *insq_g11_g(j,imax-1)
173  dzm_dxi_g(j,imax-1) = (zm_help(j,imax)-zm_help(j,imax-2)) &
174  *0.5_dp*dxi_inv &
175  *insq_g11_g(j,imax-1)
176  dzb_dxi_g(j,imax-1) = (zb_help(j,imax)-zb_help(j,imax-2)) &
177  *0.5_dp*dxi_inv &
178  *insq_g11_g(j,imax-1)
179  dh_c_dxi_g(j,imax-1) = dzs_dxi_g(j,imax-1) &
180  -dzm_dxi_g(j,imax-1)
181  dh_t_dxi_g(j,imax-1) = dzm_dxi_g(j,imax-1) &
182  -dzb_dxi_g(j,imax-1)
183 
184  dzs_dxi_g(j,imax) = (zs_help(j,imax)-zs_help(j,imax-1)) &
185  *dxi_inv &
186  *insq_g11_g(j,imax)
187  dzm_dxi_g(j,imax) = (zm_help(j,imax)-zm_help(j,imax-1)) &
188  *dxi_inv &
189  *insq_g11_g(j,imax)
190  dzb_dxi_g(j,imax) = (zb_help(j,imax)-zb_help(j,imax-1)) &
191  *dxi_inv &
192  *insq_g11_g(j,imax)
193  dh_c_dxi_g(j,imax) = dzs_dxi_g(j,imax)-dzm_dxi_g(j,imax)
194  dh_t_dxi_g(j,imax) = dzm_dxi_g(j,imax)-dzb_dxi_g(j,imax)
195 
196 end do
197 
198 ! ------ y-derivatives
199 
200 do i=0, imax
201 do j=2, jmax-2
202  dzs_deta_g(j,i) &
203  = ( -zs_help(j+2,i) + 8.0_dp*zs_help(j+1,i) &
204  -8.0_dp*zs_help(j-1,i) + zs_help(j-2,i) ) &
205  *deta12_inv &
206  *insq_g22_g(j,i)
207  dzm_deta_g(j,i) &
208  = ( -zm_help(j+2,i) + 8.0_dp*zm_help(j+1,i) &
209  -8.0_dp*zm_help(j-1,i) + zm_help(j-2,i) ) &
210  *deta12_inv &
211  *insq_g22_g(j,i)
212  dzb_deta_g(j,i) &
213  = ( -zb_help(j+2,i) + 8.0_dp*zb_help(j+1,i) &
214  -8.0_dp*zb_help(j-1,i) + zb_help(j-2,i) ) &
215  *deta12_inv &
216  *insq_g22_g(j,i)
217  dh_c_deta_g(j,i) = dzs_deta_g(j,i)-dzm_deta_g(j,i)
218  dh_t_deta_g(j,i) = dzm_deta_g(j,i)-dzb_deta_g(j,i)
219 end do
220 end do
221 
222 do i=0, imax
223 
224  dzs_deta_g(0,i) = (zs_help(1,i)-zs_help(0,i))*deta_inv &
225  *insq_g22_g(0,i)
226  dzm_deta_g(0,i) = (zm_help(1,i)-zm_help(0,i))*deta_inv &
227  *insq_g22_g(0,i)
228  dzb_deta_g(0,i) = (zb_help(1,i)-zb_help(0,i))*deta_inv &
229  *insq_g22_g(0,i)
230  dh_c_deta_g(0,i) = dzs_deta_g(0,i)-dzm_deta_g(0,i)
231  dh_t_deta_g(0,i) = dzm_deta_g(0,i)-dzb_deta_g(0,i)
232 
233  dzs_deta_g(1,i) = (zs_help(2,i)-zs_help(0,i)) &
234  *0.5_dp*deta_inv &
235  *insq_g22_g(1,i)
236  dzm_deta_g(1,i) = (zm_help(2,i)-zm_help(0,i)) &
237  *0.5_dp*deta_inv &
238  *insq_g22_g(1,i)
239  dzb_deta_g(1,i) = (zb_help(2,i)-zb_help(0,i)) &
240  *0.5_dp*deta_inv &
241  *insq_g22_g(1,i)
242  dh_c_deta_g(1,i) = dzs_deta_g(1,i)-dzm_deta_g(1,i)
243  dh_t_deta_g(1,i) = dzm_deta_g(1,i)-dzb_deta_g(1,i)
244 
245  dzs_deta_g(jmax-1,i) = (zs_help(jmax,i)-zs_help(jmax-2,i)) &
246  *0.5_dp*deta_inv &
247  *insq_g22_g(jmax-1,i)
248  dzm_deta_g(jmax-1,i) = (zm_help(jmax,i)-zm_help(jmax-2,i)) &
249  *0.5_dp*deta_inv &
250  *insq_g22_g(jmax-1,i)
251  dzb_deta_g(jmax-1,i) = (zb_help(jmax,i)-zb_help(jmax-2,i)) &
252  *0.5_dp*deta_inv &
253  *insq_g22_g(jmax-1,i)
254  dh_c_deta_g(jmax-1,i) = dzs_deta_g(jmax-1,i) &
255  -dzm_deta_g(jmax-1,i)
256  dh_t_deta_g(jmax-1,i) = dzm_deta_g(jmax-1,i) &
257  -dzb_deta_g(jmax-1,i)
258 
259  dzs_deta_g(jmax,i) = (zs_help(jmax,i)-zs_help(jmax-1,i)) &
260  *deta_inv &
261  *insq_g22_g(jmax,i)
262  dzm_deta_g(jmax,i) = (zm_help(jmax,i)-zm_help(jmax-1,i)) &
263  *deta_inv &
264  *insq_g22_g(jmax,i)
265  dzb_deta_g(jmax,i) = (zb_help(jmax,i)-zb_help(jmax-1,i)) &
266  *deta_inv &
267  *insq_g22_g(jmax,i)
268  dh_c_deta_g(jmax,i) = dzs_deta_g(jmax,i)-dzm_deta_g(jmax,i)
269  dh_t_deta_g(jmax,i) = dzm_deta_g(jmax,i)-dzb_deta_g(jmax,i)
270 
271 end do
272 
273 end subroutine topograd_2
274 !
subroutine topograd_2(dxi, deta, n_switch)
Calculation of topography gradients on the staggered grid and on the grid points (the latter by fourt...
Definition: topograd_2.F90:41
Declarations of kind types for SICOPOLIS.
Definition: sico_types.F90:35
Declarations of global variables for SICOPOLIS (for the ANT domain).
Definition: sico_vars.F90:35
Declarations of global variables for SICOPOLIS.