module READ_LEVEL2 use NB_CLOUD_MASK_SERVICES use CX_HDF4_MOD, only: & OPEN_FILE_HDF_READ & , READ_HDF_GLOBAL_ATTRIBUTE_NUM & , HDF_SDS_DIMENSIONS_READER & , READ_CLAVRX_HDF_SDS_1D & , READ_CLAVRX_HDF_SDS_2D & , CLOSE_FILE_HDF_READ use CX_DATE_TIME_TOOLS_MOD, only: & COMPUTE_MONTH & , LEAP_YEAR_FCT & , COMPUTE_DAY implicit none public READ_LEVEL2_FILE_DATA contains subroutine READ_LEVEL2_FILE_DATA(File_Name_Full, L2) character(len=*), intent(in) :: File_Name_Full type(Level2), intent(inout) :: L2 integer :: Status integer :: Sd_Id integer :: Leap integer, dimension(2) :: Start, Stride, Edge real, parameter :: Missing = -999.0 ! --- open file Status = 0 Status = OPEN_FILE_HDF_READ(trim(File_Name_Full), Sd_Id) ! --- get dimentions from attributes L2%Nx = READ_HDF_GLOBAL_ATTRIBUTE_NUM(Sd_Id, 'NUMBER_OF_ELEMENTS') L2%Ny = READ_HDF_GLOBAL_ATTRIBUTE_NUM(Sd_Id, 'NUMBER_OF_SCANS_LEVEL2') ! --- get year, doy L2%Doy = READ_HDF_GLOBAL_ATTRIBUTE_NUM(Sd_Id, 'START_DAY') L2%Year = READ_HDF_GLOBAL_ATTRIBUTE_NUM(Sd_Id, 'START_YEAR') ! --- calculate month, date Leap = 0 Leap = LEAP_YEAR_FCT(L2%Year) L2%Month = COMPUTE_MONTH(L2%Doy, Leap) L2%Dom = COMPUTE_DAY(L2%Doy, Leap) ! --- allocate variables allocate(L2%Bad_Pixel_Mask(L2%Nx,L2%Ny)) allocate(L2%Latitude(L2%Nx,L2%Ny)) allocate(L2%Longitude(L2%Nx,L2%Ny)) allocate(L2%Land_Class(L2%Nx,L2%Ny)) allocate(L2%Snow_Class(L2%Nx,L2%Ny)) allocate(L2%Coast_Mask(L2%Nx,L2%Ny)) allocate(L2%Zsfc(L2%Nx,L2%Ny)) allocate(L2%Zsfcstd(L2%Nx,L2%Ny)) allocate(L2%Tsfc(L2%Nx,L2%Ny)) allocate(L2%Tpw(L2%Nx,L2%Ny)) allocate(L2%Zen(L2%Nx,L2%Ny)) allocate(L2%Solzen(L2%Nx,L2%Ny)) allocate(L2%Solglintzen(L2%Nx,L2%Ny)) allocate(L2%Solscatang(L2%Nx,L2%Ny)) allocate(L2%Lunzen(L2%Nx,L2%Ny)) allocate(L2%Lunglintzen(L2%Nx,L2%Ny)) allocate(L2%Sfc_Type_Mask(L2%Nx,L2%Ny)) allocate(L2%Topa(L2%Nx,L2%Ny)) allocate(L2%Emiss_Tropo_11(L2%Nx,L2%Ny)) allocate(L2%Bt10(L2%Nx,L2%Ny)) allocate(L2%Bt10Std(L2%Nx,L2%Ny)) allocate(L2%Logbt10Std(L2%Nx,L2%Ny)) allocate(L2%Bt11(L2%Nx,L2%Ny)) allocate(L2%Bt11Std(L2%Nx,L2%Ny)) allocate(L2%Logbt11Std(L2%Nx,L2%Ny)) allocate(L2%Bt11_Clr(L2%Nx,L2%Ny)) allocate(L2%Bt12(L2%Nx,L2%Ny)) allocate(L2%Bt12_Clr(L2%Nx,L2%Ny)) allocate(L2%Btd8511(L2%Nx,L2%Ny)) allocate(L2%Btd3810(L2%Nx,L2%Ny)) allocate(L2%Btd3811(L2%Nx,L2%Ny)) allocate(L2%Btd1112(L2%Nx,L2%Ny)) allocate(L2%Rgct(L2%Nx,L2%Ny)) allocate(L2%Fmft(L2%Nx,L2%Ny)) allocate(L2%Ndsi(L2%Nx,L2%Ny)) allocate(L2%Logcod065(L2%Nx,L2%Ny)) allocate(L2%Logcod138(L2%Nx,L2%Ny)) allocate(L2%Logcod160(L2%Nx,L2%Ny)) allocate(L2%Cmask(L2%Nx,L2%Ny)) allocate(L2%Cmask_Aux(L2%Nx,L2%Ny)) allocate(L2%Ref065(L2%Nx,L2%Ny)) allocate(L2%Ref065_Clr(L2%Nx,L2%Ny)) allocate(L2%Dref065_Clr(L2%Nx,L2%Ny)) allocate(L2%Ref065_Min(L2%Nx,L2%Ny)) allocate(L2%Dref065_Min(L2%Nx,L2%Ny)) allocate(L2%Ref086(L2%Nx,L2%Ny)) allocate(L2%Ref138(L2%Nx,L2%Ny)) allocate(L2%Logref065Std(L2%Nx,L2%Ny)) allocate(L2%Bt38(L2%Nx,L2%Ny)) allocate(L2%Bt85(L2%Nx,L2%Ny)) allocate(L2%Ref065Std(L2%Nx,L2%Ny)) allocate(L2%Ref160(L2%Nx,L2%Ny)) allocate(L2%Refrat086065(L2%Nx,L2%Ny)) allocate(L2%Refrat138065(L2%Nx,L2%Ny)) ! --- set variables to missing L2%Bad_Pixel_Mask = Missing L2%Latitude = Missing L2%Longitude = Missing L2%Land_Class = Missing L2%Snow_Class = Missing L2%Coast_Mask = Missing L2%Zsfc = Missing L2%Zsfcstd = Missing L2%Tsfc = Missing L2%Tpw = Missing L2%Zen = Missing L2%Solzen = Missing L2%Solglintzen = Missing L2%Solscatang = Missing L2%Lunzen = Missing L2%Lunglintzen = Missing L2%Sfc_Type_Mask = Missing L2%Topa = Missing L2%Emiss_Tropo_11 = Missing L2%Bt10 = Missing L2%Bt10Std = Missing L2%Logbt10Std = Missing L2%Bt11 = Missing L2%Bt11Std = Missing L2%Logbt11Std = Missing L2%Bt11_Clr = Missing L2%Logbt11std = Missing L2%Bt12 = Missing L2%Bt12_Clr = Missing L2%Btd8511 = Missing L2%Btd3810 = Missing L2%Btd3811 = Missing L2%Btd1112 = Missing L2%Rgct = Missing L2%Fmft = Missing L2%Ndsi = Missing L2%Logcod065 = Missing L2%Logcod138 = Missing L2%Logcod160 = Missing L2%Cmask = Missing L2%Cmask_Aux = Missing L2%Ref065 = Missing L2%Ref065_Clr = Missing L2%Dref065_Clr = Missing L2%Ref065_Min = Missing L2%Dref065_Min = Missing L2%Ref086 = Missing L2%Ref138 = Missing L2%Logref065Std = Missing L2%Bt38 = Missing L2%Bt85 = Missing L2%Ref065Std = Missing L2%Ref160 = Missing L2%Refrat086065 = Missing L2%Refrat138065 = Missing ! --- set Start, Stride, Edge Start = 0 Stride = 1 Edge(1) = L2%Nx Edge(2) = L2%Ny ! --- read data call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'bad_pixel_mask', & L2%Bad_Pixel_Mask, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'latitude', & L2%Latitude, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'longitude', & L2%Longitude, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'total_precipitable_water_nwp', & L2%Tpw, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'surface_temperature_nwp', & L2%Tsfc, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'surface_elevation', & L2%Zsfc, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'sensor_zenith_angle', & L2%Zen, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'solar_zenith_angle', & L2%Solzen, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'glint_zenith_angle', & L2%Solglintzen, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'glint_mask', & L2%Solglint_Mask, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'scattering_angle', & L2%Solscatang, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'lunar_zenith_angle', & L2%Lunzen, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'lunar_glint_zenith_angle', & L2%Lunglintzen, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'land_class', & L2%Land_Class, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'snow_class', & L2%Snow_Class, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'coast_mask', & L2%Coast_Mask, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'surface_elevation', & L2%Zsfc, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'surface_elevation_stddev_3x3', & L2%Zsfcstd, Status, Sds_Start=Start, Sds_Stride=Stride,Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'cld_temp_opaque', & L2%Topa, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'cld_height_opaque', & L2%Zopa, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'emiss_tropo_10_4um_nom', & L2%Emiss_Tropo_10, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'emiss_tropo_11_0um_nom', & L2%Emiss_Tropo_11, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'emiss_3_75um_nom_rel_10_4um_nom', & L2%Emiss3810, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'emiss_3_75um_nom', & L2%Emiss3811, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_3_75um_nom', & L2%Bt38, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_8_5um_nom', & L2%Bt85, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_10_4um_nom', & L2%Bt10, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_10_4um_nom_stddev_3x3', & L2%Bt10Std, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_11_0um_nom', & L2%Bt11, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_11_0um_nom_stddev_3x3', & L2%Bt11Std, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_11_0um_nom_clear_sky', & L2%Bt11_Clr, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_11_0um_nom_max_3x3', & L2%Bt11Max, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_11_0um_nom_max_sub', & L2%Bt11Maxsub, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_11_0um_nom_min_sub', & L2%Bt11Minsub, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_12_0um_nom', & L2%Bt12, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_12_0um_nom_clear_sky', & L2%Bt12_Clr, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'temp_11um_vs_67um_covar_5x5', & L2%Bt6711Covar, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'refl_0_47um_nom', & L2%Ref047, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'refl_0_65um_nom', & L2%Ref065, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'refl_0_65um_nom_clear_sky', & L2%Ref065_Clr, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'refl_0_65um_nom_stddev_3x3', & L2%Ref065Std, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'refl_0_65um_nom_min_3x3', & L2%Ref065_Min, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'refl_0_65um_nom_min_sub', & L2%Ref065_Min_Sub, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'refl_0_65um_nom_max_sub', & L2%Ref065_Max_Sub, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'refl_1_60um_nom', & L2%Ref160, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'refl_0_86um_nom', & L2%Ref086, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'refl_1_38um_nom', & L2%Ref138, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'cld_opd_mask_0_65um_nom', & L2%Logcod065, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'cld_opd_mask_1_38um_nom', & L2%Logcod138, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'cld_opd_mask_1_60um_nom', & L2%Logcod160, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'cloud_mask', & L2%Cmask, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'cloud_mask_aux', & L2%Cmask_Aux, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) call READ_CLAVRX_HDF_SDS_2D(trim(File_Name_Full), 'bayes_mask_sfc_type', & L2%Sfc_Type_Mask, Status, Sds_Start=Start, Sds_Stride=Stride, Sds_Edges=Edge) ! --- close file Status = CLOSE_FILE_HDF_READ(Sd_Id, trim(File_Name_Full)) ! --- finish up output variables ! - logs where (L2%Logcod065 .gt. 0.0) L2%Logcod065 = log10(L2%Logcod065) endwhere where (L2%Logcod138 .gt. 0.0) L2%Logcod138 = log10(L2%Logcod138) endwhere where (L2%Logcod160 .gt. 0.0) L2%Logcod160 = log10(L2%Logcod160) endwhere !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! TODO RIGHt NOW MISSING IN MY TEST FILE, ENABLE WHEN NORMAL FILE IS USED ! - make log bt 10 !where (L2%Bt10std .gt. 0.0) ! L2%Logbt10std = log10(L2%Bt10std) !endwhere !where (L2%Logbt10std == 0.0) ! L2%Logbt10std = - 2.0 !endwhere ! - log Ref065Std where (L2%Ref065Std .gt. 0.0) L2%Logref065Std = log10(L2%Ref065Std) endwhere ! - Dref065_Clr L2%Dref065_Clr = L2%Ref065 - L2%Ref065_Clr ! - Dref065_Min L2%Dref065_Min = L2%Ref065 - L2%Ref065_Min ! - Dref065_Min_Sub L2%Dref065_Min_Sub = L2%Ref065 - L2%Ref065_Min_Sub ! - Refratio L2%Refrat086065 = L2%Ref086 / L2%Ref065 L2%Refrat138065 = L2%Ref138 / L2%Ref065 ! - make log bt 11 where (L2%Bt11std .gt. 0.0) L2%Logbt11std = log10(L2%Bt11std) endwhere where (L2%Logbt11std == 0.0) L2%Logbt11std = - 2.0 endwhere ! - RGCT L2%Rgct = L2%Ref065 - L2%Ref065_Clr ! - make log ref 065 std where (L2%Ref065Std .gt. 0.0) L2%Logref065Std = log10(L2%Ref065Std) endwhere where (L2%Logref065Std == 0.0) L2%Logref065Std = - 2.0 endwhere ! - FMFT L2%Fmft = (L2%Bt11 - L2%Bt12) - (L2%Bt11_Clr - L2%Bt12_Clr) * & (L2%Bt11 - 260.0) / (L2%Bt11_clr - 260.0) where (L2%Bt11_Clr .le. 260.0 .or. L2%Bt11 .le. 260.0) L2%Fmft = L2%Bt11 - L2%Bt12 endwhere ! - make ndsi L2%Ndsi = (L2%Ref065 - L2%Ref160) / (L2%Ref065 + L2%Ref160) ! - Btd8511 L2%Btd8511 = L2%Bt85 - L2%Bt11 ! - Btd3810 L2%Btd3810 = L2%Bt38 - L2%Bt10 ! - Btd3811 L2%Btd3811 = L2%Bt38 - L2%Bt11 ! - Btd1112 L2%Btd1112 = L2%Bt11 - L2%Bt12 ! - Dbt11max L2%Dbt11Max = L2%Bt11Max - L2%Bt11 ! - Dbt11maxsub L2%Dbt11Maxsub = L2%Bt11Maxsub - L2%Bt11 ! --- deallocate end subroutine READ_LEVEL2_FILE_DATA end module READ_LEVEL2