!-------------------------------------- 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 INITRND(CDCTL) 15,1
#if defined (DOC)
*
***s/r SPGD  - Initialisation of spectral or grid model state
*     .        with random fields for testing purposes
*
*Author  : P. Gauthier *ARMA/AES  June 9, 1992
*Revision:
*     L. Fillion  *RPN/AES   Jan 93 - Observation state option added
*     P. Gauthier *ARMA/AES  May 25, 1993:
*     .                      Initialization for specific humidity and surface
*     .                      pressure (all model states)
*     L. Fillion *ARMA/AES   Sep 1994: Ensure zero value of (0,0) spectral
*                            component of vorticity and divergence fields.
*     S. Pellerin *ARMA/AES Sept 97.
*                   - Control of the different model state of the 3Dvar
*                     through COMSTATE, COMSTATEC and COMSTNUM common
*                     blocks variables (comstate.cdk).
*
*     P. Gauthier *ARMA/MSC Aug. 2002
*     .              - revision of scaling options and correct the call to the random
*     .                number generator
*
*     Purpose: creates a state with a random number generator
*Arguments
*     i :  CDCTL : = 'G' initialisation of COMGD0
*     i :  CDCTL : = 'S' initialisation of COMSP
*     i :  CDCTL : = 'M' initialisation of COMMVO
*     o :  comsp.cdk  (array SP(NLA,2,NKSDIM))
*     o : comgd0.cdk  (array GD(NIBEG:NIEND,NKGDIM,NJBEG:NJEND))
*     o : commvo.cdk  (array GOMOBS(NKGDIMO,NOBTOT)
*     -------------------
*     The COMDECK "com2ini.cdk" is used to define the scales of the different
*     variables
*
** Method: uses a random number generator to fill the fields
*
#endif
      IMPLICIT NONE
*implicits
#include "pardim.cdk"
#include "comdim.cdk"
#include "comdimo.cdk"
#include "comlun.cdk"
#include "comgd0.cdk"
#include "comgem.cdk"
#include "comsp.cdk"
#include "commvo.cdk"
#include "com2ini.cdk"
#include "comstate.cdk"
*
C
      CHARACTER*1 CDCTL
      REAL*8 ZVS, ZGS, ZQS,ZRND, ZSCVOR, ZSCDIV, ZSCGZ
     S     ,ZSCQ, ZSCPS, ZPSURFACE, ZTT, ZSCTT
     S     ,RANF
      INTEGER JGL, JLEV, JLON, JLA, JOBS, INI
C
      ZPSURFACE = 0.
C
      WRITE(NULOUT,FMT=9000)
 9000 FORMAT(/,4X,'-INITRND: random initialization of the model state'
     S     ,' done in ')
C
      SELECT CASE (CDCTL)
C
C     *    1. Initialisation of the grid point model state
C     .  --------------------------------------------
*
      CASE('G')
C
         ZVS = GINUU*1.E-6
         ZGS = GINGZ*1.
         ZTT = GINTT
         ZQS = GINQ*0.001
         ZSCPS = GINPS*1.
C
         WRITE(NULOUT,FMT=9100)ZVS,ZGS,ZQS,ZSCPS
 9100    FORMAT(8X,'Grid Space.  The following scales have been used:'
     S        ,/,8x,'(UU,VV):',G12.6
     S        ,2x,'GZ: ',G12.6,2X
     S        ,'Q: ',G12.6,2X
     S        ,'Ps: ',G12.6)
C
         DO  JLEV =1, NFLEV
            DO JGL = 1, NJ
               INI = NILON(JGL)
               DO JLON = 1, INI
                  CALL RANDOM_NUMBER(ZRND)
                  UT0(JLON,JLEV,JGL) = ZVS * (ZRND - 0.5D0)
                  CALL RANDOM_NUMBER(ZRND)
                  VT0(JLON,JLEV,JGL) = ZTT * (ZRND - 0.5D0)
                  CALL RANDOM_NUMBER(ZRND)
                  TT0(JLON,JLEV,JGL) = ZGS * (ZRND - 0.5D0)
               end do
            end do
         end do
C
C     *    .   1.1 Specific humidity (optional)
C     .       ----------------------------
C
         IF(ngexist(ngq).eq.1) THEN
            DO JLEV = 1, NFLEV
               DO JGL = 1, NJ
                  INI = NILON(JGL)
                  DO JLON = 1, INI
                     CALL RANDOM_NUMBER(ZRND)
                     Q0(JLON,JLEV,JGL) = ZQS*ZRND
                  end do
               end do
            end do
         END IF
C
C     *    .   1.2 Surface pressure (optional)
C     .       ----------------------------
C
         IF(NGEXIST(ngps).eq.1) THEN
            DO JGL = 1, NJ
               INI = NILON(JGL)
               DO JLON = 1, INI
                  CALL RANDOM_NUMBER(ZRND)
                  GPS0(JLON,1,JGL) = ZSCPS* (ZRND- 0.5) + ZPSURFACE
               end do
            end do
         END IF
C
C     *    2. Initialisation of the model spectral state
C     .  ------------------------------------------
C
      case('S')
C
         ZSCVOR = SINVOR * 1.E-6
         ZSCDIV = SINDIV * 1.E-6
         ZSCGZ  = SINGZ  * 1.
         ZSCTT  = SINTT
         ZSCQ   = SINQ *0.001
         ZSCPS  = SINPS*1.
C
         WRITE(NULOUT,FMT=9200)ZSCVOR,ZSCDIV,ZSCGZ,ZSCQ,ZSCPS
 9200    FORMAT(8X,'Spectral Space.  The following scales'
     S        ,' have been used:',/,8X,'VOR: ',G12.6
     S        ,2X,'DIV: ',G12.6,2X
     S        ,'GZ: ',G12.6,2X
     S        ,'Q: ',G12.6,2X
     S        ,'Ps: ',G12.6)
C
         DO JLEV = 1,NFLEV
            DO JLA = 1, NLA
               CALL RANDOM_NUMBER(ZRND)
               SPVOR(JLA,1,JLEV) = ZSCVOR * (ZRND - 0.5D0)
               CALL RANDOM_NUMBER(ZRND)
               SPVOR(JLA,2,JLEV) = ZSCVOR * (ZRND - 0.5D0)
C
               ZRND = RANF() - 0.5
               SPDIV(JLA,1,JLEV) = ZSCDIV * (ZRND - 0.5D0)
               CALL RANDOM_NUMBER(ZRND)
               SPDIV(JLA,2,JLEV) = ZSCDIV * (ZRND - 0.5D0)
C
               CALL RANDOM_NUMBER(ZRND)
               SPTT(JLA,1,JLEV) = ZSCTT * (ZRND - 0.5D0)
               CALL RANDOM_NUMBER(ZRND)
               SPTT(JLA,2,JLEV) = ZSCTT * (ZRND - 0.5D0)
            end do
            spvor(1,:,jlev) = 0.
            spdiv(1,:,jlev) = 0.
         end do
C
C     *    .   2.1 Specific humidity (optional)
C     .       ----------------------------
C
         IF(NSEXIST(nsq).eq.1) THEN
            DO JLEV = 1, NFLEV
               DO JLA = 1, NLA
                  CALL RANDOM_NUMBER(ZRND)
                  SPQ(JLA,1,JLEV) = ZSCQ*ZRND
                  CALL RANDOM_NUMBER(ZRND)
                  SPQ(JLA,2,JLEV) = ZSCQ*ZRND
               end do
            end do
         END IF
C
C     *    .   2.2 Surface pressure (optional)
C     .       ----------------------------
C
         IF(nsexist(nsps).eq.1) THEN
            DO  JLA = 1, NLA
               CALL RANDOM_NUMBER(ZRND)
               SPPS(JLA,1,1) = ZSCPS*ZRND + ZPSURFACE
               CALL RANDOM_NUMBER(ZRND)
               SPPS(JLA,2,1) = ZSCPS*ZRND + ZPSURFACE
            end do
         END IF
C
C     3. Initialisation of the model variables at the observation
C     .  points
C
      case('M')
C
         ZVS = GINUU
         ZGS = GINGZ
         ZQS = GINQ *0.001
         ZSCPS = GINPS*40.
C
         WRITE(NULOUT,FMT=9300)ZVS,ZGS,ZQS,ZSCPS
 9300    FORMAT(8X,'Observation Space.  The following'
     S        ,' scales have been used:',/,8x,'(UU,VV):',G12.6
     S        ,2x,'GZ: ',G12.6,2X
     S        ,'Q: ',G12.6,2X
     S        ,'Ps: ',G12.6)
         DO JLEV = 1, NFLEV
            DO JOBS =1, NOBTOT
               CALL RANDOM_NUMBER(ZRND)
               GOMU(JLEV,JOBS) = ZVS * (ZRND - 0.5D0)
               CALL RANDOM_NUMBER(ZRND)
               GOMV(JLEV,JOBS) = ZVS * (ZRND - 0.5D0)
               CALL RANDOM_NUMBER(ZRND)
               GOMT(JLEV,JOBS) = ZGS * (ZRND - 0.5D0)
            end do
         end do
C
C     *    .   3.1 Specific humidity (optional)
C     .       ----------------------------
C
         IF(nmvoexist(noq).eq.1) THEN
            ZQS = GINQ *0.001
            DO  JLEV = 1, NFLEV
               DO JOBS =1, NOBTOT
                  CALL RANDOM_NUMBER(ZRND)
                  GOMQ(JLEV,JOBS) = ZQS * (ZRND - 0.5D0)
               end do
            end do
         END IF
C
C     *    .   3.2 Surface pressure (optional)
C     .       ----------------------------
C
         IF(NMVOEXIST(nops).eq.1) THEN
            ZSCPS = GINPS*40.
            DO JOBS = 1, NOBTOT
               CALL RANDOM_NUMBER(ZRND)
               GOMPS(1,JOBS) = ZSCPS * (ZRND - 0.5D0) + ZPSURFACE
            end do
         END IF
*
      END select
C
      RETURN
      END SUBROUTINE INITRND