<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, "      type (%s_multilevel_type), intent(inout) :: %s</font>
<font color="black">", group_ptr->name, group_ptr->name);
          fortprintf(fd, "</font>
<font color="black">");
          fortprintf(fd, "      integer :: i</font>
<font color="red">");
-         fortprintf(fd, "      type (%s_type), pointer :: sptr</font>
<font color="blue">", group_ptr->name);
+         fortprintf(fd, "      real (kind=RKIND) :: real0d</font>
<font color="blue">");
+         fortprintf(fd, "      real (kind=RKIND), dimension(:), pointer :: real1d</font>
<font color="blue">");
+         fortprintf(fd, "      real (kind=RKIND), dimension(:,:), pointer :: real2d</font>
<font color="blue">");
+         fortprintf(fd, "      real (kind=RKIND), dimension(:,:,:), pointer :: real3d</font>
<font color="blue">");
+         fortprintf(fd, "      integer :: int0d</font>
<font color="blue">");
+         fortprintf(fd, "      integer, dimension(:), pointer :: int1d</font>
<font color="blue">");
+         fortprintf(fd, "      integer, dimension(:,:), pointer :: int2d</font>
<font color="blue">");
+         fortprintf(fd, "      integer, dimension(:,:,:), pointer :: int3d</font>
<font color="blue">");
+         fortprintf(fd, "      character (len=64) :: char0d</font>
<font color="blue">");
+         fortprintf(fd, "      character (len=64), dimension(:), pointer :: char1d</font>
<font color="black">");
          fortprintf(fd, "</font>
<font color="red">");
-         fortprintf(fd, "      sptr => %s %% time_levs(1) %% %s</font>
<font color="red">", group_ptr->name, group_ptr->name);
-         fortprintf(fd, "      do i=1,%s %% nTimeLevels-1</font>
<font color="red">", group_ptr->name);
-         fortprintf(fd, "         %s %% time_levs(i) %% %s => %s %% time_levs(i+1) %% %s</font>
<font color="red">", group_ptr->name, group_ptr->name, group_ptr->name, group_ptr->name);
-         fortprintf(fd, "      end do</font>
<font color="red">");
-         fortprintf(fd, "      %s %% time_levs(%s %% nTimeLevels) %% %s => sptr</font>
<font color="blue">", group_ptr->name, group_ptr->name, group_ptr->name);
+         var_list_ptr = group_ptr->vlist;
+         while (var_list_ptr) {
+            var_ptr = var_list_ptr->var;
+
+            if (strncmp(var_ptr->super_array, "-", 1024) != 0) 
+            {
+               if (var_ptr->vtype == INTEGER) sprintf(type_str, "int%id", var_ptr->ndims+1); 
+               else if (var_ptr->vtype == REAL) sprintf(type_str, "real%id", var_ptr->ndims+1); 
+               else if (var_ptr->vtype == CHARACTER) sprintf(type_str, "char%id", var_ptr->ndims+1); 
+
+               memcpy(super_array, var_ptr->super_array, 1024);
+
+               while (var_list_ptr && strncmp(super_array, var_list_ptr->var->super_array, 1024) == 0)
+               {
+                  var_list_ptr2 = var_list_ptr;
+                  var_list_ptr = var_list_ptr->next;
+               }
+               var_ptr2 = var_list_ptr2->var;
+
+               fortprintf(fd, "      %s => %s %% time_levs(1) %% %s %% %s %% array</font>
<font color="blue">", type_str, group_ptr->name, group_ptr->name, var_ptr2->super_array);
+
+               fortprintf(fd, "      do i=1,%s %% nTimeLevels-1</font>
<font color="blue">", group_ptr->name);
+               fortprintf(fd, "         %s %% time_levs(i) %% %s %% %s %% array => %s %% time_levs(i+1) %% %s %% %s %% array</font>
<font color="blue">", group_ptr->name, group_ptr->name, var_ptr2->super_array, group_ptr->name, group_ptr->name, var_ptr2->super_array);
+               fortprintf(fd, "      end do</font>
<font color="blue">");
+
+               fortprintf(fd, "      %s %% time_levs(%s %% nTimeLevels) %% %s %% %s %% array=> %s</font>
<font color="black"></font>
<font color="blue">", group_ptr->name, group_ptr->name, group_ptr->name, var_ptr2->super_array, type_str);
+            }
+            else {
+
+               if (var_ptr->vtype == INTEGER) sprintf(type_str, "int%id", var_ptr->ndims); 
+               else if (var_ptr->vtype == REAL) sprintf(type_str, "real%id", var_ptr->ndims); 
+               else if (var_ptr->vtype == CHARACTER) sprintf(type_str, "char%id", var_ptr->ndims); 
+
+               if (var_ptr->ndims > 0) 
+                  fortprintf(fd, "      %s => %s %% time_levs(1) %% %s %% %s %% array</font>
<font color="blue">", type_str, group_ptr->name, group_ptr->name, var_ptr->name_in_code);
+               else
+                  fortprintf(fd, "      %s = %s %% time_levs(1) %% %s %% %s %% scalar</font>
<font color="blue">", type_str, group_ptr->name, group_ptr->name, var_ptr->name_in_code);
+
+               fortprintf(fd, "      do i=1,%s %% nTimeLevels-1</font>
<font color="blue">", group_ptr->name);
+               if (var_ptr->ndims > 0) 
+                  fortprintf(fd, "         %s %% time_levs(i) %% %s %% %s %% array => %s %% time_levs(i+1) %% %s %% %s %% array</font>
<font color="blue">", group_ptr->name, group_ptr->name, var_ptr->name_in_code, group_ptr->name, group_ptr->name, var_ptr->name_in_code);
+               else
+                  fortprintf(fd, "         %s %% time_levs(i) %% %s %% %s %% scalar = %s %% time_levs(i+1) %% %s %% %s %% scalar</font>
<font color="blue">", group_ptr->name, group_ptr->name, var_ptr->name_in_code, group_ptr->name, group_ptr->name, var_ptr->name_in_code);
+               fortprintf(fd, "      end do</font>
<font color="blue">");
+
+               if (var_ptr->ndims > 0) 
+                  fortprintf(fd, "      %s %% time_levs(%s %% nTimeLevels) %% %s %% %s %% array=> %s</font>
<font color="black"></font>
<font color="blue">", group_ptr->name, group_ptr->name, group_ptr->name, var_ptr->name_in_code, type_str);
+               else
+                  fortprintf(fd, "      %s %% time_levs(%s %% nTimeLevels) %% %s %% %s %% scalar = %s</font>
<font color="black"></font>
<font color="blue">", group_ptr->name, group_ptr->name, group_ptr->name, var_ptr->name_in_code, type_str);
+
+               var_list_ptr = var_list_ptr->next;
+            }
+         }
          fortprintf(fd, "</font>
<font color="black">");
          fortprintf(fd, "   end subroutine mpas_shift_time_levels_%s</font>
<font color="black"></font>
<font color="black"></font>
<font color="black">", group_ptr->name);
       }
</font>
</pre>