MODULE def_ini_mod
!
!git $Id$
!svn $Id: def_ini.F 1151 2023-02-09 03:08:53Z arango $
!================================================== Hernan G. Arango ===
!  Copyright (c) 2002-2023 The ROMS/TOMS Group                         !
!    Licensed under a MIT/X style license                              !
!    See License_ROMS.md                                               !
!=======================================================================
!                                                                      !
!  This module open existing nonlinear model initial conditions file   !
!  using either the standard NetCDF library or the Parallel-IO (PIO)   !
!  library. It either define new new variables or inquire about the    !
!  existing variable IDs.                                              !
!                                                                      !
!=======================================================================
!
      USE mod_param
      USE mod_parallel
      USE mod_iounits
      USE mod_ncparam
      USE mod_scalars
!
      USE def_dim_mod,  ONLY : def_dim
      USE def_var_mod,  ONLY : def_var
      USE strings_mod,  ONLY : FoundError
!
      implicit none
!
      PUBLIC  :: def_ini
      PRIVATE :: def_ini_nf90
!
      CONTAINS
!
!***********************************************************************
      SUBROUTINE def_ini (ng)
!***********************************************************************
!
!  Imported variable declarations.
!
      integer, intent(in) :: ng
!
!  Local variable declarations.
!
      character (len=*), parameter :: MyFile =                          &
     &  "ROMS/Utility/def_ini.F"
!
!-----------------------------------------------------------------------
!  Open existing nonlinear initial conditions NetCDF file and inquire
!  about its contains and define new variables, if needed.
!-----------------------------------------------------------------------
!
      SELECT CASE (INI(ng)%IOtype)
        CASE (io_nf90)
          CALL def_ini_nf90 (ng)
        CASE DEFAULT
          IF (Master) WRITE (stdout,10) INI(ng)%IOtype
          exit_flag=3
      END SELECT
      IF (FoundError(exit_flag, NoError, 70, MyFile)) RETURN
!
  10  FORMAT (' DEF_INI - Illegal output file type, io_type = ',i0,     &
     &        /,11x,'Check KeyWord ''OUT_LIB'' in ''roms.in''.')
!
      RETURN
      END SUBROUTINE def_ini
!
!***********************************************************************
      SUBROUTINE def_ini_nf90 (ng)
!***********************************************************************
!
      USE mod_netcdf
!
!  Imported variable declarations.
!
      integer, intent(in) :: ng
!
!  Local variable declarations.
!
      logical :: got_var(NV)
      logical :: Ldefine = .FALSE.
!
      integer, parameter :: Natt = 25
      integer :: i, j, ifield, itrc, status
      integer :: Fcount
      integer :: DimIDs(nDimID)
!
      real(r8) :: Aval(6)
!
      character (len=256)    :: ncname
      character (len=MaxLen) :: Vinfo(Natt)
      character (len=*), parameter :: MyFile =                          &
     &  "ROMS/Utility/def_ini.F"//", def_ini_nf90"
!
      SourceFile=MyFile
!
!=======================================================================
!  Open an existing initialization file, check its contents, and
!  prepare for appending data.
!=======================================================================
!
      IF (.not.LdefINI(ng)) THEN
        ncname=INI(ng)%name
!
!  Open initialization file for read/write.
!
        IF (INI(ng)%ncid.eq.-1) THEN
          CALL netcdf_open (ng, iNLM, ncname, 1, INI(ng)%ncid)
          IF (FoundError(exit_flag, NoError, 628, MyFile)) THEN
            WRITE (stdout,10) TRIM(ncname)
            RETURN
          END IF
        END IF
!
!  Inquire about the dimensions and check for consistency.
!
        CALL netcdf_check_dim (ng, iNLM, ncname,                        &
     &                         ncid = INI(ng)%ncid)
        IF (FoundError(exit_flag, NoError, 638, MyFile)) RETURN
!
!  Inquire about the variables.
!
        CALL netcdf_inq_var (ng, iNLM, ncname,                          &
     &                       ncid = INI(ng)%ncid)
        IF (FoundError(exit_flag, NoError, 644, MyFile)) RETURN
!
!  Initialize logical switches.
!
        DO i=1,NV
          got_var(i)=.FALSE.
        END DO
!
!  Scan variable list from input NetCDF and activate switches for
!  initialization variables. Get variable IDs.
!
        DO i=1,n_var
          IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idtime))) THEN
            got_var(idtime)=.TRUE.
            INI(ng)%Vid(idtime)=var_id(i)
          ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idFsur))) THEN
            got_var(idFsur)=.TRUE.
            INI(ng)%Vid(idFsur)=var_id(i)
          ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idUbar))) THEN
            got_var(idUbar)=.TRUE.
            INI(ng)%Vid(idUbar)=var_id(i)
          ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idVbar))) THEN
            got_var(idVbar)=.TRUE.
            INI(ng)%Vid(idVbar)=var_id(i)
          ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idUvel))) THEN
            got_var(idUvel)=.TRUE.
            INI(ng)%Vid(idUvel)=var_id(i)
          ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idVvel))) THEN
            got_var(idVvel)=.TRUE.
            INI(ng)%Vid(idVvel)=var_id(i)
          ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idVvis))) THEN
            got_var(idVvis)=.TRUE.
            INI(ng)%Vid(idVvis)=var_id(i)
          ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idTdif))) THEN
            got_var(idTdif)=.TRUE.
            INI(ng)%Vid(idTdif)=var_id(i)
          ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idSdif))) THEN
            got_var(idSdif)=.TRUE.
            INI(ng)%Vid(idSdif)=var_id(i)
          END IF
          DO itrc=1,NT(ng)
            IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idTvar(itrc)))) THEN
              got_var(idTvar(itrc))=.TRUE.
              INI(ng)%Tid(itrc)=var_id(i)
            END IF
          END DO
        END DO
!
!  Check if initialization variables are available in input NetCDF
!  file.
!
        IF (.not.got_var(idtime)) THEN
          IF (Master) WRITE (stdout,40) TRIM(Vname(1,idtime)),          &
     &                                  TRIM(ncname)
          exit_flag=3
          RETURN
        END IF
        IF (.not.got_var(idFsur)) THEN
          IF (Master) WRITE (stdout,40) TRIM(Vname(1,idFsur)),          &
     &                                  TRIM(ncname)
          exit_flag=3
          RETURN
        END IF
        IF (.not.got_var(idUbar)) THEN
          IF (Master) WRITE (stdout,40) TRIM(Vname(1,idUbar)),          &
     &                                  TRIM(ncname)
          exit_flag=3
          RETURN
        END IF
        IF (.not.got_var(idVbar)) THEN
          IF (Master) WRITE (stdout,40) TRIM(Vname(1,idVbar)),          &
     &                                  TRIM(ncname)
          exit_flag=3
          RETURN
        END IF
        IF (.not.got_var(idUvel)) THEN
          IF (Master) WRITE (stdout,40) TRIM(Vname(1,idUvel)),          &
     &                                  TRIM(ncname)
          exit_flag=3
          RETURN
        END IF
        IF (.not.got_var(idVvel)) THEN
          IF (Master) WRITE (stdout,40) TRIM(Vname(1,idVvel)),          &
     &                                  TRIM(ncname)
          exit_flag=3
          RETURN
        END IF
        DO itrc=1,NT(ng)
          IF (.not.got_var(idTvar(itrc))) THEN
            IF (Master) WRITE (stdout,40) TRIM(Vname(1,idTvar(itrc))),  &
     &                                    TRIM(ncname)
            exit_flag=3
            RETURN
          END IF
        END DO
!
!  Set unlimited time record dimension to the appropriate value.
!
        INI(ng)%Rindex=rec_size
        Fcount=INI(ng)%Fcount
        INI(ng)%Nrec(Fcount)=rec_size
      END IF
!
  10  FORMAT (/,' DEF_INI_NF90 - unable to open initial NetCDF',        &
     &        ' file: ',a)
  20  FORMAT (/,' DEF_INI_NF90 - illegal dimensions for variable : ',a, &
     &        /,16x,'Nvardims = ',i0,', missing dimension: ''',a,'''',  &
     &        /,16x,'in file: ',a,                                      &
     &        /,16x,'Remove such variable from input file.')
  30  FORMAT (/,' DEF_INI_NF90 - unable to put in define mode initial', &
     &        ' NetCDF file: ',a)
  40  FORMAT (/,' DEF_INI_NF90 - unable to find variable: ',a,2x,       &
     &        ' in file: ',a)
!
      RETURN
      END SUBROUTINE def_ini_nf90
      END MODULE def_ini_mod