35
36
37
39 USE my_alloc_mod
40
41
42
43#include "implicit_f.inc"
44#include "com01_c.inc"
45#include "com04_c.inc"
46#include "r2r_c.inc"
47
48
49
50 INTEGER , INTENT(IN) :: NUMNOD_L, (*), CEP(*),
51 . IXS(NIXS,*),PROC,IXC(NIXC,*),
52 . IXTG(NIXTG,*),NUMELS_L,NUMELC_L,
53 . NUMELTG_L
54 INTEGER , DIMENSION(NUMNOD_L) , INTENT(IN) :: NODGLOB
55 INTEGER , DIMENSION(NUMNOD) , INTENT(IN) :: NODLOC
56 TYPE (NLOCAL_STR_) :: NLOC_DMG
57
58
59
60 INTEGER ,ILOC,NNOD,NNOD_L,NG,NL,NN, LNLOC_L,ND,NP,NM,N1,
61 . N2,NNO,CC,CC_L,NUMG,NUML,PROC_L,K,SHFT,TESTVAL,
62 . L_NLOC,NDDMAX_L,OFF,LENBIS,LCNENL_L,MATSIZE
63 INTEGER, DIMENSION(:),ALLOCATABLE :: INDX_L, NDDL, IDXI_L
64 INTEGER, DIMENSION(:),ALLOCATABLE :: POSI
65 my_real,
DIMENSION(NLOC_DMG%L_NLOC) :: mass,unl,mass0
66 my_real,
DIMENSION(:),
ALLOCATABLE :: zero_vec
67 INTEGER, DIMENSION(8) :: HEAD
68 INTEGER, DIMENSION(:), ALLOCATABLE :: ADDCNE_L,SOLTAG,SHTAG,TGTAG,
69 . PROCNE_L
70 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IADS,IADC,IADTG
71
72 CALL my_alloc(indx_l,numnod_l)
73 CALL my_alloc(nddl,numnod_l)
74 CALL my_alloc(idxi_l,numnod_l)
75 CALL my_alloc(posi,numnod_l+1)
76
77
78 lcnenl_l = 0
79 iloc = nloc_dmg%IMOD
80
81
82 IF (iloc == 0) THEN
83 head(1:8) = 0
85
86
87 ELSE
88
89
90 nnod = nloc_dmg%NNOD
91 l_nloc = nloc_dmg%L_NLOC
92
93 nnod_l = 0
94 lnloc_l = 0
95
96 indx_l(1:numnod_l) = 0
97 idxi_l(1:numnod_l) = 0
98 nddl(1:numnod_l) = 0
99 posi(1:numnod_l+1) = 0
100 mass(1:nloc_dmg%L_NLOC) = zero
101 mass0(1:nloc_dmg%L_NLOC) = zero
102 unl(1:nloc_dmg%L_NLOC) = zero
103
104
107 nn = nloc_dmg%IDXI(ng)
108 IF (nn > 0) THEN
109 np = nloc_dmg%POSI(nn)
110 nd = nloc_dmg%POSI(nn+1) - np
111 nnod_l = nnod_l + 1
114 nddl(nnod_l) = nd
115 posi(nnod_l) = lnloc_l + 1
116 mass(lnloc_l+1:lnloc_l+nd) = nloc_dmg%MASS(np:np+nd-1)
117 mass0(lnloc_l+1:lnloc_l+nd) = nloc_dmg%MASS0(np:np+nd-1)
118 unl(lnloc_l+1:lnloc_l+nd) = nloc_dmg%UNL(np:np+nd-1)
119 lnloc_l = lnloc_l + nd
120 ENDIF
121 ENDDO
122 posi(nnod_l + 1) = lnloc_l + 1
123
124 nddmax_l = maxval(nddl(1:nnod_l))
125
126
127 IF (ipari0 == 1) THEN
128
129
130 lcnenl_l = 0
131 DO i = 1, nnod_l
134 nn = nloc_dmg%IDXI(ng)
135 n1 = nloc_dmg%ADDCNE(nn)
136 n2 = nloc_dmg%ADDCNE(nn+1)
137 lcnenl_l = lcnenl_l + n2-n1
138 ENDDO
139
140
141 ALLOCATE(addcne_l(nnod_l + 1))
142 addcne_l(1:nnod_l + 1) = 0
143 ALLOCATE(procne_l(lcnenl_l))
144 procne_l(1:lcnenl_l) = 0
145 ALLOCATE(iads(8,numels_l))
146 iads(1:8,1:numels_l) = 0
147 ALLOCATE(iadc(4,numelc_l))
148 iadc(1:4,1:numelc_l) = 0
149 ALLOCATE(iadtg(3,numeltg_l))
150 iadtg(1:3,1:numeltg_l) = 0
151 ALLOCATE(soltag(numels))
152 soltag(1:numels) = 0
153 ALLOCATE(shtag(numelc))
154 shtag(1:numelc) = 0
155 ALLOCATE(tgtag(numeltg))
156 tgtag(1:numeltg) = 0
157
158
159 addcne_l(1) = 1
160 cc_l = 0
161
162
163 DO i = 1, nnod_l
166 nn = nloc_dmg%IDXI(ng)
167 n1 = nloc_dmg%ADDCNE(nn)
168 n2 = nloc_dmg%ADDCNE(nn+1)
169 addcne_l(i+1) = addcne_l(i) + n2-n1
170 DO cc = n1,n2-1
171 numg = nloc_dmg%CNE(cc)
172 numl = cel(numg)
173 proc_l = cep(numg)+1
174 cc_l = cc_l + 1
175 procne_l(cc_l) = proc_l
176 IF (proc==proc_l) THEN
177 IF (numg<=numels) THEN
178 DO k = 1,8
179 shft = ishft(1,k-1)
180 testval = iand(soltag(numg),shft)
181 IF (ixs(k+1,numg)==ng.AND.testval==0) THEN
182 iads(k,numl) = cc_l
183 soltag(numg) = soltag(numg)+shft
184 ENDIF
185 ENDDO
186 ELSEIF (numg<=numels+numelq) THEN
187
188 WRITE(*,*) "Error in non-local decomp"
189 WRITE(*,*) "Quad element error"
190 stop
191 ELSEIF (numg<=numels+numelq+numelc) THEN
192 numg = numg - (numels+numelq)
193 DO k=1,4
194 shft = ishft(1,k-1)
195 testval = iand(shtag(numg),shft)
196
197 IF (ixc(k+1,numg)==ng.AND.testval==0) THEN
198 iadc(k,numl) = cc_l
199 shtag(numg) = shtag(numg)+shft
200 ENDIF
201 ENDDO
202 ELSEIF (numg<=numels+numelq+numelc+numelt) THEN
203
204 WRITE(*,*) "Error in non-local decomp"
205 WRITE(*,*) "Truss element error"
206 stop
207 ELSEIF (numg<=numels+numelq+numelc+numelt+numelp) THEN
208
209 WRITE(*,*) "Error in non-local decomp"
210 WRITE(*,*) "Poutre element error"
211 stop
212 ELSEIF (numg<=numels+numelq+numelc+numelt+numelp+numelr) THEN
213
214 WRITE(*,*) "Error in non-local decomp"
215 WRITE(*,*) "Ressort element error"
216 stop
217 ELSEIF (numg<=numels+numelq+numelc+numelt+numelp+
218 . numelr+numeltg) THEN
219 numg = numg - (numels+numelq+numelc+numelt+numelp+numelr)
220 DO k=1,3
221 shft = ishft(1,k-1)
222 testval = iand(tgtag(numg),shft)
223 IF (ixtg(k+1,numg)==ng.AND.testval==0) THEN
224 iadtg(k,numl) = cc_l
225 tgtag(numg) = tgtag(numg)+shft
226 ENDIF
227 ENDDO
228 ELSE
229
230 WRITE(*,*) "Error in non-local decomp"
231 stop
232 ENDIF
233 ENDIF
234 ENDDO
235 ENDDO
236 ENDIF
237
238 head(1) = iloc
239 head(2) = nnod_l
240 head(3) = lnloc_l
241 head(4) = numels_l
242 head(5) = numelc_l
243 head(6) = numeltg_l
244 head(7) = nddmax_l
245 head(8) = lcnenl_l
246
247 IF (nsubdom > 0) THEN
248
249 matsize = nummat0
250 ELSE
251 matsize = nummat
252 ENDIF
253
255
256 CALL write_db(nloc_dmg%DENS,matsize)
257
258 CALL write_db(nloc_dmg%DAMP,matsize)
259
261
262 CALL write_db(nloc_dmg%LE_MAX,matsize)
263
264 CALL write_db(nloc_dmg%SSPNL,matsize)
265
266 CALL write_i_c(indx_l,nnod_l) ! indx_l(nnod_l)
267
269
271
272
273 IF (ipari0 == 1) THEN
274
276
278
280
282
284
285 ENDIF
286
288
290
291 IF (.NOT.ALLOCATED(zero_vec)) ALLOCATE(zero_vec(4*lnloc_l))
292 zero_vec(1:4*lnloc_l) = zero
294
296
297
298 IF (ALLOCATED(soltag)) DEALLOCATE(soltag)
299 IF (ALLOCATED(shtag)) DEALLOCATE(shtag)
300 IF (ALLOCATED(tgtag)) DEALLOCATE(tgtag)
301 IF (ALLOCATED(addcne_l)) DEALLOCATE(addcne_l)
302 IF (ALLOCATED(procne_l)) DEALLOCATE(procne_l)
303 IF (ALLOCATED(iads)) DEALLOCATE(iads)
304 IF (ALLOCATED(iadc)) DEALLOCATE(iadc)
305 IF (ALLOCATED(iadtg)) DEALLOCATE(iadtg)
306 IF (ALLOCATED(zero_vec)) DEALLOCATE(zero_vec)
307
308 DEALLOCATE(indx_l)
309 DEALLOCATE(nddl)
310 DEALLOCATE(idxi_l)
311 DEALLOCATE(posi)
312 ENDIF
313
314 RETURN
character *2 function nl()
subroutine write_db(a, n)
void write_i_c(int *w, int *len)