!copyright (C) 2001  MSC-RPN COMM  %%%RPNPHY%%%
***S/P  NEWRAD3
*

      SUBROUTINE NEWRAD3 ( F, SIZEF, V, VSIZ, GV, ESPVOL, 1,41
     +                     T, Q, PS, S, TAU, KOUNT,
     +                     TRNCH , N , M , NK , ISTAK, ITASK,
     +                     NKP, NKRD, NKPRD, INRD)
#include "impnone.cdk"
*
      INTEGER SIZEF,ESPVOL,KOUNT,TRNCH, VSIZ,
     +        N,M,NK,ISTAK,ITASK,NKP,NKRD,NKPRD
      INTEGER INRD(NKPRD)
      REAL F(SIZEF), V(VSIZ), GV(ESPVOL), T(M,NK), Q(M,NK), PS(N), S(N,NK)
      REAL TAU
*
*Author
*          L. Garand and J. Mailhot RPN  (June 1989)
*
*Revision
* 001      Louis Garand(October 1989)
*               Include solar scheme from FOUQUART and BONNEL
* 002      Louis Garand Add CO2 wing bands
* 003      G.Pellerin  (Jul 90)
*                Standardization of thermodynamic functions
* 004      Y. Delage  (Nov 1990)
*                  Removal of ZAI from permanent variables
*                  Replace WC by ILMO
* 005      N. Brunet  (May91)
*                 New version of thermodynamic functions
*                 and file of constants
* 006      C.Girard (Nov92) New Parameterization of cloud
*          fraction
* 007      Y.Chartier (March 1993) Optimisation of RADIR
* 008      B. Bilodeau (July 1993) New comdecks added
* 009      B. Bilodeau (May  1993) R0 variable and extra calculations
*          to take into account the case when sunrise occurs between
*          2 calls to SUN1
* 010      B. Bilodeau and C. Girard (Aug 93) - Reformulation of the
*          modulation of the solar flux between 2 calls to SUN1
* 011      R. Benoit (Aug 93) Local Sigma
* 012      B. Bilodeau (November 1993) - Correction to "AP"
* 013      B. Bilodeau (November 1993) -
*          Reduce solar constant according to ozone above model roof
* 014      B. Bilodeau (April 1994) - Change call to pntozon and add
*             common block ozopnt. New physics interface.
* 015      Wei Yu (June 94) New cloud water (from Sundqvist, 1978)
*                           can be used in the solar radiation
*                           when STCOND.EQ.'NEWSUND' (ISTCOND.EQ.3)
* 016      M. Gagnon (June 1995) - Reduction mode (optimization)
* 017      M. Gagnon and B. Bilodeau (Nov 95) - Replace the previous
*          memory management system by the new "STK" system designed
*          by Marc Gagnon
* 018      L. Garand (April 1995) Routine CLDOPTX introduced
* 019      M. Desgagne (Nov 95) - New interface
* 020      B. Dugas (Sep 96) - Include comdeck options.cdk and
*                              add option RADFIX
* 021      B. Bilodeau (Nov 96) - Replace common block pntclp by
*                                 common block radbus
* 022      G. Pellerin (Oct 96) - Zonal extraction corrected
* 023      P.-A. Michelangeli (Jul 98) - Add option FOMIC in radir4
* 024      B. Bilodeau (Aug 98) - Perform calculations at kount=0 and
*                                 at kount=1
* 025      B. Bilodeau (Nov 98) - Merge phyexe and param4
* 026      J. Mailhot  (Mar 99) - Changes for new SURFACE interface
* 027      B. Bilodeau (Aug 99) - Interaction of cloud water/ice with
*                                 radiation for microphysics schemes
* 028      B. Dugas (April 1999) - Replace CLDOPTX by CLDOPTX2
* 025      G. Lemay, A. Patoine and B. Bilodeau (Sep 99) - Correct 
*                    multitasking bug by removing comdeck "solfact"
* 026      A.-M. Leduc (April 2000) - Correct bug regarding liquid water
*                    content passed to cldoptx2 for mixed-phase scheme
* 027      B. Bilodeau (Nov 2000) - New comdeck phybus.cdk
* 028      B. Dugas (Jan 2002) - Modifiy call to RADIR, add call to FOMICHEV
* 029      B. Dugas (March 2002) - Modify stratospheric cloud correction
* 030      B. Dugas (Sep 2002) - Add QCO2 in call to infrared radiation
* 031      B. Bilodeau (Nov 2002) - Add ML, CTP and CTT to call to cldoptx
* 032      B. Bilodeau and J. Mailhot (Feb 2003) - NHAUT, NMOY and NBAS
*                        added as output to radir
* 033      M. Lepine (March 2003) -  CVMG... Replacements
* 034      D. Talbot (June 2003) - IBM conversion
*               - calls to exponen4 (to calculate power function '**')
*               - divisions replaced by reciprocals
* 035      A.-M. Leduc (Jun 2003) - add option RADFLTR
* 036      F. Lemay  (Sept 2003)  - Move new code for radfix in call sun_radfix
*
*Object
*          to execute a more advanced scheme in finding the infrared
*          and solar radiation and calculation of clouds
*
*Arguments
*
*          - Input/Output -
* F        field of permanent physics variables
* SIZEF    dimension of F
* GV       physics work space ("volatile space")
* ESPVOL   dimension of G
*
*          - Input -
* T        temperature
* Q        specific humidity
* PS       surface pressure
* S        sigma levels
* TAU      timestep
* SATUCO   .TRUE. if water/ice phase for saturation
*          .FALSE. if water phase only for saturation
* ISTCOND  switch for condensation scheme (see s/r param)
* KOUNT    number of timesteps
* KNTRAD   frequency of call for infra-red radiation
* TRNCH    index of the vertical plane (NI*NK) for which
*          calculations are to be done.
* N        horizontal dimension
* M        1st dimension of T and Q
* NK       number of layers
* ISTAK    stack number to use
* ITASK    task number
* NKP      number of layers including ground
* NKRD     number of reduced layers
* NKPRD    number of reduced layers including ground
* INRD     list of reduced layers
* REDUC    .true. to use inrd and compute on reduced layers
*          .false. to use full layers (inrd not used)
*
*Notes
*          NEWRAD3 produces:
*          Infra-red rate (TI) of cooling
*          Visible rate (T2) of heating
*          Visible flux to ground (FDSS)
*          Infra-red flux to ground (FDSI)
*          Infra-red flux to the top of the atmosphere (EI)
*          Visible flux to the top of the atmosphere (EV)
*          Planetary albedo (AP=EV/incident solar flux)
*
#include "biton.cdk"
*
*
*IMPLICITES
*
#include "indx_sfc.cdk"
#include "phy_macros_f.h"
#include "phybus.cdk"
#include "stk.cdk"
#include "clefcon.cdk"
#include "consphy.cdk"
#include "dintern.cdk"
#include "options.cdk"
#include "ozopnt.cdk"
#include "radparam.cdk"
#include "raddata.cdk"
#include "radpnt.cdk"
#include "nocld.cdk"
*
*MODULES
*
*     REAL JJULIEN
*     EXTERNAL JJULIEN
      REAL JULIAND
      EXTERNAL JULIAND
*
*     ROUTINES D'EXTRACTION DE SERIES TEMPORELLES
*
      EXTERNAL SERXST
*
*     ROUTINES RADIATION ET NUAGES
*
      EXTERNAL LIQWC
      EXTERNAL NUAGES2
      EXTERNAL RADIR7
      EXTERNAL FOMICHEV
      EXTERNAL RADFAC3
      EXTERNAL PNTG123
      EXTERNAL PNTOZON
      EXTERNAL SUN7, SETVIS2, SUNCOS
      EXTERNAL CLDOPTX3
      EXTERNAL SUN_RADFIX
*
*     UTILITAIRES
*
*      EXTERNAL PRINTER
*
**
*
*
*     POINTEURS DES VARIABLES VOLATILES DE LA RADIATION
*     DETERMINES PAR UNE ROUTINE DE GESTION DE MEMOIRE
*
      REAL P0 ,P1 ,P2 ,P3 ,P4 ,P5 ,P6 ,P7 ,P8 ,P9 ,P10,P11,P12,P13,P14,
     +     P15,P16,P17
*
      POINTER (PTP0 ,P0 (1)), (PTP1 ,P1 (1)), (PTP2 ,P2 (1)),
     +        (PTP3 ,P3 (1)), (PTP4 ,P4 (1)), (PTP5 ,P5 (1)),
     +        (PTP6 ,P6 (1)), (PTP7 ,P7 (1)), (PTP8 ,P8 (1)),
     +        (PTP9 ,P9 (1)), (PTP10,P10(1)), (PTP11,P11(1)),
     +        (PTP12,P12(1)), (PTP13,P13(1)), (PTP14,P14(1)),
     +        (PTP15,P15(1)), (PTP16,P16(1)), (PTP17,P17(1))
*
*
      REAL Q1 ,Q2 ,Q3 ,Q4 ,Q5 ,Q6 ,Q7 ,Q8 ,Q9 ,Q10,Q11,Q12,Q13,Q14,Q15,
     +     Q16,Q17,Q18,Q19,Q20,Q21,Q22,Q23,Q24,Q25,Q26,Q27,Q28,Q29,Q30,
     +     Q31,Q32,Q33,Q34,Q35
*
      POINTER (PTQ1 ,Q1 (1)), (PTQ2 ,Q2 (1)), (PTQ3 ,Q3 (1)),
     +        (PTQ4 ,Q4 (1)), (PTQ5 ,Q5 (1)), (PTQ6 ,Q6 (1)),
     +        (PTQ7 ,Q7 (1)), (PTQ8 ,Q8 (1)), (PTQ9 ,Q9 (1)),
     +        (PTQ10,Q10(1)), (PTQ11,Q11(1)), (PTQ12,Q12(1)),
     +        (PTQ13,Q13(1)), (PTQ14,Q14(1)), (PTQ15,Q15(1)),
     +        (PTQ16,Q16(1)), (PTQ17,Q17(1)), (PTQ18,Q18(1)),
     +        (PTQ19,Q19(1)), (PTQ20,Q20(1)), (PTQ21,Q21(1)),
     +        (PTQ22,Q22(1)), (PTQ23,Q23(1)), (PTQ24,Q24(1)),
     +        (PTQ25,Q25(1)), (PTQ26,Q26(1)), (PTQ27,Q27(1)),
     +        (PTQ28,Q28(1)), (PTQ29,Q29(1)), (PTQ30,Q30(1)),
     +        (PTQ31,Q31(1)), (PTQ32,Q32(1)), (PTQ33,Q33(1)),
     +        (PTQ34,Q34(1)), (PTQ35,Q35(1))
*
*
      REAL C3D, NUAGE, TZ, QQ, LL, PG, OZOTOIT
*
      POINTER (PTC3D,C3D  (1)), (PTTZ ,TZ   (1)), (PTQQ ,QQ     (1)),
     +        (PTPG ,PG   (1)), (PTNUA,NUAGE(1)), (PTOZO,OZOTOIT(1)),
     +        (PTLL ,LL   (1))
*
*
      REAL AER(N,NK,5), ASY(N,NK), OPD(N,NK),
     +     DZZ(N,NK  ), SDZ(N   ), IPB(N   ),
     +     PBL(N     ), NEF(N,NK), SSA(N,NK)
*
      POINTER (PTAER,AER),  (PTASY,ASY), (PTOPD,OPD),
     +        (PTDZZ,DZZ),  (PTSDZ,SDZ), (PTIPB,IPB),
     +        (PTPBL,PBL),  (PTNEF,NEF), (PTSSA,SSA)
*
      REAL WC
      POINTER (PTWC ,WC(1))
*
      REAL HZP
      REAL FBAS
      REAL PRESS
*
*     SEUIL DU COS DE L'ANGLE SOLAIRE A PARTIR DUQUEL ON CONSIDERE
*     QUE LE SOLEIL EST LEVE.
      REAL SEUIL
      PARAMETER (SEUIL=1.E-5)
*
*     DIMENSIONS ET POINTEURS DES TABLEAUX D'OZONE
*     (DETERMINES PAR LA ROUTINE DE GESTION PNTOZON)
*
*
      REAL ALF,SOLCONS,JULIEN,R0R
*
*     POINTEURS ET DIMENSIONS DES CHAMPS NECESSAIRES
*     POUR L'OPTION DE REDUCTION DES NIVEAUX
      integer i, kk, rednk, rednkp, redm
*
      real fnrd(n,nk), srd(n,nk), trd(n,nk), qrd(n,nk)
      real p0rd(n,nk)
*
      pointer (ptfnrd,fnrd), (ptsrd,srd), (pttrd,trd), (ptqrd,qrd)
      pointer (ptp0rd,p0rd)
*
      real downrd(n,nkp), uprd(n,nkp)
      pointer (ptdownrd,downrd), (ptuprd,uprd)
*
      real del(n,nk), ss(n,nkp)
      pointer (ptdel,del), (ptss,ss)
*
      real delrd(n,nkrd), ssrd(n,nkprd)
      pointer (ptdelrd,delrd), (ptssrd,ssrd)
*
*
*     POINTEURS ET DIMENSIONS DES CHAMPS REDUS
      REAL V1,V2
      REAL VEC1(N),VEC2(N)
      REAL SC(N)
      REAL HZ0,HZ
      INTEGER J,K,JA,NNK,IS, IT
      REAL HEURSER
      INTEGER IERGET
      EXTERNAL MZONXST, SERGET
      LOGICAL OPNUA,STRCLD
C   OPNUA=TRUE : NUAGES INTERACTIFS DANS RADIR
C  OPNUA=FALSE:PAS DE NUAGES DANS RADIR
      INTEGER NNCL,IOPT
      INTEGER NNKP,NNKP2, IK
      REAL ALB, DELP
      REAL ozpak
*
#include "fintern.cdk"
*
*     FONCTION-FORMULE POUR CALCULER LA VARIATION DE LA CONSTANTE SOLAIRE
      SOLCONS(ALF)=1./(1.-9.464E-4*SIN(ALF)-.01671*COS(ALF)-
     +             1.489E-4*COS(2.*ALF)-2.917E-5*SIN(3.*ALF)-
     +             3.438E-4*COS(4.*ALF))**2
*
*
*
      STK_INITA(GV,ESPVOL)

      STK_ALLOC(ptdel,n*nk )
      STK_ALLOC(ptss ,n*nkp)
      call raddel(del,ss,s,n,nk,nkp)

      IS = ISTAK
      IT = ITASK
      CALL SERGET ('HEURE', HEURSER, 1, IERGET)
1000  CONTINUE
*
*
      JA = N*(NK-1)
      NKP=NK+1
C     *********NKP EST NB DE NIVEAUX DE FLUX
      NNKP=N*NKP
      NNK=N*NK
      NNKP2=N*NKP*NKP
*
C SAUVER T,Q,L,PS
      STK_ALLOC(PTTZ ,NNK)
      STK_ALLOC(PTQQ ,NNK)
      STK_ALLOC(PTLL ,NNK)
      STK_ALLOC(PTPG ,N  )
      STK_ALLOC(PTNUA,NNK)
*
      DO 700 K=1,NK
*VDIR NODEP
      DO 700 J=1,N
      TZ((K-1)*N+J)  = T(J,K)
      QQ((K-1)*N+J)  = Q(J,K)
      LL((K-1)*N+J)  = f(LWC+(K-1)*N+J-1)
 700  CONTINUE
*VDIR NODEP
      DO 701 J=1,N
 701  PG(J)= PS(J)
*
*     T',Q',PS' -> T,Q,PS
*
      DO 1 K=1,NK
         DO 1 J=1,N
    1       Q(J,K) = MAX ( Q(J,K) , 0.0 )
*
      HZ0 = DATE(5)
      HZ = AMOD ( HZ0+(FLOAT(KOUNT)*TAU)/3600. , 24. )
*
*
*     CORRECTION NUAGES STRATOSPHERIQUES (BD, MARS 1995)
*     --------------------------------------------------
*
      if ( istcond .lt. 2 ) then
*
         STK_ALLOC(PTC3D, N*NK)
*
*        NUAGES
*
         STRCLD = RADFIX
         CALL NUAGES2 ( F(NHAUT) , F(NMOY) , F(NBAS) ,
     X                 C3D, V(BASC), Q, T, PS, F(SCL),
     +                 F(ILMO+(indx_agrege-1)*n), S,
     Y                 TRNCH, N, M, NK, ITASK, SATUCO, STRCLD)
*
*VDIR NODEP
         DO 449 J=0,NNK-1
            if (F(FN+J).GT.0.0) C3D(J+1) = 0.
         F(FN+J)=MIN(1.,C3D(J+1)+F(FN+J))
  449    CONTINUE
*
      else if (istcond.ge.2.and..not.radfix) then
*
*        IL N'Y A PAS DE NUAGES AU-DESSUS DE TOPC
*        OU BIEN SI Q EST PLUS PETIT QUE MINQ.
*
         DO K=1,NK
            DO I=1,N
*
               PRESS = S(I,K)*PS(I)
*
               IF (TOPC.GT.PRESS .OR. MINQ.GE.Q(I,K) ) THEN
                  F(CCN +I-1+(K-1)*N) = 0.0
                  F(CCK +I-1+(K-1)*N) = 0.0
                  F(LWC +I-1+(K-1)*N) = 0.0
               ENDIF
*
            ENDDO
         ENDDO
*
      endif
*
      IF ( ISTCOND .EQ. 3 ) THEN
         DO 543 K = 1 , NK-1
*VDIR NODEP
            DO 543 J = 1, N
               IF ( F(LWC+(K-1)*N+J-1) .GE. 0.1E-8 ) THEN
                  NUAGE(J+(K-1)*N)   = F(CCN+J-1+(K-1)*N)
               ELSE if(F(CCk+J-1+(K-1)*N) .gt. 0.09) then
                  NUAGE(J+(K-1)*N)   = F(CCK+J-1+(K-1)*N)
                  F(LWC+(K-1)*N+J-1) = 10.0E-5 * F(CCK+J-1+(K-1)*N)
               ELSE
                  NUAGE(J+(K-1)*N)   = 0.
                  F(LWC+(K-1)*N+J-1) = 0.0
               ENDIF
 543     CONTINUE
*
         do 544 j=1,N
            NUAGE(J+(NK-1)*N)   = 0.0
            F(LWC+(NK-1)*N+J-1)  = 0.0
 544     continue
*
      ELSE IF( ISTCOND .ge. 4) then
*VDIR NODEP
         DO J = 0 , NNK-1
            NUAGE(J+1) = F(CCN+J)
         ENDDO
*
      ELSE
*VDIR NODEP
         DO 555 J = 0 , NNK-1
*
            NUAGE(J+1) = F(FN+J)
*
*           CCN CONTIENT "FN" COMPLET A LA FIN DU PAS DE TEMPS.
*           UTILISER "CCN" ET NON "FN" POUR FINS DE SORTIE.
            F(CCN  +J) = F(FN+J)
*
 555     CONTINUE
      ENDIF
*
*
        NNCL=N*NPCL
        STK_ALLOC(PTP0   , NNKP )
*
        STK_ALLOC(PTAER  ,N*NK*5)
        STK_ALLOC(PTSSA  ,NNK   )
        STK_ALLOC(PTASY  ,NNK   )
        STK_ALLOC(PTOPD  ,NNK   )
        STK_ALLOC(PTNEF  ,NNK   )
        STK_ALLOC(PTDZZ  ,NNK   )
        STK_ALLOC(PTPBL  ,N     )
        STK_ALLOC(PTIPB  ,N     )
        STK_ALLOC(PTSDZ  ,N     )
*
*
C COMPUTE OPTICAL PARAMETERS FOR VIS AND IR CODE
C INCLUDES EFFECTIVE IR CLOUD AMOUNT
C AND FOR VIS: AEROSOLS, OPTICAL DEPTH, ASYMETRY FACTOR,
C AND SINGLE SCATTERING ALBEDO
C
C HAUTEUR DE COUCHE LIMITE TEMPORAIREMENT MISE A 1500 METRES
C EN ATTENDANT QU'ELLE SOIT PASSEE A NEWRAD1
C
      DO 7007 I=1,N
      PBL(I)=1500.
 7007 CONTINUE
*
       CALL CLDOPTX4 (F(LWC),F(IWC),NUAGE,T,S,PS,F(DLAT),F(MG),F(ML),
     +                M,N,NK,
     +                PBL,IPB,DZZ,SDZ, NEF,OPD,ASY,
     +                f(tlwp),f(tiwp),f(topthw),f(topthi),
     +                v(ctp),v(ctt),
     +                SSA,AER,ISTCOND,SATUCO,CW_RAD,IOPTIX,
     +                (CLIMAT.or.STRATOS))
*
*       conversion d'unites : tlwp et tiwp en kg/m2
*VDIR NODEP
        do i=1,n
           f(tlwp+i-1) = f(tlwp+i-1) * 0.001
           f(tiwp+i-1) = f(tiwp+i-1) * 0.001
        end do
*
*  BOUCLE SUR LE PAS DE RADIATION KNTRAD
*
      IF(KOUNT.EQ.0.OR. MOD((KOUNT-1),KNTRAD).EQ.0)THEN
*
        CALL PNTOZON
*
*
        STK_ALLOC(PTOZO  , N    )
        STK_ALLOC (PTP2  , NNCL )
        STK_ALLOC (PTP3  , N    )
        STK_ALLOC (PTP4  , N    )
        STK_ALLOC (PTP5  , N    )
        STK_ALLOC (PTP6  , N    )
        STK_ALLOC (PTP7  , N    )
        STK_ALLOC (PTP8  , N    )
        STK_ALLOC (PTP10 , NKP  )
        STK_ALLOC (PTP11 , NKP  )
*
*
*
      CALL RADFAC3 (P0, OZOTOIT, S, NKP, NK, NPCL,
     $              F(DLAT), PS, N, N, NKP,
     $              P2, P3, P4, P5, P6, P7, P8, P10,
     $              P11,NLACL, GOZ(FOZON), GOZ(CLAT),
     $              GOZ(PREF))
*

      STK_DEALL (PTP2)
*
*
      if( reduc ) then
        STK_ALLOC(ptsrd  , n*nkrd )
        STK_ALLOC(pttrd  , n*nkrd )
        STK_ALLOC(ptqrd  , n*nkrd )
        STK_ALLOC(ptp0rd , n*nkrd )
        STK_ALLOC(ptfnrd , n*nkrd )
        STK_ALLOC(ptdelrd, n*nkprd)
        STK_ALLOC(ptssrd , n*nkprd)

        do kk=1,nkrd
          k = inrd(kk)

          do i=1,n
            srd(i,kk) = s(i,k)
            trd(i,kk) = t(i,k)
            qrd(i,kk) = q(i,k)
            p0rd(i,kk)= p0((k-1)*n+i)
          enddo
        enddo

        rednk = nkrd
        rednkp= nkprd
        redm  = n
*
        STK_ALLOC (PTP1, N)

        call raddel(delrd,ssrd,srd,n,nkrd,nkprd)
        call rdmax(fnrd,nef,p1,inrd,n,nk,nkrd)
*
        STK_DEALL (PTP1   )

      else

        ptsrd  = loc(s)
        pttrd  = loc(t)
        ptqrd  = loc(q)
        ptp0rd = loc(p0)
        ptfnrd = loc(nef)
        ptdelrd= loc(del)
        ptssrd = loc(ss)

        rednk  = nk
        rednkp = nkp
        redm   = m

      endif
*
*
      STK_ALLOC(PTP1 , NNKP2    )
      STK_ALLOC(PTP2 , NNKP2    )
      STK_ALLOC(PTP3 , NNKP     )
      STK_ALLOC(PTP4 , NNKP     )
      STK_ALLOC(PTP5 , NNKP     )
      STK_ALLOC(PTP6 , NNKP     )
      STK_ALLOC(PTP7 , NNKP     )
      STK_ALLOC(PTP8 , NNKP     )
      STK_ALLOC(PTP9 , NNKP     )
      STK_ALLOC(PTP10, NNKP     )
      STK_ALLOC(PTP11, N        )
      STK_ALLOC(PTP12, N        )
      STK_ALLOC(PTP13, N*NKP*2  )
      STK_ALLOC(PTP14, N*NKP*NKP)
      STK_ALLOC(PTP15, N*NKP*3  )
      STK_ALLOC(PTP16, N        )
      STK_ALLOC(PTP17, N        )
*
      CALL PNTG123
*
      IOPT=0
      OPNUA=.TRUE.
*

      CALL RADIR7 ( f(ti) , P7 , P5 , FNrd , Trd , Qrd , Srd ,
     %        F(TSRAD),PS,redNKP,redNK,P0rd,
     %        redNKP,N,N,redm,NTT,MX,MXX,NO3,NCX,NCO2,
     %        G(G1),G(G2),G(G3),G(TH2O),G(TRO3),
     %        G(YG3), G(BCN),G(DBCN),G(BO3),
     %        G(DBO3),G(TO3),G(UU),G(TT),
     %        P1, P2, IOPT, OPNUA,
     %        P3 , P4 , P5 , P6 , P7 , ssrd,
     %        P9 , delrd, P11 , P12,
     %        f(nhaut), f(nmoy), f(nbas),
     $        qco2, p13, p14, p15, p16, p17,
     %        ozpak, ozpak,
     x        reduc,s,ss,del,nk,nkp,RADFIX,RADFLTR)
*
      if( FOMIC ) then
         call fomichev( f(TI), T,P0,S,PS, M,N,N,NK )
      endif
*
*     FLUX DESCENDANT A LA SURFACE
*     ...NON CORRIGE POUR L'EMISSIVITE DE LA SURFACE (S/R FCREST)
*
CDIR$ IVDEP
*VDIR NODEP
        DO 501 J=0,N-1
         F(FDSI+J) = P7((NKP-1)*N+J+1)
C   FLUX IR AU SOMMET DE L'ATMOSPHERE (W/M2)
      F(EI+J)=P5(J+1)
C   NUAGES TOTAUX
       F(NT+J)=P12(J+1)
  501   CONTINUE
*
       STK_DEALL(PTP1)
*
*
C  FIN DU CALCUL DE RADIATION INFRAROUGE
*
*
*
*     RADIATION SOLAIRE
*
      STK_ALLOC(PTP1 , NNKP)
      STK_ALLOC(PTP2 , NNKP)
      STK_ALLOC(PTP3 , NNKP)
      STK_ALLOC(PTP4 , NNK )
*
      STK_ALLOC(PTP6 , N   )
      STK_ALLOC(PTP7 , NNKP)
      STK_ALLOC(PTP8 , NNKP)
      STK_ALLOC(PTP9 , NNKP)
      STK_ALLOC(PTP10, N   )
      STK_ALLOC(PTP11, N   )
*
      K=NNKP*6
      STK_ALLOC(PTQ1 , K   )
      STK_ALLOC(PTQ2 , K   )
*
      K=NNKP*3
      STK_ALLOC(PTQ3 , K   )
*
      K=NNKP*2
      STK_ALLOC(PTQ4 , K   )
      STK_ALLOC(PTQ5 , K   )
      STK_ALLOC(PTQ6 , NNKP)
*
      K=N*8
      STK_ALLOC(PTQ7 , K   )
      STK_ALLOC(PTQ8 , K   )
      STK_ALLOC(PTQ9 , NNKP)
      STK_ALLOC(PTQ10, NNKP)
      STK_ALLOC(PTQ11, NNKP)
      STK_ALLOC(PTQ12, NNKP)
      STK_ALLOC(PTQ13, NNKP)
      STK_ALLOC(PTQ14, NNKP)
      STK_ALLOC(PTQ15, NNKP)
      STK_ALLOC(PTQ19, N   )
      STK_ALLOC(PTQ20, N   )
      STK_ALLOC(PTQ21, N   )
      STK_ALLOC(PTQ22, N   )
      STK_ALLOC(PTQ23, N   )
      STK_ALLOC(PTQ24, N   )
      STK_ALLOC(PTQ25, N   )
      STK_ALLOC(PTQ26, N   )
      STK_ALLOC(PTQ27, N   )
      STK_ALLOC(PTQ28, N   )
      STK_ALLOC(PTQ29, N   )
      STK_ALLOC(PTQ30, N   )
      STK_ALLOC(PTQ31, N   )
      STK_ALLOC(PTQ32, N   )
      STK_ALLOC(PTQ33, N   )
      STK_ALLOC(PTQ34, N   )
      STK_ALLOC(PTQ35, N   )
C
C   ALBEDO UTILISE DANS P10
C   ALBEDO LIMITE ENTRE 6% ET 80%
      DO 1212 J=1,N
      P10(J)=AMIN1(F(ALVIS+(indx_agrege-1)*N+J-1),0.80)
      P10(J)=AMAX1(P10(J),0.06)
 1212 CONTINUE
C
*
*     CALCUL DE LA VARIATION DE LA CONSTANTE SOLAIRE
*     julien = jjulien(tau,kount,date(14))
      JULIEN = JULIAND(TAU,KOUNT,DATE)
      ALF=JULIEN/365.*2*PI
      R0R = SOLCONS(ALF)
*
C  PARAMETRES D'ENTREE POUR LE SOLAIRE
C
      CALL SETVIS2(delrd, P2, P3, P4, P6,
     + P0rd,Srd,Trd,PS,P0rd,F(DLAT),F(DLON),HZ,
     x JULIEN,DATE,N,redNK,redm,SATUCO)
*
*
      if( reduc ) then
        call rdmoy(p7  ,f(lwc) ,q20,inrd,n,nk,nkrd)
        call rdmoy(p8  ,f(iwc) ,q20,inrd,n,nk,nkrd)
        call rdmoy(fnrd,nuage  ,q20,inrd,n,nk,nkrd)
*
        call cldoptx4 (p7,p8,fnrd,trd,srd,ps,f(dlat),f(mg),f(ml),
     +                 n,n,nkrd,
     +                 pbl,ipb,dzz,sdz,nef,opd,asy,
     +                 f(tlwp),f(tiwp),f(topthw),f(topthi),
     +                 v(ctp),v(ctt),
     +                 ssa,aer,3,satuco,cw_rad,ioptix,
     +                 (climat.or.stratos))
*
*       conversion d'unites : tlwp et tiwp en kg/m2
*VDIR NODEP
        do i=1,n
           f(tlwp+i-1) = f(tlwp+i-1) * 0.001
           f(tiwp+i-1) = f(tiwp+i-1) * 0.001
        end do
      else
        ptfnrd = loc(nuage)
      endif
*
*     CALCUL DU COSINUS DE L'ANGLE SOLAIRE A KOUNT+KNTRAD-1
      HZP=AMOD(HZ0+ (FLOAT(KOUNT+KNTRAD-1)*TAU)/3600., 24.)
      CALL SUNCOS(F(COSAS),N,F(DLAT),F(DLON),HZP,JULIEN,DATE)
*
*     INITIALISATION DE FDSS,T2,EV.
*VDIR NODEP
      DO 487 J=0,N-1
         F(FDSS+J) = 0.0
         F(EV  +J) = 0.0
*        F(COSAS) CONTIENDRA LA VALEUR MOYENNE DES COSINUS
*        ENTRE 2 APPELS A SUN7
         F(COSAS+J) = (P6(J+1)+F(COSAS+J))*.5
487   CONTINUE
*
      DO 488 J=0,NNK-1
         F(T2+J) = 0.0
488   CONTINUE
*
*     ATTENTION! LES CALCULS SONT FAITS POUR UN TEMPS INTERMEDIAIRE
*     ENTRE KOUNT ET KOUNT+KNTRAD-1
*

      CALL SUN7( P8, P9, F(T20), F(VOZO), OZOTOIT,
     X           delrd, P2, P3,
     X           P4, PS, Trd, Qrd, srd,
     X           P0rd, FNrd, aer, F(COSAS), P10,
     X           N, redNK, redNKP, N, redm,
     X           Q1 , Q2 , Q3 , Q4 , Q5 ,
     X           Q6 , Q7 , Q8 , Q9 , Q10,
     X           Q11, Q12, Q13, Q14, Q15,
     X           ssa, asy, opd, Q19, Q20,
     X           Q21, Q22, Q23, Q24, Q25,
     X           Q26, Q27, Q28, Q29, Q30,
     X           Q31, Q32, Q33, Q34, Q35,
     X           reduc,
     X           ss, ssrd, del, s, R0R,
     X           nk, nkp, RADFIX,RADFLTR)

*
*
*     AP   : ALBEDO PLANETAIRE.
*     EV   : FLUX MONTANT AU SOMMET.
*     FDSS : FLUX DESCENDANT A LA SURFACE.
*
*
*VDIR NODEP
      DO 490 J=0,N-1
*
         F(EV0+J)  = P9(J+1)
*
         F(FDSS0+J)= AMAX1(0.0, P8((NKP-1)*N+J+1))
*        ON CORRIGE LE FLUX SOLAIRE AU SOL POUR L'ALBEDO (S/P FCREST)
         F(FDSS0+J)= (1.-P10(J+1)) * F(FDSS0+J)
*
 490  CONTINUE
*
*
*       MODULER LES FLUX ET LES TAUX PAR LE COSINUS DE L'ANGLE SOLAIRE.
*VDIR NODEP
        DO 500 J=0,N-1
*
*           RAPPORT DES COSINUS : ANGLE ACTUEL SUR ANGLE MOYEN.
            V1 = P6(J+1)/F(COSAS+J)
*
            IF(F(COSAS+J).GT.SEUIL.AND.P6(J+1).GT.SEUIL) THEN
               F(FDSS+J)  = F(FDSS0+J) * V1
               F(EV  +J)  = F(EV0  +J) * V1
            ENDIF
            V(FLUSOLIS+J) =F(FDSS+J)/(1.-P10(J+1))
C           ALBEDO PLANETAIRE NUL SI FLUX SOLAIRE INCIDENT < 1 W/M2
            FBAS = P8(J+1) * V1
            if (FBAS.GT.1.) then
               V(AP+J) = F(EV+J)/FBAS
            else
               V(AP+J) = 0.
            endif
*
  500   CONTINUE
*
        DO 5000 K=1,NK
*VDIR NODEP
          DO 5000 J=0,N-1
             V1 = P6(J+1)/F(COSAS+J)
             IF(F(COSAS+J).GT.SEUIL.AND.P6(J+1).GT.SEUIL) THEN
                F(T2+(K-1)*N+J) = F(T20+(K-1)*N+J) * V1
             ENDIF
 5000   CONTINUE
*
      STK_DEALL(PTOZO)
*  **********************************************************
C   CAS OU MOD(KOUNT-1,KNTRAD) NON ZERO
      ELSE
C  AJUSTEMENT DU SOLAIRE AUX PAS NON MULTIPLES DE KNTRAD
C PAR MODULATION AVEC COSINUS DE L'ANGLE SOLAIRE
C
      STK_ALLOC(PTP1 ,N)
      STK_ALLOC(PTP2 ,N)
C
*     CALCUL DU JOUR JULIEN
*     appel a remplacer par
*     julien = jjulien(tau,kount,date(14))
      JULIEN = JULIAND(TAU,KOUNT,DATE)
      CALL SUNCOS(P1,N,F(DLAT),F(DLON),HZ,JULIEN,DATE)
*
*       MODULER PAR LE COSINUS DE L'ANGLE SOLAIRE. METTRE A ZERO LES
*       VALEURS APPROPRIEES DE FDSS, EV ET T2.
*VDIR NODEP
        DO 5010 J=0,N-1
*
*           RAPPORT DES COSINUS DE L'ANGLE PRESENT ET DE L'ANGLE MOYEN.
            V1 = P1(J+1)/F(COSAS+J)
*
            IF(F(COSAS+J).GT.SEUIL.AND.P1(J+1).GT.SEUIL) THEN
               F(FDSS +J) = F(FDSS0+J) * V1
               F(EV   +J) = F(EV0  +J) * V1
            ELSE
               F(FDSS +J) = 0.0
               F(EV   +J) = 0.0
            ENDIF
*           ALBEDO LIMITE ENTRE 6% ET 80%
            ALB = AMIN1(F(ALVIS+(indx_agrege-1)*N+J),0.80)
            ALB = AMAX1(ALB,0.06)
            V(FLUSOLIS+J) =F(FDSS+J)/(1.-ALB)
*
 5010   CONTINUE
*
        DO 503 K=1,NK
*VDIR NODEP
           DO 503 J=0,N-1
              V1 = P1(J+1)/F(COSAS+J)
              IF(F(COSAS+J).GT.SEUIL.AND.P1(J+1).GT.SEUIL) THEN
                 F(T2+(K-1)*N+J) = F(T20+(K-1)*N+J) * V1
              ELSE
                 F(T2+(K-1)*N+J) = 0.0
              ENDIF
  503   CONTINUE
*
C>>>> SEULEMENT SI RADFIX EST VRAI... <<<<<<
      IF(RADFIX) THEN
*
      DO 506 K=1,NK
CDIR$ IVDEP
*VDIR NODEP
         DO 506 J=0,N-1
*
         CALL SUN_RADFIX(S(J+1,K),P1(J+1),F(COSAS+J),PS(J+1),F(T2+(K-1)*N+J),(K.EQ.1))

 506   CONTINUE
*
      ENDIF
      STK_DEALL(PTP1)
C  FIN DE BOUCLE SUR RADIATION VISIBLE ET INFRAROUGE
      ENDIF
*
*      EXTRACTION DES SERIES TEMPORELLES ET
*      DES DIAGNOSTICS ZONAUX DES TENDANCES
*
       CALL SERXST ( F(TI), 'TI', TRNCH, N, 0.0, 1.0, -1)
       CALL MZONXST( F(TI), 'TI', TRNCH, N, HEURSER, PS, -2, IT)
       CALL SERXST ( F(T2), 'T2', TRNCH, N, 0.0, 1.0, -1)
       CALL MZONXST( F(T2), 'T2', TRNCH, N, HEURSER, PS, -2, IT)
*
       STK_ALLOC(PTP1 , N )
*
*      CALCUL DU JOUR JULIEN
*      julien = jjulien(tau,kount,date(14))
       JULIEN = JULIAND(TAU,KOUNT,DATE)
       CALL SUNCOS(P1,N,F(DLAT),F(DLON),HZ,JULIEN,DATE)
       ALF = JULIEN/365.*2.*PI
       R0R = SOLCONS(ALF)
*
       DO J=0,N-1
         V(CANG+J) = P1(J+1)
       end do
*
*VDIR NODEP
       DO 508 J=0,N-1
       V(IV+J)=CONSOL*R0R*P1(J+1)*F(VOZO+J)
       if (V(IV+J).GT.1.) then
          V(AP+J) = F(EV+J)/V(IV+J)
       else
          V(AP+J) = 0.
       endif
508    CONTINUE
*
       DO 509 J=0,N-1
  509  P1(J+1)=V(IV+J)-F(EV+J)-F(EI+J)
*
*      EXTRACTION POUR DIAGNOSTICS
       CALL SERXST (V(CTP )  ,'BP',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(V(CTP)   ,'BP',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (V(CTT)   ,'BE',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(V(CTT)   ,'BE',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (F(TLWP)  ,'W1',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(F(TLWP)  ,'W1',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (F(TIWP)  ,'W2',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(F(TIWP)  ,'W2',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (F(TOPTHW),'W3',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(F(TOPTHW),'W3',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (F(TOPTHI),'W4',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(F(TOPTHI),'W4',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (V(IV)    ,'IV',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(V(IV)    ,'IV',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (P1       ,'NR',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(P1       ,'NR',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (F(NT)    ,'NT',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(F(NT)    ,'NT',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (F(EV)    ,'EV',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(F(EV)    ,'EV',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (F(EI)    ,'EI',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(F(EI)    ,'EI',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (V(AP)    ,'AP',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(V(AP)    ,'AP',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (F(FDSS)  ,'FS',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(F(FDSS)  ,'FS',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (V(FLUSOLIS),'FU',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(V(FLUSOLIS),'FU',TRNCH,N,HEURSER,1.0,-1,IT)
*
*
       STK_ALLOC(PTP2 , N )
       STK_ALLOC(PTP3 , N )
*
       do j=1,n
          delp=ps(j)*0.5*(s(j,2)-s(j,1))
          p2(j)=f(TI+J-1)*delp
          p3(j)=f(T2+J-1)*delp
       end do
*
       do k=2,nk-1
          do j=1,n
             delp=ps(j)*0.5*(s(j,k+1)-s(j,k-1))
             p2(j)=p2(j)+f(TI+(K-1)*N+J-1)*delp
             p3(j)=p3(j)+f(T2+(K-1)*N+J-1)*delp
          end do
       end do
*
       do j=1,n
          delp=ps(j)*(1.-0.5*(s(j,nk)+s(j,nk-1)))
          p2(j)=p2(j)+f(TI+(NK-1)*N+J-1)*delp
          p3(j)=p3(j)+f(T2+(NK-1)*N+J-1)*delp
       end do
*
       CALL SERXST (p2    ,'T3',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(p2    ,'T3',TRNCH,N,HEURSER,1.0,-1,IT)
       CALL SERXST (p3    ,'T4',TRNCH,N,0.0    ,1.0,-1   )
       CALL MZONXST(p3    ,'T4',TRNCH,N,HEURSER,1.0,-1,IT)
*
C  RESUBSTITUER T,Q,L ET PS
      DO 702 K=1,NK
CDIR$  IVDEP
*VDIR NODEP
      DO 702 J=1,N
      T(J,K)= TZ((K-1)*N+J)
      Q(J,K)= QQ((K-1)*N+J)
      F(LWC+(K-1)*N+J-1) = LL((K-1)*N+J)
 702  CONTINUE
CDIR$  IVDEP
*VDIR NODEP
      DO 703 J=1,N
 703  PS(J) = PG(J)
*
*
      STK_DEALL ( PTTZ )

      STK_FREE
      RETURN
      END