summaryrefslogtreecommitdiff
path: root/Trivac/src/TRIASD.f
blob: 73c29f5dc645b848cf99b909aa66f64fa5b7ab05 (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
126
127
128
129
130
131
132
133
134
135
136
*DECK TRIASD
      SUBROUTINE TRIASD (MAXKN,IELEM,ICHX,IDIM,IR,NEL,NUN,SGD,VOL,MAT,
     1 KN,VEC)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Assembly of a diagonal system matrix corresponding to a single cross
* section type (Thomas-Raviart dual cases). Note: vector VEC should be
* initialized by the calling program.
*
*Copyright:
* Copyright (C) 2002 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
* MAXKN   dimension of array KN.
* IELEM   degree of the Lagrangian finite elements.
* ICHX    type of discretization method:
*         =2: dual finite element approximations;
*         =3: nodal collocation method with full tensorial products;
*         =4: nodal collocation method with serendipity approximation.
* IDIM    number of dimensions.
* IR      maximum number of material mixtures.
* NEL     total number of finite elements.
* NUN     total number of unknowns per group.
* SGD     cross section per material mixture.
* VOL     volumes.
* MAT     index-number of the mixture type assigned to each volume.
* KN      element-ordered unknown list.
*
*Parameters: output
* VEC     diagonal system matrix.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER MAXKN,IELEM,ICHX,IDIM,IR,NEL,NUN,MAT(NEL),KN(MAXKN)
      REAL SGD(IR),VOL(NEL),VEC(NUN)
*----
*  LOCAL VARIABLES
*----
      INTEGER, DIMENSION(:), ALLOCATABLE :: IGAR
*
      IORD(J,K,L,LL,IEL,IW)=(IEL*L+K)*LL*IEL+(1+IEL*(IW-1))+J
      IORL(J,K,L,LL,IEL,IW)=
     1 1+LL*(L*(IEL*(IEL+1))/2-(L*(L-1)*(3*IEL-L+2))/6
     2 +K*(IEL-L)-(K*(K-1))/2)+(IEL-K-L)*(IW-1)+J
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(IGAR(NEL))
*
      IF(ICHX.EQ.2) THEN
*        DUAL FINITE ELEMENT METHOD.
         NUM1=0
         DO 30 K=1,NEL
         L=MAT(K)
         IF(L.EQ.0) GO TO 30
         VOL0=VOL(K)
         IF(VOL0.EQ.0.0) GO TO 20
         DO 12 K3=0,IELEM-1
         DO 11 K2=0,IELEM-1
         DO 10 K1=0,IELEM-1
         IND1=KN(NUM1+1)+(K3*IELEM+K2)*IELEM+K1
         VEC(IND1)=VEC(IND1)+VOL0*SGD(L)
   10    CONTINUE
   11    CONTINUE
   12    CONTINUE
   20    NUM1=NUM1+1+6*IELEM**2
   30    CONTINUE
      ELSE IF(ICHX.EQ.3) THEN
*        NODAL COLLOCATION METHOD WITH FULL TENSORIAL PRODUCTS.
         LNUN=0
         DO 40 K=1,NEL
         IF(MAT(K).EQ.0) GO TO 40
         LNUN=LNUN+1
         IGAR(K)=LNUN
   40    CONTINUE
*
         DO 70 K=1,NEL
         L=MAT(K)
         IF(L.EQ.0) GO TO 70
         VOL0=VOL(K)
         IF(VOL0.EQ.0.0) GO TO 70
         DO 65 I3=0,IELEM-1
         DO 60 I2=0,IELEM-1
         DO 50 I1=0,IELEM-1
         INX1=IORD(I1,I2,I3,LNUN,IELEM,IGAR(K))
         VEC(INX1)=VEC(INX1)+SGD(L)*VOL0
   50    CONTINUE
         IF((IDIM.EQ.1).AND.(I2.EQ.0)) GO TO 70
         IF((IDIM.EQ.2).AND.(I2.EQ.IELEM-1)) GO TO 70
   60    CONTINUE
   65    CONTINUE
   70    CONTINUE
      ELSE IF(ICHX.EQ.4) THEN
*        NODAL COLLOCATION METHOD WITH SERENDIPITY APPROXIMATION.
         LNUN=0
         DO 80 K=1,NEL
         IF(MAT(K).EQ.0) GO TO 80
         LNUN=LNUN+1
         IGAR(K)=LNUN
   80    CONTINUE
*
         DO 110 K=1,NEL
         L=MAT(K)
         IF(L.EQ.0) GO TO 110
         VOL0=VOL(K)
         IF(VOL0.EQ.0.0) GO TO 110
         DO 105 I3=0,IELEM-1
         DO 100 I2=0,IELEM-1-I3
         DO 90 I1=0,IELEM-1-I2-I3
         INX1=IORL(I1,I2,I3,LNUN,IELEM,IGAR(K))
         VEC(INX1)=VEC(INX1)+SGD(L)*VOL0
   90    CONTINUE
         IF((IDIM.EQ.1).AND.(I2.EQ.0)) GO TO 110
         IF((IDIM.EQ.2).AND.(I2.EQ.IELEM-1)) GO TO 110
  100    CONTINUE
  105    CONTINUE
  110    CONTINUE
      ENDIF
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(IGAR)
      RETURN
      END