(file) Return to mcd_cs_hmi_sub.f CVS log (file) (dir) Up to [Development] / JSOC / proj / timed / apps

File: [Development] / JSOC / proj / timed / apps / mcd_cs_hmi_sub.f (download)
Revision: 1.1, Tue Nov 15 20:32:44 2011 UTC (11 years, 6 months ago) by rick
Branch: MAIN
CVS Tags: Ver_LATEST, Ver_9-5, Ver_9-41, Ver_9-4, Ver_9-3, Ver_9-2, Ver_9-1, Ver_9-0, Ver_8-8, Ver_8-7, Ver_8-6, Ver_8-5, Ver_8-4, Ver_8-3, Ver_8-2, Ver_8-12, Ver_8-11, Ver_8-10, Ver_8-1, Ver_8-0, Ver_7-1, Ver_7-0, Ver_6-4, Ver_6-3, Ver_6-2, Ver_6-1, Ver_6-0, HEAD
added for JSOC release 6.0

CC This is the program to do inversions for sound-speed perturbation
CC   by use of the MultiChannel Deconvolution, using only t_oi 
CC   observation                                      ......July 24, 2002
C
C  Modified 2011.03.18 by R Bogart to accept kernel input from calling
C    routine
C
      SUBROUTINE INVER_CS_SUB(aa_oi, ac, cs)
      IMPLICIT REAL*4(a-h,o-z)
      PARAMETER(nrays=11,nx1=157,ny1=157,nz1=11,nnx=256,nny=256,nnz=11,
     *          lm=nnx,ln=nny,lwork=400)
      DIMENSION ac(nx1,ny1,nz1,nrays),dtau(lm,ln)
      DIMENSION ac_exp(lm,ln,nz1,nrays),actt(lm,ln)
      DIMENSION cs_exp(lm,ln),vv(nrays),v(nz1,nrays)
      INTEGER ipiv(nrays),i,j,k,ii,jj,kk
      DIMENSION aa_oi(nnx,nny,nrays),cs(nnx,nny,nnz)
      COMPLEX stau(lm/2+1,ln),s_oi(lm/2+1,ln,nrays)
      COMPLEX sactt(lm/2+1,ln),s_ac(lm/2+1,ln,nz1,nrays)
      COMPLEX aa(nz1,nrays),yy(nrays),scs(lm/2+1,ln,nz1)
      COMPLEX bb(nz1,nrays)
      COMPLEX work(lwork),temp(nz1,nrays),h(nz1,nrays),res(nz1)
      COMPLEX ONE, ZERO
      DATA vv/8.25, 13.10,18.25,23.82,31.28,38.79,45.41,52.82,60.51,
     +        67.50,73.84/
      ONE=CMPLX(1.,0.)
      ZERO=CMPLX(0.,0.)

      scale=SQRT(1./lm/ln)

      DO 20 k=1,nrays
        DO 18 i=1,lm
        DO 18 j=1,ln
          dtau(i,j)=aa_oi(i,j,k)
 18     CONTINUE
        CALL fft_forw(dtau,stau,lm,ln)
        DO 24 i=1,lm/2+1
        DO 24 j=1,ln
          s_oi(i,j,k)=stau(i,j)*scale
 24     CONTINUE
 20   CONTINUE

CC Expanding ac into lm and ln from nx1 and ny1 
      CALL expand_ac(ac,ac_exp,nx1,ny1,nz1,nrays,lm,ln)
      DO 30 k=1,nrays
      DO 30 kk=1,nz1
        DO 32 i=1,lm
        DO 32 j=1,ln
          actt(i,j)=ac_exp(i,j,kk,k)
 32     CONTINUE
        CALL fft_forw(actt,sactt,lm,ln)
        DO 34 i=1,lm/2+1
        DO 34 j=1,ln
          s_ac(i,j,kk,k)=sactt(i,j)*scale
 34     CONTINUE 
 30   CONTINUE

      DO 50 i=1,lm/2+1
      DO 50 j=1,ln

        IF(j.LE.ln/2) THEN
          ppak=((1.*i/lm)**2+(1.*j/ln)**2)**0.5
        ELSE
          ppak=((1.*i/lm)**2+(1-1.*j/ln)**2)**0.5
        ENDIF
        epson_v=0.02
        epson_h=0.3
        DO 40 ii=1,nz1
          DO 40 jj=1,nz1
            v(ii,jj)=0.
 40     CONTINUE
        DO 41 ii=1,nz1
C          v(i,i)=epson_v**2*(vv(i)/vv(1))**3
          v(ii,ii)=epson_v**2*(vv(ii)/vv(1))**0.5+(epson_h*ppak)**2
 41     CONTINUE

        DO 52 jj=1,nrays
          yy(jj)=s_oi(i,j,jj)
          DO 54 ii=1,nz1
            aa(ii,jj)=s_ac(i,j,jj,ii)
 54       CONTINUE
 52     CONTINUE
CC  Calculate temp(*,*)=CONJ(TRANSPOSE(aa))*aa
        CALL cgemm('C','N',nz1,nrays,nz1,ONE,aa,nz1,aa,nz1,ZERO,
     *               temp,nz1)
        DO 55 ii=1,nrays
        DO 55 jj=1,nz1
          temp(ii,jj)=temp(ii,jj)+v(ii,jj)
 55     CONTINUE
CC Calculate the inverse of temp
        CALL cgetrf(nrays,nz1,temp,nrays,ipiv,info)
        CALL cgetri(nz1,temp,nrays,ipiv,work,lwork,info)
CC Calculate the h=(temp)^(-1)*aa^h
        CALL cgemm('N','C',nz1,nrays,nz1,ONE,temp,nz1,aa,nz1,ZERO,h,nz1)
CC Calculate the res=h*yy
        CALL cgemv('N',nz1,nrays,ONE,h,nz1,yy,1,ZERO,res,1)
        DO 56 ii=1,nz1
          scs(i,j,ii)=res(ii)
 56     CONTINUE
 50   CONTINUE 

      DO 60 k=1,nnz
        DO 62 i=1,lm/2+1
        DO 62 j=1,ln
          sactt(i,j)=scs(i,j,k)
 62     CONTINUE
        DO 63 i=1,nnx
        DO 63 j=1,nny
          cs_exp(i,j)=0.
 63     CONTINUE
        CALL fft_inver(sactt,cs_exp,lm,ln)
        DO 64 i=1,nnx
        DO 64 j=1,nny
          cs(i,j,k)=cs_exp(i,j)*scale*scale
 64     CONTINUE
 60   CONTINUE

      RETURN
      END
        

CCCCCCC       Subroutine for the forward FFT       CCCCCCCCCCCCCC
      SUBROUTINE fft_forw(a,c,m,n)
      IMPLICIT REAL*4(a-h,o-z), INTEGER(i-n)
C      INCLUDE 'fftw3.f'
      INTEGER FFTW_ESTIMATE
      PARAMETER (FFTW_ESTIMATE=64)

      DIMENSION a(m,n)
      COMPLEX c(m/2+1,n)
      INTEGER m,n
      INTEGER*8 PLAN

      CALL SFFTW_PLAN_DFT_R2C_2D(plan,m,n,a,c,FFTW_ESTIMATE)
      CALL SFFTW_EXECUTE_DFT_R2C(plan,a,c)
      CALL SFFTW_DESTROY_PLAN(plan)

      RETURN 
      END

CCCCCCC       Subroutine for the inverse FFT       CCCCCCCCCCCCCC
      SUBROUTINE fft_inver(c,a,m,n)
      IMPLICIT REAL*4(a-h,o-z), INTEGER(i-n)
C      INCLUDE 'fftw3.f'
      INTEGER FFTW_ESTIMATE
      PARAMETER (FFTW_ESTIMATE=64)

      DIMENSION a(m,n)
      COMPLEX c(m/2+1,n)
      INTEGER m,n
      INTEGER*8 PLAN

      CALL SFFTW_PLAN_DFT_C2R_2D(plan,m,n,c,a,FFTW_ESTIMATE)
      CALL SFFTW_EXECUTE_DFT_C2R(plan,c,a)
      CALL SFFTW_DESTROY_PLAN(plan)

      RETURN
      END


CCCCCC       subroutine to expand the ac into lm x ln    CCCCCCCCCCCCC
      SUBROUTINE expand_ac(temp,b,mm,nn,nz,nrays,lm,ln)
      IMPLICIT REAL(a-h,o-z)
      DIMENSION temp(mm,nn,nz,nrays),b(lm,ln,nz,nrays)

      DO 10 k=1,nrays
      DO 10 kk=1,nz
        DO 11 i=1,mm/2+1
        DO 11 j=1,nn/2+1
          b(i,j,kk,k)=temp(mm/2+2-i,nn/2+2-j,kk,k)
 11     CONTINUE
        DO 12 i=1,mm/2+1
        DO 12 j=1,nn/2
          b(i,ln+1-j,kk,k)=temp(mm/2+2-i,nn/2+1+j,kk,k)
 12     CONTINUE
        DO 13 i=1,mm/2
        DO 13 j=1,nn/2+1
          b(lm+1-i,j,kk,k)=temp(mm/2+1+i,nn/2+2-j,kk,k)
 13     CONTINUE
        DO 14 i=1,mm/2
        DO 14 j=1,nn/2
          b(lm+1-i,ln+1-j,kk,k)=temp(mm/2+1+i,nn/2+1+j,kk,k)
 14     CONTINUE
 10   CONTINUE
      
      RETURN
      END

Karen Tian
Powered by
ViewCVS 0.9.4