diff --git a/build/with_fcm/arch/arch-gnu.fcm b/build/with_fcm/arch/arch-gnu.fcm index 5bbff838443dd508f64e32e7f82c863fa38a2d37..63e0200e1f57dbbf93ba19ca1d9b3462e10919f5 100644 --- a/build/with_fcm/arch/arch-gnu.fcm +++ b/build/with_fcm/arch/arch-gnu.fcm @@ -1,23 +1,23 @@ # Compilation $FCOMPILER = gfortran -$BASE_FFLAGS = -c -fPIC -fdefault-real-8 -fdefault-double-8 -ffree-line-length-none +$BASE_FFLAGS = -c -fPIC -fdefault-real-8 -fdefault-double-8 -ffree-line-length-none -fopenmp -fconvert=swap $PROD_FFLAGS = -O3 $DEV_FFLAGS = -O1 -$DEBUG_FFLAGS = -check bounds +$DEBUG_FFLAGS = -fbounds-check $CCOMPILER = gcc -$BASE_CFLAGS = -c -fPIC +$BASE_CFLAGS = -c -fPIC -fopenmp $PROD_CFLAGS = -O3 $DEV_CFLAGS = -O1 -$DEBUG_CFLAGS = -check bounds +$DEBUG_CFLAGS = -fbounds-check $OMP_FFLAGS = # Preprocessor -$FPP_FLAGS = LINUX REPRO48 -$CPP_FLAGS = LINUX +$FPP_FLAGS = LINUX LITTLE_ENDIAN LITTLE REPRO48 +$CPP_FLAGS = LINUX LITTLE_ENDIAN LITTLE # Linker $LINK = gfortran -$BASE_LD = -fPIC -fdefault-real-8 -fdefault-double-8 +$BASE_LD = -fPIC -fdefault-real-8 -fdefault-double-8 -fopenmp $OMP_LD = $LD_EXE_TO_SHARED = -shared diff --git a/build/with_fcm/fcm-make.cfg b/build/with_fcm/fcm-make.cfg index b909baed3e89f53fa1fdeb9267a19ee9df101554..ec0b1d1c141a62c1059c939bb623ae2a71b97a75 100644 --- a/build/with_fcm/fcm-make.cfg +++ b/build/with_fcm/fcm-make.cfg @@ -25,41 +25,46 @@ build.prop{ld} = $LINK build.prop{ar} = $AR ################################################################################################ -# 3 - TARGET +# 3 - TARGETS -############################# -# 3.1 Target definition to build a static lib -#build.target = libphyex.a -#build.target-rename = libo.a:libphyex.a - -############################# -# 3.2 Target definition to build a static lib +#Target definition to build the testprogs programs and a shared lib #We need a shared library (.so) but this cannot be build directly with fcm #The FCM support team says: "FCM doesn’t support building shared libraries." #We use a dummy program to force fcm to use the linker and we add the needed flags #to build a shared library instead of a program -# 3.2.a target is the dummy program but linking is hacked and result is renamed -build.target = libphyex.so +############################# +# 3.1 All programs are built +build.target{task} = link +build.prop{fc.flags-ld} = $LD_FLAGS + +############################# +# 3.2 Special options for specific progam + +# 3.2.a Special treatment for the shared lib +#target is the dummy program but linking is hacked and result is renamed build.target-rename = dummyprog.exe:libphyex.so -build.prop{fc.flags-ld} = $LD_FLAGS $LD_EXE_TO_SHARED +build.prop{fc.flags-ld}[libphyex.so] = $LD_FLAGS $LD_EXE_TO_SHARED +build.prop{dep.o.special}[dummyprog] = $ENTRYPOINTS + +# 3.2.b Special treatment for the testprogs +build.prop{fc.defs}[testprogs] = $FPP_FLAGS WITHOUT_CXXDEMANGLE USE_OPENMP -# 3.2.b dependencies (internal and external) +############################# +# 3.3 dependencies (internal and external) $util = util1 util2 util3 util4 util5 util6 util7 util8 util9 util10 util11 util12 util13 util14 util15 util16 $mpi = mpi2 mpi3 mpi4 mpi5 mpi6 mpi7 mpi8 mpi9 mpi10 mpi11 mpi12 mpi13 mpi14 mpi15 mpi16 mpi17 mpi18 mpi19 $system = system1 system2 system3 system4 system5 system6 system7 system8 system10 system11 system12 system13 system14 build.prop{ns-dep.o} = common parkind drhook $util $mpi oml mpl gstats1 $system build.prop{fc.libs} = $LIBS -# 3.2.c shared lib entry points -build.prop{dep.o.special} = $ENTRYPOINTS - ################################################################################################ # 4 - SOURCES ############################# -# 4.1 Dummy programm to force linking +# 4.1 Programs and dummy programm to force linking build.source[dummyprog] = src/dummyprog.F90 +build.source[testprogs] = src/testprogs ############################# # 4.2 Main directory diff --git a/build/with_fcm/make_fcm.sh b/build/with_fcm/make_fcm.sh index 0b6ed76074544b436dac460655701f0aa1fab1e3..df2d7cd9efab89d42d69d7c86f23aa836e450852 100755 --- a/build/with_fcm/make_fcm.sh +++ b/build/with_fcm/make_fcm.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -e + fcm_version=tags/2021.05.0 fiat_version=1295120464c3905e5edcbb887e4921686653eab8 @@ -55,7 +57,7 @@ function check_install_fcm() { cd fcm rm -f .gitkeep git clone https://github.com/metomi/fcm.git . - git checkout tags/$fcm_version + git checkout $fcm_version touch .gitkeep cd .. echo "...FCM installation done" @@ -182,6 +184,7 @@ cd $builddir mkdir src cd src ln -s ../../../../src/common . +ln -s ../../../../src/testprogs . ln -s ../../fiat/src fiat cat <<EOF > dummyprog.F90 PROGRAM DUMMYPROG diff --git a/src/common/micro/ini_rain_ice.F90 b/src/common/micro/ini_rain_ice.F90 index 85eb2f09357327c31fa63dca37d906c739fe8db9..ecb3b4244c9656d7935438851b83f745d799863d 100644 --- a/src/common/micro/ini_rain_ice.F90 +++ b/src/common/micro/ini_rain_ice.F90 @@ -166,9 +166,12 @@ REAL :: PWETLBDAR_MAX,PWETLBDAH_MAX,PWETLBDAR_MIN,PWETLBDAH_MIN ! REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- -! IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) ! +IF(.NOT.ASSOCIATED(XCEXVT)) CALL RAIN_ICE_DESCR_ASSOCIATE() +IF(.NOT.ASSOCIATED(XFSEDC)) CALL RAIN_ICE_PARAM_ASSOCIATE() +! +! !* 0. FUNCTION STATEMENTS ! ------------------- ! @@ -178,13 +181,27 @@ IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) ! ! ! -IF (ALLOCATED(XRTMIN)) THEN ! In case of nesting microphysics constants of +IF (ASSOCIATED(XRTMIN)) THEN ! In case of nesting microphysics constants of ! MODD_RAIN_ICE_PARAM are computed only once, ! but if INI_RAIN_ICE has been called already ! one must change the XRTMIN size. - DEALLOCATE(XRTMIN) + CALL RAIN_ICE_DESCR_DEALLOCATE() +END IF +! +IF (HCLOUD == 'ICE4') THEN + CALL RAIN_ICE_DESCR_ALLOCATE(7) +ELSE IF (HCLOUD == 'ICE3') THEN + CALL RAIN_ICE_DESCR_ALLOCATE(6) END IF ! +XRTMIN(1) = 1.0E-20 +XRTMIN(2) = 1.0E-20 +XRTMIN(3) = 1.0E-20 +XRTMIN(4) = 1.0E-20 +XRTMIN(5) = 1.0E-15 +XRTMIN(6) = 1.0E-15 +IF (HCLOUD == 'ICE4') XRTMIN(7) = 1.0E-15 +! !------------------------------------------------------------------------------- ! !* 2. CHARACTERISTICS OF THE SPECIES @@ -370,20 +387,6 @@ XLBDAG_MAX = 100000.0 ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) ! -IF (HCLOUD == 'ICE4') THEN - ALLOCATE( XRTMIN(7) ) -ELSE IF (HCLOUD == 'ICE3') THEN - ALLOCATE( XRTMIN(6) ) -END IF -! -XRTMIN(1) = 1.0E-20 -XRTMIN(2) = 1.0E-20 -XRTMIN(3) = 1.0E-20 -XRTMIN(4) = 1.0E-20 -XRTMIN(5) = 1.0E-15 -XRTMIN(6) = 1.0E-15 -IF (HCLOUD == 'ICE4') XRTMIN(7) = 1.0E-15 -! XCONC_SEA=1E8 ! 100/cm3 XCONC_LAND=3E8 ! 300/cm3 XCONC_URBAN=5E8 ! 500/cm3 @@ -545,8 +548,7 @@ IF (GFLAG) THEN WRITE(UNIT=KLUOUT,FMT='(" Crit. ice cont. XCRIAUTI=",E13.6)') XCRIAUTI WRITE(UNIT=KLUOUT,FMT='(" A Coef. for cirrus law XACRIAUTI=",E13.6)')XACRIAUTI WRITE(UNIT=KLUOUT,FMT='(" B Coef. for cirrus law XBCRIAUTI=",E13.6)')XBCRIAUTI - WRITE(UNIT=KLUOUT, & - & FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI + WRITE(UNIT=KLUOUT,FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI END IF ! ! @@ -628,9 +630,9 @@ XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha XGAMINC_BOUND_MAX = 1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/REAL(NGAMINC-1)) ! -IF( .NOT.ALLOCATED(XGAMINC_RIM1) ) ALLOCATE( XGAMINC_RIM1(NGAMINC) ) -IF( .NOT.ALLOCATED(XGAMINC_RIM2) ) ALLOCATE( XGAMINC_RIM2(NGAMINC) ) -IF( .NOT.ALLOCATED(XGAMINC_RIM4) ) ALLOCATE( XGAMINC_RIM4(NGAMINC) ) +IF( .NOT.ASSOCIATED(XGAMINC_RIM1) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM1', NGAMINC) +IF( .NOT.ASSOCIATED(XGAMINC_RIM2) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM2', NGAMINC) +IF( .NOT.ASSOCIATED(XGAMINC_RIM4) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM4', NGAMINC) ! DO J1=1,NGAMINC ZBOUND = XGAMINC_BOUND_MIN*ZRATE**(J1-1) @@ -680,9 +682,9 @@ IND = 50 ! Interval number, collection efficiency and infinite diameter ZESR = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG ! -IF( .NOT.ALLOCATED(XKER_RACCSS) ) ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) ) -IF( .NOT.ALLOCATED(XKER_RACCS ) ) ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) ) -IF( .NOT.ALLOCATED(XKER_SACCRG) ) ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) ) +IF( .NOT.ASSOCIATED(XKER_RACCSS) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RACCSS', NACCLBDAS,NACCLBDAR) +IF( .NOT.ASSOCIATED(XKER_RACCS ) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RACCS', NACCLBDAS,NACCLBDAR) +IF( .NOT.ASSOCIATED(XKER_SACCRG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SACCRG', NACCLBDAR,NACCLBDAS) ! CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & @@ -890,7 +892,7 @@ IND = 50 ! Interval number, collection efficiency and infinite diameter ZEGS = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_SDRYG ! -IF( .NOT.ALLOCATED(XKER_SDRYG) ) ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +IF( .NOT.ASSOCIATED(XKER_SDRYG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SDRYG', NDRYLBDAG,NDRYLBDAS) ! CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & @@ -956,7 +958,7 @@ IND = 50 ! Number of interval used to integrate the dimensional ZEGR = 1.0 ! distributions when computing the kernel XKER_RDRYG ZFDINFTY = 20.0 ! -IF( .NOT.ALLOCATED(XKER_RDRYG) ) ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +IF( .NOT.ASSOCIATED(XKER_RDRYG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RDRYG', NDRYLBDAG,NDRYLBDAR) ! CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & @@ -1094,7 +1096,7 @@ IND = 50 ! Interval number, collection efficiency and infinite diameter ZEHS = 1.0 ! factor used to integrate the dimensional distributions when ZFDINFTY = 20.0 ! computing the kernels XKER_SWETH ! -IF( .NOT.ALLOCATED(XKER_SWETH) ) ALLOCATE( XKER_SWETH(NWETLBDAH,NWETLBDAS) ) +IF( .NOT.ASSOCIATED(XKER_SWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SWETH', NWETLBDAH,NWETLBDAS) ! CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & @@ -1160,7 +1162,7 @@ IND = 50 ! Number of interval used to integrate the dimensional ZEHG = 1.0 ! distributions when computing the kernel XKER_GWETH ZFDINFTY = 20.0 ! -IF( .NOT.ALLOCATED(XKER_GWETH) ) ALLOCATE( XKER_GWETH(NWETLBDAH,NWETLBDAG) ) +IF( .NOT.ASSOCIATED(XKER_GWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_GWETH', NWETLBDAH,NWETLBDAG) ! CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & @@ -1226,7 +1228,7 @@ IND = 50 ! Number of interval used to integrate the dimensional ZEHR = 1.0 ! distributions when computing the kernel XKER_RWETH ZFDINFTY = 20.0 ! -IF( .NOT.ALLOCATED(XKER_RWETH) ) ALLOCATE( XKER_RWETH(NWETLBDAH,NWETLBDAR) ) +IF( .NOT.ASSOCIATED(XKER_RWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RWETH', NWETLBDAH,NWETLBDAR) ! CALL READ_XKER_RWETH (KWETLBDAH,KWETLBDAR,KND, & PALPHAH,PNUH,PALPHAR,PNUR,PEHR,PBR,PCH,PDH,PCR,PDR, & diff --git a/src/common/micro/rain_ice.F90 b/src/common/micro/rain_ice.F90 index 3e4f608a375fc61b3197ab391677a2822fde66e4..6ffbe59f82850016314b9cd21b713137a2c8f2a7 100644 --- a/src/common/micro/rain_ice.F90 +++ b/src/common/micro/rain_ice.F90 @@ -680,7 +680,7 @@ ENDIF ! optimization by looking for locations where ! the microphysical fields are larger than a minimal value only !!! ! -IF (KSIZE /= COUNT(ODMICRO)) THEN +IF (KSIZE /= COUNT(ODMICRO(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE))) THEN CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'RAIN_ICE : KSIZE /= COUNT(ODMICRO)') ENDIF diff --git a/src/mesonh/micro/ini_rain_ice.f90 b/src/mesonh/micro/ini_rain_ice.f90 index 4e9c50f03ca7056561c18ef31e3eda8bf0eb5cd8..18b47a203ed33c8745e2ac8d4ef6f4d6ffbdef26 100644 --- a/src/mesonh/micro/ini_rain_ice.f90 +++ b/src/mesonh/micro/ini_rain_ice.f90 @@ -178,7 +178,6 @@ IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) ! IF(.NOT.ASSOCIATED(XCEXVT)) CALL RAIN_ICE_DESCR_ASSOCIATE() IF(.NOT.ASSOCIATED(XFSEDC)) CALL RAIN_ICE_PARAM_ASSOCIATE() - ! ! !* 0. FUNCTION STATEMENTS @@ -578,8 +577,7 @@ IF (GFLAG) THEN WRITE(UNIT=KLUOUT,FMT='(" Crit. ice cont. XCRIAUTI=",E13.6)') XCRIAUTI WRITE(UNIT=KLUOUT,FMT='(" A Coef. for cirrus law XACRIAUTI=",E13.6)')XACRIAUTI WRITE(UNIT=KLUOUT,FMT='(" B Coef. for cirrus law XBCRIAUTI=",E13.6)')XBCRIAUTI - WRITE(UNIT=KLUOUT, & - & FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI + WRITE(UNIT=KLUOUT,FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI END IF ! ! diff --git a/src/testprogs/ice_adjust/getdata_ice_adjust_mod.F90 b/src/testprogs/ice_adjust/getdata_ice_adjust_mod.F90 new file mode 100644 index 0000000000000000000000000000000000000000..1fb0a4a02b8fa38b5c6f656665c38fe7a8dcbe13 --- /dev/null +++ b/src/testprogs/ice_adjust/getdata_ice_adjust_mod.F90 @@ -0,0 +1,580 @@ +MODULE GETDATA_ICE_ADJUST_MOD + +USE OMP_LIB + +INTERFACE REPLICATE + MODULE PROCEDURE REPLICATE3 + MODULE PROCEDURE REPLICATE4 +END INTERFACE + +INTERFACE NPROMIZE + MODULE PROCEDURE NPROMIZE4 + MODULE PROCEDURE NPROMIZE5 +END INTERFACE + +INTERFACE INTERPOLATE + MODULE PROCEDURE INTERPOLATE4 + MODULE PROCEDURE INTERPOLATE5 +END INTERFACE + +INTERFACE SET + MODULE PROCEDURE SET3 + MODULE PROCEDURE SET4 + MODULE PROCEDURE SET5 +END INTERFACE + +CONTAINS + +SUBROUTINE GETDATA_ICE_ADJUST (NPROMA, NGPBLKS, NFLEVG, PRHODJ_B, PEXNREF_B, PRHODREF_B, PPABSM_B, PTHT_B, ZICE_CLD_WGT_B, & +& ZSIGQSAT_B, PSIGS_B, PMFCONV_B, PRC_MF_B, PRI_MF_B, PCF_MF_B, PTHS_B, PRS_B, PSRCS_B, PCLDFR_B, PHLC_HRC_B, PHLC_HCF_B, & +& PHLI_HRI_B, PHLI_HCF_B, ZRS_B, ZZZ_B, PRS_OUT_B, PSRCS_OUT_B, PCLDFR_OUT_B, PHLC_HRC_OUT_B, PHLC_HCF_OUT_B, & +& PHLI_HRI_OUT_B, PHLI_HCF_OUT_B, LDVERBOSE) + +USE IEEE_ARITHMETIC, ONLY : IEEE_SIGNALING_NAN, IEEE_VALUE + +IMPLICIT NONE + +INTEGER, PARAMETER :: IFILE = 77 + +INTEGER :: KLON +INTEGER :: KIDIA +INTEGER :: KFDIA +INTEGER :: KLEV +INTEGER :: KRR +INTEGER :: KDUM + +LOGICAL :: LDVERBOSE + +REAL, ALLOCATABLE :: PRHODJ_B (:,:,:,:) +REAL, ALLOCATABLE :: PEXNREF_B (:,:,:,:) +REAL, ALLOCATABLE :: PRHODREF_B (:,:,:,:) +REAL, ALLOCATABLE :: PPABSM_B (:,:,:,:) +REAL, ALLOCATABLE :: PTHT_B (:,:,:,:) +REAL, ALLOCATABLE :: ZICE_CLD_WGT_B (:,:,:) +REAL, ALLOCATABLE :: ZSIGQSAT_B (:,:,:) +REAL, ALLOCATABLE :: PSIGS_B (:,:,:,:) +REAL, ALLOCATABLE :: PMFCONV_B (:,:,:,:) +REAL, ALLOCATABLE :: PRC_MF_B (:,:,:,:) +REAL, ALLOCATABLE :: PRI_MF_B (:,:,:,:) +REAL, ALLOCATABLE :: PCF_MF_B (:,:,:,:) +REAL, ALLOCATABLE :: PTHS_B (:,:,:,:) +REAL, ALLOCATABLE :: PRS_B (:,:,:,:,:) +REAL, ALLOCATABLE :: PRS_OUT_B (:,:,:,:,:) +REAL, ALLOCATABLE :: PSRCS_B (:,:,:,:) +REAL, ALLOCATABLE :: PSRCS_OUT_B (:,:,:,:) +REAL, ALLOCATABLE :: PCLDFR_B (:,:,:,:) +REAL, ALLOCATABLE :: PCLDFR_OUT_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HRC_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HRC_OUT_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HCF_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HCF_OUT_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HRI_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HRI_OUT_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HCF_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HCF_OUT_B (:,:,:,:) +REAL, ALLOCATABLE :: ZRS_B (:,:,:,:,:) +REAL, ALLOCATABLE :: ZZZ_B (:,:,:,:) + +REAL, ALLOCATABLE :: PRHODJ (:,:,:,:) +REAL, ALLOCATABLE :: PEXNREF (:,:,:,:) +REAL, ALLOCATABLE :: PRHODREF (:,:,:,:) +REAL, ALLOCATABLE :: PPABSM (:,:,:,:) +REAL, ALLOCATABLE :: PTHT (:,:,:,:) +REAL, ALLOCATABLE :: PSIGS (:,:,:,:) +REAL, ALLOCATABLE :: PMFCONV (:,:,:,:) +REAL, ALLOCATABLE :: PRC_MF (:,:,:,:) +REAL, ALLOCATABLE :: PRI_MF (:,:,:,:) +REAL, ALLOCATABLE :: PCF_MF (:,:,:,:) +REAL, ALLOCATABLE :: PTHS (:,:,:,:) +REAL, ALLOCATABLE :: PRS (:,:,:,:,:) +REAL, ALLOCATABLE :: PRS_OUT (:,:,:,:,:) +REAL, ALLOCATABLE :: PSRCS_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PCLDFR_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HRC_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HCF_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HRI_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HCF_OUT (:,:,:,:) +REAL, ALLOCATABLE :: ZRS (:,:,:,:,:) +REAL, ALLOCATABLE :: ZZZ (:,:,:,:) + +INTEGER :: NGPTOT, NPROMA, NGPBLKS, NFLEVG +INTEGER :: IOFF, IBL +LOGICAL :: LLEXIST +CHARACTER(LEN=32) :: CLFILE +REAL :: ZNAN + +KRR=6 +NGPTOT = NPROMA * NGPBLKS + +IBL = 1 +WRITE (CLFILE, '("data/",I8.8,".dat")') IBL +OPEN (IFILE, FILE=TRIM (CLFILE), FORM='UNFORMATTED') +READ (IFILE) KLON, KDUM, KLEV +CLOSE (IFILE) + +IF (NFLEVG < 0) NFLEVG = KLEV + +ALLOCATE (ZSIGQSAT_B (NPROMA,1,NGPBLKS)) +ALLOCATE (ZICE_CLD_WGT_B (NPROMA,1,NGPBLKS)) +ALLOCATE (PSRCS_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PCLDFR_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLC_HRC_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLC_HCF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLI_HRI_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLI_HCF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PRHODJ_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PEXNREF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PRHODREF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PPABSM_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PTHT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PSIGS_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PMFCONV_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PRC_MF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PRI_MF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PCF_MF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PTHS_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PRS_B (NPROMA,1,NFLEVG,KRR,NGPBLKS)) +ALLOCATE (PRS_OUT_B (NPROMA,1,NFLEVG,KRR,NGPBLKS)) +ALLOCATE (PSRCS_OUT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PCLDFR_OUT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (ZRS_B (NPROMA,1,NFLEVG,0:KRR,NGPBLKS)) +ALLOCATE (ZZZ_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLC_HRC_OUT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLC_HCF_OUT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLI_HRI_OUT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLI_HCF_OUT_B (NPROMA,1,NFLEVG,NGPBLKS)) + +ZNAN = IEEE_VALUE (ZNAN, IEEE_SIGNALING_NAN) + + +CALL SET (ZSIGQSAT_B ) +CALL SET (ZICE_CLD_WGT_B) +CALL SET (PSRCS_B ) +CALL SET (PCLDFR_B ) +CALL SET (PHLC_HRC_B ) +CALL SET (PHLC_HCF_B ) +CALL SET (PHLI_HRI_B ) +CALL SET (PHLI_HCF_B ) +CALL SET (PRHODJ_B ) +CALL SET (PEXNREF_B ) +CALL SET (PRHODREF_B ) +CALL SET (PPABSM_B ) +CALL SET (PTHT_B ) +CALL SET (PSIGS_B ) +CALL SET (PMFCONV_B ) +CALL SET (PRC_MF_B ) +CALL SET (PRI_MF_B ) +CALL SET (PCF_MF_B ) +CALL SET (PTHS_B ) +CALL SET (PRS_B ) +CALL SET (PRS_OUT_B ) +CALL SET (PSRCS_OUT_B ) +CALL SET (PCLDFR_OUT_B ) +CALL SET (ZRS_B ) +CALL SET (ZZZ_B ) +CALL SET (PHLC_HRC_OUT_B) +CALL SET (PHLC_HCF_OUT_B) +CALL SET (PHLI_HRI_OUT_B) +CALL SET (PHLI_HCF_OUT_B) + + + +ZSIGQSAT_B = 2.0000000000000000E-002 +ZICE_CLD_WGT_B = 1.5 +PSRCS_B = ZNAN +PCLDFR_B = ZNAN +PHLI_HCF_B = ZNAN +PHLI_HRI_B = ZNAN +PHLC_HCF_B = ZNAN +PHLC_HRC_B = ZNAN + + +IOFF = 0 +IBL = 0 +LLEXIST = .TRUE. + +DO WHILE(LLEXIST) + IBL = IBL + 1 + WRITE (CLFILE, '("data/",I8.8,".dat")') IBL + + INQUIRE (FILE=TRIM (CLFILE), EXIST=LLEXIST) + + IF (LDVERBOSE) PRINT *, TRIM (CLFILE) + + IF (.NOT. LLEXIST) EXIT + + OPEN (IFILE, FILE=TRIM (CLFILE), FORM='UNFORMATTED') + + READ (IFILE) KLON, KDUM, KLEV + + IF (IBL == 1) THEN + ALLOCATE (PRHODJ (NGPTOT,1,KLEV,1)) + ALLOCATE (PEXNREF (NGPTOT,1,KLEV,1)) + ALLOCATE (PRHODREF (NGPTOT,1,KLEV,1)) + ALLOCATE (PPABSM (NGPTOT,1,KLEV,1)) + ALLOCATE (PTHT (NGPTOT,1,KLEV,1)) + ALLOCATE (PSIGS (NGPTOT,1,KLEV,1)) + ALLOCATE (PMFCONV (NGPTOT,1,KLEV,1)) + ALLOCATE (PRC_MF (NGPTOT,1,KLEV,1)) + ALLOCATE (PRI_MF (NGPTOT,1,KLEV,1)) + ALLOCATE (PCF_MF (NGPTOT,1,KLEV,1)) + ALLOCATE (PTHS (NGPTOT,1,KLEV,1)) + ALLOCATE (PRS (NGPTOT,1,KLEV,KRR,1)) + ALLOCATE (PRS_OUT (NGPTOT,1,KLEV,KRR,1)) + ALLOCATE (PSRCS_OUT (NGPTOT,1,KLEV,1)) + ALLOCATE (PCLDFR_OUT (NGPTOT,1,KLEV,1)) + ALLOCATE (ZRS (NGPTOT,1,KLEV,0:KRR,1)) + ALLOCATE (ZZZ (NGPTOT,1,KLEV,1)) + ALLOCATE (PHLC_HRC_OUT (NGPTOT,1,KLEV,1)) + ALLOCATE (PHLC_HCF_OUT (NGPTOT,1,KLEV,1)) + ALLOCATE (PHLI_HRI_OUT (NGPTOT,1,KLEV,1)) + ALLOCATE (PHLI_HCF_OUT (NGPTOT,1,KLEV,1)) + ENDIF + + IF (IOFF+KLON > NGPTOT) THEN + EXIT + ENDIF + + READ (IFILE) PRHODJ (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PEXNREF (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PRHODREF (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PSIGS (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PMFCONV (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PPABSM (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) ZZZ (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PCF_MF (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PRC_MF (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PRI_MF (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) ZRS (IOFF+1:IOFF+KLON,:,:,:,1) + READ (IFILE) PRS (IOFF+1:IOFF+KLON,:,:,:,1) + READ (IFILE) PTHS (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PRS_OUT (IOFF+1:IOFF+KLON,:,:,:,1) + READ (IFILE) PSRCS_OUT (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PCLDFR_OUT (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PHLC_HRC_OUT (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PHLC_HCF_OUT (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PHLI_HRI_OUT (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PHLI_HCF_OUT (IOFF+1:IOFF+KLON,:,:,1) + + CLOSE (IFILE) + + IOFF = IOFF + KLON + +ENDDO + +IF (NFLEVG /= KLEV) THEN + CALL INTERPOLATE (NFLEVG, IOFF, PRHODJ ) + CALL INTERPOLATE (NFLEVG, IOFF, PEXNREF ) + CALL INTERPOLATE (NFLEVG, IOFF, PRHODREF ) + CALL INTERPOLATE (NFLEVG, IOFF, PSIGS ) + CALL INTERPOLATE (NFLEVG, IOFF, PMFCONV ) + CALL INTERPOLATE (NFLEVG, IOFF, PPABSM ) + CALL INTERPOLATE (NFLEVG, IOFF, ZZZ ) + CALL INTERPOLATE (NFLEVG, IOFF, PCF_MF ) + CALL INTERPOLATE (NFLEVG, IOFF, PRC_MF ) + CALL INTERPOLATE (NFLEVG, IOFF, PRI_MF ) + CALL INTERPOLATE (NFLEVG, IOFF, ZRS ) + CALL INTERPOLATE (NFLEVG, IOFF, PRS ) + CALL INTERPOLATE (NFLEVG, IOFF, PTHS ) + CALL INTERPOLATE (NFLEVG, IOFF, PRS_OUT ) + CALL INTERPOLATE (NFLEVG, IOFF, PSRCS_OUT ) + CALL INTERPOLATE (NFLEVG, IOFF, PCLDFR_OUT ) + CALL INTERPOLATE (NFLEVG, IOFF, PHLC_HRC_OUT) + CALL INTERPOLATE (NFLEVG, IOFF, PHLC_HCF_OUT) + CALL INTERPOLATE (NFLEVG, IOFF, PHLI_HRI_OUT) + CALL INTERPOLATE (NFLEVG, IOFF, PHLI_HCF_OUT) +ENDIF + +CALL REPLICATE (IOFF, PRHODJ (:, :, :, 1)) +CALL REPLICATE (IOFF, PEXNREF (:, :, :, 1)) +CALL REPLICATE (IOFF, PRHODREF (:, :, :, 1)) +CALL REPLICATE (IOFF, PSIGS (:, :, :, 1)) +CALL REPLICATE (IOFF, PMFCONV (:, :, :, 1)) +CALL REPLICATE (IOFF, PPABSM (:, :, :, 1)) +CALL REPLICATE (IOFF, ZZZ (:, :, :, 1)) +CALL REPLICATE (IOFF, PCF_MF (:, :, :, 1)) +CALL REPLICATE (IOFF, PRC_MF (:, :, :, 1)) +CALL REPLICATE (IOFF, PRI_MF (:, :, :, 1)) +CALL REPLICATE (IOFF, ZRS (:, :, :, :, 1)) +CALL REPLICATE (IOFF, PRS (:, :, :, :, 1)) +CALL REPLICATE (IOFF, PTHS (:, :, :, 1)) +CALL REPLICATE (IOFF, PRS_OUT (:, :, :, :, 1)) +CALL REPLICATE (IOFF, PSRCS_OUT (:, :, :, 1)) +CALL REPLICATE (IOFF, PCLDFR_OUT (:, :, :, 1)) +CALL REPLICATE (IOFF, PHLC_HRC_OUT (:, :, :, 1)) +CALL REPLICATE (IOFF, PHLC_HCF_OUT (:, :, :, 1)) +CALL REPLICATE (IOFF, PHLI_HRI_OUT (:, :, :, 1)) +CALL REPLICATE (IOFF, PHLI_HCF_OUT (:, :, :, 1)) + +CALL NPROMIZE (NPROMA, PRHODJ , PRHODJ_B ) +CALL NPROMIZE (NPROMA, PEXNREF , PEXNREF_B ) +CALL NPROMIZE (NPROMA, PRHODREF , PRHODREF_B ) +CALL NPROMIZE (NPROMA, PSIGS , PSIGS_B ) +CALL NPROMIZE (NPROMA, PMFCONV , PMFCONV_B ) +CALL NPROMIZE (NPROMA, PPABSM , PPABSM_B ) +CALL NPROMIZE (NPROMA, ZZZ , ZZZ_B ) +CALL NPROMIZE (NPROMA, PCF_MF , PCF_MF_B ) +CALL NPROMIZE (NPROMA, PRC_MF , PRC_MF_B ) +CALL NPROMIZE (NPROMA, PRI_MF , PRI_MF_B ) +CALL NPROMIZE (NPROMA, ZRS , ZRS_B ) +CALL NPROMIZE (NPROMA, PRS , PRS_B ) +CALL NPROMIZE (NPROMA, PTHS , PTHS_B ) +CALL NPROMIZE (NPROMA, PRS_OUT , PRS_OUT_B ) +CALL NPROMIZE (NPROMA, PSRCS_OUT , PSRCS_OUT_B ) +CALL NPROMIZE (NPROMA, PCLDFR_OUT , PCLDFR_OUT_B ) +CALL NPROMIZE (NPROMA, PHLC_HRC_OUT, PHLC_HRC_OUT_B ) +CALL NPROMIZE (NPROMA, PHLC_HCF_OUT, PHLC_HCF_OUT_B ) +CALL NPROMIZE (NPROMA, PHLI_HRI_OUT, PHLI_HRI_OUT_B ) +CALL NPROMIZE (NPROMA, PHLI_HCF_OUT, PHLI_HCF_OUT_B ) + +END SUBROUTINE + +SUBROUTINE REPLICATE4 (KOFF, P) + +INTEGER :: KOFF +REAL :: P (:,:,:,:) + +INTEGER :: I, J + +DO I = KOFF+1, SIZE (P, 1) + J = 1 + MODULO (I - 1, KOFF) + P (I, :, :, :) = P (J, :, :, :) +ENDDO + +END SUBROUTINE + +SUBROUTINE REPLICATE3 (KOFF, P) + +INTEGER :: KOFF +REAL :: P (:,:,:) + +INTEGER :: I, J + +DO I = KOFF+1, SIZE (P, 1) + J = 1 + MODULO (I - 1, KOFF) + P (I, :, :) = P (J, :, :) +ENDDO + +END SUBROUTINE + +SUBROUTINE NPROMIZE4 (KPROMA, PI, PO) + +INTEGER :: KPROMA +REAL, INTENT (IN) :: PI (:,:,:,:) +REAL, INTENT (OUT) :: PO (:,:,:,:) + +INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA + +IF (SIZE (PI, 4) /= 1) STOP 1 + +IGPTOT = SIZE (PI, 1) +IGPBLK = 1 + (IGPTOT-1) / KPROMA + +DO IGP = 1, IGPTOT, KPROMA + IBL = 1 + (IGP - 1) / KPROMA + JIDIA = 1 + JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA) + + DO JLON = JIDIA, JFDIA + PO (JLON, :, :, IBL) = PI (IGP + (JLON - 1), :, :, 1) + ENDDO + + DO JLON = JFDIA+1, KPROMA + PO (JLON, :, :, IBL) = PO (JFDIA, :, :, IBL) + ENDDO + +ENDDO + +END SUBROUTINE + +SUBROUTINE NPROMIZE5 (KPROMA, PI, PO) + +INTEGER :: KPROMA +REAL, INTENT (IN) :: PI (:,:,:,:,:) +REAL, INTENT (OUT) :: PO (:,:,:,:,:) + +INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA + +IF (SIZE (PI, 5) /= 1) STOP 1 + +IGPTOT = SIZE (PI, 1) +IGPBLK = 1 + (IGPTOT-1) / KPROMA + +DO IGP = 1, IGPTOT, KPROMA + IBL = 1 + (IGP - 1) / KPROMA + JIDIA = 1 + JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA) + + DO JLON = JIDIA, JFDIA + PO (JLON, :, :, :, IBL) = PI (IGP + (JLON - 1), :, :, :, 1) + ENDDO + + DO JLON = JFDIA+1, KPROMA + PO (JLON, :, :, :, IBL) = PI (JFDIA, :, :, :, IBL) + ENDDO + +ENDDO + +END SUBROUTINE + +SUBROUTINE INTERPOLATE4 (KFLEVG, KOFF, P) + +INTEGER :: KFLEVG, KOFF +REAL, ALLOCATABLE :: P (:,:,:,:) +REAL :: Z (LBOUND (P, 1):UBOUND (P, 1), & + & LBOUND (P, 2):UBOUND (P, 2), & + & LBOUND (P, 3):UBOUND (P, 3), & + & LBOUND (P, 4):UBOUND (P, 4)) +INTEGER :: ILEV1A, ILEV1B, ILEV2, NLEV1, NLEV2 +REAL :: ZWA, ZWB, ZLEV1, ZLEV2 + +Z = P + +NLEV1 = SIZE (P, 3) +NLEV2 = KFLEVG + +DEALLOCATE (P) + +ALLOCATE (P (LBOUND (Z, 1):UBOUND (Z, 1), & + & LBOUND (Z, 2):UBOUND (Z, 2), & + & KFLEVG, & + & LBOUND (Z, 4):UBOUND (Z, 4))) + +DO ILEV2 = 1, NLEV2 + ZLEV2 = REAL (ILEV2 - 1) / REAL (NLEV2 -1) + ZLEV1 = 1. + ZLEV2 * REAL (NLEV1 - 1) + ILEV1B = MIN (CEILING (ZLEV1), NLEV1) + ILEV1A = MAX (FLOOR (ZLEV1), 1) + + IF (ILEV1A == ILEV1B) THEN + ZWA = 1. + ZWB = 0. + ELSE + ZWA = REAL (ILEV1B) - ZLEV1 + ZWB = ZLEV1 - REAL (ILEV1A) + ENDIF + +! WRITE (*, '(" ZLEV2 = ",E12.5," ZLEV1 = ",E12.5," ILEV2 = ",I4," ILEV1A = ",I4," ZWA = ",E12.5," ILEV1B = ",I4," ZWB = ",E12.5)') & +! & ZLEV2, ZLEV1, ILEV2, ILEV1A, ZWA, ILEV1B, ZWB + + P (1:KOFF, :, ILEV2, :) = ZWA * Z (1:KOFF, :, ILEV1A, :) + ZWB * Z (1:KOFF, :, ILEV1B, :) +ENDDO + +END SUBROUTINE + +SUBROUTINE INTERPOLATE5 (KFLEVG, KOFF, P) + +INTEGER :: KFLEVG, KOFF +REAL, ALLOCATABLE :: P (:,:,:,:,:) +REAL :: Z (LBOUND (P, 1):UBOUND (P, 1), & + & LBOUND (P, 2):UBOUND (P, 2), & + & LBOUND (P, 3):UBOUND (P, 3), & + & LBOUND (P, 4):UBOUND (P, 4), & + & LBOUND (P, 5):UBOUND (P, 5)) +INTEGER :: ILEV1A, ILEV1B, ILEV2, NLEV1, NLEV2 +REAL :: ZWA, ZWB, ZLEV1, ZLEV2 + +Z = P + +NLEV1 = SIZE (P, 3) +NLEV2 = KFLEVG + +DEALLOCATE (P) + +ALLOCATE (P (LBOUND (Z, 1):UBOUND (Z, 1), & + & LBOUND (Z, 2):UBOUND (Z, 2), & + & KFLEVG, & + & LBOUND (Z, 4):UBOUND (Z, 4), & + & LBOUND (Z, 5):UBOUND (Z, 5))) + +DO ILEV2 = 1, NLEV2 + ZLEV2 = REAL (ILEV2 - 1) / REAL (NLEV2 -1) + ZLEV1 = 1. + ZLEV2 * REAL (NLEV1 - 1) + ILEV1B = MIN (CEILING (ZLEV1), NLEV1) + ILEV1A = MAX (FLOOR (ZLEV1), 1) + + IF (ILEV1A == ILEV1B) THEN + ZWA = 1. + ZWB = 0. + ELSE + ZWA = REAL (ILEV1B) - ZLEV1 + ZWB = ZLEV1 - REAL (ILEV1A) + ENDIF + +! WRITE (*, '(" ZLEV2 = ",E12.5," ZLEV1 = ",E12.5," ILEV2 = ",I4," ILEV1A = ",I4," ZWA = ",E12.5," ILEV1B = ",I4," ZWB = ",E12.5)') & +! & ZLEV2, ZLEV1, ILEV2, ILEV1A, ZWA, ILEV1B, ZWB + + P (1:KOFF, :, ILEV2, :, :) = ZWA * Z (1:KOFF, :, ILEV1A, :, :) + ZWB * Z (1:KOFF, :, ILEV1B, :, :) +ENDDO + +END SUBROUTINE + +SUBROUTINE SET3 (P) + +REAL :: P (:,:,:) +INTEGER :: IBL, IGPBLKS +INTEGER :: NTID, ITID, JBLK1, JBLK2 + + +IGPBLKS = SIZE (P, 3) + +!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID) +NTID = OMP_GET_MAX_THREADS () +ITID = OMP_GET_THREAD_NUM () +JBLK1 = 1 + (IGPBLKS * (ITID+0)) / NTID +JBLK2 = (IGPBLKS * (ITID+1)) / NTID + +DO IBL = JBLK1, JBLK2 + P (:,:,IBL) = ZNAN +ENDDO + +!$OMP END PARALLEL + +END SUBROUTINE + +SUBROUTINE SET4 (P) + +REAL :: P (:,:,:,:) +INTEGER :: IBL, IGPBLKS +INTEGER :: NTID, ITID, JBLK1, JBLK2 + +IGPBLKS = SIZE (P, 4) + +!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID) +NTID = OMP_GET_MAX_THREADS () +ITID = OMP_GET_THREAD_NUM () +JBLK1 = 1 + (IGPBLKS * (ITID+0)) / NTID +JBLK2 = (IGPBLKS * (ITID+1)) / NTID + +DO IBL = JBLK1, JBLK2 + P (:,:,:,IBL) = ZNAN +ENDDO + +!$OMP END PARALLEL + +END SUBROUTINE + +SUBROUTINE SET5 (P) + +REAL :: P (:,:,:,:,:) +INTEGER :: IBL, IGPBLKS +INTEGER :: NTID, ITID, JBLK1, JBLK2 + +IGPBLKS = SIZE (P, 5) + +!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID) +NTID = OMP_GET_MAX_THREADS () +ITID = OMP_GET_THREAD_NUM () +JBLK1 = 1 + (IGPBLKS * (ITID+0)) / NTID +JBLK2 = (IGPBLKS * (ITID+1)) / NTID + +DO IBL = JBLK1, JBLK2 + P (:,:,:,:,IBL) = ZNAN +ENDDO + +!$OMP END PARALLEL + +END SUBROUTINE + + +END MODULE diff --git a/src/testprogs/ice_adjust/main_ice_adjust.F90 b/src/testprogs/ice_adjust/main_ice_adjust.F90 new file mode 100644 index 0000000000000000000000000000000000000000..02ab5c6efb1cafa34cf2642f830d35afe00bd490 --- /dev/null +++ b/src/testprogs/ice_adjust/main_ice_adjust.F90 @@ -0,0 +1,367 @@ +PROGRAM MAIN_ICE_ADJUST + +USE XRD_GETOPTIONS +USE GETDATA_ICE_ADJUST_MOD +USE MODI_ICE_ADJUST +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_CST, ONLY: CST_t, CST +USE MODD_NEB, ONLY: NEB_t, NEB +USE MODD_RAIN_ICE_PARAM, ONLY : RAIN_ICE_PARAM_t +USE MODI_INI_CST +USE MODI_INI_NEB +USE MODD_BUDGET, ONLY: TBUDGETDATA, NBUDGET_RI, TBUCONF +USE STACK_MOD +USE OMP_LIB +USE YOMHOOK, ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY : JPRB, JPIM + + +IMPLICIT NONE + +INTEGER :: KLON +INTEGER :: KLEV +INTEGER :: KRR + +REAL, ALLOCATABLE :: PRHODJ (:,:,:,:) +REAL, ALLOCATABLE :: PEXNREF (:,:,:,:) +REAL, ALLOCATABLE :: PRHODREF (:,:,:,:) +REAL, ALLOCATABLE :: PPABSM (:,:,:,:) +REAL, ALLOCATABLE :: PTHT (:,:,:,:) +REAL, ALLOCATABLE :: PSIGS (:,:,:,:) +REAL, ALLOCATABLE :: PMFCONV (:,:,:,:) +REAL, ALLOCATABLE :: PRC_MF (:,:,:,:) +REAL, ALLOCATABLE :: PRI_MF (:,:,:,:) +REAL, ALLOCATABLE :: PCF_MF (:,:,:,:) +REAL, ALLOCATABLE :: PTHS (:,:,:,:) +REAL, ALLOCATABLE :: PRS (:,:,:,:,:) +REAL, ALLOCATABLE :: PSRCS (:,:,:,:) +REAL, ALLOCATABLE :: PCLDFR (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HRC (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HCF (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HRI (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HCF (:,:,:,:) +REAL, ALLOCATABLE :: ZRS (:,:,:,:,:) +REAL, ALLOCATABLE :: ZZZ (:,:,:,:) +REAL, ALLOCATABLE :: ZSIGQSAT (:,:,:) +REAL, ALLOCATABLE :: ZICE_CLD_WGT (:,:,:) + +REAL, ALLOCATABLE :: PRS_OUT (:,:,:,:,:) +REAL, ALLOCATABLE :: PSRCS_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PCLDFR_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HRC_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HCF_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HRI_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HCF_OUT (:,:,:,:) + +INTEGER :: NPROMA, NGPBLKS, NFLEVG +INTEGER :: IBL, JLON, JLEV + +TYPE(DIMPHYEX_t) :: D, D0 +TYPE(RAIN_ICE_PARAM_t) :: ICEP +CHARACTER(LEN=1) :: HFRAC_ICE +CHARACTER(LEN=80) :: HCONDENS +CHARACTER(LEN=4) :: HLAMBDA3 +CHARACTER(LEN=4) :: HBUNAME +LOGICAL :: OSUBG_COND +LOGICAL :: OSIGMAS +LOGICAL :: OCND2 +LOGICAL :: LMFCONV +CHARACTER(LEN=80) :: HSUBG_MF_PDF +REAL :: PTSTEP +TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RI) :: YLBUDGET +LOGICAL :: LLCHECK +LOGICAL :: LLCHECKDIFF +LOGICAL :: LLDIFF +INTEGER :: IBLOCK1, IBLOCK2 +INTEGER :: ISTSZ, JBLK1, JBLK2 +INTEGER :: NTID, ITID +INTEGER :: JRR + +REAL, ALLOCATABLE :: PSTACK(:,:) +TYPE (STACK) :: YLSTACK + +REAL(KIND=8) :: TS,TE +REAL(KIND=8) :: TSC, TEC, TSD, TED, ZTC, ZTD +INTEGER :: ITIME, NTIME +INTEGER :: IRANK, ISIZE +LOGICAL :: LLVERBOSE, LLSTAT, LLBIND +REAL (KIND=JPRB) :: ZHOOK_HANDLE + +CALL INITOPTIONS () +NGPBLKS = 296 +CALL GETOPTION ("--blocks", NGPBLKS) +NPROMA = 32 +CALL GETOPTION ("--nproma", NPROMA) +NFLEVG = -1 +CALL GETOPTION ("--nflevg", NFLEVG) +CALL GETOPTION ("--check", LLCHECK) +CALL GETOPTION ("--checkdiff", LLCHECKDIFF) +IBLOCK1 = 1 +CALL GETOPTION ("--check-block-1", IBLOCK1) +IBLOCK2 = NGPBLKS +CALL GETOPTION ("--check-block-2", IBLOCK2) +CALL GETOPTION ("--stat", LLSTAT) +NTIME = 1 +CALL GETOPTION ("--times", NTIME) +CALL GETOPTION ("--verbose", LLVERBOSE) +CALL GETOPTION ("--bind", LLBIND) +CALL CHECKOPTIONS () + +LLDIFF = .FALSE. + +IRANK = 0 +ISIZE = 1 +IF (LLBIND) THEN + CALL LINUX_BIND (IRANK, ISIZE) + CALL LINUX_BIND_DUMP (IRANK, ISIZE) +ENDIF + +CALL GETDATA_ICE_ADJUST (NPROMA, NGPBLKS, NFLEVG, PRHODJ, PEXNREF, PRHODREF, PPABSM, PTHT, ZICE_CLD_WGT, & +& ZSIGQSAT, PSIGS, PMFCONV, PRC_MF, PRI_MF, PCF_MF, PTHS, PRS, PSRCS, PCLDFR, PHLC_HRC, PHLC_HCF, & +& PHLI_HRI, PHLI_HCF, ZRS, ZZZ, PRS_OUT, PSRCS_OUT, PCLDFR_OUT, PHLC_HRC_OUT, PHLC_HCF_OUT, & +& PHLI_HRI_OUT, PHLI_HCF_OUT, LLVERBOSE) + + +KLEV = SIZE (PRS, 3) +KRR = SIZE (PRS, 4) + +IF (LLVERBOSE) PRINT *, " KLEV = ", KLEV, " KRR = ", KRR + +PRINT *, " NPROMA = ", NPROMA, " KLEV = ", KLEV, " NGPBLKS = ", NGPBLKS + +CALL INI_CST +CALL INI_NEB + +! Taken from ini_rain_ice.F90; we only need these for ice_adjust.F90 +ICEP%XCRIAUTI = 0.2E-4 +ICEP%XCRIAUTC = 0.5E-3 +ICEP%XACRIAUTI = 0.06 +ICEP%XBCRIAUTI = -3.5 + +! As provided by S. Riette, AROME specific + +ICEP%XCRIAUTC = 1.0000000000000000E-003 +ICEP%XCRIAUTI = 2.0000000000000001E-004 +ICEP%XACRIAUTI = 6.2974856647312144E-002 +ICEP%XBCRIAUTI = -3.3840957210994582 + + +HFRAC_ICE = 'S' +HCONDENS = 'CB02' +HLAMBDA3 = 'CB' +HBUNAME = 'DEPI' +OSUBG_COND = .TRUE. +OSIGMAS = .TRUE. +OCND2 = .FALSE. +HSUBG_MF_PDF = 'TRIANGLE' +PTSTEP = 50.000000000000000 +LMFCONV = .TRUE. +DO JRR=1, NBUDGET_RI + YLBUDGET(JRR)%NBUDGET=JRR +ENDDO + +D0%NIT = NPROMA +D0%NIB = 1 +D0%NIE = NPROMA +D0%NJT = 1 +D0%NJB = 1 +D0%NJE = 1 +D0%NKL = -1 +D0%NKT = KLEV +D0%NKA = KLEV +D0%NKU = 1 +D0%NKB = KLEV +D0%NKE = 1 +D0%NKTB = 1 +D0%NKTE = KLEV + +ISTSZ = NPROMA * 20 * KLEV +ALLOCATE (PSTACK (ISTSZ, NGPBLKS)) + +TS = OMP_GET_WTIME () + +ZTD = 0. +ZTC = 0. + +IF (LHOOK) CALL DR_HOOK ('MAIN',0,ZHOOK_HANDLE) + +DO ITIME = 1, NTIME + + TSD = OMP_GET_WTIME () + +!$acc data & +!$acc & copyin (D0, CST, ICEP, NEB, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3, HBUNAME, OSUBG_COND, OSIGMAS, OCND2, HSUBG_MF_PDF, PTSTEP, LMFCONV, & +!$acc & ZSIGQSAT, PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABSM, ZZZ, PCF_MF, PRC_MF, PRI_MF, ZRS, ZICE_CLD_WGT) & +!$acc & copy (PRS, PTHS), & +!$acc & copyout (PSRCS, PCLDFR, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF) & +!$acc & create (PSTACK) + + TSC = OMP_GET_WTIME () + +#ifdef USE_OPENMP +!$OMP PARALLEL PRIVATE (D, ITID, JBLK1, JBLK2) +#endif + +#ifdef _OPENACC +JBLK1 = 1 +JBLK2 = NGPBLKS +#endif + +#ifdef USE_OPENMP +NTID = OMP_GET_MAX_THREADS () +ITID = OMP_GET_THREAD_NUM () +JBLK1 = 1 + (NGPBLKS * (ITID+0)) / NTID +JBLK2 = (NGPBLKS * (ITID+1)) / NTID + + +!PRINT *, ITID, JBLK1, JBLK2 + +#endif + +!$acc parallel loop gang vector private (YLSTACK, IBL, JLON, D) collapse (2) + + DO IBL = JBLK1, JBLK2 + + +#ifdef _OPENACC + DO JLON = 1, NPROMA + D = D0 + D%NIB = JLON + D%NIE = JLON +#endif + +#ifdef USE_OPENMP + D = D0 +#endif + +#ifdef USE_STACK + YLSTACK%L = LOC (PSTACK (1, IBL)) + YLSTACK%U = YLSTACK%L + ISTSZ * KIND (PSTACK) +#else + YLSTACK%L = 0 + YLSTACK%U = 0 +#endif + + CALL ICE_ADJUST (D, CST, ICEP, NEB, TBUCONF, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3, HBUNAME, OSUBG_COND, & + & OSIGMAS, OCND2, HSUBG_MF_PDF, PTSTEP, ZSIGQSAT (:, :, IBL), PRHODJ=PRHODJ (:, :, :, IBL), PEXNREF=PEXNREF (:, :, :, IBL), & + & PRHODREF=PRHODREF (:, :, :, IBL), PSIGS=PSIGS (:, :, :, IBL), LMFCONV=LMFCONV, PMFCONV=PMFCONV (:, :, :, IBL), & + & PPABST=PPABSM (:, :, :, IBL), PZZ=ZZZ (:, :, :, IBL), PEXN=PEXNREF (:, :, :, IBL), PCF_MF=PCF_MF (:, :, :, IBL), & + & PRC_MF=PRC_MF (:, :, :, IBL), PRI_MF=PRI_MF (:, :, :, IBL), PRV=ZRS(:, :, :, 1, IBL), PRC=ZRS(:, :, :, 2, IBL), & + & PRVS=PRS(:, :, :, 1, IBL), PRCS=PRS(:, :, :, 2, IBL), PTH=ZRS(:, :, :, 0, IBL), PTHS=PTHS (:, :, :, IBL), & + & OCOMPUTE_SRC=.TRUE., & + & PSRCS=PSRCS (:, :, :, IBL), PCLDFR=PCLDFR (:, :, :, IBL), PRR=ZRS(:, :, :, 3, IBL), PRI=ZRS(:, :, :, 4, IBL), & + & PRIS=PRS(:, :, :, 4, IBL), PRS=ZRS(:, :, :, 5, IBL), PRG=ZRS(:, :, :, 6, IBL), PHLC_HRC=PHLC_HRC(:, :, :, IBL), & + & PHLC_HCF=PHLC_HCF(:, :, :, IBL), PHLI_HRI=PHLI_HRI(:, :, :, IBL), PHLI_HCF=PHLI_HCF(:, :, :, IBL), & + & TBUDGETS=YLBUDGET, KBUDGETS=NBUDGET_RI, & + & PICE_CLD_WGT=ZICE_CLD_WGT(:, :, IBL) & +#ifdef USE_STACK + & , YDSTACK=YLSTACK & +#endif + & ) + +#ifdef _OPENACC + ENDDO +#endif + + ENDDO + +#ifdef USE_OPENMP +!$OMP END PARALLEL +#endif + +!$acc end parallel loop + + TEC = OMP_GET_WTIME () + +!$acc end data + + TED = OMP_GET_WTIME () + + ZTC = ZTC + (TEC - TSC) + ZTD = ZTD + (TED - TSD) + +ENDDO + +IF (LHOOK) CALL DR_HOOK ('MAIN',1,ZHOOK_HANDLE) + +TE = OMP_GET_WTIME() + +WRITE (*,'(A,F8.2,A)') 'elapsed time : ',TE-TS,' s' +WRITE (*,'(A,F8.4,A)') ' i.e. ',1000.*(TE-TS)/(NPROMA*NGPBLKS)/NTIME,' ms/gp' + +PRINT *, " ZTD = ", ZTD, ZTD / REAL (NPROMA*NGPBLKS*NTIME) +PRINT *, " ZTC = ", ZTC, ZTC / REAL (NPROMA*NGPBLKS*NTIME) + + +IF (LLCHECK .OR. LLSTAT .OR. LLCHECKDIFF) THEN + DO IBL = IBLOCK1, IBLOCK2 + PRINT *, " IBL = ", IBL + CALL DIFF ("PSRCS", PSRCS_OUT (:,:,:,IBL), PSRCS (:,:,:,IBL)) + CALL DIFF ("PCLDFR", PCLDFR_OUT (:,:,:,IBL), PCLDFR (:,:,:,IBL)) + CALL DIFF ("PHLC_HRC", PHLC_HRC_OUT (:,:,:,IBL), PHLC_HRC (:,:,:,IBL)) + CALL DIFF ("PHLC_HCF", PHLC_HCF_OUT (:,:,:,IBL), PHLC_HCF (:,:,:,IBL)) + CALL DIFF ("PHLI_HRI", PHLI_HRI_OUT (:,:,:,IBL), PHLI_HRI (:,:,:,IBL)) + CALL DIFF ("PHLI_HCF", PHLI_HCF_OUT (:,:,:,IBL), PHLI_HCF (:,:,:,IBL)) + ENDDO +ENDIF + +IF (LLCHECKDIFF) THEN + IF (LLDIFF) THEN + PRINT*, "THERE ARE DIFF SOMEWHERE" + ELSE + PRINT*, "THERE IS NO DIFF AT ALL" + ENDIF +ENDIF + +STOP + +CONTAINS + +SUBROUTINE DIFF (CDNAME, PREF, POUT) + +CHARACTER (LEN=*) :: CDNAME +REAL :: PREF (:,:,:) +REAL :: POUT (:,:,:) + +INTEGER :: JLON, JLEV + +PRINT *, CDNAME +IF (LLSTAT) THEN + PRINT *, MINVAL (PREF), MAXVAL (PREF), SUM (PREF) / SIZE (PREF) + PRINT *, MINVAL (POUT), MAXVAL (POUT), SUM (POUT) / SIZE (POUT) +ENDIF + +IF (LLCHECK) THEN + IF (SUM (ABS (POUT) + ABS (PREF)) > 0) THEN + WRITE (*, '(A4)', ADVANCE='NO') "" + DO JLON = 1, NPROMA + WRITE (*, '("|",I12,A12)', ADVANCE='NO') JLON, "" + ENDDO + WRITE (*, '("|")') + DO JLEV = 1, KLEV + WRITE (*, '(I4)', ADVANCE='NO') JLEV + DO JLON = 1, NPROMA + IF (ABS (PREF (JLON, 1, JLEV)) + ABS (POUT (JLON, 1, JLEV)) == 0.) THEN + WRITE (*, '("|",2A12)', ADVANCE='NO') "", "" + ELSE + WRITE (*, '("|",2E12.5)', ADVANCE='NO') PREF (JLON, 1, JLEV), POUT (JLON, 1, JLEV) + ENDIF + ENDDO + WRITE (*, '("|")') + ENDDO + ENDIF +ENDIF + +IF (LLCHECKDIFF) THEN + IF (SUM(ABS(POUT-PREF)) > 0.) THEN + PRINT*, "THERE ARE DIFF" + LLDIFF = .TRUE. + ELSE + PRINT*, "THERE IS NO DIFF" + ENDIF +ENDIF + +END SUBROUTINE + + +END diff --git a/src/testprogs/rain_ice/getdata_rain_ice_mod.F90 b/src/testprogs/rain_ice/getdata_rain_ice_mod.F90 new file mode 100644 index 0000000000000000000000000000000000000000..57c28b427d7a1b776b1ffcf68894bbf84e8b9e23 --- /dev/null +++ b/src/testprogs/rain_ice/getdata_rain_ice_mod.F90 @@ -0,0 +1,801 @@ +MODULE GETDATA_RAIN_ICE_MOD + +USE OMP_LIB + +INTERFACE REPLICATE + MODULE PROCEDURE REPLICATE2 + MODULE PROCEDURE REPLICATE3 + MODULE PROCEDURE REPLICATE4 + MODULE PROCEDURE REPLICATEL +END INTERFACE + +INTERFACE NPROMIZE + MODULE PROCEDURE NPROMIZE3 + MODULE PROCEDURE NPROMIZE4 + MODULE PROCEDURE NPROMIZE5 + MODULE PROCEDURE NPROMIZEL +END INTERFACE + +INTERFACE INTERPOLATE + MODULE PROCEDURE INTERPOLATE4 + MODULE PROCEDURE INTERPOLATE5 + MODULE PROCEDURE INTERPOLATEL +END INTERFACE + +INTERFACE SET + MODULE PROCEDURE SET3 + MODULE PROCEDURE SET4 + MODULE PROCEDURE SET5 +END INTERFACE + +CONTAINS + +SUBROUTINE GETDATA_RAIN_ICE (NPROMA, NGPBLKS, NFLEVG, LLMICRO_B, PEXNREF_B, PDZZ_B, PRHODJ_B, PRHODREF_B, & + &PEXNREF2_B, PPABSM_B, PCIT_B, PCLDFR_B, PHLC_HRC_B, PHLC_HCF_B, PHLI_HRI_B, PHLI_HCF_B, PTHT_B, PRT_B, PTHS_B, & + &PRS_B, PSIGS_B, PSEA_B, PTOWN_B, PCIT_OUT_B, PRS_OUT_B, ZINPRC_B, ZINPRC_OUT_B, PINPRR_B, PINPRR_OUT_B, PEVAP_B, PEVAP_OUT_B, & + &PINPRS_B, PINPRS_OUT_B, PINPRG_B, PINPRG_OUT_B, ZINDEP_B, ZINDEP_OUT_B, ZRAINFR_B, ZRAINFR_OUT_B, PFPR_B, PFPR_OUT_B, LDVERBOSE) + +USE IEEE_ARITHMETIC, ONLY : IEEE_SIGNALING_NAN, IEEE_VALUE + +IMPLICIT NONE + +INTEGER, PARAMETER :: IFILE = 77 + +INTEGER :: KLON +INTEGER :: KIDIA +INTEGER :: KFDIA +INTEGER :: KLEV +INTEGER :: KRR +INTEGER :: KDUM + +LOGICAL :: LDVERBOSE + +LOGICAL, ALLOCATABLE:: LLMICRO_B (:,:,:,:) +REAL, ALLOCATABLE :: PEXNREF_B (:,:,:,:) +REAL, ALLOCATABLE :: PDZZ_B (:,:,:,:) +REAL, ALLOCATABLE :: PRHODJ_B (:,:,:,:) +REAL, ALLOCATABLE :: PRHODREF_B (:,:,:,:) +REAL, ALLOCATABLE :: PEXNREF2_B (:,:,:,:) +REAL, ALLOCATABLE :: PPABSM_B (:,:,:,:) +REAL, ALLOCATABLE :: PCIT_B (:,:,:,:) +REAL, ALLOCATABLE :: PCLDFR_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HRC_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HCF_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HRI_B (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HCF_B (:,:,:,:) +REAL, ALLOCATABLE :: PTHT_B (:,:,:,:) +REAL, ALLOCATABLE :: PRT_B (:,:,:,:,:) +REAL, ALLOCATABLE :: PTHS_B (:,:,:,:) +REAL, ALLOCATABLE :: PRS_B (:,:,:,:,:) +REAL, ALLOCATABLE :: PSIGS_B (:,:,:,:) +REAL, ALLOCATABLE :: PSEA_B (:,:,:) +REAL, ALLOCATABLE :: PTOWN_B (:,:,:) +REAL, ALLOCATABLE :: PCIT_OUT_B (:,:,:,:) +REAL, ALLOCATABLE :: PRS_OUT_B (:,:,:,:,:) +REAL, ALLOCATABLE :: ZINPRC_B (:,:,:) +REAL, ALLOCATABLE :: ZINPRC_OUT_B (:,:,:) +REAL, ALLOCATABLE :: PINPRR_B (:,:,:) +REAL, ALLOCATABLE :: PINPRR_OUT_B (:,:,:) +REAL, ALLOCATABLE :: PEVAP_B (:,:,:,:) +REAL, ALLOCATABLE :: PEVAP_OUT_B (:,:,:,:) +REAL, ALLOCATABLE :: PINPRS_B (:,:,:) +REAL, ALLOCATABLE :: PINPRS_OUT_B (:,:,:) +REAL, ALLOCATABLE :: PINPRG_B (:,:,:) +REAL, ALLOCATABLE :: PINPRG_OUT_B (:,:,:) +REAL, ALLOCATABLE :: ZINDEP_B (:,:,:) +REAL, ALLOCATABLE :: ZINDEP_OUT_B (:,:,:) +REAL, ALLOCATABLE :: ZRAINFR_B (:,:,:,:) +REAL, ALLOCATABLE :: ZRAINFR_OUT_B (:,:,:,:) +REAL, ALLOCATABLE :: PFPR_B (:,:,:,:,:) +REAL, ALLOCATABLE :: PFPR_OUT_B (:,:,:,:,:) + +LOGICAL, ALLOCATABLE :: LLMICRO (:,:,:,:) +REAL, ALLOCATABLE :: PEXNREF (:,:,:,:) +REAL, ALLOCATABLE :: PDZZ (:,:,:,:) +REAL, ALLOCATABLE :: PRHODJ (:,:,:,:) +REAL, ALLOCATABLE :: PRHODREF (:,:,:,:) +REAL, ALLOCATABLE :: PEXNREF2 (:,:,:,:) +REAL, ALLOCATABLE :: PPABSM (:,:,:,:) +REAL, ALLOCATABLE :: PCIT (:,:,:,:) +REAL, ALLOCATABLE :: PCLDFR (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HRC (:,:,:,:) +REAL, ALLOCATABLE :: PHLC_HCF (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HRI (:,:,:,:) +REAL, ALLOCATABLE :: PHLI_HCF (:,:,:,:) +REAL, ALLOCATABLE :: PTHT (:,:,:,:) +REAL, ALLOCATABLE :: PRT (:,:,:,:,:) +REAL, ALLOCATABLE :: PTHS (:,:,:,:) +REAL, ALLOCATABLE :: PRS (:,:,:,:,:) +REAL, ALLOCATABLE :: PSIGS (:,:,:,:) +REAL, ALLOCATABLE :: PSEA (:,:,:) +REAL, ALLOCATABLE :: PTOWN (:,:,:) +REAL, ALLOCATABLE :: PCIT_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PRS_OUT (:,:,:,:,:) +REAL, ALLOCATABLE :: ZINPRC_OUT (:,:,:) +REAL, ALLOCATABLE :: PINPRR_OUT (:,:,:) +REAL, ALLOCATABLE :: PEVAP_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PINPRS_OUT (:,:,:) +REAL, ALLOCATABLE :: PINPRG_OUT (:,:,:) +REAL, ALLOCATABLE :: ZINDEP_OUT (:,:,:) +REAL, ALLOCATABLE :: ZRAINFR_OUT (:,:,:,:) +REAL, ALLOCATABLE :: PFPR_OUT (:,:,:,:,:) + + +INTEGER :: IPROMA, ISIZE +INTEGER :: NGPTOT, NPROMA, NGPBLKS, NFLEVG +INTEGER :: IOFF, IBL +LOGICAL :: LLEXIST +CHARACTER(LEN=32) :: CLFILE +REAL :: ZNAN + +KRR=6 +NGPTOT = NPROMA * NGPBLKS + +IBL = 1 +WRITE (CLFILE, '("data/",I8.8,".dat")') IBL +OPEN (IFILE, FILE=TRIM (CLFILE), FORM='UNFORMATTED') +READ (IFILE) IPROMA, ISIZE +READ (IFILE) KLON, KDUM, KLEV, KRR +CLOSE (IFILE) + +IF (NFLEVG < 0) NFLEVG = KLEV + +ALLOCATE (LLMICRO_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PEXNREF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PDZZ_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PRHODJ_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PRHODREF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PEXNREF2_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PPABSM_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PCIT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PCLDFR_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLC_HRC_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLC_HCF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLI_HRI_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PHLI_HCF_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PTHT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PRT_B (NPROMA,1,NFLEVG,KRR,NGPBLKS)) +ALLOCATE (PTHS_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PRS_B (NPROMA,1,NFLEVG,KRR,NGPBLKS)) +ALLOCATE (PSIGS_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PSEA_B (NPROMA,1,NGPBLKS)) +ALLOCATE (PTOWN_B (NPROMA,1,NGPBLKS)) +ALLOCATE (PCIT_OUT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PRS_OUT_B (NPROMA,1,NFLEVG,KRR,NGPBLKS)) +ALLOCATE (ZINPRC_B (NPROMA,1,NGPBLKS)) +ALLOCATE (ZINPRC_OUT_B (NPROMA,1,NGPBLKS)) +ALLOCATE (PINPRR_B (NPROMA,1,NGPBLKS)) +ALLOCATE (PINPRR_OUT_B (NPROMA,1,NGPBLKS)) +ALLOCATE (PEVAP_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PEVAP_OUT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PINPRS_B (NPROMA,1,NGPBLKS)) +ALLOCATE (PINPRS_OUT_B (NPROMA,1,NGPBLKS)) +ALLOCATE (PINPRG_B (NPROMA,1,NGPBLKS)) +ALLOCATE (PINPRG_OUT_B (NPROMA,1,NGPBLKS)) +ALLOCATE (ZINDEP_B (NPROMA,1,NGPBLKS)) +ALLOCATE (ZINDEP_OUT_B (NPROMA,1,NGPBLKS)) +ALLOCATE (ZRAINFR_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (ZRAINFR_OUT_B (NPROMA,1,NFLEVG,NGPBLKS)) +ALLOCATE (PFPR_B (NPROMA,1,NFLEVG,KRR,NGPBLKS)) +ALLOCATE (PFPR_OUT_B (NPROMA,1,NFLEVG,KRR,NGPBLKS)) + + +ZNAN = IEEE_VALUE (ZNAN, IEEE_SIGNALING_NAN) + + +!CALL SET (LLMICRO_B ) +CALL SET (PEXNREF_B ) +CALL SET (PDZZ_B ) +CALL SET (PRHODJ_B ) +CALL SET (PRHODREF_B ) +CALL SET (PEXNREF2_B ) +CALL SET (PPABSM_B ) +CALL SET (PCIT_B ) +CALL SET (PCLDFR_B ) +CALL SET (PHLC_HRC_B ) +CALL SET (PHLC_HCF_B ) +CALL SET (PHLI_HRI_B ) +CALL SET (PHLI_HCF_B ) +CALL SET (PTHT_B ) +CALL SET (PRT_B ) +CALL SET (PTHS_B ) +CALL SET (PRS_B ) +CALL SET (PSIGS_B ) +CALL SET (PSEA_B ) +CALL SET (PTOWN_B ) +CALL SET (PCIT_OUT_B ) +CALL SET (PRS_OUT_B ) +CALL SET (ZINPRC_OUT_B ) +CALL SET (PINPRR_OUT_B ) +CALL SET (PEVAP_OUT_B ) +CALL SET (PINPRS_OUT_B ) +CALL SET (PINPRG_OUT_B ) +CALL SET (ZINDEP_OUT_B ) +CALL SET (ZRAINFR_OUT_B ) +CALL SET (PFPR_OUT_B ) + +ZINPRC_OUT_B = ZNAN +PINPRR_OUT_B = ZNAN +PEVAP_OUT_B = ZNAN +PINPRS_OUT_B = ZNAN +PINPRG_OUT_B = ZNAN +ZINDEP_OUT_B = ZNAN +ZRAINFR_OUT_B = ZNAN +PFPR_OUT_B = ZNAN + +IOFF = 0 +IBL = 0 +LLEXIST = .TRUE. + +DO WHILE(LLEXIST) + IBL = IBL + 1 + WRITE (CLFILE, '("data/",I8.8,".dat")') IBL + + INQUIRE (FILE=TRIM (CLFILE), EXIST=LLEXIST) + + IF (LDVERBOSE) PRINT *, TRIM (CLFILE) + + IF (.NOT. LLEXIST) EXIT + + OPEN (IFILE, FILE=TRIM (CLFILE), FORM='UNFORMATTED') + + READ (IFILE) IPROMA, ISIZE + READ (IFILE) KLON, KDUM, KLEV, KRR + + IF (IBL == 1) THEN + ALLOCATE (LLMICRO (NGPTOT,1,KLEV,1)) + ALLOCATE (PEXNREF (NGPTOT,1,KLEV,1)) + ALLOCATE (PDZZ (NGPTOT,1,KLEV,1)) + ALLOCATE (PRHODJ (NGPTOT,1,KLEV,1)) + ALLOCATE (PRHODREF (NGPTOT,1,KLEV,1)) + ALLOCATE (PEXNREF2 (NGPTOT,1,KLEV,1)) + ALLOCATE (PPABSM (NGPTOT,1,KLEV,1)) + ALLOCATE (PCIT (NGPTOT,1,KLEV,1)) + ALLOCATE (PCLDFR (NGPTOT,1,KLEV,1)) + ALLOCATE (PHLC_HRC (NGPTOT,1,KLEV,1)) + ALLOCATE (PHLC_HCF (NGPTOT,1,KLEV,1)) + ALLOCATE (PHLI_HRI (NGPTOT,1,KLEV,1)) + ALLOCATE (PHLI_HCF (NGPTOT,1,KLEV,1)) + ALLOCATE (PTHT (NGPTOT,1,KLEV,1)) + ALLOCATE (PRT (NGPTOT,1,KLEV,KRR,1)) + ALLOCATE (PTHS (NGPTOT,1,KLEV,1)) + ALLOCATE (PRS (NGPTOT,1,KLEV,KRR,1)) + ALLOCATE (PSIGS (NGPTOT,1,KLEV,1)) + ALLOCATE (PSEA (NGPTOT,1,1)) + ALLOCATE (PTOWN (NGPTOT,1,1)) + ALLOCATE (PCIT_OUT (NGPTOT,1,KLEV,1)) + ALLOCATE (PRS_OUT (NGPTOT,1,KLEV,KRR,1)) + ALLOCATE (ZINPRC_OUT (NGPTOT,1,1)) + ALLOCATE (PINPRR_OUT (NGPTOT,1,1)) + ALLOCATE (PEVAP_OUT (NGPTOT,1,KLEV,1)) + ALLOCATE (PINPRS_OUT (NGPTOT,1,1)) + ALLOCATE (PINPRG_OUT (NGPTOT,1,1)) + ALLOCATE (ZINDEP_OUT (NGPTOT,1,1)) + ALLOCATE (ZRAINFR_OUT (NGPTOT,1,KLEV,1)) + ALLOCATE (PFPR_OUT (NGPTOT,1,KLEV,KRR,1)) + ENDIF + + IF (IOFF+KLON > NGPTOT) THEN + EXIT + ENDIF + + READ (IFILE) LLMICRO (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PEXNREF (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PDZZ (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PRHODJ (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PRHODREF (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PEXNREF2 (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PPABSM (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PCIT (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PCLDFR (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PHLC_HRC (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PHLC_HCF (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PHLI_HRI (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PHLI_HCF (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PTHT (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PRT (IOFF+1:IOFF+KLON,:,:,:,1) + READ (IFILE) PTHS (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PRS (IOFF+1:IOFF+KLON,:,:,:,1) + READ (IFILE) PSIGS (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PSEA (IOFF+1:IOFF+KLON,:,1) + READ (IFILE) PTOWN (IOFF+1:IOFF+KLON,:,1) + READ (IFILE) PCIT_OUT (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PRS_OUT (IOFF+1:IOFF+KLON,:,:,:,1) + READ (IFILE) ZINPRC_OUT (IOFF+1:IOFF+KLON,:,1) + READ (IFILE) PINPRR_OUT (IOFF+1:IOFF+KLON,:,1) + READ (IFILE) PEVAP_OUT (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PINPRS_OUT (IOFF+1:IOFF+KLON,:,1) + READ (IFILE) PINPRG_OUT (IOFF+1:IOFF+KLON,:,1) + READ (IFILE) ZINDEP_OUT (IOFF+1:IOFF+KLON,:,1) + READ (IFILE) ZRAINFR_OUT (IOFF+1:IOFF+KLON,:,:,1) + READ (IFILE) PFPR_OUT (IOFF+1:IOFF+KLON,:,:,:,1) + + CLOSE (IFILE) + + IOFF = IOFF + KLON + +ENDDO + +IF (NFLEVG /= KLEV) THEN + CALL INTERPOLATE (NFLEVG, IOFF, LLMICRO ) + CALL INTERPOLATE (NFLEVG, IOFF, PEXNREF ) + CALL INTERPOLATE (NFLEVG, IOFF, PDZZ ) + CALL INTERPOLATE (NFLEVG, IOFF, PRHODJ ) + CALL INTERPOLATE (NFLEVG, IOFF, PRHODREF ) + CALL INTERPOLATE (NFLEVG, IOFF, PEXNREF2 ) + CALL INTERPOLATE (NFLEVG, IOFF, PPABSM ) + CALL INTERPOLATE (NFLEVG, IOFF, PCIT ) + CALL INTERPOLATE (NFLEVG, IOFF, PCLDFR ) + CALL INTERPOLATE (NFLEVG, IOFF, PHLC_HRC ) + CALL INTERPOLATE (NFLEVG, IOFF, PHLC_HCF ) + CALL INTERPOLATE (NFLEVG, IOFF, PHLI_HRI ) + CALL INTERPOLATE (NFLEVG, IOFF, PHLI_HCF ) + CALL INTERPOLATE (NFLEVG, IOFF, PTHT ) + CALL INTERPOLATE (NFLEVG, IOFF, PRT ) + CALL INTERPOLATE (NFLEVG, IOFF, PTHS ) + CALL INTERPOLATE (NFLEVG, IOFF, PRS ) + CALL INTERPOLATE (NFLEVG, IOFF, PSIGS ) +! CALL INTERPOLATE (NFLEVG, IOFF, PSEA ) +! CALL INTERPOLATE (NFLEVG, IOFF, PTOWN ) + CALL INTERPOLATE (NFLEVG, IOFF, PCIT_OUT ) + CALL INTERPOLATE (NFLEVG, IOFF, PRS_OUT ) +! CALL INTERPOLATE (NFLEVG, IOFF, ZINPRC_OUT ) +! CALL INTERPOLATE (NFLEVG, IOFF, PINPRR_OUT ) + CALL INTERPOLATE (NFLEVG, IOFF, PEVAP_OUT ) +! CALL INTERPOLATE (NFLEVG, IOFF, PINPRS_OUT ) +! CALL INTERPOLATE (NFLEVG, IOFF, PINPRG_OUT ) +! CALL INTERPOLATE (NFLEVG, IOFF, ZINDEP_OUT ) + CALL INTERPOLATE (NFLEVG, IOFF, ZRAINFR_OUT ) + CALL INTERPOLATE (NFLEVG, IOFF, PFPR_OUT ) + +ENDIF + +CALL REPLICATE (IOFF, LLMICRO (:, :, :, 1)) +CALL REPLICATE (IOFF, PEXNREF (:, :, :, 1)) +CALL REPLICATE (IOFF, PDZZ (:, :, :, 1)) +CALL REPLICATE (IOFF, PRHODJ (:, :, :, 1)) +CALL REPLICATE (IOFF, PRHODREF (:, :, :, 1)) +CALL REPLICATE (IOFF, PEXNREF2 (:, :, :, 1)) +CALL REPLICATE (IOFF, PPABSM (:, :, :, 1)) +CALL REPLICATE (IOFF, PCIT (:, :, :, 1)) +CALL REPLICATE (IOFF, PCLDFR (:, :, :, 1)) +CALL REPLICATE (IOFF, PHLC_HRC (:, :, :, 1)) +CALL REPLICATE (IOFF, PHLC_HCF (:, :, :, 1)) +CALL REPLICATE (IOFF, PHLI_HRI (:, :, :, 1)) +CALL REPLICATE (IOFF, PHLI_HCF (:, :, :, 1)) +CALL REPLICATE (IOFF, PTHT (:, :, :, 1)) +CALL REPLICATE (IOFF, PRT (:, :, :, :, 1)) +CALL REPLICATE (IOFF, PTHS (:, :, :, 1)) +CALL REPLICATE (IOFF, PRS (:, :, :, :, 1)) +CALL REPLICATE (IOFF, PSIGS (:, :, :, 1)) +CALL REPLICATE (IOFF, PSEA (:, :, 1)) +CALL REPLICATE (IOFF, PTOWN (:, :, 1)) +CALL REPLICATE (IOFF, PCIT_OUT (:, :, :, 1)) +CALL REPLICATE (IOFF, PRS_OUT (:, :, :, :, 1)) +CALL REPLICATE (IOFF, ZINPRC_OUT (:, :, 1)) +CALL REPLICATE (IOFF, PINPRR_OUT (:, :, 1)) +CALL REPLICATE (IOFF, PEVAP_OUT (:, :, :, 1)) +CALL REPLICATE (IOFF, PINPRS_OUT (:, :, 1)) +CALL REPLICATE (IOFF, PINPRG_OUT (:, :, 1)) +CALL REPLICATE (IOFF, ZINDEP_OUT (:, :, 1)) +CALL REPLICATE (IOFF, ZRAINFR_OUT (:, :, :, 1)) +CALL REPLICATE (IOFF, PFPR_OUT (:, :, :, :, 1)) + + +CALL NPROMIZE (NPROMA, LLMICRO , LLMICRO_B ) +CALL NPROMIZE (NPROMA, PEXNREF , PEXNREF_B ) +CALL NPROMIZE (NPROMA, PDZZ , PDZZ_B ) +CALL NPROMIZE (NPROMA, PRHODJ , PRHODJ_B ) +CALL NPROMIZE (NPROMA, PRHODREF , PRHODREF_B ) +CALL NPROMIZE (NPROMA, PEXNREF2 , PEXNREF2_B ) +CALL NPROMIZE (NPROMA, PPABSM , PPABSM_B ) +CALL NPROMIZE (NPROMA, PCIT , PCIT_B ) +CALL NPROMIZE (NPROMA, PCLDFR , PCLDFR_B ) +CALL NPROMIZE (NPROMA, PHLC_HRC , PHLC_HRC_B ) +CALL NPROMIZE (NPROMA, PHLC_HCF , PHLC_HCF_B ) +CALL NPROMIZE (NPROMA, PHLI_HRI , PHLI_HRI_B ) +CALL NPROMIZE (NPROMA, PHLI_HCF , PHLI_HCF_B ) +CALL NPROMIZE (NPROMA, PTHT , PTHT_B ) +CALL NPROMIZE (NPROMA, PRT , PRT_B ) +CALL NPROMIZE (NPROMA, PTHS , PTHS_B ) +CALL NPROMIZE (NPROMA, PRS , PRS_B ) +CALL NPROMIZE (NPROMA, PSIGS , PSIGS_B ) +CALL NPROMIZE (NPROMA, PSEA , PSEA_B ) +CALL NPROMIZE (NPROMA, PTOWN , PTOWN_B ) +CALL NPROMIZE (NPROMA, PCIT_OUT , PCIT_OUT_B ) +CALL NPROMIZE (NPROMA, PRS_OUT , PRS_OUT_B ) +CALL NPROMIZE (NPROMA, ZINPRC_OUT , ZINPRC_OUT_B ) +CALL NPROMIZE (NPROMA, PINPRR_OUT , PINPRR_OUT_B ) +CALL NPROMIZE (NPROMA, PEVAP_OUT , PEVAP_OUT_B ) +CALL NPROMIZE (NPROMA, PINPRS_OUT , PINPRS_OUT_B ) +CALL NPROMIZE (NPROMA, PINPRG_OUT , PINPRG_OUT_B ) +CALL NPROMIZE (NPROMA, ZINDEP_OUT , ZINDEP_OUT_B ) +CALL NPROMIZE (NPROMA, ZRAINFR_OUT , ZRAINFR_OUT_B ) +CALL NPROMIZE (NPROMA, PFPR_OUT , PFPR_OUT_B ) + + +END SUBROUTINE + +SUBROUTINE REPLICATE4 (KOFF, P) + +INTEGER :: KOFF +REAL :: P (:,:,:,:) + +INTEGER :: I, J + +DO I = KOFF+1, SIZE (P, 1) + J = 1 + MODULO (I - 1, KOFF) + P (I, :, :, :) = P (J, :, :, :) +ENDDO + +END SUBROUTINE + +SUBROUTINE REPLICATE3 (KOFF, P) + +INTEGER :: KOFF +REAL :: P (:,:,:) + +INTEGER :: I, J + +DO I = KOFF+1, SIZE (P, 1) + J = 1 + MODULO (I - 1, KOFF) + P (I, :, :) = P (J, :, :) +ENDDO + +END SUBROUTINE + +SUBROUTINE REPLICATE2 (KOFF, P) + +INTEGER :: KOFF +REAL :: P (:,:) + +INTEGER :: I, J + +DO I = KOFF+1, SIZE (P, 1) + J = 1 + MODULO (I - 1, KOFF) + P (I, :) = P (J, :) +ENDDO + +END SUBROUTINE + +SUBROUTINE REPLICATEL (KOFF, L) + +INTEGER :: KOFF +LOGICAL :: L (:,:,:) + +INTEGER :: I, J + +DO I = KOFF+1, SIZE (L, 1) + J = 1 + MODULO (I - 1, KOFF) + L (I, :, :) = L (J, :, :) +ENDDO + +END SUBROUTINE + +SUBROUTINE NPROMIZE3 (KPROMA, PI, PO) + +INTEGER :: KPROMA +REAL, INTENT (IN) :: PI (:,:,:) +REAL, INTENT (OUT) :: PO (:,:,:) + +INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA + +IF (SIZE (PI, 3) /= 1) STOP 1 + +IGPTOT = SIZE (PI, 1) +IGPBLK = 1 + (IGPTOT-1) / KPROMA + +DO IGP = 1, IGPTOT, KPROMA + IBL = 1 + (IGP - 1) / KPROMA + JIDIA = 1 + JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA) + + DO JLON = JIDIA, JFDIA + PO (JLON, :, IBL) = PI (IGP + (JLON - 1), :, 1) + ENDDO + + DO JLON = JFDIA+1, KPROMA + PO (JLON, :, IBL) = PO (JFDIA, :, IBL) + ENDDO + +ENDDO + +END SUBROUTINE + +SUBROUTINE NPROMIZE4 (KPROMA, PI, PO) + +INTEGER :: KPROMA +REAL, INTENT (IN) :: PI (:,:,:,:) +REAL, INTENT (OUT) :: PO (:,:,:,:) + +INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA + +IF (SIZE (PI, 4) /= 1) STOP 1 + +IGPTOT = SIZE (PI, 1) +IGPBLK = 1 + (IGPTOT-1) / KPROMA + +DO IGP = 1, IGPTOT, KPROMA + IBL = 1 + (IGP - 1) / KPROMA + JIDIA = 1 + JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA) + + DO JLON = JIDIA, JFDIA + PO (JLON, :, :, IBL) = PI (IGP + (JLON - 1), :, :, 1) + ENDDO + + DO JLON = JFDIA+1, KPROMA + PO (JLON, :, :, IBL) = PO (JFDIA, :, :, IBL) + ENDDO + +ENDDO + +END SUBROUTINE + +SUBROUTINE NPROMIZE5 (KPROMA, PI, PO) + +INTEGER :: KPROMA +REAL, INTENT (IN) :: PI (:,:,:,:,:) +REAL, INTENT (OUT) :: PO (:,:,:,:,:) + +INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA + +IF (SIZE (PI, 5) /= 1) STOP 1 + +IGPTOT = SIZE (PI, 1) +IGPBLK = 1 + (IGPTOT-1) / KPROMA + +DO IGP = 1, IGPTOT, KPROMA + IBL = 1 + (IGP - 1) / KPROMA + JIDIA = 1 + JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA) + + DO JLON = JIDIA, JFDIA + PO (JLON, :, :, :, IBL) = PI (IGP + (JLON - 1), :, :, :, 1) + ENDDO + + DO JLON = JFDIA+1, KPROMA + PO (JLON, :, :, :, IBL) = PI (JFDIA, :, :, :, IBL) + ENDDO + +ENDDO + +END SUBROUTINE + +SUBROUTINE NPROMIZEL (KPROMA, LI, LO) + +INTEGER :: KPROMA +LOGICAL, INTENT (IN) :: LI (:,:,:,:) +LOGICAL, INTENT (OUT) :: LO (:,:,:,:) + +INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA + +IF (SIZE (LI, 4) /= 1) STOP 1 + +IGPTOT = SIZE (LI, 1) +IGPBLK = 1 + (IGPTOT-1) / KPROMA + +DO IGP = 1, IGPTOT, KPROMA + IBL = 1 + (IGP - 1) / KPROMA + JIDIA = 1 + JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA) + + DO JLON = JIDIA, JFDIA + LO (JLON, :, :, IBL) = LI (IGP + (JLON - 1), :, :, 1) + ENDDO + + DO JLON = JFDIA+1, KPROMA + LO (JLON, :, :, IBL) = LI (JFDIA, :, :, IBL) + ENDDO + +ENDDO + +END SUBROUTINE + +SUBROUTINE INTERPOLATE4 (KFLEVG, KOFF, P) + +INTEGER :: KFLEVG, KOFF +REAL, ALLOCATABLE :: P (:,:,:,:) +REAL :: Z (LBOUND (P, 1):UBOUND (P, 1), & + & LBOUND (P, 2):UBOUND (P, 2), & + & LBOUND (P, 3):UBOUND (P, 3), & + & LBOUND (P, 4):UBOUND (P, 4)) +INTEGER :: ILEV1A, ILEV1B, ILEV2, NLEV1, NLEV2 +REAL :: ZWA, ZWB, ZLEV1, ZLEV2 + +Z = P + +NLEV1 = SIZE (P, 3) +NLEV2 = KFLEVG + +DEALLOCATE (P) + +ALLOCATE (P (LBOUND (Z, 1):UBOUND (Z, 1), & + & LBOUND (Z, 2):UBOUND (Z, 2), & + & KFLEVG, & + & LBOUND (Z, 4):UBOUND (Z, 4))) + +DO ILEV2 = 1, NLEV2 + ZLEV2 = REAL (ILEV2 - 1) / REAL (NLEV2 -1) + ZLEV1 = 1. + ZLEV2 * REAL (NLEV1 - 1) + ILEV1B = MIN (CEILING (ZLEV1), NLEV1) + ILEV1A = MAX (FLOOR (ZLEV1), 1) + + IF (ILEV1A == ILEV1B) THEN + ZWA = 1. + ZWB = 0. + ELSE + ZWA = REAL (ILEV1B) - ZLEV1 + ZWB = ZLEV1 - REAL (ILEV1A) + ENDIF + +! WRITE (*, '(" ZLEV2 = ",E12.5," ZLEV1 = ",E12.5," ILEV2 = ",I4," ILEV1A = ",I4," ZWA = ",E12.5," ILEV1B = ",I4," ZWB = ",E12.5)') & +! & ZLEV2, ZLEV1, ILEV2, ILEV1A, ZWA, ILEV1B, ZWB + + P (1:KOFF, :, ILEV2, :) = ZWA * Z (1:KOFF, :, ILEV1A, :) + ZWB * Z (1:KOFF, :, ILEV1B, :) +ENDDO + +END SUBROUTINE + +SUBROUTINE INTERPOLATE5 (KFLEVG, KOFF, P) + +INTEGER :: KFLEVG, KOFF +REAL, ALLOCATABLE :: P (:,:,:,:,:) +REAL :: Z (LBOUND (P, 1):UBOUND (P, 1), & + & LBOUND (P, 2):UBOUND (P, 2), & + & LBOUND (P, 3):UBOUND (P, 3), & + & LBOUND (P, 4):UBOUND (P, 4), & + & LBOUND (P, 5):UBOUND (P, 5)) +INTEGER :: ILEV1A, ILEV1B, ILEV2, NLEV1, NLEV2 +REAL :: ZWA, ZWB, ZLEV1, ZLEV2 + +Z = P + +NLEV1 = SIZE (P, 3) +NLEV2 = KFLEVG + +DEALLOCATE (P) + +ALLOCATE (P (LBOUND (Z, 1):UBOUND (Z, 1), & + & LBOUND (Z, 2):UBOUND (Z, 2), & + & KFLEVG, & + & LBOUND (Z, 4):UBOUND (Z, 4), & + & LBOUND (Z, 5):UBOUND (Z, 5))) + +DO ILEV2 = 1, NLEV2 + ZLEV2 = REAL (ILEV2 - 1) / REAL (NLEV2 -1) + ZLEV1 = 1. + ZLEV2 * REAL (NLEV1 - 1) + ILEV1B = MIN (CEILING (ZLEV1), NLEV1) + ILEV1A = MAX (FLOOR (ZLEV1), 1) + + IF (ILEV1A == ILEV1B) THEN + ZWA = 1. + ZWB = 0. + ELSE + ZWA = REAL (ILEV1B) - ZLEV1 + ZWB = ZLEV1 - REAL (ILEV1A) + ENDIF + +! WRITE (*, '(" ZLEV2 = ",E12.5," ZLEV1 = ",E12.5," ILEV2 = ",I4," ILEV1A = ",I4," ZWA = ",E12.5," ILEV1B = ",I4," ZWB = ",E12.5)') & +! & ZLEV2, ZLEV1, ILEV2, ILEV1A, ZWA, ILEV1B, ZWB + + P (1:KOFF, :, ILEV2, :, :) = ZWA * Z (1:KOFF, :, ILEV1A, :, :) + ZWB * Z (1:KOFF, :, ILEV1B, :, :) +ENDDO + +END SUBROUTINE + +SUBROUTINE INTERPOLATEL (KFLEVG, KOFF, L) + +INTEGER :: KFLEVG, KOFF +LOGICAL, ALLOCATABLE :: L (:,:,:,:) +LOGICAL :: Z (LBOUND (L, 1):UBOUND (L, 1), & + & LBOUND (L, 2):UBOUND (L, 2), & + & LBOUND (L, 3):UBOUND (L, 3), & + & LBOUND (L, 4):UBOUND (L, 4)) +INTEGER :: ILEV1A, ILEV1B, ILEV2, NLEV1, NLEV2 +REAL :: ZWA, ZWB, ZLEV1, ZLEV2 + +Z = L + +NLEV1 = SIZE (L, 3) +NLEV2 = KFLEVG + +DEALLOCATE (L) + +ALLOCATE (L (LBOUND (Z, 1):UBOUND (Z, 1), & + & LBOUND (Z, 2):UBOUND (Z, 2), & + & KFLEVG, & + & LBOUND (Z, 4):UBOUND (Z, 4))) + +DO ILEV2 = 1, NLEV2 + ZLEV2 = REAL (ILEV2 - 1) / REAL (NLEV2 -1) + ZLEV1 = 1. + ZLEV2 * REAL (NLEV1 - 1) + ILEV1B = MIN (CEILING (ZLEV1), NLEV1) + ILEV1A = MAX (FLOOR (ZLEV1), 1) + + IF (ILEV1A == ILEV1B) THEN + ZWA = 1. + ZWB = 0. + ELSE + ZWA = REAL (ILEV1B) - ZLEV1 + ZWB = ZLEV1 - REAL (ILEV1A) + ENDIF + +! WRITE (*, '(" ZLEV2 = ",E12.5," ZLEV1 = ",E12.5," ILEV2 = ",I4," ILEV1A = ",I4," ZWA = ",E12.5," ILEV1B = ",I4," ZWB = ",E12.5)') & +! & ZLEV2, ZLEV1, ILEV2, ILEV1A, ZWA, ILEV1B, ZWB + + L (1:KOFF, :, ILEV2, :) = ZWA * MERGE(1., 0., Z (1:KOFF, :, ILEV1A, :)) + ZWB * MERGE(1., 0., Z (1:KOFF, :, ILEV1B, :)) >= 0.5 +ENDDO + +END SUBROUTINE + + +SUBROUTINE SET3 (P) + +REAL :: P (:,:,:) +INTEGER :: IBL, IGPBLKS +INTEGER :: NTID, ITID, JBLK1, JBLK2 + + +IGPBLKS = SIZE (P, 3) + +!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID) +NTID = OMP_GET_MAX_THREADS () +ITID = OMP_GET_THREAD_NUM () +JBLK1 = 1 + (IGPBLKS * (ITID+0)) / NTID +JBLK2 = (IGPBLKS * (ITID+1)) / NTID + +DO IBL = JBLK1, JBLK2 + P (:,:,IBL) = ZNAN +ENDDO + +!$OMP END PARALLEL + +END SUBROUTINE + +SUBROUTINE SET4 (P) + +REAL :: P (:,:,:,:) +INTEGER :: IBL, IGPBLKS +INTEGER :: NTID, ITID, JBLK1, JBLK2 + +IGPBLKS = SIZE (P, 4) + +!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID) +NTID = OMP_GET_MAX_THREADS () +ITID = OMP_GET_THREAD_NUM () +JBLK1 = 1 + (IGPBLKS * (ITID+0)) / NTID +JBLK2 = (IGPBLKS * (ITID+1)) / NTID + +DO IBL = JBLK1, JBLK2 + P (:,:,:,IBL) = ZNAN +ENDDO + +!$OMP END PARALLEL + +END SUBROUTINE + +SUBROUTINE SET5 (P) + +REAL :: P (:,:,:,:,:) +INTEGER :: IBL, IGPBLKS +INTEGER :: NTID, ITID, JBLK1, JBLK2 + +IGPBLKS = SIZE (P, 5) + +!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID) +NTID = OMP_GET_MAX_THREADS () +ITID = OMP_GET_THREAD_NUM () +JBLK1 = 1 + (IGPBLKS * (ITID+0)) / NTID +JBLK2 = (IGPBLKS * (ITID+1)) / NTID + +DO IBL = JBLK1, JBLK2 + P (:,:,:,:,IBL) = ZNAN +ENDDO + +!$OMP END PARALLEL + +END SUBROUTINE + + +END MODULE diff --git a/src/testprogs/rain_ice/main_rain_ice.F90 b/src/testprogs/rain_ice/main_rain_ice.F90 new file mode 100644 index 0000000000000000000000000000000000000000..6b167802ea347a377df6cf0bb000c57ddbc6a2d0 --- /dev/null +++ b/src/testprogs/rain_ice/main_rain_ice.F90 @@ -0,0 +1,507 @@ +PROGRAM MAIN_RAIN_ICE + +USE XRD_GETOPTIONS +USE GETDATA_RAIN_ICE_MOD +USE MODD_CONF +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_CST, ONLY: CST_t, CST +USE MODD_RAIN_ICE_DESCR, ONLY : RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM, ONLY : RAIN_ICE_PARAM +USE MODD_PARAM_ICE, ONLY: PARAM_ICE +USE MODI_RAIN_ICE +USE MODI_INI_CST +USE MODD_BUDGET, ONLY: TBUDGETDATA, NBUDGET_RH, TBUCONF +USE STACK_MOD +USE OMP_LIB +USE YOMHOOK, ONLY : LHOOK, DR_HOOK +USE PARKIND1, ONLY : JPRB, JPIM + + +IMPLICIT NONE + +INTEGER :: KLON +INTEGER :: KLEV +INTEGER :: KRR + +REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: PRS, PRS_OUT +REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: PFPR, PFPR_OUT +REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: PRT +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PDZZ +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PRHODJ +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PRHODREF +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PEXNREF +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PEXNREF2 +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PPABSM +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PHLC_HRC +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PHLC_HCF +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PHLI_HRI +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PHLI_HCF +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PTHT +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PSIGS +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PCLDFR +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PTHS +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PEVAP, PEVAP_OUT +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: PCIT, PCIT_OUT +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PSEA +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PTOWN +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PINPRR, PINPRR_OUT +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PINPRS, PINPRS_OUT +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PINPRG, PINPRG_OUT +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZINDEP, ZINDEP_OUT +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: ZRAINFR, ZRAINFR_OUT +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZINPRC, ZINPRC_OUT +LOGICAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: LLMICRO + +INTEGER :: NPROMA, NGPBLKS, NFLEVG +INTEGER :: IBL, JLON, JLEV + +TYPE(DIMPHYEX_t) :: D, D0 +CHARACTER (LEN=4) :: CSUBG_AUCV_RC +CHARACTER (LEN=80) :: CSUBG_AUCV_RI +LOGICAL :: OSEDIC +CHARACTER (LEN=4) :: CSEDIM +CHARACTER (LEN=4) :: CMICRO +REAL :: PTSTEP +LOGICAL :: OWARM +LOGICAL :: OCND2 +LOGICAL :: LCRIAUTI +REAL :: ZCRIAUTI, ZT0CRIAUTI, ZCRIAUTC +TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RH) :: YLBUDGET +LOGICAL :: LLCHECK +LOGICAL :: LLCHECKDIFF +LOGICAL :: LLDIFF +INTEGER :: IBLOCK1, IBLOCK2 +INTEGER :: ISTSZ, JBLK1, JBLK2 +INTEGER :: NTID, ITID +INTEGER :: JRR + + +INTEGER :: IPROMA +REAL, ALLOCATABLE :: PSTACK(:,:) +TYPE (STACK) :: YLSTACK + +REAL(KIND=8) :: TS,TE +REAL(KIND=8) :: TSC, TEC, TSD, TED, ZTC, ZTD +INTEGER :: ITIME, NTIME +INTEGER :: IRANK, ISIZE +LOGICAL :: LLVERBOSE, LLSTAT, LLBIND +REAL (KIND=JPRB) :: ZHOOK_HANDLE +CHARACTER(LEN=32) :: CLTEXT + +CALL INITOPTIONS () +NGPBLKS = 150 +CALL GETOPTION ("--blocks", NGPBLKS) +NPROMA = 32 +CALL GETOPTION ("--nproma", NPROMA) +NFLEVG = -1 +CALL GETOPTION ("--nflevg", NFLEVG) +CALL GETOPTION ("--check", LLCHECK) +CALL GETOPTION ("--checkdiff", LLCHECKDIFF) +IBLOCK1 = 1 +CALL GETOPTION ("--check-block-1", IBLOCK1) +IBLOCK2 = NGPBLKS +CALL GETOPTION ("--check-block-2", IBLOCK2) +CALL GETOPTION ("--stat", LLSTAT) +NTIME = 1 +CALL GETOPTION ("--times", NTIME) +CALL GETOPTION ("--verbose", LLVERBOSE) +CALL GETOPTION ("--bind", LLBIND) +CALL CHECKOPTIONS () + +LLDIFF = .FALSE. + +IRANK = 0 +ISIZE = 1 +IF (LLBIND) THEN + CALL LINUX_BIND (IRANK, ISIZE) + CALL LINUX_BIND_DUMP (IRANK, ISIZE) +ENDIF + +CALL GETDATA_RAIN_ICE (NPROMA, NGPBLKS, NFLEVG, LLMICRO, PEXNREF, PDZZ, PRHODJ, PRHODREF, & +&PEXNREF2, PPABSM, PCIT, PCLDFR, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, PTHT, PRT, PTHS, & +&PRS, PSIGS, PSEA, PTOWN, PCIT_OUT, PRS_OUT, ZINPRC, ZINPRC_OUT, PINPRR, PINPRR_OUT, PEVAP, PEVAP_OUT, & +&PINPRS, PINPRS_OUT, PINPRG, PINPRG_OUT, ZINDEP, ZINDEP_OUT, ZRAINFR, ZRAINFR_OUT, PFPR, PFPR_OUT, LLVERBOSE) + +KLEV = SIZE (PRS, 3) +KRR = SIZE (PRS, 4) + +IF (LLVERBOSE) PRINT *, " KLEV = ", KLEV, " KRR = ", KRR + +PRINT *, " NPROMA = ", NPROMA, " KLEV = ", KLEV, " NGPBLKS = ", NGPBLKS + +CMICRO='ICE3' + +PTSTEP = 25.0000000000000 +KRR = 6 +OSEDIC = .TRUE. +OCND2 = .FALSE. +CSEDIM = 'STAT' +CSUBG_AUCV_RC = 'PDF' +CSUBG_AUCV_RI = 'NONE' +OWARM = .TRUE. + +LCRIAUTI=.TRUE. +ZCRIAUTI=0.2E-3 +ZT0CRIAUTI=-5. +ZCRIAUTC=0.1E-2 + +CALL INIT_PHYEX (20, OWARM, CMICRO, CSEDIM, & + & LCRIAUTI, ZCRIAUTI, ZT0CRIAUTI, ZCRIAUTC) +DO JRR=1, NBUDGET_RH + YLBUDGET(JRR)%NBUDGET=JRR +ENDDO + +D0%NIT = NPROMA +D0%NIB = 1 +D0%NIE = NPROMA +D0%NJT = 1 +D0%NJB = 1 +D0%NJE = 1 +D0%NKL = -1 +D0%NKT = KLEV +D0%NKA = KLEV +D0%NKU = 1 +D0%NKB = KLEV +D0%NKE = 1 +D0%NKTB = 1 +D0%NKTE = KLEV + +ISTSZ = NPROMA * 20 * KLEV +ALLOCATE (PSTACK (ISTSZ, NGPBLKS)) + +TS = OMP_GET_WTIME () + +ZTD = 0. +ZTC = 0. + +IF (LHOOK) CALL DR_HOOK ('MAIN',0,ZHOOK_HANDLE) + +DO ITIME = 1, NTIME + + TSD = OMP_GET_WTIME () + +!directives pas a jour !$acc data & +!directives pas a jour !$acc & copyin (D0, CST, ICEP, NEB, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3, HBUNAME, OSUBG_COND, OSIGMAS, OCND2, HSUBG_MF_PDF, PTSTEP, LMFCONV, & +!directives pas a jour !$acc & ZSIGQSAT, PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABSM, ZZZ, PCF_MF, PRC_MF, PRI_MF, ZRS, ZICE_CLD_WGT) & +!directives pas a jour !$acc & copy (PRS, PTHS), & +!directives pas a jour !$acc & copyout (PSRCS, PCLDFR, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF) & +!directives pas a jour !$acc & create (PSTACK) + + TSC = OMP_GET_WTIME () + +#ifdef USE_OPENMP +!$OMP PARALLEL PRIVATE (D, ITID, JBLK1, JBLK2, IPROMA, ISIZE) +#endif + +#ifdef _OPENACC +JBLK1 = 1 +JBLK2 = NGPBLKS +#endif + +#ifdef USE_OPENMP +NTID = OMP_GET_MAX_THREADS () +ITID = OMP_GET_THREAD_NUM () +JBLK1 = 1 + (NGPBLKS * (ITID+0)) / NTID +JBLK2 = (NGPBLKS * (ITID+1)) / NTID + + +!PRINT *, ITID, JBLK1, JBLK2 + +#endif + +!$acc parallel loop gang vector private (YLSTACK, IBL, JLON, D) collapse (2) + + DO IBL = JBLK1, JBLK2 + + +#ifdef _OPENACC + DO JLON = 1, NPROMA + D = D0 + D%NIB = JLON + D%NIE = JLON +#endif + +#ifdef USE_OPENMP + D = D0 +#endif + +#ifdef USE_STACK + YLSTACK%L = LOC (PSTACK (1, IBL)) + YLSTACK%U = YLSTACK%L + ISTSZ * KIND (PSTACK) +#else + YLSTACK%L = 0 + YLSTACK%U = 0 +#endif + +IPROMA=COUNT(LLMICRO(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE,IBL)) +ISIZE=IPROMA +CALL RAIN_ICE (D, CST, PARAM_ICE, RAIN_ICE_PARAM, & + & RAIN_ICE_DESCR, TBUCONF, & + & IPROMA, ISIZE, & + & OSEDIC=OSEDIC, OCND2=OCND2, HSEDIM=CSEDIM, & + & HSUBG_AUCV_RC=CSUBG_AUCV_RC, HSUBG_AUCV_RI=CSUBG_AUCV_RI,& + & OWARM=OWARM, & + & PTSTEP=2*PTSTEP, & + & KRR=KRR, ODMICRO=LLMICRO(:,:,:,IBL), PEXN=PEXNREF(:,:,:,IBL), & + & PDZZ=PDZZ(:,:,:,IBL), PRHODJ=PRHODJ(:,:,:,IBL), PRHODREF=PRHODREF(:,:,:,IBL),PEXNREF=PEXNREF2(:,:,:,IBL),& + & PPABST=PPABSM(:,:,:,IBL), PCIT=PCIT(:,:,:,IBL), PCLDFR=PCLDFR(:,:,:,IBL), & + & PHLC_HRC=PHLC_HRC(:,:,:,IBL), PHLC_HCF=PHLC_HCF(:,:,:,IBL), & + & PHLI_HRI=PHLI_HRI(:,:,:,IBL), PHLI_HCF=PHLI_HCF(:,:,:,IBL), & + & PTHT=PTHT,PRVT=PRT(:,:,:,1,IBL),PRCT=PRT(:,:,:,2,IBL), & + & PRRT=PRT(:,:,:,3,IBL), & + & PRIT=PRT(:,:,:,4,IBL), PRST=PRT(:,:,:,5,IBL), & + & PRGT=PRT(:,:,:,6,IBL), & + & PTHS=PTHS(:,:,:,IBL), PRVS=PRS(:,:,:,1,IBL),PRCS=PRS(:,:,:,2,IBL),& + & PRRS=PRS(:,:,:,3,IBL),& + & PRIS=PRS(:,:,:,4,IBL),PRSS= PRS(:,:,:,5,IBL),PRGS= PRS(:,:,:,6,IBL),& + & PINPRC=ZINPRC(:,:,IBL),PINPRR=PINPRR(:,:,IBL),PEVAP3D=PEVAP(:,:,:,IBL),& + & PINPRS=PINPRS(:,:,IBL), PINPRG=PINPRG(:,:,IBL), PINDEP=ZINDEP(:,:,IBL), PRAINFR=ZRAINFR(:,:,:,IBL), & + & PSIGS=PSIGS(:,:,:,IBL), & + & TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET), & + & PSEA=PSEA, PTOWN=PTOWN, PFPR=PFPR(:,:,:,:,IBL)) + +#ifdef _OPENACC + ENDDO +#endif + + ENDDO + +#ifdef USE_OPENMP +!$OMP END PARALLEL +#endif + +!$acc end parallel loop + + TEC = OMP_GET_WTIME () + +!$acc end data + + TED = OMP_GET_WTIME () + + ZTC = ZTC + (TEC - TSC) + ZTD = ZTD + (TED - TSD) + +ENDDO + +IF (LHOOK) CALL DR_HOOK ('MAIN',1,ZHOOK_HANDLE) + +TE = OMP_GET_WTIME() + +WRITE (*,'(A,F8.2,A)') 'elapsed time : ',TE-TS,' s' +WRITE (*,'(A,F8.4,A)') ' i.e. ',1000.*(TE-TS)/(NPROMA*NGPBLKS)/NTIME,' ms/gp' + +PRINT *, " ZTD = ", ZTD, ZTD / REAL (NPROMA*NGPBLKS*NTIME) +PRINT *, " ZTC = ", ZTC, ZTC / REAL (NPROMA*NGPBLKS*NTIME) + + +IF (LLCHECK .OR. LLSTAT .OR. LLCHECKDIFF) THEN + DO IBL = IBLOCK1, IBLOCK2 + PRINT *, " IBL = ", IBL + DO JRR=1, KRR + WRITE (CLTEXT, '("PRS JRR=",I3.3)') JRR + CALL DIFF3 (CLTEXT, PRS_OUT (:,:,:,JRR,IBL), PRS (:,:,:,JRR,IBL)) + IF(JRR>=2) THEN + WRITE (CLTEXT, '("PFPR JRR=",I3.3)') JRR + CALL DIFF3 (CLTEXT, PFPR_OUT (:,:,:,JRR,IBL), PFPR (:,:,:,JRR,IBL)) + ENDIF + ENDDO + CALL DIFF3 ("PCIT", PCIT_OUT (:,:,:,IBL), PCIT (:,:,:,IBL)) + CALL DIFF2 ("ZINPRC", ZINPRC_OUT (:,:,IBL), ZINPRC (:,:,IBL)) + CALL DIFF2 ("PINPRRRS", PINPRR_OUT (:,:,IBL), PINPRR (:,:,IBL)) + CALL DIFF3 ("PEVAP", PEVAP_OUT (:,:,:,IBL), PEVAP (:,:,:,IBL)) + CALL DIFF2 ("PINPRS", PINPRS_OUT (:,:,IBL), PINPRS (:,:,IBL)) + CALL DIFF2 ("PINPRG", PINPRG_OUT (:,:,IBL), PINPRG (:,:,IBL)) + CALL DIFF2 ("ZINDEP", ZINDEP_OUT (:,:,IBL), ZINDEP (:,:,IBL)) + CALL DIFF3 ("ZRAINFR", ZRAINFR_OUT (:,:,:,IBL), ZRAINFR (:,:,:,IBL)) + ENDDO +ENDIF + +IF (LLCHECKDIFF) THEN + IF (LLDIFF) THEN + PRINT*, "THERE ARE DIFF SOMEWHERE" + ELSE + PRINT*, "THERE IS NO DIFF AT ALL" + ENDIF +ENDIF + +STOP + +CONTAINS + +SUBROUTINE DIFF3 (CDNAME, PREF, POUT) + +CHARACTER (LEN=*) :: CDNAME +REAL :: PREF (:,:,:) +REAL :: POUT (:,:,:) + +INTEGER :: JLON, JLEV + +PRINT *, CDNAME +IF (LLSTAT) THEN + PRINT *, MINVAL (PREF), MAXVAL (PREF), SUM (PREF) / SIZE (PREF) + PRINT *, MINVAL (POUT), MAXVAL (POUT), SUM (POUT) / SIZE (POUT) +ENDIF + +IF (LLCHECK) THEN + IF (SUM (ABS (POUT) + ABS (PREF)) > 0) THEN + WRITE (*, '(A4)', ADVANCE='NO') "" + DO JLON = 1, NPROMA + WRITE (*, '("|",I12,A12)', ADVANCE='NO') JLON, "" + ENDDO + WRITE (*, '("|")') + DO JLEV = 1, KLEV + WRITE (*, '(I4)', ADVANCE='NO') JLEV + DO JLON = 1, NPROMA + IF (ABS (PREF (JLON, 1, JLEV)) + ABS (POUT (JLON, 1, JLEV)) == 0.) THEN + WRITE (*, '("|",2A12)', ADVANCE='NO') "", "" + ELSE + WRITE (*, '("|",2E12.5)', ADVANCE='NO') PREF (JLON, 1, JLEV), POUT (JLON, 1, JLEV) + ENDIF + ENDDO + WRITE (*, '("|")') + ENDDO + ENDIF +ENDIF + +IF (LLCHECKDIFF) THEN + IF (SUM(ABS(POUT-PREF)) > 0.) THEN + PRINT*, "THERE ARE DIFF" + LLDIFF = .TRUE. + ELSE + PRINT*, "THERE IS NO DIFF" + ENDIF +ENDIF + +END SUBROUTINE + +SUBROUTINE DIFF2 (CDNAME, PREF, POUT) + +CHARACTER (LEN=*) :: CDNAME +REAL :: PREF (:,:) +REAL :: POUT (:,:) + +INTEGER :: JLON + +PRINT *, CDNAME +IF (LLSTAT) THEN + PRINT *, MINVAL (PREF), MAXVAL (PREF), SUM (PREF) / SIZE (PREF) + PRINT *, MINVAL (POUT), MAXVAL (POUT), SUM (POUT) / SIZE (POUT) +ENDIF + +IF (LLCHECK) THEN + IF (SUM (ABS (POUT) + ABS (PREF)) > 0) THEN + WRITE (*, '(A4)', ADVANCE='NO') "" + DO JLON = 1, NPROMA + WRITE (*, '("|",I12,A12)', ADVANCE='NO') JLON, "" + ENDDO + WRITE (*, '("|")') + WRITE (*, '(I4)', ADVANCE='NO') 0 + DO JLON = 1, NPROMA + IF (ABS (PREF (JLON, 1)) + ABS (POUT (JLON, 1)) == 0.) THEN + WRITE (*, '("|",2A12)', ADVANCE='NO') "", "" + ELSE + WRITE (*, '("|",2E12.5)', ADVANCE='NO') PREF (JLON, 1), POUT (JLON, 1) + ENDIF + ENDDO + WRITE (*, '("|")') + ENDIF +ENDIF + +IF (LLCHECKDIFF) THEN + IF (SUM(ABS(POUT-PREF)) > 0.) THEN + PRINT*, "THERE ARE DIFF" + LLDIFF = .TRUE. + ELSE + PRINT*, "THERE IS NO DIFF" + ENDIF +ENDIF + +END SUBROUTINE + + +SUBROUTINE INIT_PHYEX(KULOUT,LDWARM,CMICRO,CCSEDIM,LDCRIAUTI,& + PCRIAUTI,PT0CRIAUTI,PCRIAUTC) + +USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM +USE MODD_PARAM_ICE +USE MODD_TURB_N, ONLY: TURB_GOTO_MODEL, CSUBG_MF_PDF + +USE MODD_REF +USE MODI_INI_RAIN_ICE + +IMPLICIT NONE +! ----------------------------------------------------------------------- +! DUMMY INTEGER SCALARS +INTEGER, INTENT (IN) :: KULOUT +LOGICAL, INTENT (IN) :: LDWARM +CHARACTER(4), INTENT (IN) :: CMICRO +CHARACTER(4), INTENT (IN) :: CCSEDIM +LOGICAL, INTENT (IN) :: LDCRIAUTI +REAL, INTENT (IN) :: PCRIAUTI +REAL, INTENT (IN) :: PT0CRIAUTI +REAL, INTENT (IN) :: PCRIAUTC +!----------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: ZCRI0, ZTCRI0 +! ----------------------------------------------------------------------- + +CALL INI_CST +CALL TURB_GOTO_MODEL(1,1) +CALL PARAM_ICE_ASSOCIATE + +! 1. Set implicit default values for MODD_PARAM_ICE +LWARM=LDWARM +CPRISTINE_ICE='PLAT' +CSEDIM=CCSEDIM +CSUBG_AUCV_RC='PDF' +CSUBG_AUCV_RI='NONE' +CSUBG_RC_RR_ACCR='NONE' +CSUBG_RR_EVAP='NONE' +CSUBG_PR_PDF='SIGM' +CSUBG_MF_PDF='TRIANGLE' +! Snow riming +CSNOWRIMING='M90 ' +XFRACM90=0.1 ! Fraction used for the Murakami 1990 formulation +! +LFEEDBACKT=.TRUE. ! When .TRUE. feed back on temperature is taken into account +LEVLIMIT=.TRUE. ! When .TRUE. water vapour pressure is limited by saturation +LNULLWETG=.TRUE. ! When .TRUE. graupel wet growth is activated with null rate (to allow water shedding) +LWETGPOST=.TRUE. ! When .TRUE. graupel wet growth is activated with positive temperature (to allow water shedding) +LNULLWETH=.TRUE. ! Same as LNULLWETG but for hail +LWETHPOST=.TRUE. ! Same as LWETGPOST but for hail +LCONVHG=.TRUE. ! TRUE to allow the conversion from hail to graupel +LCRFLIMIT=.TRUE. !True to limit rain contact freezing to possible heat exchange +CFRAC_ICE_ADJUST='S' ! Ice/liquid partition rule to use in adjustment +CFRAC_ICE_SHALLOW_MF='S' ! Ice/liquid partition rule to use in shallow_mf +LSEDIM_AFTER=.FALSE. ! Sedimentation done after microphysics +XSPLIT_MAXCFL=0.8 +LDEPOSC=.FALSE. ! water deposition on vegetation +XVDEPOSC=0.02 ! deposition speed (2 cm.s-1) +! +! 2. Set implicit default values for MODD_RAIN_ICE_DESCR +! et MODD_RAIN_ICE_PARAM +XTHVREFZ=300. +! +CALL INI_RAIN_ICE (KULOUT, CMICRO) +!update values from namparar +IF (LDCRIAUTI) THEN + + XCRIAUTI=PCRIAUTI + XCRIAUTC=PCRIAUTC + XT0CRIAUTI=PT0CRIAUTI + !second point to determine 10**(aT+b) law + ZTCRI0=-40.0 + ZCRI0=1.25E-6 + + XBCRIAUTI=-( LOG10(XCRIAUTI) - LOG10(ZCRI0)*PT0CRIAUTI/ZTCRI0 )& + *ZTCRI0/(XT0CRIAUTI-ZTCRI0) + XACRIAUTI=(LOG10(ZCRI0)-XBCRIAUTI)/ZTCRI0 + +ENDIF +! ----------------------------------------------------------------------- + +END SUBROUTINE INIT_PHYEX + +END PROGRAM + diff --git a/src/testprogs/support/stack_mod.F90 b/src/testprogs/support/stack_mod.F90 new file mode 100644 index 0000000000000000000000000000000000000000..b02784fb84a2c467b8d521b6a56614f9e4350bda --- /dev/null +++ b/src/testprogs/support/stack_mod.F90 @@ -0,0 +1,26 @@ +MODULE STACK_MOD + +IMPLICIT NONE + +TYPE STACK + INTEGER*8 :: L, U +END TYPE + +PRIVATE + +PUBLIC :: STACK, SOF + +CONTAINS + +SUBROUTINE SOF (CDFILE, KLINE) +!$acc routine (SOF) seq + +CHARACTER (LEN=*) :: CDFILE +INTEGER :: KLINE + +PRINT *, 'AT ', CDFILE, ':', KLINE +STOP 1 + +END SUBROUTINE + +END MODULE diff --git a/src/testprogs/support/xrd_getoptions.F90 b/src/testprogs/support/xrd_getoptions.F90 new file mode 100644 index 0000000000000000000000000000000000000000..0d726c9c040f3903c84e0bc0491be2612a0c315f --- /dev/null +++ b/src/testprogs/support/xrd_getoptions.F90 @@ -0,0 +1,828 @@ +MODULE XRD_GETOPTIONS + +!**** *XRD_GETOPTIONS* - Parse command lines options in long form + +! Author. +! ------- +! Philippe Marguinaud *METEO FRANCE* +! Original : 11-09-2012 + +USE PARKIND1, ONLY: JPIM, JPRB, JPLM + +USE XRD_UNIX_ENV, ONLY: XRD_IARGC, XRD_GETARG, & + XRD_BASENAME, XRD_COUNTWORDS, XRD_GETENV, & + XRD_ISALPHA, XRD_ISDIGIT, XRD_EXIT + +IMPLICIT NONE + +INTERFACE GETOPTION + MODULE PROCEDURE GETOPTIONS, GETOPTIONSL, & + GETOPTIONI, GETOPTIONIL, & + GETOPTIONR, GETOPTIONRL, & + GETOPTIONB + +END INTERFACE + +!! @TODO : LIST WITH FIXED SIZE + +PUBLIC :: GETOPTION, INITOPTIONS, CHECKOPTIONS, ADDGROUP + +INTEGER, PARAMETER :: ARGSIZEMAX = 256 + +CHARACTER(LEN=ARGSIZEMAX), POINTER :: MYARGS(:) => NULL() +LOGICAL(KIND=JPLM), POINTER :: CHECK_ARGS(:) => NULL() +LOGICAL(KIND=JPLM) :: LHELP = .FALSE., LSHELL = .FALSE. + +CHARACTER(LEN=1056) :: MESSAGE_OPT = "" + + +TYPE XRD_OPT + CHARACTER(LEN=32) :: KEY, TYPE + CHARACTER(LEN=1024) :: USE + LOGICAL(KIND=JPLM) :: GROUP = .FALSE. +END TYPE + +INTEGER(KIND=JPIM) :: NOPT_SEEN +TYPE(XRD_OPT), POINTER :: OPT_SEEN(:) => NULL() + +PRIVATE + +CONTAINS + +SUBROUTINE ADDGROUP( USE ) +CHARACTER(LEN=*), INTENT(IN) :: USE + +CALL INIT_OPT_SEEN() +NOPT_SEEN = NOPT_SEEN + 1 +CALL GROW_OPT_SEEN() + +OPT_SEEN(NOPT_SEEN)%GROUP = .TRUE. +OPT_SEEN(NOPT_SEEN)%USE = USE + + +END SUBROUTINE + +CHARACTER(LEN=ARGSIZEMAX) FUNCTION GET_ENV_OPT( KEY ) +CHARACTER(LEN=*), INTENT(IN) :: KEY +CHARACTER(LEN=ARGSIZEMAX) :: KEY_ENV, VAL_ENV +INTEGER(KIND=JPIM) :: I, N +CHARACTER :: C + +KEY_ENV = KEY(3:) + +N = LEN(TRIM(KEY_ENV)) +DO I = 1, N + C = KEY_ENV(I:I) + IF((.NOT.XRD_ISALPHA(C)) .AND. & + (.NOT.XRD_ISDIGIT(C)) .AND. & + (C .NE. '_' )) THEN + KEY_ENV(I:I) = '_' + ENDIF +ENDDO + +VAL_ENV = "" +CALL XRD_GETENV( 'XRD_OPT_'//TRIM(KEY_ENV), VAL_ENV ) + +!PRINT *, " KEY = ", TRIM(KEY_ENV), " VAL = ", TRIM(VAL_ENV) + +GET_ENV_OPT = VAL_ENV + +END FUNCTION + +SUBROUTINE MYGETARG( I, S ) + INTEGER(KIND=JPIM), INTENT(IN) :: I + CHARACTER(LEN=*), INTENT(OUT) :: S +! + IF( I .LE. UBOUND( MYARGS, 1 ) ) THEN + S = MYARGS(I) + ELSE + S = "" + ENDIF +END SUBROUTINE + +INTEGER FUNCTION MYIARGC() + INTEGER :: N + N = UBOUND( MYARGS, 1 ) + MYIARGC = N +END FUNCTION + +SUBROUTINE ADDOPT_SHELL( KEY, TYPE, MND, USE ) + CHARACTER*(*), INTENT(IN) :: KEY, TYPE, USE + LOGICAL(KIND=JPLM), INTENT(IN) :: MND + OPTIONAL :: USE, MND +! + CHARACTER(LEN=ARGSIZEMAX) :: STR + INTEGER :: NN, N, N1, I1, I2, K + CHARACTER(LEN=ARGSIZEMAX), POINTER :: MYARGS1(:) + + MYARGS1 => NULL() + + IF( PRESENT( USE ) ) WRITE( *, '("> ",A)' ) TRIM(USE) + IF( PRESENT( MND ) ) THEN + IF( MND ) WRITE( *, * ) "[MANDATORY]" + ENDIF + WRITE( *, * ) "* OPTION: [", TYPE, "]", " ", TRIM(KEY) + READ( *, '(A)' ) STR + +! PRINT *, "STR = ",TRIM(STR) + IF( TRIM(STR) .NE. "" ) THEN + IF( TYPE .EQ. 'FLAG' ) THEN + NN = 0 + ELSE + NN = XRD_COUNTWORDS( STR ) + ENDIF + N = UBOUND( MYARGS, 1 ) + N1 = N + NN + 1 + +! +! REALLOC MYARGS +! + ALLOCATE( MYARGS1(0:N1) ) + MYARGS1(0:N) = MYARGS(0:N) + DEALLOCATE( MYARGS ) + MYARGS => MYARGS1 + MYARGS(N+1) = KEY + +! +! PARSE ARGUMENT LIST +! + IF( TYPE .NE. 'FLAG' ) THEN + K = 1 + I1 = 1 + LOOP_I1 : DO + DO + IF( I1 .GT. LEN(STR)) EXIT LOOP_I1 + IF( STR(I1:I1) .NE. ' ' ) EXIT + I1 = I1+1 + ENDDO + I2 = I1+1 + DO + IF( I2 .GT. LEN(STR)) EXIT + IF( STR(I2:I2) .EQ. ' ' ) EXIT + I2 = I2+1 + ENDDO +!PRINT *, I1, I2 + MYARGS(N+1+K) = STR(I1:I2-1) +!PRINT *, K, TRIM(MYARGS(N+1+K)) + K = K+1 + I1 = I2+1 + ENDDO LOOP_I1 + ENDIF + ENDIF + +END SUBROUTINE + +SUBROUTINE INIT_OPT_SEEN() + + IF( .NOT. ASSOCIATED( OPT_SEEN ) ) THEN + NOPT_SEEN = 0 + ALLOCATE( OPT_SEEN( 32 ) ) + ENDIF + +END SUBROUTINE + +SUBROUTINE GROW_OPT_SEEN() + INTEGER(KIND=JPIM) :: N + TYPE(XRD_OPT), POINTER :: OPT_SEEN1(:) + + N = SIZE( OPT_SEEN ) + IF( NOPT_SEEN .GE. N ) THEN ! REALLOC DATA + OPT_SEEN1 => OPT_SEEN + ALLOCATE( OPT_SEEN( 2 * N ) ) + OPT_SEEN(1:NOPT_SEEN) = OPT_SEEN1(1:NOPT_SEEN) + DEALLOCATE( OPT_SEEN1 ) + ENDIF + +END SUBROUTINE + +SUBROUTINE ADDOPT( KEY, TYPE, USE ) + CHARACTER*(*), INTENT(IN) :: KEY, TYPE, USE + OPTIONAL :: USE + + CALL INIT_OPT_SEEN() + + NOPT_SEEN = NOPT_SEEN + 1 + + CALL GROW_OPT_SEEN() + + OPT_SEEN(NOPT_SEEN)%KEY = KEY + OPT_SEEN(NOPT_SEEN)%TYPE = TYPE + + IF( PRESENT( USE ) ) THEN + OPT_SEEN(NOPT_SEEN)%USE = USE + ELSE + OPT_SEEN(NOPT_SEEN)%USE = '' + ENDIF + +END SUBROUTINE + +SUBROUTINE INITOPTIONS( CDMESSAGE, KOPTMIN, KOPTMAX, CDARGS ) + CHARACTER(LEN=*), OPTIONAL, INTENT (IN) :: CDMESSAGE + INTEGER (KIND=JPIM), OPTIONAL, INTENT (IN) :: KOPTMIN, KOPTMAX + CHARACTER (LEN=*), OPTIONAL, INTENT (IN) :: CDARGS (0:) + INTEGER(KIND=JPIM) :: N, I + INTEGER(KIND=JPIM) :: IOPTMIN, IOPTMAX + CHARACTER*32 :: STR + + IF (PRESENT (CDARGS)) THEN + N = UBOUND (CDARGS, 1) + ELSE + N = XRD_IARGC() + ENDIF + + IOPTMIN = 0 + IOPTMAX = N + IF (PRESENT (KOPTMIN)) IOPTMIN = KOPTMIN + IF (PRESENT (KOPTMAX)) IOPTMAX = KOPTMAX + + N = IOPTMAX-IOPTMIN + + ALLOCATE( MYARGS(0:N) ) + DO I = 0, N + IF (PRESENT (CDARGS)) THEN + MYARGS(I) = CDARGS (IOPTMIN+I) + ELSE + CALL XRD_GETARG( IOPTMIN+I, MYARGS(I) ) + ENDIF + ENDDO + + IF( PRESENT( CDMESSAGE ) ) THEN + MESSAGE_OPT = CDMESSAGE + ELSE + MESSAGE_OPT = "" + ENDIF + + IF( N .EQ. 1 ) THEN + CALL MYGETARG( 1_JPIM, STR ) + IF( TRIM( STR ) .EQ. '--help' ) THEN + LHELP = .TRUE. + RETURN + ELSE IF( TRIM( STR ) .EQ. '--shell' ) THEN + LSHELL = .TRUE. + RETURN + ENDIF + ENDIF + + LHELP = .FALSE. + ALLOCATE( CHECK_ARGS( N ) ) + CHECK_ARGS = .FALSE. + +END SUBROUTINE + + + +SUBROUTINE CHECKOPTIONS() + INTEGER(KIND=JPIM) :: I, N, IS, NS, KS + CHARACTER(LEN=ARGSIZEMAX) :: OPT, PROG + LOGICAL(KIND=JPLM) :: PB + CHARACTER(LEN=10) :: FMT + CHARACTER(LEN=110) :: BUF + + CALL MYGETARG( 0_JPIM, PROG ) + + IF( LHELP ) THEN + PRINT *, "PROGRAM: ", TRIM(XRD_BASENAME( PROG )) + IF( TRIM(MESSAGE_OPT) .NE. "" ) THEN + NS = LEN(MESSAGE_OPT) + DO IS = 1, NS / 96 + KS = LEN( TRIM(MESSAGE_OPT(1+(IS-1)*96:IS*96)) ) + IF( KS .GT. 0 ) THEN + IF( IS .EQ. 1 ) THEN + WRITE( *, '(" ")', ADVANCE = 'NO' ) + ELSE + WRITE( *, '(" > ")', ADVANCE = 'NO' ) + ENDIF + WRITE( FMT, '("(A",I2,")")' ) KS + WRITE( *, FMT ) TRIM(MESSAGE_OPT(1+(IS-1)*96:IS*96)) + ENDIF + ENDDO + ENDIF + DO I = 1, NOPT_SEEN + + IF(OPT_SEEN(I)%GROUP) THEN + WRITE( *, * ) + IF( TRIM(OPT_SEEN(I)%USE) .NE. "" ) & + WRITE( *, * ) '* '//TRIM(OPT_SEEN(I)%USE) + CYCLE + ENDIF + + BUF = "" + + WRITE( BUF, '(A32," = ",A15)' ) & + TRIM(OPT_SEEN(I)%KEY), & + TRIM(OPT_SEEN(I)%TYPE) + + IF( TRIM(OPT_SEEN(I)%USE) .NE. '' ) THEN + NS = LEN( OPT_SEEN(I)%USE) + DO IS = 1, NS / 48 + KS = LEN(TRIM(OPT_SEEN(I)%USE(1+(IS-1)*48:IS*48))) + IF( KS .GT. 0 ) THEN + IF( IS .EQ. 1 ) THEN + BUF = TRIM(BUF)//" : "//TRIM(OPT_SEEN(I)%USE(1+(IS-1)*48:IS*48)) + ELSE +! 000000000011111111112222222222333333333344444444445555555555 +! 012345678901234567890123456789012345678901234567890123456789 + BUF = " > "& + //TRIM(OPT_SEEN(I)%USE(1+(IS-1)*48:IS*48)) + ENDIF + WRITE( *, * ) BUF + ENDIF + ENDDO + ELSE + WRITE( *, * ) BUF + WRITE( *, * ) + ENDIF + + ENDDO + STOP + ELSE IF( ASSOCIATED( CHECK_ARGS ) ) THEN + N = SIZE( CHECK_ARGS ) + PB = .FALSE. + DO I = 1, N + IF( .NOT. CHECK_ARGS(I) ) THEN + CALL MYGETARG( I, OPT ) + IF( OPT(1:2) .EQ. '--' ) THEN + PRINT *, 'INVALID OPTION: ', TRIM(OPT) + PB = .TRUE. + CHECK_ARGS(I) = .TRUE. + ENDIF + ENDIF + ENDDO + + DO I = 1, N + IF( .NOT. CHECK_ARGS(I) ) THEN + CALL MYGETARG( I, OPT ) + PRINT *, 'GARBAGE IN OPTIONS:`', TRIM(OPT), "'" + PB = .TRUE. + EXIT + ENDIF + ENDDO + + IF( PB ) CALL XRD_EXIT(1_JPIM) + + DEALLOCATE( CHECK_ARGS ) + ELSE IF( LSHELL ) THEN + OPEN( 77, FILE = TRIM(PROG)//'.sh', FORM = 'FORMATTED' ) + WRITE( 77, '("#!/bin/sh")' ) + WRITE( 77, * ) + WRITE( 77, '(A)', ADVANCE = 'NO' ) TRIM(PROG) + N = UBOUND( MYARGS, 1 ) + DO I = 1, N + IF( MYARGS(I) .EQ. '--shell' ) CYCLE + IF( MYARGS(I)(1:2) .EQ. '--' ) THEN + WRITE( 77, '(" \")' ) + WRITE( 77, '(" ")', ADVANCE = 'NO' ) + ENDIF + WRITE( 77, '(" ",A)', ADVANCE = 'NO' ) TRIM(MYARGS(I)) + ENDDO + WRITE( 77, * ) + CLOSE(77) + ENDIF + + + + IF( ASSOCIATED( OPT_SEEN ) ) DEALLOCATE( OPT_SEEN ) + IF( ASSOCIATED( MYARGS ) ) DEALLOCATE( MYARGS ) +END SUBROUTINE + + +SUBROUTINE CHECK_MND( KEY, MND, USE ) + CHARACTER(LEN=*), INTENT(IN) :: KEY + CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE + LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND +! + CHARACTER(LEN=ARGSIZEMAX) :: PROG + + IF( PRESENT( MND ) ) THEN + IF( MND ) THEN + CALL MYGETARG( 0_JPIM, PROG ) + WRITE( *, '("PROGRAM: ",(A))' ) TRIM( PROG ) + WRITE( *, '("ERROR: OPTION `",(A),"'' IS MANDATORY")' ) TRIM( KEY ) + IF( PRESENT( USE ) ) WRITE( *, '(" ",(A)," : ",(A))' ) TRIM( KEY ), TRIM( USE ) + CALL XRD_EXIT(1_JPIM) + ENDIF + ENDIF + +END SUBROUTINE + +SUBROUTINE FINDARGINDEX( KEY, I, N ) + CHARACTER(LEN=*), INTENT(IN) :: KEY + INTEGER(KIND=JPIM), INTENT(OUT) :: I, N + CHARACTER(LEN=ARGSIZEMAX) :: ARG + + N = MYIARGC() + DO I = 1, N + CALL MYGETARG( I, ARG ) + IF( TRIM( ARG ) .EQ. TRIM( KEY ) ) RETURN + ENDDO + I = -1_JPIM +END SUBROUTINE + +SUBROUTINE FINDNEXTARGINDEX( I, J ) + INTEGER(KIND=JPIM), INTENT(IN) :: I + INTEGER(KIND=JPIM), INTENT(OUT) :: J +! + CHARACTER(LEN=ARGSIZEMAX) :: ARG + INTEGER(KIND=JPIM) :: N + + N = MYIARGC() + DO J = I+1, N + CALL MYGETARG( J, ARG ) + IF( ARG(1:2) .EQ. '--' ) EXIT + ENDDO + +END SUBROUTINE + +SUBROUTINE GETOPTIONS( KEY, VAL, MND, USE ) +! + CHARACTER(LEN=*), INTENT(IN) :: KEY + CHARACTER(LEN=*), INTENT(INOUT) :: VAL + LOGICAL(KIND=JPLM), INTENT(IN), OPTIONAL :: MND + CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: USE +! + INTEGER(KIND=JPIM) :: I, N + CHARACTER(LEN=ARGSIZEMAX) :: ARG + LOGICAL(KIND=JPLM) :: LSHELL1 + LOGICAL(KIND=JPLM) :: FOUND + + LSHELL1 = LSHELL + + IF( LHELP ) THEN + CALL ADDOPT( KEY, 'STRING', USE ) + RETURN + ELSE IF( LSHELL ) THEN + LSHELL = .FALSE. + CALL ADDOPT_SHELL( KEY, 'STRING', MND, USE ) + ENDIF + + CALL FINDARGINDEX( KEY, I, N ) + + FOUND = ( 0 .LT. I ) .AND. ( I .LT. N ) + + IF( FOUND ) THEN + IF( ASSOCIATED( CHECK_ARGS ) ) THEN + CHECK_ARGS(I) = .TRUE. + CHECK_ARGS(I+1) = .TRUE. + ENDIF + CALL MYGETARG( I+1_JPIM, VAL ) + ELSE + ARG = GET_ENV_OPT( KEY ) + FOUND = ARG .NE. "" + IF( FOUND ) VAL = ARG + ENDIF + + IF( .NOT. FOUND ) & + CALL CHECK_MND( KEY, MND, USE ) + + LSHELL = LSHELL1 + +END SUBROUTINE + +SUBROUTINE GETOPTIONI( KEY, VAL, MND, USE ) +! + CHARACTER(LEN=*), INTENT(IN) :: KEY + INTEGER(KIND=JPIM), INTENT(INOUT) :: VAL + LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND + CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE +! + CHARACTER(LEN=ARGSIZEMAX) :: SVAL + INTEGER :: ERR + LOGICAL(KIND=JPLM) :: LSHELL1 + + LSHELL1 = LSHELL + + IF( LHELP ) THEN + CALL ADDOPT( KEY, 'INTEGER', USE ) + RETURN + ELSE IF( LSHELL ) THEN + LSHELL = .FALSE. + CALL ADDOPT_SHELL( KEY, 'INTEGER', MND, USE ) + ENDIF + + SVAL = "" + CALL GETOPTIONS( KEY, SVAL, MND, USE ) + IF( TRIM( SVAL ) .NE. "" ) THEN + READ( SVAL, *, IOSTAT = ERR ) VAL + IF( ERR .NE. 0 ) THEN + PRINT *, "ERROR WHILE PARSING OPTION "//TRIM(KEY) + CALL XRD_EXIT(1_JPIM) + ENDIF + ENDIF + + LSHELL = LSHELL1 + +END SUBROUTINE + +SUBROUTINE GETOPTIONR( KEY, VAL, MND, USE ) +! + CHARACTER(LEN=*), INTENT(IN) :: KEY + REAL(KIND=JPRB), INTENT(INOUT) :: VAL + LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND + CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE +! + CHARACTER(LEN=ARGSIZEMAX) :: SVAL + INTEGER :: ERR + LOGICAL(KIND=JPLM) :: LSHELL1 + + LSHELL1 = LSHELL + + IF( LHELP ) THEN + CALL ADDOPT( KEY, 'REAL', USE ) + RETURN + ELSE IF( LSHELL ) THEN + LSHELL = .FALSE. + CALL ADDOPT_SHELL( KEY, 'REAL', MND, USE ) + ENDIF + + SVAL = "" + CALL GETOPTIONS( KEY, SVAL, MND, USE ) + IF( TRIM( SVAL ) .NE. "" ) THEN + READ( SVAL, *, IOSTAT = ERR ) VAL + IF( ERR .NE. 0 ) THEN + PRINT *, "ERROR WHILE PARSING OPTION "//TRIM(KEY) + CALL XRD_EXIT(1_JPIM) + ENDIF + ENDIF + + LSHELL = LSHELL1 + +END SUBROUTINE + +SUBROUTINE READASLFROMSTRING( VAL, SVAL ) + CHARACTER(LEN=*), INTENT(OUT) :: VAL(:) + CHARACTER(LEN=*), INTENT(IN) :: SVAL +! + INTEGER(KIND=JPIM) :: I, J, K, N + + N = LEN( SVAL ) + + I = 1 + K = 1 + DO1 : DO + DO + IF( I .GT. N ) EXIT DO1 + IF( SVAL(I:I) .NE. ' ' ) EXIT + I = I + 1 + ENDDO + J = I + DO + IF( J .GT. N ) EXIT + IF( SVAL(J:J) .EQ. ' ' ) EXIT + J = J + 1 + ENDDO + + VAL(K) = SVAL(I:J-1) + I = J + K = K + 1 + ENDDO DO1 + + +END SUBROUTINE + +SUBROUTINE READSLFROMSTRING( VAL, SVAL ) + CHARACTER(LEN=*), POINTER :: VAL(:) + CHARACTER(LEN=*), INTENT(IN) :: SVAL +! + INTEGER(KIND=JPIM) :: N + + N = XRD_COUNTWORDS( SVAL ) + ALLOCATE( VAL( N ) ) + + CALL READASLFROMSTRING( VAL, SVAL ) + +END SUBROUTINE + +SUBROUTINE READSLFROMFILE( VAL, SVAL ) + CHARACTER(LEN=*), POINTER :: VAL(:) + CHARACTER(LEN=*), INTENT(IN) :: SVAL +! + INTEGER(KIND=JPIM) :: K, N + INTEGER(KIND=JPIM) :: IOERR + CHARACTER(LEN=4096) :: BUFFER + + OPEN( 77, FILE = TRIM(SVAL), FORM = 'FORMATTED', STATUS = 'OLD', IOSTAT = IOERR ) + IF( IOERR .NE. 0 ) THEN + PRINT '( "COULD NOT OPEN ",A, " FOR READING")', TRIM(SVAL) + CALL XRD_EXIT(1_JPIM) + ENDIF + N = 0_JPIM + DO + READ( 77, '(A)', END = 500 ) BUFFER + N = N + XRD_COUNTWORDS( BUFFER ) + ENDDO + + 500 CONTINUE + + REWIND( 77 ) + + ALLOCATE( VAL( N ) ) + + K = 1 + DO + READ( 77, '(A)', END = 600 ) BUFFER + N = XRD_COUNTWORDS( BUFFER ) + CALL READASLFROMSTRING( VAL(K:K+N-1), BUFFER ) + K = K + N + ENDDO + + 600 CONTINUE + + + CLOSE( 77 ) + +END SUBROUTINE + +SUBROUTINE GETOPTIONSL( KEY, VAL, MND, USE ) +! + CHARACTER(LEN=*), INTENT(IN) :: KEY + CHARACTER(LEN=*), POINTER :: VAL(:) + LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND + CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE +! + INTEGER(KIND=JPIM) :: I, J, K, N + CHARACTER(LEN=ARGSIZEMAX) :: ARG + CHARACTER(LEN=ARGSIZEMAX) :: SVAL + LOGICAL(KIND=JPLM) :: LSHELL1 + LOGICAL(KIND=JPLM) :: FOUND + + LSHELL1 = LSHELL + + IF( LHELP ) THEN + CALL ADDOPT( KEY, 'STRING-LIST', USE ) + RETURN + ELSE IF( LSHELL ) THEN + LSHELL = .FALSE. + CALL ADDOPT_SHELL( KEY, 'STRING-LIST', MND, USE ) + ENDIF + + CALL FINDARGINDEX( KEY, I, N ) + + FOUND = I >= 0 + + IF( FOUND ) THEN + + CALL FINDNEXTARGINDEX( I, J ) + + ALLOCATE( VAL( J - I - 1 ) ) + + IF( ASSOCIATED( CHECK_ARGS ) ) & + CHECK_ARGS(I) = .TRUE. + + DO K = I+1, J-1 + IF( ASSOCIATED( CHECK_ARGS ) ) & + CHECK_ARGS(K) = .TRUE. + CALL MYGETARG( K, ARG ) + IF ((I+1.EQ.J-1) .AND. (ARG(1:7).EQ.'file://')) THEN + DEALLOCATE (VAL) + ARG = ARG(8:) + CALL READSLFROMFILE( VAL, ARG ) + ELSE + VAL(K-I) = ARG + ENDIF + ENDDO + + ENDIF + + IF(.NOT. FOUND) THEN + SVAL = GET_ENV_OPT( KEY ) + FOUND = SVAL .NE. "" + IF( FOUND ) & + CALL READSLFROMSTRING( VAL, SVAL ) + ENDIF + + IF( .NOT. FOUND ) & + CALL CHECK_MND( KEY, MND, USE ) + + LSHELL = LSHELL1 + +END SUBROUTINE + +SUBROUTINE GETOPTIONIL( KEY, VAL, MND, USE ) +! + CHARACTER(LEN=*), INTENT(IN) :: KEY + INTEGER(KIND=JPIM), POINTER :: VAL(:) + LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND + CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE +! + CHARACTER(LEN=ARGSIZEMAX), POINTER :: SVAL(:) + INTEGER(KIND=JPIM) :: I, N + INTEGER :: ERR + LOGICAL(KIND=JPLM) :: LSHELL1 + + NULLIFY (SVAL) + + LSHELL1 = LSHELL + + IF( LHELP ) THEN + CALL ADDOPT( KEY, 'INTEGER-LIST', USE ) + RETURN + ELSE IF( LSHELL ) THEN + LSHELL = .FALSE. + CALL ADDOPT_SHELL( KEY, 'INTEGER-LIST', MND, USE ) + ENDIF + + CALL GETOPTIONSL( KEY, SVAL, MND, USE ) + + IF( .NOT. ASSOCIATED( SVAL ) ) GOTO 999 + + N = SIZE( SVAL ) + ALLOCATE( VAL( N ) ) + DO I = 1, N + READ( SVAL( I ), *, IOSTAT = ERR ) VAL( I ) + IF( ERR .NE. 0 ) THEN + PRINT *, "ERROR WHILE PARSING OPTION "//TRIM(KEY) + CALL XRD_EXIT(1_JPIM) + ENDIF + ENDDO + + DEALLOCATE( SVAL ) + +999 CONTINUE + LSHELL = LSHELL1 + +END SUBROUTINE + +SUBROUTINE GETOPTIONRL( KEY, VAL, MND, USE ) +! + CHARACTER(LEN=*), INTENT(IN) :: KEY + REAL(KIND=JPRB), POINTER :: VAL(:) + LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND + CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE +! + CHARACTER(LEN=ARGSIZEMAX), POINTER :: SVAL(:) + INTEGER(KIND=JPIM) :: I, N + INTEGER :: ERR + LOGICAL(KIND=JPLM) :: LSHELL1 + + NULLIFY (SVAL) + + LSHELL1 = LSHELL + + IF( LHELP ) THEN + CALL ADDOPT( KEY, 'REAL-LIST', USE ) + RETURN + ELSE IF( LSHELL ) THEN + LSHELL = .FALSE. + CALL ADDOPT_SHELL( KEY, 'REAL-LIST', MND, USE ) + ENDIF + + CALL GETOPTIONSL( KEY, SVAL, MND, USE ) + + IF( .NOT. ASSOCIATED( SVAL ) ) GOTO 999 + + N = SIZE( SVAL ) + ALLOCATE( VAL( N ) ) + DO I = 1, N + READ( SVAL( I ), *, IOSTAT = ERR ) VAL( I ) + IF( ERR .NE. 0 ) THEN + PRINT *, "ERROR WHILE PARSING OPTION "//TRIM(KEY) + CALL XRD_EXIT(1_JPIM) + ENDIF + ENDDO + + DEALLOCATE( SVAL ) + +999 CONTINUE + LSHELL = LSHELL1 + +END SUBROUTINE + +SUBROUTINE GETOPTIONB( KEY, VAL, USE ) +! + CHARACTER(LEN=*), INTENT(IN) :: KEY + LOGICAL(KIND=JPLM), INTENT(INOUT) :: VAL + CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE +! + LOGICAL(KIND=JPLM) :: LSHELL1 + LOGICAL(KIND=JPLM) :: FOUND + CHARACTER(LEN=ARGSIZEMAX) :: SVAL + INTEGER(KIND=JPIM) :: I, N + + LSHELL1 = LSHELL + + VAL = .FALSE. + + IF( LHELP ) THEN + CALL ADDOPT( KEY, 'FLAG', USE ) + RETURN + ELSE IF( LSHELL ) THEN + LSHELL = .FALSE. + CALL ADDOPT_SHELL( KEY, 'FLAG', .FALSE._JPLM, USE ) + ENDIF + + CALL FINDARGINDEX( KEY, I, N ) + FOUND = I > 0 + IF( FOUND .AND. ASSOCIATED( CHECK_ARGS ) ) THEN + CHECK_ARGS(I) = .TRUE. + VAL = .TRUE. + ELSE + SVAL = GET_ENV_OPT( KEY ) + IF( SVAL .NE. "" ) & + READ( SVAL, * ) VAL + ENDIF + + LSHELL = LSHELL1 + +END SUBROUTINE + +END MODULE diff --git a/src/testprogs/support/xrd_unix_env.F90 b/src/testprogs/support/xrd_unix_env.F90 new file mode 100644 index 0000000000000000000000000000000000000000..c689c6255ffed05f25c2f988961d679f3d186476 --- /dev/null +++ b/src/testprogs/support/xrd_unix_env.F90 @@ -0,0 +1,181 @@ +MODULE XRD_UNIX_ENV + +!**** *XRD_UNIX_ENV* - + +! Author. +! ------- +! Philippe Marguinaud *METEO FRANCE* +! Original : 11-09-2012 + +USE PARKIND1, ONLY : JPIM, JPRB, JPLM +IMPLICIT NONE + +CONTAINS + +SUBROUTINE XRD_GETENV( KEY, VAL ) + IMPLICIT NONE + CHARACTER(LEN=*), INTENT(IN) :: KEY + CHARACTER(LEN=*), INTENT(OUT) :: VAL + + CALL GET_ENVIRONMENT_VARIABLE( KEY, VAL ) +END SUBROUTINE + + +FUNCTION XRD_IARGC() + IMPLICIT NONE + INTEGER(KIND=JPIM) :: XRD_IARGC + XRD_IARGC = COMMAND_ARGUMENT_COUNT() +END FUNCTION + +SUBROUTINE XRD_GETARG( KEY, VAL ) + IMPLICIT NONE + INTEGER(KIND=JPIM), INTENT(IN) :: KEY + CHARACTER(LEN=*), INTENT(OUT) :: VAL + CALL GETARG( INT(KEY,SELECTED_INT_KIND(9)), VAL ) +END SUBROUTINE + +SUBROUTINE XRD_EXIT( STATUS ) + IMPLICIT NONE + INTEGER(KIND=JPIM), INTENT(IN) :: STATUS + CALL EXIT( INT(STATUS,SELECTED_INT_KIND(9)) ) +END SUBROUTINE + +SUBROUTINE XRD_MKDIR( PATH ) + IMPLICIT NONE + CHARACTER(LEN=*), INTENT(IN) :: PATH + CALL SYSTEM( "mkdir -p "//TRIM(PATH)) +END SUBROUTINE + +CHARACTER*256 FUNCTION XRD_DIRNAME( PATH ) + IMPLICIT NONE + CHARACTER(LEN=*), INTENT(IN) :: PATH + + INTEGER(KIND=JPIM) :: I + XRD_DIRNAME = "" + I = LEN( TRIM( PATH ) ) - 1 + DO + IF( I .LE. 0 ) RETURN + IF( PATH(I:I) .EQ. '/' ) EXIT + I = I - 1 + ENDDO + XRD_DIRNAME = PATH(1:I) +END FUNCTION + +FUNCTION XRD_BASENAME( PATH ) + IMPLICIT NONE + CHARACTER*256 :: XRD_BASENAME + CHARACTER(LEN=*), INTENT(IN) :: PATH + + INTEGER(KIND=JPIM) :: I + XRD_BASENAME = "" + I = LEN( TRIM( PATH ) ) - 1 + DO + IF( I .LE. 0 ) THEN + I = 0 + EXIT + ENDIF + IF( PATH(I:I) .EQ. '/' ) EXIT + I = I - 1 + ENDDO + XRD_BASENAME = PATH(I+1:) +END FUNCTION + +ELEMENTAL SUBROUTINE XRD_LOWER_CASE(OUS,INS) +IMPLICIT NONE +! CONVERT A WORD TO LOWER CASE +CHARACTER (LEN=*) , INTENT(OUT) :: OUS +CHARACTER (LEN=*) , INTENT(IN) :: INS +INTEGER :: I,IC,NLEN +NLEN = LEN(INS) +OUS = '' +DO I=1,NLEN + IC = ICHAR(INS(I:I)) + IF (IC >= 65 .AND. IC < 90) THEN + OUS(I:I) = CHAR(IC+32) + ELSE + OUS(I:I) = INS(I:I) + ENDIF +END DO +END SUBROUTINE XRD_LOWER_CASE + +FUNCTION XRD_ISALPHA(C) +IMPLICIT NONE +LOGICAL(KIND=JPLM) :: XRD_ISALPHA +CHARACTER, INTENT(IN) :: C + +XRD_ISALPHA = ((C.GE.'A').AND.(C.LE.'Z'))& + .OR.((C.GE.'a').AND.(C.LE.'z')) + +END FUNCTION + +FUNCTION XRD_ISDIGIT(C) +IMPLICIT NONE +LOGICAL(KIND=JPLM) :: XRD_ISDIGIT +CHARACTER, INTENT(IN) :: C + +XRD_ISDIGIT = (C.GE.'0').AND.(C.LE.'9') + +END FUNCTION + +SUBROUTINE XRD_DATE_AND_TIME( VL ) +IMPLICIT NONE +INTEGER(KIND=JPIM), INTENT(OUT) :: VL(8) +! +INTEGER :: VLX(8) + + CALL DATE_AND_TIME( VALUES = VLX ) + + VL = VLX +END SUBROUTINE + +SUBROUTINE XRD_CPU_TIME( T ) + IMPLICIT NONE + REAL,INTENT(OUT) :: T + CALL CPU_TIME( T ) +END SUBROUTINE + +SUBROUTINE XRD_COUNTLINES( NLINES, F, ERR ) +IMPLICIT NONE +INTEGER(KIND=JPIM), INTENT(OUT) :: NLINES +CHARACTER*(*), INTENT(IN) :: F +INTEGER(KIND=JPIM), INTENT(OUT) :: ERR +CHARACTER*32 :: STR + +NLINES = 0 +OPEN( 77, FILE = F, ERR = 888 ) + +DO + READ( 77, *, ERR = 888, END = 777 ) STR + NLINES = NLINES + 1 +ENDDO + +777 CONTINUE + +CLOSE( 77 ) + +RETURN +888 CONTINUE + ERR = 1 +END SUBROUTINE + +FUNCTION XRD_COUNTWORDS( S ) + IMPLICIT NONE + INTEGER(KIND=JPIM) :: XRD_COUNTWORDS + CHARACTER(LEN=*), INTENT(IN) :: S + INTEGER(KIND=JPIM) :: N, I, L + LOGICAL(KIND=JPLM) :: IN + N = 0_JPIM + IN = .FALSE. + L = LEN( TRIM( S ) ) + DO I = 1, L + IF( S(I:I) .EQ. ' ' ) THEN + IN = .FALSE. + ELSE IF( .NOT. IN ) THEN + N = N + 1 + IN = .TRUE. + ENDIF + ENDDO + XRD_COUNTWORDS = N +END FUNCTION + +END MODULE