ncfile_put_array Subroutine

public subroutine ncfile_put_array(sf, varname_in, ndims_var, dims, dimids, def_put_mode, transpose_in, int_in, real_in)

define and put an array value to the netCDF file

Type Bound

t_ncfile

Arguments

Type IntentOptional Attributes Name
class(t_ncfile), intent(inout) :: sf

self

character(len=*), intent(in) :: varname_in

name of the variable

integer, intent(in) :: ndims_var

number of dimensions

integer, intent(in) :: dims(1:ndims_var)

number of dimensions

integer, intent(in) :: dimids(1:ndims_var)

ids of dimensions, must be created before by put_dim

integer, intent(in) :: def_put_mode

1:"def" or 2:"put" mode

logical, intent(in), optional :: transpose_in

transpose the data array, default is true, because of fortran ordering

integer, intent(in), optional :: int_in(PRODUCT(dims))

integer input

real(kind=wp), intent(in), optional :: real_in(PRODUCT(dims))

double input


Calls

proc~~ncfile_put_array~~CallsGraph proc~ncfile_put_array t_ncfile%ncfile_put_array proc~mpi_check_single_access mpi_check_single_access proc~ncfile_put_array->proc~mpi_check_single_access

Called by

proc~~ncfile_put_array~~CalledByGraph proc~ncfile_put_array t_ncfile%ncfile_put_array proc~writedatatonetcdf WriteDataToNETCDF proc~writedatatonetcdf->proc~ncfile_put_array

Source Code

  SUBROUTINE ncfile_put_array(sf,varname_in,ndims_var,dims,dimids,def_put_mode,transpose_in, int_in,real_in)
    ! MODULES
    IMPLICIT NONE
    !-------------------------------------------------------------------------------------------------------------------------------
    ! INPUT VARIABLES
    CHARACTER(LEN=*),INTENT(IN) :: varname_in  !! name of the variable
    INTEGER,INTENT(IN)          :: ndims_var       !! number of dimensions
    INTEGER,INTENT(IN)          :: dims(1:ndims_var)   !! number of dimensions
    INTEGER,INTENT(IN)          :: dimids(1:ndims_var) !! ids of dimensions, must be created before by put_dim
    INTEGER,INTENT(IN) :: def_put_mode  !! 1:"def" or 2:"put" mode
    LOGICAL,INTENT(IN),OPTIONAL :: transpose_in !! transpose the data array, default is true, because of fortran ordering
    INTEGER,INTENT(IN),OPTIONAL  :: int_in(PRODUCT(dims))     !! integer input
    REAL(wp),INTENT(IN),OPTIONAL :: real_in(PRODUCT(dims))   !!  double input
    !-------------------------------------------------------------------------------------------------------------------------------
    ! OUTPUT VARIABLES
    CLASS(t_ncfile),INTENT(INOUT):: sf    !! self
    ! LOCAL VARIABLES
    INTEGER    :: varid
    LOGICAL ::transpose
    !===============================================================================================================================
    CALL mpi_check_single_access()
#if NETCDF
    IF(PRESENT(transpose_in))THEN
      transpose=transpose_in
    ELSE
      transpose=.TRUE.
    END IF
    IF(.NOT.sf%isopen) CALL sf%openfile()
    IF(PRESENT(int_in))THEN
      SELECT CASE(def_put_mode)
      CASE(1) !def
        IF(transpose)THEN
          sf%ioError = nf90_def_var(sf%nc_id, varname_in,NF90_INT,dimids(ndims_var:1:-1),varid)
        ELSE
          sf%ioError = nf90_def_var(sf%nc_id, varname_in,NF90_INT,dimids(1:ndims_var),varid)
        END IF
        CALL sf%handle_error("define integer array'"//TRIM(varname_in)//"'")
      CASE(2) !put
        SELECT CASE(ndims_var)
        CASE(1)
          sf%ioError = nf90_put_var(sf%nc_id, varid,int_in)
        CASE(2)
          IF(transpose)THEN
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(int_in,dims(2:1:-1),order=[2,1]))
          ELSE
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(int_in,dims(1:2)))
          END IF
        CASE(3)
          IF(transpose)THEN
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(int_in,dims(3:1:-1),order=[3,2,1]))
          ELSE
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(int_in,dims(1:3)))
          END IF
        CASE(4)
          IF(transpose)THEN
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(int_in,dims(4:1:-1),order=[4,3,2,1]))
          ELSE
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(int_in,dims(1:4)))
          END IF
        CASE DEFAULT
          CALL abort(__STAMP__,&
                     "ndims_var>4 not implemented yet in io_netcdf")
        END SELECT
        CALL sf%handle_error("write integer array '"//TRIM(varname_in)//"'")
      END SELECT !CASE(def_put_mode)
    END IF
    IF(PRESENT(real_in))THEN
      SELECT CASE(def_put_mode)
      CASE(1) !def
        IF(transpose)THEN
          sf%ioError = nf90_def_var(sf%nc_id, varname_in,NF90_DOUBLE,dimids(ndims_var:1:-1),varid)
        ELSE
          sf%ioError = nf90_def_var(sf%nc_id, varname_in,NF90_DOUBLE,dimids(1:ndims_var),varid)
        END IF
        CALL sf%handle_error("define real array'"//TRIM(varname_in)//"'")
      CASE(2) !put
        sf%ioError = nf90_INQ_VARID(sf%nc_id, TRIM(varname_in), varid)
        CALL sf%handle_error("find varid of real array'"//TRIM(varname_in)//"'")
        SELECT CASE(ndims_var)
        CASE(1)
          sf%ioError = nf90_put_var(sf%nc_id, varid,real_in)
        CASE(2)
          IF(transpose)THEN
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(real_in,dims(2:1:-1),order=[2,1]))
          ELSE
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(real_in,dims(1:2)))
          END IF
        CASE(3)
          IF(transpose)THEN
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(real_in,dims(3:1:-1),order=[3,2,1]))
          ELSE
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(real_in,dims(1:3)))
          END IF
        CASE(4)
          IF(transpose)THEN
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(real_in,dims(4:1:-1),order=[4,3,2,1]))
          ELSE
            sf%ioError = nf90_put_var(sf%nc_id, varid,RESHAPE(real_in,dims(1:4)))
          END IF
        CASE DEFAULT
          CALL abort(__STAMP__,&
                     "ndims_var>4 not implemented yet in io_netcdf")
        END SELECT
        CALL sf%handle_error("write real array '"//TRIM(varname_in)//"'")
      END SELECT !CASE(def_put_mode)
    END IF
#else
  CALL abort(__STAMP__,&
      "cannot write array, BUILD_NETCDF=OFF")
#endif /*NETCDF*/
  END SUBROUTINE ncfile_put_array