8 real :: new_water_radii(25), new_ice_radii(25)
50 delta_transmittance_w1, &
51 delta_transmittance_w2, &
52 transmittance_stddev_w1, &
53 transmittance_stddev_w2, &
57 uTau,uRe,uWaterPath, xpoint, ypoint)
120 integer,
intent(in) :: xpoint, ypoint
121 real,
intent(in) :: thickness,
re, water_path, &
123 transmittance_w1,transmittance_w2, &
124 delta_transmittance_w1,delta_transmittance_w2, &
125 transmittance_stddev_w1, transmittance_stddev_w2, meas_error(2), &
126 emission_pw(:), emission_tc(:), sigma_r37_pw(:)
129 integer,
intent(in) :: r1r2wavelengthidx(2)
130 character(10),
intent(in) ::
phase
131 real,
intent(out) :: utau, ure,uwaterpath
133 real :: meancloudtopreflw1, meancloudtopreflw2
134 real :: partialderivtauwrtr1atconstr2, partialderivtauwrtr2atconstr1
135 real :: partialderivrewrtr2atconstr1 , partialderivrewrtr1atconstr2
136 real :: meandeltar1trans, meandeltar2trans
137 real :: deltarcloudtopmean(2), density, sdev_refl(2)
139 real :: correlation_trans, correlation_wp
140 real :: emis_pw_val, emis_tc_val, sigma_r37_val
143 real,
dimension(2,2) :: s, s_transpose, retrieval_covariance, dummy, &
144 refl_cov_total, refl_cov_sfc_albedo, &
145 refl_cov_trans, refl_cov_trans_pw, refl_cov_trans_table, &
146 refl_cov_calibration, refl_cov_cm_sdev, refl_cov_ws, &
147 refl_cov_emission_pw, refl_cov_emission_tc, refl_cov_trans_o3
149 integer :: band37_index
176 deltarcloudtopmean, meancloudtopreflw1, meancloudtopreflw2)
182 deltarcloudtopmean, meancloudtopreflw1, meancloudtopreflw2)
196 partialderivtauwrtr1atconstr2, &
197 partialderivtauwrtr2atconstr1, &
198 partialderivrewrtr1atconstr2, &
199 partialderivrewrtr2atconstr1 )
202 s(1,1) = partialderivtauwrtr1atconstr2
203 s(1,2) = partialderivtauwrtr2atconstr1
204 s(2,1) = partialderivrewrtr1atconstr2
205 s(2,2) = partialderivrewrtr2atconstr1
216 refl_cov_cm_sdev(1,1) = sdev_refl(1)**2
218 refl_cov_cm_sdev(2,2) = 0.0
220 refl_cov_cm_sdev(2,2) = sdev_refl(2)**2
222 refl_cov_cm_sdev(1,2) = 0.
223 refl_cov_cm_sdev(2,1) = refl_cov_cm_sdev(1,2)
227 refl_cov_ws(1,1) = deltarcloudtopmean(1)**2
229 refl_cov_ws(2,2) = 0.0
232 refl_cov_ws(2,2) = deltarcloudtopmean(2)**2
234 refl_cov_ws(1,2) = 0.
235 refl_cov_ws(2,1) = refl_cov_ws(1,2)
238 refl_cov_sfc_albedo = refl_cov_ws + refl_cov_cm_sdev
241 refl_cov_sfc_albedo(1,1) = deltarcloudtopmean(1)**2
243 refl_cov_sfc_albedo(2,2) = 0.0
245 refl_cov_sfc_albedo(2,2) = deltarcloudtopmean(2)**2
247 refl_cov_sfc_albedo(1,2) = 0.
248 refl_cov_sfc_albedo(2,1) = refl_cov_sfc_albedo(1,2)
250 refl_cov_sfc_albedo = refl_cov_sfc_albedo + refl_cov_cm_sdev
258 meandeltar1trans = meancloudtopreflw1 *
abs(delta_transmittance_w1)/transmittance_w1
260 meandeltar2trans = 0.0
262 meandeltar2trans = meancloudtopreflw2 *
abs(delta_transmittance_w2)/transmittance_w2
265 correlation_trans = 1.0
266 refl_cov_trans_pw(1,1) = meandeltar1trans**2
267 refl_cov_trans_pw(2,2) = meandeltar2trans**2
270 if (r1r2wavelengthidx(2) == band37_index)
then
275 refl_cov_trans_pw(1,2) =
abs(meandeltar1trans * sqrt(sigma_r37_val + &
276 refl_cov_trans_pw(2,2) ))*correlation_trans
277 refl_cov_trans_pw(2,1) = refl_cov_trans_pw(1,2)
279 refl_cov_trans_pw(2,2) = refl_cov_trans_pw(2,2) + sigma_r37_val
281 refl_cov_trans_pw(1,2) =
abs(meandeltar1trans*meandeltar2trans)* &
283 refl_cov_trans_pw(2,1) = refl_cov_trans_pw(1,2)
292 meandeltar1trans = meancloudtopreflw1 * transmittance_stddev_w1/transmittance_w1
294 meandeltar2trans = 0.0
296 meandeltar2trans = meancloudtopreflw2 * transmittance_stddev_w2/transmittance_w2
299 refl_cov_trans_table(1,1) = meandeltar1trans**2
301 refl_cov_trans_table(2,2) = 0.0
303 refl_cov_trans_table(2,2) = meandeltar2trans**2
305 refl_cov_trans_table(1,2) = 0.
306 refl_cov_trans_table(2,1) = refl_cov_trans_table(1,2)
310 refl_cov_trans_o3 = 0.
319 refl_cov_trans = refl_cov_trans_pw + refl_cov_trans_table + refl_cov_trans_o3
323 refl_cov_calibration(1,1) = (meas_error(1) * meancloudtopreflw1)**2
325 refl_cov_calibration(2,2) = 0.0
327 refl_cov_calibration(2,2) = (meas_error(2) * meancloudtopreflw2)**2
332 if (r1r2wavelengthidx(2) == band37_index)
then
333 refl_cov_calibration(2,2) = refl_cov_calibration(2,2) + &
338 refl_cov_calibration(1,2) = 0.
339 refl_cov_calibration(2,1) = refl_cov_calibration(1,2)
343 refl_cov_total = refl_cov_sfc_albedo + refl_cov_trans + refl_cov_calibration
349 dummy = matmul(refl_cov_total, s_transpose)
350 retrieval_covariance = matmul(s, dummy)
357 retrieval_covariance(1,1) = retrieval_covariance(1,1) + &
358 (optical_thickness_37_final(xpoint,ypoint))**2
359 retrieval_covariance(2,2) = 64.0
361 retrieval_covariance(1,1) = retrieval_covariance(1,1) + &
362 (optical_thickness_1621_final(xpoint,ypoint))**2
363 retrieval_covariance(2,2) = 289.0
372 utau = sqrt( retrieval_covariance(1,1) )
373 ure = sqrt( retrieval_covariance(2,2) )
381 if ((100.*utau/thickness) >= 200. .OR. (100.*ure/
re) >= 200. )
then
387 if (
phase ==
'water')
then
393 uwaterpath = (
re**2)*(utau**2) + (thickness**2)*(ure**2) + (utau**2)*(ure**2) + &
394 2*retrieval_covariance(1,2)*utau*ure + retrieval_covariance(1,2)**2
395 if (uwaterpath < 0.)
then
398 uwaterpath= sqrt( density**2 * uwaterpath )
407 utau = 100.*utau/thickness
409 uwaterpath = 100.*uwaterpath/water_path
418 if (utau > 200. ) utau = 200.
419 if (ure > 200. ) ure = 200.
420 if (uwaterpath > 200.) uwaterpath = 200.
433 character*(*),
intent(in) :: phase
434 real,
intent(in) :: sigma37(:), re
435 real,
intent(inout) :: sigma37_val
437 integer :: i, n, ilow, ihigh
445 if (phase ==
'water')
then
448 (/ sigma37(ilow), sigma37(ihigh) /), re)
452 (/ sigma37(ilow), sigma37(ihigh) /), re)
465 reflectancediff, meancloudtopreflw1, meancloudtopreflw2)
476 real,
intent(in) :: radius
477 integer,
intent(in) :: wave_index(2)
478 real,
intent(in) :: optical_thickness
479 character(10),
intent(in) :: phase
480 real,
intent(out) :: reflectancediff(2), meancloudtopreflw1, meancloudtopreflw2
482 integer :: radii_size , radius_upperbound, radius_lowerbound, radius_index, i,j, vectorsize
483 real :: reflectance_lower(2), reflectance_middle(2), reflectance_upper(2)
484 real,
dimension(:),
allocatable :: opticalthick_vector
486 real,
dimension(:,:,:),
allocatable :: temp_refl
491 integer :: TOTAL_POINTS
493 integer :: start_time, end_time, cmax, crate
500 allocate(opticalthick_vector(total_points))
503 reflectance_upper = 0.
504 reflectance_lower = 0.
505 reflectance_middle = 0.
508 if (phase ==
'water')
then
520 opticalthick_vector(1) = 0.
521 opticalthick_vector(2:total_points) =
library_taus(1:(total_points-1))
524 if (phase ==
'water')
then
528 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
531 reflectance_middle(j))
545 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
547 temp_refl(:,wave_index(j),i), &
548 reflectance_upper(j))
557 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
559 temp_refl(:,wave_index(j),i), &
560 reflectance_lower(j))
564 deallocate(temp_refl)
568 reflectancediff(j) = (
abs(reflectance_lower(j) - reflectance_middle(j)) + &
569 abs(reflectance_upper(j) - reflectance_middle(j)))/2.
571 meancloudtopreflw1 = reflectance_middle(j)
573 meancloudtopreflw2 = reflectance_middle(j)
582 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
585 reflectance_middle(j))
597 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
599 temp_refl(:,wave_index(j),i), &
600 reflectance_upper(j))
609 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
611 temp_refl(:,wave_index(j),i), &
612 reflectance_lower(j))
616 deallocate(temp_refl)
620 reflectancediff(j) = (
abs(reflectance_lower(j) - reflectance_middle(j)) + &
621 abs(reflectance_upper(j) - reflectance_middle(j)))/2.
623 meancloudtopreflw1 = reflectance_middle(j)
625 meancloudtopreflw2 = reflectance_middle(j)
635 deallocate(opticalthick_vector)
651 real,
intent(in) :: radius
652 integer,
intent(in) :: wave_index(2)
653 real,
intent(in) :: optical_thickness
654 character(10),
intent(in) :: phase
655 real,
intent(out) :: sdev_refl(2)
657 integer :: radii_size , radius_upperbound, radius_lowerbound, radius_index, i,j, vectorsize
658 real,
dimension(:),
allocatable :: opticalthick_vector
664 integer :: TOTAL_POINTS
668 allocate(opticalthick_vector(total_points))
672 if (phase ==
'water')
then
684 opticalthick_vector(1) = 0.
685 opticalthick_vector(2:total_points) =
library_taus(1:(total_points-1))
688 if (phase ==
'water')
then
691 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
700 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
709 deallocate(opticalthick_vector)
721 reflectancediff, meancloudtopreflw1, meancloudtopreflw2)
729 real,
intent(in) :: radius
730 integer,
intent(in) :: wave_index(2)
731 real,
intent(in) :: optical_thickness, surface_albedo(2)
732 character(10),
intent(in) :: phase
733 real,
intent(out) :: reflectancediff(2), meancloudtopreflw1, meancloudtopreflw2
735 integer :: radii_size , radius_upperbound, radius_lowerbound, radius_index, i,j, vectorsize
736 real :: reflectance_lower, reflectance_middle, reflectance_upper
737 real,
dimension(:),
allocatable :: opticalthick_vector
740 integer :: TOTAL_POINTS
745 allocate(opticalthick_vector(total_points))
748 reflectance_upper = 0.
749 reflectance_lower = 0.
750 reflectance_middle = 0.
753 if (phase ==
'water')
then
766 opticalthick_vector(1) = 0.
767 opticalthick_vector(2:total_points) =
library_taus(1:(total_points-1))
769 if (phase ==
'water')
then
781 reflectance_middle, &
785 reflectancediff(j) = (
abs(reflectance_lower - reflectance_middle) + &
786 abs(reflectance_upper - reflectance_middle))/2.
788 meancloudtopreflw1 = reflectance_middle
790 meancloudtopreflw2 = reflectance_middle
804 reflectance_middle, &
807 reflectancediff(j) = (
abs(reflectance_lower - reflectance_middle) + &
808 abs(reflectance_upper - reflectance_middle))/2.
810 meancloudtopreflw1 = reflectance_middle
812 meancloudtopreflw2 = reflectance_middle
818 deallocate(opticalthick_vector)
825 integer,
intent(in):: numberradii
826 real,
intent(in) :: radiidata(numberradii), radius
827 integer,
intent(out):: index
830 index1 = minloc(
abs(radiidata-radius))
837 subroutine nonasymptotic_calcu_cox_munk(tau_vector,tc, rf, rf_calculated)
844 real,
intent(in) :: tau_vector(:),tc
845 real,
intent(in) :: rf(:)
846 real,
intent(out) :: rf_calculated
849 integer :: lowbound, highbound, taubounds(2)
850 real :: iftau(2), refvals(2)
856 taubounds(1) = lowbound
857 taubounds(2) = highbound
858 iftau(1) = tau_vector(taubounds(1))
859 iftau(2) = tau_vector(taubounds(2))
861 refvals(1) = rf(lowbound)
862 refvals(2) = rf(highbound)
866 end subroutine nonasymptotic_calcu_cox_munk
872 albedo,rf_calculated)
880 real,
intent(in) :: tau_vector(:),tc,albedo
881 real,
intent(in) :: rf(:), ft0(:), ft1(:), sfr(:)
882 real,
intent(out) :: rf_calculated
884 real,
dimension(:),
allocatable :: reflectance_vector
886 integer :: lowbound, highbound, taubounds(2)
887 real :: iftau(2), refvals(2)
889 integer :: TOTAL_POINTS
894 total_points =
size(tau_vector)
896 allocate(reflectance_vector(total_points))
898 reflectance_vector(1) = albedo
900 reflectance_vector(2:total_points) = rf(1:(total_points-1)) + &
901 ft1(1:(total_points-1)) * ft0(1:(total_points-1)) * albedo /( 1. - albedo*sfr(1:(total_points-1)))
905 taubounds(1) = lowbound
906 taubounds(2) = highbound
907 iftau(1) = tau_vector(taubounds(1))
908 iftau(2) = tau_vector(taubounds(2))
910 refvals(1) = reflectance_vector(lowbound)
911 refvals(2) = reflectance_vector(highbound)
915 deallocate(reflectance_vector)
921 albedo,rf_lower, rf_middle, rf_upper)
926 real,
intent(in) :: tau_vector(:),tc,albedo
927 real,
intent(in) :: rf(:), ft0(:), ft1(:), sfr(:)
928 real,
intent(out) :: rf_middle, rf_lower, rf_upper
941 if(albedoupper .gt. 0.99) albedoupper = 0.99
944 albedoupper,rf_upper)
952 phase, surface_albedo, &
953 partialDerivTauWrtR1AtConstR2,&
954 partialDerivTauWrtR2AtConstR1,&
955 partialDerivReWrtR1AtConstR2, &
956 partialDerivReWrtR2AtConstR1)
1003 integer,
intent(in) :: R1R2wavelengthIdx(2)
1004 real,
intent(in) :: re, tau
1005 real,
intent(in) :: surface_albedo(2)
1006 character(10),
intent(in):: phase
1007 real,
intent(out) :: partialDerivTauWrtR1AtConstR2, &
1008 partialDerivTauWrtR2AtConstR1, &
1009 partialDerivReWrtR1AtConstR2, &
1010 partialDerivReWrtR2AtConstR1
1012 real :: partialDerivR1wrtTauAtConstRe, &
1013 partialDerivR2wrtTauAtConstRe, &
1014 partialDerivR1wrtReAtConstTau, &
1015 partialDerivR2wrtReAtConstTau
1020 real :: partialDerivativesTau, partialDerivativesRe
1021 real :: upperLimit, lowerLimit,abscissaintervalstartingpoint
1022 real :: halfAbscissaInterval
1023 real,
parameter :: halfAbscissaIntervalTau = 1., halfabscissaintervalre = 1.
1024 real,
parameter :: tauUpperLimit = 200.
1025 real,
parameter :: tauLowerLimit = 0.
1027 integer,
parameter :: tauParamPosition = 4
1028 integer,
parameter :: reParamPosition = 5
1029 real :: small_number
1034 halfabscissainterval = halfabscissaintervaltau
1035 abscissaintervalstartingpoint = tau
1036 wrtparam = tauparamposition
1041 upperlimit=tauupperlimit
1042 lowerlimit=taulowerlimit
1046 upperlimit, lowerlimit, &
1047 halfabscissainterval, &
1048 abscissaintervalstartingpoint, &
1050 surface_albedo(i), &
1052 r1r2wavelengthidx(i), &
1053 partialderivativestau)
1055 small_number = epsilon(partialderivativestau)
1057 if(
abs(partialderivativestau) .lt. small_number) partialderivativestau = &
1060 partialderivtauwrtr1atconstr2 = 1. / partialderivativestau
1061 partialderivtauwrtr2atconstr1 = 0.0
1062 partialderivrewrtr1atconstr2 = 0.0
1063 partialderivrewrtr2atconstr1 = 0.0
1070 upperlimit=tauupperlimit
1071 lowerlimit=taulowerlimit
1075 upperlimit, lowerlimit, &
1076 halfabscissainterval, &
1077 abscissaintervalstartingpoint, &
1079 surface_albedo(i), &
1081 r1r2wavelengthidx(i), &
1082 partialderivativestau)
1085 partialderivr1wrttauatconstre = partialderivativestau
1088 partialderivr2wrttauatconstre = partialderivativestau
1093 halfabscissainterval = halfabscissaintervalre
1094 abscissaintervalstartingpoint = re
1099 if(phase ==
'water')
then
1108 wrtparam = reparamposition
1112 upperlimit, lowerlimit, &
1113 halfabscissainterval, &
1114 abscissaintervalstartingpoint, &
1116 surface_albedo(i), &
1118 r1r2wavelengthidx(i), &
1119 partialderivativesre)
1123 partialderivr1wrtreatconsttau = partialderivativesre
1126 partialderivr2wrtreatconsttau = partialderivativesre
1133 small_number = epsilon(partialderivr1wrttauatconstre)
1135 if(
abs(partialderivr1wrttauatconstre) .lt. small_number) partialderivr1wrttauatconstre = &
1137 if(
abs(partialderivr2wrttauatconstre) .lt. small_number) partialderivr2wrttauatconstre = &
1139 if(
abs(partialderivr1wrtreatconsttau) .lt. small_number) partialderivr1wrtreatconsttau = &
1141 if(
abs(partialderivr2wrtreatconsttau) .lt. small_number) partialderivr2wrtreatconsttau = &
1145 partialderivtauwrtr1atconstr2 = 1. / &
1146 (partialderivr1wrttauatconstre - &
1147 partialderivr1wrtreatconsttau * &
1148 (partialderivr2wrttauatconstre/partialderivr2wrtreatconsttau) )
1150 partialderivtauwrtr2atconstr1 = 1. / &
1151 (partialderivr2wrttauatconstre - &
1152 partialderivr2wrtreatconsttau * &
1153 (partialderivr1wrttauatconstre/partialderivr1wrtreatconsttau) )
1155 partialderivrewrtr1atconstr2 = 1. / &
1156 (partialderivr1wrtreatconsttau - &
1157 partialderivr1wrttauatconstre * &
1158 (partialderivr2wrtreatconsttau/partialderivr2wrttauatconstre) )
1160 partialderivrewrtr2atconstr1 = 1. / &
1161 (partialderivr2wrtreatconsttau - &
1162 partialderivr2wrttauatconstre * &
1163 (partialderivr1wrtreatconsttau/partialderivr1wrttauatconstre) )
1168 print*,
'partialDerivTauWrtR1AtConstR2 = ', partialderivtauwrtr1atconstr2
1169 print*,
'partialDerivTauWrtR2AtConstR1 = ', partialderivtauwrtr2atconstr1
1170 print*,
'partialDerivReWrtR1AtConstR2 = ', partialderivrewrtr1atconstr2
1171 print*,
'partialDerivReWrtR2AtConstR1 = ', partialderivrewrtr2atconstr1
1176 halfAbscissaInterval, abscissaIntervalStartingPoint, &
1179 wrtParam, wavelengthIdx, &
1227 integer,
intent(in) :: wrtParam, wavelengthIdx
1228 real,
intent(in) :: re, tau
1229 real,
intent(in) :: surface_albedo
1230 real,
intent(in) :: upperLimit, lowerLimit
1231 character(10),
intent(in) :: phase
1232 real,
intent(out) :: partialDerivative
1235 real :: tmpTau, tmpRe
1237 real :: halfAbscissaInterval, abscissaIntervalStartingPoint
1238 real :: abscissaIntervalLower, abscissaIntervalUpper
1239 integer,
parameter :: tauParamPosition = 4
1240 integer,
parameter :: reParamPosition = 5
1244 halfabscissainterval, abscissaintervalstartingpoint, &
1245 abscissaintervallower, abscissaintervalupper)
1254 select case (wrtparam)
1255 case(tauparamposition)
1259 abscissaintervalupper, &
1260 abscissaintervallower, &
1263 wavelengthidx, rb, ra)
1264 partialderivative = (rb - ra)
1265 partialderivative = partialderivative / (abscissaintervalupper - abscissaintervallower)
1267 case(reparamposition)
1272 abscissaintervalupper, &
1273 abscissaintervallower, &
1276 wavelengthidx, partialderivative)
1289 halfAbscissaInterval, abscissaIntervalStartingPoint, &
1290 abscissaIntervalLower, abscissaIntervalUpper)
1338 real,
intent(in) :: upperLimit, lowerLimit, &
1339 halfAbscissaInterval, abscissaIntervalStartingPoint
1340 real,
intent(out) :: abscissaIntervalLower, abscissaIntervalUpper
1344 if((abscissaintervalstartingpoint+halfabscissainterval) > upperlimit)
then
1345 abscissaintervalupper = abscissaintervalstartingpoint
1347 abscissaintervalupper = (abscissaintervalstartingpoint+halfabscissainterval)
1350 if((abscissaintervalstartingpoint-halfabscissainterval) < lowerlimit)
then
1351 abscissaintervallower = abscissaintervalstartingpoint
1353 abscissaintervallower = (abscissaintervalstartingpoint-halfabscissainterval)
1358 optical_thickness_upper, &
1359 optical_thickness_lower, &
1364 reflectance_upper, &
1374 real,
intent(in) :: optical_thickness_upper, optical_thickness_lower
1375 integer,
intent(in) :: wave_index
1376 real,
intent(in) :: radius, surface_albedo
1377 character(10),
intent(in) :: phase
1378 real,
intent(out) :: reflectance_upper, reflectance_lower
1380 integer :: radii_size , radius_upperbound, radius_lowerbound, radius_index, i,j, points
1381 real,
dimension(:),
allocatable :: opticalthick_vector
1382 real :: reflectance_vector_upper(3), reflectance_vector_lower(3), yy2(3)
1384 integer :: TOTAL_POINTS
1389 allocate(opticalthick_vector(total_points))
1392 opticalthick_vector(1) = 0.
1393 opticalthick_vector(2:total_points) =
library_taus(1:(total_points-1))
1396 if (phase ==
'water')
then
1403 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
1404 optical_thickness_lower, &
1408 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
1409 optical_thickness_upper, &
1418 surface_albedo, reflectance_lower)
1422 surface_albedo, reflectance_upper)
1432 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
1433 optical_thickness_lower, &
1437 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
1438 optical_thickness_upper, &
1446 surface_albedo, reflectance_lower)
1450 surface_albedo, reflectance_upper)
1455 deallocate(opticalthick_vector)
1461 radius, optical_thickness, &
1474 real,
intent(inout) :: radius_upper, radius_lower
1475 integer,
intent(in) :: wave_index
1476 real,
intent(in) :: optical_thickness, radius, surface_albedo
1477 character(10),
intent(in) :: phase
1478 real,
intent(out) :: partial_derivative
1480 real :: reflectance_upper, reflectance_lower
1482 integer :: radii_size , radius_upperbound, radius_lowerbound, radius_index, i,j, vectorsize
1483 real,
dimension(:),
allocatable :: opticalthick_vector, opticalthick_vector2
1484 real,
dimension(20):: reflectance_vector
1486 integer :: dummy, il, jl, iu, ju, k
1487 real :: my_radius, myrefl(90), myres(90), myx(3), myy(3), half_rad(2)
1488 integer :: TOTAL_POINTS
1489 real :: mymid1, mymid2, reflectance_middle, delre
1490 real :: new_derivatives(25)
1491 integer :: istart, jstart
1496 allocate(opticalthick_vector(total_points), opticalthick_vector2(total_points))
1499 opticalthick_vector(1) = 0.
1500 opticalthick_vector(2:total_points) =
library_taus(1:(total_points-1))
1501 opticalthick_vector2 = opticalthick_vector
1502 if (phase ==
'water')
then
1518 new_derivatives = 0.
1528 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
1529 optical_thickness, &
1533 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
1534 optical_thickness, &
1538 new_derivatives(il+1) = (reflectance_upper - reflectance_lower) / &
1548 surface_albedo, reflectance_lower)
1553 surface_albedo, reflectance_upper)
1555 new_derivatives(il+1) = (reflectance_upper - reflectance_lower) / &
1562 new_derivatives(1) = new_derivatives(2)
1567 partial_derivative =
linearinterpolation( (/ new_water_radii(il), new_water_radii(iu) /), &
1568 (/ new_derivatives(il), new_derivatives(iu) /), &
1577 new_derivatives = 0.
1586 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
1587 optical_thickness, &
1591 call nonasymptotic_calcu_cox_munk(opticalthick_vector, &
1592 optical_thickness, &
1596 new_derivatives(il+1) = (reflectance_upper - reflectance_lower) / &
1606 surface_albedo, reflectance_lower)
1611 surface_albedo, reflectance_upper)
1613 new_derivatives(il+1) = (reflectance_upper - reflectance_lower) / &
1619 new_derivatives(1) = new_derivatives(2)
1626 (/ new_derivatives(il), new_derivatives(iu) /), &
1632 deallocate(opticalthick_vector, opticalthick_vector2)
1637 subroutine getradiibounds(radiisize, radiidata, radius, upperbound, lowerbound)
1641 integer,
intent(in) :: radiisize
1642 real,
intent(in) :: radiidata(:),
radius
1643 integer,
intent(out) :: upperbound, lowerbound
1649 do i = 1, radiisize - 1
1650 if (
radius >= radiidata(i).and.
radius <= radiidata(i+1))
then