37 subroutine calc_top_2(time, z_sl, z_mar, dtime, dxi, deta, mean_accum, &
47 integer(i4b),
intent(in) :: ii((imax+1)*(jmax+1)), jj((imax+1)*(jmax+1))
48 integer(i4b),
intent(in) :: nn(0:jmax,0:imax)
49 real(dp),
intent(in) :: time
50 real(dp),
intent(in) :: z_sl, z_mar
51 real(dp),
intent(in) :: dtime, dxi, deta
52 real(dp),
intent(in) :: mean_accum
54 integer(i4b) :: i, j, kc, kt
55 integer(i4b) :: k, nnz
57 real(dp) :: year_sec_inv
59 real(dp) :: dt_dxi, dt_deta
60 real(dp),
dimension(0:JMAX,0:IMAX) :: h, h_neu, h_sea_neu
61 real(dp) :: rhosw_rho_ratio
62 real(dp) :: vx_m_help, vy_m_help
63 real(dp) :: vx_m_1, vx_m_2, vy_m_1, vy_m_2
64 real(dp) :: uph_x_1, uph_x_2, uph_y_1, uph_y_2
65 real(dp) :: calv_uw_coeff, r1_calv_uw, r2_calv_uw
66 real(dp) :: target_topo_time_lag, target_topo_weight_lin
67 logical :: flag_calving_event
69 real(dp),
parameter :: h_isol_max = 1.0e+03_dp
76 integer(i4b) :: nc, nr
77 integer(i4b),
parameter :: nmax = (imax+1)*(jmax+1)
78 integer(i4b),
parameter :: n_sprs = 10*(imax+1)*(jmax+1)
79 integer(i4b),
allocatable,
dimension(:) :: lgs_a_ptr, lgs_a_index
80 integer(i4b),
allocatable,
dimension(:) :: lgs_a_diag_index
81 integer(i4b),
allocatable,
dimension(:) :: lgs_a_index_trim
82 real(dp),
allocatable,
dimension(:) :: lgs_a_value, lgs_b_value, lgs_x_value
83 real(dp),
allocatable,
dimension(:) :: lgs_a_value_trim
90 lis_integer,
parameter :: nmax = (imax+1)*(jmax+1)
91 lis_integer,
parameter :: n_sprs = 10*(imax+1)*(jmax+1)
92 lis_integer,
allocatable,
dimension(:) :: lgs_a_ptr, lgs_a_index
93 lis_integer,
allocatable,
dimension(:) :: lgs_a_diag_index
95 lis_vector :: lgs_b, lgs_x
96 lis_scalar,
allocatable,
dimension(:) :: lgs_a_value, lgs_b_value, lgs_x_value
98 character(len=256) :: ch_solver_set_option
104 year_sec_inv = 1.0_dp/year_sec
106 rhosw_rho_ratio = rho_sw/rho
108 dtime_inv = 1.0_dp/dtime
137 if (maske(j,i) <= 1_i2b)
then
141 vx_m_help = 0.5_dp*(vx_m(j,i)+vx_m(j,i-1))
142 vy_m_help = 0.5_dp*(vy_m(j,i)+vy_m(j-1,i))
144 vx_m_1 = min(vx_m_help, 0.0_dp)
145 vx_m_2 = max(vx_m_help, 0.0_dp)
146 vy_m_1 = min(vy_m_help, 0.0_dp)
147 vy_m_2 = max(vy_m_help, 0.0_dp)
149 uph_x_1 = h(j,i+1)-h(j,i )
150 uph_x_2 = h(j,i )-h(j,i-1)
151 uph_y_1 = h(j+1,i)-h(j ,i)
152 uph_y_2 = h(j ,i)-h(j-1,i)
154 h_neu(j,i) = h(j,i) &
155 + dtime*(as_perp(j,i)-q_b_tot(j,i)) &
157 * ( vx_m_1*uph_x_1 + vx_m_2*uph_x_2 &
158 + (vx_m(j,i)-vx_m(j,i-1))*h(j,i) ) &
160 * ( vy_m_1*uph_y_1 + vy_m_2*uph_y_2 &
161 + (vy_m(j,i)-vy_m(j-1,i))*h(j,i) )
176 h_neu(jmax,i) = 0.0_dp
181 h_neu(j,imax) = 0.0_dp
186 #elif (CALCZS==1 || CALCZS==2)
188 stop
' calc_top_2: Options CALCZS==1 or 2 not supported by this routine!'
192 #elif (CALCZS==3 || CALCZS==4)
197 allocate(lgs_a_value(n_sprs), lgs_a_index(n_sprs), lgs_a_ptr(nmax+1))
198 allocate(lgs_a_diag_index(nmax), lgs_b_value(nmax), lgs_x_value(nmax))
217 (i /= 0).and.(i /= imax).and.(j /= 0).and.(j /= jmax) &
219 .and.(maske(j,i) <= 1_i2b) &
223 vx_m_help = 0.5_dp*(vx_m(j,i)+vx_m(j,i-1))
224 vy_m_help = 0.5_dp*(vy_m(j,i)+vy_m(j-1,i))
226 vx_m_1 = min(vx_m_help, 0.0_dp)
227 vx_m_2 = max(vx_m_help, 0.0_dp)
228 vy_m_1 = min(vy_m_help, 0.0_dp)
229 vy_m_2 = max(vy_m_help, 0.0_dp)
231 uph_x_1 = h(j,i+1)-h(j,i )
232 uph_x_2 = h(j,i )-h(j,i-1)
233 uph_y_1 = h(j+1,i)-h(j ,i)
234 uph_y_2 = h(j ,i)-h(j-1,i)
236 k=k+1 ; nc=nn(j-1,i) ; lgs_a_index(k)=nc
237 lgs_a_value(k) = -vy_m_2*dt_deta*ovi_weight
240 k=k+1 ; nc=nn(j,i-1) ; lgs_a_index(k)=nc
241 lgs_a_value(k) = -vx_m_2*dt_dxi *ovi_weight
244 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
245 lgs_a_value(k) = 1.0_dp &
249 +(vx_m(j,i)-vx_m(j,i-1)) ) &
252 +(vy_m(j,i)-vy_m(j-1,i)) ) )
255 k=k+1 ; nc=nn(j,i+1) ; lgs_a_index(k)=nc
256 lgs_a_value(k) = vx_m_1*dt_dxi *ovi_weight
259 k=k+1 ; nc=nn(j+1,i) ; lgs_a_index(k)=nc
260 lgs_a_value(k) = vy_m_1*dt_deta*ovi_weight
263 lgs_b_value(nr) = h(j,i) &
264 +dtime*(as_perp(j,i)-q_b_tot(j,i)) &
265 -(1.0_dp-ovi_weight) &
267 * ( vx_m_1*uph_x_1 + vx_m_2*uph_x_2 &
268 + (vx_m(j,i)-vx_m(j,i-1))*h(j,i) ) &
270 * ( vy_m_1*uph_y_1 + vy_m_2*uph_y_2 &
271 + (vy_m(j,i)-vy_m(j-1,i))*h(j,i) ) )
277 lgs_a_value(k) = 1.0_dp
278 lgs_a_diag_index(nr) = k
280 lgs_b_value(nr) = 0.0_dp
284 lgs_x_value(nr) = h(j,i)
287 lgs_a_ptr(nr+1) = k+1
297 allocate(lgs_a_value_trim(nnz), lgs_a_index_trim(nnz))
300 lgs_a_value_trim(k) = lgs_a_value(k)
301 lgs_a_index_trim(k) = lgs_a_index(k)
304 deallocate(lgs_a_value, lgs_a_index)
306 eps_sor = 1.0e-05_dp*mean_accum*dtime
309 lgs_a_index_trim, lgs_a_diag_index, lgs_a_ptr, &
311 nnz, nmax, omega_sor, eps_sor, lgs_x_value, ierr)
316 h_neu(j,i) = lgs_x_value(nr)
319 deallocate(lgs_a_value_trim, lgs_a_index_trim, lgs_a_ptr)
320 deallocate(lgs_a_diag_index, lgs_b_value, lgs_x_value)
326 call lis_matrix_create(lis_comm_world, lgs_a, ierr)
327 call lis_vector_create(lis_comm_world, lgs_b, ierr)
328 call lis_vector_create(lis_comm_world, lgs_x, ierr)
330 call lis_matrix_set_size(lgs_a, 0, nmax, ierr)
331 call lis_vector_set_size(lgs_b, 0, nmax, ierr)
332 call lis_vector_set_size(lgs_x, 0, nmax, ierr)
336 do nc=lgs_a_ptr(nr), lgs_a_ptr(nr+1)-1
337 call lis_matrix_set_value(lis_ins_value, nr, lgs_a_index(nc), &
338 lgs_a_value(nc), lgs_a, ierr)
341 call lis_vector_set_value(lis_ins_value, nr, lgs_b_value(nr), lgs_b, ierr)
342 call lis_vector_set_value(lis_ins_value, nr, lgs_x_value(nr), lgs_x, ierr)
346 call lis_matrix_set_type(lgs_a, lis_matrix_csr, ierr)
347 call lis_matrix_assemble(lgs_a, ierr)
351 call lis_solver_create(solver, ierr)
353 ch_solver_set_option =
'-i bicg -p ilu '// &
354 '-maxiter 1000 -tol 1.0e-12 -initx_zeros false'
355 call lis_solver_set_option(trim(ch_solver_set_option), solver, ierr)
357 call lis_solve(lgs_a, lgs_b, lgs_x, solver, ierr)
359 call lis_solver_get_iters(solver, iter, ierr)
360 write(6,
'(11x,a,i5)')
'calc_top_2: iter = ', iter
363 call lis_vector_gather(lgs_x, lgs_x_value, ierr)
364 call lis_matrix_destroy(lgs_a, ierr)
365 call lis_vector_destroy(lgs_b, ierr)
366 call lis_vector_destroy(lgs_x, ierr)
367 call lis_solver_destroy(solver, ierr)
372 h_neu(j,i) = lgs_x_value(nr)
375 deallocate(lgs_a_value, lgs_a_index, lgs_a_ptr)
376 deallocate(lgs_a_diag_index, lgs_b_value, lgs_x_value)
386 if (time >= time_target_topo_final)
then
388 else if (time >= time_target_topo_init)
then
389 h_neu = ( target_topo_time_lag*h_neu + dtime*h_target ) &
390 / ( target_topo_time_lag + dtime )
397 zs_neu = zb_neu + h_neu
400 && (marine_ice_formation==2) \
401 && (marine_ice_calving==9))
403 calv_uw_coeff = calv_uw_coeff * year_sec_inv
404 r1_calv_uw = r1_calv_uw
405 r2_calv_uw = r2_calv_uw
408 if (time >= time_target_topo_final)
then
409 calv_uw_coeff = 0.0_dp
411 else if (time >= time_target_topo_init)
then
412 target_topo_weight_lin = (time-time_target_topo_init) &
413 /(time_target_topo_final-time_target_topo_init)
414 calv_uw_coeff = (1.0_dp-target_topo_weight_lin)*calv_uw_coeff
426 if (maske(j,i) <= 1_i2b)
then
428 h_sea_neu(j,i) = z_sl-zl_neu(j,i)
432 if (h_neu(j,i) >= h_min)
then
435 && (marine_ice_formation==2) \
436 && (marine_ice_calving==9))
437 if ( h_neu(j,i) < (rhosw_rho_ratio*h_sea_neu(j,i)) )
then
439 h_neu(j,i) = h_neu(j,i) - ( calv_uw_coeff &
440 *h_neu(j,i)**r1_calv_uw &
441 *h_sea_neu(j,i)**r2_calv_uw ) * dtime
443 zs_neu(j,i) = zb_neu(j,i) + h_neu(j,i)
444 if (h_neu(j,i) < h_min) maske(j,i) = 2_i2b
455 h_sea_neu(j,i) = z_sl-zl_neu(j,i)
457 if (h_neu(j,i) >= h_min)
then
459 if ( h_neu(j,i) < (rhosw_rho_ratio*h_sea_neu(j,i)) )
then
461 #if (MARINE_ICE_FORMATION==1)
463 #elif (MARINE_ICE_FORMATION==2)
465 #if (MARINE_ICE_CALVING==9)
466 h_neu(j,i) = h_neu(j,i) - ( calv_uw_coeff &
467 *h_neu(j,i)**r1_calv_uw &
468 *h_sea_neu(j,i)**r2_calv_uw ) * dtime
470 zs_neu(j,i) = zb_neu(j,i) + h_neu(j,i)
471 if (h_neu(j,i) < h_min) maske(j,i) = 2_i2b
478 #if (MARINE_ICE_CALVING==2 \
479 || marine_ice_calving==4 \
480 || marine_ice_calving==6)
481 if (zl0(j,i) < z_mar) maske(j,i) = 2_i2b
482 #elif (MARINE_ICE_CALVING==3 \
483 || marine_ice_calving==5 \
484 || marine_ice_calving==7)
485 if (zl_neu(j,i) < z_mar) maske(j,i) = 2_i2b
504 if (time >= time_target_topo_final) maske = maske_target
514 if (maske_maxextent(j,i)==0_i2b)
then
516 if (maske(j,i)==0_i2b)
then
518 else if (maske(j,i)==3_i2b)
then
533 flag_grounding_line_1 = .false.
534 flag_grounding_line_2 = .false.
536 flag_calving_front_1 = .false.
537 flag_calving_front_2 = .false.
544 if (maske(j,i) == 1_i2b)
then
546 zs_neu(j,i) = zb_neu(j,i)
549 else if (maske(j,i) == 2_i2b)
then
551 zs_neu(j,i) = zb_neu(j,i)
554 else if (maske(j,i) == 3_i2b)
then
556 write(6, fmt=
'(a)')
' calc_top_2: maske(j,i)==3 not allowed for'
557 write(6, fmt=
'(a)')
' hybrid SIA/SStA dynamics of ice sheets'
558 write(6, fmt=
'(a)')
' without ice shelves!'
573 if (maske(j,i) == 0_i2b)
then
575 as_perp(j,i) = as_perp(j,i) - (zs_neu(j,i)-zs(j,i))*dtime_inv
581 as_perp(j,i) = 0.0_dp
585 zs_neu(j,i) = zs(j,i)
586 h_neu(j,i) = zs_neu(j,i)-zb_neu(j,i)
596 if (maske(j,i) == 0_i2b)
then
600 if ( ((maske(j,i+1) == 1_i2b).or.(maske(j,i+1) == 2_i2b)) &
601 .and. ((maske(j,i-1) == 1_i2b).or.(maske(j,i-1) == 2_i2b)) &
602 .and. ((maske(j+1,i) == 1_i2b).or.(maske(j+1,i) == 2_i2b)) &
603 .and. ((maske(j-1,i) == 1_i2b).or.(maske(j-1,i) == 2_i2b)) &
605 h_neu(j,i) = min(h_neu(j,i), h_isol_max)
606 zs_neu(j,i) = zb_neu(j,i)+h_neu(j,i)
611 if (n_cts(j,i) == 1)
then
612 h_t_neu(j,i) = h_t(j,i) * h_neu(j,i)/h(j,i)
613 zm_neu(j,i) = zb_neu(j,i)+h_t_neu(j,i)
614 h_c_neu(j,i) = zs_neu(j,i)-zm_neu(j,i)
616 h_t_neu(j,i) = 0.0_dp
617 zm_neu(j,i) = zb_neu(j,i)
618 h_c_neu(j,i) = zs_neu(j,i)-zm_neu(j,i)
623 zs_neu(j,i) = zb_neu(j,i)
624 zm_neu(j,i) = zb_neu(j,i)
625 h_c_neu(j,i) = 0.0_dp
626 h_t_neu(j,i) = 0.0_dp
631 dzs_dtau(j,i) = (zs_neu(j,i)-zs(j,i))*dtime_inv
632 dzb_dtau(j,i) = (zb_neu(j,i)-zb(j,i))*dtime_inv
633 dzm_dtau(j,i) = dh_t_dtau(j,i)+dzb_dtau(j,i)
634 dh_c_dtau(j,i) = dzs_dtau(j,i)-dzm_dtau(j,i)
637 if ( abs((time-time_target_topo_final)*year_sec_inv) < eps )
then
641 dh_c_dtau(j,i) = 0.0_dp
642 dh_t_dtau(j,i) = 0.0_dp
664 if ( (maske(j,i) == 0_i2b).and.(n_cts(j,i) == 1_i2b) )
then
667 0.5_dp*(vx_c(0,j,i)+vx_c(0,j,i-1))*dzm_dxi_g(j,i) &
668 + 0.5_dp*(vy_c(0,j,i)+vy_c(0,j-1,i))*dzm_deta_g(j,i) &
669 - 0.5_dp*(vz_c(0,j,i)+vz_t(ktmax-1,j,i))
670 am_perp(j,i) = am_perp_st(j,i) + dzm_dtau(j,i)
673 am_perp_st(j,i) = 0.0_dp
674 am_perp(j,i) = 0.0_dp
subroutine topograd_2(dxi, deta, n_switch)
Calculation of topography gradients on the staggered grid and on the grid points (the latter by fourt...
Declarations of kind types for SICOPOLIS.
subroutine topograd_1(dxi, deta, n_switch)
Calculation of topography gradients on the staggered grid and on the grid points (the latter by secon...
subroutine sor_sprs(lgs_a_value, lgs_a_index, lgs_a_diag_index, lgs_a_ptr, lgs_b_value, nnz, nmax, omega, eps_sor, lgs_x_value, ierr)
SOR solver for a system of linear equations lgs_a*lgs_x=lgs_b [matrix storage: compressed sparse row ...
subroutine calc_top_2(time, z_sl, z_mar, dtime, dxi, deta, mean_accum, ii, jj, nn)
Computation of the ice topography (including gradients) for hybrid SIA/SStA dynamics of ice sheets wi...
Declarations of global variables for SICOPOLIS (for the ANT domain).
Solvers for systems of linear equations used by SICOPOLIS.
Declarations of global variables for SICOPOLIS.