Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/post/src/sico2elmer/sico2elmerc.c
3204 views
1
#include "sico2elmer.h"
2
3
#include "../../config.h"
4
5
/*
6
jv: added fortran function name and char ptr macros to (hopefully) enhance portability
7
*/
8
9
/******************************************************
10
Output of SICOPOLIS grid in ELMER POST format
11
*******************************************************/
12
void STDCALLBULL FC_FUNC(postgrid,POSTGRID) (float *xi, /* unscaled x coordinate index i: 0,imax */
13
float *eta, /* unscaled y coordinate index j from 0,jmax */
14
float *z_c, /* unscaled z coordinate index i: 0,imax, j: 0,jmax, kc: 0,kcmax */
15
float *z_t, /* unscaled y coordinate index i: 0,imax, j: 0,jmax, kt: 0,kcmax */
16
float *deltaX, /* horizontal grod spacing */
17
int *imax_in, /* grid steps in xi-direction */
18
int *jmax_in, /* grid steps in eta-direction */
19
int *kcmax_in, /* grid steps in z-direction in cold ice layer */
20
int *ktmax_in, /* grid steps in z-direction in temperate ice layer */
21
FC_CHAR_PTR(runname,i1), /*name of run*/
22
FC_CHAR_PTR(ergnum,i2), /*number of file*/
23
int *maske, /*mask of vertex type */
24
int *flag){
25
register int i, j, k, n, element_nr, boundary_nr,kn;
26
int number_of_layers[2], number_of_elements, elements_in_one_layer, number_of_iced_nodes, number_of_nodes[2], nodes_of_element[8], *nodes_of_side_element, number_of_iced_collums, nodes_in_one_layer, number_of_ice_boundaries, *iced, *boundary, *gridmap, auxiliary;
27
int imax, jmax, kcmax, ktmax;
28
float *staggered_grid[2];
29
float actual_scaled_coord[3];
30
char groupid[4], filename[80], yes_no, *suffix=".ep";
31
FILE *ptFile;
32
int get_grid_map();
33
34
/* constants */
35
imax= *imax_in;
36
jmax= *jmax_in;
37
kcmax= *kcmax_in;
38
ktmax= *ktmax_in;
39
nodes_in_one_layer = (imax+2)*(jmax+2);
40
elements_in_one_layer = (imax+1)*(jmax+1);
41
number_of_layers[0] = kcmax+1;
42
number_of_layers[1] = (*flag)*(ktmax);
43
number_of_nodes[0] = nodes_in_one_layer*number_of_layers[0];
44
number_of_nodes[1] = nodes_in_one_layer*number_of_layers[1];
45
/* print out little summary */
46
printf("---------------------------------------------------------------\n");
47
printf("| Output of SICOPOLIS Grid vor ELMER POST\n");
48
printf("---------------------------------------------------------------\n");
49
printf("| imax/jmax/kcmax/ktmax=%d/%d/%d/%d\n",imax, jmax, kcmax, ktmax);
50
printf("---------------------------------------------------------------\n");
51
printf("| nodes in original grid:\n");
52
printf("| cold layer: %d=%d * %d\n", (imax+1)*(jmax+1)*(kcmax+1), (imax+1)*(jmax+1), (kcmax+1));
53
printf("| temperate layer: %d=%d * %d\n", (imax+1)*(jmax+1)*(ktmax+1), (imax+1)*(jmax+1), (ktmax+1));
54
printf("| -------------\n");
55
printf("| %d=%d * %d\n", (imax+1)*(jmax+1)*(ktmax+2+kcmax), (imax+1)*(jmax+1), ktmax+2+kcmax);
56
printf("---------------------------------------------------------------\n");
57
if (*flag)
58
printf("| Output of temperate layer enabled\n");
59
else printf("| Output of temperate layer disabled\n");
60
printf("---------------------------------------------------------------\n");
61
printf("| nodes in full staggered grid:\n");
62
printf("| cold layer: %d=%d*%d\n", number_of_nodes[0], nodes_in_one_layer, number_of_layers[0]);
63
printf("| temperate layer: %d=%d*%d\n", number_of_nodes[1], nodes_in_one_layer, number_of_layers[1]);
64
printf("| -------------\n");
65
printf("| %d\n", number_of_nodes[1] + number_of_nodes[0]);
66
printf("---------------------------------------------------------------\n");
67
/* allocate memory */
68
staggered_grid[0] = (float *) malloc((size_t) (number_of_nodes[0]*3*sizeof(float)));
69
if (staggered_grid[0] == NULL){
70
printf("ERROR in allocating memory for staggered grid of cold ice layer\n");
71
return;
72
}
73
staggered_grid[1] = (float *) malloc((size_t) (number_of_nodes[1]*3*sizeof(float)));
74
if (staggered_grid[1] == NULL){
75
printf("ERROR in allocating memory for staggered grid of temperate ice layer\n");
76
free(staggered_grid[0]);
77
return;
78
}
79
iced = (int *) malloc((size_t) ((size_t) (imax+1)*(jmax+1)*sizeof(int)));
80
if (iced == NULL){
81
printf("ERROR in allocating memory for glaciation information\n");
82
free(staggered_grid[0]);free(staggered_grid[1]);
83
return;
84
}
85
/* get staggered grid(s) */
86
auxiliary = get_staggered_grid(xi,eta,z_c,imax,jmax,kcmax,deltaX,staggered_grid[0]);
87
/* exit(0); */
88
if (auxiliary!=number_of_nodes[0]){
89
printf("WARNING: number of written %d gridpoints for cold layer does not match calculated %d\n",auxiliary, number_of_nodes[0]);
90
printf("ERROR: Interpolation of staggered grid for cold layer failed!\n");
91
free(staggered_grid[0]);free(staggered_grid[1]);
92
return;
93
}else
94
printf("| succeeded in interpolating staggered grid for cold layer\n");
95
if (*flag){
96
auxiliary = get_staggered_grid(xi,eta,z_t,imax,jmax,(ktmax-1),deltaX,staggered_grid[1]);
97
if(auxiliary!=number_of_nodes[1]){
98
printf("WARNING: number of written %d gridpoints for cold layer does not match calculated %d\n",auxiliary, number_of_nodes[1]);
99
printf("ERROR: Interpolation of staggered grid for temperate layer failed!\n");
100
free(staggered_grid[0]);free(staggered_grid[1]);
101
return;
102
}else
103
printf("| succeeded in interpolating staggered grid for temperate layer\n");
104
}else
105
printf("| no staggered grid for temperate layer interpolated\n");
106
printf("---------------------------------------------------------------\n");
107
/* get glaciation info */
108
number_of_iced_collums=get_glaciation_info(imax,jmax,iced,maske);
109
if (number_of_iced_collums<1){
110
printf("| no glaciation\n");
111
boundary = (int *) malloc((size_t) 4*sizeof(int)); /* dummy array size */
112
/* free(staggered_grid[0]);free(staggered_grid[1]);free(iced); */
113
/* return; */
114
}else{
115
printf("| number of iced columns: %d out of %d (%3.2f %%)\n", number_of_iced_collums, (imax+1)*(jmax+1), ((float) number_of_iced_collums)*100.0/((float) (imax+1)*(jmax+1)));
116
boundary = (int *) malloc((size_t) number_of_iced_collums*4*sizeof(int));
117
}
118
if (boundary==NULL){
119
printf("ERROR in allocation of memory for ice-boundary information\n");
120
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);
121
return;
122
}
123
gridmap = (int *) malloc((size_t) nodes_in_one_layer*sizeof(int));
124
if (gridmap==NULL){
125
printf("ERROR in allocation of memory for staggered grid glaciation information\n");
126
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);
127
return;
128
}
129
number_of_iced_nodes = get_grid_map(imax,jmax,iced,gridmap);
130
if (number_of_iced_nodes>1){
131
/* printf("ERROR in calculation of glaciation information for staggered grid\n"); */
132
/* free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(gridmap); */
133
/* return; */
134
printf("| number of iced nodes in one layer: %d out of %d\n",number_of_iced_nodes, nodes_in_one_layer);
135
}
136
137
number_of_ice_boundaries = get_glaciation_boundary_info(imax,jmax,iced,boundary);
138
if (number_of_ice_boundaries<1){
139
printf("| no glaciation\n");
140
/* printf("ERROR in calculation of boundaries\n"); */
141
/* free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap); */
142
/* return; */
143
}else{
144
printf("| number of boundary elements lines: %d (%f km)\n", number_of_ice_boundaries, ((float) number_of_ice_boundaries)*(*deltaX));
145
}
146
/* calculate constants for output mesh*/
147
if (*flag){
148
number_of_nodes[0] = number_of_iced_nodes*(kcmax+1);
149
number_of_nodes[1] = number_of_iced_nodes*(ktmax-1)+nodes_in_one_layer;
150
}else{
151
number_of_nodes[0] = number_of_iced_nodes*kcmax;
152
number_of_nodes[1] = nodes_in_one_layer;
153
}
154
number_of_elements = elements_in_one_layer + (1+(*flag))*number_of_iced_collums + (kcmax+(*flag)*ktmax)*number_of_iced_collums + number_of_ice_boundaries*(kcmax+(*flag)*ktmax);
155
nodes_of_side_element = (int *) malloc((size_t) number_of_ice_boundaries*4*(kcmax+(*flag)*ktmax)*sizeof(int));
156
if (nodes_of_side_element == NULL){
157
printf("ERROR in allocation of side element array\n");
158
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);
159
return;
160
}
161
printf("---------------------------------------------------------------\n");
162
printf("| number of nodes:\n");
163
printf("| in cold layer %d\n",number_of_nodes[0]+(1-(*flag))*nodes_in_one_layer);
164
printf("| in temperate layer %d\n",number_of_nodes[1]+(*flag)*nodes_in_one_layer);
165
printf("| -----------\n");
166
printf("| %d\n",number_of_nodes[0]+number_of_nodes[1]);
167
printf("---------------------------------------------------------------\n");
168
printf("| number of elements:\n");
169
printf("| in cold layer volume %d\n",kcmax*number_of_iced_collums);
170
printf("| in temperate layer volume %d\n",(*flag)*ktmax*number_of_iced_collums);
171
printf("| at base %d\n",elements_in_one_layer);
172
printf("| at CTS %d\n",(*flag)*number_of_iced_collums);
173
printf("| at free surface %d\n",number_of_iced_collums);
174
printf("| on boundary of cold layer %d\n",number_of_ice_boundaries*(kcmax));
175
printf("| on boundary of temperate layer %d\n",(*flag)*number_of_ice_boundaries*(ktmax));
176
printf("| -----------\n");
177
printf("| %d\n",number_of_elements);
178
printf("---------------------------------------------------------------\n");
179
/* write mesh file header*/
180
sprintf(filename,"%5s%2s%s", runname, ergnum, suffix);
181
printf("| Writing mesh-file %s.\n",filename);
182
if((ptFile=fopen(filename, "w"))==NULL){
183
printf("\a Could not open Elmer mesh-file file for writing!\n");
184
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);
185
return;
186
}
187
fprintf(ptFile, "%d %d 1 1\n", number_of_nodes[0]+number_of_nodes[1], number_of_elements);
188
/* write nodes */
189
if (*flag){
190
for(j=0,n=0;j<jmax+2;++j){
191
for (i=0;i<imax+2;++i){
192
fprintf(ptFile, "%6.4e %6.4e %6.4e\n", staggered_grid[1][(j*(imax+2) + i)*3 + 0], staggered_grid[1][(j*(imax+2) + i)*3 + 1], staggered_grid[1][(j*(imax+2) + i)*3 + 2]);++n;
193
}
194
}
195
for (k=1;k<ktmax;++k){
196
for(j=0;j<jmax+2;++j){
197
for (i=0;i<imax+2;++i){
198
if (gridmap[j*(imax+2) + i]!=-1){
199
fprintf(ptFile, "%6.4e %6.4e %6.4e\n", staggered_grid[1][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 0], staggered_grid[1][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 1], staggered_grid[1][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 2]);
200
++n;
201
}
202
}
203
}
204
}
205
for (k=0;k<kcmax+1;++k){
206
for(j=0;j<jmax+2;++j){
207
for (i=0;i<imax+2;++i){
208
if (gridmap[j*(imax+2) + i]!=-1){
209
fprintf(ptFile, "%6.4e %6.4e %6.4e\n", staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 0], staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 1], staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 2]);
210
++n;
211
}
212
}
213
}
214
}
215
}else{
216
for(j=0,n=0;j<jmax+2;++j){
217
for (i=0;i<imax+2;++i){
218
fprintf(ptFile, "%6.4e %6.4e %6.4e\n", staggered_grid[0][(j*(imax+2) + i)*3 + 0], staggered_grid[0][(j*(imax+2) + i)*3 + 1], staggered_grid[0][(j*(imax+2) + i)*3 + 2]);++n;
219
}
220
}
221
for (k=1;k<kcmax+1;++k){
222
for(j=0;j<jmax+2;++j){
223
for (i=0;i<imax+2;++i){
224
if (gridmap[j*(imax+2) + i]!=-1){
225
fprintf(ptFile, "%6.4e %6.4e %6.4e\n", staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 0], staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 1], staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 2]);
226
++n;
227
}
228
}
229
}
230
}
231
}
232
if (n!=number_of_nodes[0]+number_of_nodes[1]){
233
printf("WARNING: Number of written nodes %d does not match calculated %d\n", n, number_of_nodes[0]+number_of_nodes[1]);
234
fclose(ptFile);
235
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);
236
return;
237
}else printf("| %d nodes written\n",n);
238
/* write elements */
239
/******** Order of Elements *****
240
* 7 6 *
241
* +---------+ E=0 *
242
* |\ \ N=1 *
243
* | \ | \ W=2 *
244
* j | \4 \5 S=3 *
245
* ^ | +-----+---+ *
246
* \ | | | *
247
* \| |N | | *
248
* + - + - -S+ | *
249
* 3\ | 2\ | *
250
* \ | E| *
251
* W \| \| *
252
* +---------+ ����>i *
253
* 0 S 1 *
254
********************************/
255
boundary_nr=0;
256
element_nr=0;
257
if (*flag){
258
sprintf(groupid,"temp");
259
for (j=0;j<jmax+1;++j){
260
for (i=0;i<imax+1;++i){
261
if (iced[j*(imax+1)+i]!=-1){
262
nodes_of_element[0] = j*(imax+2)+i;
263
nodes_of_element[1] = j*(imax+2)+i+1;
264
nodes_of_element[2] = (j+1)*(imax+2)+i+1;
265
nodes_of_element[3] = (j+1)*(imax+2)+i;
266
nodes_of_element[4] = nodes_in_one_layer + gridmap[j*(imax+2)+i];
267
nodes_of_element[5] = nodes_in_one_layer + gridmap[j*(imax+2)+i+1];
268
nodes_of_element[6] = nodes_in_one_layer + gridmap[(j+1)*(imax+2)+i+1];
269
nodes_of_element[7] = nodes_in_one_layer + gridmap[(j+1)*(imax+2)+i];
270
fprintf(ptFile,"%s 808 %d %d %d %d %d %d %d %d\n", groupid,
271
nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3],
272
nodes_of_element[4], nodes_of_element[5], nodes_of_element[6], nodes_of_element[7]);
273
++element_nr;
274
if (boundary[iced[(j*(imax+1)+i)]*4+0]){/* east */
275
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[2];
276
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[1];
277
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[5];
278
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[6];
279
++boundary_nr;
280
}
281
if (boundary[iced[(j*(imax+1)+i)]*4+1]){/* north */
282
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
283
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[2];
284
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[6];
285
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
286
++boundary_nr;
287
}
288
if (boundary[iced[(j*(imax+1)+i)]*4+2]){/* west */
289
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
290
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
291
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
292
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
293
++boundary_nr;
294
}
295
if (boundary[iced[(j*(imax+1)+i)]*4+3]){/* south */
296
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[1];
297
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
298
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
299
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[5];
300
++boundary_nr;
301
}
302
}
303
}
304
}
305
for (k=1;k<ktmax;++k){
306
for (j=0;j<jmax+1;++j){
307
for (i=0;i<imax+1;++i){
308
if (iced[j*(imax+1)+i]!=-1){
309
for (n=0; n<2; n++){/* lower level: n=0; upper level n=1; each counterclkws */
310
nodes_of_element[n*4] = nodes_in_one_layer + (k-1+n)*number_of_iced_nodes + gridmap[j*(imax+2)+i];
311
nodes_of_element[n*4+1] = nodes_in_one_layer + (k-1+n)*number_of_iced_nodes + gridmap[j*(imax+2)+i+1];
312
nodes_of_element[n*4+2] = nodes_in_one_layer + (k-1+n)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i+1];
313
nodes_of_element[n*4+3] = nodes_in_one_layer + (k-1+n)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i];
314
}
315
fprintf(ptFile,"%s 808 %d %d %d %d %d %d %d %d\n", groupid,
316
nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3],
317
nodes_of_element[4], nodes_of_element[5], nodes_of_element[6], nodes_of_element[7]);
318
++element_nr;
319
if (boundary[iced[(j*(imax+1)+i)]*4+0]){/* east */
320
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[2];
321
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[1];
322
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[5];
323
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[6];
324
++boundary_nr;
325
}
326
if (boundary[iced[(j*(imax+1)+i)]*4+1]){/* north */
327
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
328
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[2];
329
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[6];
330
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
331
++boundary_nr;
332
}
333
if (boundary[iced[(j*(imax+1)+i)]*4+2]){/* west */
334
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
335
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
336
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
337
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
338
++boundary_nr;
339
}
340
if (boundary[iced[(j*(imax+1)+i)]*4+3]){/* south */
341
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[1];
342
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
343
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
344
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[5];
345
++boundary_nr;
346
}
347
}
348
}
349
}
350
}
351
}
352
sprintf(groupid,"cold");
353
if (*flag) kn=0;
354
else{
355
for (j=0;j<jmax+1;++j){
356
for (i=0;i<imax+1;++i){
357
if (iced[j*(imax+1)+i]!=-1){
358
nodes_of_element[0] = j*(imax+2)+i;
359
nodes_of_element[1] = j*(imax+2)+i+1;
360
nodes_of_element[2] = (j+1)*(imax+2)+i+1;
361
nodes_of_element[3] = (j+1)*(imax+2)+i;
362
nodes_of_element[4] = nodes_in_one_layer + gridmap[j*(imax+2)+i];
363
nodes_of_element[5] = nodes_in_one_layer + gridmap[j*(imax+2)+i+1];
364
nodes_of_element[6] = nodes_in_one_layer + gridmap[(j+1)*(imax+2)+i+1];
365
nodes_of_element[7] = nodes_in_one_layer + gridmap[(j+1)*(imax+2)+i];
366
fprintf(ptFile,"%s 808 %d %d %d %d %d %d %d %d\n", groupid,
367
nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3],
368
nodes_of_element[4], nodes_of_element[5], nodes_of_element[6], nodes_of_element[7]);
369
++element_nr;
370
if (boundary[iced[(j*(imax+1)+i)]*4+0]){/* east */
371
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[2];
372
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[1];
373
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[5];
374
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[6];
375
++boundary_nr;
376
}
377
if (boundary[iced[(j*(imax+1)+i)]*4+1]){/* north */
378
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
379
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[2];
380
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[6];
381
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
382
++boundary_nr;
383
}
384
if (boundary[iced[(j*(imax+1)+i)]*4+2]){/* west */
385
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
386
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
387
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
388
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
389
++boundary_nr;
390
}
391
if (boundary[iced[(j*(imax+1)+i)]*4+3]){/* south */
392
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[1];
393
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
394
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
395
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[5];
396
++boundary_nr;
397
}
398
}
399
}
400
}
401
kn=1;
402
}
403
for (k=kn;k<kcmax;++k){
404
for (j=0;j<jmax+1;++j){
405
for (i=0;i<imax+1;++i){
406
if (iced[j*(imax+1)+i]!=-1){
407
for (n=0; n<2; n++){/* lower level: n=0; upper level n=1; each counterclkws */
408
nodes_of_element[n*4] = number_of_nodes[1] + (k-kn+n)*number_of_iced_nodes + gridmap[j*(imax+2)+i];
409
nodes_of_element[n*4+1] = number_of_nodes[1] + (k-kn+n)*number_of_iced_nodes + gridmap[j*(imax+2)+i+1];
410
nodes_of_element[n*4+2] = number_of_nodes[1] + (k-kn+n)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i+1];
411
nodes_of_element[n*4+3] = number_of_nodes[1] + (k-kn+n)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i];
412
}
413
fprintf(ptFile,"%s 808 %d %d %d %d %d %d %d %d\n", groupid,
414
nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3],
415
nodes_of_element[4], nodes_of_element[5], nodes_of_element[6], nodes_of_element[7]);
416
++element_nr;
417
if (boundary[iced[(j*(imax+1)+i)]*4+0]){/* east */
418
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[2];
419
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[1];
420
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[5];
421
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[6];
422
++boundary_nr;
423
}
424
if (boundary[iced[(j*(imax+1)+i)]*4+1]){/* north */
425
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
426
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[2];
427
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[6];
428
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
429
++boundary_nr;
430
}
431
if (boundary[iced[(j*(imax+1)+i)]*4+2]){/* west */
432
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
433
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
434
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
435
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
436
++boundary_nr;
437
}
438
if (boundary[iced[(j*(imax+1)+i)]*4+3]){/* south */
439
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[1];
440
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
441
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
442
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[5];
443
++boundary_nr;
444
}
445
}
446
}
447
}
448
}
449
sprintf(groupid,"base");
450
for (j=0;j<jmax+1;++j){
451
for (i=0;i<imax+1;++i){
452
nodes_of_element[0]=j*(imax+2)+i;
453
nodes_of_element[1]=j*(imax+2)+i+1;
454
nodes_of_element[2]=(j+1)*(imax+2)+i+1;
455
nodes_of_element[3]=(j+1)*(imax+2)+i;
456
fprintf(ptFile,"%s 404 %d %d %d %d\n", groupid, nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3]);
457
++element_nr;
458
}
459
}
460
if (*flag){
461
sprintf(groupid,"cts");
462
for (j=0;j<jmax+1;++j){
463
for (i=0;i<imax+1;++i){
464
if (iced[j*(imax+1)+i]!=-1){
465
nodes_of_element[0] = number_of_nodes[1] + gridmap[j*(imax+2)+i];
466
nodes_of_element[1] = number_of_nodes[1] + gridmap[j*(imax+2)+i+1];
467
nodes_of_element[2] = number_of_nodes[1] + gridmap[(j+1)*(imax+2)+i+1];
468
nodes_of_element[3] = number_of_nodes[1] + gridmap[(j+1)*(imax+2)+i];
469
fprintf(ptFile,"%s 404 %d %d %d %d\n", groupid, nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3]);
470
++element_nr;
471
}
472
}
473
}
474
}
475
sprintf(groupid,"free");
476
for (j=0;j<jmax+1;++j){
477
for (i=0;i<imax+1;++i){
478
if (iced[j*(imax+1)+i]!=-1){
479
nodes_of_element[0] = number_of_nodes[1] + (kcmax)*number_of_iced_nodes + gridmap[j*(imax+2)+i];
480
nodes_of_element[1] = number_of_nodes[1] + (kcmax)*number_of_iced_nodes + gridmap[j*(imax+2)+i+1];
481
nodes_of_element[2] = number_of_nodes[1] + (kcmax)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i+1];
482
nodes_of_element[3] = number_of_nodes[1] + (kcmax)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i];
483
fprintf(ptFile,"%s 404 %d %d %d %d\n", groupid, nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3]);
484
++element_nr;
485
}
486
}
487
}
488
if (*flag){
489
sprintf(groupid,"side_t");
490
for (n=0;n<number_of_ice_boundaries*ktmax;++n){
491
fprintf(ptFile,"%s 404 %d %d %d %d\n", groupid, nodes_of_side_element[n*4+0], nodes_of_side_element[n*4+1], nodes_of_side_element[n*4+2], nodes_of_side_element[n*4+3]);
492
++element_nr;
493
}
494
sprintf(groupid,"side_c");
495
for (n=number_of_ice_boundaries*ktmax;n<number_of_ice_boundaries*(kcmax+ktmax);++n){
496
fprintf(ptFile,"%s 404 %d %d %d %d\n", groupid, nodes_of_side_element[n*4+0], nodes_of_side_element[n*4+1], nodes_of_side_element[n*4+2], nodes_of_side_element[n*4+3]);
497
++element_nr;
498
}
499
}else{
500
sprintf(groupid,"side_c");
501
for (n=0;n<number_of_ice_boundaries*kcmax;++n){
502
fprintf(ptFile,"%s 404 %d %d %d %d\n", groupid, nodes_of_side_element[n*4+0], nodes_of_side_element[n*4+1], nodes_of_side_element[n*4+2], nodes_of_side_element[n*4+3]);
503
++element_nr;
504
}
505
}
506
if (element_nr!=number_of_elements)
507
printf("WARNING: number of written elements %d does not match calculated %d\n", element_nr, number_of_elements);
508
else printf("| %d elements written\n", element_nr);
509
printf("---------------------------------------------------------------\n");
510
fclose(ptFile);
511
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);
512
return;
513
}
514
/*******************************************************
515
write data for ELMER post
516
********************************************************/
517
void STDCALLBULL FC_FUNC(elmerdata,ELMERDATA) (int *imax_in, /* grid steps in xi-direction */
518
int *jmax_in, /* grid steps in eta-direction */
519
int *kcmax_in, /* grid steps in z-direction in cold ice layer */
520
int *ktmax_in, /* grid steps in z-direction in temperate ice layer */
521
float *z_c, /* z-coordinate in cold layer for given i,j-position in plane and kc in vertical*/
522
float *z_t, /* z-coordinate in temperate layer for given i,j-position in plane and kc in vertical*/
523
float *vx_c, /* velocity component in x for cold region for given i,j-position in plane and kc in vertical */
524
float *vy_c, /* velocity component in y for cold region for given i,j-position in plane and kc in vertical */
525
float *vz_c, /* velocity component in z for cold region for given i,j-position in plane and kc in vertical */
526
float *age_c, /* age in cold region for given i,j-position in plane and kc in vertical */
527
float *temp_c, /* temperature in cold region for given i,j-position in plane and kt in vertical */
528
float *vx_t, /* velocity component in x for temperated region for given i,j-position in plane and kt in vertical */
529
float *vy_t, /* velocity component in y for temperated region for given i,j-position in plane and kt in vertical */
530
float *vz_t, /* velocity component in z for temperated region for given i,j-position in plane and kt in vertical */
531
float *temp_t_m, /* melting temperature in temperate ice region for given i,j-position in plane and kt in vertical */
532
float *age_t, /* age in temperate region for given i,j-position in plane and kc in vertical */
533
float *omega_t, /* H2O mass fraction in temperated region for given i,j-position in plane and kt in vertical */
534
float *Q_bm, /* production rate of melting-water at bottom for given i,j-position in plane */
535
float *Q_tld, /* water drainage rate from the temperated region for given i,j-position in plane */
536
float *am_perp, /* ice volume flux through CTS for given i,j-position in plane */
537
float *qx, /* mass-flux in x-direction for given i,j-position in plane */
538
float *qy, /* mass-flux in y-direction for given i,j-position in plane */
539
int *n_cts, /* polythermal conditions for given i,j-position at base (-1 cold ice; 0 temp. ice base with cold ice above; 1 temp. ice base with temperate ice above; */
540
int *maske, /* glaciation information for given i,j-position at base (glaciated=0, ice-free=1, 2=sea-point, 3=floating ice) */
541
FC_CHAR_PTR(runname,runname_l), /*name of run*/
542
FC_CHAR_PTR(ergnum,ergnum_l), /*number of file*/
543
int *flag){
544
register int i, j, k, n;
545
int imax, jmax, kcmax, ktmax, kcmin, offset, nodes_in_temp, nodes_in_cold, elements_in_layer, number_of_iced_nodes, number_of_written_nodes, *gridmap, ok;
546
int nodes_in_one_layer, number_of_nodes, nodes_in_layer_of_staggered_grid, number_of_iced_collums, *iced, auxiliary, number_of_properties;
547
float *array_for_output, *array_for_interpolation, *age, *temperature, *flux[2], *velocity[3], *height, *drainage, *melt, *ice_land_sea, *type_of_base, *float_cts, *float_maske;
548
char data_filename[80], *suffix=".dat";
549
FILE *ptFile;
550
int get_grid_map();
551
/* constants */
552
imax=*imax_in;
553
jmax=*jmax_in;
554
kcmax=*kcmax_in;
555
ktmax=*ktmax_in;
556
elements_in_layer=(imax+1)*(jmax+1);
557
nodes_in_layer_of_staggered_grid = (imax+2)*(jmax+2);
558
nodes_in_temp = (*flag)*nodes_in_layer_of_staggered_grid*ktmax;
559
nodes_in_cold = nodes_in_layer_of_staggered_grid*(kcmax+1);
560
number_of_nodes = nodes_in_temp + nodes_in_cold;
561
number_of_properties= (NVEC2*2 + NVEC3*3 + NSCAL);
562
/* print out little summary */
563
printf("---------------------------------------------------------------\n");
564
printf("| Output of SICOPOLIS Data for ELMER POST\n");
565
printf("---------------------------------------------------------------\n");
566
printf("| imax/jmax/kcmax/ktmax=%d/%d/%d/%d\n",imax, jmax, kcmax, ktmax);
567
printf("---------------------------------------------------------------\n");
568
printf("| nodes in original grid:\n");
569
printf("| cold layer: %d=%d * %d\n", (imax+1)*(jmax+1)*(kcmax+1), (imax+1)*(jmax+1), (kcmax+1));
570
printf("| temperate layer: %d=%d * %d\n", (imax+1)*(jmax+1)*(ktmax+1), (imax+1)*(jmax+1), (ktmax+1));
571
printf("| -------------\n");
572
printf("| %d=%d * %d\n", (imax+1)*(jmax+1)*(ktmax+2+kcmax), (imax+1)*(jmax+1), ktmax+2+kcmax);
573
printf("---------------------------------------------------------------\n");
574
if (*flag)
575
printf("| Output of temperate layer enabled\n");
576
else printf("| Output of temperate layer disabled\n");
577
printf("---------------------------------------------------------------\n");
578
printf("| nodes in full staggered grid:\n");
579
printf("| cold layer: %d\n", nodes_in_cold);
580
printf("| temperate layer: %d\n", nodes_in_temp);
581
printf("| -------------\n");
582
printf("| %d\n",number_of_nodes);
583
printf("---------------------------------------------------------------\n");
584
if ((float_maske = (float *) malloc((size_t) nodes_in_layer_of_staggered_grid*sizeof(float)))==NULL){
585
printf("ERROR in allocation of memory!\n");
586
return;
587
}
588
if((float_cts = (float *) malloc((size_t) nodes_in_layer_of_staggered_grid*sizeof(float)))==NULL){
589
printf("ERROR in allocation of memory!\n");
590
free(float_maske);
591
return;
592
}
593
if ((array_for_interpolation = (float *) malloc((size_t) number_of_nodes*number_of_properties*sizeof(float)))==NULL){
594
printf("ERROR in allocation of memory for interpolating data on staggered grid!\n");
595
free(float_cts);
596
free(float_maske);
597
return;
598
}
599
if ((iced = (int *) malloc((size_t) nodes_in_layer_of_staggered_grid*sizeof(int)))==NULL){
600
printf("ERROR in allocation of memory!\n");
601
free(float_cts);
602
free(float_maske);
603
free(array_for_interpolation);
604
}
605
gridmap = (int *) malloc((size_t) nodes_in_layer_of_staggered_grid*sizeof(int));
606
if (gridmap==NULL){
607
printf("ERROR in allocation of memory!\n");
608
free(float_cts);
609
free(float_maske);
610
free(array_for_interpolation);
611
free(iced);
612
}
613
number_of_iced_collums=get_glaciation_info(imax,jmax,iced,maske);
614
number_of_iced_nodes = get_grid_map(imax,jmax,iced,gridmap);
615
if (*flag) number_of_written_nodes=nodes_in_layer_of_staggered_grid+number_of_iced_nodes*(ktmax+kcmax);
616
else number_of_written_nodes=nodes_in_layer_of_staggered_grid+number_of_iced_nodes*(kcmax);
617
printf("| number of iced columns: %d out of %d (%3.2f %%)\n", number_of_iced_collums, (imax+1)*(jmax+1), ((float) number_of_iced_collums)*100.0/((float) (imax+1)*(jmax+1)));
618
printf("| number of iced nodes in layer of staggered grid: %d out of %d\n", number_of_iced_nodes, nodes_in_layer_of_staggered_grid);
619
printf("| number of nodes in written grid: %d of %d\n", number_of_written_nodes, number_of_nodes);
620
printf("| number of properties written for each node: %d\n", number_of_properties);
621
printf("| size of output array =%d=%d*%d\n", number_of_written_nodes*number_of_properties, number_of_written_nodes,number_of_properties);
622
printf("---------------------------------------------------------------\n");
623
array_for_output = (float *) malloc((size_t) number_of_written_nodes*number_of_properties*sizeof(float));
624
if (array_for_output==NULL){
625
printf("ERROR in allocation of memory for output of data!\n");
626
free(float_cts);
627
free(float_maske);
628
free(array_for_interpolation);
629
free(iced);
630
free(gridmap);
631
return;
632
}
633
/* assign pointers to array of output */
634
height = (float *) &array_for_interpolation[0];
635
velocity[0] = (float *) &array_for_interpolation[number_of_nodes];
636
velocity[1] = (float *) &array_for_interpolation[2*number_of_nodes];
637
velocity[2] = (float *) &array_for_interpolation[3*number_of_nodes];
638
drainage = (float *) &array_for_interpolation[4*number_of_nodes];
639
melt = (float *) &array_for_interpolation[5*number_of_nodes];
640
ice_land_sea = (float *) &array_for_interpolation[6*number_of_nodes];
641
type_of_base = (float *) &array_for_interpolation[7*number_of_nodes];
642
temperature = (float *) &array_for_interpolation[8*number_of_nodes];
643
age = (float *) &array_for_interpolation[9*number_of_nodes];
644
flux[0] = (float *) &array_for_interpolation[10*number_of_nodes];
645
flux[1] = (float *) &array_for_interpolation[11*number_of_nodes];
646
647
make_float_from_integer_scalar_field(maske, float_maske, nodes_in_layer_of_staggered_grid, 1);
648
make_float_from_integer_scalar_field(n_cts, float_cts, nodes_in_layer_of_staggered_grid, 0);
649
650
/* set not used 3d parts of 2d arrays to default value */
651
for (n=nodes_in_layer_of_staggered_grid; n<number_of_nodes;++n){
652
ice_land_sea[n]=0.0;
653
type_of_base[n]=2.0;
654
drainage[n]=0.0;
655
melt[n] = 0.0;
656
flux[0][n]=0.0;
657
flux[1][n]=0.0;
658
}
659
/* interpolate properties on staggered grid */
660
ok=1;
661
if (*flag){
662
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, ktmax-1, z_t, height);
663
if (auxiliary!=nodes_in_temp){
664
printf("WARNING: number of returned values %d of interpolated height in temperate layer does not match calculated %d\n",auxiliary, nodes_in_temp);
665
ok=0;
666
}
667
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, ktmax-1, vx_t, &velocity[0][0]);
668
if (auxiliary!=nodes_in_temp){
669
printf("WARNING: number of returned values %d of interpolated velocity_x in temperate layer does not match calculated %d\n", auxiliary, nodes_in_temp);
670
ok=0;
671
}
672
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, ktmax-1, vy_t, &velocity[1][0]);
673
if (auxiliary!=nodes_in_temp){
674
printf("WARNING: number of returned values %d of interpolated velocity_y in temperate layer does not match calculated %d\n",auxiliary, nodes_in_temp);
675
ok=0;
676
}
677
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, ktmax-1, vz_t, &velocity[2][0]);
678
if (auxiliary!=nodes_in_temp){
679
printf("WARNING: number of returned values %d of interpolated velocity_z in temperate layer does not match calculated %d\n",auxiliary, nodes_in_temp);
680
ok=0;
681
}
682
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, ktmax-1, temp_t_m, temperature);
683
if (auxiliary!=nodes_in_temp){
684
printf("WARNING: number of returned values %d of interpolated temperature in temperate layer does not match calculated %d\n",auxiliary, nodes_in_temp);
685
ok=0;
686
}
687
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, ktmax-1, age_t, age);
688
if (auxiliary!=nodes_in_temp){
689
printf("WARNING: number of returned values %d of interpolated age of ice in temperate layer does not match calculated %d\n",auxiliary, nodes_in_temp);
690
ok=0;
691
}
692
}
693
if (!(ok)){
694
printf("ERROR in interpolating data on staggered grid in temperate layer!\n");
695
free(array_for_interpolation);
696
free(float_maske);
697
free(float_cts);
698
free(iced);
699
free(gridmap);
700
free(array_for_output);
701
return;
702
}
703
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, 0, Q_tld, drainage);
704
if (auxiliary!=nodes_in_layer_of_staggered_grid){
705
printf("WARNING: number of returned values %d of interpolated drainage at base layer does not match calculated %d\n",auxiliary, nodes_in_layer_of_staggered_grid);
706
ok=0;
707
}
708
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, 0, Q_bm, melt);
709
if (auxiliary!=nodes_in_layer_of_staggered_grid){
710
printf("WARNING: number of returned values %d of interpolated melting rate at base layer does not match calculated %d\n",auxiliary, nodes_in_layer_of_staggered_grid);
711
ok=0;
712
}
713
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, 0, float_maske, ice_land_sea);
714
if (auxiliary!=nodes_in_layer_of_staggered_grid){
715
printf("WARNING: number of returned values %d of interpolated ice-sea-land mask at base does not match calculated %d\n",auxiliary, nodes_in_layer_of_staggered_grid);
716
ok=0;
717
}
718
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, 0, float_cts, type_of_base);
719
if (auxiliary!=nodes_in_layer_of_staggered_grid){
720
printf("WARNING: number of returned values %d of interpolated ype of base does not match calculated %d\n",auxiliary, nodes_in_layer_of_staggered_grid);
721
ok=0;
722
}
723
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, 0, qx, flux[0]);
724
if (auxiliary!=nodes_in_layer_of_staggered_grid){
725
printf("WARNING: number of returned values %d of interpolated flux_x at base does not match calculated %d\n",auxiliary, nodes_in_layer_of_staggered_grid);
726
ok=0;
727
}
728
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, 0, qy, flux[1]);
729
if (auxiliary!=nodes_in_layer_of_staggered_grid){
730
printf("WARNING: number of returned values %d of interpolated flux_y at base does not match calculated %d\n",auxiliary, nodes_in_layer_of_staggered_grid);
731
ok=0;
732
}
733
if (!(ok)){
734
printf("ERROR in interpolating data on staggered grid at base!\n");
735
free(array_for_interpolation);
736
free(float_maske);
737
free(float_cts);
738
free(iced);
739
free(gridmap);
740
free(array_for_output);
741
return;
742
}
743
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, kcmax, z_c, &height[nodes_in_temp]);
744
if (auxiliary!=nodes_in_cold){
745
printf("WARNING: number of returned values %d of interpolated height in cold layer does not match calculated %d\n",auxiliary, nodes_in_cold);
746
ok=0;
747
}
748
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, kcmax, vx_c, &velocity[0][nodes_in_temp]);
749
if (auxiliary!=nodes_in_cold){
750
printf("WARNING: number of returned values %d of interpolated velocity_x in cold layer does not match calculated %d\n",auxiliary, nodes_in_cold);
751
ok=0;
752
}
753
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, kcmax, vy_c, &velocity[1][nodes_in_temp]);
754
if (auxiliary!=nodes_in_cold){
755
printf("WARNING: number of returned values %d of interpolated velocity_y in cold layer does not match calculated %d\n",auxiliary, nodes_in_cold);
756
ok=0;
757
}
758
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, kcmax, vz_c, &velocity[2][nodes_in_temp]);
759
if (auxiliary!=nodes_in_cold){
760
printf("WARNING: number of returned values %d of interpolated velocity_z in cold layer does not match calculated %d\n",auxiliary, nodes_in_cold);
761
ok=0;
762
}
763
764
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, kcmax, temp_c, &temperature[nodes_in_temp]);
765
if (auxiliary!=nodes_in_cold){
766
printf("WARNING: number of returned values %d of interpolated temperature in cold layer does not match calculated %d\n",auxiliary, nodes_in_cold);
767
ok=0;
768
}
769
auxiliary=get_interpolated_property_on_staggered_grid(imax, jmax, kcmax, age_c, &age[nodes_in_temp]);
770
if (auxiliary!=nodes_in_cold){
771
printf("WARNING: number of returned values %d of age of ice interpolated in cold layer does not match calculated %d\n",auxiliary, nodes_in_cold);
772
ok=0;
773
}
774
if (!(ok)){
775
printf("ERROR in interpolating data on staggered grid in cold layer!\n");
776
free(array_for_interpolation);
777
free(float_maske);
778
free(float_cts);
779
free(iced);
780
free(gridmap);
781
free(array_for_output);
782
return;
783
}
784
/* write to output array */
785
for(j=0,n=0;j<jmax+2;++j){
786
for(i=0;i<imax+2;++i){
787
array_for_output[(j*(imax+2)+i)*number_of_properties+0]=height[j*(imax+2)+i];
788
array_for_output[(j*(imax+2)+i)*number_of_properties+1]=velocity[0][j*(imax+2)+i];
789
array_for_output[(j*(imax+2)+i)*number_of_properties+2]=velocity[1][j*(imax+2)+i];
790
array_for_output[(j*(imax+2)+i)*number_of_properties+3]=velocity[2][j*(imax+2)+i];
791
array_for_output[(j*(imax+2)+i)*number_of_properties+4]=drainage[j*(imax+2)+i];
792
array_for_output[(j*(imax+2)+i)*number_of_properties+5]=melt[j*(imax+2)+i];
793
array_for_output[(j*(imax+2)+i)*number_of_properties+6]=ice_land_sea[j*(imax+2)+i];
794
array_for_output[(j*(imax+2)+i)*number_of_properties+7]=type_of_base[j*(imax+2)+i];
795
array_for_output[(j*(imax+2)+i)*number_of_properties+8]=temperature[j*(imax+2)+i];
796
array_for_output[(j*(imax+2)+i)*number_of_properties+9]=age[j*(imax+2)+i];
797
array_for_output[(j*(imax+2)+i)*number_of_properties+10]=flux[0][j*(imax+2)+i];
798
array_for_output[(j*(imax+2)+i)*number_of_properties+11]=flux[1][j*(imax+2)+i];
799
++n;
800
}
801
}
802
if (*flag){
803
for (k=1;k<ktmax;++k){
804
for(j=0;j<jmax+2;++j){
805
for(i=0;i<imax+2;++i){
806
if (gridmap[j*(imax+2) + i]!=-1){
807
array_for_output[n*number_of_properties + 0]=height[k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
808
array_for_output[n*number_of_properties+1]=velocity[0][k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
809
array_for_output[n*number_of_properties+2]=velocity[1][k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
810
array_for_output[n*number_of_properties+3]=velocity[2][k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
811
array_for_output[n*number_of_properties+4]=drainage[k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
812
array_for_output[n*number_of_properties+5]=melt[k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
813
array_for_output[n*number_of_properties+6]=ice_land_sea[k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
814
array_for_output[n*number_of_properties+7]=type_of_base[k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
815
array_for_output[n*number_of_properties+8]=temperature[k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
816
array_for_output[n*number_of_properties+9]=age[k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
817
array_for_output[n*number_of_properties+10]=flux[0][k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
818
array_for_output[n*number_of_properties+11]=flux[1][k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
819
++n;
820
}
821
}
822
}
823
}
824
kcmin=0;
825
}else{
826
kcmin=1;
827
}
828
for (k=kcmin;k<kcmax+1;++k){
829
for(j=0;j<jmax+2;++j){
830
for(i=0;i<imax+2;++i){
831
if (gridmap[j*(imax+2) + i]!=-1){
832
array_for_output[n*number_of_properties + 0]=height[nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
833
array_for_output[n*number_of_properties+1]=velocity[0][nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
834
array_for_output[n*number_of_properties+2]=velocity[1][nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
835
array_for_output[n*number_of_properties+3]=velocity[2][nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
836
array_for_output[n*number_of_properties+4]=drainage[nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
837
array_for_output[n*number_of_properties+5]=melt[nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
838
array_for_output[n*number_of_properties+6]=ice_land_sea[nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
839
array_for_output[n*number_of_properties+7]=type_of_base[nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
840
array_for_output[n*number_of_properties+8]=temperature[nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
841
array_for_output[n*number_of_properties+9]=age[nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
842
array_for_output[n*number_of_properties+10]=flux[0][nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
843
array_for_output[n*number_of_properties+11]=flux[1][nodes_in_temp+k*nodes_in_layer_of_staggered_grid+j*(imax+2)+i];
844
++n;
845
}
846
}
847
}
848
}
849
if (n!=number_of_written_nodes){
850
printf("ERROR: Number of nodes for data %d does not match calculated %d\n", n, number_of_written_nodes);
851
}else{
852
/* write binary data on file */
853
sprintf(data_filename,"%5s%2s%s",runname, ergnum, suffix);
854
printf("| Writing on file %s\n", data_filename);
855
if((ptFile=fopen(data_filename, "w"))==NULL){
856
printf("ERROR: Could not open Elmer timeslice %s file for writing!\n", data_filename);
857
}else{
858
fprintf(ptFile, "0 0 %d %d\n", number_of_written_nodes, number_of_properties);
859
auxiliary = fwrite((void *) array_for_output, (size_t) number_of_properties*sizeof(float), (size_t) number_of_written_nodes, ptFile);
860
if (auxiliary!=number_of_written_nodes){
861
printf("ERROR: Only %d of %d items written on file\n",auxiliary,number_of_nodes);
862
printf("ERROR: Not able to write binary data on time-slice file %s\n", data_filename);
863
}else{
864
printf("| Succeeded in writing file\n");
865
printf("---------------------------------------------------------------\n");
866
}
867
}
868
}
869
fclose(ptFile);
870
free(array_for_interpolation);
871
free(float_maske);
872
free(float_cts);
873
free(iced);
874
free(gridmap);
875
free(array_for_output);
876
return;
877
}
878
/******************************************************
879
Output of SICOPOLIS grid in ELMER Solver format
880
*******************************************************/
881
void STDCALLBULL FC_FUNC(pregrid,PREGRID) (float *xi, /* unscaled x coordinate index i: 0,imax */
882
float *eta, /* unscaled y coordinate index j from 0,jmax */
883
float *z_c, /* unscaled z coordinate index i: 0,imax, j: 0,jmax, kc: 0,kcmax */
884
float *z_t, /* unscaled y coordinate index i: 0,imax, j: 0,jmax, kt: 0,kcmax */
885
int *imax_in, /* grid steps in xi-direction */
886
int *jmax_in, /* grid steps in eta-direction */
887
int *kcmax_in, /* grid steps in z-direction in cold ice layer */
888
int *ktmax_in, /* grid steps in z-direction in temperate ice layer */
889
FC_CHAR_PTR(runname,runname_l), /*name of run*/
890
FC_CHAR_PTR(ergnum,ergnum_l), /*number of file*/
891
int *maske, /*mask of vertex type */
892
float *deltaX, /* stepsize of grid */
893
int *flag)
894
{
895
register int i, j, k, n, element_nr, boundary_nr,kn;
896
int number_of_layers[2], number_of_bulk_elements, number_of_boundary_elements, elements_in_one_layer, number_of_iced_nodes, number_of_nodes[2], nodes_of_element[8], *nodes_of_side_element, *parent_of_side_element, number_of_iced_collums, nodes_in_one_layer, number_of_ice_boundaries, *iced, *boundary, *gridmap, auxiliary, idnr, min_max_i_j[2][2];
897
int imax, jmax, kcmax, ktmax;
898
float *staggered_grid[2], min_max_xyz[2][3];
899
float actual_scaled_coord[3];
900
char groupid[4], filename[80], yes_no, *suffix=".ep";
901
FILE *ptFile;
902
int get_grid_map();
903
904
/* constants */
905
imax= *imax_in;
906
jmax= *jmax_in;
907
kcmax= *kcmax_in;
908
ktmax= *ktmax_in;
909
nodes_in_one_layer = (imax+2)*(jmax+2);
910
elements_in_one_layer = (imax+1)*(jmax+1);
911
number_of_layers[0] = kcmax+1;
912
number_of_layers[1] = (*flag)*(ktmax);
913
number_of_nodes[0] = nodes_in_one_layer*number_of_layers[0];
914
number_of_nodes[1] = nodes_in_one_layer*number_of_layers[1];
915
/* print out little summary */
916
printf("---------------------------------------------------------------\n");
917
printf("| Output of SICOPOLIS Grid for ELMER Solver\n");
918
printf("---------------------------------------------------------------\n");
919
printf("| imax/jmax/kcmax/ktmax=%d/%d/%d/%d\n",imax, jmax, kcmax, ktmax);
920
printf("---------------------------------------------------------------\n");
921
printf("| nodes in original grid:\n");
922
printf("| cold layer: %d=%d * %d\n", (imax+1)*(jmax+1)*(kcmax+1), (imax+1)*(jmax+1), (kcmax+1));
923
printf("| temperate layer: %d=%d * %d\n", (imax+1)*(jmax+1)*(ktmax+1), (imax+1)*(jmax+1), (ktmax+1));
924
printf("| -------------\n");
925
printf("| %d=%d * %d\n", (imax+1)*(jmax+1)*(ktmax+2+kcmax), (imax+1)*(jmax+1), ktmax+2+kcmax);
926
printf("| x = %.1f -> %.1f , y = %.1f -> %.1f, dx=%.1f\n", xi[0], xi[imax], eta[0], eta[jmax], *deltaX);
927
printf("---------------------------------------------------------------\n");
928
if (*flag)
929
printf("| Output of temperate layer enabled\n");
930
else printf("| Output of temperate layer disabled\n");
931
printf("---------------------------------------------------------------\n");
932
printf("| nodes in full staggered grid:\n");
933
printf("| cold layer: %d=%d*%d\n", number_of_nodes[0], nodes_in_one_layer, number_of_layers[0]);
934
printf("| temperate layer: %d=%d*%d\n", number_of_nodes[1], nodes_in_one_layer, number_of_layers[1]);
935
printf("| -------------\n");
936
printf("| %d\n", number_of_nodes[1] + number_of_nodes[0]);
937
printf("---------------------------------------------------------------\n");
938
/* allocate memory */
939
staggered_grid[0] = (float *) malloc((size_t) (number_of_nodes[0]*3*sizeof(float)));
940
if (staggered_grid[0] == NULL){
941
printf("ERROR in allocating memory for staggered grid of cold ice layer\n");
942
return;
943
}
944
staggered_grid[1] = (float *) malloc((size_t) (number_of_nodes[1]*3*sizeof(float)));
945
if (staggered_grid[1] == NULL){
946
printf("ERROR in allocating memory for staggered grid of temperate ice layer\n");
947
free(staggered_grid[0]);
948
return;
949
}
950
iced = (int *) malloc((size_t) ((size_t) (imax+1)*(jmax+1)*sizeof(int)));
951
if (iced == NULL){
952
printf("ERROR in allocating memory for glaciation information\n");
953
free(staggered_grid[0]);free(staggered_grid[1]);
954
return;
955
}
956
/* get staggered grid(s) */
957
auxiliary = get_staggered_grid(xi,eta,z_c,imax,jmax,kcmax,deltaX,staggered_grid[0]);
958
if (auxiliary!=number_of_nodes[0]){
959
printf("WARNING: number of written %d gridpoints for cold layer does not match calculated %d\n",auxiliary, number_of_nodes[0]);
960
printf("ERROR: Interpolation of staggered grid for cold layer failed!\n");
961
free(staggered_grid[0]);free(staggered_grid[1]);
962
return;
963
}else
964
printf("| succeeded in interpolating staggered grid for cold layer\n");
965
if (*flag){
966
auxiliary = get_staggered_grid(xi,eta,z_t,imax,jmax,(ktmax-1),deltaX,staggered_grid[1]);
967
if(auxiliary!=number_of_nodes[1]){
968
printf("WARNING: number of written %d gridpoints for cold layer does not match calculated %d\n",auxiliary, number_of_nodes[1]);
969
printf("ERROR: Interpolation of staggered grid for temperate layer failed!\n");
970
free(staggered_grid[0]);free(staggered_grid[1]);
971
return;
972
}else
973
printf("| succeeded in interpolating staggered grid for temperate layer\n");
974
}else
975
printf("| no staggered grid for temperate layer interpolated\n");
976
printf("---------------------------------------------------------------\n");
977
printf("| staggered grid:\n");
978
printf("| x = %.1f -> %.1f , y = %.1f -> %.1f\n",staggered_grid[0][0], staggered_grid[0][(imax+1)*3], staggered_grid[0][1], staggered_grid[0][(jmax+1)*(imax+2)*3+1]);
979
printf("---------------------------------------------------------------\n");
980
/* get glaciation info */
981
number_of_iced_collums=get_glaciation_info(imax,jmax,iced,maske);
982
if (number_of_iced_collums<1){
983
printf("| no glaciation\n");
984
/* printf("ERROR in calculation of glaciation\n"); */
985
/* free(staggered_grid[0]);free(staggered_grid[1]);free(iced); */
986
/* return; */
987
}else{
988
printf("| number of iced columns: %d out of %d (%3.2f %%)\n", number_of_iced_collums, (imax+1)*(jmax+1), ((float) number_of_iced_collums)*100.0/((float) (imax+1)*(jmax+1)));
989
}
990
gridmap = (int *) malloc((size_t) nodes_in_one_layer*sizeof(int));
991
if (gridmap==NULL){
992
printf("ERROR in allocation of memory for staggered grid glaciation information\n");
993
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);
994
return;
995
}
996
number_of_iced_nodes = get_grid_map(imax,jmax,iced,gridmap);
997
/* if (number_of_iced_nodes<1){ */
998
/* printf("ERROR in calculation of glaciation information for staggered grid\n"); */
999
/* free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(gridmap); */
1000
/* return; */
1001
/* } */
1002
printf("| number of iced nodes in one layer: %d out of %d\n",number_of_iced_nodes, nodes_in_one_layer);
1003
boundary = (int *) malloc((size_t) number_of_iced_collums*4*sizeof(int));
1004
if (boundary==NULL){
1005
printf("ERROR in allocation of memory for ice-boundary information\n");
1006
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(gridmap);
1007
return;
1008
}
1009
number_of_ice_boundaries = get_glaciation_boundary_info(imax,jmax,iced,boundary);
1010
/* if (number_of_ice_boundaries<1){ */
1011
/* printf("ERROR in calculation of boundaries\n"); */
1012
/* free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap); */
1013
/* return; */
1014
/* } */
1015
printf("| number of boundary elements lines: %d (%f km)\n", number_of_ice_boundaries, ((float) number_of_ice_boundaries)*(*deltaX));
1016
/* calculate constants for output mesh*/
1017
if (*flag){
1018
number_of_nodes[0] = number_of_iced_nodes*(kcmax+1);
1019
number_of_nodes[1] = number_of_iced_nodes*(ktmax);
1020
}else{
1021
number_of_nodes[0] = number_of_iced_nodes*(kcmax+1);
1022
number_of_nodes[1] = 0;
1023
}
1024
number_of_bulk_elements = (kcmax+(*flag)*ktmax)*number_of_iced_collums;
1025
number_of_boundary_elements = number_of_ice_boundaries*(kcmax+(*flag)*ktmax) + (2+(*flag))*number_of_iced_collums;
1026
nodes_of_side_element = (int *) malloc((size_t) number_of_ice_boundaries*4*(kcmax+(*flag)*ktmax)*sizeof(int));
1027
if (nodes_of_side_element == NULL){
1028
printf("ERROR in allocation of side element array\n");
1029
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);
1030
return;
1031
}
1032
parent_of_side_element = (int *) malloc((size_t) number_of_ice_boundaries*(kcmax+(*flag)*ktmax)*sizeof(int));
1033
if (parent_of_side_element == NULL){
1034
printf("ERROR in allocation of side element array\n");
1035
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);
1036
return;
1037
}
1038
printf("---------------------------------------------------------------\n");
1039
printf("| number of nodes:\n");
1040
printf("| in cold layer %d\n",number_of_nodes[0]);
1041
printf("| in temperate layer %d\n",number_of_nodes[1]);
1042
printf("| -----------\n");
1043
printf("| %d\n",number_of_nodes[0]+number_of_nodes[1]);
1044
printf("---------------------------------------------------------------\n");
1045
printf("| number of elements:\n");
1046
printf("| in cold layer volume %d\n",kcmax*number_of_iced_collums);
1047
printf("| in temperate layer volume %d\n",(*flag)*ktmax*number_of_iced_collums);
1048
printf("| -----------\n");
1049
printf("| %d\n",number_of_bulk_elements);
1050
printf("| -----------\n");
1051
printf("| \n");
1052
printf("| at base %d\n",number_of_iced_collums);
1053
printf("| at cts %d\n",number_of_iced_collums);
1054
printf("| at free surface %d\n",number_of_iced_collums);
1055
printf("| on boundary of cold layer %d\n",number_of_ice_boundaries*(kcmax));
1056
printf("| on boundary of temperate layer %d\n",(*flag)*number_of_ice_boundaries*(ktmax));
1057
printf("| -----------\n");
1058
printf("| %d\n",number_of_boundary_elements);
1059
printf("---------------------------------------------------------------\n");
1060
/* writing header file */
1061
sprintf(filename,"mesh.header");
1062
printf("| Writing mesh header file %s.\n",filename);
1063
if((ptFile=fopen(filename, "w"))==NULL){
1064
printf("\a Could not open Elmer mesh-file file for writing!\n");
1065
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);free(parent_of_side_element);
1066
return;
1067
}
1068
fprintf(ptFile,"%d %d %d\n",number_of_nodes[0]+number_of_nodes[1], number_of_bulk_elements,number_of_boundary_elements);
1069
fprintf(ptFile,"2\n");
1070
fprintf(ptFile,"808 %d\n", number_of_bulk_elements);
1071
fprintf(ptFile,"404 %d\n", number_of_boundary_elements);
1072
printf("| succeeded in writing mesh header file %s.\n",filename);
1073
printf("---------------------------------------------------------------\n");
1074
fclose(ptFile);
1075
/* check min/max values of grid */
1076
min_max_i_j[0][0]=imax;
1077
min_max_i_j[1][0]=0;
1078
min_max_i_j[0][1]=jmax;
1079
min_max_i_j[1][1]=0;
1080
for(j=0;j<jmax+1;++j){
1081
for (i=0;i<imax+1;++i){
1082
if (iced[j*(imax+1)+i]!=-1){
1083
if (i < min_max_i_j[0][0]) min_max_i_j[0][0]=i;
1084
if (i > min_max_i_j[1][0]) min_max_i_j[1][0]=i;
1085
if (j < min_max_i_j[0][1]) min_max_i_j[0][1]=j;
1086
if (j > min_max_i_j[1][1]) min_max_i_j[1][1]=j;
1087
}
1088
}
1089
}
1090
printf("| glaciation information:\n");
1091
printf("| original grid:\n");
1092
printf("| i = %d -> %d of %d \n", min_max_i_j[0][0], min_max_i_j[1][0], imax);
1093
printf("| j = %d -> %d of %d \n", min_max_i_j[0][1], min_max_i_j[1][1], jmax);
1094
min_max_i_j[0][0]=imax+1;
1095
min_max_i_j[1][0]=0;
1096
min_max_i_j[0][1]=jmax+1;
1097
min_max_i_j[1][1]=0;
1098
for (i=0;i<(imax+1)*(jmax+1);++i){
1099
if (gridmap[i]!=-1){
1100
for (n=0;n<3;++n)
1101
min_max_xyz[0][n]=staggered_grid[0][i*3 + n];
1102
break;
1103
}
1104
}
1105
for(j=0;j<jmax+2;++j){
1106
for (i=0;i<imax+2;++i){
1107
if (gridmap[j*(imax+2) + i]!=-1){
1108
if (i < min_max_i_j[0][0]) min_max_i_j[0][0]=i;
1109
if (i > min_max_i_j[1][0]) min_max_i_j[1][0]=i;
1110
if (j < min_max_i_j[0][1]) min_max_i_j[0][1]=j;
1111
if (j > min_max_i_j[1][1]) min_max_i_j[1][1]=j;
1112
for (n=0;n<2;++n){
1113
if (min_max_xyz[0][n] > staggered_grid[0][(j*(imax+2) + i)*3 + n]) min_max_xyz[0][n] = staggered_grid[0][(j*(imax+2) + i)*3 + n];
1114
if (min_max_xyz[1][n] < staggered_grid[0][(j*(imax+2) + i)*3 + n]) min_max_xyz[1][n] = staggered_grid[0][(j*(imax+2) + i)*3 + n];
1115
}
1116
if (*flag){
1117
if (min_max_xyz[0][2] > staggered_grid[0][(j*(imax+2) + i)*3 + 2]) min_max_xyz[0][2] = staggered_grid[1][(j*(imax+2) + i)*3 + 2];
1118
}
1119
for (k=0;k<(kcmax+1);++k){
1120
if (min_max_xyz[0][2] > staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 2]) min_max_xyz[0][2] = staggered_grid[0][(j*(imax+2) + i)*3 + 2];
1121
if (min_max_xyz[1][2] < staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 2]) min_max_xyz[1][2] = staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 2];
1122
}
1123
}
1124
}
1125
}
1126
printf("| staggered grid:\n");
1127
printf("| i = %d -> %d of %d \n", min_max_i_j[0][0], min_max_i_j[1][0], imax);
1128
printf("| j = %d -> %d of %d \n", min_max_i_j[0][1], min_max_i_j[1][1], jmax);
1129
printf("| x = %.8f -> %.8f\n",min_max_xyz[0][0], min_max_xyz[1][0]);
1130
printf("| y = %.8f -> %.8f\n",min_max_xyz[0][1], min_max_xyz[1][1]);
1131
printf("| z = %.8f -> %.8f\n",min_max_xyz[0][2], min_max_xyz[1][2]);
1132
printf("---------------------------------------------------------------\n");
1133
1134
/* writing nodes file */
1135
sprintf(filename,"mesh.nodes");
1136
printf("| Writing node-file %s.\n",filename);
1137
if((ptFile=fopen(filename, "w"))==NULL){
1138
printf("\a Could not open Elmer mesh-file file for writing!\n");
1139
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);free(parent_of_side_element);
1140
return;
1141
}
1142
n=0;
1143
if (*flag){
1144
for (k=0;k<ktmax;++k){
1145
for(j=0;j<jmax+2;++j){
1146
for (i=0;i<imax+2;++i){
1147
if (gridmap[j*(imax+2) + i]!=-1){
1148
fprintf(ptFile, "%d -1 %.8f %.8f %.8f\n", n+1, staggered_grid[1][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 0], staggered_grid[1][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 1], staggered_grid[1][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 2]);
1149
++n;
1150
}
1151
}
1152
}
1153
}
1154
}
1155
for (k=0;k<kcmax+1;++k){
1156
for(j=0;j<jmax+2;++j){
1157
for (i=0;i<imax+2;++i){
1158
if (gridmap[j*(imax+2) + i]!=-1){
1159
fprintf(ptFile, "%d -1 %.8f %.8f %.8f\n", n+1, staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 0], staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 1], staggered_grid[0][(k*nodes_in_one_layer + j*(imax+2) + i)*3 + 2]);
1160
++n;
1161
}
1162
}
1163
}
1164
}
1165
if (n!=number_of_nodes[0]+number_of_nodes[1]){
1166
printf("ERROR: number of written nodes %d does not match calculated %d\n",n, number_of_nodes[0]+number_of_nodes[1]);
1167
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);free(parent_of_side_element);
1168
fclose(ptFile);
1169
return;
1170
}
1171
printf("| succeeded in writing node file %s.\n",filename);
1172
printf("---------------------------------------------------------------\n");
1173
/* writing element file */
1174
sprintf(filename,"mesh.elements");
1175
printf("| Writing bulk element file %s.\n",filename);
1176
if((ptFile=fopen(filename, "w"))==NULL){
1177
printf("\a Could not open Elmer mesh-file file for writing!\n");
1178
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);free(parent_of_side_element);
1179
return;
1180
}
1181
n=0;element_nr=0;boundary_nr=0; idnr=1;
1182
if (*flag){
1183
for (k=0;k<ktmax;++k){
1184
for (j=0;j<jmax+1;++j){
1185
for (i=0;i<imax+1;++i){
1186
if (iced[j*(imax+1)+i]!=-1){
1187
for (n=0; n<2; n++){/* lower level: n=0; upper level n=1; each counterclkws */
1188
nodes_of_element[n*4] = (k+n)*number_of_iced_nodes + gridmap[j*(imax+2)+i] + 1;
1189
nodes_of_element[n*4+1] = (k+n)*number_of_iced_nodes + gridmap[j*(imax+2)+i+1] + 1;
1190
nodes_of_element[n*4+2] = (k+n)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i+1] + 1;
1191
nodes_of_element[n*4+3] = (k+n)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i] + 1;
1192
}
1193
fprintf(ptFile,"%d %d 808 %d %d %d %d %d %d %d %d\n", element_nr+1, idnr,
1194
nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3],
1195
nodes_of_element[4], nodes_of_element[5], nodes_of_element[6], nodes_of_element[7]);
1196
if (element_nr != k+number_of_iced_collums+ iced[j*(imax+1)+i]) printf("element_nr=%d does not match %d\n", element_nr, k+number_of_iced_collums+ iced[j*(imax+1)+i]);
1197
++element_nr;
1198
if (boundary[iced[(j*(imax+1)+i)]*4+0]){/* east */
1199
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[2];
1200
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[1];
1201
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[5];
1202
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[6];
1203
parent_of_side_element[boundary_nr]=element_nr;
1204
++boundary_nr;
1205
}
1206
if (boundary[iced[(j*(imax+1)+i)]*4+1]){/* north */
1207
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
1208
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[2];
1209
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[6];
1210
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
1211
parent_of_side_element[boundary_nr]=element_nr;
1212
++boundary_nr;
1213
}
1214
if (boundary[iced[(j*(imax+1)+i)]*4+2]){/* west */
1215
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
1216
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
1217
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
1218
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
1219
parent_of_side_element[boundary_nr]=element_nr;
1220
++boundary_nr;
1221
}
1222
if (boundary[iced[(j*(imax+1)+i)]*4+3]){/* south */
1223
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[1];
1224
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
1225
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
1226
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[5];
1227
parent_of_side_element[boundary_nr]=element_nr;
1228
++boundary_nr;
1229
}
1230
}
1231
}
1232
}
1233
}
1234
idnr=2;
1235
}
1236
for (k=0;k<kcmax;++k){
1237
for (j=0;j<jmax+1;++j){
1238
for (i=0;i<imax+1;++i){
1239
if (iced[j*(imax+1)+i]!=-1){
1240
for (n=0; n<2; n++){/* lower level: n=0; upper level n=1; each counterclkws */
1241
nodes_of_element[n*4] = number_of_nodes[1] + (k+n)*number_of_iced_nodes + gridmap[j*(imax+2)+i] + 1;
1242
nodes_of_element[n*4+1] = number_of_nodes[1] + (k+n)*number_of_iced_nodes + gridmap[j*(imax+2)+i+1] + 1;
1243
nodes_of_element[n*4+2] = number_of_nodes[1] + (k+n)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i+1] + 1;
1244
nodes_of_element[n*4+3] = number_of_nodes[1] + (k+n)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i] + 1;
1245
}
1246
fprintf(ptFile,"%d %d 808 %d %d %d %d %d %d %d %d\n", element_nr+1, idnr,
1247
nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3],
1248
nodes_of_element[4], nodes_of_element[5], nodes_of_element[6], nodes_of_element[7]);
1249
if (element_nr != k*number_of_iced_collums+ iced[j*(imax+1)+i]) printf("element_nr=%d does not match %d\n", element_nr, k*number_of_iced_collums+ iced[j*(imax+1)+i]);
1250
++element_nr;
1251
if (boundary[iced[(j*(imax+1)+i)]*4+0]){/* east */
1252
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[2];
1253
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[1];
1254
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[5];
1255
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[6];
1256
parent_of_side_element[boundary_nr]=element_nr;
1257
++boundary_nr;
1258
}
1259
if (boundary[iced[(j*(imax+1)+i)]*4+1]){/* north */
1260
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
1261
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[2];
1262
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[6];
1263
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
1264
parent_of_side_element[boundary_nr]=element_nr;
1265
++boundary_nr;
1266
}
1267
if (boundary[iced[(j*(imax+1)+i)]*4+2]){/* west */
1268
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[3];
1269
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
1270
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
1271
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[7];
1272
parent_of_side_element[boundary_nr]=element_nr;
1273
++boundary_nr;
1274
}
1275
if (boundary[iced[(j*(imax+1)+i)]*4+3]){/* south */
1276
nodes_of_side_element[boundary_nr*4+0]=nodes_of_element[1];
1277
nodes_of_side_element[boundary_nr*4+1]=nodes_of_element[0];
1278
nodes_of_side_element[boundary_nr*4+2]=nodes_of_element[4];
1279
nodes_of_side_element[boundary_nr*4+3]=nodes_of_element[5];
1280
parent_of_side_element[boundary_nr]=element_nr;
1281
++boundary_nr;
1282
}
1283
}
1284
}
1285
}
1286
}
1287
if (number_of_bulk_elements!=element_nr){
1288
printf("ERROR: Number of written bulk elements %d does not match calculated %d\n", number_of_bulk_elements, element_nr);
1289
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);free(parent_of_side_element);
1290
return;
1291
}
1292
printf("| succeeded in writing bulk element file %s.\n",filename);
1293
printf("---------------------------------------------------------------\n");
1294
fclose(ptFile);
1295
/* writing boundary element file */
1296
sprintf(filename,"mesh.boundary");
1297
printf("| Writing boundary element file %s.\n",filename);
1298
if((ptFile=fopen(filename, "w"))==NULL){
1299
printf("\a Could not open Elmer boundary element file for writing!\n");
1300
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);free(parent_of_side_element);
1301
return;
1302
}
1303
boundary_nr=0;
1304
/* base */
1305
idnr=1;
1306
for (j=0;j<jmax+1;++j){
1307
for (i=0;i<imax+1;++i){
1308
if (iced[j*(imax+1)+i]!=-1){
1309
nodes_of_element[0]= gridmap[j*(imax+2)+i]+1;
1310
nodes_of_element[1]= gridmap[j*(imax+2)+i+1]+1;
1311
nodes_of_element[2]= gridmap[(j+1)*(imax+2)+i+1]+1;
1312
nodes_of_element[3]= gridmap[(j+1)*(imax+2)+i]+1;
1313
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n", boundary_nr+1, idnr, iced[j*(imax+1)+i]+1, nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3]);
1314
++boundary_nr;
1315
}
1316
}
1317
}
1318
/* cts */
1319
if (*flag){
1320
++idnr;
1321
for (j=0;j<jmax+1;++j){
1322
for (i=0;i<imax+1;++i){
1323
if (iced[j*(imax+1)+i]!=-1){
1324
nodes_of_element[0] = number_of_nodes[1] + gridmap[j*(imax+2)+i]+1;
1325
nodes_of_element[1] = number_of_nodes[1] + gridmap[j*(imax+2)+i+1]+1;
1326
nodes_of_element[2] = number_of_nodes[1] + gridmap[(j+1)*(imax+2)+i+1]+1;
1327
nodes_of_element[3] = number_of_nodes[1] + gridmap[(j+1)*(imax+2)+i]+1;
1328
fprintf(ptFile,"%d %d %d %d 404 %d %d %d %d\n", boundary_nr+1, idnr, (ktmax-2)*number_of_iced_collums+iced[j*(imax+1)+i]+1, (ktmax)*number_of_iced_collums+iced[j*(imax+1)+i]+1, nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3]);
1329
++boundary_nr;
1330
}
1331
}
1332
}
1333
}
1334
/* free surface */
1335
++idnr;
1336
for (j=0;j<jmax+1;++j){
1337
for (i=0;i<imax+1;++i){
1338
if (iced[j*(imax+1)+i]!=-1){
1339
nodes_of_element[0] = number_of_nodes[1] + (kcmax)*number_of_iced_nodes + gridmap[j*(imax+2)+i]+1;
1340
nodes_of_element[1] = number_of_nodes[1] + (kcmax)*number_of_iced_nodes + gridmap[j*(imax+2)+i+1]+1;
1341
nodes_of_element[2] = number_of_nodes[1] + (kcmax)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i+1]+1;
1342
nodes_of_element[3] = number_of_nodes[1] + (kcmax)*number_of_iced_nodes + gridmap[(j+1)*(imax+2)+i]+1;
1343
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n", boundary_nr+1, idnr, ((ktmax)*(*flag)+kcmax-1)*number_of_iced_collums+iced[j*(imax+1)+i]+1, nodes_of_element[0], nodes_of_element[1], nodes_of_element[2], nodes_of_element[3]);
1344
++boundary_nr;
1345
}
1346
}
1347
}
1348
/* sides */
1349
if (*flag){
1350
++idnr;
1351
for (n=0;n<number_of_ice_boundaries*ktmax;++n){
1352
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n", boundary_nr+1, parent_of_side_element[n], idnr, nodes_of_side_element[n*4+0], nodes_of_side_element[n*4+1], nodes_of_side_element[n*4+2], nodes_of_side_element[n*4+3]);
1353
++boundary_nr;
1354
}
1355
++idnr;
1356
for (;n<number_of_ice_boundaries*(kcmax+ktmax);++n){
1357
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n", boundary_nr+1, idnr, parent_of_side_element[n], nodes_of_side_element[n*4+0], nodes_of_side_element[n*4+1], nodes_of_side_element[n*4+2], nodes_of_side_element[n*4+3]);
1358
++boundary_nr;
1359
}
1360
}else{
1361
++idnr;
1362
for (n=0;n<number_of_ice_boundaries*kcmax;++n){
1363
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n", boundary_nr+1, idnr, parent_of_side_element[n], nodes_of_side_element[n*4+0], nodes_of_side_element[n*4+1], nodes_of_side_element[n*4+2], nodes_of_side_element[n*4+3]);
1364
++boundary_nr;
1365
}
1366
}
1367
if (boundary_nr!=number_of_boundary_elements){
1368
printf("ERROR: Number of written boundary elements %d does not match calculated %d.\n", boundary_nr, number_of_boundary_elements);
1369
}else{
1370
printf("| succeeded in writing boundary element file %s.\n",filename);
1371
printf("---------------------------------------------------------------\n");
1372
}
1373
fclose(ptFile);
1374
free(staggered_grid[0]);free(staggered_grid[1]);free(iced);free(boundary);free(gridmap);free(nodes_of_side_element);free(parent_of_side_element);
1375
return;
1376
}
1377
1378
void STDCALLBULL FC_FUNC(asciidata,ASCIIDATA) (float *xi, /* unscaled x coordinate index i: 0,imax */
1379
float *eta, /* unscaled y coordinate index j from 0,jmax */
1380
int *imax_in, /* grid steps in xi-direction */
1381
int *jmax_in, /* grid steps in eta-direction */
1382
int *kcmax_in, /* grid steps in z-direction in cold ice layer */
1383
int *ktmax_in, /* grid steps in z-direction in temperate ice layer */
1384
float *z_c, /* z-coordinate in cold layer for given i,j-position in plane and kc in vertical*/
1385
float *z_t, /* z-coordinate in temperate layer for given i,j-position in plane and kc in vertical*/
1386
float *vx_c, /* velocity component in x for cold region for given i,j-position in plane and kc in vertical */
1387
float *vy_c, /* velocity component in y for cold region for given i,j-position in plane and kc in vertical */
1388
float *vz_c, /* velocity component in z for cold region for given i,j-position in plane and kc in vertical */
1389
float *age_c, /* age in cold region for given i,j-position in plane and kc in vertical */
1390
float *temp_c, /* temperature in cold region for given i,j-position in plane and kt in vertical */
1391
float *vx_t, /* velocity component in x for temperated region for given i,j-position in plane and kt in vertical */
1392
float *vy_t, /* velocity component in y for temperated region for given i,j-position in plane and kt in vertical */
1393
float *vz_t, /* velocity component in z for temperated region for given i,j-position in plane and kt in vertical */
1394
float *temp_t_m, /* melting temperature in temperate ice region for given i,j-position in plane and kt in vertical */
1395
float *age_t, /* age in temperate region for given i,j-position in plane and kc in vertical */
1396
float *omega_t, /* H2O mass fraction in temperated region for given i,j-position in plane and kt in vertical */
1397
float *Q_bm, /* production rate of melting-water at bottom for given i,j-position in plane */
1398
float *Q_tld, /* water drainage rate from the temperated region for given i,j-position in plane */
1399
float *am_perp, /* ice volume flux through CTS for given i,j-position in plane */
1400
float *qx, /* mass-flux in x-direction for given i,j-position in plane */
1401
float *qy, /* mass-flux in y-direction for given i,j-position in plane */
1402
int *n_cts, /* polythermal conditions for given i,j-position at base (-1 cold ice; 0 temp. ice base with cold ice above; 1 temp. ice base with temperate ice above; */
1403
int *maske, /* glaciation information for given i,j-position at base (glaciated=0, ice-free=1, 2=sea-point, 3=floating ice) */
1404
FC_CHAR_PTR(runname,p1), /*name of run*/
1405
FC_CHAR_PTR(ergnum,p2), /*number of file*/
1406
int *flag)
1407
{
1408
register int i, j, k, n, current_index;
1409
int imax, jmax, kcmax, ktmax, kcmin, offset, nodes_in_temp, nodes_in_cold, elements_in_layer, number_of_iced_nodes, number_of_written_nodes, *gridmap, ok;
1410
int nodes_in_one_layer, number_of_nodes, nodes_in_layer_of_staggered_grid, number_of_iced_collums, *iced, auxiliary, number_of_properties, outputflags[12], failed=0;
1411
char filename[80], inputstring[40], dummy_string[39], user_name[10],*suffix=".asc";
1412
struct stat buf;
1413
time_t how_late_is_it;
1414
FILE *ptFile;
1415
int cuserid();
1416
/* constants */
1417
imax=*imax_in;
1418
jmax=*jmax_in;
1419
kcmax=*kcmax_in;
1420
ktmax=*ktmax_in;
1421
elements_in_layer=(imax+1)*(jmax+1);
1422
printf("---------------------------------------------------------------\n");
1423
printf("| Output of SICOPOLIS Data in ASCII-format - Hi Olli :-)\n");
1424
printf("---------------------------------------------------------------\n");
1425
printf("| imax/jmax/kcmax/ktmax=%d/%d/%d/%d\n",imax, jmax, kcmax, ktmax);
1426
printf("---------------------------------------------------------------\n");
1427
printf("| nodes in grid:\n");
1428
printf("| cold layer: %d=%d * %d\n", (imax+1)*(jmax+1)*(kcmax+1), (imax+1)*(jmax+1), (kcmax+1));
1429
printf("| temperate layer: %d=%d * %d\n", (imax+1)*(jmax+1)*(ktmax+1), (imax+1)*(jmax+1), (ktmax+1));
1430
printf("| -------------\n");
1431
printf("| %d=%d * %d\n", (imax+1)*(jmax+1)*(ktmax+2+kcmax), (imax+1)*(jmax+1), ktmax+2+kcmax);
1432
printf("---------------------------------------------------------------\n");
1433
printf("| Trying to load preferences from .sico2elmer.rc\n");
1434
/* read preference file */
1435
if (stat(".sico2elmer.rc" , &buf)!=0){
1436
if (errno == ENOENT){
1437
printf("WARNING: The preference-file .sico2elmer.rc does not exist. Writing all output-components by default\n");
1438
failed=1;
1439
}
1440
else if (errno == EACCES)
1441
printf("WARNING: No permission to read file .sico2elmer.rc. Writing all output-components by default\n");
1442
else printf("WARNING: Error occurred during reading preference-file .sico2elmer.rc. Writing all output-components by default\n");
1443
failed=1;
1444
}else{
1445
if((ptFile=fopen(".sico2elmer.rc", "r"))==NULL){
1446
printf("WARNING: Error while opening file .sico2elmer.rc . Writing all output-components\n");
1447
failed=1;
1448
}else{
1449
/* read in comment lines */
1450
for (n=0;n<7;++n){
1451
if (fgets(inputstring, 40, ptFile)==NULL){
1452
printf("WARNING: Error while reading .sico2elmer.rc . Writing all output-components\n");
1453
failed=1;
1454
}
1455
}
1456
/* read: flag for output of temperate layer */
1457
if (fgets(inputstring, 40, ptFile)==NULL){
1458
printf("WARNING: Error while reading .sico2elmer.rc . Writing all output-components\n");
1459
failed=1;
1460
}else{
1461
if (sscanf(inputstring, "%1d%s",&outputflags[0], dummy_string)<0){
1462
printf("WARNING: Error while copying inputstring no 0 from .sico2elmer.rc\n");
1463
outputflags[0]=1;
1464
}
1465
}
1466
/* read: flag for output on not iced vertices*/
1467
if (fgets(inputstring, 40, ptFile)==NULL){
1468
printf("WARNING: Error while reading .sico2elmer.rc . Writing all output-components\n");
1469
failed=1;
1470
}else{
1471
if (sscanf(inputstring, "%1d%s",&outputflags[1], dummy_string)<0){
1472
printf("WARNING: Error while copying inputstring no 0 from .sico2elmer.rc\n");
1473
outputflags[1]=0;
1474
}
1475
}
1476
if (fgets(inputstring, 40, ptFile)==NULL){
1477
printf("WARNING: Error while reading .sico2elmer.rc. Writing all output-components\n");
1478
failed=1;
1479
}
1480
/* read: 3d variable flags */
1481
for (n=0;n<4;++n){
1482
if (fgets(inputstring, 40, ptFile)==NULL){
1483
printf("WARNING: Error while reading .sico2elmer.rc. Writing all output-components\n");
1484
failed=1;
1485
}else{
1486
if (sscanf(inputstring, "%1d%s",&outputflags[2+n], dummy_string)<0){
1487
printf("WARNING: Error while copying inputstring no %d from .sico2elmer.rc\n", n+1);
1488
outputflags[2+n]=1;
1489
}
1490
}
1491
}
1492
if (fgets(inputstring, 40, ptFile)==NULL){
1493
printf("WARNING: Error while reading .sico2elmer.rc. Writing all output-components\n");
1494
failed=1;
1495
}
1496
/* read: 2d variable flags */
1497
for (n=0;n<6;++n){
1498
if (fgets(inputstring, 40, ptFile)==NULL){
1499
printf("WARNING: Error while reading .sico2elmer.rc. Writing all output-components\n");
1500
failed=1;
1501
}else{
1502
if (sscanf(inputstring, "%1d%s",&outputflags[6+n], dummy_string)<0){
1503
printf("WARNING: Error while copying inputstring no %d from .sico2elmer.rc\n", n+1);
1504
outputflags[6+n]=1;
1505
}
1506
}
1507
}
1508
}
1509
fclose(ptFile);
1510
}
1511
if (failed){
1512
for (n=0;n<12;++n) outputflags[n]=1;
1513
printf("| Error occurred during reading of file\n");
1514
printf("| Taking default values\n");
1515
}else printf("| Loading of preferences succeessful\n");
1516
printf("| Following values for output are set (1=yes,0=no):\n");
1517
printf("| \n");
1518
if (outputflags[0] && ((*flag)==0)){
1519
outputflags[0] = 0;
1520
printf("| Output temperate layer %d (reset, since no temperate layer has been loaded)\n", outputflags[0]);
1521
}else
1522
printf("| Output temperate layer %d\n", outputflags[0]);
1523
printf("| Output at not iced vertices %d\n", outputflags[1]);
1524
printf("| \n");
1525
printf("| Output 3d coordinates %d\n", outputflags[2]);
1526
printf("| Output velocities %d\n", outputflags[3]);
1527
printf("| Output temperature %d\n", outputflags[4]);
1528
printf("| Output age %d\n", outputflags[5]);
1529
printf("| \n");
1530
printf("| Output bedrock and ice depht %d\n", outputflags[6]);
1531
printf("| Output water drainage %d\n", outputflags[7]);
1532
printf("| Output mask for glaciation %d\n", outputflags[8]);
1533
printf("| Output type of base %d\n", outputflags[9]);
1534
printf("| Output flux %d\n", outputflags[10]);
1535
printf("| Output 2d coordinates %d\n", outputflags[11]);
1536
printf("---------------------------------------------------------------\n");
1537
/* open file for writing of 3d variables */
1538
sprintf(filename,"%5s%2s_3d%s", runname, ergnum, suffix);
1539
if((ptFile=fopen(filename, "w"))==NULL){
1540
printf("\a Could not open file for writing of 3d ASCII-data\n");
1541
return;
1542
}else{
1543
printf("| writing on 3d output file %s\n", filename);
1544
fprintf(ptFile,"# *********************************************************\n");
1545
fprintf(ptFile,"# ASCCI output file of run %s, file no. %s\n", runname, ergnum);
1546
if (time(&how_late_is_it)==-1){
1547
printf("WARNING: Could not evaluate current time\n");
1548
fprintf(ptFile,"# no specific date was able to be inquiered\n");
1549
}else{
1550
fprintf(ptFile,"# written on %s", ctime(&how_late_is_it));
1551
}
1552
/* replace with getpwuid(geteuid()) */
1553
#if defined(__APPLE__) || defined(MINGW32) || defined(WIN32) || defined(BSD)
1554
if ( 1 )
1555
#else
1556
if (cuserid(user_name)==NULL)
1557
#endif
1558
fprintf(ptFile,"# no user id was able to be inquiered\n");
1559
else
1560
fprintf(ptFile,"# by %10s\n", user_name);
1561
fprintf(ptFile,"# *********************************************************\n");
1562
fprintf(ptFile,"# 3d variables:\n");
1563
fprintf(ptFile,"# ");
1564
if (outputflags[1])
1565
fprintf(ptFile,"x y z ");
1566
if (outputflags[3])
1567
fprintf(ptFile,"v_x v_y v_z ");
1568
if (outputflags[4])
1569
fprintf(ptFile,"T ");
1570
if (outputflags[5])
1571
fprintf(ptFile,"Age ");
1572
if ((outputflags[2] + outputflags[3] + outputflags[4] + outputflags[5]) !=0){
1573
fprintf(ptFile,"\n# --------- temperate layer --------------------------------------------------------------------\n");
1574
if (outputflags[0]){
1575
for (k=0;k<ktmax;++k){
1576
for (j=0;j<jmax+1;++j){
1577
for (i=0;i<imax+1;++i){
1578
if( (outputflags[1]) && !((maske[j*(imax+1) + i]==0) || (maske[j*(imax+1) + i]==3)) ) continue;
1579
current_index = k*elements_in_layer + j*(imax+1) + i;
1580
if (outputflags[2])
1581
fprintf(ptFile,"% .4e % .4e % .4e ",xi[i], eta[j], z_t[current_index]);
1582
if (outputflags[3])
1583
fprintf(ptFile,"% .4e % .4e % .4e ",vx_t[current_index], vy_t[current_index], vz_t[current_index]);
1584
if (outputflags[4])
1585
fprintf(ptFile,"% .4e ",temp_t_m[current_index]);
1586
if (outputflags[5])
1587
fprintf(ptFile,"% .4e ",age_t[current_index]);
1588
fprintf(ptFile,"\n");
1589
}
1590
if (BLANK) fprintf(ptFile,"\n\n");
1591
}
1592
}
1593
}
1594
fprintf(ptFile,"# --------- cold layer -----------------------------------------------------------------------\n");
1595
for (k=0;k<kcmax+1;++k){
1596
for (j=0;j<jmax+1;++j){
1597
for (i=0;i<imax+1;++i){
1598
if( (outputflags[1]) && !((maske[j*(imax+1) + i]==0) || (maske[j*(imax+1) + i]==3)) ) continue;
1599
current_index = k*elements_in_layer + j*(imax+1) + i;
1600
if (outputflags[2])
1601
fprintf(ptFile,"%+.4e %+.4e %+.4e ",xi[i], eta[j], z_c[current_index]);
1602
if (outputflags[3])
1603
fprintf(ptFile,"% .4e % .4e % .4e ",vx_c[current_index], vy_c[current_index], vz_c[current_index]);
1604
if (outputflags[4])
1605
fprintf(ptFile,"% .4e ",temp_c[current_index]);
1606
if (outputflags[5])
1607
fprintf(ptFile,"% .4e ",age_c[current_index]);
1608
fprintf(ptFile,"\n");
1609
}
1610
if (BLANK) fprintf(ptFile,"\n\n\n");
1611
else fprintf(ptFile,"\n");
1612
}
1613
}
1614
}
1615
fclose(ptFile);
1616
}
1617
/* open file for writing of 2d variables */
1618
sprintf(filename,"%5s%2s_2d%s", runname, ergnum, suffix);
1619
if((ptFile=fopen(filename, "w"))==NULL){
1620
printf("\a Could not open file for writing of 3d ASCII-data\n");
1621
return;
1622
}else{
1623
printf("| writing on 2d output file %s\n", filename);
1624
fprintf(ptFile,"# *********************************************************\n");
1625
fprintf(ptFile,"# ASCCI output file of run %s, file no. %s\n", runname, ergnum);
1626
if (time(&how_late_is_it)==-1){
1627
printf("WARNING: Could not evaluate current time\n");
1628
fprintf(ptFile,"# no specific date was able to be inquiered\n");
1629
}else{
1630
fprintf(ptFile,"# written on %s", ctime(&how_late_is_it));
1631
}
1632
1633
#if defined(__APPLE__) || defined(MINGW32) || defined(WIN32) || defined(BSD)
1634
if ( 1 )
1635
#else
1636
if (cuserid(user_name)==NULL)
1637
#endif
1638
fprintf(ptFile,"# no user id was able to be inquiered\n");
1639
else
1640
fprintf(ptFile,"# by %10s\n", user_name);
1641
fprintf(ptFile,"# *********************************************************\n");
1642
fprintf(ptFile,"# 2d variables:\n");
1643
fprintf(ptFile,"# ");
1644
if (outputflags[11])
1645
fprintf(ptFile,"x y ");
1646
if (outputflags[6])
1647
fprintf(ptFile,"b s ");
1648
if (outputflags[7])
1649
fprintf(ptFile,"Drainage ");
1650
if (outputflags[8])
1651
fprintf(ptFile,"glaciation ");
1652
if (outputflags[9])
1653
fprintf(ptFile,"type_base ");
1654
if (outputflags[10])
1655
fprintf(ptFile,"flux_x flux_y ");
1656
fprintf(ptFile,"\n# --------------------------------------------------------------------------------------------------------\n");
1657
for (j=0;j<jmax+1;++j){
1658
for (i=0;i<imax+1;++i){
1659
current_index = j*(imax+1) + i;
1660
/* printf("%d ++ %d == %d, %d\n", outputflags[1], !((maske[current_index]==0) || (maske[current_index]==3)), ( (outputflags[1]==0) && !((maske[current_index]==0) || (maske[current_index]==3)) ), maske[current_index]); */
1661
if( (outputflags[1]==0) && !((maske[current_index]==0) || (maske[current_index]==3)) ) continue;
1662
if (outputflags[11])
1663
fprintf(ptFile,"% .4e % .4e", xi[i], eta[j]);
1664
if (outputflags[6]){
1665
/* printf("%d %d\n", i,j); */
1666
if (outputflags[0]){
1667
fprintf(ptFile,"% .4e % .4e", z_t[current_index], z_c[kcmax*elements_in_layer + current_index]);
1668
}
1669
else
1670
fprintf(ptFile,"% .4e % .4e", z_c[current_index], z_c[kcmax*elements_in_layer + current_index]);
1671
}
1672
if (outputflags[7])
1673
fprintf(ptFile,"% .4e ",Q_tld[current_index]);
1674
if (outputflags[8])
1675
fprintf(ptFile,"% 1d ",maske[current_index]);
1676
if (outputflags[9])
1677
fprintf(ptFile,"% 1d ",n_cts[current_index]);
1678
if (outputflags[10])
1679
fprintf(ptFile,"% .4e % .4e",qx[current_index],qy[current_index]);
1680
fprintf(ptFile,"\n");
1681
}
1682
if (BLANK) fprintf(ptFile,"\n\n");
1683
}
1684
fclose(ptFile);
1685
}
1686
printf("---------------------------------------------------------------\n");
1687
}
1688
/*******************************************************
1689
calculate staggered grid
1690
********************************************************/
1691
int get_staggered_grid(float *xi, /* unscaled x coordinate index i: 0,imax */
1692
float *eta, /* unscaled y coordinate index j from 0,jmax */
1693
float *z_in, /* unscaled z coordinate index i: 0,imax, j: 0,jmax, kc: 0,kcmax */
1694
int imax, /* grid steps in xi-direction */
1695
int jmax, /* grid steps in eta-direction */
1696
int kmax, /* grid steps in z-direction in cold ice layer */
1697
float *deltaX, /* stepsize of original grid */
1698
float *staggered_grid){ /* coords of staggered FEM grid */
1699
1700
register int i,j,k,n;
1701
int nodes_in_layer_of_staggered_grid, nodes_in_staggered_grid, auxiliary;
1702
float delta_x, *x,*y,*z;
1703
1704
nodes_in_layer_of_staggered_grid = (imax+2)*(jmax+2);
1705
nodes_in_staggered_grid =nodes_in_layer_of_staggered_grid*(kmax+1);
1706
1707
x=(float *) malloc((size_t) (imax+2)*sizeof(float));
1708
y=(float *) malloc((size_t) (jmax+2)*sizeof(float));
1709
z=(float *) malloc((size_t) nodes_in_staggered_grid*sizeof(float));
1710
1711
delta_x= 0.5*(*deltaX);
1712
1713
for (i=0;i<imax+1;++i)
1714
x[i]=xi[i] - delta_x;
1715
x[imax+1]=xi[imax] + delta_x;
1716
for (j=0;j<jmax+1;++j)
1717
y[j]=eta[j] - delta_x;
1718
y[jmax+1]=eta[jmax] + delta_x;
1719
1720
auxiliary = get_interpolated_property_on_staggered_grid(imax, jmax, kmax, z_in, z);
1721
if (auxiliary != nodes_in_staggered_grid){
1722
printf("WARNING: Returned value of interpolated z-values %d does not match calculated %d\n", auxiliary, nodes_in_staggered_grid);
1723
free(x);free(y);free(z);
1724
return -1;
1725
}
1726
for (k=0,n=0;k<kmax+1;++k){
1727
for(j=0;j<jmax+2;++j){
1728
for (i=0;i<imax+2;++i,++n){
1729
staggered_grid[(k*nodes_in_layer_of_staggered_grid + j*(imax+2) + i)*3]=x[i];
1730
staggered_grid[(k*nodes_in_layer_of_staggered_grid + j*(imax+2) + i)*3+1]=y[j];
1731
staggered_grid[(k*nodes_in_layer_of_staggered_grid + j*(imax+2) + i)*3+2]=z[k*nodes_in_layer_of_staggered_grid + j*(imax+2) + i];
1732
/* printf("%f %f %f\n", staggered_grid[(k*nodes_in_layer_of_staggered_grid + j*(imax+2) + i)*3], staggered_grid[(k*nodes_in_layer_of_staggered_grid + j*(imax+2) + i)*3+1], staggered_grid[(k*nodes_in_layer_of_staggered_grid + j*(imax+2) + i)*3 + 2]); */
1733
}
1734
}
1735
/* printf("\n"); */
1736
}
1737
free(x);free(y);free(z);
1738
return n;
1739
}
1740
1741
/*******************************************************
1742
interpolate property on staggered grid
1743
********************************************************/
1744
int get_interpolated_property_on_staggered_grid(int imax,
1745
int jmax,
1746
int kmax,
1747
float *property_in,
1748
float *property_out){
1749
register int i,j,k,n;
1750
int nodes_in_layer_of_staggered_grid, nodes_in_layer;
1751
1752
nodes_in_layer = (imax+1)*(jmax+1);
1753
nodes_in_layer_of_staggered_grid = (imax+2)*(jmax+2);
1754
1755
/* inside array */
1756
for (k=0,n=0;k<kmax+1;++k){
1757
for (j=1;j<jmax+1;++j){
1758
for (i=1;i<imax+1;++i){
1759
property_out[k*nodes_in_layer_of_staggered_grid + j*(imax+2) + i]=0.25*(property_in[k*nodes_in_layer + j*(imax+1) + i-1] + property_in[k*nodes_in_layer + (j-1)*(imax+1) + i-1] + property_in[k*nodes_in_layer + j*(imax+1) + i] + property_in[k*nodes_in_layer + (j-1)*(imax+1) + i]);
1760
++n;
1761
}
1762
}
1763
}
1764
/* at borders */
1765
for (k=0;k<kmax+1;++k){
1766
for (j=1;j<jmax+1;++j){
1767
property_out[k*nodes_in_layer_of_staggered_grid + j*(imax+2)]=0.5*(property_in[k*nodes_in_layer + j*(imax+1)] + property_in[k*nodes_in_layer + (j-1)*(imax+1)]);
1768
++n;
1769
property_out[k*nodes_in_layer_of_staggered_grid + j*(imax+2) + imax+1]=0.5*(property_in[k*nodes_in_layer + j*(imax+1) + imax] + property_in[k*nodes_in_layer + (j-1)*(imax+1) + imax]);
1770
++n;
1771
}
1772
for (i=1;i<imax+1;++i){
1773
property_out[k*nodes_in_layer_of_staggered_grid + i]= 0.5*(property_in[k*nodes_in_layer + i] + property_in[k*nodes_in_layer + i-1]);
1774
++n;
1775
property_out[k*nodes_in_layer_of_staggered_grid + (jmax+1)*(imax+2) + i]=0.5*(property_in[k*nodes_in_layer + jmax*(imax+1) + i] + property_in[k*nodes_in_layer + jmax*(imax+1) + i-1]);
1776
++n;
1777
}
1778
}
1779
/* at corners */
1780
for (k=0;k<kmax+1;++k){
1781
property_out[k*nodes_in_layer_of_staggered_grid] = property_in[k*nodes_in_layer];
1782
++n;
1783
property_out[k*nodes_in_layer_of_staggered_grid + imax+1] = property_in[k*nodes_in_layer+ imax];
1784
++n;
1785
property_out[k*nodes_in_layer_of_staggered_grid + (jmax+1)*(imax+2)] = property_in[k*nodes_in_layer+jmax*(imax+1)];
1786
++n;
1787
property_out[k*nodes_in_layer_of_staggered_grid + j*(imax+2) + i] = property_in[k*nodes_in_layer+jmax*(imax+1)+imax];
1788
++n;
1789
}
1790
return n;
1791
}
1792
/************************************************
1793
get information on glaciation of ice-sheet(s)
1794
*************************************************/
1795
int get_glaciation_info(int imax,
1796
int jmax,
1797
int *iced,
1798
int *maske){
1799
register int i,j,n;
1800
1801
for (j=0, n=0;j<jmax+1;++j){
1802
for (i=0;i<imax+1;++i){
1803
if ((maske[j*(imax+1) + i]==0) || (maske[j*(imax+1) + i]==3)){
1804
iced[j*(imax+1) + i]=n;
1805
++n;
1806
}else{
1807
iced[j*(imax+1) + i]=-1;
1808
}
1809
}
1810
}
1811
return n;
1812
}
1813
/************************************************
1814
get 2d glaciation map for staggered grid
1815
*************************************************/
1816
int get_grid_map(int imax,
1817
int jmax,
1818
int *iced,
1819
int *gridmap){
1820
register int i,j,n;
1821
int nodes_in_layer_of_staggered_grid, nodes_in_layer, *staggered_iced;
1822
nodes_in_layer = (imax+1)*(jmax+1);
1823
nodes_in_layer_of_staggered_grid = (imax+2)*(jmax+2);
1824
if ((staggered_iced = (int *) malloc((size_t) nodes_in_layer_of_staggered_grid*sizeof(int)))==NULL){
1825
printf("ERROR during allocation of memory for glaciation information of staggered grid\n");
1826
return -1;
1827
}
1828
for (j=0;j<jmax+2;++j){
1829
for (i=0;i<imax+2;++i){
1830
staggered_iced[j*(imax+2) + i]=0;
1831
}
1832
}
1833
for (j=0;j<jmax+1;++j){
1834
for (i=0;i<imax+1;++i){
1835
if (iced[j*(imax+1) + i]!=-1){
1836
staggered_iced[j*(imax+2) + i]=1;
1837
staggered_iced[(j+1)*(imax+2) + i]=1;
1838
staggered_iced[j*(imax+2) + i+1]=1;
1839
staggered_iced[(j+1)*(imax+2) + i+1]=1;
1840
}
1841
}
1842
}
1843
for (j=0, n=0;j<jmax+2;++j){
1844
for (i=0;i<imax+2;++i){
1845
if (staggered_iced[j*(imax+2) + i]){
1846
gridmap[j*(imax+2) + i]=n;
1847
++n;
1848
}else{
1849
gridmap[j*(imax+2) + i]=-1;
1850
}
1851
}
1852
}
1853
free(staggered_iced);
1854
return n;
1855
}
1856
/**************************************************
1857
get 2d information on boundaries of ice-sheet(s)
1858
***************************************************/
1859
int get_glaciation_boundary_info(int imax,
1860
int jmax,
1861
int *iced,
1862
int *boundary){
1863
register int i,j,n,nn;
1864
/* inside array */
1865
for (j=1,n=0,nn=0;j<jmax;++j){
1866
for (i=1;i<imax;++i){
1867
if (iced[j*(imax+1) + i]!=-1){
1868
if (iced[j*(imax+1) + i+1]==-1){ /* east */
1869
boundary[iced[j*(imax+1) + i]*4+0]=1;
1870
++n;
1871
}else boundary[iced[j*(imax+1) + i]*4+0]=0;
1872
if (iced[(j+1)*(imax+1) + i]==-1){ /* north */
1873
boundary[iced[j*(imax+1) + i]*4+1]=1;
1874
++n;
1875
}else boundary[iced[j*(imax+1) + i]*4+1]=0;
1876
if (iced[j*(imax+1) + i-1]==-1){ /* west */
1877
boundary[iced[j*(imax+1) + i]*4+2]=1;
1878
++n;
1879
}else boundary[iced[j*(imax+1) + i]*4+2]=0;
1880
if (iced[(j-1)*(imax+1) + i]==-1){ /* south */
1881
boundary[iced[j*(imax+1) + i]*4+3]=1;
1882
++n;
1883
}else boundary[iced[j*(imax+1) + i]*4+3]=0;
1884
}
1885
}
1886
}
1887
/* at borders */
1888
for (j=1;j<jmax;++j){
1889
/* most western row (i==0)*/
1890
if (iced[j*(imax+1)]!=-1){
1891
boundary[iced[j*(imax+1)]*4+2]=1; /* west is always boundary */
1892
++n;
1893
if (iced[j*(imax+1) +1]==-1){ /* east */
1894
boundary[iced[j*(imax+1)]*4+0]=1;
1895
++n;
1896
}else boundary[iced[j*(imax+1)]*4+0]=0;
1897
if (iced[(j+1)*(imax+1)]==-1){ /* north */
1898
boundary[iced[j*(imax+1)]*4+1]=1;
1899
++n;
1900
}else boundary[iced[j*(imax+1)]*4+1]=0;
1901
if (iced[(j-1)*(imax+1)]==-1){ /* south */
1902
boundary[iced[j*(imax+1)]*4+3]=1;
1903
++n;
1904
}else boundary[iced[j*(imax+1)]*4+3]=0;
1905
}
1906
/* most eastern row (i==imax)*/
1907
if (iced[j*(imax+1)+imax]!=-1){
1908
boundary[iced[j*(imax+1) + imax]*4+0]=1;/* east is always boundary */
1909
++n;
1910
if (iced[(j+1)*(imax+1) + imax]==-1){ /* north */
1911
boundary[iced[j*(imax+1) + imax]*4+1]=1;
1912
++n;
1913
}else boundary[iced[j*(imax+1) + imax]*4+1]=0;
1914
if (iced[j*(imax+1) + imax-1]==-1){ /* west */
1915
boundary[iced[j*(imax+1) + imax]*4+2]=1;
1916
++n;
1917
}else boundary[iced[j*(imax+1) + imax]*4+2]=0;
1918
if (iced[(j-1)*(imax+1) + imax]==-1){ /* south */
1919
boundary[iced[j*(imax+1) + imax]*4+3]=1;
1920
++n;
1921
}else boundary[iced[j*(imax+1) + imax]*4+3]=0;
1922
}
1923
}
1924
for (i=1;i<imax;++i){
1925
/* most northern row (j==jmax)*/
1926
if (iced[jmax*(imax+1) + i]!=-1){
1927
boundary[iced[jmax*(imax+1) + i]*4+1]=1;/* north is always boundary */
1928
++n;
1929
if (iced[jmax*(imax+1) + i+1]==-1){ /* east */
1930
boundary[iced[jmax*(imax+1) + i]*4+0]=1;
1931
++n;
1932
}else boundary[iced[jmax*(imax+1) + i]*4+0]=0;
1933
if (iced[jmax*(imax+1) + i-1]==-1){ /* west */
1934
boundary[iced[jmax*(imax+1) + i]*4+2]=1;
1935
++n;
1936
}else boundary[iced[jmax*(imax+1) + i]*4+2]=0;
1937
if (iced[(jmax-1)*(imax+1) + i]==-1){ /* south */
1938
boundary[iced[jmax*(imax+1) + i]*4+3]=1;
1939
++n;
1940
}else boundary[iced[jmax*(imax+1) + i]*4+3]=0;
1941
}
1942
/* most southern (j==0)*/
1943
if (iced[i]!=-1){
1944
boundary[iced[i]*4+3]=1; /* south is always boundary */
1945
++n;
1946
if (iced[i+1]==-1){ /* east */
1947
boundary[iced[i]*4+0]=1;
1948
++n;
1949
}else boundary[iced[i]*4+0]=0;
1950
if (iced[1*(imax+1) + i]==-1){ /* north */
1951
boundary[iced[i]*4+1]=1;
1952
++n;
1953
}else boundary[iced[i]*4+1]=0;
1954
if (iced[i-1]==-1){ /* west */
1955
boundary[iced[i]*4+2]=1;
1956
++n;
1957
}else boundary[iced[i]*4+2]=0;
1958
}
1959
}
1960
/* at corners */
1961
/* northeast */
1962
if (iced[jmax*(imax+1) + imax]!=-1){
1963
boundary[iced[jmax*(imax+1) + imax]*4+0]=1; /* east is always boundary */
1964
++n;
1965
boundary[iced[jmax*(imax+1) + i]*4+1]=1;/* north is always boundary */
1966
++n;
1967
if (iced[jmax*(imax+1) + imax-1]==-1){ /* west */
1968
boundary[iced[jmax*(imax+1) + imax]*4+2]=1;
1969
++n;
1970
}else boundary[iced[jmax*(imax+1) + imax]*4+2]=0;
1971
if (iced[(jmax-1)*(imax+1) + imax]==-1){ /* south */
1972
boundary[iced[jmax*(imax+1) + imax]*4+3]=1;
1973
++n;
1974
}else boundary[iced[jmax*(imax+1) + imax]*4+3]=0;
1975
}
1976
/* northwest */
1977
if (iced[jmax*(imax+1)]!=-1){
1978
if (iced[jmax*(imax+1)+1]==-1){ /* east */
1979
boundary[iced[jmax*(imax+1)]*4+0]=1;
1980
++n;
1981
}else boundary[iced[jmax*(imax+1)]*4+0]=0;
1982
boundary[iced[jmax*(imax+1)]*4+1]=1;/* north is always boundary */
1983
++n;
1984
boundary[iced[jmax*(imax+1)]*4+2]=1;/* west is always boundary */
1985
++n;
1986
if (iced[(jmax-1)*(imax+1)]==-1){ /* south */
1987
boundary[iced[jmax*(imax+1)]*4+3]=1;
1988
++n;
1989
}else boundary[iced[jmax*(imax+1)]*4+3]=0;
1990
}
1991
/* southwest */
1992
if (iced[0]!=-1){
1993
if (iced[1]==-1){ /* east */
1994
boundary[iced[0]*4+0]=1;
1995
++n;
1996
}else boundary[iced[0]*4+0]=0;
1997
if (iced[1*(imax+1)]==-1){ /* north */
1998
boundary[iced[0]*4+1]=1;
1999
++n;
2000
}else boundary[iced[0]*4+1]=0;
2001
boundary[iced[0]*4+2]=1;/* west is always boundary */
2002
++n;
2003
boundary[iced[0]*4+3]=1;/* south is always boundary */
2004
++n;
2005
}
2006
/* southeast */
2007
if (iced[imax]!=-1){
2008
boundary[iced[imax]*4+0]=1;/* east is always boundary */
2009
++n;
2010
if (iced[1*(imax+1) + imax]==-1){ /* north */
2011
boundary[iced[imax]*4+1]=1;
2012
++n;
2013
}else boundary[iced[imax]*4+1]=0;
2014
if (iced[imax-1]==-1){ /* west */
2015
boundary[iced[imax]*4+2]=1;
2016
++n;
2017
}else boundary[iced[imax]*4+2]=0;
2018
boundary[iced[imax]*4+3]=1;/* south is always boundary */
2019
++n;
2020
}
2021
return n;
2022
}
2023
/*******************************************************
2024
transform integer into float array
2025
********************************************************/
2026
void make_float_from_integer_scalar_field(int *input_property,
2027
float *output_property,
2028
int number_of_nodes,
2029
int reorder_ice_land_sea_mask){
2030
register int n;
2031
if (reorder_ice_land_sea_mask){
2032
for (n=0;n<number_of_nodes;++n){
2033
if ((input_property[n]==0) || (input_property[n]==3)) output_property[n] = 0; /* ice */
2034
else if (input_property[n]==1) output_property[n] = 1; /* land */
2035
else output_property[n] = 2; /* sea */
2036
}
2037
}else{
2038
for (n=0;n<number_of_nodes;++n)
2039
output_property[n] = (float) input_property[n];
2040
}
2041
return;
2042
}
2043
2044
2045
2046
2047
2048
2049
/****************************************************************
2050
Output of SICOPOLIS grid (not staggerd) in ELMER Solver format
2051
*****************************************************************/
2052
void STDCALLBULL FC_FUNC(solvergrid,SOLVERGRID)(float *xi, /* unscaled x coordinate index i: 0,imax */
2053
float *eta, /* unscaled y coordinate index j from 0,jmax */
2054
float *z_c, /* unscaled z coordinate index i: 0,imax, j: 0,jmax, kc: 0,kcmax */
2055
float *z_t, /* unscaled y coordinate index i: 0,imax, j: 0,jmax, kt: 0,kcmax */
2056
int *imax_in, /* grid steps in xi-direction */
2057
int *jmax_in, /* grid steps in eta-direction */
2058
int *kcmax_in, /* grid steps in z-direction in cold ice layer */
2059
int *ktmax_in, /* grid steps in z-direction in temperate ice layer */
2060
FC_CHAR_PTR(runname,runname_l), /*name of run*/
2061
FC_CHAR_PTR(ergnum,ergnum_l), /*number of file*/
2062
int *maske, /*mask of vertex type */
2063
float *deltaX, /* stepsize of grid */
2064
int *flag)
2065
{
2066
register int i, j, k, l, m, n;
2067
int number_of_bulk_elements, number_of_boundary_elements, number_of_iced_collums, elements_in_one_layer, number_of_nodes, nodes_of_element[8], *nodes_of_side_element, *parent_of_side_element, nodes_in_one_layer, *iced, idnr, parent_element, sidebulk=0;
2068
int imax, jmax, kcmax, ktmax, kmax = 0;
2069
float min_max_xyz[2][3], *bottom, freesurf, *delta_z;
2070
float actual_scaled_coord[3];
2071
char groupid[4], filename[80], yes_no;
2072
FILE *ptFile;
2073
2074
/* constants */
2075
imax= *imax_in;
2076
jmax= *jmax_in;
2077
kcmax= *kcmax_in;
2078
ktmax= *ktmax_in;
2079
2080
/* print out little summary */
2081
printf("---------------------------------------------------------------\n");
2082
printf("| Output of SICOPOLIS Grid for ELMER Solver\n");
2083
printf("---------------------------------------------------------------\n");
2084
printf("| imax/jmax/kcmax/ktmax=%d/%d/%d/%d\n",imax, jmax, kcmax, ktmax);
2085
printf("---------------------------------------------------------------\n");
2086
printf("| nodes in original grid:\n");
2087
printf("| cold layer: %d=%d * %d\n", (imax+1)*(jmax+1)*(kcmax+1), (imax+1)*(jmax+1), (kcmax+1));
2088
printf("| temperate layer: %d=%d * (%d - 1)\n", (imax+1)*(jmax+1)*(ktmax), (imax+1)*(jmax+1), (ktmax+1));
2089
printf("| -------------\n");
2090
printf("| %d=%d * %d\n", (imax+1)*(jmax+1)*(ktmax+1+kcmax), (imax+1)*(jmax+1), ktmax+1+kcmax);
2091
printf("---------------------------------------------------------------\n");
2092
printf("| elements in original grid:\n");
2093
printf("| cold layer: %d\n", (imax)*(jmax)*kcmax);
2094
printf("| temperate layer: %d\n", (*flag)*(imax)*(jmax)*(ktmax));
2095
printf("---------------------------------------------------------------\n");
2096
printf("| x = %.1f -> %.1f , y = %.1f -> %.1f, dx=%.1f\n", xi[0], xi[imax], eta[0], eta[jmax], *deltaX);
2097
printf("---------------------------------------------------------------\n");
2098
2099
/* inquire number of grid levels */
2100
/* ------------------------------*/
2101
while (kmax < 1){
2102
printf("| How many vertical grid layers the grid shall contain? \n");
2103
scanf("%d", &kmax);
2104
printf("| \n");
2105
if (kmax < 1) printf("| No. of vertical (current value %d) levels must exceed 1!\n", kmax);
2106
}
2107
printf("Thanks. Taking %d vertical layers\n", kmax);
2108
printf("---------------------------------------------------------------\n");
2109
2110
/* inquire if sidebulk on free surface is desired */
2111
/* -----------------------------------------------*/
2112
printf("| sidebulk elements on free surface (y/n)? \n");
2113
scanf("%1s", &yes_no);
2114
printf("| \n");
2115
if ((yes_no == 'y') || (yes_no == 'Y') ){
2116
printf("| Thanks. Writing sidebulk elements on free surface\n");
2117
sidebulk = 1;
2118
}else{
2119
printf("| Thanks. No output of sidebulk elements on free surface\n");
2120
sidebulk = 0;
2121
}
2122
printf("---------------------------------------------------------------\n");
2123
2124
/* calculate constants for output mesh*/
2125
/* -----------------------------------*/
2126
nodes_in_one_layer = (imax+1)*(jmax+1);
2127
elements_in_one_layer = (imax)*(jmax);
2128
number_of_nodes = nodes_in_one_layer*(kmax+1);
2129
number_of_bulk_elements = elements_in_one_layer*kmax;
2130
number_of_boundary_elements = 2*elements_in_one_layer + 2*(imax+jmax)*kmax;
2131
2132
/* allocate arrays */
2133
/* ----------------*/
2134
iced = (int *) malloc((size_t) (imax+1)*(jmax+1)*sizeof(int));
2135
if (iced == NULL){
2136
printf("ERROR in allocating memory for glaciation information\n");
2137
free(iced);
2138
return;
2139
}
2140
delta_z = (float *) malloc((size_t) (imax+1)*(jmax+1)*sizeof(float));
2141
if (delta_z == NULL){
2142
printf("ERROR in allocating memory for vertical grid step sizes\n");
2143
free(iced);free(delta_z);
2144
return;
2145
}
2146
bottom = (float *) malloc((size_t) (imax+1)*(jmax+1)*sizeof(float));
2147
if (bottom == NULL){
2148
printf("ERROR in allocating memory for bottom topography\n");
2149
free(iced);free(delta_z);free(bottom);
2150
return;
2151
}
2152
2153
/* get glaciation info */
2154
/* --------------------*/
2155
number_of_iced_collums = get_glaciation_info(imax,jmax,iced,maske);
2156
if (number_of_iced_collums<1){
2157
printf("WARNING: domain seems to be ice-free\n");
2158
}
2159
printf("| number of iced columns: %d out of %d (%3.2f %%)\n", number_of_iced_collums, (imax+1)*(jmax+1), ((float) number_of_iced_collums)*100.0/((float) (imax+1)*(jmax+1)));
2160
printf("---------------------------------------------------------------\n");
2161
printf("| number of nodes: %d=%d * %d\n",number_of_nodes, nodes_in_one_layer, kmax+1);
2162
printf("| number of bulk elements: %d=%d * %d\n",number_of_bulk_elements, elements_in_one_layer, kmax);
2163
printf("| number of sidebulk elements: %d\n", sidebulk*elements_in_one_layer);
2164
printf("| number of boundary elements: %d=2*[%d + (%d + %d) *%d] + %d\n", number_of_boundary_elements, elements_in_one_layer, imax, jmax, kmax, 2*(imax+jmax)*sidebulk);
2165
printf("| sidebulk boundary elements: %d=%d*2*(%d + %d)\n", sidebulk*2*(imax+jmax), sidebulk, imax, jmax);
2166
printf("---------------------------------------------------------------\n");
2167
2168
/* writing header file */
2169
/* --------------------*/
2170
sprintf(filename,"mesh.header");
2171
printf("| Writing mesh header file %s.\n",filename);
2172
if((ptFile=fopen(filename, "w"))==NULL){
2173
printf("\a Could not open Elmer mesh-file file for writing!\n");
2174
free(iced);free(delta_z);free(bottom);
2175
return;
2176
}
2177
fprintf(ptFile, "%d %d %d\n", number_of_nodes, number_of_bulk_elements + sidebulk*elements_in_one_layer, number_of_boundary_elements + sidebulk*2*(imax+jmax));
2178
fprintf(ptFile,"%d\n",2+sidebulk);
2179
if (sidebulk)
2180
fprintf(ptFile,"202 %d\n", 2*(imax+jmax));
2181
fprintf(ptFile,"404 %d\n", number_of_boundary_elements + sidebulk*elements_in_one_layer);
2182
fprintf(ptFile,"808 %d\n", number_of_bulk_elements);
2183
2184
printf("| succeeded in writing mesh header file %s.\n",filename);
2185
printf("---------------------------------------------------------------\n");
2186
fclose(ptFile);
2187
2188
/* init min/max */
2189
/* -------------*/
2190
min_max_xyz[0][2]= min_max_xyz[1][2] = z_c[0];
2191
min_max_xyz[0][0]= xi[0];
2192
min_max_xyz[1][0] = xi[imax];
2193
min_max_xyz[0][1]= eta[0];
2194
min_max_xyz[1][1] = eta[jmax];
2195
2196
/* get delta_z for specific i,j value */
2197
/* -----------------------------------*/
2198
for (j=0;j<jmax+1;++j){ /* loop over all j-values */
2199
for (i=0;i<imax+1;++i) { /* loop over all i-values */
2200
freesurf = z_c[kcmax*nodes_in_one_layer + j*(imax+1) + i];
2201
if (*flag){
2202
bottom[j*(imax+1) + i] = z_t[j*(imax+1) + i];
2203
}else{
2204
bottom[j*(imax+1) + i] = z_c[j*(imax+1) + i];
2205
}
2206
if (min_max_xyz[0][2]>bottom[j*(imax+1) + i]) min_max_xyz[0][2]=bottom[j*(imax+1) + i];
2207
if (min_max_xyz[1][2]<freesurf) min_max_xyz[0][2]=freesurf;
2208
delta_z[j*(imax+1) + i] = (freesurf - bottom[j*(imax+1) + i])/((float) kmax);
2209
/* printf("dz=%f = %f - %f \n", delta_z[j*(imax+1) + i], freesurf, bottom[j*(imax+1) + i]); */
2210
/* printf("%d %d % f\n", i,j,delta_z[j*(imax+1) + i]); */
2211
if (delta_z[j*(imax+1) + i] < 0.0){
2212
printf("\a delta z = %f - %f for (%d, %d) = %f < 0\n", freesurf, bottom[j*(imax+1) + i], i, j, delta_z[j*(imax+1) + i]);
2213
free(iced);free(delta_z);free(bottom);
2214
fclose(ptFile);
2215
return;
2216
}else if((delta_z[j*(imax+1) + i] < MINHEIGHT/((float) kmax))|| ((maske[j*(imax+1) + i]!=0) && (maske[j*(imax+1) + i]!=3))){
2217
delta_z[j*(imax+1) + i] = MINHEIGHT/((float) kmax);
2218
}
2219
}
2220
}
2221
printf("| succeeded in calculating grid step sizes %s.\n",filename);
2222
printf("---------------------------------------------------------------\n");
2223
2224
/* writing nodes file */
2225
/* -------------------*/
2226
sprintf(filename,"mesh.nodes");
2227
printf("| Writing node-file %s.\n",filename);
2228
if((ptFile=fopen(filename, "w"))==NULL){
2229
printf("\a Could not open Elmer mesh-file file for writing!\n");
2230
free(iced);free(delta_z);free(bottom);
2231
return;
2232
}
2233
for (n=0,k=0;k<kmax+1;++k){ /* loop over all levels */
2234
for (j=0;j<jmax+1;++j){ /* loop over all j-values */
2235
for (i=0;i<imax+1;++i) { /* loop over all i-values */
2236
++n;
2237
fprintf(ptFile, "%d -1 %.8f %.8f %.8f\n", n, eta[i], xi[j], bottom[j*(imax+1) + i] + delta_z[j*(imax+1) + i] * ((float) k));
2238
}
2239
}
2240
}
2241
fclose(ptFile);
2242
if (n != number_of_nodes){
2243
printf("\a %d written nodes does not match %d calculated nodes in grid\n", n, number_of_nodes);
2244
return;
2245
}else{
2246
printf("| succeeded in writing node file %s.\n",filename);
2247
printf("---------------------------------------------------------------\n");
2248
}
2249
2250
/* writing element file */
2251
/* ---------------------*/
2252
sprintf(filename,"mesh.elements");
2253
printf("| Writing bulk element file %s.\n",filename);
2254
if((ptFile=fopen(filename, "w"))==NULL){
2255
printf("\a Could not open Elmer mesh-file file for writing!\n");
2256
free(iced);free(delta_z);free(bottom);
2257
return;
2258
}
2259
/* write bulk elements */
2260
idnr = 1;
2261
for (n=0,k=0;k<kmax;++k){ /* loop over all levels */
2262
for (j=0;j<jmax;++j){ /* loop over all j-values */
2263
for (i=0;i<imax;++i) { /* loop over all i-values */
2264
n++;
2265
for (l=0; l<2; ++l){/* lower level: n=0; upper level n=1; each counterclkws */
2266
nodes_of_element[l*4] = (k+l)*nodes_in_one_layer + j*(imax+1) + i;
2267
nodes_of_element[l*4+1] = (k+l)*nodes_in_one_layer + j*(imax+1) + i+1;
2268
nodes_of_element[l*4+2] = (k+l)*nodes_in_one_layer + (j+1)*(imax+1) + i+1;
2269
nodes_of_element[l*4+3] = (k+l)*nodes_in_one_layer + (j+1)*(imax+1) + i;
2270
}
2271
fprintf(ptFile,"%d %d 808 %d %d %d %d %d %d %d %d\n", n, idnr,
2272
nodes_of_element[0]+1, nodes_of_element[1]+1, nodes_of_element[2]+1, nodes_of_element[3]+1,
2273
nodes_of_element[4]+1, nodes_of_element[5]+1, nodes_of_element[6]+1, nodes_of_element[7]+1);
2274
}
2275
}
2276
}
2277
/* write sidebulk elements (if demanded) */
2278
if (sidebulk){
2279
idnr = 2;
2280
for (m=0,j=0;j<jmax;++j){ /* loop over all j-values */
2281
for (i=0;i<imax;++i) { /* loop over all i-values */
2282
++m;
2283
nodes_of_element[0] = kmax*nodes_in_one_layer + j*(imax+1) + i;
2284
nodes_of_element[1] = kmax*nodes_in_one_layer + j*(imax+1) + i+1;
2285
nodes_of_element[2] = kmax*nodes_in_one_layer + (j+1)*(imax+1) + i+1;
2286
nodes_of_element[3] = kmax*nodes_in_one_layer + (j+1)*(imax+1) + i;
2287
fprintf(ptFile,"%d %d 404 %d %d %d %d\n", n+m, idnr,
2288
nodes_of_element[0]+1, nodes_of_element[1]+1, nodes_of_element[2]+1, nodes_of_element[3]+1);
2289
}
2290
}
2291
}else
2292
m=0;
2293
fclose(ptFile);
2294
if (n+m != number_of_bulk_elements + sidebulk*elements_in_one_layer){
2295
printf("\a %d=%d + %d written bulk elements does not match %d= %d + %d calculated elements in grid\n",
2296
n+m, n,m, number_of_bulk_elements+elements_in_one_layer, number_of_bulk_elements, elements_in_one_layer);
2297
return;
2298
}else{
2299
printf("| %d number of bulk elements written.\n", n);
2300
printf("| %d number of sidebulk elements written.\n", m);
2301
printf("| succeeded in writing bulk element file %s.\n",filename);
2302
printf("---------------------------------------------------------------\n");
2303
}
2304
2305
/* writing boundary element file */
2306
/* ------------------------------*/
2307
sprintf(filename,"mesh.boundary");
2308
printf("| Writing boundary element file %s.\n",filename);
2309
if((ptFile=fopen(filename, "w"))==NULL){
2310
printf("\a Could not open Elmer boundary element file for writing!\n");
2311
free(iced);free(delta_z);free(bottom);
2312
return;
2313
}
2314
/* base */
2315
idnr = 1;
2316
printf("| lower (base, z=0) boundary for bulk; idnr=%d\n", idnr);
2317
for (n=0,j=0;j<jmax;++j){ /* loop over all j-values */
2318
for (i=0;i<imax;++i) { /* loop over all i-values */
2319
n++;
2320
nodes_of_element[0] = j*(imax+1) + i;
2321
nodes_of_element[1] = j*(imax+1) + i+1;
2322
nodes_of_element[2] = (j+1)*(imax+1) + i+1;
2323
nodes_of_element[3] = (j+1)*(imax+1) + i;
2324
parent_element = j*imax + i;
2325
if (parent_element+1 > number_of_bulk_elements){
2326
printf("parent element %d > number of bulk elements %d\n",parent_element+1, number_of_bulk_elements);
2327
return;
2328
}
2329
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n",
2330
n, idnr, parent_element+1, nodes_of_element[0]+1, nodes_of_element[1]+1, nodes_of_element[2]+1, nodes_of_element[3]+1);
2331
}
2332
}
2333
/* free surface */
2334
idnr = 2;
2335
printf("| upper (free surface, z=max) boundary for bulk; idnr=%d\n", idnr);
2336
for (j=0;j<jmax;++j){ /* loop over all j-values */
2337
for (i=0;i<imax;++i) { /* loop over all i-values */
2338
n++;
2339
nodes_of_element[0] = kmax*nodes_in_one_layer + j*(imax+1) + i;
2340
nodes_of_element[1] = kmax*nodes_in_one_layer + j*(imax+1) + i+1;
2341
nodes_of_element[2] = kmax*nodes_in_one_layer + (j+1)*(imax+1) + i+1;
2342
nodes_of_element[3] = kmax*nodes_in_one_layer + (j+1)*(imax+1) + i;
2343
parent_element = (kmax-1)*elements_in_one_layer + j*imax + i; /* same numbering as in bulk */
2344
if (parent_element > number_of_bulk_elements){
2345
printf("parent element %d > number of bulk elements %d\n",parent_element+1, number_of_bulk_elements);
2346
return;
2347
}
2348
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n",
2349
n, idnr, parent_element+1, nodes_of_element[0]+1, nodes_of_element[1]+1, nodes_of_element[2]+1, nodes_of_element[3]+1);
2350
}
2351
}
2352
/* side faces: */
2353
/* south */
2354
idnr = 3;
2355
j=0;
2356
printf("| southern (y=0) boundary for bulk; idnr=%d\n", idnr);
2357
for (k=0;k<kmax;++k){ /* loop over all levels */
2358
for (i=0;i<imax;++i) { /* loop over all i-values */
2359
++n;
2360
nodes_of_element[0] = k*nodes_in_one_layer + j*(imax+1) + i;
2361
nodes_of_element[1] = k*nodes_in_one_layer + j*(imax+1) + i+1;
2362
nodes_of_element[2] = (k+1)*nodes_in_one_layer + j*(imax+1) + i+1;
2363
nodes_of_element[3] = (k+1)*nodes_in_one_layer + j*(imax+1) + i;
2364
parent_element = k*elements_in_one_layer + j*imax + i; /* same numbering as in bulk */
2365
if (parent_element+1 > number_of_bulk_elements){
2366
printf("parent element %d > number of bulk elements %d\n",parent_element+1, number_of_bulk_elements);
2367
return;
2368
}
2369
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n",
2370
n, idnr, parent_element+1, nodes_of_element[0]+1, nodes_of_element[1]+1, nodes_of_element[2]+1, nodes_of_element[3]+1);
2371
}
2372
}
2373
/* west */
2374
idnr = 4;
2375
i=0;
2376
printf("| western (x=0) boundary for bulk; idnr=%d\n", idnr);
2377
for (k=0;k<kmax;++k){ /* loop over all levels */
2378
for (j=0;j<jmax;++j){ /* loop over all j-values */
2379
++n;
2380
nodes_of_element[0] = k*nodes_in_one_layer + j*(imax+1) + i;
2381
nodes_of_element[1] = k*nodes_in_one_layer + (j+1)*(imax+1) + i;
2382
nodes_of_element[2] = (k+1)*nodes_in_one_layer + (j+1)*(imax+1) + i;
2383
nodes_of_element[3] = (k+1)*nodes_in_one_layer + j*(imax+1) + i;
2384
parent_element = k*elements_in_one_layer + j*imax + i; /* same numbering as in bulk */
2385
if (parent_element+1 > number_of_bulk_elements){
2386
printf("parent element %d > number of bulk elements %d\n",parent_element+1, number_of_bulk_elements);
2387
return;
2388
}
2389
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n",
2390
n, idnr, parent_element+1, nodes_of_element[0]+1, nodes_of_element[1]+1, nodes_of_element[2]+1, nodes_of_element[3]+1);
2391
}
2392
}
2393
/* north */
2394
idnr = 5;
2395
j=jmax;
2396
printf("| northern (y=max) boundary for bulk; idnr=%d\n", idnr);
2397
for (k=0;k<kmax;++k){ /* loop over all levels */
2398
for (i=0;i<imax;++i) { /* loop over all i-values */
2399
nodes_of_element[0] = k*nodes_in_one_layer + j*(imax+1) + i;
2400
nodes_of_element[1] = k*nodes_in_one_layer + j*(imax+1) + i+1;
2401
nodes_of_element[2] = (k+1)*nodes_in_one_layer + j*(imax+1) + i+1;
2402
nodes_of_element[3] = (k+1)*nodes_in_one_layer + j*(imax+1) + i;
2403
++n;
2404
parent_element = k*elements_in_one_layer + (jmax-1)*imax + i; /* same numbering as in bulk */
2405
if (parent_element+1 > number_of_bulk_elements){
2406
printf("parent element %d > number of bulk elements %d\n",parent_element+1, number_of_bulk_elements);
2407
return;
2408
}
2409
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n",
2410
n, idnr, parent_element + 1, nodes_of_element[0] + 1, nodes_of_element[1] + 1, nodes_of_element[2] + 1, nodes_of_element[3] + 1);
2411
}
2412
}
2413
/* east */
2414
idnr = 6;
2415
i=imax;
2416
printf("| eastern (x=max) boundary for bulk; idnr=%d\n", idnr);
2417
for (k=0;k<kmax;++k){ /* loop over all levels */
2418
for (j=0;j<jmax;++j){ /* loop over all j-values */
2419
nodes_of_element[0] = k*nodes_in_one_layer + j*(imax+1) + i;
2420
nodes_of_element[1] = k*nodes_in_one_layer + (j+1)*(imax+1) + i;
2421
nodes_of_element[2] = (k+1)*nodes_in_one_layer + (j+1)*(imax+1) + i;
2422
nodes_of_element[3] = (k+1)*nodes_in_one_layer + j*(imax+1) + i;
2423
++n;
2424
parent_element = k*elements_in_one_layer + j*imax + i-1; /* same numbering as in bulk */
2425
if (parent_element >= number_of_bulk_elements){
2426
printf("parent element %d > number of bulk elements %d\n",parent_element, number_of_bulk_elements);
2427
/* return; */
2428
}
2429
fprintf(ptFile,"%d %d %d 0 404 %d %d %d %d\n",
2430
n, idnr, parent_element + 1, nodes_of_element[0] + 1, nodes_of_element[1] + 1, nodes_of_element[2] + 1, nodes_of_element[3] + 1);
2431
}
2432
}
2433
m=0;
2434
if (sidebulk){
2435
/* frame of sidebulk (i.e. free surface): */
2436
/* south */
2437
++idnr;
2438
j=0;
2439
printf("| southern (y=0) boundary for sidebulk; idnr=%d\n", idnr);
2440
for (i=0;i<imax;++i) { /* loop over all i-values */
2441
++m;
2442
nodes_of_element[0] = kmax*nodes_in_one_layer + j*(imax+1) + i;
2443
nodes_of_element[1] = kmax*nodes_in_one_layer + j*(imax+1) + i+1;
2444
parent_element = number_of_bulk_elements + j*imax + i;
2445
fprintf(ptFile,"%d %d %d 0 202 %d %d\n",
2446
n+m, idnr, parent_element + 1, nodes_of_element[0] + 1, nodes_of_element[1] + 1);
2447
}
2448
/* west */
2449
++idnr;
2450
i=0;
2451
printf("| western (x=0) boundary for sidebulk; idnr=%d\n", idnr);
2452
for (j=0;j<jmax;++j){ /* loop over all j-values */
2453
++m;
2454
nodes_of_element[0] = kmax*nodes_in_one_layer + j*(imax+1) + i;
2455
nodes_of_element[1] = kmax*nodes_in_one_layer + (j+1)*(imax+1) + i;
2456
parent_element = number_of_bulk_elements + j*imax + i;
2457
fprintf(ptFile,"%d %d %d 0 202 %d %d\n",
2458
n+m, idnr, parent_element + 1, nodes_of_element[0] + 1, nodes_of_element[1] + 1);
2459
}
2460
/* north */
2461
++idnr;
2462
j=jmax;
2463
printf("| northern (y=max) boundary for sidebulk; idnr=%d\n", idnr);
2464
for (i=0;i<imax;++i) { /* loop over all i-values */
2465
++m;
2466
nodes_of_element[0] = (kmax-1)*nodes_in_one_layer + j*(imax+1) + i;
2467
nodes_of_element[1] = (kmax-1)*nodes_in_one_layer + j*(imax+1) + i + 1;
2468
parent_element = number_of_bulk_elements + (j-1)*imax + i;
2469
fprintf(ptFile,"%d %d %d 0 202 %d %d\n",
2470
n+m, idnr, parent_element + 1, nodes_of_element[0] + 1, nodes_of_element[1] + 1);
2471
}
2472
/* east */
2473
++idnr;
2474
i=imax;
2475
printf("| western (x=max) boundary for sidebulk; idnr=%d\n", idnr);
2476
for (j=0;j<jmax;++j){ /* loop over all j-values */
2477
++m;
2478
nodes_of_element[0] = (kmax-1)*nodes_in_one_layer + j*(imax+1) + i;
2479
nodes_of_element[1] = (kmax-1)*nodes_in_one_layer + j*(imax+1) + i+1;
2480
parent_element = number_of_bulk_elements + j*imax + i-1;
2481
fprintf(ptFile,"%d %d %d 0 202 %d %d\n",
2482
n+m, idnr, parent_element + 1, nodes_of_element[0] + 1, nodes_of_element[1] + 1);
2483
}
2484
}
2485
fclose(ptFile);
2486
if (n+m != number_of_boundary_elements + sidebulk*2*(imax+jmax)){
2487
printf("\a %d=%d + %d written boundary elements does not match %d= %d + %d calculated elements in grid\n",
2488
n+m, n,m, number_of_boundary_elements+sidebulk*2*(imax+jmax), number_of_boundary_elements, sidebulk*2*(imax+jmax));
2489
return;
2490
}else{
2491
printf("| %d number of boundary elements for bulk written.\n", n);
2492
printf("| %d number of boundary elements for sidebulk written.\n", m);
2493
printf("| succeeded in writing boundary element file %s.\n",filename);
2494
printf("---------------------------------------------------------------\n");
2495
}
2496
2497
free(iced);free(delta_z);free(bottom);
2498
return;
2499
}
2500
2501
2502
/****************************************************************
2503
Get parameters from log file of SICOPOLIS run
2504
*****************************************************************/
2505
void STDCALLBULL FC_FUNC_(readlog_c,READLOG_C) (FC_CHAR_PTR(runname,l1), /*name of run*/
2506
int *imax, /* grid steps in xi-direction */
2507
int *jmax, /* grid steps in eta-direction */
2508
int *kcmax, /* grid steps in z-direction cold ice layer */
2509
int *ktmax,/* grid steps in z-direction temperate ice layer */
2510
int *krmax,/* grid steps in z-direction in bedrock */
2511
float *deform, /* parameter for vertical scaling */
2512
float *deltaX, /* horizontal grod spacing */
2513
int *gotit){
2514
/* variable declaration */
2515
int gotparameter=0, i=0, inputint;
2516
char filename[80], inputstring[100], parameter[6], chardummy[1];
2517
float inputfloat;
2518
FILE *ptFile;
2519
2520
2521
/* compose filename */
2522
sprintf(filename,"%s%s", runname, ".log");
2523
2524
/* print out little summary */
2525
printf("---------------------------------------------------------------\n");
2526
printf("| Reading in parameters from log file\n");
2527
printf("---------------------------------------------------------------\n");
2528
2529
if((ptFile = fopen(filename, "r")) == NULL){
2530
printf("Cannot open file %s\n", filename);
2531
*gotit = 0;
2532
return;
2533
}
2534
2535
while((fgets(inputstring, LINESIZE - 1, ptFile) != NULL) && (gotparameter <7)){
2536
++i;
2537
/* printf("%s\n", inputstring); */
2538
if (sscanf(inputstring, "%s %c %i3", parameter, chardummy, &inputint) == 3){
2539
/* printf("%d: %s, %c, %f\n", i, parameter, chardummy, inputfloat); */
2540
if (strcmp(parameter, "imax") == 0){
2541
*imax = inputint;
2542
gotparameter++;
2543
}
2544
else if (strcmp(parameter, "jmax") == 0){
2545
*jmax = inputint;
2546
gotparameter++;
2547
}
2548
else if (strcmp(parameter, "kcmax") == 0){
2549
*kcmax = inputint;
2550
gotparameter++;
2551
}
2552
else if (strcmp(parameter, "ktmax") == 0){
2553
*ktmax = inputint;
2554
gotparameter++;
2555
}
2556
else if (strcmp(parameter, "krmax") == 0){
2557
*ktmax = inputint;
2558
gotparameter++;
2559
}
2560
}
2561
if (sscanf(inputstring, "%s %c %f", parameter, chardummy, &inputfloat) == 3){
2562
if (strcmp(parameter, "a") == 0){
2563
*deform = inputfloat;
2564
gotparameter++;
2565
}
2566
else if (strcmp(parameter, "dx") == 0){
2567
*deltaX = inputfloat;
2568
gotparameter++;
2569
}
2570
}
2571
}
2572
printf("| imax/jmax/kcmax/ktmax=%d/%d/%d/%d\n",*imax, *jmax, *kcmax, *ktmax);
2573
printf("| deform = %f, dx = %f\n", *deform, *deltaX);
2574
printf("---------------------------------------------------------------\n");
2575
fclose(ptFile);
2576
*gotit=1;
2577
return;
2578
}
2579
2580