!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
!

      SUBROUTINE RTGOES(PTB,PRAD,PS,TT,Q,TS,ZENANG,ZLAT,TOTO3OBS, 2,2
     *           INK,EMIGN,ITYPE_SFC,NLX,PLEV,IDSATGO,KCNT,IMODE)
C
C**S/R *RTGOES* - Call to physical radiative transfer model.
C
C           C. Charette - ARMA/SMC N. Wagner- CMC - Sep. 2004
C            - Remove unused internal arrays. Reduce the size of
C              internal arrays. Set do loops accordingly
C
C           J. Halle - CMDA - Aug. 2005
C            - bugfix: initialize to zero dimension ink+1 of drdt and drdq.
C     Purpose.
C     --------
C          To compute multi-channel radiances and brightness
C          temperatures for many profiles.
C
C**   Interface.
C     ----------
C      CALL RTGOES(PTB,PRAD,PS,TT,Q,TS,ZENANG,ZLAT,TOTO3OBS,
C                  INK,EMIGN,ITYPE_SFC,NLX,PLEV,IDSATGO,KCNT,IMODE)
C     INPUT:
C             PS        : Pressions de surface
C             TT        : Profils de temperatures
C             Q         : Profils d'humidotes specifiques
C             TS        : Temperatures du surface
C             ZENANG    : Angles du satellite
C             ZLAT      : Latitudes des points
C             TOTO3OBS  : Ozone totale des profils (si disponible)
C             INK       : Nombre de niveaux
C             EMIGN     : Emissivites de la surfaces
C             ITYPE_SFC : Type de surface
C             NLX       : Nombre de profils
C             PLEV      : Pressions de niveaux des profils
C             IDSATGO   : Numero du satellite
C             KCNT      : Compteur du nombre de profils deja traites
C             IMODE     : Switch: 0 pas de calcul des Jacobiens, 1 oui.
C
C      OUTPUT:
C             PBT       : Temperatures de Brillance
C             PRAD      : Radiances
C
C
C     Method.
C     -------
C          See reference
C
C     Externals.
C     ----------
C          rtmscrunprof : Initialise site specific data,
C                         and run radiation model.
C
C     Reference.
C     ----------
C          Garand, L., D.S. Turner and C. Chouinard, and J. Halle, 1999:
C                      A Physical Formulation of Atmospheric Transmitance for
C                      the Massive Assimilaton of Satellite Infrared Radiances.
C
C     Author.
C     -------
C          Nicolas Wagneur       *CMC/MSC*       Avril 2001
C
C     Rvisions.
C     ---------
C
C
C     -----------------------------------------------------------------
      IMPLICIT NONE
C
#include "comlun.cdk"
#include "cparamgoes.cdk"
#include "cominitrad.cdk"
#include "comgoes.cdk"

      INTEGER IMODE,J,JB,JJ,JI,JJ0,JG,KSAT,KCNT
      INTEGER NLX,INK,KNPF,IDSATGO,i,k,jl,KIERR
C
      REAL*8 BT(JPNB, JPNLM),PTB(JPNB*JPNLM)
      REAL*8 RAD(JPNB, JPNLM),PRAD(JPNB*JPNLM)
      REAL*8 QGAS(JPNLM, INK, JPNGAS)
      REAL*8 PLEV(JPNLM, INK)
      REAL*8 SH(JPNLM, INK)
      REAL*8 TT(JPNLM, INK)
      REAL*8 Q(JPNLM, INK)
      REAL*8 PS(JPNLM)
      REAL*8 TS(JPNLM)
      REAL*8 ZENANG(JPNLM)
      REAL*8 SECAN(JPNLM)
      REAL*8 ZLAT(JPNLM)
      REAL*8 TOTO3OBS(JPNLM)
      REAL*8 EMIGN(JPNLM,JPNB)
      REAL*8 CFEXX(JPNLM,INK,JPNB)
      REAL*8 CFE(JPNLM,INK,JPNB)
      REAL*8 XX(JPNLM,JPNB)
      REAL*8 XXE(JPNLM,JPNB)
      REAL*8 ZPI
c

C
C variables de rtmscrunprof
      REAL*8 DRDT(JPNLM,INK+1,JPNB)
      REAL*8 DRDQ(JPNLM,INK+1,JPNB,JPNGAS)
      REAL*8 DRDPS(JPNLM,JPNB)
      REAL*8 DRDEMI(JPNLM,JPNB)
      CHARACTER*6 CLSATNAM
c
      INTEGER ITYPE_SFC(JPNLM)
      INTEGER LISTPC(JPNB,JPNLM)
C
      EXTERNAL RTMSCRUNPROF
C
C     -----------------------------------------------------------------
C*         0.
C               --- -- ------- ---------
               KIERR = 0
               ZPI = ACOS(-1.)
C     -----------------------------------------------------------------
C*         1.   SET UP PROFILE VARIABLES.
C               --- -- ------- ---------
 100  CONTINUE
C
C
C     -----------------------------------------------------------------
C*            1.1 SET SATNAME
C                 --- -------
 120  CONTINUE
          IF ( IDSATGO .EQ.  8) CLSATNAM='GOES08'
          IF ( IDSATGO .EQ.  9) CLSATNAM='GOES09'
          IF ( IDSATGO .EQ. 10) CLSATNAM='GOES10'
          IF ( IDSATGO .EQ. 11) CLSATNAM='GOES11'
          IF ( IDSATGO .EQ. 12) CLSATNAM='GOES12'
          IF ( IDSATGO .EQ. 13) CLSATNAM='GOES13'
          IF ( IDSATGO .EQ. 14) CLSATNAM='GOES14'
          IF ( IDSATGO .EQ. 15) CLSATNAM='GOES15'
C
C     -----------------------------------------------------------------
C*         2.   Sigma levels plus besoin.Mais humidite oui!
C               -------------
 200  CONTINUE
      DO JJ = 1, INK
         DO JI = 1, JPNLM
            SH(JI,JJ) = 0.0
            QGAS(JI,JJ,1) = Q(JI,JJ)
            QGAS(JI,JJ,2) = 0.0
            QGAS(JI,JJ,3) = 0.0
            QGAS(JI,JJ,4) = 0.0
            QGAS(JI,JJ,5) = 0.0
            QGAS(JI,JJ,6) = 0.0
            QGAS(JI,JJ,7) = 0.0
            QGAS(JI,JJ,8) = 0.0
         ENDDO
      ENDDO
C
C     -----------------------------------------------------------------
C*         3.   Initialise a zero certain champs pas utilise
C               dans ce mode.
C               ------------------------------------

 300  CONTINUE
      DO JI = 1, JPNLM
         DO JJ = 1, INK
            DO JB = 1, JPNB
               CFE   (JI,JJ,JB) = 0.0
               CFEXX (JI,JJ,JB) = 0.0
               XXE   (JI,JB) = 0.0
               XX    (JI,JB) = 0.0
            ENDDO
         ENDDO
      ENDDO
      DO JI = 1, JPNLM
         DO JJ = 1, INK+1
            DO JB = 1, JPNB
               DRDT  (JI,JJ,JB) = 0.0
               DO JG = 1, JPNGAS
                  DRDQ(JI,JJ,JB,JG) = 0.0
               ENDDO
            ENDDO
         ENDDO
      ENDDO
      DO JJ = 1, JPNLM
         SECAN(JJ) = 1. / ( COS( ZENANG(JJ)*(ZPI/180.) ) )
         TOTO3OBS(JJ) = 0.0
         DO JB = 1, JPNB
           BT    (JB,JJ) = 0.0
           DRDPS (JJ,JB) = 0.0
           DRDEMI(JJ,JB) = 0.0
         ENDDO
      ENDDO
C
C     -----------------------------------------------------------------
C*         4.   Forward model.
C               --------------
 400  CONTINUE
C
C* Des initialisation a verifier ou a specifier pour sauver du temps
C
      do jb = 1,JPnb
         do jl = 1,JPnlm
            listpc(jb,jl) = 1
         enddo
      enddo
C
C
      CALL RTMSCRUNPROF (BT,DRDT,DRDQ,DRDPS,DRDEMI,CLSATNAM,NIB1,NIB2,
     x  NJULIAN,NMONTH,NIYEAR,NICLOUD,JPNLM,NLX,INK,INK+1,JPNB,NIPSFLAG,
     x  NEMIFLAG,NIASSIM,IMODE,LISTPC,ITYPE_SFC,NIGO,SECAN,ZLAT,SH,
     x  PLEV,CFE,TT,QGAS,PS,TS,EMIGN,XX,CFEXX,XXE,NKBIAS,NKTUNE,KIERR)
C
      IF ( KIERR .NE. 0 ) THEN
         CALL ABORT3D ( NULOUT,'RTMSCINITRAD         ')
      ENDIF
C
      J = 0
      DO JJ = 1, NLX
         DO JB =1, JPNB
            J = J + 1
            PTB(J) = BT(JB,JJ)
cnwa            PRAD(J) = PRAD(JB,JJ)
         ENDDO
      ENDDO
C
C     -----------------------------------------------------------------
C
C*         5.   Storage of Jacobians
C               --------------------
 500  CONTINUE
C
C
      IF ( IMODE .EQ. 1 ) THEN
         CALL FILLJACGOES (DRDT,DRDQ,DRDPS,Q,NLX,KCNT)
      ENDIF
C
      RETURN
      END