summaryrefslogtreecommitdiff
path: root/Dragon/src/COMSDB.f
blob: 27e10f6301fd3cd3fbc7a81b6a22187ca7f37026 (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
*DECK COMSDB
      SUBROUTINE COMSDB(IMPX,IPCPO)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Show the structure of a multicompo file.
*
*Copyright:
* Copyright (C) 2008 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): R. Chambon
*
*Parameters: input
* IMPX    print parameter.
* IPCPO   pointer to the multicompo.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER IMPX
      TYPE(C_PTR) IPCPO
*----
*  LOCAL VARIABLES
*----
      PARAMETER (NSTATE=40,MAXPAR=50,MAXVAL=1000)
      TYPE(C_PTR) JPCPO,KPCPO
      INTEGER ISTATE(NSTATE),NVPO(2),NVALUE(2*MAXPAR)
      CHARACTER RECNAM*12,TEXT12*12,PARFMT(MAXPAR)*8,
     1 VCHAR(MAXVAL)*12,PARKEY(MAXPAR)*12,PARCPO(MAXPAR)*12
*----
*  ALLOCATABLE ARRAYS
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: MUPCPO,JDEBAR,JARBVA,VINTE
      REAL, ALLOCATABLE, DIMENSION(:) :: VREAL
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(MUPCPO(2*MAXPAR))
*
      CALL LCMGET(IPCPO,'STATE-VECTOR',ISTATE)
      NMIL=ISTATE(1)
      NCAL=ISTATE(3)
      MAXCAL=ISTATE(4)
      NPAR=ISTATE(5)
      NLOC=ISTATE(6)
      IF(NPAR+NLOC.GT.2*MAXPAR) CALL XABORT('COMSDB: MAXPAR OVERFLOW.')
      IF(NCAL.EQ.0) WRITE(6,*) 'The multi-compo DB is empty.'
*----
*  MAIN LOOP OVER THE HOMOGENEOUS MIXTURES *********************
*----
      JPCPO=LCMGID(IPCPO,'MIXTURES')
      DO 190 IBM=1,NMIL
      KPCPO=LCMDIL(JPCPO,IBM)
*----
*  MAIN LOOP OVER THE NCALR ELEMENTARY CALCULATIONS OF THE COMPO
*----
      WRITE(6,*) 'LIST OF "MUPLET" included in the COMPO'
      DO 170 ICAL=1,NCAL
*----
*  COMPUTE THE MUPLET VECTOR FROM THE COMPO
*----
      CALL LCMSIX(KPCPO,'TREE',1)
      CALL LCMGET(KPCPO,'NVP',NVPO)
      MAXNVP=NVPO(2)
      ALLOCATE(JDEBAR(MAXNVP+1),JARBVA(MAXNVP))
      CALL LCMGET(KPCPO,'NCALS',NCALS)
      CALL LCMGET(KPCPO,'DEBARB',JDEBAR)
      CALL LCMGET(KPCPO,'ARBVAL',JARBVA)
      I0=0
      DO 30 I=NVPO(1)-NCALS+1,NVPO(1)
      IF(JDEBAR(I+1).EQ.ICAL) THEN
         I0=I
         GO TO 40
      ENDIF
   30 CONTINUE
      CALL XABORT('COMSDB: MUPLET ALGORITHM FAILURE 1.')
   40 MUPCPO(NPAR+NLOC)=JARBVA(I0)
      DO 65 IPAR=NPAR+NLOC-1,1,-1
      I0=0
      DO 50 I=1,NVPO(1)-NCALS
      IF(JDEBAR(I+1).GT.I0) THEN
         I0=I
         GO TO 60
      ENDIF
   50 CONTINUE
      CALL XABORT('COMSDB: MUPLET ALGORITHM FAILURE 2.')
   60 MUPCPO(IPAR)=JARBVA(I0)
   65 CONTINUE
      DEALLOCATE(JARBVA,JDEBAR)
      CALL LCMSIX(KPCPO,' ',2)
      WRITE(6,*)'ICAL #',ICAL,': ',(MUPCPO(JM),JM=1,NPAR+NLOC)
      IF(IMPX.LE.1) GOTO 170
*----
*  RECOVER THE GLOBAL PARAMETERS
*----
         CALL LCMSIX(IPCPO,'GLOBAL',1)
         CALL LCMGTC(IPCPO,'PARKEY',12,NPAR,PARCPO)
         CALL LCMGTC(IPCPO,'PARFMT',8,NPAR,PARFMT)
         CALL LCMGET(IPCPO,'NVALUE',NVALUE)
         DO 100 IPAR=1,NPAR
            WRITE(RECNAM,'(''pval'',I8.8)') IPAR
            IVAL=MUPCPO(IPAR)
            IF(PARFMT(IPAR).EQ.'REAL') THEN
               ALLOCATE(VREAL(NVALUE(IPAR)))
               CALL LCMGET(IPCPO,RECNAM,VREAL)
               FLOTT=VREAL(IVAL)
               DEALLOCATE(VREAL)
               write(6,*)'IPAR ',IPAR,'->',PARCPO(IPAR),FLOTT
            ELSE IF(PARFMT(IPAR).EQ.'INTEGER') THEN
               ALLOCATE(VINTE(NVALUE(IPAR)))
               CALL LCMGET(IPCPO,RECNAM,VINTE)
               NITMA=VINTE(IVAL)
               DEALLOCATE(VINTE)
               write(6,*)'IPAR ',IPAR,'->',PARCPO(IPAR),NITMA
            ELSE IF(PARFMT(IPAR).EQ.'STRING') THEN
               IF(NVALUE(IPAR).GT.MAXVAL) CALL XABORT('COMSDB: MAXVAL '
     1         //'OVERFLOW.')
               CALL LCMGTC(IPCPO,RECNAM,12,NVALUE(IPAR),VCHAR)
               TEXT12=VCHAR(IVAL)
               write(6,*)'IPAR ',IPAR,'->',PARCPO(IPAR),TEXT12
            ENDIF
  100    CONTINUE
         CALL LCMSIX(IPCPO,' ',2)
*----
*  RECOVER THE LOCAL PARAMETERS
*----
      CALL LCMSIX(KPCPO,'TREE',1)
      DO 130 ILOC=1,NLOC
         WRITE(RECNAM,'(''pval'',I8.8)') ILOC
         IVAL=MUPCPO(NPAR+ILOC)
         CALL LCMLEN(KPCPO,RECNAM,ILONG,ITYLCM)
         ALLOCATE(VREAL(ILONG))
         CALL LCMGET(KPCPO,RECNAM,VREAL)
         FLOTT=VREAL(IVAL)
         DEALLOCATE(VREAL)
         WRITE(6,*)'ILOC ',ILOC,'->',PARKEY(IPAR),FLOTT
  130 CONTINUE
      CALL LCMSIX(KPCPO,' ',2)
  170 CONTINUE
* END OF LOOP ON CALCULATIONS. *******************************
      IF (IMPX.EQ.0) GOTO 190
      WRITE(6,*) 'Summary of the parameter included in the COMPO'
         CALL LCMSIX(IPCPO,'GLOBAL',1)
         CALL LCMGTC(IPCPO,'PARKEY',12,NPAR,PARCPO)
         CALL LCMGTC(IPCPO,'PARFMT',8,NPAR,PARFMT)
         CALL LCMGET(IPCPO,'NVALUE',NVALUE)
         DO 180 IPAR=1,NPAR
            WRITE(RECNAM,'(''pval'',I8.8)') IPAR
            IF(PARFMT(IPAR).EQ.'REAL') THEN
               ALLOCATE(VREAL(NVALUE(IPAR)))
               CALL LCMGET(IPCPO,RECNAM,VREAL)
               WRITE(6,*)'IPAR ',IPAR,'->',PARKEY(IPAR),
     1                   (VREAL(JM),JM=1,NVALUE(IPAR))
               DEALLOCATE(VREAL)
            ELSE IF(PARFMT(IPAR).EQ.'INTEGER') THEN
               ALLOCATE(VINTE(NVALUE(IPAR)))
               CALL LCMGET(IPCPO,RECNAM,VINTE)
               WRITE(6,*)'IPAR ',IPAR,'->',PARKEY(IPAR),
     1                   (VINTE(JM),JM=1,NVALUE(IPAR))
               DEALLOCATE(VINTE)
            ELSE IF(PARFMT(IPAR).EQ.'STRING') THEN
               IF(NVALUE(IPAR).GT.MAXVAL) CALL XABORT('COMSDB: MAXVAL '
     1         //'OVERFLOW.')
               CALL LCMGTC(IPCPO,RECNAM,12,NVALUE(IPAR),VCHAR)
               WRITE(6,*)'IPAR ',IPAR,'->',PARKEY(IPAR),
     1                   (VCHAR(JM),JM=1,NVALUE(IPAR))
            ENDIF
  180    CONTINUE
         CALL LCMSIX(IPCPO,' ',2)
      CALL LCMSIX(KPCPO,'TREE',1)
      DO 185 ILOC=1,NLOC
         CALL LCMGTC(IPCPO,'PARKEL',12,NLOC,PARCPO)
         CALL LCMGET(IPCPO,'NVALUE',NVALUE)
         WRITE(RECNAM,'(''pval'',I8.8)') ILOC
         CALL LCMLEN(KPCPO,RECNAM,ILONG,ITYLCM)
         ALLOCATE(VREAL(ILONG))
         CALL LCMGET(KPCPO,RECNAM,VREAL)
         WRITE(6,*)'ILOC ',ILOC,'->',PARCPO(ILOC),
     1             (VREAL(JM),JM=1,NVALUE(ILOC))
         DEALLOCATE(VREAL)
  185 CONTINUE
      CALL LCMSIX(KPCPO,' ',2)
      
  190 CONTINUE
* END OF LOOP ON MIXTURES. ***********************************
*
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(MUPCPO)
      RETURN
      END