36 z_sl, dzsl_dtau, z_mar, &
37 dtime, dxi, deta, dzeta_t, &
39 ii, jj, nn, itercount, iter_wss)
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 integer(i4b),
intent(in) :: itercount, iter_wss
50 real(dp),
intent(in) :: time, time_init
51 real(dp),
intent(in) :: z_sl, dzsl_dtau, z_mar
52 real(dp),
intent(in) :: dtime, dxi, deta, dzeta_t
53 real(dp),
intent(in) :: mean_accum
55 integer(i4b) :: i, j, kc, kt
56 integer(i4b) :: k, nnz
58 real(dp) :: czs2(0:jmax,0:imax), czs3(0:jmax,0:imax)
59 real(dp) :: year_sec_inv
61 real(dp) :: dtime_inv, dxi_inv, deta_inv
62 real(dp) :: dt_dxi, dt_deta
63 real(dp) :: azs2, azs3
64 real(dp),
dimension(0:JMAX,0:IMAX) :: h_ice, h_sea
65 real(dp) :: rho_rhoa_ratio, rhosw_rhoa_ratio
66 real(dp) :: rhosw_rho_ratio, rho_rhosw_ratio, rho_sw_rho_sw_minus_rho_ratio
67 real(dp) :: upvx_p, upvy_p, upvx_d, upvy_d, h_balance
68 real(dp) :: calv_uw_coeff, r1_calv_uw, r2_calv_uw
69 real(dp) :: target_topo_time_lag, target_topo_weight_lin
70 logical :: flag_calving_event
72 real(dp),
parameter :: h_isol_max = 1.0e+03_dp
79 integer(i4b) :: nc, nr
80 integer(i4b),
parameter :: nmax = (imax+1)*(jmax+1)
81 integer(i4b),
parameter :: n_sprs = 10*(imax+1)*(jmax+1)
82 integer(i4b),
allocatable,
dimension(:) :: lgs_a_ptr, lgs_a_index
83 integer(i4b),
allocatable,
dimension(:) :: lgs_a_diag_index
84 integer(i4b),
allocatable,
dimension(:) :: lgs_a_index_trim
85 real(dp),
allocatable,
dimension(:) :: lgs_a_value, lgs_b_value, lgs_x_value
86 real(dp),
allocatable,
dimension(:) :: lgs_a_value_trim
93 lis_integer,
parameter :: nmax = (imax+1)*(jmax+1)
94 lis_integer,
parameter :: n_sprs = 10*(imax+1)*(jmax+1)
95 lis_integer,
allocatable,
dimension(:) :: lgs_a_ptr, lgs_a_index
96 lis_integer,
allocatable,
dimension(:) :: lgs_a_diag_index
98 lis_vector :: lgs_b, lgs_x
99 lis_scalar,
allocatable,
dimension(:) :: lgs_a_value, lgs_b_value, lgs_x_value
101 character(len=256) :: ch_solver_set_option
107 year_sec_inv = 1.0_dp/year_sec
109 tldt_inv = 1.0_dp/(time_lag+dtime)
111 rho_rhoa_ratio = rho/rho_a
112 rhosw_rhoa_ratio = rho_sw/rho_a
114 rho_rhosw_ratio = rho/rho_sw
115 rhosw_rho_ratio = rho_sw/rho
116 rho_sw_rho_sw_minus_rho_ratio = rho_sw/(rho_sw-rho)
118 dtime_inv = 1.0_dp/dtime
120 deta_inv = 1.0_dp/deta
125 azs2 = dtime/(dxi*dxi)
126 azs3 = dtime/(deta*deta)
134 zl_neu(j,i) = zl(j,i)
135 dzl_dtau(j,i) = (zl_neu(j,i)-zl(j,i))*dtime_inv
144 if (maske(j,i) <= 1_i2b)
then
146 zl_neu(j,i) = tldt_inv*( time_lag*zl(j,i) &
148 -frac_llra*rho_rhoa_ratio*(h_c(j,i)+h_t(j,i))) )
152 zl_neu(j,i) = tldt_inv*( time_lag*zl(j,i) &
154 -frac_llra*rhosw_rhoa_ratio*z_sl) )
161 dzl_dtau(j,i) = (zl_neu(j,i)-zl(j,i))*dtime_inv
168 if ((mod(itercount, iter_wss)==0).or.(itercount==1))
then
169 write(6,*)
' -------- Computation of wss'
176 zl_neu(j,i) = tldt_inv * ( time_lag*zl(j,i) + dtime*(zl0(j,i)-wss(j,i)) )
177 dzl_dtau(j,i) = (zl_neu(j,i)-zl(j,i))*dtime_inv
187 if (time >= time_target_topo_final)
then
192 else if (time >= time_target_topo_init)
then
194 target_topo_time_lag = (time_target_topo_final-time)/3.0_dp
196 zl_neu = ( target_topo_time_lag*zl_neu + dtime*zl_target ) &
197 / ( target_topo_time_lag + dtime )
199 dzl_dtau = (zl_neu-zl)*dtime_inv
210 if (maske(j,i) <= 1_i2b)
then
212 zb_neu(j,i) = zl_neu(j,i)
213 dzb_dtau(j,i) = dzl_dtau(j,i)
217 #if ( MARGIN==1 || MARGIN==2 )
218 zb_neu(j,i) = zl_neu(j,i)
219 dzb_dtau(j,i) = dzl_dtau(j,i)
221 zb_neu(j,i) = zb(j,i)
222 dzb_dtau(j,i) = 0.0_dp
240 czs2(j,i) = azs2*0.5_dp*(h_diff(j,i)+h_diff(j,i+1)) &
241 *sq_g22_sgx(j,i)*insq_g11_sgx(j,i)
247 czs3(j,i) = azs3*0.5_dp*(h_diff(j,i)+h_diff(j+1,i)) &
248 *sq_g11_sgy(j,i)*insq_g22_sgy(j,i)
252 #if ( MARGIN==1 || MARGIN==2 )
259 if (maske(j,i) <= 1_i2b)
then
263 zs_neu(j,i) = zs(j,i) &
264 + dtime*(as_perp(j,i)+dzb_dtau(j,i)-q_b_tot(j,i)) &
265 + ( czs2(j,i) *(zs(j,i+1)-zs(j,i) ) &
266 -czs2(j,i-1)*(zs(j,i) -zs(j,i-1)) &
267 +czs3(j,i) *(zs(j+1,i)-zs(j,i) ) &
268 -czs3(j-1,i)*(zs(j,i) -zs(j-1,i)) ) &
269 *insq_g11_g(j,i)*insq_g22_g(j,i)
274 zs_neu(j,i) = zb_neu(j,i)
287 if (.not.flag_grounding_line(j,i).and.maske(j,i)<2_i2b)
then
290 h_ice(j,i) = (h_c(j,i)+h_t(j,i)) &
291 + dtime*(as_perp(j,i)-q_b_tot(j,i)) &
292 + ( czs2(j,i) *(zs(j,i+1)-zs(j,i) ) &
293 -czs2(j,i-1)*(zs(j,i) -zs(j,i-1)) &
294 +czs3(j,i) *(zs(j+1,i)-zs(j,i) ) &
295 -czs3(j-1,i)*(zs(j,i) -zs(j-1,i)) ) &
296 *insq_g11_g(j,i)*insq_g22_g(j,i)
300 upvx_p = 0.25_dp*( (vx_m(j,i)+vx_m(j,i-1)) &
301 -dabs(vx_m(j,i)+vx_m(j,i-1)) )*dt_dxi
302 upvx_d = 0.25_dp*( (vx_m(j,i)+vx_m(j,i-1)) &
303 +dabs(vx_m(j,i)+vx_m(j,i-1)) )*dt_dxi
304 upvy_p = 0.25_dp*( (vy_m(j,i)+vy_m(j-1,i)) &
305 -dabs(vy_m(j,i)+vy_m(j-1,i)) )*dt_deta
306 upvy_d = 0.25_dp*( (vy_m(j,i)+vy_m(j-1,i)) &
307 +dabs(vy_m(j,i)+vy_m(j-1,i)) )*dt_deta
309 h_ice(j,i) = h_c(j,i)+h_t(j,i) &
310 + dtime*(as_perp(j,i)-q_b_tot(j,i) ) &
312 *((h_c(j,i+1)+h_t(j,i+1))-(h_c(j,i) +h_t(j,i) )) &
314 *((h_c(j,i) +h_t(j,i)) -(h_c(j,i-1)+h_c(j,i-1))) &
316 *((h_c(j+1,i)+h_t(j+1,i))-(h_c(j,i) +h_t(j,i) )) &
318 *((h_c(j,i) +h_t(j,i)) -(h_c(j-1,i)-h_t(j-1,i))) &
320 *(vx_m(j,i)-vx_m(j,i-1))*(h_c(j,i)+h_t(j,i)) &
322 *(vy_m(j,i)-vy_m(j-1,i))*(h_c(j,i)+h_t(j,i)) )
332 #if ( MARGIN==1 || MARGIN==2 )
333 zs_neu(0,i) = zb_neu(0,i)
334 zs_neu(jmax,i) = zb_neu(jmax,i)
337 zs_neu(jmax,i) = z_sl
342 #if ( MARGIN==1 || MARGIN==2 )
343 zs_neu(j,0) = zb_neu(j,0)
344 zs_neu(j,imax) = zb_neu(j,imax)
347 zs_neu(j,imax) = z_sl
353 #elif ( CALCZS==1 || CALCZS==2 )
355 stop
' calc_top: ADI and over-implicit ADI schemes not available any more!'
359 #elif ( ( CALCZS==3 || CALCZS==4 ) && ( MARGIN==1 || MARGIN==2 ) )
365 czs2(j,i) = azs2*0.5_dp*(h_diff(j,i)+h_diff(j,i+1)) &
366 *sq_g22_sgx(j,i)*insq_g11_sgx(j,i)
372 czs3(j,i) = azs3*0.5_dp*(h_diff(j,i)+h_diff(j+1,i)) &
373 *sq_g11_sgy(j,i)*insq_g22_sgy(j,i)
380 allocate(lgs_a_value(n_sprs), lgs_a_index(n_sprs), lgs_a_ptr(nmax+1))
381 allocate(lgs_a_diag_index(nmax), lgs_b_value(nmax), lgs_x_value(nmax))
400 (i /= 0).and.(i /= imax).and.(j /= 0).and.(j /= jmax) &
402 .and.(maske(j,i) <= 1_i2b) &
408 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
409 lgs_a_value(k) = -czs3(j-1,i)*ovi_weight &
410 *insq_g11_g(j,i)*insq_g22_g(j,i)
415 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
416 lgs_a_value(k) = -czs2(j,i-1)*ovi_weight &
417 *insq_g11_g(j,i)*insq_g22_g(j,i)
422 stop
' calc_top: Check for diagonal element failed!'
424 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
425 lgs_a_value(k) = 1.0_dp &
426 + (czs2(j,i)+czs2(j,i-1)+czs3(j,i)+czs3(j-1,i)) &
428 *insq_g11_g(j,i)*insq_g22_g(j,i)
429 lgs_a_diag_index(nr) = k
434 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
435 lgs_a_value(k) = -czs2(j,i)*ovi_weight &
436 *insq_g11_g(j,i)*insq_g22_g(j,i)
441 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
442 lgs_a_value(k) = -czs3(j,i)*ovi_weight &
443 *insq_g11_g(j,i)*insq_g22_g(j,i)
446 lgs_b_value(nr) = zs(j,i) &
447 + dtime*(as_perp(j,i)+dzb_dtau(j,i)-q_b_tot(j,i)) &
448 + ( czs2(j,i)*(zs(j,i+1)-zs(j,i)) &
449 -czs2(j,i-1)*(zs(j,i)-zs(j,i-1)) &
450 +czs3(j,i)*(zs(j+1,i)-zs(j,i)) &
451 -czs3(j-1,i)*(zs(j,i)-zs(j-1,i)) ) &
452 *(1.0_dp-ovi_weight) &
453 *insq_g11_g(j,i)*insq_g22_g(j,i)
458 if (k > n_sprs) stop
' calc_top: n_sprs too small!'
459 lgs_a_value(k) = 1.0_dp
460 lgs_a_diag_index(nr) = k
463 lgs_b_value(nr) = zb_neu(j,i)
467 lgs_x_value(nr) = zs(j,i)
470 lgs_a_ptr(nr+1) = k+1
480 allocate(lgs_a_value_trim(nnz), lgs_a_index_trim(nnz))
483 lgs_a_value_trim(k) = lgs_a_value(k)
484 lgs_a_index_trim(k) = lgs_a_index(k)
487 deallocate(lgs_a_value, lgs_a_index)
489 eps_sor = 1.0e-05_dp*mean_accum*dtime
492 lgs_a_index_trim, lgs_a_diag_index, lgs_a_ptr, &
494 nnz, nmax, omega_sor, eps_sor, lgs_x_value, ierr)
499 zs_neu(j,i) = lgs_x_value(nr)
502 deallocate(lgs_a_value_trim, lgs_a_index_trim, lgs_a_ptr)
503 deallocate(lgs_a_diag_index, lgs_b_value, lgs_x_value)
509 call lis_matrix_create(lis_comm_world, lgs_a, ierr)
510 call lis_vector_create(lis_comm_world, lgs_b, ierr)
511 call lis_vector_create(lis_comm_world, lgs_x, ierr)
513 call lis_matrix_set_size(lgs_a, 0, nmax, ierr)
514 call lis_vector_set_size(lgs_b, 0, nmax, ierr)
515 call lis_vector_set_size(lgs_x, 0, nmax, ierr)
519 do nc=lgs_a_ptr(nr), lgs_a_ptr(nr+1)-1
520 call lis_matrix_set_value(lis_ins_value, nr, lgs_a_index(nc), &
521 lgs_a_value(nc), lgs_a, ierr)
524 call lis_vector_set_value(lis_ins_value, nr, lgs_b_value(nr), lgs_b, ierr)
525 call lis_vector_set_value(lis_ins_value, nr, lgs_x_value(nr), lgs_x, ierr)
529 call lis_matrix_set_type(lgs_a, lis_matrix_csr, ierr)
530 call lis_matrix_assemble(lgs_a, ierr)
534 call lis_solver_create(solver, ierr)
536 ch_solver_set_option =
'-i bicg -p ilu '// &
537 '-maxiter 1000 -tol 1.0e-12 -initx_zeros false'
538 call lis_solver_set_option(trim(ch_solver_set_option), solver, ierr)
540 call lis_solve(lgs_a, lgs_b, lgs_x, solver, ierr)
542 call lis_solver_get_iters(solver, iter, ierr)
543 write(6,
'(11x,a,i5)')
'calc_top: iter = ', iter
546 call lis_vector_gather(lgs_x, lgs_x_value, ierr)
547 call lis_matrix_destroy(lgs_a, ierr)
548 call lis_vector_destroy(lgs_b, ierr)
549 call lis_vector_destroy(lgs_x, ierr)
550 call lis_solver_destroy(solver, ierr)
555 zs_neu(j,i) = lgs_x_value(nr)
558 deallocate(lgs_a_value, lgs_a_index, lgs_a_ptr)
559 deallocate(lgs_a_diag_index, lgs_b_value, lgs_x_value)
565 #elif ( CALCZS==3 && MARGIN==3 )
569 h_ice(j,i) =(h_c(j,i)+h_t(j,i))
575 czs2(j,i) = azs2*0.5_dp*(h_diff(j,i)+h_diff(j,i+1)) &
576 *sq_g22_sgx(j,i)*insq_g11_sgx(j,i)
582 czs3(j,i) = azs3*0.5_dp*(h_diff(j,i)+h_diff(j+1,i)) &
583 *sq_g11_sgy(j,i)*insq_g22_sgy(j,i)
587 allocate(lgs_a_value(n_sprs), lgs_a_index(n_sprs), lgs_a_ptr(nmax+1))
588 allocate(lgs_a_diag_index(nmax), lgs_b_value(nmax), lgs_x_value(nmax))
591 lgs_a_value = 1.0_dp ; lgs_b_value=0.0_dp ; lgs_x_value=0.0_dp
599 i = ii(nr) ; j = jj(nr)
602 if ( (i /= 0).and.(i /= imax).and.(j /= 0).and.(j /= jmax) )
then
605 if (.not.flag_grounding_line(j,i).and.maske(j,i)<2_i2b)
then
610 lgs_a_ptr(nr)=k+1 ; lgs_x_value(nr)=h_ice(j,i)
612 lgs_b_value(nr) = h_ice(j,i) &
613 + dtime*(as_perp(j,i)-q_b_tot(j,i)) &
614 + ( czs2(j,i)*(h_ice(j,i+1)-h_ice(j,i)) &
615 -czs2(j,i-1)*(h_ice(j,i)-h_ice(j,i-1)) &
616 +czs3(j,i)*(h_ice(j+1,i)-h_ice(j,i)) &
617 -czs3(j-1,i)*(h_ice(j,i)-h_ice(j-1,i)) ) &
618 *(1.0_dp-ovi_weight) &
619 *insq_g11_g(j,i)*insq_g22_g(j,i) &
620 + ( czs2(j,i)*(zb_neu(j,i+1)-zb_neu(j,i)) &
621 -czs2(j,i-1)*(zb_neu(j,i)-zb_neu(j,i-1)) &
622 +czs3(j,i)*(zb_neu(j+1,i)-zb_neu(j,i)) &
623 -czs3(j-1,i)*(zb_neu(j,i)-zb_neu(j-1,i)) ) &
624 *insq_g11_g(j,i)*insq_g22_g(j,i)
627 k=k+1 ; nc=nn(j-1,i) ; lgs_a_index(k)=nc
628 lgs_a_value(k) = -czs3(j-1,i)*ovi_weight &
629 *insq_g11_g(j,i)*insq_g22_g(j,i)
631 k=k+1 ; nc = nn(j,i-1) ; lgs_a_index(k)=nc
632 lgs_a_value(k) = -czs2(j,i-1)*ovi_weight &
633 *insq_g11_g(j,i)*insq_g22_g(j,i)
635 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
636 lgs_a_value(k) = 1.0_dp + (czs2(j,i)+czs2(j,i-1) &
637 +czs3(j,i)+czs3(j-1,i)) &
639 *insq_g11_g(j,i)*insq_g22_g(j,i)
641 k=k+1 ; nc = nn(j,i+1) ; lgs_a_index(k)=nc
642 lgs_a_value(k) = -czs2(j,i)*ovi_weight &
643 *insq_g11_g(j,i)*insq_g22_g(j,i)
645 k=k+1 ; nc = nn(j+1,i) ; lgs_a_index(k)=nc
646 lgs_a_value(k) = -czs3(j,i)*ovi_weight &
647 *insq_g11_g(j,i)*insq_g22_g(j,i)
649 #if ( !defined(ZS_EVOL_SSA) || ZS_EVOL_SSA==1 )
655 else if (flag_grounding_line(j,i))
then
658 stop
' calc_top: ZS_EVOL_SSA must be either 1 or 0!'
662 upvx_p = 0.25_dp*( (vx_m(j,i)+vx_m(j,i-1)) &
663 -dabs(vx_m(j,i)+vx_m(j,i-1)) )*dt_dxi
664 upvx_d = 0.25_dp*( (vx_m(j,i)+vx_m(j,i-1)) &
665 +dabs(vx_m(j,i)+vx_m(j,i-1)) )*dt_dxi
666 upvy_p = 0.25_dp*( (vy_m(j,i)+vy_m(j-1,i)) &
667 -dabs(vy_m(j,i)+vy_m(j-1,i)) )*dt_deta
668 upvy_d = 0.25_dp*( (vy_m(j,i)+vy_m(j-1,i)) &
669 +dabs(vy_m(j,i)+vy_m(j-1,i)) )*dt_deta
671 lgs_a_ptr(nr)=k+1 ; lgs_x_value(nr)=h_ice(j,i)
672 lgs_b_value(nr)= h_ice(j,i) &
673 +dtime*(as_perp(j,i)-q_b_tot(j,i)) &
674 -(1.0_dp-ovi_weight) &
675 *( upvx_p*(h_ice(j,i+1)-h_ice(j,i)) &
676 +upvx_d*(h_ice(j,i)-h_ice(j,i-1)) &
677 +upvy_p*(h_ice(j+1,i)-h_ice(j,i)) &
678 +upvy_d*(h_ice(j,i)-h_ice(j-1,i)) &
679 +dt_dxi*(vx_m(j,i)-vx_m(j,i-1))*h_ice(j,i) &
680 +dt_deta*(vy_m(j,i)-vy_m(j-1,i))*h_ice(j,i) )
683 k=k+1 ; nc=nn(j-1,i) ; lgs_a_index(k)=nc
684 lgs_a_value(k) = -upvy_d *ovi_weight
687 k=k+1 ; nc = nn(j,i-1) ; lgs_a_index(k)=nc
688 lgs_a_value(k) = -upvx_d *ovi_weight
691 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
692 lgs_a_value(k) = 1.0_dp &
694 *( -upvx_p+upvx_d-upvy_p+upvy_d &
695 +dt_dxi*(vx_m(j,i)-vx_m(j,i-1)) &
696 +dt_deta*(vy_m(j,i)-vy_m(j-1,i)) )
699 k=k+1 ; nc = nn(j,i+1) ; lgs_a_index(k)=nc
700 lgs_a_value(k) = upvx_p * ovi_weight
703 k=k+1 ; nc = nn(j+1,i) ; lgs_a_index(k)=nc
704 lgs_a_value(k) = upvy_p * ovi_weight
707 #if ( !defined(ZS_EVOL_SSA) || ZS_EVOL_SSA==1 )
713 else if (maske(j,i)==3_i2b)
then
715 lgs_a_ptr(nr)=k+1 ; lgs_x_value(nr)=h_ice(j,i)
716 lgs_b_value(nr) = h_ice(j,i)
718 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
719 lgs_a_value(k) = 1.0_dp
721 else if (maske(j,i)==2_i2b)
then
723 lgs_a_ptr(nr)=k+1 ; lgs_x_value(nr)=0.0_dp
724 lgs_b_value(nr) = 0.0_dp
726 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
727 lgs_a_value(k) = 1.0_dp
730 stop
' calc_top: ZS_EVOL_SSA must be either 1 or 0!'
737 lgs_a_ptr(nr)=k+1 ; lgs_x_value(nr)=0.0_dp
738 lgs_b_value(nr) = 0.0_dp
740 k=k+1 ; lgs_a_index(k)=nr ; lgs_a_diag_index(nr)=k
741 lgs_a_value(k) = 1.0_dp
748 lgs_a_ptr(nmax+1)=k+1
752 allocate(lgs_a_value_trim(nnz), lgs_a_index_trim(nnz))
755 lgs_a_value_trim(k) = lgs_a_value(k)
756 lgs_a_index_trim(k) = lgs_a_index(k)
759 deallocate(lgs_a_value, lgs_a_index)
761 eps_sor = 1.0e-05_dp*mean_accum*dtime
764 lgs_a_index_trim, lgs_a_diag_index, lgs_a_ptr, &
766 nnz, nmax, omega_sor, eps_sor, lgs_x_value, ierr)
771 h_ice(j,i) = lgs_x_value(nr)
774 deallocate(lgs_a_value_trim, lgs_a_index_trim, lgs_a_ptr)
775 deallocate(lgs_a_diag_index, lgs_b_value, lgs_x_value)
804 #if ( MARGIN==1 || MARGIN==2 )
806 if (time >= time_target_topo_final)
then
808 else if (time >= time_target_topo_init)
then
809 zs_neu = ( target_topo_time_lag*zs_neu + dtime*zs_target ) &
810 / ( target_topo_time_lag + dtime )
815 if (time >= time_target_topo_final)
then
817 else if (time >= time_target_topo_init)
then
818 h_ice = ( target_topo_time_lag*h_ice + dtime*h_target ) &
819 / ( target_topo_time_lag + dtime )
828 #if ( ( MARGIN==2 ) \
829 && ( marine_ice_formation==2 ) \
830 && ( marine_ice_calving==9 ) )
832 calv_uw_coeff = calv_uw_coeff * year_sec_inv
833 r1_calv_uw = r1_calv_uw
834 r2_calv_uw = r2_calv_uw
837 if (time >= time_target_topo_final)
then
838 calv_uw_coeff = 0.0_dp
840 else if (time >= time_target_topo_init)
then
841 target_topo_weight_lin = (time-time_target_topo_init) &
842 /(time_target_topo_final-time_target_topo_init)
843 calv_uw_coeff = (1.0_dp-target_topo_weight_lin)*calv_uw_coeff
850 #if ( ZS_EVOL>=1 && ( MARGIN==1 || MARGIN==2 ) )
855 if (maske(j,i) <= 1_i2b)
then
857 h_ice(j,i) = zs_neu(j,i)-zb_neu(j,i)
858 h_sea(j,i) = z_sl -zl_neu(j,i)
862 if (h_ice(j,i) >= h_min)
then
864 #if ( ( MARGIN==2 ) \
865 && ( marine_ice_formation==2 ) \
866 && ( marine_ice_calving==9 ) )
867 if ( h_ice(j,i) < (rhosw_rho_ratio*h_sea(j,i)) )
then
869 h_ice(j,i) = h_ice(j,i) - ( calv_uw_coeff &
870 *h_ice(j,i)**r1_calv_uw &
871 *h_sea(j,i)**r2_calv_uw ) * dtime
873 zs_neu(j,i) = zb_neu(j,i) + h_ice(j,i)
874 if (h_ice(j,i) < h_min) maske(j,i) = 2_i2b
885 h_ice(j,i) = zs_neu(j,i)-zb_neu(j,i)
886 h_sea(j,i) = z_sl -zl_neu(j,i)
888 if (h_ice(j,i) >= h_min)
then
890 if ( h_ice(j,i) < (rhosw_rho_ratio*h_sea(j,i)) )
then
892 #if MARINE_ICE_FORMATION==1
894 #elif MARINE_ICE_FORMATION==2
896 #if MARINE_ICE_CALVING==9
897 h_ice(j,i) = h_ice(j,i) - ( calv_uw_coeff &
898 *h_ice(j,i)**r1_calv_uw &
899 *h_sea(j,i)**r2_calv_uw ) * dtime
901 zs_neu(j,i) = zb_neu(j,i) + h_ice(j,i)
902 if (h_ice(j,i) < h_min) maske(j,i) = 2_i2b
909 #if ( MARINE_ICE_CALVING==2 \
910 || marine_ice_calving==4 \
911 || marine_ice_calving==6 )
912 if (zl0(j,i) < z_mar) maske(j,i) = 2_i2b
913 #elif ( MARINE_ICE_CALVING==3 \
914 || marine_ice_calving==5 \
915 || marine_ice_calving==7 )
916 if (zl_neu(j,i) < z_mar) maske(j,i) = 2_i2b
930 #elif ( ZS_EVOL>=1 && MARGIN==3 )
935 h_balance = (z_sl-zl_neu(j,i))*rhosw_rho_ratio
938 #if ( !defined(ZS_EVOL_SSA) || ZS_EVOL_SSA==1 )
940 if ( ( maske(j,i)<2_i2b &
941 .and. (maske(j,i+1)>1_i2b.or.maske(j,i-1)>1_i2b &
942 .or.maske(j+1,i)>1_i2b.or.maske(j-1,i)>1_i2b) ) &
944 ( maske(j,i)>=2_i2b &
945 .and. (maske(j,i+1)==0_i2b.or.maske(j,i-1)==0_i2b &
946 .or.maske(j+1,i)==0_i2b.or.maske(j-1,i)==0_i2b) ) )
then
948 if (h_ice(j,i)>=h_min)
then
950 if (h_ice(j,i)<h_balance.and.zl_neu(j,i)<z_sl)
then
952 zb_neu(j,i) = z_sl-rho_rhosw_ratio*h_ice(j,i)
953 dzb_dtau(j,i) = dtime_inv*(zb_neu(j,i)-zb(j,i))
954 zs_neu(j,i) = zb_neu(j,i)+h_ice(j,i)
957 zb_neu(j,i) = zl_neu(j,i)
958 dzb_dtau(j,i) = dzl_dtau(j,i)
959 zs_neu(j,i) = zb_neu(j,i)+h_ice(j,i)
964 if (zl_neu(j,i)>z_sl)
then
966 zb_neu(j,i) = zl_neu(j,i)
967 dzb_dtau(j,i) = dtime_inv*(zb_neu(j,i)-zb(j,i))
968 zs_neu(j,i) = zb_neu(j,i)
972 dzb_dtau(j,i) = 0.0_dp
980 if (maske(j,i)==2_i2b)
then
983 dzb_dtau(j,i) = 0.0_dp
985 else if (maske(j,i)==3_i2b)
then
987 zb_neu(j,i) = zb(j,i)
988 dzb_dtau(j,i) = 0.0_dp
989 zs_neu(j,i) = zs(j,i)
992 stop
' calc_top: ZS_EVOL_SSA must be either 1 or 0!'
995 else if (maske(j,i)<2_i2b)
then
998 if (h_ice(j,i)>=h_min)
then
1000 zb_neu(j,i) = zl_neu(j,i)
1001 dzb_dtau(j,i) = dzl_dtau(j,i)
1002 zs_neu(j,i) = zb_neu(j,i)+h_ice(j,i)
1005 zb_neu(j,i) = zl_neu(j,i)
1006 dzb_dtau(j,i) = dzl_dtau(j,i)
1007 zs_neu(j,i) = zl_neu(j,i)
1010 #if ( !defined(ZS_EVOL_SSA) || ZS_EVOL_SSA==1 )
1014 if (h_ice(j,i)>h_min)
then
1016 if (h_ice(j,i)<h_balance.and.zl_neu(j,i)<z_sl)
then
1018 zb_neu(j,i) = z_sl-rho_rhosw_ratio*h_ice(j,i)
1019 dzb_dtau(j,i) = dtime_inv*(zb_neu(j,i)-zb(j,i))
1020 zs_neu(j,i) = zb_neu(j,i)+h_ice(j,i)
1023 zb_neu(j,i) = zl_neu(j,i)
1024 dzb_dtau(j,i) = dzl_dtau(j,i)
1025 zs_neu(j,i) = zb_neu(j,i)+h_ice(j,i)
1030 if (zl_neu(j,i)>z_sl)
then
1032 zb_neu(j,i) = zl_neu(j,i)
1033 dzb_dtau(j,i) = dtime_inv*(zb_neu(j,i)-zb(j,i))
1034 zs_neu(j,i) = zb_neu(j,i)
1038 dzb_dtau(j,i) = 0.0_dp
1051 #if ICE_SHELF_CALVING==2
1055 flag_calving_front = .false.
1056 flag_calving_event = .false.
1061 if ( (maske(j,i)==3_i2b) &
1063 ( (maske(j,i+1)==2_i2b) &
1064 .or.(maske(j,i-1)==2_i2b) &
1065 .or.(maske(j+1,i)==2_i2b) &
1066 .or.(maske(j-1,i)==2_i2b) ) &
1068 flag_calving_front(j,i) = .true.
1071 if ( flag_calving_front(j,i).and.(h_ice(j,i) < h_calv) )
then
1072 flag_calving_event = .true.
1079 if (.not.flag_calving_event)
exit
1090 if (time >= time_target_topo_final) maske = maske_target
1100 if (maske_maxextent(j,i)==0_i2b)
then
1102 if (maske(j,i)==0_i2b)
then
1104 else if (maske(j,i)==3_i2b)
then
1117 flag_grounding_line = .false.
1118 flag_calving_front = .false.
1125 if ( (maske(j,i)==0_i2b) &
1127 ( (maske(j,i+1)==3_i2b) &
1128 .or.(maske(j,i-1)==3_i2b) &
1129 .or.(maske(j+1,i)==3_i2b) &
1130 .or.(maske(j-1,i)==3_i2b) ) &
1132 flag_grounding_line(j,i) = .true.
1134 if ( (maske(j,i)==3_i2b) &
1136 ( (maske(j,i+1)==2_i2b) &
1137 .or.(maske(j,i-1)==2_i2b) &
1138 .or.(maske(j+1,i)==2_i2b) &
1139 .or.(maske(j-1,i)==2_i2b) ) &
1141 flag_calving_front(j,i) = .true.
1154 if (maske(j,i) == 1_i2b)
then
1156 zs_neu(j,i) = zb_neu(j,i)
1159 else if (maske(j,i) == 2_i2b)
then
1161 #if ( MARGIN==1 || MARGIN==2 )
1162 zs_neu(j,i) = zb_neu(j,i)
1169 else if (maske(j,i) == 3_i2b)
then
1171 #if ( MARGIN==1 || MARGIN==2 )
1173 stop
' calc_top: maske(j,i)==3 only allowed for MARGIN==3!'
1177 h_ice(j,i) = zs_neu(j,i)-zb_neu(j,i)
1179 zb_neu(j,i) = z_sl - rho_rhosw_ratio*h_ice(j,i)
1180 zs_neu(j,i) = zb_neu(j,i) + h_ice(j,i)
1196 if ( (maske(j,i) == 0_i2b).or.(maske(j,i) == 3_i2b) )
then
1199 as_perp(j,i) = as_perp(j,i) - (zs_neu(j,i)-zs(j,i))*dtime_inv
1205 as_perp(j,i) = 0.0_dp
1209 zs_neu(j,i) = zs(j,i)
1219 if ( (maske(j,i) == 0_i2b).or.(maske(j,i) == 3_i2b) )
then
1224 if ( ((maske(j,i+1) == 1_i2b).or.(maske(j,i+1) == 2_i2b)) &
1225 .and. ((maske(j,i-1) == 1_i2b).or.(maske(j,i-1) == 2_i2b)) &
1226 .and. ((maske(j+1,i) == 1_i2b).or.(maske(j+1,i) == 2_i2b)) &
1227 .and. ((maske(j-1,i) == 1_i2b).or.(maske(j-1,i) == 2_i2b)) &
1229 zs_neu(j,i) = min(zs_neu(j,i),(zb_neu(j,i)+h_isol_max))
1234 if (n_cts(j,i) == 1)
then
1235 h_t_neu(j,i) = h_t(j,i)*(zs_neu(j,i)-zb_neu(j,i)) &
1237 zm_neu(j,i) = zb_neu(j,i)+h_t_neu(j,i)
1238 h_c_neu(j,i) = zs_neu(j,i)-zm_neu(j,i)
1240 h_t_neu(j,i) = 0.0_dp
1241 zm_neu(j,i) = zb_neu(j,i)
1242 h_c_neu(j,i) = zs_neu(j,i)-zm_neu(j,i)
1247 zs_neu(j,i) = zb_neu(j,i)
1248 zm_neu(j,i) = zb_neu(j,i)
1249 h_c_neu(j,i) = 0.0_dp
1250 h_t_neu(j,i) = 0.0_dp
1254 dzs_dtau(j,i) = (zs_neu(j,i)-zs(j,i))*dtime_inv
1255 dzb_dtau(j,i) = (zb_neu(j,i)-zb(j,i))*dtime_inv
1256 dzm_dtau(j,i) = dh_t_dtau(j,i)+dzb_dtau(j,i)
1257 dh_c_dtau(j,i) = dzs_dtau(j,i)-dzm_dtau(j,i)
1260 if ( abs((time-time_target_topo_final)*year_sec_inv) < eps )
then
1264 dh_c_dtau(j,i) = 0.0_dp
1265 dh_t_dtau(j,i) = 0.0_dp
1287 if ( ((maske(j,i) == 0_i2b).or.(maske(j,i) == 3_i2b)) &
1288 .and.(n_cts(j,i) == 1_i2b))
then
1291 0.5_dp*(vx_c(0,j,i)+vx_c(0,j,i-1))*dzm_dxi_g(j,i) &
1292 + 0.5_dp*(vy_c(0,j,i)+vy_c(0,j-1,i))*dzm_deta_g(j,i) &
1293 - 0.5_dp*(vz_c(0,j,i)+vz_t(ktmax-1,j,i))
1294 am_perp(j,i) = am_perp_st(j,i) + dzm_dtau(j,i)
1297 am_perp_st(j,i) = 0.0_dp
1298 am_perp(j,i) = 0.0_dp