OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
hm_read_subset.F
Go to the documentation of this file.
1Copyright> OpenRadioss
2Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3Copyright>
4Copyright> This program is free software: you can redistribute it and/or modify
5Copyright> it under the terms of the GNU Affero General Public License as published by
6Copyright> the Free Software Foundation, either version 3 of the License, or
7Copyright> (at your option) any later version.
8Copyright>
9Copyright> This program is distributed in the hope that it will be useful,
10Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12Copyright> GNU Affero General Public License for more details.
13Copyright>
14Copyright> You should have received a copy of the GNU Affero General Public License
15Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16Copyright>
17Copyright>
18Copyright> Commercial Alternative: Altair Radioss Software
19Copyright>
20Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21Copyright> software under a commercial license. Contact Altair to discuss further if the
22Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23!||====================================================================
24!|| hm_read_subset ../starter/source/model/assembling/hm_read_subset.F
25!||--- called by ------------------------------------------------------
26!|| lectur ../starter/source/starter/lectur.F
27!||--- calls -----------------------------------------------------
28!|| ancmsg ../starter/source/output/message/message.F
29!|| ecrsub2 ../starter/source/model/assembling/hm_read_subset.F
30!|| fretitl2 ../starter/source/starter/freform.F
31!|| hm_get_int_array_index ../starter/source/devtools/hm_reader/hm_get_int_array_index.F
32!|| hm_get_intv ../starter/source/devtools/hm_reader/hm_get_intv.F
33!|| hm_option_read_key ../starter/source/devtools/hm_reader/hm_option_read_key.F
34!|| hm_option_start ../starter/source/devtools/hm_reader/hm_option_start.F
35!|| udouble_igr ../starter/source/system/sysfus.F
36!||--- uses -----------------------------------------------------
37!|| hm_option_read_mod ../starter/share/modules1/hm_option_read_mod.F
38!|| message_mod ../starter/share/message_module/message_mod.F
39!|| submodel_mod ../starter/share/modules1/submodel_mod.F
40!||====================================================================
41 SUBROUTINE hm_read_subset(SUBSET,IPART,NSUBS,NPART,LSUBMODEL)
42C-----------------------------------------------
43C ROUTINE DESCRIPTION :
44C ===================
45C READ /SUBSET USING HM_READER
46C BUILD SUBSET HIERARCHY
47C-----------------------------------------------
48C DUMMY ARGUMENTS DESCRIPTION:
49C ===================
50C
51C NAME DESCRIPTION
52C
53C SUBSET SUBSET STRUCTURE
54C IPART PART ARRAY
55C NSUBS SUBSET NUMBER ( INCLUDING GLOBAL SUBSET )
56C NPART PART NUMBER
57C LSUBMODEL SUBMODEL STRUCTURE
58C-----------------------------------------------
59C M o d u l e s
60C-----------------------------------------------
61 USE my_alloc_mod
62 USE message_mod
63 USE groupdef_mod
64 USE submodel_mod
66C-----------------------------------------------
67C I m p l i c i t T y p e s
68C-----------------------------------------------
69#include "implicit_f.inc"
70C-----------------------------------------------
71C D u m m y A r g u m e n t s
72C-----------------------------------------------
73C INPUT ARGUMENTS
74 INTEGER,INTENT(IN)::NSUBS
75 INTEGER,INTENT(IN)::NPART
76 TYPE(submodel_data),INTENT(IN)::LSUBMODEL(*)
77C OUTPUT ARGUMENTS
78c TYPE (SUBSET_),DIMENSION(NSUBS),INTENT(OUT)::SUBSET
79 TYPE (SUBSET_) , DIMENSION(NSUBS) :: SUBSET
80C MODIFIED ARGUMENTS
81 INTEGER,INTENT(INOUT)::IPART(LIPART1,*)
82C-----------------------------------------------
83C C o m m o n B l o c k s
84C-----------------------------------------------
85#include "scr17_c.inc"
86#include "units_c.inc"
87C-----------------------------------------------
88C L o c a l V a r i a b l e s
89C-----------------------------------------------
90 INTEGER I,J,K,ID,IDV,IAD,IP,IS,ISU,NSU,NL,NC,NP,NTP,NS,
91 . CONT,NIVEAU,NIVMAX,LIST_IGR(NSUBS),UID,SUB_INDEX
92 INTEGER IFIX_TMP,TITLEN,ICHILD
93 INTEGER J10(10)
94 INTEGER, DIMENSION(NPART+NSUBS) :: BUFTMP
95 my_real bid
96 CHARACTER(LEN=NCHARTITLE) :: TITR
97 CHARACTER MESS*40
98 LOGICAL IS_AVAILABLE
99C-----------------------------------------------
100C E x t e r n a l F u n c t i o n s
101C-----------------------------------------------
102 INTEGER LISTCNT,SUBLVL
103c-----------------------------------------------
104 DATA mess/' SUBSET DEFINITION '/
105c-----------------------------------------------
106C SUBSET(ISU)%ID ::SUBSET identifier
107C SUBSET(ISU)%TITLE : SUBSET title
108C SUBSET(ISU)%TH_FLAG : TIME HISTORY flag
109C SUBSET(ISU)%PARENT : SUBSET PARENT
110C SUBSET(ISU)%NCHILD : SUBSETS number of childs
111C SUBSET(ISU)%NPART : SUBSET number of part (within one subset)
112C SUBSET(ISU)%NTPART : Total number of parts (within parent subset)
113C SUBSET(ISU)%THIAD : IAD for global ITHBUF storage variables
114C SUBSET(ISU)%NVARTH : nb of subset TH/ATH variable (10)
115! /iTH , i=A,,B, ... I
116! ( /iTH --> 9 additional time history files + 1 for /TH )
117C=======================================================================
118 is_available = .false.
119 sub_index = 0
120 uid = 0
121 isu = 0
122 buftmp(:) = 0
123C--------------------------------------------------
124C START READING SUBSETS
125C--------------------------------------------------
126 CALL hm_option_start('SUBSET')
127C--------------------------------------------------
128C BROWSING SUBSETS 1->NSUBS-1 ( NSUBS = NUMBER OF /SUBSET + GLOBAL_SUBSET )
129C--------------------------------------------------
130 DO i=1,nsubs-1
131 titr = ''
132C--------------------------------------------------
133C EXTRACT DATAS OF /SUBSET/... LINE
134C--------------------------------------------------
135c CALL HM_OPTION_READ(ID,UID,SUB_INDEX,TITR,LSUBMODEL)
136 CALL hm_option_read_key(lsubmodel,
137 . option_id = id,
138 . unit_id = uid,
139 . submodel_index = sub_index,
140 . option_titr = titr)
141 IF(len(titr)==0 .OR. len(trim(titr))==0 )titr(1:6)='noname'
142C--------------------------------------------------
143C EXTRACT DATAS NUMBER OF CHILDREN(INTEGER VALUE)
144C--------------------------------------------------
145 CALL hm_get_intv('numberofassemblies',NSU,IS_AVAILABLE,LSUBMODEL)
146 ISU = ISU+1
147 SUBSET(ISU)%ID = ID
148 SUBSET(ISU)%LEVEL = 0
149 SUBSET(ISU)%PARENT = 0
150 SUBSET(ISU)%NPART = 0
151 SUBSET(ISU)%NCHILD = NSU
152 SUBSET(ISU)%TH_FLAG = 0
153 CALL MY_ALLOC(SUBSET(ISU)%NVARTH,10)
154c /iTH , i=A,,B, ... I
155c ( /iTH --> 9 additional time history files + 1 for /TH )
156 SUBSET(ISU)%NVARTH(1:10) = 0
157 SUBSET(ISU)%THIAD = 0
158 CALL MY_ALLOC(SUBSET(ISU)%CHILD,NSU)
159 DO K=1,NSU
160 SUBSET(ISU)%CHILD(K) = 0
161 ENDDO
162 SUBSET(ISU)%TITLE = TITR
163C--------------------------------------------------
164C EXTRACT CHILDREN(INTEGER VALUES)
165C--------------------------------------------------
166 DO NS=1,NSU
167 CALL HM_GET_INT_ARRAY_INDEX('assemblies',ICHILD,NS,IS_AVAILABLE,LSUBMODEL)
168 SUBSET(ISU)%CHILD(NS) = ICHILD
169 ENDDO
170 ENDDO
171C-------------------------------------
172c SEARCH FOR DUPLICATED IDs
173C-------------------------------------
174 LIST_IGR(1:NSUBS) = 0
175 DO ISU=1,NSUBS-1
176 LIST_IGR(ISU) = SUBSET(ISU)%ID
177 ENDDO
178 CALL UDOUBLE_IGR(LIST_IGR,NSUBS,MESS,0,BID)
179C-------------------------------------
180C REPLACE USER IDs WITH SYSTEM IDs
181C-------------------------------------
182 DO ISU=1,NSUBS-1
183 NSU = SUBSET(ISU)%NCHILD
184 DO I=1,NSU
185 ID = SUBSET(ISU)%CHILD(I)
186 SUBSET(ISU)%CHILD(I) = 0
187 DO IS=1,NSUBS
188 IDV = SUBSET(IS)%ID
189 IF (ID == IDV) THEN
190 SUBSET(ISU)%CHILD(I) = IS
191 SUBSET(IS)%PARENT = ISU
192 ENDIF
193 ENDDO
194 IF (SUBSET(ISU)%CHILD(I) == 0) THEN
195 CALL ANCMSG(MSGID=182,
196 . MSGTYPE=MSGWARNING,
197 . ANMODE=ANINFO,
198 . I1=SUBSET(ISU)%ID,
199 . C1=SUBSET(ISU)%TITLE,
200 . I2=ID,
201 . I3=ID)
202 ENDIF
203 ENDDO
204 ENDDO
205C-------------------------------------
206c COMPACTION (INEXISTING SUBSET <=> MSGID=182)
207C-------------------------------------
208 DO ISU=1,NSUBS-1
209 NS = SUBSET(ISU)%NCHILD
210 NSU = 0
211 DO I=1,NS
212 ID = SUBSET(ISU)%CHILD(I)
213 IF (ID /= 0) THEN
214 NSU = NSU + 1
215 SUBSET(ISU)%CHILD(NSU) = ID
216 ENDIF
217 ENDDO
218 SUBSET(ISU)%NCHILD = NSU
219 ENDDO
220C-------------------------------------
221c CREATE GLOBAL SUBSET
222C-------------------------------------
223 BUFTMP(:) = 0
224 TITR = 'global model'
225 SUBSET(NSUBS)%TITLE = TITR
226c
227 SUBSET(NSUBS)%ID = 0
228 SUBSET(NSUBS)%LEVEL = 0
229 SUBSET(NSUBS)%PARENT = 0
230 SUBSET(NSUBS)%NCHILD = 0
231 SUBSET(NSUBS)%NPART = 0
232 SUBSET(NSUBS)%TH_FLAG = 0
233 CALL MY_ALLOC(SUBSET(NSUBS)%NVARTH,10) ! /iTH , i=A,,B, ... I
234! ( /iTH --> 9 additional time history files + 1 for /TH )
235 SUBSET(NSUBS)%NVARTH(1:10) = 0
236 SUBSET(NSUBS)%THIAD = 0
237!
238 NSU = 0
239 DO ISU=1,NSUBS-1
240 IF (SUBSET(ISU)%PARENT == 0) THEN
241 SUBSET(ISU)%PARENT = NSUBS
242 NSU = NSU+1
243 BUFTMP(NSU) = ISU
244 ENDIF
245 ENDDO
246!==================================================
247 SUBSET(NSUBS)%NCHILD = NSU
248 CALL MY_ALLOC(SUBSET(NSUBS)%CHILD,NSU)
249 DO I=1,NSU
250 SUBSET(NSUBS)%CHILD(I) = BUFTMP(I)
251 ENDDO
252!==================================================
253C-------------------------------------
254c SEARCH CHILDREN OF EACH SUBSET
255C-------------------------------------
256 DO ISU=1,NSUBS
257 ID = SUBSET(ISU)%ID
258 BUFTMP(:) = 0
259 NP = 0
260 DO K=1,NPART
261 IF (ID == IPART(7,K)) THEN
262 IPART(3,K) = ISU
263 NP = NP+1
264 BUFTMP(NP) = K
265 ENDIF
266 ENDDO
267 SUBSET(ISU)%NPART = NP
268 CALL MY_ALLOC(SUBSET(ISU)%PART,NP)
269 DO K=1,NP
270 SUBSET(ISU)%PART(K) = BUFTMP(K)
271 ENDDO
272 ENDDO
273C-------------------------------------
274c CHECK SUBSETs REFERENCED BY PARTs
275C-------------------------------------
276 DO K=1,NPART
277 IF (IPART(3,K) == 0) THEN
278 CALL FRETITL2(TITR,IPART(LIPART1-LTITR+1,K),LTITR)
279 CALL ANCMSG(MSGID=183,
280 . MSGTYPE=MSGWARNING,
281 . ANMODE=ANINFO,
282 . I1=IPART(4,K),
283 . C1=TITR,
284 . I2=IPART(7,K))
285 ENDIF
286 ENDDO
287C-------------------------------------
288c SORTING SUBSET BY LEVEL NSUBS*LOG(NSUBS)
289C-------------------------------------
290 NIVMAX = 0
291 CONT = 1
292 DO WHILE (CONT == 1)
293 CONT = 0
294 DO ISU=1,NSUBS
295 ID = SUBSET(ISU)%PARENT
296 IF (ID > 0) THEN
297 NIVEAU = SUBSET(ID)%LEVEL + 1
298 IF (SUBSET(ISU)%LEVEL /= NIVEAU) THEN
299 SUBSET(ISU)%LEVEL = NIVEAU
300 NIVMAX = MAX(NIVMAX,NIVEAU)
301 CONT = 1
302 ENDIF
303 ENDIF
304 ENDDO
305 ENDDO
306C-------------------------------------
307c SEARCH PARTS IN DESCENDANCE (recursive)
308C-------------------------------------
309 DO ISU = 1,NSUBS
310 BUFTMP(:) = 0
311 NTP = 0
312 NC = SUBSET(ISU)%NCHILD
313 IF (NC == 0) NC = SUBSET(ISU)%NPART
314 DO WHILE (NC > 0)
315 NC = SUBLVL(SUBSET,NSUBS,ISU,NTP,BUFTMP)
316 ENDDO
317 SUBSET(ISU)%NTPART = NTP
318 CALL MY_ALLOC(SUBSET(ISU)%TPART,NTP)
319 DO I=1,NTP
320 SUBSET(ISU)%TPART(I) = BUFTMP(I)
321 ENDDO
322 ENDDO
323C-------------------------------------
324c WRITING SUBSETS (TREE WRITING)
325C-------------------------------------
326 WRITE(IOUT,'(//a)')' hierarchical subset organization'
327 WRITE(IOUT,'(a//)')' --------------------------------'
328 IAD = 1
329 BUFTMP(:) = 0
330 DO ISU=1,NSUBS
331 IF (SUBSET(ISU)%LEVEL == 0) THEN
332 BUFTMP(IAD) = ISU
333 DO WHILE (IAD > 0)
334 I = BUFTMP(IAD)
335 NSU = SUBSET(I)%NCHILD
336 IAD = IAD - 1
337 CALL ECRSUB2(SUBSET,NSUBS,I,IPART,NIVMAX)
338 IF (NSU > 0) THEN
339 DO K = NSU,1,-1
340 IAD = IAD+1
341 BUFTMP(IAD) = SUBSET(I)%CHILD(K)
342 ENDDO
343 ENDIF
344 ENDDO
345 ENDIF
346 ENDDO
347C=======================================================================
348 RETURN
349 END
350
351 RECURSIVE INTEGER FUNCTION SUBLVL(SUBSET,NSUBS,ISU,NP,BUFTMP)
352 . RESULT(NS)
353C-----------------------------------------------
354 USE GROUPDEF_MOD
355C-----------------------------------------------
356C I m p l i c i t T y p e s
357C-----------------------------------------------
358#include "implicit_f.inc"
359C-----------------------------------------------
360C D u m m y A r g u m e n t s
361C-----------------------------------------------
362 INTEGER ISU,NP,NSUBS,BUFTMP(*)
363 TYPE (SUBSET_) , DIMENSION(NSUBS) :: SUBSET
364C-----------------------------------------------
365C L o c a l V a r i a b l e s
366C-----------------------------------------------
367 INTEGER I,J,K,NC,IS,IP,NK
368c=======================================================================
369 NS = SUBSET(ISU)%NCHILD
370 DO J=1,SUBSET(ISU)%NPART
371 NP = NP + 1
372 BUFTMP(NP) = SUBSET(ISU)%PART(J)
373 ENDDO
374 IF (NS > 0) THEN
375 NC = 0
376 DO I = 1,NS
377 IS = SUBSET(ISU)%CHILD(I)
378 NK = SUBLVL(SUBSET,NSUBS,IS,NP,BUFTMP)
379 NC = NC + NK
380 ENDDO
381 IF (NC == 0) NS = 0
382 ENDIF
383c-----------
384 RETURN
385 END
386c
387!||====================================================================
388!|| ecrsub2 ../starter/source/model/assembling/hm_read_subset.F
389!||--- called by ------------------------------------------------------
390!|| hm_read_subset ../starter/source/model/assembling/hm_read_subset.F
391!||--- calls -----------------------------------------------------
392!|| fretitl2 ../starter/source/starter/freform.F
393!||--- uses -----------------------------------------------------
394!|| message_mod ../starter/share/message_module/message_mod.F
395!||====================================================================
396 SUBROUTINE ECRSUB2(SUBSET,NSUBS,ISU,IPART,NIVMAX)
397 USE MESSAGE_MOD
398 USE GROUPDEF_MOD
399 USE NAMES_AND_TITLES_MOD , ONLY : NCHARTITLE
400C-----------------------------------------------
401C I m p l i c i t T y p e s
402C-----------------------------------------------
403#include "implicit_f.inc"
404C-----------------------------------------------
405C D u m m y A r g u m e n t s
406C-----------------------------------------------
407 INTEGER NSUBS,ISU,IPART(LIPART1,*)
408 TYPE (SUBSET_) , DIMENSION(NSUBS) :: SUBSET
409C-----------------------------------------------
410C C o m m o n B l o c k s
411C-----------------------------------------------
412#include "units_c.inc"
413#include "scr17_c.inc"
414C-----------------------------------------------
415C L o c a l V a r i a b l e s
416C-----------------------------------------------
417 INTEGER I,K,K2,L,LL,NP,IP,ID,NIVEAU,NIVMAX,TITLEN
418 INTEGER CNT(0:33)
419 CHARACTER LIGNE*132,LIGN2*132,BAR(33)*10,BLI*21
420 CHARACTER(LEN=NCHARTITLE)::TITR
421 DATA BAR /33*'| '/
422 DATA BLI /'|____________________'/
423 DATA CNT /34*0/
424C=======================================================================
425
426 LIGNE=' '
427 ID = SUBSET(ISU)%ID
428 NIVEAU = SUBSET(ISU)%LEVEL
429 IF (NIVEAU >= 33) GOTO 999
430 CNT(NIVEAU) = CNT(NIVEAU)+1
431 BAR(NIVEAU+1)='| '
432 CNT(NIVEAU+1)=0
433
434 L = MIN(10,MAX(2,22/(NIVMAX+1)))
435
436c lignes vides avant subset
437 K = 3
438 DO I=1,NIVEAU
439 LIGNE(K:K+L) = BAR(I)(1:L)
440 K = K+L
441 IF (K > 132) GOTO 999
442 ENDDO
443 K = K-1
444 WRITE(IOUT,'(a)')LIGNE(1:K)
445 WRITE(IOUT,'(a)')LIGNE(1:K)
446c--------------------------------
447 IF (NIVEAU == 0) THEN
448 ELSEIF (CNT(NIVEAU) == SUBSET(SUBSET(ISU)%PARENT)%NCHILD) THEN
449 BAR(NIVEAU) = ' '
450 ENDIF
451
452c ligne subset
453 LIGNE=' '
454 IF (NIVEAU == 0) THEN
455 K = 2
456 ELSE
457 K = 3
458 ENDIF
459
460 DO I=1,NIVEAU-1
461 LIGNE(K:K+L-1)=BAR(I)(1:L)
462 K=K+L
463 IF (K > 132) GOTO 999
464 ENDDO
465 IF (NIVEAU /= 0) THEN
466 LIGNE(K:K+L-2)=BLI(1:L-1)
467 K = K+L-1
468 IF (K > 132-16) GOTO 999
469 ENDIF
470 WRITE(LIGNE(K:K+17),FMT='(a7,i10,a1)')'subset:',ID,','
471 K = K+17
472 I = 0
473 TITLEN = LEN(SUBSET(ISU)%TITLE)
474.AND. DO WHILE (I < TITLEN K < 132)
475 K=K+1
476 I=I+1
477 LIGNE(K:K) = SUBSET(ISU)%TITLE(I:I)
478 ENDDO
479 WRITE(IOUT,'(a)')LIGNE(1:K)
480
481c subset souligne + ligne vide apres subset
482 K=3
483 LIGNE=' '
484 DO I=1,NIVEAU
485 LIGNE(K:K+L-1)=BAR(I)(1:L)
486 K=K+L
487 IF(K > 132)GOTO 999
488 ENDDO
489 K2 = K
490 K = K-1
491 WRITE(LIGNE(K:K+5),FMT='(a6)')'~~~~~~'
492 WRITE(IOUT,'(a)')LIGNE(1:K+5)
493c part
494 NP = SUBSET(ISU)%NPART
495 IF (NP == 0) RETURN
496
497 K = K2
498 LIGNE(K-1:K)=' |'
499 WRITE(IOUT,'(a)')LIGNE(1:K)
500 DO LL=1,NP
501 IP = SUBSET(ISU)%PART(LL)
502
503 LIGNE=' '
504 K=3
505 DO I=1,NIVEAU
506 LIGNE(K:K+L-1)=BAR(I)(1:L)
507 K = K+L
508 IF (K > 132-20) GOTO 999
509 ENDDO
510c
511 IF (LL == 1) THEN
512 LIGNE(K:K+L-2)=BLI(1:L-1)
513 WRITE(LIGNE(K+L-1:K+L+17),FMT='(a8,i10,a1)')
514 . 'Part(s):',ipart(4,ip),','
515 ELSEIF (subset(isu)%NCHILD == 0) THEN
516 WRITE(ligne(k+l-1:k+l+17),fmt='(A8,I10,A1)')
517 . ' ',ipart(4,ip),','
518 ELSE
519 ligne(k:k)='|'
520 WRITE(ligne(k+l-1:k+l+17),fmt='(A8,I10,A1)')
521 . ' ',ipart(4,ip),','
522 ENDIF
523 k = k + l + 17
524 i = 0
525 CALL fretitl2(titr,ipart(lipart1-ltitr+1,ip),ltitr)
526 DO WHILE (i < 40 .AND. k < 132)
527 k = k + 1
528 i = i + 1
529 ligne(k:k) = titr(i:i)
530 ENDDO
531 WRITE(iout,'(A)')ligne(1:k)
532C
533 ENDDO
534c-----------
535 RETURN
536c-----------
537 999 CALL ancmsg(msgid=170,
538 . msgtype=msgerror,
539 . anmode=aninfo,
540 . c1=ligne(1:132))
541c-----------
542 RETURN
543 END
544
545
#define my_real
Definition cppsort.cpp:32
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_start(entity_type)
subroutine hm_read_subset(subset, ipart, nsubs, npart, lsubmodel)
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)
Definition message.F:889
subroutine fretitl2(titr, iasc, l)
Definition freform.F:804