summaryrefslogtreecommitdiff
path: root/Donjon/src/DETINI.f
blob: 395ab02b9769188fe4798dbd3560d990a4222fa0 (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
*DECK DETINI
      SUBROUTINE DETINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
*
*-----------------------------------------------------------------------
*
*Purpose:
*  Reads detector information and stores them 
*
*Copyright:
* Copyright (C) 2010 Ecole Polytechnique de Montreal.
*
*Author(s): 
* J. Koclas, E. Varin, M. Guyot
*
*Parameters: input
* NENTRY  number of data structures transfered to this module.
* HENTRY  name of the data structures.
* IENTRY  data structure type where:
*         IENTRY=1 for LCM memory object;
*         IENTRY=2 for XSM file;
*         IENTRY=3 for sequential binary file;
*         IENTRY=4 for sequential ASCII file.
* JENTRY  access permission for the data structure where:
*         JENTRY=0 for a data structure in creation mode;
*         JENTRY=1 for a data structure in modifications mode;
*         JENTRY=2 for a data structure in read-only mode.
* KENTRY  data structure pointer.
*
*Comments:
* The DETINI: module specification is:
* DETECT := DETINI: [ DETECT ] :: (descdet) ;
* where
*   DETECT : name of the \emph{detect} object that will be created by the 
*     module; it will contain the detector informations. If \emph{detect} 
*     appear on RHS, it is updated, otherwise, it is created.
*   (descdev) : structure describing the input data to the DETINI: module.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
      IMPLICIT NONE
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER      NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
      TYPE(C_PTR)  KENTRY(NENTRY)
      CHARACTER    HENTRY(NENTRY)*12
*----
*  LOCAL VARIABLES
*----
      INTEGER  NSTATE
      PARAMETER (NSTATE=40)
      CHARACTER TEXT*12,HSIGN*12
      INTEGER ISTATE(NSTATE),NGRP,NDETOT,IPRT,IHEX,ITYP,NITMA
      REAL FLOT
      DOUBLE PRECISION DFLOT      
      LOGICAL LHEX,LDET,LENTRY
      TYPE(C_PTR) IPDET
*----
*  PARAMETER VALIDATION
*----
      NDETOT = 0
      NGRP = 0
      LENTRY=.FALSE.
      ISTATE(:NSTATE)=0
*
      IF(NENTRY.NE.1) CALL XABORT('@DETINI: PARAMETER EXPECTED.')
      IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('@D'
     + //'ETINI: LINKED LIST OR XSM FILE EXPECTED AT LHS.')
      IF((JENTRY(1).NE.0).AND.(JENTRY(1).NE.1)) CALL XABORT('@D'
     + //'ETINI: CREATE OR MODIFICATION MODE EXPECTED.')
*
      IPDET=KENTRY(1)
      IF(JENTRY(1).EQ.1) THEN
        TEXT=HENTRY(1)
        LENTRY=.TRUE.
        CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN)
        IF(HSIGN.NE.'L_DETECT')CALL XABORT('@DETINI: L_DETECT'
     +   //' OBJECT IS EXPECTED (OBJECT='//TEXT//')')
        CALL LCMGET(IPDET,'STATE-VECTOR',ISTATE)
        NGRP = ISTATE(1)
        NDETOT = ISTATE(2)
      ENDIF
*----
*  READ INPUT DATA
*----
      IPRT = 0
      LHEX = .FALSE.
      LDET= .FALSE.
      IHEX = 0
   10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
      IF(ITYP.NE.3) CALL XABORT('@DETINI: CHARACTER DATA'
     +   //' EXPECTED(1).')
      IF(TEXT.EQ.'EDIT') THEN
        CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
        IF(ITYP.NE.1)CALL XABORT('@DETINI: INTEGER DATA EXPECTED(1).')
        IPRT=MAX(0,NITMA)
      ELSEIF(TEXT.EQ.'HEXZ')THEN
        LHEX=.TRUE.
      ELSEIF(TEXT.EQ.'NGRP')THEN
        CALL REDGET(ITYP,NGRP,FLOT,TEXT,DFLOT)
        IF(ITYP.NE.1)CALL XABORT('@DETINI: INTEGER DATA EXPECTED(2).')
        IF(JENTRY(1).EQ.1) THEN
          CALL XABORT('@DETINI: ENERGY GROUP NUMBER REQUIRED ONLY AT'
     +      //' CREATION OF L_DETECT OBJECT')
        ENDIF
      ELSEIF(TEXT.EQ.'TYPE')THEN
        CALL DETDRV(IPDET,NGRP,IPRT,LHEX,NDETOT,LENTRY)
      ELSEIF(TEXT.EQ.';')THEN
        LDET=.TRUE.
      ELSE
        CALL XABORT('@DETINI: INVALID KEYWORD '//TEXT)
      ENDIF
      IF(.NOT.LDET) GOTO 10
*----
*  STATE-VECTOR STORAGE
*----
      IF(JENTRY(1).EQ.0) THEN
        HSIGN='L_DETECT'
        CALL LCMSIX(IPDET,' ',0)
        CALL LCMPTC(IPDET,'SIGNATURE',12,HSIGN)
      ENDIF
      ISTATE(:NSTATE)=0
      ISTATE(1)=NGRP
      ISTATE(2)=NDETOT
      IF(LHEX) ISTATE(3)=1
      CALL LCMPUT(IPDET,'STATE-VECTOR',NSTATE,1,ISTATE)
      IF(IPRT.GT.2) CALL LCMLIB(IPDET)
      RETURN
      END