diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d92b528e..ca09bba1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -47,11 +47,16 @@ list( APPEND crtm_src_files Coefficients/AerosolCoeff/AerosolCoeff_Define.f90 Coefficients/AerosolCoeff/AerosolCoeff_netCDF_IO.f90 Coefficients/AerosolCoeff/AerosolCoeff_IO.f90 + Coefficients/BeCoeff/BeCoeff_Binary_IO.f90 + Coefficients/BeCoeff/BeCoeff_Define.f90 + Coefficients/BeCoeff/BeCoeff_netCDF_IO.f90 + Coefficients/BeCoeff/BeCoeff_IO.f90 Coefficients/CloudCoeff/CloudCoeff_Binary_IO.f90 Coefficients/CloudCoeff/CloudCoeff_Define.f90 Coefficients/CloudCoeff/CloudCoeff_netCDF_IO.f90 Coefficients/CloudCoeff/CloudCoeff_IO.f90 Coefficients/CRTM_AerosolCoeff.f90 + Coefficients/CRTM_BeCoeff.f90 Coefficients/CRTM_CloudCoeff.f90 Coefficients/CRTM_IRiceCoeff.f90 Coefficients/CRTM_IRlandCoeff.f90 diff --git a/src/Coefficients/BeCoeff/BeCoeff_Binary_IO.f90 b/src/Coefficients/BeCoeff/BeCoeff_Binary_IO.f90 index aa7092c4..49c5f434 100644 --- a/src/Coefficients/BeCoeff/BeCoeff_Binary_IO.f90 +++ b/src/Coefficients/BeCoeff/BeCoeff_Binary_IO.f90 @@ -41,7 +41,7 @@ MODULE BeCoeff_Binary_IO ! ----------------- ! Module parameters ! ----------------- - CHARACTER(*), PRIVATE, PARAMETER :: MODULE_VERSION_ID = & + CHARACTER(*), PRIVATE, PARAMETER :: MODULE_VERSION_ID = '' CHARACTER(*), PARAMETER :: WRITE_ERROR_STATUS = 'DELETE' ! Default message length INTEGER, PARAMETER :: ML = 256 @@ -471,7 +471,7 @@ FUNCTION BeCoeff_Binary_WriteFile( & ! Open the file for writing - err_stat = Open_Binary_File( Filename, fid, For_Output=SET ) + err_stat = Open_Binary_File( Filename, fid, For_Output=.TRUE. ) IF ( err_stat /= SUCCESS ) THEN msg = 'Error opening '//TRIM(Filename) CALL Write_Cleanup(); RETURN diff --git a/src/Coefficients/BeCoeff/BeCoeff_Define.f90 b/src/Coefficients/BeCoeff/BeCoeff_Define.f90 index d354cf38..fbf5e9f6 100644 --- a/src/Coefficients/BeCoeff/BeCoeff_Define.f90 +++ b/src/Coefficients/BeCoeff/BeCoeff_Define.f90 @@ -61,7 +61,7 @@ MODULE BeCoeff_Define ! Module parameters ! ----------------- ! Version Id for the module - CHARACTER(*), PARAMETER :: MODULE_VERSION_ID = & + CHARACTER(*), PARAMETER :: MODULE_VERSION_ID = '' ! Current valid release and version numbers INTEGER, PARAMETER :: BeCOEFF_RELEASE = 1 ! This determines object and file formats. INTEGER, PARAMETER :: BeCOEFF_VERSION = 1 ! This is just the data version for the release. diff --git a/src/Coefficients/BeCoeff/BeCoeff_IO.f90 b/src/Coefficients/BeCoeff/BeCoeff_IO.f90 index 4eeece48..e50b0ab3 100644 --- a/src/Coefficients/BeCoeff/BeCoeff_IO.f90 +++ b/src/Coefficients/BeCoeff/BeCoeff_IO.f90 @@ -44,8 +44,8 @@ MODULE BeCoeff_IO ! ----------------- ! Module parameters ! ----------------- - CHARACTER(*), PRIVATE, PARAMETER :: MODULE_VERSION_ID = & - + CHARACTER(*), PRIVATE, PARAMETER :: MODULE_VERSION_ID = '' + CONTAINS @@ -90,9 +90,9 @@ MODULE BeCoeff_IO ! OPTIONAL INPUTS: ! netCDF: Set this logical argument to access netCDF format ! BeCoeff datafiles. -! If == .FALSE., file format is BINARY [DEFAULT]. -! == .TRUE., file format is NETCDF. -! If not specified, default is .FALSE. +! If == .FALSE., file format is BINARY. +! == .TRUE., file format is NETCDF [DEFAULT]. +! If not specified, default is .TRUE. ! UNITS: N/A ! TYPE: LOGICAL ! DIMENSION: Scalar @@ -192,7 +192,7 @@ FUNCTION BeCoeff_InquireFile( & ! Set up err_stat = SUCCESS ! ...Check netCDF argument - Binary = .TRUE. + Binary = .FALSE. IF ( PRESENT(netCDF) ) Binary = .NOT. netCDF @@ -256,9 +256,9 @@ END FUNCTION BeCoeff_InquireFile ! OPTIONAL INPUTS: ! netCDF: Set this logical argument to access netCDF format ! BeCoeff datafiles. -! If == .FALSE., file format is BINARY [DEFAULT]. -! == .TRUE., file format is NETCDF. -! If not specified, default is .FALSE. +! If == .FALSE., file format is BINARY. +! == .TRUE., file format is NETCDF [DEFAULT]. +! If not specified, default is .TRUE. ! UNITS: N/A ! TYPE: LOGICAL ! DIMENSION: Scalar @@ -339,7 +339,7 @@ FUNCTION BeCoeff_ReadFile( & ! Set up err_stat = SUCCESS ! ...Check netCDF argument - Binary = .TRUE. + Binary = .FALSE. IF ( PRESENT(netCDF) ) Binary = .NOT. netCDF ! Call the appropriate function @@ -396,9 +396,9 @@ END FUNCTION BeCoeff_ReadFile ! OPTIONAL INPUTS: ! netCDF: Set this logical argument to access netCDF format ! BeCoeff datafiles. -! If == .FALSE., file format is BINARY [DEFAULT]. -! == .TRUE., file format is NETCDF. -! If not specified, default is .FALSE. +! If == .FALSE., file format is BINARY. +! == .TRUE., file format is NETCDF [DEFAULT]. +! If not specified, default is .TRUE. ! UNITS: N/A ! TYPE: LOGICAL ! DIMENSION: Scalar @@ -478,7 +478,7 @@ FUNCTION BeCoeff_WriteFile( & ! Set up err_stat = SUCCESS ! ...Check netCDF argument - Binary = .TRUE. + Binary = .FALSE. IF ( PRESENT(netCDF) ) Binary = .NOT. netCDF ! Call the appropriate function diff --git a/src/Coefficients/BeCoeff/BeCoeff_netCDF_IO.f90 b/src/Coefficients/BeCoeff/BeCoeff_netCDF_IO.f90 index d1743181..441d42d3 100644 --- a/src/Coefficients/BeCoeff/BeCoeff_netCDF_IO.f90 +++ b/src/Coefficients/BeCoeff/BeCoeff_netCDF_IO.f90 @@ -49,7 +49,7 @@ MODULE BeCoeff_netCDF_IO ! Module parameters ! ----------------- ! Module version - CHARACTER(*), PARAMETER :: MODULE_VERSION_ID = & + CHARACTER(*), PARAMETER :: MODULE_VERSION_ID = '' ! Default msg string length INTEGER, PARAMETER :: ML = 1024 diff --git a/src/Coefficients/CRTM_BeCoeff.f90 b/src/Coefficients/CRTM_BeCoeff.f90 index daf0b120..48b19be1 100644 --- a/src/Coefficients/CRTM_BeCoeff.f90 +++ b/src/Coefficients/CRTM_BeCoeff.f90 @@ -28,8 +28,8 @@ MODULE CRTM_BeCoeff ! ---------------- ! Module use USE Message_Handler , ONLY: SUCCESS, FAILURE, WARNING, Display_Message - USE BeCoeff_Define , ONLY: BeCoeff_type, BeCoeff_Associated, BeCoeff_Destroy - USE BeCoeff_Binary_IO, ONLY: BeCoeff_Binary_ReadFile + USE BeCoeff_Define, ONLY: BeCoeff_type, BeCoeff_Associated, BeCoeff_Destroy + USE BeCoeff_IO , ONLY: BeCoeff_ReadFile ! Disable all implicit typing IMPLICIT NONE @@ -50,7 +50,7 @@ MODULE CRTM_BeCoeff ! Module parameters ! ----------------- ! Version Id for the module - CHARACTER(*), PARAMETER :: MODULE_VERSION_ID = & + CHARACTER(*), PARAMETER :: MODULE_VERSION_ID = '' ! Message string length INTEGER, PARAMETER :: ML = 256 @@ -78,12 +78,13 @@ MODULE CRTM_BeCoeff ! Error_Status = CRTM_BeCoeff_Load( & ! Filename, & ! File_Path = File_Path , & +! netCDF = netCDF , & ! Quiet = Quiet , & ! Process_ID = Process_ID , & ! Output_Process_ID = Output_Process_ID ) ! ! INPUTS: -! Filename: Name of the Binary format BeCoeff file. +! Filename: Name of the BeCoeff file. ! UNITS: N/A ! TYPE: CHARACTER(*) ! DIMENSION: Scalar @@ -98,6 +99,16 @@ MODULE CRTM_BeCoeff ! DIMENSION: Scalar ! ATTRIBUTES: INTENT(IN), OPTIONAL ! +! netCDF: Set this logical argument to access netCDF format +! BeCoeff datafiles. +! If == .FALSE., file format is BINARY. +! == .TRUE., file format is NETCDF [DEFAULT]. +! If not specified, default is .TRUE. +! UNITS: N/A +! TYPE: LOGICAL +! DIMENSION: Scalar +! ATTRIBUTES: INTENT(IN), OPTIONAL +! ! Quiet: Set this logical argument to suppress INFORMATION ! messages being printed to stdout ! If == .FALSE., INFORMATION messages are OUTPUT [DEFAULT]. @@ -149,6 +160,7 @@ MODULE CRTM_BeCoeff FUNCTION CRTM_BeCoeff_Load( & Filename , & ! Input File_Path , & ! Optional input + netCDF , & ! Optional input Quiet , & ! Optional input Process_ID , & ! Optional input Output_Process_ID) & ! Optional input @@ -156,9 +168,10 @@ FUNCTION CRTM_BeCoeff_Load( & ! Arguments CHARACTER(*), INTENT(IN) :: Filename CHARACTER(*), OPTIONAL, INTENT(IN) :: File_Path - LOGICAL , OPTIONAL, INTENT(IN) :: Quiet - INTEGER , OPTIONAL, INTENT(IN) :: Process_ID - INTEGER , OPTIONAL, INTENT(IN) :: Output_Process_ID + LOGICAL , OPTIONAL, INTENT(IN) :: netCDF + LOGICAL , OPTIONAL, INTENT(IN) :: Quiet + INTEGER , OPTIONAL, INTENT(IN) :: Process_ID + INTEGER , OPTIONAL, INTENT(IN) :: Output_Process_ID ! Function result INTEGER :: err_stat ! Local parameters @@ -167,6 +180,7 @@ FUNCTION CRTM_BeCoeff_Load( & CHARACTER(ML) :: msg, pid_msg CHARACTER(ML) :: BeCoeff_File LOGICAL :: noisy + LOGICAL :: Binary ! Setup err_stat = SUCCESS @@ -187,12 +201,16 @@ FUNCTION CRTM_BeCoeff_Load( & ELSE pid_msg = '' END IF + ! ...Check netCDF argument + Binary = .FALSE. + IF ( PRESENT(netCDF) ) Binary = .NOT. netCDF ! Read the BeCoeff data file - err_stat = BeCoeff_Binary_ReadFile( & + err_stat = BeCoeff_ReadFile( & BeCoeff_File, & BeC, & - Quiet = .NOT. noisy ) + netCDF = .NOT. Binary, & + Quiet = .NOT. noisy ) IF ( err_stat /= SUCCESS ) THEN WRITE( msg,'("Error reading BeCoeff file ",a)') TRIM(BeCoeff_File) CALL Display_Message( ROUTINE_NAME,TRIM(msg)//TRIM(pid_msg),err_stat ) diff --git a/src/Coefficients/TauCoeff/TauCoeff_Inspect/TauCoeff_Inspect.f90 b/src/Coefficients/TauCoeff/TauCoeff_Inspect/TauCoeff_Inspect.f90 new file mode 100644 index 00000000..86da2539 --- /dev/null +++ b/src/Coefficients/TauCoeff/TauCoeff_Inspect/TauCoeff_Inspect.f90 @@ -0,0 +1,221 @@ +! +! TauCoeff_Inspect +! +! Program to inspect the contents of a CRTM TauCoeff file (binary or netCDF) +! +! +! CREATION HISTORY: +! Written by: Gemini Assistant, 12-Jan-2026 +! modeled after SpcCoeff_Inspect +! + +PROGRAM TauCoeff_Inspect + + ! ------------------ + ! Environment set up + ! ------------------ + ! Module usage + USE File_Utility , ONLY: File_Exists + USE Message_Handler , ONLY: SUCCESS, FAILURE, WARNING, INFORMATION, & + Program_Message, Display_Message + USE Type_Kinds , ONLY: Long + USE ODPS_Define , ONLY: ODPS_type, Destroy_ODPS, & + Info_ODPS, Equal_ODPS, Associated_ODPS, & + SENSOR_TYPE_NAME, ODPS_ALGORITHM + USE ODPS_Binary_IO , ONLY: Read_ODPS_Binary + USE ODPS_netCDF_IO , ONLY: Read_ODPS_netCDF + USE ODAS_Define , ONLY: ODAS_type, Destroy_ODAS, Info_ODAS, & + ODAS_ALGORITHM, Associated_ODAS + USE ODAS_Binary_IO , ONLY: Read_ODAS_Binary + USE ODAS_netCDF_IO , ONLY: Read_ODAS_netCDF + USE Binary_File_Utility, ONLY: Open_Binary_File + USE NETCDF, ONLY: NF90_NOWRITE, NF90_GLOBAL, NF90_OPEN, NF90_GET_ATT, NF90_CLOSE, & + NF90_NOERR + + ! Disable implicit typing + IMPLICIT NONE + + ! ---------- + ! Parameters + ! ---------- + CHARACTER(*), PARAMETER :: PROGRAM_NAME = 'TauCoeff_Inspect' + CHARACTER(*), PARAMETER :: PROGRAM_VERSION_ID = '1.1' + INTEGER, PARAMETER :: ML = 256 + + ! --------- + ! Variables + ! --------- + INTEGER :: err_stat + CHARACTER(ML) :: filename, msg, info_msg + INTEGER :: n_args + TYPE(ODPS_type) :: odps + TYPE(ODAS_type) :: odas + LOGICAL :: is_nc, is_bin + INTEGER :: Algorithm_ID + + ! Output program header + CALL Program_Message( PROGRAM_NAME, & + 'Program to display the contents of a CRTM '//& + 'Binary/netCDF format TauCoeff file to stdout.', & + PROGRAM_VERSION_ID ) + + ! Get the filename + n_args = COMMAND_ARGUMENT_COUNT() + IF ( n_args > 0 ) THEN + CALL GET_COMMAND_ARGUMENT(1, filename) + ELSE + WRITE( *,FMT='(/5x,"Enter the TauCoeff filename: ")',ADVANCE='NO' ) + READ( *,'(a)' ) filename + END IF + filename = ADJUSTL(filename) + IF ( .NOT. File_Exists( TRIM(filename) ) ) THEN + msg = 'File '//TRIM(filename)//' not found.' + CALL Display_Message( PROGRAM_NAME, msg, FAILURE ); STOP + END IF + + ! Check file extension + is_nc = (INDEX(TRIM(filename), '.nc') == LEN_TRIM(filename) - 2) + is_bin = (INDEX(TRIM(filename), '.bin') == LEN_TRIM(filename) - 3) + + ! Peek at the algorithm ID + Algorithm_ID = -1 + IF (is_bin) THEN + err_stat = Get_AlgorithmID_Bin( TRIM(filename), Algorithm_ID ) + ELSE IF (is_nc) THEN + err_stat = Get_AlgorithmID_NC( TRIM(filename), Algorithm_ID ) + END IF + + IF ( Algorithm_ID == ODPS_ALGORITHM ) THEN + IF (is_bin) err_stat = Read_ODPS_Binary( TRIM(filename), odps, Quiet=1 ) + IF (is_nc) err_stat = Read_ODPS_netCDF( TRIM(filename), odps, Quiet=1 ) + IF ( err_stat == SUCCESS ) THEN + CALL ODPS_Inspect( odps ) + err_stat = Destroy_ODPS( odps ) + STOP + END IF + ELSE IF ( Algorithm_ID == ODAS_ALGORITHM ) THEN + IF (is_bin) err_stat = Read_ODAS_Binary( TRIM(filename), odas, Quiet=1 ) + IF (is_nc) err_stat = Read_ODAS_netCDF( TRIM(filename), odas, Quiet=1 ) + IF ( err_stat == SUCCESS ) THEN + CALL ODAS_Inspect( odas ) + err_stat = Destroy_ODAS( odas ) + STOP + END IF + END IF + + ! Fallback if algorithm not identified or read failed + msg = 'Error reading TauCoeff file '//TRIM(filename)//'. Unknown algorithm or format.' + CALL Display_Message( PROGRAM_NAME, msg, FAILURE ) + +CONTAINS + + FUNCTION Get_AlgorithmID_Bin( Filename, Algorithm_ID ) RESULT( Error_Status ) + CHARACTER(*), INTENT(IN) :: Filename + INTEGER, INTENT(OUT) :: Algorithm_ID + INTEGER :: Error_Status + INTEGER :: FileID, IO_Status + INTEGER(Long) :: Dummy, Alg + + Error_Status = FAILURE + IF ( Open_Binary_File( Filename, FileID ) /= SUCCESS ) RETURN + READ( FileID, IOSTAT=IO_Status ) Dummy, Dummy ! Release, Version + IF ( IO_Status == 0 ) THEN + READ( FileID, IOSTAT=IO_Status ) Alg + IF ( IO_Status == 0 ) THEN + Algorithm_ID = Alg + Error_Status = SUCCESS + END IF + END IF + CLOSE( FileID ) + END FUNCTION Get_AlgorithmID_Bin + + FUNCTION Get_AlgorithmID_NC( Filename, Algorithm_ID ) RESULT( Error_Status ) + CHARACTER(*), INTENT(IN) :: Filename + INTEGER, INTENT(OUT) :: Algorithm_ID + INTEGER :: Error_Status + INTEGER :: ncid, IO_Status, Alg + + Error_Status = FAILURE + IF ( NF90_OPEN(Filename, NF90_NOWRITE, ncid) /= NF90_NOERR ) RETURN + IF ( NF90_GET_ATT(ncid, NF90_GLOBAL, "Algorithm", Alg) == NF90_NOERR ) THEN + Algorithm_ID = Alg + Error_Status = SUCCESS + END IF + IO_Status = NF90_CLOSE(ncid) + END FUNCTION Get_AlgorithmID_NC + + SUBROUTINE ODPS_Inspect( ODPS ) + TYPE(ODPS_type), INTENT(IN) :: ODPS + + WRITE(*,'(1x,"ODPS OBJECT")') + ! Release/version info + WRITE(*,'(3x,"Release.Version :",1x,i0,".",i0)') ODPS%Release, ODPS%Version + ! Dimensions + WRITE(*,'(3x,"n_Layers :",1x,i0)') ODPS%n_Layers + WRITE(*,'(3x,"n_Components :",1x,i0)') ODPS%n_Components + WRITE(*,'(3x,"n_Absorbers :",1x,i0)') ODPS%n_Absorbers + WRITE(*,'(3x,"n_Channels :",1x,i0)') ODPS%n_Channels + WRITE(*,'(3x,"n_Coeffs :",1x,i0)') ODPS%n_Coeffs + + IF ( .NOT. Associated_ODPS(ODPS) ) RETURN + + ! Scalar info + WRITE(*,'(3x,"Sensor_Id :",1x,a )') TRIM(ODPS%Sensor_Id) + WRITE(*,'(3x,"WMO_Satellite_ID :",1x,i0)') ODPS%WMO_Satellite_ID + WRITE(*,'(3x,"WMO_Sensor_ID :",1x,i0)') ODPS%WMO_Sensor_ID + WRITE(*,'(3x,"Sensor_Type :",1x,a )') TRIM(SENSOR_TYPE_NAME(ODPS%Sensor_Type)) + WRITE(*,'(3x,"Group_Index :",1x,i0)') ODPS%Group_Index + + ! OPTRAN info + IF ( ODPS%n_OCoeffs > 0 ) THEN + WRITE(*,'(3x,"OPTRAN Data :")') + WRITE(*,'(5x,"n_OCoeffs :",1x,i0)') ODPS%n_OCoeffs + WRITE(*,'(5x,"Alpha :",1x,es13.6)') ODPS%Alpha + WRITE(*,'(5x,"Alpha_C1 :",1x,es13.6)') ODPS%Alpha_C1 + WRITE(*,'(5x,"Alpha_C2 :",1x,es13.6)') ODPS%Alpha_C2 + WRITE(*,'(5x,"OComponent_Index :",1x,i0)') ODPS%OComponent_Index + END IF + + ! Arrays summary + WRITE(*,'(3x,"Sensor_Channel :")') + WRITE(*,'(10(1x,i5,:))') ODPS%Sensor_Channel + + WRITE(*,'(3x,"Component_ID :")') + WRITE(*,'(10(1x,i5,:))') ODPS%Component_ID + + WRITE(*,'(3x,"Absorber_ID :")') + WRITE(*,'(10(1x,i5,:))') ODPS%Absorber_ID + + END SUBROUTINE ODPS_Inspect + + SUBROUTINE ODAS_Inspect( ODAS ) + TYPE(ODAS_type), INTENT(IN) :: ODAS + + WRITE(*,'(1x,"ODAS OBJECT")') + ! Release/version info + WRITE(*,'(3x,"Release.Version :",1x,i0,".",i0)') ODAS%Release, ODAS%Version + ! Dimensions + WRITE(*,'(3x,"n_Predictors :",1x,i0)') ODAS%n_Predictors + WRITE(*,'(3x,"n_Absorbers :",1x,i0)') ODAS%n_Absorbers + WRITE(*,'(3x,"n_Channels :",1x,i0)') ODAS%n_Channels + WRITE(*,'(3x,"n_Alphas :",1x,i0)') ODAS%n_Alphas + WRITE(*,'(3x,"n_Coeffs :",1x,i0)') ODAS%n_Coeffs + + IF ( .NOT. Associated_ODAS(ODAS) ) RETURN + + ! Scalar info + WRITE(*,'(3x,"Sensor_Id :",1x,a )') TRIM(ODAS%Sensor_Id) + WRITE(*,'(3x,"WMO_Satellite_ID :",1x,i0)') ODAS%WMO_Satellite_ID + WRITE(*,'(3x,"WMO_Sensor_ID :",1x,i0)') ODAS%WMO_Sensor_ID + WRITE(*,'(3x,"Sensor_Type :",1x,a )') TRIM(SENSOR_TYPE_NAME(ODAS%Sensor_Type)) + + ! Arrays summary + WRITE(*,'(3x,"Sensor_Channel :")') + WRITE(*,'(10(1x,i5,:))') ODAS%Sensor_Channel + + WRITE(*,'(3x,"Absorber_ID :")') + WRITE(*,'(10(1x,i5,:))') ODAS%Absorber_ID + + END SUBROUTINE ODAS_Inspect + +END PROGRAM TauCoeff_Inspect diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 692dad4c..b49c8fd1 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -33,6 +33,14 @@ function(CREATE_SYMLINK_FILENAME src dst) endforeach(FILENAME) endfunction(CREATE_SYMLINK_FILENAME) +function(ADD_CRTM_UNIT_TEST target source) + add_executable(${target} ${source}) + target_link_libraries(${target} PRIVATE crtm) + add_test(NAME test_${target} + COMMAND $) + set_tests_properties(test_${target} PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=$ENV{OMP_NUM_THREADS}") +endfunction() + # Create Data directory for test input config and symlink all files file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testinput) @@ -350,6 +358,15 @@ foreach(testtype IN LISTS ODPS_Utils) target_link_libraries(${testtype} PRIVATE crtm) endforeach() +#TauCoeff general utilities +list (APPEND TCoeff_Utils + TauCoeff_Inspect +) +foreach(testtype IN LISTS TCoeff_Utils) + add_executable(${testtype} ${CRTM_SOURCE_DIR}/src/Coefficients/TauCoeff/${testtype}/${testtype}.f90) + target_link_libraries(${testtype} PRIVATE crtm) +endforeach() + #CloudCoeff utilities list (APPEND CCoef_Utils CloudCoeff_NC2BIN @@ -395,61 +412,26 @@ endforeach() #first upper level Unit_Test -#(PS) SpcCoeff Version 3 I/O test -add_executable(Spc_IO mains/unit/input_output/test_SpcCoeff/test_spc_io.f90) -target_link_libraries(Spc_IO PRIVATE crtm) -add_test(NAME test_Spc_IO - COMMAND $) -set_tests_properties(test_Spc_IO PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=$ENV{OMP_NUM_THREADS}") - -#(PS) SpcCoeff netCDF I/O test -add_executable(Spc_IO_NC mains/unit/input_output/test_SpcCoeff_NC/test_spc_io_nc.f90) -target_link_libraries(Spc_IO_NC PRIVATE crtm) -add_test(NAME test_Spc_IO_NC - COMMAND $) -set_tests_properties(test_Spc_IO_NC PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=$ENV{OMP_NUM_THREADS}") - -#(PS) TauCoeff netCDF I/O test -add_executable(TauCoeff_IO_NC mains/unit/input_output/test_TauCoeff_NC/test_taucoeff_io_nc.f90) -target_link_libraries(TauCoeff_IO_NC PRIVATE crtm) -add_test(NAME test_TauCoeff_IO_NC - COMMAND $) -set_tests_properties(test_TauCoeff_IO_NC PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=$ENV{OMP_NUM_THREADS}") - -#./mains/unit/input_output/test_EmisCoeff_NC/test_emis_coeff_io_nc.f90 -add_executable(EmisCoeff_IO_NC mains/unit/input_output/test_EmisCoeff_NC/test_emis_coeff_io_nc.f90) -target_link_libraries(EmisCoeff_IO_NC PRIVATE crtm) -add_test(NAME test_EmisCoeff_IO_NC - COMMAND $) -set_tests_properties(test_EmisCoeff_IO_NC PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=$ENV{OMP_NUM_THREADS}") - -#(CD) AerosolCoeff I/O test -add_executable(AerosolCoeff_IO mains/unit/input_output/test_AerosolCoeff/test_aerosol_coeff_io.f90) -target_link_libraries(AerosolCoeff_IO PRIVATE crtm) -add_test(NAME test_AerosolCoeff_IO - COMMAND $) -set_tests_properties(test_AerosolCoeff_IO PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=$ENV{OMP_NUM_THREADS}") - -#(CD) AerosolCoeff netCDF I/O test -add_executable(AerosolCoeff_IO_NC mains/unit/input_output/test_AerosolCoeff_NC/test_aerosol_coeff_io_nc.f90) -target_link_libraries(AerosolCoeff_IO_NC PRIVATE crtm) -add_test(NAME test_AerosolCoeff_IO_NC - COMMAND $) -set_tests_properties(test_AerosolCoeff_IO_NC PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=$ENV{OMP_NUM_THREADS}") - -#(CD) CloudCoeff Binary I/O test -add_executable(CloudCoeff_IO mains/unit/input_output/test_CloudCoeff/test_cloud_coeff_io.f90) -target_link_libraries(CloudCoeff_IO PRIVATE crtm) -add_test(NAME test_CloudCoeff_IO - COMMAND $) -set_tests_properties(test_CloudCoeff_IO PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=$ENV{OMP_NUM_THREADS}") - -#(CD) CloudCoeff netCDF I/O test -add_executable(CloudCoeff_IO_NC mains/unit/input_output/test_CloudCoeff_NC/test_cloud_coeff_io_nc.f90) -target_link_libraries(CloudCoeff_IO_NC PRIVATE crtm) -add_test(NAME test_CloudCoeff_IO_NC - COMMAND $) -set_tests_properties(test_CloudCoeff_IO_NC PROPERTIES ENVIRONMENT "OMP_NUM_THREADS=$ENV{OMP_NUM_THREADS}") +list(APPEND io_tests + Spc_IO mains/unit/input_output/test_SpcCoeff/test_spc_io.f90 + Spc_IO_NC mains/unit/input_output/test_SpcCoeff_NC/test_spc_io_nc.f90 + TauCoeff_IO_NC mains/unit/input_output/test_TauCoeff_NC/test_taucoeff_io_nc.f90 + EmisCoeff_IO_NC mains/unit/input_output/test_EmisCoeff_NC/test_emis_coeff_io_nc.f90 + AerosolCoeff_IO mains/unit/input_output/test_AerosolCoeff/test_aerosol_coeff_io.f90 + AerosolCoeff_IO_NC mains/unit/input_output/test_AerosolCoeff_NC/test_aerosol_coeff_io_nc.f90 + CloudCoeff_IO mains/unit/input_output/test_CloudCoeff/test_cloud_coeff_io.f90 + CloudCoeff_IO_NC mains/unit/input_output/test_CloudCoeff_NC/test_cloud_coeff_io_nc.f90 + BeCoeff_IO_NC mains/unit/input_output/test_BeCoeff_NC/test_becoeff_io_nc.f90 +) + +list(LENGTH io_tests io_tests_len) +math(EXPR io_tests_max "${io_tests_len} - 1") +foreach(io_test_index RANGE 0 ${io_tests_max} 2) + list(GET io_tests ${io_test_index} io_test_name) + math(EXPR io_test_source_index "${io_test_index} + 1") + list(GET io_tests ${io_test_source_index} io_test_source) + ADD_CRTM_UNIT_TEST(${io_test_name} ${io_test_source}) +endforeach() #(PS) Hypsometric Equation test add_executable(hypsometric_eq mains/unit/Unit_Test/test_Hypsometric.f90) @@ -568,6 +550,7 @@ AerosolCoeff/netCDF/AerosolCoeff.nc4 CloudCoeff/Little_Endian/CloudCoeff.bin CloudCoeff/netCDF/CloudCoeff.nc4 CloudCoeff/netCDF/CloudCoeff_DDA_Moradi_2022.nc4 +BeCoeff/netCDF/BeCoeff.nc EmisCoeff/MW_Water/Little_Endian/FASTEM6.MWwater.EmisCoeff.bin EmisCoeff/MW_Water/Little_Endian/FASTEM4.MWwater.EmisCoeff.bin EmisCoeff/IR_Ice/SEcategory/Little_Endian/NPOESS.IRice.EmisCoeff.bin diff --git a/test/mains/unit/input_output/test_BeCoeff_NC/test_becoeff_io_nc.f90 b/test/mains/unit/input_output/test_BeCoeff_NC/test_becoeff_io_nc.f90 new file mode 100644 index 00000000..3ac11540 --- /dev/null +++ b/test/mains/unit/input_output/test_BeCoeff_NC/test_becoeff_io_nc.f90 @@ -0,0 +1,62 @@ +!------------------------------------------------------- +! +! Description: +! Simple test program to inspect the CRTM BeCoeff +! files. +! +!------------------------------------------------------- + +PROGRAM test_becoeff_io_nc + + ! ==================================================== + ! **** ENVIRONMENT SETUP FOR RTM USAGE **** + ! + + ! Module usage + USE UnitTest_Define, ONLY: UnitTest_type, & + UnitTest_Init, & + UnitTest_Setup, & + UnitTest_Assert, & + UnitTest_Passed + USE CRTM_BeCoeff + USE Message_Handler, ONLY: SUCCESS, Display_Message + + ! Disable all implicit typing + IMPLICIT NONE + + ! Data dictionary: + CHARACTER(2000) :: info + CHARACTER(*), PARAMETER :: BeCoeff_File = 'BeCoeff.nc' + CHARACTER(*), PARAMETER :: File_Path = './testinput/' + LOGICAL, PARAMETER :: netCDF = .TRUE. + LOGICAL, PARAMETER :: Quiet = .TRUE. + INTEGER :: err_stat + TYPE(UnitTest_type) :: ioTest + LOGICAL :: testPassed + CHARACTER(*), PARAMETER :: Program_Name = 'Test_BeCoeff_IO_NetCDF' + + ! Initialize Unit test: + CALL UnitTest_Init(ioTest, .TRUE.) + CALL UnitTest_Setup(ioTest, 'BeCoeff_IO_Test_NetCDF', Program_Name, .TRUE.) + + ! Greeting: + WRITE(*,*) 'HELLO, THIS IS A TEST CODE TO INSPECT BeCoeff files.' + WRITE(*,*) 'test_becoeff_io_nc' + + ! Load the BeCoeff look-up table: + err_stat = 3 + err_stat = CRTM_BeCoeff_Load( & + BeCoeff_File , & + File_Path = File_Path, & + netCDF = netCDF, & + Quiet = Quiet ) + CALL UnitTest_Assert(ioTest, (err_stat==SUCCESS) ) + testPassed = UnitTest_Passed(ioTest) + + IF ( err_stat /= SUCCESS ) THEN + CALL Display_Message( 'CRTM_BeCoeff_Load' ,'Error loading BeCoeff data', err_stat ) + STOP 1 + END IF + STOP 0 + +END PROGRAM test_becoeff_io_nc