(file) Return to forward.f90 CVS log (file) (dir) Up to [Development] / JSOC / proj / vfisv / apps

File: [Development] / JSOC / proj / vfisv / apps / forward.f90 (download)
Revision: 1.6, Tue Apr 10 21:16:34 2012 UTC (11 years, 1 month ago) by keiji
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, HEAD
Changes since 1.5: +3 -2 lines
*** empty log message ***

MODULE FORWARD
  !
  ! J M Borrero
  ! Jan 10, 2007
  ! HAO-NCAR for HMI-Stanford
  !
  ! By RCE: Added FILTERS as a parameter passed to SYNTHESIS
  ! Defined FILTERS in SYNTHESIS
  ! Changed all the FILTER (Juanma's filter profiles) instances 
  ! by FILTERS (Sebastien's filter profiles). Filters is now defined
  ! as a matrix of [NUMW, NBINS] elements. We've exchanged the 
  ! indices with respect to the C-wrapper definition because C and Fortran
  ! read the elements in different order.
  ! By RCE, Feb 2011: Implemented changes in the derivatives that J.M Borrero
  ! suggested after changing the voigt.f function by a factor of 2. It affects
  ! the derivatives of PHI and PSI with respect to the Damping and FREC(B,R,P)
  !
  ! By RCE, April 2011: Adding the integral of the filter profiles times the continuum
  ! (S0+S1) to Stokes I, for the outer wavelength range where the forward modeling is not done.
  ! Derivatives of Stokes I are changed correspondingly.


CONTAINS
  !!
  !! SUBROUTINE SYNTHESIS
  !!
  SUBROUTINE SYNTHESIS(MODEL,SCAT,DERIVATIVE,SYN,DSYN, FILTERS, INTEG_FILTERS)
    USE FILT_PARAM
    USE LINE_PARAM
    USE CONS_PARAM
    USE CHANGE_VAR

    IMPLICIT NONE
    REAL(DP),              DIMENSION(10)          :: MODEL
    REAL(DP), INTENT(IN),  DIMENSION(NBINS,4)     :: SCAT
    REAL(DP), INTENT(IN),  DIMENSION(NUMW, NBINS) :: FILTERS
    REAL(DP), INTENT(IN),  DIMENSION(NBINS)       :: INTEG_FILTERS
    LOGICAL,  INTENT(IN)                          :: DERIVATIVE
    REAL(DP), INTENT(OUT),  DIMENSION(NBINS,4)    :: SYN
    REAL(DP), INTENT(OUT),  DIMENSION(10,NBINS,4) :: DSYN
    REAL(DP),               DIMENSION(NBINS,4)    :: SYN_MAG
    REAL(DP),               DIMENSION(9,NBINS,4)  :: DSYN_MAG
    INTEGER                                       :: CHANGEVAR_FLAG
    !------------------------------------------------------
    REAL(DP),    DIMENSION(NUMW)       :: ETAI, ETAQ, ETAU, ETAV, RHOQ, RHOU, RHOV
    REAL(DP),    DIMENSION(7,NUMW)     :: DerETAI, DerETAQ, DerETAU, DerETAV
    REAL(DP),    DIMENSION(7,NUMW)     :: DerRHOQ, DerRHOU, DerRHOV
    REAL(DP),    DIMENSION(NUMW)       :: EXTRA, DET_MAT
    REAL(DP),    DIMENSION(9,NUMW,4)   :: DSTOKES_MAG
    REAL(DP),    DIMENSION(NUMW,4)     :: STOKES_MAG
    REAL(DP),    DIMENSION(7,NUMW)     :: DEXTRA, DDMAT
    REAL(DP)                           :: S0, S1, ALPHAM
    REAL(DP),    DIMENSION(NUMW)       :: A1, A2, A3, A4, A5, A6, A7
    REAL(DP),    DIMENSION(NUMW)       :: B1, B2, B3, B4, B5, B6, B7
    REAL(DP),    DIMENSION(NUMW)       :: C1, C2, C3, C4, C5, C6
    REAL(DP),    DIMENSION(NUMW)       :: D1, D2, D3, D4, D5, D6
    REAL(DP),    DIMENSION(NUMW)       :: PART1, PART2
    INTEGER                            :: I, J, K, M
    !------------------------------------------------------



    S0=MODEL(8)
    S1=MODEL(9)
    ALPHAM=MODEL(10)
    !
    SYN(:,:)=0D0
    DSYN(:,:,:)=0D0
    SYN_MAG(:,:)=0D0
    DSYN_MAG(:,:,:)=0D0
    ETAI(:)=0D0
    ETAQ(:)=0D0
    ETAU(:)=0D0
    ETAV(:)=0D0
    RHOQ(:)=0D0
    RHOU(:)=0D0
    RHOV(:)=0D0
    DerETAI(:,:)=0D0
    DerETAQ(:,:)=0D0
    DerETAU(:,:)=0D0
    DerETAV(:,:)=0D0
    DerRHOQ(:,:)=0D0
    DerRHOU(:,:)=0D0
    DerRHOV(:,:)=0D0
    STOKES_MAG(:,:)=0D0
    EXTRA(:)=0D0
    DET_MAT(:)=0D0
    DSTOKES_MAG(:,:,:)=0D0
    DEXTRA(:,:)=0D0
    DDMAT(:,:)=0D0

    CALL ABSMAT(MODEL, DERIVATIVE, ETAI, ETAQ, ETAU, ETAV, RHOQ, RHOU, RHOV, &
         DerETAI, DerETAQ, DerETAU, DerETAV, DerRHOQ, DerRHOU, DerRHOV)
    ! Common parts
    EXTRA = ETAQ*RHOQ+ETAU*RHOU+ETAV*RHOV
    DET_MAT = (ETAI**2D0)*(ETAI**2D0-ETAQ**2D0-ETAU**2D0-ETAV**2D0+ &
         RHOQ**2D0+RHOU**2D0+RHOV**2D0)-EXTRA**2D0
    !----------------------------------------------------------------------------
    ! Solution to the Unno-Rachkovski equations
    ! This is the Stokes vector coming from the magnetic atmosphere
    !----------------------------------------------------------------------------
    STOKES_MAG(:,1) = S0+(1D0/DET_MAT)*ETAI*(ETAI**2D0+RHOQ**2D0+RHOU**2D0+RHOV**2D0)*S1
    STOKES_MAG(:,2) = -(1D0/DET_MAT)*(ETAI**2D0*ETAQ+ETAI*(ETAV*RHOU-ETAU*RHOV)+RHOQ*EXTRA)*S1
    STOKES_MAG(:,3) = -(1D0/DET_MAT)*(ETAI**2D0*ETAU+ETAI*(ETAQ*RHOV-ETAV*RHOQ)+RHOU*EXTRA)*S1
    STOKES_MAG(:,4) = -(1D0/DET_MAT)*(ETAI**2D0*ETAV+ETAI*(ETAU*RHOQ-ETAQ*RHOU)+RHOV*EXTRA)*S1
    !-----------------------------------------------------------------------------
    ! Now we apply HMI Filters
    !-----------------------------------------------------------------------------
    DO K=1,4
       DO J=1,NBINS
          SYN_MAG(J,K)=SUM(FILTERS(:,J)*STOKES_MAG(:,K))     
       ENDDO
    ENDDO

    ! By RCE, April 2011: Adding integral of filters outside wavelength range for Stokes I
    ! We're assuming that this outer wavelength range corresponds to continuum, hence we 
    ! multiply the integral of the filters by the continuum for Stokes I and assume it is 0
    ! for Stokes Q, U, and V
    DO J =1, NBINS
      SYN_MAG(J, 1) = SYN_MAG(J,1)+INTEG_FILTERS(J)*(S0+S1)
    ENDDO

    !---------------------------------------------------------
    ! Total Stokes vector including the non-magnetic component
    !---------------------------------------------------------
    SYN=(1D0-ALPHAM)*SCAT+ALPHAM*SYN_MAG
    !---------------------------------------------------------
    ! Derivatives
    !---------------------------------------------------------
    IF (DERIVATIVE.EQ..TRUE.) THEN
       ! Derivatives of the Stokes Parameters (emering from Magnetic component)
       ! with respect to the 7 free parameters: eta0, gam, phi, dam, dldop, B, Vlos
       ! plus two new dependences: S0, S1. Total 9 free parameters.
       ! First derivatives of EXTRA and DET_MAT
       ! These ones do not depend on S0, S1
       DO I=1,7
          A1 = ETAI
          A2 = ETAQ
          A3 = ETAU
          A4 = ETAV
          A5 = RHOQ
          A6 = RHOU
          A7 = RHOV
          B1 = DerETAI(I,:)
          B2 = DerETAQ(I,:)
          B3 = DerETAU(I,:)
          B4 = DerETAV(I,:)
          B5 = DerRHOQ(I,:)
          B6 = DerRHOU(I,:)
          B7 = DerRHOV(I,:)
          DEXTRA(I,:)=A2*B5+A5*B2+A3*B6+A6*B3+A4*B7+A7*B4
          DDMAT(I,:)=2D0*A1*B1*(A1**2D0-A2**2D0-A3**2D0-A4**2D0+A5**2D0+ &
               A6**2D0+A7**2D0)+2D0*A1**2D0*(A1*B1-A2*B2-A3*B3-A4*B4+A5*B5+ &
               A6*B6+A7*B7)-2D0*EXTRA*DEXTRA(I,:)
       ENDDO
       ! Now derivatives of Stokes I with respect to
       ! 7 regular free parameters
       DO I=1,7
          A1 = ETAI
          B1 = DerETAI(I,:)
          A2 = RHOQ
          B2 = DerRHOQ(I,:)
          A3 = RHOU
          B3 = DerRHOU(I,:)
          A4 = RHOV
          B4 = DerRHOV(I,:)
          DSTOKES_MAG(I,:,1)=S1*((1D0/DET_MAT)*(B1*(A1**2D0+A2**2D0+A3**2D0+&
               A4**2D0)+2D0*A1*(A1*B1+A2*B2+A3*B3+A4*B4))- &
               (DDMAT(I,:)/DET_MAT**2D0)*A1*(A1**2D0+A2**2D0+A3**2D0+A4**2D0))
          !print*,minval(dstokesm(i,:,1)),maxval(dstokesm(i,:,1))
       ENDDO
       ! Derivatives of Stokes Q, U, V with respect to
       ! 7 regular free parameters.
       DO K=2,4
          DO I=1,7
             A1 = ETAI
             B1 = DerETAI(I,:)
             A2 = EXTRA
             B2 = DEXTRA(I,:)
             SELECT CASE (K)
             CASE(2)
                C1=ETAQ
                D1=DerETAQ(I,:)
                C2=ETAV
                D2=DerETAV(I,:)
                C3=RHOU
                D3=DerRHOU(I,:)
                C4=ETAU
                D4=DerETAU(I,:)
                C5=RHOV
                D5=DerRHOV(I,:)
                C6=RHOQ
                D6=DerRHOQ(I,:)
             CASE(3)
                C1=ETAU
                D1=DerETAU(I,:)
                C2=ETAQ
                D2=DerETAQ(I,:)
                C3=RHOV
                D3=DerRHOV(I,:)
                C4=ETAV
                D4=DerETAV(I,:)
                C5=RHOQ
                D5=DerRHOQ(I,:)
                C6=RHOU
                D6=DerRHOU(I,:)
             CASE(4)
                C1=ETAV
                D1=DerETAV(I,:)
                C2=ETAU
                D2=DerETAU(I,:)
                C3=RHOQ
                D3=DerRHOQ(I,:)
                C4=ETAQ
                D4=DerETAQ(I,:)
                C5=RHOU
                D5=DerRHOU(I,:)
                C6=RHOV
                D6=DerRHOV(I,:)
             END SELECT
             PART1 = (1D0/DET_MAT)*(2D0*A1*B1*C1+D1*A1**2D0+&
                  B1*(C2*C3-C4*C5)+A1*(C2*D3+D2*C3-D4*C5-C4*D5)+ &
                  D6*A2+C6*B2)
             PART2 = (DDMAT(I,:)/DET_MAT**2D0)*(A1**2D0*C1+A1* &
                  (C2*C3-C4*C5)+C6*EXTRA)
             DSTOKES_MAG(I,:,K) = S1*(PART2-PART1)
          ENDDO
       ENDDO
       ! Derivatives of I, Q, U, V with respect to S0 and S1
       DSTOKES_MAG(8,:,1) = 1D0
       DSTOKES_MAG(8,:,2:4) = 0D0
       DSTOKES_MAG(9,:,1) = (STOKES_MAG(:,1)-S0)/S1
       DSTOKES_MAG(9,:,2:4) = STOKES_MAG(:,2:4)/S1

       !-----------------------------------------------------------------------------
       ! Now we apply HMI Filters
       !-----------------------------------------------------------------------------
       DO M=1,9
          DO K=1,4
             DO J=1,NBINS
                DSYN_MAG(M,J,K)=SUM(FILTERS(:,J)*DSTOKES_MAG(M,:,K))     
             ENDDO
          ENDDO
       ENDDO

       ! By RCE: The derivatives of the filtered Stokes parameters with respect to S0 and S1 have to include the 
       ! derivative of the hack for the wavelength coverage. We basically added (S0+S1)*C to the filtered Stokes I,
       ! where C is the integral of the filters in the outer range of the wavelength vector. So I have to add C
       ! to the derivative of Stokes I with respect to S0 and S1.
       DO J = 1, NBINS
          DSYN_MAG(8,J,1) = DSYN_MAG(8,J,1) + INTEG_FILTERS(J)
 	  DSYN_MAG(9,J,1) = DSYN_MAG(9,J,1) + INTEG_FILTERS(J)
       ENDDO
	
       DSYN(1:9,:,:)=ALPHAM*DSYN_MAG
       DSYN(10,:,:)=SYN_MAG-SCAT

    ENDIF
  END SUBROUTINE SYNTHESIS
  !!
  !! SOUBROUTINE ABSMAT
  !!
  SUBROUTINE ABSMAT(MODEL, DERIVATIVE, ETAI, ETAQ, ETAU, ETAV, RHOQ, RHOU, RHOV, &
       DerETAI, DerETAQ, DerETAU, DerETAV, DerRHOQ, DerRHOU, DerRHOV)
    !
    ! J M Borrero
    ! Jan 7, 2007
    ! HAO-NCAR for HMI-Stanford
    !
    USE CONS_PARAM
    USE LINE_PARAM
    USE INV_PARAM
    USE VOIGT_DATA
    IMPLICIT NONE
    !----------------------------------------------------------
    REAL(DP), INTENT(IN), DIMENSION(10)     :: MODEL
    LOGICAL, INTENT(IN)                     :: DERIVATIVE
    !----------------------------------------------------------
    REAL(DP),    DIMENSION(NUMW)   :: FRECR, FRECP, FRECB
    REAL(DP),    DIMENSION(NUMW)   :: PHIR, PHIP, PHIB, PSIR, PSIP, PSIB
    REAL(DP),    DIMENSION(NUMW)   :: DerPHIR_DerDAM, DerPHIR_DerFRECR
    REAL(DP),    DIMENSION(NUMW)   :: DerPSIR_DerDAM, DerPSIR_DerFRECR
    REAL(DP),    DIMENSION(NUMW)   :: DerPHIB_DerDAM, DerPHIB_DerFRECB
    REAL(DP),    DIMENSION(NUMW)   :: DerPSIB_DerDAM, DerPSIB_DerFRECB
    REAL(DP),    DIMENSION(NUMW)   :: DerPHIP_DerDAM, DerPHIP_DerFRECP
    REAL(DP),    DIMENSION(NUMW)   :: DerPSIP_DerDAM, DerPSIP_DerFRECP
    REAL(DP),    DIMENSION(NUMW)   :: DerFRECR_DerVLOS, DerFRECR_DerDLDOP, DerFRECR_DerB
    REAL(DP),    DIMENSION(NUMW)   :: DerFRECB_DerVLOS, DerFRECB_DerDLDOP, DerFRECB_DerB
    REAL(DP),    DIMENSION(NUMW)   :: DerFRECP_DerVLOS, DerFRECP_DerDLDOP, DerFRECP_DerB
    !
    REAL(DP),    DIMENSION(NUMW)   :: ETAI, ETAQ, ETAU, ETAV, RHOQ, RHOU, RHOV
    REAL(DP),    DIMENSION(7,NUMW) :: DerETAI, DerETAQ, DerETAU, DerETAV
    REAL(DP),    DIMENSION(7,NUMW) :: DerRHOQ, DerRHOU, DerRHOV
    !
    REAL(DP)                     :: VLOS, DLDOP, BFIELD, DAM, ETA0, GAM, PHI
    REAL(DP)                     :: SIN2INC, COS2AZI, SIN2AZI, SININC, COSINC, SINCOSINC
    REAL(DP),    DIMENSION(NUMW) :: ABSOR1, ABSOR3, DISPE1, DISPE3
    INTEGER                      :: I
    !
    FRECR(:)=0D0
    FRECP(:)=0D0
    FRECB(:)=0D0
    PHIR(:)=0D0
    PHIP(:)=0D0
    PHIB(:)=0D0
    PSIR(:)=0D0
    PSIP(:)=0D0
    PSIB(:)=0D0
    ETAI(:)=0D0
    ETAQ(:)=0D0
    ETAU(:)=0D0
    ETAV(:)=0D0
    RHOQ(:)=0D0
    RHOU(:)=0D0
    RHOV(:)=0D0
    DerETAI(:,:)=0D0
    DerETAQ(:,:)=0D0
    DerETAU(:,:)=0D0
    DerETAV(:,:)=0D0
    DerRHOQ(:,:)=0D0
    DerRHOU(:,:)=0D0
    DerRHOV(:,:)=0D0
    DerPHIR_DerDAM(:)=0D0
    DerPHIR_DerFRECR(:)=0D0
    DerPSIR_DerDAM(:)=0D0 
    DerPSIR_DerFRECR(:)=0D0
    DerPHIB_DerDAM(:)=0D0
    DerPHIB_DerFRECB(:)=0D0
    DerPSIB_DerDAM(:)=0D0
    DerPSIB_DerFRECB(:)=0D0
    DerPHIP_DerDAM(:)=0D0
    DerPHIP_DerFRECP(:)=0D0
    DerPSIP_DerDAM(:)=0D0
    DerPSIP_DerFRECP(:)=0D0
    DerFRECR_DerVLOS(:)=0D0
    DerFRECR_DerDLDOP(:)=0D0
    DerFRECR_DerB(:)=0D0
    DerFRECB_DerVLOS(:)=0D0 
    DerFRECB_DerDLDOP(:)=0D0 
    DerFRECB_DerB(:)=0D0
    DerFRECP_DerVLOS(:)=0D0
    DerFRECP_DerDLDOP(:)=0D0
    DerFRECP_DerB(:)=0D0
    VLOS=0D0
    DLDOP=0D0
    BFIELD=0D0
    DAM=0D0
    ETA0=0D0
    GAM=0D0
    PHI=0D0
    ABSOR1(:)=0D0
    ABSOR3(:)=0D0
    DISPE1(:)=0D0
    DISPE3(:)=0D0
    
    ! Model parameters: magnetic component
    ETA0=MODEL(1)
    GAM=MODEL(2)*D2R
    PHI=MODEL(3)*D2R
    DAM=MODEL(4)
    DLDOP=MODEL(5)
    BFIELD=MODEL(6)
    VLOS=MODEL(7)
    ! Frecuency arrays
    DO I=1,NUMW
       FRECR(I)=(WAVE(I)-1.D3*VLOS*LANDA0/LIGHT+BFIELD*SHIFT)/DLDOP
       FRECB(I)=(WAVE(I)-1.D3*VLOS*LANDA0/LIGHT-BFIELD*SHIFT)/DLDOP
       FRECP(I)=(WAVE(I)-1.D3*VLOS*LANDA0/LIGHT)/DLDOP
    ENDDO
    ! Absortion-dispersion profiles: slow calculation
    IF (FREE(4).EQ..TRUE.) THEN
       CALL VOIGT(NUMW,DAM,FRECR,PHIR,PSIR)
       CALL VOIGT(NUMW,DAM,FRECB,PHIB,PSIB)
       CALL VOIGT(NUMW,DAM,FRECP,PHIP,PSIP)
    ENDIF
    IF (FREE(4).EQ..FALSE.) THEN
       CALL VOIGT_TAYLOR(DAM,FRECR,PHIR,PSIR)
       CALL VOIGT_TAYLOR(DAM,FRECB,PHIB,PSIB)
       CALL VOIGT_TAYLOR(DAM,FRECP,PHIP,PSIP)
    ENDIF
    ! Common parts
    SIN2INC=DSIN(GAM)**2D0
    COS2AZI=DCOS(2D0*PHI)
    SIN2AZI=DSIN(2D0*PHI)
    SINCOSINC=DSIN(GAM)*DCOS(GAM)
    SININC=DSIN(GAM)
    COSINC=DCOS(GAM)
    ABSOR1=PHIP-0.5D0*(PHIB+PHIR)
    DISPE1=PSIP-0.5D0*(PSIB+PSIR)
    ABSOR3=PHIR-PHIB
    DISPE3=PSIR-PSIB
    !
    ! ETAI:
    !
    ETAI = 1D0+(ETA0/2D0)*(PHIP*SIN2INC+0.5D0*(PHIR+PHIB)*(2D0-SIN2INC))
    !
    ! ETAQ:
    !
    ETAQ = 0.5D0*ETA0*ABSOR1*SIN2INC*COS2AZI
    !
    ! ETAU:
    !
    ETAU = 0.5D0*ETA0*ABSOR1*SIN2INC*SIN2AZI
    !
    ! ETAV:
    !
    COSINC=DCOS(GAM)
    ETAV = -0.5D0*ETA0*ABSOR3*COSINC
    !
    ! RHOQ:
    !
    RHOQ = 0.5D0*ETA0*DISPE1*SIN2INC*COS2AZI
    !
    ! RHOU:
    !
    RHOU = 0.5D0*ETA0*DISPE1*SIN2INC*SIN2AZI
    !
    ! RHOV:
    !
    RHOV = -0.5D0*ETA0*DISPE3*COSINC
    
    IF (DERIVATIVE.EQ..TRUE.) THEN
       
       ! Derivatives of absortion-dispersion profiles
       ! Sigma-Red component
       DerPHIR_DerDAM = -2D0/DSQRT(DPI)+2D0*(DAM*PHIR+FRECR*PSIR)
       DerPHIR_DerFRECR = 2D0*DAM*PSIR-2D0*FRECR*PHIR
       DerPSIR_DerDAM = DerPHIR_DerFRECR
       DerPSIR_DerFRECR = -DerPHIR_DerDAM
       ! Sigma-Blue component
       DerPHIB_DerDAM = -2D0/DSQRT(DPI)+2D0*(DAM*PHIB+FRECB*PSIB)
       DerPHIB_DerFRECB = 2D0*DAM*PSIB-2D0*FRECB*PHIB
       DerPSIB_DerDAM = DerPHIB_DerFRECB
       DerPSIB_DerFRECB = -DerPHIB_DerDAM
       ! Simga-Pi component
       DerPHIP_DerDAM = -2D0/DSQRT(DPI)+2D0*(DAM*PHIP+FRECP*PSIP)
       DerPHIP_DerFRECP = 2D0*DAM*PSIP-2D0*FRECP*PHIP
       DerPSIP_DerDAM = DerPHIP_DerFRECP
       DerPSIP_DerFRECP = -DerPHIP_DerDAM 


       ! Derivatives of the frecuency with respect to
       ! the field strength, LOS velocity, Doppler width.
       DerFRECR_DerVLOS = -1D3*LANDA0/(LIGHT*DLDOP)
       DerFRECB_DerVLOS = DerFRECR_DerVLOS
       DerFRECP_DerVLOS = DerFRECR_DerVLOS
       !
       DerFRECR_DerDLDOP = - FRECR/DLDOP
       DerFRECB_DerDLDOP = - FRECB/DLDOP
       DerFRECP_DerDLDOP = - FRECP/DLDOP
       !
       DerFRECR_DerB = SHIFT/DLDOP
       DerFRECB_DerB = - DerFRECR_DerB
       DerFRECP_DerB(:) = 0D0 
       ! DerFRECP_DerB won't be used to speed up and reduce noise.
       !
       ! ETAI derivatives:
       !
       DerETAI(1,:) = (ETAI(:)-1D0)/ETA0
       DerETAI(2,:) = ETA0*SINCOSINC*ABSOR1*D2R
       DerETAI(3,:) = 0D0
       DerETAI(4,:) = 0.5D0*ETA0*(DerPHIP_DerDAM*SIN2INC+0.5D0*(DerPHIB_DerDAM+ &
            DerPHIR_DerDAM)*(2D0-SIN2INC))
       DerETAI(5,:) = 0.5D0*ETA0*(DerPHIP_DerFRECP*DerFRECP_DerDLDOP*SIN2INC+ &
            0.5D0*(DerPHIB_DerFRECB*DerFRECB_DerDLDOP+DerPHIR_DerFRECR* &
            DerFRECR_DerDLDOP)*(2D0-SIN2INC))
       DerETAI(6,:) = 0.25D0*ETA0*(DerPHIB_DerFRECB*DerFRECB_DerB+DerPHIR_DerFRECR* &
            DerFRECR_DerB)*(2D0-SIN2INC)
       DerETAI(7,:) = 0.5D0*ETA0*(DerPHIP_DerFRECP*DerFRECP_DerVLOS*SIN2INC+ &
            0.5D0*(DerPHIB_DerFRECB*DerFRECB_DerVLOS+DerPHIR_DerFRECR* &
            DerFRECR_DerVLOS)*(2D0-SIN2INC))
       !
       ! ETA Q derivatives
       !
       DerETAQ(1,:) = ETAQ/ETA0
       DerETAQ(2,:) = SINCOSINC*COS2AZI*ETA0*ABSOR1*D2R
       DerETAQ(3,:) = -ETA0*ABSOR1*SIN2INC*SIN2AZI*D2R
       DerETAQ(4,:) = 0.5D0*ETA0*(DerPHIP_DerDAM-0.5D0*(DerPHIB_DerDAM+ &
            DerPHIR_DerDAM))*SIN2INC*COS2AZI
       DerETAQ(5,:) = 0.5D0*ETA0*(DerPHIP_DerFRECP*DerFRECP_DerDLDOP- &
            0.5D0*(DerPHIB_DerFRECB*DerFRECB_DerDLDOP+DerPHIR_DerFRECR* &
            DerFRECR_DerDLDOP))*SIN2INC*COS2AZI
       DerETAQ(6,:) = -0.25D0*ETA0*(DerPHIB_DerFRECB*DerFRECB_DerB+ &
            DerPHIR_DerFRECR*DerFRECR_DerB)*SIN2INC*COS2AZI
       DerETAQ(7,:) = 0.5D0*ETA0*(DerPHIP_DerFRECP*DerFRECP_DerVLOS- &
            0.5D0*(DerPHIB_DerFRECB*DerFRECB_DerVLOS+DerPHIR_DerFRECR* &
            DerFRECR_DerVLOS))*SIN2INC*COS2AZI
       !
       ! ETAU derivatives
       !
       DerETAU(1,:) = ETAU/ETA0
       DerETAU(2,:) = SINCOSINC*SIN2AZI*ETA0*ABSOR1*D2R
       DerETAU(3,:) = ETA0*ABSOR1*SIN2INC*COS2AZI*D2R
       DerETAU(4,:) = 0.5D0*ETA0*(DerPHIP_DerDAM-0.5D0*(DerPHIB_DerDAM+ &
            DerPHIR_DerDAM))*SIN2INC*SIN2AZI
       DerETAU(5,:) = 0.5D0*ETA0*(DerPHIP_DerFRECP*DerFRECP_DerDLDOP- &
            0.5D0*(DerPHIB_DerFRECB*DerFRECB_DerDLDOP+DerPHIR_DerFRECR* &
            DerFRECR_DerDLDOP))*SIN2INC*SIN2AZI
       DerETAU(6,:) = -0.25D0*ETA0*(DerPHIB_DerFRECB*DerFRECB_DerB+ &
            DerPHIR_DerFRECR*DerFRECR_DerB)*SIN2INC*SIN2AZI
       DerETAU(7,:) = 0.5D0*ETA0*(DerPHIP_DerFRECP*DerFRECP_DerVLOS- &
            0.5D0*(DerPHIB_DerFRECB*DerFRECB_DerVLOS+DerPHIR_DerFRECR* &
            DerFRECR_DerVLOS))*SIN2INC*SIN2AZI
       !
       ! ETAV derivatives
       !
       DerETAV(1,:) = ETAV/ETA0
       DerETAV(2,:) = 0.5D0*ETA0*ABSOR3*SININC*D2R
       DerETAV(3,:) = 0D0
       DerETAV(4,:) = -0.5D0*ETA0*(DerPHIR_DerDAM-DerPHIB_DerDAM)*COSINC
       DerETAV(5,:) = -0.5D0*ETA0*(DerPHIR_DerFRECR*DerFRECR_DerDLDOP- &
            DerPHIB_DerFRECB*DerFRECB_DerDLDOP)*COSINC
       DerETAV(6,:) = -0.5D0*ETA0*(DerPHIR_DerFRECR*DerFRECR_DerB- &
            DerPHIB_DerFRECB*DerFRECB_DerB)*COSINC
       DerETAV(7,:) = -0.5D0*ETA0*(DerPHIR_DerFRECR*DerFRECR_DerVLOS- &
            DerPHIB_DerFRECB*DerFRECB_DerVLOS)*COSINC
       
       !
       ! RHOQ derivatives:
       !
       DerRHOQ(1,:) = RHOQ/ETA0
       DerRHOQ(2,:) = SINCOSINC*COS2AZI*ETA0*DISPE1*D2R
       DerRHOQ(3,:) = -ETA0*DISPE1*SIN2INC*SIN2AZI*D2R
       DerRHOQ(4,:) = 0.5D0*ETA0*(DerPSIP_DerDAM-0.5D0*(DerPSIB_DerDAM+ &
            DerPHIR_DerDAM))* SIN2INC*COS2AZI
       DerRHOQ(5,:) = 0.5D0*ETA0*(DerPSIP_DerFRECP*DerFRECP_DerDLDOP- &
            0.5D0*(DerPSIB_DerFRECB*DerFRECB_DerDLDOP+DerPSIR_DerFRECR* &
            DerFRECR_DerDLDOP))*SIN2INC*COS2AZI
       DerRHOQ(6,:) = -0.25D0*ETA0*(DerPSIB_DerFRECB*DerFRECB_DerB+ &
            DerPSIR_DerFRECR*DerFRECR_DerB)*SIN2INC*COS2AZI
       DerRHOQ(7,:) = 0.5D0*ETA0*(DerPSIP_DerFRECP*DerFRECP_DerVLOS- &
            0.5D0*(DerPSIB_DerFRECB*DerFRECB_DerVLOS+DerPSIR_DerFRECR* &
            DerFRECR_DerVLOS))*SIN2INC*COS2AZI
       !
       ! RHOU derivatives
       !
       
       DerRHOU(1,:) = RHOU/ETA0
       DerRHOU(2,:) = SINCOSINC*SIN2AZI*ETA0*DISPE1*D2R
       DerRHOU(3,:) = ETA0*DISPE1*SIN2INC*COS2AZI*D2R
       DerRHOU(4,:) = 0.5D0*ETA0*(DerPSIP_DerDAM-0.5D0*(DerPSIB_DerDAM+ &
            DerPSIR_DerDAM))*SIN2INC*SIN2AZI
       DerRHOU(5,:) = 0.5D0*ETA0*(DerPSIP_DerFRECP*DerFRECP_DerDLDOP- &
            0.5D0*(DerPSIB_DerFRECB*DerFRECB_DerDLDOP+DerPSIR_DerFRECR* &
            DerFRECR_DerDLDOP))*SIN2INC*SIN2AZI
       DerRHOU(6,:) = -0.25D0*ETA0*(DerPSIB_DerFRECB*DerFRECB_DerB+ &
            DerPSIR_DerFRECR*DerFRECR_DerB)*SIN2INC*SIN2AZI
       DerRHOU(7,:) = 0.5D0*ETA0*(DerPSIP_DerFRECP*DerFRECP_DerVLOS- &
            0.5D0*(DerPSIB_DerFRECB*DerFRECB_DerVLOS+DerPSIR_DerFRECR* &
            DerFRECR_DerVLOS))*SIN2INC*SIN2AZI
       !
       ! RHOV derivatives
       !
       RHOV = -0.5D0*ETA0*DISPE3*COSINC
       DerRHOV(1,:) = RHOV/ETA0
       DerRHOV(2,:) = 0.5D0*ETA0*DISPE3*SININC*D2R
       DerRHOV(3,:) = 0D0
       DerRHOV(4,:) = -0.5D0*ETA0*(DerPSIR_DerDAM-DerPSIB_DerDAM)*COSINC
       DerRHOV(5,:) = -0.5D0*ETA0*(DerPSIR_DerFRECR*DerFRECR_DerDLDOP- &
            DerPSIB_DerFRECB*DerFRECB_DerDLDOP)*COSINC
       DerRHOV(6,:) = -0.5D0*ETA0*(DerPSIR_DerFRECR*DerFRECR_DerB- &
            DerPSIB_DerFRECB*DerFRECB_DerB)*COSINC
       DerRHOV(7,:) = -0.5D0*ETA0*(DerPSIR_DerFRECR*DerFRECR_DerVLOS- &
            DerPSIB_DerFRECB*DerFRECB_DerVLOS)*COSINC
    ENDIF
    
  ENDSUBROUTINE ABSMAT
END MODULE FORWARD

!CVSVERSIONINFO "$Id: forward.f90,v 1.6 2012/04/10 22:16:34 keiji Exp $"

Karen Tian
Powered by
ViewCVS 0.9.4