46
47
48
49#ifndef HYPERMESH_LIB
51#endif
53 USE format_mod , ONLY : fmt_i_3f
54 use element_mod , only :nixs
55
56
57
58
59#include "implicit_f.inc"
60
61
62
63#include "units_c.inc"
64#include "vect07_c.inc"
65#include "scr05_c.inc"
66#include "com04_c.inc"
67
68 INTEGER IWPENE,TAG(*),INACTI,NSV(*),NSN,MSEGTYP(*),IWPENE0,
69 . MVOISN(4,*),ILEV,KNOD2ELS(*),NOD2ELS(*),IPARTNS(*),NRTM
70
72 INTEGER IRECT(4,*), ITAB(*),CAND_E(*),CAND_N(*),IRTLM(2,*)
73 INTEGER IXS(NIXS,*),IXS10(6,*), IXS16(8,*), IXS20(12,*),ICONT_I(*),
74 . IRTSE(*) ,IS2SE(*)
75 my_real x(3,*),pmin(*),gap_n(12,*),penmax,penmin,pen_old(5,nsn),xfic(3,*)
76
77 INTEGER ID,IPEN0
78 CHARACTER(LEN=NCHARTITLE) :: TITR
79
80
81
82 INTEGER II, I, J, K, L, JJ, NJ, IER,NS,IC,I0,IELIM,NI,ICONN,ip,NS1,
83 . IDEL,NN1,NN2,IE
84
86 . pen, alp,xx(4),yy(4),zz(4),ssc,ttc,dist,dist0,
87 . xi,yi,zi,xc,yc,zc,nn(3),tol,pen0,dpen,
norm,maxpen
88
89
90
91
92
93
94 IF (iresp==1.AND.penmin<=em06) penmin = two*em06
95 tol = penmin
96 alp = two*em06
97 IF (iresp==1) alp = two*em05
98 DO i=lft,llt
99 l = cand_e(i)
100 ni = cand_n(i)
101 ns = nsv(ni)
102 IF (ns >numnod) THEN
103 ns1 = ns -numnod
104 xi=xfic(1,ns1)
105 yi=xfic(2,ns1)
106 zi=xfic(3,ns1)
107 ELSE
108 xi=x(1,ns)
109 yi=x(2,ns)
110 zi=x(3,ns)
111 END IF
112 DO jj=1,4
113 nj=irect(jj,l)
114 xx(jj)=x(1,nj)
115 yy(jj)=x(2,nj)
116 zz(jj)=x(3,nj)
117 END DO
118
119 CALL ini_st3(xx,yy,zz,xi,yi,zi,nn,ssc,ttc,ier,alp,
120 2 xc,yc,zc)
121 IF(ier==-1)THEN
122#ifndef HYPERMESH_LIB
124 . msgtype=msgerror,
125 . anmode=aninfo,
127 . c1=titr,
128 . i2=itab(ns),
129 . i3=l,
130 . i4=l,
131 . i5=itab(irect(1,l)),
132 . i6=itab(irect(2,l)),
133 . i7=itab(irect(3,l)),
134 . i8=itab(irect(4,l)))
135#endif
136
137 ELSE IF(ier==1.AND.(msegtyp(l)/=0.AND.msegtyp(l)<=nrtm))THEN
138
139
140
141
142 ELSE
143
144
145
146 pen0=nn(1)*(xi-xc)+nn(2)*(yi-yc)+nn(3)*(zi-zc)
147 IF(ier==1) THEN
148 dist = sqrt((xi-xc)*(xi-xc)+(yi-yc)*(yi-yc)+(zi-zc)*(zi-zc))
149 ELSE
150 dist = abs(pen0)
151 END IF
152
153 idel = 1
154
155 IF (msegtyp(l)/=0.AND.msegtyp(l)<=nrtm) THEN
156 pen=gapv(i)-abs(pen0)
157 IF (pen > penmax ) idel = 0
158
159 IF (pen > zero) dist = abs(gapv(i)-pen0)
160
161 IF (pen0 < zero .OR. pen > penmax) pen=-abs(pen)-tol
162
163 ELSE
164 pen=gapv(i)-pen0
165
166 IF(ier==1) pen=-abs(pen)-tol
167 IF (pen > zero .OR. abs(pen) < tol) THEN
168 maxpen = gap_n(1,l)
169 IF (inacti /= 0) maxpen = penmax
170 CALL i24penmax(pen,maxpen ,mvoisn(1,l),mvoisn(2,l),
171 + ns ,ixs, ixs10, ixs16, ixs20 ,
172 + ielim)
173 iconn = 0
174 IF (ns>numnod) THEN
176 4 nn2 )
177 CALL iconnet(irect(1,l),ixs ,knod2els,nod2els,
178 . ixs10 ,ixs16 ,ixs20 ,nn1 ,iconn )
179 IF (iconn == 0)
180 .
CALL iconnet(irect(1,l),ixs ,knod2els,nod2els,
181 . ixs10 ,ixs16 ,ixs20 ,nn2 ,iconn )
182 ELSE
183 CALL iconnet(irect(1,l),ixs ,knod2els,nod2els,
184 . ixs10 ,ixs16 ,ixs20 ,ns ,iconn )
185 END IF
186 IF ((ielim+iconn) > 0) pen = -abs(pen)-tol
187 IF (pen < zero ) idel = 0
188 END IF
189
190 IF (inacti/=0.AND.(pen > zero .OR. abs(pen) < tol).AND.ilev/=3) THEN
191 norm = nn(1)*pen_old(1,ni)+nn(2)*pen_old(2,ni)
192 + +nn(3)*pen_old(3,ni)
193 IF (
norm >= zero)
THEN
194 pen = -abs(pen)-tol
195
196 idel = 0
197 END IF
198 END IF
199 END IF
200
201 IF (ipen0==0) THEN
202 IF (inacti/=0.AND.(pen > zero .OR. abs(pen) < tol)) THEN
203 IF (ipartns(ni) == mvoisn(3,l)) THEN
204 pen = -abs(pen)-tol
205 END IF
206 END IF
207 END IF
208
209 IF (ipartns(ni) == mvoisn(3,l)) idel = 0
210
211 IF (gapv(i)>zero.AND.(msegtyp(l)==0.OR.msegtyp(l)>nrtm))idel=0
212
213
214
215 IF(abs(pen) < tol .OR. (pen<zero.AND.idel>0)) THEN
216
217 IF (tag(ns)==0) THEN
218 pmin(ni)=-dist
219 tag(ns)=ni
220 ELSE
221 i0=tag(ns)
222 pen0=pmin(i0)
223 IF (dist <abs(pen0)) THEN
224
225 pmin(ni)=-dist
226 tag(ns)=ni
227 IF (pen0 > zero) THEN
228
229 irtlm(1,i0)=0
230 irtlm(2,i0)=0
231 pen_old(5,i0)=zero
232 END IF
233 END IF
234 END IF
235 ELSEIF(pen > penmax) THEN
236
237#ifndef HYPERMESH_LIB
238 WRITE(iout,1200)pen
239#endif
240 ELSEIF(pen > zero) THEN
241
242 IF (tag(ns)==0) iwpene=iwpene+1
243
244 IF(inacti ==0 .OR. inacti ==1) THEN
245
246 IF (tag(ns)>0) THEN
247 i0=tag(ns)
248 pen0=pmin(i0)
249
250 IF (pen < pen0) THEN
251 icont_i(ni)=-l
252 pmin(ni)=pen
253 tag(ns) = ni
254#ifdef HYPERMESH_LIB
255 pen_old(1:3,ni) = nn(1:3)
256#endif
257 ENDIF
258 ELSE
259 icont_i(ni)=-l
260 pmin(ni)=pen
261 tag(ns) = ni
262#ifdef HYPERMESH_LIB
263 pen_old(1:3,ni) = nn
264#endif
265 END IF
266 ELSEIF(inacti ==-1) THEN
267
268 IF (tag(ns)>0) THEN
269 i0=tag(ns)
270 pen0=pmin(i0)
271 dist0 = abs(pmin(i0))
272 IF (dist < dist0) THEN
273 irtlm(1,ni)=l
274 irtlm(2,ni)=1
275 pmin(ni)=dist
276 pen_old(5,ni)=pen
277 tag(ns) = ni
278#ifdef HYPERMESH_LIB
279 pen_old(1:3,ni) = nn(1:3)
280#endif
281 ENDIF
282 ELSE
283 irtlm(1,ni)=l
284 irtlm(2,ni)=1
285 pmin(ni)=dist
286 pen_old(5,ni)=pen
287 tag(ns) = ni
288#ifdef HYPERMESH_LIB
289 pen_old(1:3,ni) = nn(1:3)
290#endif
291 END IF
292
293 ELSEIF(inacti ==3 ) THEN
294 IF (ilev ==3) THEN
295 dpen = pen + tol
296 ELSE
297 dpen = half*(pen + tol)
298 END IF
299
300 IF (tag(ns)==0) THEN
301 irtlm(1,ni)=l
302 irtlm(2,ni)=1
303 iwpene=iwpene+1
304 tag(ns)=ni
305#ifndef HYPERMESH_LIB
306 WRITE(iout,1000)pen
307#endif
308 IF (ns >numnod) THEN
309 ns1 = ns -numnod
310 xfic(1,ns1) = xi + dpen*nn(1)
311 xfic(2,ns1) = yi + dpen*nn(2)
312 xfic(3,ns1) = zi + dpen*nn(3)
313#ifndef HYPERMESH_LIB
314 WRITE(iout,fmt=fmt_i_3f)(itab(numnod)+ns1),xfic(1,ns1),xfic(2,ns1),xfic(3,ns1)
315#endif
316 ELSE
317 x(1,ns) = xi + dpen*nn(1)
318 x(2,ns) = yi + dpen*nn(2)
319 x(3,ns) = zi + dpen*nn(3)
320#ifndef HYPERMESH_LIB
321 WRITE(iout,fmt=fmt_i_3f)itab(ns),x(1,ns),x(2,ns),x(3,ns)
322#endif
323 END IF
324 END IF
325 ELSEIF(inacti ==5) THEN
326
327 IF (tag(ns)>0) THEN
328 i0=tag(ns)
329 pen0=pen_old(5,i0)
330 dist0 = abs(pmin(i0))
331 IF (dist < dist0) THEN
332 irtlm(1,ni)=l
333 irtlm(2,ni)=1
334 pen_old(5,ni)=pen
335 pmin(ni)=dist
336 tag(ns) = ni
337#ifdef HYPERMESH_LIB
338 pen_old(1:3,ni) = nn(1:3)
339#endif
340 ENDIF
341 ELSE
342 irtlm(1,ni)=l
343 irtlm(2,ni)=1
344 pen_old(5,ni)=pen
345 pmin(ni)=dist
346 tag(ns) = ni
347#ifdef HYPERMESH_LIB
348 pen_old(1:3,ni) = nn(1:3)
349#endif
350 END IF
351 END IF
352 END IF
353 END IF
354 END DO
355
356 RETURN
357 1000 FORMAT(2x,'** INITIAL PENETRATION =',1pg20.13,
358 . ' CHANGE COORDINATES OF SECONDARY NODE TO:')
359 1100 FORMAT(2x,'** INITIAL PENETRATION =',1pg20.13,
360 . ' CHANGE COORDINATES OF MAIN NODE TO:')
361 1200 FORMAT(2x,'** TOO HIGH INITIAL PENETRATION=, WILL BE IGNORED',
362 . 1pg20.13)
363
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB
subroutine i24fic_getn(ns, irtse, is2se, ie, ns1, ns2)
integer, parameter nchartitle
subroutine ini_st3(xx, yy, zz, xi, yi, zi, nn, ssc, ttc, ier, alp, xc, yc, zc)
subroutine i24penmax(pen, penmax, etyp, el, ns, ixs, ixs10, ixs16, ixs20, ielim)
subroutine iconnet(irect, ixs, knod2els, nod2els, ixs10, ixs16, ixs20, ns, iconn)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)