Ice Sheet System Model  4.18
Code documentation
Functions
KMLMeshWritex.h File Reference

header file for kml mesh writer routines. More...

#include <float.h>
#include "../../kml/kmlobjects.h"

Go to the source code of this file.

Functions

void 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)
 
KML_FolderKMLMeshElem (int *elem, int melem, int nelem, int *nodecon, int mncon, int nncon, double *lat, double *lng, double *edata, double *cmap, int mcmap, int ncmap)
 

Detailed Description

header file for kml mesh writer routines.

Definition in file KMLMeshWritex.h.

Function Documentation

◆ KMLMeshWritex()

void 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 
)

Definition at line 8 of file KMLMeshWritex.cpp.

8  {
9 
10  int i,j,k,ipt=0,jpt=0,nnodes;
11  int mxepg = 25;
12  int lwidth = 1;
13  double popac = 0.50;
14  char indent[81] = " ";
15  char cstr[81];
16  double *edata = NULL;
17  bool ncfree=false, edfree=false;
18  KML_Document *kdoc = NULL;
19  KML_Style *kstyle;
20  KML_LineStyle *klsty;
21  KML_PolyStyle *kpsty;
22 
23  clock_t clock0,clock1,clock0a,clock0b,clock0c;
24  time_t time0, time1, time0a, time0b, time0c;
25 
26  clock0=clock();
27  time0 =time(NULL);
28  _printf0_("\nKMLMeshWritex Module -- " << ctime(&time0));
29 
30 /* construct kml document */
31 
32  kdoc=new KML_Document();
33  sprintf(kdoc->name ,"ISSM Mesh: %s",name);
34  kdoc->open =1;
35  sprintf(kdoc->descript ,"%s",notes);
36 
37 /* write style templates for defaults and for each color of the matlab
38  colormap (note that matlab colormap format is rgb, where each varies
39  from 0 to 1, whereas the kml color format is aabbggrr, where each
40  varies from 00 to ff.) */
41 
42  klsty=new KML_LineStyle();
43  sprintf(klsty->color ,"ff000000");
44  sprintf(klsty->colormode ,"normal");
45  klsty->width =lwidth;
46  kpsty=new KML_PolyStyle();
47  sprintf(kpsty->color ,"%02xffffff",(int)floor(popac*255+0.5));
48  sprintf(kpsty->colormode ,"random");
49  kstyle=new KML_Style();
50  kstyle->AddAttrib("id","BlackLineRandomPoly");
51  kstyle->line =klsty;
52  kstyle->poly =kpsty;
53  (kdoc->style )->AddObject((Object*)kstyle);
54 
55  klsty=new KML_LineStyle();
56  sprintf(klsty->color ,"ff000000");
57  sprintf(klsty->colormode ,"normal");
58  klsty->width =lwidth;
59  kpsty=new KML_PolyStyle();
60  sprintf(kpsty->color ,"00ffffff");
61  sprintf(kpsty->colormode ,"random");
62  kstyle=new KML_Style();
63  kstyle->AddAttrib("id","BlackLineEmptyPoly");
64  kstyle->line =klsty;
65  kstyle->poly =kpsty;
66  (kdoc->style )->AddObject((Object*)kstyle);
67 
68  klsty=new KML_LineStyle();
69  sprintf(klsty->color ,"ff0000ff");
70  sprintf(klsty->colormode ,"normal");
71  klsty->width =lwidth;
72  kpsty=new KML_PolyStyle();
73  sprintf(kpsty->color ,"%02x0000ff",(int)floor(popac*255+0.5));
74  sprintf(kpsty->colormode ,"random");
75  kstyle=new KML_Style();
76  kstyle->AddAttrib("id","RedLineRedPoly");
77  kstyle->line =klsty;
78  kstyle->poly =kpsty;
79  (kdoc->style )->AddObject((Object*)kstyle);
80 
81  if (cmap) {
82  _printf0_("Writing " << mcmap << " Matlab colors as KML style templates.\n");
83  ipt=0;
84  for (i=0; i<mcmap; i++) {
85  klsty=new KML_LineStyle();
86 // sprintf(klsty->color ,"ff000000");
87  sprintf(klsty->color ,"%02x%02x%02x%02x",
88  (int)255,
89  (int)floor(cmap[ipt+2]*255+0.5),
90  (int)floor(cmap[ipt+1]*255+0.5),
91  (int)floor(cmap[ipt ]*255+0.5));
92  sprintf(klsty->colormode ,"normal");
93  klsty->width =lwidth;
94  kpsty=new KML_PolyStyle();
95  sprintf(kpsty->color ,"%02x%02x%02x%02x",
96  (int)floor(popac*255+0.5),
97  (int)floor(cmap[ipt+2]*255+0.5),
98  (int)floor(cmap[ipt+1]*255+0.5),
99  (int)floor(cmap[ipt ]*255+0.5));
100  sprintf(kpsty->colormode ,"normal");
101  kstyle=new KML_Style();
102  sprintf(cstr,"MatlabColor%d",i+1);
103  kstyle->AddAttrib("id",cstr);
104  kstyle->line =klsty;
105  kstyle->poly =kpsty;
106  (kdoc->style )->AddObject((Object*)kstyle);
107  ipt+=ncmap;
108  }
109  }
110 // kdoc->DeepEcho();
111 
112 /* create the node connectivity table, if necessary
113  (noting that rows do not need to be sorted, since the elements
114  are consecutively numbered) */
115 
116  if (!nodecon) {
117  _printf0_("Creating the node connectivity table.\n");
118  nncon=mxepg+1;
119  nodecon=xNewZeroInit<int>(mncon*nncon);
120  ncfree=true;
121 
122  jpt=0;
123  for (i=0; i<melem; i++) {
124  for (j=0; j<nelem; j++) {
125  if (elem[jpt]) {
126  ipt=(elem[jpt]-1)*nncon;
127  if (nodecon[ipt+(nncon-1)] < mxepg) {
128  nodecon[ipt+nodecon[ipt+(nncon-1)]]=i+1;
129  nodecon[ipt+(nncon-1)]++;
130  }
131  else
132  _error_("Nodal connectivity table needs more than specified " << mxepg << " columns.\n");
133  }
134  jpt++;
135  }
136  }
137  }
138 
139 /* average nodal data to element data, if necessary
140  (noting that multiple columns of data are handled here, but not
141  yet below) */
142 
143  if (data) {
144  if (mdata == melem)
145  edata=data;
146 
147  else if (mdata == mncon) {
148  _printf0_("Averaging nodal data to element data.\n");
149  edata=xNewZeroInit<double>(melem*ndata);
150  edfree=true;
151 
152  ipt=0;
153  jpt=0;
154  for (i=0; i<melem; i++) {
155  nnodes=0;
156  for (j=0; j<nelem; j++) {
157  if (elem[jpt]) {
158  for (k=0; k<ndata; k++)
159  edata[ipt+k]+=data[(elem[jpt]-1)*ndata+k];
160  nnodes++;
161  }
162  jpt++;
163  }
164  if (nnodes)
165  for (k=0; k<ndata; k++)
166  edata[ipt+k]/=(double)nnodes;
167  ipt+=ndata;
168  }
169  }
170 
171  else
172  _error_("Data matrix has incorrect number of " << mdata << " rows.\n");
173  }
174 
175 /* write folder for mesh */
176 
177  (kdoc ->feature )->AddObject((Object*)KMLMeshElem(elem,melem,nelem,
178  nodecon,mncon,nncon,
179  lat,lng,
180  edata,
181  cmap,mcmap,ncmap));
182 
183  if(edfree) xDelete<double>(edata);
184  if(ncfree) xDelete<int>(nodecon);
185  clock0a=clock();
186  time0a =time(NULL);
187  _printf_(" Constructed kml document -- " << ((double)(clock0a-clock0))/CLOCKS_PER_SEC << " CPU seconds; " << difftime(time0a,time0) << " elapsed seconds.\n\n\n");
188 
189 /* write kml file */
190 
191  _printf0_("Writing kml document to file.\n");
192  fprintf(fid,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
193  fprintf(fid,"<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n");
194  kdoc->Write(fid,indent);
195  fprintf(fid,"</kml>\n");
196  clock0b=clock();
197  time0b =time(NULL);
198  _printf_(" Wrote kml file -- " << ((double)(clock0b-clock0a))/CLOCKS_PER_SEC << " CPU seconds; " << difftime(time0b,time0a) << " elapsed seconds.\n\n\n");
199 
200  _printf0_("Deleting kml document.\n");
201  delete kdoc;
202  clock0c=clock();
203  time0c =time(NULL);
204  _printf_(" Deleted kml document -- " << ((double)(clock0c-clock0b))/CLOCKS_PER_SEC << " CPU seconds; " << difftime(time0c,time0b) << " elapsed seconds.\n\n\n");
205 
206  clock1=clock();
207  time1 =time(NULL);
208  _printf_("KMLMeshWritex Module -- " << ((double)(clock1-clock0))/CLOCKS_PER_SEC << " CPU seconds; " << difftime(time1,time0) << " elapsed seconds.\n\n\n");
209 
210  return;
211 }

◆ KMLMeshElem()

KML_Folder* KMLMeshElem ( int *  elem,
int  melem,
int  nelem,
int *  nodecon,
int  mncon,
int  nncon,
double *  lat,
double *  lng,
double *  edata,
double *  cmap,
int  mcmap,
int  ncmap 
)

Definition at line 213 of file KMLMeshWritex.cpp.

217  {
218 
219  int i,j,ipt=0;
220  double alt=0;
221  double cmin= DBL_MAX,
222  cmax=-DBL_MAX;
223  int imap;
224  KML_Folder* kfold =NULL;
225  KML_Placemark* kplace=NULL;
226  KML_Polygon* kpoly =NULL;
227  KML_LinearRing* kring =NULL;
228 
229 /* write folder for mesh */
230 
231  kfold=new KML_Folder();
232 // sprintf(kfold->name ,"Mesh");
233  sprintf(kfold->name ,"ISSM Targets");
234  kfold->visibility=1;
235 // sprintf(kfold->descript ,"Elements=%d, Nodes=%d",melem,mncon);
236  sprintf(kfold->descript ,"campaign{\n");
237  strcat(kfold->descript ," evaluator ClaspTargetEvaluator;\n");
238  strcat(kfold->descript ," solver IssmSolver;\n");
239  strcat(kfold->descript ," spacecraft airplane ClaspSpacecraft(\n");
240  strcat(kfold->descript ," dutyCycleDuration=0,\n");
241  strcat(kfold->descript ," dutyCycleOnDuration=0,\n");
242  strcat(kfold->descript ," memoryInit=15000,\n");
243  strcat(kfold->descript ," memoryLimit=40000000,\n");
244  strcat(kfold->descript ," maxDataCollectionRate=27,\n");
245  strcat(kfold->descript ," maxDataDownlinkRate=10);\n");
246  strcat(kfold->descript ,"\n");
247  strcat(kfold->descript ," //sensor names\n");
248  strcat(kfold->descript ," sensor qqp_swath = 2,102,1002,1102;\n");
249  strcat(kfold->descript ,"\n");
250  strcat(kfold->descript ," //sensor ids to modes\n");
251  strcat(kfold->descript ," low_bandwidth_single_pol = 2,102,1002,1102;\n");
252  strcat(kfold->descript ," single_pol = 2,102,1002,1102;\n");
253  strcat(kfold->descript ," dual_pol = 2,102,1002,1102;\n");
254  strcat(kfold->descript ," quad_pol = 2,102,1002,1102;\n");
255  strcat(kfold->descript ,"\n");
256  strcat(kfold->descript ," //LRAD\n");
257  strcat(kfold->descript ," //Note all targets are \"ascending right\"-- i.e. mode=2\n");
258  strcat(kfold->descript ," left = 1002,1102;\n");
259  strcat(kfold->descript ," right = 2,102;\n");
260  strcat(kfold->descript ," ascending = 2,1002;\n");
261  strcat(kfold->descript ," descending = 102,1102;\n");
262  strcat(kfold->descript ,"\n");
263  strcat(kfold->descript ," //data rates\n");
264  strcat(kfold->descript ," low_bandwidth_single_pol datarate = 0.896;\n");
265  strcat(kfold->descript ," single_pol datarate = 4.214;\n");
266  strcat(kfold->descript ," dual_pol datarate = 8.428;\n");
267  strcat(kfold->descript ," quad_pol datarate = 16.856;\n");
268  strcat(kfold->descript ,"\n");
269  strcat(kfold->descript ," //mode domination relationships\n");
270  strcat(kfold->descript ," quad_pol dominates low_bandwidth_single_pol;\n");
271  strcat(kfold->descript ," quad_pol dominates single_pol;\n");
272  strcat(kfold->descript ," quad_pol dominates dual_pol;\n");
273  strcat(kfold->descript ," dual_pol dominates low_bandwidth_single_pol;\n");
274  strcat(kfold->descript ," dual_pol dominates single_pol;\n");
275  strcat(kfold->descript ," single_pol dominates low_bandwidth_single_pol;\n");
276  strcat(kfold->descript ,"\n");
277  strcat(kfold->descript ," //sensor styles\n");
278  strcat(kfold->descript ," 2 0xff00ffff 0xff000000;\n");
279  strcat(kfold->descript ," 102 0x7f00ffff 0xff00ffff;\n");
280  strcat(kfold->descript ," 1002 0xffffff00 0xffffff00;\n");
281  strcat(kfold->descript ," 1102 0x7fffff00 0xffffff00;\n");
282  strcat(kfold->descript ,"\n");
283  strcat(kfold->descript ," //discipline styles\n");
284  strcat(kfold->descript ," deformation 0xff006090 0xff006090 0xff0000ff 0xff1010ff;\n");
285  strcat(kfold->descript ," vegetation 0xff00ff00 0xff00ff00 0xff0000ff 0xff0020ff;\n");
286  strcat(kfold->descript ," ice 0xffff0000 0xffff0000 0xff0000ff 0xff2000ff;\n");
287  strcat(kfold->descript ,"}");
288 
289  if (edata)
290  for (i=0; i<melem; i++) {
291  if (edata[i] < cmin)
292  cmin=edata[i];
293  if (edata[i] > cmax)
294  cmax=edata[i];
295  }
296 
297 /* write each element as a polygon placemark */
298 
299  _printf0_("Writing " << melem << " tria elements as KML polygons.\n");
300 
301  for (i=0; i<melem; i++) {
302  kplace=new KML_Placemark();
303  sprintf(kplace->name ,"Element %d",(i+1));
304  kplace->visibility=1;
305  if (edata) {
306 // sprintf(kplace->descript ,"Element data: %g",edata[i]);
307  sprintf(kplace->descript ,"campaign{\n deformation 1 %g quad_pol ascending right asap;\n}",edata[i]);
308  imap = (int)floor((edata[i]-cmin)/(cmax-cmin)*mcmap+0.5)+1;
309  if ((imap >= 1) && (imap <= mcmap))
310  sprintf(kplace->styleurl ,"#MatlabColor%d",imap);
311  else if (edata[i] == cmax)
312  sprintf(kplace->styleurl ,"#MatlabColor%d",mcmap);
313  else
314  sprintf(kplace->styleurl ,"#BlackLineEmptyPoly");
315  }
316  else {
317  sprintf(kplace->descript ,"");
318  sprintf(kplace->styleurl ,"#BlackLineRandomPoly");
319  }
320 // kplace->DeepEcho();
321 
322  kpoly=new KML_Polygon();
323  kpoly->extrude =1;
324  sprintf(kpoly->altmode ,"clampToGround");
325 // kpoly->DeepEcho();
326 
327  kring=new KML_LinearRing();
328  kring->ncoord =nelem+1;
329  kring->coords =xNew<double>((nelem+1)*3);
330 
331 /* write the nodal coordinates as a linear ring */
332 
333  for (j=0; j<nelem; j++) {
334  kring->coords[3*j+0]=lng[elem[ipt]-1];
335  kring->coords[3*j+1]=lat[elem[ipt]-1];
336  kring->coords[3*j+2]=alt;
337  ipt++;
338  }
339  kring->coords[3*nelem+0]=kring->coords[3*0+0];
340  kring->coords[3*nelem+1]=kring->coords[3*0+1];
341  kring->coords[3*nelem+2]=kring->coords[3*0+2];
342 // kring->DeepEcho();
343 
344 /* assemble the linear ring into polygon into placemark into folder */
345 
346  (kpoly ->outer )->AddObject((Object*)kring);
347  (kplace->geometry)->AddObject((Object*)kpoly);
348  (kfold ->feature )->AddObject((Object*)kplace);
349 
350 // if (!(int)fmod((double)(i+1),1000))
351 // _printf0_(" " << (i+1) << " tria elements written.\n");
352  }
353  _printf0_(" " << melem << " tria elements written.\n");
354 
355  return(kfold);
356 }
KML_Document
Definition: KML_Document.h:15
KMLMeshElem
KML_Folder * KMLMeshElem(int *elem, int melem, int nelem, int *nodecon, int mncon, int nncon, double *lat, double *lng, double *edata, double *cmap, int mcmap, int ncmap)
Definition: KMLMeshWritex.cpp:213
KML_Feature::name
char name[KML_FEATURE_NAME_LENGTH+1]
Definition: KML_Feature.h:25
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
KML_Document::Write
void Write(FILE *fid, const char *indent)
Definition: KML_Document.cpp:62
KML_LinearRing::coords
double * coords
Definition: KML_LinearRing.h:24
_printf_
#define _printf_(StreamArgs)
Definition: Print.h:22
KML_LineStyle::width
float width
Definition: KML_LineStyle.h:18
KML_Container::feature
DataSet * feature
Definition: KML_Container.h:19
KML_Placemark::geometry
DataSet * geometry
Definition: KML_Placemark.h:20
KML_Polygon::outer
DataSet * outer
Definition: KML_Polygon.h:25
KML_Polygon::altmode
char altmode[KML_POLYGON_ALTMODE_LENGTH+1]
Definition: KML_Polygon.h:24
KML_ColorStyle::colormode
char colormode[KML_COLORSTYLE_COLORMODE_LENGTH+1]
Definition: KML_ColorStyle.h:22
KML_Feature::style
DataSet * style
Definition: KML_Feature.h:31
KML_Feature::open
bool open
Definition: KML_Feature.h:27
KML_Polygon::extrude
bool extrude
Definition: KML_Polygon.h:22
KML_Folder
Definition: KML_Folder.h:15
KML_Style::line
KML_LineStyle * line
Definition: KML_Style.h:22
Object
Definition: Object.h:13
KML_Feature::styleurl
char styleurl[KML_FEATURE_STYLEURL_LENGTH+1]
Definition: KML_Feature.h:30
KML_Polygon
Definition: KML_Polygon.h:18
KML_Placemark
Definition: KML_Placemark.h:16
KML_Style
Definition: KML_Style.h:16
KML_LinearRing
Definition: KML_LinearRing.h:16
KML_LinearRing::ncoord
int ncoord
Definition: KML_LinearRing.h:23
KML_Object::AddAttrib
virtual void AddAttrib(const char *name, const char *value)
Definition: KML_Object.cpp:277
KML_Feature::descript
char descript[KML_FEATURE_DESCRIPT_LENGTH+1]
Definition: KML_Feature.h:29
KML_Feature::visibility
bool visibility
Definition: KML_Feature.h:26
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
KML_LineStyle
Definition: KML_LineStyle.h:14
KML_PolyStyle
Definition: KML_PolyStyle.h:14
KML_Style::poly
KML_PolyStyle * poly
Definition: KML_Style.h:23
KML_ColorStyle::color
char color[KML_COLORSTYLE_COLOR_LENGTH+1]
Definition: KML_ColorStyle.h:21