<p><b>duda</b> 2012-04-26 18:24:48 -0600 (Thu, 26 Apr 2012)</p><p>To correct an issue with reading and writing fields with multiple time levels, generate code <br>
to shift time levels below the field DDT level, such that a pointer to, e.g., state % time_levs(1) % state % xtime <br>
will always point to the current value for a field after a call to mpas_shift_time_levels_state().<br>
<br>
<br>
M    src/registry/gen_inc.c<br>
</p><hr noshade><pre><font color="gray">Modified: trunk/mpas/src/registry/gen_inc.c
===================================================================
--- trunk/mpas/src/registry/gen_inc.c        2012-04-26 22:00:31 UTC (rev 1821)
+++ trunk/mpas/src/registry/gen_inc.c        2012-04-27 00:24:48 UTC (rev 1822)
@@ -187,6 +187,7 @@
    int i;
    int class_start, class_end;
    int vtype;
+   char type_str[7];
 
 
    /*
@@ -888,13 +889,70 @@
          fortprintf(fd, &quot;      type (%s_multilevel_type), intent(inout) :: %s</font>
<font color="black">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
          fortprintf(fd, &quot;</font>
<font color="black">&quot;);
          fortprintf(fd, &quot;      integer :: i</font>
<font color="red">&quot;);
-         fortprintf(fd, &quot;      type (%s_type), pointer :: sptr</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+         fortprintf(fd, &quot;      real (kind=RKIND) :: real0d</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      real (kind=RKIND), dimension(:), pointer :: real1d</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      real (kind=RKIND), dimension(:,:), pointer :: real2d</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      real (kind=RKIND), dimension(:,:,:), pointer :: real3d</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      integer :: int0d</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      integer, dimension(:), pointer :: int1d</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      integer, dimension(:,:), pointer :: int2d</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      integer, dimension(:,:,:), pointer :: int3d</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      character (len=64) :: char0d</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      character (len=64), dimension(:), pointer :: char1d</font>
<font color="black">&quot;);
          fortprintf(fd, &quot;</font>
<font color="red">&quot;);
-         fortprintf(fd, &quot;      sptr =&gt; %s %% time_levs(1) %% %s</font>
<font color="red">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
-         fortprintf(fd, &quot;      do i=1,%s %% nTimeLevels-1</font>
<font color="red">&quot;, group_ptr-&gt;name);
-         fortprintf(fd, &quot;         %s %% time_levs(i) %% %s =&gt; %s %% time_levs(i+1) %% %s</font>
<font color="red">&quot;, group_ptr-&gt;name, group_ptr-&gt;name, group_ptr-&gt;name, group_ptr-&gt;name);
-         fortprintf(fd, &quot;      end do</font>
<font color="red">&quot;);
-         fortprintf(fd, &quot;      %s %% time_levs(%s %% nTimeLevels) %% %s =&gt; sptr</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name, group_ptr-&gt;name);
+         var_list_ptr = group_ptr-&gt;vlist;
+         while (var_list_ptr) {
+            var_ptr = var_list_ptr-&gt;var;
+
+            if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) 
+            {
+               if (var_ptr-&gt;vtype == INTEGER) sprintf(type_str, &quot;int%id&quot;, var_ptr-&gt;ndims+1); 
+               else if (var_ptr-&gt;vtype == REAL) sprintf(type_str, &quot;real%id&quot;, var_ptr-&gt;ndims+1); 
+               else if (var_ptr-&gt;vtype == CHARACTER) sprintf(type_str, &quot;char%id&quot;, var_ptr-&gt;ndims+1); 
+
+               memcpy(super_array, var_ptr-&gt;super_array, 1024);
+
+               while (var_list_ptr &amp;&amp; strncmp(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024) == 0)
+               {
+                  var_list_ptr2 = var_list_ptr;
+                  var_list_ptr = var_list_ptr-&gt;next;
+               }
+               var_ptr2 = var_list_ptr2-&gt;var;
+
+               fortprintf(fd, &quot;      %s =&gt; %s %% time_levs(1) %% %s %% %s %% array</font>
<font color="blue">&quot;, type_str, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr2-&gt;super_array);
+
+               fortprintf(fd, &quot;      do i=1,%s %% nTimeLevels-1</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+               fortprintf(fd, &quot;         %s %% time_levs(i) %% %s %% %s %% array =&gt; %s %% time_levs(i+1) %% %s %% %s %% array</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr2-&gt;super_array, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr2-&gt;super_array);
+               fortprintf(fd, &quot;      end do</font>
<font color="blue">&quot;);
+
+               fortprintf(fd, &quot;      %s %% time_levs(%s %% nTimeLevels) %% %s %% %s %% array=&gt; %s</font>
<font color="black"></font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr2-&gt;super_array, type_str);
+            }
+            else {
+
+               if (var_ptr-&gt;vtype == INTEGER) sprintf(type_str, &quot;int%id&quot;, var_ptr-&gt;ndims); 
+               else if (var_ptr-&gt;vtype == REAL) sprintf(type_str, &quot;real%id&quot;, var_ptr-&gt;ndims); 
+               else if (var_ptr-&gt;vtype == CHARACTER) sprintf(type_str, &quot;char%id&quot;, var_ptr-&gt;ndims); 
+
+               if (var_ptr-&gt;ndims &gt; 0) 
+                  fortprintf(fd, &quot;      %s =&gt; %s %% time_levs(1) %% %s %% %s %% array</font>
<font color="blue">&quot;, type_str, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
+               else
+                  fortprintf(fd, &quot;      %s = %s %% time_levs(1) %% %s %% %s %% scalar</font>
<font color="blue">&quot;, type_str, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
+
+               fortprintf(fd, &quot;      do i=1,%s %% nTimeLevels-1</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+               if (var_ptr-&gt;ndims &gt; 0) 
+                  fortprintf(fd, &quot;         %s %% time_levs(i) %% %s %% %s %% array =&gt; %s %% time_levs(i+1) %% %s %% %s %% array</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr-&gt;name_in_code, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
+               else
+                  fortprintf(fd, &quot;         %s %% time_levs(i) %% %s %% %s %% scalar = %s %% time_levs(i+1) %% %s %% %s %% scalar</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr-&gt;name_in_code, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      end do</font>
<font color="blue">&quot;);
+
+               if (var_ptr-&gt;ndims &gt; 0) 
+                  fortprintf(fd, &quot;      %s %% time_levs(%s %% nTimeLevels) %% %s %% %s %% array=&gt; %s</font>
<font color="black"></font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr-&gt;name_in_code, type_str);
+               else
+                  fortprintf(fd, &quot;      %s %% time_levs(%s %% nTimeLevels) %% %s %% %s %% scalar = %s</font>
<font color="black"></font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name, group_ptr-&gt;name, var_ptr-&gt;name_in_code, type_str);
+
+               var_list_ptr = var_list_ptr-&gt;next;
+            }
+         }
          fortprintf(fd, &quot;</font>
<font color="black">&quot;);
          fortprintf(fd, &quot;   end subroutine mpas_shift_time_levels_%s</font>
<font color="black"></font>
<font color="black"></font>
<font color="black">&quot;, group_ptr-&gt;name);
       }

</font>
</pre>