source: issm/trunk-jpl/src/c/modules/KMLMeshWritex/KMLMeshWritex.cpp@ 14917

Last change on this file since 14917 was 14917, checked in by Eric.Larour, 12 years ago

CHG: got rid of the include/include.h headere file, finally :)

File size: 12.0 KB
RevLine 
[7654]1/*!\file KMLMeshWritex
2 */
3
4#include "./KMLMeshWritex.h"
5#include "../../shared/shared.h"
[9761]6#include "../../io/io.h"
[7654]7#include "../../toolkits/toolkits.h"
8#include "../../EnumDefinitions/EnumDefinitions.h"
9
[12442]10void KMLMeshWritex(int* ierror,char* name,char* notes,int* elem,int melem,int nelem,int* nodecon,int mncon,int nncon,double* lat, double* lng,int* part,double* data, int mdata, int ndata,double* cmap, int mcmap, int ncmap,FILE* fid){
[7654]11
[12442]12 int i,j,k,ipt=0,jpt=0,nnodes;
13 int mxepg = 25;
14 int lwidth = 1;
15 double popac = 0.50;
16 char indent[81] = " ";
17 char cstr[81];
18 double *edata = NULL;
19 bool ncfree=false, edfree=false;
20 KML_Document *kdoc = NULL;
21 KML_Style *kstyle;
22 KML_LineStyle *klsty;
23 KML_PolyStyle *kpsty;
[7654]24
25 clock_t clock0,clock1,clock0a,clock0b,clock0c;
26 time_t time0, time1, time0a, time0b, time0c;
27
28 clock0=clock();
29 time0 =time(NULL);
[12519]30 _pprintString_("\nKMLMeshWritex Module -- " << ctime(&time0));
[7654]31
32/* construct kml document */
33
34 kdoc=new KML_Document();
35 sprintf(kdoc->name ,"ISSM Mesh: %s",name);
36 kdoc->open =1;
37 sprintf(kdoc->descript ,"%s",notes);
38
39/* write style templates for defaults and for each color of the matlab
40 colormap (note that matlab colormap format is rgb, where each varies
41 from 0 to 1, whereas the kml color format is aabbggrr, where each
42 varies from 00 to ff.) */
43
44 klsty=new KML_LineStyle();
45 sprintf(klsty->color ,"ff000000");
46 sprintf(klsty->colormode ,"normal");
47 klsty->width =lwidth;
48 kpsty=new KML_PolyStyle();
49 sprintf(kpsty->color ,"%02xffffff",(int)floor(popac*255+0.5));
50 sprintf(kpsty->colormode ,"random");
51 kstyle=new KML_Style();
[8461]52 kstyle->AddAttrib("id","BlackLineRandomPoly");
[7654]53 kstyle->line =klsty;
54 kstyle->poly =kpsty;
55 (kdoc->style )->AddObject((Object*)kstyle);
56
57 klsty=new KML_LineStyle();
58 sprintf(klsty->color ,"ff000000");
59 sprintf(klsty->colormode ,"normal");
60 klsty->width ,lwidth;
61 kpsty=new KML_PolyStyle();
62 sprintf(kpsty->color ,"00ffffff");
63 sprintf(kpsty->colormode ,"random");
64 kstyle=new KML_Style();
[8461]65 kstyle->AddAttrib("id","BlackLineEmptyPoly");
[7654]66 kstyle->line =klsty;
67 kstyle->poly =kpsty;
68 (kdoc->style )->AddObject((Object*)kstyle);
69
70 klsty=new KML_LineStyle();
71 sprintf(klsty->color ,"ff0000ff");
72 sprintf(klsty->colormode ,"normal");
73 klsty->width =lwidth;
74 kpsty=new KML_PolyStyle();
75 sprintf(kpsty->color ,"%02x0000ff",(int)floor(popac*255+0.5));
76 sprintf(kpsty->colormode ,"random");
77 kstyle=new KML_Style();
[8461]78 kstyle->AddAttrib("id","RedLineRedPoly");
[7654]79 kstyle->line =klsty;
80 kstyle->poly =kpsty;
81 (kdoc->style )->AddObject((Object*)kstyle);
82
83 if (cmap) {
[12519]84 _pprintLine_("Writing " << mcmap << " Matlab colors as KML style templates.");
[7658]85 ipt=0;
[7654]86 for (i=0; i<mcmap; i++) {
87 klsty=new KML_LineStyle();
[9259]88// sprintf(klsty->color ,"ff000000");
89 sprintf(klsty->color ,"%02x%02x%02x%02x",
90 (int)255,
91 (int)floor(cmap[ipt+2]*255+0.5),
92 (int)floor(cmap[ipt+1]*255+0.5),
93 (int)floor(cmap[ipt ]*255+0.5));
[7654]94 sprintf(klsty->colormode ,"normal");
95 klsty->width =lwidth;
96 kpsty=new KML_PolyStyle();
97 sprintf(kpsty->color ,"%02x%02x%02x%02x",
98 (int)floor(popac*255+0.5),
99 (int)floor(cmap[ipt+2]*255+0.5),
100 (int)floor(cmap[ipt+1]*255+0.5),
101 (int)floor(cmap[ipt ]*255+0.5));
102 sprintf(kpsty->colormode ,"normal");
103 kstyle=new KML_Style();
[8461]104 sprintf(cstr,"MatlabColor%d",i+1);
105 kstyle->AddAttrib("id",cstr);
[7654]106 kstyle->line =klsty;
107 kstyle->poly =kpsty;
108 (kdoc->style )->AddObject((Object*)kstyle);
[7658]109 ipt+=ncmap;
[7654]110 }
111 }
112// kdoc->DeepEcho();
113
[7660]114/* create the node connectivity table, if necessary
115 (noting that rows do not need to be sorted, since the elements
116 are consecutively numbered) */
[7658]117
[7660]118 if (!nodecon) {
[12519]119 _pprintLine_("Creating the node connectivity table.");
[7660]120 nncon=mxepg+1;
[12446]121 nodecon=xNewZeroInit<int>(mncon*nncon);
[7660]122 ncfree=true;
123
124 jpt=0;
125 for (i=0; i<melem; i++) {
126 for (j=0; j<nelem; j++) {
127 if (elem[jpt]) {
128 ipt=(elem[jpt]-1)*nncon;
129 if (nodecon[ipt+(nncon-1)] < mxepg) {
130 nodecon[ipt+nodecon[ipt+(nncon-1)]]=i+1;
131 nodecon[ipt+(nncon-1)]++;
132 }
133 else
[13056]134 _error_("Nodal connectivity table needs more than specified " << mxepg << " columns.\n");
[7660]135 }
136 jpt++;
137 }
138 }
139 }
140
141/* average nodal data to element data, if necessary
142 (noting that multiple columns of data are handled here, but not
143 yet below) */
144
[7658]145 if (data) {
146 if (mdata == melem)
147 edata=data;
[7660]148
[7658]149 else if (mdata == mncon) {
[12519]150 _pprintLine_("Averaging nodal data to element data.");
[12446]151 edata=xNewZeroInit<double>(melem*ndata);
[7660]152 edfree=true;
153
[7658]154 ipt=0;
155 jpt=0;
156 for (i=0; i<melem; i++) {
[7660]157 nnodes=0;
[7658]158 for (j=0; j<nelem; j++) {
[7660]159 if (elem[jpt]) {
160 for (k=0; k<ndata; k++)
161 edata[ipt+k]+=data[(elem[jpt]-1)*ndata+k];
162 nnodes++;
163 }
[7658]164 jpt++;
165 }
[7660]166 if (nnodes)
167 for (k=0; k<ndata; k++)
168 edata[ipt+k]/=(double)nnodes;
[7658]169 ipt+=ndata;
170 }
171 }
[7660]172
[7658]173 else
[13056]174 _error_("Data matrix has incorrect number of " << mdata << " rows.\n");
[7658]175 }
176
[7654]177/* write folder for mesh */
178
179 (kdoc ->feature )->AddObject((Object*)KMLMeshElem(elem,melem,nelem,
180 nodecon,mncon,nncon,
181 lat,lng,
[7658]182 edata,
[7654]183 cmap,mcmap,ncmap));
184
[12450]185 if(edfree) xDelete<double>(edata);
186 if(ncfree) xDelete<int>(nodecon);
[7654]187 clock0a=clock();
188 time0a =time(NULL);
189 _printf_(true," Constructed kml document -- %f CPU seconds; %f elapsed seconds.\n\n",
190 ((double)(clock0a-clock0))/CLOCKS_PER_SEC,difftime(time0a,time0));
191
192/* write kml file */
193
[12519]194 _pprintLine_("Writing kml document to file.");
[7654]195 fprintf(fid,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
196 fprintf(fid,"<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n");
197 kdoc->Write(fid,indent);
198 fprintf(fid,"</kml>\n");
199 clock0b=clock();
200 time0b =time(NULL);
201 _printf_(true," Wrote kml file -- %f CPU seconds; %f elapsed seconds.\n\n",
202 ((double)(clock0b-clock0a))/CLOCKS_PER_SEC,difftime(time0b,time0a));
203
[12519]204 _pprintLine_("Deleting kml document.");
[7654]205 delete kdoc;
206 clock0c=clock();
207 time0c =time(NULL);
208 _printf_(true," Deleted kml document -- %f CPU seconds; %f elapsed seconds.\n\n",
209 ((double)(clock0c-clock0b))/CLOCKS_PER_SEC,difftime(time0c,time0b));
210
211 clock1=clock();
212 time1 =time(NULL);
213 _printf_(true,"KMLMeshWritex Module -- %f CPU seconds; %f elapsed seconds.\n\n",
214 ((double)(clock1-clock0))/CLOCKS_PER_SEC,difftime(time1,time0));
215
216 return;
217}
218
219KML_Folder* KMLMeshElem(int* elem,int melem,int nelem,
220 int* nodecon,int mncon,int nncon,
221 double* lat, double* lng,
222 double* edata,
223 double* cmap, int mcmap, int ncmap){
224
[7658]225 int i,j,ipt=0;
[7669]226 double alt=0;
[7658]227 double cmin= DBL_MAX,
[7660]228 cmax=-DBL_MAX;
[7658]229 int imap;
[7654]230 KML_Folder* kfold =NULL;
231 KML_Placemark* kplace=NULL;
232 KML_Polygon* kpoly =NULL;
233 KML_LinearRing* kring =NULL;
234
235/* write folder for mesh */
236
237 kfold=new KML_Folder();
[7685]238// sprintf(kfold->name ,"Mesh");
239 sprintf(kfold->name ,"ISSM Targets");
[7654]240 kfold->visibility=1;
[8303]241// sprintf(kfold->descript ,"Elements=%d, Nodes=%d",melem,mncon);
[7685]242 sprintf(kfold->descript ,"campaign{\n");
243 strcat(kfold->descript ," evaluator ClaspTargetEvaluator;\n");
[8046]244 strcat(kfold->descript ," solver IssmSolver;\n");
[7685]245 strcat(kfold->descript ," spacecraft airplane ClaspSpacecraft(\n");
246 strcat(kfold->descript ," dutyCycleDuration=0,\n");
247 strcat(kfold->descript ," dutyCycleOnDuration=0,\n");
248 strcat(kfold->descript ," memoryInit=15000,\n");
249 strcat(kfold->descript ," memoryLimit=40000000,\n");
250 strcat(kfold->descript ," maxDataCollectionRate=27,\n");
251 strcat(kfold->descript ," maxDataDownlinkRate=10);\n");
252 strcat(kfold->descript ,"\n");
253 strcat(kfold->descript ," //sensor names\n");
254 strcat(kfold->descript ," sensor qqp_swath = 2,102,1002,1102;\n");
255 strcat(kfold->descript ,"\n");
256 strcat(kfold->descript ," //sensor ids to modes\n");
257 strcat(kfold->descript ," low_bandwidth_single_pol = 2,102,1002,1102;\n");
258 strcat(kfold->descript ," single_pol = 2,102,1002,1102;\n");
259 strcat(kfold->descript ," dual_pol = 2,102,1002,1102;\n");
260 strcat(kfold->descript ," quad_pol = 2,102,1002,1102;\n");
261 strcat(kfold->descript ,"\n");
262 strcat(kfold->descript ," //LRAD\n");
263 strcat(kfold->descript ," //Note all targets are \"ascending right\"-- i.e. mode=2\n");
264 strcat(kfold->descript ," left = 1002,1102;\n");
265 strcat(kfold->descript ," right = 2,102;\n");
266 strcat(kfold->descript ," ascending = 2,1002;\n");
267 strcat(kfold->descript ," descending = 102,1102;\n");
268 strcat(kfold->descript ,"\n");
269 strcat(kfold->descript ," //data rates\n");
270 strcat(kfold->descript ," low_bandwidth_single_pol datarate = 0.896;\n");
271 strcat(kfold->descript ," single_pol datarate = 4.214;\n");
272 strcat(kfold->descript ," dual_pol datarate = 8.428;\n");
273 strcat(kfold->descript ," quad_pol datarate = 16.856;\n");
274 strcat(kfold->descript ,"\n");
275 strcat(kfold->descript ," //mode domination relationships\n");
276 strcat(kfold->descript ," quad_pol dominates low_bandwidth_single_pol;\n");
277 strcat(kfold->descript ," quad_pol dominates single_pol;\n");
278 strcat(kfold->descript ," quad_pol dominates dual_pol;\n");
279 strcat(kfold->descript ," dual_pol dominates low_bandwidth_single_pol;\n");
280 strcat(kfold->descript ," dual_pol dominates single_pol;\n");
281 strcat(kfold->descript ," single_pol dominates low_bandwidth_single_pol;\n");
282 strcat(kfold->descript ,"\n");
283 strcat(kfold->descript ," //sensor styles\n");
284 strcat(kfold->descript ," 2 0xff00ffff 0xff000000;\n");
285 strcat(kfold->descript ," 102 0x7f00ffff 0xff00ffff;\n");
286 strcat(kfold->descript ," 1002 0xffffff00 0xffffff00;\n");
287 strcat(kfold->descript ," 1102 0x7fffff00 0xffffff00;\n");
288 strcat(kfold->descript ,"\n");
289 strcat(kfold->descript ," //discipline styles\n");
290 strcat(kfold->descript ," deformation 0xff006090 0xff006090 0xff0000ff 0xff1010ff;\n");
291 strcat(kfold->descript ," vegetation 0xff00ff00 0xff00ff00 0xff0000ff 0xff0020ff;\n");
292 strcat(kfold->descript ," ice 0xffff0000 0xffff0000 0xff0000ff 0xff2000ff;\n");
293 strcat(kfold->descript ,"}");
[7654]294
295 if (edata)
296 for (i=0; i<melem; i++) {
297 if (edata[i] < cmin)
298 cmin=edata[i];
299 if (edata[i] > cmax)
300 cmax=edata[i];
301 }
302
303/* write each element as a polygon placemark */
304
[12519]305 _pprintLine_("Writing " << melem << " tria elements as KML polygons.");
[7654]306
307 for (i=0; i<melem; i++) {
308 kplace=new KML_Placemark();
309 sprintf(kplace->name ,"Element %d",(i+1));
310 kplace->visibility=1;
311 if (edata) {
312// sprintf(kplace->descript ,"Element data: %g",edata[i]);
313 sprintf(kplace->descript ,"campaign{\n deformation 1 %g quad_pol ascending right asap;\n}",edata[i]);
314 imap = (int)floor((edata[i]-cmin)/(cmax-cmin)*mcmap+0.5)+1;
315 if ((imap >= 1) && (imap <= mcmap))
316 sprintf(kplace->styleurl ,"#MatlabColor%d",imap);
317 else if (edata[i] == cmax)
318 sprintf(kplace->styleurl ,"#MatlabColor%d",mcmap);
319 else
320 sprintf(kplace->styleurl ,"#BlackLineEmptyPoly");
321 }
322 else {
323 sprintf(kplace->descript ,"");
324 sprintf(kplace->styleurl ,"#BlackLineRandomPoly");
325 }
326// kplace->DeepEcho();
327
328 kpoly=new KML_Polygon();
329 kpoly->extrude =1;
[7669]330 sprintf(kpoly->altmode ,"clampToGround");
[7654]331// kpoly->DeepEcho();
332
333 kring=new KML_LinearRing();
334 kring->ncoord =nelem+1;
[12442]335 kring->coords =xNew<double>((nelem+1)*3);
[7654]336
337/* write the nodal coordinates as a linear ring */
338
339 for (j=0; j<nelem; j++) {
[12442]340 kring->coords[3*j+0]=lng[elem[ipt]-1];
341 kring->coords[3*j+1]=lat[elem[ipt]-1];
342 kring->coords[3*j+2]=alt;
[7654]343 ipt++;
344 }
[12442]345 kring->coords[3*nelem+0]=kring->coords[3*0+0];
346 kring->coords[3*nelem+1]=kring->coords[3*0+1];
347 kring->coords[3*nelem+2]=kring->coords[3*0+2];
[7654]348// kring->DeepEcho();
349
350/* assemble the linear ring into polygon into placemark into folder */
351
[12442]352 (kpoly ->outer )->AddObject((Object*)kring);
353 (kplace->geometry)->AddObject((Object*)kpoly);
354 (kfold ->feature )->AddObject((Object*)kplace);
[7654]355
[7658]356// if (!(int)fmod((double)(i+1),1000))
[12519]357// _pprintLine_(" " << (i+1) << " tria elements written.");
[7654]358 }
[12519]359 _pprintLine_(" " << melem << " tria elements written.");
[7654]360
361 return(kfold);
362}
Note: See TracBrowser for help on using the repository browser.