diff --git a/build/with_fcm/arch/arch-gnu.fcm b/build/with_fcm/arch/arch-gnu.fcm index f390165536a46d0142ffea354d0595220cfbfa0b..63e0200e1f57dbbf93ba19ca1d9b3462e10919f5 100644 --- a/build/with_fcm/arch/arch-gnu.fcm +++ b/build/with_fcm/arch/arch-gnu.fcm @@ -3,12 +3,12 @@ $FCOMPILER = gfortran $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 -fopenmp $PROD_CFLAGS = -O3 $DEV_CFLAGS = -O1 -$DEBUG_CFLAGS = -check bounds +$DEBUG_CFLAGS = -fbounds-check $OMP_FFLAGS = # Preprocessor 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/testprogs/ice_adjust/main_ice_adjust.F90 b/src/testprogs/ice_adjust/main_ice_adjust.F90 index 1a074e1f809dc873f6fd03cb9d8c424e38ca46da..02ab5c6efb1cafa34cf2642f830d35afe00bd490 100644 --- a/src/testprogs/ice_adjust/main_ice_adjust.F90 +++ b/src/testprogs/ice_adjust/main_ice_adjust.F90 @@ -19,41 +19,39 @@ USE PARKIND1, ONLY : JPRB, JPIM IMPLICIT NONE INTEGER :: KLON -INTEGER :: KIDIA -INTEGER :: KFDIA -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 :: 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 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..155ac9f3f3397f8c5da6e8b39196d0c177f2ca5c --- /dev/null +++ b/src/testprogs/rain_ice/getdata_rain_ice_mod.F90 @@ -0,0 +1,799 @@ +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/",I3.3,".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 = 1 + +DO IBL = 1, 150 + WRITE (CLFILE, '("data/",I3.3,".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 index 580e36e5ccea7c3b256f1c93a035440286f1c6cb..6b167802ea347a377df6cf0bb000c57ddbc6a2d0 100644 --- a/src/testprogs/rain_ice/main_rain_ice.F90 +++ b/src/testprogs/rain_ice/main_rain_ice.F90 @@ -1,85 +1,136 @@ PROGRAM MAIN_RAIN_ICE +USE XRD_GETOPTIONS +USE GETDATA_RAIN_ICE_MOD USE MODD_CONF -USE MODD_CST, ONLY: 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 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 -USE MODI_RAIN_ICE IMPLICIT NONE -INTEGER :: KPROMA -INTEGER :: KKA -INTEGER :: KKU -INTEGER :: KKL -INTEGER :: KLON -INTEGER :: KLEV -INTEGER :: KRR -INTEGER :: KDUM - +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 - - -REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PRS, PRS_1 -REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PFPR, PFPR_1 -REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PRT -REAL, ALLOCATABLE, DIMENSION(:,:) :: PDZZ -REAL, ALLOCATABLE, DIMENSION(:,:) :: PRHODJ -REAL, ALLOCATABLE, DIMENSION(:,:) :: PRHODREF -REAL, ALLOCATABLE, DIMENSION(:,:) :: PEXNREF -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_1 -REAL, ALLOCATABLE, DIMENSION(:,:) :: PCIT, PCIT_1 -REAL, ALLOCATABLE, DIMENSION(:) :: PSEA -REAL, ALLOCATABLE, DIMENSION(:) :: PTOWN -REAL, ALLOCATABLE, DIMENSION(:) :: PINPRR, PINPRR_1 -REAL, ALLOCATABLE, DIMENSION(:) :: PINPRS, PINPRS_1 -REAL, ALLOCATABLE, DIMENSION(:) :: PINPRG, PINPRG_1 -REAL, ALLOCATABLE, DIMENSION(:) :: ZINDEP, ZINDEP_1 -REAL, ALLOCATABLE, DIMENSION(:,:) :: ZRAINFR, ZRAINFR_1 -REAL, ALLOCATABLE, DIMENSION(:) :: ZINPRC, ZINPRC_1 -LOGICAL, ALLOCATABLE, DIMENSION(:,:) :: LLMICRO - LOGICAL :: OWARM LOGICAL :: OCND2 - -INTEGER :: IFILE - 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 -TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RH) :: YLBUDGET -TYPE(DIMPHYEX_t) :: D +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) -INTEGER :: IPROMA, ISIZE -INTEGER :: JLON, JLEV - -CHARACTER(LEN=128) :: CLFILE +KLEV = SIZE (PRS, 3) +KRR = SIZE (PRS, 4) +IF (LLVERBOSE) PRINT *, " KLEV = ", KLEV, " KRR = ", KRR +PRINT *, " NPROMA = ", NPROMA, " KLEV = ", KLEV, " NGPBLKS = ", NGPBLKS CMICRO='ICE3' -CALL GETARG (1, CLFILE) - PTSTEP = 25.0000000000000 KRR = 6 OSEDIC = .TRUE. @@ -96,90 +147,94 @@ 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 () -IFILE = 77 -OPEN (IFILE, FILE=TRIM (CLFILE), FORM='UNFORMATTED') -READ (IFILE) IPROMA, ISIZE -READ (IFILE) KLON, KDUM, KLEV, KRR - -PRINT *, KLON, KDUM, KLEV, KRR - -ALLOCATE (PRT (KLON,KLEV,KRR)) -ALLOCATE (PRS (KLON,KLEV,KRR), PRS_1 (KLON,KLEV,KRR)) -ALLOCATE (PFPR (KLON,KLEV,KRR), PFPR_1 (KLON,KLEV,KRR)) -ALLOCATE (PDZZ (KLON,KLEV)) -ALLOCATE (PRHODJ (KLON,KLEV)) -ALLOCATE (PRHODREF (KLON,KLEV)) -ALLOCATE (PEXNREF (KLON,KLEV)) -ALLOCATE (PPABSM (KLON,KLEV)) -ALLOCATE (PHLC_HRC (KLON,KLEV)) -ALLOCATE (PHLC_HCF (KLON,KLEV)) -ALLOCATE (PHLI_HRI (KLON,KLEV)) -ALLOCATE (PHLI_HCF (KLON,KLEV)) -ALLOCATE (PTHT (KLON,KLEV)) -ALLOCATE (PSIGS (KLON,KLEV)) -ALLOCATE (PCLDFR (KLON,KLEV)) -ALLOCATE (PTHS (KLON,KLEV)) -ALLOCATE (PEVAP (KLON,KLEV), PEVAP_1 (KLON,KLEV)) -ALLOCATE (PCIT (KLON,KLEV), PCIT_1 (KLON,KLEV)) -ALLOCATE (PSEA (KLON)) -ALLOCATE (PTOWN (KLON)) -ALLOCATE (PINPRR (KLON)) -ALLOCATE (PINPRS (KLON), PINPRS_1 (KLON)) -ALLOCATE (PINPRG (KLON), PINPRG_1 (KLON)) -ALLOCATE (LLMICRO (KLON,KLEV)) -ALLOCATE (ZINDEP (KLON), ZINDEP_1 (KLON)) -ALLOCATE (ZRAINFR (KLON,KLEV), ZRAINFR_1 (KLON,KLEV)) -ALLOCATE (ZINPRC (KLON), ZINPRC_1 (KLON)) - -READ (IFILE) LLMICRO -READ (IFILE) PEXNREF -READ (IFILE) PDZZ -READ (IFILE) PRHODJ -READ (IFILE) PRHODREF -READ (IFILE) PEXNREF -READ (IFILE) PPABSM -READ (IFILE) PCIT -READ (IFILE) PCLDFR -READ (IFILE) PHLC_HRC -READ (IFILE) PHLC_HCF -READ (IFILE) PHLI_HRI -READ (IFILE) PHLI_HCF -READ (IFILE) PTHT -READ (IFILE) PRT -READ (IFILE) PTHS -READ (IFILE) PRS -READ (IFILE) PSIGS -READ (IFILE) PSEA -READ (IFILE) PTOWN - -READ (IFILE) PCIT_1 -READ (IFILE) PRS_1 -READ (IFILE) ZINPRC_1 -READ (IFILE) PINPRR_1 -READ (IFILE) PEVAP_1 -READ (IFILE) PINPRS_1 -READ (IFILE) PINPRG_1 -READ (IFILE) ZINDEP_1 -READ (IFILE) ZRAINFR_1 -READ (IFILE) PFPR_1 -CLOSE (IFILE) - -D%NIT = KLON -D%NIB = 1 -D%NIE = KLON -D%NJT = 1 -D%NJB = 1 -D%NJE = 1 -D%NKL = -1 -D%NKT = KLEV -D%NKA = KLEV -D%NKU = 1 -D%NKB = KLEV -D%NKE = 1 -D%NKTB = 1 -D%NKTE = KLEV +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, & @@ -187,35 +242,183 @@ CALL RAIN_ICE (D, CST, PARAM_ICE, RAIN_ICE_PARAM, & & HSUBG_AUCV_RC=CSUBG_AUCV_RC, HSUBG_AUCV_RI=CSUBG_AUCV_RI,& & OWARM=OWARM, & & PTSTEP=2*PTSTEP, & - & KRR=KRR, ODMICRO=LLMICRO, PEXN=PEXNREF, & - & PDZZ=PDZZ, PRHODJ=PRHODJ, PRHODREF=PRHODREF,PEXNREF=PEXNREF,& - & PPABST=PPABSM, PCIT=PCIT, PCLDFR=PCLDFR, & - & PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & - & PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF, & - & PTHT=PTHT,PRVT=PRT(1,1,1),PRCT=PRT(1,1,2), & - & PRRT=PRT(1,1,3), & - & PRIT=PRT(1,1,4), PRST=PRT(1,1,5), & - & PRGT=PRT(1,1,6), & - & PTHS=PTHS, PRVS=PRS(1,1,1),PRCS=PRS(1,1,2),& - & PRRS=PRS(1,1,3),& - & PRIS=PRS(1,1,4),PRSS= PRS(1,1,5),PRGS= PRS(1,1,6),& - & PINPRC=ZINPRC,PINPRR=PINPRR,PEVAP3D=PEVAP,& - & PINPRS=PINPRS, PINPRG=PINPRG, PINDEP=ZINDEP, PRAINFR=ZRAINFR, & - & PSIGS=PSIGS, & + & 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) + & PSEA=PSEA, PTOWN=PTOWN, PFPR=PFPR(:,:,:,:,IBL)) + +#ifdef _OPENACC + ENDDO +#endif -DO JLEV = 1, KLEV - WRITE (*, '(I4," | ")', ADVANCE='NO') JLEV - DO JLON = 1, KLON - WRITE (*, '(E12.5)', ADVANCE='NO') ZRAINFR_1 (JLON, JLEV) ENDDO - WRITE (*, *) + +#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) diff --git a/src/testprogs/ice_adjust/stack_mod.F90 b/src/testprogs/support/stack_mod.F90 similarity index 100% rename from src/testprogs/ice_adjust/stack_mod.F90 rename to src/testprogs/support/stack_mod.F90