OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
mk_smooth_ice_map.f
Go to the documentation of this file.
1 ! this routine averages the ncep daily ice fields onto a 0.5 deg lat/lon grid
2 ! the averaging window is a circle with a radius of 50 km.
3 
4 ! input: filename1 is the file name for the ncep ice map.
5 ! the file contains a character (1-byte) array that is 4320 by 2160
6 
7  subroutine mk_smooth_ice_map(char_ice, frac_ice_smoothed)
8  implicit none
9 
10  real(8), parameter :: re=6378.137d3 !earth equatorial radius (meters)
11  real(8), parameter :: rp=6356.752d3 !earth polar radius (meters)
12  real(8), parameter :: ffac=(rp/re)*(rp/re)
13 
14  integer(4), parameter :: nlat=2160, nlon=4320
15 
16  character(1), intent(in) :: char_ice(nlon,nlat)
17  real(4), intent(out) :: frac_ice_smoothed(720,360)
18 
19  integer(4) istart
20  integer(4) ilat,ilon,jlat,jlon,klat,klon,kklon
21 
22  real(4) xlat,xlatg,xlon
23  real(4) sinlat0,coslat0
24  real(4) cel0(3),dif(3),rsq,rsq_max,wt
25 
26  real(4) coslat(nlat),cel(3,nlon,nlat)
27  integer(4) nstep(nlat)
28 
29  real(4) frac_ice(nlon,nlat), dummy_lat(nlon)
30  real(8) tsum(0:1)
31 
32  real(4) cosd, sind, tand
33  real(8) datand
34 
35  data istart/1/
36 
37  if(istart.eq.1) then
38  istart=0
39 
40  rsq_max=(2*sind(0.5*0.45d0))**2 !0.45 degree = 0.45 * 111.2 km/deg = 50 km radius
41 
42  do ilat=1,nlat
43  xlat=(ilat-1)/12.-89.95833
44  xlatg=datand(ffac*tand(xlat)) !convert from geodetic to geocentric
45  sinlat0=sind(xlatg)
46  coslat0=cosd(xlatg)
47 
48  coslat(ilat)=coslat0
49 
50  nstep(ilat)=nint(6./coslat0) + 1
51  if(nstep(ilat).ge.nlon/2) nstep(ilat)=nlon/2 -1
52  if(ilat.le.12 .or.ilat.ge.nlat-11) nstep(ilat)=nlon/2 -1
53 
54  do ilon=1,nlon
55  xlon=(ilon-1)/12.+ 0.04167
56  cel(1,ilon,ilat)=cosd(xlon)*coslat0
57  cel(2,ilon,ilat)=sind(xlon)*coslat0
58  cel(3,ilon,ilat)=sinlat0
59  enddo !ilon
60  enddo !ilat
61  endif
62 
63  frac_ice=ichar(char_ice)*0.01
64 
65 ! write(*,*) 'Smoothing ice file'
66  frac_ice_smoothed = 0
67  do ilat=1,nlat
68 
69  xlat=(ilat-1)/12.-89.95833
70  xlatg=datand(ffac*tand(xlat)) !convert from geodetic to geocentric
71  sinlat0=sind(xlatg)
72  coslat0=cosd(xlatg)
73 
74 ! write(*,*) ilat
75 
76  do ilon=1,nlon
77 
78  xlon=(ilon-1)/12.+ 0.04167
79 
80  cel0(1)=cosd(xlon)*coslat0
81  cel0(2)=sind(xlon)*coslat0
82  cel0(3)=sinlat0
83 
84  tsum=0
85 
86  do klat=ilat-6,ilat+6
87  if(klat.lt.1 .or. klat.gt.nlat) cycle
88  wt=coslat(klat)
89 
90  do klon=ilon-nstep(klat),ilon+nstep(klat)+1
91  kklon=klon
92  if(kklon.lt. 1) kklon=kklon+nlon
93  if(kklon.gt.nlon) kklon=kklon-nlon
94 
95  dif=cel(:,kklon,klat)-cel0
96 
97  rsq=dif(1)*dif(1) + dif(2)*dif(2) + dif(3)*dif(3)
98 
99  if(rsq.gt.rsq_max) cycle
100 
101  tsum(0)=tsum(0) + wt
102  tsum(1)=tsum(1) + wt*frac_ice(kklon,klat)
103 
104  enddo !klon
105  enddo !klat
106 
107  jlat=1 + int(2*(xlat+90))
108  jlon=1 + int(2*xlon)
109  if(jlat.lt.1 .or. jlat.gt.360) stop 'error1'
110  if(jlon.lt.1 .or. jlon.gt.720) stop 'error2'
111 
112  frac_ice_smoothed(jlon,jlat)=tsum(1)/tsum(0)
113 
114  enddo !ilon
115  enddo !ilat
116 
117  if(minval(frac_ice_smoothed).lt.0 .or. minval(frac_ice_smoothed).gt.1) stop 'frac_ice_smooth oob, pgm stopped'
118 
119  return
120  end
subroutine mk_smooth_ice_map(char_ice, frac_ice_smoothed)