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

SCM Repository

[diderot] Annotation of /branches/pure-cfg/src/lib/common/output.c
ViewVC logotype

Annotation of /branches/pure-cfg/src/lib/common/output.c

Parent Directory Parent Directory | Revision Log Revision Log


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

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

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