Skip to content
Snippets Groups Projects
Commit 63d24192 authored by WAUTELET Philippe's avatar WAUTELET Philippe
Browse files

Philippe 09/03/2018: lfi2cdf:

* write NF90_INT1 instead of NF90_INT for logicals
* use IO_WRITE_FIELD (not yet done everywhere)
* if NTYPE is unknown => fatal error
* do not try to read JPVEXT (never written)
parent dfdc66e9
No related branches found
No related tags found
No related merge requests found
...@@ -458,7 +458,7 @@ END DO ...@@ -458,7 +458,7 @@ END DO
INTEGER :: compress_level, status INTEGER :: compress_level, status
INTEGER :: idx, ji, nbfiles INTEGER :: idx, ji, nbfiles
INTEGER:: kcdf_id INTEGER :: kcdf_id
TYPE(dimCDF), POINTER :: tzdim TYPE(dimCDF), POINTER :: tzdim
INTEGER :: invdims INTEGER :: invdims
INTEGER :: type_float INTEGER :: type_float
...@@ -623,6 +623,7 @@ END DO ...@@ -623,6 +623,7 @@ END DO
CHARACTER(LEN=4) :: suffix CHARACTER(LEN=4) :: suffix
INTEGER,DIMENSION(3) :: idims, start INTEGER,DIMENSION(3) :: idims, start
INTEGER,DIMENSION(:),ALLOCATABLE :: itab INTEGER,DIMENSION(:),ALLOCATABLE :: itab
LOGICAL,DIMENSION(:),ALLOCATABLE :: gtab
REAL(KIND=8),DIMENSION(:),ALLOCATABLE :: xtab REAL(KIND=8),DIMENSION(:),ALLOCATABLE :: xtab
CHARACTER, DIMENSION(:), ALLOCATABLE :: ytab CHARACTER, DIMENSION(:), ALLOCATABLE :: ytab
REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: xtab3d, xtab3d2 REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: xtab3d, xtab3d2
...@@ -643,6 +644,7 @@ END DO ...@@ -643,6 +644,7 @@ END DO
ALLOCATE(iwork(kbuflen)) ALLOCATE(iwork(kbuflen))
ALLOCATE(itab(kbuflen)) ALLOCATE(itab(kbuflen))
ALLOCATE(gtab(kbuflen))
ALLOCATE(xtab(kbuflen)) ALLOCATE(xtab(kbuflen))
idx = 1 idx = 1
...@@ -701,7 +703,7 @@ END DO ...@@ -701,7 +703,7 @@ END DO
!TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z) !TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z)
SELECT CASE(ndims) SELECT CASE(ndims)
CASE (0) CASE (0)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/)) CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1:extent))
CASE (1) CASE (1)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/)) status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/))
CASE (2) CASE (2)
...@@ -766,9 +768,18 @@ END DO ...@@ -766,9 +768,18 @@ END DO
jj=jj+1 jj=jj+1
END DO END DO
ENDIF ENDIF
DO JJ=1,EXTENT
IF (ITAB(JJ)==0) THEN
GTAB(JJ) = .FALSE.
ELSE
GTAB(JJ) = .TRUE.
END IF
END DO
SELECT CASE(ndims) SELECT CASE(ndims)
CASE (0) CASE (0)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/)) CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,gtab(1:extent))
CASE (1) CASE (1)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/)) status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/))
CASE DEFAULT CASE DEFAULT
...@@ -826,12 +837,11 @@ END DO ...@@ -826,12 +837,11 @@ END DO
!TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z) !TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z)
SELECT CASE(ndims) SELECT CASE(ndims)
CASE (0) CASE (0)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab(1:extent),count=(/extent/)) CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,xtab(1:extent))
CASE (1) CASE (1)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab(1:extent),count=(/extent/)) status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab(1:extent),count=(/extent/))
CASE (2) CASE (2)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(xtab,(/ptdimx%len,ptdimy%len/)), & CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(xtab,(/ptdimx%len,ptdimy%len/)))
start = (/1,1,level/) )
CASE (3) CASE (3)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(xtab,(/ptdimx%len,ptdimy%len,ptdimz%len/))) status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(xtab,(/ptdimx%len,ptdimy%len,ptdimz%len/)))
CASE DEFAULT CASE DEFAULT
...@@ -880,8 +890,7 @@ END DO ...@@ -880,8 +890,7 @@ END DO
ich = iwork(2+iwork(2)+jj) ich = iwork(2+iwork(2)+jj)
ytab(jj) = CHAR(ich) ytab(jj) = CHAR(ich)
END DO END DO
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,ytab,count=(/extent/)) CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ytab)
IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
DEALLOCATE(ytab) DEALLOCATE(ytab)
ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN
status = NF90_GET_VAR(infiles%files(1)%lun_id,tpreclist(ji)%id_in,ytab,count=(/extent/)) status = NF90_GET_VAR(infiles%files(1)%lun_id,tpreclist(ji)%id_in,ytab,count=(/extent/))
...@@ -893,56 +902,18 @@ END DO ...@@ -893,56 +902,18 @@ END DO
CASE (TYPEDATE) CASE (TYPEDATE)
IF (ndims/=0) CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','only ndims=0 is supported for TYPEDATE') IF (ndims/=0) CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','only ndims=0 is supported for TYPEDATE')
CALL FIND_FIELD_ID_FROM_MNHNAME(trim(tpreclist(ji)%name),IID,IRESP2) !PW: TODO: tpreclist(ji)%TFIELD%CMNHNAME => tpreclist(ji)%TFIELD
IF (IRESP2/=0) & CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD%CMNHNAME,TZDATE)
CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','TYPEDATE variable '//TRIM(tpreclist(ji)%name)//' not found in TFIELDLIST') CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,TZDATE)
CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, TFIELDLIST(IID),TZDATE)
CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,TFIELDLIST(IID),TZDATE)
CASE default CASE default
IF (infiles%files(1)%format == LFI_FORMAT) THEN CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','invalid datatype')
IF (.NOT.tpreclist(ji)%calc) THEN
CALL LFINFO(iresp,ilu,trim(tpreclist(ji)%name)//trim(suffix),ileng,ipos)
CALL LFILEC(iresp,ilu,trim(tpreclist(ji)%name)//trim(suffix),iwork,ileng)
xtab(1:extent) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
ELSE
src=tpreclist(ji)%src(1)
CALL LFINFO(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),ileng,ipos)
CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),iwork,ileng)
xtab(1:extent) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
jj = 2
DO WHILE (tpreclist(ji)%src(jj)>0 .AND. jj.LE.MAXRAW)
src=tpreclist(ji)%src(jj)
CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),iwork,ileng)
xtab(1:extent) = xtab(1:extent) + TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
jj=jj+1
END DO
ENDIF
!TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z)
SELECT CASE(ndims)
CASE (0)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab(1:extent),count=(/extent/))
CASE (1)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab(1:extent),count=(/extent/))
CASE (2)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(xtab,(/ptdimx%len,ptdimy%len/)), &
start = (/1,1,level/) )
CASE (3)
status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(xtab,(/ptdimx%len,ptdimy%len,ptdimz%len/)))
CASE DEFAULT
print *,'Error: arrays with ',tpreclist(ji)%dim%ndims,' dimensions are not supported'
END SELECT
IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN
print *,'Error: unknown datatype'
STOP
END IF
END SELECT END SELECT
if (options(OPTSPLIT)%set) idx = idx + 1 if (options(OPTSPLIT)%set) idx = idx + 1
END DO END DO
DEALLOCATE(itab,xtab) DEALLOCATE(itab,gtab,xtab)
DEALLOCATE(iwork) DEALLOCATE(iwork)
END SUBROUTINE fill_ncdf END SUBROUTINE fill_ncdf
...@@ -1150,8 +1121,9 @@ END DO ...@@ -1150,8 +1121,9 @@ END DO
!Read problem dimensions and some grid variables (needed by IO_FILE_OPEN_ll for netCDF files) !Read problem dimensions and some grid variables (needed by IO_FILE_OPEN_ll for netCDF files)
CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPHEXT',JPHEXT) CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPHEXT',JPHEXT)
CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPVEXT',JPVEXT,IRESP) !CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPVEXT',JPVEXT,IRESP)
IF(IRESP/=0) JPVEXT=1 !IF(IRESP/=0) JPVEXT=1
JPVEXT = 1
! !
ALLOCATE(NIMAX_ll,NJMAX_ll,NKMAX) ALLOCATE(NIMAX_ll,NJMAX_ll,NKMAX)
CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'IMAX',NIMAX_ll) CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'IMAX',NIMAX_ll)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment