<p><b>duda</b> 2010-09-16 12:44:25 -0600 (Thu, 16 Sep 2010)</p><p>BRANCH COMMIT<br>
<br>
Commit registry and framework changes for field storage re-organization.<br>
<br>
Note: To avoid scope conflict, definitions of super-array indices (e.g., index_qv)<br>
have been moved into the structures that immediately contain the super-arrays.<br>
For example, rather than scalars(index_qv, k, iCell), it will be necessary to use <br>
scalars(state % index_qv, k, iCell).<br>
<br>
Note: The order of arguments in copy_* routines (e.g., copy_state) has been changed<br>
so that the first argument is the destination and the second argument is the source;<br>
this was done to be more in line with the C standard library convention (e.g., memcpy).<br>
It would be trivial to change back to the original (src, dest) order if this causes<br>
too much confusion, though.<br>
<br>
Note: Until operators and core directories are converted to use new data types, <br>
the code will *not* compile.<br>
<br>
<br>
M    registry/parse.c<br>
M    registry/gen_inc.h<br>
M    registry/gen_inc.c<br>
M    registry/registry_types.h<br>
M    framework/module_io_output.F<br>
M    framework/module_grid_types.F<br>
</p><hr noshade><pre><font color="gray">Modified: branches/registry_reorg/src/framework/module_grid_types.F
===================================================================
--- branches/registry_reorg/src/framework/module_grid_types.F        2010-09-15 17:03:13 UTC (rev 499)
+++ branches/registry_reorg/src/framework/module_grid_types.F        2010-09-16 18:44:25 UTC (rev 500)
@@ -4,8 +4,7 @@
 
    integer, parameter :: nTimeLevs = 2
 
-#include &quot;super_array_indices.inc&quot;
-  
+
    ! Derived type describing info for doing I/O specific to a field
    type io_info
       character (len=1024) :: fieldName
@@ -66,7 +65,7 @@
 
 
    ! Derived type for storing grid meta-data
-   type grid_meta
+   type mesh_type
 
 #include &quot;field_dimensions.inc&quot;
 
@@ -75,21 +74,12 @@
 
 #include &quot;time_invariant_fields.inc&quot;
 
-   end type grid_meta
+   end type mesh_type
 
 
-   ! Derived type for storing model state
-   type grid_state
+#include &quot;variable_groups.inc&quot;
 
-#include &quot;time_varying_fields.inc&quot;
 
-   end type grid_state
-
-   type grid_state_ptr
-      type (grid_state), pointer :: state
-   end type grid_state_ptr
-
-
    ! Type for storing (possibly architecture specific) information concerning to parallelism
    type parallel_info
       type (exchange_list), pointer :: cellsToSend            ! List of types describing which cells to send to other blocks
@@ -105,11 +95,8 @@
    type block_type
       integer :: storageFactor    ! Additional storage used by time integration scheme
 
-      type (grid_meta), pointer :: mesh
-      type (grid_state_ptr), pointer, dimension(:) :: time_levs
+#include &quot;block_group_members.inc&quot;
 
-      type (grid_state), allocatable, dimension(:) :: intermediate_step
-
       type (domain_type), pointer :: domain
 
       type (parallel_info), pointer :: parinfo
@@ -170,60 +157,21 @@
       nullify(b % prev)
       nullify(b % next)
 
-      allocate(b % time_levs(nTimeLevs))
-
-      allocate(b % mesh)
-      call allocate_grid_meta(b % mesh, &amp;
-#include &quot;dim_dummy_args.inc&quot;
-                             )
-  
-      do i=1,nTimeLevs
-         allocate(b % time_levs(i) % state)
-         call allocate_grid_state(b % time_levs(i) % state, b)
-      end do
-
       key = 'STORAGE_FACTOR'
       call mpas_query(key, b % storageFactor)
 
-      ! Allocate storage for intermediate steps used by time integration scheme
-      allocate(b % intermediate_step(b % storageFactor))
-      do i=1,b % storageFactor
-         call allocate_grid_state(b % intermediate_step(i), b)
-      end do
-
       allocate(b % parinfo)
 
       b % domain =&gt; dom
 
+#include &quot;block_allocs.inc&quot;
+
    end subroutine allocate_block
 
 
-   subroutine allocate_grid_meta(g, &amp;
-#include &quot;dim_dummy_args.inc&quot;
-                                )
+#include &quot;group_alloc_routines.inc&quot;
 
-      implicit none
 
-      type (grid_meta), intent(inout) :: g
-#include &quot;dim_dummy_decls.inc&quot;
-
-#include &quot;grid_meta_allocs.inc&quot;
-
-   end subroutine allocate_grid_meta
-
-
-   subroutine allocate_grid_state(s, b)
-
-      implicit none
-
-      type (grid_state), intent(inout) :: s
-      type (block_type), pointer :: b
-
-#include &quot;grid_state_allocs.inc&quot;
-
-   end subroutine allocate_grid_state
-
-
    subroutine deallocate_domain(dom)
 
       implicit none
@@ -251,78 +199,19 @@
 
       integer :: i
 
-      call deallocate_grid_meta(b % mesh)
-      deallocate(b % mesh)
-      do i=1,nTimeLevs
-         call deallocate_grid_state(b % time_levs(i) % state)
-         deallocate(b % time_levs(i) % state)
-      end do
-      deallocate(b % time_levs)
-      do i=1,b % storageFactor
-         call deallocate_grid_state(b % intermediate_step(i))
-      end do
-      deallocate(b % intermediate_step)
       deallocate(b % parinfo)
 
+#include &quot;block_deallocs.inc&quot;
+
    end subroutine deallocate_block
 
 
-   subroutine deallocate_grid_meta(g)
+#include &quot;group_dealloc_routines.inc&quot;
 
-      implicit none
 
-      type (grid_meta), intent(inout) :: g
+#include &quot;group_copy_routines.inc&quot;
 
-#include &quot;grid_meta_deallocs.inc&quot;
 
-   end subroutine deallocate_grid_meta
+#include &quot;group_shift_level_routines.inc&quot;
 
-
-   subroutine deallocate_grid_state(s)
-
-      implicit none
-
-      type (grid_state), intent(inout) :: s
-
-#include &quot;grid_state_deallocs.inc&quot;
-
-   end subroutine deallocate_grid_state
-
-
-   subroutine copy_state(src, dest)
-
-      implicit none
-
-      type (grid_state), intent(in) :: src
-      type (grid_state), intent(inout) :: dest
-
-#include &quot;copy_state.inc&quot;
-  
-   end subroutine copy_state
-
-
-   subroutine shift_time_levels(domain)
-
-      implicit none
-
-      type (domain_type), intent(inout) :: domain
-
-      integer :: i
-      type (block_type), pointer :: block_ptr
-      type (grid_state), pointer :: sptr
-
-      block_ptr =&gt; domain % blocklist
-      do while (associated(block_ptr))
-
-         sptr =&gt; block_ptr % time_levs(1) % state
-         do i=1,nTimeLevs-1
-            block_ptr % time_levs(i) % state =&gt; block_ptr % time_levs(i+1) % state
-         end do
-         block_ptr % time_levs(nTimeLevs) % state =&gt; sptr
-
-         block_ptr =&gt; block_ptr % next
-      end do
-
-   end subroutine shift_time_levels
-
 end module grid_types

Modified: branches/registry_reorg/src/framework/module_io_output.F
===================================================================
--- branches/registry_reorg/src/framework/module_io_output.F        2010-09-15 17:03:13 UTC (rev 499)
+++ branches/registry_reorg/src/framework/module_io_output.F        2010-09-16 18:44:25 UTC (rev 500)
@@ -337,7 +337,7 @@
  
       type (io_output_object), intent(inout) :: output_obj
       type (dm_info), intent(in) :: dminfo
-      type (grid_meta), intent(in) :: mesh
+      type (mesh_type), intent(in) :: mesh
 #include &quot;dim_dummy_decls.inc&quot;
  
       integer :: nferr

Modified: branches/registry_reorg/src/registry/gen_inc.c
===================================================================
--- branches/registry_reorg/src/registry/gen_inc.c        2010-09-15 17:03:13 UTC (rev 499)
+++ branches/registry_reorg/src/registry/gen_inc.c        2010-09-16 18:44:25 UTC (rev 500)
@@ -150,12 +150,15 @@
 }
 
 
-void gen_field_defs(struct variable * vars, struct dimension * dims)
+void gen_field_defs(struct group_list * groups, struct variable * vars, struct dimension * dims)
 {
    struct variable * var_ptr;
    struct variable * var_ptr2;
+   struct variable_list * var_list_ptr;
+   struct variable_list * var_list_ptr2;
    struct dimension * dim_ptr;
    struct dimension_list * dimlist_ptr;
+   struct group_list * group_ptr;
    FILE * fd;
    char super_array[1024];
    char array_class[1024];
@@ -163,59 +166,7 @@
    int class_start, class_end;
    int vtype;
 
-   /*
-    * Generate indices for super arrays
-    */
-   fd = fopen(&quot;super_array_indices.inc&quot;, &quot;w&quot;);
-   var_ptr = vars;
-   memcpy(super_array, var_ptr-&gt;super_array, 1024);
-   i = 1;
-   while (var_ptr) {
-      if (strncmp(super_array, var_ptr-&gt;super_array, 1024) != 0) {
-         memcpy(super_array, var_ptr-&gt;super_array, 1024);
-         i = 1;
-       }
-      if (strncmp(var_ptr-&gt;array_class, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: index_%s = %i</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code, i++);
-      var_ptr = var_ptr-&gt;next;
-   }
-   var_ptr = vars;
-   memcpy(super_array, var_ptr-&gt;super_array, 1024);
-   memcpy(array_class, var_ptr-&gt;array_class, 1024);
-   class_start = 1;
-   class_end = 1;
-   i = 1;
-   while (var_ptr) {
-      if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
-         if (strncmp(super_array, var_ptr-&gt;super_array, 1024) != 0) {
-            if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: %s_end = %i</font>
<font color="red">&quot;, array_class, class_end);
-            if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: num_%s = %i</font>
<font color="red">&quot;, super_array, i);
-            class_start = 1;
-            class_end = 1;
-            i = 1;
-            memcpy(super_array, var_ptr-&gt;super_array, 1024);
-            memcpy(array_class, var_ptr-&gt;array_class, 1024);
-            fortprintf(fd, &quot;      integer :: %s_start = %i</font>
<font color="red">&quot;, array_class, class_start);
-         }
-         else if (strncmp(array_class, var_ptr-&gt;array_class, 1024) != 0) {
-            fortprintf(fd, &quot;      integer :: %s_end = %i</font>
<font color="red">&quot;, array_class, class_end);
-            class_start = class_end+1;
-            class_end = class_start;
-            memcpy(array_class, var_ptr-&gt;array_class, 1024);
-            fortprintf(fd, &quot;      integer :: %s_start = %i</font>
<font color="red">&quot;, array_class, class_start);
-            i++;
-         }
-         else {
-            class_end++;
-            i++;
-         }
-      }
-      var_ptr = var_ptr-&gt;next;
-   }
-   if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: %s_end = %i</font>
<font color="red">&quot;, array_class, class_end);
-   if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: num_%s = %i</font>
<font color="gray">&quot;, super_array, i);
-   fclose(fd);
 
-
    /*
     *  Generate declarations of dimensions
     */
@@ -311,96 +262,278 @@
 
 
    /*
-    *  Generate declarations of time-invariant fields
+    *  Generate declarations of mesh group
     */
    fd = fopen(&quot;time_invariant_fields.inc&quot;, &quot;w&quot;);
-   var_ptr = vars;
-   while (var_ptr) {
-      if (var_ptr-&gt;timedim == 0) {
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
-            memcpy(super_array, var_ptr-&gt;super_array, 1024);
-            memcpy(array_class, var_ptr-&gt;array_class, 1024);
-            vtype = var_ptr-&gt;vtype;
-            while (var_ptr &amp;&amp; strncmp(super_array, var_ptr-&gt;super_array, 1024) == 0) {
-               var_ptr2 = var_ptr;
-               var_ptr = var_ptr-&gt;next;
+   group_ptr = groups;
+   while (group_ptr) {
+
+      if (!strncmp(group_ptr-&gt;name, &quot;mesh&quot;, 1024)) {
+
+         var_list_ptr = group_ptr-&gt;vlist;
+         memcpy(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024);
+         i = 1;
+         while (var_list_ptr) {
+            if (strncmp(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024) != 0) {
+               memcpy(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024);
+               i = 1;
+             }
+            if (strncmp(var_list_ptr-&gt;var-&gt;array_class, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: index_%s = %i</font>
<font color="blue">&quot;, var_list_ptr-&gt;var-&gt;name_in_code, i++);
+            var_list_ptr = var_list_ptr-&gt;next;
+         }
+
+         var_list_ptr = group_ptr-&gt;vlist;
+         memcpy(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024);
+         memcpy(array_class, var_list_ptr-&gt;var-&gt;array_class, 1024);
+         class_start = 1;
+         class_end = 1;
+         i = 1;
+         while (var_list_ptr) {
+            if (strncmp(var_list_ptr-&gt;var-&gt;super_array, &quot;-&quot;, 1024) != 0) {
+               if (strncmp(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024) != 0) {
+                  if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: %s_end = %i</font>
<font color="blue">&quot;, array_class, class_end);
+                  if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: num_%s = %i</font>
<font color="blue">&quot;, super_array, i);
+                  class_start = 1;
+                  class_end = 1;
+                  i = 1;
+                  memcpy(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024);
+                  memcpy(array_class, var_list_ptr-&gt;var-&gt;array_class, 1024);
+                  fortprintf(fd, &quot;      integer :: %s_start = %i</font>
<font color="blue">&quot;, array_class, class_start);
+               }
+               else if (strncmp(array_class, var_list_ptr-&gt;var-&gt;array_class, 1024) != 0) {
+                  fortprintf(fd, &quot;      integer :: %s_end = %i</font>
<font color="blue">&quot;, array_class, class_end);
+                  class_start = class_end+1;
+                  class_end = class_start;
+                  memcpy(array_class, var_list_ptr-&gt;var-&gt;array_class, 1024);
+                  fortprintf(fd, &quot;      integer :: %s_start = %i</font>
<font color="red">&quot;, array_class, class_start);
+                  i++;
+               }
+               else {
+                  class_end++;
+                  i++;
+               }
             }
-            if (vtype == INTEGER)  fortprintf(fd, &quot;      type (field%idInteger), pointer :: %s</font>
<font color="red">&quot;, (var_ptr2-&gt;ndims)+1, var_ptr2-&gt;super_array);
-            if (vtype == REAL)     fortprintf(fd, &quot;      type (field%idReal), pointer :: %s</font>
<font color="red">&quot;, (var_ptr2-&gt;ndims)+1, var_ptr2-&gt;super_array);
+            var_list_ptr = var_list_ptr-&gt;next;
          }
-         else {
-            if (var_ptr-&gt;vtype == INTEGER)  fortprintf(fd, &quot;      type (field%idInteger), pointer :: %s</font>
<font color="red">&quot;, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
-            if (var_ptr-&gt;vtype == REAL)     fortprintf(fd, &quot;      type (field%idReal), pointer :: %s</font>
<font color="red">&quot;, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
-            var_ptr = var_ptr-&gt;next;
+         if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: %s_end = %i</font>
<font color="blue">&quot;, array_class, class_end);
+         if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: num_%s = %i</font>
<font color="blue">&quot;, super_array, i);
+
+         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)) {
+              if (var_ptr-&gt;vtype == INTEGER) fortprintf(fd, &quot;      type (field%idInteger), pointer :: %s</font>
<font color="blue">&quot;, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
+              if (var_ptr-&gt;vtype == REAL)    fortprintf(fd, &quot;      type (field%idReal), pointer :: %s</font>
<font color="blue">&quot;, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
+            }
+            else {
+              if (var_ptr-&gt;vtype == INTEGER) fortprintf(fd, &quot;      type (field%idInteger), pointer :: %s</font>
<font color="blue">&quot;, var_ptr-&gt;ndims+1, var_ptr-&gt;super_array);
+              if (var_ptr-&gt;vtype == REAL)    fortprintf(fd, &quot;      type (field%idReal), pointer :: %s</font>
<font color="red">&quot;, var_ptr-&gt;ndims+1, var_ptr-&gt;super_array);
+              while (var_list_ptr-&gt;next &amp;&amp; !strncmp(var_list_ptr-&gt;next-&gt;var-&gt;super_array, var_list_ptr-&gt;var-&gt;super_array, 1024)) var_list_ptr = var_list_ptr-&gt;next;
+            }
+            var_list_ptr = var_list_ptr-&gt;next;
          }
+         break;
       }
-      else
-         var_ptr = var_ptr-&gt;next;
+      group_ptr = group_ptr-&gt;next;
    }
 
    fclose(fd);
 
 
    /*
-    *  Generate declarations of time-invariant fields
+    *  Generate declarations of non-mesh groups
     */
-   fd = fopen(&quot;time_varying_fields.inc&quot;, &quot;w&quot;);
-   var_ptr = vars;
-   while (var_ptr) {
-      if (var_ptr-&gt;timedim == 1) {
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
-            memcpy(super_array, var_ptr-&gt;super_array, 1024);
-            memcpy(array_class, var_ptr-&gt;array_class, 1024);
-            vtype = var_ptr-&gt;vtype;
-            while (var_ptr &amp;&amp; strncmp(super_array, var_ptr-&gt;super_array, 1024) == 0) {
-               var_ptr2 = var_ptr;
-               var_ptr = var_ptr-&gt;next;
+   fd = fopen(&quot;variable_groups.inc&quot;, &quot;w&quot;);
+
+   group_ptr = groups;
+   while (group_ptr) {
+      if (strncmp(group_ptr-&gt;name, &quot;mesh&quot;, 1024)) {
+         fortprintf(fd, &quot;   type %s_type</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+
+         var_list_ptr = group_ptr-&gt;vlist;
+         memcpy(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024);
+         i = 1;
+         while (var_list_ptr) {
+            if (strncmp(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024) != 0) {
+               memcpy(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024);
+               i = 1;
+             }
+            if (strncmp(var_list_ptr-&gt;var-&gt;array_class, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: index_%s = %i</font>
<font color="blue">&quot;, var_list_ptr-&gt;var-&gt;name_in_code, i++);
+            var_list_ptr = var_list_ptr-&gt;next;
+         }
+
+         var_list_ptr = group_ptr-&gt;vlist;
+         memcpy(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024);
+         memcpy(array_class, var_list_ptr-&gt;var-&gt;array_class, 1024);
+         class_start = 1;
+         class_end = 1;
+         i = 1;
+         while (var_list_ptr) {
+            if (strncmp(var_list_ptr-&gt;var-&gt;super_array, &quot;-&quot;, 1024) != 0) {
+               if (strncmp(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024) != 0) {
+                  if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: %s_end = %i</font>
<font color="blue">&quot;, array_class, class_end);
+                  if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: num_%s = %i</font>
<font color="blue">&quot;, super_array, i);
+                  class_start = 1;
+                  class_end = 1;
+                  i = 1;
+                  memcpy(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024);
+                  memcpy(array_class, var_list_ptr-&gt;var-&gt;array_class, 1024);
+                  fortprintf(fd, &quot;      integer :: %s_start = %i</font>
<font color="blue">&quot;, array_class, class_start);
+               }
+               else if (strncmp(array_class, var_list_ptr-&gt;var-&gt;array_class, 1024) != 0) {
+                  fortprintf(fd, &quot;      integer :: %s_end = %i</font>
<font color="blue">&quot;, array_class, class_end);
+                  class_start = class_end+1;
+                  class_end = class_start;
+                  memcpy(array_class, var_list_ptr-&gt;var-&gt;array_class, 1024);
+                  fortprintf(fd, &quot;      integer :: %s_start = %i</font>
<font color="red">&quot;, array_class, class_start);
+                  i++;
+               }
+               else {
+                  class_end++;
+                  i++;
+               }
             }
-            if (vtype == INTEGER)  fortprintf(fd, &quot;      type (field%idInteger), pointer :: %s</font>
<font color="red">&quot;, (var_ptr2-&gt;ndims)+1, var_ptr2-&gt;super_array);
-            if (vtype == REAL)     fortprintf(fd, &quot;      type (field%idReal), pointer :: %s</font>
<font color="red">&quot;, (var_ptr2-&gt;ndims)+1, var_ptr2-&gt;super_array);
+            var_list_ptr = var_list_ptr-&gt;next;
          }
-         else {
-            if (var_ptr-&gt;vtype == INTEGER)  fortprintf(fd, &quot;      type (field%idInteger), pointer :: %s</font>
<font color="red">&quot;, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
-            if (var_ptr-&gt;vtype == REAL)     fortprintf(fd, &quot;      type (field%idReal), pointer :: %s</font>
<font color="red">&quot;, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
-            var_ptr = var_ptr-&gt;next;
+         if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: %s_end = %i</font>
<font color="blue">&quot;, array_class, class_end);
+         if (strncmp(super_array, &quot;-&quot;, 1024) != 0) fortprintf(fd, &quot;      integer :: num_%s = %i</font>
<font color="blue">&quot;, super_array, i);
+
+         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)) {
+              if (var_ptr-&gt;vtype == INTEGER) fortprintf(fd, &quot;      type (field%idInteger), pointer :: %s</font>
<font color="blue">&quot;, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
+              if (var_ptr-&gt;vtype == REAL)    fortprintf(fd, &quot;      type (field%idReal), pointer :: %s</font>
<font color="blue">&quot;, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
+            }
+            else {
+              if (var_ptr-&gt;vtype == INTEGER) fortprintf(fd, &quot;      type (field%idInteger), pointer :: %s</font>
<font color="blue">&quot;, var_ptr-&gt;ndims+1, var_ptr-&gt;super_array);
+              if (var_ptr-&gt;vtype == REAL)    fortprintf(fd, &quot;      type (field%idReal), pointer :: %s</font>
<font color="blue">&quot;, var_ptr-&gt;ndims+1, var_ptr-&gt;super_array);
+              while (var_list_ptr-&gt;next &amp;&amp; !strncmp(var_list_ptr-&gt;next-&gt;var-&gt;super_array, var_list_ptr-&gt;var-&gt;super_array, 1024)) var_list_ptr = var_list_ptr-&gt;next;
+            }
+            var_list_ptr = var_list_ptr-&gt;next;
          }
+   
+         fortprintf(fd, &quot;   end type %s_type</font>
<font color="black"></font>
<font color="black"></font>
<font color="blue">&quot;, group_ptr-&gt;name);
+   
+         if (group_ptr-&gt;vlist-&gt;var-&gt;ntime_levs &gt; 1) {
+            fortprintf(fd, &quot;   type %s_pointer_type</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+            fortprintf(fd, &quot;      type (%s_type), pointer :: %s </font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+            fortprintf(fd, &quot;   end type %s_pointer_type</font>
<font color="black"></font>
<font color="black"></font>
<font color="blue">&quot;, group_ptr-&gt;name);
+   
+            fortprintf(fd, &quot;   type %s_multilevel_type</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+            fortprintf(fd, &quot;      integer :: nTimeLevels</font>
<font color="blue">&quot;);
+            fortprintf(fd, &quot;      type (%s_pointer_type), dimension(:), pointer :: time_levs</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+            fortprintf(fd, &quot;   end type %s_multilevel_type</font>
<font color="black"></font>
<font color="black"></font>
<font color="red">&quot;, group_ptr-&gt;name);
+         }
+   
       }
-      else
-         var_ptr = var_ptr-&gt;next;
+      group_ptr = group_ptr-&gt;next;
    }
 
    fclose(fd);
 
-
    /*
-    *  Generate grid metadata allocations
+    *  Generate instantiations of variable groups in block_type
     */
-   fd = fopen(&quot;grid_meta_allocs.inc&quot;, &quot;w&quot;);
+   fd = fopen(&quot;block_group_members.inc&quot;, &quot;w&quot;);
 
-   dim_ptr = dims;
-   while (dim_ptr) {
-      if (dim_ptr-&gt;constant_value &lt; 0 &amp;&amp; !dim_ptr-&gt;namelist_defined &amp;&amp; !is_derived_dim(dim_ptr-&gt;name_in_code)) fortprintf(fd, &quot;      g %% %s = %s</font>
<font color="red">&quot;, dim_ptr-&gt;name_in_code, dim_ptr-&gt;name_in_code);
-      if (dim_ptr-&gt;constant_value &lt; 0 &amp;&amp; dim_ptr-&gt;namelist_defined &amp;&amp; !is_derived_dim(dim_ptr-&gt;name_in_code)) fortprintf(fd, &quot;      g %% %s = %s</font>
<font color="red">&quot;, dim_ptr-&gt;name_in_file, dim_ptr-&gt;name_in_file);
-      dim_ptr = dim_ptr-&gt;next;
+   group_ptr = groups;
+   while (group_ptr) {
+      if (group_ptr-&gt;vlist-&gt;var-&gt;ntime_levs &gt; 1)
+         fortprintf(fd, &quot;      type (%s_multilevel_type), pointer :: %s</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+      else
+         fortprintf(fd, &quot;      type (%s_type), pointer :: %s</font>
<font color="red">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+      group_ptr = group_ptr-&gt;next;
    }
-   fortprintf(fd, &quot;</font>
<font color="red">&quot;);
 
-   var_ptr = vars;
-   while (var_ptr) {
-      if (var_ptr-&gt;timedim == 0) {
+   fclose(fd);
+
+
+   /* To be included in allocate_block */
+   fd = fopen(&quot;block_allocs.inc&quot;, &quot;w&quot;);
+   group_ptr = groups;
+   while (group_ptr) {
+      fortprintf(fd, &quot;      allocate(b %% %s)</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+      if (group_ptr-&gt;vlist-&gt;var-&gt;ntime_levs &gt; 1) {
+         fortprintf(fd, &quot;      b %% %s %% nTimeLevels = %i</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;vlist-&gt;var-&gt;ntime_levs);
+         fortprintf(fd, &quot;      allocate(b %% %s %% time_levs(%i))</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;vlist-&gt;var-&gt;ntime_levs);
+         fortprintf(fd, &quot;      do i=1,b %% %s %% nTimeLevels</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+         fortprintf(fd, &quot;         allocate(b %% %s %% time_levs(i) %% %s)</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+         fortprintf(fd, &quot;         call allocate_%s(b %% %s %% time_levs(i) %% %s, &amp;</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name, group_ptr-&gt;name);
+         fortprintf(fd, &quot;#include \&quot;dim_dummy_args.inc\&quot;</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;                         )</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      end do</font>
<font color="black"></font>
<font color="blue">&quot;);
+      }
+      else {
+         fortprintf(fd, &quot;      call allocate_%s(b %% %s, &amp;</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+         fortprintf(fd, &quot;#include \&quot;dim_dummy_args.inc\&quot;</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;                      )</font>
<font color="black"></font>
<font color="blue">&quot;);
+      }
+      group_ptr = group_ptr-&gt;next;
+   }
+   fclose(fd);
+
+   
+   /* To be included in deallocate_block */
+   fd = fopen(&quot;block_deallocs.inc&quot;, &quot;w&quot;);
+   group_ptr = groups;
+   while (group_ptr) {
+      if (group_ptr-&gt;vlist-&gt;var-&gt;ntime_levs &gt; 1) {
+         fortprintf(fd, &quot;      do i=1,b %% %s %% nTimeLevels</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+         fortprintf(fd, &quot;         call deallocate_%s(b %% %s %% time_levs(i) %% %s)</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name, group_ptr-&gt;name);
+         fortprintf(fd, &quot;         deallocate(b %% %s %% time_levs(i) %% %s)</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+         fortprintf(fd, &quot;      end do</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      deallocate(b %% %s %% time_levs)</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+      }
+      else {
+         fortprintf(fd, &quot;      call deallocate_%s(b %% %s)</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+      }
+      fortprintf(fd, &quot;      deallocate(b %% %s)</font>
<font color="black"></font>
<font color="blue">&quot;, group_ptr-&gt;name);
+      group_ptr = group_ptr-&gt;next;
+   }
+   fclose(fd);
+
+   /* Definitions of allocate subroutines */
+   fd = fopen(&quot;group_alloc_routines.inc&quot;, &quot;w&quot;);
+   group_ptr = groups;
+   while (group_ptr) {
+      fortprintf(fd, &quot;   subroutine allocate_%s(%s, &amp;</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+      fortprintf(fd, &quot;#include \&quot;dim_dummy_args.inc\&quot;</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;                         )</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;      implicit none</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;      type (%s_type), intent(inout) :: %s</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+      fortprintf(fd, &quot;#include \&quot;dim_dummy_decls.inc\&quot;</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+
+      if (!strncmp(group_ptr-&gt;name, &quot;mesh&quot;, 1024)) {
+         dim_ptr = dims;
+         while (dim_ptr) {
+            if (dim_ptr-&gt;constant_value &lt; 0 &amp;&amp; !dim_ptr-&gt;namelist_defined &amp;&amp; !is_derived_dim(dim_ptr-&gt;name_in_code)) fortprintf(fd, &quot;      %s %% %s = %s</font>
<font color="blue">&quot;, group_ptr-&gt;name, dim_ptr-&gt;name_in_code, dim_ptr-&gt;name_in_code);
+            if (dim_ptr-&gt;constant_value &lt; 0 &amp;&amp; dim_ptr-&gt;namelist_defined &amp;&amp; !is_derived_dim(dim_ptr-&gt;name_in_code)) fortprintf(fd, &quot;      %s %% %s = %s</font>
<font color="blue">&quot;, group_ptr-&gt;name, dim_ptr-&gt;name_in_file, dim_ptr-&gt;name_in_file);
+            dim_ptr = dim_ptr-&gt;next;
+         }
+         fortprintf(fd, &quot;</font>
<font color="red">&quot;);
+      }
+
+
+      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) {
             memcpy(super_array, var_ptr-&gt;super_array, 1024);
             memcpy(array_class, var_ptr-&gt;array_class, 1024);
-            vtype = var_ptr-&gt;vtype;
             i = 0;
-            while (var_ptr &amp;&amp; strncmp(super_array, var_ptr-&gt;super_array, 1024) == 0) {
+            while (var_list_ptr &amp;&amp; strncmp(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024) == 0) {
                i++;
-               var_ptr2 = var_ptr;
-               var_ptr = var_ptr-&gt;next;
+               var_list_ptr2 = var_list_ptr;
+               var_list_ptr = var_list_ptr-&gt;next;
             }
-            fortprintf(fd, &quot;      allocate(g %% %s)</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;      allocate(g %% %s %% ioinfo)</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;      allocate(g %% %s %% array(%i, &quot;, var_ptr2-&gt;super_array, i);
+            var_ptr2 = var_list_ptr2-&gt;var;
+            fortprintf(fd, &quot;      allocate(%s %% %s)</font>
<font color="blue">&quot;, group_ptr-&gt;name, var_ptr2-&gt;super_array);
+            fortprintf(fd, &quot;      allocate(%s %% %s %% ioinfo)</font>
<font color="gray">&quot;, group_ptr-&gt;name, var_ptr2-&gt;super_array);
+            fortprintf(fd, &quot;      allocate(%s %% %s %% array(%i, &quot;, group_ptr-&gt;name, var_ptr2-&gt;super_array, i);
             dimlist_ptr = var_ptr2-&gt;dimlist;
             if (!strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nCells&quot;, 1024) ||
                 !strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nEdges&quot;, 1024) ||
@@ -421,29 +554,29 @@
                dimlist_ptr = dimlist_ptr-&gt;next;
             }
             fortprintf(fd, &quot;))</font>
<font color="red">&quot;);
-            fortprintf(fd, &quot;      g %% %s %% array = 0</font>
<font color="blue">&quot;, var_ptr2-&gt;super_array ); /* initialize field to zero */
+            fortprintf(fd, &quot;      %s %% %s %% array = 0</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr2-&gt;super_array ); /* initialize field to zero */
 
             if (var_ptr2-&gt;iostreams &amp; INPUT0) 
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% input = .true.</font>
<font color="blue">&quot;, var_ptr2-&gt;super_array);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% input = .true.</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr2-&gt;super_array);
             else
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% input = .false.</font>
<font color="blue">&quot;, var_ptr2-&gt;super_array);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% input = .false.</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr2-&gt;super_array);
 
             if (var_ptr2-&gt;iostreams &amp; RESTART0) 
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% restart = .true.</font>
<font color="blue">&quot;, var_ptr2-&gt;super_array);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% restart = .true.</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr2-&gt;super_array);
             else
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% restart = .false.</font>
<font color="blue">&quot;, var_ptr2-&gt;super_array);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% restart = .false.</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr2-&gt;super_array);
 
             if (var_ptr2-&gt;iostreams &amp; OUTPUT0) 
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% output = .true.</font>
<font color="blue">&quot;, var_ptr2-&gt;super_array);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% output = .true.</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr2-&gt;super_array);
             else
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% output = .false.</font>
<font color="blue">&quot;, var_ptr2-&gt;super_array);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% output = .false.</font>
<font color="black">&quot;, group_ptr-&gt;name, var_ptr2-&gt;super_array);
             fortprintf(fd, &quot;</font>
<font color="red">&quot;);
          }
          else {
-            fortprintf(fd, &quot;      allocate(g %% %s)</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;      allocate(g %% %s %% ioinfo)</font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code);
+            fortprintf(fd, &quot;      allocate(%s %% %s)</font>
<font color="blue">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
+            fortprintf(fd, &quot;      allocate(%s %% %s %% ioinfo)</font>
<font color="gray">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
             if (var_ptr-&gt;ndims &gt; 0) {
-               fortprintf(fd, &quot;      allocate(g %% %s %% array(&quot;, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      allocate(%s %% %s %% array(&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
                dimlist_ptr = var_ptr-&gt;dimlist;
                if (!strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nCells&quot;, 1024) ||
                    !strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nEdges&quot;, 1024) ||
@@ -464,306 +597,104 @@
                   dimlist_ptr = dimlist_ptr-&gt;next;
                }
                fortprintf(fd, &quot;))</font>
<font color="red">&quot;);
-               fortprintf(fd, &quot;      g %% %s %% array = 0</font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code ); /* initialize field to zero */
+               fortprintf(fd, &quot;      %s %% %s %% array = 0</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code ); /* initialize field to zero */
 
             }
             if (var_ptr-&gt;iostreams &amp; INPUT0) 
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% input = .true.</font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% input = .true.</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
             else
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% input = .false.</font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% input = .false.</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
 
             if (var_ptr-&gt;iostreams &amp; RESTART0) 
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% restart = .true.</font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% restart = .true.</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
             else
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% restart = .false.</font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% restart = .false.</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
 
             if (var_ptr-&gt;iostreams &amp; OUTPUT0) 
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% output = .true.</font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% output = .true.</font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
             else
-               fortprintf(fd, &quot;      g %% %s %% ioinfo %% output = .false.</font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      %s %% %s %% ioinfo %% output = .false.</font>
<font color="black">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
             fortprintf(fd, &quot;</font>
<font color="red">&quot;);
 
-            var_ptr = var_ptr-&gt;next;
+            var_list_ptr = var_list_ptr-&gt;next;
          }
       }
-      else
-         var_ptr = var_ptr-&gt;next;
-   }
 
+      fortprintf(fd, &quot;   end subroutine allocate_%s</font>
<font color="black"></font>
<font color="black"></font>
<font color="blue">&quot;, group_ptr-&gt;name);
+      group_ptr = group_ptr-&gt;next;
+   }
    fclose(fd);
+   
+   /* Definitions of deallocate subroutines */
+   fd = fopen(&quot;group_dealloc_routines.inc&quot;, &quot;w&quot;);
+   group_ptr = groups;
+   while (group_ptr) {
+      fortprintf(fd, &quot;   subroutine deallocate_%s(%s)</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+      fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;      implicit none</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;      type (%s_type), intent(inout) :: %s</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+      fortprintf(fd, &quot;</font>
<font color="red">&quot;);
 
-
-   /*
-    *  Generate grid metadata deallocations
-    */
-   fd = fopen(&quot;grid_meta_deallocs.inc&quot;, &quot;w&quot;);
-
-   var_ptr = vars;
-   while (var_ptr) {
-      if (var_ptr-&gt;timedim == 0) {
+      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) {
             memcpy(super_array, var_ptr-&gt;super_array, 1024);
             memcpy(array_class, var_ptr-&gt;array_class, 1024);
-            vtype = var_ptr-&gt;vtype;
             i = 0;
-            while (var_ptr &amp;&amp; strncmp(super_array, var_ptr-&gt;super_array, 1024) == 0) {
+            while (var_list_ptr &amp;&amp; strncmp(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024) == 0) {
                i++;
-               var_ptr2 = var_ptr;
-               var_ptr = var_ptr-&gt;next;
+               var_list_ptr2 = var_list_ptr;
+               var_list_ptr = var_list_ptr-&gt;next;
             }
-            fortprintf(fd, &quot;      deallocate(g %% %s %% array)</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;      deallocate(g %% %s %% ioinfo)</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;      deallocate(g %% %s)</font>
<font color="black"></font>
<font color="blue">&quot;, var_ptr2-&gt;super_array);
+            fortprintf(fd, &quot;      deallocate(%s %% %s %% array)</font>
<font color="blue">&quot;, group_ptr-&gt;name, var_list_ptr2-&gt;var-&gt;super_array);
+            fortprintf(fd, &quot;      deallocate(%s %% %s %% ioinfo)</font>
<font color="blue">&quot;, group_ptr-&gt;name, var_list_ptr2-&gt;var-&gt;super_array);
+            fortprintf(fd, &quot;      deallocate(%s %% %s)</font>
<font color="black"></font>
<font color="red">&quot;, group_ptr-&gt;name, var_list_ptr2-&gt;var-&gt;super_array);
          }
          else {
             if (var_ptr-&gt;ndims &gt; 0) {
-               fortprintf(fd, &quot;      deallocate(g %% %s %% array)</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-               fortprintf(fd, &quot;      deallocate(g %% %s %% ioinfo)</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-               fortprintf(fd, &quot;      deallocate(g %% %s)</font>
<font color="black"></font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      deallocate(%s %% %s %% array)</font>
<font color="blue">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      deallocate(%s %% %s %% ioinfo)</font>
<font color="blue">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      deallocate(%s %% %s)</font>
<font color="black"></font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
             }
             else {
-               fortprintf(fd, &quot;      deallocate(g %% %s %% ioinfo)</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-               fortprintf(fd, &quot;      deallocate(g %% %s)</font>
<font color="black"></font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      deallocate(%s %% %s %% ioinfo)</font>
<font color="blue">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
+               fortprintf(fd, &quot;      deallocate(%s %% %s)</font>
<font color="black"></font>
<font color="red">&quot;, group_ptr-&gt;name, var_ptr-&gt;name_in_code);
             }
-            var_ptr = var_ptr-&gt;next;
+            var_list_ptr = var_list_ptr-&gt;next;
          }
       }
-      else
-         var_ptr = var_ptr-&gt;next;
-   }
 
-   fclose(fd);
-
-
-   /*
-    *  Generate grid state allocations
-    */
-   fd = fopen(&quot;grid_state_allocs.inc&quot;, &quot;w&quot;);
-
-   var_ptr = vars;
-   while (var_ptr) {
-      if (var_ptr-&gt;timedim == 1 &amp;&amp; var_ptr-&gt;ndims &gt; 0) {
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
-            memcpy(super_array, var_ptr-&gt;super_array, 1024);
-            memcpy(array_class, var_ptr-&gt;array_class, 1024);
-            vtype = var_ptr-&gt;vtype;
-            i = 0;
-            while (var_ptr &amp;&amp; strncmp(super_array, var_ptr-&gt;super_array, 1024) == 0) {
-               i++;
-               var_ptr2 = var_ptr;
-               var_ptr = var_ptr-&gt;next;
-            }
-            fortprintf(fd, &quot;      allocate(s %% %s)</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;      allocate(s %% %s %% ioinfo)</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;      allocate(s %% %s %% array(%i, &quot;, var_ptr2-&gt;super_array, i);
-            dimlist_ptr = var_ptr2-&gt;dimlist;
-            if (!strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nCells&quot;, 1024) ||
-                !strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nEdges&quot;, 1024) ||
-                !strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nVertices&quot;, 1024))
-               fortprintf(fd, &quot;b %% mesh %% %s + 1&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-            else
-               if (dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;b %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_file);
-               else fortprintf(fd, &quot;b %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-            dimlist_ptr = dimlist_ptr-&gt;next;
-            while (dimlist_ptr) {
-               if (!strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nCells&quot;, 1024) ||
-                   !strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nEdges&quot;, 1024) ||
-                   !strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nVertices&quot;, 1024))
-                  fortprintf(fd, &quot;, b %% mesh %% %s + 1&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-               else
-                  if (dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;, b %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_file);
-                  else fortprintf(fd, &quot;, b %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-               dimlist_ptr = dimlist_ptr-&gt;next;
-            }
-            fortprintf(fd, &quot;))</font>
<font color="red">&quot;);
-            fortprintf(fd, &quot;      s %% %s %% block =&gt; b</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-   
-            if (var_ptr2-&gt;iostreams &amp; INPUT0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% input = .true.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% input = .false.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-   
-            if (var_ptr2-&gt;iostreams &amp; RESTART0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% restart = .true.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% restart = .false.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-   
-            if (var_ptr2-&gt;iostreams &amp; OUTPUT0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% output = .true.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% output = .false.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;</font>
<font color="red">&quot;);
-         }
-         else {
-            fortprintf(fd, &quot;      allocate(s %% %s)</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;      allocate(s %% %s %% ioinfo)</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;      allocate(s %% %s %% array(&quot;, var_ptr-&gt;name_in_code);
-            dimlist_ptr = var_ptr-&gt;dimlist;
-            if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0) {
-               if (!strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nCells&quot;, 1024) ||
-                   !strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nEdges&quot;, 1024) ||
-                   !strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nVertices&quot;, 1024))
-                  fortprintf(fd, &quot;b %% mesh %% %s + 1&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-               else
-                  if (dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;b %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_file);
-                  else fortprintf(fd, &quot;b %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-            }
-            else {
-               fortprintf(fd, &quot;%i&quot;, dimlist_ptr-&gt;dim-&gt;constant_value);
-            }
-            dimlist_ptr = dimlist_ptr-&gt;next;
-            while (dimlist_ptr) {
-               if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0) {
-                  if (!strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nCells&quot;, 1024) ||
-                      !strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nEdges&quot;, 1024) ||
-                      !strncmp(dimlist_ptr-&gt;dim-&gt;name_in_file, &quot;nVertices&quot;, 1024))
-                     fortprintf(fd, &quot;, b %% mesh %% %s + 1&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-                  else
-                     if (dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;, b %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_file);
-                     else fortprintf(fd, &quot;, b %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-               }
-               else {
-                  fortprintf(fd, &quot;, %i&quot;, dimlist_ptr-&gt;dim-&gt;constant_value);
-               }
-               dimlist_ptr = dimlist_ptr-&gt;next;
-            }
-            fortprintf(fd, &quot;))</font>
<font color="red">&quot;);
-            fortprintf(fd, &quot;      s %% %s %% block =&gt; b</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-   
-            if (var_ptr-&gt;iostreams &amp; INPUT0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% input = .true.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% input = .false.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-   
-            if (var_ptr-&gt;iostreams &amp; RESTART0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% restart = .true.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% restart = .false.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-   
-            if (var_ptr-&gt;iostreams &amp; OUTPUT0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% output = .true.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% output = .false.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;</font>
<font color="red">&quot;);
-            var_ptr = var_ptr-&gt;next;
-         }
-      }
-      else if (var_ptr-&gt;timedim == 1) {
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
-            memcpy(super_array, var_ptr-&gt;super_array, 1024);
-            memcpy(array_class, var_ptr-&gt;array_class, 1024);
-            vtype = var_ptr-&gt;vtype;
-            i = 0;
-            while (var_ptr &amp;&amp; strncmp(super_array, var_ptr-&gt;super_array, 1024) == 0) {
-               i++;
-               var_ptr2 = var_ptr;
-               var_ptr = var_ptr-&gt;next;
-            }
-            fortprintf(fd, &quot;      allocate(s %% %s)</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;      allocate(s %% %s %% ioinfo)</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;      allocate(s %% %s %% array(%i)&quot;, var_ptr-&gt;name_in_code, i);
-            fortprintf(fd, &quot;      s %% %s %% block =&gt; b</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-   
-            if (var_ptr2-&gt;iostreams &amp; INPUT0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% input = .true.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% input = .false.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-   
-            if (var_ptr2-&gt;iostreams &amp; RESTART0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% restart = .true.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% restart = .false.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-   
-            if (var_ptr2-&gt;iostreams &amp; OUTPUT0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% output = .true.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% output = .false.</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;</font>
<font color="red">&quot;);
-         }
-         else {
-            fortprintf(fd, &quot;      allocate(s %% %s)</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;      allocate(s %% %s %% ioinfo)</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;      s %% %s %% block =&gt; b</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-   
-            if (var_ptr-&gt;iostreams &amp; INPUT0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% input = .true.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% input = .false.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-   
-            if (var_ptr-&gt;iostreams &amp; RESTART0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% restart = .true.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% restart = .false.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-   
-            if (var_ptr-&gt;iostreams &amp; OUTPUT0) 
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% output = .true.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            else
-               fortprintf(fd, &quot;      s %% %s %% ioinfo %% output = .false.</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;</font>
<font color="red">&quot;);
-            var_ptr = var_ptr-&gt;next;
-         }
-      } 
-      else
-         var_ptr = var_ptr-&gt;next;
+      fortprintf(fd, &quot;   end subroutine deallocate_%s</font>
<font color="black"></font>
<font color="black"></font>
<font color="red">&quot;, group_ptr-&gt;name);
+      group_ptr = group_ptr-&gt;next;
    }
-
    fclose(fd);
 
-
-   /*
-    *  Generate grid state deallocations
-    */
-   fd = fopen(&quot;grid_state_deallocs.inc&quot;, &quot;w&quot;);
-
-   var_ptr = vars;
-   while (var_ptr) {
-      if (var_ptr-&gt;timedim == 1) {
+   /* Definitions of copy subroutines */
+   fd = fopen(&quot;group_copy_routines.inc&quot;, &quot;w&quot;);
+   group_ptr = groups;
+   while (group_ptr) {
+      fortprintf(fd, &quot;   subroutine copy_%s(dest, src)</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+      fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;      implicit none</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;      type (%s_type), intent(in) :: src</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+      fortprintf(fd, &quot;      type (%s_type), intent(inout) :: dest</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+      fortprintf(fd, &quot;</font>
<font color="red">&quot;);
+      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) {
             memcpy(super_array, var_ptr-&gt;super_array, 1024);
             memcpy(array_class, var_ptr-&gt;array_class, 1024);
-            vtype = var_ptr-&gt;vtype;
             i = 0;
-            while (var_ptr &amp;&amp; strncmp(super_array, var_ptr-&gt;super_array, 1024) == 0) {
+            while (var_list_ptr &amp;&amp; strncmp(super_array, var_list_ptr-&gt;var-&gt;super_array, 1024) == 0) {
                i++;
-               var_ptr2 = var_ptr;
-               var_ptr = var_ptr-&gt;next;
+               var_list_ptr2 = var_list_ptr;
+               var_list_ptr = var_list_ptr-&gt;next;
             }
-            fortprintf(fd, &quot;      deallocate(s %% %s %% array)</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;      deallocate(s %% %s %% ioinfo)</font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-            fortprintf(fd, &quot;      deallocate(s %% %s)</font>
<font color="black"></font>
<font color="red">&quot;, var_ptr2-&gt;super_array);
-         }
-         else {
-            if (var_ptr-&gt;ndims &gt; 0) fortprintf(fd, &quot;      deallocate(s %% %s %% array)</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;      deallocate(s %% %s %% ioinfo)</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;      deallocate(s %% %s)</font>
<font color="black"></font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            var_ptr = var_ptr-&gt;next;
-         }
-      }
-      else
-         var_ptr = var_ptr-&gt;next;
-   }
-
-   fclose(fd);
-
-
-   /*
-    *  Generate copies of state arrays
-    */
-   fd = fopen(&quot;copy_state.inc&quot;, &quot;w&quot;);
-
-   var_ptr = vars;
-   while (var_ptr) {
-      if (var_ptr-&gt;timedim == 1) {
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
-            memcpy(super_array, var_ptr-&gt;super_array, 1024);
-            memcpy(array_class, var_ptr-&gt;array_class, 1024);
-            vtype = var_ptr-&gt;vtype;
-            i = 0;
-            while (var_ptr &amp;&amp; strncmp(super_array, var_ptr-&gt;super_array, 1024) == 0) {
-               i++;
-               var_ptr2 = var_ptr;
-               var_ptr = var_ptr-&gt;next;
-            }
+            var_ptr2 = var_list_ptr2-&gt;var;
             if (var_ptr2-&gt;ndims &gt; 0) 
                fortprintf(fd, &quot;      dest %% %s %% array = src %% %s %% array</font>
<font color="gray">&quot;, var_ptr2-&gt;super_array, var_ptr2-&gt;super_array);
             else
@@ -774,26 +705,56 @@
                fortprintf(fd, &quot;      dest %% %s %% array = src %% %s %% array</font>
<font color="black">&quot;, var_ptr-&gt;name_in_code, var_ptr-&gt;name_in_code);
             else
                fortprintf(fd, &quot;      dest %% %s %% scalar = src %% %s %% scalar</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code, var_ptr-&gt;name_in_code);
-            var_ptr = var_ptr-&gt;next;
+            var_list_ptr = var_list_ptr-&gt;next;
          }
       }
-      else
-         var_ptr = var_ptr-&gt;next;
+      fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+      fortprintf(fd, &quot;   end subroutine copy_%s</font>
<font color="black"></font>
<font color="black"></font>
<font color="blue">&quot;, group_ptr-&gt;name);
+      group_ptr = group_ptr-&gt;next;
    }
+   fclose(fd);
 
+   /* Definitions of shift_time_level subroutines */
+   fd = fopen(&quot;group_shift_level_routines.inc&quot;, &quot;w&quot;);
+   group_ptr = groups;
+   while (group_ptr) {
+      if (group_ptr-&gt;vlist-&gt;var-&gt;ntime_levs &gt; 1) {
+         fortprintf(fd, &quot;   subroutine shift_time_levels_%s(%s)</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+         fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      implicit none</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      type (%s_multilevel_type), intent(inout) :: %s</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+         fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      integer :: i</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      type (%s_type), pointer :: sptr</font>
<font color="blue">&quot;, group_ptr-&gt;name);
+         fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;      sptr =&gt; %s %% time_levs(1) %% %s</font>
<font color="blue">&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+         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 =&gt; %s %% time_levs(i+1) %% %s</font>
<font color="blue">&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="blue">&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);
+         fortprintf(fd, &quot;</font>
<font color="blue">&quot;);
+         fortprintf(fd, &quot;   end subroutine shift_time_levels_%s</font>
<font color="black"></font>
<font color="black"></font>
<font color="gray">&quot;, group_ptr-&gt;name);
+      }
+      group_ptr = group_ptr-&gt;next;
+   }
    fclose(fd);

 }
 
 
-void gen_reads(struct variable * vars, struct dimension * dims)
+void gen_reads(struct group_list * groups, struct variable * vars, struct dimension * dims)
 {
    struct variable * var_ptr;
+   struct variable_list * var_list_ptr;
    struct dimension * dim_ptr;
    struct dimension_list * dimlist_ptr, * lastdim;
+   struct group_list * group_ptr;
    struct dtable * dictionary;
    FILE * fd;
    char vtype[5];
    char fname[32];
+   char struct_deref[1024];
    char * cp1, * cp2;
    int i, j;
    int ivtype;
@@ -835,124 +796,73 @@
     */
    fd = fopen(&quot;io_input_fields.inc&quot;, &quot;w&quot;);
 
-   var_ptr = vars;
-   while (var_ptr) {
-      i = 1;
-      dimlist_ptr = var_ptr-&gt;dimlist;
-      if (var_ptr-&gt;vtype == INTEGER) sprintf(vtype, &quot;int&quot;); 
-      else if (var_ptr-&gt;vtype == REAL) sprintf(vtype, &quot;real&quot;); 
+   group_ptr = groups;
+   while (group_ptr) {
+      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;timedim) {
-            fortprintf(fd, &quot;      if ((block %% time_levs(1) %% state %% %s %% ioinfo %% input .and. .not. config_do_restart) .or. &amp;</font>
<font color="red">&quot;, var_ptr-&gt;super_array);
-            fortprintf(fd, &quot;          (block %% time_levs(1) %% state %% %s %% ioinfo %% restart .and. config_do_restart)) then</font>
<font color="red">&quot;, var_ptr-&gt;super_array);
-         }
-         else {
-            fortprintf(fd, &quot;      if ((block %% mesh %% %s %% ioinfo %% input .and. .not. config_do_restart) .or. &amp;</font>
<font color="red">&quot;, var_ptr-&gt;super_array);
-            fortprintf(fd, &quot;          (block %% mesh %% %s %% ioinfo %% restart .and. config_do_restart)) then</font>
<font color="red">&quot;, var_ptr-&gt;super_array);
-         }
-      }
-      else {
-         if (var_ptr-&gt;timedim) {
-            fortprintf(fd, &quot;      if ((block %% time_levs(1) %% state %% %s %% ioinfo %% input .and. .not. config_do_restart) .or. &amp;</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;          (block %% time_levs(1) %% state %% %s %% ioinfo %% restart .and. config_do_restart)) then</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-         }
-         else {
-            fortprintf(fd, &quot;      if ((block %% mesh %% %s %% ioinfo %% input .and. .not. config_do_restart) .or. &amp;</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;          (block %% mesh %% %s %% ioinfo %% restart .and. config_do_restart)) then</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-         }
-      }
-      vert_dim = 0;
-      while (dimlist_ptr) {
-            if (i &lt; var_ptr-&gt;ndims) {
-               has_vert_dim = !strcmp( &quot;nVertLevels&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-               fortprintf(fd, &quot;      %s%id %% ioinfo %% start(%i) = 1</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i);
-               if (has_vert_dim) {
-                  vert_dim = i;
-                  fortprintf(fd, &quot;#ifdef EXPAND_LEVELS</font>
<font color="red">&quot;);
-                  fortprintf(fd, &quot;      if (.not. config_do_restart) then</font>
<font color="red">&quot;);
-                  fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = 1</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i);
-                  fortprintf(fd, &quot;      else</font>
<font color="red">&quot;);
-                  fortprintf(fd, &quot;#endif</font>
<font color="red">&quot;);
-               }
-               if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0)
-                  if (!dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = block %% mesh %% %s</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
-                  else fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = block %% mesh %% %s</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_file);
-               else
-                  fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = %s</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
-               if (has_vert_dim) {
-                  fortprintf(fd, &quot;#ifdef EXPAND_LEVELS</font>
<font color="red">&quot;);
-                  fortprintf(fd, &quot;      end if</font>
<font color="red">&quot;);
-                  fortprintf(fd, &quot;#endif</font>
<font color="red">&quot;);
-               }
-            }
-            else {
-               if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
-                  split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
-                  fortprintf(fd, &quot;      %s%id %% ioinfo %% start(%i) = read%sStart</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, cp1);
-                  fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = read%sCount%s</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, cp1, cp2);
-                  free(cp1);
-                  free(cp2);
-               }
-               else {
-                  fortprintf(fd, &quot;      %s%id %% ioinfo %% start(%i) = read%sStart</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
-                  fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = read%sCount</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
-               }
-            }
-         dimlist_ptr = dimlist_ptr-&gt;next;
-         i++;
-      }
+         if (group_ptr-&gt;vlist-&gt;var-&gt;ntime_levs &gt; 1)
+            snprintf(struct_deref, 1024, &quot;block %% %s %% time_levs(1) %% %s&quot;, group_ptr-&gt;name, group_ptr-&gt;name);
+         else
+            snprintf(struct_deref, 1024, &quot;block %% %s&quot;, group_ptr-&gt;name);
 
-      if (var_ptr-&gt;ndims &gt; 0) {
-         fortprintf(fd, &quot;      allocate(%s%id %% array(&quot;, vtype, var_ptr-&gt;ndims);
          i = 1;
          dimlist_ptr = var_ptr-&gt;dimlist;
+         if (var_ptr-&gt;vtype == INTEGER) sprintf(vtype, &quot;int&quot;); 
+         else if (var_ptr-&gt;vtype == REAL) sprintf(vtype, &quot;real&quot;); 
    
-         if (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;block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-               else fortprintf(fd, &quot;block %% 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 (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
+            fortprintf(fd, &quot;      if ((%s %% %s %% ioinfo %% input .and. .not. config_do_restart) .or. &amp;</font>
<font color="blue">&quot;, struct_deref, var_ptr-&gt;super_array);
+            fortprintf(fd, &quot;          (%s %% %s %% ioinfo %% restart .and. config_do_restart)) then</font>
<font color="red">&quot;, struct_deref, var_ptr-&gt;super_array);
          }
          else {
-            if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
-               split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
-               fortprintf(fd, &quot;read%sCount%s&quot;, cp1, cp2);
-               free(cp1);
-               free(cp2);
-            }
-            else
-               fortprintf(fd, &quot;read%sCount&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
+            fortprintf(fd, &quot;      if ((%s %% %s %% ioinfo %% input .and. .not. config_do_restart) .or. &amp;</font>
<font color="blue">&quot;, struct_deref, var_ptr-&gt;name_in_code);
+            fortprintf(fd, &quot;          (%s %% %s %% ioinfo %% restart .and. config_do_restart)) then</font>
<font color="red">&quot;, struct_deref, var_ptr-&gt;name_in_code);
          }
-    
-         dimlist_ptr = dimlist_ptr-&gt;next;
-         i++;
+         vert_dim = 0;
          while (dimlist_ptr) {
-            if (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;, block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-                  else fortprintf(fd, &quot;, block %% 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);
-            }
-            else {
-               if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
-                  split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
-                  fortprintf(fd, &quot;, read%sCount%s&quot;, cp1, cp2);
-                  free(cp1);
-                  free(cp2);
+               if (i &lt; var_ptr-&gt;ndims) {
+                  has_vert_dim = !strcmp( &quot;nVertLevels&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                  fortprintf(fd, &quot;      %s%id %% ioinfo %% start(%i) = 1</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i);
+                  if (has_vert_dim) {
+                     vert_dim = i;
+                     fortprintf(fd, &quot;#ifdef EXPAND_LEVELS</font>
<font color="blue">&quot;);
+                     fortprintf(fd, &quot;      if (.not. config_do_restart) then</font>
<font color="blue">&quot;);
+                     fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = 1</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i);
+                     fortprintf(fd, &quot;      else</font>
<font color="blue">&quot;);
+                     fortprintf(fd, &quot;#endif</font>
<font color="blue">&quot;);
+                  }
+                  if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0)
+                     if (!dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = block %% mesh %% %s</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                     else fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = block %% mesh %% %s</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_file);
+                  else
+                     fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = %s</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                  if (has_vert_dim) {
+                     fortprintf(fd, &quot;#ifdef EXPAND_LEVELS</font>
<font color="blue">&quot;);
+                     fortprintf(fd, &quot;      end if</font>
<font color="blue">&quot;);
+                     fortprintf(fd, &quot;#endif</font>
<font color="red">&quot;);
+                  }
                }
-               else
-                  fortprintf(fd, &quot;, read%sCount&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
-            }
+               else {
+                  if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
+                     split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
+                     fortprintf(fd, &quot;      %s%id %% ioinfo %% start(%i) = read%sStart</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i, cp1);
+                     fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = read%sCount%s</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i, cp1, cp2);
+                     free(cp1);
+                     free(cp2);
+                  }
+                  else {
+                     fortprintf(fd, &quot;      %s%id %% ioinfo %% start(%i) = read%sStart</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
+                     fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = read%sCount</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
+                  }
+               }
             dimlist_ptr = dimlist_ptr-&gt;next;
             i++;
          }
-         fortprintf(fd, &quot;))</font>
<font color="black"></font>
<font color="gray">&quot;);
-
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
-            fortprintf(fd, &quot;      allocate(super_%s%id(&quot;, vtype, var_ptr-&gt;ndims);
+   
+         if (var_ptr-&gt;ndims &gt; 0) {
+            fortprintf(fd, &quot;      allocate(%s%id %% array(&quot;, vtype, var_ptr-&gt;ndims);
             i = 1;
             dimlist_ptr = var_ptr-&gt;dimlist;
       
@@ -963,166 +873,203 @@
                else
                   fortprintf(fd, &quot;%s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
             }
+            else {
+               if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
+                  split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
+                  fortprintf(fd, &quot;read%sCount%s&quot;, cp1, cp2);
+                  free(cp1);
+                  free(cp2);
+               }
+               else
+                  fortprintf(fd, &quot;read%sCount&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
+            }
+       
             dimlist_ptr = dimlist_ptr-&gt;next;
             i++;
             while (dimlist_ptr) {
-               if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0)
-                  if (!dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;, block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-                  else fortprintf(fd, &quot;, block %% 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) {
+                  if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0)
+                     if (!dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;, block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                     else fortprintf(fd, &quot;, block %% 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);
+               }
+               else {
+                  if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
+                     split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
+                     fortprintf(fd, &quot;, read%sCount%s&quot;, cp1, cp2);
+                     free(cp1);
+                     free(cp2);
+                  }
+                  else
+                     fortprintf(fd, &quot;, read%sCount&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
+               }
                dimlist_ptr = dimlist_ptr-&gt;next;
                i++;
             }
             fortprintf(fd, &quot;))</font>
<font color="black"></font>
<font color="red">&quot;);
-         }
-      }
-
-      fortprintf(fd, &quot;      %s%id %% ioinfo %% fieldName = \'%s\'</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, var_ptr-&gt;name_in_file);
-      if (var_ptr-&gt;timedim)
-         fortprintf(fd, &quot;      call io_input_field_time(input_obj, %s%id)</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims);
-      else
-         fortprintf(fd, &quot;      call io_input_field(input_obj, %s%id)</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims);
-
-      if (vert_dim &gt; 0) {
-         fortprintf(fd, &quot;#ifdef EXPAND_LEVELS</font>
<font color="red">&quot;);
-         fortprintf(fd, &quot;      if (.not. config_do_restart) then</font>
<font color="red">&quot;);
-         fortprintf(fd, &quot;         do k=2,EXPAND_LEVELS</font>
<font color="red">&quot;);
-         fortprintf(fd, &quot;            %s%id %% array(&quot;, vtype, var_ptr-&gt;ndims);
-         for (i=1; i&lt;=var_ptr-&gt;ndims; i++) {
-            if (i &gt; 1) fortprintf(fd, &quot;,&quot;);
-            fortprintf(fd, &quot;%s&quot;, i == vert_dim ? &quot;k&quot; : &quot;:&quot;);
-         }
-         fortprintf(fd, &quot;) = %s%id %% array(&quot;, vtype, var_ptr-&gt;ndims);
-         for (i=1; i&lt;=var_ptr-&gt;ndims; i++) {
-            if (i &gt; 1) fortprintf(fd, &quot;,&quot;);
-            fortprintf(fd, &quot;%s&quot;, i == vert_dim ? &quot;1&quot; : &quot;:&quot;);
-         }
-         fortprintf(fd, &quot;)</font>
<font color="red">&quot;);
-         fortprintf(fd, &quot;         end do</font>
<font color="red">&quot;);
-         fortprintf(fd, &quot;      end if</font>
<font color="red">&quot;);
-         fortprintf(fd, &quot;#endif</font>
<font color="red">&quot;);
-      }
-
-      if (var_ptr-&gt;ndims &gt; 0) {
-         fortprintf(fd, &quot;      call dmpar_alltoall_field(dminfo, &amp;</font>
<font color="red">&quot;);
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
-            if (var_ptr-&gt;timedim) 
-               fortprintf(fd, &quot;                                %s%id %% array, super_%s%id, &amp;</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, vtype, var_ptr-&gt;ndims);
-            else
-               fortprintf(fd, &quot;                                %s%id %% array, super_%s%id, &amp;</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, vtype, var_ptr-&gt;ndims);
-         }
-         else {
-            if (var_ptr-&gt;timedim) 
-               fortprintf(fd, &quot;                                %s%id %% array, block %% time_levs(1) %% state %% %s %% array, &amp;</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
-            else
-               fortprintf(fd, &quot;                                %s%id %% array, block %% mesh %% %s %% array, &amp;</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
-         }
    
-         i = 1;
-         dimlist_ptr = var_ptr-&gt;dimlist;
+            if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
+               fortprintf(fd, &quot;      allocate(super_%s%id(&quot;, vtype, var_ptr-&gt;ndims);
+               i = 1;
+               dimlist_ptr = var_ptr-&gt;dimlist;
          
-         if (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;                                block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-               else fortprintf(fd, &quot;                                block %% 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);
-         else {
-            lastdim = dimlist_ptr;
-            if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
-               split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
-               fortprintf(fd, &quot;                                read%sCount%s&quot;, cp1, cp2);
-               free(cp1);
-               free(cp2);
+               if (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;block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                     else fortprintf(fd, &quot;block %% 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);
+               }
+               dimlist_ptr = dimlist_ptr-&gt;next;
+               i++;
+               while (dimlist_ptr) {
+                  if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0)
+                     if (!dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;, block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                     else fortprintf(fd, &quot;, block %% 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);
+                  dimlist_ptr = dimlist_ptr-&gt;next;
+                  i++;
+               }
+               fortprintf(fd, &quot;))</font>
<font color="black"></font>
<font color="red">&quot;);
             }
-            else
-               fortprintf(fd, &quot;                                read%sCount&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
          }
-    
-         dimlist_ptr = dimlist_ptr-&gt;next;
-         i++;
-         while (dimlist_ptr) {
+   
+         fortprintf(fd, &quot;      %s%id %% ioinfo %% fieldName = \'%s\'</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, var_ptr-&gt;name_in_file);
+         if (var_ptr-&gt;timedim)
+            fortprintf(fd, &quot;      call io_input_field_time(input_obj, %s%id)</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims);
+         else
+            fortprintf(fd, &quot;      call io_input_field(input_obj, %s%id)</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims);
+   
+         if (vert_dim &gt; 0) {
+            fortprintf(fd, &quot;#ifdef EXPAND_LEVELS</font>
<font color="blue">&quot;);
+            fortprintf(fd, &quot;      if (.not. config_do_restart) then</font>
<font color="blue">&quot;);
+            fortprintf(fd, &quot;         do k=2,EXPAND_LEVELS</font>
<font color="blue">&quot;);
+            fortprintf(fd, &quot;            %s%id %% array(&quot;, vtype, var_ptr-&gt;ndims);
+            for (i=1; i&lt;=var_ptr-&gt;ndims; i++) {
+               if (i &gt; 1) fortprintf(fd, &quot;,&quot;);
+               fortprintf(fd, &quot;%s&quot;, i == vert_dim ? &quot;k&quot; : &quot;:&quot;);
+            }
+            fortprintf(fd, &quot;) = %s%id %% array(&quot;, vtype, var_ptr-&gt;ndims);
+            for (i=1; i&lt;=var_ptr-&gt;ndims; i++) {
+               if (i &gt; 1) fortprintf(fd, &quot;,&quot;);
+               fortprintf(fd, &quot;%s&quot;, i == vert_dim ? &quot;1&quot; : &quot;:&quot;);
+            }
+            fortprintf(fd, &quot;)</font>
<font color="blue">&quot;);
+            fortprintf(fd, &quot;         end do</font>
<font color="blue">&quot;);
+            fortprintf(fd, &quot;      end if</font>
<font color="blue">&quot;);
+            fortprintf(fd, &quot;#endif</font>
<font color="blue">&quot;);
+         }
+   
+         if (var_ptr-&gt;ndims &gt; 0) {
+            fortprintf(fd, &quot;      call dmpar_alltoall_field(dminfo, &amp;</font>
<font color="blue">&quot;);
+            if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0)
+               fortprintf(fd, &quot;                                %s%id %% array, super_%s%id, &amp;</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, vtype, var_ptr-&gt;ndims);
+            else
+               fortprintf(fd, &quot;                                %s%id %% array, %s %% %s %% array, &amp;</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, struct_deref, var_ptr-&gt;name_in_code);
+      
+            i = 1;
+            dimlist_ptr = var_ptr-&gt;dimlist;
+            
             if (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;, block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-                  else fortprintf(fd, &quot;, block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_file);
+                  if (!dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;                                block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                  else fortprintf(fd, &quot;                                block %% 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);
+                  fortprintf(fd, &quot;                                %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
             else {
                lastdim = dimlist_ptr;
                if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
                   split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
-                  fortprintf(fd, &quot;, read%sCount%s&quot;, cp1, cp2);
+                  fortprintf(fd, &quot;                                read%sCount%s&quot;, cp1, cp2);
                   free(cp1);
                   free(cp2);
                }
                else
-                  fortprintf(fd, &quot;, read%sCount&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
+                  fortprintf(fd, &quot;                                read%sCount&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
             }
+       
             dimlist_ptr = dimlist_ptr-&gt;next;
             i++;
-         }
-         fortprintf(fd, &quot;, block %% mesh %% %s, &amp;</font>
<font color="red">&quot;, lastdim-&gt;dim-&gt;name_in_code);
-   
-         if (is_derived_dim(lastdim-&gt;dim-&gt;name_in_code)) {
-            fortprintf(fd, &quot;                                send%sList, recv%sList)</font>
<font color="red">&quot;, lastdim-&gt;dim-&gt;name_in_file+1, lastdim-&gt;dim-&gt;name_in_file+1);
-         }
-         else
-            fortprintf(fd, &quot;                                send%sList, recv%sList)</font>
<font color="red">&quot;, lastdim-&gt;dim-&gt;name_in_code+1, lastdim-&gt;dim-&gt;name_in_code+1);
-
-
-         /* Copy from super_ array to field */
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
-            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,block %% mesh %% %s</font>
<font color="red">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
-                  else fortprintf(fd, &quot;      do i%i=1,block %% mesh %% %s</font>
<font color="red">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_file);
-               else
-                  fortprintf(fd, &quot;      do i%i=1,%s</font>
<font color="red">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
-   
-               i++;
+            while (dimlist_ptr) {
+               if (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;, block %% mesh %% %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                     else fortprintf(fd, &quot;, block %% 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);
+               else {
+                  lastdim = dimlist_ptr;
+                  if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
+                     split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
+                     fortprintf(fd, &quot;, read%sCount%s&quot;, cp1, cp2);
+                     free(cp1);
+                     free(cp2);
+                  }
+                  else
+                     fortprintf(fd, &quot;, read%sCount&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code+1);
+               }
                dimlist_ptr = dimlist_ptr-&gt;next;
+               i++;
             }
-   
-            if (var_ptr-&gt;timedim) 
-               fortprintf(fd, &quot;         block %% time_levs(1) %% state %% %s %% array(index_%s,&quot;, var_ptr-&gt;super_array, var_ptr-&gt;name_in_code);
-            else
-               fortprintf(fd, &quot;         block %% mesh %% %s %% array(index_%s,&quot;, var_ptr-&gt;super_array, var_ptr-&gt;name_in_code);
-            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;, block %% mesh %% %s, &amp;</font>
<font color="blue">&quot;, lastdim-&gt;dim-&gt;name_in_code);
+      
+            if (is_derived_dim(lastdim-&gt;dim-&gt;name_in_code)) {
+               fortprintf(fd, &quot;                                send%sList, recv%sList)</font>
<font color="red">&quot;, lastdim-&gt;dim-&gt;name_in_file+1, lastdim-&gt;dim-&gt;name_in_file+1);
             }
-            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;)</font>
<font color="blue">&quot;);
+            else
+               fortprintf(fd, &quot;                                send%sList, recv%sList)</font>
<font color="red">&quot;, lastdim-&gt;dim-&gt;name_in_code+1, lastdim-&gt;dim-&gt;name_in_code+1);
    
-            i = 1;
-            while (i &lt;= var_ptr-&gt;ndims) {
-               fortprintf(fd, &quot;      end do</font>
<font color="red">&quot;);
-               i++;
+   
+            /* Copy from super_ array to field */
+            if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
+               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,block %% mesh %% %s</font>
<font color="blue">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                     else fortprintf(fd, &quot;      do i%i=1,block %% 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;         %s %% %s %% array(%s %% index_%s,&quot;, struct_deref, var_ptr-&gt;super_array, 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);
+                  if (i &lt; var_ptr-&gt;ndims) fortprintf(fd, &quot;,&quot;);
+               }
+               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;)</font>
<font color="blue">&quot;);
+      
+               i = 1;
+               while (i &lt;= var_ptr-&gt;ndims) {
+                  fortprintf(fd, &quot;      end do</font>
<font color="blue">&quot;);
+                  i++;
+               }
             }
+   
+            fortprintf(fd, &quot;      deallocate(%s%id %% array)</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims);
+            if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0)
+               fortprintf(fd, &quot;      deallocate(super_%s%id)</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims);
          }
-
-         fortprintf(fd, &quot;      deallocate(%s%id %% array)</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims);
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0)
-            fortprintf(fd, &quot;      deallocate(super_%s%id)</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims);
+         else {
+            fortprintf(fd, &quot;      %s %% %s %% scalar = %s%id %% scalar</font>
<font color="blue">&quot;, struct_deref, var_ptr-&gt;name_in_code, vtype, var_ptr-&gt;ndims);
+         }
+        
+         fortprintf(fd, &quot;      end if</font>
<font color="black"></font>
<font color="red">&quot;);
+   
+         var_list_ptr = var_list_ptr-&gt;next;
       }
-      else {
-         if (var_ptr-&gt;timedim) 
-            fortprintf(fd, &quot;      block %% time_levs(1) %% state %% %s %% scalar = %s%id %% scalar</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code, vtype, var_ptr-&gt;ndims);
-         else
-            fortprintf(fd, &quot;      block %% mesh %% %s %% scalar = %s%id %% scalar</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code, vtype, var_ptr-&gt;ndims);
-      }
-     
-      fortprintf(fd, &quot;      end if</font>
<font color="black"></font>
<font color="gray">&quot;);
-
-      var_ptr = var_ptr-&gt;next;
+      group_ptr = group_ptr-&gt;next;
    }
 
    fclose(fd);
@@ -1253,16 +1200,19 @@
 }
 
 
-void gen_writes(struct variable * vars, struct dimension * dims, struct namelist * namelists)
+void gen_writes(struct group_list * groups, struct variable * vars, struct dimension * dims, struct namelist * namelists)
 {
    struct variable * var_ptr;
+   struct variable_list * var_list_ptr;
    struct dimension * dim_ptr;
    struct dimension_list * dimlist_ptr, * lastdim;
+   struct group_list * group_ptr;
    struct dtable * dictionary;
    struct namelist * nl;
    FILE * fd;
    char vtype[5];
    char fname[32];
+   char struct_deref[1024];
    char * cp1, * cp2;
    int i, j;
    int ivtype;
@@ -1409,226 +1359,215 @@
     */
    fd = fopen(&quot;io_output_fields.inc&quot;, &quot;w&quot;);
 
-   var_ptr = vars;
-   while (var_ptr) {
-      i = 1;
-      dimlist_ptr = var_ptr-&gt;dimlist;
-      if (var_ptr-&gt;vtype == INTEGER) sprintf(vtype, &quot;int&quot;); 
-      else if (var_ptr-&gt;vtype == REAL) sprintf(vtype, &quot;real&quot;); 
+   group_ptr = groups;
+   while (group_ptr) {
+      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;timedim) {
-            fortprintf(fd, &quot;      if ((domain %% blocklist %% time_levs(1) %% state %% %s %% ioinfo %% output .and. output_obj %% stream == OUTPUT) .or. &amp;</font>
<font color="red">&quot;, var_ptr-&gt;super_array);
-            fortprintf(fd, &quot;          (domain %% blocklist %% time_levs(1) %% state %% %s %% ioinfo %% restart .and. output_obj %% stream == RESTART)) then</font>
<font color="red">&quot;, var_ptr-&gt;super_array);
-         }
-         else {
-            fortprintf(fd, &quot;      if ((domain %% blocklist %% mesh %% %s %% ioinfo %% output .and. output_obj %% stream == OUTPUT) .or. &amp;</font>
<font color="red">&quot;, var_ptr-&gt;super_array);
-            fortprintf(fd, &quot;          (domain %% blocklist %% mesh %% %s %% ioinfo %% restart .and. output_obj %% stream == RESTART)) then</font>
<font color="red">&quot;, var_ptr-&gt;super_array);
-         }
-      }
-      else {
-         if (var_ptr-&gt;timedim) {
-            fortprintf(fd, &quot;      if ((domain %% blocklist %% time_levs(1) %% state %% %s %% ioinfo %% output .and. output_obj %% stream == OUTPUT) .or. &amp;</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;          (domain %% blocklist %% time_levs(1) %% state %% %s %% ioinfo %% restart .and. output_obj %% stream == RESTART)) then</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-         }
-         else {
-            fortprintf(fd, &quot;      if ((domain %% blocklist %% mesh %% %s %% ioinfo %% output .and. output_obj %% stream == OUTPUT) .or. &amp;</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-            fortprintf(fd, &quot;          (domain %% blocklist %% mesh %% %s %% ioinfo %% restart .and. output_obj %% stream == RESTART)) then</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code);
-         }
-      }
-
-      if (var_ptr-&gt;ndims &gt; 0) {
-         while (dimlist_ptr) {
-               if (i &lt; var_ptr-&gt;ndims) {
-                  fortprintf(fd, &quot;      %s%id %% ioinfo %% start(%i) = 1</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i);
-                  if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0)
-                     if (!dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = domain %% blocklist %% mesh %% %s</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
-                     else fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = domain %% blocklist %% mesh %% %s</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_file);
-                  else
-                     fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = %s</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
-               }
-               else {
-                  fortprintf(fd, &quot;      %s%id %% ioinfo %% start(%i) = 1</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i);
-                  if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
-                     split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
-                     fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = n%sGlobal%s</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, cp1, cp2);
-                     free(cp1);
-                     free(cp2);
-                  }
-                  else
-                     fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = %sGlobal</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
-               }
-            dimlist_ptr = dimlist_ptr-&gt;next;
-            i++;
-         }
-   
-         fortprintf(fd, &quot;      allocate(%s%id %% array(&quot;, vtype, var_ptr-&gt;ndims);
+         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
+            snprintf(struct_deref, 1024, &quot;domain %% blocklist %% %s&quot;, group_ptr-&gt;name);
+         
          i = 1;
          dimlist_ptr = var_ptr-&gt;dimlist;
+         if (var_ptr-&gt;vtype == INTEGER) sprintf(vtype, &quot;int&quot;); 
+         else if (var_ptr-&gt;vtype == REAL) sprintf(vtype, &quot;real&quot;); 
    
-         if (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;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 (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0) {
+            fortprintf(fd, &quot;      if ((%s %% %s %% ioinfo %% output .and. output_obj %% stream == OUTPUT) .or. &amp;</font>
<font color="blue">&quot;, struct_deref, var_ptr-&gt;super_array);
+            fortprintf(fd, &quot;          (%s %% %s %% ioinfo %% restart .and. output_obj %% stream == RESTART)) then</font>
<font color="red">&quot;, struct_deref, var_ptr-&gt;super_array);
+         }
          else {
-            if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
-               split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
-               fortprintf(fd, &quot;n%sGlobal%s&quot;, cp1, cp2);
-               free(cp1);
-               free(cp2);
-            }
-            else
-               fortprintf(fd, &quot;%sGlobal&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-            lastdim = dimlist_ptr;
+            fortprintf(fd, &quot;      if ((%s %% %s %% ioinfo %% output .and. output_obj %% stream == OUTPUT) .or. &amp;</font>
<font color="blue">&quot;, struct_deref, var_ptr-&gt;name_in_code);
+            fortprintf(fd, &quot;          (%s %% %s %% ioinfo %% restart .and. output_obj %% stream == RESTART)) then</font>
<font color="red">&quot;, struct_deref, var_ptr-&gt;name_in_code);
          }
-         dimlist_ptr = dimlist_ptr-&gt;next;
-         i++;
-         while (dimlist_ptr) {
+   
+         if (var_ptr-&gt;ndims &gt; 0) {
+            while (dimlist_ptr) {
+                  if (i &lt; var_ptr-&gt;ndims) {
+                     fortprintf(fd, &quot;      %s%id %% ioinfo %% start(%i) = 1</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i);
+                     if (dimlist_ptr-&gt;dim-&gt;constant_value &lt; 0)
+                        if (!dimlist_ptr-&gt;dim-&gt;namelist_defined) fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = domain %% blocklist %% mesh %% %s</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                        else fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = domain %% blocklist %% mesh %% %s</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_file);
+                     else
+                        fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = %s</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                  }
+                  else {
+                     fortprintf(fd, &quot;      %s%id %% ioinfo %% start(%i) = 1</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i);
+                     if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
+                        split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
+                        fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = n%sGlobal%s</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, i, cp1, cp2);
+                        free(cp1);
+                        free(cp2);
+                     }
+                     else
+                        fortprintf(fd, &quot;      %s%id %% ioinfo %% count(%i) = %sGlobal</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                  }
+               dimlist_ptr = dimlist_ptr-&gt;next;
+               i++;
+            }
+      
+            fortprintf(fd, &quot;      allocate(%s%id %% array(&quot;, vtype, var_ptr-&gt;ndims);
+            i = 1;
+            dimlist_ptr = var_ptr-&gt;dimlist;
+      
             if (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;, 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);
+                  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);
+                  fortprintf(fd, &quot;%s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
             else {
                if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
                   split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
-                  fortprintf(fd, &quot;, n%sGlobal%s&quot;, cp1, cp2);
+                  fortprintf(fd, &quot;n%sGlobal%s&quot;, cp1, cp2);
                   free(cp1);
                   free(cp2);
                }
                else
-                  fortprintf(fd, &quot;, %sGlobal&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                  fortprintf(fd, &quot;%sGlobal&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
                lastdim = dimlist_ptr;
             }
             dimlist_ptr = dimlist_ptr-&gt;next;
             i++;
-         }
-         fortprintf(fd, &quot;))</font>
<font color="black"></font>
<font color="red">&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);
+            while (dimlist_ptr) {
+               if (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;, 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);
+               else {
+                  if (is_derived_dim(dimlist_ptr-&gt;dim-&gt;name_in_code)) {
+                     split_derived_dim_string(dimlist_ptr-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
+                     fortprintf(fd, &quot;, n%sGlobal%s&quot;, cp1, cp2);
+                     free(cp1);
+                     free(cp2);
+                  }
+                  else
+                     fortprintf(fd, &quot;, %sGlobal&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                  lastdim = dimlist_ptr;
+               }
+               dimlist_ptr = dimlist_ptr-&gt;next;
+               i++;
+            }
+            fortprintf(fd, &quot;))</font>
<font color="black"></font>
<font color="blue">&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="red">&quot;);
+               }
+   
+               /* Copy from field to super_ array */
                i = 1;
                dimlist_ptr = var_ptr-&gt;dimlist;
-               while (dimlist_ptr) {
+               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;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);
+                     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="red">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_file);
                   else
-                     fortprintf(fd, &quot;%s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+                     fortprintf(fd, &quot;      do i%i=1,%s</font>
<font color="red">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
    
-                  if (i &lt; var_ptr-&gt;ndims) fortprintf(fd, &quot;, &quot;);
-      
+                  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="red">&quot;);
                   i++;
                }
-               fortprintf(fd, &quot;))</font>
<font color="black"></font>
<font color="red">&quot;);
             }
-
-            /* Copy from field to super_ array */
+   
+            fortprintf(fd, &quot;      %s%id %% ioinfo %% fieldName = \'%s\'</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, var_ptr-&gt;name_in_file);
+            fortprintf(fd, &quot;      call dmpar_alltoall_field(domain %% dminfo, &amp;</font>
<font color="blue">&quot;);
+            if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0)
+               fortprintf(fd, &quot;                                super_%s%id, %s%id %% array, &amp;</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, vtype, var_ptr-&gt;ndims);
+            else
+               fortprintf(fd, &quot;                                %s %% %s %% array, %s%id %% array, &amp;</font>
<font color="red">&quot;, struct_deref, var_ptr-&gt;name_in_code, vtype, var_ptr-&gt;ndims);
+      
             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;                                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);
+       
+            dimlist_ptr = dimlist_ptr-&gt;next;
+            i++;
+            while (dimlist_ptr) {
                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="red">&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="red">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_file);
+                  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;      do i%i=1,%s</font>
<font color="red">&quot;, i, dimlist_ptr-&gt;dim-&gt;name_in_code);
-
-               i++;
+                  fortprintf(fd, &quot;, %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
+      
                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;);
-            }
-            if (var_ptr-&gt;timedim) 
-               fortprintf(fd, &quot;) = domain %% blocklist %% time_levs(1) %% state %% %s %% array(&quot;, var_ptr-&gt;super_array);
-            else
-               fortprintf(fd, &quot;) = domain %% blocklist %% mesh %% %s %% array(&quot;, var_ptr-&gt;super_array);
-            fortprintf(fd, &quot;index_%s&quot;, 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="red">&quot;);
-
-            i = 1;
-            while (i &lt;= var_ptr-&gt;ndims) {
-               fortprintf(fd, &quot;      end do</font>
<font color="blue">&quot;);
                i++;
+            }     
+      
+            if (is_derived_dim(lastdim-&gt;dim-&gt;name_in_code)) {
+               split_derived_dim_string(lastdim-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
+               fortprintf(fd, &quot;, n%sGlobal%s, &amp;</font>
<font color="blue">&quot;, cp1, cp2);
+               fortprintf(fd, &quot;                                output_obj %% send%sList, output_obj %% recv%sList)</font>
<font color="blue">&quot;, lastdim-&gt;dim-&gt;name_in_file+1, lastdim-&gt;dim-&gt;name_in_file+1);
+               free(cp1);
+               free(cp2);
             }
+            else {
+               fortprintf(fd, &quot;, %sGlobal, &amp;</font>
<font color="blue">&quot;, lastdim-&gt;dim-&gt;name_in_code);
+               fortprintf(fd, &quot;                                output_obj %% send%sList, output_obj %% recv%sList)</font>
<font color="red">&quot;, lastdim-&gt;dim-&gt;name_in_code+1, lastdim-&gt;dim-&gt;name_in_code+1);
+            }
          }
-
-         fortprintf(fd, &quot;      %s%id %% ioinfo %% fieldName = \'%s\'</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, var_ptr-&gt;name_in_file);
-         fortprintf(fd, &quot;      call dmpar_alltoall_field(domain %% dminfo, &amp;</font>
<font color="red">&quot;);
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0)
-            fortprintf(fd, &quot;                                super_%s%id, %s%id %% array, &amp;</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, vtype, var_ptr-&gt;ndims);
          else {
-            if (var_ptr-&gt;timedim) 
-               fortprintf(fd, &quot;                                domain %% blocklist %% time_levs(1) %% state %% %s %% array, %s%id %% array, &amp;</font>
<font color="red">&quot;, var_ptr-&gt;name_in_code, vtype, var_ptr-&gt;ndims);
-            else
-               fortprintf(fd, &quot;                                domain %% blocklist %% mesh %% %s %% array, %s%id %% array, &amp;</font>
<font color="blue">&quot;, var_ptr-&gt;name_in_code, vtype, var_ptr-&gt;ndims);
+            fortprintf(fd, &quot;      %s%id %% ioinfo %% fieldName = \'%s\'</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims, var_ptr-&gt;name_in_file);
+            fortprintf(fd, &quot;      %s%id %% scalar = %s %% %s %% scalar</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, struct_deref, var_ptr-&gt;name_in_code);
          }
    
-         i = 1;
-         dimlist_ptr = var_ptr-&gt;dimlist;
-         
-         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);
+         if (var_ptr-&gt;timedim)
+            fortprintf(fd, &quot;      if (domain %% dminfo %% my_proc_id == IO_NODE) call io_output_field_time(output_obj, %s%id)</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims);
          else
-            fortprintf(fd, &quot;                                %s&quot;, dimlist_ptr-&gt;dim-&gt;name_in_code);
-    
-         dimlist_ptr = dimlist_ptr-&gt;next;
-         i++;
-         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);
-   
-            dimlist_ptr = dimlist_ptr-&gt;next;
-            i++;
-         }     
-   
-         if (is_derived_dim(lastdim-&gt;dim-&gt;name_in_code)) {
-            split_derived_dim_string(lastdim-&gt;dim-&gt;name_in_code, &amp;cp1, &amp;cp2);
-            fortprintf(fd, &quot;, n%sGlobal%s, &amp;</font>
<font color="red">&quot;, cp1, cp2);
-            fortprintf(fd, &quot;                                output_obj %% send%sList, output_obj %% recv%sList)</font>
<font color="red">&quot;, lastdim-&gt;dim-&gt;name_in_file+1, lastdim-&gt;dim-&gt;name_in_file+1);
-            free(cp1);
-            free(cp2);
+            fortprintf(fd, &quot;      if (domain %% dminfo %% my_proc_id == IO_NODE) call io_output_field(output_obj, %s%id)</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims);
+         if (var_ptr-&gt;ndims &gt; 0) {
+            fortprintf(fd, &quot;      deallocate(%s%id %% array)</font>
<font color="blue">&quot;, vtype, var_ptr-&gt;ndims);
+            if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0)
+               fortprintf(fd, &quot;      deallocate(super_%s%id)</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims);
          }
-         else {
-            fortprintf(fd, &quot;, %sGlobal, &amp;</font>
<font color="red">&quot;, lastdim-&gt;dim-&gt;name_in_code);
-            fortprintf(fd, &quot;                                output_obj %% send%sList, output_obj %% recv%sList)</font>
<font color="red">&quot;, lastdim-&gt;dim-&gt;name_in_code+1, lastdim-&gt;dim-&gt;name_in_code+1);
-         }
+         fortprintf(fd, &quot;      end if</font>
<font color="black"></font>
<font color="red">&quot;);
+   
+         var_list_ptr = var_list_ptr-&gt;next;
       }
-      else {
-         fortprintf(fd, &quot;      %s%id %% ioinfo %% fieldName = \'%s\'</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, var_ptr-&gt;name_in_file);
-         if (var_ptr-&gt;timedim) 
-            fortprintf(fd, &quot;      %s%id %% scalar = domain %% blocklist %% time_levs(1) %% state %% %s %% scalar</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
-         else
-            fortprintf(fd, &quot;      %s%id %% scalar = domain %% blocklist %% mesh %% %s %% scalar</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims, var_ptr-&gt;name_in_code);
-      }
-
-      if (var_ptr-&gt;timedim)
-         fortprintf(fd, &quot;      if (domain %% dminfo %% my_proc_id == IO_NODE) call io_output_field_time(output_obj, %s%id)</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims);
-      else
-         fortprintf(fd, &quot;      if (domain %% dminfo %% my_proc_id == IO_NODE) call io_output_field(output_obj, %s%id)</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims);
-      if (var_ptr-&gt;ndims &gt; 0) {
-         fortprintf(fd, &quot;      deallocate(%s%id %% array)</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims);
-         if (strncmp(var_ptr-&gt;super_array, &quot;-&quot;, 1024) != 0)
-            fortprintf(fd, &quot;      deallocate(super_%s%id)</font>
<font color="red">&quot;, vtype, var_ptr-&gt;ndims);
-      }
-      fortprintf(fd, &quot;      end if</font>
<font color="black"></font>
<font color="gray">&quot;);
-
-      var_ptr = var_ptr-&gt;next;
+      group_ptr = group_ptr-&gt;next;
    }
 
    fclose(fd);

Modified: branches/registry_reorg/src/registry/gen_inc.h
===================================================================
--- branches/registry_reorg/src/registry/gen_inc.h        2010-09-15 17:03:13 UTC (rev 499)
+++ branches/registry_reorg/src/registry/gen_inc.h        2010-09-16 18:44:25 UTC (rev 500)
@@ -1,4 +1,4 @@
 void gen_namelists(struct namelist *);
-void gen_field_defs(struct variable *, struct dimension *);
-void gen_reads(struct variable *, struct dimension *);
-void gen_writes(struct variable *, struct dimension *, struct namelist *);
+void gen_field_defs(struct group_list * groups, struct variable *, struct dimension *);
+void gen_reads(struct group_list * groups, struct variable *, struct dimension *);
+void gen_writes(struct group_list * groups, struct variable *, struct dimension *, struct namelist *);

Modified: branches/registry_reorg/src/registry/parse.c
===================================================================
--- branches/registry_reorg/src/registry/parse.c        2010-09-15 17:03:13 UTC (rev 499)
+++ branches/registry_reorg/src/registry/parse.c        2010-09-16 18:44:25 UTC (rev 500)
@@ -4,7 +4,7 @@
 #include &quot;registry_types.h&quot;
 #include &quot;gen_inc.h&quot;
 
-int parse_reg(FILE *, struct namelist **, struct dimension **, struct variable **);
+int parse_reg(FILE *, struct namelist **, struct dimension **, struct variable **, struct group_list **);
 int getword(FILE *, char *);
 int is_integer_constant(char *);
 void sort_vars(struct variable *);
@@ -15,6 +15,7 @@
    struct namelist * nls;
    struct dimension * dims;
    struct variable * vars;
+   struct group_list * groups;
 
    if (argc != 2) {
       fprintf(stderr,&quot;</font>
<font color="black">Usage: %s filename</font>
<font color="black"></font>
<font color="gray">&quot;, argv[0]);
@@ -25,7 +26,7 @@
       nls = NULL;
       dims = NULL;
       vars = NULL;
-      if (parse_reg(regfile, &amp;nls, &amp;dims, &amp;vars)) {
+      if (parse_reg(regfile, &amp;nls, &amp;dims, &amp;vars, &amp;groups)) {
          return 1;
       }
    }   
@@ -37,15 +38,15 @@
    sort_vars(vars);
 
    gen_namelists(nls);
-   gen_field_defs(vars, dims);
-   gen_reads(vars, dims);
-   gen_writes(vars, dims, nls);
+   gen_field_defs(groups, vars, dims);
+   gen_reads(groups, vars, dims);
+   gen_writes(groups, vars, dims, nls);
 
    return 0;
 }
 
 
-int parse_reg(FILE * regfile, struct namelist ** nls, struct dimension ** dims, struct variable ** vars)
+int parse_reg(FILE * regfile, struct namelist ** nls, struct dimension ** dims, struct variable ** vars, struct group_list ** groups)
 {
    char word[1024];
    struct namelist * nls_ptr;
@@ -54,13 +55,17 @@
    struct variable * var_ptr;
    struct dimension_list * dimlist_ptr;
    struct dimension * dimlist_cursor;
+   struct group_list * grouplist_ptr;
+   struct variable_list * vlist_cursor;
 
    NEW_NAMELIST(nls_ptr)
    NEW_DIMENSION(dim_ptr)
    NEW_VARIABLE(var_ptr)
+   NEW_GROUP_LIST(grouplist_ptr);
    *nls = nls_ptr;
    *dims = dim_ptr;
    *vars = var_ptr;
+   *groups = grouplist_ptr;
 
    while(getword(regfile, word) != EOF) {
       if (strncmp(word, &quot;namelist&quot;, 1024) == 0) {
@@ -130,7 +135,16 @@
          var_ptr-&gt;timedim = 0;
          var_ptr-&gt;iostreams = 0;
 
+         /* 
+          * persistence 
+          */
          getword(regfile, word); 
+         if (strncmp(word, &quot;persistent&quot;, 1024) == 0) 
+            var_ptr-&gt;persistence = PERSISTENT;
+         else if (strncmp(word, &quot;scratch&quot;, 1024) == 0) 
+            var_ptr-&gt;persistence = SCRATCH;
+
+         getword(regfile, word); 
          if (strncmp(word, &quot;real&quot;, 1024) == 0) 
             var_ptr-&gt;vtype = REAL;
          else if (strncmp(word, &quot;integer&quot;, 1024) == 0) 
@@ -168,14 +182,50 @@
             getword(regfile, word); 
          }
 
-         /* Read I/O info */
+         /* 
+          * time_dim 
+          */
          getword(regfile, word);
+         var_ptr-&gt;ntime_levs = atoi(word);
+
+         /* 
+          * I/O info 
+          */
+         getword(regfile, word);
          if (strchr(word, (int)'i')) var_ptr-&gt;iostreams |= INPUT0;
          if (strchr(word, (int)'r')) var_ptr-&gt;iostreams |= RESTART0;
          if (strchr(word, (int)'o')) var_ptr-&gt;iostreams |= OUTPUT0;
 
          getword(regfile, var_ptr-&gt;name_in_code); 
 
+         /* 
+          * struct 
+          */
+         getword(regfile, var_ptr-&gt;struct_group); 
+         grouplist_ptr = *groups;
+         grouplist_ptr = grouplist_ptr-&gt;next;
+         while (grouplist_ptr &amp;&amp; strncmp(var_ptr-&gt;struct_group, grouplist_ptr-&gt;name, 1024)) {
+            grouplist_ptr = grouplist_ptr-&gt;next;
+         }
+         if (!grouplist_ptr) {
+            grouplist_ptr = *groups;
+            while(grouplist_ptr-&gt;next) grouplist_ptr = grouplist_ptr-&gt;next;
+            NEW_GROUP_LIST(grouplist_ptr-&gt;next);
+            grouplist_ptr = grouplist_ptr-&gt;next;
+            memcpy(grouplist_ptr-&gt;name, var_ptr-&gt;struct_group, (size_t)1024);
+            NEW_VARIABLE_LIST(grouplist_ptr-&gt;vlist);
+            grouplist_ptr-&gt;vlist-&gt;var = var_ptr;
+         }
+         else {
+            vlist_cursor = grouplist_ptr-&gt;vlist;
+            while (vlist_cursor-&gt;next) vlist_cursor = vlist_cursor-&gt;next;
+            NEW_VARIABLE_LIST(vlist_cursor-&gt;next);
+            vlist_cursor-&gt;next-&gt;prev = vlist_cursor;
+            vlist_cursor = vlist_cursor-&gt;next;
+            vlist_cursor-&gt;var = var_ptr;
+         }
+
+
          getword(regfile, var_ptr-&gt;super_array);
          getword(regfile, var_ptr-&gt;array_class);
 
@@ -203,6 +253,10 @@
    if ((*vars)-&gt;next) *vars = (*vars)-&gt;next;
    if (var_ptr) free(var_ptr);
 
+   grouplist_ptr = *groups;
+   if ((*groups)-&gt;next) *groups = (*groups)-&gt;next;
+   if (grouplist_ptr) free(grouplist_ptr);
+
    return 0;
 }
 

Modified: branches/registry_reorg/src/registry/registry_types.h
===================================================================
--- branches/registry_reorg/src/registry/registry_types.h        2010-09-15 17:03:13 UTC (rev 499)
+++ branches/registry_reorg/src/registry/registry_types.h        2010-09-16 18:44:25 UTC (rev 500)
@@ -3,6 +3,9 @@
 #define LOGICAL 2
 #define CHARACTER 3
 
+#define PERSISTENT 0
+#define SCRATCH    1
+
 #define INPUT0    0x00000001
 #define RESTART0  0x00000002
 #define OUTPUT0   0x00000004
@@ -11,6 +14,8 @@
 #define NEW_DIMENSION(X) X = (struct dimension *)malloc(sizeof(struct dimension)); X-&gt;next = NULL;
 #define NEW_DIMENSION_LIST(X) X = (struct dimension_list *)malloc(sizeof(struct dimension_list)); X-&gt;dim = NULL; X-&gt;prev = NULL; X-&gt;next = NULL;
 #define NEW_VARIABLE(X) X = (struct variable *)malloc(sizeof(struct variable)); X-&gt;dimlist = NULL; X-&gt;next = NULL;
+#define NEW_VARIABLE_LIST(X) X = (struct variable_list *)malloc(sizeof(struct variable_list)); X-&gt;var = NULL; X-&gt;prev = NULL; X-&gt;next = NULL;
+#define NEW_GROUP_LIST(X) X = (struct group_list *)malloc(sizeof(struct group_list)); X-&gt;vlist = NULL; X-&gt;next = NULL;
 
 union default_val {
    int ival;
@@ -41,14 +46,29 @@
    struct dimension_list * next;
 };
 
+struct variable_list {
+   struct variable * var;
+   struct variable_list * prev;
+   struct variable_list * next;
+};
+
+struct group_list {
+   char name[1024];
+   struct variable_list * vlist; 
+   struct group_list * next; 
+};
+
 struct variable {
    char name_in_file[1024];
    char name_in_code[1024];
+   char struct_group[1024];
    char super_array[1024];
    char array_class[1024];
+   int persistence;
    int vtype;
    int ndims;
    int timedim;
+   int ntime_levs;
    int iostreams;
    struct dimension_list * dimlist;
    struct variable * next;

</font>
</pre>