diff --git a/MY_RUN/KTEST/001_2Drelief/001_prep_ideal_case/PRE_IDEA1.nam b/MY_RUN/KTEST/001_2Drelief/001_prep_ideal_case/PRE_IDEA1.nam index 3d775bc8744f42792b4c6f29a48d9a9aefa12e16..07695c089fa208d2d0dd00c703388374ebd1c379 100644 --- a/MY_RUN/KTEST/001_2Drelief/001_prep_ideal_case/PRE_IDEA1.nam +++ b/MY_RUN/KTEST/001_2Drelief/001_prep_ideal_case/PRE_IDEA1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_DIMn_PRE NIMAX=256, NJMAX=1 / &NAM_VER_GRID NKMAX=48 ZDZGRD=40., ZDZTOP=500., ZZMAX_STRGRD=5000. , ZSTRGRD=10. , ZSTRTOP= 10. / diff --git a/MY_RUN/KTEST/001_2Drelief/002_mesonh/EXSEG1.nam b/MY_RUN/KTEST/001_2Drelief/002_mesonh/EXSEG1.nam index 9dd65406c44920806e140fb9addec0143bf1a41b..c516f48eccdc49f4bf78f12fa29d130ade86b784 100644 --- a/MY_RUN/KTEST/001_2Drelief/002_mesonh/EXSEG1.nam +++ b/MY_RUN/KTEST/001_2Drelief/002_mesonh/EXSEG1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_LUNITn CINIFILE = "HYD2D" / &NAM_CONFn LUSERV = T / &NAM_DYNn XTSTEP = 30.0, LITRADJ = T, diff --git a/MY_RUN/KTEST/002_3Drelief/001_prep_ideal_case/PRE_IDEA1.nam b/MY_RUN/KTEST/002_3Drelief/001_prep_ideal_case/PRE_IDEA1.nam index 61d43c37866dc997db9cc46784891516372f0c43..d4561ae611ea10e4859dc5eb0234718d2558ce83 100644 --- a/MY_RUN/KTEST/002_3Drelief/001_prep_ideal_case/PRE_IDEA1.nam +++ b/MY_RUN/KTEST/002_3Drelief/001_prep_ideal_case/PRE_IDEA1.nam @@ -1,5 +1,6 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ - ! NZ_VERB = 5 , NZ_PROC = 0 , NB_PROCIO_W = 8 + ! NZ_VERB = 5 , NZ_PROC = 0 , NB_PROCIO_W = 8 / &NAM_DIMn_PRE NIMAX=30 NJMAX=30 / &NAM_CONF_PRE LCARTESIAN=.TRUE. diff --git a/MY_RUN/KTEST/002_3Drelief/002_mesonh/EXSEG1.nam b/MY_RUN/KTEST/002_3Drelief/002_mesonh/EXSEG1.nam index 4be0a88136c96abae97bd212b7d13cf02747ae5b..3b96bfd6b5319a1d0b3636373387c44b83042ac7 100644 --- a/MY_RUN/KTEST/002_3Drelief/002_mesonh/EXSEG1.nam +++ b/MY_RUN/KTEST/002_3Drelief/002_mesonh/EXSEG1.nam @@ -1,5 +1,6 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ - ! NZ_VERB = 5 , NZ_PROC = 0 , NB_PROCIO_R = 8 , NB_PROCIO_W = 1 + ! NZ_VERB = 5 , NZ_PROC = 0 , NB_PROCIO_R = 8 , NB_PROCIO_W = 8 / &NAM_LUNITn CINIFILE = "RELIEF3D.410" / &NAM_CONFn LUSERV = F / diff --git a/MY_RUN/KTEST/003_KW78/001_prep_ideal_case/PRE_IDEA1.nam b/MY_RUN/KTEST/003_KW78/001_prep_ideal_case/PRE_IDEA1.nam index 0f5af9a7075aa15908b99a9ad886719358924ef6..90ccec6a86a124e5f8fbb2a8119dc6734beed8c8 100644 --- a/MY_RUN/KTEST/003_KW78/001_prep_ideal_case/PRE_IDEA1.nam +++ b/MY_RUN/KTEST/003_KW78/001_prep_ideal_case/PRE_IDEA1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=1 , NB_PROCIO_W=8 / diff --git a/MY_RUN/KTEST/003_KW78/002_mesonh/EXSEG1.nam b/MY_RUN/KTEST/003_KW78/002_mesonh/EXSEG1.nam index 9e5cf92a02f009288f437360033ca6cac44c057f..f687ec0816ffa8f3b50c3ee247d46be8bf0e1263 100644 --- a/MY_RUN/KTEST/003_KW78/002_mesonh/EXSEG1.nam +++ b/MY_RUN/KTEST/003_KW78/002_mesonh/EXSEG1.nam @@ -1,5 +1,6 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ - ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=8 , NB_PROCIO_W=1 + ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=8 , NB_PROCIO_W=8 / &NAM_LUNITn CINIFILE = "KWRAIN.410" / &NAM_CONFn LUSERV=T LUSERC=T LUSERR=T / diff --git a/MY_RUN/KTEST/004_Reunion/001_prep_pgd/PRE_PGD1.nam b/MY_RUN/KTEST/004_Reunion/001_prep_pgd/PRE_PGD1.nam index 0a366f9eb74ae1b33c36b06195789e2ef1d067d4..aa74817f17ac68ed7f4265283f5c47e1cfa9027b 100644 --- a/MY_RUN/KTEST/004_Reunion/001_prep_pgd/PRE_PGD1.nam +++ b/MY_RUN/KTEST/004_Reunion/001_prep_pgd/PRE_PGD1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ ! NZ_VERB=5 , NB_PROCIO_W=8 / diff --git a/MY_RUN/KTEST/004_Reunion/002_prep_ideal_case/PRE_IDEA1.nam b/MY_RUN/KTEST/004_Reunion/002_prep_ideal_case/PRE_IDEA1.nam index f210f05460aefae481d38acc18c5c16d565ee8b8..953029322f5f3a94b9d8e4f5263395e764d15b61 100644 --- a/MY_RUN/KTEST/004_Reunion/002_prep_ideal_case/PRE_IDEA1.nam +++ b/MY_RUN/KTEST/004_Reunion/002_prep_ideal_case/PRE_IDEA1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ ! NZ_VERB=5 , NB_PROCIO_R=8 , NB_PROCIO_W=8 / diff --git a/MY_RUN/KTEST/004_Reunion/003_mesonh/EXSEG1.nam b/MY_RUN/KTEST/004_Reunion/003_mesonh/EXSEG1.nam index f588e40759202d49a658a076f0fa7961f505a9ef..c33aa0db83476b9d26c0c944279e1b4f33746b09 100644 --- a/MY_RUN/KTEST/004_Reunion/003_mesonh/EXSEG1.nam +++ b/MY_RUN/KTEST/004_Reunion/003_mesonh/EXSEG1.nam @@ -1,5 +1,6 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ - ! NZ_VERB=5 , NB_PROCIO_R=8 , NB_PROCIO_W=1 + ! NZ_VERB=5 , NB_PROCIO_R=8 , NB_PROCIO_W=8 / &NAM_LUNITn CINIFILE = "REUNION_IDEA_410", CINIFILEPGD="REUNION_PGD_1km5_410" / diff --git a/MY_RUN/KTEST/007_16janvier/001_pgd1/PRE_PGD1.nam b/MY_RUN/KTEST/007_16janvier/001_pgd1/PRE_PGD1.nam index 52adc7cca0d722ca302b93d581d295eda7e113f6..e13f0056d5702f6aca072c4484d1add56abe6c2b 100644 --- a/MY_RUN/KTEST/007_16janvier/001_pgd1/PRE_PGD1.nam +++ b/MY_RUN/KTEST/007_16janvier/001_pgd1/PRE_PGD1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_PGDFILE CPGDFILE='16JAN98_36km' / &NAM_CONF_PROJ XLAT0=50., XLON0=-2.8, XRPK=0.58, XBETA=0. / &NAM_CONF_PROJ_GRID XLATCEN=48., XLONCEN=-1., diff --git a/MY_RUN/KTEST/007_16janvier/002_pgd2/PRE_PGD1.nam b/MY_RUN/KTEST/007_16janvier/002_pgd2/PRE_PGD1.nam index 25cbeb9f524b6217b36c121918e5e1d4a9f29e33..cb72d1781a467e8aef50cdc6165c45ecbb25adc1 100644 --- a/MY_RUN/KTEST/007_16janvier/002_pgd2/PRE_PGD1.nam +++ b/MY_RUN/KTEST/007_16janvier/002_pgd2/PRE_PGD1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_PGDFILE CPGDFILE='16JAN98_9km' / &NAM_PGD_GRID YINIFILE='16JAN98_36km' YFILETYPE='MESONH' / &NAM_INIFILE_CONF_PROJ IXOR=10, IYOR=10, IXSIZE=10, IYSIZE=10, IDXRATIO=4, IDYRATIO=4 / diff --git a/MY_RUN/KTEST/007_16janvier/003_nest/PRE_NEST_PGD1.nam b/MY_RUN/KTEST/007_16janvier/003_nest/PRE_NEST_PGD1.nam index a9a9dfd19d054411744d271cad782a84d244fbe0..0d51439c178145cd92b5a8b213bbc4e8f5c6d963 100644 --- a/MY_RUN/KTEST/007_16janvier/003_nest/PRE_NEST_PGD1.nam +++ b/MY_RUN/KTEST/007_16janvier/003_nest/PRE_NEST_PGD1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_PGD1 YPGD1 = '16JAN98_36km' / &NAM_PGD2 YPGD2 = '16JAN98_9km', IDAD = 1 / &NAM_NEST_PGD YNEST = 'e1' / diff --git a/MY_RUN/KTEST/007_16janvier/004_arp2lfi/PRE_REAL1.nam b/MY_RUN/KTEST/007_16janvier/004_arp2lfi/PRE_REAL1.nam index c08d6f7c6dc41faaf575a2c0aa8a0e23d9254785..bd6b5b90729373934541b04f93ddeb10edcabbe3 100644 --- a/MY_RUN/KTEST/007_16janvier/004_arp2lfi/PRE_REAL1.nam +++ b/MY_RUN/KTEST/007_16janvier/004_arp2lfi/PRE_REAL1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=1 , NB_PROCIO_W=1 / diff --git a/MY_RUN/KTEST/007_16janvier/005_spa_mod1_mod2/SPAWN1.nam b/MY_RUN/KTEST/007_16janvier/005_spa_mod1_mod2/SPAWN1.nam index 58038602154328ba0c4a5648459fcc2da3a5c767..fe016986138efa70c933c9112b5ddc720012c881 100644 --- a/MY_RUN/KTEST/007_16janvier/005_spa_mod1_mod2/SPAWN1.nam +++ b/MY_RUN/KTEST/007_16janvier/005_spa_mod1_mod2/SPAWN1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_LUNIT2_SPA CINIFILE = "16JAN_06_MNH", CINIFILEPGD="16JAN98_36km.neste1", YDOMAIN = "16JAN98_9km.neste1", diff --git a/MY_RUN/KTEST/007_16janvier/006_preal/PRE_REAL1.nam b/MY_RUN/KTEST/007_16janvier/006_preal/PRE_REAL1.nam index bc49c644681a129ab05eeb64fc9760486f13a6f2..d48201b85bef477dac71341f351a9347cd69269f 100644 --- a/MY_RUN/KTEST/007_16janvier/006_preal/PRE_REAL1.nam +++ b/MY_RUN/KTEST/007_16janvier/006_preal/PRE_REAL1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_FILE_NAMES HATMFILE ='16JAN_06_MNH.spa04' , HATMFILETYPE='MESONH', HPGDFILE ='16JAN98_9km.neste1' , CINIFILE='16JAN_06_MNH2' / &NAM_REAL_CONF NVERB=5 / diff --git a/MY_RUN/KTEST/007_16janvier/008_run2/EXSEG1.nam.src b/MY_RUN/KTEST/007_16janvier/008_run2/EXSEG1.nam.src index 4494e9b09fce759dee8788718aff46dc2f2bcdce..04a583eb4892a3971e2f724122c13bd7f07ef71b 100644 --- a/MY_RUN/KTEST/007_16janvier/008_run2/EXSEG1.nam.src +++ b/MY_RUN/KTEST/007_16janvier/008_run2/EXSEG1.nam.src @@ -1,5 +1,5 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ - NZ_VERB=5 ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=1 , NB_PROCIO_W=8 / &NAM_LUNITn CINIFILE = "16JAN_06_MNH",CINIFILEPGD="16JAN98_36km.neste1" / diff --git a/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam1 b/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam1 index 2bc3cb12cada2d3216bd6f3dc10b957cd6e06550..c9b6e568df0dd12d6a9bacf940b1dbda1eb82444 100644 --- a/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam1 +++ b/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam1 @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=8 , NB_PROCIO_W=1 / diff --git a/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam2 b/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam2 index c1a078ce8886a08ec5c82027517e1815f5b06b04..982826290316852996964a0815edcafbebf0ec78 100644 --- a/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam2 +++ b/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam2 @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_CONFZ ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=8 , NB_PROCIO_W=1 / diff --git a/MY_RUN/KTEST/007_16janvier/009_diag/run_diag_xyz b/MY_RUN/KTEST/007_16janvier/009_diag/run_diag_xyz index 124f24423a70777a283d7cfcc77212e6b1501ad6..53e94f7769e24d282382fd3ea8e4feb350fb77d8 100755 --- a/MY_RUN/KTEST/007_16janvier/009_diag/run_diag_xyz +++ b/MY_RUN/KTEST/007_16janvier/009_diag/run_diag_xyz @@ -15,6 +15,7 @@ ln -sf ../003_nest/16JAN98_36km.neste1.* . cp DIAG1.nam1 DIAG1.nam time ${MPIRUN} DIAG${XYZ} +#exit # # 2nd modele # diff --git a/MY_RUN/KTEST/007_16janvier/012_spectre/SPEC1.nam b/MY_RUN/KTEST/007_16janvier/012_spectre/SPEC1.nam index d0a1a5cc3c388177c423c288ddbcf11c3c572b36..2aa695f4d6fde5ac0356ddd547d3d71bff06b3ad 100644 --- a/MY_RUN/KTEST/007_16janvier/012_spectre/SPEC1.nam +++ b/MY_RUN/KTEST/007_16janvier/012_spectre/SPEC1.nam @@ -1,3 +1,4 @@ +&NAM_CONFIO LCDF4=T, LLFIOUT=T, LLFIREAD=F / &NAM_SPECTRE LSPECTRE_U=.TRUE., LSPECTRE_V=.TRUE., diff --git a/MY_RUN/KTEST/007_16janvier/012_spectre/run_spectre_xyz b/MY_RUN/KTEST/007_16janvier/012_spectre/run_spectre_xyz index 6c7e0d07865a078cf0feb85a96915b4de9ca5bcd..f8f4bccf09eba6de325e35de8d5193eb235726cc 100755 --- a/MY_RUN/KTEST/007_16janvier/012_spectre/run_spectre_xyz +++ b/MY_RUN/KTEST/007_16janvier/012_spectre/run_spectre_xyz @@ -4,8 +4,7 @@ #MNH_LIC for details. version 1. set -x set -e -ln -s ../008_run2/16JAN.1.12B18.001.lfi . -ln -s ../008_run2/16JAN.1.12B18.001.des . +ln -fs ../008_run2/16JAN.1.12B18.001.??? . time ${MPIRUN} SPECTRE${XYZ} diff --git a/src/LIB/SURCOUCHE/src/extern_userio.f90 b/src/LIB/SURCOUCHE/src/extern_userio.f90 index e209ed95e9c98da57ff9ce04e0fa537375781661..96d7acf4159eec7d8ef3f53f5c639351681b2ed0 100644 --- a/src/LIB/SURCOUCHE/src/extern_userio.f90 +++ b/src/LIB/SURCOUCHE/src/extern_userio.f90 @@ -657,6 +657,24 @@ INTEGER, INTENT(OUT)::KRESP ! return-code CALL E_FMWRITC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,KLENCH,HCOMMENT,KRESP) END SUBROUTINE FMWRITC0_ll + +SUBROUTINE FMWRITC1_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODE_FMWRIT, ONLY : E_FMWRITC1_ll=>FMWRITC1_ll +IMPLICIT NONE +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form +CHARACTER(LEN=*),DIMENSION(:), INTENT(IN) ::HFIELD ! array containing the data field +INTEGER, INTENT(IN)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(IN)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(IN)::HCOMMENT ! comment string +INTEGER, INTENT(OUT)::KRESP ! return-code + +CALL E_FMWRITC1_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,KLENCH,HCOMMENT,KRESP) + +END SUBROUTINE FMWRITC1_ll SUBROUTINE FMWRITT0_ll(HFILEM,HRECFM,HFIPRI,HDIR,TFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) diff --git a/src/LIB/SURCOUCHE/src/fmread_ll.f90 b/src/LIB/SURCOUCHE/src/fmread_ll.f90 index c709c5a293bdd00a3cdff854010756e133d9ea59..694e1012d6886c11a02034102a8c6cc07f1e6db6 100644 --- a/src/LIB/SURCOUCHE/src/fmread_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmread_ll.f90 @@ -25,6 +25,9 @@ MODULE MODE_FMREAD ! lue non trouvé !!! ! USE MODD_MPIF +#if defined(MNH_IOCDF4) +USE MODE_NETCDF +#endif IMPLICIT NONE PRIVATE @@ -122,11 +125,19 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' TZFD=>GETFD(YFNLFI) IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC) THEN ! sequential execution - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + END IF IF (IRESP /= 0) GOTO 1000 ELSE ! multiprocessor execution IF (ISP == TZFD%OWNER) THEN - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + END IF END IF ! CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) @@ -197,13 +208,21 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' TZFD=>GETFD(YFNLFI) IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC) THEN ! sequential execution - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF IF (IRESP /= 0) GOTO 1000 ELSE ! multiprocessor execution IF (ISP == TZFD%OWNER) THEN CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF ELSE ALLOCATE(ZFIELDP(0)) GALLOC = .TRUE. @@ -303,15 +322,27 @@ IF (ASSOCIATED(TZFD)) THEN ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==3 .AND. SIZE(PFIELD,2)==3) THEN ZFIELDP=>PFIELD(2:2,2:2) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF PFIELD(:,:)=SPREAD(SPREAD(PFIELD(2,2),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3) ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN ZFIELDP=>PFIELD(:,2:2) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF PFIELD(:,:)=SPREAD(PFIELD(:,2),DIM=2,NCOPIES=3) ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF END IF IF (IRESP /= 0) GOTO 1000 ELSE ! multiprocessor execution @@ -319,8 +350,12 @@ IF (ASSOCIATED(TZFD)) THEN IF (ISP == TZFD%OWNER) THEN ! I/O processor case CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + END IF ELSE ALLOCATE(ZFIELDP(0,0)) GALLOC = .TRUE. @@ -328,7 +363,7 @@ IF (ASSOCIATED(TZFD)) THEN CALL SECOND_MNH2(T1) TIMEZ%T_READ2D_READ=TIMEZ%T_READ2D_READ + T1 - T0 ! - !JUAN BGQ CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) IF (IRESP /= 0) GOTO 1000 ! CALL BCAST_HEADER(TZFD,TZFMH) @@ -477,24 +512,40 @@ IF (ASSOCIATED(TZFD)) THEN ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==3 .AND. SIZE(PFIELD,2)==3) THEN ZFIELDP=>PFIELD(2:2,2:2,:) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF PFIELD(:,:,:)=SPREAD(SPREAD(PFIELD(2,2,:),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3) ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN ALLOCATE (ZFIELDP(SIZE(PFIELD,1),1,SIZE(PFIELD,3))) GALLOC = .TRUE. - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF PFIELD(:,:,:)=SPREAD(ZFIELDP(:,1,:),DIM=2,NCOPIES=3) ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF END IF IF (IRESP /= 0) GOTO 1000 ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( HDIR == '--' ) ) THEN ! multiprocessor execution & 1 IO proc ! read 3D field for graphique IF (ISP == TZFD%OWNER) THEN CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + END IF ELSE ALLOCATE(ZFIELDP(0,0,0)) GALLOC = .TRUE. @@ -553,9 +604,12 @@ IF (ASSOCIATED(TZFD)) THEN CALL SECOND_MNH2(T0) WRITE(YK,'(I4.4)') JKK YRECZSLIDE = TRIM(HRECFM)//YK - CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& - & ,IRESP) - + IF (ASSOCIATED(TZFD_IOZ%CDF)) THEN + CALL NCREAD(TZFD_IOZ%CDF%NCID,YRECZSLIDE,ZSLIDE_ll,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& + & ,IRESP) + END IF CALL SECOND_MNH2(T1) TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0 ! @@ -607,8 +661,12 @@ IF (ASSOCIATED(TZFD)) THEN CALL SECOND_MNH2(T0) WRITE(YK,'(I4.4)') JKK YRECZSLIDE = TRIM(HRECFM)//YK - CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& + IF (ASSOCIATED(TZFD_IOZ%CDF)) THEN + CALL NCREAD(TZFD_IOZ%CDF%NCID,YRECZSLIDE,ZSLIDE_ll,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& & ,IRESP) + END IF !JUANIOZ CALL SECOND_MNH2(T1) TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0 @@ -763,22 +821,38 @@ IF (ASSOCIATED(TZFD)) THEN ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==3 .AND. SIZE(PFIELD,2)==3) THEN ZFIELDP=>PFIELD(2:2,2:2,:,:) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF PFIELD(:,:,:,:)=SPREAD(SPREAD(PFIELD(2,2,:,:),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3) ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN ZFIELDP=>PFIELD(:,2:2,:,:) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF PFIELD(:,:,:,:)=SPREAD(PFIELD(:,2,:,:),DIM=2,NCOPIES=3) ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF END IF IF (IRESP /= 0) GOTO 1000 ELSE IF (ISP == TZFD%OWNER) THEN CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + END IF ELSE ALLOCATE(ZFIELDP(0,0,0,0)) GALLOC = .TRUE. @@ -866,22 +940,38 @@ IF (ASSOCIATED(TZFD)) THEN ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==3 .AND. SIZE(PFIELD,2)==3) THEN ZFIELDP=>PFIELD(2:2,2:2,:,:,:) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF PFIELD(:,:,:,:,:)=SPREAD(SPREAD(PFIELD(2,2,:,:,:),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3) ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN ZFIELDP=>PFIELD(:,2:2,:,:,:) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF PFIELD(:,:,:,:,:)=SPREAD(PFIELD(:,2,:,:,:),DIM=2,NCOPIES=3) ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF END IF IF (IRESP /= 0) GOTO 1000 ELSE ! multiprocessor execution IF (ISP == TZFD%OWNER) THEN CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + END IF ELSE ALLOCATE(ZFIELDP(0,0,0,0,0)) GALLOC = .TRUE. @@ -966,13 +1056,21 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' TZFD=>GETFD(YFNLFI) IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC) THEN ! sequential execution - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF IF (IRESP /= 0) GOTO 1000 ELSE ! multiprocessor execution IF (ISP == TZFD%OWNER) THEN CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + END IF ELSE ALLOCATE(ZFIELDP(0,0,0,0,0,0)) GALLOC = .TRUE. @@ -1052,11 +1150,19 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' TZFD=>GETFD(YFNLFI) IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC) THEN ! sequential execution - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + END IF IF (IRESP /= 0) GOTO 1000 ELSE IF (ISP == TZFD%OWNER) THEN - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + END IF END IF ! CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) @@ -1126,13 +1232,21 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' TZFD=>GETFD(YFNLFI) IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC) THEN ! sequential execution - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + END IF IF (IRESP /= 0) GOTO 1000 ELSE IF (ISP == TZFD%OWNER) THEN CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& & ,IRESP) + END IF ELSE ALLOCATE(IFIELDP(0)) GALLOC = .TRUE. @@ -1210,22 +1324,38 @@ IF (ASSOCIATED(TZFD)) THEN ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==3 .AND. SIZE(KFIELD,2)==3) THEN IFIELDP=>KFIELD(2:2,2:2) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + END IF KFIELD(:,:)=SPREAD(SPREAD(KFIELD(2,2),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3) ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN ELSE IF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==3) THEN IFIELDP=>KFIELD(:,2:2) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + END IF KFIELD(:,:)=SPREAD(KFIELD(:,2),DIM=2,NCOPIES=3) ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + END IF END IF IF (IRESP /= 0) GOTO 1000 ELSE IF (ISP == TZFD%OWNER) THEN CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP& + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP& & ,TZFMH,IRESP) + END IF ELSE ALLOCATE(IFIELDP(0,0)) GALLOC = .TRUE. @@ -1316,11 +1446,19 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' TZFD=>GETFD(YFNLFI) IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC) THEN ! sequential execution - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + END IF IF (IRESP /= 0) GOTO 1000 ELSE IF (ISP == TZFD%OWNER) THEN - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + END IF END IF ! CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) @@ -1395,13 +1533,21 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' TZFD=>GETFD(YFNLFI) IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC) THEN ! sequential execution - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH& + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH& & ,IRESP) + END IF IF (IRESP /= 0) GOTO 1000 ELSE IF (ISP == TZFD%OWNER) THEN - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH& + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH& & ,IRESP) + END IF END IF ! CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) @@ -1436,7 +1582,7 @@ END SUBROUTINE FMREADL1_ll SUBROUTINE FMREADC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIREAD USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL ! @@ -1463,7 +1609,8 @@ INTEGER :: IERR TYPE(FD_ll), POINTER :: TZFD INTEGER :: IRESP INTEGER :: JLOOP -INTEGER, DIMENSION(:), ALLOCATABLE:: IFIELD +INTEGER, DIMENSION(LEN(HFIELD)) :: IFIELD +CHARACTER(LEN(HFIELD)) :: YFIELD INTEGER :: ILENG TYPE(FMHEADER) :: TZFMH @@ -1473,16 +1620,23 @@ TYPE(FMHEADER) :: TZFMH IRESP = 0 YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' ILENG=LEN(HFIELD) -ALLOCATE(IFIELD(ILENG)) ! TZFD=>GETFD(YFNLFI) IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC) THEN ! sequential execution - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,YFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + END IF IF (IRESP /= 0) GOTO 1000 ELSE ! parallel execution IF (ISP == TZFD%OWNER) THEN - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,YFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + END IF END IF ! CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) @@ -1490,13 +1644,26 @@ IF (ASSOCIATED(TZFD)) THEN ! CALL BCAST_HEADER(TZFD,TZFMH) ! - CALL MPI_BCAST(IFIELD,ILENG,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,& - & IERR) + IF (LIOCDF4 .AND. .NOT. LLFIREAD) THEN + ! NetCDF + CALL MPI_BCAST(YFIELD,ILENG,MPI_CHARACTER,TZFD%OWNER-1,TZFD%COMM,& + &IERR) + ELSE + ! LFI + CALL MPI_BCAST(IFIELD,ILENG,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,& + & IERR) + END IF END IF ! parallel execution ! - DO JLOOP=1,ILENG - HFIELD(JLOOP:JLOOP)=ACHAR(IFIELD(JLOOP)) - END DO + IF (LIOCDF4 .AND. .NOT. LLFIREAD) THEN + ! NetCDF + HFIELD = YFIELD + ELSE + ! LFI Case + DO JLOOP=1,ILENG + HFIELD(JLOOP:JLOOP)=ACHAR(IFIELD(JLOOP)) + END DO + END IF KGRID = TZFMH%GRID KLENCH = TZFMH%COMLEN HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) @@ -1509,7 +1676,6 @@ END IF IF (IRESP.NE.0) THEN CALL FM_READ_ERR("FMREADC0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) ENDIF -IF (ALLOCATED(IFIELD)) DEALLOCATE(IFIELD) KRESP = IRESP RETURN @@ -1561,17 +1727,28 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' TZFD=>GETFD(YFNLFI) IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC) THEN ! sequential execution - CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& - & ,TZFMH,IRESP) - CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME& - & ,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TDATE',ITDATE,TZFMH,IRESP) + CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TIME',ZTIME,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& + & ,TZFMH,IRESP) + CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME& + & ,TZFMH,IRESP) + END IF IF (IRESP /= 0) GOTO 1000 ELSE IF (ISP == TZFD%OWNER) THEN - CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& - & ,TZFMH,IRESP) - CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME& - & ,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TDATE',ITDATE,TZFMH,IRESP) + CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TIME',ZTIME,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& + & ,TZFMH,IRESP) + CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME& + & ,TZFMH,IRESP) + + END IF END IF ! CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) @@ -1667,18 +1844,30 @@ IF (ASSOCIATED(TZFD)) THEN Z3D = 0.0 IF (LPACK .AND. L2D) THEN TX3DP=>Z3D(:,2:2,:) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,TX3DP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + END IF Z3D(:,:,:) = SPREAD(Z3D(:,2,:),DIM=2,NCOPIES=3) ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + END IF END IF PLB(1:KRIM+1,:,:) = Z3D(1:KRIM+1,:,:) PLB(KRIM+2:2*(KRIM+1),:,:) = Z3D(KL3D-KRIM:KL3D,:,:) ELSE !(HLBTYPE == 'LBY' .OR. HLBTYPE == 'LBYV') ALLOCATE(Z3D(SIZE(PLB,1),KL3D,SIZE(PLB,3))) Z3D = 0.0 - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) - PLB(:,1:KRIM+1,:) = Z3D(:,1:KRIM+1,:) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + END IF + PLB(:,1:KRIM+1,:) = Z3D(:,1:KRIM+1,:) PLB(:,KRIM+2:2*(KRIM+1),:) = Z3D(:,KL3D-KRIM:KL3D,:) END IF IF (IRESP /= 0) GOTO 1000 @@ -1691,17 +1880,29 @@ IF (ASSOCIATED(TZFD)) THEN Z3D = 0.0 IF (LPACK .AND. L2D) THEN TX3DP=>Z3D(:,2:2,:) - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,TX3DP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + END IF Z3D(:,:,:) = SPREAD(Z3D(:,2,:),DIM=2,NCOPIES=3) ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + END IF END IF ! erase gap in LB field Z3D(KRIM+2:2*(KRIM+1),:,:) = Z3D(KL3D-KRIM:KL3D,:,:) ELSE !(HLBTYPE == 'LBY' .OR. HLBTYPE == 'LBYV') ALLOCATE(Z3D(IIMAX_ll+2*JPHEXT,KL3D,SIZE(PLB,3))) Z3D = 0.0 - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + END IF ! erase gap in LB field Z3D(:,KRIM+2:2*(KRIM+1),:) = Z3D(:,KL3D-KRIM:KL3D,:) END IF diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index cd37f28c0ed990168f864a79f8008ff8295dbced..89ae95aa086ebad9d1adae76e496204f3237d6ba 100644 --- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 @@ -158,9 +158,13 @@ MODULE MODE_GA END MODULE MODE_GA #endif + MODULE MODE_FMWRIT USE MODD_MPIF +#if defined(MNH_IOCDF4) + USE MODE_NETCDF +#endif IMPLICIT NONE @@ -170,7 +174,8 @@ MODULE MODE_FMWRIT MODULE PROCEDURE FMWRITX0_ll,FMWRITX1_ll,FMWRITX2_ll,FMWRITX3_ll,& & FMWRITX4_ll,FMWRITX5_ll,FMWRITX6_ll,& & FMWRITN0_ll,FMWRITN1_ll,FMWRITN2_ll,& - & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,FMWRITT0_ll + & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,& + & FMWRITC1_ll,FMWRITT0_ll END INTERFACE INTERFACE FMWRITBOX @@ -180,7 +185,7 @@ MODULE MODE_FMWRIT PUBLIC FMWRIT_LB,FMWRITBOX,FMWRIT,FMWRITX0_ll,FMWRITX1_ll,FMWRITX2_ll,FMWRITX3_ll,& & FMWRITX4_ll,FMWRITX5_ll,FMWRITX6_ll,FMWRITN0_ll,FMWRITN1_ll,FMWRITN2_ll,& - & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,FMWRITT0_ll,FMWRITBOXX2_ll,& + & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,FMWRITC1_ll,FMWRITT0_ll,FMWRITBOXX2_ll,& & FMWRITBOXX3_ll,FMWRITBOXX4_ll,FMWRITBOXX5_ll,FMWRITBOXX6_ll !INCLUDE 'mpif.h' @@ -222,7 +227,7 @@ CONTAINS ! J.Escobar 15/04/2014 : add write to all Z files for all FMWRITX0_ll variables ! J.Escobar 23/06/2014 : bug , replace .FALSE. to .TRUE. = OREAL type transmetted to FM_WRIT_ll ! - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL #ifdef MNH_NCWRIT @@ -295,7 +300,8 @@ CONTAINS END IF END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) #endif ELSE IF (ISP == TZFD%OWNER) THEN @@ -323,7 +329,8 @@ CONTAINS END IF END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) #endif END IF ! @@ -345,7 +352,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) #endif END IF END DO @@ -362,7 +370,7 @@ CONTAINS SUBROUTINE FMWRITX1_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_ALLOCBUFFER_ll @@ -437,7 +445,8 @@ CONTAINS END IF END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) #endif ELSE IF (ISP == TZFD%OWNER) THEN @@ -470,8 +479,9 @@ CONTAINS END IF END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif END IF ! @@ -490,7 +500,7 @@ CONTAINS SUBROUTINE FMWRITX2_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_ALLOCBUFFER_ll @@ -584,7 +594,8 @@ CONTAINS & KLENCH,HCOMMENT) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN @@ -611,7 +622,8 @@ CONTAINS END IF NCWR = .TRUE. #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif ELSE #ifdef MNH_NCWRIT @@ -637,7 +649,8 @@ CONTAINS NCWR = .TRUE. ! END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) #endif END IF ELSE ! multiprocessor execution @@ -724,8 +737,9 @@ CONTAINS END IF NCWR=.TRUE. #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif END IF #ifdef MNH_GA @@ -758,7 +772,7 @@ CONTAINS SUBROUTINE FMWRITX3_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_ALLOCBUFFER_ll @@ -889,7 +903,8 @@ CONTAINS & KLENCH,HCOMMENT) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN @@ -908,7 +923,8 @@ CONTAINS & KLENCH,HCOMMENT) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif ELSE #ifdef MNH_NCWRIT @@ -924,7 +940,8 @@ CONTAINS & KLENCH,HCOMMENT) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) #endif END IF ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( HDIR == '--' ) ) THEN ! multiprocessor execution & 1 proc IO @@ -968,8 +985,9 @@ CONTAINS & KLENCH,HCOMMENT) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif END IF ! @@ -980,6 +998,7 @@ CONTAINS ! !JUAN BG Z SLIDE ! + ! #ifdef MNH_GA ! ! init/create the ga @@ -1035,8 +1054,9 @@ CONTAINS CALL SECOND_MNH2(T1) TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0 ! - CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& - & ,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),& + &ZSLIDE_ll,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,YRECZSLIDE,HDIR,ZSLIDE_ll,TZFMH,IRESP) CALL SECOND_MNH2(T2) TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 END IF @@ -1159,8 +1179,9 @@ CONTAINS TZFMH%COMMENT=HCOMMENT WRITE(YK,'(I4.4)') JKK YRECZSLIDE = TRIM(HRECFM)//YK - CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,YRECZSLIDE,HDIR,ZSLIDE_ll,TZFMH,IRESP) CALL SECOND_MNH2(T2) TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 END IF @@ -1185,7 +1206,6 @@ CONTAINS !JUAN BG Z SLIDE ! end of MNH_GA #endif - END IF ! multiprocessor execution ELSE IRESP = -61 @@ -1205,7 +1225,7 @@ CONTAINS SUBROUTINE FMWRITX4_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_ALLOCBUFFER_ll @@ -1261,7 +1281,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN @@ -1271,7 +1292,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif ELSE #ifdef MNH_NCWRIT @@ -1279,7 +1301,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) #endif END IF ELSE @@ -1309,7 +1332,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif END IF ! @@ -1328,7 +1352,7 @@ CONTAINS SUBROUTINE FMWRITX5_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_ALLOCBUFFER_ll @@ -1395,7 +1419,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN @@ -1415,7 +1440,8 @@ CONTAINS & KLENCH,HCOMMENT) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif ELSE #ifdef MNH_NCWRIT @@ -1432,7 +1458,8 @@ CONTAINS & KLENCH,HCOMMENT) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) #endif END IF ELSE @@ -1473,8 +1500,9 @@ CONTAINS & KLENCH,HCOMMENT) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif END IF ! @@ -1493,7 +1521,7 @@ CONTAINS SUBROUTINE FMWRITX6_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_ALLOCBUFFER_ll @@ -1546,7 +1574,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) #endif ELSE ! multiprocessor execution IF (ISP == TZFD%OWNER) THEN @@ -1572,8 +1601,9 @@ CONTAINS & ,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) #endif END IF ! @@ -1592,7 +1622,7 @@ CONTAINS SUBROUTINE FMWRITN0_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL !* 0. DECLARATIONS @@ -1650,7 +1680,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) #endif ELSE IF (ISP == TZFD%OWNER) THEN @@ -1662,7 +1693,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) #endif END IF ! @@ -1685,7 +1717,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) #endif END IF END DO @@ -1703,7 +1736,7 @@ CONTAINS SUBROUTINE FMWRITN1_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_ALLOCBUFFER_ll @@ -1772,7 +1805,8 @@ CONTAINS & .TRUE.,TZRECLIST,KLENCH,HCOMMENT) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) #endif ELSE IF (ISP == TZFD%OWNER) THEN @@ -1801,8 +1835,9 @@ CONTAINS & KLENCH,HCOMMENT) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) #endif END IF ! @@ -1822,7 +1857,7 @@ CONTAINS SUBROUTINE FMWRITN2_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_ALLOCBUFFER_ll @@ -1880,7 +1915,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) #endif ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==3) THEN @@ -1890,7 +1926,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) #endif ELSE #ifdef MNH_NCWRIT @@ -1898,7 +1935,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) #endif END IF ELSE @@ -1929,8 +1967,9 @@ CONTAINS & ,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) #endif END IF ! @@ -1951,7 +1990,7 @@ CONTAINS SUBROUTINE FMWRITL0_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL @@ -2012,7 +2051,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) #endif ELSE IF (ISP == TZFD%OWNER) THEN @@ -2024,7 +2064,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) #endif END IF CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) @@ -2042,7 +2083,7 @@ CONTAINS SUBROUTINE FMWRITL1_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL @@ -2101,7 +2142,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) #endif ELSE IF (ISP == TZFD%OWNER) THEN @@ -2113,7 +2155,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) #endif END IF ! @@ -2132,7 +2175,7 @@ CONTAINS SUBROUTINE FMWRITC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL ! @@ -2207,7 +2250,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP) #endif ELSE IF (ISP == TZFD%OWNER) THEN @@ -2219,7 +2263,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP) #endif END IF ! @@ -2237,9 +2282,98 @@ CONTAINS KRESP = IRESP END SUBROUTINE FMWRITC0_ll + SUBROUTINE FMWRITC1_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + ! + !* 0. DECLARATIONS + ! ------------ + ! + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) ::HFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + INTEGER :: J,JJ + INTEGER :: ILE, IP + INTEGER,DIMENSION(:),ALLOCATABLE :: IFIELD + INTEGER :: ILENG + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + TYPE(FMHEADER) :: TZFMH + !---------------------------------------------------------------- + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article C1 ' , HRECFM + ILE=LEN(HFIELD) + IP=SIZE(HFIELD) + ILENG=ILE*IP + ! + IF (ILENG==0) THEN + IP=1 + ILE=1 + ILENG=1 + ALLOCATE(IFIELD(1)) + IFIELD(1)=IACHAR(' ') + ELSE + ALLOCATE(IFIELD(ILENG)) + DO JJ=1,IP + DO J=1,ILE + IFIELD(ILE*(JJ-1)+J)=IACHAR(HFIELD(JJ)(J:J)) + END DO + END DO + END IF + !---------------------------------------------------------------- + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP) + ELSE + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP) + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + ELSE + IRESP = -61 + END IF + !---------------------------------------------------------------- + IF (IRESP.NE.0) THEN + CALL FM_WRIT_ERR("FMWRITC1_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& + & ,IRESP) + END IF + IF (ALLOCATED(IFIELD)) DEALLOCATE(IFIELD) + KRESP = IRESP + END SUBROUTINE FMWRITC1_ll + SUBROUTINE FMWRITT0_ll(HFILEM,HRECFM,HFIPRI,HDIR,TFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_TYPE_DATE USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL @@ -2293,8 +2427,9 @@ CONTAINS & ,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& & ,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TDATE',HDIR,ITDATE,TZFMH,IRESP) #endif TZFMH%COMMENT='SECONDS' TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT) @@ -2304,8 +2439,9 @@ CONTAINS & ,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& & ,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TIME',HDIR,TFIELD%TIME,TZFMH,IRESP) #endif ELSE IF (ISP == TZFD%OWNER) THEN @@ -2318,8 +2454,9 @@ CONTAINS & ,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& & ,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TDATE',HDIR,ITDATE,TZFMH,IRESP) #endif TZFMH%COMMENT='SECONDS' TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT) @@ -2329,8 +2466,10 @@ CONTAINS & ,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& + + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& & ,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TIME',HDIR,TFIELD%TIME,TZFMH,IRESP) #endif END IF ! @@ -2349,7 +2488,7 @@ CONTAINS SUBROUTINE FMWRIT_LB(HFILEM,HRECFM,HFIPRI,HLBTYPE,PLB,KRIM,KL3D,& & KGRID,KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,ISNPROC,GSMONOPROC,LPACK,L2D + USE MODD_IO_ll, ONLY : ISP,ISNPROC,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L2D USE MODD_PARAMETERS_ll,ONLY : JPHEXT USE MODD_FM USE MODE_DISTRIB_LB @@ -2420,7 +2559,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',TX3DP,TZFMH,IRESP) #endif ELSE #ifdef MNH_NCWRIT @@ -2428,7 +2568,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PLB),PLB,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PLB),PLB,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PLB),PLB,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',PLB,TZFMH,IRESP) #endif END IF ELSE @@ -2465,7 +2606,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',TX3DP,TZFMH,IRESP) #endif ELSE NB_REQ=0 @@ -2507,7 +2649,7 @@ CONTAINS SUBROUTINE FMWRITBOXX2_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_GATHER_ll @@ -2571,7 +2713,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) #endif ELSE ! multiprocessor execution IF (ISP == TZFD%OWNER) THEN @@ -2596,8 +2739,9 @@ CONTAINS & ,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) #endif END IF ! @@ -2617,7 +2761,7 @@ CONTAINS SUBROUTINE FMWRITBOXX3_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_GATHER_ll @@ -2681,7 +2825,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) #endif ELSE ! multiprocessor execution IF (ISP == TZFD%OWNER) THEN @@ -2706,8 +2851,9 @@ CONTAINS & ,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) #endif END IF ! @@ -2727,7 +2873,7 @@ CONTAINS SUBROUTINE FMWRITBOXX4_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_GATHER_ll @@ -2791,7 +2937,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) #endif ELSE ! multiprocessor execution IF (ISP == TZFD%OWNER) THEN @@ -2816,8 +2963,9 @@ CONTAINS & ,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) #endif END IF ! @@ -2837,7 +2985,7 @@ CONTAINS SUBROUTINE FMWRITBOXX5_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_GATHER_ll @@ -2901,7 +3049,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) #endif ELSE ! multiprocessor execution IF (ISP == TZFD%OWNER) THEN @@ -2927,8 +3076,9 @@ CONTAINS & ,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) #endif END IF ! @@ -2948,7 +3098,7 @@ CONTAINS SUBROUTINE FMWRITBOXX6_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_GATHER_ll @@ -3012,7 +3162,8 @@ CONTAINS CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) #endif ELSE ! multiprocessor execution IF (ISP == TZFD%OWNER) THEN @@ -3038,8 +3189,9 @@ CONTAINS & ,IRESP) END IF #else - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) #endif END IF ! diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90 index f88dac6bc0b1b58ad9d3e19fabbe6df855d97d30..d58eeb88c83de738cffc35358da1ff3fa10bec88 100644 --- a/src/LIB/SURCOUCHE/src/modd_io.f90 +++ b/src/LIB/SURCOUCHE/src/modd_io.f90 @@ -31,4 +31,8 @@ LOGICAL, SAVE :: L1D = .FALSE. ! TRUE if 1D model version LOGICAL, SAVE :: L2D = .FALSE. ! TRUE if 2D model version LOGICAL, SAVE :: LPACK = .FALSE. ! TRUE if FM compression occurs in 1D or 2D model version +LOGICAL, SAVE :: LIOCDF4 = .FALSE. ! TRUE will enable full NetCDF4 (HDF5) I/O support +LOGICAL, SAVE :: LLFIOUT = .FALSE. ! TRUE will also force LFI output when LIOCDF4 is on (debug only) +LOGICAL, SAVE :: LLFIREAD = .FALSE. ! TRUE will force LFI read (instead of NetCDF) when LIOCDF4 is on (debug only) +LOGICAL, SAVE :: LDEFLATEX2 = .FALSE. ! TRUE to enable Zlib deflate compression on X2 fields END MODULE MODD_IO_ll diff --git a/src/LIB/SURCOUCHE/src/modd_netcdf.f90 b/src/LIB/SURCOUCHE/src/modd_netcdf.f90 new file mode 100644 index 0000000000000000000000000000000000000000..64658b353f9f91b8c32d0d8f29b6c8c0be72ba22 --- /dev/null +++ b/src/LIB/SURCOUCHE/src/modd_netcdf.f90 @@ -0,0 +1,20 @@ +MODULE MODD_NETCDF +IMPLICIT NONE + +TYPE IOCDF + INTEGER :: NCID + TYPE(DIMCDF), POINTER :: DIMX + TYPE(DIMCDF), POINTER :: DIMY + TYPE(DIMCDF), POINTER :: DIMZ + TYPE(DIMCDF), POINTER :: DIMSTR + TYPE(DIMCDF), POINTER :: DIMLIST +END TYPE IOCDF + +TYPE DIMCDF + CHARACTER(LEN=8) :: NAME + INTEGER :: LEN + INTEGER :: ID + TYPE(DIMCDF), POINTER :: NEXT +END TYPE DIMCDF + +END MODULE MODD_NETCDF diff --git a/src/LIB/SURCOUCHE/src/mode_fd.f90 b/src/LIB/SURCOUCHE/src/mode_fd.f90 index bab16bca363ac88e26071819d0ed3bd99d627bf3..4233dc991073d4d1305ba52c5505e003fc1c2ded 100644 --- a/src/LIB/SURCOUCHE/src/mode_fd.f90 +++ b/src/LIB/SURCOUCHE/src/mode_fd.f90 @@ -13,7 +13,8 @@ !----------------------------------------------------------------- MODULE MODE_FD_ll -USE MODD_IO_ll, ONLY : LFIPARAM +USE MODD_IO_ll, ONLY : LFIPARAM +USE MODD_NETCDF, ONLY : IOCDF IMPLICIT NONE @@ -28,6 +29,7 @@ TYPE FD_ll CHARACTER(LEN=15) :: MODE ! Flag mode acces ('distrib','global','specific') INTEGER :: OWNER ! I/O Processor number TYPE(LFIPARAM), POINTER :: PARAM + TYPE(IOCDF), POINTER :: CDF !JUANZ INTEGER :: NB_PROCIO = 1 !JUANZ @@ -92,9 +94,10 @@ INTEGER :: IRESP ALLOCATE(TZFD,STAT=IRESP) IF (IRESP > 0) THEN ! CALL ABORT() - PRINT *, 'Erreur d"allocation memoire...' + PRINT *, 'NEWFD : Erreur d"allocation memoire...' END IF +NULLIFY(TZFD%CDF) !! Add TZFD to top of list TPFDLIST TZFD%NEXT=>TFDLIST TFDLIST=>TZFD diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90 index 5ab5c53c2e5a891b6b9dfa229b40b65427781d22..a204b894a7ca288dabd47288fb886ae486263e67 100644 --- a/src/LIB/SURCOUCHE/src/mode_fm.f90 +++ b/src/LIB/SURCOUCHE/src/mode_fm.f90 @@ -21,7 +21,6 @@ IMPLICIT NONE PRIVATE INTEGER, PARAMETER :: JPPIPE = 10 - !INCLUDE 'mpif.h' PUBLIC SET_FMPACK_ll,FMATTR_ll,FMLOOK_ll,FMOPEN_ll,FMCLOS_ll @@ -129,12 +128,15 @@ END SUBROUTINE FMLOOK_ll SUBROUTINE FMOPEN_ll(HFILEM,HACTION,HFIPRI,KNPRAR,KFTYPE,KVERB,KNINAR& & ,KRESP) -USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LFIPARAM +USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LFIPARAM,LIOCDF4,LLFIOUT,LLFIREAD USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL -USE MODE_IO_ll, ONLY : OPEN_ll +USE MODE_IO_ll, ONLY : OPEN_ll,GCONFIO !JUANZ USE MODD_CONFZ,ONLY : NB_PROCIO_R,NB_PROCIO_W !JUANZ +#if defined(MNH_IOCDF4) +USE MODE_NETCDF +#endif CHARACTER(LEN=*),INTENT(IN) ::HFILEM ! name of the file. CHARACTER(LEN=*),INTENT(IN) ::HACTION ! Action upon the file ! 'READ' or 'WRITE' @@ -166,6 +168,12 @@ LOGICAL :: GNAMFI8,GFATER8,GSTATS8 INTEGER :: INB_PROCIO !JUAN +IF (.NOT. GCONFIO) THEN + PRINT *, 'FMOPEN_ll Aborting... Please, ensure to call SET_CONFIO_ll before & + &the first FMOPEN_ll call.' + STOP +END IF + INPRAR = KNPRAR+0 KNINAR = 0 IROWF = 0 @@ -228,33 +236,63 @@ IF (ISP == TZFDLFI%OWNER) THEN GSFIRST = .FALSE. OPEN(UNIT=JPPIPE,FILE='pipe_name',FORM='FORMATTED') END IF + +#if defined(MNH_IOCDF4) + IF (LIOCDF4) THEN + IF (HACTION == 'READ' .AND. .NOT. LLFIREAD) THEN + !! Open NetCDF File for reading + TZFDLFI%CDF => NEWIOCDF() + IRESOU = NF_OPEN(ADJUSTL(TRIM(HFILEM))//".nc4", NF_NOWRITE, TZFDLFI%CDF%NCID) + IF (IRESOU /= NF_NOERR) THEN + PRINT *, 'FMOPEN_ll, NF_OPEN error : ', NF_STRERROR(IRESOU) + STOP + END IF + PRINT *, 'NF_OPEN: ', TRIM(HFILEM)//'.nc4' + END IF + + IF (HACTION == 'WRITE') THEN + ! HACTION == 'WRITE' + TZFDLFI%CDF => NEWIOCDF() + IRESOU = NF_CREATE(ADJUSTL(TRIM(HFILEM))//".nc4", & + &IOR(NF_CLOBBER,NF_NETCDF4), TZFDLFI%CDF%NCID) + IF (IRESOU /= NF_NOERR) THEN + PRINT *, 'FMOPEN_ll, NF_CREATE error : ', NF_STRERROR(IRESOU) + STOP + END IF + PRINT *, 'NF_CREATE: ', TRIM(HFILEM)//'.nc4' + END IF + END IF +#endif - !! LFI-File case - IRESOU = 0 - GNAMFI = .TRUE. - GFATER = .TRUE. - ! - INUMBR8 = INUMBR - GNAMFI8 = GNAMFI - GFATER8 = GFATER - GSTATS8 = GSTATS - ! - CALL LFIOUV(IRESOU, & - INUMBR8, & - GNAMFI8, & - YFNLFI, & - "UNKNOWN", & - GFATER8, & - GSTATS8, & - IMELEV, & - INPRAR, & - ININAR8) - KNINAR = ININAR8 - - IF (IRESOU /= 0 .AND. IRESOU /= -11) THEN - IRESP = IRESOU - ENDIF - + IF (.NOT. LIOCDF4 .OR. (HACTION=='WRITE' .AND. LLFIOUT) & + & .OR. (HACTION=='READ' .AND. LLFIREAD)) THEN + ! LFI Case + IRESOU = 0 + GNAMFI = .TRUE. + GFATER = .TRUE. + ! + INUMBR8 = INUMBR + GNAMFI8 = GNAMFI + GFATER8 = GFATER + GSTATS8 = GSTATS + ! + CALL LFIOUV(IRESOU, & + INUMBR8, & + GNAMFI8, & + YFNLFI, & + "UNKNOWN", & + GFATER8, & + GSTATS8, & + IMELEV, & + INPRAR, & + ININAR8) + KNINAR = ININAR8 + + IF (IRESOU /= 0 .AND. IRESOU /= -11) THEN + IRESP = IRESOU + ENDIF + END IF + ! !* 6. TEST IF FILE IS NEWLY DEFINED ! @@ -296,6 +334,9 @@ USE MODE_IO_ll, ONLY : CLOSE_ll,UPCASE #if !defined(MNH_SGI) USE MODI_SYSTEM_MNH #endif +#if defined(MNH_IOCDF4) +USE MODE_NETCDF +#endif CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! file name CHARACTER(LEN=*), INTENT(IN) ::HSTATU ! status for the closed file CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! file for prints in FM @@ -352,10 +393,12 @@ YFNLFI=ADJUSTL(TRIM(HFILEM)//'.lfi') TZFDLFI=>GETFD(YFNLFI) IF (ISP == TZFDLFI%OWNER) THEN - INUM8=TZFDLFI%FLU - CALL LFIFER(IRESP8,INUM8,YSTATU) - IRESP = IRESP8 - + IF (TZFDLFI%FLU > 0) THEN + INUM8=TZFDLFI%FLU + CALL LFIFER(IRESP8,INUM8,YSTATU) + IRESP = IRESP8 + END IF + IF (ASSOCIATED(TZFDLFI%CDF)) CALL CLEANIOCDF(TZFDLFI%CDF) IF (IRESP == 0) THEN !! Write in pipe #if defined(MNH_LINUX) || defined(MNH_SP4) diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90 index 1edc573ea63be58096abdb89d7033c8075762af8..b975014e9c1d8edb36bc359d1be53e1e61ffb2e1 100644 --- a/src/LIB/SURCOUCHE/src/mode_io.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io.f90 @@ -23,7 +23,6 @@ MODULE MODE_IO_ll USE MODD_ERRCODES - USE MODD_IO_ll USE MODE_FD_ll USE MODD_MPIF !JUANZ @@ -47,8 +46,12 @@ MODULE MODE_IO_ll !! Provisoire CHARACTER(LEN=*),PARAMETER :: GLOBAL='GLOBAL' CHARACTER(LEN=*),PARAMETER :: SPECIFIC='SPECIFIC' + !! + LOGICAL,SAVE :: GCONFIO = .FALSE. ! Turn TRUE when SET_CONFIO_ll is called. + !! Provisoire PUBLIC IONEWFLU,UPCASE,INITIO_ll,OPEN_ll,CLOSE_ll,FLUSH_ll,GLOBAL,SPECIFIC + PUBLIC SET_CONFIO_ll,GCONFIO !JUANZ PUBLIC io_file,io_rank !JUANZ @@ -111,9 +114,46 @@ CONTAINS END FUNCTION UPCASE + SUBROUTINE SET_CONFIO_ll(OIOCDF4, OFORCELFIOUT, OFORCELFIREAD) + USE MODD_IO_ll, ONLY : LIOCDF4, LLFIOUT, LLFIREAD + LOGICAL, INTENT(IN) :: OIOCDF4 + LOGICAL, INTENT(IN), OPTIONAL :: OFORCELFIOUT, OFORCELFIREAD + LOGICAL :: GFORCELFIOUT, GFORCELFIREAD + + IF (GCONFIO) THEN + PRINT *, 'SET_CONFIO_ll already called (ignoring this call).' + ELSE + IF (PRESENT(OFORCELFIOUT)) THEN + GFORCELFIOUT = OFORCELFIOUT + ELSE + GFORCELFIOUT = .FALSE. + END IF + IF (PRESENT(OFORCELFIREAD)) THEN + GFORCELFIREAD = OFORCELFIREAD + ELSE + GFORCELFIREAD = .FALSE. + END IF + +#if defined(MNH_IOCDF4) + !PRINT *, 'SET_CONFIO_ll : sources compiled WITH IOCDF4 support.' + LIOCDF4 = OIOCDF4 + LLFIOUT = (.NOT. OIOCDF4 .OR. GFORCELFIOUT) + LLFIREAD = GFORCELFIREAD +#else + !PRINT *, 'SET_CONFIO_ll : sources compiled WITHOUT IOCDF4 support.' + LIOCDF4 = .FALSE. + LLFIOUT = .TRUE. + LLFIREAD = .TRUE. +#endif + GCONFIO = .TRUE. + END IF + + END SUBROUTINE SET_CONFIO_ll + SUBROUTINE INITIO_ll() USE MODE_MNH_WORLD , ONLY : INIT_NMNH_COMM_WORLD + USE MODD_IO_ll IMPLICIT NONE INTEGER :: IERR, IOS @@ -179,7 +219,10 @@ CONTAINS PAD, & KNB_PROCIO,& KMELEV) - +#if defined(MNH_IOCDF4) + USE MODE_NETCDF +#endif + USE MODD_IO_ll INTEGER, INTENT(OUT) :: UNIT !! Different from fortran OPEN CHARACTER(len=*),INTENT(IN), OPTIONAL :: FILE CHARACTER(len=*),INTENT(IN), OPTIONAL :: MODE @@ -541,10 +584,15 @@ CONTAINS ENDIF TZFD%COMM = NMNH_COMM_WORLD TZFD%PARAM =>LFIPAR - IF (ISP == TZFD%OWNER) THEN - TZFD%FLU = IONEWFLU() +#if defined(MNH_IOCDF4) + IF (ISP == TZFD%OWNER .AND. (.NOT. LIOCDF4 .OR. (YACTION=='WRITE' .AND. LLFIOUT) & + & .OR. (YACTION=='READ' .AND. LLFIREAD))) THEN +#else + IF (ISP == TZFD%OWNER) THEN +#endif + TZFD%FLU = IONEWFLU() ELSE - !! NON I/O processors case + !! NON I/O processors OR NetCDF read case IOS = 0 TZFD%FLU = -1 END IF @@ -561,35 +609,72 @@ CONTAINS TZFD_IOZ%NB_PROCIO = TZFD%NB_PROCIO TZFD_IOZ%FLU = -1 TZFD_IOZ%PARAM =>LFIPAR + IF ( irank_procio .EQ. ISP ) THEN - !this proc must write on this file open it ... - TZFD_IOZ%FLU = IONEWFLU() - !! LFI-File case - IRESOU = 0 - GNAMFI8 = .TRUE. - GFATER8 = .TRUE. - GSTATS8 = .FALSE. - IF (PRESENT(KMELEV)) THEN - IMELEV = KMELEV - ELSE - IMELEV = 0 - ENDIF - INPRAR = 49 - ! - ! JUAN open lfi file temporary modif - ! - INUMBR8 = TZFD_IOZ%FLU - CALL LFIOUV(IRESOU, & - INUMBR8, & - GNAMFI8, & - TZFD_IOZ%NAME, & - "UNKNOWN", & - GFATER8, & - GSTATS8, & - IMELEV, & - INPRAR, & - ININAR8) - !KNINAR = ININAR8 +#if defined(MNH_IOCDF4) + IF (LIOCDF4) THEN + IF (YACTION == 'READ' .AND. .NOT. LLFIREAD) THEN + ! Open NetCDF File for reading + TZFD_IOZ%CDF => NEWIOCDF() + IOS = NF_OPEN(TRIM(FILE)//cfile//".nc4", NF_NOWRITE, TZFD_IOZ%CDF%NCID) + IF (IOS /= NF_NOERR) THEN + PRINT *, 'NF_OPEN error : ', NF_STRERROR(IOS) + STOP + ELSE + IOS = 0 + END IF + PRINT *, 'NF_OPEN(IO_ZSPLIT): ',TRIM(FILE)//cfile//'.nc4' + END IF + + IF (YACTION == 'WRITE') THEN + ! YACTION == 'WRITE' + ! Create NetCDF File for writing + TZFD_IOZ%CDF => NEWIOCDF() + IOS = NF_CREATE(TRIM(FILE)//cfile//".nc4", & + &IOR(NF_CLOBBER,NF_NETCDF4), TZFD_IOZ%CDF%NCID) + IF (IOS /= NF_NOERR) THEN + PRINT *, 'NF_CREATE error : ', NF_STRERROR(IOS) + STOP + ELSE + IOS = 0 + END IF + PRINT *, 'NF_CREATE(IO_ZSPLIT): ',TRIM(FILE)//cfile//'.nc4' + END IF + END IF +#endif + IF (.NOT. LIOCDF4 .OR. (YACTION=='WRITE' .AND. LLFIOUT)& + & .OR. (YACTION=='READ' .AND. LLFIREAD)) THEN + ! LFI case + ! Open LFI File for reading + !this proc must write on this file open it ... + TZFD_IOZ%FLU = IONEWFLU() + !! LFI-File case + IRESOU = 0 + GNAMFI8 = .TRUE. + GFATER8 = .TRUE. + GSTATS8 = .FALSE. + IF (PRESENT(KMELEV)) THEN + IMELEV = KMELEV + ELSE + IMELEV = 0 + ENDIF + INPRAR = 49 + ! + ! JUAN open lfi file temporary modif + ! + INUMBR8 = TZFD_IOZ%FLU + CALL LFIOUV(IRESOU, & + INUMBR8, & + GNAMFI8, & + TZFD_IOZ%NAME, & + "UNKNOWN", & + GFATER8, & + GSTATS8, & + IMELEV, & + INPRAR, & + ININAR8) + !KNINAR = ININAR8 + END IF ENDIF ENDDO END IF @@ -622,7 +707,7 @@ CONTAINS !!$ END IF IOSTAT = IOS - UNIT = TZFD%FLU + UNIT = TZFD%FLU CONTAINS FUNCTION SUFFIX(HEXT) @@ -637,7 +722,10 @@ CONTAINS END SUBROUTINE OPEN_ll SUBROUTINE CLOSE_ll(HFILE,IOSTAT,STATUS) - + USE MODD_IO_ll +#if defined(MNH_IOCDF4) + USE MODE_NETCDF +#endif CHARACTER(LEN=*), INTENT(IN) :: HFILE INTEGER, INTENT(OUT), OPTIONAL :: IOSTAT CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: STATUS @@ -698,10 +786,13 @@ CONTAINS YFILE_IOZ = TRIM(TZFD%NAME(1:ilen-4))//yfile//".lfi" TZFD_IOZ => GETFD(YFILE_IOZ) IF (ISP == TZFD_IOZ%OWNER) THEN - INUM8=TZFD_IOZ%FLU - CALL LFIFER(IRESP8,INUM8,YSTATU) - CALL IOFREEFLU(TZFD_IOZ%FLU) - IRESP = IRESP8 + IF (TZFD_IOZ%FLU > 0) THEN + INUM8=TZFD_IOZ%FLU + CALL LFIFER(IRESP8,INUM8,YSTATU) + CALL IOFREEFLU(TZFD_IOZ%FLU) + IRESP = IRESP8 + END IF + IF (ASSOCIATED(TZFD_IOZ%CDF)) CALL CLEANIOCDF(TZFD_IOZ%CDF) END IF END DO END IF @@ -730,6 +821,7 @@ CONTAINS #if defined(NAGf95) USE F90_UNIX #endif + USE MODD_IO_ll CHARACTER(LEN=*), INTENT(IN) :: HFILE INTEGER, INTENT(OUT), OPTIONAL :: IRESP diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d76c32cf68ceddb7747b002f6b57a30c120cbf2d --- /dev/null +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -0,0 +1,1658 @@ +#if defined(MNH_IOCDF4) +MODULE MODE_NETCDF +USE MODD_NETCDF + +IMPLICIT NONE + +PRIVATE + +INTERFACE NCWRIT + MODULE PROCEDURE NCWRITX0, NCWRITX1, NCWRITX2, NCWRITX3, & + & NCWRITX4, NCWRITX5, NCWRITX6, & + & NCWRITN0, NCWRITN1, NCWRITN2, & + & NCWRITC0, NCWRITC1 +END INTERFACE NCWRIT + +INTERFACE NCREAD + MODULE PROCEDURE NCREADX0, NCREADX1, NCREADX2, NCREADX3, & + & NCREADX4, NCREADX5, NCREADX6, & + & NCREADN0, NCREADN1, NCREADN2, & + & NCREADC0 +END INTERFACE NCREAD + +INCLUDE 'netcdf.inc' + +! Public from netcdf.inc : +PUBLIC NF_OPEN,NF_CREATE,NF_NOWRITE,NF_CLOBBER,NF_NETCDF4,NF_NOERR,NF_STRERROR +! Public from this module : +PUBLIC NEWIOCDF,CLEANIOCDF,NCWRIT,NCREAD + +CONTAINS + +FUNCTION NEWIOCDF() +TYPE(IOCDF), POINTER :: NEWIOCDF +TYPE(IOCDF), POINTER :: TZIOCDF +INTEGER :: IRESP + +ALLOCATE(TZIOCDF, STAT=IRESP) +IF (IRESP > 0) THEN + PRINT *, 'NEWIOCDF : memory allocation error...' + STOP +END IF + +TZIOCDF%NCID = -1 +NULLIFY(TZIOCDF%DIMX) +NULLIFY(TZIOCDF%DIMY) +NULLIFY(TZIOCDF%DIMZ) +NULLIFY(TZIOCDF%DIMSTR) +NULLIFY(TZIOCDF%DIMLIST) + +NEWIOCDF=>TZIOCDF + +END FUNCTION NEWIOCDF + +SUBROUTINE CLEANIOCDF(PIOCDF) +TYPE(IOCDF), POINTER :: PIOCDF + +INTEGER :: IRESP + +! Close Netcdf File +IRESP = NF_CLOSE(PIOCDF%NCID) +IF (IRESP /= NF_NOERR) THEN + PRINT *, 'CLEANIOCDF, NF_CLOSE error : ', NF_STRERROR(IRESP) +END IF + +! Clean DIMLIST and DIMSTR +CALL CLEANLIST(PIOCDF%DIMLIST) +CALL CLEANLIST(PIOCDF%DIMSTR) +! Then free iocdf +DEALLOCATE(PIOCDF) + +PRINT *, 'CLEANIOCDF done.' + +CONTAINS + +SUBROUTINE CLEANLIST(PLIST) +TYPE(DIMCDF), POINTER :: PLIST,TZDIMCUR, TZDIMNEXT + +TZDIMCUR => PLIST +DO WHILE(ASSOCIATED(TZDIMCUR)) + TZDIMNEXT => TZDIMCUR%NEXT + DEALLOCATE(TZDIMCUR) + TZDIMCUR => TZDIMNEXT +END DO + +END SUBROUTINE CLEANLIST + +END SUBROUTINE CLEANIOCDF + +SUBROUTINE HANDLE_ERR(status,line,text,kresp) +INTEGER, INTENT(IN) :: status,line +CHARACTER(LEN=*), INTENT(IN) :: text +INTEGER, OPTIONAL, INTENT(OUT) :: kresp + +! Don't stop the code when kresp is present +! and ensure kresp is a negative integer +IF (status /= NF_NOERR) THEN + PRINT *, 'NETCDF ERROR in '//TRIM(text), line, NF_STRERROR(status) + IF (PRESENT(kresp)) THEN + IF (status < 0) THEN + kresp = status + ELSE IF (status == 0) THEN + kresp = -1 + ELSE + kresp = -status + END IF + ELSE + STOP + END IF +END IF +END SUBROUTINE HANDLE_ERR + +FUNCTION str_replace(hstr, hold, hnew) +CHARACTER(LEN=*) :: hstr, hold, hnew +CHARACTER(LEN=LEN_TRIM(hstr)+MAX(0,LEN(hnew)-LEN(hold))) :: str_replace + +INTEGER :: pos + +pos = INDEX(hstr,hold) +IF (pos /= 0) THEN + str_replace = hstr(1:pos-1)//hnew//hstr(pos+LEN(hold):) +ELSE + str_replace = hstr +END IF + +END FUNCTION str_replace + +SUBROUTINE WRITATTR(KNCID, KVARID, TPFMH) +USE MODD_FM, ONLY : FMHEADER +INTEGER, INTENT(IN) :: KNCID +INTEGER, INTENT(IN) :: KVARID +TYPE(FMHEADER), INTENT(IN) :: TPFMH + +INTEGER :: STATUS + +! GRID attribute definition +STATUS = NF_PUT_ATT_INT(KNCID, KVARID, 'GRID', & + &NF_INT, 1, TPFMH%GRID) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITATTR [NF_PUT_ATT_INT]') + +! COMMENT attribute definition +STATUS = NF_PUT_ATT_TEXT(KNCID, KVARID,'COMMENT', & + &LEN_TRIM(TPFMH%COMMENT), TPFMH%COMMENT) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITATTR [NF_PUT_ATT_TEXT]') + +END SUBROUTINE WRITATTR + +FUNCTION GETDIMCDF(PIOCDF, KLEN, HDIMNAME) +TYPE(IOCDF), POINTER :: PIOCDF +INTEGER, INTENT(IN) :: KLEN +CHARACTER(LEN=*), OPTIONAL :: HDIMNAME ! When provided don't search but + ! simply create with name HDIMNAME +TYPE(DIMCDF), POINTER :: GETDIMCDF + +TYPE(DIMCDF), POINTER :: TMP +INTEGER :: COUNT +CHARACTER(LEN=7) :: YSUFFIX +CHARACTER(LEN=8) :: YDIMNAME +INTEGER :: STATUS + +IF (KLEN < 1) THEN + PRINT *, 'GETDIMCDF Error, KLEN=', KLEN + STOP +END IF + +IF (PRESENT(HDIMNAME)) THEN + NULLIFY(TMP) + YDIMNAME = TRIM(HDIMNAME) +ELSE + ! Search dimension with KLEN length + COUNT = 1 + TMP => PIOCDF%DIMLIST + DO WHILE(ASSOCIATED(TMP)) + IF (TMP%LEN == KLEN .AND. TMP%NAME /= 'STRLEN') EXIT + TMP=>TMP%NEXT + COUNT = COUNT+1 + END DO + WRITE(YSUFFIX,'(i7)') KLEN + YDIMNAME = 'D'//ADJUSTL(YSUFFIX) +END IF + +IF (.NOT. ASSOCIATED(TMP)) THEN + ! Not found then define new dimension + ALLOCATE(TMP) + TMP%NAME = YDIMNAME + TMP%LEN = KLEN + STATUS = NF_DEF_DIM(PIOCDF%NCID, TMP%NAME, KLEN, TMP%ID) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'GETDIMCDF[NF_DEF_DIM]') + NULLIFY(TMP%NEXT) + TMP%NEXT => PIOCDF%DIMLIST + PIOCDF%DIMLIST => TMP +END IF + +GETDIMCDF => TMP + +END FUNCTION GETDIMCDF + +FUNCTION GETSTRDIMID(PIOCDF, KLEN) +TYPE(IOCDF), POINTER :: PIOCDF +INTEGER, INTENT(IN) :: KLEN +INTEGER :: GETSTRDIMID + +TYPE(DIMCDF), POINTER :: TMP +CHARACTER(LEN=7) :: YSUFFIX +CHARACTER(LEN=8) :: YDIMNAME +INTEGER :: STATUS + +IF (KLEN < 1) THEN + PRINT *, 'GETSTRDIMID Error, KLEN=', KLEN + STOP +END IF + +! Search string dimension with KLEN length +TMP => PIOCDF%DIMSTR +DO WHILE(ASSOCIATED(TMP)) + IF (TMP%LEN == KLEN) EXIT + TMP=>TMP%NEXT +END DO +WRITE(YSUFFIX,'(i7)') KLEN +YDIMNAME = 'S'//ADJUSTL(YSUFFIX) + +IF (.NOT. ASSOCIATED(TMP)) THEN + ! Not found then define new dimension + ALLOCATE(TMP) + TMP%NAME = YDIMNAME + TMP%LEN = KLEN + STATUS = NF_DEF_DIM(PIOCDF%NCID, TMP%NAME, KLEN, TMP%ID) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'GETSTRDIMID[NF_DEF_DIM]') + NULLIFY(TMP%NEXT) + TMP%NEXT => PIOCDF%DIMSTR + PIOCDF%DIMSTR => TMP +END IF + +GETSTRDIMID = TMP%ID + +END FUNCTION GETSTRDIMID + +SUBROUTINE FILLVDIMS(PIOCDF, KSHAPE, HDIR, KVDIMS) +TYPE(IOCDF), POINTER :: PIOCDF +INTEGER, DIMENSION(:), INTENT(IN) :: KSHAPE +CHARACTER(LEN=*), INTENT(IN) :: HDIR +INTEGER, DIMENSION(:), INTENT(OUT) :: KVDIMS + +INTEGER :: II +TYPE(DIMCDF), POINTER :: PTDIM + +IF (SIZE(KSHAPE) < 1) THEN + PRINT *, 'FILLVDIMS Error, KSHAPE empty' + STOP +END IF + +DO II=1, SIZE(KSHAPE) + + IF (II == 1) THEN + IF (HDIR == 'XX' .OR. HDIR == 'XY') THEN + IF (.NOT. ASSOCIATED(PIOCDF%DIMX)) PIOCDF%DIMX => GETDIMCDF(PIOCDF, KSHAPE(II), 'X') + IF (KSHAPE(II) == PIOCDF%DIMX%LEN) THEN + PTDIM => PIOCDF%DIMX + ELSE + PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + END IF + ELSE IF (HDIR == 'YY') THEN + IF (.NOT. ASSOCIATED(PIOCDF%DIMY)) PIOCDF%DIMY => GETDIMCDF(PIOCDF, KSHAPE(II), 'Y') + IF (KSHAPE(II) == PIOCDF%DIMY%LEN) THEN + PTDIM => PIOCDF%DIMY + ELSE + PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + END IF + ELSE + PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + KVDIMS(II) = PTDIM%ID + END IF + ELSE IF (II == 2) THEN + IF (HDIR == 'XY') THEN + IF (.NOT. ASSOCIATED(PIOCDF%DIMY)) PIOCDF%DIMY => GETDIMCDF(PIOCDF, KSHAPE(II), 'Y') + IF (KSHAPE(II) == PIOCDF%DIMY%LEN) THEN + PTDIM => PIOCDF%DIMY + ELSE + PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + END IF + ELSE + PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + END IF + ELSE IF (II == 3) THEN + IF (HDIR == 'XY') THEN + IF (.NOT. ASSOCIATED(PIOCDF%DIMZ)) PIOCDF%DIMZ => GETDIMCDF(PIOCDF, KSHAPE(II), 'Z') + IF (KSHAPE(II) == PIOCDF%DIMZ%LEN) THEN + PTDIM => PIOCDF%DIMZ + ELSE + PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + END IF + ELSE + PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + END IF + ELSE + PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + END IF + + KVDIMS(II) = PTDIM%ID + +END DO + +END SUBROUTINE FILLVDIMS + + +SUBROUTINE NCWRITX0(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +REAL, INTENT(IN) :: PFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: IRESP + +IRESP = 0 +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Define the scalar variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, 0, 0, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX0[NF_DEF_VAR]') + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITX0 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX0[NF_PUT_VAR_DOUBLE]',IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITX0 + +SUBROUTINE NCWRITX1(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +REAL, DIMENSION(:), INTENT(IN) :: PFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: IRESP + +IRESP = 0 +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS) + + ! Define the variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX1[NF_DEF_VAR]') + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITX1 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX1[NF_PUT_VAR_DOUBLE]',IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITX1 + +SUBROUTINE NCWRITX2(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP) +USE MODD_IO_ll, ONLY : LDEFLATEX2 +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +REAL, DIMENSION(:,:), INTENT(IN) :: PFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: IRESP + +IRESP = 0 +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS) + + ! Define the variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX2[NF_DEF_VAR]') + IF (LDEFLATEX2) THEN + ! Compress the variable with deflate level 2 + STATUS = NF_DEF_VAR_DEFLATE(INCID, IVARID, 0, 1, 2) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX2[NF_DEF_VAR_DEFLATE]') + END IF + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITX2 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX2[NF_PUT_VAR_DOUBLE]',IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITX2 + +SUBROUTINE NCWRITX3(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +REAL, DIMENSION(:,:,:),INTENT(IN) :: PFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: IRESP + +IRESP = 0 +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS) + + ! Define the variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX3[NF_DEF_VAR]') + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITX3 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX3[NF_PUT_VAR_DOUBLE] '//TRIM(HVARNAME),IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITX3 + +SUBROUTINE NCWRITX4(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: IRESP + +IRESP = 0 +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS) + + ! Define the variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX4[NF_DEF_VAR]') + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITX4 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX4[NF_PUT_VAR_DOUBLE]',IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITX4 + +SUBROUTINE NCWRITX5(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +REAL, DIMENSION(:,:,:,:,:), INTENT(IN) :: PFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: IRESP + +IRESP = 0 +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS) + + ! Define the variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX5[NF_DEF_VAR]') + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITX5 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX5[NF_PUT_VAR_DOUBLE]',IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITX5 + +SUBROUTINE NCWRITX6(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: IRESP + +IRESP = 0 +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS) + + ! Define the variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX6[NF_DEF_VAR]') + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITX6 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX6[NF_PUT_VAR_DOUBLE]',IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITX6 + +SUBROUTINE NCWRITN0(PZCDF, HVARNAME, HDIR, KFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +USE MODD_PARAMETERS_ll, ONLY : JPHEXT, JPVEXT +USE MODD_IO_ll, ONLY : LPACK,L1D,L2D +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +INTEGER, INTENT(IN) :: KFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: IRESP + +IRESP = 0 +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Define the scalar variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_INT, 0, 0, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN0[NF_DEF_VAR]') + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITN0 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VAR_INT(INCID, IVARID, KFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN0[NF_PUT_VAR_INT]',IRESP) +! +! Use IMAX, JMAX, KMAX to define DIMX, DIMY, DIMZ +! /!\ Can only work if IMAX, JMAX or KMAX are written before any array +! +#if 0 +IF (YVARNAME == 'IMAX' .AND. .NOT. ASSOCIATED(PZCDF%DIMX)) PZCDF%DIMX=>GETDIMCDF(PZCDF,KFIELD+2*JPHEXT,'X') +IF (YVARNAME == 'JMAX' .AND. .NOT. ASSOCIATED(PZCDF%DIMY)) THEN + IF (LPACK .AND. L2D) THEN + PZCDF%DIMY=>GETDIMCDF(PZCDF, 1,'Y') + ELSE + PZCDF%DIMY=>GETDIMCDF(PZCDF, KFIELD+2*JPHEXT, 'Y') + END IF +END IF +#endif +IF (YVARNAME == 'KMAX' .AND. .NOT. ASSOCIATED(PZCDF%DIMZ)) PZCDF%DIMZ=>GETDIMCDF(PZCDF,KFIELD+2*JPVEXT,'Z') + +KRESP = IRESP +END SUBROUTINE NCWRITN0 + +SUBROUTINE NCWRITN1(PZCDF, HVARNAME, HDIR, KFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +INTEGER, DIMENSION(:), INTENT(IN) :: KFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER, DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS +INTEGER :: IRESP + +IRESP = 0 +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, SHAPE(KFIELD), HDIR, IVDIMS) + ! Define the variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_INT, SIZE(IVDIMS), IVDIMS, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN1[NF_DEF_VAR] '//TRIM(YVARNAME)) + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITN1 : ', TRIM(YVARNAME), ' already defined !' +END IF + + +! Write the data +STATUS = NF_PUT_VAR_INT(INCID, IVARID, KFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN1[NF_PUT_VAR_INT]',IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITN1 + +SUBROUTINE NCWRITN2(PZCDF, HVARNAME, HDIR, KFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +INTEGER, DIMENSION(:,:),INTENT(IN) :: KFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER, DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS +INTEGER :: IRESP + +IRESP = 0 +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, SHAPE(KFIELD), HDIR, IVDIMS) + + ! Define the variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_INT, SIZE(IVDIMS), IVDIMS, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN2[NF_DEF_VAR]') + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITN2 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VAR_INT(INCID, IVARID, KFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN2[NF_PUT_VAR_INT]',IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITN2 + +SUBROUTINE NCWRITC0(PZCDF, HVARNAME, HDIR, HFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +CHARACTER(LEN=*), INTENT(IN) :: HFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER, DIMENSION(1) :: IVDIMS +CHARACTER(LEN=32) :: YSTR +!CHARACTER(LEN=LEN(HFIELD)) :: YSTR +INTEGER :: IRESP + +IRESP = 0 +YSTR = HFIELD +IF (LEN_TRIM(HFIELD) > LEN(YSTR)) THEN + PRINT *,'NCWRIT0 : ',TRIM(YVARNAME), ' string variable TRUNCATED.' +END IF + +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Get the netcdf string dimensions id + IVDIMS(1) = GETSTRDIMID(PZCDF, LEN(YSTR)) + ! Define the variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_CHAR, SIZE(IVDIMS), IVDIMS, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITC0[NF_DEF_VAR]') + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITC0 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VAR_TEXT(INCID, IVARID, YSTR) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITC0[NF_PUT_VAR_TEXT]',IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITC0 + +SUBROUTINE NCWRITC1(PZCDF, HVARNAME, HDIR, HFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER +TYPE(IOCDF), POINTER :: PZCDF +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(IN) :: HDIR +CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HFIELD +TYPE(FMHEADER), INTENT(IN) :: TPFMH +INTEGER, INTENT(OUT):: KRESP + +INTEGER :: STATUS +INTEGER :: INCID +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER, DIMENSION(2) :: IVDIMS +INTEGER, DIMENSION(1) :: ITMP +INTEGER :: IRESP +INTEGER :: ILEN +INTEGER :: ISIZE + +IRESP = 0 +ILEN = LEN(HFIELD) +ISIZE = SIZE(HFIELD) + +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + ! Get the netcdf dimensions ID + IVDIMS(1) = GETSTRDIMID(PZCDF,ILEN) + CALL FILLVDIMS(PZCDF, (/ISIZE/), HDIR, ITMP) + IVDIMS(2) = ITMP(1) + ! Define the variable + STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_CHAR, SIZE(IVDIMS), IVDIMS, IVARID) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITC1[NF_DEF_VAR]') + CALL WRITATTR(INCID, IVARID, TPFMH) +ELSE + PRINT *,'NCWRITC1 : ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF_PUT_VARA_TEXT(INCID, IVARID, (/1,1/),(/ILEN,ISIZE/), HFIELD) +IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITC1[NF_PUT_VARA_TEXT]',IRESP) + +KRESP = IRESP +END SUBROUTINE NCWRITC1 + +! +! +! Here come the NetCDF READ routines +! +! +SUBROUTINE READATTR(KNCID, KVARID, HVAR, TPFMH) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +INTEGER, INTENT(IN) :: KVARID +CHARACTER(LEN=*),INTENT(IN) :: HVAR +TYPE(FMHEADER), INTENT(OUT):: TPFMH + +INTEGER :: STATUS +INTEGER :: ICOMLEN + +! Read variables attributes (GRID and COMMENT) +STATUS = NF_GET_ATT_INT(KNCID, KVARID, 'GRID', TPFMH%GRID) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'READATTR[NF_GET_ATT_INT] '//TRIM(HVAR)) +STATUS = NF_INQ_ATTLEN(KNCID, KVARID, 'COMMENT', ICOMLEN) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'READATTR[NF_INQ_ATTLEN] '//TRIM(HVAR)) +IF (ICOMLEN <= JPXKRK) THEN + TPFMH%COMLEN = ICOMLEN + STATUS = NF_GET_ATT_TEXT(KNCID, KVARID, 'COMMENT', TPFMH%COMMENT) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'READATTR[NF_GET_ATT_TEXT] '//TRIM(HVAR)) +ELSE + PRINT *, 'READATTR : '//TRIM(HVAR)//' COMMENT attribute ignored because too long.' + TPFMH%COMLEN = 0 +END IF +END SUBROUTINE READATTR + +SUBROUTINE NCREADX0(KNCID, HVARNAME, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +REAL, INTENT(OUT):: PFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER :: ICOMLEN ! comment length +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX0[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX0[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX0[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == 0 .AND. ITYPE == NF_DOUBLE) THEN + ! Read variable + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX0[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) +ELSE + PRINT *, 'NCREADNCREADX0 : '//TRIM(YVARNAME)//' not READ (wrong size or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADX0 + +SUBROUTINE NCREADX1(KNCID, HVARNAME, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +REAL, DIMENSION(:), INTENT(OUT):: PFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: ICOMLEN ! comment length +INTEGER :: IVARSIZE, IDIMLEN +INTEGER :: II +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX1[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX1[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX1[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN + ! Check size of variable before reading + STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX1[NF_INQ_VARDIMID] '//TRIM(YVARNAME)) + IVARSIZE = 1 + DO II=1,IDIMS + STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX1[NF_INQ_DIMLEN] '//TRIM(YVARNAME)) + IVARSIZE = IVARSIZE*IDIMLEN + END DO + + IF (IVARSIZE == SIZE(PFIELD)) THEN + ! Read variable + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX1[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) + ELSE + PRINT *, 'NCREADX1 : '//TRIM(YVARNAME)//' not READ wrong size (file, mem) : ', IVARSIZE, SIZE(PFIELD) + IRESP = -3 + END IF +ELSE + PRINT *, 'NCREADX1 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADX1 + +SUBROUTINE NCREADX2(KNCID, HVARNAME, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +REAL, DIMENSION(:,:), INTENT(OUT):: PFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: ICOMLEN ! comment length +INTEGER :: IVARSIZE, IDIMLEN +INTEGER :: II +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX2[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX2[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX2[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN + ! Check size of variable before reading + STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX2[NF_INQ_VARDIMID] '//TRIM(YVARNAME)) + IVARSIZE = 1 + DO II=1,IDIMS + STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX2[NF_INQ_DIMLEN] '//TRIM(YVARNAME)) + IVARSIZE = IVARSIZE*IDIMLEN + END DO + + IF (IVARSIZE == SIZE(PFIELD)) THEN + ! Read variable + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX2[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) + ELSE + PRINT *, 'NCREADX2 : '//TRIM(YVARNAME)//' not READ (wrong size).' + IRESP = -3 + END IF +ELSE + PRINT *, 'NCREADX2 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADX2 + +SUBROUTINE NCREADX3(KNCID, HVARNAME, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +REAL, DIMENSION(:,:,:), INTENT(OUT):: PFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: ICOMLEN ! comment length +INTEGER :: IVARSIZE, IDIMLEN +INTEGER :: II +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX3[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX3[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX3[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN + ! Check size of variable before reading + STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX3[NF_INQ_VARDIMID] '//TRIM(YVARNAME)) + IVARSIZE = 1 + DO II=1,IDIMS + STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX3[NF_INQ_DIMLEN] '//TRIM(YVARNAME)) + IVARSIZE = IVARSIZE*IDIMLEN + END DO + + IF (IVARSIZE == SIZE(PFIELD)) THEN + ! Read variable + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX3[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) + ELSE + PRINT *, 'NCREADX3 : '//TRIM(YVARNAME)//' not READ (wrong size).' + IRESP = -3 + END IF +ELSE + PRINT *, 'NCREADX3 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADX3 + +SUBROUTINE NCREADX4(KNCID, HVARNAME, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: ICOMLEN ! comment length +INTEGER :: IVARSIZE, IDIMLEN +INTEGER :: II +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX4[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX4[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX4[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN + ! Check size of variable before reading + STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX4[NF_INQ_VARDIMID] '//TRIM(YVARNAME)) + IVARSIZE = 1 + DO II=1,IDIMS + STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX4[NF_INQ_DIMLEN] '//TRIM(YVARNAME)) + IVARSIZE = IVARSIZE*IDIMLEN + END DO + + IF (IVARSIZE == SIZE(PFIELD)) THEN + ! Read variable + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX4[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) + ELSE + PRINT *, 'NCREADX4 : '//TRIM(YVARNAME)//' not READ (wrong size).' + IRESP = -3 + END IF +ELSE + PRINT *, 'NCREADX4 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADX4 + +SUBROUTINE NCREADX5(KNCID, HVARNAME, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +REAL, DIMENSION(:,:,:,:,:), INTENT(OUT):: PFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: ICOMLEN ! comment length +INTEGER :: IVARSIZE, IDIMLEN +INTEGER :: II +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX5[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX5[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX5[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN + ! Check size of variable before reading + STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX5[NF_INQ_VARDIMID] '//TRIM(YVARNAME)) + IVARSIZE = 1 + DO II=1,IDIMS + STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX5[NF_INQ_DIMLEN] '//TRIM(YVARNAME)) + IVARSIZE = IVARSIZE*IDIMLEN + END DO + + IF (IVARSIZE == SIZE(PFIELD)) THEN + ! Read variable + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX5[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) + ELSE + PRINT *, 'NCREADX5 : '//TRIM(YVARNAME)//' not READ (wrong size).' + IRESP = -3 + END IF +ELSE + PRINT *, 'NCREADX5 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADX5 + +SUBROUTINE NCREADX6(KNCID, HVARNAME, PFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +REAL, DIMENSION(:,:,:,:,:,:), INTENT(OUT):: PFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: ICOMLEN ! comment length +INTEGER :: IVARSIZE, IDIMLEN +INTEGER :: II +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX6[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX6[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX6[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN + ! Check size of variable before reading + STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX6[NF_INQ_VARDIMID] '//TRIM(YVARNAME)) + IVARSIZE = 1 + DO II=1,IDIMS + STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX6[NF_INQ_DIMLEN] '//TRIM(YVARNAME)) + IVARSIZE = IVARSIZE*IDIMLEN + END DO + + IF (IVARSIZE == SIZE(PFIELD)) THEN + ! Read variable + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADX6[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) + ELSE + PRINT *, 'NCREADX6 : '//TRIM(YVARNAME)//' not READ (wrong size).' + IRESP = -3 + END IF +ELSE + PRINT *, 'NCREADX6 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADX6 + +SUBROUTINE NCREADN0(KNCID, HVARNAME, KFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +INTEGER, INTENT(OUT):: KFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER :: ICOMLEN ! comment length +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADN0[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN0[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN0[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == 0 .AND. ITYPE == NF_INT) THEN + ! Read variable + STATUS = NF_GET_VAR_INT(KNCID, IVARID, KFIELD) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADN0[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) +ELSE + PRINT *, 'NCREADN0 : '//TRIM(YVARNAME)//' not READ (wrong size or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADN0 + +SUBROUTINE NCREADN1(KNCID, HVARNAME, KFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +INTEGER, DIMENSION(:), INTENT(OUT):: KFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER, DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS +INTEGER :: ICOMLEN ! comment length +INTEGER :: IVARSIZE, IDIMLEN +INTEGER :: II +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADN1[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN1[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN1[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. ITYPE == NF_INT) THEN + ! Check size of variable before reading + STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADN1[NF_INQ_VARDIMID] '//TRIM(YVARNAME)) + IVARSIZE = 1 + DO II=1,IDIMS + STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADN1[NF_INQ_DIMLEN] '//TRIM(YVARNAME)) + IVARSIZE = IVARSIZE*IDIMLEN + END DO + + IF (IVARSIZE == SIZE(KFIELD)) THEN + ! Read variable + STATUS = NF_GET_VAR_INT(KNCID, IVARID, KFIELD) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADN1[NF_GET_VAR_INT] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) + ELSE + PRINT *, 'NCREADN1 : '//TRIM(YVARNAME)//' not READ (wrong size).' + IRESP = -3 + END IF +ELSE + PRINT *, 'NCREADN1 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADN1 + +SUBROUTINE NCREADN2(KNCID, HVARNAME, KFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +INTEGER, DIMENSION(:,:), INTENT(OUT):: KFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER, DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS +INTEGER :: ICOMLEN ! comment length +INTEGER :: IVARSIZE, IDIMLEN +INTEGER :: II +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADN2[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN2[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN2[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. ITYPE == NF_INT) THEN + ! Check size of variable before reading + STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADN2[NF_INQ_VARDIMID] '//TRIM(YVARNAME)) + IVARSIZE = 1 + DO II=1,IDIMS + STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADN2[NF_INQ_DIMLEN] '//TRIM(YVARNAME)) + IVARSIZE = IVARSIZE*IDIMLEN + END DO + + IF (IVARSIZE == SIZE(KFIELD)) THEN + ! Read variable + STATUS = NF_GET_VAR_INT(KNCID, IVARID, KFIELD) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADN2[NF_GET_VAR_INT] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) + ELSE + PRINT *, 'NCREADN2 : '//TRIM(YVARNAME)//' not READ (wrong size).' + IRESP = -3 + END IF +ELSE + PRINT *, 'NCREADN2 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADN2 + +SUBROUTINE NCREADC0(KNCID, HVARNAME, HFIELD, TPFMH, KRESP) +USE MODD_FM, ONLY : FMHEADER, JPXKRK +INTEGER, INTENT(IN) :: KNCID +CHARACTER(LEN=*), INTENT(IN) :: HVARNAME +CHARACTER(LEN=*), INTENT(OUT):: HFIELD +TYPE(FMHEADER), INTENT(OUT):: TPFMH +INTEGER, INTENT(OUT):: KRESP ! return-code + +INTEGER :: STATUS +CHARACTER(LEN=30) :: YVARNAME +INTEGER :: IVARID +INTEGER :: ITYPE ! variable type +INTEGER :: IDIMS ! number of dimensions +INTEGER, DIMENSION(1) :: IVDIMS +CHARACTER(LEN=32) :: YSTR +!CHARACTER(LEN=LEN(HFIELD)) :: YSTR +INTEGER :: ICOMLEN ! comment length +INTEGER :: IDIMLEN +INTEGER :: II +INTEGER :: IRESP + +IRESP = 0 + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(HVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! Get variable ID, NDIMS and TYPE +STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID) +IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP) + GOTO 1000 +END IF +STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADC0[NF_INQ_VARNDIMS] '//TRIM(YVARNAME)) +STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE) +IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADC0[NF_INQ_VARTYPE] '//TRIM(YVARNAME)) + +IF (IDIMS == 1 .AND. ITYPE == NF_CHAR) THEN + ! Check size of variable before reading + STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS) + IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF_INQ_VARDIMID] '//TRIM(YVARNAME)) + STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(1),IDIMLEN) + IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF_INQ_DIMLEN] '//TRIM(YVARNAME)) + + IF (IDIMLEN <= LEN(YSTR)) THEN + ! Read variable + STATUS = NF_GET_VAR_TEXT(KNCID, IVARID, YSTR) + IF (STATUS /= NF_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF_GET_VAR_TEXT] '//TRIM(YVARNAME),IRESP) + GOTO 1000 + END IF + IF (LEN_TRIM(YSTR) > LEN(HFIELD)) PRINT *, 'NCDREADC0 : '//TRIM(YVARNAME)//' truncated !!' + HFIELD = TRIM(YSTR) + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) + ELSE + PRINT *, 'NCREADC0 : '//TRIM(YVARNAME)//' not READ (wrong size).' + IRESP = -3 + END IF +ELSE + PRINT *, 'NCREADC0 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' + IRESP = -3 +END IF + +1000 CONTINUE +KRESP = IRESP + +END SUBROUTINE NCREADC0 + +END MODULE MODE_NETCDF + +#else +! +! External dummy subroutines +! +SUBROUTINE NCWRIT(A,B,C,D,E,F) +INTEGER :: A,B,C,D,E,F +PRINT *, 'NCWRIT empty call. Compile with -DMNH_IOCDF4 flag to enable NetCDF4 I/Os.' +END SUBROUTINE NCWRIT + +SUBROUTINE NCREAD(A,B,C,D,E) +INTEGER :: A,B,C,D,E +PRINT *, 'NCREAD empty call. Compile with -DMNH_IOCDF4 flag to enable NetCDF4 I/Os.' +END SUBROUTINE NCREAD + +SUBROUTINE CLEANIOCDF(A) +INTEGER :: A +PRINT *, 'CLEANIOCDF empty call. Compile with -DMNH_IOCDF4 flag to enable NetCDF4 I/Os.' +END SUBROUTINE CLEANIOCDF + +#endif diff --git a/src/LIB/SURCOUCHE/src/modn_confio.f90 b/src/LIB/SURCOUCHE/src/modn_confio.f90 new file mode 100644 index 0000000000000000000000000000000000000000..b0ae8246075ae540b5cb96d170cef7f45ffde12c --- /dev/null +++ b/src/LIB/SURCOUCHE/src/modn_confio.f90 @@ -0,0 +1,42 @@ +! ################## + MODULE MODN_CONFIO +! ################## +! +!!**** *MODN_CONFIO* - declaration of namelist NAM_CONFIO +!! +!! PURPOSE +!! ------- +! Define I/O configuration variables that can be set with the NAM_CONFIO namelist +!! /!\ These variables must be transmitted to the SURCOUCHE library via the +!! SET_CONFIO_ll subroutine before the FIRST call to FMOPEN_ll. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! D.Gazen L.A. +!! +!! MODIFICATIONS +!! ------------- +!! Original 31/03/2014 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +LOGICAL,SAVE :: LCDF4 = .FALSE. ! TRUE : enable NetCDF4 Input/Output +LOGICAL,SAVE :: LLFIOUT = .FALSE. ! TRUE : add LFI output when NetCDF4 I/O is enabled (debug) +LOGICAL,SAVE :: LLFIREAD = .FALSE. ! TRUE : enable LFI reading (disable NetCDF4 reading) + ! when NetCDF4 I/O is enabled (debug) +! +NAMELIST/NAM_CONFIO/ LCDF4, LLFIOUT, LLFIREAD +! +END MODULE MODN_CONFIO + diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90 index 2ff03b82fce52890a68ffa8ba6cee0f14c1ebf78..01b8ad3b08d16de5328da5c3af533b5d6c483817 100644 --- a/src/MNH/diag.f90 +++ b/src/MNH/diag.f90 @@ -134,6 +134,7 @@ USE MODD_STATION_n USE MODE_MNH_TIMING USE MODE_FMREAD USE MODN_CONFZ +USE MODN_CONFIO ! USE MODI_MNHGET_SURF_PARAM_n ! @@ -396,6 +397,12 @@ IF (GFOUND) THEN PRINT*, ' namelist NAM_NCOUT read' END IF #endif +CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND) +IF (GFOUND) THEN + READ(UNIT=ILUNAM,NML=NAM_CONFIO) + PRINT*, ' namelist NAM_CONFIO read' +END IF +CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) ! CALL CLOSE_ll(YNAM) ! diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90 index 40eb6bac3e5a04f67dca3496e091fac68b5483a2..dc4140b6c161b6f11b4a52f48a109a8bdff3c95e 100644 --- a/src/MNH/ini_segn.f90 +++ b/src/MNH/ini_segn.f90 @@ -168,6 +168,7 @@ END MODULE MODI_INI_SEG_n USE MODD_LUNIT USE MODD_CONF USE MODN_CONFZ +USE MODN_CONFIO USE MODD_CONF_n, ONLY : CSTORAGE_TYPE USE MODD_LUNIT_n, ONLY : CINIFILE_n=> CINIFILE,CINIFILEPGD_n=> CINIFILEPGD USE MODN_LUNIT_n @@ -337,6 +338,9 @@ IF (CPROGRAM=='MESONH') THEN IF (KMI.EQ.1) THEN CALL POSNAM(ILUSEG,'NAM_CONFZ',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFZ) + CALL POSNAM(ILUSEG,'NAM_CONFIO',GFOUND,ILUOUT) + IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFIO) + CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) END IF HINIFILEPGD=CINIFILEPGD_n HINIFILE=CINIFILE_n diff --git a/src/MNH/latlon_to_xy.f90 b/src/MNH/latlon_to_xy.f90 index 6142bf357c910fdb4a437a753afa6277687c1e63..5158ae4a66d37a33fd5e9cdd3f52eb04f88f40ec 100644 --- a/src/MNH/latlon_to_xy.f90 +++ b/src/MNH/latlon_to_xy.f90 @@ -81,6 +81,8 @@ USE MODE_GRIDPROJ USE MODI_INI_CST USE MODI_READ_HGRID ! +USE MODN_CONFIO +! IMPLICIT NONE ! !* 0.2 Declaration of variables @@ -126,6 +128,9 @@ CALL INITIO_ll() CALL OPEN_ll(UNIT=INAM,FILE='LATLON2XY1.nam',IOSTAT=IRESP,ACTION='READ', & DELIM='QUOTE',MODE=GLOBAL) READ(INAM,NAM_INIFILE) +! +READ(INAM,NAM_CONFIO) +CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) CALL CLOSE_ll('LATLON2XY1.nam',IOSTAT=IRESP) ! !* 1. Opening of MESONH file diff --git a/src/MNH/open_nestpgd_files.f90 b/src/MNH/open_nestpgd_files.f90 index e574a409d1ad70a84069e193f6deb86645f6a2fd..d0d575bbf19ed6be8e5a8496c1b44ed97fe225ce 100644 --- a/src/MNH/open_nestpgd_files.f90 +++ b/src/MNH/open_nestpgd_files.f90 @@ -85,6 +85,7 @@ USE MODE_MODELN_HANDLER #ifdef MNH_NCWRIT USE MODN_NCOUT #endif +USE MODN_CONFIO ! IMPLICIT NONE ! @@ -275,6 +276,10 @@ CALL POSNAM(IPRE_NEST_PGD,'NAM_NCOUT',GFOUND,ILUOUT0) IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_NCOUT) #endif ! +CALL POSNAM(IPRE_NEST_PGD,'NAM_CONFIO',GFOUND,ILUOUT0) +IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_CONFIO) +CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) +! !------------------------------------------------------------------------------- CALL CLOSE_ll(HPRE_NEST_PGD) !------------------------------------------------------------------------------- diff --git a/src/MNH/open_prc_files.f90 b/src/MNH/open_prc_files.f90 index a00ba58265e1cdc4cebd59145d7c887bdc1c3dd6..587f257b1cb6dd76fa5343cc62ad6931434d6a5d 100644 --- a/src/MNH/open_prc_files.f90 +++ b/src/MNH/open_prc_files.f90 @@ -104,6 +104,7 @@ USE MODD_LUNIT_n, CINIFILE_n=>CINIFILE , CINIFILEPGD_n=>CINIFILEPGD !JUAN Z_SPLITTING USE MODN_CONFZ !JUAN Z_SPLITTING +USE MODN_CONFIO ! USE MODE_POS USE MODE_FM @@ -189,7 +190,10 @@ ENDIF CALL POSNAM(IPRE_REAL1,'NAM_CONFZ',GFOUND,ILUOUT0) IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFZ) !JUANZ - +CALL POSNAM(IPRE_REAL1,'NAM_CONFIO',GFOUND,ILUOUT0) +IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFIO) +CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) +! CINIFILE = CINIFILE_n CALL POSNAM(IPRE_REAL1,'NAM_FILE_NAMES',GFOUND,ILUOUT0) IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_FILE_NAMES) diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90 index d6de2c319841f6407cd1ac0bf97b3f6bde231b2e..f85aa3cf4d37439e5a0697fb54aa3180761025cb 100644 --- a/src/MNH/prep_ideal_case.f90 +++ b/src/MNH/prep_ideal_case.f90 @@ -405,6 +405,7 @@ USE MODN_CONFZ USE MODN_NCOUT USE MODE_UTIL #endif +USE MODN_CONFIO USE MODI_TH_R_FROM_THL_RT_3D ! USE MODI_VERSION @@ -676,6 +677,9 @@ IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFZ) CALL POSNAM(NLUPRE,'NAM_NCOUT',GFOUND,NLUOUT) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_NCOUT) #endif +CALL POSNAM(NLUPRE,'NAM_CONFIO',GFOUND,NLUOUT) +IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFIO) +CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) CALL POSNAM(NLUPRE,'NAM_GRID_PRE',GFOUND,NLUOUT) IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRID_PRE) CALL POSNAM(NLUPRE,'NAM_GRIDH_PRE',GFOUND,NLUOUT) diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90 index 0ce96abcd10a92c8beb906306fea03dceb618b85..13f529569b6add68f1efd2f6933abbcb4a5f1d25 100644 --- a/src/MNH/prep_pgd.f90 +++ b/src/MNH/prep_pgd.f90 @@ -83,6 +83,7 @@ USE MODI_ZSMT_PGD !JUAN USE MODN_CONFZ !JUAN +USE MODN_CONFIO ! USE MODI_ALLOC_SURFEX USE MODI_READ_ALL_NAMELISTS @@ -94,8 +95,8 @@ USE MODI_PGD_SURF_ATM USE MODI_WRITE_PGD_SURF_ATM_N USE MODI_DEALLOC_SURFEX ! -#ifdef MNH_NCWRIT USE MODD_SURF_ATM_GRID_n, ONLY : XLON, XLAT +#ifdef MNH_NCWRIT USE MODN_NCOUT USE MODE_UTIL USE MODE_FMREAD @@ -118,7 +119,7 @@ CHARACTER(LEN=28) :: CPGDFILE ='PGDFILE' ! name of the output file INTEGER :: NZSFILTER=1 ! number of iteration for filter for fine orography INTEGER :: NSLEVE =12 ! number of iteration for filter for smooth orography REAL :: XSMOOTH_ZS = XUNDEF ! optional uniform smooth orography for SLEVE coordinate -#ifdef MNH_NCWRIT +!#ifdef MNH_NCWRIT REAL, DIMENSION(:,:),ALLOCATABLE :: ZWORK ! work array for lat and lon reshape REAL, DIMENSION(:,:),ALLOCATABLE :: ZWORK_LAT ! work array for lat and lon reshape REAL, DIMENSION(:,:),ALLOCATABLE :: ZWORK_LON ! work array for lat and lon reshape @@ -127,7 +128,8 @@ CHARACTER(LEN=16) :: YRECFM ! name of record INTEGER :: IGRID ! grid location INTEGER :: ILENCH ! length of comment string CHARACTER(LEN=100):: YCOMMENT ! comment string -#endif +INTEGER :: IIMAX, IJMAX +!#endif ! NAMELIST/NAM_PGDFILE/CPGDFILE, NHALO NAMELIST/NAM_ZSFILTER/NZSFILTER @@ -172,6 +174,9 @@ IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_SLEVE) CALL POSNAM(ILUNAM,'NAM_CONFZ',GFOUND) IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFZ) !JUANZ +CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND) +IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO) +CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) !SB #ifdef MNH_NCWRIT CALL POSNAM(ILUNAM,'NAM_NCOUT',GFOUND) @@ -234,16 +239,16 @@ CALL WRITE_PGD_SURF_ATM_n('MESONH') IF (LNETCDF.AND..NOT.LCARTESIAN) THEN LLFIFM = .FALSE. !!!! WRITE LAT and LON - CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX) - ALLOCATE(ZWORK(NIMAX+NHALO*2,NJMAX+NHALO*2)) - ALLOCATE(ZWORK_LAT(NIMAX+2,NJMAX+2)) - ALLOCATE(ZWORK_LON(NIMAX+2,NJMAX+2)) - ZWORK=RESHAPE(XLAT, (/ (NIMAX+NHALO*2),(NJMAX+NHALO*2) /) ) - ZWORK_LAT=ZWORK(NHALO:(NIMAX+NHALO+1),NHALO:(NJMAX+NHALO+1)) + CALL GET_DIM_PHYS_ll('B',IIMAX,IJMAX) + ALLOCATE(ZWORK(IIMAX+NHALO*2,IJMAX+NHALO*2)) + ALLOCATE(ZWORK_LAT(IIMAX+2,IJMAX+2)) + ALLOCATE(ZWORK_LON(IIMAX+2,IJMAX+2)) + ZWORK=RESHAPE(XLAT, (/ (IIMAX+NHALO*2),(IJMAX+NHALO*2) /) ) + ZWORK_LAT=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1)) !! CALL FMWRIT(COUTFMFILE,'LAT',CLUOUT0,'XY',ZWORK_LAT,1,21,'X_Y_latitude (degree)',IRESP) - ZWORK=RESHAPE(XLON, (/ NIMAX+NHALO*2,NJMAX+NHALO*2 /) ) - ZWORK_LON=ZWORK(NHALO:(NIMAX+NHALO+1),NHALO:(NJMAX+NHALO+1)) + ZWORK=RESHAPE(XLON, (/ IIMAX+NHALO*2,IJMAX+NHALO*2 /) ) + ZWORK_LON=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1)) CALL FMWRIT(COUTFMFILE,'LON',CLUOUT0,'XY',ZWORK_LON,1,22,'X_Y_longitude (degree)',IRESP) DEALLOCATE(ZWORK) LLFIFM = .TRUE. @@ -261,7 +266,7 @@ IF ( LNETCDF ) THEN CALL FMWRIT(COUTFMFILE,'LAT',CLUOUT0,'XY',ZWORK_LAT,1,21,'X_Y_latitude (degree)',IRESP) CALL FMWRIT(COUTFMFILE,'LON',CLUOUT0,'XY',ZWORK_LON,1,22,'X_Y_longitude (degree)',IRESP) END IF - ALLOCATE(ZZS(NIMAX+2,NJMAX+2)) + ALLOCATE(ZZS(IIMAX+2,IJMAX+2)) !!!! writes smooth orography for SLEVE coordinate in netcdf YRECFM = 'ZS ' CALL FMREAD(COUTFMFILE,YRECFM,CLUOUT0,'XY',ZZS,IGRID,ILENCH,YCOMMENT,IRESP) @@ -277,6 +282,28 @@ CALL WRITE_PGD_SURF_ATM_n('MESONH') !* 4. Computes and writes smooth orography for SLEVE coordinate ! --------------------------------------------------------- CALL ZSMT_PGD(COUTFMFILE,NZSFILTER,NSLEVE,XSMOOTH_ZS) +IF (.NOT.LCARTESIAN) THEN +!!!! WRITE LAT and LON + CALL GET_DIM_PHYS_ll('B',IIMAX,IJMAX) + ALLOCATE(ZWORK(IIMAX+NHALO*2,IJMAX+NHALO*2)) + ALLOCATE(ZWORK_LAT(IIMAX+2,IJMAX+2)) + ALLOCATE(ZWORK_LON(IIMAX+2,IJMAX+2)) + ZWORK=RESHAPE(XLAT, (/ (IIMAX+NHALO*2),(IJMAX+NHALO*2) /) ) + ZWORK_LAT=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1)) + ZWORK=RESHAPE(XLON, (/ IIMAX+NHALO*2,IJMAX+NHALO*2 /) ) + ZWORK_LON=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1)) + YRECFM='LAT' + YCOMMENT='X_Y_latitude (degree)' + IGRID=1 + ILENCH=LEN(YCOMMENT) + CALL FMWRIT(COUTFMFILE,YRECFM,CLUOUT0,'XY',ZWORK_LAT,IGRID,ILENCH,YCOMMENT,IRESP) + + YRECFM='LON' + YCOMMENT='X_Y_longitude (degree)' + IGRID=1 + ILENCH=LEN(YCOMMENT) + CALL FMWRIT(COUTFMFILE,YRECFM,CLUOUT0,'XY',ZWORK_LON,IGRID,ILENCH,YCOMMENT,IRESP) +END IF #endif ! ! diff --git a/src/MNH/read_exspa.f90 b/src/MNH/read_exspa.f90 index 60ef4d964db1f8a248f7773d862f2f1301f82ee5..ee29d054f2e99e5b2e661992f2dd231c5d7e96a4 100644 --- a/src/MNH/read_exspa.f90 +++ b/src/MNH/read_exspa.f90 @@ -110,6 +110,7 @@ USE MODE_IO_ll USE MODE_POS USE MODE_MODELN_HANDLER ! +USE MODN_CONFIO #ifdef MNH_NCWRIT USE MODN_NCOUT #endif @@ -222,7 +223,10 @@ CALL POSNAM(ILUSPA,'NAM_LUNIT2_SPA',GFOUND,ILUOUT) IF (GFOUND) READ(ILUSPA,NAM_LUNIT2_SPA) CINIFILE_n=CINIFILE CINIFILEPGD_n=CINIFILEPGD -!! +!! +CALL POSNAM(ILUSPA,'NAM_CONFIO',GFOUND,ILUOUT) +IF (GFOUND) READ(ILUSPA,NAM_CONFIO) +CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) #ifdef MNH_NCWRIT CALL POSNAM(ILUSPA,'NAM_NCOUT',GFOUND,ILUOUT) IF (GFOUND) READ(ILUSPA,NAM_NCOUT) diff --git a/src/MNH/spectre.f90 b/src/MNH/spectre.f90 index 7f29c03fb1b9a659ecfb015a0596d8a53bcbdcf1..1e09822c4b77f8c83942e546467d237d90a664e4 100644 --- a/src/MNH/spectre.f90 +++ b/src/MNH/spectre.f90 @@ -39,6 +39,8 @@ USE MODE_FM USE MODI_VERSION ! USE MODN_CONFZ +! +USE MODN_CONFIO ! IMPLICIT NONE ! @@ -154,6 +156,13 @@ IF (GFOUND) THEN PRINT*, ' namelist NAM_CONFZ read' END IF ! +CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND) +IF (GFOUND) THEN + READ(UNIT=ILUNAM,NML=NAM_CONFIO) + PRINT*, ' namelist NAM_CONFIO read' +END IF +CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) +! CALL CLOSE_ll(YNAM) ! CINIFILE = YINIFILE(1) diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90 index 73f29a0a8b5bfc67988243fe5e981f1e1641ad3f..a301f3bfdd5b53954628766f3f5c6b248cb0a969 100644 --- a/src/MNH/write_diachro.f90 +++ b/src/MNH/write_diachro.f90 @@ -237,6 +237,14 @@ ENDIF ! 1er enregistrement TYPE ! YRECFM = ADJUSTL(ADJUSTR(HGROUP)//'.TYPE') + +#if defined(MNH_IOCDF4) + +CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--', & + HTYPE,KGRID(1),ILENCH,YCOMMENT,IRESPDIA) + +#else + ILENG = LEN(HTYPE) ALLOCATE(ITABCHAR(ILENG)) DO J = 1,ILENG @@ -246,6 +254,9 @@ ENDDO CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--', & ITABCHAR,KGRID(1),ILENCH,YCOMMENT,IRESPDIA) DEALLOCATE(ITABCHAR) + +#endif + IF (NVERB>=5) THEN WRITE(ILUOUTDIA,*)' 1st ENREGISTREMENT(',TRIM(YRECFM),'): OK' ENDIF @@ -314,6 +325,13 @@ ENDIF ! 3eme enregistrement TITRE ! YRECFM = ADJUSTL(ADJUSTR(HGROUP)//'.TITRE') +#if defined(MNH_IOCDF4) + +CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--', & + HTITRE(1:IP),KGRID(1),ILENCH,YCOMMENT,IRESPDIA) + +#else + ILE = LEN(HTITRE) ILENG = ILE*IP ALLOCATE(ITABCHAR(ILENG)) @@ -328,6 +346,9 @@ ENDDO CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--', & ITABCHAR,KGRID(1),ILENCH,YCOMMENT,IRESPDIA) DEALLOCATE(ITABCHAR) + +#endif + IF (NVERB>=5) THEN WRITE(ILUOUTDIA,*)' 3rd ENREGISTREMENT(',TRIM(YRECFM),'): OK' ENDIF @@ -335,6 +356,13 @@ ENDIF ! 4eme enregistrement UNITE ! YRECFM = ADJUSTL(ADJUSTR(HGROUP)//'.UNITE') +#if defined(MNH_IOCDF4) + +CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--', & + HUNITE(1:IP),KGRID(1),ILENCH,YCOMMENT,IRESPDIA) + +#else + ILE = LEN(HUNITE) ILENG = ILE*IP ALLOCATE(ITABCHAR(ILENG)) @@ -349,6 +377,9 @@ ENDDO CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--', & ITABCHAR,KGRID(1),ILENCH,YCOMMENT,IRESPDIA) DEALLOCATE(ITABCHAR) + +#endif + IF (NVERB>=5) THEN WRITE(ILUOUTDIA,*)' 4th ENREGISTREMENT(',TRIM(YRECFM),'): OK' ENDIF @@ -356,6 +387,14 @@ ENDIF ! 5eme enregistrement COMMENT ! YRECFM = ADJUSTL(ADJUSTR(HGROUP)//'.COMMENT') + +#if defined(MNH_IOCDF4) + +CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--', & + HCOMMENT(1:IP),KGRID(1),ILENCH,YCOMMENT,IRESPDIA) + +#else + ILE = LEN(HCOMMENT) ILENG = ILE*IP ALLOCATE(ITABCHAR(ILENG)) @@ -370,6 +409,9 @@ ENDDO CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--', & ITABCHAR,KGRID(1),ILENCH,YCOMMENT,IRESPDIA) DEALLOCATE(ITABCHAR) + +#endif + IF (NVERB>=5) THEN WRITE(ILUOUTDIA,*)' 5th ENREGISTREMENT(',TRIM(YRECFM),'): OK' ENDIF diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index 4789204774671eb597db5980d6b8b4b00ae46a3a..bfbb6939736bdcb17b7e4bdcf888d0c9a9a214a6 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -507,6 +507,19 @@ IF (LNETCDF) THEN CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XZZ,IGRID,ILENCH,YCOMMENT,IRESP) END IF #endif +IF (.NOT.LCARTESIAN) THEN + YRECFM='LAT' + YCOMMENT='X_Y_latitude (degree)' + IGRID=1 + ILENCH=LEN(YCOMMENT) + CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XLAT,IGRID,ILENCH,YCOMMENT,IRESP) + + YRECFM='LON' + YCOMMENT='X_Y_longitude (degree)' + IGRID=1 + ILENCH=LEN(YCOMMENT) + CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XLON,IGRID,ILENCH,YCOMMENT,IRESP) +END IF ! YRECFM='ZS' YDIR='XY' diff --git a/src/MNH/xy_to_latlon.f90 b/src/MNH/xy_to_latlon.f90 index 6aa0af691ffd68072a5418febc4629216a9639e9..64fe4a02021353d8aab711a08ae2976c3edcd645 100644 --- a/src/MNH/xy_to_latlon.f90 +++ b/src/MNH/xy_to_latlon.f90 @@ -80,6 +80,8 @@ USE MODE_GRIDPROJ USE MODI_INI_CST USE MODI_READ_HGRID ! +USE MODN_CONFIO +! IMPLICIT NONE ! !* 0.2 Declaration of variables @@ -124,6 +126,8 @@ CALL INITIO_ll() CALL OPEN_ll(UNIT=INAM,FILE='XY2LATLON1.nam',IOSTAT=IRESP,ACTION='READ', & DELIM='QUOTE',MODE=GLOBAL) READ(INAM,NAM_INIFILE) +READ(INAM,NAM_CONFIO) +CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) CALL CLOSE_ll('XY2LATLON1.nam',IOSTAT=IRESP) ! !* 1. Opening of MESONH file diff --git a/src/MNH/zoom_pgd.f90 b/src/MNH/zoom_pgd.f90 index 3a012db94c8c286feb2d9f8ced41fd7953a7366e..a3898c39d13c106c0a318ffc084b1a6cc53c10bb 100644 --- a/src/MNH/zoom_pgd.f90 +++ b/src/MNH/zoom_pgd.f90 @@ -81,6 +81,7 @@ USE MODI_DEALLOC_SURFEX #ifdef MNH_NCWRIT USE MODN_NCOUT #endif +USE MODN_CONFIO ! IMPLICIT NONE ! @@ -145,6 +146,9 @@ IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGDFILE) CALL POSNAM(ILUNAM,'NAM_NCOUT',GFOUND,ILUOUT0) IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_NCOUT) #endif +CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND,ILUOUT0) +IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO) +CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD) ! CALL CLOSE_ll(YNAMELIST,IOSTAT=IRESP) !