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