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