45 integer(i4b),
intent(in) :: ii((imax+1)*(jmax+1)), jj((imax+1)*(jmax+1))
46 integer(i4b),
intent(in) :: nn(0:jmax,0:imax)
47 integer(i4b),
intent(in) :: m
48 real(dp),
intent(in) :: dxi, deta, z_sl
50 integer(i4b) :: i, j, k, n
51 integer(i4b) :: i1, j1
52 real(dp) :: inv_dxi, inv_deta, inv_dxi_deta, inv_dxi2, inv_deta2
53 real(dp) :: factor_rhs_1, factor_rhs_2, rhosw_rho_ratio
54 real(dp) :: h_mid, zl_mid
55 real(dp),
dimension(0:JMAX,0:IMAX) :: vis_int_sgxy, beta_drag
56 character(len=256) :: ch_solver_set_option
62 lis_vector :: lgs_b, lgs_x
65 lis_integer,
parameter :: nmax = 2*(imax+1)*(jmax+1)
66 lis_integer,
parameter :: n_sprs = 20*(imax+1)*(jmax+1)
67 lis_integer,
allocatable,
dimension(:) :: lgs_a_ptr, lgs_a_index
68 lis_scalar,
allocatable,
dimension(:) :: lgs_a_value, lgs_b_value, lgs_x_value
73 inv_deta = 1.0_dp/deta
74 inv_dxi_deta = 1.0_dp/(dxi*deta)
75 inv_dxi2 = 1.0_dp/(dxi*dxi)
76 inv_deta2 = 1.0_dp/(deta*deta)
78 rhosw_rho_ratio = rho_sw/rho
79 factor_rhs_1 = 0.5_dp*rho*g
80 factor_rhs_2 = 0.5_dp*rho*g*(rho_sw-rho)/rho_sw
92 if ((maske(j,i)==0_i2b).or.(maske(j,i)==3_i2b))
then
94 vis_int_sgxy(j,i) = vis_int_sgxy(j,i) + vis_int_g(j,i)
97 if ((maske(j,i+1)==0_i2b).or.(maske(j,i+1)==3_i2b))
then
99 vis_int_sgxy(j,i) = vis_int_sgxy(j,i) + vis_int_g(j,i+1)
102 if ((maske(j+1,i)==0_i2b).or.(maske(j+1,i)==3_i2b))
then
104 vis_int_sgxy(j,i) = vis_int_sgxy(j,i) + vis_int_g(j+1,i)
107 if ((maske(j+1,i+1)==0_i2b).or.(maske(j+1,i+1)==3_i2b))
then
109 vis_int_sgxy(j,i) = vis_int_sgxy(j,i) + vis_int_g(j+1,i+1)
112 if (k>0) vis_int_sgxy(j,i) = vis_int_sgxy(j,i)/
real(k,dp)
124 if (flag_shelfy_stream(j,i))
then
128 beta_drag(j,i) = c_drag(j,i) &
129 / sqrt(vx_b_g(j,i)**2 &
131 **(1.0_dp-p_weert_inv(j,i))
135 beta_drag(j,i) = c_drag(j,i) &
136 / sqrt((0.5_dp*(vx_m(j,i)+vx_m(j,i-1)))**2 &
137 +(0.5_dp*(vy_m(j,i)+vy_m(j-1,i)))**2) &
138 **(1.0_dp-p_weert_inv(j,i))
151 allocate(lgs_a_value(n_sprs), lgs_a_index(n_sprs), lgs_a_ptr(nmax+1))
152 allocate(lgs_b_value(nmax), lgs_x_value(nmax))
174 if ( (i /= imax).and.(j /= 0).and.(j /= jmax) )
then
177 h_mid = 0.50_dp*(h_c(j,i)+h_t(j,i)+h_c(j,i+1)+h_t(j,i+1))
178 zl_mid = 0.50_dp*(zl(j,i)+zl(j,i+1))
181 ( (maske(j,i)==3_i2b).and.(maske(j,i+1)==3_i2b) ) &
183 ( flag_grounding_line_1(j,i).and.flag_grounding_line_2(j,i+1) &
184 .and.(h_mid < (z_sl-zl_mid)*rhosw_rho_ratio) ) &
186 ( flag_grounding_line_2(j,i).and.flag_grounding_line_1(j,i+1) &
187 .and.(h_mid < (z_sl-zl_mid)*rhosw_rho_ratio) ) &
195 flag_shelfy_stream_x(j,i)=.false.
201 lgs_a_value(k) = inv_deta2*vis_int_sgxy(j-1,i)
207 lgs_a_value(k) = inv_dxi_deta &
208 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j-1,i))
214 lgs_a_value(k) = 4.0_dp*inv_dxi2*vis_int_g(j,i)
220 lgs_a_value(k) = -inv_dxi_deta &
221 *(2.0_dp*vis_int_g(j,i+1)+vis_int_sgxy(j-1,i))
226 stop
' calc_vxy_ssa_matrix: Check for diagonal element failed!'
229 lgs_a_value(k) = -4.0_dp*inv_dxi2 &
230 *(vis_int_g(j,i+1)+vis_int_g(j,i)) &
232 *(vis_int_sgxy(j,i)+vis_int_sgxy(j-1,i))
238 lgs_a_value(k) = -inv_dxi_deta &
239 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i))
245 lgs_a_value(k) = 4.0_dp*inv_dxi2*vis_int_g(j,i+1)
251 lgs_a_value(k) = inv_dxi_deta &
252 *(2.0_dp*vis_int_g(j,i+1)+vis_int_sgxy(j,i))
258 lgs_a_value(k) = inv_deta2*vis_int_sgxy(j,i)
261 lgs_b_value(nr) = factor_rhs_1 &
262 * (h_c(j,i)+h_t(j,i)+h_c(j,i+1)+h_t(j,i+1)) &
265 lgs_x_value(nr) = vx_m(j,i)
267 else if (flag_shelfy_stream_x(j,i))
then
273 lgs_a_value(k) = inv_deta2*vis_int_sgxy(j-1,i)
279 lgs_a_value(k) = inv_dxi_deta &
280 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j-1,i))
286 lgs_a_value(k) = 4.0_dp*inv_dxi2*vis_int_g(j,i)
292 lgs_a_value(k) = -inv_dxi_deta &
293 *(2.0_dp*vis_int_g(j,i+1)+vis_int_sgxy(j-1,i))
298 stop
' calc_vxy_ssa_matrix: Check for diagonal element failed!'
301 lgs_a_value(k) = -4.0_dp*inv_dxi2 &
302 *(vis_int_g(j,i+1)+vis_int_g(j,i)) &
304 *(vis_int_sgxy(j,i)+vis_int_sgxy(j-1,i)) &
305 -0.5_dp*(beta_drag(j,i+1)+beta_drag(j,i))
311 lgs_a_value(k) = -inv_dxi_deta &
312 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i))
318 lgs_a_value(k) = 4.0_dp*inv_dxi2*vis_int_g(j,i+1)
324 lgs_a_value(k) = inv_dxi_deta &
325 *(2.0_dp*vis_int_g(j,i+1)+vis_int_sgxy(j,i))
331 lgs_a_value(k) = inv_deta2*vis_int_sgxy(j,i)
334 lgs_b_value(nr) = factor_rhs_1 &
335 * (h_c(j,i)+h_t(j,i)+h_c(j,i+1)+h_t(j,i+1)) &
338 lgs_x_value(nr) = vx_m(j,i)
341 ( flag_grounding_line_1(j,i).and.flag_grounding_line_2(j,i+1) &
342 .and.(h_mid >= (z_sl-zl_mid)*rhosw_rho_ratio) ) &
344 ( flag_grounding_line_2(j,i).and.flag_grounding_line_1(j,i+1) &
345 .and.(h_mid >= (z_sl-zl_mid)*rhosw_rho_ratio) ) &
353 lgs_a_value(k) = 1.0_dp
356 lgs_b_value(nr) = vx_m(j,i)
357 lgs_x_value(nr) = vx_m(j,i)
360 ( (maske(j,i)==3_i2b).and.(maske(j,i+1)==1_i2b) ) &
362 ( (maske(j,i)==1_i2b).and.(maske(j,i+1)==3_i2b) ) &
369 lgs_a_value(k) = 1.0_dp
372 lgs_b_value(nr) = 0.0_dp
374 lgs_x_value(nr) = 0.0_dp
377 ( flag_calving_front_1(j,i).and.flag_calving_front_2(j,i+1) ) &
379 ( flag_calving_front_2(j,i).and.flag_calving_front_1(j,i+1) ) &
384 if (maske(j,i)==3_i2b)
then
391 ( (maske(j,i1-1)==3_i2b).or.(maske(j,i1+1)==3_i2b) ) &
393 ( (maske(j,i1-1)==0_i2b).or.(maske(j,i1+1)==0_i2b) ) &
395 ( (maske(j,i1-1)==1_i2b).or.(maske(j,i1+1)==1_i2b) ) &
402 lgs_a_value(k) = -2.0_dp*inv_deta*vis_int_g(j,i1)
408 lgs_a_value(k) = -4.0_dp*inv_dxi*vis_int_g(j,i1)
414 lgs_a_value(k) = 4.0_dp*inv_dxi*vis_int_g(j,i1)
420 lgs_a_value(k) = 2.0_dp*inv_deta*vis_int_g(j,i1)
423 lgs_b_value(nr) = factor_rhs_2 &
424 *(h_c(j,i1)+h_t(j,i1))*(h_c(j,i1)+h_t(j,i1))
426 lgs_x_value(nr) = vx_m(j,i)
433 lgs_a_value(k) = 1.0_dp
436 lgs_b_value(nr) = 0.0_dp
438 lgs_x_value(nr) = 0.0_dp
442 else if ( (maske(j,i)==0_i2b).or.(maske(j,i+1)==0_i2b) )
then
448 lgs_a_value(k) = 1.0_dp
451 lgs_b_value(nr) = vx_m(j,i)
453 lgs_x_value(nr) = vx_m(j,i)
460 lgs_a_value(k) = 1.0_dp
463 lgs_b_value(nr) = 0.0_dp
465 lgs_x_value(nr) = 0.0_dp
473 lgs_a_value(k) = 1.0_dp
476 lgs_b_value(nr) = 0.0_dp
478 lgs_x_value(nr) = 0.0_dp
482 lgs_a_ptr(nr+1) = k+1
488 if ( (j /= jmax).and.(i /= 0).and.(i /= imax) )
then
491 h_mid = 0.5_dp*(h_c(j+1,i)+h_t(j+1,i)+h_c(j,i)+h_t(j,i))
492 zl_mid = 0.5_dp*(zl(j+1,i)+zl(j,i))
495 ( (maske(j,i)==3_i2b).and.(maske(j+1,i)==3_i2b) ) &
497 ( flag_grounding_line_1(j,i).and.flag_grounding_line_2(j+1,i) &
498 .and.(h_mid < (z_sl-zl_mid)*rhosw_rho_ratio) ) &
500 ( flag_grounding_line_2(j,i).and.flag_grounding_line_1(j+1,i) &
501 .and.(h_mid < (z_sl-zl_mid)*rhosw_rho_ratio) ) &
509 flag_shelfy_stream_y(j,i)=.false.
515 lgs_a_value(k) = 4.0_dp*inv_deta2*vis_int_g(j,i)
521 lgs_a_value(k) = inv_dxi_deta &
522 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i-1))
528 lgs_a_value(k) = inv_dxi2*vis_int_sgxy(j,i-1)
534 lgs_a_value(k) = -inv_dxi_deta &
535 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i))
540 stop
' calc_vxy_ssa_matrix: Check for diagonal element failed!'
543 lgs_a_value(k) = -4.0_dp*inv_deta2 &
544 *(vis_int_g(j+1,i)+vis_int_g(j,i)) &
546 *(vis_int_sgxy(j,i)+vis_int_sgxy(j,i-1))
552 lgs_a_value(k) = -inv_dxi_deta &
553 *(2.0_dp*vis_int_g(j+1,i)+vis_int_sgxy(j,i-1))
559 lgs_a_value(k) = inv_dxi2*vis_int_sgxy(j,i)
565 lgs_a_value(k) = inv_dxi_deta &
566 *(2.0_dp*vis_int_g(j+1,i)+vis_int_sgxy(j,i))
572 lgs_a_value(k) = 4.0_dp*inv_deta2*vis_int_g(j+1,i)
575 lgs_b_value(nr) = factor_rhs_1 &
576 * (h_c(j,i)+h_t(j,i)+h_c(j+1,i)+h_t(j+1,i)) &
579 lgs_x_value(nr) = vy_m(j,i)
581 else if (flag_shelfy_stream_y(j,i))
then
587 lgs_a_value(k) = 4.0_dp*inv_deta2*vis_int_g(j,i)
593 lgs_a_value(k) = inv_dxi_deta &
594 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i-1))
600 lgs_a_value(k) = inv_dxi2*vis_int_sgxy(j,i-1)
606 lgs_a_value(k) = -inv_dxi_deta &
607 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i))
612 stop
' calc_vxy_ssa_matrix: Check for diagonal element failed!'
615 lgs_a_value(k) = -4.0_dp*inv_deta2 &
616 *(vis_int_g(j+1,i)+vis_int_g(j,i)) &
618 *(vis_int_sgxy(j,i)+vis_int_sgxy(j,i-1)) &
619 -0.5_dp*(beta_drag(j+1,i)+beta_drag(j,i))
625 lgs_a_value(k) = -inv_dxi_deta &
626 *(2.0_dp*vis_int_g(j+1,i)+vis_int_sgxy(j,i-1))
632 lgs_a_value(k) = inv_dxi2*vis_int_sgxy(j,i)
638 lgs_a_value(k) = inv_dxi_deta &
639 *(2.0_dp*vis_int_g(j+1,i)+vis_int_sgxy(j,i))
645 lgs_a_value(k) = 4.0_dp*inv_deta2*vis_int_g(j+1,i)
648 lgs_b_value(nr) = factor_rhs_1 &
649 * (h_c(j,i)+h_t(j,i)+h_c(j+1,i)+h_t(j+1,i)) &
652 lgs_x_value(nr) = vy_m(j,i)
655 ( flag_grounding_line_1(j,i).and.flag_grounding_line_2(j+1,i) &
656 .and.(h_mid >= (z_sl-zl_mid)*rhosw_rho_ratio) ) &
658 ( flag_grounding_line_2(j,i).and.flag_grounding_line_1(j+1,i) &
659 .and.(h_mid >= (z_sl-zl_mid)*rhosw_rho_ratio) ) &
667 lgs_a_value(k) = 1.0_dp
670 lgs_b_value(nr) = vy_m(j,i)
671 lgs_x_value(nr) = vy_m(j,i)
674 ( (maske(j,i)==3_i2b).and.(maske(j+1,i)==1_i2b) ) &
676 ( (maske(j,i)==1_i2b).and.(maske(j+1,i)==3_i2b) ) &
683 lgs_a_value(k) = 1.0_dp
686 lgs_b_value(nr) = 0.0_dp
688 lgs_x_value(nr) = 0.0_dp
691 ( flag_calving_front_1(j,i).and.flag_calving_front_2(j+1,i) ) &
693 ( flag_calving_front_2(j,i).and.flag_calving_front_1(j+1,i) ) &
698 if (maske(j,i)==3_i2b)
then
705 ( (maske(j1-1,i)==3_i2b).or.(maske(j1+1,i)==3_i2b) ) &
707 ( (maske(j1-1,i)==0_i2b).or.(maske(j1+1,i)==0_i2b) ) &
709 ( (maske(j1-1,i)==1_i2b).or.(maske(j1+1,i)==1_i2b) ) &
716 lgs_a_value(k) = -4.0_dp*inv_deta*vis_int_g(j1,i)
722 lgs_a_value(k) = -2.0_dp*inv_dxi*vis_int_g(j1,i)
728 lgs_a_value(k) = 2.0_dp*inv_dxi*vis_int_g(j1,i)
734 lgs_a_value(k) = 4.0_dp*inv_deta*vis_int_g(j1,i)
737 lgs_b_value(nr) = factor_rhs_2 &
738 *(h_c(j1,i)+h_t(j1,i))*(h_c(j1,i)+h_t(j1,i))
740 lgs_x_value(nr) = vy_m(j,i)
747 lgs_a_value(k) = 1.0_dp
750 lgs_b_value(nr) = 0.0_dp
752 lgs_x_value(nr) = 0.0_dp
756 else if ( (maske(j,i)==0_i2b).or.(maske(j+1,i)==0_i2b) )
then
762 lgs_a_value(k) = 1.0_dp
765 lgs_b_value(nr) = vy_m(j,i)
767 lgs_x_value(nr) = vy_m(j,i)
774 lgs_a_value(k) = 1.0_dp
777 lgs_b_value(nr) = 0.0_dp
778 lgs_x_value(nr) = 0.0_dp
786 lgs_a_value(k) = 1.0_dp
789 lgs_b_value(nr) = 0.0_dp
790 lgs_x_value(nr) = 0.0_dp
794 lgs_a_ptr(nr+1) = k+1
800 call lis_matrix_create(lis_comm_world, lgs_a, ierr)
801 call lis_vector_create(lis_comm_world, lgs_b, ierr)
802 call lis_vector_create(lis_comm_world, lgs_x, ierr)
804 call lis_matrix_set_size(lgs_a, 0, nmax, ierr)
805 call lis_vector_set_size(lgs_b, 0, nmax, ierr)
806 call lis_vector_set_size(lgs_x, 0, nmax, ierr)
810 do nc=lgs_a_ptr(nr), lgs_a_ptr(nr+1)-1
811 call lis_matrix_set_value(lis_ins_value, nr, lgs_a_index(nc), &
812 lgs_a_value(nc), lgs_a, ierr)
815 call lis_vector_set_value(lis_ins_value, nr, lgs_b_value(nr), lgs_b, ierr)
816 call lis_vector_set_value(lis_ins_value, nr, lgs_x_value(nr), lgs_x, ierr)
820 call lis_matrix_set_type(lgs_a, lis_matrix_csr, ierr)
821 call lis_matrix_assemble(lgs_a, ierr)
825 call lis_solver_create(solver, ierr)
827 ch_solver_set_option =
'-i bicgstabl -p ilu '// &
828 '-maxiter 1000 -tol 1.0e-11 -initx_zeros false'
829 call lis_solver_set_option(trim(ch_solver_set_option), solver, ierr)
831 call lis_solve(lgs_a, lgs_b, lgs_x, solver, ierr)
837 call lis_vector_gather(lgs_x, lgs_x_value, ierr)
838 call lis_matrix_destroy(lgs_a, ierr)
839 call lis_vector_destroy(lgs_b, ierr)
840 call lis_vector_destroy(lgs_x, ierr)
841 call lis_solver_destroy(solver, ierr)
849 vx_m(j,i) = lgs_x_value(nr)
852 vy_m(j,i) = lgs_x_value(nr)
856 deallocate(lgs_a_value, lgs_a_index, lgs_a_ptr)
857 deallocate(lgs_b_value, lgs_x_value)
subroutine calc_vxy_ssa_matrix(z_sl, dxi, deta, ii, jj, nn, m)
Solution of the system of linear equations for the horizontal velocities vx_m, vy_m in the shallow sh...
Declarations of kind types for SICOPOLIS.
Declarations of global variables for SICOPOLIS (for the ANT domain).
Declarations of global variables for SICOPOLIS.