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