7 !! Solution of the system of linear equations for the horizontal velocities
8 !! vx_m, vy_m in the shallow shelf approximation.
12 !! Copyright 2009-2013 Ralf Greve, Tatsuru Sato
16 !! This file is part of SICOPOLIS.
18 !! SICOPOLIS is free software: you can redistribute it and/or modify
19 !! it under the terms of the GNU General Public License as published by
20 !! the Free Software Foundation, either version 3 of the License, or
21 !! (at your option) any later version.
23 !! SICOPOLIS is distributed in the hope that it will be useful,
24 !! but WITHOUT ANY WARRANTY; without even the implied warranty of
25 !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 !! GNU General Public License for more details.
28 !! You should have received a copy of the GNU General Public License
29 !! along with SICOPOLIS. If not, see <http://www.gnu.org/licenses/>.
31 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
34 !> Solution of the system of linear equations for the horizontal velocities
35 !! vx_m, vy_m in the shallow shelf approximation.
36 !<------------------------------------------------------------------------------
44 integer(i4b),
intent(in) :: ii((imax+1)*(jmax+1)), jj((imax+1)*(jmax+1))
45 integer(i4b),
intent(in) :: nn(0:jmax,0:imax)
46 real(dp),
intent(in) :: dxi, deta, z_sl
48 integer(i4b) :: i, j, k, n
49 integer(i4b) :: i1, j1
52 integer(i4b) :: nr, nc
53 integer(i4b),
allocatable,
dimension(:) :: lgs_a_ptr, lgs_a_index
54 real(dp) :: inv_dxi, inv_deta, inv_dxi_deta, inv_dxi2, inv_deta2
55 real(dp) :: factor_rhs_1, factor_rhs_2 ,tau_b ,rhosw_rho_ratio
56 real(dp) :: h_mid, zl_mid
57 real(dp),
dimension(0:JMAX,0:IMAX) :: vis_int_sgxy
58 character(len=256) :: ch_solver_set_option
61 lis_vector lgs_b, lgs_x
62 lis_scalar,
allocatable,
dimension(:) :: lgs_a_value, lgs_b_value, lgs_x_value
65 integer(i4b),
parameter :: nmax=2*(imax+1)*(jmax+1), n_sprs=20*(imax+1)*(jmax+1)
70 inv_deta = 1.0_dp/deta
71 inv_dxi_deta = 1.0_dp/(dxi*deta)
72 inv_dxi2 = 1.0_dp/(dxi*dxi)
73 inv_deta2 = 1.0_dp/(deta*deta)
75 rhosw_rho_ratio = rho_sw/rho
76 factor_rhs_1 = 0.5_dp*rho*g
77 factor_rhs_2 = 0.5_dp*rho*g*(rho_sw-rho)/rho_sw
89 if ((maske(j,i)==0_i2b).or.(maske(j,i)==3_i2b))
then
91 vis_int_sgxy(j,i) = vis_int_sgxy(j,i) + vis_int_g(j,i)
94 if ((maske(j,i+1)==0_i2b).or.(maske(j,i+1)==3_i2b))
then
96 vis_int_sgxy(j,i) = vis_int_sgxy(j,i) + vis_int_g(j,i+1)
99 if ((maske(j+1,i)==0_i2b).or.(maske(j+1,i)==3_i2b))
then
101 vis_int_sgxy(j,i) = vis_int_sgxy(j,i) + vis_int_g(j+1,i)
104 if ((maske(j+1,i+1)==0_i2b).or.(maske(j+1,i+1)==3_i2b))
then
106 vis_int_sgxy(j,i) = vis_int_sgxy(j,i) + vis_int_g(j+1,i+1)
109 if (k>0) vis_int_sgxy(j,i) = vis_int_sgxy(j,i)/
real(k,dp)
117 allocate(lgs_a_value(n_sprs), lgs_a_index(n_sprs), lgs_a_ptr(nmax+1))
118 allocate(lgs_b_value(nmax), lgs_x_value(nmax))
140 if ( (i /= imax).and.(j /= 0).and.(j /= jmax) )
then
142 h_mid=0.50_dp*(h_c(j,i)+h_t(j,i)+h_c(j,i+1)+h_t(j,i+1))
143 zl_mid=0.50_dp*(zl(j,i)+zl(j,i+1))
147 ( (maske(j,i)==3_i2b).and.(maske(j,i+1)==3_i2b) ) &
149 ((maske(j,i)==3_i2b).and.(maske(j,i+1)==0_i2b) &
150 .and.(h_mid<(z_sl-zl_mid)*rhosw_rho_ratio)) &
152 ((maske(j,i)==0_i2b).and.(maske(j,i+1)==3_i2b) &
153 .and.(h_mid<(z_sl-zl_mid)*rhosw_rho_ratio)) &
162 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
163 lgs_a_value(k) = inv_deta2*vis_int_sgxy(j-1,i)
168 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
169 lgs_a_value(k) = inv_dxi_deta &
170 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j-1,i))
175 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
176 lgs_a_value(k) = 4.0_dp*inv_dxi2*vis_int_g(j,i)
181 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
182 lgs_a_value(k) = -inv_dxi_deta &
183 *(2.0_dp*vis_int_g(j,i+1)+vis_int_sgxy(j-1,i))
188 stop
' calc_vxy_ssa_matrix: Check for diagonal element failed!'
190 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
191 lgs_a_value(k) = -4.0_dp*inv_dxi2 &
192 *(vis_int_g(j,i+1)+vis_int_g(j,i)) &
194 *(vis_int_sgxy(j,i)+vis_int_sgxy(j-1,i))
199 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
200 lgs_a_value(k) = -inv_dxi_deta &
201 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i))
206 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
207 lgs_a_value(k) = 4.0_dp*inv_dxi2*vis_int_g(j,i+1)
212 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
213 lgs_a_value(k) = inv_dxi_deta &
214 *(2.0_dp*vis_int_g(j,i+1)+vis_int_sgxy(j,i))
219 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
220 lgs_a_value(k) = inv_deta2*vis_int_sgxy(j,i)
223 lgs_b_value(nr) = factor_rhs_1 &
224 * (h_c(j,i)+h_t(j,i)+h_c(j,i+1)+h_t(j,i+1)) &
227 lgs_x_value(nr) = vx_m(j,i)
231 else if ( ( (maske(j,i)==3_i2b).and.(maske(j,i+1)==0_i2b) &
232 .and.(h_mid>(z_sl-zl(j,i)+zl(j,i+1))*rhosw_rho_ratio)) &
234 ( (maske(j,i)==0_i2b).and.(maske(j,i+1)==3_i2b) &
235 .and.(h_mid>(z_sl-zl_mid)*rhosw_rho_ratio) ) &
238 #if ( !defined(SHS) || SHS==0 )
240 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
241 lgs_a_value(k) = 1.0_dp
244 lgs_b_value(nr) = vx_m(j,i)
245 lgs_x_value(nr) = vx_m(j,i)
249 tau_b=((year_sec/c_slide_ssa)**(1.0_dp/p_ssa)) &
250 *(rho*g*(h_c(j,i)+h_t(j,i))**(q_ssa/p_ssa)) &
251 /((vx_m(j,i)*vx_m(j,i)+vy_m(j,i)*vy_m(j,i))**(0.50_dp*(1.0_dp-1.0_dp/p_ssa)))
255 flag_sf(j,i-1)=.true.
259 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
260 lgs_a_value(k) = inv_deta2*vis_int_sgxy(j-1,i)
265 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
266 lgs_a_value(k) = inv_dxi_deta &
267 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j-1,i))
272 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
273 lgs_a_value(k) = 4.0_dp*inv_dxi2*vis_int_g(j,i)
278 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
279 lgs_a_value(k) = -inv_dxi_deta &
280 *(2.0_dp*vis_int_g(j,i+1)+vis_int_sgxy(j-1,i))
285 stop
' calc_vxy_ssa_matrix: Check for diagonal element failed!'
287 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
288 lgs_a_value(k) = -4.0_dp*inv_dxi2 &
289 *(vis_int_g(j,i+1)+vis_int_g(j,i)) &
291 *(vis_int_sgxy(j,i)+vis_int_sgxy(j-1,i))-tau_b
296 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
297 lgs_a_value(k) = -inv_dxi_deta &
298 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i))
303 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
304 lgs_a_value(k) = 4.0_dp*inv_dxi2*vis_int_g(j,i+1)
309 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
310 lgs_a_value(k) = inv_dxi_deta &
311 *(2.0_dp*vis_int_g(j,i+1)+vis_int_sgxy(j,i))
316 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
317 lgs_a_value(k) = inv_deta2*vis_int_sgxy(j,i)
320 lgs_b_value(nr) = factor_rhs_1 &
321 * (h_c(j,i)+h_t(j,i)+h_c(j,i+1)+h_t(j,i+1)) &
324 lgs_x_value(nr) = vx_m(j,i)
329 ( (maske(j,i)==3_i2b).and.(maske(j,i+1)==1_i2b) ) &
331 ( (maske(j,i)==1_i2b).and.(maske(j,i+1)==3_i2b) ) &
338 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
339 lgs_a_value(k) = 1.0_dp
342 lgs_b_value(nr) = 0.0_dp
344 lgs_x_value(nr) = 0.0_dp
347 ( (maske(j,i)==3_i2b).and.(maske(j,i+1)==2_i2b) ) &
349 ( (maske(j,i)==2_i2b).and.(maske(j,i+1)==3_i2b) ) &
353 if (maske(j,i)==3_i2b)
then
360 ( (maske(j,i1-1)==3_i2b).or.(maske(j,i1+1)==3_i2b) ) &
362 ( (maske(j,i1-1)==0_i2b).or.(maske(j,i1+1)==0_i2b) ) &
364 ( (maske(j,i1-1)==1_i2b).or.(maske(j,i1+1)==1_i2b) ) &
370 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
371 lgs_a_value(k) = -2.0_dp*inv_deta*vis_int_g(j,i1)
376 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
377 lgs_a_value(k) = -4.0_dp*inv_dxi*vis_int_g(j,i1)
382 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
383 lgs_a_value(k) = 4.0_dp*inv_dxi*vis_int_g(j,i1)
388 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
389 lgs_a_value(k) = 2.0_dp*inv_deta*vis_int_g(j,i1)
392 lgs_b_value(nr) = factor_rhs_2 &
393 *(h_c(j,i1)+h_t(j,i1))*(h_c(j,i1)+h_t(j,i1))
395 lgs_x_value(nr) = vx_m(j,i)
401 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
402 lgs_a_value(k) = 1.0_dp
405 lgs_b_value(nr) = 0.0_dp
407 lgs_x_value(nr) = 0.0_dp
411 else if ( (maske(j,i)==0_i2b).or.(maske(j,i+1)==0_i2b) )
then
416 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
417 lgs_a_value(k) = 1.0_dp
420 lgs_b_value(nr) = vx_m(j,i)
422 lgs_x_value(nr) = vx_m(j,i)
428 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
429 lgs_a_value(k) = 1.0_dp
432 lgs_b_value(nr) = 0.0_dp
434 lgs_x_value(nr) = 0.0_dp
441 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
442 lgs_a_value(k) = 1.0_dp
445 lgs_b_value(nr) = 0.0_dp
447 lgs_x_value(nr) = 0.0_dp
451 lgs_a_ptr(nr+1) = k+1
457 if ( (j /= jmax).and.(i /= 0).and.(i /= imax) )
then
459 h_mid=0.50_dp*(h_c(j+1,i)+h_t(j+1,i)+h_c(j,i)+h_t(j,i))
460 zl_mid=0.50_dp*(zl(j+1,i)+zl(j,i))
463 ( (maske(j,i)==3_i2b).and.(maske(j+1,i)==3_i2b) ) &
465 ( (maske(j,i)==3_i2b).and.(maske(j+1,i)==0_i2b) &
466 .and.(h_mid<(z_sl-zl_mid)*rhosw_rho_ratio)) &
468 ( (maske(j,i)==0_i2b).and.(maske(j+1,i)==3_i2b) &
469 .and.(h_mid<(z_sl-zl_mid)*rhosw_rho_ratio)) &
477 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
478 lgs_a_value(k) = 4.0_dp*inv_deta2*vis_int_g(j,i)
483 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
484 lgs_a_value(k) = inv_dxi_deta &
485 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i-1))
490 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
491 lgs_a_value(k) = inv_dxi2*vis_int_sgxy(j,i-1)
496 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
497 lgs_a_value(k) = -inv_dxi_deta &
498 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i))
503 stop
' calc_vxy_ssa_matrix: Check for diagonal element failed!'
505 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
506 lgs_a_value(k) = -4.0_dp*inv_deta2 &
507 *(vis_int_g(j+1,i)+vis_int_g(j,i)) &
509 *(vis_int_sgxy(j,i)+vis_int_sgxy(j,i-1))
514 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
515 lgs_a_value(k) = -inv_dxi_deta &
516 *(2.0_dp*vis_int_g(j+1,i)+vis_int_sgxy(j,i-1))
521 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
522 lgs_a_value(k) = inv_dxi2*vis_int_sgxy(j,i)
527 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
528 lgs_a_value(k) = inv_dxi_deta &
529 *(2.0_dp*vis_int_g(j+1,i)+vis_int_sgxy(j,i))
534 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
535 lgs_a_value(k) = 4.0_dp*inv_deta2*vis_int_g(j+1,i)
538 lgs_b_value(nr) = factor_rhs_1 &
539 * (h_c(j,i)+h_t(j,i)+h_c(j+1,i)+h_t(j+1,i)) &
542 lgs_x_value(nr) = vy_m(j,i)
546 ( (maske(j,i)==3_i2b).and.(maske(j+1,i)==0_i2b) &
547 .and.(h_mid>=(z_sl-zl_mid)*rhosw_rho_ratio)) &
549 ( (maske(j,i)==0_i2b).and.(maske(j+1,i)==3_i2b) &
550 .and.(h_mid>=(z_sl-zl_mid)*rhosw_rho_ratio)) &
553 #if ( !defined(SHS) || SHS==0 )
555 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
556 lgs_a_value(k) = 1.0_dp
559 lgs_b_value(nr) = vy_m(j,i)
560 lgs_x_value(nr) = vy_m(j,i)
564 tau_b=((year_sec/c_slide_ssa)**(1.0_dp/p_ssa)) &
565 *(rho*g*(h_c(j,i)+h_t(j,i))**(q_ssa/p_ssa)) &
566 /((vx_m(j,i)*vx_m(j,i)+vy_m(j,i)*vy_m(j,i)) &
567 **(0.50_dp*(1.0_dp-1.0_dp/p_ssa)))
571 flag_sf(j-1,i)=.true.
575 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
576 lgs_a_value(k) = 4.0_dp*inv_deta2*vis_int_g(j,i)
581 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
582 lgs_a_value(k) = inv_dxi_deta &
583 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i-1))
588 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
589 lgs_a_value(k) = inv_dxi2*vis_int_sgxy(j,i-1)
594 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
595 lgs_a_value(k) = -inv_dxi_deta &
596 *(2.0_dp*vis_int_g(j,i)+vis_int_sgxy(j,i))
601 stop
' calc_vxy_ssa_matrix: Check for diagonal element failed!'
603 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
604 lgs_a_value(k) = -4.0_dp*inv_deta2 &
605 *(vis_int_g(j+1,i)+vis_int_g(j,i)) &
607 *(vis_int_sgxy(j,i)+vis_int_sgxy(j,i-1))-tau_b
612 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
613 lgs_a_value(k) = -inv_dxi_deta &
614 *(2.0_dp*vis_int_g(j+1,i)+vis_int_sgxy(j,i-1))
619 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
620 lgs_a_value(k) = inv_dxi2*vis_int_sgxy(j,i)
625 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
626 lgs_a_value(k) = inv_dxi_deta &
627 *(2.0_dp*vis_int_g(j+1,i)+vis_int_sgxy(j,i))
632 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
633 lgs_a_value(k) = 4.0_dp*inv_deta2*vis_int_g(j+1,i)
636 lgs_b_value(nr) = factor_rhs_1 &
637 * (h_c(j,i)+h_t(j,i)+h_c(j+1,i)+h_t(j+1,i)) &
640 lgs_x_value(nr) = vy_m(j,i)
645 ( (maske(j,i)==3_i2b).and.(maske(j+1,i)==1_i2b) ) &
647 ( (maske(j,i)==1_i2b).and.(maske(j+1,i)==3_i2b) ) &
653 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
654 lgs_a_value(k) = 1.0_dp
657 lgs_b_value(nr) = 0.0_dp
659 lgs_x_value(nr) = 0.0_dp
662 ( (maske(j,i)==3_i2b).and.(maske(j+1,i)==2_i2b) ) &
664 ( (maske(j,i)==2_i2b).and.(maske(j+1,i)==3_i2b) ) &
668 if (maske(j,i)==3_i2b)
then
675 ( (maske(j1-1,i)==3_i2b).or.(maske(j1+1,i)==3_i2b) ) &
677 ( (maske(j1-1,i)==0_i2b).or.(maske(j1+1,i)==0_i2b) ) &
679 ( (maske(j1-1,i)==1_i2b).or.(maske(j1+1,i)==1_i2b) ) &
685 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
686 lgs_a_value(k) = -4.0_dp*inv_deta*vis_int_g(j1,i)
691 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
692 lgs_a_value(k) = -2.0_dp*inv_dxi*vis_int_g(j1,i)
697 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
698 lgs_a_value(k) = 2.0_dp*inv_dxi*vis_int_g(j1,i)
703 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
704 lgs_a_value(k) = 4.0_dp*inv_deta*vis_int_g(j1,i)
707 lgs_b_value(nr) = factor_rhs_2 &
708 *(h_c(j1,i)+h_t(j1,i))*(h_c(j1,i)+h_t(j1,i))
710 lgs_x_value(nr) = vy_m(j,i)
716 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
717 lgs_a_value(k) = 1.0_dp
720 lgs_b_value(nr) = 0.0_dp
722 lgs_x_value(nr) = 0.0_dp
726 else if ( (maske(j,i)==0_i2b).or.(maske(j+1,i)==0_i2b) )
then
731 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
732 lgs_a_value(k) = 1.0_dp
735 lgs_b_value(nr) = vy_m(j,i)
737 lgs_x_value(nr) = vy_m(j,i)
743 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
744 lgs_a_value(k) = 1.0_dp
747 lgs_b_value(nr) = 0.0_dp
748 lgs_x_value(nr) = 0.0_dp
755 if (k > n_sprs) stop
' calc_vxy_ssa_matrix: n_sprs too small!'
756 lgs_a_value(k) = 1.0_dp
759 lgs_b_value(nr) = 0.0_dp
760 lgs_x_value(nr) = 0.0_dp
764 lgs_a_ptr(nr+1) = k+1
770 call lis_matrix_create(lis_comm_world, lgs_a, ierr)
771 call lis_vector_create(lis_comm_world, lgs_b, ierr)
772 call lis_vector_create(lis_comm_world, lgs_x, ierr)
774 call lis_matrix_set_size(lgs_a, 0, nmax, ierr)
775 call lis_vector_set_size(lgs_b, 0, nmax, ierr)
776 call lis_vector_set_size(lgs_x, 0, nmax, ierr)
780 do nc=lgs_a_ptr(nr), lgs_a_ptr(nr+1)-1
781 call lis_matrix_set_value(lis_ins_value, nr, lgs_a_index(nc), &
782 lgs_a_value(nc), lgs_a, ierr)
785 call lis_vector_set_value(lis_ins_value, nr, lgs_b_value(nr), lgs_b, ierr)
786 call lis_vector_set_value(lis_ins_value, nr, lgs_x_value(nr), lgs_x, ierr)
790 call lis_matrix_set_type(lgs_a, lis_matrix_crs, ierr)
791 call lis_matrix_assemble(lgs_a, ierr)
795 call lis_solver_create(solver, ierr)
797 ch_solver_set_option =
'-i 5 -p 2 '// &
798 '-maxiter 1000 -tol 1.0e-11 -initx_zeros false'
799 call lis_solver_set_option(trim(ch_solver_set_option), solver, ierr)
801 call lis_solve(lgs_a, lgs_b, lgs_x, solver, ierr)
807 call lis_vector_gather(lgs_x, lgs_x_value, ierr)
808 call lis_matrix_destroy(lgs_a, ierr)
809 call lis_vector_destroy(lgs_b, ierr)
810 call lis_vector_destroy(lgs_x, ierr)
811 call lis_solver_destroy(solver, ierr)
819 vx_m(j,i) = lgs_x_value(nr)
822 vy_m(j,i) = lgs_x_value(nr)
826 deallocate(lgs_a_value, lgs_a_index, lgs_a_ptr)
827 deallocate(lgs_b_value, lgs_x_value)