summaryrefslogtreecommitdiff
path: root/Dragon/src/XDRTBH.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/XDRTBH.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/XDRTBH.f')
-rw-r--r--Dragon/src/XDRTBH.f165
1 files changed, 165 insertions, 0 deletions
diff --git a/Dragon/src/XDRTBH.f b/Dragon/src/XDRTBH.f
new file mode 100644
index 0000000..93a5311
--- /dev/null
+++ b/Dragon/src/XDRTBH.f
@@ -0,0 +1,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