!copyright (C) 2001  MSC-RPN COMM  %%%RPNPHY%%%
***S/P OLDRAD3
*
#include "phy_macros_f.h"

      SUBROUTINE OLDRAD3 ( F, SIZEF,  V, VSIZ, G, ESPG, 1,19
     +                     T , Q , PS , S, TAU, SATUCO, STRCLD,
     +                     KOUNT , DATE , KNTRAD , TRNCH,
     +                     N , M , NK , DBGMEM , ITASK)
*
#include "impnone.cdk"
      INTEGER ESPG, SIZEF, KNTRAD, ITASK, VSIZ
      INTEGER KOUNT,DATE(14),TRNCH,N,M,NK
      REAL F(SIZEF), V(VSIZ),G(ESPG)
      REAL T(M,NK),Q(M,NK),PS(N),S(M,NK)
      REAL TAU
      real delp,JULIEN,ALF,SOLCONS,R0R,JULIAND
      LOGICAL DBGMEM
#include "biton.cdk"
      EXTERNAL SUNCOS,JULIAND
*
      LOGICAL SATUCO, STRCLD
*
*AUTHOR
*          LOUIS GARAND(OCTOBER 1989)
*
*REVISION
* 001      G.PELLERIN STANDARD DOCUMENTATION (APR90)
* 002      G.PELLERIN  (JUL 90)
*            STANDARDIZATION OF THERMODYNAMIC FUNCTIONS
* 003      Y. DELAGE  (NOV 1990)
*            REMOVAL OF ZAI FROM PERMANENT VARIABLES
*            REPLACE WC BY ILMO
* 004      N. BRUNET  (MAY91)
*            NEW VERSION OF THERMODYNAMIC FUNCTIONS
*            AND FILE OF CONSTANTS
* 005      B. BILODEAU  (JULY 1991)- ADAPTATION TO UNIX
* 006      C. GIRARD (NOV 1992) - NEW PARAMETERIZATION OF
*          CLOUD FRACTION
* 007      R. BENOIT (AUGUST 93) - LOCAL SIGMA COORDINATE
* 008      B. BILODEAU (MAY 1994) - New physics interface
* 009      B. BILODEAU (DEC 1995) - IR tendency bug correction
* 010      M. Desgagne (Oct 95) - New interface
* 011      B. Bilodeau (Sept 96) - Replace the previous
*          memory management system by the new "STK" system designed
*          by Marc Gagnon
* 012      B. Bilodeau (Nov 96) - Replace common block pntclp by
*                                 common block radbus
* 013      G. Pellerin (Aug 96) -Remove ANEMOX and PSKI
* 014      B. Bilodeau (Nov 98) - Merge phyexe and param4
* 015      J. Mailhot  (Mar 1999) - Changes for new SURFACE interface
* 016      B. Bilodeau (Nov 2000) - New comdeck phybus.cdk
* 017      M. Lepine (March 2003) -  CVMG... Replacements
* 018      J.P. Toviessi (June 2003) - IBM conversion
*               - calls to exponen4 (to calculate power function '**')
*               - divisions replaced by reciprocals
*               - unnecessary calculations removed
* 019      B. Bilodeau (Aug 2003) - exponen4 replaced by vspown1
* 020      B. Bilodeau (Mar 2004) - Change indexing of ilmo
*
************************************************************************                
*OBJECT
*          TO CALCULATE SOLAR AND INFRARED RADIATION AND CLOUDS.
*          THE ROUTINES RADIX AND RASOL ARE BASED ON RADIR AND
*          SUN1.
*
*ARGUMENTS
*
*          - INPUT/OUTPUT -
* F        FIELD OF PERMANENT PHYSICS VARIABLES
* SIZEF    DIMENSION OF F
* V        VOLATILE BUS
* VSIZ     DIMENSION OF V
*
*
*          - INPUT -
* G        physics work space
* ESPG     dimension of G
* T        TEMPERATURE
* Q        SPECIFIC HUMIDITY
* PS       SURFACE PRESSURE
* S        LOCAL SIGMA VALUES
* TAU      TIMESTEP
* SATUCO   .TRUE. IF WATER/ICE PHASE FOR SATURATION
*          .FALSE. IF WATER PHASE ONLY FOR SATURATION
* STRCLD   .TRUE. if stratospheric clouds are acceptable
*          .FALSE. otherwise
* KOUNT    NUMBER OF TIMESTEPS
* DATE     DATE
* KNTRAD   FREQUENCY OF CALL FOR INFRA-RED RADIATION
* TRNCH    NUMBER OF THE SLICE
* N        HORIZONTAL DIMENSION
* M        1ST DIMENSION OF T AND Q
* NK       NUMBER OF LAYERS
* DBGMEM   .TRUE. TO DEBUG MEMORY
*          .FALSE. TO NOT DEBUG MEMORY
* ITASK    TASK NUMBER
*
*NOTES
*          OLDRAD3 PRODUCES:
*          INFRA-RED RATE (TI) OF COOLING
*          VISIBLE RATE (T2) OF HEATING
*          VISIBLE FLUX TO GROUND (FDSS)
*          INFRA-RED FLUX TO GROUND (FDSI)
*
*
*IMPLICITES
#include "indx_sfc.cdk"
#include "phy_macros_f.h"
#include "phybus.cdk"
#include "stk.cdk"
*
#include "maxlev.cdk"
*
#include "consphy.cdk"
*
*MODULES
*
*     ROUTINES DE GESTION DE MEMOIRE
*
      EXTERNAL RADIX, RASOL, CONRAY2, SETDSR2
*
*     ROUTINES D'EXTRACTION DE SERIES TEMPORELLES
*
      EXTERNAL SERXST
*
*     ROUTINES RADIATION ET NUAGES
*
      EXTERNAL NUAGES
*
*     UTILITAIRES
*
*      EXTERNAL PRINTER
*
**
*
      INTEGER IHTMP,ILTMP,IMTMP
*
*     POINTEURS DES VARIABLES DE TRAVAIL DE LA RADIATION
*     DETERMINES PAR UNE ROUTINE DE GESTION DE MEMOIRE
*
      REAL P0 ,P1 ,P2 ,P3 ,P4 ,P5 ,P6 ,P7 ,P8
*
      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))
*
      REAL C3D, IB, TT, QQ, PG, ZAI
      REAL IH, IL, IM, DSR, FRFL
*
      POINTER (PTC3D ,C3D (1)), (PTIB   ,IB   (1)),
     +        (PTTT  ,TT  (1)), (PTQQ   ,QQ   (1)), (PTPG   ,PG   (1)),
     +        (PTZAI ,ZAI (1)), (PTIH   ,IH   (1)), (PTIL   ,IL   (1)),
     +        (PTIM  ,IM  (1)), (PTDSR  ,DSR  (1)), (PTFRFL ,FRFL (1))

*
      REAL V1,SC,CPSG
*     REAL DSR(LEVMAX), FRFL(LEVMAX)  ... PUT ON WORK STACK AND 2D
      REAL DECL(2)
      REAL HZ0,HZ
*
      REAL tmp
*
      AUTOMATIC ( tmp1    , REAL  , (N ) )
      AUTOMATIC ( tmp2    , REAL  , (N ) )
      AUTOMATIC ( tmp3    , REAL  , (N ) )
      AUTOMATIC ( tmp4    , REAL  , (N ) )
      AUTOMATIC ( tmp5    , REAL  , (N ) )
*
      REAL SST,SLL,SH,SSM,EPSH,EPSM,EPSL
      INTEGER J,K,NNK,IT
      REAL HEURSER,rGRAV,rEPS,rSTEFAN
      INTEGER IERGET
      EXTERNAL MZONXST, SERGET
*
      SAVE SST,SLL,SH,SSM,EPSH,EPSM,EPSL
*
      DATA SST, SLL, SH, SSM/.225,.905,.395,.710/
      DATA EPSH,EPSM,EPSL/ .32,.27,.25/
*
*     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
*
*
*     INITIALISATION DU SYSTEME DE GESTION DE L'ESPACE DE TRAVAIL
      STK_INITA(G,ESPG)
*
      IT = ITASK
      CALL SERGET ('HEURE', HEURSER, 1, IERGET)
1000  CONTINUE
*
      rGRAV = 1./GRAV
      rEPS = 1./.622
      rSTEFAN = 1./STEFAN
*
        NNK= N*NK
*
      STK_ALLOC(PTTT   , NNK )
      STK_ALLOC(PTQQ   , NNK )
      STK_ALLOC(PTPG   , N   )
*
      DO 500 K=1,NK
      DO 500 J=1,N
      TT((K-1)*N+J)  = T(J,K)
      QQ((K-1)*N+J)  = Q(J,K)
 500  CONTINUE
*
      DO 501 J=1,N
 501  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. )
*
*     ARRAYS REPLACING DSR AND FRFL
      STK_ALLOC(PTDSR   , NNK )
      STK_ALLOC(PTFRFL  , NNK )
      CALL SETDSR2(DSR,S,N,NK)
      CALL CONRAY2(DECL,FRFL,S,DSR,N,NK,0., DATE)
*
*
*     NUAGES
*
      STK_ALLOC(PTC3D   , NNK )
*
      CALL NUAGES2 ( F(NHAUT) , F(NMOY) , F(NBAS) ,
     X               C3D, V(BASC), Q, T, PS, F(SCL), 
     X               F(ILMO+(INDX_AGREGE-1)*N), S,
     Y               TRNCH, N, M, NK, ITASK, SATUCO, STRCLD)
*
      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
*
      CALL SERXST  ( F(FN) , 'NU' , TRNCH , N , 0.0 ,    1.0 ,-1    )
      CALL MZONXST ( F(FN) , 'NU' , TRNCH , N , HEURSER, 1.0, -1, IT)
      CALL SERXST  ( C3D   , 'NS' , TRNCH , N , 0.0 ,    1.0 ,-1    )
      CALL MZONXST ( C3D   , 'NS' , TRNCH , N , HEURSER, 1.0, -1, IT)
*
*     REFROIDISSEMENT RADIATIF
*
      IF(MOD(KOUNT,KNTRAD).EQ.0)THEN
        STK_ALLOC(PTP1   , N   )
        STK_ALLOC(PTP2   , N   )
        STK_ALLOC(PTP3   , N   )
        STK_ALLOC(PTP4   , N   )
        STK_ALLOC(PTP5   , N   )
        STK_ALLOC(PTZAI  , N   )
*
       call VSLOG(tmp1,S(1,NK),N)
       DO J=1,N
          ZAI(j) = -1./(RGASD*rGRAV*T(J,NK)*tmp1(J))
       enddo

        CALL RADIX ( F(TI) , T , Q , f(TSRAD) , ZAI , PS , S ,
     X               P1 , P2 , P3 , P4 , P5 ,
     Y               N , M , NK )
*
        STK_DEALL (PTP1)
*
*       DE THETA A T
*
        DO  K=1,NK
        DO J=1,N
           tmp1(J)=(S(J,K)*PS(J)*1.e-5)
        enddo
        call vspown1 (tmp1,tmp1,CAPPA,N)
        DO J=1,N
           F(TI+(K-1)*N+J-1) = F(TI+(K-1)*N+J-1)*tmp1(J)
        enddo
        enddo
*
      ENDIF
*
C
C  RADIATION SOLAIRE
C
        STK_ALLOC(PTP1   , N   )
        STK_ALLOC(PTP2   , N   )
        STK_ALLOC(PTP3   , N   )
        STK_ALLOC(PTP4   , N   )
        STK_ALLOC(PTP5   , N   )
        STK_ALLOC(PTP6   , N   )
        STK_ALLOC(PTP7   , N   )
        STK_ALLOC(PTP8   , N   )
*
      CALL RASOL  (F(T2), F(FDSS), DECL, Q, PS, S, F(FN),
     +              N, M, NK, DSR, f(dLAT), f(dLON), FRFL, HZ,
     +              P1, P2, P3, P4, P5,
     +              P6, P7, P8)
*
      do j=1,n*nk
         f(ccn+j-1) = f(fn+j-1)
      end do
*
      DO 2035 J=0,N-1
         V(FLUSOLIS+J) = F(FDSS+J)
         V(FDSS    +J) = F(FDSS+J)*(1.-f(ALVIS+(indx_agrege-1)*N+J))
 2035 CONTINUE
*
      STK_ALLOC(PTIL   , N   )
      STK_ALLOC(PTIM   , N   )
      STK_ALLOC(PTIH   , N   )
      DO 51 K=1,NK
         DO 60 J=1,N
            IF (S(J,K).GT.SST.AND.S(J,K).LT.SH)  THEN
               IH(J)=K
            ELSE IF (S(J,K).GT.SST.AND.S(J,K).LT.SSM)  THEN
               IM(J)=K
            ELSE IF (S(J,K).GT.SST.AND.S(J,K).LT.SLL) THEN
               IL(J)=K
            ENDIF
 60      CONTINUE
 51   CONTINUE
*     AFTER THIS LOOP, IL, IM, IH ARE KNOWN
      DO  K=1,NK
         DO J=1,N
            IHTMP = NINT(IH(J))
            IMTMP = NINT(IM(J))
            ILTMP = NINT(IL(J))
            tmp1(J) = T(J,ILTMP)
            tmp2(J) = T(J,IMTMP)
            tmp3(J) = T(J,IHTMP)
            tmp5(J)=  ((PS(J)*0.01)*Q(J,NK))*rEPS 
         enddo
         tmp = 4
         call vspown1 (tmp1,tmp1,tmp,N)
         call vspown1 (tmp2,tmp2,tmp,N)
         call vspown1 (tmp3,tmp3,tmp,N)
         call vspown1 (tmp4,T(1,NK),tmp,N)
         tmp = .08
         call vspown1 (tmp5,tmp5,tmp,N)
         DO J=1,N
            SC=STEFAN* ( EPSL*tmp1(J) *F(NBAS+J-1) +
     X           (   EPSM*tmp2(J)*F(NMOY+J-1)
     X           +  EPSH*tmp3(J)*F(NHAUT+J-1)*
     $           (1.0-F(NMOY+J-1)))*(1.0-F(NBAS+J-1)) )
C     POUR CORRIGER LE BUG ENLEVER /EMISSY*STEFAN DEVANT SC.
C     LA PRESSION DOIT ETRE EN MB DANS CETTE EQUATION
C           F(FDSI+J-1)= STEFAN*0.67*((PS(J)*0.01)*Q(J,NK)/
C    X           (EPS1+EPS2*Q(J,NK)))**.08 *(V1*T(J,NK))**4 + SC
*
            F(FDSI+J-1)= 0.67*tmp5(J)*STEFAN*tmp4(J) + SC
         enddo
      enddo
*
*
       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
*
*      CALCUL DU JOUR JULIEN
       JULIEN = JULIAND(TAU,KOUNT,DATE)
       CALL SUNCOS(P1,N,f(dLAT),f(dLON),HZ,JULIEN,DATE)
       ALF = JULIEN/365.*2.*PI
       R0R = SOLCONS(ALF)
*
*      cpsg permet de convertir des variables du type
*      ps*dT/dt en flux d'energie (W/m2)
       cpsg = cpd/grav
*
       tmp = 4
       call vspown1 (tmp1,f(TSM1-1),tmp,N)
       DO J=0,N-1
       p4(J+1)=CONSOL*R0R*P1(J+1)
       p1(J+1)=p4(J+1)-cpsg*p3(J+1)-f(FDSS+J)
       p5(J+1)=f(EPSTFN+J)*(tmp1(j+1)-f(FDSI+J)*rSTEFAN)
     &                -cpsg*p2(J+1)
       p6(J+1)=p4(J+1)-p1(J+1)-p5(J+1)
       END DO
*
*     EXTRAIRE LES TENDANCES RADIATIVES
      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)
*
      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)
      CALL SERXST (P1       ,'EV', TRNCH , N , 0.0    , 1.0 , -1    )
      CALL MZONXST(P1       ,'EV', TRNCH , N , HEURSER, 1.0 , -1, IT)
      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)
      CALL SERXST (P4       ,'IV', TRNCH , N , 0.0    , 1.0 , -1    )
      CALL MZONXST(P4       ,'IV', TRNCH , N , HEURSER, 1.0 , -1, IT)
      CALL SERXST (P5       ,'EI', TRNCH , N , 0.0    , 1.0 , -1    )
      CALL MZONXST(P5       ,'EI', TRNCH , N , HEURSER, 1.0 , -1, IT)
      CALL SERXST (P6       ,'NR', TRNCH , N , 0.0    , 1.0 , -1    )
      CALL MZONXST(p6       ,'NR', TRNCH , N , HEURSER, 1.0 , -1, IT)
*
      STK_DEALL (PTIH)
      STK_DEALL (PTIM)
      STK_DEALL (PTIL)
     
C  RESUBSTITUER T,Q ET PS
      DO 502 K=1,NK
      DO 502 J=1,N
      T(J,K)= TT((K-1)*N+J)
      Q(J,K)= QQ((K-1)*N+J)
 502  CONTINUE
      DO 503 J=1,N
 503  PS(J) = PG(J)
*
      STK_DEALL (PTTT)
C
*
      STK_FREE
*
      RETURN
      END