summaryrefslogtreecommitdiff
path: root/Donjon/src/D2PADF.f
blob: 7cbb7358684df8b8c7e6d1fb81bbe7da81a78fd1 (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
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
*DECK D2PADF
      SUBROUTINE D2PADF (IPDAT,IPRINT,NG,NMIL, ADF, NSF, DIFC,CURRN,
     1 SRFLX,ZAFLX,RPAR,IPAR,ADF_T,STAIDX,NVAR)
*
*-----------------------------------------------------------------------
*
*Purpose:
* CALL to GET_SAP_ADF to recover ADF information.
*
*Author(s): 
* J. Taforeau
*
*Parameters: 
* IPDAT    
* IPRINT   
* NG       
* NMIL     
* ADF      
* NSF      
* DIFC     
* CURRN    
* SRFLX    
* ZAFLX    
* RPAR     
* IPAR     
* ADF_T    
* STAIDX   
* NVAR     
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPDAT,IPTH,KPTH
      INTEGER IPRINT,NG,NMIL,NSF,IPAR(3,NSF),NVAR
      REAL ADF(NSF,NG,10),DIFC(NG),CURRN(NSF,NG,2),SRFLX(NSF,NG),
     1 ZAFLX(NMIL,NG)
      DOUBLE PRECISION RPAR(6,NSF)
      CHARACTER*3 ADF_T
      INTEGER STAIDX(NVAR)   ! Index of current branch state values
*----
*  LOCAL VARIABLES
*----
      REAL SIDE,APOTHEM,VOLUME
      INTEGER :: NSD = 4
      INTEGER TOS(-1:1,-1:1)
      REAL SIGF(4)
      INTEGER DX, DY, SOT, IAXIS
      INTEGER  NAXIS,NPAIR(2),CAXIS(4),PAXIS(0:1,2),TRF_I(2,4)
      INTEGER  ICELL(2),NSURF(2)
      INTEGER IND, NZ, NC, IPAIR, IA, IP, NSURFAC,P, TR,NS,NGRP
      REAL*8 :: J_NET,J_PLUS,J_MINOS,FI_HET,TRANSV_CURR,FI_HOMOG,FAVE
      REAL*8 :: J_SUMM
      REAL :: B2_VECT(NMIL,NG), DIFF_C(NMIL,NG) ! B2 and D vectors
      REAL :: APOTH(NMIL,4)
      LOGICAL :: HASSYM(2,NMIL)
      INTEGER INTCORR(0:1,1,2)
      REAL CURR_INFO(1:(NMIL+1),NG,NSF,9)

      IF(NMIL > 1) CALL XABORT ('@D2P: MORE THAN 1 MIXTRURE ')
      IF(NSF .NE. NSD) CALL XABORT('@D2PADF: NUMBER OF SURFACE NE 4')

      SIDE= REAL(MAXVAL(RPAR(5,:)))
      APOTHEM= SIDE/2.0
      VOLUME= NSF*SIDE*APOTHEM/2.0
      CURR_INFO= 0.0
      ! TOS is the interface number corresponding to the cell
      ! to the right of the equation number (interface)
      TOS= 0
      TOS( 0, 1)= 4 !DX=0 DY>0 west
      TOS( 0,-1)= 2 !DX=0 DY<0 east
      TOS( 1, 0)= 1 !DX>0 DY=0 north
      TOS(-1, 0)= 3 !DX<0 DY=0 south

      SIGF(1)= 1.
      SIGF(2)= 1.
      SIGF(3)= 1.
      SIGF(4)= 1.

      !deltas in sense counterclokwise around the geometry
      !AXIS 1 DX>0 DY=0
      !AXIS 2 DX=0 DY>0
      NPAIR= 0
      NAXIS= 2

      INTCORR= 0
      !AXIS 1
      INTCORR(0,1,1)= 1
      INTCORR(1,1,1)= 3
      NPAIR(1)= 1
      !AXIS 2
      INTCORR(0,1,2)= 2
      INTCORR(1,1,2)= 4
      NPAIR(2)= 1

      !axis not crossing the surface
      CAXIS(1)= 1
      CAXIS(2)= 2
      CAXIS(3)= CAXIS(1)
      CAXIS(4)= CAXIS(2)
      !axis crossing a surface
      PAXIS(0,1)= 2
      PAXIS(1,1)= 4
      PAXIS(0,2)= 1
      PAXIS(1,2)= 3

      HASSYM= .FALSE.
      ! coefficient related to the transversal component of the J+.
      ! each surface has its 2 transversal components
      ! first surface
      TRF_I(1,1)= 2
      TRF_I(2,1)= 4

      ! 2-nd surface
      TRF_I(1,2)= 1
      TRF_I(2,2)= 3

      ! 3-th surface
      TRF_I(1,3)= 2
      TRF_I(2,3)= 4

      ! 4-th surface
      TRF_I(1,4)= 1
      TRF_I(2,4)= 3

      ADF=0.0
      SOT=0

      CURR_INFO= 0.0 !this is needed to know where to apply simmetries

      DO NS= 1,NSF

         ICELL(1)= IPAR(2,NS)
         ICELL(2)= IPAR(3,NS)

         IF(RPAR(3,NS).LT.-1.E-3) THEN
          DX = -1
         ELSEIF(RPAR(3,NS).GT.1.E-3) THEN
          DX = 1
         ELSE
          DX = 0
         ENDIF

         IF(RPAR(4,NS).LT.-1.E-3) THEN
          DY = -1
         ELSEIF(RPAR(4,NS).GT.1.E-3) THEN
          DY = 1
         ELSE
          DY = 0
         ENDIF
         ! check for the boundary regions

         IF(ICELL(1).LE.0) THEN
          ICELL(1)= NMIL+1
!           WRITE (*,*) 'BORDER TO THE RIGHT! MESH CH  ', ICELL(1)
         ENDIF

         IF(ICELL(2).LE.0) THEN
           ICELL(2)= NMIL+1
!           WRITE (*,*) 'BORDER TO THE LEFT! MESH CH   ', ICELL(2)
         ENDIF
         ! equations at the boundary:
         ! mesh on the left indicator of the surface ------------
         IF(TOS(DX,DY).EQ.1) SOT= 3
         IF(TOS(DX,DY).EQ.2) SOT= 4
         IF(TOS(DX,DY).EQ.3) SOT= 1
         IF(TOS(DX,DY).EQ.4) SOT= 2
         !
         !-------------------------------------------------------
         ! loop for the values of the J+-, J, FI
         DO NGRP= 1,NG
          ! J+
          CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),1)=
     >     CURRN(NS,NGRP,2)/REAL(RPAR(5,NS))
          CURR_INFO(ICELL(2),NGRP,SOT,1)=
     >    CURRN(NS,NGRP,1)/REAL(RPAR(5,NS))
          ! J-
          CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),2)=
     >    CURRN(NS,NGRP,1)/REAL(RPAR(5,NS))
          CURR_INFO(ICELL(2),NGRP,SOT       ,2)=
     >    CURRN(NS,NGRP,2)/REAL(RPAR(5,NS))

          ! J
          CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),3)=
     >    CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),1) -
     >    CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),2)

          CURR_INFO(ICELL(2),NGRP,SOT       ,3)=
     >    CURR_INFO(ICELL(2),NGRP,SOT       ,1) -
     >    CURR_INFO(ICELL(2),NGRP,SOT       ,2)
          ! F-surf(het)
          IF(ICELL(1).EQ.(NMIL+1)) THEN
             IF(HASSYM(CAXIS(SOT),ICELL(2))) THEN
                CURR_INFO(ICELL(2),NGRP,SOT,4) = 0.0
             ELSE
                CURR_INFO(ICELL(2),NGRP,SOT,4) = SRFLX(NS,NGRP)
     >          / REAL(RPAR(5,NS))
             ENDIF
          ELSEIF(ICELL(2).EQ.(NMIL+1)) THEN
             IF(HASSYM(CAXIS(TOS(DX,DY)),ICELL(1))) THEN
                CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),4) = 0.0
             ELSE
                CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),4) =
     >           SRFLX(NS,NGRP)/REAL(RPAR(5,NS))
             ENDIF
          ELSE ! both cells are real
            CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),4) =
     >       SRFLX(NS,NGRP)/REAL(RPAR(5,NS))
            CURR_INFO(ICELL(2),NGRP,SOT       ,4) =
     >       SRFLX(NS,NGRP)/REAL(RPAR(5,NS))
          ENDIF
         ! side dimension
          CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),9)= REAL(RPAR(5,NS))
          CURR_INFO(ICELL(2),NGRP,SOT       ,9)= REAL(RPAR(5,NS))

          NSURF(1)= TOS(DX,DY)
          NSURF(2)= SOT
          DO IND= 1,2
           IF(ICELL(IND) < (NMIL+1)) THEN
            NZ= ICELL(IND)
            ! FI
            CURR_INFO(NZ,NGRP,:,5)=ZAFLX(NZ,NGRP)
           ENDIF
          ENDDO
         ENDDO
      ENDDO ! NS

      DO NC= 1,NMIL
         DO IAXIS= 1,NAXIS
          IF(HASSYM(IAXIS,NC)) THEN
           DO IPAIR= 1,NPAIR(IAXIS)
            ! put current value in the interface in front of it
            IF(CURR_INFO(NC,1,INTCORR(0,IPAIR,IAXIS),4).NE.0.) THEN
               CURR_INFO(NC,:,INTCORR(1,IPAIR,IAXIS),1:9)=
     >         CURR_INFO(NC,:,INTCORR(0,IPAIR,IAXIS),1:9)
            ELSEIF(CURR_INFO(NC,1,INTCORR(1,IPAIR,IAXIS),4).NE.0.)
     >       THEN
               CURR_INFO(NC,:,INTCORR(0,IPAIR,IAXIS),1:9)=
     >         CURR_INFO(NC,:,INTCORR(1,IPAIR,IAXIS),1:9)
            ENDIF
           ENDDO
          ENDIF
         ENDDO

         ! now put the possible zero dimension values
         DO IA= 1,NAXIS
          DO IP= 1,NPAIR(IA)
           ! put current value in the interface in front of it
           IF(CURR_INFO(NC,1,INTCORR(0,IP,IA),9) .NE. 0.) THEN
           ELSE
            CURR_INFO(NC,:,INTCORR(0,IP,IA),1:9) =
     >       CURR_INFO(NC,:,INTCORR(1,IP,IA),1:9)
           ENDIF
           IF(CURR_INFO(NC,1,INTCORR(1,IP,IA),9) .NE. 0.)THEN
           ELSE
            CURR_INFO(NC,:,INTCORR(1,IP,IA),1:9) =
     >       CURR_INFO(NC,:,INTCORR(0,IP,IA),1:9)
           ENDIF
          ENDDO
         ENDDO
      ENDDO ! NC

!-------------------------------------------------------
      DO NC= 1,NMIL
         DO NSURFAC= 1,NSD
          DO NGRP= 1,NG

           DIFF_C(NC,NGRP)= DIFC(NGRP)
           J_PLUS = CURR_INFO(NC,NGRP,NSURFAC,1)
           J_MINOS= CURR_INFO(NC,NGRP,NSURFAC,2)
           J_NET  = CURR_INFO(NC,NGRP,NSURFAC,3)
           FI_HET = CURR_INFO(NC,NGRP,NSURFAC,4)
           FAVE   = CURR_INFO(NC,NGRP,NSURFAC,5)

           APOTH(NC,NSURFAC)=
     >     CURR_INFO(NC,NGRP,PAXIS(0,CAXIS(NSURFAC)),9)/2.0
           CURR_INFO(NC,NGRP,NSURFAC,8)= APOTH(NC,NSURFAC)
           FI_HOMOG = SIGF(NSURFAC)*J_NET * APOTH(NC,NSURFAC)
     >     / DIFF_C(NC,NGRP) + FAVE
           ! FG:
           CURR_INFO(NC,NGRP,NSURFAC,6)= REAL(FI_HET / FI_HOMOG)
           ! FS:
           CURR_INFO(NC,NGRP,NSURFAC,7)= REAL(2. *
     >                ( J_PLUS + J_MINOS ) / FI_HOMOG)

          ENDDO !NGRP
         ENDDO !NSURFAC
      ENDDO !NC
      !
      ! B2 loop:
      !
      DO NCELL= 1,NMIL
         DO NGRP= 1,NG
          J_SUMM = SUM(CURR_INFO(NCELL,NGRP,:,3))

          B2_VECT(NCELL,NGRP)= REAL(J_SUMM / ( DIFF_C(NCELL,NGRP)
     >    * CURR_INFO(NCELL,NGRP,1,5) ))
         ENDDO
      ENDDO

      DO NCELL= 1,NMIL
         DO NGRP= 1,NG
          DO NSURFAC= 1,NSD
           ! TRANSVERSAL CURRENTS SUMMATION
           TRANSV_CURR= 0.
           DO TR= 1,2
            TRANSV_CURR= TRANSV_CURR +
     >      CURR_INFO(NCELL,NGRP,TRF_I(TR,NSURFAC),3)
           ENDDO
            ! no need to be stored !!!!
            ! CURR_INFO(NCELL,NGRP,NSURFAC,8)= TRANSV_CURR
          ENDDO
         ENDDO
      ENDDO
      ! store new IDF in the corresponding module to be used in
      ! writenemtab
      DO NCELL= 1,NMIL
        DO NGRP= 1,NG
          ! B2XS(K,NCELL,NGRP)=B2_VECT(NCELL,NGRP)
          DO NSURFAC= 1,NSD
            DO P=1,9
              ! 1 ->  J+
              ! 2 ->  J-
              ! 3 ->  J
              ! 4 ->  F-surf
              ! 5 ->  F-ave
              ! 6 ->  GET_IDF
              ! 7 ->  SEL_IDF
              ! 8 ->  apotheme
              ! 9 ->  side length
              ADF(NSURFAC,NGRP,P)=CURR_INFO(NCELL,NGRP,NSURFAC,P)
            ENDDO
          ENDDO
        ENDDO
      ENDDO

      IF(IPRINT > 1) THEN
        WRITE(6,*) "*** RECOVER ASSEMBLY DISCONTINUITY FACTOR ***"
        IF(ADF_T.EQ.'GET') WRITE(6,*) "ADF TYPE : GET "
        IF(ADF_T.EQ.'SEL') WRITE(6,*) "ADF TYPE : SELENGUT "
       DO NGRP=1, NG
        WRITE(6,*) "GROUP             :",NGRP
         IF(ADF_T.EQ.'GET') WRITE(6,*)"ADF(N/E/S/W) :",ADF (:,NGRP,6)
         IF(ADF_T.EQ.'SEL') WRITE(6,*)"ADF(N/E/S/W) :",ADF (:,NGRP,7)
       ENDDO
      ENDIF

      CALL LCMSIX(IPDAT,' ',0)
      CALL LCMSIX(IPDAT,'SAPHYB_INFO',1)
      CALL LCMSIX(IPDAT,' ',0)
      CALL LCMSIX(IPDAT,'BRANCH_INFO',1)
      IPTH=LCMGID(IPDAT,'CROSS_SECT')
      KPTH=LCMDIL(IPTH,STAIDX(NVAR))
      CALL LCMSIX(KPTH,'MACROLIB_XS',1)
      IF(ADF_T.EQ.'GET') THEN
       CALL LCMPUT(KPTH,'ADF',NSF*NG,2,ADF(:,:,6))
      ELSEIF(ADF_T.EQ.'SEL') THEN
       CALL LCMPUT(KPTH,'ADF',NSF*NG,2,ADF(:,:,7))
      ELSE
       CALL XABORT('@D2PADF: UNKNOW ADF TYPE'//ADF_T//'.')
      ENDIF
      END