56 INTEGER,
INTENT(IN) :: TNIT, STEPS
63 1100
FORMAT(/2x,
'Total number of non-linear iterations: ', a,/2x,&
64 'Average number per time-step: ',a)
69 1200
FORMAT(2x,
'|',10(
'-'),
'|',13(
'-'),
'|',14(
'-'),
'|',/&
70 2x,
'| Equation | Number of | Avg Solves |',/&
71 2x,
'| Number | Solves | for NIT |',/&
72 2x,
'|',10(
'-'),
'|',13(
'-'),
'|',14(
'-'),
'|')
79 1201
FORMAT(2x,
'|',3x,i3,4x,
'|',2x,i9,2x,
'|',2x,i10,2x,
'|',/ &
80 2x,
'|',10(
'-'),
'|',13(
'-'),
'|',14(
'-'),
'|')
108 USE compar, ONLY:
istart,
iend,
jstart,
jend,
kstart,
kend,
ijkstart3,
ijkend3,
nlayers_bicgs,
c0,
c1,
c2,
mype 119 CHARACTER(LEN=*),
INTENT(IN) :: Vname
125 DOUBLE PRECISION,
INTENT(IN) :: A_m(
dimension_3, -3:3)
133 INTEGER :: I, J, K, IJK
134 integer :: im1jk, ip1jk, ijm1k, ijp1k, ijkm1, ijkp1
135 integer ::
class, interval
136 integer :: j_start(2), j_end(2)
148 avar(ijk) = a_m(ijk,-2) * var(ijm1k) &
149 + a_m(ijk,-1) * var(im1jk) &
150 + a_m(ijk, 0) * var(ijk) &
151 + a_m(ijk, 1) * var(ip1jk) &
152 + a_m(ijk, 2) * var(ijp1k)
159 avar(ijk) = avar(ijk) + a_m(ijk,-3) * var(ijkm1) &
160 + a_m(ijk, 3) * var(ijkp1)
193 ijk = (j +
c0 + i*
c1 + k*
c2)
198 + a_m(ijk, 0) * var(ijk) &
236 do j = j_start(interval),j_end(interval)
237 ijk = (j +
c0 + i*
c1 + k*
c2)
243 + a_m(ijk, 0) * var(ijk) &
263 include
'functions.inc' 286 SUBROUTINE leq_msolve(VNAME, B_m, A_M, Var, CMETHOD)
303 CHARACTER(LEN=*),
INTENT(IN) :: Vname
309 DOUBLE PRECISION,
INTENT(IN) :: A_m(
dimension_3, -3:3)
312 DOUBLE PRECISION,
INTENT(INOUT) :: Var(
dimension_3)
315 CHARACTER(LEN=4),
INTENT(IN) :: CMETHOD
319 LOGICAL,
PARAMETER :: USE_IKLOOP = .false.
320 LOGICAL,
PARAMETER :: SETGUESS = .true.
325 INTEGER :: ITER, NITER
326 INTEGER :: IJK, I , J, K
327 INTEGER :: I1, J1, K1, I2, J2, K2, IK, JK, IJ
328 INTEGER :: ISIZE, JSIZE, KSIZE
333 LOGICAL :: DO_ISWEEP, DO_JSWEEP, DO_KSWEEP
334 LOGICAL :: DO_SENDRECV, DO_REDBLACK, DO_ALL
359 niter = len( cmethod )
364 ch = cmethod( iter:iter )
365 do_isweep = (ch .EQ.
'I') .OR. (ch .EQ.
'i')
366 do_jsweep = (ch .EQ.
'J') .OR. (ch .EQ.
'j')
367 do_ksweep = (ch .EQ.
'K') .OR. (ch .EQ.
'k')
368 do_all = (ch .EQ.
'A') .OR. (ch .EQ.
'a')
369 do_redblack = (ch .EQ.
'R') .OR. (ch .EQ.
'r')
370 do_sendrecv = (ch .EQ.
'S') .OR. (ch .EQ.
's')
374 IF ( do_isweep )
THEN 382 IF (do_redblack)
THEN 409 DO jk=icase, ksize*jsize, 2
410 if (mod(jk,jsize).ne.0)
then 411 k = int( jk/jsize ) + k1
413 k = int( jk/jsize ) + k1 -1
415 j = (jk-1-(k-k1)*jsize) + j1 + mod(k,2)
416 if(j.gt.j2) j=j-j2 + j1 -1
433 DO ij=icase, jsize*isize, 2
434 if (mod(ij,isize).ne.0)
then 435 j = int( ij/isize ) + j1
437 j = int( ij/isize ) + j1 -1
439 i = (ij-1-(j-j1)*isize) + i1 + mod(j,2)
440 if(i.gt.i2) i=i-i2 + i1 -1
458 DO ik=icase, ksize*isize, 2
459 if (mod(ik,isize).ne.0)
then 460 k = int( ik/isize ) + k1
462 k = int( ik/isize ) + k1 -1
464 i = (ik-1-(k-k1)*isize) + i1 + mod(k,2)
465 if(i.gt.i2) i=i-i2 + i1 -1
499 IF(mod(k,2).ne.0)
THEN 512 IF(mod(k,2).ne.0)
THEN 541 if (mod(ik,isize).ne.0)
then 542 k = int( ik/isize ) + k1
544 k = int( ik/isize ) + k1 -1
546 i = (ik-1-(k-k1)*isize) + i1
553 if (mod(ik,ksize).ne.0)
then 554 i = int( ik/ksize ) + i1
556 i = int( ik/ksize ) + i1 -1
558 k = (ik-1-(i-i1)*ksize) + k1
616 SUBROUTINE leq_msolve0(VNAME, B_m, A_M, Var, CMETHOD)
633 CHARACTER(LEN=*),
INTENT(IN) :: Vname
639 DOUBLE PRECISION,
INTENT(IN) :: A_m(
dimension_3, -3:3)
644 CHARACTER(LEN=4),
INTENT(IN) :: CMETHOD
681 SUBROUTINE leq_msolve1(VNAME, B_m, A_M, Var, CMETHOD)
701 CHARACTER(LEN=*),
INTENT(IN) :: Vname
707 DOUBLE PRECISION,
INTENT(IN) :: A_m(
dimension_3, -3:3)
712 CHARACTER(LEN=4),
INTENT(IN) :: CMETHOD
716 integer :: i,j,k, ijk
734 ijk = funijk( i,j,k )
735 var(ijk) = b_m(ijk)/a_m(ijk,0)
742 var(ijk) = b_m(ijk)/a_m(ijk,0)
767 SUBROUTINE leq_isweep(I, Vname, VAR, A_M, B_M)
786 INTEGER,
INTENT(IN) :: I
788 CHARACTER(LEN=*),
INTENT(IN) :: Vname
798 DOUBLE PRECISION,
DIMENSION (JSTART:JEND) :: CC, DD, EE, BB
799 INTEGER :: NSTART, NEND, INFO
800 INTEGER :: IJK, J, K, IM1JK, IP1JK
814 bb(j) = b_m(ijk) - a_m(ijk,-1) * var( im1jk ) &
815 - a_m(ijk, 1) * var( ip1jk )
870 INTEGER,
INTENT(IN) :: I, K
872 CHARACTER(LEN=*),
INTENT(IN) :: Vname
882 DOUBLE PRECISION,
DIMENSION(JSTART:JEND) :: CC, DD, EE, BB
883 INTEGER :: NSTART, NEND, INFO
884 INTEGER :: IJK, J, CLASS
893 ijk = (j +
c0 + i*
c1 + k*
c2)
908 CALL dgtsv(nend-nstart+1, 1, cc(nstart+1), dd, ee, bb, nend-nstart+1, info)
911 write(*,*)
'leq_iksweep',info,
mype 917 var(j +
c0 + i*
c1 + k*
c2) = bb(j)
956 INTEGER,
INTENT(IN) :: J, K
958 CHARACTER(LEN=*),
INTENT(IN) :: Vname
968 DOUBLE PRECISION,
DIMENSION (ISTART:IEND) :: CC, DD, EE, BB
969 INTEGER :: NSTART, NEND, INFO, IJK, I
980 bb(i) = b_m(ijk) - a_m(ijk,-2) * var( jm_of(ijk) ) &
981 - a_m(ijk, 2) * var( jp_of(ijk) ) &
982 - a_m(ijk,-3) * var( km_of(ijk) ) &
983 - a_m(ijk, 3) * var( kp_of(ijk) )
989 CALL dgtsv(nend-nstart+1, 1, cc(nstart+1), dd, ee, bb, nend-nstart+1, info)
1021 SUBROUTINE leq_ijsweep(I, J, Vname, VAR, A_M, B_M)
1038 INTEGER,
INTENT(IN) :: I, J
1040 CHARACTER(LEN=*),
INTENT(IN) :: Vname
1050 DOUBLE PRECISION,
DIMENSION (KSTART:KEND) :: CC, DD, EE, BB
1051 INTEGER :: NEND, NSTART, INFO, IJK, K
1060 cc(k) = a_m(ijk, -3)
1062 bb(k) = b_m(ijk) - a_m(ijk,-2) * var( jm_of(ijk) ) &
1063 - a_m(ijk, 2) * var( jp_of(ijk) ) &
1064 - a_m(ijk,-1) * var( im_of(ijk) ) &
1065 - a_m(ijk, 1) * var( ip_of(ijk) )
1071 CALL dgtsv(nend-nstart+1, 1, cc(nstart+1), dd, ee, bb, nend-nstart+1, info)
1112 double precision,
intent(in),
dimension(DIMENSION_3) :: r1,r2
1116 logical,
parameter :: do_global_sum = .true.
1120 DOUBLE PRECISION,
allocatable,
Dimension(:) :: r1_g, r2_g
1121 double precision :: prod
1122 integer :: i, j, k, ijk
1138 if(do_global_sum)
then 1156 ijk = funijk_map_c(i,j,k)
1157 prod = prod + r1(ijk)*r2(ijk)
1186 prod = prod + r1_g(ijk)*r2_g(ijk)
1224 double precision,
intent(in),
dimension(ijkstart3:ijkend3) :: r1,r2,r3,r4
1228 logical,
parameter :: do_global_sum = .true.
1232 DOUBLE PRECISION,
allocatable,
Dimension(:,:) :: r_temp, rg_temp
1233 double precision,
Dimension(2) :: prod, dot_product_par2
1234 integer :: i, j, k, ijk
1237 if(do_global_sum)
then 1248 ijk = funijk_map_c(i,j,k)
1249 prod(1) = prod(1) + r1(ijk)*r2(ijk)
1250 prod(2) = prod(2) + r3(ijk)*r4(ijk)
1265 allocate (rg_temp(1:
ijkmax3,4))
1267 allocate (rg_temp(10,4))
1269 call gather(r_temp,rg_temp)
1280 prod(1) = prod(1) + rg_temp(ijk,1)*rg_temp(ijk,2)
1281 prod(2) = prod(2) + rg_temp(ijk,3)*rg_temp(ijk,4)
1288 dot_product_par2 = prod
1291 deallocate (rg_temp)
integer, dimension(:), allocatable jmap_c
integer, dimension(:), allocatable kmap_c
subroutine leq_matvec(VNAME, VAR, A_M, Avar)
subroutine leq_iksweep(I, K, Vname, VAR, A_M, B_M)
integer, dimension(dim_eqs) iter_tot
integer, parameter dim_eqs
subroutine leq_isweep(I, Vname, VAR, A_M, B_M)
subroutine leq_msolve(VNAME, B_m, A_M, Var, CMETHOD)
character(len=4), dimension(dim_eqs) leq_sweep
subroutine leq_msolve0(VNAME, B_m, A_M, Var, CMETHOD)
subroutine leq_jksweep(J, K, Vname, VAR, A_M, B_M)
subroutine leq_ijsweep(I, J, Vname, VAR, A_M, B_M)
subroutine mfix_exit(myID, normal_termination)
integer, dimension(dim_eqs) leq_it
logical, dimension(:,:,:), allocatable dead_cell_at
double precision function dot_product_par(r1, r2)
integer, dimension(6, max_class) increment_for_mp
double precision function, dimension(2) dot_product_par2(r1, r2, r3, r4)
subroutine dgtsv(N, NRHS, DL, D, DU, B, LDB, INFO)
double precision, dimension(dim_eqs) leq_tol
integer, parameter unit_log
integer, dimension(:), allocatable imap_c
subroutine report_solver_stats(TNIT, STEPS)
subroutine leq_msolve1(VNAME, B_m, A_M, Var, CMETHOD)
logical minimize_dotproducts
logical use_corecell_loop
logical, dimension(:), allocatable interior_cell_at
character(len=line_length), dimension(line_count) err_msg
integer, dimension(dim_eqs) leq_method
logical solver_statistics
double precision, parameter zero
subroutine flush_err_msg(DEBUG, HEADER, FOOTER, ABORT, LOG, CALL_TREE)
integer, dimension(:), allocatable cell_class
character(len=4), dimension(dim_eqs) leq_pc