1*59599516SKenneth E. Jansen subroutine i3LU (Diag, r, code) 2*59599516SKenneth E. Jansenc 3*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 4*59599516SKenneth E. Jansenc 5*59599516SKenneth E. Jansenc This routine performs a LU factorization/solve of a set of matrices, 6*59599516SKenneth E. Jansenc used for block diagonal preconditioning in the iterative driver. 7*59599516SKenneth E. Jansen 8*59599516SKenneth E. Jansenc input: 9*59599516SKenneth E. Jansenc Diag (nshg,nflow,nflow) : block diagonal (symmetric storage) 10*59599516SKenneth E. Jansenc r (nshg,nflow) : residual 11*59599516SKenneth E. Jansenc code : operation code 12*59599516SKenneth E. Jansenc .eq. 'LU_Fact ', Cholesky Factor 13*59599516SKenneth E. Jansenc .eq. 'forward ', forward reduction 14*59599516SKenneth E. Jansenc .eq. 'backward', backward substitution 15*59599516SKenneth E. Jansenc .eq. 'product ', product Diag.r 16*59599516SKenneth E. Jansenc 17*59599516SKenneth E. Jansenc output: 18*59599516SKenneth E. Jansenc Diag (nshg,nflow,nflow) : LU decomp. of block diagonal 19*59599516SKenneth E. Jansenc r (nshg,nflow) : reduced residual 20*59599516SKenneth E. Jansenc 21*59599516SKenneth E. Jansenc 22*59599516SKenneth E. Jansenc Note: the formulation used here is taken from Golub's "Matrix 23*59599516SKenneth E. Jansenc Computations" Book (1984), pages 82-85 algorithm P5.1-3. 24*59599516SKenneth E. Jansenc 25*59599516SKenneth E. Jansenc L and U overwrite Diag 26*59599516SKenneth E. Jansenc 27*59599516SKenneth E. Jansenc The diagonal terms (i,i) of U are stored in inverted form. 28*59599516SKenneth E. Jansenc 29*59599516SKenneth E. Jansenc 30*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 31*59599516SKenneth E. Jansenc 32*59599516SKenneth E. Jansen include "common.h" 33*59599516SKenneth E. Jansenc 34*59599516SKenneth E. Jansen dimension Diag(nshg,nflow,nflow), r(nshg,nflow) 35*59599516SKenneth E. Jansenc 36*59599516SKenneth E. Jansen character*8 code 37*59599516SKenneth E. Jansen 38*59599516SKenneth E. Jansenc 39*59599516SKenneth E. Jansenc.... perform LU decomposition with the Diagonal terms inverted 40*59599516SKenneth E. Jansenc 41*59599516SKenneth E. Jansen if (code .eq. 'LU_Fact ') then 42*59599516SKenneth E. Jansenc 43*59599516SKenneth E. Jansen Diag(:,1,1) = one / Diag(:,1,1) 44*59599516SKenneth E. Jansenc 45*59599516SKenneth E. Jansen Diag(:,2,1) = Diag(:,1,1) * Diag(:,2,1) 46*59599516SKenneth E. Jansen Diag(:,3,1) = Diag(:,1,1) * Diag(:,3,1) 47*59599516SKenneth E. Jansen Diag(:,4,1) = Diag(:,1,1) * Diag(:,4,1) 48*59599516SKenneth E. Jansen Diag(:,5,1) = Diag(:,1,1) * Diag(:,5,1) 49*59599516SKenneth E. Jansenc 50*59599516SKenneth E. Jansen Diag(:,2,2) = Diag(:,2,2) - Diag(:,2,1) * Diag(:,1,2) 51*59599516SKenneth E. Jansen Diag(:,2,3) = Diag(:,2,3) - Diag(:,2,1) * Diag(:,1,3) 52*59599516SKenneth E. Jansen Diag(:,2,4) = Diag(:,2,4) - Diag(:,2,1) * Diag(:,1,4) 53*59599516SKenneth E. Jansen Diag(:,2,5) = Diag(:,2,5) - Diag(:,2,1) * Diag(:,1,5) 54*59599516SKenneth E. Jansen Diag(:,2,2) = one / Diag(:,2,2) 55*59599516SKenneth E. Jansenc 56*59599516SKenneth E. Jansen Diag(:,3,2) = Diag(:,2,2)*(Diag(:,3,2) 57*59599516SKenneth E. Jansen & - Diag(:,3,1) * Diag(:,1,2)) 58*59599516SKenneth E. Jansen Diag(:,4,2) = Diag(:,2,2)*(Diag(:,4,2) 59*59599516SKenneth E. Jansen & - Diag(:,4,1) * Diag(:,1,2)) 60*59599516SKenneth E. Jansen Diag(:,5,2) = Diag(:,2,2)*(Diag(:,5,2) 61*59599516SKenneth E. Jansen & - Diag(:,5,1) * Diag(:,1,2)) 62*59599516SKenneth E. Jansenc 63*59599516SKenneth E. Jansen 64*59599516SKenneth E. Jansen Diag(:,3,3) = Diag(:,3,3) - Diag(:,3,1) * Diag(:,1,3) 65*59599516SKenneth E. Jansen & - Diag(:,3,2) * Diag(:,2,3) 66*59599516SKenneth E. Jansen Diag(:,3,4) = Diag(:,3,4) - Diag(:,3,1) * Diag(:,1,4) 67*59599516SKenneth E. Jansen & - Diag(:,3,2) * Diag(:,2,4) 68*59599516SKenneth E. Jansen Diag(:,3,5) = Diag(:,3,5) - Diag(:,3,1) * Diag(:,1,5) 69*59599516SKenneth E. Jansen & - Diag(:,3,2) * Diag(:,2,5) 70*59599516SKenneth E. Jansen Diag(:,3,3) = one / Diag(:,3,3) 71*59599516SKenneth E. Jansenc 72*59599516SKenneth E. Jansen Diag(:,4,3) = Diag(:,3,3) *(Diag(:,4,3) 73*59599516SKenneth E. Jansen & - Diag(:,4,1) * Diag(:,1,3) 74*59599516SKenneth E. Jansen & - Diag(:,4,2) * Diag(:,2,3)) 75*59599516SKenneth E. Jansen Diag(:,5,3) = Diag(:,3,3) *(Diag(:,5,3) 76*59599516SKenneth E. Jansen & - Diag(:,5,1) * Diag(:,1,3) 77*59599516SKenneth E. Jansen & - Diag(:,5,2) * Diag(:,2,3)) 78*59599516SKenneth E. Jansenc 79*59599516SKenneth E. Jansen Diag(:,4,4) = Diag(:,4,4) - Diag(:,4,1) * Diag(:,1,4) 80*59599516SKenneth E. Jansen & - Diag(:,4,2) * Diag(:,2,4) 81*59599516SKenneth E. Jansen & - Diag(:,4,3) * Diag(:,3,4) 82*59599516SKenneth E. Jansen Diag(:,4,4) = one / Diag(:,4,4) 83*59599516SKenneth E. Jansenc 84*59599516SKenneth E. Jansen Diag(:,5,4) = Diag(:,4,4) *(Diag(:,5,4) 85*59599516SKenneth E. Jansen & - Diag(:,5,1) * Diag(:,1,4) 86*59599516SKenneth E. Jansen & - Diag(:,5,2) * Diag(:,2,4) 87*59599516SKenneth E. Jansen & - Diag(:,5,3) * Diag(:,3,4)) 88*59599516SKenneth E. Jansenc 89*59599516SKenneth E. Jansen Diag(:,5,5) = Diag(:,5,5) - Diag(:,5,1) * Diag(:,1,5) 90*59599516SKenneth E. Jansen & - Diag(:,5,2) * Diag(:,2,5) 91*59599516SKenneth E. Jansen & - Diag(:,5,3) * Diag(:,3,5) 92*59599516SKenneth E. Jansen & - Diag(:,5,4) * Diag(:,4,5) 93*59599516SKenneth E. Jansen Diag(:,5,5) = one / Diag(:,5,5) 94*59599516SKenneth E. Jansenc 95*59599516SKenneth E. Jansenc INACCURATE NOW flops = flops + 110*nshg 96*59599516SKenneth E. Jansenc 97*59599516SKenneth E. Jansen return 98*59599516SKenneth E. Jansen endif 99*59599516SKenneth E. Jansenc 100*59599516SKenneth E. Jansenc.... perform forward reduction 101*59599516SKenneth E. Jansenc 102*59599516SKenneth E. Jansen if (code .eq. 'forward ') then 103*59599516SKenneth E. Jansenc 104*59599516SKenneth E. Jansenc r(:,1) = r(:,1) !no-op 105*59599516SKenneth E. Jansen r(:,2) = r(:,2) - Diag(:,2,1) * r(:,1) 106*59599516SKenneth E. Jansen r(:,3) = r(:,3) - Diag(:,3,1) * r(:,1) 107*59599516SKenneth E. Jansen & - Diag(:,3,2) * r(:,2) 108*59599516SKenneth E. Jansen r(:,4) = r(:,4) - Diag(:,4,1) * r(:,1) 109*59599516SKenneth E. Jansen & - Diag(:,4,2) * r(:,2) 110*59599516SKenneth E. Jansen & - Diag(:,4,3) * r(:,3) 111*59599516SKenneth E. Jansen r(:,5) = r(:,5) - Diag(:,5,1) * r(:,1) 112*59599516SKenneth E. Jansen & - Diag(:,5,2) * r(:,2) 113*59599516SKenneth E. Jansen & - Diag(:,5,3) * r(:,3) 114*59599516SKenneth E. Jansen & - Diag(:,5,4) * r(:,4) 115*59599516SKenneth E. Jansenc 116*59599516SKenneth E. Jansenc.... flop count 117*59599516SKenneth E. Jansenc 118*59599516SKenneth E. Jansenc INACCURATE flops = flops + 25*nshg 119*59599516SKenneth E. Jansenc 120*59599516SKenneth E. Jansen return 121*59599516SKenneth E. Jansen endif 122*59599516SKenneth E. Jansenc 123*59599516SKenneth E. Jansenc.... perform backward substitution 124*59599516SKenneth E. Jansenc 125*59599516SKenneth E. Jansen if (code .eq. 'backward') then 126*59599516SKenneth E. Jansenc 127*59599516SKenneth E. Jansen r(:,5) = Diag(:,5,5) * r(:,5) 128*59599516SKenneth E. Jansen r(:,4) = Diag(:,4,4) * ( r(:,4) 129*59599516SKenneth E. Jansen & - r(:,5) * Diag(:,4,5) ) 130*59599516SKenneth E. Jansen r(:,3) = Diag(:,3,3) * ( r(:,3) 131*59599516SKenneth E. Jansen & - r(:,5) * Diag(:,3,5) 132*59599516SKenneth E. Jansen & - r(:,4) * Diag(:,3,4) ) 133*59599516SKenneth E. Jansen r(:,2) = Diag(:,2,2) * ( r(:,2) 134*59599516SKenneth E. Jansen & - r(:,5) * Diag(:,2,5) 135*59599516SKenneth E. Jansen & - r(:,4) * Diag(:,2,4) 136*59599516SKenneth E. Jansen & - r(:,3) * Diag(:,2,3) ) 137*59599516SKenneth E. Jansen r(:,1) = Diag(:,1,1) * ( r(:,1) 138*59599516SKenneth E. Jansen & - r(:,5) * Diag(:,1,5) 139*59599516SKenneth E. Jansen & - r(:,4) * Diag(:,1,4) 140*59599516SKenneth E. Jansen & - r(:,3) * Diag(:,1,3) 141*59599516SKenneth E. Jansen & - r(:,2) * Diag(:,1,2) ) 142*59599516SKenneth E. Jansenc 143*59599516SKenneth E. Jansenc.... flop count 144*59599516SKenneth E. Jansenc 145*59599516SKenneth E. Jansen flops = flops + 25*nshg 146*59599516SKenneth E. Jansen 147*59599516SKenneth E. Jansen return 148*59599516SKenneth E. Jansen endif 149*59599516SKenneth E. Jansenc 150*59599516SKenneth E. Jansenc.... perform product U.r 151*59599516SKenneth E. Jansenc 152*59599516SKenneth E. Jansen if (code .eq. 'product ') then 153*59599516SKenneth E. Jansenc 154*59599516SKenneth E. Jansen r(:,1) = r(:,1) / Diag(:,1,1) + r(:,2) * Diag(:,1,2) + 155*59599516SKenneth E. Jansen & r(:,3) * Diag(:,1,3) + r(:,4) * Diag(:,1,4) + 156*59599516SKenneth E. Jansen & r(:,5) * Diag(:,1,5) 157*59599516SKenneth E. Jansen r(:,2) = r(:,2) / Diag(:,2,2) + 158*59599516SKenneth E. Jansen & r(:,3) * Diag(:,2,3) + r(:,4) * Diag(:,2,4) + 159*59599516SKenneth E. Jansen & r(:,5) * Diag(:,2,5) 160*59599516SKenneth E. Jansen r(:,3) = r(:,3) / Diag(:,3,3) + 161*59599516SKenneth E. Jansen & r(:,4) * Diag(:,3,4) + 162*59599516SKenneth E. Jansen & r(:,5) * Diag(:,3,5) 163*59599516SKenneth E. Jansen r(:,4) = r(:,4) / Diag(:,4,4) + 164*59599516SKenneth E. Jansen & r(:,5) * Diag(:,4,5) 165*59599516SKenneth E. Jansen r(:,5) = r(:,5) / Diag(:,5,5) 166*59599516SKenneth E. Jansenc 167*59599516SKenneth E. Jansenc.... flop count 168*59599516SKenneth E. Jansenc 169*59599516SKenneth E. Jansen flops = flops + 40*nshg 170*59599516SKenneth E. Jansen 171*59599516SKenneth E. Jansen return 172*59599516SKenneth E. Jansen endif 173*59599516SKenneth E. Jansenc 174*59599516SKenneth E. Jansen call error ('i3LU ', code, 0) 175*59599516SKenneth E. Jansenc 176*59599516SKenneth E. Jansenc.... return 177*59599516SKenneth E. Jansenc 178*59599516SKenneth E. Jansenc 179*59599516SKenneth E. Jansen111 format(5(e14.7,2x)) 180*59599516SKenneth E. Jansen return 181*59599516SKenneth E. Jansen end 182