summaryrefslogtreecommitdiff
path: root/Ganlib/src/DRVBAC.f
blob: 68f72e8fc138232c166d2b44e6637ef2dee08d34 (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
*DECK DRVBAC
      SUBROUTINE DRVBAC(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Backup one or many LCM objects.
*
*Copyright:
* Copyright (C) 1994 Ecole Polytechnique de Montreal
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version
*
*Author(s): A. Hebert
*
*Parameters: input/output
* NENTRY  number of LCM objects or files used by the operator.
* HENTRY  name of each LCM object or file:
*         HENTRY(1): read-only or modification type(VECTOR).
* IENTRY  type of each LCM object or file:
*         =1 LCM memory object; =2 XSM file; =3 sequential binary file;
*         =4 sequential ascii file.
* JENTRY  access of each LCM object or file:
*         =0 the LCM object or file is created;
*         =1 the LCM object or file is open for modifications;
*         =2 the LCM object or file is open in read-only mode.
* KENTRY  LCM object address or file unit number.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
      CHARACTER HENTRY(NENTRY)*12
      TYPE(C_PTR) KENTRY(NENTRY)
*----
*  LOCAL VARIABLES
*----
      TYPE(C_PTR) IPLIST,JPLIST,KPLIST
      CHARACTER TEXT12*12,TEXT4*4,HMEDIA*12,NAMT*12
      DOUBLE PRECISION DFLOTT
*
      IF(NENTRY.LE.1) THEN
         CALL XABORT('DRVBAC: TWO PARAMETERS EXPECTED.')
      ELSE IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) THEN
         CALL XABORT('DRVBAC: LHS LINKED LIST OR XSM FILE EXPECTED.')
      ELSE IF(JENTRY(1).EQ.2) THEN
         CALL XABORT('DRVBAC: LHS PARAMETER IN CREATE OR MODIFICATION '
     1   //'MODE EXPECTED.')
      ENDIF
      ITYPE=IENTRY(1)
      IPLIST=KENTRY(1)
*
      IMPX=1
      IDIM=0
      IPOS=0
      JPLIST=C_NULL_PTR
   10 CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT)
      IF(INDIC.EQ.10) GO TO 30
      IF(INDIC.NE.3) CALL XABORT('DRVBAC: CHARACTER DATA EXPECTED.')
      IF(TEXT4.EQ.'EDIT') THEN
         CALL REDGET(INDIC,IMPX,FLOTT,TEXT4,DFLOTT)
         IF(INDIC.NE.1) CALL XABORT('DRVBAC: INTEGER DATA EXPECTED.')
      ELSE IF(TEXT4.EQ.'STEP') THEN
*        CHANGE THE HIERARCHICAL LEVEL ON THE LCM OBJECT.
         IF(ITYPE.GT.2) CALL XABORT('DRVBAC: UNABLE TO STEP INTO A SE'
     1   //'QUENTIAL FILE.')
         CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT)
         IF(INDIC.NE.3) CALL XABORT('DRVBAC: CHARACTER DATA EXPECTED.')
         IF(TEXT4.EQ.'UP') THEN
            CALL REDGET(INDIC,NITMA,FLOTT,NAMT,DFLOTT)
            IF(INDIC.NE.3) CALL XABORT('DRVBAC: CHARACTER DATA EXPECT'
     1      //'ED.')
            IF(IMPX.GT.0) WRITE (6,100) NAMT
            CALL LCMLEN(IPLIST,NAMT,ILONG,ITYLCM)
            IF(ILONG.GT.0) THEN
               JPLIST=LCMGID(IPLIST,NAMT)
            ELSE
               JPLIST=LCMDID(IPLIST,NAMT)
            ENDIF
         ELSE IF(TEXT4.EQ.'AT') THEN
            CALL REDGET(INDIC,NITMA,FLOTT,NAMT,DFLOTT)
            IF(INDIC.NE.1) CALL XABORT('DRVBAC: INTEGER EXPECTED.')
            IF(IMPX.GT.0) WRITE (6,110) NITMA
            CALL LCMLEL(IPLIST,NITMA,ILONG,ITYLCM)
            IF(ILONG.GT.0) THEN
               JPLIST=LCMGIL(IPLIST,NITMA)
            ELSE
               JPLIST=LCMDIL(IPLIST,NITMA)
            ENDIF
         ELSE
            CALL XABORT('DRVBAC: UP OR AT EXPECTED.')
         ENDIF
         IPLIST=JPLIST
      ELSE IF(TEXT4.EQ.'LIST') THEN
         CALL REDGET(INDIC,IDIM,FLOTT,TEXT4,DFLOTT)
         IF(INDIC.NE.1) CALL XABORT('DRVBAC: INTEGER DATA EXPECTED.')
         CALL LCMPUT(IPLIST,'LISTDIM',1,1,IDIM)
      ELSE IF(TEXT4.EQ.'ITEM') THEN
         CALL REDGET(INDIC,IPOS,FLOTT,TEXT4,DFLOTT)
         IF(INDIC.NE.1) CALL XABORT('DRVBAC: INTEGER DATA EXPECTED.')
      ELSE IF(TEXT4.EQ.';') THEN
         GO TO 30
      ELSE
         CALL XABORT('DRVBAC: '//TEXT4//' IS AN INVALID KEY WORD.')
      ENDIF
      GO TO 10
*
   30 CALL LCMLEN(IPLIST,'SIGNATURE',ILONG,ITYLCM)
      IF(ILONG.NE.0) THEN
         CALL LCMGTC(IPLIST,'SIGNATURE',12,TEXT12)
         IF(TEXT12.NE.'L_ARCHIVE') THEN
            HMEDIA=HENTRY(1)
            CALL XABORT('DRVBAC: SIGNATURE OF '//HMEDIA//' IS '//TEXT12
     1      //'. L_ARCHIVE EXPECTED.')
         ENDIF
      ELSE
         TEXT12='L_ARCHIVE'
         CALL LCMPTC(IPLIST,'SIGNATURE',12,TEXT12)
      ENDIF
      ISET=0
      DO 40 I=2,NENTRY
      IF((JENTRY(I).EQ.0).OR.(JENTRY(I).EQ.1)) THEN
         TEXT12=HENTRY(I)
         CALL XABORT('DRVBAC: ENTRY '//TEXT12//' IS NOT EXPECTED.')
      ELSE IF(IENTRY(I).GT.2) THEN
         CALL XABORT('DRVBAC: RHS LINKED LIST OR XSM FILE EXPECTED.')
      ENDIF
      IF(IDIM.EQ.0) THEN
        CALL LCMLEN(IPLIST,'LISTDIM',ILONG,ITYLCM)
        IF(ILONG.EQ.1) CALL LCMGET(IPLIST,'LISTDIM',IDIM)
      ENDIF
      IF(IDIM.EQ.0) THEN
        ! HENTRY(I) is stored as a directory
        IF(IMPX.GT.0) WRITE (6,'(/17H DRVBAC: BACKUP '',A12,7H'' INTO ,
     1  1H'',A,2H''.)') TRIM(HENTRY(I)),TRIM(HENTRY(1))
        CALL LCMSIX(IPLIST,HENTRY(I),1)
        CALL LCMEQU(KENTRY(I),IPLIST)
        CALL LCMSIX(IPLIST,' ',2)
      ELSE
        ! HENTRY(I) is stored as a list of directories
        IF(IPOS.EQ.0) CALL XABORT('DRVBAC: IPOS IS NOT DEFINED.')
        IF(IPOS.GT.IDIM) CALL XABORT('DRVBAC: LIST OVERFLOW FOR OBJECT'
     1  //' '//TRIM(HENTRY(I))//'.')
        JPLIST=LCMLID(IPLIST,HENTRY(I),IPOS)
        IF(IMPX.GT.0) WRITE (6,120) TRIM(HENTRY(I)),IPOS,TRIM(HENTRY(1))
        KPLIST=LCMDIL(JPLIST,IPOS)
        CALL LCMEQU(KENTRY(I),KPLIST)
      ENDIF
   40 CONTINUE
      RETURN
  100 FORMAT (/27H DRVBAC: STEP UP TO LEVEL ',A12,2H'.)
  110 FORMAT (/26H DRVBAC: STEP AT COMPONENT,I6,1H.)
  120 FORMAT (/16H DRVBAC: BACKUP ,A,13H INTO ELEMENT,I5,9H OF LIST ,A,
     1 1H.)
      END