FV3 Bundle
CRTM_Predictor.f90
Go to the documentation of this file.
1 !
2 ! CRTM_Predictor
3 !
4 ! Module containing routines to compute the predictors for the regression
5 ! model algorithms that compute the optical depth profile due to gaseous
6 ! absorption.
7 !
8 
10 
11  ! -----------------
12  ! Environment setup
13  ! -----------------
14  ! Module use
15  USE type_kinds, ONLY: fp
17  USE crtm_parameters, ONLY: zero, &
20  USE crtm_taucoeff, ONLY: tc
26  ! ODAS modules
31  USE odas_predictor, ONLY: odas_apvar_type => ivar_type, &
35  odas_max_n_predictors => max_n_predictors, &
36  odas_max_n_absorbers => max_n_absorbers , &
37  odas_max_n_orders => max_n_orders
38  ! ODPS modules
43  pafv_associated , &
44  pafv_destroy , &
45  pafv_create
46  USE odps_predictor, ONLY: odps_apvar_type => ivar_type, &
55  ! ODZeeman modules
60 
61  ! Disable implicit typing
62  IMPLICIT NONE
63 
64  ! ------------
65  ! Visibilities
66  ! ------------
67  ! Everything private by default
68  PRIVATE
69  ! Datatypes
70  PUBLIC :: ivar_type
71  ! Procedures
72  PUBLIC :: crtm_compute_predictors
75 
76 
77  ! -----------------
78  ! Module parameters
79  ! -----------------
80  CHARACTER(*), PARAMETER :: module_version_id = &
81  '$Id: CRTM_Predictor.f90 60152 2015-08-13 19:19:13Z paul.vandelst@noaa.gov $'
82  ! Message string length
83  INTEGER, PARAMETER :: ml = 256
84 
85 
86  ! -----------------------------------------
87  ! Structure to hold Predictor forward model
88  ! variables across FWD, TL, and AD calls
89  ! -----------------------------------------
90  TYPE :: ivar_type
91  PRIVATE
92  TYPE(odas_apvar_type) :: odas
93  TYPE(odps_apvar_type) :: odps
94  END TYPE ivar_type
95 
96 
97 CONTAINS
98 
99 
100 !################################################################################
101 !################################################################################
102 !## ##
103 !## ## PUBLIC MODULE ROUTINES ## ##
104 !## ##
105 !################################################################################
106 !################################################################################
107 
108 !--------------------------------------------------------------------------------
109 !:sdoc+:
110 !
111 ! NAME:
112 ! CRTM_Compute_Predictors
113 !
114 ! PURPOSE:
115 ! Subroutine to calculate the gas absorption model predictors.
116 ! It is a wrapper which calls the algorithm specific routine.
117 !
118 ! CALLING SEQUENCE:
119 ! CALL CRTM_Compute_Predictors( &
120 ! SensorIndex , & ! Input
121 ! Atmosphere , & ! Input
122 ! GeometryInfo , & ! Input
123 ! AncillaryInput, & ! Input
124 ! Predictor , & ! Output
125 ! iVar ) ! Internal variable output
126 !
127 ! INPUT ARGUMENTS:
128 ! SensorIndex:
129 ! Sensor index id. This is a unique index associated
130 ! with a (supported) sensor used to access the
131 ! shared coefficient data for a particular sensor.
132 ! See the ChannelIndex argument.
133 ! UNITS: N/A
134 ! TYPE: INTEGER
135 ! DIMENSION: Scalar
136 ! ATTRIBUTES: INTENT(IN)
137 !
138 ! Atmosphere:
139 ! Structure containing the atmospheric state data.
140 ! UNITS: N/A
141 ! TYPE: CRTM_Atmosphere_type
142 ! DIMENSION: Scalar
143 ! ATTRIBUTES: INTENT(IN)
144 !
145 ! GeometryInfo:
146 ! Structure containing the view geometry information.
147 ! UNITS: N/A
148 ! TYPE: CRTM_GeometryInfo_type
149 ! DIMENSION: Scalar
150 ! ATTRIBUTES: INTENT(IN)
151 !
152 ! AncillaryInput:
153 ! Structure holding ancillary inputs
154 ! UNITS: N/A
155 ! TYPE: AncillaryInput_type
156 ! DIMENSION: Scalar
157 ! ATTRIBUTES: INTENT(IN)
158 !
159 ! OUTPUT ARGUMENTS:
160 ! Predictor:
161 ! Structure containing the integrated absorber and predictor profiles.
162 ! UNITS: N/A
163 ! TYPE: CRTM_Predictor_type
164 ! DIMENSION: Scalar
165 ! ATTRIBUTES: INTENT(IN OUT)
166 !
167 ! iVar:
168 ! Structure containing internal variables required for
169 ! subsequent tangent-linear or adjoint model calls.
170 ! The contents of this structure are NOT accessible
171 ! outside of this module.
172 ! UNITS: N/A
173 ! TYPE: iVar_type
174 ! DIMENSION: Scalar
175 ! ATTRIBUTES: INTENT(IN OUT)
176 !
177 !--------------------------------------------------------------------------------
178 
179  SUBROUTINE crtm_compute_predictors( &
180  SensorIndex , & ! Input
181  Atmosphere , & ! Input
182  GeometryInfo , & ! Input
183  AncillaryInput, & ! Input
184  Predictor , & ! Output
185  iVar ) ! Internal variable output
186  ! Arguments
187  INTEGER , INTENT(IN) :: sensorindex
188  TYPE(crtm_atmosphere_type) , INTENT(IN) :: atmosphere
189  TYPE(crtm_geometryinfo_type) , INTENT(IN) :: geometryinfo
190  TYPE(crtm_ancillaryinput_type), INTENT(IN) :: ancillaryinput
191  TYPE(crtm_predictor_type) , INTENT(IN OUT) :: predictor
192  TYPE(ivar_type) , INTENT(IN OUT) :: ivar
193  ! Local variables
194  INTEGER :: idx, n
195 
196  ! Call required model
197  idx = tc%Sensor_LoIndex(sensorindex)
198  SELECT CASE( tc%Algorithm_ID(sensorindex) )
199 
200  ! Predictors for ODAS transmittance model
201  CASE( odas_algorithm )
203  atmosphere , & ! Input
204  geometryinfo , & ! Input
205  tc%ODAS(idx)%Max_Order, & ! Input
206  tc%ODAS(idx)%Alpha , & ! Input
207  predictor%ODAS , & ! Output
208  ivar%ODAS ) ! Output
209 
210  ! Predictors for ODPS transmittance model
211  CASE( odps_algorithm )
213  tc%ODPS(idx) , & ! Input
214  atmosphere , & ! Input
215  geometryinfo , & ! Input
216  predictor%ODPS ) ! Output
217 
218  ! Predictors for SSU instrument specific model
219  CASE( odssu_algorithm )
220 
221  ! ...Select particular transmittance algorithm for this instrument
222  SELECT CASE( tc%ODSSU(idx)%subAlgorithm )
223  CASE( odas_algorithm )
224  ! ...Assumes the same alphas for all TCs
225  n = tc%ODSSU(idx)%n_Absorbers
227  atmosphere , & ! Input
228  geometryinfo , & ! Input
229  spread(odas_max_n_orders,dim=1,ncopies=n), & ! Input
230  tc%ODSSU(idx)%ODAS(1)%Alpha , & ! Input
231  predictor%ODAS , & ! Output
232  ivar%ODAS ) ! Output
233  CASE( odps_algorithm )
235  tc%ODSSU(idx)%ODPS(1), & ! Input
236  atmosphere , & ! Input
237  geometryinfo , & ! Input
238  predictor%ODPS ) ! Output
239  END SELECT
240  END SELECT
241 
242  ! Is this a Zeeman channel?
243  idx = tc%ZSensor_LoIndex(sensorindex)
244  IF( idx > 0 )THEN
245  IF( is_odzeeman(tc%ODZeeman(idx)) )THEN
247  ancillaryinput%Zeeman, & ! Input
248  tc%ODZeeman(idx) , & ! Input
249  atmosphere , & ! Input
250  geometryinfo , & ! Input
251  predictor%ODZeeman ) ! Output
252  END IF
253  END IF
254 
255  END SUBROUTINE crtm_compute_predictors
256 
257 
258 !--------------------------------------------------------------------------------
259 !:sdoc+:
260 !
261 ! NAME:
262 ! CRTM_Compute_Predictors_TL
263 !
264 ! PURPOSE:
265 ! Subroutine to calculate the gas absorption model tangent-linear
266 ! predictors. It is a wrapper which calls the algorithm specific routine.
267 !
268 ! CALLING SEQUENCE:
269 ! CALL CRTM_Compute_Predictors_TL( &
270 ! SensorIndex , & ! Input
271 ! Atmosphere , & ! FWD Input
272 ! Predictor , & ! FWD Input
273 ! Atmosphere_TL , & ! TL Input
274 ! AncillaryInput, & ! Input
275 ! Predictor_TL , & ! TL Output
276 ! iVar ) ! Internal variable input
277 !
278 ! INPUTS:
279 ! SensorIndex:
280 ! Sensor index id. This is a unique index associated
281 ! with a (supported) sensor used to access the
282 ! shared coefficient data for a particular sensor.
283 ! See the ChannelIndex argument.
284 ! UNITS: N/A
285 ! TYPE: INTEGER
286 ! DIMENSION: Scalar
287 ! ATTRIBUTES: INTENT(IN)
288 !
289 ! Atmosphere:
290 ! Structure containing the atmospheric state data.
291 ! UNITS: N/A
292 ! TYPE: CRTM_Atmosphere_type
293 ! DIMENSION: Scalar
294 ! ATTRIBUTES: INTENT(IN)
295 !
296 ! Predictor:
297 ! Structure containing the integrated absorber and predictor profiles.
298 ! UNITS: N/A
299 ! TYPE: CRTM_Predictor_type
300 ! DIMENSION: Scalar
301 ! ATTRIBUTES: INTENT(IN)
302 !
303 ! Atmosphere_TL:
304 ! Structure containing the tangent-linear atmospheric state data.
305 ! UNITS: N/A
306 ! TYPE: CRTM_Atmosphere_type
307 ! DIMENSION: Scalar
308 ! ATTRIBUTES: INTENT(IN)
309 !
310 ! AncillaryInput:
311 ! Structure holding ancillary inputs
312 ! UNITS: N/A
313 ! TYPE: AncillaryInput_type
314 ! DIMENSION: Scalar
315 ! ATTRIBUTES: INTENT(IN)
316 !
317 ! iVar:
318 ! Structure containing internal variables required for
319 ! subsequent tangent-linear or adjoint model calls.
320 ! The contents of this structure are NOT accessible
321 ! outside of this module.
322 ! UNITS: N/A
323 ! TYPE: iVar_type
324 ! DIMENSION: Scalar
325 ! ATTRIBUTES: INTENT(IN)
326 !
327 !
328 ! OUTPUTS:
329 ! Predictor_TL:
330 ! Structure containing the tangent-linear integrated absorber and
331 ! predictor profiles.
332 ! UNITS: N/A
333 ! TYPE: CRTM_Predictor_type
334 ! DIMENSION: Scalar
335 ! ATTRIBUTES: INTENT(IN OUT)
336 !
337 !:sdoc-:
338 !--------------------------------------------------------------------------------
339 
340  SUBROUTINE crtm_compute_predictors_tl( &
341  SensorIndex , & ! Input
342  Atmosphere , & ! FWD Input
343  Predictor , & ! FWD Input
344  Atmosphere_TL , & ! TL Input
345  AncillaryInput, & ! Input
346  Predictor_TL , & ! TL Output
347  iVar ) ! Internal variable input
348  ! Arguments
349  INTEGER , INTENT(IN) :: sensorindex
350  TYPE(crtm_atmosphere_type) , INTENT(IN) :: atmosphere
351  TYPE(crtm_predictor_type) , INTENT(IN) :: predictor
352  TYPE(crtm_atmosphere_type) , INTENT(IN) :: atmosphere_tl
353  TYPE(crtm_ancillaryinput_type), INTENT(IN) :: ancillaryinput
354  TYPE(crtm_predictor_type) , INTENT(IN OUT) :: predictor_tl
355  TYPE(ivar_type) , INTENT(IN) :: ivar
356  ! Local variables
357  INTEGER :: idx, n
358 
359  ! Call required model
360  idx = tc%Sensor_LoIndex(sensorindex)
361  SELECT CASE( tc%Algorithm_ID(sensorindex) )
362 
363  ! Predictors for ODAS transmittance model
364  CASE( odas_algorithm )
366  atmosphere , & ! FWD Input
367  predictor%ODAS , & ! FWD Input
368  atmosphere_tl , & ! TL Input
369  tc%ODAS(idx)%Max_Order, & ! Input
370  tc%ODAS(idx)%Alpha , & ! Input
371  predictor_tl%ODAS , & ! TL Output
372  ivar%ODAS ) ! Internal variable input
373 
374  ! Predictors for ODPS transmittance model
375  CASE( odps_algorithm )
377  tc%ODPS(idx) , & ! Input
378  predictor%ODPS , & ! FWD Input
379  atmosphere_tl , & ! TL Input
380  predictor_tl%ODPS ) ! TL Output
381 
382  ! Predictors for SSU instrument specific model
383  CASE( odssu_algorithm )
384 
385  ! ...Select particular transmittance algorithm for this instrument
386  SELECT CASE( tc%ODSSU(idx)%subAlgorithm )
387  CASE( odas_algorithm )
388  ! ...Assumes the same alphas for all TCs
389  n = tc%ODSSU(idx)%n_Absorbers
391  atmosphere , & ! FWD Input
392  predictor%ODAS , & ! FWD Input
393  atmosphere_tl , & ! TL Input
394  spread(odas_max_n_orders,dim=1,ncopies=n), & ! Input
395  tc%ODSSU(idx)%ODAS(1)%Alpha , & ! Input,
396  predictor_tl%ODAS , & ! TL Output
397  ivar%ODAS ) ! Internal variable input
398  CASE( odps_algorithm )
400  tc%ODSSU(idx)%ODPS(1), & ! Input
401  predictor%ODPS , & ! FWD Input
402  atmosphere_tl , & ! TL Input
403  predictor_tl%ODPS ) ! TL Output
404  END SELECT
405  END SELECT
406 
407  ! Is this a Zeeman channel?
408  idx = tc%ZSensor_LoIndex(sensorindex)
409  IF( idx > 0 )THEN
410  IF( is_odzeeman(tc%ODZeeman(idx)) )THEN
412  ancillaryinput%Zeeman, & ! Input
413  tc%ODZeeman(idx) , & ! Input
414  predictor%ODZeeman , & ! FWD Input
415  atmosphere_tl , & ! TL Input
416  predictor_tl%ODZeeman ) ! TL Output
417  END IF
418  END IF
419 
420  END SUBROUTINE crtm_compute_predictors_tl
421 
422 
423 !--------------------------------------------------------------------------------
424 !
425 ! NAME:
426 ! CRTM_Compute_Predictors_AD
427 !
428 ! PURPOSE:
429 ! Subroutine to calculate the adjoint gas absorption model predictors.
430 ! It is a wrapper which calls the algorithm specific routine.
431 !
432 ! CALLING SEQUENCE:
433 ! CALL CRTM_Compute_Predictors_AD ( &
434 ! SensorIndex , & ! Input
435 ! Atmosphere , & ! FWD Input
436 ! Predictor , & ! FWD Input
437 ! Predictor_AD , & ! AD Input
438 ! AncillaryInput, & ! Input
439 ! Atmosphere_AD , & ! AD Output
440 ! iVar ) ! Internal variable input
441 !
442 ! INPUTS:
443 ! SensorIndex:
444 ! Sensor index id. This is a unique index associated
445 ! with a (supported) sensor used to access the
446 ! shared coefficient data for a particular sensor.
447 ! See the ChannelIndex argument.
448 ! UNITS: N/A
449 ! TYPE: INTEGER
450 ! DIMENSION: Scalar
451 ! ATTRIBUTES: INTENT(IN)
452 !
453 ! Atmosphere:
454 ! Structure containing the atmospheric state data.
455 ! UNITS: N/A
456 ! TYPE: CRTM_Atmosphere_type
457 ! DIMENSION: Scalar
458 ! ATTRIBUTES: INTENT(IN)
459 !
460 ! Predictor:
461 ! Structure containing the integrated absorber and predictor profiles.
462 ! UNITS: N/A
463 ! TYPE: CRTM_Predictor_type
464 ! DIMENSION: Scalar
465 ! ATTRIBUTES: INTENT(IN)
466 !
467 ! Predictor_AD:
468 ! Structure containing the adjoint integrated absorber and
469 ! predictor profiles.
470 ! UNITS: N/A
471 ! TYPE: CRTM_Predictor_type
472 ! DIMENSION: Scalar
473 ! ATTRIBUTES: INTENT(IN OUT)
474 !
475 ! AncillaryInput:
476 ! Structure holding ancillary inputs
477 ! UNITS: N/A
478 ! TYPE: AncillaryInput_type
479 ! DIMENSION: Scalar
480 ! ATTRIBUTES: INTENT(IN)
481 !
482 ! iVar:
483 ! Structure containing internal variables required for
484 ! subsequent tangent-linear or adjoint model calls.
485 ! The contents of this structure are NOT accessible
486 ! outside of this module.
487 ! UNITS: N/A
488 ! TYPE: iVar_type
489 ! DIMENSION: Scalar
490 ! ATTRIBUTES: INTENT(IN)
491 !
492 ! OUTPUTS:
493 ! Atmosphere_AD:
494 ! Structure containing the adjoint atmospheric state data.
495 ! UNITS: N/A
496 ! TYPE: CRTM_Atmosphere_type
497 ! DIMENSION: Scalar
498 ! ATTRIBUTES: INTENT(IN OUT)
499 !
500 ! SIDE EFFECTS:
501 ! Components of the Predictor_AD structure argument are modified
502 ! in this function.
503 !
504 !:sdoc-:
505 !--------------------------------------------------------------------------------
506 
507  SUBROUTINE crtm_compute_predictors_ad( &
508  SensorIndex , & ! Input
509  Atmosphere , & ! FWD Input
510  Predictor , & ! FWD Input
511  Predictor_AD , & ! AD Input
512  AncillaryInput, & ! Input
513  Atmosphere_AD , & ! AD Output
514  iVar ) ! Internal variable input
515  ! Arguments
516  INTEGER , INTENT(IN) :: sensorindex
517  TYPE(crtm_atmosphere_type) , INTENT(IN) :: atmosphere
518  TYPE(crtm_predictor_type) , INTENT(IN) :: predictor
519  TYPE(crtm_predictor_type) , INTENT(IN OUT) :: predictor_ad
520  TYPE(crtm_ancillaryinput_type), INTENT(IN) :: ancillaryinput
521  TYPE(crtm_atmosphere_type) , INTENT(IN OUT) :: atmosphere_ad
522  TYPE(ivar_type) , INTENT(IN) :: ivar
523  ! Local variables
524  INTEGER :: idx, n
525 
526  ! Is this a Zeeman channel?
527  idx = tc%ZSensor_LoIndex(sensorindex)
528  IF( idx > 0 )THEN
529  IF( is_odzeeman(tc%ODZeeman(idx)) )THEN
531  ancillaryinput%Zeeman, & ! Input
532  tc%ODZeeman(idx) , & ! Input
533  predictor%ODZeeman , & ! FWD Input
534  predictor_ad%ODZeeman, & ! AD Intput
535  atmosphere_ad ) ! AD Output
536  END IF
537  END IF
538 
539  ! Call required model
540  idx = tc%Sensor_LoIndex(sensorindex)
541  SELECT CASE( tc%Algorithm_ID(sensorindex) )
542 
543  ! Predictors for ODAS transmittance model
544  CASE( odas_algorithm )
546  atmosphere , & ! FWD Input
547  predictor%ODAS , & ! FWD Input
548  predictor_ad%ODAS , & ! AD Intput
549  tc%ODAS(idx)%Max_Order, & ! Input
550  tc%ODAS(idx)%Alpha , & ! Input
551  atmosphere_ad , & ! AD Output
552  ivar%ODAS ) ! Internal variable input
553 
554  ! Predictors for ODPS transmittance model
555  CASE( odps_algorithm )
557  tc%ODPS(idx) , & ! Input
558  predictor%ODPS , & ! FWD Input
559  predictor_ad%ODPS, & ! AD Intput
560  atmosphere_ad ) ! AD Output
561 
562  ! Predictors for SSU instrument specific model
563  CASE( odssu_algorithm )
564 
565  ! ...Select particular transmittance algorithm for this instrument
566  SELECT CASE( tc%ODSSU(idx)%subAlgorithm )
567  CASE( odas_algorithm )
568  ! ...Assumes the same alphas for all TCs
569  n = tc%ODSSU(idx)%n_Absorbers
571  atmosphere , & ! FWD Input
572  predictor%ODAS , & ! FWD Input
573  predictor_ad%ODAS , & ! AD Intput
574  spread(odas_max_n_orders,dim=1,ncopies=n), & ! Input
575  tc%ODSSU(idx)%ODAS(1)%Alpha , & ! Input,
576  atmosphere_ad , & ! AD Output
577  ivar%ODAS ) ! Internal variable input
578  CASE( odps_algorithm )
580  tc%ODSSU(idx)%ODPS(1), & ! Input
581  predictor%ODPS , & ! FWD Input
582  predictor_ad%ODPS , & ! AD Intput
583  atmosphere_ad ) ! AD Output
584  END SELECT
585  END SELECT
586 
587  END SUBROUTINE crtm_compute_predictors_ad
588 
589 END MODULE crtm_predictor
integer, parameter, public failure
subroutine, public zeeman_compute_predictors(Zeeman, TC, Atm, GeoInfo, Predictor)
pure integer function, public odps_get_n_components(Group_Index)
real(fp), parameter, public zero
subroutine, public zeeman_compute_predictors_ad(Zeeman, TC, Predictor, Predictor_AD, Atm_AD)
elemental subroutine, public odas_predictor_create(self, n_Layers, n_Predictors, n_Absorbers, n_Orders)
integer, parameter, public fp
Definition: Type_Kinds.f90:124
pure integer function, public odps_get_n_absorbers(Group_Index)
integer, parameter, public max_n_absorbers
subroutine, public odps_assemble_predictors_ad(TC, Predictor, Predictor_AD, Atm_AD)
subroutine, public odps_assemble_predictors_tl(TC, Predictor, Atm_TL, Predictor_TL)
pure logical function, public is_odzeeman(TC)
integer, parameter, public max_n_predictors
elemental subroutine, public odps_predictor_destroy(self)
integer, parameter, public max_n_orders
integer, parameter ml
recursive subroutine, public display_message(Routine_Name, Message, Error_State, Message_Log)
elemental subroutine, public odas_predictor_destroy(self)
logical, parameter, public allow_optran
integer, parameter, public odssu_algorithm
elemental subroutine, public odps_predictor_create(self, n_Layers, n_User_Layers, n_Components, n_Predictors, No_OPTRAN)
subroutine, public crtm_compute_predictors(SensorIndex, Atmosphere, GeometryInfo, AncillaryInput, Predictor, iVar)
pure integer function, public odps_get_max_n_predictors(Group_Index)
integer, parameter, public odps_algorithm
integer, parameter, public odas_algorithm
subroutine, public odas_assemble_predictors(Atmosphere, GeometryInfo, Max_Order, Alpha, Predictor, iVar)
character(*), parameter module_version_id
elemental logical function, public odps_predictor_associated(self)
elemental logical function, public odas_predictor_associated(self)
subroutine, public crtm_compute_predictors_ad(SensorIndex, Atmosphere, Predictor, Predictor_AD, AncillaryInput, Atmosphere_AD, iVar)
subroutine, public odps_assemble_predictors(TC, Atm, GeoInfo, Predictor)
subroutine, public crtm_compute_predictors_tl(SensorIndex, Atmosphere, Predictor, Atmosphere_TL, AncillaryInput, Predictor_TL, iVar)
pure logical function, public odps_get_savefwvflag()
subroutine, public zeeman_compute_predictors_tl(Zeeman, TC, Predictor, Atm_TL, Predictor_TL)
type(taucoeff_type), save, public tc
integer, parameter, public success
elemental subroutine, public crtm_geometryinfo_getvalue(gInfo, Geometry, iFOV, Longitude, Latitude, Surface_Altitude, Sensor_Scan_Angle, Sensor_Zenith_Angle, Sensor_Azimuth_Angle, Source_Zenith_Angle, Source_Azimuth_Angle, Flux_Zenith_Angle, Year, Month, Day, Distance_Ratio, Sensor_Scan_Radian, Sensor_Zenith_Radian, Sensor_Azimuth_Radian, Secant_Sensor_Zenith, Cosine_Sensor_Zenith, Source_Zenith_Radian, Source_Azimuth_Radian, Secant_Source_Zenith, Flux_Zenith_Radian, Secant_Flux_Zenith, Trans_Zenith_Radian, Secant_Trans_Zenith, AU_ratio2)
subroutine, public odas_assemble_predictors_tl(Atmosphere, Predictor, Atmosphere_TL, Max_Order, Alpha, Predictor_TL, iVar)
subroutine, public odas_assemble_predictors_ad(Atmosphere, Predictor, Predictor_AD, Max_Order, Alpha, Atmosphere_AD, iVar)