32
33
34
36
37
38
39 USE spmd_comm_world_mod, ONLY : spmd_comm_world
40#include "implicit_f.inc"
41
42
43
44#include "com01_c.inc"
45#include "task_c.inc"
46#include "parit_c.inc"
47#include "scr02_c.inc"
48
49
50
51 INTEGER IAD_ELEM(2,*), FR_ELEM(*)
52 TYPE (NLOCAL_STR_) ,TARGET :: NLOC_DMG
53
54
55
56 INTEGER, DIMENSION(:), ALLOCATABLE :: COUNT,COUNT2
57 INTEGER P,J,TOTAL_NODES,NCOUNT,NOD,NN,NPOS,NDDL
58
59 INTEGER :: LSD,LRD,CC,LOC_PROC,KK
60
61
62
63
64
65
66
67
68
69 IF (ALLOCATED(nloc_dmg%IAD_ELEM)) DEALLOCATE (nloc_dmg%IAD_ELEM)
70 IF (ALLOCATED(nloc_dmg%IAD_SIZE)) DEALLOCATE (nloc_dmg%IAD_SIZE)
71 IF (ALLOCATED(nloc_dmg%FR_ELEM )) DEALLOCATE (nloc_dmg%FR_ELEM)
72
73
74 ALLOCATE(count(nspmd))
75 ALLOCATE(count2(nspmd))
76
77
78 count(1:nspmd) = 0
79 count2(1:nspmd) = 0
80 total_nodes = 0
81
82 kk = 1
83 IF (nodadt > 0) kk = 2
84
85
86 DO p=1,nspmd
87 DO j=iad_elem(1,p),iad_elem(1,p+1)-1
88 nod = fr_elem(j)
89 nn = nloc_dmg%IDXI(nod)
90 IF (nloc_dmg%IDXI(nod) > 0)
THEN !
If the node belongs to
the subset
91 npos = nloc_dmg%POSI(nn)
92 nddl = nloc_dmg%POSI(nn+1) - npos
93 count(p) = count(p) +1
94 count2(p)= count2(p)+kk*nddl
95 ENDIF
96 ENDDO
97 total_nodes = total_nodes + count(p)
98 ENDDO
99
100
101 ALLOCATE(nloc_dmg%IAD_ELEM(nspmd+1))
102 ALLOCATE(nloc_dmg%IAD_SIZE(nspmd+1))
103 ALLOCATE(nloc_dmg%FR_ELEM(total_nodes))
104
105
106 nloc_dmg%IAD_ELEM(1) = 1
107 nloc_dmg%IAD_SIZE(1) = 1
108
109
110 DO p=2,nspmd+1
111 nloc_dmg%IAD_ELEM(p) = nloc_dmg%IAD_ELEM(p-1) + count(p-1)
112 nloc_dmg%IAD_SIZE(p) = nloc_dmg%IAD_SIZE(p-1) + count2(p-1)
113 ENDDO
114
115
116 ncount=0
117
118 DO p=1,nspmd
119 DO j=iad_elem(1,p),iad_elem(1,p+1)-1
120 nod = fr_elem(j)
121 nn = nloc_dmg%IDXI(nod)
122 IF (nn > 0)THEN
123 ncount = ncount+1
124 nloc_dmg%FR_ELEM(ncount) = nn
125 ENDIF
126 ENDDO
127 ENDDO
128
129
130
131
132
133 IF (ALLOCATED(count)) DEALLOCATE(count)
134 IF (ALLOCATED(count2)) DEALLOCATE(count2)
135
136
137
138
139 IF(iparit==1)THEN
140
141
142 lsd = 0
143 lrd = 0
144 loc_proc = ispmd + 1
145 DO p=1,nspmd
146 DO j=nloc_dmg%IAD_ELEM(p),nloc_dmg%IAD_ELEM(p+1)-1
147 nn = nloc_dmg%FR_ELEM(j)
148 nddl = nloc_dmg%POSI(nn+1) - nloc_dmg%POSI(nn)
149 DO cc = nloc_dmg%ADDCNE(nn),nloc_dmg%ADDCNE(nn+1)-1
150 IF( nloc_dmg%PROCNE(cc)==loc_proc)THEN
151 lsd=lsd+1
152 ELSEIF(nloc_dmg%PROCNE(cc)==p) THEN
153 lrd=lrd+1
154 ENDIF
155
156 ENDDO
157 ENDDO
158 ENDDO
159
160
161 ALLOCATE( nloc_dmg%ISENDSP(lsd) )
162 ALLOCATE( nloc_dmg%IRECSP(lrd) )
163 nloc_dmg%ISENDSP(1:lsd) = 0
164 nloc_dmg%IRECSP(1:lrd) = 0
165
166
167
168 IF( .NOT.ALLOCATED( nloc_dmg%IADSDP ) ) ALLOCATE( nloc_dmg%IADSDP(nspmd+1) )
169 IF( .NOT.ALLOCATED( nloc_dmg%IADRCP ) ) ALLOCATE( nloc_dmg%IADRCP(nspmd+1) )
170 IF( .NOT.ALLOCATED( nloc_dmg%FR_NBCC ) ) ALLOCATE( nloc_dmg%FR_NBCC(2,nspmd
171
172 IF( .NOT.ALLOCATED( nloc_dmg%FR_ELEM_S ) ) ALLOCATE( nloc_dmg%FR_ELEM_S(lsd) )
173 IF( .NOT.ALLOCATED( nloc_dmg%FR_ELEM_R ) ) ALLOCATE( nloc_dmg%FR_ELEM_R(lrd) )
174 nloc_dmg%FR_ELEM_S(1:lsd) = 0
175 nloc_dmg%FR_ELEM_R(1:lrd) = 0
176
177 nloc_dmg%IADSDP(1:nspmd+1) = 0
178 nloc_dmg%IADRCP(1:nspmd+1) = 0
179 nloc_dmg%FR_NBCC(1:2,1:nspmd+1) = 0
180
181 lsd = 1
182 lrd = 1
183 loc_proc = ispmd + 1
184 DO p=1,nspmd
185 nloc_dmg%IADSDP(p)=lsd
186 nloc_dmg%IADRCP(p)=lrd
187
188 DO j=nloc_dmg%IAD_ELEM(p),nloc_dmg%IAD_ELEM(p+1)-1
189 nn = nloc_dmg%FR_ELEM(j)
190 nddl = nloc_dmg%POSI(nn+1) - nloc_dmg%POSI
191
192 DO cc = nloc_dmg%ADDCNE(nn),nloc_dmg%ADDCNE(nn+1)-1
193 IF( nloc_dmg%PROCNE(cc)==loc_proc)THEN
194 nloc_dmg%FR_NBCC(1,p) = nloc_dmg%FR_NBCC(1,p)+kk*nddl
195 nloc_dmg%ISENDSP(lsd)=cc
196 nloc_dmg%FR_ELEM_S(lsd)=nn
197 lsd=lsd+1
198 ELSEIF(nloc_dmg%PROCNE(cc)==p) THEN
199 nloc_dmg%FR_NBCC(2,p) = nloc_dmg%FR_NBCC(2,p)+kk*nddl
200 nloc_dmg%IRECSP(lrd)=cc
201 nloc_dmg%FR_ELEM_R(lrd)=nn
202 lrd=lrd+1
203 ENDIF
204
205 ENDDO
206 ENDDO
207 ENDDO
208
209 nloc_dmg%FR_NBCC(1:2,nspmd+1) = 0
210 DO j=1,nspmd
211 nloc_dmg%FR_NBCC(1,nspmd+1) = nloc_dmg%FR_NBCC(1,nspmd+1) + nloc_dmg%FR_NBCC(1,j)
212 nloc_dmg%FR_NBCC(2,nspmd+1) = nloc_dmg%FR_NBCC(2,nspmd+1) + nloc_dmg%FR_NBCC(2,j)
213 ENDDO
214
215 nloc_dmg%IADSDP(nspmd+1)=lsd
216 nloc_dmg%IADRCP(nspmd+1)=lrd
217 ENDIF
end diagonal values have been computed in the(sparse) matrix id.SOL