!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
!

      SUBROUTINE VISOCN(SZ,SATZ,RZ,ANISOT,ZLAMB,ZCLOUD,IER) 1,13
***subroutine     VISOCN
*
*auteur           LOUIS GARAND 1985
*
*REVISION 001     JACQUES HALLE - DDO - DORVAL - 421-4660
*                                 Decembre 1995
*                 Generaliser pour toutes les plateformes satellitaires.
*
*langage          fortran 5
*
*objet            THIS ROUTINE PROVIDES THE CORRECTIVE FACTORS FOR THE ANISOTROPY
*                 OF REFLECTANCE OVER CLEAR OCEAN.
*                 
*
*appel            CALL VISOCN(SZ,SATZ,RZ,ANISOT,ZLAMB,ZCLOUD,IER)
*
*arguments        sz     - input  - SUN ZENITH ANGLE IN DEGREES (0 TO 90)
*                 satz   - input  - SATELLITE ZENITH ANGLE (0 TO 90)
*                 rz     - input  - RELATIVE   ANGLE IN DEGREES (0 TO 180) WITH
*                                   0 AS BACKSCATTERING AND 
*                                   180 AS FORWARD SCATTERING
*                 anisot - output - ANISOTROPIC CORRECTIVE FACTOR 
*                                  (KHI IN MINNIS-HARRISSON)
*                 zlamb  - output - CORRECTIVE FACTOR FOR LAMBERTIAN REFLECTANCE
*                                   (DELTA """") ZLAMB IS A FUNCTION OF SZ ONLY.
*                                   THIS IS FOR OCEAN SURFACE.
*                 zcloud - output - SAME AS ZLAMB BUT FOR CLOUD SURFACE
*                 ier    - output - error code (0=ok; -1=problem with interpolation)
*
*notes            OBTAINED FROM DR PAT MINNIS,LANGLEY , AND BASED ON THE WORK
*                 OF MINNIS AND HARRISSON,JCAM 1984,P993.
*                 THE ROUTINE IS A LOOK UP TABLE ALONG WITH INTERPOLATION ON THE 
*                 THREE ANGLES. 
**
      implicit  none
c
      integer  ier, i1, i2, j1, j2, k1, k2, l, i, n, m, j, k
c
      real  SZ, SATZ, RZ, ANISOT ,ZLAMB, ZCLOUD
      real  pi, fac, cc, d1, d2, slop, cept, x1, x2
      real  g1, g2
      real  drm, drcld
      real  VNORM(11,10,13),S(11),V(10),R(13),DA(2),DD(2) 
c
      external  drcld, drm, lineq
c
      DATA S/0.0,18.19,31.79,41.41,49.46,56.63,63.26,69.51,75.52,81.37, 
     X 87.13/ 
c
      DATA R/0.0,15.0,30.0,45.0,60.0,75.0,90.0,105.0,120.0,135.0,150.0, 
     X 165.0,180.0/ 
c
      DATA V/0.0,10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0/
c
      DATA ((VNORM(1,J,K),J=1,10),K=1,13)/
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174, 
     1 2.668,2.210,1.105,0.979,0.810,0.735,0.785,0.979,1.092,1.174/ 
c
      DATA ((VNORM(2,J,K),J=1,10),K=1,13)/
     1 1.154, .960, .896, .818, .748, .825, .922,1.018,1.179,1.334, 
     2 1.154, .954, .838, .799, .735, .786, .883, .960,1.128,1.250, 
     3 1.514, .973, .825, .786, .722, .754,0.838,0.922,1.063,1.160, 
     4 1.514,0.967,0.864,0.818,0.715,0.728,0.793,0.876,1.005,1.102, 
     5 1.514,0.967,0.896,0.889,0.702,0.696,0.773,0.851,0.954,1.038, 
     6 1.514,1.070,0.986,0.922,0.677,0.696,0.754,0.838,0.922,1.012, 
     7 1.514,1.270,0.967,0.870,0.677,0.664,0.709,0.773,0.857,0.954, 
     8 1.514,1.495,1.166,0.960,0.683,0.690,0.728,0.806,0.896,0.999, 
     9 1.514,1.959,1.534,1.025,0.973,0.709,0.754,0.857,0.954,1.050, 
     O 1.514,2.165,2.165,1.270,1.038,0.760,0.812,0.902,1.012,1.115, 
     1 1.514,2.275,2.262,1.688,1.115,0.780,0.857,0.954,1.070,1.173, 
     2 1.514,2.326,2.520,2.172,1.257,0.812,0.883,1.005,1.108,1.212, 
     3 1.514,2.359,2.951,2.255,1.411,0.980,0.915,1.050,1.160,1.295/ 
c
      DATA ((VNORM(3,J,K),J=1,10),K=1,13)/
     1 0.897,0.792,0.765,0.765,0.778,0.897,0.996,1.095,1.306,1.431, 
     2 0.897,0.712,0.739,0.745,0.765,0.891,0.970,1.069,1.214,1.359, 
     3 0.897,0.666,0.699,0.745,0.759,0.811,0.917,1.042,1.148,1.306, 
     4 0.897,0.646,0.693,0.739,0.693,0.752,0.858,0.989,1.102,1.234, 
     5 0.897,0.686,0.679,0.726,0.679,0.693,0.792,0.924,1.049,1.154, 
     6 0.897,0.660,0.673,0.693,0.646,0.660,0.759,0.858,1.003,1.102, 
     7 0.897,0.673,0.765,0.792,0.712,0.600,0.699,0.811,0.963,1.055, 
     8 0.897,0.706,0.772,0.917,0.904,0.613,0.726,0.858,1.055,1.121, 
     9 0.897,0.825,0.924,0.996,0.989,0.686,0.778,0.937,1.115,1.181, 
     O 0.897,1.036,1.253,1.286,1.260,0.778,0.858,0.996,1.181,1.260, 
     1 0.897,1.201,1.788,1.986,1.827,0.884,0.851,1.062,1.227,1.333, 
     2 0.897,1.530,2.249,2.546,2.381,1.352,0.891,1.108,1.286,1.405, 
     3 0.897,1.854,2.401,3.325,2.559,1.590,0.937,1.168,1.214,1.425/ 
c
      DATA ((VNORM(4,J,K),J=1,10),K=1,13)/
     1 0.752,0.800,0.745,0.717,0.759,0.891,1.149,1.309,1.469,1.650, 
     2 0.752,0.773,0.717,0.703,0.752,0.835,1.065,1.246,1.406,1.552, 
     3 0.752,0.731,0.689,0.703,0.745,0.814,0.988,1.176,1.323,1.476, 
     4 0.752,0.689,0.675,0.654,0.696,0.752,0.940,1.100,1.246,1.378, 
     5 0.752,0.675,0.661,0.633,0.668,0.717,0.877,1.030,1.176,1.309, 
     6 0.752,0.647,0.640,0.620,0.613,0.682,0.814,0.947,1.107,1.232, 
     7 0.752,0.633,0.620,0.613,0.606,0.640,0.773,0.898,1.044,1.162, 
     8 0.752,0.626,0.626,0.626,0.620,0.654,0.821,0.947,1.128,1.225, 
     9 0.752,0.633,0.633,0.633,0.647,0.675,0.877,1.009,1.183,1.274, 
     O 0.752,0.682,0.717,0.961,1.023,0.968,0.940,1.142,1.274,1.413, 
     1 0.752,0.856,1.037,1.434,1.594,1.441,1.044,1.225,1.323,1.545, 
     2 0.752,1.044,1.295,2.207,1.610,2.311,1.385,1.274,1.441,1.636, 
     3 0.752,1.079,1.524,2.541,3.564,3.014,1.942,1.462,1.552,1.726/ 
c
      DATA ((VNORM(5,J,K),J=1,10),K=1,13)/
     1 0.552,0.588,0.617,0.638,0.724,0.860,1.133,1.362,1.556,1.678, 
     2 0.552,0.581,0.602,0.617,0.652,0.803,1.075,1.326,1.484,1.592, 
     3 0.552,0.559,0.588,0.595,0.617,0.731,1.018,1.283,1.412,1.527, 
     4 0.552,0.531,0.538,0.574,0.595,0.710,0.946,1.240,1.341,1.463, 
     5 0.552,0.516,0.523,0.552,0.559,0.695,0.911,1.226,1.291,1.412, 
     6 0.552,0.516,0.523,0.538,0.538,0.652,0.882,1.154,1.240,1.348, 
     7 0.552,0.516,0.523,0.538,0.523,0.595,0.774,1.075,1.169,1.269, 
     8 0.552,0.531,0.545,0.552,0.566,0.609,0.817,1.140,1.248,1.369, 
     9 0.552,0.538,0.545,0.566,0.581,0.645,0.911,1.240,1.319,1.441, 
     O 0.552,0.566,0.552,0.574,0.710,0.839,0.982,1.298,1.391,2.323, 
     1 0.552,0.566,0.559,0.710,1.147,1.176,1.040,1.348,1.671,2.674, 
     2 0.552,0.588,1.133,1.355,2.194,2.803,2.201,2.459,2.904,3.126, 
     3 0.552,0.710,1.341,1.757,3.026,3.900,4.445,4.503,4.445,4.503/ 
c
      DATA ((VNORM(6,J,K),J=1,10),K=1,13)/
     1 0.551,0.627,0.665,0.734,0.826,0.971,1.231,1.537,1.721,1.866, 
     2 0.551,0.604,0.619,0.665,0.765,0.895,1.185,1.476,1.568,1.652, 
     3 0.551,0.597,0.604,0.619,0.734,0.849,1.101,1.346,1.453,1.568, 
     4 0.551,0.581,0.589,0.597,0.665,0.795,1.032,1.262,1.346,1.445, 
     5 0.551,0.558,0.558,0.566,0.612,0.727,0.987,1.201,1.262,1.399, 
     6 0.551,0.505,0.505,0.512,0.566,0.696,0.925,1.117,1.185,1.308, 
     7 0.551,0.474,0.497,0.512,0.535,0.673,0.864,1.048,1.124,1.216, 
     8 0.551,0.497,0.505,0.520,0.551,0.681,0.902,1.124,1.201,1.323, 
     9 0.551,0.535,0.535,0.551,0.566,0.711,1.017,1.201,1.269,1.422, 
     O 0.551,0.535,0.543,0.558,0.704,1.193,1.247,1.285,1.346,1.950, 
     1 0.551,0.543,0.551,0.581,0.994,1.545,1.583,1.354,2.019,2.883, 
     2 0.551,0.566,0.612,0.788,1.468,2.233,2.340,2.531,2.983,3.365, 
     3 0.551,0.658,0.665,1.101,2.134,3.120,4.221,4.856,4.956,5.613/ 
c
      DATA ((VNORM(7,J,K),J=1,10),K=1,13)/
     1 0.545,0.606,0.683,0.744,0.798,0.990,1.228,1.704,1.850,2.049, 
     2 0.545,0.576,0.583,0.714,0.783,0.952,1.144,1.573,1.758,1.888, 
     3 0.545,0.560,0.568,0.629,0.744,0.875,1.105,1.504,1.642,1.788, 
     4 0.545,0.553,0.560,0.599,0.629,0.791,1.028,1.420,1.527,1.696, 
     5 0.545,0.545,0.553,0.599,0.606,0.714,0.990,1.335,1.451,1.581, 
     6 0.545,0.530,0.537,0.568,0.583,0.683,0.890,1.243,1.351,1.489, 
     7 0.545,0.491,0.499,0.507,0.576,0.622,0.791,1.182,1.282,1.389, 
     8 0.545,0.507,0.514,0.507,0.576,0.675,0.890,1.197,1.328,1.451, 
     9 0.545,0.522,0.537,0.522,0.591,0.760,0.944,1.259,1.389,1.527, 
     O 0.545,0.537,0.545,0.553,0.614,0.906,1.028,1.389,1.504,2.533, 
     1 0.545,0.553,0.553,0.576,0.637,1.036,1.550,1.658,1.934,3.277, 
     2 0.545,0.560,0.568,0.606,1.174,1.781,2.563,3.170,3.791,4.966, 
     3 0.545,0.591,0.614,1.259,2.065,2.824,3.761,4.498,5.902,6.148/ 
c
      DATA ((VNORM(8,J,K),J=1,10),K=1,13)/
     1 0.514,0.539,0.596,0.694,0.832,1.004,1.444,1.869,2.203,2.538, 
     2 0.514,0.539,0.571,0.645,0.751,0.906,1.387,1.779,2.056,2.317, 
     3 0.514,0.547,0.555,0.612,0.702,0.824,1.281,1.681,1.934,2.203, 
     4 0.514,0.539,0.555,0.588,0.653,0.743,1.028,1.404,1.624,2.024, 
     5 0.514,0.539,0.547,0.555,0.588,0.710,0.889,1.191,1.420,1.820, 
     6 0.514,0.522,0.522,0.539,0.563,0.710,0.849,1.044,1.208,1.534, 
     7 0.514,0.481,0.506,0.514,0.539,0.694,0.824,1.028,1.200,1.371, 
     8 0.514,0.481,0.514,0.547,0.563,0.702,0.898,1.134,1.297,1.501, 
     9 0.514,0.490,0.514,0.555,0.588,0.726,0.955,1.265,1.379,1.648, 
     O 0.514,0.547,0.547,0.571,0.604,0.767,1.036,1.355,1.550,3.142, 
     1 0.514,0.563,0.579,0.604,0.612,0.832,1.909,2.848,3.917,4.790, 
     2 0.514,0.522,0.563,0.677,0.767,1.420,2.040,3.158,4.863,6.291, 
     3 0.514,0.588,0.588,0.612,0.824,2.032,3.109,4.969,6.846,7.695/ 
c
      DATA ((VNORM(9,J,K),J=1,10),K=1,13)/
     1 0.572,0.608,0.679,0.751,0.831,1.001,1.377,1.913,2.512,2.879, 
     2 0.572,0.572,0.608,0.679,0.760,0.930,1.243,1.707,2.369,2.700, 
     3 0.572,0.563,0.590,0.644,0.706,0.831,1.171,1.618,2.190,2.378, 
     4 0.572,0.554,0.563,0.599,0.662,0.760,1.010,1.502,2.011,2.235, 
     5 0.572,0.545,0.563,0.590,0.626,0.715,0.885,1.323,1.815,2.119, 
     6 0.572,0.527,0.554,0.572,0.608,0.670,0.724,1.144,1.618,1.868, 
     7 0.572,0.545,0.572,0.572,0.599,0.662,0.724,1.117,1.484,1.761, 
     8 0.572,0.554,0.590,0.599,0.608,0.679,0.760,1.216,1.582,1.922, 
     9 0.572,0.572,0.599,0.608,0.635,0.715,0.822,1.377,1.707,2.056, 
     O 0.572,0.590,0.608,0.635,0.662,0.742,0.912,1.529,3.075,4.693, 
     1 0.572,0.590,0.626,0.644,0.670,0.760,1.109,1.564,3.111,4.702, 
     2 0.572,0.599,0.644,0.662,0.688,0.822,1.788,2.816,5.346,7.295, 
     3 0.572,0.608,0.662,0.670,0.715,1.851,3.227,4.810,6.669,9.557/ 
c
      DATA ((VNORM(10,J,K),J=1,10),K=1,13)/ 
     1 0.552,0.606,0.639,0.671,0.704,0.899,1.223,2.479,3.194,3.573, 
     2 0.552,0.574,0.606,0.628,0.682,0.855,1.148,2.339,2.642,3.378, 
     3 0.552,0.563,0.552,0.595,0.639,0.834,1.061,2.014,2.404,2.891, 
     4 0.552,0.563,0.509,0.552,0.628,0.801,0.985,1.689,2.176,2.653, 
     5 0.552,0.574,0.509,0.520,0.585,0.747,0.888,1.332,1.970,2.458, 
     6 0.552,0.531,0.509,0.509,0.531,0.682,0.801,1.191,1.819,2.425, 
     7 0.552,0.498,0.498,0.498,0.520,0.639,0.747,1.126,1.711,2.317, 
     8 0.552,0.498,0.509,0.509,0.541,0.671,0.780,1.278,1.862,2.598, 
     9 0.552,0.498,0.509,0.520,0.574,0.693,0.812,1.602,2.035,2.793, 
     O 0.552,0.520,0.520,0.531,0.595,0.725,0.844,1.916,2.588,3.768, 
     1 0.552,0.531,0.541,0.574,0.628,0.780,1.039,2.349,3.313,5.652, 
     2 0.552,0.574,0.563,0.606,0.660,0.812,1.797,3.010,5.478,7.492, 
     3 0.552,0.650,0.671,0.704,0.801,1.029,2.436,3.465,7.828,10.578/
c
      DATA ((VNORM(11,J,K),J=1,10),K=1,13)/ 
     1 0.518,0.576,0.605,0.633,0.662,0.864,1.238,2.620,3.455,3.887, 
     2 0.518,0.547,0.576,0.576,0.633,0.835,1.123,2.447,2.821,3.656, 
     3 0.518,0.518,0.518,0.547,0.605,0.806,1.036,2.102,2.533,3.080, 
     4 0.518,0.518,0.461,0.518,0.576,0.777,0.950,1.727,2.274,2.821, 
     5 0.518,0.547,0.461,0.489,0.547,0.720,0.864,1.353,2.044,2.591, 
     6 0.518,0.489,0.461,0.461,0.489,0.662,0.777,1.180,1.871,2.562, 
     7 0.518,0.461,0.461,0.461,0.489,0.605,0.720,1.123,1.756,2.418, 
     8 0.518,0.461,0.461,0.461,0.518,0.633,0.749,1.296,1.929,2.764, 
     9 0.518,0.461,0.461,0.489,0.547,0.662,0.777,1.641,2.130,2.994, 
     O 0.518,0.489,0.489,0.489,0.547,0.691,0.806,1.986,2.735,4.117, 
     1 0.518,0.489,0.489,0.547,0.576,0.749,1.008,2.476,3.599,6.334, 
     2 0.518,0.547,0.518,0.576,0.633,0.777,1.842,3.224,6.132,8.550, 
     3 0.518,0.605,0.633,0.662,0.777,1.008,2.562,3.771,8.953,12.293/
C 
C   COMPUTE SUN ZENITH BIN
      PI  = ACOS(-1.)
      FAC = PI/180. 
      CC  = COS(SZ*FAC)
      I1  = 12.-(CC+0.05)*10.
      I2  = I1+1 
      IF(I1.GE.11)I1=11 
      IF(I1.EQ.11)I2=I1 
c
C  COMPUTE SAT ZENITH BIN 
      J1  = IFIX(SATZ/10.)+1 
      J2  = J1+1 
      IF(J1.EQ.10)J2=J1 
c
C  COMPUTE RELATIVE AZIMUTH BIN 
      K1  = RZ/15.+1.
      K2  = K1+1 
      IF(K1.EQ.13)K2=K1 
c
C  INTERPOLATE
      IER = 0 
      DO 30 L=I1,I2 
         I = L-I1+1
c
C     BETWEEN R'S FOR CONSTANT S
         DO 20 N=K1,K2 
c
C        BETWEEN V'S FOR CONSTANT R AND S 
            M  = N-K1+1
            D1 = VNORM(L,J1,N)
            D2 = VNORM(L,J2,N)
            IF(D1.EQ.D2)THEN
               DA(M) = D1
            ELSE
               CALL LINEQ(V(J1),V(J2),D1,D2,SLOP,CEPT,IER) 
               DA(M) = SLOP*SATZ+CEPT
            ENDIF 
  20     CONTINUE
         IF(K1.EQ.K2) THEN 
            DD(I) = DA(1) 
         ELSE
            CALL LINEQ(R(K1),R(K2),DA(1),DA(2),SLOP,CEPT,IER) 
            DD(I) = SLOP*RZ+CEPT
         ENDIF 
  30  CONTINUE
c
C  BETWEEN S'S USING RESULT OF OTHER INTERPOLATIONS 
      IF(I1.EQ.I2)THEN
         ZLAMB  = DRM(I1) 
         ZCLOUD = DRCLD(I1)
         ANISOT = DD(1)
      ELSE
         X1     = COS(S(I1)*FAC) 
         X2     = COS(S(I2)*FAC) 
         CALL LINEQ(X1,X2,DD(1),DD(2),SLOP,CEPT,IER) 
         ANISOT = SLOP*CC+CEPT 
         G1     = DRM(I1)
         G2     = DRM(I2)
         CALL LINEQ(X1,X2,G1,G2,SLOP,CEPT,IER) 
         ZLAMB  = SLOP*CC+CEPT
         G1     = DRCLD(I1)
         G2     = DRCLD(I2)
         CALL LINEQ(X1,X2,G1,G2,SLOP,CEPT,IER) 
         ZCLOUD = SLOP*CC+CEPT 
      ENDIF 
c
      IF(ANISOT.LT.0.) THEN 
         IER    = -1
         ANISOT = 1. 
         ZLAMB  = DRM(I1) 
         ZCLOUD = DRCLD(I1)
      ENDIF 
c
      RETURN
      END