summaryrefslogtreecommitdiff
path: root/Dragon/src/XDRTBH.f
blob: 93a531166905aaa444f7e8409b15dd576b1ca02d (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
*DECK XDRTBH
      SUBROUTINE XDRTBH(IPGEOM,IPTRK,IQUA10,IBIHET,IMPX,FRTM)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Recover the double-heterogeneity (Bihet) data from the geometry
* object IPGEOM and update the tracking object IPTRK.
*
*Copyright:
* Copyright (C) 2005 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
* IPTRK   pointer to the excell tracking (L_TRACK).
* IPGEOM  pointer to the geometry (L_GEOM).
* IQUA10  quadrature parameter for the double heterogeneity option.
* IBIHET  type of double-heterogeneity method: =1 Sanchez-Pomraning
*         model; =2 Hebert model; =3 She-Liu-Shi model (no shadow);
*         =4 She-Liu-Shi model (with shadow).
* IMPX    tracking print level.
* FRTM    minimum volume fraction of the grain in the representative 
*         volume for She-Liu-Shi model.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPGEOM,IPTRK
      INTEGER IQUA10,IBIHET,IMPX
      REAL FRTM
*----
*  LOCAL VARIABLES
*----
      PARAMETER (NSTATE=40)
      INTEGER ISTRAK(NSTATE),ISTATE(NSTATE),IPARAM(8)
      CHARACTER CDOOR*12
      INTEGER, ALLOCATABLE, DIMENSION(:) :: NS,IBI,MAT,IDIL,MIXGR,KEYF1,
     1 KEYF2
      REAL, ALLOCATABLE, DIMENSION(:) :: RS,FRACT,VOLK,VOL
*
      IF(IQUA10.EQ.0) CALL XABORT('XDRTBH: INVALID IQUA10.')
      IF(IBIHET.EQ.0) CALL XABORT('XDRTBH: INVALID IBIHET.')
*
      CALL LCMGET(IPTRK,'STATE-VECTOR',ISTRAK)
      NREG2=ISTRAK(1)
      NUN2=ISTRAK(2)
      IR2=ISTRAK(4)
      CALL LCMSIX(IPGEOM,'BIHET',1)
      CALL LCMGET(IPGEOM,'STATE-VECTOR',ISTATE)
      NG=ISTATE(1)
      NSMAX=ISTATE(2)-1
      ALLOCATE(NS(NG))
      CALL LCMGET(IPGEOM,'NS',NS)
      NSMAX=0
      DO 10 I=1,NG
      NSMAX=MAX(NSMAX,NS(I))
   10 CONTINUE
*
      ALLOCATE(IBI(NREG2))
      ALLOCATE(RS(NG*(1+NSMAX)),FRACT(NG*IR2),VOLK(NG*NSMAX))
*
      MAXPTS=NREG2*(NSMAX+1)*NG
      ALLOCATE(MAT(MAXPTS),VOL(MAXPTS))
      CALL LCMGET(IPTRK,'MATCOD',MAT)
      CALL LCMGET(IPTRK,'VOLUME',VOL)
      CALL LCMSIX(IPTRK,'BIHET',1)
      CALL LCMPUT(IPTRK,'IBI',NREG2,1,MAT)
      CALL LCMPUT(IPTRK,'VOLUME',NREG2,2,VOL)
      CALL LCMSIX(IPTRK,' ',2)
*
      DO 20 I=1,NREG2
      IBI(I)=MAT(I)
   20 CONTINUE
*----
*  RECOVER DOUBLE-HETEROGENEITY INFORMATION FROM GEOMETRY OBJECT
*----
      ALLOCATE(IDIL(IR2),MIXGR(NG*NSMAX*IR2))
      CALL READBH(MAXPTS,IPGEOM,IR1,IR2,NREG,NREG2,MAT,VOL,NG,NSMAX,
     1 MICRO,NS,IBI,RS,FRACT,VOLK,IMPX,IDIL,MIXGR)
      DEALLOCATE(IBI)
      IF(IMPX.GE.1) THEN
         WRITE (6,'(/" QUADRATURE PARAMETER FOR THE MICRO STRUC",
     1   "TURES =",I2/)') IQUA10
         WRITE (6,'(" TYPE OF DOUBLE HETEROGENEITY MODEL (1/2: ",
     1   "SANCHEZ-POMRANING/HEBERT)=",I2/)') IBIHET
      ENDIF
      CALL LCMSIX(IPGEOM,' ',2)
*----
*  RESET STATE-VECTOR INFORMATION
*----
      IPARAM(1)=IR1
      IPARAM(2)=IR2
      IPARAM(3)=NREG2
      IPARAM(4)=NG
      IPARAM(5)=NSMAX
      IPARAM(6)=IBIHET
      IPARAM(7)=MICRO
      IPARAM(8)=IQUA10
      CALL LCMSIX(IPTRK,'BIHET',1)
      CALL LCMPUT(IPTRK,'PARAM',8,1,IPARAM)
      CALL LCMPUT(IPTRK,'NS',NG,1,NS)
      CALL LCMPUT(IPTRK,'RS',NG*(1+NSMAX),2,RS)
      CALL LCMPUT(IPTRK,'FRACT',NG*IR2,2,FRACT)
      CALL LCMPUT(IPTRK,'VOLK',NG*NSMAX,2,VOLK)
      CALL LCMPUT(IPTRK,'IDIL',IR2-IR1,1,IDIL)
      CALL LCMPUT(IPTRK,'MIXGR',NG*NSMAX*(IR2-IR1),1,MIXGR)
      CALL LCMPUT(IPTRK,'FRTM',1,2,FRTM)
      DEALLOCATE(MIXGR,IDIL,NS)
      DEALLOCATE(VOLK,FRACT,RS)
      CALL LCMSIX(IPTRK,' ',2)
      CALL LCMGET(IPTRK,'STATE-VECTOR',ISTRAK)
      ISTRAK(1)=NREG
      ISTRAK(2)=NUN2+(NREG-NREG2)
      ISTRAK(4)=IR1
      CALL LCMPUT(IPTRK,'STATE-VECTOR',NSTATE,1,ISTRAK)
      CALL LCMPUT(IPTRK,'MATCOD',NREG,1,MAT)
      CALL LCMPUT(IPTRK,'VOLUME',NREG,2,VOL)
      DEALLOCATE(VOL,MAT)
*----
*  RESET KEYFLX AND KEYFLX$ANIS
*----
      CALL LCMGTC(IPTRK,'TRACK-TYPE',12,CDOOR)
      IF((CDOOR.EQ.'MCCG').OR.(CDOOR.EQ.'SN')) THEN
         CALL LCMLEN(IPTRK,'KEYFLX$ANIS',LKFL,ITYLCM)
         NFUNL=LKFL/NREG2
         ALLOCATE(KEYF1(NREG*NFUNL),KEYF2(NREG2*NFUNL))
         CALL LCMGET(IPTRK,'KEYFLX$ANIS',KEYF2)
         KEYF1(:NREG*NFUNL)=0
         DO 35 INF=1,NFUNL
         DO 30 I=1,NREG2
         IOF1=(INF-1)*NREG+I
         IOF2=(INF-1)*NREG2+I
         KEYF1(IOF1)=KEYF2(IOF2)
   30    CONTINUE
   35    CONTINUE
         IUNK=NUN2
         DO 40 I=NREG2+1,NREG
         IUNK=IUNK+1
         KEYF1(I)=IUNK
   40    CONTINUE
         CALL LCMPUT(IPTRK,'KEYFLX',NREG,1,KEYF1(:NREG))
         CALL LCMPUT(IPTRK,'KEYFLX$ANIS',NREG*NFUNL,1,KEYF1)
         DEALLOCATE(KEYF2,KEYF1)
      ELSE
        ALLOCATE(KEYF1(NREG))
        KEYF1(:NREG)=0
        CALL LCMGET(IPTRK,'KEYFLX',KEYF1(:NREG2))
        IUNK=NUN2
        DO 50 I=NREG2+1,NREG
        IUNK=IUNK+1
        KEYF1(I)=IUNK
   50    CONTINUE
        CALL LCMPUT(IPTRK,'KEYFLX',NREG,1,KEYF1)
        DEALLOCATE(KEYF1)
      ENDIF
      RETURN
      END