80 integer (SCRIP_i4),
save ::
86 integer (SCRIP_i4),
dimension(:,:),
allocatable,
save ::
90 logical (SCRIP_logical),
save ::
93 logical (SCRIP_logical),
save ::
96 integer (SCRIP_i4),
save ::
102 integer (SCRIP_i4),
save ::
107 integer (SCRIP_i4),
dimension(:),
allocatable,
save ::
111 real (
scrip_r8),
dimension(:,:),
allocatable,
save ::
121 logical (SCRIP_logical),
save ::
124 integer (SCRIP_i4),
save ::
130 integer (SCRIP_i4),
save ::
134 integer (SCRIP_i4),
dimension(:),
allocatable,
save ::
138 real (
scrip_r8),
dimension(:,:),
allocatable,
save ::
144 real (
scrip_r8),
dimension(:),
allocatable,
save ::
148 integer (SCRIP_i4),
save ::
154 integer (SCRIP_i4),
dimension(:),
allocatable,
save ::
158 real (
scrip_r8),
dimension(:,:),
allocatable,
save ::
162 real (
scrip_r8),
dimension(:),
allocatable,
save ::
166 integer (SCRIP_i4),
save ::
171 logical (SCRIP_logical),
save ::
174 logical (SCRIP_logical),
save ::
177 logical (SCRIP_logical),
private :: is_master
180 integer (SCRIP_i4),
save ::
186 integer (SCRIP_i4),
dimension(:),
allocatable,
save ::
188 real (
scrip_r8),
dimension(:,:),
allocatable,
save ::
191 real (
scrip_r8),
dimension(:),
allocatable,
save ::
255 logical(SCRIP_Logical),
intent(in) :: l_master
257 logical(SCRIP_Logical),
intent(in) :: l_test
266 integer (SCRIP_i4),
parameter ::
270 integer (SCRIP_i4) ::
287 real (SCRIP_r8),
dimension(6) ::
299 real (SCRIP_r8),
dimension(:),
allocatable ::
317 if(is_master)print *,
'grid1 sweep'
342 if (mod(grid1_add,progint) .eq. 0 .and. is_master)
then
343 print *, grid1_add,
' of ',
grid1_size,
' cells processed ...'
360 if(is_master)print *,
'grid2 sweep '
385 if (mod(grid2_add,progint) .eq. 0 .and. is_master)
then
386 print *, grid2_add,
' of ',
grid2_size,
' cells processed ...'
409 if (phi_or_theta .eq. 1)
then
491 if(is_master)print *,
'Grid sweeps completed'
568 wts_map1(1,n) = weights(1)*norm_factor
569 wts_map1(2,n) = (weights(2) - weights(1)*
572 wts_map1(3,n) = (weights(3) - weights(1)*
646 if (
grid1_area(n) < -.01 .and. is_master)
then
663 if ((phi_or_theta .eq. 1 .and. beglon .eq. endlon) .or.
664 & (phi_or_theta .eq. 2 .and. beglat .eq. endlat)) cycle
671 ref_area(n) = ref_area(n) + weights(1)
680 if (phi_or_theta .eq. 1)
then
705 if(ref_area(n).gt.0.0)
then
706 reldiff(n) = abs(ref_area(n)-
grid1_area(n))/abs(ref_area(n))
708 ave_reldiff = ave_reldiff + reldiff(n)
709 if (reldiff(n) > max_reldiff)
then
710 max_reldiff = reldiff(n)
713 maxrd_true = ref_area(n)
719 if(is_master.and.l_test)
then
722 print *,
'Grid 1: Ave. rel. diff. in areas: ',
724 print *,
' rel. diff. = abs(area-refarea)/refarea'
726 print *,
'Grid 1: Max. rel. diff. in areas: ',
728 print *,
'Max rel. diff. is in cell ',maxrd_cell
729 print *,
'Computed Area: ', maxrd_area
730 print *,
'Reference Area: ',maxrd_true
734 deallocate(ref_area, reldiff)
746 if (
grid2_area(n) < -.01 .and. is_master)
then
763 if ((phi_or_theta .eq. 1 .and. beglon .eq. endlon) .or.
764 & (phi_or_theta .eq. 2 .and. beglat .eq. endlat)) cycle
771 ref_area(n) = ref_area(n) + weights(1)
780 if (phi_or_theta .eq. 1)
then
805 reldiff(n) = abs(ref_area(n)-
grid2_area(n))/abs(ref_area(n))
806 ave_reldiff = ave_reldiff + reldiff(n)
807 if (reldiff(n) > max_reldiff)
then
808 max_reldiff = reldiff(n)
811 maxrd_true = ref_area(n)
817 if(is_master.and.l_test)
then
819 print *,
'Grid 2: Ave. rel. diff. in areas: ',
821 print *,
' rel. diff. = abs(area-refarea)/refarea'
823 print *,
'Grid 2: Max. rel. diff. in areas: ',
825 print *,
'Max rel. diff. is in cell ',maxrd_cell
826 print *,
'Computed Area: ', maxrd_area
827 print *,
'Reference Area: ',maxrd_true
831 deallocate(ref_area,reldiff)
833 if(is_master.and.l_test)
then
834 print *,
'Computed area = Area of cell computed by adding areas'
835 print *,
' of intersection with other cells'
836 print *,
'Reference area = Area of cell by direct integration'
884 if (
wts_map2(1,n) < -.01 .and. is_master)
then
885 print *,
'Map 2 weight < 0 ',grid1_add,grid2_add,
889 & .and. is_master)
then
890 print *,
'Map 2 weight > 1 ',grid1_add,grid2_add,
903 if(icount.gt.0.and.is_master)
then
904 print *,
'We had problems in ',icount,
' points.'
953 & .and. is_master)
then
954 print *,
'Error: sum of wts for map2 ',n,
963 if(is_master)print *,
'Finished Conservative Remapping'
983 integer (SCRIP_i4) :: ibegin, iend, grid_num, phi_or_theta
985 integer (SCRIP_i4) :: cell_add
988 do cell_add = ibegin, iend
1020 integer (SCRIP_i4) ::
1033 integer (SCRIP_i4),
parameter ::
1038 integer (SCRIP_i4) ::
1064 logical (SCRIP_logical) ::
1078 & last_endpt_inpoly,
1079 & last_endpt_onedge,
1101 real (SCRIP_r8),
dimension(2) ::
1104 real (SCRIP_r8),
dimension(6) ::
1109 & vec1_lat, vec1_lon,
1110 & vec2_lat, vec2_lon,
1130 & oppcell_center_lat,
1131 & oppcell_center_lon
1133 real (SCRIP_r8),
dimension(:),
allocatable ::
1137 & oppcell_corner_lat,
1138 & oppcell_corner_lon
1140 integer (SCRIP_i4) ::
1149 integer (SCRIP_i4) ::
1155 if (grid_num .eq. 1)
then
1163 nalloc = min(ncorners + 2,
1165 allocate (cell_corner_lat(nalloc),
1166 & cell_corner_lon(nalloc))
1168 do corner = 1, ncorners
1185 nalloc_opp = ncorners_opp+2
1186 allocate (oppcell_corner_lat(nalloc_opp),
1187 & oppcell_corner_lon(nalloc_opp))
1196 nalloc = min(ncorners + 2,
1198 allocate (cell_corner_lat(nalloc),
1199 & cell_corner_lon(nalloc))
1201 do corner = 1, ncorners
1217 nalloc_opp = ncorners_opp + 2
1218 allocate (oppcell_corner_lat(nalloc_opp),
1219 & oppcell_corner_lon(nalloc_opp))
1223 if (special_cell)
then
1254 do corner = 1, ncorners
1255 next_corn = mod(corner,ncorners) + 1
1261 beglat = cell_corner_lat(corner)
1262 beglon = cell_corner_lon(corner)
1263 endlat = cell_corner_lat(next_corn)
1264 endlon = cell_corner_lon(next_corn)
1272 if ((phi_or_theta == 1 .and. endlon == beglon) .or.
1273 & (phi_or_theta == 2 .and. endlat == beglat)) cycle
1281 if ((endlat < beglat) .or.
1282 & (endlat == beglat .and. endlon < beglon))
then
1289 lrevers = .not. lrevers
1304 lrevers = .not. lrevers
1310 fullseg_dlat = endlat-beglat
1311 fullseg_dlon = endlon-beglon
1312 if (fullseg_dlon >
pi) fullseg_dlon = fullseg_dlon -
pi2
1313 if (fullseg_dlon < -
pi) fullseg_dlon = fullseg_dlon +
pi2
1314 fullseg_len2 = fullseg_dlat*fullseg_dlat +
1315 & fullseg_dlon*fullseg_dlon
1342 if (grid_num .eq. 1)
then
1343 if (adj_add .eq. 0)
then
1351 if (adj_add .eq. 0)
then
1376 last_lboundary = .false.
1377 last_endpt_inpoly = .false.
1378 last_endpt_onedge = .false.
1385 do while (beglat /= endlat .or. beglon /= endlon)
1389 if ((ns .eq. nseg) .or. (inpolar .eqv. .false.))
then
1397 endlat1 = begseg(1) + ns*(fullseg_dlat)/nseg
1398 endlon1 = begseg(2) + ns*(fullseg_dlon)/nseg
1405 do while (beglat /= endlat1 .or. beglon /= endlon1)
1414 if (partseg_len2 .ge. fullseg_len2)
then
1415 write(*,*).ge.
'partseg_len2 fullseg_len2'
1416 write(*,*)
'beglat,beglon = ',beglat,beglon
1417 write(*,*)
'endlat,endlon = ',endlat,endlon
1418 write(*,*)
'endlat1,endlon1 = ',endlat1,endlon1
1419 write(*,*)
'exiting inner do while loop'
1430 vec1_lat = endlat1-beglat
1431 vec1_lon = endlon1-beglon
1432 if (vec1_lon >
pi) vec1_lon = vec1_lon -
pi2
1433 if (vec1_lon < -
pi) vec1_lon = vec1_lon +
pi2
1434 vec1_len = sqrt(vec1_lat*vec1_lat+vec1_lon*vec1_lon)
1435 vec1_lat = vec1_lat/vec1_len
1436 vec1_lon = vec1_lon/vec1_len
1441 intrsct_success = .false.
1444 lboundary1 = .false.
1445 lboundary2 = .false.
1446 lboundary3 = .false.
1448 do while (.not. intrsct_success)
1454 srch_success = .false.
1464 do while (.not. srch_success)
1466 srchpt_lat = beglat + offset*vec1_lat
1467 srchpt_lon = beglon + offset*vec1_lon
1470 & cell_add, grid_num, opp_grid_num,
1471 & oppcell_add, lboundary1, bedgeid1)
1473 if (oppcell_add .eq. 0)
then
1479 if (oppcell_add .ne. last_add .or. lthresh)
1481 srch_success = .true.
1483 offset = offset + delta
1484 if (offset .ge. vec1_len)
then
1498 if (last_endpt_inpoly)
then
1504 oppcell_add = last_add
1505 lboundary1 = last_lboundary
1507 else if (next_add .ne. 0)
then
1513 oppcell_add = next_add
1518 srch_success = .true.
1526 if (srch_success)
then
1533 if (grid_num .eq. 1)
then
1535 do i = 1, ncorners_opp
1536 oppcell_corner_lat(i) =
1538 oppcell_corner_lon(i) =
1541 oppcell_center_lat =
1543 oppcell_center_lon =
1549 do i = 1, ncorners_opp
1550 oppcell_corner_lat(i) =
1552 oppcell_corner_lon(i) =
1555 oppcell_center_lat =
1557 oppcell_center_lon =
1563 if (special_cell)
then
1565 & oppcell_corner_lat, oppcell_corner_lon)
1573 call ptincell(endlat1,endlon1, oppcell_add,
1575 & oppcell_corner_lat,oppcell_corner_lon,
1576 & oppcell_center_lat,oppcell_center_lon,
1577 & opp_grid_num,inpoly,
1578 & lboundary2,bedgeid2)
1581 intrsct_lat = endlat1
1582 intrsct_lon = endlon1
1583 intrsct_success = .true.
1586 last_add = oppcell_add
1587 last_lboundary = lboundary2
1588 last_endpt_inpoly = .true.
1590 if (lboundary1 .and. lboundary2)
then
1598 midlat = (beglat+endlat1)/2.0
1599 if (abs(beglon-endlon1) .ge.
pi)
then
1600 midlon = (beglon+endlon1)/2.0 -
pi
1602 midlon = (beglon+endlon1)/2.0
1605 call ptincell(midlat,midlon, oppcell_add,
1607 & oppcell_corner_lat, oppcell_corner_lon,
1608 & oppcell_center_lat, oppcell_center_lon,
1609 & opp_grid_num, inpoly, lboundary3,
1612 if (inpoly .and. lboundary3)
then
1629 & beglat, beglon, endlat1, endlon1,
1632 & oppcell_add, ncorners_opp,
1633 & oppcell_corner_lat, oppcell_corner_lon,
1635 & intrsct_lat, intrsct_lon, intedge,
1636 & sinang2, lcoinc, lthresh)
1638 if (intedge /= 0)
then
1639 intrsct_success = .true.
1640 last_add = oppcell_add
1641 last_endpt_onedge = .true.
1642 last_endpt_inpoly = .false.
1643 last_lboundary = .true.
1645 if (.not. lthresh)
then
1647 & opp_grid_num,next_add)
1648 if (next_add .ne. 0)
then
1660 if (.not. intrsct_success)
then
1666 offset = offset + delta
1667 if (offset .gt. vec1_len)
then
1671 intrsct_lat = endlat1
1672 intrsct_lon = endlon1
1674 last_lboundary = .false.
1682 if (lcoinc .and. .not. bndedge
1683 & .and. intedge /= 0)
then
1693 inext = mod(i,ncorners_opp)+1
1694 vec2_lat = oppcell_corner_lat(inext) -
1695 & oppcell_corner_lat(i)
1696 vec2_lon = oppcell_corner_lon(inext) -
1697 & oppcell_corner_lon(i)
1699 if (vec2_lon >
pi) vec2_lon = vec2_lon -
pi2
1700 if (vec2_lon < -
pi) vec2_lon = vec2_lon +
pi2
1702 dp = vec1_lat*vec2_lat + vec1_lon*vec2_lon
1704 if ((.not. lrevers .and. dp .lt. 0) .or.
1705 & (lrevers .and. dp .gt. 0))
then
1713 & opp_grid_num, adj_add)
1715 if (adj_add .gt. 0)
then
1716 oppcell_add = adj_add
1718 if (grid_num .eq. 1)
then
1720 do i = 1, ncorners_opp
1721 oppcell_corner_lat(i) =
1723 oppcell_corner_lon(i) =
1726 oppcell_center_lat =
1728 oppcell_center_lon =
1735 do i = 1, ncorners_opp
1736 oppcell_corner_lat(i) =
1738 oppcell_corner_lon(i) =
1741 oppcell_center_lat =
1743 oppcell_center_lon =
1750 if (special_cell)
then
1752 & nalloc_opp, oppcell_corner_lat,
1753 & oppcell_corner_lon)
1769 if (oppcell_add .eq. 0)
then
1779 seg_outside = .false.
1780 delta = vec1_len/100.00
1782 do while (.not. srch_success)
1784 srchpt_lat = beglat + offset*vec1_lat
1785 srchpt_lon = beglon + offset*vec1_lon
1788 & cell_add, grid_num, opp_grid_num,
1789 & oppcell_add, lboundary1, bedgeid1)
1791 if (oppcell_add /= 0)
then
1792 srch_success = .true.
1802 & opp_grid_num, ncorners_opp,
1803 & oppcell_corner_lat,
1804 & oppcell_corner_lon,
1805 & oppcell_center_lat,
1806 & oppcell_center_lon,
1807 & srchpt_lat, srchpt_lon,
1809 & intrsct_lat, intrsct_lon,
1813 last_endpt_onedge = .true.
1814 next_add = oppcell_add
1815 last_lboundary = .true.
1821 offset = offset + delta
1823 if (offset .ge. vec1_len)
then
1831 seg_outside = .true.
1833 intrsct_lat = endlat1
1834 intrsct_lon = endlon1
1838 last_lboundary = .false.
1847 if (srch_success .or. seg_outside)
exit
1852 print *,
'Unable to move out of last cell'
1853 print *,
'Segment of edge ',corner,
1854 &
' of grid cell ',cell_add
1855 print *,
'Stuck in opposite grid cell ',
1858 & (endlat1-begseg(1))*(endlat1-begseg(1)) +
1859 & (endlon1-begseg(2))*(endlon1-begseg(2))
1860 print *,
'Fraction of segment left ',
1861 & vec1_len/sqrt(dist2)
1872 intrsct_lat = endlat1
1873 intrsct_lon = endlon1
1877 last_lboundary = .false.
1891 if (oppcell_add /= 0)
then
1893 & beglon, intrsct_lon, beglat, intrsct_lat,
1894 & cell_center_lat, cell_center_lon,
1895 & oppcell_center_lat, oppcell_center_lon)
1898 & beglon, intrsct_lon, beglat, intrsct_lat,
1899 & cell_center_lat, cell_center_lon,
1900 & cell_center_lat, cell_center_lon)
1917 if (grid_num .eq. 1)
then
1919 if (oppcell_add /= 0)
then
1956 rev_weights(
num_wts+i) = weights(i)
1957 rev_weights(i) = weights(
num_wts+i)
1960 if (.not. lcoinc .and. oppcell_add /= 0)
then
1996 beglat = intrsct_lat
1997 beglon = intrsct_lon
2003 vec2_lat = intrsct_lat-begseg(1)
2004 vec2_lon = intrsct_lon-begseg(2)
2005 if (vec2_lon >
pi) vec2_lon = vec2_lon -
pi2
2006 if (vec2_lon < -
pi) vec2_lon = vec2_lon +
pi2
2008 partseg_len2 = vec2_lat*vec2_lat + vec2_lon*vec2_lon
2015 num_subseg = num_subseg + 1
2016 if (num_subseg > max_subseg)
then
2018 &
'integration stalled: num_subseg exceeded limit'
2019 print *,
'Cell ',cell_add
2020 print *,
'Edge ',corner
2022 dist2 = (endlat1-begseg(1))*(endlat1-begseg(1)) +
2023 & (endlon1-begseg(2))*(endlon1-begseg(2))
2024 print *,
'Fraction of segment left ',
2025 & vec1_len/sqrt(dist2)
2045 write(*,*)
'partseg_len2,fullseg_len2 = ',
2046 & partseg_len2,fullseg_len2
2047 write(*,*)
'exiting outer do while loop'
2062 & begseg(2), endlon, begseg(1), endlat,
2085 integer (SCRIP_i4),
intent(in) ::
2090 integer (SCRIP_i4),
intent(inout) ::
2092 real (SCRIP_r8),
dimension(:),
intent(inout) ::
2093 & cell_corner_lat(nalloc),
2094 & cell_corner_lon(nalloc)
2098 integer (SCRIP_i4) ::
2137 if (ncorners .ge. nalloc)
return
2141 do corner = 1, ncorners
2142 if (abs(abs(cell_corner_lat(corner))-
pih) .le. 1.0e-05)
then
2144 pole_lat = cell_corner_lat(corner)
2145 npcorners = npcorners + 1
2150 if (npcorners .ne. 1)
return
2152 previdx = mod((pcorner-1)-1+ncorners,ncorners) + 1
2153 prevlon = cell_corner_lon(previdx)
2155 nextidx = mod(pcorner,ncorners) + 1
2156 nextlon = cell_corner_lon(nextidx)
2160 do corner = ncorners, pcorner+1, -1
2161 cell_corner_lat(corner+1) = cell_corner_lat(corner)
2162 cell_corner_lon(corner+1) = cell_corner_lon(corner)
2167 cell_corner_lat(pcorner+1) = pole_lat
2168 cell_corner_lon(pcorner+1) = nextlon
2170 ncorners = ncorners+1
2174 do corner = ncorners, pcorner, -1
2175 cell_corner_lat(corner+1) = cell_corner_lat(corner)
2176 cell_corner_lon(corner+1) = cell_corner_lon(corner)
2181 cell_corner_lat(pcorner) = pole_lat
2182 cell_corner_lon(pcorner) = prevlon
2184 ncorners = ncorners+1
2192 & beglat, beglon, endlat, endlon, begseg, begedge,
2193 & cell_id, ncorners, cell_corner_lat,
2194 & cell_corner_lon, cell_grid_id, intrsct_lat, intrsct_lon,
2195 & intedge, sinang2, lcoinc, lthresh)
2212 integer (SCRIP_i4),
intent(in) ::
2215 integer (SCRIP_i4),
intent(in) ::
2218 real (SCRIP_r8),
intent(in) ::
2222 real (SCRIP_r8),
dimension(2),
intent(inout) ::
2225 integer (SCRIP_i4),
intent(in) ::
2228 integer (SCRIP_i4),
intent(in) ::
2231 integer (SCRIP_i4),
intent(in) ::
2234 real (SCRIP_r8),
dimension(ncorners),
intent(in) ::
2238 integer (SCRIP_i4),
intent(in) ::
2248 real (SCRIP_r8),
intent(out) ::
2252 real (SCRIP_r8),
intent(out) ::
2256 integer (SCRIP_i4),
intent(out) ::
2259 logical (SCRIP_logical),
intent(out) ::
2263 logical (SCRIP_logical),
intent(out) ::
2272 integer (SCRIP_i4) ::
2275 logical (SCRIP_logical) ::
2283 & vec1_lat, vec1_lon,
2284 & vec2_lat, vec2_lon,
2285 & vec3_lat, vec3_lon,
2327 if ((lon2-lon1) >
pi)
then
2329 else if ((lon2-lon1) < -
pi)
then
2348 & cell_corner_lat,cell_corner_lon,cell_grid_id,
2349 & beglat, beglon, endlat,
2350 & endlon, begseg, begedge,
2351 & intedge,intrsct_lat,intrsct_lon,
2352 & sinang2,lcoinc,lthresh)
2359 maxdist2 = -9999999.0
2361 begsegloc(1) = begseg(1)
2362 begsegloc(2) = begseg(2)
2365 intrsct_loop:
do n=1,ncorners
2366 next_n = mod(n,ncorners) + 1
2368 grdlat1 = cell_corner_lat(n)
2369 grdlon1 = cell_corner_lon(n)
2370 grdlat2 = cell_corner_lat(next_n)
2371 grdlon2 = cell_corner_lon(next_n)
2373 lensqr2 = (grdlat1-grdlat2)*(grdlat1-grdlat2) +
2374 & (grdlon1-grdlon2)*(grdlon1-grdlon2)
2380 if (grdlon2-grdlon1 >
pi)
then
2381 grdlon2 = grdlon2 -
pi2
2382 else if (grdlon2-grdlon1 < -
pi)
then
2383 grdlon1 = grdlon1 -
pi2
2389 minlon = min(lon1,lon2)
2390 maxlon = max(grdlon1,grdlon2)
2391 if (maxlon-minlon >
pi2)
then
2392 grdlon1 = grdlon1 -
pi2
2393 grdlon2 = grdlon2 -
pi2
2395 minlon = min(grdlon1,grdlon2)
2396 maxlon = max(lon1,lon2)
2397 if (maxlon-minlon >
pi2)
then
2398 grdlon1 = grdlon1 +
pi2
2399 grdlon2 = grdlon2 +
pi2
2409 mat2 = grdlat1 - grdlat2
2411 mat4 = grdlon1 - grdlon2
2412 rhs1 = grdlat1 - lat1
2413 rhs2 = grdlon1 - lon1
2415 determ = mat1*mat4 - mat2*mat3
2432 s1 = (rhs1*mat4 - mat2*rhs2)/determ
2433 s2 = (mat1*rhs2 - rhs1*mat3)/determ
2435 if (s2 >=
zero .and. s2 <=
one .and.
2436 & s1 >
zero .and. s1 <=
one)
then
2443 if (lon2-begsegloc(2) >
pi)
then
2445 else if (lon2-begsegloc(2) < -
pi)
then
2446 begsegloc(2) = begsegloc(2) -
pi2
2453 minlon = min(begsegloc(2),lon2)
2454 maxlon = max(grdlon1,grdlon2)
2455 if (maxlon-minlon >
pi2)
then
2456 grdlon1 = grdlon1 -
pi2
2457 grdlon2 = grdlon2 -
pi2
2459 minlon = min(grdlon1,grdlon2)
2460 maxlon = max(begsegloc(2),lon2)
2461 if (maxlon-minlon >
pi2)
then
2462 grdlon1 = grdlon1 +
pi2
2463 grdlon2 = grdlon2 +
pi2
2468 mat1 = lat2 - begsegloc(1)
2469 mat3 = lon2 - begsegloc(2)
2470 rhs1 = grdlat1 - begsegloc(1)
2471 rhs2 = grdlon1 - begsegloc(2)
2473 determ = mat1*mat4 - mat2*mat3
2482 if (determ /=
zero)
then
2483 s1 = (rhs1*mat4 - mat2*rhs2)/determ
2484 s2 = (mat1*rhs2 - rhs1*mat3)/determ
2486 intrsct_lat = begsegloc(1) + mat1*s1
2487 intrsct_lon = begsegloc(2) + mat3*s1
2489 if (intrsct_lon < 0.0)
then
2490 intrsct_lon = intrsct_lon +
pi2
2491 else if (intrsct_lon >
pi2)
then
2492 intrsct_lon = intrsct_lon -
pi2
2501 max_intrsct_lat = intrsct_lat
2502 max_intrsct_lon = intrsct_lon
2504 vec1_lat = intrsct_lat-beglat
2505 vec1_lon = intrsct_lon-beglon
2506 if (vec1_lon >
pi)
then
2507 vec1_lon = vec1_lon -
pi2
2508 else if (vec1_lon < -
pi)
then
2509 vec1_lon = vec1_lon +
pi2
2512 maxdist2 = vec1_lat*vec1_lat + vec1_lon*vec1_lon
2515 denom = (mat1*mat1+mat2*mat2)*(mat3*mat3+mat4*mat4)
2516 sinang2 = determ*determ/denom
2520 vec1_lat = intrsct_lat-beglat
2521 vec1_lon = intrsct_lon-beglon
2522 if (vec1_lon >
pi)
then
2523 vec1_lon = vec1_lon -
pi2
2524 else if (vec1_lon < -
pi)
then
2525 vec1_lon = vec1_lon +
pi2
2528 dist2 = vec1_lat*vec1_lat + vec1_lon*vec1_lon
2530 if (dist2 > maxdist2)
then
2531 if (begedge .eq. 0 .or. begedge .ne. n)
then
2532 max_intrsct_lat = intrsct_lat
2533 max_intrsct_lon = intrsct_lon
2537 & (mat1*mat1+mat2*mat2)*(mat3*mat3+mat4*mat4)
2538 sinang2 = determ*determ/denom
2545 print *,
'DEBUG: zero determ'
2557 cross_product = mat2*rhs2 - mat4*rhs1
2565 if (abs(cross_product) <
tiny)
then
2567 dot_product = mat1*(-mat2) + mat3*(-mat4)
2569 lensqr1 = mat1*mat1 + mat3*mat3
2572 if (dot_product <
zero)
then
2589 vec2_lat = grdlat1 - lat1
2590 vec2_lon = grdlon1 - lon1
2591 if (vec2_lon >
pi) vec2_lon = vec2_lon -
pi2
2592 if (vec2_lon < -
pi) vec2_lon = vec2_lon +
pi2
2594 lensqr2 = vec2_lat*vec2_lat + vec2_lon*vec2_lon
2596 if (vec2_lat*mat1 + vec2_lon*mat3 < 0)
then
2600 vec3_lat = grdlat2 - lat1
2601 vec3_lon = grdlon2 - lon1
2602 if (vec3_lon >
pi) vec3_lon = vec3_lon -
pi2
2603 if (vec3_lon < -
pi) vec3_lon = vec3_lon +
pi2
2605 lensqr3 = (vec3_lat*vec3_lat+vec3_lon*vec3_lon)
2607 if (vec3_lat*mat1 + vec3_lon*mat3 < 0)
then
2613 if (lensqr2 > 0)
then
2614 if (lensqr2 <= lensqr1)
then
2615 intrsct_lat = grdlat1
2616 intrsct_lon = grdlon1
2620 if (lensqr3 > 0)
then
2621 if (lensqr3 > lensqr1)
then
2626 intrsct_lat = grdlat2
2627 intrsct_lon = grdlon2
2635 dist2 = (intrsct_lat-beglat)*(intrsct_lat-beglat)+
2636 & (intrsct_lon-beglon)*(intrsct_lon-beglon)
2640 max_intrsct_lat = intrsct_lat
2641 max_intrsct_lon = intrsct_lon
2658 begsegloc(2) = begseg(2)
2659 if ((lon2-lon1) >
pi)
then
2661 else if ((lon2-lon1) < -
pi)
then
2667 if (intedge .eq. 0)
then
2674 intrsct_lat = max_intrsct_lat
2675 intrsct_lon = max_intrsct_lon
2694 mat1 = lat2 - begsegloc(1)
2695 mat3 = lon2 - begsegloc(2)
2696 s1 = (intrsct_lat - begsegloc(1))/mat1
2697 intrsct_lon = begsegloc(2) + s1*mat3
2702 mat1 = lat2 - begsegloc(1)
2703 mat3 = lon2 - begsegloc(2)
2704 s1 = (intrsct_lat - begsegloc(1))/mat1
2705 intrsct_lon = begsegloc(2) + s1*mat3
2709 if (intrsct_lon < 0.0)
then
2710 intrsct_lon = intrsct_lon +
pi2
2711 else if (intrsct_lon >
pi2)
then
2712 intrsct_lon = intrsct_lon -
pi2
2724 & cell_corners_lat,cell_corners_lon,cell_grid_id,
2725 & beglat, beglon, endlat, endlon, begseg, begedge,
2726 & intedge, intrsct_lat, intrsct_lon,
2727 & sinang2, lcoinc, lthresh)
2748 integer (SCRIP_i4),
intent(in) ::
2751 integer (SCRIP_i4),
intent(in) ::
2754 real (SCRIP_r8),
dimension(ncorners),
intent(in) ::
2758 integer (SCRIP_i4),
intent(in) ::
2761 real (SCRIP_r8),
intent(in) ::
2765 real (SCRIP_r8),
dimension(2),
intent(inout) ::
2768 integer (SCRIP_i4),
intent(in) ::
2778 integer (SCRIP_i4),
intent(out) ::
2781 real (SCRIP_r8),
intent(out) ::
2785 real (SCRIP_r8),
intent(out) ::
2789 logical (SCRIP_logical),
intent(out) ::
2793 logical (SCRIP_logical),
intent(inout) ::
2803 integer (SCRIP_i4) ::
2804 & n, n1, next_n, prev_n,
2809 logical (SCRIP_logical) ::
2824 & vec1_lat, vec1_lon,
2825 & vec2_lat, vec2_lon,
2834 & intrsct_x, intrsct_y,
2852 real (SCRIP_r8),
dimension(npseg*ncorners) ::
2853 & cell_corners_lat_loc,
2854 & cell_corners_lon_loc
2864 max_intrsct_lat =
pi
2865 max_intrsct_lon = 4*
pi
2869 maxdist2 = -999999.00
2879 if (beglat >
zero)
then
2887 x1 = rns*
two*sin(pi4 -
half*beglat)*cos(beglon)
2888 y1 =
two*sin(pi4 -
half*beglat)*sin(beglon)
2889 x2 = rns*
two*sin(pi4 -
half*endlat)*cos(endlon)
2890 y2 =
two*sin(pi4 -
half*endlat)*sin(endlon)
2905 if (abs(x1) .le.
tiny .and. abs(y1) .le.
tiny .and.
2906 & abs(x2) .le.
tiny .and. abs(y2) .le.
tiny)
then
2917 intrsct_loop1:
do n = 1, ncorners
2918 next_n = mod(n,ncorners) + 1
2920 grdlat1 = cell_corners_lat(n)
2921 grdlon1 = cell_corners_lon(n)
2922 grdlat2 = cell_corners_lat(next_n)
2923 grdlon2 = cell_corners_lon(next_n)
2924 grdx1 = rns*
two*sin(pi4 -
half*grdlat1)*cos(grdlon1)
2925 grdy1 =
two*sin(pi4 -
half*grdlat1)*sin(grdlon1)
2926 grdx2 = rns*
two*sin(pi4 -
half*grdlat2)*cos(grdlon2)
2927 grdy2 =
two*sin(pi4 -
half*grdlat2)*sin(grdlon2)
2929 if (abs(grdx1) .le.
tiny .and. abs(grdy1) .le.
tiny .and.
2930 & abs(grdx2) .le.
tiny .and. abs(grdy2) .le.
tiny)
then
2936 vec1_lon = endlon-beglon
2937 if (vec1_lon .gt.
pi) vec1_lon = vec1_lon -
pi2
2938 if (vec1_lon .lt. -
pi) vec1_lon = vec1_lon +
pi2
2940 vec2_lon = grdlon2-grdlon1
2941 if (vec2_lon .gt.
pi) vec2_lon = vec2_lon -
pi2
2942 if (vec2_lon .lt. -
pi) vec2_lon = vec2_lon +
pi2
2944 if (vec1_lon*vec2_lon .lt. 0)
then
2956 vec2_lon = grdlon1 - beglon
2957 if (vec2_lon .gt.
pi) vec2_lon = vec2_lon -
pi2
2958 if (vec2_lon .lt. -
pi) vec2_lon = vec2_lon +
pi2
2960 vec3_lon = grdlon2 - beglon
2961 if (vec3_lon .gt.
pi) vec3_lon = vec3_lon -
pi2
2962 if (vec3_lon .lt. -
pi) vec3_lon = vec3_lon +
pi2
2966 if (vec2_lon*vec1_lon > 0)
then
2967 if (abs(vec3_lon) < abs(vec1_lon))
then
2968 intrsct_lon = grdlon2
2970 else if (abs(vec2_lon) < abs(vec1_lon))
then
2971 intrsct_lon = grdlon1
2975 if (vec3_lon*vec1_lon > 0)
then
2976 if (abs(vec3_lon) < abs(vec1_lon))
then
2977 intrsct_lon = grdlon2
2985 intrsct_lat = endlat
2994 end do intrsct_loop1
3013 do n = ncorners, 1, -1
3015 n1 = mod(n,ncorners)+1
3016 cell_corners_lat_loc(i) = cell_corners_lat(n1)
3017 cell_corners_lon_loc(i) = cell_corners_lon(n1)
3020 if (prev_n .eq. 0) prev_n = ncorners
3023 vec1_lat = cell_corners_lat(prev_n)-cell_corners_lat(n1)
3024 vec1_lon = cell_corners_lon(prev_n)-cell_corners_lon(n1)
3025 if (vec1_lon >
pi)
then
3026 vec1_lon = vec1_lon -
pi2
3027 else if (vec1_lon < -
pi)
then
3028 vec1_lon = vec1_lon +
pi2
3033 cell_corners_lat_loc(i) =
3034 & cell_corners_lat(n1) + j*vec1_lat/
npseg
3035 cell_corners_lon_loc(i) =
3036 & cell_corners_lon(n1) + j*vec1_lon/
npseg
3040 ncorners2 =
npseg*ncorners
3049 intrsct_loop2:
do n= 1, ncorners2
3051 next_n = mod(n,ncorners2) + 1
3053 grdlat1 = cell_corners_lat_loc(n)
3054 grdlon1 = cell_corners_lon_loc(n)
3055 grdlat2 = cell_corners_lat_loc(next_n)
3056 grdlon2 = cell_corners_lon_loc(next_n)
3057 grdx1 = rns*
two*sin(pi4 -
half*grdlat1)*cos(grdlon1)
3058 grdy1 =
two*sin(pi4 -
half*grdlat1)*sin(grdlon1)
3059 grdx2 = rns*
two*sin(pi4 -
half*grdlat2)*cos(grdlon2)
3060 grdy2 =
two*sin(pi4 -
half*grdlat2)*sin(grdlon2)
3062 if ((grdx1-grdx2)*(grdx1-grdx2)+(grdy1-grdy2)*(grdy1-grdy2) .le.
3071 mat2 = grdx1 - grdx2
3073 mat4 = grdy1 - grdy2
3077 determ = mat1*mat4 - mat2*mat3
3091 if (abs(determ) > 1.e-30)
then
3093 s1 = (rhs1*mat4 - mat2*rhs2)/determ
3094 s2 = (mat1*rhs2 - rhs1*mat3)/determ
3096 if (s2 >=
zero .and. s2 <=
one .and.
3097 & s1 >
tiny .and. s1 <=
one)
then
3099 intrsct_x = x1 + s1*mat1
3100 intrsct_y = y1 + s1*mat3
3106 if (abs(intrsct_x) .gt.
tiny .or.
3107 & abs(intrsct_y) .gt.
tiny)
then
3109 intrsct_lon = rns*atan2(intrsct_y,intrsct_x)
3119 if (abs(abs(grdlat1)-
pih) .lt. 1e-5 .and.
3120 & abs(abs(grdlat2)-
pih) .lt. 1e-5)
then
3125 vec1_lat = grdlat1-beglat
3126 vec1_lon = grdlon1-beglon
3127 if (vec1_lon >
pi)
then
3128 vec1_lon = vec1_lon -
pi2
3129 else if (vec1_lon < -
pi)
then
3130 vec1_lon = vec1_lon +
pi2
3132 dist2 = vec1_lat*vec1_lat + vec1_lon*vec1_lon
3134 vec2_lat = grdlat2-beglat
3135 vec2_lon = grdlon2-beglon
3136 if (vec2_lon >
pi)
then
3137 vec2_lon = vec2_lon -
pi2
3138 else if (vec2_lon < -
pi)
then
3139 vec2_lon = vec2_lon +
pi2
3145 if ((vec1_lat*vec1_lat + vec1_lon*vec1_lon) .ge.
3146 & (vec2_lat*vec2_lat + vec2_lon*vec2_lon))
then
3147 intrsct_lon = grdlon1
3149 intrsct_lon = grdlon2
3152 else if (abs(abs(grdlat1)-
pih) .lt. 1e-5)
then
3153 intrsct_lon = grdlon1
3154 else if (abs(abs(grdlat2)-
pih) .lt. 1e-5)
then
3155 intrsct_lon = grdlon2
3161 vec1_lon = endlon-intrsct_lon
3162 if (vec1_lon >
pi)
then
3163 vec1_lon = vec1_lon -
pi2
3164 else if (vec1_lon < -
pi)
then
3165 vec1_lon = vec1_lon +
pi2
3168 vec2_lon = beglon-intrsct_lon
3169 if (vec2_lon >
pi)
then
3170 vec2_lon = vec2_lon -
pi2
3171 else if (vec2_lon < -
pi)
then
3172 vec2_lon = vec2_lon +
pi2
3179 if (vec1_lon*vec2_lon > 0) cycle
3183 if (intrsct_lon <
zero)
3184 & intrsct_lon = intrsct_lon +
pi2
3186 if (abs(intrsct_x) > 1.d-10)
then
3187 intrsct_lat = (pi4 -
3188 & asin(rns*
half*intrsct_x/cos(intrsct_lon)))*
two
3190 & asin(sqrt(intrsct_x*intrsct_x+intrsct_y*intrsct_y)/2.))
3191 else if (abs(intrsct_y) > 1.d-10)
then
3192 intrsct_lat = (pi4 -
3193 & asin(
half*intrsct_y/sin(intrsct_lon)))*
two
3195 & asin(sqrt(intrsct_x*intrsct_x+intrsct_y*intrsct_y)/2.))
3197 intrsct_lat =
two*pi4
3210 intedge1 = (n-1)/
npseg + 1
3211 intedge1 = ncorners - intedge1 + 1
3213 if (intedge1 .ne. begedge)
then
3215 max_intrsct_lat = intrsct_lat
3216 max_intrsct_lon = intrsct_lon
3218 vec1_lat = intrsct_lat-beglat
3219 vec1_lon = intrsct_lon-beglon
3220 if (vec1_lon >
pi)
then
3221 vec1_lon = vec1_lon -
pi2
3222 else if (vec1_lon < -
pi)
then
3223 vec1_lon = vec1_lon +
pi2
3225 maxdist2 = vec1_lat*vec1_lat + vec1_lon*vec1_lon
3228 denom = (mat1*mat1+mat2*mat2)*(mat3*mat3+mat4*mat4)
3229 sinang2 = determ*determ/denom
3236 vec1_lat = intrsct_lat-beglat
3237 vec1_lon = intrsct_lon-beglon
3238 if (vec1_lon >
pi)
then
3239 vec1_lon = vec1_lon -
pi2
3240 else if (vec1_lon < -
pi)
then
3241 vec1_lon = vec1_lon +
pi2
3243 dist2 = vec1_lat*vec1_lat + vec1_lon*vec1_lon
3252 intedge1 = (n-1)/
npseg + 1
3253 intedge1 = ncorners - intedge1 + 1
3255 if (dist2 > maxdist2)
then
3256 if (begedge == 0 .or. intedge1 .ne. begedge)
then
3257 max_intrsct_lat = intrsct_lat
3258 max_intrsct_lon = intrsct_lon
3262 & (mat1*mat1+mat2*mat2)*(mat3*mat3+mat4*mat4)
3263 sinang2 = determ*determ/denom
3276 cross_product = mat2*rhs2 - mat4*rhs1
3278 if (abs(cross_product) <
tiny)
then
3280 dot_product = mat1*(-mat2) + mat3*(-mat4)
3287 lensqr1 = mat1*mat1 + mat3*mat3
3290 if (dot_product <
zero)
then
3308 lensqr2 = vec2_x*vec2_x + vec2_y*vec2_y
3309 if (vec2_x*mat1+vec2_y*mat3 < 0)
then
3316 lensqr3 = (vec3_x*vec3_x+vec3_y*vec3_y)
3317 if (vec3_x*mat1+vec3_y*mat3 < 0)
then
3323 if (lensqr2 > 0)
then
3324 if (lensqr2 <= lensqr1)
then
3327 intrsct_lat = grdlat1
3328 intrsct_lon = grdlon1
3332 if (lensqr3 > 0)
then
3333 if (lensqr3 > lensqr1)
then
3336 intrsct_lat = endlat
3337 intrsct_lon = endlon
3342 intrsct_lat = grdlat2
3343 intrsct_lon = grdlon2
3350 dist2 = (intrsct_lat-beglat)*(intrsct_lat-beglat)+
3351 & (intrsct_lon-beglon)*(intrsct_lon-beglon)
3357 max_intrsct_lat = intrsct_lat
3358 max_intrsct_lon = intrsct_lon
3361 intedge = (n-1)/
npseg + 1
3362 intedge = ncorners - intedge + 1
3374 end do intrsct_loop2
3380 intrsct_lat = max_intrsct_lat
3381 intrsct_lon = max_intrsct_lon
3392 if (abs(intrsct_x) < 1.e-10 .and. abs(intrsct_y) < 1.e-10 .and.
3393 & (x2 /=
zero .and. y2 /=0))
then
3399 cross_product = x1*(y2-y1) - y1*(x2-x1)
3400 intrsct_lat = beglat
3401 if (cross_product*intrsct_lat >
zero)
then
3427 mat4 = endlat - begseg(1)
3428 mat3 = endlon - begseg(2)
3429 if (mat3 >
pi) mat3 = mat3 -
pi2
3430 if (mat3 < -
pi) mat3 = mat3 +
pi2
3434 intrsct_lon = begseg(2) + s1*mat3
3437 mat4 = endlat - begseg(1)
3438 mat3 = endlon - begseg(2)
3439 if (mat3 >
pi) mat3 = mat3 -
pi2
3440 if (mat3 < -
pi) mat3 = mat3 +
pi2
3444 intrsct_lon = begseg(2) + s1*mat3
3458 & in_phi1, in_phi2, theta1, theta2,
3459 & grid1_lat, grid1_lon, grid2_lat, grid2_lon)
3475 integer (SCRIP_i4),
intent(in) ::
3478 integer (SCRIP_i4),
intent(in) ::
3481 real (SCRIP_r8),
intent(in) ::
3484 & grid1_lat, grid1_lon,
3485 & grid2_lat, grid2_lon
3493 real (SCRIP_r8),
dimension(2*num_wts),
intent(out) ::
3498 if (phi_or_theta .eq. 1) then
3499 call line_integral_phi(weights, num_wts, in_phi1, in_phi2,
3500 & theta1, theta2, grid1_lat, grid1_lon,
3501 & grid2_lat, grid2_lon)
3503 call line_integral_theta(weights, num_wts,in_phi1,in_phi2,
3504 & theta1, theta2, grid1_lat, grid1_lon,
3505 & grid2_lat, grid2_lon)
3520 & in_phi1, in_phi2, theta1, theta2,
3521 & grid1_lat, grid1_lon, grid2_lat, grid2_lon)
3537 integer (SCRIP_i4),
intent(in) ::
3540 real (SCRIP_r8),
intent(in) ::
3543 & grid1_lat, grid1_lon,
3544 & grid2_lat, grid2_lon
3552 real (SCRIP_r8),
dimension(2*num_wts),
intent(out) ::
3561 real (SCRIP_r8) :: dphi, sinth1, sinth2, costh1, costh2, fac,
3563 real (SCRIP_r8) :: f1, f2, fint
3575 sinth1 = sin(theta1)
3576 sinth2 = sin(theta2)
3577 costh1 = cos(theta1)
3578 costh2 = cos(theta2)
3580 dphi = in_phi1 - in_phi2
3583 else if (dphi < -
pi)
then
3595 weights( 1) = dphi*(sinth1 + sinth2)
3596 write(401,*)weights(1),
' % A'
3597 weights(num_wts+1) = dphi*(sinth1 + sinth2)
3598 weights( 2) = dphi*(costh1 + costh2 + (theta1*sinth1 +
3600 weights(num_wts+2) = dphi*(costh1 + costh2 + (theta1*sinth1 +
3610 f1 =
half*(costh1*sinth1 + theta1)
3611 f2 =
half*(costh2*sinth2 + theta2)
3613 phi1 = in_phi1 - grid1_lon
3616 else if (phi1 < -
pi)
then
3620 phi2 = in_phi2 - grid1_lon
3623 else if (phi2 < -
pi)
then
3627 if ((phi2-phi1) <
pi .and. (phi2-phi1) > -
pi)
then
3628 weights(3) = dphi*(phi1*f1 + phi2*f2)
3630 if (phi1 >
zero)
then
3635 fint = f1 + (f2-f1)*(fac-phi1)/abs(dphi)
3636 weights(3) =
half*phi1*(phi1-fac)*f1 -
3637 &
half*phi2*(phi2+fac)*f2 +
3638 &
half*fac*(phi1+phi2)*fint
3641 phi1 = in_phi1 - grid2_lon
3644 else if (phi1 < -
pi)
then
3648 phi2 = in_phi2 - grid2_lon
3651 else if (phi2 < -
pi)
then
3655 if ((phi2-phi1) <
pi .and. (phi2-phi1) > -
pi)
then
3656 weights(num_wts+3) = dphi*(phi1*f1 + phi2*f2)
3658 if (phi1 >
zero)
then
3663 fint = f1 + (f2-f1)*(fac-phi1)/abs(dphi)
3664 weights(num_wts+3) =
half*phi1*(phi1-fac)*f1 -
3665 &
half*phi2*(phi2+fac)*f2 +
3666 &
half*fac*(phi1+phi2)*fint
3680 & in_phi1, in_phi2, theta1, theta2,
3681 & grid1_lat, grid1_lon, grid2_lat, grid2_lon)
3698 integer (SCRIP_i4),
intent(in) ::
3701 real (SCRIP_r8),
intent(in) ::
3704 & grid1_lat, grid1_lon,
3705 & grid2_lat, grid2_lon
3713 real (SCRIP_r8),
dimension(2*num_wts),
intent(out) ::
3722 real (SCRIP_r8) :: dtheta, dtheta2, costh1, costh2, costhpi,
3723 & phi1, phi2, theta_pi, f1, f2, fpi,
3724 & fm, costhm, part1, part2
3733 costh1 = cos(theta1)
3734 costh2 = cos(theta2)
3735 costhm = cos(
half*(theta1+theta2))
3737 dtheta = theta2 - theta1
3738 dtheta2 =
half*dtheta
3771 phi1 = in_phi1 - grid1_lon
3774 else if (phi1 < -
pi)
then
3778 phi2 = in_phi2 - grid1_lon
3781 else if (phi2 < -
pi)
then
3788 if ((phi2-phi1) <
pi .and. (phi2-phi1) > -
pi)
then
3790 fm =
half*(phi1+phi2)*costhm
3792 weights(1) = dtheta*(f1 + 4*fm + f2)/6.0
3795 weights(2) = dtheta2*(theta1*f1 + theta2*f2)
3797 weights(3) =
half*dtheta2*(f1*f1 + f2*f2)
3800 if (phi1 >
zero)
then
3803 theta_pi = theta1 + (
pi - phi1)*dtheta/(phi2 +
pi2 - phi1)
3809 costhpi = cos(theta_pi)
3812 fm =
half*(phi1+
pi)*cos(
half*(theta1+theta_pi))
3813 part1 = (theta_pi - theta1)*(f1 + 4*fm + fpi)/6.0
3815 fm =
half*(phi2-
pi)*cos(
half*(theta1+theta_pi))
3816 part2 = 0.5*(theta2 - theta_pi)*(-fpi + 4*fm + f2)/6.0
3818 weights(1) = part1 + part2
3821 part1 = 0.5*(theta_pi - theta1)*(theta1*f1 + theta_pi*fpi)
3822 part2 = 0.5*(theta2 - theta_pi)*(-theta_pi*fpi + theta2*f2)
3823 weights(2) = part1 + part2
3829 theta_pi = theta1 + (-
pi - phi1)*dtheta/(phi2 -
pi2 - phi1)
3835 costhpi = cos(theta_pi)
3838 fm =
half*(phi1-
pi)*cos(
half*(theta1+theta_pi))
3839 part1 = 0.5*(theta_pi - theta1)*(f1 + 4*fm - fpi)/6.0
3841 fm =
half*(
pi+phi2)*cos(
half*(theta2+theta_pi))
3842 part2 = 0.5*(theta2 - theta_pi)*(fpi + 4*fm + f2)/6.0
3843 weights(1) = part1 + part2
3846 part1 = 0.5*(theta_pi - theta1)*(theta1*f1 - theta_pi*fpi)
3847 part2 = 0.5*(theta2 - theta_pi)*(theta_pi*fpi + theta2*f2)
3848 weights(2) = part1 + part2
3853 part1 = 0.25*(theta_pi - theta1)*(f1*f1 + fpi*fpi)
3854 part2 = 0.25*(theta2 - theta_pi)*(fpi*fpi + f2*f2)
3855 weights(3) = part1 + part2
3860 phi1 = in_phi1 - grid2_lon
3863 else if (phi1 < -
pi)
then
3867 phi2 = in_phi2 - grid2_lon
3870 else if (phi2 < -
pi)
then
3878 if ((phi2-phi1) <
pi .and. (phi2-phi1) > -
pi)
then
3880 fm =
half*(phi1+phi2)*costhm
3882 weights(num_wts+1) = dtheta2*(f1 + f2)
3884 weights(num_wts+2) = dtheta2*(theta1*f1 + theta2*f2)
3886 weights(num_wts+3) =
half*dtheta2*(f1*f1 + f2*f2)
3889 if (phi1 >
zero)
then
3891 theta_pi = theta1 + (
pi - phi1)*dtheta/(phi2 +
pi2 - phi1)
3897 costhpi = cos(theta_pi)
3900 fm =
half*(phi1+
pi)*cos(
half*(theta1+theta_pi))
3901 part1 = (theta_pi - theta1)*(f1 + 4*fm + fpi)/6.0
3903 fm =
half*(-
pi+phi2)*cos(
half*(theta2+theta_pi))
3904 part2 = (theta2 - theta_pi)*(-fpi + 4*fm + f2)/6.0
3905 weights(num_wts+1) = part1 + part2
3907 part1 = 0.5*(theta_pi - theta1)*(theta1*f1 + theta_pi*fpi)
3908 part2 = 0.5*(theta2 - theta_pi)*(-theta_pi*fpi + theta2*f2)
3909 weights(num_wts+2) = part1 + part2
3914 theta_pi = theta1 + (-
pi - phi1)*dtheta/(phi2 -
pi2 - phi1)
3920 costhpi = cos(theta_pi)
3923 fm =
half*(phi1-
pi)*cos(
half*(theta1+theta_pi))
3924 part1 = (theta_pi - theta1)*(f1 +4*fm - fpi)/6.0
3926 fm =
half*(phi2+
pi)*cos(
half*(theta2+theta_pi))
3927 part2 = 0.5*(theta2 - theta_pi)*(fpi + 4*fm + f2)/6.0
3928 weights(num_wts+1) = part1 + part2
3930 part1 = 0.5*(theta_pi - theta1)*(theta1*f1 - theta_pi*fpi)
3931 part2 = 0.5*(theta2 - theta_pi)*(theta_pi*fpi + theta2*f2)
3932 weights(num_wts+2) = part1 + part2
3936 part1 = 0.25*(theta_pi - theta1)*(f1*f1 + fpi*fpi)
3937 part2 = 0.25*(theta2 - theta_pi)*(fpi*fpi + f2*f2)
3938 weights(num_wts+3) = part1 + part2
3966 integer (SCRIP_i4),
intent(in) ::
3970 real (SCRIP_r8),
dimension(:),
intent(in) ::
3979 integer (SCRIP_i4) :: nlink, min_link, max_link
3981 logical (SCRIP_logical) :: found
3990 if (all(weights ==
zero))
return
4012 if (min_link == 0)
then
4028 do nlink=min_link,max_link
4094 & beglat, beglon, endlat, endlon, offset,
4095 & srch_grid_num, cont_cell, lboundary, edgeid)
4111 real (SCRIP_r8),
intent(in) ::
4115 real (SCRIP_r8),
intent(in) ::
4118 integer (SCRIP_i4),
intent(in) ::
4123 integer (SCRIP_i4),
intent(in) ::
4135 integer (SCRIP_i4),
intent(out) ::
4138 logical (SCRIP_logical),
intent(out) ::
4142 integer (SCRIP_i4),
intent(out) ::
4152 integer (SCRIP_i4) :: i, j, k, n, ic
4153 integer (SCRIP_i4) :: whichpole, srch_cell_add,
4154 & grid1_add, grid2_add, min_add, max_add
4156 real (SCRIP_r8),
dimension(:),
allocatable ::
4157 & cell_corner_x, cell_corner_y
4159 logical (SCRIP_logical) :: inpoly, latlon
4162 & vec1_x, vec1_y, vec1_lenx, vec1_lat, vec1_lon, vec1_len,
4163 & begx, begy, endx, endy, ptx, pty, rns, pi4, ptlat, ptlon,
4164 & lat, lon, cell_center_x, cell_center_y
4234 vec1_lat = endlat-beglat
4235 vec1_lon = endlon-beglon
4236 if (vec1_lon >
pi)
then
4237 vec1_lon = vec1_lon -
pi2
4238 else if (vec1_lon < -
pi)
then
4239 vec1_lon = vec1_lon +
pi2
4241 vec1_len = sqrt(vec1_lat*vec1_lat+vec1_lon*vec1_lon)
4242 vec1_lat = vec1_lat/vec1_len
4243 vec1_lon = vec1_lon/vec1_len
4245 ptlat = beglat + offset*vec1_lat
4246 ptlon = beglon + offset*vec1_lon
4254 if (ptlat >
zero)
then
4263 begx = rns*
two*sin(pi4 -
half*beglat)*cos(beglon)
4264 begy =
two*sin(pi4 -
half*beglat)*sin(beglon)
4265 endx = rns*
two*sin(pi4 -
half*endlat)*cos(endlon)
4266 endy =
two*sin(pi4 -
half*endlat)*sin(endlon)
4271 vec1_lenx = sqrt(vec1_x*vec1_x + vec1_y*vec1_y)
4272 vec1_x = vec1_x/vec1_lenx
4273 vec1_y = vec1_y/vec1_lenx
4281 ptx = begx + offset*vec1_x
4282 pty = begy + offset*vec1_y
4302 cell_corner_x(k) = rns*
two*sin(pi4-
half*lat)*cos(lon)
4303 cell_corner_y(k) =
two*sin(pi4-
half*lat)*sin(lon)
4313 if (vec1_lon >
pi)
then
4314 vec1_lon = vec1_lon -
pi2
4315 else if (vec1_lon < -
pi)
then
4316 vec1_lon = vec1_lon +
pi2
4322 & + j*vec1_lat/
npseg
4324 & + j*vec1_lon/
npseg
4325 cell_corner_x(k) = rns*
two*sin(pi4-
half*lat)*cos(lon)
4326 cell_corner_y(k) =
two*sin(pi4-
half*lat)*sin(lon)
4332 & cell_corner_y, latlon, inpoly, lboundary, edgeid)
4335 edgeid = (edgeid-1)/
npseg + 1
4339 deallocate(cell_corner_x, cell_corner_y)
4346 if (srch_grid_num .eq. 1 .and.
4354 & latlon, whichpole, inpoly, lboundary, edgeid)
4356 else if (srch_grid_num .eq. 1 .and.
4364 & latlon, whichpole, inpoly, lboundary, edgeid)
4366 else if (srch_grid_num .eq. 2 .and.
4374 & latlon, whichpole, inpoly, lboundary, edgeid)
4376 else if (srch_grid_num .eq. 2 .and.
4384 & latlon, whichpole, inpoly, lboundary, edgeid)
4395 & latlon, inpoly, lboundary, edgeid)
4402 cont_cell = srch_cell_add
4421 subroutine locate_point(ptlat, ptlon, cell, cell_grid_num,
4422 & srch_grid_num, cont_cell, lboundary, edgeid)
4438 real (SCRIP_r8),
intent(in) ::
4441 integer (SCRIP_i4),
intent(in) ::
4446 integer (SCRIP_i4),
intent(in) ::
4458 integer (SCRIP_i4),
intent(out) ::
4461 logical (SCRIP_logical),
intent(out) ::
4465 integer (SCRIP_i4),
intent(out) ::
4475 integer (SCRIP_i4) :: i, j, n, ic
4476 integer (SCRIP_i4) :: whichpole, srch_cell_add,
4477 & grid1_add, grid2_add, min_add, max_add,
4478 & previdx, nextidx, pcorner, corner,
4481 real (SCRIP_r8),
dimension(:),
allocatable ::
4493 logical (SCRIP_logical) :: inpoly, latlon
4494 logical (SCRIP_logical) :: test
4541 allocate(cell_corner_lat(nalloc),
4542 & cell_corner_lon(nalloc))
4564 if (srch_grid_num .eq. 1)
then
4579 call ptincell(ptlat, ptlon, srch_cell_add, ncorners,
4580 & cell_corner_lat, cell_corner_lon,
4581 & cell_center_lat, cell_center_lon,
4582 & srch_grid_num, inpoly, lboundary, edgeid)
4586 cont_cell = srch_cell_add
4604 subroutine ptincell(ptlat, ptlon, cell_add, ncorners,
4605 & cell_corner_lat, cell_corner_lon,
4606 & cell_center_lat, cell_center_lon,
4607 & cell_grid_id, inpoly, lboundary, edgeid)
4619 real (SCRIP_r8),
intent(in) ::
4622 integer (SCRIP_i4),
intent(in) ::
4625 integer (SCRIP_i4),
intent(in) ::
4628 real (SCRIP_r8),
dimension(ncorners),
intent(in) ::
4629 & cell_corner_lat, cell_corner_lon
4631 real (SCRIP_r8),
intent(in) ::
4635 integer (SCRIP_i4),
intent(in) ::
4647 logical (SCRIP_logical),
intent(out) ::
4650 logical (SCRIP_logical),
intent(out) ::
4654 integer (SCRIP_i4),
intent(out) ::
4663 integer (SCRIP_i4) :: i, j, k, ic
4664 integer (SCRIP_i4) :: whichpole
4666 real (SCRIP_r8) :: rns, pi4, ptx, pty, lat, lon,
4667 & cell_center_x, cell_center_y, vec1_lat, vec1_lon
4669 logical (SCRIP_logical) ::
4672 real (kind=scrip_r8),
dimension(npseg*ncorners) ::
4693 if (ptlat >
zero)
then
4701 ptx = rns*
two*sin(pi4 -
half*ptlat)*cos(ptlon)
4702 pty =
two*sin(pi4 -
half*ptlat)*sin(ptlon)
4714 do i = ncorners, 1, -1
4716 lat = cell_corner_lat(i)
4717 lon = cell_corner_lon(i)
4718 cell_corner_x(k) = rns*
two*sin(pi4-
half*lat)*cos(lon)
4719 cell_corner_y(k) =
two*sin(pi4-
half*lat)*sin(lon)
4722 if (j .eq. 0) j = ncorners
4724 vec1_lat = cell_corner_lat(j)-cell_corner_lat(i)
4725 vec1_lon = cell_corner_lon(j)-cell_corner_lon(i)
4726 if (vec1_lon >
pi)
then
4727 vec1_lon = vec1_lon -
pi2
4728 else if (vec1_lon < -
pi)
then
4729 vec1_lon = vec1_lon +
pi2
4734 lat = cell_corner_lat(i) + j*vec1_lat/
npseg
4735 lon = cell_corner_lon(i) + j*vec1_lon/
npseg
4736 cell_corner_x(k) = rns*
two*sin(pi4-
half*lat)*cos(lon)
4737 cell_corner_y(k) =
two*sin(pi4-
half*lat)*sin(lon)
4745 & cell_corner_y, latlon, inpoly, lboundary, edgeid)
4748 edgeid = (edgeid-1)/
npseg + 1
4757 if (cell_grid_id .eq. 1 .and.
4762 & cell_corner_lat, cell_corner_lon,
4763 & latlon, whichpole, inpoly, lboundary, edgeid)
4765 else if (cell_grid_id .eq. 1 .and.
4770 & cell_corner_lat, cell_corner_lon,
4771 & latlon, whichpole, inpoly, lboundary, edgeid)
4773 else if (cell_grid_id .eq. 2 .and.
4778 & cell_corner_lat, cell_corner_lon,
4779 & latlon, whichpole, inpoly, lboundary, edgeid)
4781 else if (cell_grid_id .eq. 2 .and.
4786 & cell_corner_lat, cell_corner_lon,
4787 & latlon, whichpole, inpoly, lboundary, edgeid)
4795 call ptinpoly(ptlat, ptlon, ncorners,
4796 & cell_corner_lat, cell_corner_lon,
4797 & latlon, inpoly, lboundary, edgeid)
4813 subroutine ptinpoly(ptx, pty, ncorners, cell_corner_x,
4814 & cell_corner_y, latlon, inpoly, lboundary, edgeid)
4830 real (SCRIP_r8),
intent(in) ::
4833 integer (SCRIP_i4),
intent(in) ::
4836 real (SCRIP_r8),
dimension(ncorners),
intent(in) ::
4840 logical (SCRIP_logical),
intent(in) ::
4849 logical (SCRIP_logical),
intent(out) ::
4852 logical (SCRIP_logical),
intent(out) ::
4855 integer (SCRIP_i4),
intent(out) ::
4865 integer (SCRIP_i4) :: n, next_n
4867 real (SCRIP_r8) :: x1, y1, x2, y2, vec1_x, vec1_y, vec2_x, vec2_y,
4868 & cross_product, minlon, maxlon, ptx_loc, pty_loc
4870 real (SCRIP_r8),
dimension(ncorners) ::
4871 & cell_corner_lat_loc, cell_corner_lon_loc
4891 if (.not. latlon)
then
4894 next_n = mod(n,ncorners) + 1
4896 x1 = cell_corner_x(n)
4897 y1 = cell_corner_y(n)
4898 x2 = cell_corner_x(next_n)
4899 y2 = cell_corner_y(next_n)
4906 cross_product = vec1_y*vec2_x - vec2_y*vec1_x
4915 if (abs(cross_product) <
tiny)
then
4916 if (vec1_x*vec1_x + vec1_y*vec1_y .le.
tiny*
tiny)
then
4930 if (cross_product <
zero)
then
4945 cell_corner_lat_loc = cell_corner_x
4946 cell_corner_lon_loc = cell_corner_y
4951 if (cell_corner_lon_loc(n) < minlon)
then
4952 minlon = cell_corner_lon_loc(n)
4954 if (cell_corner_lon_loc(n) > maxlon)
then
4955 maxlon = cell_corner_lon_loc(n)
4959 if (maxlon-minlon >
pi)
then
4962 if (cell_corner_lon_loc(n)-minlon >
pi)
then
4963 cell_corner_lon_loc(n) = cell_corner_lon_loc(n)-
pi2
4971 if (pty_loc - minlon >
pi)
then
4972 pty_loc = pty_loc -
pi2
4973 else if (pty_loc - minlon < -
pi)
then
4974 pty_loc = pty_loc +
pi2
4979 next_n = mod(n,ncorners) + 1
4981 x1 = cell_corner_lat_loc(n)
4982 y1 = cell_corner_lon_loc(n)
4983 x2 = cell_corner_lat_loc(next_n)
4984 y2 = cell_corner_lon_loc(next_n)
4988 vec2_x = ptx_loc - x1
4989 vec2_y = pty_loc - y1
4991 cross_product = vec1_y*vec2_x - vec2_y*vec1_x
5000 if (abs(cross_product) <
tiny)
then
5001 if (vec1_x*vec1_x + vec1_y*vec1_y .le.
tiny*
tiny)
then
5015 if (cross_product <
zero)
then
5041 & cell_corner_y, latlon, whichpole, inpoly, lboundary, edgeid)
5064 real (SCRIP_r8),
intent(in) ::
5067 integer (SCRIP_i4),
intent(in) ::
5070 real (SCRIP_r8),
dimension(ncorners),
intent(in) ::
5074 logical (SCRIP_logical),
intent(in) ::
5077 integer (SCRIP_i4),
intent(in) ::
5086 logical (SCRIP_logical),
intent(out) ::
5089 logical (SCRIP_logical),
intent(out) ::
5092 integer (SCRIP_i4),
intent(out) ::
5102 integer (SCRIP_i4) :: n, next_n, ledgeid
5104 real (SCRIP_r8),
dimension(4) ::
5108 real (SCRIP_r8) :: x1, y1, x2, y2, vec1_x, vec1_y, vec2_x, vec2_y,
5109 & cross_product, pole_lat
5111 pole_lat = whichpole*
pih
5126 next_n = mod(n,ncorners) + 1
5128 pquad_corner_x(1) = cell_corner_x(n)
5129 pquad_corner_y(1) = cell_corner_y(n)
5130 pquad_corner_x(2) = cell_corner_x(next_n)
5131 pquad_corner_y(2) = cell_corner_y(next_n)
5132 pquad_corner_x(3) = pole_lat
5133 pquad_corner_y(3) = cell_corner_y(next_n)
5134 pquad_corner_x(4) = pole_lat
5135 pquad_corner_y(4) = cell_corner_y(n)
5138 call ptinpoly(ptx,pty,4,pquad_corner_x,pquad_corner_y,
5139 & latlon,inpoly,lboundary, ledgeid)
5151 vec1_x = pquad_corner_x(2) - pquad_corner_x(1)
5152 vec1_y = pquad_corner_y(2) - pquad_corner_y(1)
5153 vec2_x = ptx - pquad_corner_x(1)
5154 vec2_y = pty - pquad_corner_y(1)
5163 if (vec1_y >
pi) vec1_y = vec1_y -
pi2
5164 if (vec1_y < -
pi) vec1_y = vec1_y +
pi2
5165 if (vec2_y >
pi) vec2_y = vec2_y -
pi2
5166 if (vec2_y < -
pi) vec2_y = vec2_y +
pi2
5170 cross_product = vec1_y*vec2_x - vec2_y*vec1_x
5179 if (abs(cross_product) <
tiny)
then
5180 if (vec1_x .eq.
zero .and. vec1_y .eq.
zero)
then
5208 subroutine ptinpolygen(ptx, pty, ncorners, cell_corner_x,
5209 & cell_corner_y, cell_center_x, cell_center_y,
5210 & latlon, inpoly, lboundary, edgeid)
5233 real (SCRIP_r8),
intent(in) ::
5236 integer (SCRIP_i4),
intent(in) ::
5239 real (SCRIP_r8),
dimension(ncorners),
intent(in) ::
5243 real (SCRIP_r8),
intent(in) ::
5247 logical (SCRIP_logical),
intent(in) ::
5256 logical (SCRIP_logical),
intent(out) ::
5259 logical (SCRIP_logical),
intent(out) ::
5262 integer (SCRIP_i4),
intent(out) ::
5272 integer (SCRIP_i4) :: n, next_n, ledgeid
5274 real (SCRIP_r8),
dimension(3) ::
5278 real (SCRIP_r8) :: x1, y1, x2, y2, vec1_x, vec1_y, vec2_x, vec2_y,
5292 next_n = mod(n,ncorners) + 1
5294 tri_corner_x(1) = cell_corner_x(n)
5295 tri_corner_y(1) = cell_corner_y(n)
5296 tri_corner_x(2) = cell_corner_x(next_n)
5297 tri_corner_y(2) = cell_corner_y(next_n)
5298 tri_corner_x(3) = cell_center_x
5299 tri_corner_y(3) = cell_center_y
5301 vec1_x = tri_corner_x(2) - tri_corner_x(1)
5302 vec1_y = tri_corner_y(2) - tri_corner_y(1)
5306 if (vec1_x*vec1_x+vec1_y*vec1_y .le.
tiny*
tiny) cycle
5308 call ptinpoly(ptx,pty,3,tri_corner_x,tri_corner_y,
5309 & latlon,inpoly,lboundary, ledgeid)
5321 vec2_x = ptx - tri_corner_x(1)
5322 vec2_y = pty - tri_corner_y(1)
5331 if (vec1_y >
pi) vec1_y = vec1_y -
pi2
5332 if (vec1_y < -
pi) vec1_y = vec1_y +
pi2
5333 if (vec2_y >
pi) vec2_y = vec2_y -
pi2
5334 if (vec2_y < -
pi) vec2_y = vec2_y +
pi2
5338 cross_product = vec1_y*vec2_x - vec2_y*vec1_x
5347 if (abs(cross_product) <
tiny)
then
5348 if (vec1_x*vec1_x+vec1_y*vec1_y .le.
tiny*
tiny)
then
5376 subroutine ptinpolygen2(ptx, pty, ncorners, cell_corner_x,
5377 & cell_corner_y, latlon, inpoly, lboundary, edgeid)
5400 real (SCRIP_r8),
intent(in) ::
5403 integer (SCRIP_i4),
intent(in) ::
5406 real (SCRIP_r8),
dimension(ncorners),
intent(in) ::
5410 logical (SCRIP_logical),
intent(in) ::
5419 logical (SCRIP_logical),
intent(out) ::
5422 logical (SCRIP_logical),
intent(out) ::
5425 integer (SCRIP_i4),
intent(out) ::
5435 integer (SCRIP_i4) :: c, n, next_n
5437 real (SCRIP_r8) :: x1, y1, x2, y2, vec1_x, vec1_y, vec2_x, vec2_y,
5438 & vec3_x, vec3_y, vec1_len, vec2_len, vec3_len,
5439 & cross_product, dot_product
5453 next_n = mod(n,ncorners) + 1
5455 x1 = cell_corner_x(n)
5456 y1 = cell_corner_y(n)
5457 x2 = cell_corner_x(next_n)
5458 y2 = cell_corner_y(next_n)
5460 if (((y1 > pty .and. y2 <= pty) .or.
5461 & (y2 > pty .and. y1 <= pty)) .and.
5462 & (ptx <= (x1 + (pty-y1)*(x2-x1)/(y2-y1))))
then
5469 if (c .eq. 1) inpoly = .true.
5476 next_n = mod(n,ncorners) + 1
5478 x1 = cell_corner_x(n)
5479 y1 = cell_corner_y(n)
5480 x2 = cell_corner_x(next_n)
5481 y2 = cell_corner_y(next_n)
5485 vec1_len = sqrt(vec1_x*vec1_x + vec1_y*vec1_y)
5486 vec1_x = vec1_x/vec1_len
5487 vec1_y = vec1_y/vec1_len
5491 vec2_len = sqrt(vec2_x*vec2_x + vec2_y*vec2_y)
5493 cross_product = vec1_x*vec2_y - vec2_x*vec1_y
5494 if (abs(cross_product) >
tiny .and. vec2_len >
tiny)
then
5495 cross_product = cross_product/vec2_len
5498 if (abs(cross_product) < 1e5*
tiny .and.
5499 & abs(cross_product) > 10*
tiny)
then
5508 vec3_len = sqrt(vec3_x*vec3_x + vec3_y*vec3_y)
5510 cross_product = -vec1_x*vec3_y + vec1_y*vec3_x
5511 if (abs(cross_product) >
tiny .and. vec3_len >
tiny)
then
5515 cross_product = cross_product/vec3_len
5519 if (abs(cross_product) < 10*
tiny)
then
5521 if (vec1_x*vec1_x+vec1_y*vec1_y .le.
tiny*
tiny)
then
5524 dot_product = vec1_x*vec2_x + vec1_y*vec2_y
5526 if (dot_product >= 0 .and. dot_product <= vec1_len)
then
5553 subroutine get_srch_cells(cell_add, cell_grid_num, srch_grid_num,
5554 & num_srch_cells, srch_add, srch_corners,
5555 & srch_corner_lat, srch_corner_lon,
5556 & srch_center_lat, srch_center_lon)
5564 integer (SCRIP_i4),
intent(in) ::
5576 integer (SCRIP_i4),
intent(out) ::
5580 integer (SCRIP_i4),
dimension(:),
allocatable,
intent(out) ::
5583 real (SCRIP_r8),
dimension(:,:),
allocatable,
intent(out) ::
5584 & srch_corner_lat, srch_corner_lon
5586 real (SCRIP_r8),
dimension(:),
allocatable,
intent(out) ::
5587 & srch_center_lat, srch_center_lon
5596 logical (SCRIP_logical),
dimension(:),
allocatable ::
5599 integer (SCRIP_i4) :: grid1_add, grid2_add, max_add, min_add,
5638 if (cell_grid_num == 1)
then
5640 if (srch_grid_num == 1)
then
5661 do grid1_add = min_add,max_add
5662 srch_mask(grid1_add) =
5672 if (srch_mask(grid1_add))
5695 do grid1_add = min_add,max_add
5696 if (srch_mask(grid1_add))
then
5713 deallocate(srch_mask)
5736 do grid2_add = min_add,max_add
5737 srch_mask(grid2_add) =
5749 if (srch_mask(grid2_add))
5773 do grid2_add = min_add,max_add
5774 if (srch_mask(grid2_add))
then
5791 deallocate(srch_mask)
5796 if (srch_grid_num == 1)
then
5817 do grid1_add = min_add,max_add
5818 srch_mask(grid1_add) =
5828 if (srch_mask(grid1_add))
5852 do grid1_add = min_add,max_add
5853 if (srch_mask(grid1_add))
then
5870 deallocate(srch_mask)
5893 do grid2_add = min_add,max_add
5894 srch_mask(grid2_add) =
5904 if (srch_mask(grid2_add))
5928 do grid2_add = min_add,max_add
5929 if (srch_mask(grid2_add))
then
5946 deallocate(srch_mask)
5957 if (num_srch_cells .eq. 0)
then
5962 allocate(srch_add(num_srch_cells),
5963 & srch_corner_lat(srch_corners,num_srch_cells),
5964 & srch_corner_lon(srch_corners,num_srch_cells),
5965 & srch_center_lat(num_srch_cells),
5966 & srch_center_lon(num_srch_cells))
5994 integer (SCRIP_i4),
intent(in) ::
6005 integer (SCRIP_i4),
intent(out) :: adj_add
6013 integer (SCRIP_i4) :: i, inx, n, global_add
6014 logical (SCRIP_logical) :: found
6015 real (SCRIP_r8) :: lat1, lon1, lat2, lon2
6019 if (cell_grid_num .eq. 1)
then
6036 global_add = cell_add + 1
6049 adj_add = global_add
6056 if (cell_add .gt. 1)
then
6058 global_add = cell_add - 1
6071 adj_add = global_add
6098 global_add = cell_add + 1
6111 adj_add = global_add
6118 if (cell_add .gt. 1)
then
6120 global_add = cell_add - 1
6133 adj_add = global_add
6190 adj_add = global_add
6213 & ncorners, cell_corner_lat,
6214 & cell_corner_lon, cell_center_lat, cell_center_lon,
6215 & inpt_lat, inpt_lon, outpt_lat, outpt_lon,
6216 & bpt_lat, bpt_lon, bedgeid)
6224 integer (SCRIP_i4),
intent(in) ::
6229 real (SCRIP_r8),
dimension(ncorners),
intent(in) ::
6233 real (SCRIP_r8),
intent(in) ::
6248 real (SCRIP_r8),
intent(out) ::
6252 integer (SCRIP_i4),
intent(out) ::
6261 logical (SCRIP_logical) ::
6266 integer (SCRIP_i4) ::
6284 do while (.not. converged)
6286 midlat = (lat1+lat2)/2.0
6287 if (abs(lon1-lon2) <
pi)
then
6288 midlon = (lon1+lon2)/2.0
6290 midlon = (lon1+lon2)/2.0 -
pi2
6295 & cell_add, ncorners,
6296 & cell_corner_lat, cell_corner_lon,
6297 & cell_center_lat, cell_center_lon,
6299 & inpoly, lboundary, bedgeid)
6309 if (abs(lat1-lat2) <
tiny .and.
6310 & abs(lon1-lon2) <
tiny .and. lboundary)
then