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 3349 - (view) (download) (as text)

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

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