24 REAL,
intent(in) :: residual(:)
25 INTEGER,
intent(out) :: crossing_num, crossing_vector(:)
33 length =
size(residual)
42 if ( residual(i) < 0 ) k(i) = -1
46 crossing_num=0; crossing_vector=0.
48 if(
abs(k(i+1)-k(i)) > 1) then
49 crossing_num = crossing_num + 1
50 crossing_vector(crossing_num) = i
74 REAL,
intent(in) :: residual(:)
75 INTEGER,
intent(out) :: local_min_num, local_min_vector(:)
80 length =
size(residual)
82 local_min_num=0; local_min_vector=0.
86 if( residual(i) < residual(i-1) .AND. residual(i) < residual(i+1) ) then
87 local_min_num = local_min_num + 1
88 local_min_vector(local_min_num) = i
111 REAL,
intent(in) :: residual(:)
112 INTEGER,
intent(out) :: local_max_num, local_max_vector(:)
117 length =
size(residual)
119 local_max_num=0; local_max_vector=0.
123 if( residual(i) > residual(i-1) .AND. residual(i) > residual(i+1) ) then
124 local_max_num = local_max_num + 1
125 local_max_vector(local_max_num) = i
133 subroutine solution_re (re, residual, crossing_vector, crossing_num, &
134 local_min_vector, local_min_num, local_max_vector, local_max_num, &
158 integer,
intent(in) :: crossing_vector(:), crossing_num, &
159 local_min_vector(:), local_min_num, local_max_vector(:), local_max_num
160 real,
intent(in) :: residual(:), re(:)
162 real,
intent(out) :: retrieval
163 integer*1,
intent(out) :: quality
165 integer :: residual_crossing_index, index1(1)
166 real :: fillval_r4, resid_lo, resid_hi, slope_1, slope_2
167 logical :: process_zero_crossing_residual
210 process_zero_crossing_residual = .false.
215 retrieval = fillval_r4; quality = -1
221 if (crossing_num < 0)
then
229 if (crossing_num > 2)
then
256 IF (crossing_num == 0)
THEN
257 if (process_zero_crossing_residual)
then
259 index1 = minloc(
abs(residual))
260 retrieval = re(index1(1))
272 IF (crossing_num == 1 .OR. crossing_num == 2)
THEN
281 If (crossing_num == 1)
Then
282 residual_crossing_index = crossing_vector(crossing_num)
285 slope_1 = residual(crossing_vector(1)+1) - residual(crossing_vector(1))
286 slope_2 = residual(crossing_vector(2)+1) - residual(crossing_vector(2))
294 if ( slope_1 <= 0. )
then
295 residual_crossing_index = crossing_vector(1)
297 if ( slope_2 <= 0. )
then
298 residual_crossing_index = crossing_vector(2)
307 if (residual_crossing_index > 0) &
309 fillval_r4, local_min_vector, local_min_num, local_max_vector, &
310 local_max_num, retrieval, quality)
317 residual_crossing_index, fillval_r4, &
318 local_min_vector, local_min_num, local_max_vector, local_max_num, &
342 real,
intent (in) :: re(:), residual(:), fillval_r4
343 integer,
intent (in) :: residual_crossing_index, &
344 local_min_vector(:), local_min_num, local_max_vector(:), local_max_num
346 real,
intent(inout) :: retrieval
347 integer*1,
intent(inout) :: quality
349 integer i, icount, iternum
350 real y2(size(re)), z, delta_resid, delta_resid_fraction, &
351 resid_min_allowable, resid_max_for_spline
352 real yl(2), xl(2), re_lower, re_upper, re_iter
354 character*15 numerical_type
365 resid_min_allowable = 0.0001
366 if (
abs(residual(residual_crossing_index)) < resid_min_allowable)
then
367 retrieval = re(residual_crossing_index)
371 if (
abs(residual(residual_crossing_index+1)) < resid_min_allowable)
then
372 retrieval = re(residual_crossing_index+1)
383 residual(residual_crossing_index+1)))
then
384 retrieval = re(residual_crossing_index)
393 numerical_type =
'spline'
429 IF (numerical_type /=
'linear')
THEN
430 if (residual_crossing_index ==
size(re)-1)
then
431 numerical_type =
'linear'
450 resid_max_for_spline = 100.
451 IF (numerical_type /=
'linear')
THEN
452 if ( maxval(
abs(residual)) > resid_max_for_spline)
then
453 numerical_type =
'linear'
462 IF (numerical_type ==
'linear')
THEN
463 yl(1) = residual(residual_crossing_index); yl(2) = &
464 residual(residual_crossing_index+1)
465 if (
sign(1.,yl(1))*
sign(1.,yl(2)) <= 0.)
then
467 re(residual_crossing_index:residual_crossing_index+1), retrieval)
471 IF (numerical_type ==
'spline')
THEN
472 call spline (
size(re), re, residual, y2)
474 iternum = 30; icount = 1; delta_resid_fraction=0.001
476 delta_resid =
abs( delta_resid_fraction * &
477 max(residual(residual_crossing_index), &
478 residual(residual_crossing_index+1)) )
479 if(delta_resid < resid_min_allowable) delta_resid = resid_min_allowable
480 re_lower = re(residual_crossing_index)
481 re_upper = re(residual_crossing_index+1)
482 re_iter = 0.5*(re_lower + re_upper)
489 DO WHILE (icount < iternum)
490 z=
splint(
size(re), re_iter, re, residual, y2)
492 if(
abs(z) < delta_resid)
then
497 if(
sign(1.,z)*
sign(1.,residual(residual_crossing_index)) > 0.)
then
502 re_iter = 0.5*(re_lower + re_upper)
508 if(icount < iternum-5)
then
523 real(
single),
intent(in) :: library_radii(:)
534 sfr, fti1, fti0, fluxup_solar, fluxup_sensor, &
535 theta, theta0, phi, location, crefl)
559 real,
intent(in) :: tau, re, Pc, sfr, fti1, fti0, theta, theta0, phi, &
561 integer,
dimension(2),
intent(in) :: location
562 integer,
intent(in) :: iw
563 real,
dimension(:,:,:,:),
intent(in) :: fluxup_solar, fluxup_sensor
564 real,
intent(inout) :: crefl
566 real,
parameter :: Ps = 1013.
567 real,
parameter :: Cm = 0.84
568 real,
parameter :: taur0(2) = (/0.044, 0.025/)
570 real :: taur, mu0, mu, x, pray, refl_s
571 real :: fti1_as, fti0_as
572 real :: angles(2), functionvalues(2)
573 real :: fluxup_solar_tau, fluxup_sensor_tau
574 integer :: lowbound, highbound
579 taur = taur0(iw) * pc / ps
580 mu0 = cos(
d2r*theta0)
583 x = -mu0*mu + sqrt((1.-mu0**2)*(1.-mu**2))*cos(
d2r*phi)
584 pray = 3.*(1.+x**2)/4.0
593 if (location(1) == 1)
then
596 functionvalues(1) = fluxup_solar(lowbound,location(1)-1,1,location(2))
597 functionvalues(2) = fluxup_solar(highbound,location(1)-1,1,location(2))
609 if (location(1) == 1)
then
612 functionvalues(1) = fluxup_sensor(lowbound,location(1)-1,1,location(2))
613 functionvalues(2) = fluxup_sensor(lowbound,location(1)-1,1,location(2))
617 fti1_as = fluxup_sensor_tau
618 fti0_as = fluxup_solar_tau
621 fti0_as = fti0_as + fti0*as*(1-sfr)/(1 - sfr*as)
622 fti1_as = fti1_as + fti1*as*(1-sfr)/(1 - sfr*as)
625 refl_s = taur*pray/(4.*mu0*mu) + 0.5*taur* fti1_as * exp(-taur/mu )/mu0 + &
626 0.5*taur* fti0_as * exp(-taur/mu0)/mu
627 crefl = (refl_source - refl_s)*exp(cm*taur*(1./mu0 + 1./mu))
632 radii, tau, re, lib_dist, phase_liquid, Ram_corr,quality_in,CH37_IDX, &
633 CTopT,CH37_NUM, platFormName)
664 integer,
intent(in) ::xx_pt,yy_pt
665 real,
intent(in) :: Ram, Rbm
666 real,
dimension(:),
intent(in) :: radii
667 integer,
dimension(:),
intent(in) :: twobands
668 real,
intent(inout) :: tau, re, lib_dist, Ram_corr
669 logical,
intent(in) :: phase_liquid
670 integer,
intent(in) :: quality_in
671 CHARACTER(len=*),
INTENT(IN),
OPTIONAL::platFormName
672 INTEGER,
INTENT(IN),
OPTIONAL::CH37_NUM,CH37_IDX
673 REAL,
INTENT(IN),
OPTIONAL::CTopT
675 REAL :: Pc, theta, theta0, phi
676 real::CTopT_lcl, intCTop,intSurf
677 integer :: size_tau, size_re
688 IF(
PRESENT(ctopt))
THEN
694 IF(
PRESENT(ch37_idx) .AND.
PRESENT(ctopt) .and.
PRESENT(platformname) &
695 .and.
PRESENT(ch37_num) .and. ctopt_lcl > 0.0)
THEN
696 intctop=
modis_planck(platformname, ctopt_lcl, ch37_num, 1)
734 if(quality_in == -4 .OR. quality_in == -3)
then
735 CALL asl_boundary(ram, rbm, twobands, radii, tau, re, lib_dist, pc, &
736 theta, theta0, phi, phase_liquid, ram_corr)
738 CALL asl_interior(ram, rbm, twobands, radii, tau, re, lib_dist, pc, &
739 theta, theta0, phi, phase_liquid, ram_corr)
747 thermal_trans_1way, thermal_trans_2way, solar_zenith, &
756 real,
intent(in) :: intensity,intensity_g,solar_zenith
758 real,
intent(in) :: thermal_trans_2way,thermal_trans_1way
759 real(single),
intent(in) :: sfr(:,:), fti1(:,:), fti0(:,:), fri1(:,:)
762 integer :: total_taus, radii, wavelengths,i,j
763 real :: absorbing_albedo
764 real :: tc, local_trans_1way, local_trans_2way
766 if (thermal_trans_1way < 0. .or. thermal_trans_1way > 1.) then
767 local_trans_1way = 1.
769 local_trans_1way = thermal_trans_1way
772 if (thermal_trans_2way < 0. .or. thermal_trans_2way > 1.) then
773 local_trans_2way = 1.
775 local_trans_2way = thermal_trans_2way
780 absorbing_albedo =
reflibb(1,1)
782 rad37lib(1,:) = (1.0 - absorbing_albedo) * intensity_g
783 rad37lib(2:,:) = (1.0- fti1(:,:) - fri1(:,:)) * intensity + &
784 fti1(:,:) * (1.0 - absorbing_albedo) * intensity_g / &
785 (1.0 - absorbing_albedo * sfr(:,:))
793 thermal_trans_1way, thermal_trans_2way, solar_zenith, &
802 real,
intent(in) :: intensity,intensity_g,solar_zenith
803 real,
intent(in) :: thermal_trans_2way,thermal_trans_1way
804 real(single),
intent(in) :: cl_emis(:,:), sf_emis(:,:)
809 integer :: total_taus, radii, wavelengths,i,j
810 real :: absorbing_albedo
811 real :: tc, local_trans_1way, local_trans_2way
813 if (thermal_trans_1way < 0. .or. thermal_trans_1way > 1.) then
814 local_trans_1way = 1.
816 local_trans_1way = thermal_trans_1way
819 if (thermal_trans_2way < 0. .or. thermal_trans_2way > 1.) then
820 local_trans_2way = 1.
822 local_trans_2way = thermal_trans_2way
827 rad37lib(:,:) = cl_emis(:,:) * intensity + sf_emis(:,:) * intensity_g
834 subroutine asl_interior(Ram, Rbm_in, bands, radii, tau, re, lib_dist, Pc, &
835 theta, theta0, phi, phase_liquid, Ram_corr)
862 real,
intent(in) :: Ram, Rbm_in, Pc, theta, theta0, phi
863 real,
dimension(:),
intent(in) :: radii
864 integer,
dimension(:),
intent(in) :: bands
865 real,
intent(inout) :: tau, re, lib_dist, Ram_corr
866 logical,
intent(in) :: phase_liquid
869 real,
dimension(:,:),
allocatable :: rel_residual,reflibBL
870 integer :: size_tau, size_re, loc(2), rel_loc(2)
871 logical :: re_altered
873 real :: Ramc, crefl,Rbm
874 integer :: iter, max_iter
876 real :: albedoA, albedoB,normConst
877 real :: sfr, fti1, fti0
881 allocate(rel_residual(size_tau, size_re),reflibbl(size_tau, size_re))
888 rbm = rbm_in * normconst
893 albedob = reflibbl(1,1)
909 do while (iter <= max_iter)
912 if (ramc < albedoa)
then
917 deallocate (rel_residual, reflibbl )
921 rel_residual = sqrt( (
refliba - ramc)**2 + (reflibbl-rbm)**2 ) / &
922 sqrt(ramc**2 + rbm**2)
923 loc = minloc(rel_residual)
924 lib_dist = rel_residual(loc(1), loc(2))
928 if (re < 4. ) re = 4.
932 if (loc(1) == 1)
then
944 if (phase_liquid)
then
945 if (loc(1) == 1)
then
957 theta, theta0, phi, loc, crefl)
959 if (loc(1) == 1)
then
971 theta, theta0, phi, loc, crefl)
983 if (ramc < albedoa)
then
987 deallocate (rel_residual, reflibbl )
991 rel_residual = sqrt( (
refliba - ramc)**2 + (reflibbl-rbm)**2 ) / &
992 sqrt(ramc**2 + rbm**2)
993 loc = minloc(rel_residual)
994 lib_dist = rel_residual(loc(1), loc(2))
999 if (re < 4. ) re = 4.
1003 if (loc(1) == 1)
then
1009 deallocate (rel_residual,reflibbl)
1014 subroutine asl_boundary(Ram, Rbm_in, bands, radii, tau, re, lib_dist, Pc, &
1015 theta, theta0, phi, phase_liquid, Ram_corr)
1044 real,
intent(in) :: Ram, Rbm_in, Pc, theta, theta0, phi
1045 real,
dimension(:),
intent(in) :: radii
1046 integer,
dimension(:),
intent(in) :: bands
1047 real,
intent(inout) :: tau, re, lib_dist, Ram_corr
1048 logical,
intent(in) :: phase_liquid
1050 real,
dimension(:,:),
allocatable :: temp_refl,reflibBL
1051 real,
dimension(:),
allocatable::rel_residual
1052 integer :: size_tau, size_re, loc, rel_loc(1),ire_ct_1, &
1053 temp_array_size,s_rt,iL,iR
1054 logical :: re_altered
1056 real :: Ramc, crefl, Rbm
1057 integer :: iter, max_iter,iiiloc
1059 real :: albedoA, albedoB,normConst
1060 real :: sfr, fti1, fti0
1068 allocate(reflibbl(size_tau, size_re))
1074 rbm = rbm_in * normconst
1087 albedob = reflibbl(1,ire_ct_1)
1089 s_rt = size_tau+size_re
1090 temp_array_size = size_tau + s_rt - (ire_ct_1 + 1)
1092 allocate(rel_residual(temp_array_size))
1093 allocate(temp_refl(2,temp_array_size))
1095 temp_refl(1,1:size_tau) =
refliba(1:size_tau,ire_ct_1)
1097 temp_refl(1, size_tau+1 : s_rt-ire_ct_1) = &
1098 refliba(size_tau,ire_ct_1+1:size_re)
1100 temp_refl(1, s_rt-ire_ct_1+1 : temp_array_size) = &
1104 temp_refl(2, 1 : size_tau) = reflibbl(1:size_tau,ire_ct_1)
1105 temp_refl(2, size_tau+1 : s_rt-ire_ct_1) = &
1106 reflibbl(size_tau,ire_ct_1+1:size_re)
1107 temp_refl(2, s_rt-ire_ct_1+1 : temp_array_size) = &
1108 reflibbl(1:size_tau-1,size_re)
1112 if (ramc < albedoa .OR. &
1113 ( rbm < minval(reflibbl(size_tau,ire_ct_1:size_re)) .and. &
1114 ramc > minval(
refliba(size_tau,ire_ct_1:size_re)) ) .OR. &
1115 ( rbm > maxval(reflibbl(size_tau,ire_ct_1:size_re)) .and. &
1116 ramc > maxval(
refliba(size_tau,ire_ct_1:size_re)) ))
then
1122 deallocate (rel_residual, temp_refl, reflibbl)
1127 rel_residual = sqrt( (temp_refl(1,:) - ramc)**2 + &
1128 (temp_refl(2,:) -rbm)**2 ) / sqrt(ramc**2 + rbm**2)
1129 rel_loc = minloc(rel_residual)
1130 lib_dist = rel_residual(rel_loc(1))
1136 if(rel_loc(1) <= size_tau)
then
1138 re = radii(ire_ct_1)
1142 if(phase_liquid)
then
1149 temp_refl(2,1:size_tau),lib_dist,loc)
1159 if(ramc > maxval(
refliba(size_tau,ire_ct_1:size_re)))
then
1163 if((rbm - reflibbl(size_tau,ire_ct_1)) < 0.0)
then
1164 do iiiloc = ire_ct_1+1,size_re
1167 if((rbm - reflibbl(size_tau,iiiloc)) >=0.0)
exit
1172 if(
abs(reflibbl(size_tau,ir)-reflibbl(size_tau,il)) > 0.000001)
then
1173 re = (rbm-reflibbl(size_tau,il))*(radii(ir) - &
1174 radii(il))/(reflibbl(size_tau,ir)-reflibbl(size_tau,il)) + &
1176 if(re > radii(ir) .OR. re < radii(il))re = radii(il)
1182 elseif(rel_loc(1) > size_tau .and. rel_loc(1) <= s_rt - ire_ct_1)
then
1184 loc = rel_loc(1) - size_tau + 1
1188 ((rbm - reflibbl(size_tau,loc)) < 0.0 .AND. loc <= size_re))
then
1189 do iiiloc = loc , size_re
1190 if((rbm - reflibbl(size_tau,iiiloc)) >=0.0)
exit
1196 elseif((rbm - reflibbl(size_tau,loc)) >= 0.0 .AND. loc <= size_re)
then
1197 do iiiloc = loc-1 , 1,-1
1198 if((rbm - reflibbl(size_tau,iiiloc)) <= 0.0)
exit
1205 if(ir <= size_re .and. il >= 1)
then
1207 if(
abs(reflibbl(size_tau,ir)-reflibbl(size_tau,il)) > 0.000001 &
1208 .and.
abs(rbm - reflibbl(size_tau,loc)) > 0.0)
then
1209 re = radii(loc) + (rbm-reflibbl(size_tau,loc))*(radii(ir) - &
1210 radii(il))/(reflibbl(size_tau,ir)-reflibbl(size_tau,il))
1211 if(re > radii(ir) .OR. re < radii(il))re = radii(loc)
1216 if(phase_liquid)
then
1231 if(ramc > 0 .and. ramc < maxval(
refliba(1:size_tau,size_re)) .and. &
1240 loc = rel_loc(1) - (s_rt-ire_ct_1) + 1
1243 if(phase_liquid)
then
1250 temp_refl(1,s_rt-ire_ct_1+1: temp_array_size), &
1251 temp_refl(2,s_rt-ire_ct_1+1: temp_array_size),lib_dist,loc)
1255 if ( loc == 1 )
then
1261 if(ramc > maxval(
refliba(1:size_tau,size_re)))
then
1282 deallocate (rel_residual,temp_refl,reflibbl)
1295 REAL,
INTENT(IN)::R1,R2
1296 REAL,
DIMENSION(:),
INTENT(IN)::R1vec,R2vec
1297 REAL,
INTENT(OUT)::mindist
1298 INTEGER,
INTENT(OUT)::loc_index
1300 real,
dimension(:),
allocatable::rel_residual
1303 allocate(rel_residual(
size(r1vec)))
1305 rel_residual = sqrt( (r1vec - r1)**2 + (r2vec -r2)**2 ) / &
1307 rel_loc = minloc(rel_residual)
1308 mindist = rel_residual(rel_loc(1))
1309 loc_index = rel_loc(1)
1311 deallocate(rel_residual)
1317 library_radii, effective_radius, optical_thickness)
1328 real,
intent(in) :: optical_thickness_vector(:)
1329 real,
intent(in) :: library_radii(:)
1330 real,
intent(in) :: effective_radius
1331 real,
intent(out) :: optical_thickness
1346 real(library_radii), ilo, ihi)
1349 real(library_radii(ilo:ilo+2)), optical_thickness_vector(ilo:ilo+2) )
1351 if (optical_thickness > 150.) optical_thickness = 150.
1352 if (optical_thickness < 0.)
then
1359 library_radii, effective_radius, optical_thickness, debug, &
1360 use_nearest, quality_out)
1379 real,
intent(in) :: residual(:), optical_thickness_vector(:)
1380 real(single),
intent(in) :: library_radii(:)
1381 logical,
intent(in) :: debug
1382 logical,
intent(inout) :: use_nearest
1383 real,
intent(out) :: effective_radius, optical_thickness
1384 integer,
intent(out)::quality_out
1386 real :: max_allowable_tau,local_max_allowable
1387 integer:: total_taus
1389 integer :: number_local_minima, ilo, ihi, zero_count
1390 integer :: local_minima(8)
1392 INTEGER,
parameter :: nre=18
1393 INTEGER :: crossing_num, crossing_vector(nre), local_max_num, &
1394 local_max_vector(nre), local_min_num, local_min_vector(nre), k
1395 integer(integer_onebyte) :: quality
1399 real re_water_outofbounds_high, re_water_outofbounds_low
1400 logical :: re_altered, correction_made
1403 re_water_outofbounds_high = 30.; re_water_outofbounds_low = 4.
1405 correction_made = .false.
1416 crossing_vector, crossing_num)
1418 local_min_vector, local_min_num)
1420 local_max_vector, local_max_num)
1424 local_min_vector, local_min_num, local_max_vector, local_max_num, &
1425 effective_radius, quality )
1431 call solution_re (library_radii, residual, crossing_vector, crossing_num, &
1432 local_min_vector, local_min_num, local_max_vector, local_max_num, &
1433 effective_radius, quality )
1436 quality_out = quality
1438 use_nearest = .false.
1439 if ( quality == -2 .or. quality == -3 .or. quality == -4 &
1440 .OR. quality == -6)
then
1442 use_nearest = .true.
1465 re_altered = .false.
1467 ( (effective_radius < re_water_outofbounds_low) .or. &
1469 effective_radius = 10.
1475 effective_radius = 30.
1483 real(library_radii), ilo, ihi)
1489 local_max_allowable = max_allowable_tau - 1.0
1493 if(.not.(use_nearest) .and. &
1494 (maxval(optical_thickness_vector(ilo:ilo+2)) > local_max_allowable &
1495 .OR. minval(optical_thickness_vector(ilo:ilo+2)) < 0))
then
1497 correction_made = .true.
1499 if(maxval(optical_thickness_vector(1:2)) > local_max_allowable &
1500 .OR. minval(optical_thickness_vector(1:2)) < 0)
then
1502 use_nearest = .true.
1506 optical_thickness = optical_thickness_vector(ilo) + &
1507 ( ( effective_radius -
real(library_radii(ilo))) / &
1508 (
real(library_radii(ilo+1)-library_radii(ilo))) ) * &
1509 (optical_thickness_vector(ilo+1) - optical_thickness_vector(ilo) )
1512 elseif(maxval(optical_thickness_vector(ilo-1:ilo)) > local_max_allowable &
1513 .OR. minval(optical_thickness_vector(ilo-1:ilo)) < 0)
then
1515 use_nearest = .true.
1518 elseif(maxval(optical_thickness_vector(ilo-1:ilo)) < local_max_allowable &
1519 .AND. minval(optical_thickness_vector(ilo-1:ilo)) > 0)
then
1521 if(optical_thickness_vector(ilo+3) < local_max_allowable &
1522 .AND. optical_thickness_vector(ilo+3) > 0)ilo = ilo+1
1524 optical_thickness = optical_thickness_vector(ilo+1) + &
1525 ( ( effective_radius -
real(library_radii(ilo+1))) / &
1526 (
real(library_radii(ilo+2)-library_radii(ilo+1))) ) * &
1527 (optical_thickness_vector(ilo+2) - optical_thickness_vector(ilo+1) )
1533 use_nearest = .true.
1540 if(.NOT.(correction_made))
then
1542 real(library_radii(ilo:ilo+2)), &
1543 optical_thickness_vector(ilo:ilo+2) )
1546 if( optical_thickness < optical_thickness_vector(ilo) .AND. &
1547 (.NOT.(correction_made))) then
1550 real(library_radii), ilo, ihi)
1551 optical_thickness = optical_thickness_vector(ilo) + &
1552 ( ( effective_radius -
real(library_radii(ilo))) / &
1553 (
real(library_radii(ilo+1)-library_radii(ilo))) ) * &
1554 (optical_thickness_vector(ilo+1) - optical_thickness_vector(ilo) )
1567 if (optical_thickness /=
fillvalue_real .and. optical_thickness < 0.)
then
1570 use_nearest = .true.
1575 optical_thickness < 0.01 .and. optical_thickness > 0.) then
1576 optical_thickness = 0.01
1606 effective_radius < library_radii(1)) then
1607 effective_radius = library_radii(1)
1612 if (effective_radius > library_radii(
size(library_radii))) then
1613 effective_radius = library_radii(
size(library_radii))
1627 real,
intent(in) :: residual(2), rad(2)
1628 real,
intent(out) :: re
1630 re = -1.0*( rad(1)*residual(2)/(residual(1)-residual(2)) + &
1631 rad(2)*residual(1)/(residual(2)-residual(1)) )
1646 integer,
intent(in) :: n1, n
1647 real,
intent(in) :: xx, x(n)
1649 integer,
intent(out) :: k1, k2
1656 do while (xx > x(i) .and. i < n)
1683 real,
intent(in) :: x(3), y(3), xx
1684 lagrangeinterp = (xx-x(2))* (xx-x(3))/ (x(1)-x(2))/ (x(1)-x(3))*y(1) + &
1685 (xx-x(3))* (xx-x(1))/ (x(2)-x(3))/ (x(2)-x(1))*y(2) + &
1686 (xx-x(1))* (xx-x(2))/ (x(3)-x(1))/ (x(3)-x(2))*y(3)
1705 real,
intent(in) :: x(3)
1706 integer,
intent(out) :: signchange
1708 if ( (x(1)==0 .and. x(2)==0) .or. (x(1)==0 .and. x(3)==0) .or. &
1709 (x(2)==0 .and. x(3)==0) )
Then
1712 if (
sign(1.,x(1))*
sign(1.,x(2))*
sign(1.,x(3)) /= -1.)
Then
1714 if ( x(1) > 0 .AND. x(2) > 0 .AND. x(3) > 0) then
1718 if ( x(1) < 0 .AND. x(2) < 0 .AND. x(3) < 0) then
1727 if (signchange == 1) then
1728 if (
sign(1.,x(1))*
sign(1.,x(2)) == -1. ) signchange = 1
1729 if (
sign(1.,x(2))*
sign(1.,x(3)) == -1. ) signchange = 2
1745 real(single),
intent(in) :: radii(:), residual(:)
1747 real(single),
intent(out) :: radius_solution
1748 integer,
intent(out) :: status
1750 real(double) :: d1, d2, d3, a0, a1, a2, root1, root2, z
1752 d1 = residual(1) / ((radii(1)-radii(2))*(radii(1)-radii(3)))
1753 d2 = residual(2) / ((radii(2)-radii(1))*(radii(2)-radii(3)))
1754 d3 = residual(3) / ((radii(3)-radii(1))*(radii(3)-radii(2)))
1756 a0 = d1*radii(2)*radii(3) + d2*radii(1)*radii(3) + d3*radii(1)*radii(2)
1757 a1 = -d1*(radii(2)+radii(3)) - d2*(radii(1)+radii(3)) - d3*(radii(1)+radii(2))
1763 if(z >= 0. .and. a2 /= 0.) then
1764 root1 = (-a1 + sqrt(z))/(2*a2)
1765 root2 = (-a1 - sqrt(z))/(2*a2)
1767 root1 = -999; root2 = -999
1771 if (root1 < radii(1) .and. root2 < radii(1)) then
1772 radius_solution =-999.
1774 elseif (root1 > radii(3) .and. root2 > radii(3)) then
1775 radius_solution =-999.
1777 elseif (root1 >= radii(1) .and. root1 <= radii(3)) then
1778 radius_solution = root1
1780 elseif(root2 >= radii(1) .and. root2 <= radii(3)) then
1781 radius_solution = root2
1784 radius_solution = -999.