37 subroutine calc_top_1(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) :: czs2(0:jmax,0:imax), czs3(0:jmax,0:imax)
58 real(dp) :: year_sec_inv
60 real(dp) :: azs2, azs3
61 real(dp),
dimension(0:JMAX,0:IMAX) :: h, h_neu, h_sea_neu
62 real(dp) :: rhosw_rho_ratio
63 real(dp) :: calv_uw_coeff, r1_calv_uw, r2_calv_uw
64 real(dp) :: target_topo_time_lag, target_topo_weight_lin
65 logical :: flag_calving_event
67 real(dp),
parameter :: h_isol_max = 1.0e+03_dp
74 integer(i4b) :: nc, nr
75 integer(i4b),
parameter :: nmax = (imax+1)*(jmax+1)
76 integer(i4b),
parameter :: n_sprs = 10*(imax+1)*(jmax+1)
77 integer(i4b),
allocatable,
dimension(:) :: lgs_a_ptr, lgs_a_index
78 integer(i4b),
allocatable,
dimension(:) :: lgs_a_diag_index
79 integer(i4b),
allocatable,
dimension(:) :: lgs_a_index_trim
80 real(dp),
allocatable,
dimension(:) :: lgs_a_value, lgs_b_value, lgs_x_value
81 real(dp),
allocatable,
dimension(:) :: lgs_a_value_trim
88 lis_integer,
parameter :: nmax = (imax+1)*(jmax+1)
89 lis_integer,
parameter :: n_sprs = 10*(imax+1)*(jmax+1)
90 lis_integer,
allocatable,
dimension(:) :: lgs_a_ptr, lgs_a_index
91 lis_integer,
allocatable,
dimension(:) :: lgs_a_diag_index
93 lis_vector :: lgs_b, lgs_x
94 lis_scalar,
allocatable,
dimension(:) :: lgs_a_value, lgs_b_value, lgs_x_value
96 character(len=256) :: ch_solver_set_option
102 year_sec_inv = 1.0_dp/year_sec
104 rhosw_rho_ratio = rho_sw/rho
106 dtime_inv = 1.0_dp/dtime
108 azs2 = dtime/(dxi*dxi)
109 azs3 = dtime/(deta*deta)
132 czs2(j,i) = azs2*0.5_dp*(h_diff(j,i)+h_diff(j,i+1)) &
133 *sq_g22_sgx(j,i)*insq_g11_sgx(j,i)
139 czs3(j,i) = azs3*0.5_dp*(h_diff(j,i)+h_diff(j+1,i)) &
140 *sq_g11_sgy(j,i)*insq_g22_sgy(j,i)
149 if (maske(j,i) <= 1_i2b)
then
153 zs_neu(j,i) = zs(j,i) &
154 + dtime*(as_perp(j,i)+dzb_dtau(j,i)-q_b_tot(j,i)) &
155 + ( czs2(j,i) *(zs(j,i+1)-zs(j,i) ) &
156 -czs2(j,i-1)*(zs(j,i) -zs(j,i-1)) &
157 +czs3(j,i) *(zs(j+1,i)-zs(j,i) ) &
158 -czs3(j-1,i)*(zs(j,i) -zs(j-1,i)) ) &
159 *insq_g11_g(j,i)*insq_g22_g(j,i)
164 zs_neu(j,i) = zb_neu(j,i)
173 zs_neu(0,i) = zb_neu(0,i)
174 zs_neu(jmax,i) = zb_neu(jmax,i)
178 zs_neu(j,0) = zb_neu(j,0)
179 zs_neu(j,imax) = zb_neu(j,imax)
184 #elif (CALCZS==1 || CALCZS==2)
186 stop
' calc_top_1: ADI and over-implicit ADI schemes not available any more!'
190 #elif (CALCZS==3 || CALCZS==4)
196 czs2(j,i) = azs2*0.5_dp*(h_diff(j,i)+h_diff(j,i+1)) &
197 *sq_g22_sgx(j,i)*insq_g11_sgx(j,i)
203 czs3(j,i) = azs3*0.5_dp*(h_diff(j,i)+h_diff(j+1,i)) &
204 *sq_g11_sgy(j,i)*insq_g22_sgy(j,i)
211 allocate(lgs_a_value(n_sprs), lgs_a_index(n_sprs), lgs_a_ptr(nmax+1))
212 allocate(lgs_a_diag_index(nmax), lgs_b_value(nmax), lgs_x_value(nmax))
231 (i /= 0).and.(i /= imax).and.(j /= 0).and.(j /= jmax) &
233 .and.(maske(j,i) <= 1_i2b) &
240 lgs_a_value(k) = -czs3(j-1,i)*ovi_weight &
241 *insq_g11_g(j,i)*insq_g22_g(j,i)
247 lgs_a_value(k) = -czs2(j,i-1)*ovi_weight &
248 *insq_g11_g(j,i)*insq_g22_g(j,i)
256 lgs_a_value(k) = 1.0_dp &
257 + (czs2(j,i)+czs2(j,i-1)+czs3(j,i)+czs3(j-1,i)) &
259 *insq_g11_g(j,i)*insq_g22_g(j,i)
260 lgs_a_diag_index(nr) = k
266 lgs_a_value(k) = -czs2(j,i)*ovi_weight &
267 *insq_g11_g(j,i)*insq_g22_g(j,i)
273 lgs_a_value(k) = -czs3(j,i)*ovi_weight &
274 *insq_g11_g(j,i)*insq_g22_g(j,i)
277 lgs_b_value(nr) = zs(j,i) &
278 + dtime*(as_perp(j,i)+dzb_dtau(j,i)-q_b_tot(j,i)) &
279 + ( czs2(j,i)*(zs(j,i+1)-zs(j,i)) &
280 -czs2(j,i-1)*(zs(j,i)-zs(j,i-1)) &
281 +czs3(j,i)*(zs(j+1,i)-zs(j,i)) &
282 -czs3(j-1,i)*(zs(j,i)-zs(j-1,i)) ) &
283 *(1.0_dp-ovi_weight) &
284 *insq_g11_g(j,i)*insq_g22_g(j,i)
291 lgs_a_value(k) = 1.0_dp
292 lgs_a_diag_index(nr) = k
294 lgs_b_value(nr) = zb_neu(j,i)
298 lgs_x_value(nr) = zs(j,i)
301 lgs_a_ptr(nr+1) = k+1
311 allocate(lgs_a_value_trim(nnz), lgs_a_index_trim(nnz))
314 lgs_a_value_trim(k) = lgs_a_value(k)
315 lgs_a_index_trim(k) = lgs_a_index(k)
318 deallocate(lgs_a_value, lgs_a_index)
320 eps_sor = 1.0e-05_dp*mean_accum*dtime
323 lgs_a_index_trim, lgs_a_diag_index, lgs_a_ptr, &
325 nnz, nmax, omega_sor, eps_sor, lgs_x_value, ierr)
330 zs_neu(j,i) = lgs_x_value(nr)
333 deallocate(lgs_a_value_trim, lgs_a_index_trim, lgs_a_ptr)
334 deallocate(lgs_a_diag_index, lgs_b_value, lgs_x_value)
340 call lis_matrix_create(lis_comm_world, lgs_a, ierr)
341 call lis_vector_create(lis_comm_world, lgs_b, ierr)
342 call lis_vector_create(lis_comm_world, lgs_x, ierr)
344 call lis_matrix_set_size(lgs_a, 0, nmax, ierr)
345 call lis_vector_set_size(lgs_b, 0, nmax, ierr)
346 call lis_vector_set_size(lgs_x, 0, nmax, ierr)
350 do nc=lgs_a_ptr(nr), lgs_a_ptr(nr+1)-1
351 call lis_matrix_set_value(lis_ins_value, nr, lgs_a_index(nc), &
352 lgs_a_value(nc), lgs_a, ierr)
355 call lis_vector_set_value(lis_ins_value, nr, lgs_b_value(nr), lgs_b, ierr)
356 call lis_vector_set_value(lis_ins_value, nr, lgs_x_value(nr), lgs_x, ierr)
360 call lis_matrix_set_type(lgs_a, lis_matrix_csr, ierr)
361 call lis_matrix_assemble(lgs_a, ierr)
365 call lis_solver_create(solver, ierr)
367 ch_solver_set_option =
'-i bicg -p ilu '// &
368 '-maxiter 1000 -tol 1.0e-12 -initx_zeros false'
369 call lis_solver_set_option(trim(ch_solver_set_option), solver, ierr)
371 call lis_solve(lgs_a, lgs_b, lgs_x, solver, ierr)
373 call lis_solver_get_iters(solver, iter, ierr)
374 write(6,
'(11x,a,i5)')
'calc_top_1: iter = ', iter
377 call lis_vector_gather(lgs_x, lgs_x_value, ierr)
378 call lis_matrix_destroy(lgs_a, ierr)
379 call lis_vector_destroy(lgs_b, ierr)
380 call lis_vector_destroy(lgs_x, ierr)
381 call lis_solver_destroy(solver, ierr)
386 zs_neu(j,i) = lgs_x_value(nr)
389 deallocate(lgs_a_value, lgs_a_index, lgs_a_ptr)
390 deallocate(lgs_a_diag_index, lgs_b_value, lgs_x_value)
400 if (time >= time_target_topo_final)
then
402 else if (time >= time_target_topo_init)
then
403 zs_neu = ( target_topo_time_lag*zs_neu + dtime*zs_target ) &
404 / ( target_topo_time_lag + dtime )
411 h_neu = zs_neu - zb_neu
414 && (marine_ice_formation==2) \
415 && (marine_ice_calving==9))
417 calv_uw_coeff = calv_uw_coeff * year_sec_inv
418 r1_calv_uw = r1_calv_uw
419 r2_calv_uw = r2_calv_uw
422 if (time >= time_target_topo_final)
then
423 calv_uw_coeff = 0.0_dp
425 else if (time >= time_target_topo_init)
then
426 target_topo_weight_lin = (time-time_target_topo_init) &
427 /(time_target_topo_final-time_target_topo_init)
428 calv_uw_coeff = (1.0_dp-target_topo_weight_lin)*calv_uw_coeff
440 if (maske(j,i) <= 1_i2b)
then
442 h_sea_neu(j,i) = z_sl-zl_neu(j,i)
446 if (h_neu(j,i) >= h_min)
then
449 && (marine_ice_formation==2) \
450 && (marine_ice_calving==9))
451 if ( h_neu(j,i) < (rhosw_rho_ratio*h_sea_neu(j,i)) )
then
453 h_neu(j,i) = h_neu(j,i) - ( calv_uw_coeff &
454 *h_neu(j,i)**r1_calv_uw &
455 *h_sea_neu(j,i)**r2_calv_uw ) * dtime
457 zs_neu(j,i) = zb_neu(j,i) + h_neu(j,i)
458 if (h_neu(j,i) < h_min) maske(j,i) = 2_i2b
469 h_sea_neu(j,i) = z_sl-zl_neu(j,i)
471 if (h_neu(j,i) >= h_min)
then
473 if ( h_neu(j,i) < (rhosw_rho_ratio*h_sea_neu(j,i)) )
then
475 #if (MARINE_ICE_FORMATION==1)
477 #elif (MARINE_ICE_FORMATION==2)
479 #if (MARINE_ICE_CALVING==9)
480 h_neu(j,i) = h_neu(j,i) - ( calv_uw_coeff &
481 *h_neu(j,i)**r1_calv_uw &
482 *h_sea_neu(j,i)**r2_calv_uw ) * dtime
484 zs_neu(j,i) = zb_neu(j,i) + h_neu(j,i)
485 if (h_neu(j,i) < h_min) maske(j,i) = 2_i2b
492 #if (MARINE_ICE_CALVING==2 \
493 || marine_ice_calving==4 \
494 || marine_ice_calving==6)
495 if (zl0(j,i) < z_mar) maske(j,i) = 2_i2b
496 #elif (MARINE_ICE_CALVING==3 \
497 || marine_ice_calving==5 \
498 || marine_ice_calving==7)
499 if (zl_neu(j,i) < z_mar) maske(j,i) = 2_i2b
518 if (time >= time_target_topo_final) maske = maske_target
528 if (maske_maxextent(j,i)==0_i2b)
then
530 if (maske(j,i)==0_i2b)
then
532 else if (maske(j,i)==3_i2b)
then
546 flag_grounding_line_1 = .false.
547 flag_grounding_line_2 = .false.
549 flag_calving_front_1 = .false.
550 flag_calving_front_2 = .false.
557 if (maske(j,i) == 1_i2b)
then
559 zs_neu(j,i) = zb_neu(j,i)
562 else if (maske(j,i) == 2_i2b)
then
564 zs_neu(j,i) = zb_neu(j,i)
567 else if (maske(j,i) == 3_i2b)
then
569 stop
' calc_top_1: maske(j,i)==3 not allowed for SIA-only dynamics!'
583 if (maske(j,i) == 0_i2b)
then
585 as_perp(j,i) = as_perp(j,i) - (zs_neu(j,i)-zs(j,i))*dtime_inv
591 as_perp(j,i) = 0.0_dp
595 zs_neu(j,i) = zs(j,i)
596 h_neu(j,i) = zs_neu(j,i)-zb_neu(j,i)
606 if (maske(j,i) == 0_i2b)
then
610 if ( ((maske(j,i+1) == 1_i2b).or.(maske(j,i+1) == 2_i2b)) &
611 .and. ((maske(j,i-1) == 1_i2b).or.(maske(j,i-1) == 2_i2b)) &
612 .and. ((maske(j+1,i) == 1_i2b).or.(maske(j+1,i) == 2_i2b)) &
613 .and. ((maske(j-1,i) == 1_i2b).or.(maske(j-1,i) == 2_i2b)) &
615 h_neu(j,i) = min(h_neu(j,i), h_isol_max)
616 zs_neu(j,i) = zb_neu(j,i)+h_neu(j,i)
621 if (n_cts(j,i) == 1)
then
622 h_t_neu(j,i) = h_t(j,i) * h_neu(j,i)/h(j,i)
623 zm_neu(j,i) = zb_neu(j,i)+h_t_neu(j,i)
624 h_c_neu(j,i) = zs_neu(j,i)-zm_neu(j,i)
626 h_t_neu(j,i) = 0.0_dp
627 zm_neu(j,i) = zb_neu(j,i)
628 h_c_neu(j,i) = zs_neu(j,i)-zm_neu(j,i)
633 zs_neu(j,i) = zb_neu(j,i)
634 zm_neu(j,i) = zb_neu(j,i)
635 h_c_neu(j,i) = 0.0_dp
636 h_t_neu(j,i) = 0.0_dp
641 dzs_dtau(j,i) = (zs_neu(j,i)-zs(j,i))*dtime_inv
642 dzb_dtau(j,i) = (zb_neu(j,i)-zb(j,i))*dtime_inv
643 dzm_dtau(j,i) = dh_t_dtau(j,i)+dzb_dtau(j,i)
644 dh_c_dtau(j,i) = dzs_dtau(j,i)-dzm_dtau(j,i)
647 if ( abs((time-time_target_topo_final)*year_sec_inv) < eps )
then
651 dh_c_dtau(j,i) = 0.0_dp
652 dh_t_dtau(j,i) = 0.0_dp
674 if ( (maske(j,i) == 0_i2b).and.(n_cts(j,i) == 1_i2b) )
then
677 0.5_dp*(vx_c(0,j,i)+vx_c(0,j,i-1))*dzm_dxi_g(j,i) &
678 + 0.5_dp*(vy_c(0,j,i)+vy_c(0,j-1,i))*dzm_deta_g(j,i) &
679 - 0.5_dp*(vz_c(0,j,i)+vz_t(ktmax-1,j,i))
680 am_perp(j,i) = am_perp_st(j,i) + dzm_dtau(j,i)
683 am_perp_st(j,i) = 0.0_dp
684 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 ...
Declarations of global variables for SICOPOLIS (for the ANT domain).
Solvers for systems of linear equations used by SICOPOLIS.
subroutine calc_top_1(time, z_sl, z_mar, dtime, dxi, deta, mean_accum, ii, jj, nn)
Computation of the ice topography (including gradients) for SIA-only dynamics of ice sheets without i...
Declarations of global variables for SICOPOLIS.