*IF DEF,CONTROL                                                            OAINIT1.2      
*IF DEF,OCEAN                                                              GSH1F403.3      
C ******************************COPYRIGHT******************************    GTS2F400.6481   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.6482   
C                                                                          GTS2F400.6483   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.6484   
C restrictions as set forth in the contract.                               GTS2F400.6485   
C                                                                          GTS2F400.6486   
C                Meteorological Office                                     GTS2F400.6487   
C                London Road                                               GTS2F400.6488   
C                BRACKNELL                                                 GTS2F400.6489   
C                Berkshire UK                                              GTS2F400.6490   
C                RG12 2SZ                                                  GTS2F400.6491   
C                                                                          GTS2F400.6492   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.6493   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.6494   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.6495   
C Modelling at the above address.                                          GTS2F400.6496   
C ******************************COPYRIGHT******************************    GTS2F400.6497   
C                                                                          GTS2F400.6498   
CLL  Routine: OC_AC_INIT                                                   OAINIT1.4      
CLL                                                                        OAINIT1.5      
CLL  Purpose: Reads in user choices, ACOBS files and auxillary files       OAINIT1.6      
CLL                                                                        OAINIT1.7      
CLL  Tested under compilers:         VAX Fortran 5.4 CRAY: cf77            OAINIT1.8      
CLL  Tested under operating systems: VAX/VMS V5.3    CRAY: Unicos 5.0      OAINIT1.9      
CLL                                                                        OAINIT1.10     
CLL  Author: M. J. Bell   Date: 2 July 1992                                OAINIT1.11     
CLL                                                                        OAINIT1.12     
CLL  Model            Modification history from model version 3.0:         OAINIT1.13     
CLL version  date                                                          OAINIT1.14     
CLL  3.1   19/02/93 Sections 3 & 4: OA_DG_NML called to modify             MB180293.1      
CLL                 choices for diagnostics                                MB180293.2      
CLL  3.1   19/02/93 Section 5: Length of obs data (LEN_DATA)               MB180293.3      
CLL                 determined before calling OA_IN_RD_OBS                 MB180293.4      
CLL                 and ACOBS files explicitly opened/closed               MB180293.5      
CLL  3.2   Argument lists changed for dynamic allocation                   @DYALLOC.2520   
CLL 3.2    28/07/93 Error message if OBS array too small M. Bell           @DYALLOC.2521   
CLL  3.3   01/12/93  Changes to argument list of call to OA_IN_SET_GRPS    FR011293.67     
CLL                  Addition of NO_TYP_MAX to OA_IN_PRMI arg. list        FR011293.68     
CLL  3.3   05/12/93  Loop over input ACOBS files added to set LEN_DATA     FR011293.69     
CLL                                                                        OAINIT1.15     
CLL   3.3   Declare, as EXTERNAL, OA_TIM_INIT.                             MB051293.37     
CLL   3.4  20/06/94 Argument LCAL360 passed to OA_IN_RD_OBS                GSS1F304.479    
CLL                                                S.J.Swarbrick           GSS1F304.480    
CLL   3.4   01/09/94  Correction to internal i/o statements                OFR1F304.23     
CLL   3.5  24/03/95    Changed OPEN to FILE_OPEN and                       GPB1F305.95     
CLL                    CLOSE to FILE_CLOSE    P.Burton                     GPB1F305.96     
CLL   4.1   Include NO_CSF_MAX in call OA_IN_PRMI                          OFR1F401.60     
CLL   4.1   Included call to OA_IN_RD_AUX                                  OFR1F401.61     
CLL   4.1   I_HGRID_HD used instead of I_GLBL_HD, I_CYC_HD                 OFR1F401.62     
!     4.1  18/06/96  Changes to cope with changes in STASH addressing      GDG0F401.1115   
!                    Author D.M. Goddard.                                  GDG0F401.1116   
CLL   4.1    15/05/96 Calls OA_OBS_FRSH to read obs files  M. J. Bell      OMB1F401.63     
CLL   4.3  17/04/97    Tidy DEFS and code so that blank source is not      GSH1F403.4      
CLL                    produced (A. Brady)                                 GSH1F403.5      
CLL   4.4   Pass ARGOINDX through to OA_IN_PRMI                            OFR1F404.9      
CLL                                                                        MB051293.38     
CLL   4.4  01/06/97  Argument list change (OC_AC_INIT and OA_IN_PRMI)      OFR6f404.5      
CLL                  I_HGRID_HD replaced by L_OGLOBAL and L_OCYCLIC        OFR6f404.6      
CLL                                                                        OFR6f404.7      
CLL  External documentation: FOAM doc paper 5/2/2                          OAINIT1.16     
CLL                                                                        OAINIT1.17     
CLL  Logical components covered: T1A                                       OAINIT1.18     
CLL                                                                        OAINIT1.19     
CLL  Programming standard: FOAM Doc Paper 3/2/1 version 1.0                OAINIT1.20     
CLL                                                                        OAINIT1.21     
C-----------------------------------------------------------------------   OAINIT1.22     
C*L                                                                        OAINIT1.23     

      SUBROUTINE OC_AC_INIT(ICODE, CMESSAGE, LL_AC_TIM,                     1OAINIT1.24     
*CALL MOCACSZE                                                             @DYALLOC.2522   
*CALL ARGOINDX                                                             OFR1F404.10     
*CALL MOCGM                                                                @DYALLOC.2523   
*CALL ARGPPX                                                               GDG0F401.1117   
     # O_OBS, O_COV, LEN_FIXHD,                                            @DYALLOC.2524   
     & NO_COLS_HD, NO_ROWS_HD, NO_LEVS_HD,                                 OFR6f404.8      
     # D_FIX_LON_HD, D_FIX_LAT_HD,                                         OAINIT1.26     
     # POL_LAT_HD, POL_LON_HD,                                             OAINIT1.27     
     # RLAT_S_HD, RLON_W_HD,                                               OAINIT1.28     
     & DEP_LEV_HD, D_LAT_HD, D_LON_HD, L_OGLOBAL, L_OCYCLIC, LCAL360       OFR6f404.9      
     & )                                                                   OFR6f404.10     
C*                                                                         OAINIT1.30     
      IMPLICIT NONE                                                        OAINIT1.31     
C                                                                          OAINIT1.32     
C*L ARGUMENT LIST                                                          OAINIT1.33     
C                                                                          OAINIT1.34     
      INTEGER ICODE             ! (IN/OUT) return code                     OAINIT1.35     
      CHARACTER*256 CMESSAGE    ! (OUT) message accompanying return code   OAINIT1.36     
C                                                                          OAINIT1.37     
      LOGICAL LL_AC_TIM    ! (IN) T => TIMER called during OA routines     OAINIT1.38     
C                                                                          @DYALLOC.2525   
*CALL ROCACSZE          ! (IN) OA dimensions                               @DYALLOC.2526   
*CALL TYPOINDX          ! (IN) ocean grid index variables                  OFR1F404.11     
*CALL ROCGM ! (OUT) model grid description                                 @DYALLOC.2527   
C Main obs arrays                                                          @DYALLOC.2528   
      REAL O_OBS(MAX_OBS_VAL)     ! IN     observation values              @DYALLOC.2529   
      REAL O_COV(LEN_COV)         ! IN     covariance fields               @DYALLOC.2530   
      INTEGER LEN_FIXHD           ! IN     length of fixed header          @DYALLOC.2531   
C dimensions of model grid                                                 OAINIT1.42     
      INTEGER NO_COLS_HD   ! (IN) number of columns in (expanded) grid     OAINIT1.43     
      INTEGER NO_ROWS_HD   ! (IN) number of rows in (expanded) grid        OAINIT1.44     
      INTEGER NO_LEVS_HD   ! (IN) number of levels in (expanded) grid      OAINIT1.45     
C model grid spacing                                                       OAINIT1.46     
      REAL D_FIX_LON_HD    ! (IN) first longitude spacing in grid          OAINIT1.47     
      REAL D_FIX_LAT_HD    ! (IN) first latitude spacing in grid           OAINIT1.48     
      REAL POL_LAT_HD      ! (IN) true latitude of pole of rotated grid    OAINIT1.49     
      REAL POL_LON_HD      ! (IN) true longitude of pole of rotated grid   OAINIT1.50     
      REAL RLAT_S_HD    ! (IN) latitude of 'southern' edge of tracer gri   OAINIT1.51     
      REAL RLON_W_HD    ! (IN) longitude of 'western' edge of tracer gri   OAINIT1.52     
      REAL DEP_LEV_HD(NO_LEVS_HD)  ! (IN) depth levels                     OAINIT1.53     
      REAL D_LAT_HD(NO_ROWS_HD)    ! (IN) latitude spacings                OAINIT1.54     
      REAL D_LON_HD(NO_COLS_HD)    ! (IN) longitude spacings               OAINIT1.55     
C                                                                          OFR6f404.11     
      LOGICAL L_OGLOBAL  ! (IN) T=> ocean grid is global                   OFR6f404.12     
      LOGICAL L_OCYCLIC  ! (IN) T=> ocean grid is cyclic                   OFR6f404.13     
      LOGICAL LCAL360    ! (IN) T=> 360 day calendar                       OFR6f404.14     
C*                                                                         OAINIT1.56     
CL PARAMETERS                                                              OAINIT1.57     
C                                                                          OAINIT1.58     
*CALL POCACNST                                                             @DYALLOC.2532   
*CALL CENVIR                                                               MB180293.6      
*CALL CSUBMODL                                                             GDG0F401.1118   
*CALL CPPXREF                                                              GDG0F401.1119   
*CALL PPXLOOK                                                              GDG0F401.1120   
C                                                                          OAINIT1.60     
CL COMDECKS  amended by this routine                                       OAINIT1.61     
C                                                                          OAINIT1.62     
*CALL COCAUX                                                               OAINIT1.63     
*CALL COCACDG                                                              OAINIT1.64     
*CALL COCGRP                                                               OAINIT1.66     
*CALL COCIOF                                                               OAINIT1.67     
*CALL COCLAY                                                               OAINIT1.68     
*CALL COCMTL                                                               OAINIT1.69     
*CALL COCNOB                                                               OAINIT1.70     
*CALL COCPMA                                                               OAINIT1.72     
*CALL COCPMB                                                               OAINIT1.73     
*CALL COCPMC                                                               OAINIT1.74     
*CALL COCTIM                                                               OAINIT1.75     
C                                                                          OAINIT1.76     
*IF DEF,OCNASSM                                                            ORH1F305.485    
CL SUBROUTINES CALLED                                                      OAINIT1.77     
C                                                                          OAINIT1.78     
      EXTERNAL OA_TIM_INIT                                                 MB051293.39     
      EXTERNAL OA_DG_DEF, OA_DG_NML, OA_IN_PRMI, OA_IN_NMLI                MB180293.7      
      EXTERNAL OA_IN_PRMD, OA_IN_NMLD, OA_OBS_FRSH                         OMB1F401.64     
C                                                                          MB180293.10     
CL NO LOCAL ARRAYS                                                         MB180293.11     
C                                                                          OAINIT1.81     
CL OTHER VARIABLES                                                         OAINIT1.82     
      INTEGER I_UNT_IN   ! main input stream's unit number                 OAINIT1.84     
      INTEGER IG         ! loop index over ACOBS files                     FR051293.165    
C                                                                          OAINIT1.85     
      LOGICAL LL_FRST    ! T => first read of NAMELISTS (output defaults   OAINIT1.86     
      LOGICAL LL_LAST    ! T => last read of NAMELISTS (check / set valu   OAINIT1.87     
C                                                                          @DYALLOC.2533   
C*                                                                         OAINIT1.88     
C-----------------------------------------------------------------------   OAINIT1.89     
C                                                                          OAINIT1.90     
CL 0. Preliminaries                                                        OAINIT1.91     
C                                                                          OAINIT1.92     
      I_UNT_IN = 5    ! main input stream's unit number                    OAINIT1.93     
C                                                                          OAINIT1.94     
CL  0.1 Find start and end of assimilation period                          OAINIT1.95     
C                                                                          OAINIT1.96     
      CALL OA_TIM_INIT(O_TIM_FIN_ASS, O_TIM_STR_ASS, O_EDG_ASS_PER)        OAINIT1.97     
C                                                                          OAINIT1.98     
CL 1. Set defaults for choices for diagnostic                              MB180293.17     
C                                                                          OAINIT1.100    
      CALL OA_DG_DEF( ICODE, CMESSAGE)                                     OAINIT1.101    
C                                                                          OAINIT1.102    
CL 2. Set defaults for main "parameters" set by NAMELISTS                  MB180293.18     
C                                                                          OAINIT1.104    
CL  2.1 for "parameters" independent of input data                         OAINIT1.105    
C                                                                          OAINIT1.106    
      CALL OA_IN_PRMI(ICODE,CMESSAGE,                                      OAINIT1.107    
     # MAX_LEVS_M, MAX_ROWS_M, MAX_COLS_M,                                 @DYALLOC.2535   
     & NO_CAT_MAX, NO_GRP_MAX, NO_TYP_MAX, NO_CSF_MAX,                     OFR2F401.235    
*CALL ARGOINDX                                                             OFR1F404.12     
*CALL MOCGM                                                                @DYALLOC.2537   
*CALL AOCPMA                                                               OAINIT1.111    
*CALL AOCPMB                                                               OAINIT1.112    
*CALL AOCPMC                                                               OAINIT1.113    
     & LL_AC_TIM, L_OGLOBAL, L_OCYCLIC,                                    OFR6f404.15     
     # NO_COLS_HD, NO_ROWS_HD, NO_LEVS_HD,                                 OAINIT1.115    
     # D_FIX_LON_HD, D_FIX_LAT_HD,                                         OAINIT1.116    
     # POL_LAT_HD, POL_LON_HD, RLAT_S_HD, RLON_W_HD,                       OAINIT1.117    
     # DEP_LEV_HD, D_LAT_HD, D_LON_HD)                                     OAINIT1.118    
C                                                                          OAINIT1.119    
      IF(ICODE .GT. 0) GO TO 999                                           OAINIT1.120    
C                                                                          OAINIT1.121    
CL 2.2 for "parameters" determining or dependent on input data             OAINIT1.122    
C                                                                          OAINIT1.123    
      CALL OA_IN_PRMD(ICODE, CMESSAGE)                                     OAINIT1.124    
      IF(ICODE .GT. 0) GO TO 999                                           OAINIT1.125    
C                                                                          OAINIT1.126    
CL  3.  First read of NAMELISTS (writing defaults to diagnostics file)     OAINIT1.127    
C                                                                          OAINIT1.128    
      LL_FRST = .TRUE.                                                     OAINIT1.129    
      LL_LAST = .FALSE.                                                    OAINIT1.130    
C                                                                          OAINIT1.131    
        REWIND I_UNT_IN                                                    OFR4F404.691    
CL  3.0 for diagnostic choices                                             MB180293.19     
C                                                                          MB180293.20     
      CALL OA_DG_NML(ICODE,CMESSAGE,I_UNT_IN,JO_UNT_DG,                    MB180293.21     
     *               LL_FRST, LL_LAST)                                     MB180293.22     
      IF(ICODE .GT. 0) GO TO 999                                           MB180293.23     
C                                                                          MB180293.24     
CL  3.1 for "parameters" independent of input data                         OAINIT1.132    
C                                                                          OAINIT1.133    
      CALL OA_IN_NMLI(ICODE, CMESSAGE, I_UNT_IN, JO_UNT_DG,                OAINIT1.134    
     #                LL_FRST, LL_LAST)                                    OAINIT1.135    
      IF(ICODE .GT. 0) GO TO 999                                           OAINIT1.136    
C                                                                          OAINIT1.137    
CL  3.2 for "parameters" determining or dependent on input data            OAINIT1.138    
C                                                                          OAINIT1.139    
      CALL OA_IN_NMLD(ICODE,CMESSAGE,I_UNT_IN,JO_UNT_DG,                   OAINIT1.140    
     #                LL_FRST, LL_LAST)                                    OAINIT1.141    
      IF(ICODE .GT. 0) GO TO 999                                           OAINIT1.142    
C                                                                          OAINIT1.143    
CL  4.  Last read of NAMELISTS (checking values set; setting               OAINIT1.144    
CL      any values dependent on namelist; and writing namelists            OAINIT1.145    
CL      to diagnostics file)                                               OAINIT1.146    
C                                                                          OAINIT1.147    
      LL_FRST = .FALSE.                                                    OAINIT1.148    
      LL_LAST = .TRUE.                                                     OAINIT1.149    
C                                                                          OAINIT1.150    
CL  4.0 for diagnostic choices                                             MB180293.25     
C                                                                          MB180293.26     
      CALL OA_DG_NML(ICODE,CMESSAGE,I_UNT_IN,JO_UNT_DG,                    MB180293.27     
     *               LL_FRST, LL_LAST)                                     MB180293.28     
      IF(ICODE .GT. 0) GO TO 999                                           MB180293.29     
C                                                                          MB180293.30     
CL  4.1 for "parameters" independent of input data                         OAINIT1.151    
C                                                                          OAINIT1.152    
      CALL OA_IN_NMLI(ICODE, CMESSAGE, I_UNT_IN, JO_UNT_DG,                OAINIT1.153    
     #                LL_FRST, LL_LAST)                                    OAINIT1.154    
      IF(ICODE .GT. 0) GO TO 999                                           OAINIT1.155    
C                                                                          OAINIT1.156    
CL  4.2 for "parameters" determining or dependent on input data            OAINIT1.157    
C                                                                          OAINIT1.158    
      CALL OA_IN_NMLD(ICODE,CMESSAGE,I_UNT_IN,JO_UNT_DG,                   OAINIT1.159    
     #                LL_FRST, LL_LAST)                                    OAINIT1.160    
      IF(ICODE .GT. 0) GO TO 999                                           OAINIT1.161    
C                                                                          OAINIT1.162    
C                                                                          OAINIT1.164    
CL 6. Read in ACOBS files and index input data                             MB180293.54     
        CALL OA_OBS_FRSH(ICODE, CMESSAGE,LL_AC_TIM,.TRUE.,LEN_FIXHD,       OMB1F401.65     
*CALL MOCACSZE                                                             @DYALLOC.2548   
*CALL ARGPPX                                                               ORH0F402.1      
     &  O_OBS)                                                             OMB1F401.66     
C                                                                          OAINIT1.180    
      IF(ICODE .GT. 0) GO TO 999                                           OAINIT1.181    
C                                                                          OAINIT1.182    
CL 8. Read in auxillary data                                               MB180293.58     
C                                                                          OAINIT1.184    
      CALL OA_IN_RD_AUX                                                    OFR1F401.63     
C                                                                          OAINIT1.186    
CL 9. Check and amend input choices according to data available            MB180293.59     
C                                                                          OAINIT1.188    
999   CONTINUE                                                             OAINIT1.189    
*ENDIF   OCNASSM                                                           ORH1F305.486    
      RETURN                                                               OAINIT1.190    
      END                                                                  OAINIT1.191    
C-----------------------------------------------------------------------   GSH1F403.6      
*ENDIF ! OCNASSM                                                           OAINIT1.192    
*ENDIF ! CONTROL                                                           OAINIT1.193