21 OPERATOR(.equalto.), &
39 PUBLIC ::
OPERATOR(==)
59 INTERFACE OPERATOR(==)
61 END INTERFACE OPERATOR(==)
65 END INTERFACE OPERATOR(-)
76 '$Id: CRTM_AtmOptics_Define.f90 60152 2015-08-13 19:19:13Z paul.vandelst@noaa.gov $' 82 REAL(fp),
PARAMETER ::
zero = 0.0_fp
83 REAL(fp),
PARAMETER ::
one = 1.0_fp
85 INTEGER,
PARAMETER ::
ml = 256
86 INTEGER,
PARAMETER ::
sl = 80
95 LOGICAL :: is_allocated = .false.
99 INTEGER :: n_layers = 0
100 INTEGER :: n_legendre_terms = 0
101 INTEGER :: n_phase_elements = 0
103 INTEGER :: max_layers = 0
104 INTEGER :: max_legendre_terms = 0
105 INTEGER :: max_phase_elements = 0
107 LOGICAL :: include_scattering = .true.
108 INTEGER :: loffset = 0
109 REAL(fp) :: scattering_optical_depth =
zero 111 REAL(fp),
ALLOCATABLE :: optical_depth(:)
112 REAL(fp),
ALLOCATABLE :: single_scatter_albedo(:)
113 REAL(fp),
ALLOCATABLE :: asymmetry_factor(:)
114 REAL(fp),
ALLOCATABLE :: delta_truncation(:)
115 REAL(fp),
ALLOCATABLE :: phase_coefficient(:,:,:)
169 status = self%Is_Allocated
197 self%Is_Allocated = .false.
199 self%n_Legendre_Terms = 0
200 self%n_Phase_Elements = 0
202 self%Max_Legendre_Terms = 0
203 self%Max_Phase_Elements = 0
264 n_Legendre_Terms, & ! Input
268 INTEGER ,
INTENT(IN) :: n_layers
269 INTEGER ,
INTENT(IN) :: n_legendre_terms
270 INTEGER ,
INTENT(IN) :: n_phase_elements
272 INTEGER :: alloc_stat
275 IF ( n_layers < 1 .OR. &
276 n_legendre_terms < 1 .OR. &
277 n_phase_elements < 1 )
THEN 285 IF ( self%Max_Layers < n_layers .OR. &
286 self%Max_Legendre_Terms < n_legendre_terms .OR. &
287 self%Max_Phase_Elements < n_phase_elements )
THEN 289 IF ( alloc_stat /= 0 )
RETURN 294 IF ( alloc_stat /= 0 )
RETURN 298 self%n_Layers = n_layers
299 self%n_Legendre_Terms = n_legendre_terms
300 self%n_Phase_Elements = n_phase_elements
303 self%Is_Allocated = .true.
309 INTEGER ,
INTENT(OUT) :: alloc_stat
311 ALLOCATE( self%Optical_Depth( n_layers ), &
312 self%Single_Scatter_Albedo( n_layers ), &
313 self%Asymmetry_Factor( n_layers ), &
314 self%Delta_Truncation( n_layers ), &
315 self%Phase_Coefficient( 0:n_legendre_terms, n_phase_elements, n_layers ), &
317 IF ( alloc_stat /= 0 )
RETURN 319 self%Max_Layers = n_layers
320 self%Max_Legendre_Terms = n_legendre_terms
321 self%Max_Phase_Elements = n_phase_elements
353 self%Scattering_Optical_Depth =
zero 355 self%Optical_Depth =
zero 356 self%Single_Scatter_Albedo =
zero 357 self%Asymmetry_Factor =
zero 358 self%Delta_Truncation =
zero 359 self%Phase_Coefficient =
zero 386 TYPE(CRTM_AtmOptics_type),
INTENT(IN) :: self
388 WRITE(*,
'(1x,"AtmOptics OBJECT")')
390 WRITE(*,
'(3x,"Release : ",i0)') self%Release
392 WRITE(*,
'(3x,"n_Layers : ",i0," (of max. ",i0,")")') self%n_Layers , self%Max_Layers
393 WRITE(*,
'(3x,"n_Legendre_Terms : ",i0," (of max. ",i0,")")') self%n_Legendre_Terms, self%Max_Legendre_Terms
394 WRITE(*,
'(3x,"n_Phase_Elements : ",i0," (of max. ",i0,")")') self%n_Phase_Elements, self%Max_Phase_Elements
395 WRITE(*,
'(3x,"Scattering Optical Depth : ",es13.6)') self%Scattering_Optical_Depth
398 WRITE(*,
'(3x,"Optical_Depth :")')
399 WRITE(*,
'(5(1x,es13.6,:))') self%Optical_Depth(1:self%n_Layers)
400 WRITE(*,
'(3x,"Single_Scatter_Albedo :")')
401 WRITE(*,
'(5(1x,es13.6,:))') self%Single_Scatter_Albedo(1:self%n_Layers)
402 WRITE(*,
'(3x,"Asymmetry_Factor :")')
403 WRITE(*,
'(5(1x,es13.6,:))') self%Asymmetry_Factor(1:self%n_Layers)
404 WRITE(*,
'(3x,"Delta_Truncation :")')
405 WRITE(*,
'(5(1x,es13.6,:))') self%Delta_Truncation(1:self%n_Layers)
406 WRITE(*,
'(3x,"Phase_Coefficient Legendre polynomial coefficients :")')
407 DO k = 1, self%n_Layers
408 DO ip = 1, self%n_Phase_Elements
409 WRITE(*,
'(5x,"Layer: ",i0,"; Phase element: ",i0)') k, ip
410 WRITE(*,
'(5(1x,es13.6,:))') self%Phase_Coefficient(0:self%n_Legendre_Terms,ip,k)
417 TYPE(CRTM_AtmOptics_type),
INTENT(IN) :: self(:)
418 INTEGER :: n, n_objects
420 n_objects =
SIZE(self)
422 WRITE(*, fmt=
'(1x,"OBJECT INDEX:",i0," - ")', advance=
'NO') n
463 CHARACTER(*),
PARAMETER :: routine_name =
'CRTM_AtmOptics_ValidRelease' 474 WRITE( msg,
'("An AtmOptics data update is needed. ", & 475 &"AtmOptics release is ",i0,". Valid release is ",i0,"." )' ) &
484 WRITE( msg,
'("An AtmOptics software update is needed. ", & 485 &"AtmOptics release is ",i0,". Valid release is ",i0,"." )' ) &
527 CHARACTER(*),
INTENT(OUT) :: info
529 INTEGER,
PARAMETER :: carriage_return = 13
530 INTEGER,
PARAMETER :: linefeed = 10
532 CHARACTER(2000) :: long_string
535 WRITE( long_string, &
536 '(a,1x,"AtmOptics RELEASE: ",i2,3x, & 538 &"N_LEGENDRE_TERMS=",i0,2x,& 539 &"N_PHASE_ELEMENTS=",i0 )' ) &
540 achar(carriage_return)//achar(linefeed), &
543 self%n_Legendre_Terms, &
544 self%n_Phase_Elements
548 info = long_string(1:
min(len(info), len_trim(long_string)))
577 CHARACTER(*),
INTENT(OUT) :: id
621 result( is_comparable )
623 INTEGER,
OPTIONAL,
INTENT(IN) :: n_sigfig
624 LOGICAL :: is_comparable
630 is_comparable = .false.
631 IF (
PRESENT(n_sigfig) )
THEN 642 IF ( (x%n_Layers /= y%n_Layers ) .OR. &
643 (x%n_Legendre_Terms /= y%n_Legendre_Terms) .OR. &
644 (x%n_Phase_Elements /= y%n_Phase_Elements) )
RETURN 647 IF ( (x%Include_Scattering .NEQV. y%Include_Scattering ) .OR. &
648 (x%lOffset /= y%lOffset ) .OR. &
650 y%Scattering_Optical_Depth, n)) )
RETURN 655 ip = x%n_Phase_Elements
656 ic = x%n_Legendre_Terms
658 x%Optical_Depth(1:k), &
659 y%Optical_Depth(1:k), &
662 x%Single_Scatter_Albedo(1:k), &
663 y%Single_Scatter_Albedo(1:k), &
666 x%Asymmetry_Factor(1:k), &
667 y%Asymmetry_Factor(1:k), &
670 x%Delta_Truncation(1:k), &
671 y%Delta_Truncation(1:k), &
674 x%Phase_Coefficient(0:ic,1:ip,1:k), &
675 y%Phase_Coefficient(0:ic,1:ip,1:k), &
680 is_comparable = .true.
737 n_Objects, & ! Optional output
738 Release , & ! Optional output
739 Title , & ! Optional output
740 History , & ! Optional output
744 CHARACTER(*),
INTENT(IN) :: filename
745 INTEGER ,
OPTIONAL,
INTENT(OUT) :: n_objects
746 INTEGER ,
OPTIONAL,
INTENT(OUT) :: release
747 CHARACTER(*),
OPTIONAL,
INTENT(OUT) :: title
748 CHARACTER(*),
OPTIONAL,
INTENT(OUT) :: history
749 CHARACTER(*),
OPTIONAL,
INTENT(OUT) :: comment
753 CHARACTER(*),
PARAMETER :: routine_name =
'CRTM_AtmOptics_InquireFile' 756 CHARACTER(ML) :: io_msg
767 msg =
'File '//trim(filename)//
' not found.' 774 IF ( err_stat /=
success )
THEN 775 msg =
'Error opening '//trim(filename)
781 READ( fid, iostat=io_stat, iomsg=io_msg ) &
783 IF ( io_stat /= 0 )
THEN 784 msg =
'Error reading Release - '//trim(io_msg)
788 msg =
'AtmOptics Release check failed.' 794 READ( fid, iostat=io_stat,iomsg=io_msg ) n
795 IF ( io_stat /= 0 )
THEN 796 msg =
'Error reading dimensions from '//trim(filename)//
' - '//trim(io_msg)
807 IF ( err_stat /=
success )
THEN 808 msg =
'Error reading global attributes' 814 CLOSE( fid, iostat=io_stat, iomsg=io_msg )
815 IF ( io_stat /= 0 )
THEN 816 msg =
'Error closing '//trim(filename)//
' - '//trim(io_msg)
822 IF (
PRESENT(n_objects) ) n_objects = n
823 IF (
PRESENT(release ) ) release = atmoptics%Release
829 CLOSE( fid, iostat=io_stat, iomsg=io_msg )
830 IF ( io_stat /= 0 ) &
831 msg = trim(msg)//
'; Error closing input file during error cleanup - '//trim(io_msg)
906 AtmOptics, & ! Output
908 No_Close , & ! Optional input
909 Quiet , & ! Optional input
910 Title , & ! Optional output
911 History , & ! Optional output
912 Comment , & ! Optional output
917 CHARACTER(*),
INTENT(IN) :: filename
918 LOGICAL,
OPTIONAL,
INTENT(IN) :: no_close
919 LOGICAL,
OPTIONAL,
INTENT(IN) :: quiet
920 CHARACTER(*),
OPTIONAL,
INTENT(OUT) :: title
921 CHARACTER(*),
OPTIONAL,
INTENT(OUT) :: history
922 CHARACTER(*),
OPTIONAL,
INTENT(OUT) :: comment
923 LOGICAL,
OPTIONAL,
INTENT(IN) :: debug
927 CHARACTER(*),
PARAMETER :: routine_name =
'CRTM_AtmOptics_ReadFile' 930 CHARACTER(ML) :: count_msg
931 CHARACTER(ML) :: io_msg
932 LOGICAL :: close_file
935 INTEGER :: alloc_stat
937 INTEGER :: n, n_objects
944 IF (
PRESENT(no_close) ) close_file = .NOT. no_close
947 IF (
PRESENT(quiet) ) noisy = .NOT. quiet
949 IF (
PRESENT(debug) )
THEN 950 IF ( debug ) noisy = .true.
957 INQUIRE( file=filename, number=fid )
960 msg =
'Error inquiring '//trim(filename)//
' for its FileID' 967 IF ( err_stat /=
success )
THEN 968 msg =
'Error opening '//trim(filename)
972 msg =
'File '//trim(filename)//
' not found.' 979 READ( fid, iostat=io_stat, iomsg=io_msg ) &
981 IF ( io_stat /= 0 )
THEN 982 msg =
'Error reading Release/Version - '//trim(io_msg)
986 msg =
'Release check failed.' 992 READ( fid, iostat=io_stat,iomsg=io_msg ) n_objects
993 IF ( io_stat /= 0 )
THEN 994 msg =
'Error reading dimensions from '//trim(filename)//
' - '//trim(io_msg)
1000 ALLOCATE( atmoptics(n_objects), stat=alloc_stat )
1001 IF ( alloc_stat /= 0 )
THEN 1002 msg =
'Error allocating output object array' 1011 history = history, &
1013 IF ( err_stat /=
success )
THEN 1014 msg =
'Error reading global attributes' 1020 read_loop:
DO n = 1, n_objects
1024 WRITE(count_msg,
'("for object (",i0,")")') n
1028 READ( fid, iostat=io_stat, iomsg=io_msg ) &
1030 dummy%n_Legendre_Terms, &
1031 dummy%n_Phase_Elements
1032 IF ( io_stat /= 0 )
THEN 1033 msg =
'Error reading dimensions '//trim(count_msg)//
' from '//&
1034 trim(filename)//
' - '//trim(io_msg)
1041 dummy%n_Legendre_Terms, &
1042 dummy%n_Phase_Elements )
1044 msg =
'Allocation failed '//trim(count_msg)
1051 READ( fid, iostat=io_stat, iomsg=io_msg ) &
1052 atmoptics(n)%Scattering_Optical_Depth
1053 IF ( io_stat /= 0 )
THEN 1054 msg =
'Error reading scalar data '//trim(count_msg)//
' from '//&
1055 trim(filename)//
' - '//trim(io_msg)
1059 READ( fid, iostat=io_stat, iomsg=io_msg ) &
1060 atmoptics(n)%Optical_Depth , &
1061 atmoptics(n)%Single_Scatter_Albedo, &
1062 atmoptics(n)%Asymmetry_Factor , &
1063 atmoptics(n)%Delta_Truncation
1064 IF ( io_stat /= 0 )
THEN 1065 msg =
'Error reading profile data '//trim(count_msg)//
' from '//&
1066 trim(filename)//
' - '//trim(io_msg)
1070 READ( fid, iostat=io_stat, iomsg=io_msg ) &
1071 atmoptics(n)%Phase_Coefficient
1072 IF ( io_stat /= 0 )
THEN 1073 msg =
'Error reading phase matrix coefficients '//trim(count_msg)//
' from '//&
1074 trim(filename)//
' - '//trim(io_msg)
1082 IF ( close_file )
THEN 1083 CLOSE( fid, iostat=io_stat, iomsg=io_msg )
1084 IF ( io_stat /= 0 )
THEN 1085 msg =
'Error closing '//trim(filename)//
' - '//trim(io_msg)
1093 WRITE( msg,
'("Number of objects read from ",a,": ",i0)' ) trim(filename), n_objects
1101 CLOSE( fid, iostat=io_stat, iomsg=io_msg )
1102 IF ( io_stat /= 0 ) &
1103 msg = trim(msg)//
'; Error closing input file during error cleanup - '//trim(io_msg)
1105 IF (
ALLOCATED(atmoptics) )
THEN 1106 DEALLOCATE( atmoptics, stat=alloc_stat )
1107 IF ( alloc_stat /= 0 ) &
1108 msg = trim(msg)//
'; Error deallocating object array during error cleanup' 1183 AtmOptics, & ! Input
1184 Filename , & ! Input
1185 No_Close , & ! Optional input
1186 Quiet , & ! Optional input
1187 Title , & ! Optional input
1188 History , & ! Optional input
1189 Comment , & ! Optional input
1194 CHARACTER(*),
INTENT(IN) :: filename
1195 LOGICAL,
OPTIONAL,
INTENT(IN) :: no_close
1196 LOGICAL,
OPTIONAL,
INTENT(IN) :: quiet
1197 CHARACTER(*),
OPTIONAL,
INTENT(IN) :: title
1198 CHARACTER(*),
OPTIONAL,
INTENT(IN) :: history
1199 CHARACTER(*),
OPTIONAL,
INTENT(IN) :: comment
1200 LOGICAL,
OPTIONAL,
INTENT(IN) :: debug
1204 CHARACTER(*),
PARAMETER :: routine_name =
'CRTM_AtmOptics_WriteFile' 1206 CHARACTER(ML) :: msg
1207 CHARACTER(ML) :: count_msg
1208 CHARACTER(ML) :: io_msg
1209 LOGICAL :: close_file
1213 INTEGER :: n, n_objects
1220 IF (
PRESENT(no_close) ) close_file = .NOT. no_close
1223 IF (
PRESENT(quiet) ) noisy = .NOT. quiet
1225 IF (
PRESENT(debug) )
THEN 1226 IF ( debug ) noisy = .true.
1230 msg =
'Unassociated objects in input array.' 1233 n_objects=
SIZE(atmoptics)
1239 INQUIRE( file=filename, number=fid )
1242 msg =
'Error inquiring '//trim(filename)//
' for its FileID' 1248 IF ( err_stat /=
success )
THEN 1249 msg =
'Error opening '//trim(filename)
1257 IF ( io_stat /= 0 )
THEN 1258 msg =
'Error writing Release - '//trim(io_msg)
1264 WRITE( fid, iostat=io_stat,iomsg=io_msg )
SIZE(atmoptics)
1265 IF ( io_stat /= 0 )
THEN 1266 msg =
'Error writing dimensions to '//trim(filename)//
' - '//trim(io_msg)
1276 history = history, &
1278 IF ( err_stat /=
success )
THEN 1279 msg =
'Error writing global attributes' 1285 write_loop:
DO n = 1, n_objects
1289 WRITE(count_msg,
'("for object (",i0,")")') n
1293 WRITE( fid, iostat=io_stat, iomsg=io_msg ) &
1294 atmoptics(n)%n_Layers , &
1295 atmoptics(n)%n_Legendre_Terms, &
1296 atmoptics(n)%n_Phase_Elements
1297 IF ( io_stat /= 0 )
THEN 1298 msg =
'Error writing dimensions '//trim(count_msg)//
' to '//&
1299 trim(filename)//
' - '//trim(io_msg)
1306 WRITE( fid, iostat=io_stat, iomsg=io_msg ) &
1307 atmoptics(n)%Scattering_Optical_Depth
1308 IF ( io_stat /= 0 )
THEN 1309 msg =
'Error writing scalar data '//trim(count_msg)//
' to '//&
1310 trim(filename)//
' - '//trim(io_msg)
1314 WRITE( fid, iostat=io_stat, iomsg=io_msg ) &
1315 atmoptics(n)%Optical_Depth(1:atmoptics(n)%n_Layers) , &
1316 atmoptics(n)%Single_Scatter_Albedo(1:atmoptics(n)%n_Layers), &
1317 atmoptics(n)%Asymmetry_Factor(1:atmoptics(n)%n_Layers) , &
1318 atmoptics(n)%Delta_Truncation(1:atmoptics(n)%n_Layers)
1319 IF ( io_stat /= 0 )
THEN 1320 msg =
'Error writing profile data '//trim(count_msg)//
' to '//&
1321 trim(filename)//
' - '//trim(io_msg)
1325 WRITE( fid, iostat=io_stat, iomsg=io_msg ) &
1326 atmoptics(n)%Phase_Coefficient(0:atmoptics(n)%n_Legendre_Terms, &
1327 1:atmoptics(n)%n_Phase_Elements, &
1328 1:atmoptics(n)%n_Layers)
1329 IF ( io_stat /= 0 )
THEN 1330 msg =
'Error writing phase matrix coefficients '//trim(count_msg)//
' to '//&
1331 trim(filename)//
' - '//trim(io_msg)
1339 IF ( close_file )
THEN 1340 CLOSE( fid, iostat=io_stat, iomsg=io_msg )
1341 IF ( io_stat /= 0 )
THEN 1342 msg =
'Error closing '//trim(filename)//
' - '//trim(io_msg)
1350 WRITE( msg,
'("Number of objects written to ",a,": ",i0)' ) trim(filename), n_objects
1358 CLOSE( fid, iostat=io_stat, iomsg=io_msg )
1359 IF ( io_stat /= 0 ) &
1360 msg = trim(msg)//
'; Error closing output file during error cleanup - '//trim(io_msg)
1423 IF ( (x%Release /= y%Release) )
RETURN 1425 IF ( (x%n_Layers /= y%n_Layers ) .OR. &
1426 (x%n_Legendre_Terms /= y%n_Legendre_Terms) .OR. &
1427 (x%n_Phase_Elements /= y%n_Phase_Elements) )
RETURN 1429 IF ( x%Scattering_Optical_Depth .equalto. y%Scattering_Optical_Depth ) &
1432 is_equal = is_equal .AND. &
1433 all(x%Optical_Depth(1:x%n_Layers) .equalto. y%Optical_Depth(1:y%n_Layers) ) .AND. &
1434 all(x%Single_Scatter_Albedo(1:x%n_Layers) .equalto. y%Single_Scatter_Albedo(1:y%n_Layers)) .AND. &
1435 all(x%Asymmetry_Factor(1:x%n_Layers) .equalto. y%Asymmetry_Factor(1:y%n_Layers) ) .AND. &
1436 all(x%Delta_Truncation(1:x%n_Layers) .equalto. y%Delta_Truncation(1:y%n_Layers) ) .AND. &
1437 all(x%Phase_Coefficient(0:x%n_Legendre_Terms, 1:x%n_Phase_Elements, 1:x%n_Layers) .equalto. &
1438 y%Phase_Coefficient(0:y%n_Legendre_Terms, 1:y%n_Phase_Elements, 1:y%n_Layers) )
1478 INTEGER :: ic, ip, k
1485 IF ( ao1%n_Layers /= ao2%n_Layers .OR. &
1486 ao1%n_Legendre_Terms /= ao2%n_Legendre_Terms .OR. &
1487 ao1%n_Phase_Elements /= ao2%n_Phase_Elements )
RETURN 1489 IF ( (ao1%Include_Scattering .NEQV. ao2%Include_Scattering ) .AND. &
1490 (ao1%lOffset /= ao2%lOffset ) )
RETURN 1497 aodiff%Scattering_Optical_Depth = aodiff%Scattering_Optical_Depth - ao2%Scattering_Optical_Depth
1500 ip = aodiff%n_Phase_Elements
1501 ic = aodiff%n_Legendre_Terms
1502 aodiff%Optical_Depth(1:k) = aodiff%Optical_Depth(1:k) - ao2%Optical_Depth(1:k)
1503 aodiff%Single_Scatter_Albedo(1:k) = aodiff%Single_Scatter_Albedo(1:k) - ao2%Single_Scatter_Albedo(1:k)
1504 aodiff%Asymmetry_Factor(1:k) = aodiff%Asymmetry_Factor(1:k) - ao2%Asymmetry_Factor(1:k)
1505 aodiff%Delta_Truncation(1:k) = aodiff%Delta_Truncation(1:k) - ao2%Delta_Truncation(1:k)
1506 aodiff%Phase_Coefficient(0:ic,1:ip,1:k) = aodiff%Phase_Coefficient(0:ic,1:ip,1:k) - ao2%Phase_Coefficient(0:ic,1:ip,1:k)
integer, parameter, public failure
subroutine, public crtm_atmoptics_info(self, Info)
elemental logical function crtm_atmoptics_equal(x, y)
integer, parameter atmoptics_release
integer, parameter, public long
logical function, public crtm_atmoptics_validrelease(self)
integer, parameter, public fp
pure subroutine atmoptics_allocate(self, alloc_stat)
elemental type(crtm_atmoptics_type) function crtm_atmoptics_subtract(ao1, ao2)
integer function, public crtm_atmoptics_inquirefile(Filename, n_Objects, Release, Title, History, Comment)
integer function, public readgatts_binary_file(fid, Write_Module, Created_On, Title, History, Comment)
subroutine rank1_inspect(self)
integer, parameter, public double
elemental subroutine, public crtm_atmoptics_destroy(self)
subroutine inquire_cleanup()
elemental logical function, public crtm_atmoptics_associated(self)
elemental subroutine, public crtm_atmoptics_zero(self)
subroutine read_cleanup()
integer function, public crtm_atmoptics_writefile(AtmOptics, Filename, No_Close, Quiet, Title, History, Comment, Debug)
subroutine write_cleanup()
elemental logical function, public crtm_atmoptics_compare(x, y, n_SigFig)
integer function, public open_binary_file(Filename, FileID, For_Output, No_Check)
recursive subroutine, public display_message(Routine_Name, Message, Error_State, Message_Log)
elemental subroutine, public crtm_atmoptics_create(self, n_Layers, n_Legendre_Terms, n_Phase_Elements)
character(*), parameter module_version_id
character(*), parameter write_error_status
integer, parameter, public default_n_sigfig
integer function, public writegatts_binary_file(fid, Write_Module, Created_On, Title, History, Comment)
subroutine scalar_inspect(self)
integer function, public crtm_atmoptics_readfile(AtmOptics, Filename, No_Close, Quiet, Title, History, Comment, Debug)
integer, parameter, public success
subroutine, public crtm_atmoptics_defineversion(Id)
integer, parameter, public information