Sophie

Sophie

distrib > Fedora > 16 > i386 > by-pkgid > c9cfbd1355daacaf3b34517a6d7b18cc > files > 175

libdap-doc-3.11.0-2.fc15.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libdap++: GeoConstraint.cc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.3 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">libdap++&#160;<span id="projectnumber">Updated for version 3.8.2</span></div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
  initNavTree('GeoConstraint_8cc.html','');
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<h1>GeoConstraint.cc</h1>  </div>
</div>
<div class="contents">
<a href="GeoConstraint_8cc.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
<a name="l00002"></a>00002 <span class="comment">// -*- mode: c++; c-basic-offset:4 -*-</span>
<a name="l00003"></a>00003 
<a name="l00004"></a>00004 <span class="comment">// This file is part of libdap, A C++ implementation of the OPeNDAP Data</span>
<a name="l00005"></a>00005 <span class="comment">// Access Protocol.</span>
<a name="l00006"></a>00006 
<a name="l00007"></a>00007 <span class="comment">// Copyright (c) 2006 OPeNDAP, Inc.</span>
<a name="l00008"></a>00008 <span class="comment">// Author: James Gallagher &lt;jgallagher@opendap.org&gt;</span>
<a name="l00009"></a>00009 <span class="comment">//</span>
<a name="l00010"></a>00010 <span class="comment">// This library is free software; you can redistribute it and/or</span>
<a name="l00011"></a>00011 <span class="comment">// modify it under the terms of the GNU Lesser General Public</span>
<a name="l00012"></a>00012 <span class="comment">// License as published by the Free Software Foundation; either</span>
<a name="l00013"></a>00013 <span class="comment">// version 2.1 of the License, or (at your option) any later version.</span>
<a name="l00014"></a>00014 <span class="comment">//</span>
<a name="l00015"></a>00015 <span class="comment">// This library is distributed in the hope that it will be useful,</span>
<a name="l00016"></a>00016 <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00017"></a>00017 <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
<a name="l00018"></a>00018 <span class="comment">// Lesser General Public License for more details.</span>
<a name="l00019"></a>00019 <span class="comment">//</span>
<a name="l00020"></a>00020 <span class="comment">// You should have received a copy of the GNU Lesser General Public</span>
<a name="l00021"></a>00021 <span class="comment">// License along with this library; if not, write to the Free Software</span>
<a name="l00022"></a>00022 <span class="comment">// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA</span>
<a name="l00023"></a>00023 <span class="comment">//</span>
<a name="l00024"></a>00024 <span class="comment">// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.</span>
<a name="l00025"></a>00025 
<a name="l00026"></a>00026 <span class="comment">// The Grid Selection Expression Clause class.</span>
<a name="l00027"></a>00027 
<a name="l00028"></a>00028 
<a name="l00029"></a>00029 <span class="preprocessor">#include &quot;<a class="code" href="config_8h.html">config.h</a>&quot;</span>
<a name="l00030"></a>00030 
<a name="l00031"></a>00031 <span class="keyword">static</span> <span class="keywordtype">char</span> <span class="keywordtype">id</span>[] <a class="code" href="config_8h.html#a05e109ec893d0b12023d5b0cf4f718c4">not_used</a> =
<a name="l00032"></a>00032     { <span class="stringliteral">&quot;$Id: GeoConstraint.cc 23563 2010-09-14 17:43:32Z jimg $&quot;</span>
<a name="l00033"></a>00033     };
<a name="l00034"></a>00034 
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;cstring&gt;</span>
<a name="l00036"></a>00036 <span class="preprocessor">#include &lt;cmath&gt;</span>
<a name="l00037"></a>00037 <span class="preprocessor">#include &lt;iostream&gt;</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include &lt;sstream&gt;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include &lt;algorithm&gt;</span>  <span class="comment">//  for find_if</span>
<a name="l00040"></a>00040 
<a name="l00041"></a>00041 <span class="comment">//#define DODS_DEBUG</span>
<a name="l00042"></a>00042 <span class="comment">//#define DODS_DEBUG2</span>
<a name="l00043"></a>00043 
<a name="l00044"></a>00044 <span class="preprocessor">#include &quot;<a class="code" href="debug_8h.html">debug.h</a>&quot;</span>
<a name="l00045"></a>00045 <span class="preprocessor">#include &quot;<a class="code" href="dods-datatypes_8h.html">dods-datatypes.h</a>&quot;</span>
<a name="l00046"></a>00046 <span class="preprocessor">#include &quot;<a class="code" href="GeoConstraint_8h.html">GeoConstraint.h</a>&quot;</span>
<a name="l00047"></a>00047 <span class="preprocessor">#include &quot;<a class="code" href="Float64_8h.html">Float64.h</a>&quot;</span>
<a name="l00048"></a>00048 
<a name="l00049"></a>00049 <span class="preprocessor">#include &quot;<a class="code" href="Error_8h.html">Error.h</a>&quot;</span>
<a name="l00050"></a>00050 <span class="preprocessor">#include &quot;<a class="code" href="InternalErr_8h.html">InternalErr.h</a>&quot;</span>
<a name="l00051"></a>00051 <span class="preprocessor">#include &quot;<a class="code" href="ce__functions_8h.html">ce_functions.h</a>&quot;</span>
<a name="l00052"></a>00052 <span class="preprocessor">#include &quot;<a class="code" href="util_8h.html">util.h</a>&quot;</span>
<a name="l00053"></a>00053 
<a name="l00054"></a>00054 <span class="keyword">using namespace </span>std;
<a name="l00055"></a>00055 
<a name="l00056"></a>00056 <span class="keyword">namespace </span>libdap {
<a name="l00057"></a>00057 
<a name="l00062"></a>00062 <span class="keyword">class </span>is_prefix
<a name="l00063"></a>00063 {
<a name="l00064"></a>00064 <span class="keyword">private</span>:
<a name="l00065"></a>00065     <span class="keywordtype">string</span> s;
<a name="l00066"></a>00066 <span class="keyword">public</span>:
<a name="l00067"></a>00067     is_prefix(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp; in): s(in)
<a name="l00068"></a>00068     {}
<a name="l00069"></a>00069 
<a name="l00070"></a>00070     <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp; prefix)
<a name="l00071"></a>00071     {
<a name="l00072"></a>00072         <span class="keywordflow">return</span> s.find(prefix) == 0;
<a name="l00073"></a>00073     }
<a name="l00074"></a>00074 };
<a name="l00075"></a>00075 
<a name="l00086"></a>00086 <span class="keywordtype">bool</span>
<a name="l00087"></a><a class="code" href="namespacelibdap.html#a2e899171229a834bd84b7ac3bead7e63">00087</a> <a class="code" href="namespacelibdap.html#a2e899171229a834bd84b7ac3bead7e63">unit_or_name_match</a>(set &lt; string &gt; units, set &lt; string &gt; names,
<a name="l00088"></a>00088                        <span class="keyword">const</span> <span class="keywordtype">string</span> &amp; var_units, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp; var_name)
<a name="l00089"></a>00089 {
<a name="l00090"></a>00090     <span class="keywordflow">return</span> (units.find(var_units) != units.end()
<a name="l00091"></a>00091             || find_if(names.begin(), names.end(),
<a name="l00092"></a>00092                        is_prefix(var_name)) != names.end());
<a name="l00093"></a>00093 }
<a name="l00094"></a>00094 
<a name="l00109"></a>00109 GeoConstraint::Notation
<a name="l00110"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#a05015b19dc58da44a8c401562a2b5c65">00110</a> GeoConstraint::categorize_notation(<span class="keyword">const</span> <span class="keywordtype">double</span> left,
<a name="l00111"></a>00111                                    <span class="keyword">const</span> <span class="keywordtype">double</span> right)<span class="keyword"> const</span>
<a name="l00112"></a>00112 <span class="keyword"></span>{
<a name="l00113"></a>00113     <span class="keywordflow">return</span> (left &lt; 0 || right &lt; 0) ? neg_pos : pos;
<a name="l00114"></a>00114 }
<a name="l00115"></a>00115 
<a name="l00116"></a>00116 <span class="comment">/* A private method to translate the longitude constraint from -180/179</span>
<a name="l00117"></a>00117 <span class="comment">   notation to 0/359 notation.</span>
<a name="l00118"></a>00118 <span class="comment"></span>
<a name="l00119"></a>00119 <span class="comment">   About the two notations:</span>
<a name="l00120"></a>00120 <span class="comment">   0                          180                       360</span>
<a name="l00121"></a>00121 <span class="comment">   |---------------------------|-------------------------|</span>
<a name="l00122"></a>00122 <span class="comment">   0                        180,-180                     0</span>
<a name="l00123"></a>00123 <span class="comment"></span>
<a name="l00124"></a>00124 <span class="comment">   so in the neg-pos notation (using the name I give it in this class) both</span>
<a name="l00125"></a>00125 <span class="comment">   180 and -180 are the same longitude. And in the pos notation 0 and 360 are</span>
<a name="l00126"></a>00126 <span class="comment">   the same.</span>
<a name="l00127"></a>00127 <span class="comment"></span>
<a name="l00128"></a>00128 <span class="comment">   @param left Value-result parameter; the left side of the bounding box</span>
<a name="l00129"></a>00129 <span class="comment">   @parm right Value-result parameter; the right side of the bounding box */</span>
<a name="l00130"></a>00130 <span class="keywordtype">void</span>
<a name="l00131"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#adf09e62fff4bc76f2820e947d45f21bf">00131</a> GeoConstraint::transform_constraint_to_pos_notation(<span class="keywordtype">double</span> &amp;left,
<a name="l00132"></a>00132         <span class="keywordtype">double</span> &amp;right)<span class="keyword"> const</span>
<a name="l00133"></a>00133 <span class="keyword"></span>{
<a name="l00134"></a>00134     <span class="keywordflow">if</span> (left &lt; 0)
<a name="l00135"></a>00135         left += 360 ;
<a name="l00136"></a>00136 
<a name="l00137"></a>00137     <span class="keywordflow">if</span> (right &lt; 0)
<a name="l00138"></a>00138         right += 360;
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140 
<a name="l00149"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#a6651f68d957189fe33cc81f2193b6ef6">00149</a> <span class="keywordtype">void</span> GeoConstraint::transform_longitude_to_pos_notation()
<a name="l00150"></a>00150 {
<a name="l00151"></a>00151     <span class="comment">// Assume earlier logic is correct (since the test is expensive)</span>
<a name="l00152"></a>00152     <span class="comment">// for each value, add 180</span>
<a name="l00153"></a>00153     <span class="comment">// Longitude could be represented using any of the numeric types</span>
<a name="l00154"></a>00154     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; d_lon_length; ++i)
<a name="l00155"></a>00155         <span class="keywordflow">if</span> (d_lon[i] &lt; 0)
<a name="l00156"></a>00156             d_lon[i] += 360;
<a name="l00157"></a>00157 }
<a name="l00158"></a>00158 
<a name="l00168"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#aae44ab86b981a7543697ad8199094df7">00168</a> <span class="keywordtype">void</span> GeoConstraint::transform_longitude_to_neg_pos_notation()
<a name="l00169"></a>00169 {
<a name="l00170"></a>00170     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; d_lon_length; ++i)
<a name="l00171"></a>00171         <span class="keywordflow">if</span> (d_lon[i] &gt; 180)
<a name="l00172"></a>00172             d_lon[i] -= 360;
<a name="l00173"></a>00173 }
<a name="l00174"></a>00174 
<a name="l00175"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#a9039ef1033b512b10034fd5f7c1a129f">00175</a> <span class="keywordtype">bool</span> GeoConstraint::is_bounding_box_valid(<span class="keyword">const</span> <span class="keywordtype">double</span> left, <span class="keyword">const</span> <span class="keywordtype">double</span> top,
<a name="l00176"></a>00176         <span class="keyword">const</span> <span class="keywordtype">double</span> right, <span class="keyword">const</span> <span class="keywordtype">double</span> bottom)<span class="keyword"> const</span>
<a name="l00177"></a>00177 <span class="keyword"></span>{
<a name="l00178"></a>00178     <span class="keywordflow">if</span> ((left &lt; d_lon[0] &amp;&amp; right &lt; d_lon[0])
<a name="l00179"></a>00179         || (left &gt; d_lon[d_lon_length-1] &amp;&amp; right &gt; d_lon[d_lon_length-1]))
<a name="l00180"></a>00180         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00181"></a>00181 
<a name="l00182"></a>00182     <span class="keywordflow">if</span> (d_latitude_sense == normal) {
<a name="l00183"></a>00183         <span class="comment">// When sense is normal, the largest values are at the origin.</span>
<a name="l00184"></a>00184         <span class="keywordflow">if</span> ((top &gt; d_lat[0] &amp;&amp; bottom &gt; d_lat[0])
<a name="l00185"></a>00185             || (top &lt; d_lat[d_lat_length-1] &amp;&amp; bottom &lt; d_lat[d_lat_length-1]))
<a name="l00186"></a>00186             <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00187"></a>00187     }
<a name="l00188"></a>00188     <span class="keywordflow">else</span> {
<a name="l00189"></a>00189         <span class="keywordflow">if</span> ((top &lt; d_lat[0] &amp;&amp; bottom &lt; d_lat[0])
<a name="l00190"></a>00190             || (top &gt; d_lat[d_lat_length-1] &amp;&amp; bottom &gt; d_lat[d_lat_length-1]))
<a name="l00191"></a>00191             <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00192"></a>00192     }
<a name="l00193"></a>00193 
<a name="l00194"></a>00194     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00195"></a>00195 }
<a name="l00196"></a>00196 
<a name="l00207"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#ae8919739ddc3071a4b472d0234ca4300">00207</a> <span class="keywordtype">void</span> GeoConstraint::find_longitude_indeces(<span class="keywordtype">double</span> left, <span class="keywordtype">double</span> right,
<a name="l00208"></a>00208         <span class="keywordtype">int</span> &amp;longitude_index_left, <span class="keywordtype">int</span> &amp;longitude_index_right)<span class="keyword"> const</span>
<a name="l00209"></a>00209 <span class="keyword"></span>{
<a name="l00210"></a>00210     <span class="comment">// Use all values &#39;modulo 360&#39; to take into account the cases where the</span>
<a name="l00211"></a>00211     <span class="comment">// constraint and/or the longitude vector are given using values greater</span>
<a name="l00212"></a>00212     <span class="comment">// than 360 (i.e., when 380 is used to mean 20).</span>
<a name="l00213"></a>00213     <span class="keywordtype">double</span> t_left = fmod(left, 360.0);
<a name="l00214"></a>00214     <span class="keywordtype">double</span> t_right = fmod(right, 360.0);
<a name="l00215"></a>00215 
<a name="l00216"></a>00216     <span class="comment">// Find the place where &#39;longitude starts.&#39; That is, what value of the</span>
<a name="l00217"></a>00217     <span class="comment">// index &#39;i&#39; corresponds to the smallest value of d_lon. Why we do this:</span>
<a name="l00218"></a>00218     <span class="comment">// Some data sources use offset longitude axes so that the &#39;seam&#39; is</span>
<a name="l00219"></a>00219     <span class="comment">// shifted to a place other than the date line.</span>
<a name="l00220"></a>00220     <span class="keywordtype">int</span> i = 0;
<a name="l00221"></a>00221     <span class="keywordtype">int</span> lon_origin_index = 0;
<a name="l00222"></a>00222     <span class="keywordtype">double</span> smallest_lon = fmod(d_lon[0], 360.0);
<a name="l00223"></a>00223     <span class="keywordflow">while</span> (i &lt; d_lon_length) {
<a name="l00224"></a>00224         <span class="keywordtype">double</span> curent_lon_value = fmod(d_lon[i], 360.0);
<a name="l00225"></a>00225         <span class="keywordflow">if</span> (smallest_lon &gt; curent_lon_value) {
<a name="l00226"></a>00226             smallest_lon = curent_lon_value;
<a name="l00227"></a>00227             lon_origin_index = i;
<a name="l00228"></a>00228         }
<a name="l00229"></a>00229         ++i;
<a name="l00230"></a>00230     }
<a name="l00231"></a>00231 
<a name="l00232"></a>00232     <a class="code" href="debug_8h.html#ac1f764c266c50f0050e33557004c914c">DBG2</a>(cerr &lt;&lt; <span class="stringliteral">&quot;lon_origin_index: &quot;</span> &lt;&lt; lon_origin_index &lt;&lt; endl);
<a name="l00233"></a>00233 
<a name="l00234"></a>00234     <span class="comment">// Scan from the index of the smallest value looking for the place where</span>
<a name="l00235"></a>00235     <span class="comment">// the value is greater than or equal to the left most point of the bounding</span>
<a name="l00236"></a>00236     <span class="comment">// box.</span>
<a name="l00237"></a>00237     i = lon_origin_index;
<a name="l00238"></a>00238     <span class="keywordflow">while</span> (fmod(d_lon[i], 360.0) &lt; t_left) {
<a name="l00239"></a>00239         ++i;
<a name="l00240"></a>00240         i = i % d_lon_length;
<a name="l00241"></a>00241 
<a name="l00242"></a>00242         <span class="comment">// If we cycle completely through all the values/indices, throw</span>
<a name="l00243"></a>00243         <span class="keywordflow">if</span> (i == lon_origin_index)
<a name="l00244"></a>00244             <span class="keywordflow">throw</span> <a class="code" href="classlibdap_1_1Error.html" title="A class for error processing.">Error</a>(<span class="stringliteral">&quot;geogrid: Could not find an index for the longitude value &#39;&quot;</span> + <a class="code" href="namespacelibdap.html#a7c3f898946a0ae498f4ca830731cc474">double_to_string</a>(left) + <span class="stringliteral">&quot;&#39;&quot;</span>);
<a name="l00245"></a>00245     }
<a name="l00246"></a>00246 
<a name="l00247"></a>00247     <span class="keywordflow">if</span> (fmod(d_lon[i], 360.0) == t_left)
<a name="l00248"></a>00248         longitude_index_left = i;
<a name="l00249"></a>00249     <span class="keywordflow">else</span>
<a name="l00250"></a>00250         longitude_index_left = (i - 1) &gt; 0 ? i - 1 : 0;
<a name="l00251"></a>00251 
<a name="l00252"></a>00252     <a class="code" href="debug_8h.html#ac1f764c266c50f0050e33557004c914c">DBG2</a>(cerr &lt;&lt; <span class="stringliteral">&quot;longitude_index_left: &quot;</span> &lt;&lt; longitude_index_left &lt;&lt; endl);
<a name="l00253"></a>00253 
<a name="l00254"></a>00254     <span class="comment">// Assume the vector is circular --&gt; the largest value is next to the</span>
<a name="l00255"></a>00255     <span class="comment">// smallest.</span>
<a name="l00256"></a>00256     <span class="keywordtype">int</span> largest_lon_index = (lon_origin_index - 1 + d_lon_length) % d_lon_length;
<a name="l00257"></a>00257     i = largest_lon_index;
<a name="l00258"></a>00258     <span class="keywordflow">while</span> (fmod(d_lon[i], 360.0) &gt; t_right) {
<a name="l00259"></a>00259         <span class="comment">// This is like modulus but for &#39;counting down&#39;</span>
<a name="l00260"></a>00260         i = (i == 0) ? d_lon_length - 1 : i - 1;
<a name="l00261"></a>00261         <span class="keywordflow">if</span> (i == largest_lon_index)
<a name="l00262"></a>00262             <span class="keywordflow">throw</span> <a class="code" href="classlibdap_1_1Error.html" title="A class for error processing.">Error</a>(<span class="stringliteral">&quot;geogrid: Could not find an index for the longitude value &#39;&quot;</span> + <a class="code" href="namespacelibdap.html#a7c3f898946a0ae498f4ca830731cc474">double_to_string</a>(right) + <span class="stringliteral">&quot;&#39;&quot;</span>);
<a name="l00263"></a>00263     }
<a name="l00264"></a>00264 
<a name="l00265"></a>00265     <span class="keywordflow">if</span> (fmod(d_lon[i], 360.0) == t_right)
<a name="l00266"></a>00266         longitude_index_right = i;
<a name="l00267"></a>00267     <span class="keywordflow">else</span>
<a name="l00268"></a>00268         longitude_index_right = (i + 1) &lt; d_lon_length - 1 ? i + 1 : d_lon_length - 1;
<a name="l00269"></a>00269 
<a name="l00270"></a>00270     <a class="code" href="debug_8h.html#ac1f764c266c50f0050e33557004c914c">DBG2</a>(cerr &lt;&lt; <span class="stringliteral">&quot;longitude_index_right: &quot;</span> &lt;&lt; longitude_index_right &lt;&lt; endl);
<a name="l00271"></a>00271 }
<a name="l00272"></a>00272 
<a name="l00285"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#a1a9145ad48fdeea6eb810521f836c843">00285</a> <span class="keywordtype">void</span> GeoConstraint::find_latitude_indeces(<span class="keywordtype">double</span> top, <span class="keywordtype">double</span> bottom,
<a name="l00286"></a>00286         <a class="code" href="classlibdap_1_1GeoConstraint.html#a2304140a3b6310c6ed8bce30ebdaed7b">LatitudeSense</a> sense,
<a name="l00287"></a>00287         <span class="keywordtype">int</span> &amp;latitude_index_top,
<a name="l00288"></a>00288         <span class="keywordtype">int</span> &amp;latitude_index_bottom)<span class="keyword"> const</span>
<a name="l00289"></a>00289 <span class="keyword"></span>{
<a name="l00290"></a>00290     <span class="keywordtype">int</span> i, j;
<a name="l00291"></a>00291 
<a name="l00292"></a>00292     <span class="keywordflow">if</span> (sense == normal) {
<a name="l00293"></a>00293         i = 0;
<a name="l00294"></a>00294         <span class="keywordflow">while</span> (i &lt; d_lat_length - 1 &amp;&amp; top &lt; d_lat[i])
<a name="l00295"></a>00295             ++i;
<a name="l00296"></a>00296 
<a name="l00297"></a>00297         j = d_lat_length - 1;
<a name="l00298"></a>00298         <span class="keywordflow">while</span> (j &gt; 0 &amp;&amp; bottom &gt; d_lat[j])
<a name="l00299"></a>00299             --j;
<a name="l00300"></a>00300 
<a name="l00301"></a>00301         <span class="keywordflow">if</span> (d_lat[i] == top)
<a name="l00302"></a>00302             latitude_index_top = i;
<a name="l00303"></a>00303         <span class="keywordflow">else</span>
<a name="l00304"></a>00304             latitude_index_top = (i - 1) &gt; 0 ? i - 1 : 0;
<a name="l00305"></a>00305 
<a name="l00306"></a>00306         <span class="keywordflow">if</span> (d_lat[j] == bottom)
<a name="l00307"></a>00307             latitude_index_bottom = j;
<a name="l00308"></a>00308         <span class="keywordflow">else</span>
<a name="l00309"></a>00309             latitude_index_bottom =
<a name="l00310"></a>00310                 (j + 1) &lt; d_lat_length - 1 ? j + 1 : d_lat_length - 1;
<a name="l00311"></a>00311     }
<a name="l00312"></a>00312     <span class="keywordflow">else</span> {
<a name="l00313"></a>00313         i = d_lat_length - 1;
<a name="l00314"></a>00314         <span class="keywordflow">while</span> (i &gt; 0 &amp;&amp; d_lat[i] &gt; top)
<a name="l00315"></a>00315             --i;
<a name="l00316"></a>00316 
<a name="l00317"></a>00317         j = 0;
<a name="l00318"></a>00318         <span class="keywordflow">while</span> (j &lt; d_lat_length - 1 &amp;&amp; d_lat[j] &lt; bottom)
<a name="l00319"></a>00319             ++j;
<a name="l00320"></a>00320 
<a name="l00321"></a>00321         <span class="keywordflow">if</span> (d_lat[i] == top)
<a name="l00322"></a>00322             latitude_index_top = i;
<a name="l00323"></a>00323         <span class="keywordflow">else</span>
<a name="l00324"></a>00324             latitude_index_top = (i + 1) &lt; d_lat_length - 1 ? i + 1 : d_lat_length - 1;
<a name="l00325"></a>00325 
<a name="l00326"></a>00326         <span class="keywordflow">if</span> (d_lat[j] == bottom)
<a name="l00327"></a>00327             latitude_index_bottom = j;
<a name="l00328"></a>00328         <span class="keywordflow">else</span>
<a name="l00329"></a>00329             latitude_index_bottom = (j - 1) &gt; 0 ? j - 1 : 0;
<a name="l00330"></a>00330     }
<a name="l00331"></a>00331 }
<a name="l00332"></a>00332 
<a name="l00336"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#a1f0111c7077e67459f9e3b47161848a7">00336</a> <a class="code" href="classlibdap_1_1GeoConstraint.html#a2304140a3b6310c6ed8bce30ebdaed7b">GeoConstraint::LatitudeSense</a> GeoConstraint::categorize_latitude()<span class="keyword"> const</span>
<a name="l00337"></a>00337 <span class="keyword"></span>{
<a name="l00338"></a>00338     <span class="keywordflow">return</span> d_lat[0] &gt;= d_lat[d_lat_length - 1] ? normal : inverted;
<a name="l00339"></a>00339 }
<a name="l00340"></a>00340 
<a name="l00341"></a>00341 <span class="comment">// Use &#39;index&#39; as the pivot point. Move the points behind index to the front of</span>
<a name="l00342"></a>00342 <span class="comment">// the vector and those points in front of and at index to the rear.</span>
<a name="l00343"></a>00343 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00344"></a>00344 swap_vector_ends(<span class="keywordtype">char</span> *dest, <span class="keywordtype">char</span> *src, <span class="keywordtype">int</span> len, <span class="keywordtype">int</span> index, <span class="keywordtype">int</span> elem_sz)
<a name="l00345"></a>00345 {
<a name="l00346"></a>00346     memcpy(dest, src + index * elem_sz, (len - index) * elem_sz);
<a name="l00347"></a>00347 
<a name="l00348"></a>00348     memcpy(dest + (len - index) * elem_sz, src, index * elem_sz);
<a name="l00349"></a>00349 }
<a name="l00350"></a>00350 
<a name="l00351"></a>00351 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;
<a name="l00352"></a>00352 <span class="keyword">static</span> <span class="keywordtype">void</span> transpose(std::vector&lt;std::vector&lt;T&gt; &gt; a,
<a name="l00353"></a>00353         std::vector&lt;std::vector&lt;T&gt; &gt; b, <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height)
<a name="l00354"></a>00354 {
<a name="l00355"></a>00355     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; width; i++) {
<a name="l00356"></a>00356         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; height; j++) {
<a name="l00357"></a>00357             b[j][i] = a[i][j];
<a name="l00358"></a>00358         }
<a name="l00359"></a>00359     }
<a name="l00360"></a>00360 }
<a name="l00361"></a>00361 
<a name="l00369"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#a681345f3c4b95ae95ce5b49bb8ff248a">00369</a> <span class="keywordtype">void</span> GeoConstraint::transpose_vector(<span class="keywordtype">double</span> *src, <span class="keyword">const</span> <span class="keywordtype">int</span> length)
<a name="l00370"></a>00370 {
<a name="l00371"></a>00371     <span class="keywordtype">double</span> *tmp = <span class="keyword">new</span> <span class="keywordtype">double</span>[length];
<a name="l00372"></a>00372 
<a name="l00373"></a>00373     <span class="keywordtype">int</span> i = 0, j = length-1;
<a name="l00374"></a>00374     <span class="keywordflow">while</span> (i &lt; length)
<a name="l00375"></a>00375         tmp[j--] = src[i++];
<a name="l00376"></a>00376 
<a name="l00377"></a>00377     memcpy(src, tmp,length * <span class="keyword">sizeof</span>(<span class="keywordtype">double</span>));
<a name="l00378"></a>00378 
<a name="l00379"></a>00379     <span class="keyword">delete</span>[] tmp;
<a name="l00380"></a>00380 }
<a name="l00381"></a>00381 
<a name="l00382"></a>00382 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00383"></a>00383 count_size_except_latitude_and_longitude(<a class="code" href="classlibdap_1_1Array.html" title="A multidimensional array of identical data types.">Array</a> &amp;a)
<a name="l00384"></a>00384 {
<a name="l00385"></a>00385     <span class="keywordflow">if</span> (a.<a class="code" href="classlibdap_1_1Array.html#a1e6b13c4a5d3e825df7ebae3a9dc300d">dim_end</a>() - a.<a class="code" href="classlibdap_1_1Array.html#ae6e6943cd895fa8dc1c58621ffad42a0">dim_begin</a>() &lt;= 2)       <span class="comment">// &lt; 2 is really an error...</span>
<a name="l00386"></a>00386         <span class="keywordflow">return</span> 1;
<a name="l00387"></a>00387 
<a name="l00388"></a>00388     <span class="keywordtype">int</span> size = 1;
<a name="l00389"></a>00389     <span class="keywordflow">for</span> (<a class="code" href="classlibdap_1_1Array.html#a7a557c05085a83d1501dbfa249d3cc52">Array::Dim_iter</a> i = a.<a class="code" href="classlibdap_1_1Array.html#ae6e6943cd895fa8dc1c58621ffad42a0">dim_begin</a>(); (i + 2) != a.<a class="code" href="classlibdap_1_1Array.html#a1e6b13c4a5d3e825df7ebae3a9dc300d">dim_end</a>(); ++i)
<a name="l00390"></a>00390         size *= a.<a class="code" href="classlibdap_1_1Array.html#a8f29497af9c33c0d66939d5f9a16d92a" title="Returns the size of the dimension.">dimension_size</a>(i, <span class="keyword">true</span>);
<a name="l00391"></a>00391 
<a name="l00392"></a>00392     <span class="keywordflow">return</span> size;
<a name="l00393"></a>00393 }
<a name="l00394"></a>00394 
<a name="l00395"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#a74bb5010981355c8d688a2fd77613f80">00395</a> <span class="keywordtype">void</span> GeoConstraint::flip_latitude_within_array(<a class="code" href="classlibdap_1_1Array.html" title="A multidimensional array of identical data types.">Array</a> &amp;a, <span class="keywordtype">int</span> lat_length,
<a name="l00396"></a>00396         <span class="keywordtype">int</span> lon_length)
<a name="l00397"></a>00397 {
<a name="l00398"></a>00398     <span class="keywordflow">if</span> (!d_array_data) {
<a name="l00399"></a>00399         a.<a class="code" href="classlibdap_1_1BaseType.html#a1da003c53f2e663223f603ab3fbd7c8e" title="Read data into a local buffer.">read</a>();
<a name="l00400"></a>00400         d_array_data = <span class="keyword">static_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(a.<a class="code" href="classlibdap_1_1Vector.html#a2803db526bd03df4beed106ee7dc6a4b" title="Get a copy of the data held by this variable. Read data from this variable&amp;#39;s internal storage and...">value</a>());
<a name="l00401"></a>00401         d_array_data_size = a.<a class="code" href="classlibdap_1_1Vector.html#a2a3c2d3b4a1fb3e88ee8737c1a33320a" title="Returns the width of the data, in bytes.">width</a>();  <span class="comment">// Bytes not elements</span>
<a name="l00402"></a>00402     }
<a name="l00403"></a>00403 
<a name="l00404"></a>00404     <span class="keywordtype">int</span> size = count_size_except_latitude_and_longitude(a);
<a name="l00405"></a>00405     <span class="keywordtype">char</span> *tmp_data = <span class="keyword">new</span> <span class="keywordtype">char</span>[d_array_data_size];
<a name="l00406"></a>00406     <span class="keywordtype">int</span> array_elem_size = a.<a class="code" href="classlibdap_1_1Vector.html#aa5ccb30d1f27ae587f35216b859feec7">var</a>()-&gt;<a class="code" href="classlibdap_1_1BaseType.html#a3058467f1e80a41f3cf1068ec9ec68ed" title="Returns the size of the class instance data.">width</a>();
<a name="l00407"></a>00407     <span class="keywordtype">int</span> lat_lon_size = (d_array_data_size / size);
<a name="l00408"></a>00408 
<a name="l00409"></a>00409     <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;lat, lon_length: &quot;</span> &lt;&lt; lat_length &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; lon_length &lt;&lt; endl);
<a name="l00410"></a>00410     <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;size: &quot;</span> &lt;&lt; size &lt;&lt; endl);
<a name="l00411"></a>00411     <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;d_array_data_size: &quot;</span> &lt;&lt; d_array_data_size &lt;&lt; endl);
<a name="l00412"></a>00412     <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;array_elem_size: &quot;</span> &lt;&lt; array_elem_size&lt;&lt; endl);
<a name="l00413"></a>00413     <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;lat_lon_size: &quot;</span> &lt;&lt; lat_lon_size&lt;&lt; endl);
<a name="l00414"></a>00414 
<a name="l00415"></a>00415     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; size; ++i) {
<a name="l00416"></a>00416         <span class="keywordtype">int</span> lat = 0;
<a name="l00417"></a>00417         <span class="keywordtype">int</span> s_lat = lat_length - 1;
<a name="l00418"></a>00418         <span class="comment">// lon_length is the element size; memcpy() needs the number of bytes</span>
<a name="l00419"></a>00419         <span class="keywordtype">int</span> lon_size = array_elem_size * lon_length;
<a name="l00420"></a>00420         <span class="keywordtype">int</span> offset = i * lat_lon_size;
<a name="l00421"></a>00421         <span class="keywordflow">while</span> (s_lat &gt; -1)
<a name="l00422"></a>00422             memcpy(tmp_data + offset + (lat++ * lon_size),
<a name="l00423"></a>00423                     d_array_data + offset + (s_lat-- * lon_size),
<a name="l00424"></a>00424                     lon_size);
<a name="l00425"></a>00425     }
<a name="l00426"></a>00426 
<a name="l00427"></a>00427     memcpy(d_array_data, tmp_data, d_array_data_size);
<a name="l00428"></a>00428     <span class="keyword">delete</span> [] tmp_data;
<a name="l00429"></a>00429 }
<a name="l00430"></a>00430 
<a name="l00439"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#ab2060337a35195641d6e0f667b8bf9df">00439</a> <span class="keywordtype">void</span> GeoConstraint::reorder_longitude_map(<span class="keywordtype">int</span> longitude_index_left)
<a name="l00440"></a>00440 {
<a name="l00441"></a>00441     <span class="keywordtype">double</span> *tmp_lon = <span class="keyword">new</span> <span class="keywordtype">double</span>[d_lon_length];
<a name="l00442"></a>00442 
<a name="l00443"></a>00443     swap_vector_ends((<span class="keywordtype">char</span> *) tmp_lon, (<span class="keywordtype">char</span> *) d_lon, d_lon_length,
<a name="l00444"></a>00444                      longitude_index_left, <span class="keyword">sizeof</span>(<span class="keywordtype">double</span>));
<a name="l00445"></a>00445 
<a name="l00446"></a>00446     memcpy(d_lon, tmp_lon, d_lon_length * <span class="keyword">sizeof</span>(<span class="keywordtype">double</span>));
<a name="l00447"></a>00447 
<a name="l00448"></a>00448     <span class="keyword">delete</span>[]tmp_lon;
<a name="l00449"></a>00449 }
<a name="l00450"></a>00450 
<a name="l00451"></a>00451 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00452"></a>00452 count_dimensions_except_longitude(<a class="code" href="classlibdap_1_1Array.html" title="A multidimensional array of identical data types.">Array</a> &amp;a)
<a name="l00453"></a>00453 {
<a name="l00454"></a>00454     <span class="keywordtype">int</span> size = 1;
<a name="l00455"></a>00455     <span class="keywordflow">for</span> (<a class="code" href="classlibdap_1_1Array.html#a7a557c05085a83d1501dbfa249d3cc52">Array::Dim_iter</a> i = a.<a class="code" href="classlibdap_1_1Array.html#ae6e6943cd895fa8dc1c58621ffad42a0">dim_begin</a>(); (i + 1) != a.<a class="code" href="classlibdap_1_1Array.html#a1e6b13c4a5d3e825df7ebae3a9dc300d">dim_end</a>(); ++i)
<a name="l00456"></a>00456         size *= a.<a class="code" href="classlibdap_1_1Array.html#a8f29497af9c33c0d66939d5f9a16d92a" title="Returns the size of the dimension.">dimension_size</a>(i, <span class="keyword">true</span>);
<a name="l00457"></a>00457 
<a name="l00458"></a>00458     <span class="keywordflow">return</span> size;
<a name="l00459"></a>00459 }
<a name="l00460"></a>00460 
<a name="l00478"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#aa893256d558152f07e08ec6f250fa089">00478</a> <span class="keywordtype">void</span> GeoConstraint::reorder_data_longitude_axis(<a class="code" href="classlibdap_1_1Array.html" title="A multidimensional array of identical data types.">Array</a> &amp;a, <a class="code" href="classlibdap_1_1Array.html#a7a557c05085a83d1501dbfa249d3cc52">Array::Dim_iter</a> lon_dim)
<a name="l00479"></a>00479 {
<a name="l00480"></a>00480 
<a name="l00481"></a>00481     <span class="keywordflow">if</span> (!is_longitude_rightmost())
<a name="l00482"></a>00482         <span class="keywordflow">throw</span> <a class="code" href="classlibdap_1_1Error.html" title="A class for error processing.">Error</a>(<span class="stringliteral">&quot;This grid does not have Longitude as its rightmost dimension, the geogrid()\ndoes not support constraints that wrap around the edges of this type of grid.&quot;</span>);
<a name="l00483"></a>00483 
<a name="l00484"></a>00484     <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;Constraint for the left half: &quot;</span> &lt;&lt; get_longitude_index_left()
<a name="l00485"></a>00485         &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; get_lon_length() - 1 &lt;&lt; endl);
<a name="l00486"></a>00486 
<a name="l00487"></a>00487     <span class="comment">// Build a constraint for the left part and get those values</span>
<a name="l00488"></a>00488     a.<a class="code" href="classlibdap_1_1Array.html#a538f7c336e26b873f50e033d553bba26" title="Adds a constraint to an Array dimension.">add_constraint</a>(lon_dim, get_longitude_index_left(), 1,
<a name="l00489"></a>00489                      get_lon_length() - 1);
<a name="l00490"></a>00490     a.<a class="code" href="classlibdap_1_1Vector.html#a58712de8871e28a48fdc95e72a09df71" title="Indicates that the data is ready to send.">set_read_p</a>(<span class="keyword">false</span>);
<a name="l00491"></a>00491     a.<a class="code" href="classlibdap_1_1BaseType.html#a1da003c53f2e663223f603ab3fbd7c8e" title="Read data into a local buffer.">read</a>();
<a name="l00492"></a>00492     <a class="code" href="debug_8h.html#ac1f764c266c50f0050e33557004c914c">DBG2</a>(a.<a class="code" href="classlibdap_1_1Array.html#af7bdf05ad5a57a517aa6b122b03f06df" title="Prints the value of the variable.">print_val</a>(stderr));
<a name="l00493"></a>00493 
<a name="l00494"></a>00494     <span class="comment">// Save the left-hand data to local storage</span>
<a name="l00495"></a>00495     <span class="keywordtype">int</span> left_size = a.<a class="code" href="classlibdap_1_1Vector.html#a2a3c2d3b4a1fb3e88ee8737c1a33320a" title="Returns the width of the data, in bytes.">width</a>();          <span class="comment">// width() == length() * element size</span>
<a name="l00496"></a>00496     <span class="keywordtype">char</span> *left_data = (<span class="keywordtype">char</span>*)a.<a class="code" href="classlibdap_1_1Vector.html#a2803db526bd03df4beed106ee7dc6a4b" title="Get a copy of the data held by this variable. Read data from this variable&amp;#39;s internal storage and...">value</a>(); <span class="comment">// value() allocates and copies</span>
<a name="l00497"></a>00497 
<a name="l00498"></a>00498     <span class="comment">// Build a constraint for the &#39;right&#39; part, which goes from the left edge</span>
<a name="l00499"></a>00499     <span class="comment">// of the array to the right index and read those data.</span>
<a name="l00500"></a>00500     <span class="comment">// (Don&#39;t call a.clear_constraint() since that will clear the constraint on</span>
<a name="l00501"></a>00501     <span class="comment">// all the dimensions while add_constraint() will replace a constraint on</span>
<a name="l00502"></a>00502     <span class="comment">// the given dimension).</span>
<a name="l00503"></a>00503 
<a name="l00504"></a>00504     <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;Constraint for the right half: &quot;</span> &lt;&lt; 0
<a name="l00505"></a>00505         &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; get_longitude_index_right() &lt;&lt; endl);
<a name="l00506"></a>00506 
<a name="l00507"></a>00507     a.<a class="code" href="classlibdap_1_1Array.html#a538f7c336e26b873f50e033d553bba26" title="Adds a constraint to an Array dimension.">add_constraint</a>(lon_dim, 0, 1, get_longitude_index_right());
<a name="l00508"></a>00508     a.<a class="code" href="classlibdap_1_1Vector.html#a58712de8871e28a48fdc95e72a09df71" title="Indicates that the data is ready to send.">set_read_p</a>(<span class="keyword">false</span>);
<a name="l00509"></a>00509     a.<a class="code" href="classlibdap_1_1BaseType.html#a1da003c53f2e663223f603ab3fbd7c8e" title="Read data into a local buffer.">read</a>();
<a name="l00510"></a>00510     <a class="code" href="debug_8h.html#ac1f764c266c50f0050e33557004c914c">DBG2</a>(a.<a class="code" href="classlibdap_1_1Array.html#af7bdf05ad5a57a517aa6b122b03f06df" title="Prints the value of the variable.">print_val</a>(stderr));
<a name="l00511"></a>00511 
<a name="l00512"></a>00512     <span class="keywordtype">char</span> *right_data = (<span class="keywordtype">char</span>*)a.<a class="code" href="classlibdap_1_1Vector.html#a2803db526bd03df4beed106ee7dc6a4b" title="Get a copy of the data held by this variable. Read data from this variable&amp;#39;s internal storage and...">value</a>();
<a name="l00513"></a>00513     <span class="keywordtype">int</span> right_size = a.<a class="code" href="classlibdap_1_1Vector.html#a2a3c2d3b4a1fb3e88ee8737c1a33320a" title="Returns the width of the data, in bytes.">width</a>();
<a name="l00514"></a>00514 
<a name="l00515"></a>00515     <span class="comment">// Make one big lump O&#39;data</span>
<a name="l00516"></a>00516     d_array_data_size = left_size + right_size;
<a name="l00517"></a>00517     d_array_data = <span class="keyword">new</span> <span class="keywordtype">char</span>[d_array_data_size];
<a name="l00518"></a>00518 
<a name="l00519"></a>00519     <span class="comment">// Assume COARDS conventions are being followed: lon varies fastest.</span>
<a name="l00520"></a>00520     <span class="comment">// These *_elements variables are actually elements * bytes/element since</span>
<a name="l00521"></a>00521     <span class="comment">// memcpy() uses bytes.</span>
<a name="l00522"></a>00522     <span class="keywordtype">int</span> elem_size = a.<a class="code" href="classlibdap_1_1Vector.html#aa5ccb30d1f27ae587f35216b859feec7">var</a>()-&gt;<a class="code" href="classlibdap_1_1BaseType.html#a3058467f1e80a41f3cf1068ec9ec68ed" title="Returns the size of the class instance data.">width</a>();
<a name="l00523"></a>00523     <span class="keywordtype">int</span> left_row_size = (get_lon_length() - get_longitude_index_left()) * elem_size;
<a name="l00524"></a>00524     <span class="keywordtype">int</span> right_row_size = (get_longitude_index_right() + 1) * elem_size;
<a name="l00525"></a>00525     <span class="keywordtype">int</span> total_bytes_per_row = left_row_size + right_row_size;
<a name="l00526"></a>00526 
<a name="l00527"></a>00527     <a class="code" href="debug_8h.html#ac1f764c266c50f0050e33557004c914c">DBG2</a>(cerr &lt;&lt; <span class="stringliteral">&quot;elem_size: &quot;</span> &lt;&lt; elem_size &lt;&lt; <span class="stringliteral">&quot;; left &amp; right size: &quot;</span>
<a name="l00528"></a>00528             &lt;&lt; left_row_size &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; right_row_size &lt;&lt; endl);
<a name="l00529"></a>00529 
<a name="l00530"></a>00530     <span class="comment">// This will work for any number of dimension so long as longitude is the</span>
<a name="l00531"></a>00531     <span class="comment">// right-most array dimension.</span>
<a name="l00532"></a>00532     <span class="keywordtype">int</span> rows_to_copy = count_dimensions_except_longitude(a);
<a name="l00533"></a>00533     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; rows_to_copy; ++i) {
<a name="l00534"></a>00534         <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;Copying &quot;</span> &lt;&lt; i &lt;&lt; <span class="stringliteral">&quot;th row&quot;</span> &lt;&lt; endl);
<a name="l00535"></a>00535         <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;left memcpy: &quot;</span> &lt;&lt; *(<span class="keywordtype">float</span> *)(left_data + (left_row_size * i)) &lt;&lt; endl);
<a name="l00536"></a>00536 
<a name="l00537"></a>00537         memcpy(d_array_data + (total_bytes_per_row * i),
<a name="l00538"></a>00538                left_data + (left_row_size * i),
<a name="l00539"></a>00539                left_row_size);
<a name="l00540"></a>00540 
<a name="l00541"></a>00541         <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;right memcpy: &quot;</span> &lt;&lt; *(<span class="keywordtype">float</span> *)(right_data + (right_row_size * i)) &lt;&lt; endl);
<a name="l00542"></a>00542 
<a name="l00543"></a>00543         memcpy(d_array_data + (total_bytes_per_row * i) + left_row_size,
<a name="l00544"></a>00544                right_data + (right_row_size * i),
<a name="l00545"></a>00545                right_row_size);
<a name="l00546"></a>00546     }
<a name="l00547"></a>00547 
<a name="l00548"></a>00548     <span class="keyword">delete</span>[]left_data;
<a name="l00549"></a>00549     <span class="keyword">delete</span>[]right_data;
<a name="l00550"></a>00550 }
<a name="l00551"></a>00551 
<a name="l00554"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#a38326671c5124e653b450164c00fc490">00554</a> GeoConstraint::GeoConstraint()
<a name="l00555"></a>00555         : d_array_data(0), d_array_data_size(0),
<a name="l00556"></a>00556         d_lat(0), d_lon(0),
<a name="l00557"></a>00557         d_bounding_box_set(false),
<a name="l00558"></a>00558         d_longitude_rightmost(false),
<a name="l00559"></a>00559         d_longitude_notation(unknown_notation),
<a name="l00560"></a>00560         d_latitude_sense(unknown_sense)
<a name="l00561"></a>00561 {
<a name="l00562"></a>00562     <span class="comment">// Build sets of attribute values for easy searching. Maybe overkill???</span>
<a name="l00563"></a>00563     d_coards_lat_units.insert(<span class="stringliteral">&quot;degrees_north&quot;</span>);
<a name="l00564"></a>00564     d_coards_lat_units.insert(<span class="stringliteral">&quot;degree_north&quot;</span>);
<a name="l00565"></a>00565     d_coards_lat_units.insert(<span class="stringliteral">&quot;degree_N&quot;</span>);
<a name="l00566"></a>00566     d_coards_lat_units.insert(<span class="stringliteral">&quot;degrees_N&quot;</span>);
<a name="l00567"></a>00567 
<a name="l00568"></a>00568     d_coards_lon_units.insert(<span class="stringliteral">&quot;degrees_east&quot;</span>);
<a name="l00569"></a>00569     d_coards_lon_units.insert(<span class="stringliteral">&quot;degree_east&quot;</span>);
<a name="l00570"></a>00570     d_coards_lon_units.insert(<span class="stringliteral">&quot;degrees_E&quot;</span>);
<a name="l00571"></a>00571     d_coards_lon_units.insert(<span class="stringliteral">&quot;degree_E&quot;</span>);
<a name="l00572"></a>00572 
<a name="l00573"></a>00573     d_lat_names.insert(<span class="stringliteral">&quot;COADSY&quot;</span>);
<a name="l00574"></a>00574     d_lat_names.insert(<span class="stringliteral">&quot;lat&quot;</span>);
<a name="l00575"></a>00575     d_lat_names.insert(<span class="stringliteral">&quot;Lat&quot;</span>);
<a name="l00576"></a>00576     d_lat_names.insert(<span class="stringliteral">&quot;LAT&quot;</span>);
<a name="l00577"></a>00577 
<a name="l00578"></a>00578     d_lon_names.insert(<span class="stringliteral">&quot;COADSX&quot;</span>);
<a name="l00579"></a>00579     d_lon_names.insert(<span class="stringliteral">&quot;lon&quot;</span>);
<a name="l00580"></a>00580     d_lon_names.insert(<span class="stringliteral">&quot;Lon&quot;</span>);
<a name="l00581"></a>00581     d_lon_names.insert(<span class="stringliteral">&quot;LON&quot;</span>);
<a name="l00582"></a>00582 }
<a name="l00583"></a>00583 
<a name="l00594"></a><a class="code" href="classlibdap_1_1GeoConstraint.html#a971205af9b456f4594f01aa513b6543c">00594</a> <span class="keywordtype">void</span> <a class="code" href="classlibdap_1_1GeoConstraint.html#a971205af9b456f4594f01aa513b6543c">GeoConstraint::set_bounding_box</a>(<span class="keywordtype">double</span> top, <span class="keywordtype">double</span> left,
<a name="l00595"></a>00595                                      <span class="keywordtype">double</span> bottom, <span class="keywordtype">double</span> right)
<a name="l00596"></a>00596 {
<a name="l00597"></a>00597     <span class="comment">// Ensure this method is called only once. What about pthreads?</span>
<a name="l00598"></a>00598     <span class="comment">// The method Array::reset_constraint() might make this so it could be</span>
<a name="l00599"></a>00599     <span class="comment">// called more than once. jhrg 8/30/06</span>
<a name="l00600"></a>00600     <span class="keywordflow">if</span> (d_bounding_box_set)
<a name="l00601"></a>00601         <span class="keywordflow">throw</span> <a class="code" href="classlibdap_1_1Error.html" title="A class for error processing.">Error</a>(<span class="stringliteral">&quot;It is not possible to register more than one geographical constraint on a variable.&quot;</span>);
<a name="l00602"></a>00602 
<a name="l00603"></a>00603     <span class="comment">// Record the &#39;sense&#39; of the latitude for use here and later on.</span>
<a name="l00604"></a>00604     d_latitude_sense = <a class="code" href="classlibdap_1_1GeoConstraint.html#a1f0111c7077e67459f9e3b47161848a7">categorize_latitude</a>();
<a name="l00605"></a>00605 <span class="preprocessor">#if 0</span>
<a name="l00606"></a>00606 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (d_latitude_sense == <a class="code" href="classlibdap_1_1GeoConstraint.html#a2304140a3b6310c6ed8bce30ebdaed7ba77fdac07a46105592ea0707f365f04c6">inverted</a>)
<a name="l00607"></a>00607         <span class="keywordflow">throw</span> <a class="code" href="classlibdap_1_1Error.html" title="A class for error processing.">Error</a>(<span class="stringliteral">&quot;geogrid() does not currently work with inverted data (data where the north pole is at a negative latitude value).&quot;</span>);
<a name="l00608"></a>00608 <span class="preprocessor">#endif</span>
<a name="l00609"></a>00609 <span class="preprocessor"></span>
<a name="l00610"></a>00610     <span class="comment">// Categorize the notation used by the bounding box (0/359 or -180/179).</span>
<a name="l00611"></a>00611     d_longitude_notation = <a class="code" href="classlibdap_1_1GeoConstraint.html#a05015b19dc58da44a8c401562a2b5c65">categorize_notation</a>(left, right);
<a name="l00612"></a>00612 
<a name="l00613"></a>00613     <span class="comment">// If the notation uses -180/179, transform the request to 0/359 notation.</span>
<a name="l00614"></a>00614     <span class="keywordflow">if</span> (d_longitude_notation == <a class="code" href="classlibdap_1_1GeoConstraint.html#ad02233f3f59e758747227be620b40d12af4021ad4ef44093b0d31a7dff458059e">neg_pos</a>)
<a name="l00615"></a>00615         <a class="code" href="classlibdap_1_1GeoConstraint.html#adf09e62fff4bc76f2820e947d45f21bf">transform_constraint_to_pos_notation</a>(left, right);
<a name="l00616"></a>00616 
<a name="l00617"></a>00617     <span class="comment">// If the grid uses -180/179, transform it to 0/359 as well. This will make</span>
<a name="l00618"></a>00618     <span class="comment">// subsequent logic easier and adds only a few extra operations, even with</span>
<a name="l00619"></a>00619     <span class="comment">// large maps.</span>
<a name="l00620"></a>00620     <a class="code" href="classlibdap_1_1GeoConstraint.html#ad02233f3f59e758747227be620b40d12">Notation</a> longitude_notation =
<a name="l00621"></a>00621         <a class="code" href="classlibdap_1_1GeoConstraint.html#a05015b19dc58da44a8c401562a2b5c65">categorize_notation</a>(d_lon[0], d_lon[d_lon_length - 1]);
<a name="l00622"></a>00622 
<a name="l00623"></a>00623     <span class="keywordflow">if</span> (longitude_notation == <a class="code" href="classlibdap_1_1GeoConstraint.html#ad02233f3f59e758747227be620b40d12af4021ad4ef44093b0d31a7dff458059e">neg_pos</a>)
<a name="l00624"></a>00624         <a class="code" href="classlibdap_1_1GeoConstraint.html#a6651f68d957189fe33cc81f2193b6ef6">transform_longitude_to_pos_notation</a>();
<a name="l00625"></a>00625 
<a name="l00626"></a>00626     <span class="keywordflow">if</span> (!<a class="code" href="classlibdap_1_1GeoConstraint.html#a9039ef1033b512b10034fd5f7c1a129f">is_bounding_box_valid</a>(left, top, right, bottom))
<a name="l00627"></a>00627         <span class="keywordflow">throw</span> <a class="code" href="classlibdap_1_1Error.html" title="A class for error processing.">Error</a>(<span class="stringliteral">&quot;The bounding box does not intersect any data within this Grid or Array. The\ngeographical extent of these data are from latitude &quot;</span>
<a name="l00628"></a>00628                     + <a class="code" href="namespacelibdap.html#a7c3f898946a0ae498f4ca830731cc474">double_to_string</a>(d_lat[0]) + <span class="stringliteral">&quot; to &quot;</span>
<a name="l00629"></a>00629                     + <a class="code" href="namespacelibdap.html#a7c3f898946a0ae498f4ca830731cc474">double_to_string</a>(d_lat[d_lat_length-1])
<a name="l00630"></a>00630                     + <span class="stringliteral">&quot;\nand longitude &quot;</span> + <a class="code" href="namespacelibdap.html#a7c3f898946a0ae498f4ca830731cc474">double_to_string</a>(d_lon[0])
<a name="l00631"></a>00631                     + <span class="stringliteral">&quot; to &quot;</span> + <a class="code" href="namespacelibdap.html#a7c3f898946a0ae498f4ca830731cc474">double_to_string</a>(d_lon[d_lon_length-1])
<a name="l00632"></a>00632                     + <span class="stringliteral">&quot; while the bounding box provided was latitude &quot;</span>
<a name="l00633"></a>00633                     + <a class="code" href="namespacelibdap.html#a7c3f898946a0ae498f4ca830731cc474">double_to_string</a>(top) + <span class="stringliteral">&quot; to &quot;</span>
<a name="l00634"></a>00634                     + <a class="code" href="namespacelibdap.html#a7c3f898946a0ae498f4ca830731cc474">double_to_string</a>(bottom) + <span class="stringliteral">&quot;\nand longitude &quot;</span>
<a name="l00635"></a>00635                     + <a class="code" href="namespacelibdap.html#a7c3f898946a0ae498f4ca830731cc474">double_to_string</a>(left) + <span class="stringliteral">&quot; to &quot;</span>
<a name="l00636"></a>00636                     + <a class="code" href="namespacelibdap.html#a7c3f898946a0ae498f4ca830731cc474">double_to_string</a>(right));
<a name="l00637"></a>00637 
<a name="l00638"></a>00638     <span class="comment">// This is simpler than the longitude case because there&#39;s no need to</span>
<a name="l00639"></a>00639     <span class="comment">// test for several notations, no need to accommodate them in the return,</span>
<a name="l00640"></a>00640     <span class="comment">// no modulo arithmetic for the axis and no need to account for a</span>
<a name="l00641"></a>00641     <span class="comment">// constraint with two disconnected parts to be joined.</span>
<a name="l00642"></a>00642     <a class="code" href="classlibdap_1_1GeoConstraint.html#a1a9145ad48fdeea6eb810521f836c843">find_latitude_indeces</a>(top, bottom, d_latitude_sense,
<a name="l00643"></a>00643                           d_latitude_index_top, d_latitude_index_bottom);
<a name="l00644"></a>00644 
<a name="l00645"></a>00645 
<a name="l00646"></a>00646     <span class="comment">// Find the longitude map indexes that correspond to the bounding box.</span>
<a name="l00647"></a>00647     <a class="code" href="classlibdap_1_1GeoConstraint.html#ae8919739ddc3071a4b472d0234ca4300">find_longitude_indeces</a>(left, right, d_longitude_index_left,
<a name="l00648"></a>00648                            d_longitude_index_right);
<a name="l00649"></a>00649 
<a name="l00650"></a>00650     <a class="code" href="debug_8h.html#a32adf79142f0a426b5e782fb7cd4cad3">DBG</a>(cerr &lt;&lt; <span class="stringliteral">&quot;Bounding box (tlbr): &quot;</span> &lt;&lt; d_latitude_index_top &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>
<a name="l00651"></a>00651         &lt;&lt; d_longitude_index_left &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>
<a name="l00652"></a>00652         &lt;&lt; d_latitude_index_bottom &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>
<a name="l00653"></a>00653         &lt;&lt; d_longitude_index_right &lt;&lt; endl);
<a name="l00654"></a>00654 
<a name="l00655"></a>00655     d_bounding_box_set = <span class="keyword">true</span>;
<a name="l00656"></a>00656 }
<a name="l00657"></a>00657 
<a name="l00658"></a>00658 } <span class="comment">// namespace libdap</span>
</pre></div></div>
</div>
  <div id="nav-path" class="navpath">
    <ul>
      <li class="navelem"><a class="el" href="GeoConstraint_8cc.html">GeoConstraint.cc</a>      </li>
      <li class="footer">Generated on Tue Feb 8 2011 for libdap++ by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </li>
    </ul>
  </div>

</body>
</html>