summaryrefslogtreecommitdiff
path: root/Utilib/src/ALVDLM.f
blob: c619a0150055986bdc61810fc9b2a74d0375d1dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
*DECK ALVDLM
      SUBROUTINE ALVDLM (LTSW,ASS,VEC,Z,MU1,ITY,ISEG,LON,NBL,LBL)
*
*-----------------------------------------------------------------------
*
*Purpose:
* multiplication of a symmetric matrix in compressed diagonal storage
* mode by a vector. Supervectorial version.
*
*Copyright:
* Copyright (C) 1992 Ecole Polytechnique de Montreal
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version
*
*Author(s): A. Hebert
*
*Parameters: input
* LTSW    maximum bandwidth. =2 for tridiagonal systems.
* ASS     LDL(T) factors of the coefficient matrix in compressed
*         diagonal storage mode. DIMENSION ASS(ISEG,MU1(L4))
* VEC     vector to multiply.
* Z       vector that will be added to the result if ITY=2.
*         DIMENSION VEC(ISEG,L4),Z(ISEG,L4) WHERE L4=SUM(LBL(I))
* MU1     position of each diagonal element in vector ASS.
*         DIMENSION MU1(L4)
* ITY     type of multiplication (ITY=1: Z=ASS*VEC;
*         ITY=2: Z=Z+(ASS-DIAG(ASS))*VEC).
* ISEG    number of elements in a vector register.
* LON     number of groups of linear systems.
* NBL     number of linear systems in each group. DIMENSION NBL(LON)
* LBL     number of unknowns in each group. DIMENSION LBL(LON)
*
*Parameters: output
* Z       solution of the multiplication. DIMENSION Z(ISEG,L4)
*
*-----------------------------------------------------------------------
*
      DIMENSION ASS(ISEG,*),VEC(ISEG,*),Z(ISEG,*),MU1(*),NBL(*),LBL(*)
      LBL0=0
      IMAX=0
      DO 300 ILON=1,LON
      L4=LBL(ILON)
      NBANC=NBL(ILON)
      IF((LTSW.GT.2).AND.(ITY.EQ.1)) THEN
*        CALCULATION OF Z=ASS*VEC.
CDIR$ SHORTLOOP
         DO 30 IB=1,NBANC
         Z(IB,LBL0+1)=ASS(IB,MU1(LBL0+1))*VEC(IB,LBL0+1)
   30    CONTINUE
         I1=MU1(LBL0+1)+1
         DO 90 K=LBL0+2,LBL0+L4
         I2=MU1(K)
         KEY1=I2-K
CDIR$ SHORTLOOP
         DO 40 IB=1,NBANC
         Z(IB,K)=0.0
   40    CONTINUE
         DO 60 L=K+I1-I2,K-1
         KEYL=KEY1+L
CDIR$ SHORTLOOP
         DO 50 IB=1,NBANC
         Z(IB,K)=Z(IB,K)+ASS(IB,KEYL)*VEC(IB,L)
         Z(IB,L)=Z(IB,L)+ASS(IB,KEYL)*VEC(IB,K)
   50    CONTINUE
   60    CONTINUE
CDIR$ SHORTLOOP
         DO 80 IB=1,NBANC
         Z(IB,K)=Z(IB,K)+ASS(IB,KEY1+K)*VEC(IB,K)
   80    CONTINUE
         I1=I2+1
   90    CONTINUE
      ELSE IF((LTSW.GT.2).AND.(ITY.EQ.2)) THEN
*        CALCULATION OF Z=Z+(ASS-DIAG(ASS))*VEC.
         I1=MU1(LBL0+1)+1
         DO 150 K=LBL0+2,LBL0+L4
         I2=MU1(K)
         KEY1=I2-K
         IF(I1.EQ.I2) GO TO 150
         DO 130 L=K+I1-I2,K-1
         KEYL=KEY1+L
CDIR$ SHORTLOOP
         DO 120 IB=1,NBANC
         Z(IB,K)=Z(IB,K)+ASS(IB,KEYL)*VEC(IB,L)
         Z(IB,L)=Z(IB,L)+ASS(IB,KEYL)*VEC(IB,K)
  120    CONTINUE
  130    CONTINUE
         I1=I2+1
  150    CONTINUE
      ELSE IF((LTSW.EQ.2).AND.(ITY.EQ.1)) THEN
*        CALCULATION OF Z=ASS*VEC FOR A 3-DIAGONAL SYSTEM.
CDIR$ SHORTLOOP
         DO 180 IB=1,NBANC
         Z(IB,LBL0+1)=ASS(IB,IMAX+1)*VEC(IB,LBL0+1)
  180    CONTINUE
         I1=2
         DO 230 K=LBL0+2,LBL0+L4
         KEYL=IMAX+I1
CDIR$ SHORTLOOP
         DO 210 IB=1,NBANC
         Z(IB,K)=ASS(IB,KEYL)*VEC(IB,K-1)+ASS(IB,KEYL+1)*VEC(IB,K)
         Z(IB,K-1)=Z(IB,K-1)+ASS(IB,KEYL)*VEC(IB,K)
  210    CONTINUE
         I1=I1+2
  230    CONTINUE
         IMAX=IMAX+I1-1
      ELSE IF((LTSW.EQ.2).AND.(ITY.EQ.2)) THEN
*        CALCULATION OF Z=Z+(ASS-DIAG(ASS))*VEC FOR A 3-DIAGONAL SYSTEM.
         I1=2
         DO 280 K=LBL0+2,LBL0+L4
         KEYL=IMAX+I1
CDIR$ SHORTLOOP
         DO 260 IB=1,NBANC
         Z(IB,K)=Z(IB,K)+ASS(IB,KEYL)*VEC(IB,K-1)
         Z(IB,K-1)=Z(IB,K-1)+ASS(IB,KEYL)*VEC(IB,K)
  260    CONTINUE
         I1=I1+2
  280    CONTINUE
         IMAX=IMAX+I1-1
      ENDIF
      LBL0=LBL0+L4
  300 CONTINUE
      RETURN
      END