<p><b>duda</b> 2011-11-23 15:34:46 -0700 (Wed, 23 Nov 2011)</p><p>BRANCH COMMIT<br>
<br>
Handle super-arrays in PIO output (e.g., scalars -&gt; qv,qc,qr,qi,... on output).<br>
<br>
<br>
M    src/registry/gen_inc.c<br>
</p><hr noshade><pre><font color="gray">Modified: branches/pio/src/registry/gen_inc.c
===================================================================
--- branches/pio/src/registry/gen_inc.c        2011-11-23 21:31:16 UTC (rev 1211)
+++ branches/pio/src/registry/gen_inc.c        2011-11-23 22:34:46 UTC (rev 1212)
@@ -2287,8 +2287,8 @@
       while (var_list_ptr) {
          var_ptr = var_list_ptr-&gt;var;
 
-/* MGD FOR NOW, NO SCALAR FIELDS OR SUPER-ARRAYS */
-if (var_ptr-&gt;ndims &gt; 0 &amp;&amp; strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) == 0) {
+/* MGD FOR NOW, NO SCALAR FIELDS */
+if (var_ptr-&gt;ndims &gt; 0) {
          if (group_ptr-&gt;vlist-&gt;var-&gt;ntime_levs &gt; 1)
             snprintf(struct_deref, 1024, &quot;domain %% blocklist %% %s %% time_levs(1) %% %s&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
          else
@@ -2301,7 +2301,6 @@
          else if (var_ptr-&gt;vtype == CHARACTER) sprintf(vtype, &quot;char&quot;); 
    
          if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
-/* MGD SUPER-ARRAYS FOR NOW? */
             fortprintf(fd, &quot;      if ((%s %% %s %% ioinfo %% output .and. output_obj %% stream == OUTPUT) .or. &amp;</font>
<font color="black">&quot;, struct_deref, var_ptr-&gt;super_array);
             fortprintf(fd, &quot;          (%s %% %s %% ioinfo %% restart .and. output_obj %% stream == RESTART) .or. &amp;</font>
<font color="black">&quot;, struct_deref, var_ptr-&gt;super_array);
             fortprintf(fd, &quot;          (%s %% %s %% ioinfo %% sfc .and. output_obj %% stream == SFC)) then</font>
<font color="gray">&quot;, struct_deref, var_ptr-&gt;super_array);
@@ -2312,7 +2311,63 @@
             fortprintf(fd, &quot;          (%s %% %s %% ioinfo %% sfc .and. output_obj %% stream == SFC)) then</font>
<font color="red">&quot;, struct_deref, var_ptr-&gt;name_in_code);
          }
 
-         /******/
+         if (var_ptr-&gt;vtype == INTEGER) sprintf(vtype, &quot;int&quot;); 
+         else if (var_ptr-&gt;vtype == REAL) sprintf(vtype, &quot;real&quot;); 
+         else if (var_ptr-&gt;vtype == CHARACTER) sprintf(vtype, &quot;char&quot;); 
+
+         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
+            if (var_ptr-&gt;ndims &gt; 0) {
+               fortprintf(fd, &quot;         allocate(super_%s%id(&quot;, vtype, var_ptr-&gt;ndims);
+               i = 1;
+               dimlist_ptr = var_ptr-&gt;dimlist;
+               while (dimlist_ptr) {
+                  if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0)
+                     if (!dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;domain %% blocklist %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                     else fortprintf(fd, &quot;domain %% blocklist %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_file);
+                  else
+                     fortprintf(fd, &quot;%s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+   
+                  if (i &lt; var_ptr-&gt;ndims) fortprintf(fd, &quot;, &quot;);
+      
+                  dimlist_ptr = dimlist_ptr-&gt;next;
+                  i++;
+               }
+               fortprintf(fd, &quot;))</font>
<font color="black"></font>
<font color="blue">&quot;);
+            }
+
+            /* Copy from field to super_ array */
+            i = 1;
+            dimlist_ptr = var_ptr-&gt;dimlist;
+            while (i &lt;= var_ptr-&gt;ndims) {
+               if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0)
+                  if (!dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;         do i%i=1,domain %% blocklist %% mesh %% %s</font>
<font color="blue">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                  else fortprintf(fd, &quot;         do i%i=1,domain %% blocklist %% mesh %% %s</font>
<font color="blue">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_file);
+               else
+                  fortprintf(fd, &quot;         do i%i=1,%s</font>
<font color="blue">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
+
+               i++;
+               dimlist_ptr = dimlist_ptr-&gt;next;
+            }
+
+            fortprintf(fd, &quot;            super_%s%id(&quot;, vtype, var_ptr-&gt;ndims);
+            for(i=1; i&lt;=var_ptr-&gt;ndims; i++) {
+               fortprintf(fd, &quot;i%i&quot;,i);
+               if (i &lt; var_ptr-&gt;ndims) fortprintf(fd, &quot;,&quot;);
+            }
+            fortprintf(fd, &quot;) = %s %% %s %% array(&quot;, struct_deref, var_ptr-&gt;super_array);
+            fortprintf(fd, &quot;%s %% index_%s&quot;, struct_deref, var_ptr-&gt;name_in_code);
+            for(i=1; i&lt;=var_ptr-&gt;ndims; i++) {
+               fortprintf(fd, &quot;,i%i&quot;,i);
+            }
+            fortprintf(fd, &quot;)</font>
<font color="blue">&quot;);
+   
+            i = 1;
+            while (i &lt;= var_ptr-&gt;ndims) {
+               fortprintf(fd, &quot;         end do</font>
<font color="gray">&quot;);
+               i++;
+            }
+         }
+
          sprintf(temp, &quot;&quot;);
          dimlist_ptr = var_ptr-&gt;dimlist;
 
@@ -2325,13 +2380,18 @@
          }
          if (var_ptr-&gt;timedim) fortprintf(fd, &quot;         call PIO_setframe(output_obj %% pioVarID%s, pio_time)</font>
<font color="gray">&quot;, var_ptr-&gt;name_in_file);
          fortprintf(fd, &quot;         call PIO_write_darray(output_obj %% pio_file, output_obj %% pioVarID%s, &quot;, var_ptr-&gt;name_in_file);
-/* Handle scalars */
          if (var_ptr-&gt;ndims != 0) {
 /* MGD NEED TO USE CORRECT IODESC FOR THE TYPE OF THIS VARIABLE */
             if (var_ptr-&gt;vtype == REAL)
-               fortprintf(fd, &quot;output_obj %% iodesc%s_Dbl, %s %% %s %% array(&quot;, temp, struct_deref, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;output_obj %% iodesc%s_Dbl, &quot;, temp);
             else
-               fortprintf(fd, &quot;output_obj %% iodesc%s_Int, %s %% %s %% array(&quot;, temp, struct_deref, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;output_obj %% iodesc%s_Int, &quot;, temp);
+
+            if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0)
+               fortprintf(fd, &quot;super_%s%id(&quot;, vtype, var_ptr-&gt;ndims);
+            else
+               fortprintf(fd, &quot;%s %% %s %% array(&quot;, struct_deref, var_ptr-&gt;name_in_code);
+
             dimlist_ptr = var_ptr-&gt;dimlist;
             i = 1;
             while(dimlist_ptr) {
@@ -2349,7 +2409,9 @@
             }
             fortprintf(fd, &quot;), i1)</font>
<font color="red">&quot;);
          }
-         /******/
+
+         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0)
+            fortprintf(fd, &quot;         deallocate(super_%s%id)</font>
<font color="black">&quot;, vtype, var_ptr-&gt;ndims);
    
          fortprintf(fd, &quot;      end if</font>
<font color="black"></font>
<font color="gray">&quot;);
 }
@@ -2534,10 +2596,11 @@
    fortprintf(fd, &quot;</font>
<font color="red">&quot;);
 
    var_ptr = vars;
+
    while (var_ptr) {
 
-/* MGD FOR NOW, NO SCALAR FIELDS OR SUPER-ARRAYS */
-if (var_ptr-&gt;ndims &gt; 0 &amp;&amp; strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) == 0 &amp;&amp; (var_ptr-&gt;vtype == INTEGER || var_ptr-&gt;vtype == REAL)) {
+/* MGD FOR NOW, NO SCALAR OR CHARACTER FIELDS */
+if (var_ptr-&gt;ndims &gt; 0 &amp;&amp; (var_ptr-&gt;vtype == INTEGER || var_ptr-&gt;vtype == REAL)) {
 
       fortprintf(fd, &quot;      if (.false. &amp;</font>
<font color="black">&quot;);
       if (var_ptr-&gt;iostreams &amp; RESTART0) fortprintf(fd, &quot;          .or. output_obj %% stream == RESTART &amp;</font>
<font color="black">&quot;);

</font>
</pre>