33
35
36
37
38
39#include "implicit_f.inc"
40
41
42
43 INTEGER,INTENT(IN) :: IS_DYNA
44 INTEGER,INTENT(IN) :: NUMNUSR, NUMCNOD
45 INTEGER,INTENT(OUT) :: NUMNOD
46 INTEGER,INTENT(IN),DIMENSION(NUMNUSR+NUMCNOD) :: ITAB
47 my_real,
INTENT(IN),
DIMENSION(3,NUMNUSR) :: x
48
49
50
51 INTEGER I, IREF,
52 INTEGER WORK(70000)
53 INTEGER, DIMENSION(:), ALLOCATABLE :: ITABM1, INDX
54 my_real :: xodusr, xmin, ymin, zmin, xmax,
ymax, zmax, dx, dy, dz, tol
55
56
57
58 ALLOCATE (itabm1(2*(numnusr+numcnod)),indx(2*(numnusr+numcnod)),stat=stat)
59 IF (stat /= 0)
CALL ancmsg(msgid=268,anmode=aninfo,
60 . msgtype=msgerror,
61 . c1='ITABM1')
62
63
64 DO i = 1, numnusr
65 indx(i) = i
66 END DO
67
68 CALL my_orders(0,work,itab,indx,numnusr,1)
69
70 IF(numnusr>=1)THEN
71 itabm1(1) = itab(indx(1))
72 itabm1(numnusr+1) = indx(1)
73 ENDIF
74
75 IF(is_dyna == 0)THEN
76
77 DO i = 2, numnusr
78 itabm1(i) = itab(indx(i))
79 IF(itabm1(i)==itabm1(i-1))THEN
81 . msgtype=msgerror,
82 . anmode=aninfo,
83 . i1=itabm1(i))
84 END IF
85 itabm1(numnusr+i) = indx(i)
86 END DO
87 numnod = numnusr
88
89 ELSE
90
91 xodusr=numnusr
92 xmin = ep20
93 xmax = -ep20
94 ymin = ep20
96 zmin = ep20
97 zmax = -ep20
98 DO i = 1, numnusr
99 xmin =
min(xmin,x(1,i))
100
103 zmin =
min(zmin,x(3,i))
104 zmax =
max(zmax,x(3,i))
105 END DO
106 dx = xmax-xmin
108 dz = zmax-zmin
109 tol = em05*(dx+dy+dz)/(three*exp(third*log(xodusr)))
110
111 i = 2
112 DO WHILE(i <= numnusr)
113
114 itabm1(i) = itab(indx(i))
115
116 iref = i-1
117 xmin = x(1,indx(iref))
118 xmax = x(1,indx(iref))
119 ymin = x(2,indx(iref))
120 ymax = x(2,indx(iref))
121 zmin = x(3,indx(iref))
122 zmax = x(3,indx(iref))
123
124 DO WHILE(i <= numnusr .AND. itabm1(i)==itabm1(iref))
125
126 xmin =
min(xmin,x(1,indx(i)))
127 xmax =
max(xmax,x(1,indx(i)))
128 ymin =
min(ymin,x(2,indx(i)))
130 zmin =
min(zmin,x(3,indx(i)))
131 zmax =
max(zmax,x(3,indx(i)))
132
133 indx(i) = indx(iref)
134 itabm1(numnusr+i) = indx(iref)
135
136 i = i + 1
137 itabm1(i)=itab(indx(i))
138
139 END DO
140
141 IF(i > iref+1)THEN
142
143 dx = xmax-xmin
145 dz = zmax-zmin
146 IF(dx < tol .AND. dy < tol .AND. dz < tol)THEN
148 . msgtype=msgwarning,
149 . anmode=aninfo_blind_1,
150 . i1=itabm1
151 ELSE
153 . msgtype=msgerror,
154 . anmode=aninfo,
155 . i1=itabm1(i-1))
156 END IF
157
158 ELSE
159
160 itabm1(numnusr+i) = indx(i)
161 i = i + 1
162
163 END IF
164
165 END DO
166
167 numnod = 1
168 DO i=2,numnusr
169 IF(itabm1(numnusr+i) == itabm1(numnusr+i-1)) cycle
170 numnod = numnod + 1
171 ENDDO
172
173 END IF
174
175 DO i = 1, numnusr+numcnod
176 indx(i) = i
177 END DO
178
179 CALL my_orders(0,work,itab,indx,numnusr+numcnod,1)
180
181 IF(numnusr+numcnod>=1)THEN
182 itabm1(1) = itab(indx(1))
183 itabm1(numnusr+numcnod+1) = indx(1)
184 ENDIF
185
186 DO i = 2, numnusr+numcnod
187 itabm1(i) = itab(indx(i))
188 IF(itabm1(i)==itabm1(i-1))THEN
189 IF((indx(i-1) < numnusr .AND. indx(i) > numnusr) .OR.
190 . (indx(i-1) > numnusr .AND. indx(i) < numnusr)) THEN
191
193 . msgtype=msgerror,
194 . anmode=aninfo,
195 . i1=itabm1(i))
196 ELSEIF(indx(i-1) > numnusr .AND. indx(i) > numnusr)THEN
197
199 . msgtype=msgerror,
200 . anmode=aninfo,
201 . i1=itabm1(i))
202 END IF
203 END IF
204 itabm1(numnusr+numcnod+i) = indx(i)
205 END DO
206
207 numnod = numnod + numcnod
208 DEALLOCATE(itabm1,indx)
209 RETURN
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
void my_orders(int *mode, int *iwork, int *data, int *index, int *n, int *irecl)
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)