c
c
c
C.... File Name .............. GXSTRA.FOR ....................... 271107
SUBROUTINE GXSTRA(IDUMMY)
C-----------------------------------------------------------------------
C SUBROUTINE GXSTRA is called from EARTH once only, in order to set
c indices and print warnings if necessary.
C
C-----------------------------------------------------------------------
INCLUDE 'satear'
INCLUDE 'grdear'
COMMON/GENI/NXNY,IGFIL1(48),ITEM1,IGFIL2(5),IPRPS,IGFIL3(4)
c COMMON/ISTRA2/LBEX,LBEY,LBEZ,LBET,LBSX,LBSY,LBSZ,LBSXY,LBSYZ,LBSZX
c VIA : 29.06.08
COMMON/ISTRA2/LBEX,LBEY,LBEZ,LBET,LBSX,LBSY,LBSZ,LBSXY,LBSYZ,LBSXZ
COMMON/XYZCON/XCONST,YCONST,ZCONST
COMMON/NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
COMMON/DBE/dbear
LOGICAL dbear
COMMON/IGRND/IG(100)
C
c----VIA 06.05.07 :
COMMON /STRA05/ LCDM, ISLDIM, BCONST1, BCONST2, LCDMTIME,
1 cdmDTime1, cdmDTime2
LOGICAL LCDM, LCDMTIME
COMMON /STRA07/ KSU_LOWX, KSU_LOWY, KSU_LOWZ
COMMON/USPGLOB/USP, USPDBG
LOGICAL USP,USPDBG
C*****************************************************************
NAMSUB = 'GXSTRA'
C
C--- GROUP 1. Run title and other preliminaries
C
IF(IGR.EQ.1.AND.ISC.EQ.1) THEN
IF(IPRPS.EQ.0) THEN
CALL WRIT40('PRPS must be stored for solid stress')
CALL SET_ERR(512,
1 'Error. PRPS must be stored for solid stress.',1)
RETURN
ENDIF
XCONST=0.0 ! constants indicating restraining force
YCONST=0.0 ! exerted by container when NX, NY or NZ = 1
ZCONST=0.0 ! Default zero signifies no restraint
IF(NX.EQ.1) CALL GETSDR('BOUNDARY','XCONST',XCONST)
IF(NY.EQ.1) CALL GETSDR('BOUNDARY','YCONST',YCONST)
IF(NZ.EQ.1) CALL GETSDR('BOUNDARY','ZCONST',ZCONST)
IF(.NOT.NULLPR) THEN
CALL WRIT40('Stress-in-solids-related data')
CALL WRIT40('boundary-stress constants')
CALL WRIT3R('xconst ',xconst,'yconst ',yconst,
1 'zconst ',zconst)
CALL WRITST
CALL WRITBL
ENDIF
c
LBEX=LBNAME('EPSX') ! determine which of the post-processed
LBEY=LBNAME('EPSY') ! variables are required for printing or
LBEZ=LBNAME('EPSZ') ! plotting
LBET=LBNAME('EPST')
IF(LBET.GT.0) THEN
IF(ITEM1.LE.0) THEN
WRITE(14,*) 'store tem1 if thermal stress needed'
WRITE(14,*) 'if not, do not store epst'
WRITE(6,*) 'store tem1 if thermal stress needed'
WRITE(6,*) 'if not, do not store epst'
CALL SET_ERR(513, 'Error. See result file.',1)
RETURN
ENDIF
ENDIF
c----VIA 16.04.07 ---------------------------------------------------
LCDM = LBNAME('DISX').NE.0.OR.LBNAME('DISY').NE.0
1 .OR.LBNAME('DISZ').NE.0
if(.NOT.LCDM.AND.USP) then
WRITE(14,*) 'USP: For STRA=T CDM model is needed'
CALL SET_ERR(1050, 'USP: For STRA=T CDM model is needed',1)
RETURN
endif
if(LCDM) then
if(NZ.GT.1) then
IF(LBEX.LE.0.OR.LBEY.LE.0.OR.LBEZ.LE.0) THEN
WRITE(14,*) 'store EPSX/EPSY/EPSZ is needed'
CALL SET_ERR(513, 'Error. See result file.',1)
RETURN
ENDIF
endif
else
IF(LBEX.LE.0) THEN
WRITE(14,*) 'store EPSX is needed'
CALL SET_ERR(513, 'Error. See result file.',1)
RETURN
ENDIF
IF(LBEY.LE.0) THEN
WRITE(14,*) 'store EPSY is needed'
CALL SET_ERR(513, 'Error. See result file.',1)
RETURN
ENDIF
IF(LBEZ.LE.0) THEN
WRITE(14,*) 'store EPSZ is needed'
CALL SET_ERR(513, 'Error. See result file.',1)
RETURN
ENDIF
endif
LBSX=LBNAME('STRX')
LBSY=LBNAME('STRY')
LBSZ=LBNAME('STRZ')
LBSXY=LBNAME('STXY')
LBSYZ=LBNAME('STYZ')
LBSXZ=LBNAME('STXZ')
LCDMTIME = (LBNAME('VDSX').NE.0.OR.LBNAME('VDSY').NE.0
1 .OR.LBNAME('VDSZ').NE.0) .AND.
2 (.NOT.STEADY).AND. LCDM
IF(.NOT.NULLPR) THEN
CALL WRIT40('Stress-in-solids model:')
IF(LCDM) THEN
CALL WRIT40('Collocated-displacements method')
IF(LCDMTIME)
1 CALL WRIT40('and Time-dependent term (T-scheme)')
ELSE
CALL WRIT40('Staggered-displacements method')
ENDIF
CALL WRITST
ENDIF
c----- calculate variable for function CorrZ
IF(LCDM) THEN
ISLDIM = 0
BCONST1 = 0.0
BCONST2 = 0.0
if(NX.EQ.1.AND. NY.NE.1.AND.NZ.NE.1) then
if(XCONST.LE.0.9E20) then
ISLDIM = 1
BCONST1 = XCONST*1.e-11
endif
elseif(NY.EQ.1.AND. NX.NE.1.AND.NZ.NE.1) then
if(YCONST.LE.0.9E20) then
ISLDIM = 1
BCONST1 = YCONST*1.e-11
endif
elseif(NZ.EQ.1.AND. NX.NE.1.AND.NY.NE.1) then
if(ZCONST.LE.0.9E20) then
ISLDIM = 1
BCONST1 = ZCONST*1.e-11
endif
elseif(NX.EQ.1.AND.NY.EQ.1 .AND.NZ.NE.1) then
if(XCONST.LE.0.9E20.and.YCONST.LE.0.9E20) then
ISLDIM = 2
BCONST1 = XCONST*1.e-11
BCONST2 = YCONST*1.e-11
elseif(XCONST.GE.0.9E20.and.YCONST.LE.0.9E20) then
ISLDIM = 1
BCONST1 = YCONST*1.e-11
elseif(XCONST.LE.0.9E20.and.YCONST.GE.0.9E20) then
ISLDIM = 1
BCONST1 = XCONST*1.e-11
endif
elseif(NX.EQ.1.AND.NY.NE.1 .AND.NZ.EQ.1) then
if(XCONST.LE.0.9E20.and.ZCONST.LE.0.9E20) then
ISLDIM = 2
BCONST1 = XCONST*1.e-11
BCONST2 = ZCONST*1.e-11
elseif(XCONST.GE.0.9E20.and.ZCONST.LE.0.9E20) then
ISLDIM = 1
BCONST1 = ZCONST*1.e-11
elseif(XCONST.LE.0.9E20.and.ZCONST.GE.0.9E20) then
ISLDIM = 1
BCONST1 = XCONST*1.e-11
endif
elseif(NX.NE.1.AND.NY.EQ.1 .AND.NZ.EQ.1) then
if(YCONST.LE.0.9E20.and.ZCONST.LE.0.9E20) then
ISLDIM = 2
BCONST1 = YCONST*1.e-11
BCONST2 = ZCONST*1.e-11
elseif(YCONST.GE.0.9E20.and.ZCONST.LE.0.9E20) then
ISLDIM = 1
BCONST1 = ZCONST*1.e-11
elseif(YCONST.LE.0.9E20.and.ZCONST.GE.0.9E20) then
ISLDIM = 1
BCONST1 = ZCONST*1.e-11
endif
endif
if(USP) CALL USPSTRINIT(1)
ENDIF
ELSEIF(IGR.EQ.1.AND.ISC.EQ.3) THEN ! slab-wise storage
if(LCDM.AND.NZ.GT.1) then
if(USP) RETURN
N = NX*NY
if(NX.GT.1) CALL GXMAKE(KSU_LOWX,N,'SL_X')
if(NY.GT.1) CALL GXMAKE(KSU_LOWY,N,'SL_Y')
CALL GXMAKE(KSU_LOWZ,N,'SL_Z')
endif
ENDIF
C********************************************************************
C
C--- GROUP 19. Special calls to GROUND from EARTH
C
NAMSUB = 'gxstra'
END
***********************************************************************
c
c STRCAL is called from EARTH at print-out time in order to compute
c strains and stresses from the within-EARTH computed displacements.
C
C The displacements use the storage locations which, for the fluid
C region, are occupied by the velocities.
SUBROUTINE STRCAL
C----------------------------------------------------------------------
INCLUDE 'farray'
INCLUDE 'satear'
INCLUDE 'grdloc'
INCLUDE 'grdear'
INCLUDE 'prpcmn'
COMMON/F01/M0F(600)
cc COMMON/F0/IFIL1(33),KXYDZG,IFIL2(5),KXYDXG,KXYDYG,IFIL3(263)
COMMON/F0/IFIL0(7),KYR,IFIL1(25),KXYDZG,IFIL2(5),KXYDXG,KXYDYG,
1 IFIL3(263)
COMMON/GENI/NXNY,IGFIL1(5),NYST,IGFIL2(2),NFM,IGFIL3(50)
COMMON /NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
COMMON/ISTRA2/LBEX,LBEY,LBEZ,LBET,LBSX,LBSY,LBSZ,LBSXY,LBSYZ,LBSXZ
LOGICAL SLD
REAL LAMDA
c----VIA 16.04.07 :
COMMON /STRA05/ LCDM, ISLDIM, BCONST1, BCONST2, LCDMTIME,
1 cdmDTime1, cdmDTime2
LOGICAL LCDM, LCDMTIME
c----VIA 16.04.07 :
NAMSUB = 'STRCAL'
PRINTNUL=-1.234E-11 ! this prints as 'none'
C----------------------------------------------------------------------
C.... Compute zero locations, and other preliminaries.
C----------------------------------------------------------------------
if(LCDM) then
CALL DilateCDM
return
endif
CALL SUB4(L0EX,0,L0EY,0,L0EZ,0,L0ET,0)
CALL SUB4(L0SX,0,L0SY,0,L0SZ,0,L0TEM,0)
CALL SUB3(L0SXY,0,L0SYZ,0,L0SXZ,0)
IF(LBEX.NE.0) L0EX = L0F(LBEX)
IF(LBEY.NE.0) L0EY = L0F(LBEY)
IF(LBEZ.NE.0) L0EZ = L0F(LBEZ)
IF(LBET.NE.0) L0ET = L0F(LBET)
IF(LBSX.NE.0) L0SX = L0F(LBSX)
IF(LBSY.NE.0) L0SY = L0F(LBSY)
IF(LBSZ.NE.0) L0SZ = L0F(LBSZ)
IF(LBSXY.NE.0) L0SXY = L0F(LBSXY)
IF(LBSYZ.NE.0) L0SYZ = L0F(LBSYZ)
IF(LBSXZ.NE.0) L0SXZ = L0F(LBSXZ)
IF(IDRH1.NE.0) L0DRH1= L0F(IDRH1)
IF((L0EX+L0EY+L0EZ+L0ET+L0SX+L0SY+L0SZ).EQ.0) RETURN
C----------------------------------------------------------------------
C.... Calculate normal stresses.
C----------------------------------------------------------------------
DO IDIR =1,3 ! loop over all three directions
! direct stresses
IF(IDIR.EQ.1) THEN ! x-direction.
IF(L0SX.NE.0.AND.L0EX.NE.0) THEN
L0S=L0SX
L0E=L0EX
GO TO 10 ! compute stresses
ELSE
GO TO 11 ! skip
ENDIF
ELSEIF(IDIR.EQ.2) THEN ! y-direction.
IF(L0SY.NE.0.AND.L0EY.NE.0) THEN
L0S=L0SY
L0E=L0EY
GO TO 10 ! compute stresses
ELSE
GO TO 11 ! skip
ENDIF
ELSEIF(IDIR.EQ.3) THEN ! Z-direction.
IF(L0SZ.NE.0.AND.L0EZ.NE.0) THEN
L0S=L0SZ
L0E=L0EZ
GO TO 10 ! compute stresses
ELSE
GO TO 11 ! skip
ENDIF
ENDIF
10 DO I=1,NXNY ! compute stresses
IF(SLD(I)) THEN
DILSTR = LAMDA(I)*F(M0F(1)+I)
EPSSTR = TWOG(I)*F(L0E+I)
STRESS = DILSTR + EPSSTR
TESTSTR= ABS(DILSTR)+ABS(EPSSTR)
IF(LBET.GT.0) THEN
THESTR = - AITCH(I)*T1VALI(I)
STRESS = STRESS + THESTR
TESTSTR= TESTSTR + ABS(THESTR)
ENDIF
IF(ABS(STRESS).LT.1.0E-4*TESTSTR) ! set to
1 STRESS=0.0 ! zero resultant stresses when affected by round-off
F(L0S+I) = STRESS * 1.E11 ! restore correct magnitude
ELSE
F(L0S+I) = PRINTNUL
F(L0E+I) = PRINTNUL
ENDIF
ENDDO
11 CONTINUE
! shear stresses
IF(IDIR.EQ.1) THEN ! x-direction.
IF(L0SYZ.NE.0) THEN
c L0NUM1=M0F(5) ! NUM refers to numerator, always a displacement
c L0NUM2=M0F(7)
c L0DEN1=KXYDZG ! NUM refers to denominator, always a distance
c L0DEN2=KXYDYG ! interval
c Str = dV/DZ+dW/dY
c IADD1=NYST
c IADD2=NFM
L0NUM2=M0F(5) ! NUM refers to numerator, always a displacement
L0NUM1=M0F(7)
L0DEN2=KXYDZG ! NUM refers to denominator, always a distance
L0DEN1=KXYDYG ! interval
IADD2=NFM
IADD1=1
CALL CONNXY(KXYDZG,DZG)
L0S=L0SYZ
GO TO 20 ! compute stresses
ELSE
GO TO 21 ! skip
ENDIF
ELSEIF(IDIR.EQ.2) THEN ! y-direction.
IF(L0SXZ.NE.0) THEN
L0NUM1=M0F(7)
L0NUM2=M0F(3)
L0DEN1=KXYDXG
L0DEN2=KXYDZG
c Str = dU/DZ+dW/dX
c IADD1=NFM
c IADD2=1
IADD1=NY
IADD2=NFM
CALL CONNXY(KXYDZG,DZG)
L0S=L0SXZ
GO TO 20 ! compute stresses
ELSE
GO TO 21 ! skip
ENDIF
ELSEIF(IDIR.EQ.3) THEN ! Z-direction.
IF(L0SXY.NE.0) THEN
c Str = dU/DY+dV/dX
L0NUM1=M0F(3)
L0NUM2=M0F(5)
L0DEN1=KXYDYG
L0DEN2=KXYDXG
IADD1=1
IADD2=NY
L0S=L0SXY
GO TO 20 ! compute stresses
ELSE
GO TO 21 ! skip
ENDIF
ENDIF
c 20 DO I=1,NXNY ! compute stresses
c IF(SLD(I).AND.SLD(I+IADD1)) THEN
c F(L0S+I) = ( F(L0NUM1+I+IADD1) - F(L0NUM1+I) )/F(L0DEN1+I)
c 1 + ( F(L0NUM2+I+IADD2) - F(L0NUM2+I) )/F(L0DEN2+I)
c F(L0S+I) = F(L0S+I) * ONEG(I) * 1.E11
c ELSE
20 CONTINUE
IF(L0NUM1.EQ.0.OR.L0NUM2.EQ.0) GO TO 21
DO IX=1,NX
IADD = (IX-1)*NY
DO IY=1,NY
I = IY+IADD
F(L0S+I) = PRINTNUL
IF(IDIR.EQ.3.AND.(IX.EQ.NX.OR.IY.EQ.NY)) GO TO 30
IF(IDIR.EQ.1.AND.(IZ.EQ.NZ.OR.IY.EQ.NY)) GO TO 30
IF(IDIR.EQ.2.AND.(IZ.EQ.NZ.OR.IX.EQ.NX)) GO TO 30
Stress = 0.0
NoDiriv = 0
IF(SLD(I).AND.SLD(I+IADD1)) THEN
NoDiriv = 1
Stress = ( F(L0NUM1+I+IADD1) - F(L0NUM1+I) )/F(L0DEN1+I)
if(.NOT.CARTES.AND.IDIR.EQ.3) then
Stress = Stress - 0.5*(F(L0NUM1+I+IADD1)/F(KYR+IY+1)
1 +F(L0NUM1+I)/F(KYR+IY))
endif
ENDIF
IF(SLD(I).AND.SLD(I+IADD2)) THEN
NoDiriv = NoDiriv+1
Stress = Stress+
1 (F(L0NUM2+I+IADD2)-F(L0NUM2+I))/F(L0DEN2+I)
ENDIF
IF(NoDiriv.NE.0) F(L0S+I) = Stress * ONEG(I) * 1.E11
30 CONTINUE
ENDDO
ENDDO
21 CONTINUE
ENDDO
NAMSUB = 'STRCAL'
END
C
C-----------------------------------------------------------------------
c