define and put an array value to the netCDF file
| Type | Intent | Optional | 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 |
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