summaryrefslogtreecommitdiff
path: root/Donjon/src/DSETGR.f
blob: e7aeb9a0d67a3f12bcc48c6f4cc940e728f1d5f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
*DECK DSETGR
      SUBROUTINE DSETGR(IPDEV,IMODE,IGRP,NDGR,LROD,IMPX)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Modify some parameters for a specified group of devices.
*
*Copyright:
* Copyright (C) 2007 Ecole Polytechnique de Montreal.
*
*Author(s): 
* D. Sekki
*
*Parameters: input
* IPDEV  pointer to device information.
* IMODE  type of displacement: =1 for FADE; =2 for MOVE (DONJON3-type
*        movement).
* IGRP   current group identification number.
* LROD   flag for the device type:
*         =.true. if rod-type devices; =.false. if lzc-type devices.
* IMPX   printing index (=0 for no print).
*
*Parameters: output
* NDGR   number of devices in the group.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPDEV
      INTEGER IMODE,IGRP,NDGR,IMPX
      LOGICAL LROD
*----
*  LOCAL VARIABLES
*----
      PARAMETER(IOUT=6,MAXPRT=10)
      REAL RODPOS(6,MAXPRT),MAXPOS(6,MAXPRT),EMTPOS(6),FULPOS(6),
     1 LENG(2),LVOLD,LVNEW,LIMIT(6)
      DOUBLE PRECISION DFLOT
      CHARACTER TEXT*12,NXSEQ*12
      TYPE(C_PTR) JPDEV,KPDEV
      INTEGER, ALLOCATABLE, DIMENSION(:) :: IDEV
*----
*  READ OPTION
*----
      ILEVEL=0
      ISPEED=0
      ISTIME=0
   10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
      IF(ITYP.NE.3)CALL XABORT('@DSETGR: CHARACTER DATA EXPECTED.')
      IF(TEXT.EQ.'LEVEL')THEN
        IF(ILEVEL.EQ.1)CALL XABORT('@DSETGR: LEVEL ALREADY DEFINED.')
        CALL REDGET(ITYP,NITMA,LVNEW,TEXT,DFLOT)
        IF(ITYP.NE.2)CALL XABORT('@DSETGR: REAL FOR LEVEL EXPECTED.')
        IF(LVNEW.GT.1.)CALL XABORT('@DSETGR: WRONG LEVEL VALUE > 1.')
        IF(LVNEW.LT.0.)CALL XABORT('@DSETGR: WRONG LEVEL VALUE < 0.')
        ILEVEL=1
      ELSEIF(TEXT.EQ.'SPEED')THEN
        IF(ISPEED.EQ.1)CALL XABORT('@DSETGR: SPEED ALREADY DEFINED.')
        CALL REDGET(ITYP,NITMA,SPNEW,TEXT,DFLOT)
        IF(ITYP.NE.2)CALL XABORT('@DSETGR: REAL FOR SPEED EXPECTED.')
        IF(SPNEW.LT.0.)CALL XABORT('@DSETGR: WRONG SPEED VALUE < 0.')
        ISPEED=1
      ELSEIF(TEXT.EQ.'TIME')THEN
        IF(ISTIME.EQ.1)CALL XABORT('@DSETGR: TIME ALREADY DEFINED.')
        CALL REDGET(ITYP,NITMA,TMNEW,TEXT,DFLOT)
        IF(ITYP.NE.2)CALL XABORT('@DSETGR: REAL FOR TIME EXPECTED.')
        IF(TMNEW.LT.0.)CALL XABORT('@DSETGR: WRONG TIME VALUE < 0.')
        ISTIME=1
      ELSEIF(TEXT.EQ.'END')THEN
        GOTO 20
      ELSE
        WRITE(IOUT,*)'@DSETGR: INVALID KEYWORD ',TEXT
        CALL XABORT('@DSETGR: OPTION OR END EXPECTED.')
      ENDIF
      GOTO 10
*----
*  RECOVER GROUP INFORMATION
*----
   20 CALL LCMGET(IPDEV,'CORE-LIMITS',LIMIT)
      IF(LROD)THEN
        JPDEV=LCMGID(IPDEV,'ROD_GROUP')
        KPDEV=LCMGIL(JPDEV,IGRP)
        CALL LCMGET(KPDEV,'NUM-ROD',NDGR)
        ALLOCATE(IDEV(NDGR))
        IDEV(:NDGR)=0
        CALL LCMGET(KPDEV,'ROD-ID',IDEV)
      ELSE
        JPDEV=LCMGID(IPDEV,'LZC_GROUP')
        KPDEV=LCMGIL(JPDEV,IGRP)
        CALL LCMGET(KPDEV,'NUM-LZC',NDGR)
        ALLOCATE(IDEV(NDGR))
        IDEV(:NDGR)=0
        CALL LCMGET(KPDEV,'LZC-ID',IDEV)
      ENDIF
*----
*  UPDATE DEVICES
*----
      DO 60 I=1,NDGR
        ID=IDEV(I)
*       RECOVER ROD
        IF(LROD)THEN
          JPDEV=LCMGID(IPDEV,'DEV_ROD')
          KPDEV=LCMGIL(JPDEV,ID)
          CALL LCMGTC(KPDEV,'ROD-NAME',12,TEXT)
          IF(IMPX.GT.0) WRITE(IOUT,1011) ID,TEXT
        ELSE
          JPDEV=LCMGID(IPDEV,'DEV_LZC')
          KPDEV=LCMGIL(JPDEV,ID)
          IF(IMPX.GT.0) WRITE(IOUT,1012) ID
        ENDIF
*----
*  UPDATE ROD POSITION
*----
        IF((ILEVEL.NE.0).AND.LROD) THEN
*         RECOVER OLD ROD PARAMETERS
          CALL LCMGET(KPDEV,'ROD-PARTS',NPART)
          CALL LCMGET(KPDEV,'LENGTH',LENG)
          CALL LCMGET(KPDEV,'AXIS',IAXIS)
          CALL LCMGET(KPDEV,'FROM',ITOP)
          CALL LCMLEN(KPDEV,'LEVEL',ILONG,ITYLCM)
          CALL LCMGTC(KPDEV,'ROD-NAME',12,NXSEQ)
          IF((ILONG.GT.0).AND.(IMPX.GT.2)) THEN
            CALL LCMGET(KPDEV,'ROD-POS',RODPOS)
            CALL LCMGET(KPDEV,'LEVEL',LVOLD)
            WRITE(IOUT,1000) LVOLD
            DO 30 IPART=1,NPART
            WRITE(IOUT,1001) IPART,RODPOS(1,IPART),RODPOS(3,IPART),
     1             RODPOS(5,IPART),RODPOS(2,IPART),RODPOS(4,IPART),
     2             RODPOS(6,IPART)
   30         CONTINUE
          ENDIF
*         MODIFY ROD POSITION
          IF(IMPX.GT.1) WRITE(IOUT,1002) LVNEW
          IF(IMODE.EQ.1) THEN
*           FADING ROD
            DELH=LVNEW*(LENG(2)-LENG(1))
          ELSE IF(IMODE.EQ.2) THEN
*           MOVING ROD
            IF(ITOP.EQ.-1) THEN
              DELH=LVNEW*(LENG(2)-LIMIT(1))+LIMIT(1)
            ELSE IF(ITOP.EQ.1) THEN
              DELH=LIMIT(2)-LVNEW*(LIMIT(2)-LENG(1))
            ENDIF
            DELH=MIN(LIMIT(2),MAX(LIMIT(1),DELH))
            IF(IMPX.GT.3) THEN
              WRITE(IOUT,*) '    ADJ ',NXSEQ,' LEVEL ',LVNEW*100.,
     1                      '% OF INSERTION'
              WRITE(IOUT,*) '    NEW POSITION (L_sup)= ',DELH
            ENDIF
          ENDIF
          CALL LCMGET(KPDEV,'MAX-POS',RODPOS)
          CALL MOVCHK(IMPX,IMODE,NPART,IAXIS,ITOP,DELH,LENG,RODPOS)
*         STORE NEW PARAMETERS
          CALL LCMPUT(KPDEV,'ROD-POS',6*NPART,2,RODPOS)
          CALL LCMPUT(KPDEV,'LEVEL',1,2,LVNEW)
*----
*  UPDATE LZC POSITION
*----
        ELSE IF(ILEVEL.NE.0) THEN
*         RECOVER OLD LZC PARAMETERS
          CALL LCMGET(KPDEV,'MAX-POS',MAXPOS)
          CALL LCMGET(KPDEV,'EMPTY-POS',EMTPOS)
          CALL LCMGET(KPDEV,'FULL-POS',FULPOS)
          CALL LCMGET(KPDEV,'HEIGHT',HEIGHT)
          CALL LCMGET(KPDEV,'LEVEL',LVOLD)
          CALL LCMGET(KPDEV,'AXIS',IAXIS)
          IF(IMPX.GT.1) WRITE(IOUT,1005) LVOLD,EMTPOS(1),EMTPOS(3),
     1           EMTPOS(5),EMTPOS(2),EMTPOS(4),EMTPOS(6),FULPOS(1),
     2           FULPOS(3),FULPOS(5),FULPOS(2),FULPOS(4),FULPOS(6)
*         MODIFY LZC POSITION
          DELH=LVNEW*HEIGHT
          IF(IAXIS.EQ.1) THEN
            FULPOS(1)=MAXPOS(2,1)-DELH
            EMTPOS(2)=FULPOS(1)
          ELSEIF(IAXIS.EQ.2) THEN
            FULPOS(3)=MAXPOS(4,1)-DELH
            EMTPOS(4)=FULPOS(3)
          ELSEIF(IAXIS.EQ.3) THEN
            FULPOS(5)=MAXPOS(6,1)-DELH
            EMTPOS(6)=FULPOS(5)
          ENDIF
*         STORE NEW PARAMETERS
          CALL LCMPUT(KPDEV,'LEVEL',1,2,LVNEW)
          CALL LCMPUT(KPDEV,'EMPTY-POS',6,2,EMTPOS)
          CALL LCMPUT(KPDEV,'FULL-POS',6,2,FULPOS)
          IF(IMPX.GT.1) WRITE(IOUT,1006) LVNEW,EMTPOS(1),EMTPOS(3),
     1           EMTPOS(5),EMTPOS(2),EMTPOS(4),EMTPOS(6),FULPOS(1),
     2           FULPOS(3),FULPOS(5),FULPOS(2),FULPOS(4),FULPOS(6)
        ENDIF
*----
*  UPDATE SPEED
*----
        IF((ISPEED.NE.0).AND.LROD) THEN
          CALL LCMLEN(KPDEV,'SPEED',ILONG,ITYLCM)
          IF(ILONG.GT.0) THEN
            CALL LCMGET(KPDEV,'SPEED',SPOLD)
            IF(IMPX.GE.2) WRITE(IOUT,1007) SPOLD,SPNEW
          ELSE
            IF(IMPX.GE.2) WRITE(IOUT,1008) SPNEW
          ENDIF
          CALL LCMPUT(KPDEV,'SPEED',1,2,SPNEW)
        ELSE IF(ISPEED.NE.0) THEN
          CALL LCMLEN(KPDEV,'RATE',ILONG,ITYLCM)
          IF(ILONG.GT.0) THEN
            CALL LCMGET(KPDEV,'RATE',SPOLD)
            IF(IMPX.GE.2) WRITE(IOUT,1007) SPOLD,SPNEW
          ELSE
            IF(IMPX.GE.2) WRITE(IOUT,1008) SPNEW
          ENDIF
          CALL LCMPUT(KPDEV,'RATE',1,2,SPNEW)
        ENDIF
*----
*  UPDATE TIME
*----
        IF(ISTIME.NE.0) THEN
          CALL LCMLEN(KPDEV,'TIME',ILONG,ITYLCM)
          IF(ILONG.GT.0) THEN
            CALL LCMGET(KPDEV,'TIME',TMOLD)
            IF(IMPX.GE.2) WRITE(IOUT,1009) TMOLD,TMNEW
          ELSE
            IF(IMPX.GE.2) WRITE(IOUT,1010) TMNEW
          ENDIF
          CALL LCMPUT(KPDEV,'TIME',1,2,TMNEW)
        ENDIF
*     PROCEED NEXT ROD
   60 CONTINUE
      DEALLOCATE(IDEV)
      RETURN
*
 1000 FORMAT(
     1 /5X,'DSETGR: PREVIOUS INSERTION LEVEL =',F8.4)
 1001 FORMAT(
     1 /5X,'DSETGR: PART =',I5/
     2  5X,'PREVIOUS ROD POSITION :'/
     3  5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
     4  5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4)
 1002 FORMAT(
     1 /5X,'DSETGR: NEW INSERTION LEVEL =',F8.4)
 1005 FORMAT(
     1 /5X,'PREVIOUS LZC LEVEL =',F8.4/
     2  5X,'PREVIOUS EMPTY-PART POSITION :'/
     3  5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
     4  5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/
     5  5X,'PREVIOUS FULL-PART POSITION :'/
     6  5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
     7  5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/)
 1006 FORMAT(
     1 /5X,'NEW LZC LEVEL =',F8.4/
     2  5X,'NEW EMPTY-PART POSITION :'/
     3  5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
     4  5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/
     5  5X,'NEW FULL-PART POSITION :'/
     6  5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
     7  5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/)
 1007 FORMAT(/5X,'** SETING DEVICE SPEED **',
     1       /5X,'PREVIOUS SPEED:',F10.4
     2       /5X,'NEW SPEED:',F10.4/)
 1008 FORMAT(/5X,'** SETING DEVICE SPEED **',
     1       /5X,'PREVIOUS SPEED: (UNDEFINED)'
     2       /5X,'NEW SPEED:',F10.4/)
 1009 FORMAT(/5X,'** SETING DEVICE TIME **',
     1       /5X,'PREVIOUS TIME:',F10.4
     2       /5X,'NEW TIME:',F10.4/)
 1010 FORMAT(/5X,'** SETING DEVICE TIME **',
     1       /5X,'PREVIOUS TIME: (UNDEFINED)'
     2       /5X,'NEW TIME:',F10.4/)
 1011 FORMAT(/5X,' =>  ROD #',I3.3,4X,'ROD-NAME:',1X,A)
 1012 FORMAT(/5X,' =>  LZC #',I2.2)
      END