SICOPOLIS V3.1
 All Classes Files Functions Variables Macros
topograd_1.F90
Go to the documentation of this file.
1 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 !
3 ! Subroutine : t o p o g r a d _ 1
4 !
5 !> @file
6 !!
7 !! Calculation of topography gradients on the staggered grid and on the grid
8 !! points (the latter by second-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-2013 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 second-order discretization).
38 !! Length rescaling with the corresponding components of the metric tensor is
39 !! already included.
40 !<------------------------------------------------------------------------------
41 subroutine topograd_1(dxi, deta, n_switch)
42 
43 use sico_types
45 
46 implicit none
47 
48 integer(i4b), intent(in) :: n_switch
49 real(dp), intent(in) :: dxi, deta
50 
51 integer(i4b) :: i, j
52 real(dp) :: dxi_inv, deta_inv
53 real(dp) :: zs_help(0:jmax,0:imax), zm_help(0:jmax,0:imax), &
54  zb_help(0:jmax,0:imax)
55 
56 dxi_inv = 1.0_dp/dxi
57 deta_inv = 1.0_dp/deta
58 
59 !-------- Distinguish between old and new topography data --------
60 
61 if (n_switch == 1) then
62 
63  do i=0, imax
64  do j=0, jmax
65  zs_help(j,i) = zs(j,i)
66  zm_help(j,i) = zm(j,i)
67  zb_help(j,i) = zb(j,i)
68  end do
69  end do
70 
71 else if (n_switch == 2) then
72 
73  do i=0, imax
74  do j=0, jmax
75  zs_help(j,i) = zs_neu(j,i)
76  zm_help(j,i) = zm_neu(j,i)
77  zb_help(j,i) = zb_neu(j,i)
78  end do
79  end do
80 
81 else
82  stop ' topograd_1: Wrong value for n_switch!'
83 end if
84 
85 !-------- Topography gradients on the staggered grid --------
86 
87 ! ------ x-derivatives
88 
89 do i=0, imax-1
90 do j=0, jmax
91  dzs_dxi(j,i) = (zs_help(j,i+1)-zs_help(j,i))*dxi_inv &
92  *insq_g11_sgx(j,i)
93  dzm_dxi(j,i) = (zm_help(j,i+1)-zm_help(j,i))*dxi_inv &
94  *insq_g11_sgx(j,i)
95  dzb_dxi(j,i) = (zb_help(j,i+1)-zb_help(j,i))*dxi_inv &
96  *insq_g11_sgx(j,i)
97  dh_c_dxi(j,i) = dzs_dxi(j,i)-dzm_dxi(j,i)
98  dh_t_dxi(j,i) = dzm_dxi(j,i)-dzb_dxi(j,i)
99 end do
100 end do
101 
102 ! ------ y-derivatives
103 
104 do i=0, imax
105 do j=0, jmax-1
106  dzs_deta(j,i) = (zs_help(j+1,i)-zs_help(j,i))*deta_inv &
107  *insq_g22_sgy(j,i)
108  dzm_deta(j,i) = (zm_help(j+1,i)-zm_help(j,i))*deta_inv &
109  *insq_g22_sgy(j,i)
110  dzb_deta(j,i) = (zb_help(j+1,i)-zb_help(j,i))*deta_inv &
111  *insq_g22_sgy(j,i)
112  dh_c_deta(j,i) = dzs_deta(j,i)-dzm_deta(j,i)
113  dh_t_deta(j,i) = dzm_deta(j,i)-dzb_deta(j,i)
114 end do
115 end do
116 
117 !-------- Topography gradients on the grid points --------
118 
119 ! ------ x-derivatives
120 
121 do i=1, imax-1
122 do j=0, jmax
123  dzs_dxi_g(j,i) = (zs_help(j,i+1)-zs_help(j,i-1))*0.5_dp*dxi_inv &
124  *insq_g11_g(j,i)
125  dzm_dxi_g(j,i) = (zm_help(j,i+1)-zm_help(j,i-1))*0.5_dp*dxi_inv &
126  *insq_g11_g(j,i)
127  dzb_dxi_g(j,i) = (zb_help(j,i+1)-zb_help(j,i-1))*0.5_dp*dxi_inv &
128  *insq_g11_g(j,i)
129  dh_c_dxi_g(j,i) = dzs_dxi_g(j,i)-dzm_dxi_g(j,i)
130  dh_t_dxi_g(j,i) = dzm_dxi_g(j,i)-dzb_dxi_g(j,i)
131 end do
132 end do
133 
134 do j=0, jmax
135  dzs_dxi_g(j,0) = (zs_help(j,1)-zs_help(j,0))*dxi_inv &
136  *insq_g11_g(j,0)
137  dzm_dxi_g(j,0) = (zm_help(j,1)-zm_help(j,0))*dxi_inv &
138  *insq_g11_g(j,0)
139  dzb_dxi_g(j,0) = (zb_help(j,1)-zb_help(j,0))*dxi_inv &
140  *insq_g11_g(j,0)
141  dh_c_dxi_g(j,0) = dzs_dxi_g(j,0)-dzm_dxi_g(j,0)
142  dh_t_dxi_g(j,0) = dzm_dxi_g(j,0)-dzb_dxi_g(j,0)
143  dzs_dxi_g(j,imax) = (zs_help(j,imax)-zs_help(j,imax-1)) &
144  *dxi_inv &
145  *insq_g11_g(j,imax)
146  dzm_dxi_g(j,imax) = (zm_help(j,imax)-zm_help(j,imax-1)) &
147  *dxi_inv &
148  *insq_g11_g(j,imax)
149  dzb_dxi_g(j,imax) = (zb_help(j,imax)-zb_help(j,imax-1)) &
150  *dxi_inv &
151  *insq_g11_g(j,imax)
152  dh_c_dxi_g(j,imax) = dzs_dxi_g(j,imax)-dzm_dxi_g(j,imax)
153  dh_t_dxi_g(j,imax) = dzm_dxi_g(j,imax)-dzb_dxi_g(j,imax)
154 end do
155 
156 ! ------ y-derivatives
157 
158 do i=0, imax
159 do j=1, jmax-1
160  dzs_deta_g(j,i) = (zs_help(j+1,i)-zs_help(j-1,i)) &
161  *0.5_dp*deta_inv &
162  *insq_g22_g(j,i)
163  dzm_deta_g(j,i) = (zm_help(j+1,i)-zm_help(j-1,i)) &
164  *0.5_dp*deta_inv &
165  *insq_g22_g(j,i)
166  dzb_deta_g(j,i) = (zb_help(j+1,i)-zb_help(j-1,i)) &
167  *0.5_dp*deta_inv &
168  *insq_g22_g(j,i)
169  dh_c_deta_g(j,i) = dzs_deta_g(j,i)-dzm_deta_g(j,i)
170  dh_t_deta_g(j,i) = dzm_deta_g(j,i)-dzb_deta_g(j,i)
171 end do
172 end do
173 
174 do i=0, imax
175  dzs_deta_g(0,i) = (zs_help(1,i)-zs_help(0,i))*deta_inv &
176  *insq_g22_g(0,i)
177  dzm_deta_g(0,i) = (zm_help(1,i)-zm_help(0,i))*deta_inv &
178  *insq_g22_g(0,i)
179  dzb_deta_g(0,i) = (zb_help(1,i)-zb_help(0,i))*deta_inv &
180  *insq_g22_g(0,i)
181  dh_c_deta_g(0,i) = dzs_deta_g(0,i)-dzm_deta_g(0,i)
182  dh_t_deta_g(0,i) = dzm_deta_g(0,i)-dzb_deta_g(0,i)
183  dzs_deta_g(jmax,i) = (zs_help(jmax,i)-zs_help(jmax-1,i)) &
184  *deta_inv &
185  *insq_g22_g(jmax,i)
186  dzm_deta_g(jmax,i) = (zm_help(jmax,i)-zm_help(jmax-1,i)) &
187  *deta_inv &
188  *insq_g22_g(jmax,i)
189  dzb_deta_g(jmax,i) = (zb_help(jmax,i)-zb_help(jmax-1,i)) &
190  *deta_inv &
191  *insq_g22_g(jmax,i)
192  dh_c_deta_g(jmax,i) = dzs_deta_g(jmax,i)-dzm_deta_g(jmax,i)
193  dh_t_deta_g(jmax,i) = dzm_deta_g(jmax,i)-dzb_deta_g(jmax,i)
194 end do
195 
196 end subroutine topograd_1
197 !