Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /trunk/src/lib/common/output.c
ViewVC logotype

Annotation of /trunk/src/lib/common/output.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1640 - (view) (download) (as text)

1 : jhr 1640 /*! \file output.c
2 :     *
3 :     * \author Nick Seltzer
4 :     */
5 :    
6 :     /*
7 :     * COPYRIGHT (c) 2011 The Diderot Project (http://diderot-language.cs.uchicago.edu)
8 :     * All rights reserved.
9 :     */
10 :    
11 :     #include <stdio.h>
12 :     #include "Diderot/diderot.h"
13 :     #include <teem/nrrd.h>
14 :     #include <teem/air.h>
15 :    
16 :     // FIXME: to make this compatible with OpenCL (and CUDA), we should be copying the
17 :     // output state to the output array on the GPU and then just uploading the output
18 :     // array to the CPU. This will require changing the interface of these functions.
19 :    
20 :     /*! \brief Print the strand output state to a text file.
21 :     */
22 :     void Diderot_Print (Diderot_World_t *wrld)
23 :     {
24 :     WorldPrefix_t *hdr = (WorldPrefix_t *)wrld;
25 :     airArray *mop = airMopNew();
26 :    
27 :     // here we have the final state of all of the strands in the "in" buffer
28 :     int outFileNameLen = strlen(hdr->name) + 5;
29 :     char *outFileName = (char *)CheckedAlloc(outFileNameLen);
30 :     airMopAdd(mop, outFileName, airFree, airMopAlways);
31 :     snprintf (outFileName, outFileNameLen, "%s.txt", hdr->name);
32 :     FILE *outS = fopen(outFileName, "w");
33 :     if (outS == NULL) {
34 :     fprintf (stderr, "Cannot open output file %s\n", outFileName);
35 :     airMopError(mop);
36 :     exit (8);
37 :     }
38 :     airMopAdd(mop, outS, (airMopper)airFclose, airMopAlways);
39 :    
40 :     // print the strand output states
41 :     for (int i = 0; i < hdr->numStrands; i++) {
42 :     if (hdr->status[i] == DIDEROT_STABLE) {
43 :     Diderot_Strands[0]->print (outS, Diderot_OutState(wrld, i));
44 :     }
45 :     }
46 :    
47 :     airMopOkay(mop);
48 :     }
49 :    
50 :     /*! \brief Output the strand output state to a nrrd file.
51 :     */
52 :     void Diderot_Output (Diderot_World_t *wrld, size_t outStateSzb)
53 :     {
54 :     WorldPrefix_t *hdr = (WorldPrefix_t *)wrld;
55 :     airArray *mop = airMopNew();
56 :     int status;
57 :     char *err;
58 :    
59 :     // get correct output file name
60 :     int outFileNameLen = strlen(hdr->name) + 6;
61 :     char *outFileName = (char *)CheckedAlloc(outFileNameLen);
62 :     airMopAdd(mop, outFileName, airFree, airMopAlways);
63 :     snprintf (outFileName, outFileNameLen, "%s.nrrd", hdr->name);
64 :    
65 :     // calculate the amount of space needed for the output array
66 :     int numStabilized;
67 :     if (hdr->isArray) {
68 :     numStabilized = hdr->numStrands;
69 :     }
70 :     else {
71 :     numStabilized = 0;
72 :     for (int i = 0; i < hdr->numStrands; i++) {
73 :     if (hdr->status[i] == DIDEROT_STABLE)
74 :     numStabilized++;
75 :     }
76 :     }
77 :    
78 :     // allocate the output object
79 :     void *outData = CheckedAlloc(numStabilized * outStateSzb);
80 :     airMopAdd(mop, outData, airFree, airMopAlways);
81 :    
82 :     // copy data into outData
83 :     void *outPos = outData;
84 :     for (int i = 0; i < hdr->numStrands; i++) {
85 :     if (hdr->status[i] == DIDEROT_STABLE) {
86 :     Diderot_Strands[0]->output (outPos, Diderot_OutState(wrld, i));
87 :     outPos += outStateSzb;
88 :     }
89 :     }
90 :    
91 :     // make a new nrrd
92 :     Nrrd *outNrrd;
93 :     outNrrd = nrrdNew();
94 :     if (outNrrd == NULL) {
95 :     fprintf(stderr, "Trouble allocating nrrd struct:\n%s", err);
96 :     airMopError(mop);
97 :     exit(1);
98 :     }
99 :     airMopAdd(mop, outNrrd, (airMopper)nrrdNix, airMopAlways);
100 :    
101 :     // wrap the data (outData) with the nrrd (outNrrd)
102 :     if (hdr->isArray) {
103 :     size_t *sizes = NEWVEC(size_t, hdr->nDims + 1);
104 :     airMopAdd(mop, sizes, airFree, airMopAlways);
105 :     switch(Diderot_Strands[0]->nrrdType) {
106 :     case nrrdTypeInt:
107 :     case nrrdTypeFloat:
108 :     sizes[0] = outStateSzb >> 2;
109 :     break;
110 :     case nrrdTypeLLong:
111 :     case nrrdTypeDouble:
112 :     sizes[0] = outStateSzb >> 3;
113 :     break;
114 :     default:
115 :     fprintf(stderr, "Bad nrrdType\n");
116 :     airMopError(mop);
117 :     exit(1);
118 :     break;
119 :     }
120 :     for (int i = 1; i <= hdr->nDims; i++) {
121 :     sizes[i] = hdr->size[hdr->nDims - i];
122 :     }
123 :     status = nrrdWrap_nva(outNrrd, outData, Diderot_Strands[0]->nrrdType, hdr->nDims + 1, sizes);
124 :     if (status) {
125 :     err = biffGetDone(NRRD);
126 :     fprintf(stderr, "Trouble wrapping nrrd struct:\n%s", err);
127 :     airMopError(mop);
128 :     free(err);
129 :     exit(1);
130 :     }
131 :     }
132 :     else {
133 :     size_t *sizes = NEWVEC(size_t, 2);
134 :     airMopAdd(mop, sizes, airFree, airMopAlways);
135 :     switch(Diderot_Strands[0]->nrrdType) {
136 :     case nrrdTypeInt:
137 :     case nrrdTypeFloat:
138 :     sizes[0] = outStateSzb >> 2;
139 :     break;
140 :     case nrrdTypeLLong:
141 :     case nrrdTypeDouble:
142 :     sizes[0] = outStateSzb >> 3;
143 :     break;
144 :     default:
145 :     fprintf(stderr, "Bad nrrdType\n");
146 :     airMopError(mop);
147 :     exit(1);
148 :     break;
149 :     }
150 :     sizes[1] = numStabilized;
151 :     status = nrrdWrap_nva(outNrrd, outData, Diderot_Strands[0]->nrrdType, hdr->nDims, sizes);
152 :     if (status != 0) {
153 :     err = biffGetDone(NRRD);
154 :     fprintf(stderr, "Trouble wrapping nrrd struct:\n%s", err);
155 :     airMopError(mop);
156 :     free(err);
157 :     exit(1);
158 :     }
159 :     }
160 :    
161 :     // save the data
162 :     status = nrrdSave(outFileName, outNrrd, NULL);
163 :     if(status) {
164 :     err = biffGetDone(NRRD);
165 :     fprintf(stderr, "Trouble saving nrrd struct:\n%s", err);
166 :     airMopError(mop);
167 :     free(err);
168 :     exit(1);
169 :     }
170 :    
171 :     airMopOkay(mop);
172 :    
173 :     }

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0