SICOPOLIS V3.1
 All Classes Files Functions Variables Macros
topography3_nc.F90
Go to the documentation of this file.
1 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 !
3 ! Subroutine : t o p o g r a p h y 3 _ n c
4 !
5 !> @file
6 !!
7 !! Definition of the initial surface and bedrock topography
8 !! (including gradients) and of the horizontal grid spacings dxi, deta.
9 !! For initial topography from previous simulation (read in NetCDF format).
10 !!
11 !! @section Copyright
12 !!
13 !! Copyright 2009-2013 Ralf Greve
14 !!
15 !! @section License
16 !!
17 !! This file is part of SICOPOLIS.
18 !!
19 !! SICOPOLIS is free software: you can redistribute it and/or modify
20 !! it under the terms of the GNU General Public License as published by
21 !! the Free Software Foundation, either version 3 of the License, or
22 !! (at your option) any later version.
23 !!
24 !! SICOPOLIS is distributed in the hope that it will be useful,
25 !! but WITHOUT ANY WARRANTY; without even the implied warranty of
26 !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 !! GNU General Public License for more details.
28 !!
29 !! You should have received a copy of the GNU General Public License
30 !! along with SICOPOLIS. If not, see <http://www.gnu.org/licenses/>.
31 !<
32 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
33 
34 !-------------------------------------------------------------------------------
35 !> Definition of the initial surface and bedrock topography
36 !! (including gradients) and of the horizontal grid spacings dxi, deta.
37 !! For initial topography from previous simulation (read in NetCDF format).
38 !<------------------------------------------------------------------------------
39 subroutine topography3_nc(dxi, deta, z_sl, anfdatname)
40 
41 use sico_types
43 use netcdf
44 use nc_check
45 
46 implicit none
47 
48 character(len=100), intent(in) :: anfdatname
49 
50 real(dp), intent(out) :: dxi, deta, z_sl
51 
52 integer(i4b) :: i, j, kc, kt, kr, n
53 integer(i4b) :: ios
54 character :: ch_dummy
55 
56 integer(i4b) :: ncid, ncv
57 ! ncid: ID of the output file
58 ! ncv: Variable ID
59 
60 integer(i2b), dimension(0:IMAX,0:JMAX) :: maske_conv, n_cts_conv
61 real(sp) :: time_conv, dummy_conv, z_sl_conv, &
62  v_tot_conv, a_grounded_conv, a_floating_conv, &
63  h_r_conv, &
64  xi_conv(0:imax), eta_conv(0:jmax), &
65  sigma_level_c_conv(0:kcmax), sigma_level_t_conv(0:ktmax), &
66  sigma_level_r_conv(0:krmax)
67 real(sp), dimension(0:IMAX,0:JMAX) :: lambda_conv, phi_conv, &
68  lon_conv, lat_conv, &
69  temp_s_conv, as_perp_conv, &
70  zs_conv, zm_conv, zb_conv, zl_conv, h_c_conv, h_t_conv, h_conv, &
71  q_bm_conv, q_tld_conv, &
72  am_perp_conv, &
73  qx_conv, qy_conv, &
74  dzs_dtau_conv, dzm_dtau_conv, dzb_dtau_conv, dzl_dtau_conv, &
75  dh_c_dtau_conv, dh_t_dtau_conv, dh_dtau_conv, &
76  vx_b_g_conv, vy_b_g_conv, vz_b_conv, vh_b_conv, &
77  vx_s_g_conv, vy_s_g_conv, vz_s_conv, vh_s_conv, &
78  temp_b_conv, temph_b_conv, &
79  p_b_w_conv, h_w_conv, q_gl_g_conv
80 real(sp), dimension(0:IMAX,0:JMAX,0:KCMAX) :: vx_c_conv, vy_c_conv, vz_c_conv, &
81  temp_c_conv, age_c_conv
82 real(sp), dimension(0:IMAX,0:JMAX,0:KTMAX) :: vx_t_conv, vy_t_conv, vz_t_conv, &
83  omega_t_conv, age_t_conv
84 real(sp), dimension(0:IMAX,0:JMAX,0:KRMAX) :: temp_r_conv
85 
86 !-------- Read data from time-slice file of previous simulation --------
87 
88 call check( nf90_open(anfdatpath//'/'//trim(anfdatname), nf90_nowrite, ncid) )
89 
90 call check( nf90_inq_varid(ncid, 'time', ncv) )
91 call check( nf90_get_var(ncid, ncv, time_conv) )
92 
93 if ( nf90_inq_varid(ncid, 'delta_ts', ncv) == nf90_noerr ) then
94  call check( nf90_get_var(ncid, ncv, dummy_conv) )
95 else if ( nf90_inq_varid(ncid, 'glac_index', ncv) == nf90_noerr ) then
96  call check( nf90_get_var(ncid, ncv, dummy_conv) )
97 else
98  continue
99 end if
100 
101 call check( nf90_inq_varid(ncid, 'z_sl', ncv) )
102 call check( nf90_get_var(ncid, ncv, z_sl_conv) )
103 
104 call check( nf90_inq_varid(ncid, 'xi', ncv) )
105 call check( nf90_get_var(ncid, ncv, xi_conv) )
106 
107 call check( nf90_inq_varid(ncid, 'eta', ncv) )
108 call check( nf90_get_var(ncid, ncv, eta_conv) )
109 
110 call check( nf90_inq_varid(ncid, 'sigma_level_c', ncv) )
111 call check( nf90_get_var(ncid, ncv, sigma_level_c_conv) )
112 
113 call check( nf90_inq_varid(ncid, 'sigma_level_t', ncv) )
114 call check( nf90_get_var(ncid, ncv, sigma_level_t_conv) )
115 
116 call check( nf90_inq_varid(ncid, 'sigma_level_r', ncv) )
117 call check( nf90_get_var(ncid, ncv, sigma_level_r_conv) )
118 
119 call check( nf90_inq_varid(ncid, 'lon', ncv) )
120 call check( nf90_get_var(ncid, ncv, lon_conv) )
121 
122 call check( nf90_inq_varid(ncid, 'lat', ncv) )
123 call check( nf90_get_var(ncid, ncv, lat_conv) )
124 
125 call check( nf90_inq_varid(ncid, 'lambda', ncv) )
126 call check( nf90_get_var(ncid, ncv, lambda_conv) )
127 
128 call check( nf90_inq_varid(ncid, 'phi', ncv) )
129 call check( nf90_get_var(ncid, ncv, phi_conv) )
130 
131 call check( nf90_inq_varid(ncid, 'temp_s', ncv) )
132 call check( nf90_get_var(ncid, ncv, temp_s_conv) )
133 
134 call check( nf90_inq_varid(ncid, 'as_perp', ncv) )
135 call check( nf90_get_var(ncid, ncv, as_perp_conv) )
136 
137 call check( nf90_inq_varid(ncid, 'maske', ncv) )
138 call check( nf90_get_var(ncid, ncv, maske_conv) )
139 
140 call check( nf90_inq_varid(ncid, 'n_cts', ncv) )
141 call check( nf90_get_var(ncid, ncv, n_cts_conv) )
142 
143 call check( nf90_inq_varid(ncid, 'zs', ncv) )
144 call check( nf90_get_var(ncid, ncv, zs_conv) )
145 
146 call check( nf90_inq_varid(ncid, 'zm', ncv) )
147 call check( nf90_get_var(ncid, ncv, zm_conv) )
148 
149 call check( nf90_inq_varid(ncid, 'zb', ncv) )
150 call check( nf90_get_var(ncid, ncv, zb_conv) )
151 
152 call check( nf90_inq_varid(ncid, 'zl', ncv) )
153 call check( nf90_get_var(ncid, ncv, zl_conv) )
154 
155 call check( nf90_inq_varid(ncid, 'H_c', ncv) )
156 call check( nf90_get_var(ncid, ncv, h_c_conv) )
157 
158 call check( nf90_inq_varid(ncid, 'H_t', ncv) )
159 call check( nf90_get_var(ncid, ncv, h_t_conv) )
160 
161 call check( nf90_inq_varid(ncid, 'H', ncv) )
162 call check( nf90_get_var(ncid, ncv, h_conv) )
163 
164 call check( nf90_inq_varid(ncid, 'H_R', ncv) )
165 call check( nf90_get_var(ncid, ncv, h_r_conv) )
166 
167 call check( nf90_inq_varid(ncid, 'vx_c', ncv) )
168 call check( nf90_get_var(ncid, ncv, vx_c_conv) )
169 
170 call check( nf90_inq_varid(ncid, 'vy_c', ncv) )
171 call check( nf90_get_var(ncid, ncv, vy_c_conv) )
172 
173 call check( nf90_inq_varid(ncid, 'vz_c', ncv) )
174 call check( nf90_get_var(ncid, ncv, vz_c_conv) )
175 
176 call check( nf90_inq_varid(ncid, 'vx_t', ncv) )
177 call check( nf90_get_var(ncid, ncv, vx_t_conv) )
178 
179 call check( nf90_inq_varid(ncid, 'vy_t', ncv) )
180 call check( nf90_get_var(ncid, ncv, vy_t_conv) )
181 
182 call check( nf90_inq_varid(ncid, 'vz_t', ncv) )
183 call check( nf90_get_var(ncid, ncv, vz_t_conv) )
184 
185 call check( nf90_inq_varid(ncid, 'temp_c', ncv) )
186 call check( nf90_get_var(ncid, ncv, temp_c_conv) )
187 
188 call check( nf90_inq_varid(ncid, 'omega_t', ncv) )
189 call check( nf90_get_var(ncid, ncv, omega_t_conv) )
190 
191 call check( nf90_inq_varid(ncid, 'temp_r', ncv) )
192 call check( nf90_get_var(ncid, ncv, temp_r_conv) )
193 
194 call check( nf90_inq_varid(ncid, 'Q_bm', ncv) )
195 call check( nf90_get_var(ncid, ncv, q_bm_conv) )
196 
197 call check( nf90_inq_varid(ncid, 'Q_tld', ncv) )
198 call check( nf90_get_var(ncid, ncv, q_tld_conv) )
199 
200 call check( nf90_inq_varid(ncid, 'am_perp', ncv) )
201 call check( nf90_get_var(ncid, ncv, am_perp_conv) )
202 
203 call check( nf90_inq_varid(ncid, 'qx', ncv) )
204 call check( nf90_get_var(ncid, ncv, qx_conv) )
205 
206 call check( nf90_inq_varid(ncid, 'qy', ncv) )
207 call check( nf90_get_var(ncid, ncv, qy_conv) )
208 
209 call check( nf90_inq_varid(ncid, 'age_c', ncv) )
210 call check( nf90_get_var(ncid, ncv, age_c_conv) )
211 
212 call check( nf90_inq_varid(ncid, 'age_t', ncv) )
213 call check( nf90_get_var(ncid, ncv, age_t_conv) )
214 
215 call check( nf90_inq_varid(ncid, 'dzs_dtau', ncv) )
216 call check( nf90_get_var(ncid, ncv, dzs_dtau_conv) )
217 
218 call check( nf90_inq_varid(ncid, 'dzm_dtau', ncv) )
219 call check( nf90_get_var(ncid, ncv, dzm_dtau_conv) )
220 
221 call check( nf90_inq_varid(ncid, 'dzb_dtau', ncv) )
222 call check( nf90_get_var(ncid, ncv, dzb_dtau_conv) )
223 
224 call check( nf90_inq_varid(ncid, 'dzl_dtau', ncv) )
225 call check( nf90_get_var(ncid, ncv, dzl_dtau_conv) )
226 
227 call check( nf90_inq_varid(ncid, 'dH_c_dtau', ncv) )
228 call check( nf90_get_var(ncid, ncv, dh_c_dtau_conv) )
229 
230 call check( nf90_inq_varid(ncid, 'dH_t_dtau', ncv) )
231 call check( nf90_get_var(ncid, ncv, dh_t_dtau_conv) )
232 
233 call check( nf90_inq_varid(ncid, 'dH_dtau', ncv) )
234 call check( nf90_get_var(ncid, ncv, dh_dtau_conv) )
235 
236 if ( nf90_inq_varid(ncid, 'vx_b_g', ncv) == nf90_noerr ) then
237  call check( nf90_get_var(ncid, ncv, vx_b_g_conv) )
238 else
239  go to 110
240 end if
241 
242 if ( nf90_inq_varid(ncid, 'vy_b_g', ncv) == nf90_noerr ) then
243  call check( nf90_get_var(ncid, ncv, vy_b_g_conv) )
244 else
245  go to 110
246 end if
247 
248 if ( nf90_inq_varid(ncid, 'vz_b', ncv) == nf90_noerr ) then
249  call check( nf90_get_var(ncid, ncv, vz_b_conv) )
250 else
251  go to 110
252 end if
253 
254 if ( nf90_inq_varid(ncid, 'vh_b', ncv) == nf90_noerr ) then
255  call check( nf90_get_var(ncid, ncv, vh_b_conv) )
256 else
257  go to 110
258 end if
259 
260 if ( nf90_inq_varid(ncid, 'vx_s_g', ncv) == nf90_noerr ) then
261  call check( nf90_get_var(ncid, ncv, vx_s_g_conv) )
262 else
263  go to 110
264 end if
265 
266 if ( nf90_inq_varid(ncid, 'vy_s_g', ncv) == nf90_noerr ) then
267  call check( nf90_get_var(ncid, ncv, vy_s_g_conv) )
268 else
269  go to 110
270 end if
271 
272 if ( nf90_inq_varid(ncid, 'vz_s', ncv) == nf90_noerr ) then
273  call check( nf90_get_var(ncid, ncv, vz_s_conv) )
274 else
275  go to 110
276 end if
277 
278 if ( nf90_inq_varid(ncid, 'vh_s', ncv) == nf90_noerr ) then
279  call check( nf90_get_var(ncid, ncv, vh_s_conv) )
280 else
281  go to 110
282 end if
283 
284 if ( nf90_inq_varid(ncid, 'temp_b', ncv) == nf90_noerr ) then
285  call check( nf90_get_var(ncid, ncv, temp_b_conv) )
286 else
287  go to 110
288 end if
289 
290 if ( nf90_inq_varid(ncid, 'temph_b', ncv) == nf90_noerr ) then
291  call check( nf90_get_var(ncid, ncv, temph_b_conv) )
292 else
293  go to 110
294 end if
295 
296 if ( nf90_inq_varid(ncid, 'p_b_w', ncv) == nf90_noerr ) then
297  call check( nf90_get_var(ncid, ncv, p_b_w_conv) )
298 else
299  go to 110
300 end if
301 
302 if ( nf90_inq_varid(ncid, 'H_w', ncv) == nf90_noerr ) then
303  call check( nf90_get_var(ncid, ncv, h_w_conv) )
304 else
305  go to 110
306 end if
307 
308 if ( nf90_inq_varid(ncid, 'q_gl_g', ncv) == nf90_noerr ) then
309  call check( nf90_get_var(ncid, ncv, q_gl_g_conv) )
310 else
311  go to 110
312 end if
313 
314 go to 120
315 
316 110 continue
317 write(6,'(/1x,a)') 'topography3_nc: End-of-file condition while reading *.nc.'
318 write(6, '(1x,a)') ' Some variables will be undefined.'
319 
320 120 continue
321 
322 call check( nf90_close(ncid) )
323 
324 !-------- Convert data to real*8 and years to seconds --------
325 
326 z_sl = real(z_sl_conv,dp)
327 
328 h_r = real(h_r_conv,dp)
329 
330 do i=0, imax
331  xi(i) = real(xi_conv(i),dp)
332 end do
333 
334 do j=0, jmax
335  eta(j) = real(eta_conv(j),dp)
336 end do
337 
338 do i=0, imax
339 do j=0, jmax
340 
341  maske(j,i) = maske_conv(i,j)
342  n_cts(j,i) = n_cts_conv(i,j)
343  zs(j,i) = real(zs_conv(i,j),dp)
344  zm(j,i) = real(zm_conv(i,j),dp)
345  zb(j,i) = real(zb_conv(i,j),dp)
346  zl(j,i) = real(zl_conv(i,j),dp)
347  h_c(j,i) = real(H_c_conv(i,j),dp)
348  h_t(j,i) = real(H_t_conv(i,j),dp)
349  q_bm(j,i) = real(Q_bm_conv(i,j),dp)/year_sec
350  q_tld(j,i) = real(Q_tld_conv(i,j),dp)/year_sec
351  am_perp(j,i) = real(am_perp_conv(i,j),dp)/year_sec
352  qx(j,i) = real(qx_conv(i,j),dp)/year_sec
353  qy(j,i) = real(qy_conv(i,j),dp)/year_sec
354  dzs_dtau(j,i) = real(dzs_dtau_conv(i,j),dp)/year_sec
355  dzm_dtau(j,i) = real(dzm_dtau_conv(i,j),dp)/year_sec
356  dzb_dtau(j,i) = real(dzb_dtau_conv(i,j),dp)/year_sec
357  dzl_dtau(j,i) = real(dzl_dtau_conv(i,j),dp)/year_sec
358  dh_c_dtau(j,i) = real(dH_c_dtau_conv(i,j),dp)/year_sec
359  dh_t_dtau(j,i) = real(dH_t_dtau_conv(i,j),dp)/year_sec
360  vx_b_g(j,i) = real(vx_b_g_conv(i,j),dp)/year_sec
361  vy_b_g(j,i) = real(vy_b_g_conv(i,j),dp)/year_sec
362  vz_b(j,i) = real(vz_b_conv(i,j),dp)/year_sec
363  vx_s_g(j,i) = real(vx_s_g_conv(i,j),dp)/year_sec
364  vy_s_g(j,i) = real(vy_s_g_conv(i,j),dp)/year_sec
365  vz_s(j,i) = real(vz_s_conv(i,j),dp)/year_sec
366  temp_b(j,i) = real(temp_b_conv(i,j),dp)
367  temph_b(j,i) = real(temph_b_conv(i,j),dp)
368  p_b_w(j,i) = real(p_b_w_conv(i,j),dp)
369  h_w(j,i) = real(H_w_conv(i,j),dp)
370  q_gl_g(j,i) = real(q_gl_g_conv(i,j),dp)/year_sec
371 
372  do kr=0, krmax
373  temp_r(kr,j,i) = real(temp_r_conv(i,j,kr),dp)
374  end do
375 
376  do kt=0, ktmax
377  vx_t(kt,j,i) = real(vx_t_conv(i,j,kt),dp)/year_sec
378  vy_t(kt,j,i) = real(vy_t_conv(i,j,kt),dp)/year_sec
379  vz_t(kt,j,i) = real(vz_t_conv(i,j,kt),dp)/year_sec
380  omega_t(kt,j,i) = real(omega_t_conv(i,j,kt),dp)
381  age_t(kt,j,i) = real(age_t_conv(i,j,kt),dp)*year_sec
382  end do
383 
384  do kc=0, kcmax
385  vx_c(kc,j,i) = real(vx_c_conv(i,j,kc),dp)/year_sec
386  vy_c(kc,j,i) = real(vy_c_conv(i,j,kc),dp)/year_sec
387  vz_c(kc,j,i) = real(vz_c_conv(i,j,kc),dp)/year_sec
388  temp_c(kc,j,i) = real(temp_c_conv(i,j,kc),dp)
389  age_c(kc,j,i) = real(age_c_conv(i,j,kc),dp)*year_sec
390  end do
391 
392 end do
393 end do
394 
395 !-------- Read topography of the relaxed bedrock --------
396 
397 open(23, iostat=ios, &
398  file=inpath//'/nhem/'//zl0_file, &
399  recl=16384, status='old')
400 
401 if (ios /= 0) stop ' topography3_nc: Error when opening the zl0 file!'
402 
403 do n=1, 6; read(23,'(a)') ch_dummy; end do
404 
405 do j=jmax, 0, -1
406  read(23,*) (zl0(j,i), i=0,imax)
407 end do
408 
409 close(23, status='keep')
410 
411 !-------- Further stuff --------
412 
413 dxi = dx *1000.0_dp ! km -> m
414 deta = dx *1000.0_dp ! km -> m
415 
416 do i=0, imax
417 do j=0, jmax
418  call geo_coord(phi(j,i), lambda(j,i), xi(i), eta(j))
419 end do
420 end do
421 
422 !-------- Metric tensor, gradients of the topography --------
423 
424 call metric()
425 
426 #if TOPOGRAD==0
427 call topograd_1(dxi, deta, 1)
428 #elif TOPOGRAD==1
429 call topograd_2(dxi, deta, 1)
430 #endif
431 
432 !-------- Corresponding area of grid points --------
433 
434 do i=0, imax
435 do j=0, jmax
436  area(j,i) = sq_g11_g(j,i)*sq_g22_g(j,i)*dxi*deta
437 end do
438 end do
439 
440 end subroutine topography3_nc
441 !