41
42
43
50
51
52
53#include "implicit_f.inc"
54
55
56
57#include "units_c.inc"
58#include "com04_c.inc"
59
60
61
62 INTEGER MERGE_NODE_TAB(4,*),NMERGE_NODE_CAND,NMERGE_NODE_DEST
64 . x(3,*),merge_node_tol(*)
65 TYPE(UNIT_TYPE_),INTENT(IN) ::UNITAB
66 TYPE(SUBMODEL_DATA),INTENT(IN)::LSUBMODEL(*)
67 TYPE (GROUP_) ,TARGET, DIMENSION(NGRNOD) :: IGRNOD
68
69
70
71 INTEGER I,J,ID,UID,IDN,GR_ID,GR_IDS,MERGE_TYPE,FLAG_FULL_MERGE
72 CHARACTER(LEN=NCHARTITLE) :: TITR
73 INTEGER, DIMENSION(:),ALLOCATABLE :: TAGNOD1,TAGNOD2,TAGNOD_TEMP
74 LOGICAL IS_AVAILABLE
75 my_real tol,xn,xmin,xmax,ymin,
ymax,zmin,zmax,dx,dy,dz,tol_def
76
77
78
79 INTEGER NGR2USR
80 INTEGER, DIMENSION(:), POINTER :: INGR2USR
81
82
83 WRITE(iout,1000)
84
85 tol_def = zero
86 flag_full_merge = 0
87 ALLOCATE(tagnod1(numnod),tagnod2(numnod),tagnod_temp(numnod))
88 tagnod1(1:numnod) = 0
89 tagnod2(1:numnod) = 0
90
91
92
93
94 is_available = .false.
96
97 DO i=1,nb_merge_node
98
99
100
103 . unit_id = uid,
104 . option_titr = titr)
105
106
107
108 CALL hm_get_floatv(
'tol' ,tol ,is_available, lsubmodel, unitab)
109 CALL hm_get_intv (
'Type' ,merge_type ,is_available, lsubmodel)
110 CALL hm_get_intv (
'grnod_id' ,gr_id ,is_available, lsubmodel)
111
112 gr_ids = 0
113 IF (gr_id > 0) THEN
114
115 DO j=1,ngrnod
116 IF (igrnod(j)%ID == gr_id) gr_ids = j
117 ENDDO
118 IF (gr_ids == 0) THEN
120 . msgtype=msgerror,
121 . anmode=aninfo,
122 . c1='IN /MERGE/NODE DEFINITION',
123 . i1=gr_id)
124 ENDIF
125 ENDIF
126
127 IF ((tol_def == zero).AND.(tol == zero)) THEN
128
129 xn=numnod
130 xmin = ep20
131 xmax = -ep20
132 ymin = ep20
134 zmin = ep20
135 zmax = -ep20
136 DO j = 1,numnod
137 xmin =
min(xmin,x(1,j))
138 xmax =
max(xmax,x(1,j))
139 ymin =
min(ymin,x(2,j))
141 zmin =
min(zmin,x(3,j))
142 zmax =
max(zmax,x(3,j))
143 END DO
144 dx = xmax-xmin
146 dz = zmax-zmin
147 tol_def = em05*(dx+dy+dz)/(three*exp(third*log(xn)))
148 ENDIF
149
150 IF (gr_ids > 0) THEN
151
152 IF (merge_type == 0) merge_type = 1
153 IF (merge_type == 1) THEN
154
155 DO j=1,igrnod(gr_ids)%NENTITY
156 tagnod1(igrnod(gr_ids)%ENTITY(j)) = 1
157 tagnod2(igrnod(gr_ids)%ENTITY(j)) = 1
158 ENDDO
159 ELSEIF (merge_type == 2) THEN
160
161 tagnod_temp(1:numnod) = 0
162 DO j=1,igrnod(gr_ids)%NENTITY
163 tagnod1(igrnod(gr_ids)%ENTITY(j)) = 1
164 tagnod_temp(igrnod(gr_ids)%ENTITY(j)) = 1
165 ENDDO
166 DO j=1,numnod
167 IF (tagnod_temp(j)==0) tagnod2(j) = 1
168 ENDDO
169 ENDIF
170 ELSE
171
172 IF (flag_full_merge == 0) THEN
174 ELSE
176 . msgtype=msgerror,
177 . anmode=aninfo_blind_1,
178 . i1=
id,i2=flag_full_merge)
179 ENDIF
180 gr_ids=0
181 tagnod1(1:numnod) = 1
182 tagnod2(1:numnod) = 1
183 merge_type = 1
184 ENDIF
185
186 IF (tol == zero) tol = tol_def
187 nmerge_node_cand = 0
188 nmerge_node_dest = 0
189 DO j=1,numnod
190 IF (tagnod1(j) == 1) nmerge_node_cand = nmerge_node_cand + 1
191 IF (tagnod2(j) == 1) nmerge_node_dest = nmerge_node_dest + 1
192 ENDDO
193 merge_node_tab(1,i) = merge_type
194 merge_node_tab(2,i) = gr_ids
195 merge_node_tab(3,i) = gr_id
196 merge_node_tab(4,i) =
id
197 merge_node_tol(i) = tol
198
199 WRITE(iout,1100)
id,trim(titr),tol,merge_type,gr_id
200
201 ENDDO
202
203 DEALLOCATE(tagnod1,tagnod2,tagnod_temp)
204
205
206 RETURN
207
2081000 FORMAT(/
209 . ' MERGE/NODE DEFINITIONS '/
210 . ' ---------------------- ')
2111100 FORMAT(/5x,'MERGE NODE ID ',i10,1x,a
212 . /5x,'TOLERANCE. . . . . . . . . . . . . . . . .',1pg20.4
213 . /5x,'MERGING TYPE. . . . . . . . . . . . . . . ',i10
214 . /5x,'GROUP OF NODES. . . . . . . . . . . . . . ',i10)
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_start(entity_type)
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
integer, parameter nchartitle
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)