ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/eplus_adduvf.c
Revision: 2.1
Committed: Sun Feb 9 05:49:21 2014 UTC (10 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Unfinished implementation of EnergyPlus User View Factors calculation

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2     static const char RCSid[] = "$Id$";
3     #endif
4     /*
5     * Add User View Factors to EnergyPlus Input Data File
6     *
7     * G.Ward for LBNL
8     */
9    
10     #include <stdio.h>
11     #include <stdlib.h>
12     #include <string.h>
13     #include "eplus_idf.h"
14     #include "triangulate.h"
15    
16     #ifndef NSAMPLES
17     #define NSAMPLES 100000 /* number of samples to use */
18     #endif
19    
20     #define UVF_PNAME "ZoneProperty:UserViewFactor:bySurfaceName"
21    
22     const char ADD_HEADER[] =
23     "!+++ User View Factors computed by Radiance +++!\n";
24    
25     #define NAME_FLD 1 /* name field always first? */
26    
27     typedef struct {
28     const char *pname; /* parameter type name */
29     short zone_fld; /* zone field index */
30     short vert_fld; /* vertex field index */
31     } SURF_PTYPE; /* surface type we're interested in */
32    
33     const SURF_PTYPE surf_type[] = {
34     {"BuildingSurface:Detailed", 4, 10},
35     {NULL}
36     };
37    
38     struct s_zone {
39     const char *zname; /* zone name */
40     struct s_zone *next; /* next zone in list */
41     IDF_PARAMETER *pfirst; /* first matching parameter */
42     IDF_PARAMETER *plast; /* last matching parameter */
43     } *zone_list = NULL;
44    
45     IDF_LOADED *our_idf = NULL; /* loaded/modified IDF */
46    
47     /* Create a new zone and push to top of our list */
48     static struct s_zone *
49     new_zone(const char *zname, IDF_PARAMETER *param)
50     {
51     struct s_zone *znew = (struct s_zone *)malloc(sizeof(struct s_zone));
52    
53     if (znew == NULL)
54     return(NULL);
55     znew->zname = zname; /* assumes static */
56     znew->next = zone_list;
57     znew->pfirst = znew->plast = param;
58     return(zone_list = znew);
59     }
60    
61     /* Add the detailed surface (polygon) to the named zone */
62     static struct s_zone *
63     add2zone(IDF_PARAMETER *param, const char *zname)
64     {
65     struct s_zone *zptr;
66    
67     for (zptr = zone_list; zptr != NULL; zptr = zptr->next)
68     if (!strcmp(zptr->zname, zname))
69     break;
70     if (zptr == NULL)
71     return(new_zone(zname, param));
72     /* keep surfaces together */
73     if (!idf_movparam(our_idf, param, zptr->plast))
74     return(NULL);
75     zptr->plast = param;
76     return(zptr);
77     }
78    
79     /* Compute zone User View Factors */
80     static int
81     compute_zones(void)
82     {
83     fputs("compute_zones() unimplemented\n", stderr);
84     return(0);
85     }
86    
87     /* Load IDF and compute User View Factors */
88     int
89     main(int argc, char *argv[])
90     {
91     char *origIDF, *revIDF;
92     IDF_PARAMETER *pptr;
93     int i;
94    
95     if ((argc < 2) | (argc > 3)) {
96     fputs("Usage: ", stderr);
97     fputs(argv[0], stderr);
98     fputs(" Model.idf [Revised.idf]\n", stderr);
99     return(1);
100     }
101     origIDF = argv[1];
102     revIDF = (argc == 2) ? argv[1] : argv[2];
103     /* load Input Data File */
104     our_idf = idf_load(origIDF);
105     if (our_idf == NULL) {
106     fputs(argv[0], stderr);
107     fputs(": cannot load IDF '", stderr);
108     fputs(origIDF, stderr);
109     fputs("'\n", stderr);
110     return(1);
111     }
112     /* remove existing UVFs */
113     if ((pptr = idf_getparam(our_idf, UVF_PNAME)) != NULL) {
114     IDF_PARAMETER *pnext;
115     fputs(argv[0], stderr);
116     fputs(": removing previous User View Factors\n", stderr);
117     do {
118     pnext = pptr->pnext;
119     idf_delparam(our_idf, pptr);
120     } while (pnext != NULL);
121     }
122     /* add to header */
123     if (our_idf->hrem == NULL ||
124     (i = strlen(our_idf->hrem)-strlen(ADD_HEADER)) < 0 ||
125     strcmp(our_idf->hrem+i, ADD_HEADER))
126     idf_add2hdr(our_idf, ADD_HEADER);
127     /* gather zone surfaces */
128     for (i = 0; surf_type[i].pname != NULL; i++)
129     for (pptr = idf_getparam(our_idf, surf_type[i].pname);
130     pptr != NULL; pptr = pptr->pnext) {
131     IDF_FIELD *fptr = idf_getfield(pptr,
132     surf_type[i].zone_fld);
133     if (fptr == NULL) {
134     fputs("Warning: missing zone field!\n", stderr);
135     continue;
136     }
137     if (add2zone(pptr, fptr->arg) == NULL)
138     return(1);
139     }
140     /* run rcontrib on each zone */
141     if (!compute_zones())
142     return(1);
143     /* write out modified IDF */
144     if (!idf_write(our_idf, revIDF, 1)) {
145     fputs(argv[0], stderr);
146     fputs(": error writing IDF '", stderr);
147     fputs(revIDF, stderr);
148     fputs("'\n", stderr);
149     return(1);
150     }
151     return(0); /* finito! */
152     }