7 !! Computation of the topography (including gradients).
11 !! Copyright 2009-2013 Ralf Greve, Tatsuru Sato
15 !! This file is part of SICOPOLIS.
17 !! SICOPOLIS is free software: you can redistribute it and/or modify
18 !! it under the terms of the GNU General Public License as published by
19 !! the Free Software Foundation, either version 3 of the License, or
20 !! (at your option) any later version.
22 !! SICOPOLIS is distributed in the hope that it will be useful,
23 !! but WITHOUT ANY WARRANTY; without even the implied warranty of
24 !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 !! GNU General Public License for more details.
27 !! You should have received a copy of the GNU General Public License
28 !! along with SICOPOLIS. If not, see <http://www.gnu.org/licenses/>.
30 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
33 !> Computation of the topography (including gradients).
34 !<------------------------------------------------------------------------------
36 z_sl, dzsl_dtau, z_mar, &
37 dtime, dxi, deta, dzeta_t, &
39 ii, jj, nn, itercount, iter_wss)
46 integer(i4b),
intent(in) :: ii((imax+1)*(jmax+1)), jj((imax+1)*(jmax+1))
47 integer(i4b),
intent(in) :: nn(0:jmax,0:imax)
48 integer(i4b),
intent(in) :: itercount, iter_wss
49 real(dp),
intent(in) :: time, time_init
50 real(dp),
intent(in) :: z_sl, dzsl_dtau, z_mar
51 real(dp),
intent(in) :: dtime, dxi, deta, dzeta_t
52 real(dp),
intent(in) :: mean_accum
54 integer(i4b) :: i, j, kc, kt
55 integer(i4b) :: in, jn
56 integer(i4b) :: k, nc, nr
61 real(dp) :: czs2(0:jmax,0:imax), czs3(0:jmax,0:imax)
62 real(dp) :: year_sec_inv
64 real(dp) :: dtime_inv, dxi_inv, deta_inv
65 real(dp) :: dt_dxi, dt_deta
66 real(dp) :: azs2, azs3
67 real(dp),
dimension(0:JMAX,0:IMAX) :: h_ice, h_sea
68 real(dp) :: rho_rhoa_ratio, rhosw_rhoa_ratio
69 real(dp) :: rhosw_rho_ratio, rho_rhosw_ratio, rho_sw_rho_sw_minus_rho_ratio
70 real(dp) :: upvx_p, upvy_p, upvx_d, upvy_d, h_balance
71 real(dp) :: calv_uw_coeff, r1_calv_uw, r2_calv_uw
72 real(dp) :: target_topo_time_lag, target_topo_weight_lin
73 logical :: flag_calving_event
75 integer(i4b),
parameter :: nmax=(imax+1)*(jmax+1), n_sprs=10*(imax+1)*(jmax+1)
77 real(dp),
parameter :: h_isol_max = 1.0e+03_dp
81 integer(i4b),
allocatable,
dimension(:) :: lgs_a_ptr, lgs_a_index
82 integer(i4b),
allocatable,
dimension(:) :: lgs_a_diag_index
83 integer(i4b),
allocatable,
dimension(:) :: lgs_a_index_trim
84 real(dp),
allocatable,
dimension(:) :: lgs_a_value, lgs_b_value, lgs_x_value
85 real(dp),
allocatable,
dimension(:) :: lgs_a_value_trim
87 integer(i4b),
allocatable,
dimension(:) :: lgs_a_ptr, lgs_a_index
88 integer(i4b),
allocatable,
dimension(:) :: lgs_a_diag_index
89 integer(i4b),
allocatable,
dimension(:) :: lgs_a_index_trim
90 character(len=256) :: ch_solver_set_option
92 lis_vector lgs_b, lgs_x
93 lis_scalar,
allocatable,
dimension(:) :: lgs_a_value, lgs_b_value, lgs_x_value
94 lis_scalar,
allocatable,
dimension(:) :: lgs_a_value_trim
100 year_sec_inv = 1.0_dp/year_sec
102 tldt_inv = 1.0_dp/(time_lag+dtime)
104 rho_rhoa_ratio = rho/rho_a
105 rhosw_rhoa_ratio = rho_sw/rho_a
107 rho_rhosw_ratio = rho/rho_sw
108 rhosw_rho_ratio = rho_sw/rho
109 rho_sw_rho_sw_minus_rho_ratio = rho_sw/(rho_sw-rho)
111 dtime_inv = 1.0_dp/dtime
113 deta_inv = 1.0_dp/deta
118 azs2 = dtime/(dxi*dxi)
119 azs3 = dtime/(deta*deta)
127 zl_neu(j,i) = zl(j,i)
128 dzl_dtau(j,i) = (zl_neu(j,i)-zl(j,i))*dtime_inv
137 if (maske(j,i) <= 1_i2b)
then
139 zl_neu(j,i) = tldt_inv*( time_lag*zl(j,i) &
141 -frac_llra*rho_rhoa_ratio*(h_c(j,i)+h_t(j,i))) )
145 zl_neu(j,i) = tldt_inv*( time_lag*zl(j,i) &
147 -frac_llra*rhosw_rhoa_ratio*z_sl) )
154 dzl_dtau(j,i) = (zl_neu(j,i)-zl(j,i))*dtime_inv
161 if ((mod(itercount, iter_wss)==0).or.(itercount==1))
then
162 write(6,*)
' -------- Computation of wss'
169 zl_neu(j,i) = tldt_inv * ( time_lag*zl(j,i) + dtime*(zl0(j,i)-wss(j,i)) )
170 dzl_dtau(j,i) = (zl_neu(j,i)-zl(j,i))*dtime_inv
180 if (time >= time_target_topo_final)
then
185 else if (time >= time_target_topo_init)
then
187 target_topo_time_lag = (time_target_topo_final-time)/3.0_dp
189 zl_neu = ( target_topo_time_lag*zl_neu + dtime*zl_target ) &
190 / ( target_topo_time_lag + dtime )
192 dzl_dtau = (zl_neu-zl)*dtime_inv
203 if (maske(j,i) <= 1_i2b)
then
205 zb_neu(j,i) = zl_neu(j,i)
206 dzb_dtau(j,i) = dzl_dtau(j,i)
210 #if ( MARGIN==1 || MARGIN==2 )
211 zb_neu(j,i) = zl_neu(j,i)
212 dzb_dtau(j,i) = dzl_dtau(j,i)
214 zb_neu(j,i) = zb(j,i)
215 dzb_dtau(j,i) = 0.0_dp
233 czs2(j,i) = azs2*0.5_dp*(h_diff(j,i)+h_diff(j,i+1)) &
234 *sq_g22_sgx(j,i)*insq_g11_sgx(j,i)
240 czs3(j,i) = azs3*0.5_dp*(h_diff(j,i)+h_diff(j+1,i)) &
241 *sq_g11_sgy(j,i)*insq_g22_sgy(j,i)
245 #if ( MARGIN==1 || MARGIN==2 )
252 if (maske(j,i) <= 1_i2b)
then
256 zs_neu(j,i) = zs(j,i) &
257 + dtime*(as_perp(j,i)+dzb_dtau(j,i)-q_b_tot(j,i)) &
258 + ( czs2(j,i) *(zs(j,i+1)-zs(j,i) ) &
259 -czs2(j,i-1)*(zs(j,i) -zs(j,i-1)) &
260 +czs3(j,i) *(zs(j+1,i)-zs(j,i) ) &
261 -czs3(j-1,i)*(zs(j,i) -zs(j-1,i)) ) &
262 *insq_g11_g(j,i)*insq_g22_g(j,i)
267 zs_neu(j,i) = zb_neu(j,i)
280 if (.not.flag_grounding_line(j,i).and.maske(j,i)<2_i2b)
then
283 h_ice(j,i) = (h_c(j,i)+h_t(j,i)) &
284 + dtime*(as_perp(j,i)-q_b_tot(j,i)) &
285 + ( czs2(j,i) *(zs(j,i+1)-zs(j,i) ) &
286 -czs2(j,i-1)*(zs(j,i) -zs(j,i-1)) &
287 +czs3(j,i) *(zs(j+1,i)-zs(j,i) ) &
288 -czs3(j-1,i)*(zs(j,i) -zs(j-1,i)) ) &
289 *insq_g11_g(j,i)*insq_g22_g(j,i)
293 upvx_p = 0.25_dp*( (vx_m(j,i)+vx_m(j,i-1)) &
294 -dabs(vx_m(j,i)+vx_m(j,i-1)) )*dt_dxi
295 upvx_d = 0.25_dp*( (vx_m(j,i)+vx_m(j,i-1)) &
296 +dabs(vx_m(j,i)+vx_m(j,i-1)) )*dt_dxi
297 upvy_p = 0.25_dp*( (vy_m(j,i)+vy_m(j-1,i)) &
298 -dabs(vy_m(j,i)+vy_m(j-1,i)) )*dt_deta
299 upvy_d = 0.25_dp*( (vy_m(j,i)+vy_m(j-1,i)) &
300 +dabs(vy_m(j,i)+vy_m(j-1,i)) )*dt_deta
302 h_ice(j,i) = h_c(j,i)+h_t(j,i) &
303 + dtime*(as_perp(j,i)-q_b_tot(j,i) ) &
305 *((h_c(j,i+1)+h_t(j,i+1))-(h_c(j,i) +h_t(j,i) )) &
307 *((h_c(j,i) +h_t(j,i)) -(h_c(j,i-1)+h_c(j,i-1))) &
309 *((h_c(j+1,i)+h_t(j+1,i))-(h_c(j,i) +h_t(j,i) )) &
311 *((h_c(j,i) +h_t(j,i)) -(h_c(j-1,i)-h_t(j-1,i))) &
313 *(vx_m(j,i)-vx_m(j,i-1))*(h_c(j,i)+h_t(j,i)) &
315 *(vy_m(j,i)-vy_m(j-1,i))*(h_c(j,i)+h_t(j,i)) )
325 #if ( MARGIN==1 || MARGIN==2 )
326 zs_neu(0,i) = zb_neu(0,i)
327 zs_neu(jmax,i) = zb_neu(jmax,i)
330 zs_neu(jmax,i) = z_sl
335 #if ( MARGIN==1 || MARGIN==2 )
336 zs_neu(j,0) = zb_neu(j,0)
337 zs_neu(j,imax) = zb_neu(j,imax)
340 zs_neu(j,imax) = z_sl
346 #elif ( CALCZS==1 || CALCZS==2 )
348 stop
' calc_top: ADI and over-implicit ADI schemes not available any more!'
352 #elif ( ( CALCZS==3 || CALCZS==4 ) && ( MARGIN==1 || MARGIN==2 ) )
358 czs2(j,i) = azs2*0.5_dp*(h_diff(j,i)+h_diff(j,i+1)) &
359 *sq_g22_sgx(j,i)*insq_g11_sgx(j,i)
365 czs3(j,i) = azs3*0.5_dp*(h_diff(j,i)+h_diff(j+1,i)) &
366 *sq_g11_sgy(j,i)*insq_g22_sgy(j,i)
373 allocate(lgs_a_value(n_sprs), lgs_a_index(n_sprs), lgs_a_ptr(nmax+1))
374 allocate(lgs_a_diag_index(nmax), lgs_b_value(nmax), lgs_x_value(nmax))
393 (i /= 0).and.(i /= imax).and.(j /= 0).and.(j /= jmax) &
395 .and.(maske(j,i) <= 1_i2b) &
401 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
402 lgs_a_value(k) = -czs3(j-1,i)*ovi_weight &
403 *insq_g11_g(j,i)*insq_g22_g(j,i)
408 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
409 lgs_a_value(k) = -czs2(j,i-1)*ovi_weight &
410 *insq_g11_g(j,i)*insq_g22_g(j,i)
415 stop
' calc_top: Check for diagonal element failed!'
417 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
418 lgs_a_value(k) = 1.0_dp &
419 + (czs2(j,i)+czs2(j,i-1)+czs3(j,i)+czs3(j-1,i)) &
421 *insq_g11_g(j,i)*insq_g22_g(j,i)
422 lgs_a_diag_index(nr) = k
427 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
428 lgs_a_value(k) = -czs2(j,i)*ovi_weight &
429 *insq_g11_g(j,i)*insq_g22_g(j,i)
434 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
435 lgs_a_value(k) = -czs3(j,i)*ovi_weight &
436 *insq_g11_g(j,i)*insq_g22_g(j,i)
439 lgs_b_value(nr) = zs(j,i) &
440 + dtime*(as_perp(j,i)+dzb_dtau(j,i)-q_b_tot(j,i)) &
441 + ( czs2(j,i)*(zs(j,i+1)-zs(j,i)) &
442 -czs2(j,i-1)*(zs(j,i)-zs(j,i-1)) &
443 +czs3(j,i)*(zs(j+1,i)-zs(j,i)) &
444 -czs3(j-1,i)*(zs(j,i)-zs(j-1,i)) ) &
445 *(1.0_dp-ovi_weight) &
446 *insq_g11_g(j,i)*insq_g22_g(j,i)
451 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
452 lgs_a_value(k) = 1.0_dp
453 lgs_a_diag_index(nr) = k
456 lgs_b_value(nr) = zb_neu(j,i)
460 lgs_x_value(nr) = zs(j,i)
463 lgs_a_ptr(nr+1) = k+1
473 allocate(lgs_a_value_trim(nnz), lgs_a_index_trim(nnz))
476 lgs_a_value_trim(k) = lgs_a_value(k)
477 lgs_a_index_trim(k) = lgs_a_index(k)
480 deallocate(lgs_a_value, lgs_a_index)
482 eps_sor = 1.0e-05_dp*mean_accum*dtime
485 lgs_a_index_trim, lgs_a_diag_index, lgs_a_ptr, &
487 nnz, nmax, omega_sor, eps_sor, lgs_x_value, ierr)
492 zs_neu(j,i) = lgs_x_value(nr)
495 deallocate(lgs_a_value_trim, lgs_a_index_trim, lgs_a_ptr)
496 deallocate(lgs_a_diag_index, lgs_b_value, lgs_x_value)
502 call lis_matrix_create(lis_comm_world, lgs_a, ierr)
503 call lis_vector_create(lis_comm_world, lgs_b, ierr)
504 call lis_vector_create(lis_comm_world, lgs_x, ierr)
506 call lis_matrix_set_size(lgs_a, 0, nmax, ierr)
507 call lis_vector_set_size(lgs_b, 0, nmax, ierr)
508 call lis_vector_set_size(lgs_x, 0, nmax, ierr)
512 do nc=lgs_a_ptr(nr), lgs_a_ptr(nr+1)-1
513 call lis_matrix_set_value(lis_ins_value, nr, lgs_a_index(nc), &
514 lgs_a_value(nc), lgs_a, ierr)
517 call lis_vector_set_value(lis_ins_value, nr, lgs_b_value(nr), lgs_b, ierr)
518 call lis_vector_set_value(lis_ins_value, nr, lgs_x_value(nr), lgs_x, ierr)
522 call lis_matrix_set_type(lgs_a, lis_matrix_crs, ierr)
523 call lis_matrix_assemble(lgs_a, ierr)
527 call lis_solver_create(solver, ierr)
529 ch_solver_set_option =
'-i bicg -p ilu '// &
530 '-maxiter 1000 -tol 1.0e-12 -initx_zeros false'
531 call lis_solver_set_option(trim(ch_solver_set_option), solver, ierr)
533 call lis_solve(lgs_a, lgs_b, lgs_x, solver, ierr)
535 call lis_solver_get_iters(solver, iter, ierr)
536 write(6,
'(11x,a,i5)')
'calc_top: iter = ', iter
539 call lis_vector_gather(lgs_x, lgs_x_value, ierr)
540 call lis_matrix_destroy(lgs_a, ierr)
541 call lis_vector_destroy(lgs_b, ierr)
542 call lis_vector_destroy(lgs_x, ierr)
543 call lis_solver_destroy(solver, ierr)
548 zs_neu(j,i) = lgs_x_value(nr)
551 deallocate(lgs_a_value, lgs_a_index, lgs_a_ptr)
552 deallocate(lgs_a_diag_index, lgs_b_value, lgs_x_value)
558 #elif ( CALCZS==3 && MARGIN==3 )
562 h_ice(j,i) =(h_c(j,i)+h_t(j,i))
568 czs2(j,i) = azs2*0.5_dp*(h_diff(j,i)+h_diff(j,i+1)) &
569 *sq_g22_sgx(j,i)*insq_g11_sgx(j,i)
575 czs3(j,i) = azs3*0.5_dp*(h_diff(j,i)+h_diff(j+1,i)) &
576 *sq_g11_sgy(j,i)*insq_g22_sgy(j,i)
580 allocate(lgs_a_value(n_sprs), lgs_a_index(n_sprs), lgs_a_ptr(nmax+1))
581 allocate(lgs_a_diag_index(nmax), lgs_b_value(nmax), lgs_x_value(nmax))
584 lgs_a_value = 1.0_dp ; lgs_b_value=0.0_dp ; lgs_x_value=0.0_dp
592 i = ii(nr) ; j = jj(nr)
595 if ( (i /= 0).and.(i /= imax).and.(j /= 0).and.(j /= jmax) )
then
598 if (.not.flag_grounding_line(j,i).and.maske(j,i)<2_i2b)
then
603 lgs_a_ptr(nr)=k+1 ; lgs_x_value(nr)=h_ice(j,i)
605 lgs_b_value(nr) = h_ice(j,i) &
606 + dtime*(as_perp(j,i)-q_b_tot(j,i)) &
607 + ( czs2(j,i)*(h_ice(j,i+1)-h_ice(j,i)) &
608 -czs2(j,i-1)*(h_ice(j,i)-h_ice(j,i-1)) &
609 +czs3(j,i)*(h_ice(j+1,i)-h_ice(j,i)) &
610 -czs3(j-1,i)*(h_ice(j,i)-h_ice(j-1,i)) ) &
611 *(1.0_dp-ovi_weight) &
612 *insq_g11_g(j,i)*insq_g22_g(j,i) &
613 + ( czs2(j,i)*(zb_neu(j,i+1)-zb_neu(j,i)) &
614 -czs2(j,i-1)*(zb_neu(j,i)-zb_neu(j,i-1)) &
615 +czs3(j,i)*(zb_neu(j+1,i)-zb_neu(j,i)) &
616 -czs3(j-1,i)*(zb_neu(j,i)-zb_neu(j-1,i)) ) &
617 *insq_g11_g(j,i)*insq_g22_g(j,i)
620 k=k+1 ; nc=nn(j-1,i) ; lgs_a_index(k)=nc
621 lgs_a_value(k) = -czs3(j-1,i)*ovi_weight &
622 *insq_g11_g(j,i)*insq_g22_g(j,i)
624 k=k+1 ; nc = nn(j,i-1) ; lgs_a_index(k)=nc
625 lgs_a_value(k) = -czs2(j,i-1)*ovi_weight &
626 *insq_g11_g(j,i)*insq_g22_g(j,i)
628 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
629 lgs_a_value(k) = 1.0_dp + (czs2(j,i)+czs2(j,i-1) &
630 +czs3(j,i)+czs3(j-1,i)) &
632 *insq_g11_g(j,i)*insq_g22_g(j,i)
634 k=k+1 ; nc = nn(j,i+1) ; lgs_a_index(k)=nc
635 lgs_a_value(k) = -czs2(j,i)*ovi_weight &
636 *insq_g11_g(j,i)*insq_g22_g(j,i)
638 k=k+1 ; nc = nn(j+1,i) ; lgs_a_index(k)=nc
639 lgs_a_value(k) = -czs3(j,i)*ovi_weight &
640 *insq_g11_g(j,i)*insq_g22_g(j,i)
642 #if ( !defined(ZS_EVOL_SSA) || ZS_EVOL_SSA==1 )
648 else if (flag_grounding_line(j,i))
then
651 stop
' calc_top: ZS_EVOL_SSA must be either 1 or 0!'
655 upvx_p = 0.25_dp*( (vx_m(j,i)+vx_m(j,i-1)) &
656 -dabs(vx_m(j,i)+vx_m(j,i-1)) )*dt_dxi
657 upvx_d = 0.25_dp*( (vx_m(j,i)+vx_m(j,i-1)) &
658 +dabs(vx_m(j,i)+vx_m(j,i-1)) )*dt_dxi
659 upvy_p = 0.25_dp*( (vy_m(j,i)+vy_m(j-1,i)) &
660 -dabs(vy_m(j,i)+vy_m(j-1,i)) )*dt_deta
661 upvy_d = 0.25_dp*( (vy_m(j,i)+vy_m(j-1,i)) &
662 +dabs(vy_m(j,i)+vy_m(j-1,i)) )*dt_deta
664 lgs_a_ptr(nr)=k+1 ; lgs_x_value(nr)=h_ice(j,i)
665 lgs_b_value(nr)= h_ice(j,i) &
666 +dtime*(as_perp(j,i)-q_b_tot(j,i)) &
667 -(1.0_dp-ovi_weight) &
668 *( upvx_p*(h_ice(j,i+1)-h_ice(j,i)) &
669 +upvx_d*(h_ice(j,i)-h_ice(j,i-1)) &
670 +upvy_p*(h_ice(j+1,i)-h_ice(j,i)) &
671 +upvy_d*(h_ice(j,i)-h_ice(j-1,i)) &
672 +dt_dxi*(vx_m(j,i)-vx_m(j,i-1))*h_ice(j,i) &
673 +dt_deta*(vy_m(j,i)-vy_m(j-1,i))*h_ice(j,i) )
676 k=k+1 ; nc=nn(j-1,i) ; lgs_a_index(k)=nc
677 lgs_a_value(k) = -upvy_d *ovi_weight
680 k=k+1 ; nc = nn(j,i-1) ; lgs_a_index(k)=nc
681 lgs_a_value(k) = -upvx_d *ovi_weight
684 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
685 lgs_a_value(k) = 1.0_dp &
687 *( -upvx_p+upvx_d-upvy_p+upvy_d &
688 +dt_dxi*(vx_m(j,i)-vx_m(j,i-1)) &
689 +dt_deta*(vy_m(j,i)-vy_m(j-1,i)) )
692 k=k+1 ; nc = nn(j,i+1) ; lgs_a_index(k)=nc
693 lgs_a_value(k) = upvx_p * ovi_weight
696 k=k+1 ; nc = nn(j+1,i) ; lgs_a_index(k)=nc
697 lgs_a_value(k) = upvy_p * ovi_weight
700 #if ( !defined(ZS_EVOL_SSA) || ZS_EVOL_SSA==1 )
706 else if (maske(j,i)==3_i2b)
then
708 lgs_a_ptr(nr)=k+1 ; lgs_x_value(nr)=h_ice(j,i)
709 lgs_b_value(nr) = h_ice(j,i)
711 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
712 lgs_a_value(k) = 1.0_dp
714 else if (maske(j,i)==2_i2b)
then
716 lgs_a_ptr(nr)=k+1 ; lgs_x_value(nr)=0.0_dp
717 lgs_b_value(nr) = 0.0_dp
719 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
720 lgs_a_value(k) = 1.0_dp
723 stop
' calc_top: ZS_EVOL_SSA must be either 1 or 0!'
730 lgs_a_ptr(nr)=k+1 ; lgs_x_value(nr)=0.0_dp
731 lgs_b_value(nr) = 0.0_dp
733 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
734 lgs_a_value(k) = 1.0_dp
741 lgs_a_ptr(nmax+1)=k+1
745 allocate(lgs_a_value_trim(nnz), lgs_a_index_trim(nnz))
748 lgs_a_value_trim(k) = lgs_a_value(k)
749 lgs_a_index_trim(k) = lgs_a_index(k)
752 deallocate(lgs_a_value, lgs_a_index)
754 eps_sor = 1.0e-05_dp*mean_accum*dtime
757 lgs_a_index_trim, lgs_a_diag_index, lgs_a_ptr, &
759 nnz, nmax, omega_sor, eps_sor, lgs_x_value, ierr)
764 h_ice(j,i) = lgs_x_value(nr)
767 deallocate(lgs_a_value_trim, lgs_a_index_trim, lgs_a_ptr)
768 deallocate(lgs_a_diag_index, lgs_b_value, lgs_x_value)
797 #if ( MARGIN==1 || MARGIN==2 )
799 if (time >= time_target_topo_final)
then
801 else if (time >= time_target_topo_init)
then
802 zs_neu = ( target_topo_time_lag*zs_neu + dtime*zs_target ) &
803 / ( target_topo_time_lag + dtime )
808 if (time >= time_target_topo_final)
then
810 else if (time >= time_target_topo_init)
then
811 h_ice = ( target_topo_time_lag*h_ice + dtime*h_target ) &
812 / ( target_topo_time_lag + dtime )
821 #if ( ( MARGIN==2 ) \
822 && ( marine_ice_formation==2 ) \
823 && ( marine_ice_calving==9 ) )
825 calv_uw_coeff = calv_uw_coeff * year_sec_inv
826 r1_calv_uw = r1_calv_uw
827 r2_calv_uw = r2_calv_uw
830 if (time >= time_target_topo_final)
then
831 calv_uw_coeff = 0.0_dp
833 else if (time >= time_target_topo_init)
then
834 target_topo_weight_lin = (time-time_target_topo_init) &
835 /(time_target_topo_final-time_target_topo_init)
836 calv_uw_coeff = (1.0_dp-target_topo_weight_lin)*calv_uw_coeff
843 #if ( ZS_EVOL>=1 && ( MARGIN==1 || MARGIN==2 ) )
848 if (maske(j,i) <= 1_i2b)
then
850 h_ice(j,i) = zs_neu(j,i)-zb_neu(j,i)
851 h_sea(j,i) = z_sl -zl_neu(j,i)
855 if (h_ice(j,i) >= h_min)
then
857 #if ( ( MARGIN==2 ) \
858 && ( marine_ice_formation==2 ) \
859 && ( marine_ice_calving==9 ) )
860 if ( h_ice(j,i) < (rhosw_rho_ratio*h_sea(j,i)) )
then
862 h_ice(j,i) = h_ice(j,i) - ( calv_uw_coeff &
863 *h_ice(j,i)**r1_calv_uw &
864 *h_sea(j,i)**r2_calv_uw ) * dtime
866 zs_neu(j,i) = zb_neu(j,i) + h_ice(j,i)
867 if (h_ice(j,i) < h_min) maske(j,i) = 2_i2b
878 h_ice(j,i) = zs_neu(j,i)-zb_neu(j,i)
879 h_sea(j,i) = z_sl -zl_neu(j,i)
881 if (h_ice(j,i) >= h_min)
then
883 if ( h_ice(j,i) < (rhosw_rho_ratio*h_sea(j,i)) )
then
885 #if MARINE_ICE_FORMATION==1
887 #elif MARINE_ICE_FORMATION==2
889 #if MARINE_ICE_CALVING==9
890 h_ice(j,i) = h_ice(j,i) - ( calv_uw_coeff &
891 *h_ice(j,i)**r1_calv_uw &
892 *h_sea(j,i)**r2_calv_uw ) * dtime
894 zs_neu(j,i) = zb_neu(j,i) + h_ice(j,i)
895 if (h_ice(j,i) < h_min) maske(j,i) = 2_i2b
902 #if ( MARINE_ICE_CALVING==2 \
903 || marine_ice_calving==4 \
904 || marine_ice_calving==6 )
905 if (zl0(j,i) < z_mar) maske(j,i) = 2_i2b
906 #elif ( MARINE_ICE_CALVING==3 \
907 || marine_ice_calving==5 \
908 || marine_ice_calving==7 )
909 if (zl_neu(j,i) < z_mar) maske(j,i) = 2_i2b
923 #elif ( ZS_EVOL>=1 && MARGIN==3 )
928 h_balance = (z_sl-zl_neu(j,i))*rhosw_rho_ratio
931 #if ( !defined(ZS_EVOL_SSA) || ZS_EVOL_SSA==1 )
933 if ( ( maske(j,i)<2_i2b &
934 .and. (maske(j,i+1)>1_i2b.or.maske(j,i-1)>1_i2b &
935 .or.maske(j+1,i)>1_i2b.or.maske(j-1,i)>1_i2b) ) &
937 ( maske(j,i)>=2_i2b &
938 .and. (maske(j,i+1)==0_i2b.or.maske(j,i-1)==0_i2b &
939 .or.maske(j+1,i)==0_i2b.or.maske(j-1,i)==0_i2b) ) )
then
941 if (h_ice(j,i)>=h_min)
then
943 if (h_ice(j,i)<h_balance.and.zl_neu(j,i)<z_sl)
then
945 zb_neu(j,i) = z_sl-rho_rhosw_ratio*h_ice(j,i)
946 dzb_dtau(j,i) = dtime_inv*(zb_neu(j,i)-zb(j,i))
947 zs_neu(j,i) = zb_neu(j,i)+h_ice(j,i)
950 zb_neu(j,i) = zl_neu(j,i)
951 dzb_dtau(j,i) = dzl_dtau(j,i)
952 zs_neu(j,i) = zb_neu(j,i)+h_ice(j,i)
957 if (zl_neu(j,i)>z_sl)
then
959 zb_neu(j,i) = zl_neu(j,i)
960 dzb_dtau(j,i) = dtime_inv*(zb_neu(j,i)-zb(j,i))
961 zs_neu(j,i) = zb_neu(j,i)
965 dzb_dtau(j,i) = 0.0_dp
973 if (maske(j,i)==2_i2b)
then
976 dzb_dtau(j,i) = 0.0_dp
978 else if (maske(j,i)==3_i2b)
then
980 zb_neu(j,i) = zb(j,i)
981 dzb_dtau(j,i) = 0.0_dp
982 zs_neu(j,i) = zs(j,i)
985 stop
' calc_top: ZS_EVOL_SSA must be either 1 or 0!'
988 else if (maske(j,i)<2_i2b)
then
991 if (h_ice(j,i)>=h_min)
then
993 zb_neu(j,i) = zl_neu(j,i)
994 dzb_dtau(j,i) = dzl_dtau(j,i)
995 zs_neu(j,i) = zb_neu(j,i)+h_ice(j,i)
998 zb_neu(j,i) = zl_neu(j,i)
999 dzb_dtau(j,i) = dzl_dtau(j,i)
1000 zs_neu(j,i) = zl_neu(j,i)
1003 #if ( !defined(ZS_EVOL_SSA) || ZS_EVOL_SSA==1 )
1007 if (h_ice(j,i)>h_min)
then
1009 if (h_ice(j,i)<h_balance.and.zl_neu(j,i)<z_sl)
then
1011 zb_neu(j,i) = z_sl-rho_rhosw_ratio*h_ice(j,i)
1012 dzb_dtau(j,i) = dtime_inv*(zb_neu(j,i)-zb(j,i))
1013 zs_neu(j,i) = zb_neu(j,i)+h_ice(j,i)
1016 zb_neu(j,i) = zl_neu(j,i)
1017 dzb_dtau(j,i) = dzl_dtau(j,i)
1018 zs_neu(j,i) = zb_neu(j,i)+h_ice(j,i)
1023 if (zl_neu(j,i)>z_sl)
then
1025 zb_neu(j,i) = zl_neu(j,i)
1026 dzb_dtau(j,i) = dtime_inv*(zb_neu(j,i)-zb(j,i))
1027 zs_neu(j,i) = zb_neu(j,i)
1031 dzb_dtau(j,i) = 0.0_dp
1044 #if ICE_SHELF_CALVING==2
1048 flag_calving_front = .false.
1049 flag_calving_event = .false.
1054 if ( (maske(j,i)==3_i2b) &
1056 ( (maske(j,i+1)==2_i2b) &
1057 .or.(maske(j,i-1)==2_i2b) &
1058 .or.(maske(j+1,i)==2_i2b) &
1059 .or.(maske(j-1,i)==2_i2b) ) &
1061 flag_calving_front(j,i) = .true.
1064 if ( flag_calving_front(j,i).and.(h_ice(j,i) < h_calv) )
then
1065 flag_calving_event = .true.
1072 if (.not.flag_calving_event) exit
1083 if (time >= time_target_topo_final) maske = maske_target
1093 if (maske_maxextent(j,i)==0_i2b)
then
1095 if (maske(j,i)==0_i2b)
then
1097 else if (maske(j,i)==3_i2b)
then
1110 flag_grounding_line = .false.
1111 flag_calving_front = .false.
1118 if ( (maske(j,i)==0_i2b) &
1120 ( (maske(j,i+1)==3_i2b) &
1121 .or.(maske(j,i-1)==3_i2b) &
1122 .or.(maske(j+1,i)==3_i2b) &
1123 .or.(maske(j-1,i)==3_i2b) ) &
1125 flag_grounding_line(j,i) = .true.
1127 if ( (maske(j,i)==3_i2b) &
1129 ( (maske(j,i+1)==2_i2b) &
1130 .or.(maske(j,i-1)==2_i2b) &
1131 .or.(maske(j+1,i)==2_i2b) &
1132 .or.(maske(j-1,i)==2_i2b) ) &
1134 flag_calving_front(j,i) = .true.
1147 if (maske(j,i) == 1_i2b)
then
1149 zs_neu(j,i) = zb_neu(j,i)
1152 else if (maske(j,i) == 2_i2b)
then
1154 #if ( MARGIN==1 || MARGIN==2 )
1155 zs_neu(j,i) = zb_neu(j,i)
1162 else if (maske(j,i) == 3_i2b)
then
1164 #if ( MARGIN==1 || MARGIN==2 )
1166 stop
' calc_top: maske(j,i)==3 only allowed for MARGIN==3!'
1170 h_ice(j,i) = zs_neu(j,i)-zb_neu(j,i)
1172 zb_neu(j,i) = z_sl - rho_rhosw_ratio*h_ice(j,i)
1173 zs_neu(j,i) = zb_neu(j,i) + h_ice(j,i)
1189 if ( (maske(j,i) == 0_i2b).or.(maske(j,i) == 3_i2b) )
then
1192 as_perp(j,i) = as_perp(j,i) - (zs_neu(j,i)-zs(j,i))*dtime_inv
1198 as_perp(j,i) = 0.0_dp
1202 zs_neu(j,i) = zs(j,i)
1212 if ( (maske(j,i) == 0_i2b).or.(maske(j,i) == 3_i2b) )
then
1217 if ( ((maske(j,i+1) == 1_i2b).or.(maske(j,i+1) == 2_i2b)) &
1218 .and. ((maske(j,i-1) == 1_i2b).or.(maske(j,i-1) == 2_i2b)) &
1219 .and. ((maske(j+1,i) == 1_i2b).or.(maske(j+1,i) == 2_i2b)) &
1220 .and. ((maske(j-1,i) == 1_i2b).or.(maske(j-1,i) == 2_i2b)) &
1222 zs_neu(j,i) = min(zs_neu(j,i),(zb_neu(j,i)+h_isol_max))
1227 if (n_cts(j,i) == 1)
then
1228 h_t_neu(j,i) = h_t(j,i)*(zs_neu(j,i)-zb_neu(j,i)) &
1230 zm_neu(j,i) = zb_neu(j,i)+h_t_neu(j,i)
1231 h_c_neu(j,i) = zs_neu(j,i)-zm_neu(j,i)
1233 h_t_neu(j,i) = 0.0_dp
1234 zm_neu(j,i) = zb_neu(j,i)
1235 h_c_neu(j,i) = zs_neu(j,i)-zm_neu(j,i)
1240 zs_neu(j,i) = zb_neu(j,i)
1241 zm_neu(j,i) = zb_neu(j,i)
1242 h_c_neu(j,i) = 0.0_dp
1243 h_t_neu(j,i) = 0.0_dp
1247 dzs_dtau(j,i) = (zs_neu(j,i)-zs(j,i))*dtime_inv
1248 dzb_dtau(j,i) = (zb_neu(j,i)-zb(j,i))*dtime_inv
1249 dzm_dtau(j,i) = dh_t_dtau(j,i)+dzb_dtau(j,i)
1250 dh_c_dtau(j,i) = dzs_dtau(j,i)-dzm_dtau(j,i)
1253 if ( abs((time-time_target_topo_final)*year_sec_inv) < eps )
then
1257 dh_c_dtau(j,i) = 0.0_dp
1258 dh_t_dtau(j,i) = 0.0_dp
1280 if ( ((maske(j,i) == 0_i2b).or.(maske(j,i) == 3_i2b)) &
1281 .and.(n_cts(j,i) == 1_i2b))
then
1284 0.5_dp*(vx_c(0,j,i)+vx_c(0,j,i-1))*dzm_dxi_g(j,i) &
1285 + 0.5_dp*(vy_c(0,j,i)+vy_c(0,j-1,i))*dzm_deta_g(j,i) &
1286 - 0.5_dp*(vz_c(0,j,i)+vz_t(ktmax-1,j,i))
1287 am_perp(j,i) = am_perp_st(j,i) + dzm_dtau(j,i)
1290 am_perp_st(j,i) = 0.0_dp
1291 am_perp(j,i) = 0.0_dp