Next: Listing for stat3d.c Up: Computer programs for Previous: Listing for genpart3d.c


Listing for rand3d.f

C 
C     Program RAND3D.F: to create a 100*100*100 
C     microstructure based on filtering Gaussian 
C     noise with autocorrelation filter of a 2-D
C     image
C     Programmer: Dale Bentz (dale.bentz@nist.gov)
C     Date: 1993
C     1995: Modified to filter random particle images 
C     for cement hydration model
C  
      INTEGER SEED,SYSSIZE,IRES
      REAL SNEW,S2,SS,SDIFF,PHASEIN,PHASEOUT,XTMP,YTMP
      REAL NORMM(100,100,100),RES(100,100,100)
      REAL MASK(100,100,100)
      REAL FILTER(31,31,31)
      INTEGER R(60)
      REAL S(60),XR(60),SUM(501)
      REAL T1,T2,X1,X2,U1,U2,XRAD,RESMAX,RESMIN
      INTEGER R1,R2,I1,I2,I3,I,J,K,J1,K1
      INTEGER IDO,III,JJJ,IX,IY,IZ,INDEX
      REAL PI,XTOT,FILVAL,RADIUS,XPT,SECT,SUMTOT,VCRIT
      CHARACTER*80 FILEN,FILEM

      PI=3.1415926
      SYSSIZE=100
      WRITE(6,*)'Input random seed'
      READ(5,*)SEED
      WRITE(6,*)SEED
C
C     In this version, only a portion of the original 3-D image is filtered
C     so that for instance, silicates may be separated into C3S and C2S
C     without modification of the aluminate and gypsum phases
C
      WRITE(6,*)'Input existing phase assignment for matching'
      READ(5,*)PHASEIN
      WRITE(6,*)PHASEIN
      WRITE(6,*)'Input phase assignment to be created'
      READ(5,*)PHASEOUT
      WRITE(6,*)PHASEOUT
C
C      Read in mask image (particles) from file
C
      WRITE(6,*)'Enter name of cement microstructure image file'
      READ(5,*)FILEM
      OPEN(13,FILE=FILEM,STATUS='OLD')

      DO 19 I=1,SYSSIZE
      DO 19 J=1,SYSSIZE
      DO 19 K=1,SYSSIZE
  19  READ(13,*)MASK(I,J,K)

      CLOSE(13)
C
C      Create the gaussian noise image
C      by appropriately modifying uniform noise
C      image
C      Source: Law, A.M, and Kelton, W.D., 
C      Simulation Modeling and Analysis, McGraw-Hill, 1982.
C
      I1=1
      I2=1
      I3=1
      DO 70 I=1,500000
      U1=RAN1(SEED)
      U2=RAN1(SEED)
      T1=2.*PI*U2
      T2=(-2.*LOG(U1))**0.5
      X1=COS(T1)*(T2)
      X2=SIN(T1)*(T2)
      NORMM(I1,I2,I3)=X1
      I1=I1+1
      IF(I1.GT.SYSSIZE) THEN
        I1=1
        I2=I2+1
        IF(I2.GT.SYSSIZE) THEN
          I2=1
          I3=I3+1
        ENDIF
      ENDIF
      NORMM(I1,I2,I3)=X2
      I1=I1+1
      IF(I1.GT.SYSSIZE) THEN
        I1=1
        I2=I2+1
        IF(I2.GT.SYSSIZE) THEN
          I2=1
          I3=I3+1
        ENDIF
      ENDIF
  70  CONTINUE
      CLOSE(14)
C
C      Now convolve with the autocorrelation function of the goal 2-D image
C
      WRITE(6,*)'Enter filename to read in autocorrelation from'
      READ(5,*)FILEN
      OPEN(8,FILE=FILEN,STATUS='OLD')
      READ(8,*)IDO
      WRITE(6,*)IDO
      DO 95 I=1,IDO
      READ(8,*)R(I),S(I)
      XR(I)=R(I)
  95  CONTINUE
      CLOSE(8)
      SS=S(1)
      S2=SS*SS
C
C     Load up the convolution matrix (31*31*31 in size)
C
      OPEN(10,FILE='FILTER3D.IMG')
      SDIFF=SS-S2 
      DO 14 I=0,30
      III=I*I
      DO 13 J=0,30
      JJJ=J*J
      DO 12 K=0,30
      XTMP=III+JJJ+K*K
C
C     Use Linear interpolation to estimate S(x,y,z) from available S(r)
C
      RADIUS=SQRT(XTMP)
      R1=RADIUS+1
      R2=R1+1
      XRAD=RADIUS+1-R1
      FILVAL=S(R1)+(S(R2)-S(R1))*XRAD
      FILTER(I+1,J+1,K+1)=(FILVAL-S2)/(SDIFF)
  12  WRITE(10,*)FILTER(I+1,J+1,K+1)
  13  CONTINUE
  14  CONTINUE
      CLOSE(10)
C
C     Now filter the image maintaining periodic boundaries
C
C     Store minimum (RESMIN) and maximum (RESMAX) values for later binning
C
      RESMAX=0.0
      RESMIN=1.0
      DO 97 I=1,SYSSIZE
      DO 97 J=1,SYSSIZE
      DO 97 K=1,SYSSIZE
      RES(I,J,K)=0.0
      DO 98 IX=1,31
      I1=I+IX-1
C
C     Periodic boundaries
C
      IF(I1.LT.1) THEN
        I1=I1+SYSSIZE
      ELSE IF(I1.GT.SYSSIZE) THEN
        I1=I1-SYSSIZE
      ENDIF
      DO 98 IY=1,31
      J1=J+IY-1
      IF(J1.LT.1) THEN
        J1=J1+SYSSIZE
      ELSE IF(J1.GT.SYSSIZE) THEN
        J1=J1-SYSSIZE
      ENDIF
      DO 98 IZ=1,31
      K1=K+IZ-1
      IF(K1.LT.1) THEN
        K1=K1+SYSSIZE
      ELSE IF(K1.GT.SYSSIZE) THEN
        K1=K1-SYSSIZE
      ENDIF
      RES(I,J,K)=RES(I,J,K)+NORMM(I1,J1,K1)*FILTER(IX,IY,IZ)
  98  CONTINUE
C
C     Check for min/max if pixel is part of proper phase
C
      IF(MASK(I,J,K).EQ.PHASEIN) THEN
        IF(RES(I,J,K).GT.RESMAX) THEN
          RESMAX=RES(I,J,K)
        ENDIF
        IF(RES(I,J,K).LT.RESMIN) THEN
          RESMIN=RES(I,J,K)
        ENDIF
      ENDIF
  97  CONTINUE
C
C      Now threshold the image
C
      WRITE(6,*)'Input desired threshold phase fraction'
      READ(5,*)XPT
      WRITE(6,*)XPT
C
C     Bin the resultant (filtered) values into 500 bins 
C     so that adequate binarization (thresholding) can be performed
C
      SECT=(RESMAX-RESMIN)/500.0
      WRITE(6,*)'SECT is',SECT
      WRITE(6,*)'RESMAX and RESMIN are ',RESMAX,RESMIN
      DO 34 I=1,500
  34  SUM(I)=0.0
C
C     Fill in the 500-bin histogram
C
      XTOT=0.0
      DO 33 I=1,SYSSIZE
      DO 33 J=1,SYSSIZE
      DO 33 K=1,SYSSIZE
      IF(MASK(I,J,K).EQ.PHASEIN) THEN
        XTOT=XTOT+1.0
        INDEX=1+(RES(I,J,K)-RESMIN)/SECT
        IF(INDEX.GT.500) THEN 
          INDEX=500
        ENDIF
        SUM(INDEX)=SUM(INDEX)+1.0
      ENDIF
 33   CONTINUE
C
C     Determine which bin to choose for correct thresholding
C
      SUMTOT=0.0
      DO 35 I=1,500
      SUMTOT=SUMTOT+SUM(I)/(XTOT)
      IF(SUMTOT.GT.XPT) THEN
        YTMP=I
        VCRIT=RESMIN+(RESMAX-RESMIN)*(YTMP-0.5)/500.
        GOTO 36
      ENDIF
  35  CONTINUE

  36  WRITE(6,*)'VCRIT is',VCRIT
      IRES=0
C
C     Perform the segmentation and output the resultant image
C
      OPEN(9,FILE='IMAGE3D.OUT')
      DO 32 I=1,SYSSIZE
      DO 32 J=1,SYSSIZE
      DO 32 K=1,SYSSIZE
C
C     Only set values that were originally the phase of choice
C
      IF(MASK(I,J,K).EQ.PHASEIN) THEN
        IF(RES(I,J,K).GT.VCRIT) THEN
          RES(I,J,K)=PHASEOUT
        ELSE
          RES(I,J,K)=PHASEIN
          IRES=IRES+1
        ENDIF
      ELSE
        RES(I,J,K)=MASK(I,J,K)
      ENDIF
      WRITE(9,*)INT(RES(I,J,K))
  32  CONTINUE
      CLOSE(9)
      WRITE(6,*)'Solids are ',FLOAT(IRES)/1000000.
      STOP
      END
      FUNCTION RAN1(IDUM)
C
C     Portable random number generator, RAN1
C     To generate uniform random deviates between 0 and 1.0
C     From: Computers in Physics, Vol. 6, (5), 1992, 522-524
C           Press and Teukolsky
C
C     CAll with idum set to a negative number to initialize
C     RNMAX should approximate the largest floating value that
C     is less than 1.0
      INTEGER IDUM,IA,IM,IQ,IR,NTAB,NDIV
      REAL RAN1,AM,EPS,RNMAX
      PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836,
     +     NTAB=32,NDIV=1+(IM-1)/NTAB,EPS=1.2E-7,RNMAX=1.-EPS)
      
      INTEGER J,K,IV(NTAB),IY
      SAVE IV,IY
      DATA IV /NTAB*0/, IY /0/

      IF(IDUM.LE.0.OR.IY.EQ.0) THEN
        IF(IDUM.LE.0) THEN
          IDUM=MAX(-IDUM,1)
        ENDIF
        DO 11 J=NTAB+8,1,-1
          K=IDUM/IQ
          IDUM=IA*(IDUM-K*IQ)-IR*K
          IF(IDUM.LT.0) IDUM=IDUM+IM
          IF(J.LE.NTAB) IV(J)=IDUM
 11     CONTINUE
        IY=IV(1)
      ENDIF
      K=IDUM/IQ
      IDUM=IA*(IDUM-K*IQ)-IR*K
      IF(IDUM.LT.0) IDUM=IDUM+IM
      J=1+IY/NDIV
      IY=IV(J)
      IV(J)=IDUM
      RAN1=MIN(AM*IY,RNMAX)
      RETURN
      END



Dale P Bentz
Fri Feb 21 08:44:14 EST 1997