00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdio.h>
00022 #include <stdlib.h>
00023 #include <string.h>
00024 #include <time.h>
00025 #include <sys/types.h>
00026 #if !defined(_WIN32) || defined(__NUTC__)
00027 #include <unistd.h>
00028 #endif
00029 #include "cgnslib.h"
00030 #include "cgns_header.h"
00031 #include "cgns_io.h"
00032 #ifdef MEM_DEBUG
00033 #include "cg_malloc.h"
00034 #endif
00035
00036 #define CGNS_NAN(x) (!((x) < HUGE_VAL && (x) > -HUGE_VAL))
00037
00038
00039
00040
00041 int Idim;
00042 int Cdim;
00043 int Pdim;
00044 int CurrentDim[9];
00045 ZoneType_t CurrentZoneType;
00046 int NumberOfSteps;
00047
00048
00049
00050 int posit_depth = 0;
00051 cgns_posit posit_stack[CG_MAX_GOTO_DEPTH+1];
00052
00053
00054
00055
00056
00057 void *cgi_malloc(int cnt, int size) {
00058 void *buf = calloc(cnt, size);
00059 if (buf == NULL) {
00060 cgi_error("calloc failed for %d values of size %d", cnt, size);
00061 exit (1);
00062 }
00063 return buf;
00064 }
00065
00066 void *cgi_realloc(void *oldbuf, unsigned bytes) {
00067 void *buf = realloc(oldbuf, bytes);
00068 if (buf == NULL) {
00069 cgi_error("realloc failed for %d bytes", bytes);
00070 exit (1);
00071 }
00072 return buf;
00073 }
00074
00075
00076
00077
00078
00079 int cgi_read() {
00080 int b;
00081 double *id;
00082
00083
00084
00085 if (cgi_get_nodes(cg->rootid, "CGNSBase_t", &cg->nbases, &id)) return 1;
00086 if (cg->nbases==0) return 0;
00087 cg->base = CGNS_NEW(cgns_base,cg->nbases);
00088 for (b=0; b<cg->nbases; b++) cg->base[b].id = id[b];
00089 free(id);
00090
00091
00092 for (b=0; b<cg->nbases; b++) if (cgi_read_base(&cg->base[b])) return 1;
00093
00094 return 0;
00095 }
00096
00097 int cgi_read_base(cgns_base *base) {
00098 char_33 data_type;
00099 int ndim, dim_vals[12];
00100 int *index;
00101 double *id;
00102 int n;
00103 void *vdata;
00104
00105
00106 if (cgi_read_node(base->id, base->name, data_type, &ndim, dim_vals,
00107 &vdata, READ_DATA)) {
00108 cgi_error("Error reading base");
00109 return 1;
00110 }
00111 index = (int *)vdata;
00112
00113
00114 if (strcmp(data_type,"I4")!=0) {
00115 cgi_error("Unexpected data type for dimension data of base %s='%s'",
00116 base->name, data_type);
00117 return 1;
00118 }
00119 if ((cg->version==1050 && (ndim != 1 || dim_vals[0]!=1)) ||
00120 (cg->version >= 1100 && (ndim != 1 || dim_vals[0]!=2))) {
00121 cgi_error("Wrong definition of Base Dimensions.");
00122 return 1;
00123 }
00124 if (cg->version == 1050) {
00125 base->cell_dim = base->phys_dim = index[0];
00126 } else {
00127 base->cell_dim = index[0];
00128 base->phys_dim = index[1];
00129 }
00130 free(vdata);
00131
00132 if (base->cell_dim<1 || base->cell_dim>3) {
00133 cgi_error("Invalid value for base cell dimension (=%d)",
00134 base->cell_dim);
00135 return 1;
00136 }
00137 if (base->phys_dim<1 || base->phys_dim>3) {
00138 cgi_error("Invalid value for base physical dimension(=%d)",
00139 base->phys_dim);
00140 return 1;
00141 }
00142
00143
00144 Cdim = base->cell_dim;
00145 Pdim = base->phys_dim;
00146
00147
00148 if (cg->mode == CG_MODE_MODIFY && cg->version < 1100) {
00149 dim_vals[0] = 2;
00150 if (cgio_set_dimensions(cg->cgio, base->id, "I4", 1, dim_vals)) {
00151 cg_io_error("cgio_set_dimensions");
00152 return 1;
00153 }
00154 dim_vals[0] = base->cell_dim;
00155 dim_vals[1] = base->phys_dim;
00156 if (cgio_write_all_data(cg->cgio, base->id, dim_vals)) {
00157 cg_io_error("cgio_write_all_data");
00158 return 1;
00159 }
00160 }
00161
00162
00163 if (cgi_get_nodes(base->id, "Family_t", &base->nfamilies, &id)) return 1;
00164 if (base->nfamilies>0) {
00165
00166 base->family = CGNS_NEW(cgns_family, base->nfamilies);
00167 for (n=0; n<base->nfamilies; n++) {
00168 base->family[n].id = id[n];
00169 base->family[n].link = cgi_read_link(id[n]);
00170 base->family[n].in_link = 0;
00171 if (cgi_read_family(&base->family[n])) return 1;
00172 }
00173 free(id);
00174 }
00175
00176
00177 if (cgi_read_state(0, base->id, &base->state)) return 1;
00178
00179
00180 if (cgi_read_gravity(0, base->id, &base->gravity)) return 1;
00181
00182
00183 if (cgi_read_axisym(0, base->id, &base->axisym)) return 1;
00184
00185
00186 if (cgi_read_rotating(0, base->id, &base->rotating)) return 1;
00187
00188
00189 if (cgi_read_converg(0, base->id, &base->converg)) return 1;
00190
00191
00192 if (cgi_read_DDD(0, base->id, &base->ndescr, &base->descr,
00193 &base->data_class, &base->units)) return 1;
00194
00195
00196 if (cgi_read_equations(0, base->id, &base->equations)) return 1;
00197
00198
00199 if (cgi_read_integral(0, base->id, &base->nintegrals,
00200 &base->integral)) return 1;
00201
00202
00203 if (cgi_read_simulation(base->id, &base->type, &base->type_id)) return 1;
00204
00205
00206 if (cgi_read_biter(0, base->id, &base->biter)) return 1;
00207
00208
00209 if (cgi_read_user_data(0, base->id, &base->nuser_data,
00210 &base->user_data)) return 1;
00211
00212
00213 if (cgi_get_nodes(base->id, "Zone_t", &base->nzones, &id)) return 1;
00214 if (base->nzones>0) {
00215
00216 if (cgi_sort_names(base->nzones, id)) {
00217 cgi_error("Error sorting zone names...");
00218 return 1;
00219 }
00220
00221 base->zone = CGNS_NEW(cgns_zone, base->nzones);
00222 for (n=0; n<base->nzones; n++) {
00223 base->zone[n].id = id[n];
00224 base->zone[n].link = cgi_read_link(id[n]);
00225 base->zone[n].in_link = 0;
00226 if (cgi_read_zone(&base->zone[n])) return 1;
00227 }
00228 free(id);
00229 }
00230 return 0;
00231 }
00232
00233 int cgi_read_zone(cgns_zone *zone) {
00234 int n, ndim, dim_vals[12];
00235 int in_link = zone->link ? 1 : zone->in_link;
00236 char_33 data_type;
00237 int *mesh_dim;
00238 void *vdata;
00239
00240
00241 if (cgi_read_node(zone->id, zone->name, data_type, &ndim, dim_vals,
00242 &vdata, READ_DATA)) {
00243 cgi_error("Error reading node Zone_t");
00244 return 1;
00245 }
00246 mesh_dim = (int *)vdata;
00247
00248
00249 if (strcmp(data_type,"I4")!=0) {
00250 cgi_error("Unsupported data type for Zone_t node %s= %s",
00251 zone->name, data_type);
00252 return 1;
00253 }
00254 if (ndim!=2) {
00255 cgi_error("Wrong number of dimension for a Zone_t node");
00256 return 1;
00257 }
00258
00259 if (cgi_read_zonetype(zone->id, zone->name, &zone->type)) return 1;
00260
00261
00262 if (zone->type==Structured) zone->index_dim=Cdim;
00263 else zone->index_dim=1;
00264
00265
00266 Idim = zone->index_dim;
00267
00268 if (dim_vals[0]!=zone->index_dim || ((cg->version==1050 && dim_vals[1]!=2)
00269 || (cg->version>=1100 && dim_vals[1]!=3))) {
00270 cgi_error("Wrong number of dimension values for Zone_t %s",zone->name);
00271 return 1;
00272 }
00273
00274
00275 zone->nijk=CGNS_NEW(int, zone->index_dim*3);
00276
00277 for (n=0; n<zone->index_dim; n++) {
00278 zone->nijk[n] = mesh_dim[n];
00279 zone->nijk[n+Idim] = mesh_dim[n+Idim];
00280 if (cg->version==1050) zone->nijk[n+2*Idim] = 0;
00281 else zone->nijk[n+2*Idim] = mesh_dim[n+2*Idim];
00282 }
00283 free(vdata);
00284
00285
00286 for (n=0; n<Idim*3; n++) CurrentDim[n] = zone->nijk[n];
00287 CurrentZoneType = zone->type;
00288
00289
00290 if (zone->type==Structured) {
00291 for (n=0; n<zone->index_dim; n++) {
00292 if (zone->nijk[n] <=0 || zone->nijk[n]!=zone->nijk[n+Idim]+1) {
00293 cgi_error("Invalid structured zone dimensions");
00294 return 1;
00295 }
00296 }
00297 } else {
00298 if (zone->nijk[0]<0 || zone->nijk[1]<0 ||
00299 zone->nijk[2]>zone->nijk[0]) {
00300 cgi_error("Invalid unstructured zone dimensions");
00301 return 1;
00302 }
00303 }
00304
00305
00306 if (cg->mode == CG_MODE_MODIFY && cg->version < 1100 && !in_link) {
00307 dim_vals[0] = zone->index_dim;
00308 dim_vals[1] = 3;
00309 if (cgio_set_dimensions(cg->cgio, zone->id, "I4", 2, dim_vals)) {
00310 cg_io_error("cgio_set_dimensions");
00311 return 1;
00312 }
00313 if (cgio_write_all_data(cg->cgio, zone->id, zone->nijk)) {
00314 cg_io_error("cgio_write_all_data");
00315 return 1;
00316 }
00317 }
00318
00319
00320 if (cgi_read_zcoor(in_link, zone->id, &zone->nzcoor, &zone->zcoor))
00321 return 1;
00322
00323
00324 if (cgi_read_section(in_link, zone->id, &zone->nsections, &zone->section))
00325 return 1;
00326 if (zone->type==Structured && zone->nsections!=0) {
00327 cgi_error("Elements_t nodes is valid only for unstructured zones");
00328 return 1;
00329 }
00330
00331
00332 if (cgi_read_family_name(in_link, zone->id, zone->name, zone->family_name))
00333 return 1;
00334
00335
00336 if (cgi_read_sol(in_link, zone->id, &zone->nsols, &zone->sol))
00337 return 1;
00338
00339
00340 if (cgi_read_zconn(in_link, zone->id, &zone->zconn)) return 1;
00341
00342
00343 if (cgi_read_zboco(in_link, zone->id, &zone->zboco)) return 1;
00344
00345
00346 if (cgi_read_DDD(in_link, zone->id, &zone->ndescr, &zone->descr,
00347 &zone->data_class, &zone->units)) return 1;
00348
00349
00350 if (cgi_read_discrete(in_link, zone->id, &zone->ndiscrete,
00351 &zone->discrete)) return 1;
00352
00353
00354 if (cgi_read_integral(in_link, zone->id, &zone->nintegrals,
00355 &zone->integral)) return 1;
00356
00357
00358 if (cgi_read_state(in_link, zone->id, &zone->state)) return 1;
00359
00360
00361 if (cgi_read_converg(in_link, zone->id, &zone->converg)) return 1;
00362
00363
00364 if (cgi_read_equations(in_link, zone->id, &zone->equations)) return 1;
00365
00366
00367 if (cgi_read_ordinal(zone->id, &zone->ordinal)) return 1;
00368
00369
00370 if (cgi_read_rmotion(in_link, zone->id, &zone->nrmotions,
00371 &zone->rmotion)) return 1;
00372
00373
00374 if (cgi_read_amotion(in_link, zone->id, &zone->namotions,
00375 &zone->amotion)) return 1;
00376
00377
00378
00379 if (NumberOfSteps) {
00380 if (cgi_read_ziter(in_link, zone->id, &zone->ziter)) return 1;
00381 } else zone->ziter = 0;
00382
00383
00384 if (cgi_read_user_data(in_link, zone->id, &zone->nuser_data,
00385 &zone->user_data)) return 1;
00386
00387
00388 if (cgi_read_rotating(in_link, zone->id, &zone->rotating)) return 1;
00389
00390 return 0;
00391 }
00392
00393 int cgi_read_family(cgns_family *family) {
00394 int n, linked, in_link = family->link ? 1 : family->in_link;
00395 double *id;
00396 char *boconame;
00397
00398
00399 if (cgio_get_name(cg->cgio, family->id, family->name)) {
00400 cg_io_error("cgio_get_name");
00401 return 1;
00402 }
00403
00404
00405 if (cgi_get_nodes(family->id, "FamilyBC_t", &family->nfambc, &id))
00406 return 1;
00407 if (family->nfambc>0) {
00408 family->fambc = CGNS_NEW(cgns_fambc, family->nfambc);
00409 for (n=0; n<family->nfambc; n++) {
00410 family->fambc[n].id = id[n];
00411 family->fambc[n].link = cgi_read_link(id[n]);
00412 family->fambc[n].in_link = in_link;
00413 if (cgi_read_string(id[n], family->fambc[n].name, &boconame))
00414 return 1;
00415
00416 if (cgi_BCType(boconame, &family->fambc[n].type)) return 1;
00417 free(boconame);
00418
00419 linked = family->fambc[n].link ? 1 : in_link;
00420 if (cgi_read_dataset(linked, family->fambc[n].id,
00421 &family->fambc[n].ndataset,
00422 &family->fambc[n].dataset))
00423 return 1;
00424 }
00425 free(id);
00426 }
00427
00428
00429 if (cgi_get_nodes(family->id, "GeometryReference_t", &family->ngeos, &id))
00430 return 1;
00431 if (family->ngeos>0) {
00432 family->geo = CGNS_NEW(cgns_geo, family->ngeos);
00433 for (n=0; n<family->ngeos; n++) {
00434 family->geo[n].id = id[n];
00435 family->geo[n].link = cgi_read_link(id[n]);
00436 family->geo[n].in_link = in_link;
00437
00438
00439 if (cgio_get_name(cg->cgio, family->geo[n].id,
00440 family->geo[n].name)) {
00441 cg_io_error("cgio_get_name");
00442 return 1;
00443 }
00444
00445
00446 linked = family->geo[n].link ? 1 : in_link;
00447 if (cgi_read_user_data(linked, family->geo[n].id,
00448 &family->geo[n].nuser_data, &family->geo[n].user_data))
00449 return 1;
00450 }
00451 free(id);
00452 }
00453
00454
00455
00456 for (n=0; n<family->ngeos; n++) {
00457 int i, flag;
00458 char_33 dummy_name;
00459 cgns_geo *geo = &family->geo[n];
00460
00461
00462 if (cgi_get_nodes(geo->id, "Descriptor_t", &geo->ndescr, &id))
00463 return 1;
00464 if (geo->ndescr>0) {
00465 geo->descr = CGNS_NEW(cgns_descr, geo->ndescr);
00466 for (i=0; i<geo->ndescr; i++) {
00467 geo->descr[i].id = id[i];
00468 geo->descr[i].link = cgi_read_link(id[i]);
00469 geo->descr[i].in_link = in_link;
00470 if (cgi_read_string(id[i], geo->descr[i].name,
00471 &geo->descr[i].text)) return 1;
00472 }
00473 free(id);
00474 }
00475
00476
00477 if (cgi_get_nodes(geo->id, "GeometryFile_t", &flag, &id)) return 1;
00478 if (flag==1) {
00479 if (cgi_read_string(id[0], dummy_name, &geo->file)) return 1;
00480 } else {
00481 cgi_error("Incorrect definition of GeometryFile_t");
00482 return 1;
00483 }
00484 if (flag) free(id);
00485
00486
00487 if (cgi_get_nodes(geo->id, "GeometryFormat_t", &flag, &id)) return 1;
00488 if (flag==1) {
00489 char *geoformat;
00490 if (cgi_read_string(id[0], dummy_name, &geoformat)) return 1;
00491 if (strlen(geoformat)>32) {
00492 cgi_error("Geometry File Format is limited to 32 characters");
00493 return 1;
00494 } else strcpy(geo->format, geoformat);
00495 free(geoformat);
00496 } else {
00497 cgi_error("Incorrect definition of GeometryFormat_t");
00498 return 1;
00499 }
00500 if (flag) free(id);
00501
00502
00503 if (cgi_get_nodes(geo->id, "GeometryEntity_t", &geo->npart, &id))
00504 return 1;
00505 if (geo->npart>0) {
00506 geo->part = CGNS_NEW(cgns_part, geo->npart);
00507 for (i=0; i<geo->npart; i++) {
00508 geo->part[i].id = id[i];
00509 geo->part[i].link = cgi_read_link(id[i]);
00510 geo->part[i].in_link = in_link;
00511 if (cgio_get_name(cg->cgio, id[i], geo->part[i].name)) {
00512 cg_io_error("cgio_get_name");
00513 return 1;
00514 }
00515 }
00516 free(id);
00517 }
00518 }
00519
00520
00521 if (cgi_get_nodes(family->id, "Descriptor_t", &family->ndescr, &id))
00522 return 1;
00523 if (family->ndescr>0) {
00524 family->descr = CGNS_NEW(cgns_descr, family->ndescr);
00525 for (n=0; n<family->ndescr; n++) {
00526 family->descr[n].id = id[n];
00527 family->descr[n].link = cgi_read_link(id[n]);
00528 family->descr[n].in_link = in_link;
00529 if (cgi_read_string(id[n], family->descr[n].name,
00530 &family->descr[n].text)) return 1;
00531 }
00532 free(id);
00533 }
00534
00535
00536 if (cgi_read_ordinal(family->id, &family->ordinal)) return 1;
00537
00538
00539 if (cgi_read_user_data(in_link, family->id, &family->nuser_data,
00540 &family->user_data)) return 1;
00541
00542
00543 if (cgi_read_rotating(in_link, family->id, &family->rotating)) return 1;
00544
00545 return 0;
00546 }
00547
00548 int cgi_read_family_name(int in_link, double parent_id, char_33 parent_name,
00549 char_33 family_name) {
00550 int fam_flag;
00551 double *id;
00552 char_33 NodeName;
00553 char *FamilyName=0;
00554
00555 family_name[0]='\0';
00556 if (cgi_get_nodes(parent_id, "FamilyName_t", &fam_flag, &id)) return 1;
00557 if (fam_flag==1) {
00558
00559 if (cg->version>1200) {
00560
00561
00562 if (cgi_read_string(id[0], NodeName, &FamilyName)) return 1;
00563 if (strlen(FamilyName) > 32) FamilyName[32]='\0';
00564 strcpy(family_name, FamilyName);
00565 if (FamilyName) free(FamilyName);
00566
00567 } else {
00568
00569 if (cgio_get_name(cg->cgio, id[0], family_name)) {
00570 cg_io_error("cgio_get_name");
00571 return 1;
00572 }
00573
00574 if (cg->mode == CG_MODE_MODIFY && !in_link) {
00575 double dummy_id;
00576 int len = strlen(family_name);
00577 if (cgi_delete_node(parent_id, id[0])) return 1;
00578 if (cgi_new_node(parent_id, "FamilyName", "FamilyName_t",
00579 &dummy_id, "C1", 1, &len, (void *)family_name))
00580 return 1;
00581 }
00582 }
00583 free(id);
00584
00585 } else if (fam_flag<0 || fam_flag>1) {
00586 cgi_error("Family name defined incorrectly under '%s',",parent_name);
00587 return 1;
00588 }
00589 return 0;
00590 }
00591
00592 int cgi_read_zcoor(int in_link, double parent_id, int *nzcoor, cgns_zcoor **zcoor) {
00593 double *idg, *id;
00594 int g, z, n, linked;
00595 int DataSize[3];
00596
00597 if (cgi_get_nodes(parent_id, "GridCoordinates_t", nzcoor, &idg)) return 1;
00598 if ((*nzcoor)<=0) return 0;
00599
00600 zcoor[0] = CGNS_NEW(cgns_zcoor, (*nzcoor));
00601
00602 for (g=0; g<(*nzcoor); g++) {
00603 zcoor[0][g].id = idg[g];
00604 zcoor[0][g].link = cgi_read_link(idg[g]);
00605 zcoor[0][g].in_link = in_link;
00606 linked = zcoor[0][g].link ? 1 : in_link;
00607
00608
00609 if (cgio_get_name(cg->cgio, zcoor[0][g].id, zcoor[0][g].name)) {
00610 cg_io_error("cgio_get_name");
00611 return 1;
00612 }
00613
00614
00615 if (cgi_read_rind(zcoor[0][g].id, &zcoor[0][g].rind_planes)) return 1;
00616
00617
00618 if (cgi_datasize(Idim, CurrentDim, Vertex, zcoor[0][g].rind_planes,
00619 DataSize)) return 1;
00620
00621
00622 if (cgi_get_nodes(zcoor[0][g].id, "DataArray_t", &zcoor[0][g].ncoords,
00623 &id)) return 1;
00624 if (zcoor[0][g].ncoords > 0) {
00625 zcoor[0][g].coord = CGNS_NEW(cgns_array, zcoor[0][g].ncoords);
00626 for (z=0; z<zcoor[0][g].ncoords; z++) {
00627 zcoor[0][g].coord[z].id = id[z];
00628 zcoor[0][g].coord[z].link = cgi_read_link(id[z]);
00629 zcoor[0][g].coord[z].in_link = linked;
00630 if (cgi_read_array(&zcoor[0][g].coord[z],"GridCoordinates_t",
00631 zcoor[0][g].id)) return 1;
00632
00633
00634 if (zcoor[0][g].coord[z].data_dim != Idim) {
00635 cgi_error("Wrong number of dimension in DataArray %s",zcoor[0][g].coord[z].name);
00636 return 1;
00637 }
00638 for (n=0; n<Idim; n++) {
00639 if (zcoor[0][g].coord[z].dim_vals[n] != DataSize[n]) {
00640 cgi_error("Invalid coordinates array dimension");
00641 return 1;
00642 }
00643 }
00644 if (strcmp(zcoor[0][g].coord[z].data_type,"R4") &&
00645 strcmp(zcoor[0][g].coord[z].data_type,"R8")) {
00646 cgi_error("Datatype %d not supported for coordinates");
00647 return 1;
00648 }
00649 }
00650 free(id);
00651 }
00652
00653
00654 if (cgi_read_DDD(linked, zcoor[0][g].id, &zcoor[0][g].ndescr,
00655 &zcoor[0][g].descr, &zcoor[0][g].data_class, &zcoor[0][g].units))
00656 return 1;
00657
00658
00659 if (cgi_read_user_data(linked, zcoor[0][g].id, &zcoor[0][g].nuser_data,
00660 &zcoor[0][g].user_data)) return 1;
00661
00662 }
00663 free(idg);
00664
00665 return 0;
00666 }
00667
00668 int cgi_read_section(int in_link, double parent_id, int *nsections,
00669 cgns_section **section) {
00670 double *id, *idi;
00671 int n, i, linked;
00672 int ndim, dim_vals[12], *data, nchild, npe, nelements;
00673 ElementType_t el_type;
00674 char_33 data_type, temp_name;
00675 void *vdata;
00676
00677 if (cgi_get_nodes(parent_id, "Elements_t", nsections, &id)) return 1;
00678 if (*nsections<=0) {
00679 section[0] = 0;
00680 return 0;
00681 }
00682
00683 section[0] = CGNS_NEW(cgns_section, (*nsections));
00684 for (n=0; n<(*nsections); n++) {
00685 section[0][n].id = id[n];
00686 section[0][n].link = cgi_read_link(id[n]);
00687 section[0][n].in_link = in_link;
00688 linked = section[0][n].link ? 1 : in_link;
00689
00690
00691 if (cgi_read_node(section[0][n].id, section[0][n].name, data_type,
00692 &ndim, dim_vals, &vdata, READ_DATA)) {
00693 cgi_error("Error reading Elements_t node");
00694 return 1;
00695 }
00696
00697
00698 if (strcmp(data_type,"I4")!=0) {
00699 cgi_error("Unsupported data type for Elements_t node %s= %s",
00700 section[0][n].name, data_type);
00701 return 1;
00702 }
00703 if (ndim!=1) {
00704 cgi_error("Wrong number of dimension for Elements_t node '%s'.",
00705 section[0][n].name);
00706 return 1;
00707 }
00708 if (dim_vals[0]!=2) {
00709 cgi_error("Wrong dimension value for Elements_t node '%s'.",
00710 section[0][n].name);
00711 return 1;
00712 }
00713 data = (int *)vdata;
00714 el_type = (ElementType_t)data[0];
00715
00716 if (cg->version < 3000 && el_type > PYRA_5) el_type++;
00717 section[0][n].el_type = el_type;
00718 section[0][n].el_bound = data[1];
00719 free(vdata);
00720
00721 if (el_type < 0 || el_type >= NofValidElementTypes) {
00722 cgi_error("Invalid Element Type for Elements_t :'%s'",
00723 section[0][n].name);
00724 return 1;
00725 }
00726
00727
00728 if (cgi_get_nodes(section[0][n].id, "Descriptor_t",
00729 §ion[0][n].ndescr, &idi)) return 1;
00730 if (section[0][n].ndescr>0) {
00731 section[0][n].descr = CGNS_NEW(cgns_descr, section[0][n].ndescr);
00732 for (i=0; i<section[0][n].ndescr; i++) {
00733 section[0][n].descr[i].id = idi[i];
00734 section[0][n].descr[i].link = cgi_read_link(idi[i]);
00735 section[0][n].descr[i].in_link = linked;
00736 if (cgi_read_string(idi[i], section[0][n].descr[i].name,
00737 §ion[0][n].descr[i].text)) return 1;
00738 }
00739 free(idi);
00740 }
00741
00742
00743 if (cgi_get_nodes(section[0][n].id, "IndexRange_t", &nchild, &idi))
00744 return 1;
00745 if (nchild==1) {
00746 if (cgi_read_node(idi[0], temp_name, data_type, &ndim, dim_vals,
00747 &vdata, READ_DATA)) {
00748 cgi_error("Error reading element range");
00749 return 1;
00750 }
00751 data = (int *)vdata;
00752 } else {
00753 cgi_error("Error exit: ElementRange incorrectly defined");
00754 return 1;
00755 }
00756 if (nchild) free(idi);
00757
00758
00759 if (strcmp(temp_name,"ElementRange")) {
00760 cgi_error("Invalid point set type: '%s'",temp_name);
00761 return 1;
00762 }
00763
00764 if (strcmp(data_type,"I4")) {
00765 cgi_error("Data type %s not supported for ElementRange", data_type);
00766 return 1;
00767 }
00768
00769 if (ndim!=1 || dim_vals[0]!=2) {
00770 cgi_error("Invalid dimensions in definition of ElementRange");
00771 return 1;
00772 }
00773
00774
00775 section[0][n].range[0] = data[0];
00776 section[0][n].range[1] = data[1];
00777 nelements = section[0][n].range[1] - section[0][n].range[0] + 1;
00778 free(vdata);
00779
00780
00781 if (cgi_read_rind(section[0][n].id, §ion[0][n].rind_planes))
00782 return 1;
00783
00784
00785 section[0][n].connect = 0;
00786 section[0][n].parent = 0;
00787
00788
00789 if (cgi_get_nodes(section[0][n].id, "DataArray_t", &nchild, &idi))
00790 return 1;
00791 for (i=0; i<nchild; i++) {
00792 if (cgio_get_name(cg->cgio, idi[i], temp_name)) {
00793 cg_io_error("cgio_get_name");
00794 return 1;
00795 }
00796
00797
00798 if (strcmp(temp_name,"ElementConnectivity")==0) {
00799 if (section[0][n].connect) {
00800 cgi_error("Error: ElementConnectivity defined more than once");
00801 return 1;
00802 }
00803 section[0][n].connect = CGNS_NEW(cgns_array, 1);
00804 section[0][n].connect->id = idi[i];
00805 section[0][n].connect->link = cgi_read_link(idi[i]);
00806 section[0][n].connect->in_link = linked;
00807 if (cgi_read_array(section[0][n].connect, "Elements_t",
00808 section[0][n].id)) return 1;
00809
00810
00811 if (strcmp(section[0][n].connect->data_type,"I4")) {
00812 cgi_error("Datatype %d not supported for element connectivity");
00813 return 1;
00814 }
00815 if (cg_npe(section[0][n].el_type, &npe)) return 1;
00816 if (cg->version <= 1100) {
00817 if (section[0][n].connect->dim_vals[0] != npe ||
00818 section[0][n].connect->dim_vals[1] != nelements ||
00819 section[0][n].connect->data_dim != 2 ) {
00820 cgi_error("Error exit: Element connectivity incorrectly defined");
00821 return 1;
00822 }
00823
00824 section[0][n].connect->data_dim = 1;
00825 section[0][n].connect->dim_vals[0] = npe*nelements;
00826 section[0][n].connect->dim_vals[1] = 0;
00827 if (cg->mode == CG_MODE_MODIFY && !linked) {
00828 if (cgio_set_dimensions(cg->cgio,
00829 section[0][n].connect->id, "I4",
00830 1, section[0][n].connect->dim_vals)) {
00831 cg_io_error("cgio_set_dimensions");
00832 return 1;
00833 }
00834 if (cgio_write_all_data(cg->cgio,
00835 section[0][n].connect->id,
00836 section[0][n].connect->data)) {
00837 cg_io_error("cgio_write_all_data");
00838 return 1;
00839 }
00840 }
00841
00842 } else {
00843 int size, modified = 0;
00844 if (cg->version < 3000 && section[0][n].el_type == MIXED) {
00845 int ne, *elem_data = (int *)section[0][n].connect->data;
00846 for (size = 0, ne = 0; ne < nelements; ne++) {
00847 el_type = (ElementType_t)elem_data[size];
00848 if (el_type > PYRA_5) {
00849 modified++;
00850 el_type++;
00851 elem_data[size] = el_type;
00852 }
00853 if (el_type > NGON_n)
00854 npe = el_type - NGON_n;
00855 else
00856 cg_npe (el_type, &npe);
00857 if (npe <= 0) {
00858 cgi_error("Error exit: invalid element type in MIXED elements");
00859 return 1;
00860 }
00861 size += (npe + 1);
00862 }
00863 }
00864 size = cgi_element_data_size(section[0][n].el_type, nelements,
00865 section[0][n].connect->data);
00866 if (section[0][n].connect->dim_vals[0] != size ||
00867 section[0][n].connect->data_dim != 1) {
00868 cgi_error("Error exit: Element connectivity incorrectly defined");
00869 return 1;
00870 }
00871
00872 if (cg->version < 3000 && section[0][n].el_type > PYRA_13 &&
00873 cg->mode == CG_MODE_MODIFY && !linked) {
00874 dim_vals[0] = (int)section[0][n].el_type;
00875 dim_vals[1] = section[0][n].el_bound;
00876 if (cgio_write_all_data(cg->cgio, section[0][n].id, dim_vals)) {
00877 cg_io_error("cgio_write_all_data");
00878 return 1;
00879 }
00880 if (modified && cgio_write_all_data(cg->cgio,
00881 section[0][n].connect->id, section[0][n].connect->data)) {
00882 cg_io_error("cgio_write_all_data");
00883 return 1;
00884 }
00885 }
00886 }
00887
00888 } else if (strcmp(temp_name,"ParentData")==0) {
00889 int pdata_cnt;
00890
00891 if (section[0][n].parent) {
00892 cgi_error("Error: Element ParentData defined more than once");
00893 return 1;
00894 }
00895 section[0][n].parent = CGNS_NEW(cgns_array, 1);
00896 section[0][n].parent->id = idi[i];
00897 section[0][n].parent->link = cgi_read_link(idi[i]);
00898 section[0][n].parent->in_link = linked;
00899 if (cgi_read_array(section[0][n].parent, "Elements_t",
00900 section[0][n].id)) return 1;
00901
00902
00903 if (strcmp(section[0][n].parent->data_type,"I4")) {
00904 cgi_error("Datatype %d not supported for element 'parent_data'");
00905 return 1;
00906 }
00907 if(section[0][n].parent->range[0] > 0 &&
00908 section[0][n].parent->range[1] > 0)
00909 pdata_cnt = section[0][n].parent->range[1] -
00910 section[0][n].parent->range[0] + 1;
00911 else
00912 pdata_cnt = nelements;
00913
00914 if (section[0][n].parent->dim_vals[0] != pdata_cnt ||
00915 section[0][n].parent->dim_vals[1] != 4 ||
00916 section[0][n].parent->data_dim != 2 ) {
00917 cgi_error("Error exit: Element 'parent_data' incorrectly defined");
00918 return 1;
00919 }
00920 }
00921 }
00922
00923
00924
00925
00926 if (nchild) free(idi);
00927 if (section[0][n].connect == 0) {
00928 cgi_error("Error exit: ElementConnectivity undefined in Element_t node '%s'.",
00929 section[0][n].name);
00930 return 1;
00931 }
00932
00933
00934 if (cgi_read_user_data(linked, section[0][n].id,
00935 §ion[0][n].nuser_data, §ion[0][n].user_data)) return 1;
00936
00937 }
00938 free(id);
00939
00940 return 0;
00941 }
00942
00943 int cgi_read_sol(int in_link, double parent_id, int *nsols, cgns_sol **sol) {
00944 double *id, *idf;
00945 int s, z, n, DataSize[3], linked;
00946
00947 if (cgi_get_nodes(parent_id, "FlowSolution_t", nsols, &id))
00948 return 1;
00949 if (*nsols<=0) {
00950 sol[0] = 0;
00951 return 0;
00952 }
00953
00954 sol[0] = CGNS_NEW(cgns_sol, (*nsols));
00955 for (s=0; s<(*nsols); s++) {
00956 sol[0][s].id = id[s];
00957 sol[0][s].link = cgi_read_link(id[s]);
00958 sol[0][s].in_link = in_link;
00959 linked = sol[0][s].link ? 1 : in_link;
00960
00961
00962 if (cgio_get_name(cg->cgio, sol[0][s].id, sol[0][s].name)) {
00963 cg_io_error("cgio_get_name");
00964 return 1;
00965 }
00966
00967
00968 if (cgi_read_location(sol[0][s].id, sol[0][s].name,
00969 &sol[0][s].location)) return 1;
00970
00971
00972 if (cgi_read_rind(sol[0][s].id, &sol[0][s].rind_planes)) return 1;
00973
00974
00975 if (cgi_datasize(Idim, CurrentDim, sol[0][s].location,
00976 sol[0][s].rind_planes, DataSize)) return 1;
00977
00978
00979 if (cgi_get_nodes(sol[0][s].id, "DataArray_t", &sol[0][s].nfields,
00980 &idf)) return 1;
00981 if (sol[0][s].nfields > 0) {
00982 sol[0][s].field = CGNS_NEW(cgns_array, sol[0][s].nfields);
00983 for (z=0; z<sol[0][s].nfields; z++) {
00984 sol[0][s].field[z].id = idf[z];
00985 sol[0][s].field[z].link = cgi_read_link(idf[z]);
00986 sol[0][s].field[z].in_link = linked;
00987
00988 if (cgi_read_array(&sol[0][s].field[z],"FlowSolution_t",
00989 sol[0][s].id)) return 1;
00990
00991
00992 if (sol[0][s].field[z].data_dim != Idim) {
00993 cgi_error("Wrong number of dimension in DataArray %s",sol[0][s].field[z].name);
00994 return 1;
00995 }
00996 for (n=0; n<Idim; n++) {
00997 if (sol[0][s].field[z].dim_vals[n]!=DataSize[n]) {
00998 cgi_error("Invalid field array dimension");
00999 return 1;
01000 }
01001 }
01002 if (strcmp(sol[0][s].field[z].data_type,"I4") &&
01003 strcmp(sol[0][s].field[z].data_type,"R4") &&
01004 strcmp(sol[0][s].field[z].data_type,"R8")) {
01005 cgi_error("Datatype %d not supported for flow solutions");
01006 return 1;
01007 }
01008 }
01009 free(idf);
01010 }
01011
01012
01013 if (cgi_read_DDD(linked, sol[0][s].id, &sol[0][s].ndescr,
01014 &sol[0][s].descr, &sol[0][s].data_class, &sol[0][s].units))
01015 return 1;
01016
01017
01018 if (cgi_read_user_data(linked, sol[0][s].id, &sol[0][s].nuser_data,
01019 &sol[0][s].user_data)) return 1;
01020 }
01021
01022 free(id);
01023
01024 return 0;
01025 }
01026
01027 int cgi_read_zconn(int in_link, double parent_id, cgns_zconn **zconn) {
01028 int nnod, n, linked;
01029 double *id;
01030
01031 if (cgi_get_nodes(parent_id, "ZoneGridConnectivity_t", &nnod, &id))
01032 return 1;
01033 if (nnod<=0) {
01034 zconn[0] = 0;
01035 return 0;
01036 }
01037 zconn[0] = CGNS_NEW(cgns_zconn, 1);
01038 zconn[0]->id = id[0];
01039 zconn[0]->link = cgi_read_link(id[0]);
01040 zconn[0]->in_link = in_link;
01041 linked = zconn[0]->link ? 1 : in_link;
01042 free(id);
01043
01044
01045 if (cgio_get_name(cg->cgio, zconn[0]->id, zconn[0]->name)) {
01046 cg_io_error("cgio_get_name");
01047 return 1;
01048 }
01049
01050
01051 if (cgi_get_nodes(zconn[0]->id, "OversetHoles_t", &zconn[0]->nholes, &id))
01052 return 1;
01053 if (zconn[0]->nholes > 0) {
01054 zconn[0]->hole = CGNS_NEW(cgns_hole,zconn[0]->nholes);
01055 for (n=0; n<zconn[0]->nholes; n++) {
01056 zconn[0]->hole[n].id = id[n];
01057 zconn[0]->hole[n].link = cgi_read_link(id[n]);
01058 zconn[0]->hole[n].in_link = linked;
01059 if (cgi_read_hole(&zconn[0]->hole[n])) return 1;
01060 }
01061 free(id);
01062 }
01063
01064
01065 if (cgi_get_nodes(zconn[0]->id, "GridConnectivity_t",
01066 &zconn[0]->nconns, &id)) return 1;
01067 if (zconn[0]->nconns > 0) {
01068 zconn[0]->conn = CGNS_NEW(cgns_conn,zconn[0]->nconns);
01069 for (n=0; n<zconn[0]->nconns; n++) {
01070 zconn[0]->conn[n].id = id[n];
01071 zconn[0]->conn[n].link = cgi_read_link(id[n]);
01072 zconn[0]->conn[n].in_link = linked;
01073 if (cgi_read_conn(&zconn[0]->conn[n])) return 1;
01074 }
01075 free(id);
01076 }
01077
01078
01079 if (cgi_get_nodes(zconn[0]->id, "GridConnectivity1to1_t",
01080 &zconn[0]->n1to1, &id)) return 1;
01081 if (zconn[0]->n1to1 >0) {
01082 zconn[0]->one21 = CGNS_NEW(cgns_1to1, zconn[0]->n1to1);
01083 for (n=0; n<zconn[0]->n1to1; n++) {
01084 zconn[0]->one21[n].id = id[n];
01085 zconn[0]->one21[n].link = cgi_read_link(id[n]);
01086 zconn[0]->one21[n].in_link = linked;
01087 if (cgi_read_1to1(&zconn[0]->one21[n])) return 1;
01088 }
01089 free(id);
01090 }
01091
01092
01093 if (cgi_get_nodes(zconn[0]->id, "Descriptor_t",
01094 &zconn[0]->ndescr, &id)) return 1;
01095 if (zconn[0]->ndescr>0) {
01096 zconn[0]->descr = CGNS_NEW(cgns_descr, zconn[0]->ndescr);
01097 for (n=0; n<zconn[0]->ndescr; n++) {
01098 zconn[0]->descr[n].id = id[n];
01099 zconn[0]->descr[n].link = cgi_read_link(id[n]);
01100 zconn[0]->descr[n].in_link = linked;
01101 if (cgi_read_string(id[n], zconn[0]->descr[n].name,
01102 &zconn[0]->descr[n].text)) return 1;
01103 }
01104 free(id);
01105 }
01106
01107
01108 if (cgi_read_user_data(linked, zconn[0]->id, &zconn[0]->nuser_data,
01109 &zconn[0]->user_data)) return 1;
01110
01111 return 0;
01112 }
01113
01114 int cgi_read_1to1(cgns_1to1 *one21) {
01115 int i, n, ndim, dim_vals[12];
01116 int nIA_t, nIR_t;
01117 int linked = one21->link ? 1 : one21->in_link;
01118 double *IA_id, *IR_id, *id;
01119 char_33 name, data_type;
01120 char *string_data;
01121 void *vdata;
01122
01123
01124 if (cgi_read_string(one21->id, one21->name, &string_data)) return 1;
01125 strcpy(one21->donor, string_data);
01126 free(string_data);
01127
01128
01129 one21->ptset.id=0;
01130 one21->ptset.link=0;
01131 one21->dptset.id=0;
01132 one21->dptset.link=0;
01133 if (cgi_get_nodes(one21->id, "IndexRange_t", &nIR_t, &IR_id)) return 1;
01134 for (i=0; i<nIR_t; i++) {
01135 if (cgio_get_name(cg->cgio, IR_id[i], name)) {
01136 cg_io_error("cgio_get_name");
01137 return 1;
01138 }
01139 if (strcmp(name, "PointRange")==0) {
01140 if (one21->ptset.id==0) {
01141 one21->ptset.id=IR_id[i];
01142 one21->ptset.link=cgi_read_link(IR_id[i]);
01143 one21->ptset.in_link=linked;
01144 one21->ptset.type=PointRange;
01145 } else {
01146 cgi_error("Multiple PointRange definition for %s",one21->name);
01147 return 1;
01148 }
01149 } else if (strcmp(name, "PointRangeDonor")==0) {
01150 if (one21->dptset.id==0) {
01151 one21->dptset.id=IR_id[i];
01152 one21->dptset.link=cgi_read_link(IR_id[i]);
01153 one21->dptset.in_link=linked;
01154 one21->dptset.type=PointRangeDonor;
01155 } else {
01156 cgi_error("Multiple PointRangeDonor definition for %s",one21->name);
01157 return 1;
01158 }
01159 }
01160 }
01161 if (nIR_t>0) free(IR_id);
01162 if (one21->ptset.id==0 || one21->dptset.id==0) {
01163 cgi_error("PointRange or PointRangeDonor undefined for %s",one21->name);
01164 return 1;
01165 }
01166
01167
01168 if (cgi_read_ptset(one21->id, &one21->ptset)) return 1;
01169
01170
01171 if (cgi_read_ptset(one21->id, &one21->dptset)) return 1;
01172
01173
01174 if (cgi_get_nodes(one21->id, "\"int[IndexDimension]\"", &nIA_t, &IA_id))
01175 return 1;
01176
01177 if (nIA_t==0) {
01178 one21->transform = CGNS_NEW(int, Idim);
01179
01180 for (i=0; i<Idim; i++) one21->transform[i]=i+1;
01181
01182 } else if (nIA_t<0 || nIA_t>1) {
01183 cgi_error("Invalid definition of transformation matrix for %s",one21->name);
01184 return 1;
01185
01186 } else if (nIA_t==1) {
01187 if (cgi_read_node(IA_id[0], name, data_type, &ndim, dim_vals,
01188 &vdata, READ_DATA)) {
01189 cgi_error("Error reading 1to1-connectivity transformation matrix");
01190 return 1;
01191 }
01192 one21->transform = (int *)vdata;
01193
01194 if (strcmp("Transform", name)) {
01195 cgi_error("The ADF name should be 'Transform' and not '%s'",name);
01196 return 1;
01197 }
01198 if (strcmp(data_type, "I4")!=0) {
01199 cgi_error("Data type '%s' not supported for Transform",data_type);
01200 return 1;
01201 }
01202 if (ndim != 1 || dim_vals[0] != Idim) {
01203 cgi_error("Error in dimension for node type Transform");
01204 return 1;
01205 }
01206 for (i=0; i<Idim; i++) {
01207 if (one21->transform[i] >Idim || one21->transform[i] <(-1*Idim)) {
01208 cgi_error("Invalid transformation matrix");
01209 return 1;
01210 }
01211 }
01212 free(IA_id);
01213 }
01214
01215 if (cgi_read_ordinal(one21->id, &one21->ordinal)) return 1;
01216
01217
01218 if (cgi_get_nodes(one21->id, "Descriptor_t", &one21->ndescr, &id))
01219 return 1;
01220 if (one21->ndescr>0) {
01221 one21->descr = CGNS_NEW(cgns_descr, one21->ndescr);
01222 for (n=0; n<one21->ndescr; n++) {
01223 one21->descr[n].id = id[n];
01224 one21->descr[n].link = cgi_read_link(id[n]);
01225 one21->descr[n].in_link = linked;
01226 if (cgi_read_string(id[n], one21->descr[n].name,
01227 &one21->descr[n].text)) return 1;
01228 }
01229 free(id);
01230 }
01231
01232
01233 if (cgi_read_user_data(linked, one21->id, &one21->nuser_data,
01234 &one21->user_data)) return 1;
01235
01236
01237 if (cgi_read_cprop(linked, one21->id, &one21->cprop)) return 1;
01238
01239 return 0;
01240 }
01241
01242 int cgi_read_conn(cgns_conn *conn) {
01243 int i, nchild;
01244 int linked = conn->link ? 1 : conn->in_link;
01245 char_33 name, parent_label;
01246 double *id, parent_id;
01247 char *string_data;
01248
01249
01250 if (cgi_read_string(conn->id, conn->name, &string_data)) return 1;
01251 if (cgi_check_strlen(string_data)) return 1;
01252 strcpy(conn->donor, string_data);
01253 free(string_data);
01254
01255
01256 if (cgi_read_location(conn->id, conn->name, &conn->location)) return 1;
01257 if (conn->location != Vertex && conn->location != CellCenter &&
01258 conn->location != FaceCenter && conn->location != IFaceCenter &&
01259 conn->location != JFaceCenter && conn->location != KFaceCenter) {
01260 cgi_error("Unsupported GridLocation %s for Connectivity %s",
01261 cg_GridLocationName(conn->location), conn->name);
01262 return 1;
01263 }
01264
01265
01266 conn->ptset.id=0;
01267 conn->ptset.link=0;
01268 if (cgi_get_nodes(conn->id, "IndexArray_t", &nchild, &id)) return 1;
01269 for (i=0; i<nchild; i++) {
01270 if (cgio_get_name(cg->cgio, id[i], name)) {
01271 cg_io_error("cgio_get_name");
01272 return 1;
01273 }
01274 if (strcmp(name, "PointList")==0) {
01275 if (conn->ptset.id==0) {
01276 conn->ptset.id=id[i];
01277 conn->ptset.link=cgi_read_link(id[i]);
01278 conn->ptset.in_link=linked;
01279 conn->ptset.type=PointList;
01280 if (cgi_read_ptset(conn->id, &conn->ptset)) return 1;
01281 } else {
01282 cgi_error("Multiple PointList definition for %s",conn->name);
01283 return 1;
01284 }
01285 }
01286 }
01287 if (nchild>0) free(id);
01288
01289
01290 if (cgi_get_nodes(conn->id, "IndexRange_t", &nchild, &id)) return 1;
01291 for (i=0; i<nchild; i++) {
01292 if (cgio_get_name(cg->cgio, id[i], name)) {
01293 cg_io_error("cgio_get_name");
01294 return 1;
01295 }
01296 if (strcmp(name, "PointRange")==0) {
01297 if (conn->ptset.id==0) {
01298 conn->ptset.id=id[i];
01299 conn->ptset.link=cgi_read_link(id[i]);
01300 conn->ptset.in_link=linked;
01301 conn->ptset.type=PointRange;
01302 if (cgi_read_ptset(conn->id, &conn->ptset)) return 1;
01303 } else {
01304 cgi_error("Multiple PointSet definition for %s",conn->name);
01305 return 1;
01306 }
01307 }
01308 }
01309 if (nchild>0) free(id);
01310
01311
01312 if (conn->ptset.id==0) {
01313 cgi_error("Niether PointRange nor PointList defined for GridConnectivity_t '%s'",
01314 conn->name);
01315 return 1;
01316 }
01317
01318
01319 parent_id = 0;
01320 parent_label[0]='\0';
01321 if (cg->version <1100 || cg->version>1200) {
01322
01323 parent_id = conn->id;
01324 strcpy(parent_label,"GridConnectivity_t");
01325
01326 } else {
01327
01328 if (cgi_get_nodes(conn->id, "StructuredDonor_t", &nchild, &id))
01329 return 1;
01330 if (nchild>1) {
01331 cgi_error("StructuredDonor_t defined more than once for GridConnectivity_t '%s'",
01332 conn->name);
01333 return 1;
01334 } else if (nchild==1) {
01335 parent_id = id[0];
01336 strcpy(parent_label,"StructuredDonor_t");
01337 free(id);
01338 }
01339 if (cgi_get_nodes(conn->id, "UnstructuredDonor_t", &nchild, &id))
01340 return 1;
01341 if (nchild>1) {
01342 cgi_error("UnstructuredDonor_t defined more than once for GridConnectivity_t '%s'",
01343 conn->name);
01344 return 1;
01345 } else if (nchild==1) {
01346 if (parent_id) {
01347 cgi_error("Multiple donors found under GridConnectivity_t '%s'",conn->name);
01348 return 1;
01349 }
01350 parent_id = id[0];
01351 strcpy(parent_label,"UnstructuredDonor_t");
01352 free(id);
01353 }
01354 if (!parent_id) {
01355 cgi_error("Error: Donor data undefined for GridConnectivity_t '%s'", conn->name);
01356 return 1;
01357 }
01358 }
01359
01360
01361 conn->dptset.id=0;
01362 conn->dptset.link=0;
01363 if (cgi_get_nodes(parent_id, "IndexArray_t", &nchild, &id)) return 1;
01364
01365 for (i=0; i<nchild; i++) {
01366 if (cgio_get_name(cg->cgio, id[i], name)) {
01367 cg_io_error("cgio_get_name");
01368 return 1;
01369 }
01370 if (strcmp(name, "PointListDonor") && strcmp(name, "CellListDonor"))
01371 continue;
01372 if (conn->dptset.id==0) {
01373 conn->dptset.id=id[i];
01374 conn->dptset.link=cgi_read_link(id[i]);
01375 conn->dptset.in_link=linked;
01376 if (strcmp(name, "PointListDonor")==0)
01377 conn->dptset.type=PointListDonor;
01378 else {
01379 if (strcmp(parent_label,"StructuredDonor_t")==0) {
01380 cgi_error("StructuredDonor_t doesn't support CellListDonor");
01381 return 1;
01382 }
01383 conn->dptset.type=CellListDonor;
01384 }
01385 if (cgi_read_ptset(parent_id, &conn->dptset)) return 1;
01386 } else {
01387 cgi_error("Multiple PointListDonor/CellListDonor definition for %s",conn->name);
01388 return 1;
01389 }
01390 }
01391 if (nchild>0) free(id);
01392
01393
01394
01395
01396
01397
01398
01399
01400 conn->interpolants=0;
01401 conn->narrays = 0;
01402 if (strcmp(parent_label,"StructuredDonor_t")) {
01403 if (cgi_get_nodes(parent_id, "DataArray_t", &nchild, &id)) return 1;
01404 conn->narrays = nchild;
01405 for (i=0; i<nchild; i++) {
01406 if (cgio_get_name(cg->cgio, id[i], name)) {
01407 cg_io_error("cgio_get_name");
01408 return 1;
01409 }
01410 if (strcmp(name, "InterpolantsDonor")) continue;
01411 if (conn->interpolants==0) {
01412 conn->interpolants = CGNS_NEW(cgns_array, 1);
01413 conn->interpolants->id = id[0];
01414 conn->interpolants->link = cgi_read_link(id[0]);
01415 conn->interpolants->in_link = linked;
01416 if (cgi_read_array(conn->interpolants, parent_label, parent_id))
01417 return 1;
01418 } else {
01419 cgi_error("InterpolantsDonor defined more than once for GridConnectivity_t '%s'",
01420 conn->name);
01421 return 1;
01422 }
01423 }
01424 if (nchild) free(id);
01425 }
01426
01427
01428 if (cgi_get_nodes(conn->id, "GridConnectivityType_t", &nchild, &id))
01429 return 1;
01430
01431 if (nchild==0) {
01432 conn->type = Overset;
01433 } else if (nchild<0 || nchild>1) {
01434 cgi_error("Invalid definition of GridConnectivityType_t for %s",conn->name);
01435 return 1;
01436 } else if (nchild==1) {
01437
01438 if (cgi_read_string(id[0], name, &string_data)) return 1;
01439 if (cgi_GridConnectivityType(string_data, &conn->type)) return 1;
01440 free(string_data);
01441 }
01442 if (nchild) free(id);
01443
01444
01445 if (cg->mode == CG_MODE_MODIFY && !linked &&
01446 cg->version >= 1100 && cg->version <= 1200) {
01447 if (cgio_move_node(cg->cgio, parent_id,
01448 conn->dptset.id, conn->id)) {
01449 cg_io_error("cgio_move_node");
01450 return 1;
01451 }
01452 if (conn->interpolants) {
01453 if (cgio_move_node(cg->cgio, parent_id,
01454 conn->interpolants->id, conn->id)) {
01455 cg_io_error("cgio_move_node");
01456 return 1;
01457 }
01458 }
01459 if (cgi_delete_node(conn->id, parent_id)) return 1;
01460 }
01461
01462
01463 conn->ordinal=0;
01464 if (cgi_read_ordinal(conn->id, &conn->ordinal)) return 1;
01465
01466
01467 if (cgi_get_nodes(conn->id, "Descriptor_t", &conn->ndescr, &id)) return 1;
01468 if (conn->ndescr>0) {
01469 conn->descr = CGNS_NEW(cgns_descr, conn->ndescr);
01470 for (i=0; i<conn->ndescr; i++) {
01471 conn->descr[i].id = id[i];
01472 conn->descr[i].link = cgi_read_link(id[i]);
01473 conn->descr[i].in_link = linked;
01474 if (cgi_read_string(id[i], conn->descr[i].name,
01475 &conn->descr[i].text)) return 1;
01476 }
01477 free(id);
01478 }
01479
01480
01481 if (cgi_read_cprop(linked, conn->id, &conn->cprop)) return 1;
01482
01483
01484 if (cgi_read_user_data(linked, conn->id, &conn->nuser_data,
01485 &conn->user_data)) return 1;
01486
01487 return 0;
01488 }
01489
01490 int cgi_read_cprop(int in_link, double parent_id, cgns_cprop **cprop) {
01491 int nchild, n, linked;
01492 double *id;
01493 char *type_name;
01494 char_33 name;
01495
01496
01497 if (cgi_get_nodes(parent_id, "GridConnectivityProperty_t", &nchild, &id)) return 1;
01498 if (nchild<=0) {
01499 cprop[0]=0;
01500 return 0;
01501 } else if (nchild>1) {
01502 cgi_error("Error: Multiple GridConnectivityProperty_t found...");
01503 free(id);
01504 return 1;
01505 }
01506 cprop[0] = CGNS_NEW(cgns_cprop, 1);
01507 cprop[0]->id = id[0];
01508 cprop[0]->link = cgi_read_link(id[0]);
01509 cprop[0]->in_link = in_link;
01510 linked = cprop[0]->link ? 1 : in_link;
01511 free(id);
01512
01513
01514 if (cgi_get_nodes(cprop[0]->id, "Descriptor_t", &nchild, &id)) return 1;
01515 cprop[0]->ndescr = 0;
01516 if (nchild>0) {
01517 cprop[0]->ndescr = nchild;
01518 cprop[0]->descr = CGNS_NEW(cgns_descr, nchild);
01519 for (n=0; n<nchild; n++) {
01520 cprop[0]->descr[n].id = id[n];
01521 cprop[0]->descr[n].link = cgi_read_link(id[n]);
01522 cprop[0]->descr[n].in_link = linked;
01523 if (cgi_read_string(id[n], cprop[0]->descr[n].name,
01524 &cprop[0]->descr[n].text)) return 1;
01525 }
01526 free(id);
01527 }
01528
01529
01530 if (cgi_read_user_data(linked, cprop[0]->id, &cprop[0]->nuser_data,
01531 &cprop[0]->user_data)) return 1;
01532
01533
01534 if (cgi_get_nodes(cprop[0]->id, "AverageInterface_t", &nchild, &id))
01535 return 1;
01536 if (nchild<=0) {
01537 cprop[0]->caverage = 0;
01538 } else if (nchild>1) {
01539 cgi_error("Error: Multiple AverageInterface_t found...");
01540 free(id);
01541 return 1;
01542 } else {
01543 cprop[0]->caverage = CGNS_NEW(cgns_caverage, 1);
01544 cprop[0]->caverage->id = id[0];
01545 cprop[0]->caverage->link = cgi_read_link(id[0]);
01546 cprop[0]->caverage->in_link = linked;
01547 in_link = cprop[0]->caverage->link ? 1 : linked;
01548 free(id);
01549
01550
01551 if (cgi_get_nodes(cprop[0]->caverage->id, "Descriptor_t", &nchild, &id))
01552 return 1;
01553 cprop[0]->caverage->ndescr = 0;
01554 if (nchild>0) {
01555 cprop[0]->caverage->ndescr = nchild;
01556 cprop[0]->caverage->descr = CGNS_NEW(cgns_descr, nchild);
01557 for (n=0; n<nchild; n++) {
01558 cprop[0]->caverage->descr[n].id = id[n];
01559 cprop[0]->caverage->descr[n].link = cgi_read_link(id[n]);
01560 cprop[0]->caverage->descr[n].in_link = in_link;
01561 if (cgi_read_string(id[n], cprop[0]->caverage->descr[n].name,
01562 &cprop[0]->caverage->descr[n].text)) return 1;
01563 }
01564 free(id);
01565 }
01566
01567
01568 if (cgi_read_user_data(in_link, cprop[0]->caverage->id,
01569 &cprop[0]->caverage->nuser_data, &cprop[0]->caverage->user_data))
01570 return 1;
01571
01572
01573 if (cgi_get_nodes(cprop[0]->caverage->id, "AverageInterfaceType_t",
01574 &nchild, &id)) return 1;
01575 if (nchild==0) {
01576 cgi_error("Error: AverageInterfaceType_t missing under AverageInterface_t");
01577 return 1;
01578 } else if (nchild >1) {
01579 cgi_error("File incorrect: multiple definition of AverageInterfaceType");
01580 free(id);
01581 return 1;
01582 } else {
01583 if (cgi_read_string(id[0], name, &type_name)) return 1;
01584 free(id);
01585 if (cgi_AverageInterfaceType(type_name, &cprop[0]->caverage->type))
01586 return 1;
01587 free(type_name);
01588 }
01589 }
01590
01591
01592 if (cgi_get_nodes(cprop[0]->id, "Periodic_t", &nchild, &id)) return 1;
01593 if (nchild<=0) {
01594 cprop[0]->cperio = 0;
01595 } else if (nchild>1) {
01596 cgi_error("Error: Multiple Periodic_t found...");
01597 free(id);
01598 return 1;
01599 } else {
01600 cprop[0]->cperio = CGNS_NEW(cgns_cperio, 1);
01601 cprop[0]->cperio->id = id[0];
01602 cprop[0]->cperio->link = cgi_read_link(id[0]);
01603 cprop[0]->cperio->in_link = linked;
01604 in_link = cprop[0]->cperio->link ? 1 : linked;
01605 free(id);
01606
01607
01608 if (cgi_read_DDD(in_link, cprop[0]->cperio->id,
01609 &cprop[0]->cperio->ndescr, &cprop[0]->cperio->descr,
01610 &cprop[0]->cperio->data_class, &cprop[0]->cperio->units))
01611 return 1;
01612
01613
01614 if (cgi_read_user_data(in_link, cprop[0]->cperio->id,
01615 &cprop[0]->cperio->nuser_data, &cprop[0]->cperio->user_data))
01616 return 1;
01617
01618
01619 if (cgi_get_nodes(cprop[0]->cperio->id, "DataArray_t", &nchild, &id))
01620 return 1;
01621 if (nchild==0) {
01622 cgi_error("Error: Three DataArray_t nodes missing under Periodic_t");
01623 return 1;
01624 } else if (nchild!=3) {
01625 cgi_error("Error: 3 DataArray_t required under Periodic_t");
01626 free(id);
01627 return 1;
01628 }
01629 cprop[0]->cperio->narrays = nchild;
01630 cprop[0]->cperio->array = CGNS_NEW(cgns_array, cprop[0]->cperio->narrays);
01631
01632 for (n=0; n<(cprop[0]->cperio->narrays); n++) {
01633 cgns_array *array;
01634 cprop[0]->cperio->array[n].id = id[n];
01635 cprop[0]->cperio->array[n].link = cgi_read_link(id[n]);
01636 cprop[0]->cperio->array[n].in_link = in_link;
01637
01638 if (cgi_read_array(&cprop[0]->cperio->array[n], "Periodic_t",
01639 cprop[0]->cperio->id)) return 1;
01640
01641 array = &cprop[0]->cperio->array[n];
01642
01643
01644 if (strcmp("RotationCenter",array->name) &&
01645 strcmp("RotationAngle",array->name) &&
01646 strcmp("Translation",array->name)) {
01647 cgi_error("Error: Wrong DataArray_t found under Periodic_t: '%s'",array->name);
01648 free(id);
01649 return 1;
01650 } else if (strcmp(array->data_type,"R4") || array->data_dim!=1
01651 || array->dim_vals[0]!=Pdim) {
01652 cgi_error("Error: Array '%s' incorrectly sized",array->name);
01653 free(id);
01654 return 1;
01655 }
01656 }
01657 free(id);
01658 }
01659 return 0;
01660 }
01661
01662 int cgi_read_hole(cgns_hole *hole) {
01663 int linked = hole->link ? 1 : hole->in_link;
01664 int nIA_t, nIR_t;
01665 double *IA_id, *IR_id, *id;
01666 int set, n;
01667
01668
01669 if (cgio_get_name(cg->cgio, hole->id, hole->name)) {
01670 cg_io_error("cgio_get_name");
01671 return 1;
01672 }
01673
01674
01675 if (cgi_read_location(hole->id, hole->name, &hole->location)) return 1;
01676 if (hole->location != Vertex && hole->location != CellCenter) {
01677 cgi_error("Unsupported GridLocation %s for Overset Hole %s",
01678 hole->location < 0 || hole->location >= NofValidGridLocation ?
01679 "<invalid>" : GridLocationName[hole->location], hole->name);
01680 return 1;
01681 }
01682
01683
01684 if (cgi_get_nodes(hole->id, "IndexArray_t", &nIA_t, &IA_id)) return 1;
01685 if (cgi_get_nodes(hole->id, "IndexRange_t", &nIR_t, &IR_id)) return 1;
01686
01687
01688 if (nIA_t==0 && nIR_t>0) {
01689 hole->nptsets = nIR_t;
01690 hole->ptset = CGNS_NEW(cgns_ptset, nIR_t);
01691 for (set=0; set<nIR_t; set++) {
01692 hole->ptset[set].id = IR_id[set];
01693 hole->ptset[set].link = cgi_read_link(IR_id[set]);
01694 hole->ptset[set].in_link = linked;
01695 hole->ptset[set].type = PointRange;
01696 if (cgi_read_ptset(hole->id, &hole->ptset[set])) return 1;
01697 }
01698 free(IR_id);
01699
01700
01701 } else if (nIA_t==1 && nIR_t==0) {
01702 hole->nptsets = 1;
01703 hole->ptset = CGNS_NEW(cgns_ptset, 1);
01704 hole->ptset[0].id = IA_id[0];
01705 hole->ptset[0].link = cgi_read_link(IA_id[0]);
01706 hole->ptset[0].in_link = linked;
01707 hole->ptset[0].type = PointList;
01708 if (cgi_read_ptset(hole->id, &hole->ptset[0])) return 1;
01709 free(IA_id);
01710
01711
01712 } else if (nIA_t==0 && nIR_t==0) {
01713 hole->nptsets = 1;
01714 hole->ptset = CGNS_NEW(cgns_ptset, 1);
01715 hole->ptset[0].npts = 0;
01716 hole->ptset[0].type = PointList;
01717 strcpy(hole->ptset[0].data_type, "I4");
01718 hole->ptset[0].id = 0;
01719 hole->ptset[0].link = 0;
01720 hole->ptset[0].in_link = linked;
01721 strcpy(hole->ptset[0].name,"Empty");
01722 } else {
01723 cgi_error("Overset hole '%s' defined incorrectly with %d IndexArray_t and %d IndexRange_t.",
01724 hole->name, nIA_t, nIR_t);
01725 return 1;
01726 }
01727
01728
01729 if (cgi_get_nodes(hole->id, "Descriptor_t", &hole->ndescr, &id)) return 1;
01730 if (hole->ndescr>0) {
01731 hole->descr = CGNS_NEW(cgns_descr, hole->ndescr);
01732 for (n=0; n<hole->ndescr; n++) {
01733 hole->descr[n].id = id[n];
01734 hole->descr[n].link = cgi_read_link(id[n]);
01735 hole->descr[n].in_link = linked;
01736 if (cgi_read_string(id[n], hole->descr[n].name,
01737 &hole->descr[n].text)) return 1;
01738 }
01739 free(id);
01740 }
01741
01742
01743 if (cgi_read_user_data(linked, hole->id, &hole->nuser_data,
01744 &hole->user_data)) return 1;
01745
01746 return 0;
01747 }
01748
01749 int cgi_read_zboco(int in_link, double parent_id, cgns_zboco **zboco) {
01750 int nnod, n, linked;
01751 double *id;
01752
01753 if (cgi_get_nodes(parent_id, "ZoneBC_t", &nnod, &id)) return 1;
01754 if (nnod<=0) {
01755 zboco[0] = 0;
01756 return 0;
01757 }
01758 zboco[0] = CGNS_NEW(cgns_zboco, 1);
01759 zboco[0]->id = id[0];
01760 zboco[0]->link = cgi_read_link(id[0]);
01761 zboco[0]->in_link = in_link;
01762 linked = zboco[0]->link ? 1 : in_link;
01763 free(id);
01764
01765
01766 if (cgio_get_name(cg->cgio, zboco[0]->id, zboco[0]->name)) {
01767 cg_io_error("cgio_get_name");
01768 return 1;
01769 }
01770
01771
01772 if (cgi_get_nodes(zboco[0]->id, "BC_t", &zboco[0]->nbocos, &id)) return 1;
01773 if (zboco[0]->nbocos > 0) {
01774 zboco[0]->boco = CGNS_NEW(cgns_boco,zboco[0]->nbocos);
01775 for (n=0; n<zboco[0]->nbocos; n++) {
01776 zboco[0]->boco[n].id = id[n];
01777 zboco[0]->boco[n].link = cgi_read_link(id[n]);
01778 zboco[0]->boco[n].in_link = linked;
01779 if (cgi_read_boco(&zboco[0]->boco[n])) return 1;
01780 }
01781 free(id);
01782 }
01783
01784
01785 if (cgi_read_DDD(linked, zboco[0]->id, &zboco[0]->ndescr, &zboco[0]->descr,
01786 &zboco[0]->data_class, &zboco[0]->units)) return 1;
01787
01788
01789 if (cgi_read_state(linked, zboco[0]->id, &zboco[0]->state)) return 1;
01790
01791
01792 if (cgi_read_user_data(linked, zboco[0]->id, &zboco[0]->nuser_data,
01793 &zboco[0]->user_data)) return 1;
01794
01795 return 0;
01796 }
01797
01798 int cgi_read_boco(cgns_boco *boco) {
01799 int ierr=0;
01800 int linked = boco->link ? 1 : boco->in_link;
01801 int nIA_t, nIR_t, n, i;
01802 double *IA_id, *IR_id;
01803 char *boconame;
01804 char_33 name;
01805 cgns_ptset *ptset;
01806
01807
01808 if (cgi_read_string(boco->id, boco->name, &boconame) ||
01809 cgi_BCType(boconame, &boco->type)) return 1;
01810 free(boconame);
01811
01812
01813 if (cgi_get_nodes(boco->id, "IndexArray_t", &nIA_t, &IA_id)) return 1;
01814 if (cgi_get_nodes(boco->id, "IndexRange_t", &nIR_t, &IR_id)) return 1;
01815
01816
01817 boco->ptset = 0;
01818
01819 for (n=0; n<nIR_t; n++) {
01820 if (cgio_get_name(cg->cgio, IR_id[n], name)) {
01821 cg_io_error("cgio_get_name");
01822 return 1;
01823 }
01824 if (strcmp(name,"PointRange") && strcmp(name,"ElementRange")) {
01825 cgi_error("Invalid name for IndexRange_t");
01826 return 1;
01827 }
01828 if (boco->ptset!=0) {
01829 cgi_error("Multiple definition of boundary patch found");
01830 return 1;
01831 }
01832 boco->ptset = CGNS_NEW(cgns_ptset, 1);
01833 if (strcmp(name,"ElementRange")==0)
01834 boco->ptset->type = ElementRange;
01835 else
01836 boco->ptset->type = PointRange;
01837 boco->location = GridLocationNull;
01838 boco->ptset->id=IR_id[n];
01839 boco->ptset->link=cgi_read_link(IR_id[n]);
01840 boco->ptset->in_link=linked;
01841 if (cgi_read_ptset(boco->id, boco->ptset)) return 1;
01842 }
01843 if (nIR_t) free(IR_id);
01844
01845 for (n=0; n<nIA_t; n++) {
01846 if (cgio_get_name(cg->cgio, IA_id[n], name)) {
01847 cg_io_error("cgio_get_name");
01848 return 1;
01849 }
01850 if (strcmp(name, "PointList") && strcmp(name,"ElementList")) continue;
01851
01852 if (boco->ptset!=0) {
01853 cgi_error("Multiple definition of boundary patch found");
01854 return 1;
01855 }
01856 boco->ptset = CGNS_NEW(cgns_ptset, 1);
01857 if (strcmp(name,"ElementList")==0)
01858 boco->ptset->type = ElementList;
01859 else
01860 boco->ptset->type = PointList;
01861 boco->location = GridLocationNull;
01862 boco->ptset->id = IA_id[n];
01863 boco->ptset->link = cgi_read_link(IA_id[n]);
01864 boco->ptset->in_link = linked;
01865 if (cgi_read_ptset(boco->id, boco->ptset)) return 1;
01866 }
01867
01868 if (boco->ptset==0) {
01869 cgi_error("Boundary condition patch '%s' defined incorrectly",boco->name);
01870 return 1;
01871 }
01872
01873
01874 if (cgi_read_family_name(linked, boco->id, boco->name, boco->family_name))
01875 return 1;
01876
01877
01878 boco->normal = 0;
01879 for (n=0; n<nIA_t; n++) {
01880 if (cgio_get_name(cg->cgio, IA_id[n], name)) {
01881 cg_io_error("cgio_get_name");
01882 return 1;
01883 }
01884 if (strcmp(name, "InwardNormalList")) continue;
01885
01886 boco->normal = CGNS_NEW(cgns_array, 1);
01887 boco->normal->id = IA_id[n];
01888 boco->normal->link = cgi_read_link(IA_id[n]);
01889 boco->normal->in_link = linked;
01890 if (cgi_read_node(IA_id[n], boco->normal->name, boco->normal->data_type,
01891 &boco->normal->data_dim, boco->normal->dim_vals, &boco->normal->data,
01892 READ_DATA)) {
01893 cgi_error("Error reading boco->normal");
01894 return 1;
01895 }
01896
01897
01898 boco->normal->ndescr = 0;
01899 boco->normal->units = 0;
01900 boco->normal->exponents = 0;
01901 boco->normal->convert = 0;
01902
01903
01904 if (boco->normal->data_dim!=2 || boco->normal->dim_vals[0]!=Pdim ||
01905 boco->normal->dim_vals[1]!=boco->ptset->size_of_patch ||
01906 (strcmp(boco->normal->data_type,"R4") &&
01907 strcmp(boco->normal->data_type,"R8"))) {
01908
01909
01910 cgi_error("InwardNormalList incorrectly defined for BC_t '%s'",boco->name);
01911 return 1;
01912 }
01913 break;
01914 }
01915 if (nIA_t) free(IA_id);
01916
01917
01918 boco->Nindex = 0;
01919 if (cgi_get_nodes(boco->id, "\"int[IndexDimension]\"", &nIA_t, &IA_id))
01920 return 1;
01921 for (n=0; n<nIA_t; n++) {
01922 char_33 data_type;
01923 int ndim, dim_vals[12];
01924 void *vdata;
01925
01926 if (cgio_get_name(cg->cgio, IA_id[n], name)) {
01927 cg_io_error("cgio_get_name");
01928 return 1;
01929 }
01930 if (strcmp(name, "InwardNormalIndex")) continue;
01931
01932 boco->index_id=IA_id[n];
01933
01934 if (cgi_read_node(IA_id[n], name, data_type, &ndim, dim_vals,
01935 &vdata, READ_DATA)) return 1;
01936 if (strcmp(data_type,"I4")!=0 || dim_vals[0]!=Idim) {
01937 cgi_error("InwardNormalIndex incorrectly defined for BC_t '%s'",boco->name);
01938 return 1;
01939 }
01940 boco->Nindex = (int *)vdata;
01941 break;
01942 }
01943 if (nIA_t) free(IA_id);
01944
01945
01946
01947
01948 if (cg->version>1200) {
01949 if (cgi_read_location(boco->id, boco->name, &boco->location)) return 1;
01950
01951 } else if (!boco->location) {
01952
01953 if (boco->ndataset) {
01954
01955 if (cgi_read_location(boco->dataset[0].id, boco->dataset[0].name,
01956 &boco->location)) return 1;
01957 } else {
01958 if (!boco->location) boco->location=Vertex;
01959 }
01960 }
01961
01962
01963 if (cgi_read_dataset(linked, boco->id, &boco->ndataset, &boco->dataset))
01964 return 1;
01965
01966
01967 for (n=0; n<boco->ndataset; n++) {
01968 ptset = boco->dataset[n].ptset ? boco->dataset[n].ptset : boco->ptset;
01969 if (boco->dataset[n].dirichlet) {
01970 for (i=0; i<boco->dataset[n].dirichlet->narrays; i++) {
01971 cgns_array array = boco->dataset[n].dirichlet->array[i];
01972 if (array.data_dim!=1 || (array.dim_vals[0] != 1 &&
01973 array.dim_vals[0] != ptset->size_of_patch)) {
01974 cgi_error("Wrong array size for Dirichlet data");
01975 return 1;
01976 }
01977 }
01978 }
01979 if (boco->dataset[n].neumann) {
01980 for (i=0; i<boco->dataset[n].neumann->narrays; i++) {
01981 cgns_array array = boco->dataset[n].neumann->array[i];
01982 if (array.data_dim!=1 || (array.dim_vals[0] != 1 &&
01983 array.dim_vals[0] != ptset->size_of_patch)) {
01984 cgi_error("Wrong array size for Neumann data");
01985 return 1;
01986 }
01987 }
01988 }
01989 }
01990
01991 if (cg->version <= 1270) {
01992 const char *name;
01993 int len;
01994 double dummy_id;
01995 if (cg->mode == CG_MODE_MODIFY && !linked) {
01996 ierr = cgio_get_node_id(cg->cgio, boco->id, "GridLocation",
01997 &dummy_id);
01998 if (!ierr) cgi_delete_node(boco->id, dummy_id);
01999 if (boco->location != Vertex) {
02000 name = GridLocationName[boco->location];
02001 len = strlen (name);
02002 if (cgi_new_node(boco->id, "GridLocation", "GridLocation_t",
02003 &dummy_id, "C1", 1, &len, name))
02004 return 1;
02005 }
02006 }
02007 }
02008
02009
02010 if (cgi_read_DDD(linked, boco->id, &boco->ndescr, &boco->descr,
02011 &boco->data_class, &boco->units)) return 1;
02012
02013
02014 if (cgi_read_state(linked, boco->id, &boco->state)) return 1;
02015
02016
02017 if (cgi_read_ordinal(boco->id, &boco->ordinal)) return 1;
02018
02019
02020 if (cgi_read_bprop(linked, boco->id, &boco->bprop)) return 1;
02021
02022
02023 if (cgi_read_user_data(linked, boco->id, &boco->nuser_data,
02024 &boco->user_data)) return 1;
02025
02026 return 0;
02027 }
02028
02029 int cgi_read_bprop(int in_link, double parent_id, cgns_bprop **bprop) {
02030 int nchild, n, linked;
02031 double *id;
02032 char *type_name;
02033 char_33 name;
02034
02035
02036 if (cgi_get_nodes(parent_id, "BCProperty_t", &nchild, &id)) return 1;
02037 if (nchild<=0) {
02038 bprop[0]=0;
02039 return 0;
02040 } else if (nchild>1) {
02041 cgi_error("Error: Multiple BCProperty_t found...");
02042 free(id);
02043 return 1;
02044 }
02045 bprop[0] = CGNS_NEW(cgns_bprop, 1);
02046 bprop[0]->id = id[0];
02047 bprop[0]->link = cgi_read_link(id[0]);
02048 bprop[0]->in_link = in_link;
02049 linked = bprop[0]->link ? 1 : in_link;
02050 free(id);
02051
02052
02053 if (cgi_get_nodes(bprop[0]->id, "Descriptor_t", &nchild, &id)) return 1;
02054 bprop[0]->ndescr = 0;
02055 if (nchild>0) {
02056 bprop[0]->ndescr = nchild;
02057 bprop[0]->descr = CGNS_NEW(cgns_descr, nchild);
02058 for (n=0; n<nchild; n++) {
02059 bprop[0]->descr[n].id = id[n];
02060 bprop[0]->descr[n].link = cgi_read_link(id[n]);
02061 bprop[0]->descr[n].in_link = linked;
02062 if (cgi_read_string(id[n], bprop[0]->descr[n].name,
02063 &bprop[0]->descr[n].text)) return 1;
02064 }
02065 free(id);
02066 }
02067
02068
02069 if (cgi_read_user_data(linked, bprop[0]->id, &bprop[0]->nuser_data,
02070 &bprop[0]->user_data)) return 1;
02071
02072
02073 if (cgi_get_nodes(bprop[0]->id, "WallFunction_t", &nchild, &id)) return 1;
02074 if (nchild<=0) {
02075 bprop[0]->bcwall = 0;
02076 } else if (nchild>1) {
02077 cgi_error("Error: Multiple WallFunction_t found...");
02078 free(id);
02079 return 1;
02080 } else {
02081 bprop[0]->bcwall = CGNS_NEW(cgns_bcwall, 1);
02082 bprop[0]->bcwall->id = id[0];
02083 bprop[0]->bcwall->link = cgi_read_link(id[0]);
02084 bprop[0]->bcwall->in_link = linked;
02085 in_link = bprop[0]->bcwall->link ? 1 : linked;
02086 free(id);
02087
02088
02089 if (cgi_get_nodes(bprop[0]->bcwall->id, "Descriptor_t", &nchild, &id))
02090 return 1;
02091 bprop[0]->bcwall->ndescr = 0;
02092 if (nchild>0) {
02093 bprop[0]->bcwall->ndescr = nchild;
02094 bprop[0]->bcwall->descr = CGNS_NEW(cgns_descr, nchild);
02095 for (n=0; n<nchild; n++) {
02096 bprop[0]->bcwall->descr[n].id = id[n];
02097 bprop[0]->bcwall->descr[n].link = cgi_read_link(id[n]);
02098 bprop[0]->bcwall->descr[n].in_link = in_link;
02099 if (cgi_read_string(id[n], bprop[0]->bcwall->descr[n].name,
02100 &bprop[0]->bcwall->descr[n].text)) return 1;
02101 }
02102 free(id);
02103 }
02104
02105
02106 if (cgi_read_user_data(in_link, bprop[0]->bcwall->id,
02107 &bprop[0]->bcwall->nuser_data, &bprop[0]->bcwall->user_data))
02108 return 1;
02109
02110
02111 if (cgi_get_nodes(bprop[0]->bcwall->id, "WallFunctionType_t",
02112 &nchild, &id)) return 1;
02113 if (nchild==0) {
02114 cgi_error("Error: WallFunctionType_t missing under WallFunction_t");
02115 return 1;
02116 } else if (nchild >1) {
02117 cgi_error("File incorrect: multiple definition of WallFunctionType");
02118 free(id);
02119 return 1;
02120 } else {
02121 if (cgi_read_string(id[0], name, &type_name)) return 1;
02122 free(id);
02123 if (cgi_WallFunctionType(type_name, &bprop[0]->bcwall->type)) return 1;
02124 free(type_name);
02125 }
02126 }
02127
02128
02129 if (cgi_get_nodes(bprop[0]->id, "Area_t", &nchild, &id)) return 1;
02130 if (nchild<=0) {
02131 bprop[0]->bcarea = 0;
02132 } else if (nchild>1) {
02133 cgi_error("Error: Multiple Area_t found...");
02134 free(id);
02135 return 1;
02136 } else {
02137 bprop[0]->bcarea = CGNS_NEW(cgns_bcarea, 1);
02138 bprop[0]->bcarea->id = id[0];
02139 bprop[0]->bcarea->link = cgi_read_link(id[0]);
02140 bprop[0]->bcarea->in_link = linked;
02141 in_link = bprop[0]->bcarea->link ? 1 : linked;
02142 free(id);
02143
02144
02145 if (cgi_get_nodes(bprop[0]->bcarea->id, "Descriptor_t", &nchild, &id))
02146 return 1;
02147 bprop[0]->bcarea->ndescr = 0;
02148 if (nchild>0) {
02149 bprop[0]->bcarea->ndescr = nchild;
02150 bprop[0]->bcarea->descr = CGNS_NEW(cgns_descr, nchild);
02151 for (n=0; n<nchild; n++) {
02152 bprop[0]->bcarea->descr[n].id = id[n];
02153 bprop[0]->bcarea->descr[n].link = cgi_read_link(id[n]);
02154 bprop[0]->bcarea->descr[n].in_link = in_link;
02155 if (cgi_read_string(id[n], bprop[0]->bcarea->descr[n].name,
02156 &bprop[0]->bcarea->descr[n].text)) return 1;
02157 }
02158 free(id);
02159 }
02160
02161
02162 if (cgi_read_user_data(in_link, bprop[0]->bcarea->id,
02163 &bprop[0]->bcarea->nuser_data, &bprop[0]->bcarea->user_data))
02164 return 1;
02165
02166
02167 if (cgi_get_nodes(bprop[0]->bcarea->id, "AreaType_t", &nchild, &id))
02168 return 1;
02169 if (nchild==0) {
02170 cgi_error("Error: AreaType_t missing under Area_t");
02171 return 1;
02172 } else if (nchild >1) {
02173 cgi_error("File incorrect: multiple definition of AreaType");
02174 free(id);
02175 return 1;
02176 } else {
02177 if (cgi_read_string(id[0], name, &type_name)) return 1;
02178 free(id);
02179 if (cgi_AreaType(type_name, &bprop[0]->bcarea->type)) return 1;
02180 free(type_name);
02181 }
02182
02183
02184 if (cgi_get_nodes(bprop[0]->bcarea->id, "DataArray_t", &nchild, &id))
02185 return 1;
02186 if (nchild==0) {
02187 cgi_error("Error: SurfaceArea and RegionName missing under Area_t");
02188 return 1;
02189 } else if (nchild!=2) {
02190 cgi_error("Error: 2 DataArray_t (SurfaceArea & RegionName) required under Area_t");
02191 free(id);
02192 return 1;
02193 }
02194 bprop[0]->bcarea->narrays = nchild;
02195 bprop[0]->bcarea->array = CGNS_NEW(cgns_array, bprop[0]->bcarea->narrays);
02196
02197 for (n=0; n<(bprop[0]->bcarea->narrays); n++) {
02198 cgns_array *array;
02199 bprop[0]->bcarea->array[n].id = id[n];
02200 bprop[0]->bcarea->array[n].link = cgi_read_link(id[n]);
02201 bprop[0]->bcarea->array[n].in_link = in_link;
02202
02203 if (cgi_read_array(&bprop[0]->bcarea->array[n], "Area_t",
02204 bprop[0]->bcarea->id)) return 1;
02205
02206
02207 array = &bprop[0]->bcarea->array[n];
02208 if ((strcmp("SurfaceArea",array->name)==0 && (strcmp(array->data_type,"R4")
02209 || array->data_dim!=1 || array->dim_vals[0]!=1)) ||
02210 (strcmp("RegionName",array->name)==0 && (strcmp(array->data_type,"C1")
02211 || array->data_dim!=1 || array->dim_vals[0]!=32)) ){
02212 cgi_error("Error: Array '%s' incorrectly sized",array->name);
02213 free(id);
02214 return 1;
02215 } else if (strcmp("SurfaceArea",array->name) && strcmp("RegionName",array->name)) {
02216 cgi_error("Error: Wrong DataArray_t found under Area_t: '%s'",array->name);
02217 free(id);
02218 return 1;
02219 }
02220 }
02221 free(id);
02222 }
02223 return 0;
02224 }
02225
02226 int cgi_read_dataset(int in_link, double parent_id, int *ndataset,
02227 cgns_dataset **dataset) {
02228 int n, i, nnod, linked;
02229 double *id, *ids;
02230 char_33 name;
02231 char *string_data;
02232 double *IA_id, *IR_id;
02233 int nIA_t, nIR_t, nn;
02234
02235
02236 if (cgi_get_nodes(parent_id, "BCDataSet_t", ndataset, &id)) return 1;
02237 if (*ndataset<=0) {
02238 dataset[0]=0;
02239 return 0;
02240 }
02241 dataset[0]=CGNS_NEW(cgns_dataset, (*ndataset));
02242 for (n=0; n<*ndataset; n++) {
02243 dataset[0][n].id = id[n];
02244 dataset[0][n].link = cgi_read_link(id[n]);
02245 dataset[0][n].in_link = in_link;
02246 linked = dataset[0][n].link ? 1 : in_link;
02247 if (cgi_read_string(dataset[0][n].id, dataset[0][n].name, &string_data) ||
02248 cgi_BCType(string_data, &dataset[0][n].type)) return 1;
02249 free(string_data);
02250
02251
02252 if (cgi_read_DDD(linked, dataset[0][n].id, &dataset[0][n].ndescr,
02253 &dataset[0][n].descr, &dataset[0][n].data_class,
02254 &dataset[0][n].units)) return 1;
02255
02256
02257 if (cgi_read_state(linked, dataset[0][n].id, &dataset[0][n].state))
02258 return 1;
02259
02260
02261 dataset[0][n].dirichlet=dataset[0][n].neumann=0;
02262 if (cgi_get_nodes(dataset[0][n].id, "BCData_t", &nnod, &ids)) return 1;
02263 if (nnod>0) {
02264
02265 for (i=0; i<nnod; i++) {
02266
02267 if (cgio_get_name(cg->cgio, ids[i], name)) {
02268 cg_io_error("cgio_get_name");
02269 return 1;
02270 }
02271 if (strcmp(name,"DirichletData")==0) {
02272 if (dataset[0][n].dirichlet!=0) {
02273 cgi_error("Dirichet Data defined more than once...");
02274 return 1;
02275 }
02276 dataset[0][n].dirichlet=CGNS_NEW(cgns_bcdata, 1);
02277 dataset[0][n].dirichlet->id = ids[i];
02278 dataset[0][n].dirichlet->link = cgi_read_link(ids[i]);
02279 dataset[0][n].dirichlet->in_link = linked;
02280 strcpy(dataset[0][n].dirichlet->name,"DirichletData");
02281 if (cgi_read_bcdata(dataset[0][n].dirichlet)) return 1;
02282 } else if (strcmp(name,"NeumannData")==0) {
02283 if (dataset[0][n].neumann!=0) {
02284 cgi_error("Neumann Data defined more than once...");
02285 return 1;
02286 }
02287 dataset[0][n].neumann=CGNS_NEW(cgns_bcdata, 1);
02288 dataset[0][n].neumann->id = ids[i];
02289 dataset[0][n].neumann->link = cgi_read_link(ids[i]);
02290 dataset[0][n].neumann->in_link = linked;
02291 strcpy(dataset[0][n].neumann->name,"NeumannData");
02292 if (cgi_read_bcdata(dataset[0][n].neumann)) return 1;
02293 }
02294 }
02295 free(ids);
02296 }
02297
02298
02299 if (cgi_read_user_data(linked, dataset[0][n].id,
02300 &dataset[0][n].nuser_data, &dataset[0][n].user_data)) return 1;
02301
02302
02303 if (cgi_read_location(dataset[0][n].id, dataset[0][n].name,
02304 &dataset[0][n].location)) return 1;
02305
02306
02307
02308
02309
02310 if (cgi_get_nodes(dataset[0][n].id, "IndexArray_t", &nIA_t,
02311 &IA_id)) return 1;
02312 if (cgi_get_nodes(dataset[0][n].id, "IndexRange_t", &nIR_t,
02313 &IR_id)) return 1;
02314
02315
02316 dataset[0][n].ptset = 0;
02317
02318 for (nn=0; nn<nIR_t; nn++)
02319 {
02320 if (cgio_get_name(cg->cgio, IR_id[nn], name)) {
02321 cg_io_error("cgio_get_name");
02322 return 1;
02323 }
02324
02325 if (strcmp(name,"PointRange") && strcmp(name,"ElementRange"))
02326 {
02327 cgi_error("Invalid name for IndexRange_t");
02328 return 1;
02329 }
02330 if (dataset[0][n].ptset!=0) {
02331 cgi_error("Multiple definition of boundary patch found");
02332 return 1;
02333 }
02334 dataset[0][n].ptset = CGNS_NEW(cgns_ptset, 1);
02335 if (strcmp(name,"ElementRange")==0)
02336 dataset[0][n].ptset->type = ElementRange;
02337 else
02338 dataset[0][n].ptset->type = PointRange;
02339 dataset[0][n].ptset->id=IR_id[nn];
02340 dataset[0][n].ptset->link=cgi_read_link(IR_id[nn]);
02341 dataset[0][n].ptset->in_link=linked;
02342 if (cgi_read_ptset(dataset[0][n].id, dataset[0][n].ptset))
02343 return 1;
02344 }
02345 if (nIR_t) free(IR_id);
02346
02347 for (nn=0; nn<nIA_t; nn++)
02348 {
02349 if (cgio_get_name(cg->cgio, IA_id[nn], name)) {
02350 cg_io_error("cgio_get_name");
02351 return 1;
02352 }
02353 if (strcmp(name, "PointList") && strcmp(name,"ElementList"))
02354 continue;
02355
02356 if (dataset[0][n].ptset!=0) {
02357 cgi_error("Multiple definition of boundary patch found");
02358 return 1;
02359 }
02360 dataset[0][n].ptset = CGNS_NEW(cgns_ptset, 1);
02361 if (strcmp(name,"ElementList")==0)
02362 dataset[0][n].ptset->type = ElementList;
02363 else
02364 dataset[0][n].ptset->type = PointList;
02365 dataset[0][n].ptset->id = IA_id[nn];
02366 dataset[0][n].ptset->link = cgi_read_link(IA_id[nn]);
02367 dataset[0][n].ptset->in_link = linked;
02368 if (cgi_read_ptset(dataset[0][n].id, dataset[0][n].ptset))
02369 return 1;
02370 }
02371
02372 if (nIA_t) free(IA_id);
02373
02374 }
02375 free(id);
02376
02377 return 0;
02378 }
02379
02380 int cgi_read_bcdata(cgns_bcdata *bcdata) {
02381 int n, linked = bcdata->link ? 1 : bcdata->in_link;
02382 double *id;
02383
02384
02385 if (cgi_get_nodes(bcdata->id, "DataArray_t", &bcdata->narrays, &id))
02386 return 1;
02387 if (bcdata->narrays>0) {
02388 bcdata->array = CGNS_NEW(cgns_array, bcdata->narrays);
02389
02390 for (n=0; n<bcdata->narrays; n++) {
02391 bcdata->array[n].id = id[n];
02392 bcdata->array[n].link = cgi_read_link(id[n]);
02393 bcdata->array[n].in_link = linked;
02394 cgi_read_array(&bcdata->array[n],"BCData_t",bcdata->id);
02395 }
02396 free(id);
02397 }
02398
02399
02400 if (cgi_read_DDD(linked, bcdata->id, &bcdata->ndescr, &bcdata->descr,
02401 &bcdata->data_class, &bcdata->units)) return 1;
02402
02403
02404 if (cgi_read_user_data(linked, bcdata->id, &bcdata->nuser_data,
02405 &bcdata->user_data)) return 1;
02406
02407 return 0;
02408 }
02409
02410 int cgi_read_ptset(double parent_id, cgns_ptset *ptset) {
02411 int ndim, dim_vals[12];
02412 void **dummy=0;
02413
02414
02415 if (cgi_read_node(ptset->id, ptset->name, ptset->data_type, &ndim, dim_vals,
02416 dummy, SKIP_DATA)) {
02417 cgi_error("Error reading ptset");
02418 return 1;
02419 }
02420
02421
02422 if (cg->version <= 1200 && ndim == 1 &&
02423 (ptset->type == ElementRange || ptset->type == ElementList)) {
02424 ndim = 2;
02425 dim_vals[1]=dim_vals[0];
02426 dim_vals[0]=Idim;
02427 if (cg->mode == CG_MODE_MODIFY && ptset->link == 0 &&
02428 ptset->in_link == 0) {
02429 if (cgio_set_dimensions(cg->cgio, ptset->id, "I4", 2, dim_vals)) {
02430 cg_io_error("cgio_set_dimensions");
02431 return 1;
02432 }
02433 }
02434 }
02435
02436
02437 if (ptset->type<0 || ptset->type>=NofValidPointSetTypes) {
02438 cgi_error("Invalid point set type: '%s'",ptset->name);
02439 return 1;
02440 }
02441
02442
02443 if (strcmp(ptset->data_type,"I4") && (ptset->type!=PointListDonor ||
02444 cg->version>1200)) {
02445 cgi_error("Data type %s not supported for point set type %d",
02446 ptset->data_type, ptset->type);
02447 return 1;
02448 }
02449
02450
02451 if (!(ndim==2 && dim_vals[0]>0 && dim_vals[1]>0)) {
02452 cgi_error("Invalid definition of point set: ptset->type='%s', ndim=%d, dim_vals[0]=%d",
02453 PointSetTypeName[ptset->type], ndim, dim_vals[0]);
02454 return 1;
02455 }
02456
02457
02458 ptset->npts = dim_vals[1];
02459
02460
02461 if (ptset->type == PointList || ptset->type == ElementList ||
02462 ptset->type == PointListDonor)
02463 ptset->size_of_patch = ptset->npts;
02464
02465 else {
02466
02467 int i, size=1;
02468 int *pnts;
02469 for (i=0; i<ndim; i++) size*=dim_vals[i];
02470 if (size<=0) {
02471 cgi_error("Error reading node %s",ptset->name);
02472 return 1;
02473 }
02474 if (strcmp(ptset->data_type,"I4")!=0) {
02475 cgi_error("Invalid datatype for a range pointset");
02476 return 1;
02477 }
02478 pnts = CGNS_NEW(int, size);
02479 if (cgio_read_all_data(cg->cgio, ptset->id, pnts)) {
02480 cg_io_error("cgio_read_all_data");
02481 return 1;
02482 }
02483 ptset->size_of_patch = 1;
02484 for (i=0; i<Idim; i++) ptset->size_of_patch *= (pnts[i+Idim]-pnts[i]+1);
02485 free(pnts);
02486 }
02487 return 0;
02488 }
02489
02490 int cgi_read_equations(int in_link, double parent_id,
02491 cgns_equations **equations) {
02492 double *id;
02493 int n, nnod, ndim, dim_vals[12], linked;
02494 char *string_data;
02495 char_33 name, data_type;
02496 void *vdata;
02497
02498 if (cgi_get_nodes(parent_id, "FlowEquationSet_t", &nnod, &id)) return 1;
02499 if (nnod<=0) {
02500 equations[0]=0;
02501 return 0;
02502 }
02503 equations[0] = CGNS_NEW(cgns_equations, 1);
02504 equations[0]->id = id[0];
02505 equations[0]->link = cgi_read_link(id[0]);
02506 equations[0]->in_link = in_link;
02507 linked = equations[0]->link ? 1 : in_link;
02508 free(id);
02509 strcpy(equations[0]->name, "FlowEquationSet");
02510
02511
02512 equations[0]->governing = 0;
02513 if (cgi_get_nodes(equations[0]->id, "GoverningEquations_t", &nnod, &id))
02514 return 1;
02515 if (nnod>0) {
02516 equations[0]->governing = CGNS_NEW(cgns_governing,1);
02517 equations[0]->governing->id = id[0];
02518 equations[0]->governing->link = cgi_read_link(id[0]);
02519 equations[0]->governing->in_link = linked;
02520 if (cgi_read_string(id[0], equations[0]->governing->name, &string_data) ||
02521 cgi_GoverningEquationsType(string_data, &equations[0]->governing->type))
02522 return 1;
02523 free(string_data);
02524 free(id);
02525
02526
02527 equations[0]->governing->diffusion_model=0;
02528
02529
02530 if (cgi_get_nodes(equations[0]->governing->id,
02531 "\"int[1+...+IndexDimension]\"", &nnod, &id)) return 1;
02532 if (nnod>0) {
02533 if (cgi_read_node(id[0], name, data_type, &ndim,
02534 &equations[0]->governing->dim_vals,
02535 &vdata, READ_DATA)) {
02536 cgi_error("Error reading diffusion model");
02537 return 1;
02538 }
02539 if (ndim!=1 || equations[0]->governing->dim_vals<=0 ||
02540 strcmp(data_type,"I4")) {
02541 cgi_error("Diffusion Model '%s' defined incorrectly",name);
02542 return 1;
02543 }
02544 equations[0]->governing->diffusion_model = (int *)vdata;
02545 free(id);
02546 }
02547
02548
02549 if (cgi_get_nodes(equations[0]->governing->id, "Descriptor_t",
02550 &equations[0]->governing->ndescr, &id)) return 1;
02551 if (equations[0]->governing->ndescr>0) {
02552 equations[0]->governing->descr = CGNS_NEW(cgns_descr, equations[0]->governing->ndescr);
02553 for (n=0; n<equations[0]->governing->ndescr; n++) {
02554 equations[0]->governing->descr[n].id = id[n];
02555 equations[0]->governing->descr[n].link = cgi_read_link(id[n]);
02556 equations[0]->governing->descr[n].in_link = linked;
02557 if (cgi_read_string(id[n], equations[0]->governing->descr[n].name,
02558 &equations[0]->governing->descr[n].text)) return 1;
02559 }
02560 free(id);
02561 }
02562
02563
02564 if (cgi_read_user_data(linked, equations[0]->governing->id,
02565 &equations[0]->governing->nuser_data,
02566 &equations[0]->governing->user_data)) return 1;
02567 }
02568
02569
02570 if (cgi_read_model(linked, equations[0]->id, "GasModel_t",
02571 &equations[0]->gas)) return 1;
02572
02573
02574 if (cgi_read_model(linked, equations[0]->id, "ViscosityModel_t",
02575 &equations[0]->visc)) return 1;
02576
02577
02578 if (cgi_read_model(linked, equations[0]->id, "ThermalConductivityModel_t",
02579 &equations[0]->conduct)) return 1;
02580
02581
02582 if (cgi_read_model(linked, equations[0]->id, "TurbulenceClosure_t",
02583 &equations[0]->closure)) return 1;
02584
02585
02586 if (cgi_read_model(linked, equations[0]->id, "TurbulenceModel_t",
02587 &equations[0]->turbulence)) return 1;
02588
02589
02590 if (equations[0]->turbulence) {
02591 equations[0]->turbulence->diffusion_model=0;
02592
02593
02594 if (cgi_get_nodes(equations[0]->turbulence->id,
02595 "\"int[1+...+IndexDimension]\"", &nnod, &id)) return 1;
02596 if (nnod>0) {
02597 if (cgi_read_node(id[0], name, data_type, &ndim,
02598 &equations[0]->turbulence->dim_vals,
02599 &vdata, READ_DATA)) {
02600 cgi_error("Error reading Turbulence Diffusion Model");
02601 return 1;
02602 }
02603 if (ndim!=1 || equations[0]->turbulence->dim_vals<=0 ||
02604 strcmp(data_type,"I4")) {
02605 cgi_error("Diffusion Model '%s' defined incorrectly",name);
02606 return 1;
02607 }
02608 equations[0]->turbulence->diffusion_model = (int *)vdata;
02609 free(id);
02610 }
02611 }
02612
02613
02614 if (cgi_read_model(linked, equations[0]->id, "ThermalRelaxationModel_t",
02615 &equations[0]->relaxation)) return 1;
02616
02617
02618 if (cgi_read_model(linked, equations[0]->id, "ChemicalKineticsModel_t",
02619 &equations[0]->chemkin)) return 1;
02620
02621
02622 equations[0]->equation_dim = 0;
02623 if (cgi_get_nodes(equations[0]->id, "\"int\"", &nnod, &id)) return 1;
02624 if (nnod>0) {
02625 if (cgi_read_node(id[0], name, data_type, &ndim, dim_vals,
02626 &vdata, READ_DATA)) {
02627 cgi_error("Error reading base");
02628 return 1;
02629 }
02630
02631 if (strcmp(name,"EquationDimension") || strcmp(data_type, "I4") ||
02632 ndim!=1 || dim_vals[0]!=1) {
02633 cgi_error("Error reading equation dimension for Flow Equation Set");
02634 return 1;
02635 }
02636 equations[0]->equation_dim = *((int *)vdata);
02637 free(vdata);
02638 free(id);
02639 }
02640
02641
02642 if (cgi_read_DDD(linked, equations[0]->id, &equations[0]->ndescr,
02643 &equations[0]->descr, &equations[0]->data_class, &equations[0]->units))
02644 return 1;
02645
02646
02647 if (cgi_read_user_data(linked, equations[0]->id, &equations[0]->nuser_data,
02648 &equations[0]->user_data)) return 1;
02649
02650
02651 if (cgi_read_model(linked, equations[0]->id, "EMElectricFieldModel_t",
02652 &equations[0]->elecfield)) return 1;
02653
02654
02655 if (cgi_read_model(linked, equations[0]->id, "EMMagneticFieldModel_t",
02656 &equations[0]->magnfield)) return 1;
02657
02658
02659 if (cgi_read_model(linked, equations[0]->id, "EMConductivityModel_t",
02660 &equations[0]->emconduct)) return 1;
02661
02662 return 0;
02663 }
02664
02665 int cgi_read_model(int in_link, double parent_id, char *label,
02666 cgns_model **model) {
02667 int n, nnod, linked;
02668 double *id;
02669 char *string_data;
02670
02671 if (cgi_get_nodes(parent_id, label, &nnod, &id)) return 1;
02672
02673 if (nnod<=0) {
02674 model[0]=0;
02675 return 0;
02676 }
02677 model[0] = CGNS_NEW(cgns_model,1);
02678 model[0]->id = id[0];
02679 model[0]->link = cgi_read_link(id[0]);
02680 model[0]->in_link = in_link;
02681 linked = model[0]->link ? 1 : in_link;
02682 free(id);
02683
02684
02685 if (cgi_read_string(model[0]->id, model[0]->name, &string_data)) return 1;
02686 if (cgi_ModelType(string_data, &model[0]->type)) return 1;
02687 free(string_data);
02688
02689
02690 if (cgi_read_DDD(linked, model[0]->id, &model[0]->ndescr,
02691 &model[0]->descr, &model[0]->data_class, &model[0]->units)) return 1;
02692
02693
02694 if (cgi_get_nodes(model[0]->id, "DataArray_t", &model[0]->narrays, &id))
02695 return 1;
02696
02697 if (model[0]->narrays>0) {
02698 model[0]->array = CGNS_NEW(cgns_array, model[0]->narrays);
02699 for (n=0; n<model[0]->narrays; n++) {
02700 model[0]->array[n].id = id[n];
02701 model[0]->array[n].link = cgi_read_link(id[n]);
02702 model[0]->array[n].in_link = linked;
02703 if (cgi_read_array(&model[0]->array[n],"Model_t",
02704 model[0]->id)) return 1;
02705
02706
02707 if (model[0]->array[n].data_dim!=1 ||
02708 model[0]->array[n].dim_vals[0]!=1) {
02709 cgi_error("Wrong data dimension in %s definition",model[0]->name);
02710 return 1;
02711 }
02712 }
02713 free(id);
02714 }
02715
02716
02717 if (cgi_read_user_data(linked, model[0]->id, &model[0]->nuser_data,
02718 &model[0]->user_data)) return 1;
02719
02720 return 0;
02721 }
02722
02723 int cgi_read_state(int in_link, double parent_id, cgns_state **state) {
02724 char_33 name;
02725 int n, nnod, defined=0, linked;
02726 double *id;
02727 char *string_data;
02728
02729 if (cgi_get_nodes(parent_id, "ReferenceState_t", &nnod, &id)) return 1;
02730 if (nnod<=0) {
02731 state[0]=0;
02732 return 0;
02733 }
02734 state[0] = CGNS_NEW(cgns_state, 1);
02735 state[0]->id=id[0];
02736 state[0]->link=cgi_read_link(id[0]);
02737 state[0]->in_link=in_link;
02738 linked = state[0]->link ? 1 : in_link;
02739 free(id);
02740
02741
02742 if (cgio_get_name(cg->cgio, state[0]->id, state[0]->name)) {
02743 cg_io_error("cgio_get_name");
02744 return 1;
02745 }
02746
02747
02748 state[0]->data_class = DataClassNull;
02749 state[0]->StateDescription = 0;
02750 state[0]->ndescr=0;
02751
02752
02753 if (cgi_get_nodes(state[0]->id, "Descriptor_t", &nnod, &id)) return 1;
02754
02755 if (nnod>0) {
02756
02757 for (n=0; n<nnod; n++) {
02758 if (cgio_get_name(cg->cgio, id[n], name)) {
02759 cg_io_error("cgio_get_name");
02760 return 1;
02761 }
02762 if (strcmp(name,"ReferenceStateDescription")) {
02763 if (state[0]->ndescr==0) state[0]->descr = CGNS_NEW(cgns_descr, 1);
02764 else state[0]->descr = CGNS_RENEW(cgns_descr, state[0]->ndescr+1, state[0]->descr);
02765
02766 state[0]->descr[state[0]->ndescr].id = id[n];
02767 state[0]->descr[state[0]->ndescr].link = cgi_read_link(id[n]);
02768 state[0]->descr[state[0]->ndescr].in_link = linked;
02769 if (cgi_read_string(id[n], state[0]->descr[state[0]->ndescr].name,
02770 &state[0]->descr[state[0]->ndescr].text)) return 1;
02771 state[0]->ndescr++;
02772 } else {
02773 if (defined) {
02774 cgi_error("Reference State node may only hold one ReferenceStateDescription");
02775 return 1;
02776 }
02777 state[0]->StateDescription= CGNS_NEW(cgns_descr, 1);
02778 state[0]->StateDescription->id = id[n];
02779 state[0]->StateDescription->link = cgi_read_link(id[n]);
02780 state[0]->StateDescription->in_link = linked;
02781 if (cgi_read_string(id[n], state[0]->StateDescription->name,
02782 &state[0]->StateDescription->text)) return 1;
02783 defined ++;
02784 }
02785 }
02786 free(id);
02787 }
02788
02789
02790 if (cgi_get_nodes(state[0]->id, "DataClass_t", &nnod, &id)) return 1;
02791 if (nnod>0) {
02792 if (cgi_read_string(id[0], name, &string_data)) return 1;
02793 cgi_DataClass(string_data, &state[0]->data_class);
02794 free(string_data);
02795 free(id);
02796 }
02797
02798
02799 if (cgi_read_units(linked, state[0]->id, &state[0]->units)) return 1;
02800
02801
02802
02803 if (cgi_get_nodes(state[0]->id, "DataArray_t", &state[0]->narrays, &id))
02804 return 1;
02805 if (state[0]->narrays>0) {
02806 state[0]->array = CGNS_NEW(cgns_array, state[0]->narrays);
02807 for (n=0; n<state[0]->narrays; n++) {
02808 state[0]->array[n].id = id[n];
02809 state[0]->array[n].link = cgi_read_link(id[n]);
02810 state[0]->array[n].in_link = linked;
02811 if (cgi_read_array(&state[0]->array[n],"ReferenceState_t",
02812 state[0]->id)) return 1;
02813
02814
02815 if (state[0]->array[n].data_dim!=1 ||
02816 state[0]->array[n].dim_vals[0]!=1) {
02817 cgi_error("Wrong data dimension in Reference State definition");
02818 return 1;
02819 }
02820 }
02821 free(id);
02822 }
02823
02824
02825 if (cgi_read_user_data(linked, state[0]->id, &state[0]->nuser_data,
02826 &state[0]->user_data)) return 1;
02827
02828 return 0;
02829 }
02830
02831 int cgi_read_gravity(int in_link, double parent_id, cgns_gravity **gravity) {
02832 int i, nnod, linked;
02833 double *id;
02834 char_33 temp_name;
02835
02836 if (cgi_get_nodes(parent_id, "Gravity_t", &nnod, &id)) return 1;
02837 if (nnod<=0) {
02838 gravity[0]=0;
02839 return 0;
02840 }
02841 gravity[0] = CGNS_NEW(cgns_gravity, 1);
02842 gravity[0]->id=id[0];
02843 gravity[0]->link=cgi_read_link(id[0]);
02844 gravity[0]->in_link=in_link;
02845 linked = gravity[0]->link ? 1 : in_link;
02846 free(id);
02847
02848
02849 if (cgio_get_name(cg->cgio, gravity[0]->id, gravity[0]->name)) {
02850 cg_io_error("cgio_get_name");
02851 return 1;
02852 }
02853
02854
02855 gravity[0]->vector=0;
02856 gravity[0]->narrays = 0;
02857
02858
02859 if (cgi_read_DDD(linked, gravity[0]->id, &gravity[0]->ndescr,
02860 &gravity[0]->descr, &gravity[0]->data_class, &gravity[0]->units))
02861 return 1;
02862
02863
02864 if (cgi_get_nodes(gravity[0]->id, "DataArray_t", &nnod, &id)) return 1;
02865 for (i=0; i<nnod; i++) {
02866 if (cgio_get_name(cg->cgio, id[i], temp_name)) {
02867 cg_io_error("cgio_get_name");
02868 return 1;
02869 }
02870
02871
02872 if (strcmp(temp_name,"GravityVector")==0) {
02873 gravity[0]->vector = CGNS_NEW(cgns_array, 1);
02874 gravity[0]->vector->id = id[i];
02875 gravity[0]->vector->link = cgi_read_link(id[i]);
02876 gravity[0]->vector->in_link = linked;
02877 if (cgi_read_array(gravity[0]->vector, "Gravity_t",
02878 gravity[0]->id)) return 1;
02879 gravity[0]->narrays = 1;
02880
02881
02882 if (strcmp(gravity[0]->vector->data_type,"R4")) {
02883 cgi_error("Datatype %s not supported for gravity vector",gravity[0]->vector->data_type);
02884 return 1;
02885 }
02886 if (gravity[0]->vector->data_dim != 1 || gravity[0]->vector->dim_vals[0] != Pdim) {
02887 cgi_error("Error exit: Gravity vector incorrectly dimensioned");
02888 return 1;
02889 }
02890 }
02891 }
02892 if (nnod) free(id);
02893
02894
02895 if (gravity[0]->vector == 0) {
02896 cgi_error("Error exit: Gravity vector undefined in Gravity_t node");
02897 return 1;
02898 }
02899
02900
02901 if (cgi_read_user_data(linked, gravity[0]->id, &gravity[0]->nuser_data,
02902 &gravity[0]->user_data)) return 1;
02903
02904 return 0;
02905 }
02906
02907 int cgi_read_axisym(int in_link, double parent_id, cgns_axisym **axisym) {
02908 int i, nnod, linked, ref_point_flag=0, axis_flag=0;
02909 double *id;
02910 char_33 temp_name;
02911
02912 if (cgi_get_nodes(parent_id, "Axisymmetry_t", &nnod, &id)) return 1;
02913 if (nnod<=0) {
02914 axisym[0]=0;
02915 return 0;
02916 }
02917 if (Pdim !=2) {
02918 cgi_error("Error: Axisymmetry_t can only be defined for 2D data model");
02919 return 1;
02920 }
02921 axisym[0] = CGNS_NEW(cgns_axisym, 1);
02922 axisym[0]->id=id[0];
02923 axisym[0]->link=cgi_read_link(id[0]);
02924 axisym[0]->in_link=in_link;
02925 linked = axisym[0]->link ? 1 : in_link;
02926 free(id);
02927
02928
02929 if (cgio_get_name(cg->cgio, axisym[0]->id, axisym[0]->name)) {
02930 cg_io_error("cgio_get_name");
02931 return 1;
02932 }
02933
02934
02935 axisym[0]->narrays=0;
02936
02937
02938 if (cgi_read_DDD(linked, axisym[0]->id, &axisym[0]->ndescr,
02939 &axisym[0]->descr, &axisym[0]->data_class, &axisym[0]->units))
02940 return 1;
02941
02942
02943
02944
02945
02946 if (cgi_get_nodes(axisym[0]->id, "DataArray_t", &nnod, &id)) return 1;
02947 if (nnod > 0) axisym[0]->array = CGNS_NEW(cgns_array, nnod);
02948
02949 for (i=0; i<nnod; i++) {
02950 if (cgio_get_name(cg->cgio, id[i], temp_name)) {
02951 cg_io_error("cgio_get_name");
02952 return 1;
02953 }
02954
02955 if (strcmp(temp_name,"AxisymmetryReferencePoint")==0 ||
02956 strcmp(temp_name,"AxisymmetryAxisVector")==0) {
02957
02958 if (strcmp(temp_name,"AxisymmetryReferencePoint")==0) ref_point_flag = 1;
02959 else if (strcmp(temp_name,"AxisymmetryAxisVector")==0) axis_flag = 1;
02960
02961 axisym[0]->array[axisym[0]->narrays].id = id[i];
02962 axisym[0]->array[axisym[0]->narrays].link = cgi_read_link(id[i]);
02963 axisym[0]->array[axisym[0]->narrays].in_link = linked;
02964 if (cgi_read_array(&axisym[0]->array[axisym[0]->narrays],
02965 "Axisymmetry_t", axisym[0]->id)) return 1;
02966
02967
02968 if (strcmp(axisym[0]->array[axisym[0]->narrays].data_type,"R4")) {
02969 cgi_error("Error: Datatype %s not supported for %s",
02970 axisym[0]->array[axisym[0]->narrays].data_type, temp_name);
02971 return 1;
02972 }
02973 if (axisym[0]->array[axisym[0]->narrays].data_dim != 1 ||
02974 axisym[0]->array[axisym[0]->narrays].dim_vals[0] != Pdim) {
02975 cgi_error("Error: %s incorrectly dimensioned",temp_name);
02976 return 1;
02977 }
02978 axisym[0]->narrays ++;
02979 }
02980
02981 else if (strcmp(temp_name,"AxisymmetryAngle")==0) {
02982 axisym[0]->array[axisym[0]->narrays].id = id[i];
02983 axisym[0]->array[axisym[0]->narrays].link = cgi_read_link(id[i]);
02984 axisym[0]->array[axisym[0]->narrays].in_link = linked;
02985 if (cgi_read_array(&axisym[0]->array[axisym[0]->narrays],
02986 "Axisymmetry_t", axisym[0]->id)) return 1;
02987
02988
02989 if (strcmp(axisym[0]->array[axisym[0]->narrays].data_type,"R4")) {
02990 cgi_error("Error: Datatype %s not supported for %s",
02991 axisym[0]->array[axisym[0]->narrays].data_type, temp_name);
02992 return 1;
02993 }
02994 if (axisym[0]->array[axisym[0]->narrays].data_dim != 1 ||
02995 axisym[0]->array[axisym[0]->narrays].dim_vals[0] != 1) {
02996 cgi_error("Error: %s incorrectly dimensioned",temp_name);
02997 return 1;
02998 }
02999 axisym[0]->narrays ++;
03000 }
03001
03002 else if (strcmp(temp_name,"CoordinateNames")==0) {
03003 axisym[0]->array[axisym[0]->narrays].id = id[i];
03004 axisym[0]->array[axisym[0]->narrays].link = cgi_read_link(id[i]);
03005 axisym[0]->array[axisym[0]->narrays].in_link = linked;
03006 if (cgi_read_array(&axisym[0]->array[axisym[0]->narrays],
03007 "Axisymmetry_t", axisym[0]->id)) return 1;
03008
03009
03010 if (strcmp(axisym[0]->array[axisym[0]->narrays].data_type,"C1")) {
03011 cgi_error("Error: Datatype %s not supported for %s",
03012 axisym[0]->array[axisym[0]->narrays].data_type, temp_name);
03013 return 1;
03014 }
03015 if (axisym[0]->array[axisym[0]->narrays].data_dim != 2 ||
03016 axisym[0]->array[axisym[0]->narrays].dim_vals[0] != 32 ||
03017 axisym[0]->array[axisym[0]->narrays].dim_vals[1] != 2) {
03018 cgi_error("Error: %s incorrectly dimensioned",temp_name);
03019 return 1;
03020 }
03021 axisym[0]->narrays ++;
03022 }
03023 }
03024 if (nnod) free(id);
03025
03026
03027 if (!ref_point_flag || !axis_flag) {
03028 cgi_error("Error: AxisymmetryReferencePoint & AxisymmetryAxisVector are required");
03029 return 1;
03030 }
03031
03032
03033 if (cgi_read_user_data(linked, axisym[0]->id, &axisym[0]->nuser_data,
03034 &axisym[0]->user_data)) return 1;
03035
03036 return 0;
03037 }
03038
03039 int cgi_read_rotating(int in_link, double parent_id, cgns_rotating **rotating) {
03040 int i, nnod, linked, rot_rate_flag=0, rot_center_flag=0;
03041 double *id;
03042 char_33 temp_name;
03043
03044 if (cgi_get_nodes(parent_id, "RotatingCoordinates_t", &nnod, &id)) return 1;
03045 if (nnod<=0) {
03046 rotating[0]=0;
03047 return 0;
03048 }
03049 rotating[0] = CGNS_NEW(cgns_rotating, 1);
03050 rotating[0]->id=id[0];
03051 rotating[0]->link=cgi_read_link(id[0]);
03052 rotating[0]->in_link=in_link;
03053 linked = rotating[0]->link ? 1 : in_link;
03054 free(id);
03055
03056
03057 if (cgio_get_name(cg->cgio, rotating[0]->id, rotating[0]->name)) {
03058 cg_io_error("cgio_get_name");
03059 return 1;
03060 }
03061
03062
03063 rotating[0]->narrays=0;
03064
03065
03066 if (cgi_read_DDD(linked, rotating[0]->id, &rotating[0]->ndescr,
03067 &rotating[0]->descr, &rotating[0]->data_class, &rotating[0]->units))
03068 return 1;
03069
03070
03071
03072
03073
03074 if (cgi_get_nodes(rotating[0]->id, "DataArray_t", &nnod, &id)) return 1;
03075 if (nnod > 0) rotating[0]->array = CGNS_NEW(cgns_array, nnod);
03076
03077 for (i=0; i<nnod; i++) {
03078 if (cgio_get_name(cg->cgio, id[i], temp_name)) {
03079 cg_io_error("cgio_get_name");
03080 return 1;
03081 }
03082
03083 if (strcmp(temp_name,"RotationCenter")==0 ||
03084 strcmp(temp_name,"RotationRateVector")==0) {
03085
03086 if (strcmp(temp_name,"RotationCenter")==0) rot_center_flag = 1;
03087 else if (strcmp(temp_name,"RotationRateVector")==0) rot_rate_flag = 1;
03088
03089 rotating[0]->array[rotating[0]->narrays].id = id[i];
03090 rotating[0]->array[rotating[0]->narrays].link = cgi_read_link(id[i]);
03091 rotating[0]->array[rotating[0]->narrays].in_link = linked;
03092 if (cgi_read_array(&rotating[0]->array[rotating[0]->narrays],
03093 "RotatingCoordinates_t", rotating[0]->id)) return 1;
03094
03095
03096 if (strcmp(rotating[0]->array[rotating[0]->narrays].data_type,"R4")) {
03097 cgi_error("Error: Datatype %s not supported for %s",
03098 rotating[0]->array[rotating[0]->narrays].data_type, temp_name);
03099 return 1;
03100 }
03101 if (rotating[0]->array[rotating[0]->narrays].data_dim != 1 ||
03102 rotating[0]->array[rotating[0]->narrays].dim_vals[0] != Pdim) {
03103 cgi_error("Error: %s incorrectly dimensioned",temp_name);
03104 return 1;
03105 }
03106 rotating[0]->narrays ++;
03107 }
03108 }
03109 if (nnod) free(id);
03110
03111
03112 if (!rot_rate_flag || !rot_center_flag) {
03113 cgi_error("Error: RotationCenter & RotationRateVector are required");
03114 return 1;
03115 }
03116
03117
03118 if (cgi_read_user_data(linked, rotating[0]->id, &rotating[0]->nuser_data,
03119 &rotating[0]->user_data)) return 1;
03120
03121 return 0;
03122 }
03123
03124 int cgi_read_converg(int in_link, double parent_id, cgns_converg **converg) {
03125 char_33 data_type, name;
03126 int ndim, dim_vals[12], n, nnod;
03127 double *id;
03128 char *string_data;
03129 void *iterations;
03130 int nnorm=0, linked;
03131
03132 if (cgi_get_nodes(parent_id, "ConvergenceHistory_t", &nnod, &id)) return 1;
03133 if (nnod<=0) {
03134 converg[0]=0;
03135 return 0;
03136 }
03137 converg[0] = CGNS_NEW(cgns_converg, 1);
03138 converg[0]->id = id[0];
03139 converg[0]->link = cgi_read_link(id[0]);
03140 converg[0]->in_link = in_link;
03141 linked = converg[0]->link ? 1 : in_link;
03142 free(id);
03143
03144 if (cgi_read_node(converg[0]->id, converg[0]->name, data_type, &ndim,
03145 dim_vals, &iterations, READ_DATA)) {
03146 cgi_error("Error reading Convergence History node");
03147 return 1;
03148 }
03149
03150
03151
03152
03153
03154
03155
03156
03157
03158
03159 if (strcmp(data_type,"I4")==0 && dim_vals[0]>=1) {
03160 converg[0]->iterations = *((int *)iterations);
03161 free(iterations);
03162 } else converg[0]->iterations=0;
03163
03164
03165 converg[0]->data_class = DataClassNull;
03166 converg[0]->NormDefinitions = 0;
03167 converg[0]->ndescr=0;
03168
03169
03170 if (cgi_get_nodes(converg[0]->id, "Descriptor_t", &nnod, &id)) return 1;
03171
03172 if (nnod>0) {
03173 for (n=0; n<nnod; n++) {
03174 if (cgio_get_name(cg->cgio, id[n], name)) {
03175 cg_io_error("cgio_get_name");
03176 return 1;
03177 }
03178 if (strcmp(name,"NormDefinitions")) {
03179 if (converg[0]->ndescr==0) converg[0]->descr = CGNS_NEW(cgns_descr, 1);
03180 else converg[0]->descr=CGNS_RENEW(cgns_descr,converg[0]->ndescr+1,converg[0]->descr);
03181 converg[0]->descr[converg[0]->ndescr].id = id[n];
03182 converg[0]->descr[converg[0]->ndescr].link = cgi_read_link(id[n]);
03183 converg[0]->descr[converg[0]->ndescr].in_link = linked;
03184 if (cgi_read_string(id[n], converg[0]->descr[converg[0]->ndescr].name,
03185 &converg[0]->descr[converg[0]->ndescr].text)) return 1;
03186 converg[0]->ndescr++;
03187 } else {
03188 if (nnorm) {
03189 cgi_error("Convergence History may only hold one NormDefinitions Node");
03190 return 1;
03191 }
03192 converg[0]->NormDefinitions = CGNS_NEW(cgns_descr, 1);
03193 converg[0]->NormDefinitions->id = id[n];
03194 converg[0]->NormDefinitions->link = cgi_read_link(id[n]);
03195 converg[0]->NormDefinitions->in_link = linked;
03196 if (cgi_read_string(id[n], converg[0]->NormDefinitions->name,
03197 &converg[0]->NormDefinitions->text)) return 1;
03198 nnorm ++;
03199 }
03200 }
03201 free(id);
03202 }
03203
03204
03205 if (cgi_get_nodes(converg[0]->id, "DataClass_t", &nnod, &id)) return 1;
03206 if (nnod>0) {
03207 if (cgi_read_string(id[0], name, &string_data)) return 1;
03208 cgi_DataClass(string_data, &converg[0]->data_class);
03209 free(string_data);
03210 free(id);
03211 }
03212
03213
03214 if (cgi_read_units(linked, converg[0]->id, &converg[0]->units)) return 1;
03215
03216
03217 if (cgi_get_nodes(converg[0]->id, "DataArray_t", &converg[0]->narrays, &id))
03218 return 1;
03219 if (converg[0]->narrays>0) {
03220 converg[0]->array = CGNS_NEW(cgns_array, converg[0]->narrays);
03221 for (n=0; n<converg[0]->narrays; n++) {
03222 converg[0]->array[n].id = id[n];
03223 converg[0]->array[n].link = cgi_read_link(id[n]);
03224 converg[0]->array[n].in_link = linked;
03225 if (cgi_read_array(&converg[0]->array[n],"ConvergenceHistory_t",
03226 converg[0]->id)) return 1;
03227
03228
03229
03230
03231
03232
03233
03234 }
03235 free(id);
03236 }
03237
03238
03239 if (cgi_read_user_data(linked, converg[0]->id, &converg[0]->nuser_data,
03240 &converg[0]->user_data)) return 1;
03241
03242 return 0;
03243 }
03244
03245 int cgi_read_discrete(int in_link, double parent_id, int *ndiscrete,
03246 cgns_discrete **discrete) {
03247 double *id, *idi;
03248 int n, i, j, DataSize[3], linked;
03249
03250 if (cgi_get_nodes(parent_id, "DiscreteData_t", ndiscrete, &id)) return 1;
03251 if (*ndiscrete<=0) {
03252 discrete[0] = 0;
03253 return 0;
03254 }
03255
03256 discrete[0] = CGNS_NEW(cgns_discrete, (*ndiscrete));
03257 for (n=0; n<(*ndiscrete); n++) {
03258 discrete[0][n].id = id[n];
03259 discrete[0][n].link = cgi_read_link(id[n]);
03260 discrete[0][n].in_link = in_link;
03261 linked = discrete[0][n].link ? 1 : in_link;
03262
03263
03264 if (cgio_get_name(cg->cgio, id[n], discrete[0][n].name)) {
03265 cg_io_error("cgio_get_name");
03266 return 1;
03267 }
03268
03269
03270 if (cgi_read_DDD(linked, id[n], &discrete[0][n].ndescr,
03271 &discrete[0][n].descr, &discrete[0][n].data_class,
03272 &discrete[0][n].units)) return 1;
03273
03274
03275 if (cgi_read_location(discrete[0][n].id, discrete[0][n].name,
03276 &discrete[0][n].location)) return 1;
03277
03278
03279 if (cgi_read_rind(discrete[0][n].id, &discrete[0][n].rind_planes))
03280 return 1;
03281
03282
03283 if (cgi_datasize(Idim, CurrentDim, discrete[0][n].location,
03284 discrete[0][n].rind_planes, DataSize)) return 1;
03285
03286
03287 if (cgi_get_nodes(discrete[0][n].id, "DataArray_t",
03288 &discrete[0][n].narrays, &idi)) return 1;
03289 if (discrete[0][n].narrays>0) {
03290 discrete[0][n].array = CGNS_NEW(cgns_array, discrete[0][n].narrays);
03291 for (i=0; i<discrete[0][n].narrays; i++) {
03292 discrete[0][n].array[i].id = idi[i];
03293 discrete[0][n].array[i].link = cgi_read_link(idi[i]);
03294 discrete[0][n].array[i].in_link = linked;
03295 if (cgi_read_array(&discrete[0][n].array[i],
03296 "DiscreteData_t", discrete[0][n].id)) return 1;
03297
03298
03299 if (discrete[0][n].array[i].data_dim!=Idim) {
03300 cgi_error("Wrong data dimension in Discrete Data definition");
03301 return 1;
03302 }
03303
03304
03305
03306
03307 if (discrete[0][n].location == Vertex ||
03308 discrete[0][n].location == CellCenter ||
03309 discrete[0][n].location == IFaceCenter ||
03310 discrete[0][n].location == JFaceCenter ||
03311 discrete[0][n].location == KFaceCenter) {
03312 for (j=0; j<Idim; j++) {
03313 if (discrete[0][n].array[i].dim_vals[j]!= DataSize[j]) {
03314 cgi_error("Invalid array dimension for Discrete Data '%s'",
03315 discrete[0][n].name);
03316 return 1;
03317 }
03318 }
03319 }
03320 if (strcmp(discrete[0][n].array[i].data_type,"I4") &&
03321 strcmp(discrete[0][n].array[i].data_type,"R4") &&
03322 strcmp(discrete[0][n].array[i].data_type,"R8")) {
03323 cgi_error("Datatype %d not supported for Discrete Data");
03324 return 1;
03325 }
03326 }
03327 free(idi);
03328 }
03329
03330
03331 if (cgi_read_user_data(linked, discrete[0][n].id,
03332 &discrete[0][n].nuser_data, &discrete[0][n].user_data)) return 1;
03333 }
03334 free(id);
03335
03336 return 0;
03337 }
03338
03339 int cgi_read_integral(int in_link, double parent_id, int *nintegrals,
03340 cgns_integral **integral) {
03341 double *id, *idi;
03342 int n, i, linked;
03343
03344 if (cgi_get_nodes(parent_id, "IntegralData_t", nintegrals, &id)) return 1;
03345 if (*nintegrals<=0) {
03346 integral[0] = 0;
03347 return 0;
03348 }
03349
03350 integral[0] = CGNS_NEW(cgns_integral, (*nintegrals));
03351 for (n=0; n<(*nintegrals); n++) {
03352 integral[0][n].id = id[n];
03353 integral[0][n].link = cgi_read_link(id[n]);
03354 integral[0][n].in_link = in_link;
03355 linked = integral[0][n].link ? 1 : in_link;
03356
03357
03358 if (cgio_get_name(cg->cgio, integral[0][n].id, integral[0][n].name)) {
03359 cg_io_error("cgio_get_name");
03360 return 1;
03361 }
03362
03363
03364 if (cgi_read_DDD(linked, id[n], &integral[0][n].ndescr,
03365 &integral[0][n].descr, &integral[0][n].data_class,
03366 &integral[0][n].units)) return 1;
03367
03368
03369 if (cgi_get_nodes(id[n], "DataArray_t", &integral[0][n].narrays, &idi))
03370 return 1;
03371 if (integral[0][n].narrays>0) {
03372 integral[0][n].array = CGNS_NEW(cgns_array, integral[0][n].narrays);
03373 for (i=0; i<integral[0][n].narrays; i++) {
03374 integral[0][n].array[i].id = idi[i];
03375 integral[0][n].array[i].link = cgi_read_link(idi[i]);
03376 integral[0][n].array[i].in_link = linked;
03377 if (cgi_read_array(&integral[0][n].array[i],
03378 "IntegralData_t", integral[0][n].id)) return 1;
03379
03380
03381
03382
03383
03384
03385
03386
03387
03388 }
03389 free(idi);
03390 }
03391
03392
03393 if (cgi_read_user_data(linked, integral[0][n].id,
03394 &integral[0][n].nuser_data, &integral[0][n].user_data)) return 1;
03395 }
03396 free(id);
03397
03398 return 0;
03399 }
03400
03401 int cgi_read_rmotion(int in_link, double parent_id, int *nrmotions,
03402 cgns_rmotion **rmotion) {
03403 cgns_array *array;
03404 char *string_data;
03405 double *id, *idi;
03406 int n, i, linked;
03407
03408 if (cgi_get_nodes(parent_id, "RigidGridMotion_t", nrmotions, &id))
03409 return 1;
03410 if (*nrmotions <= 0) {
03411 rmotion[0] = 0;
03412 return 0;
03413 }
03414
03415 rmotion[0] = CGNS_NEW(cgns_rmotion, (*nrmotions));
03416 for (n=0; n<(*nrmotions); n++) {
03417 rmotion[0][n].id = id[n];
03418 rmotion[0][n].link = cgi_read_link(id[n]);
03419 rmotion[0][n].in_link = in_link;
03420 linked = rmotion[0][n].link ? 1 : in_link;
03421
03422
03423 if (cgi_read_DDD(linked, id[n], &rmotion[0][n].ndescr,
03424 &rmotion[0][n].descr, &rmotion[0][n].data_class,
03425 &rmotion[0][n].units)) return 1;
03426
03427
03428 if (cgi_read_string(id[n], rmotion[0][n].name, &string_data) ||
03429 cgi_RigidGridMotionType(string_data, &rmotion[0][n].type))
03430 return 1;
03431 free(string_data);
03432
03433
03434 if (cgi_get_nodes(id[n], "DataArray_t", &rmotion[0][n].narrays, &idi))
03435 return 1;
03436 if (rmotion[0][n].narrays<=0) {
03437 cgi_error("RigidGridMotion_t '%s' defined incorrectly",rmotion[0][n].name);
03438 return 1;
03439 }
03440 rmotion[0][n].array = CGNS_NEW(cgns_array, rmotion[0][n].narrays);
03441 for (i=0; i<rmotion[0][n].narrays; i++) {
03442 rmotion[0][n].array[i].id = idi[i];
03443 rmotion[0][n].array[i].link = cgi_read_link(idi[i]);
03444 rmotion[0][n].array[i].in_link = linked;
03445 if (cgi_read_array(&rmotion[0][n].array[i],
03446 "RigidGridMotion_t", rmotion[0][n].id)) return 1;
03447
03448
03449 array = &rmotion[0][n].array[i];
03450 if (strcmp("OriginLocation",array->name)==0 ||
03451 strcmp("RigidRotationAngle",array->name)==0 ||
03452 strcmp("RigidVelocity" ,array->name)==0 ||
03453 strcmp("RigidRotationRate" ,array->name)==0) {
03454 if (strcmp(array->data_type,"R4") && strcmp(array->data_type,"R8")) {
03455 cgi_error("Wrong data type for %s",array->name);
03456 return 1;
03457 }
03458 if ((strcmp("OriginLocation",array->name)==0 && array->data_dim!=2) ||
03459 (strcmp("OriginLocation",array->name) && array->data_dim!=1) ||
03460 array->dim_vals[0]!=Pdim ||
03461 (strcmp("OriginLocation",array->name)==0 && array->dim_vals[1]!=2)) {
03462 cgi_error("Wrong data dimension in '%s' definition",array->name);
03463 return 1;
03464 }
03465 }
03466 }
03467 for (i=0; i<rmotion[0][n].narrays; i++) {
03468 if (strcmp("OriginLocation",rmotion[0][n].array[i].name)==0) break;
03469 if (i==(rmotion[0][n].narrays-1)) {
03470 cgi_error("OriginLocation undefined under RigidGridMotion_t '%s'",
03471 rmotion[0][n].name);
03472 return 1;
03473 }
03474 }
03475 free(idi);
03476
03477
03478 if (cgi_read_user_data(linked, rmotion[0][n].id,
03479 &rmotion[0][n].nuser_data, &rmotion[0][n].user_data)) return 1;
03480
03481 }
03482 free(id);
03483 return 0;
03484 }
03485
03486 int cgi_read_amotion(int in_link, double parent_id, int *namotions,
03487 cgns_amotion **amotion) {
03488 double *id, *idi;
03489 char *string_data;
03490 int DataSize[3], n, i, j, linked;
03491
03492 if (cgi_get_nodes(parent_id, "ArbitraryGridMotion_t", namotions, &id)) return 1;
03493 if (*namotions <= 0) {
03494 amotion[0] = 0;
03495 return 0;
03496 }
03497
03498 amotion[0] = CGNS_NEW(cgns_amotion, (*namotions));
03499 for (n=0; n<(*namotions); n++) {
03500 amotion[0][n].id = id[n];
03501 amotion[0][n].link = cgi_read_link(id[n]);
03502 amotion[0][n].in_link = in_link;
03503 linked = amotion[0][n].link ? 1 : in_link;
03504
03505
03506 if (cgi_read_DDD(linked, id[n], &amotion[0][n].ndescr,
03507 &amotion[0][n].descr, &amotion[0][n].data_class,
03508 &amotion[0][n].units)) return 1;
03509
03510
03511 if (cgi_read_string(id[n], amotion[0][n].name, &string_data) ||
03512 cgi_ArbitraryGridMotionType(string_data, &amotion[0][n].type))
03513 return 1;
03514 free(string_data);
03515
03516
03517 if (cgi_read_location(id[n], amotion[0][n].name,
03518 &amotion[0][n].location)) return 1;
03519
03520
03521 if (cgi_read_rind(id[n], &amotion[0][n].rind_planes)) return 1;
03522
03523
03524 if (cgi_datasize(Idim, CurrentDim, amotion[0][n].location,
03525 amotion[0][n].rind_planes, DataSize)) return 1;
03526
03527
03528 if (cgi_get_nodes(id[n], "DataArray_t", &amotion[0][n].narrays, &idi))
03529 return 1;
03530
03531 if (amotion[0][n].narrays>0) {
03532 amotion[0][n].array = CGNS_NEW(cgns_array, amotion[0][n].narrays);
03533 for (i=0; i<amotion[0][n].narrays; i++) {
03534 amotion[0][n].array[i].id = idi[i];
03535 amotion[0][n].array[i].link = cgi_read_link(idi[i]);
03536 amotion[0][n].array[i].in_link = linked;
03537 if (cgi_read_array(&amotion[0][n].array[i],
03538 "ArbitraryGridMotion_t", amotion[0][n].id)) return 1;
03539
03540
03541 if (amotion[0][n].array[i].data_dim!=Idim) {
03542 cgi_error("Wrong data dimension for ArbitraryGridMotion array '%s'",
03543 amotion[0][n].array[i].name);
03544 return 1;
03545 }
03546
03547
03548
03549 if (amotion[0][n].location == Vertex ||
03550 amotion[0][n].location == CellCenter ||
03551 amotion[0][n].location == IFaceCenter ||
03552 amotion[0][n].location == JFaceCenter ||
03553 amotion[0][n].location == KFaceCenter) {
03554 for (j=0; j<Idim; j++) {
03555 if (amotion[0][n].array[i].dim_vals[j]!= DataSize[j]) {
03556 cgi_error("Invalid array dimension for ArbitraryGridMotion array '%s'",
03557 amotion[0][n].array[i].name);
03558 return 1;
03559 }
03560 }
03561 }
03562 if (strcmp(amotion[0][n].array[i].data_type,"R4") &&
03563 strcmp(amotion[0][n].array[i].data_type,"R8") ) {
03564 cgi_error("Datatype %d not supported for ArbitraryGridMotion array");
03565 return 1;
03566 }
03567 }
03568 free(idi);
03569 }
03570
03571
03572 if (cgi_read_user_data(linked, amotion[0][n].id,
03573 &amotion[0][n].nuser_data, &amotion[0][n].user_data)) return 1;
03574 }
03575 free(id);
03576 return 0;
03577 }
03578
03579
03580
03581 int cgi_read_array(cgns_array *array, char *parent_label, double parent_id) {
03582 int data_flag=1;
03583 int linked = array->link ? 1 : array->in_link;
03584 char_33 data_type, temp_name;
03585 int dim_vals[12], *data, nchild, ndim;
03586 double *idi;
03587
03588
03589 if (strcmp(parent_label,"GridCoordinates_t")==0 ||
03590 strcmp(parent_label,"FlowSolution_t")==0 ||
03591 strcmp(parent_label,"DiscreteData_t")==0) {
03592 data_flag=SKIP_DATA;
03593 array->data=0;
03594 }
03595 if (cgi_read_node(array->id, array->name, array->data_type,
03596 &array->data_dim, array->dim_vals, &array->data, data_flag)) {
03597 cgi_error("Error reading array under %s",parent_label);
03598 return 1;
03599 }
03600
03601
03602 if (cgi_read_DDD(linked, array->id, &array->ndescr, &array->descr,
03603 &array->data_class, &array->units)) return 1;
03604
03605
03606 if (cgi_read_conversion(linked, array->id, &array->convert)) return 1;
03607
03608
03609 if (cgi_read_exponents(linked, array->id, &array->exponents)) return 1;
03610
03611
03612 if (cgi_get_nodes(array->id, "IndexRange_t", &nchild, &idi))
03613 return 1;
03614 if (nchild==1) {
03615 void *vdata;
03616 if (cgi_read_node(idi[0], temp_name, data_type, &ndim, dim_vals,
03617 &vdata, READ_DATA)) {
03618 cgi_error("Error reading array range");
03619 return 1;
03620 }
03621
03622 if (nchild) free(idi);
03623
03624
03625 if (strcmp(temp_name,"ArrayDataRange")) {
03626 cgi_error("Invalid point set type: '%s'",temp_name);
03627 return 1;
03628 }
03629
03630 if (strcmp(data_type,"I4")) {
03631 cgi_error("Data type %s not supported for ArrayDataRange", data_type);
03632 return 1;
03633 }
03634
03635 if (ndim!=1 || dim_vals[0]!=2) {
03636 cgi_error("Invalid dimensions in definition of ArrayDataRange");
03637 return 1;
03638 }
03639
03640
03641 data = (int *)vdata;
03642 array->range[0] = data[0];
03643 array->range[1] = data[1];
03644 free(vdata);
03645 }
03646
03647 return 0;
03648 }
03649
03650 int cgi_read_conversion(int in_link, double parent_id, cgns_conversion **convert) {
03651 int nnod, ndim, dim_vals[12];
03652 double *id;
03653
03654 if (cgi_get_nodes(parent_id, "DataConversion_t", &nnod, &id)) return 1;
03655 if (nnod<=0) {
03656 convert[0]=0;
03657 return 0;
03658 }
03659 convert[0] = CGNS_NEW(cgns_conversion, 1);
03660 convert[0]->id = id[0];
03661 convert[0]->link = cgi_read_link(id[0]);
03662 convert[0]->in_link = in_link;
03663 free(id);
03664
03665 if (cgi_read_node(convert[0]->id, convert[0]->name, convert[0]->data_type,
03666 &ndim, dim_vals, &convert[0]->data, READ_DATA)) {
03667 cgi_error("Error reading '%s'",convert[0]->name);
03668 return 1;
03669 }
03670 if (strcmp(convert[0]->data_type,"R4") && strcmp(convert[0]->data_type,"R8")) {
03671 cgi_error("Wrong Data Type in '%s'",convert[0]->name);
03672 return 1;
03673 }
03674 if (ndim!=1 || dim_vals[0]!=2) {
03675 cgi_error("Wrong dimensions in '%s'",convert[0]->name);
03676 return 1;
03677 }
03678 return 0;
03679 }
03680
03681 int cgi_read_exponents(int in_link, double parent_id, cgns_exponent **exponents) {
03682 int nnod, ndim, dim_vals[12];
03683 double *id;
03684
03685 if (cgi_get_nodes(parent_id, "DimensionalExponents_t", &nnod, &id)) return 1;
03686 if (nnod <= 0) {
03687 exponents[0]=0;
03688 return 0;
03689 }
03690 exponents[0] = CGNS_NEW(cgns_exponent, 1);
03691 exponents[0]->id = id[0];
03692 exponents[0]->link = cgi_read_link(id[0]);
03693 exponents[0]->in_link = in_link;
03694 free(id);
03695
03696 if (cgi_read_node(exponents[0]->id, exponents[0]->name,
03697 exponents[0]->data_type, &ndim, dim_vals, &exponents[0]->data, READ_DATA)) {
03698 cgi_error("Error reading '%s'",exponents[0]->name);
03699 return 1;
03700 }
03701 if (strcmp(exponents[0]->data_type,"R4") &&
03702 strcmp(exponents[0]->data_type,"R8")) {
03703 cgi_error("Wrong Data Type in '%s'",exponents[0]->name);
03704 return 1;
03705 }
03706 if (ndim != 1 || dim_vals[0] != 5) {
03707 cgi_error("Wrong dimensions in '%s'",exponents[0]->name);
03708 return 1;
03709 }
03710 exponents[0]->nexps = 5;
03711
03712 if (cgi_get_nodes(exponents[0]->id, "AdditionalExponents_t", &nnod, &id))
03713 return 1;
03714 if (nnod > 0) {
03715 int ierr;
03716 char_33 data_type, name;
03717 void *data;
03718 ierr = cgi_read_node(id[0], name, data_type, &ndim, dim_vals,
03719 &data, READ_DATA);
03720 free(id);
03721 if (ierr) {
03722 cgi_error("Error reading AdditionalExponents for 's'",
03723 exponents[0]->name);
03724 return 1;
03725 }
03726 if (strcmp(data_type, exponents[0]->data_type)) {
03727 free(data);
03728 cgi_error("mismatch in data type for AdditionalExponents for '%s'",
03729 exponents[0]->name);
03730 return 1;
03731 }
03732 if (ndim != 1 || dim_vals[0] != 3) {
03733 free(data);
03734 cgi_error("Wrong dimensions in AdditionalExponents for '%s'",
03735 exponents[0]->name);
03736 return 1;
03737 }
03738 exponents[0]->data = (void *) realloc (exponents[0]->data,
03739 8 * size_of(exponents[0]->data_type));
03740 if (exponents[0]->data == NULL) {
03741 free(data);
03742 cgi_error("realloc failed for DimensionalExponents");
03743 return 1;
03744 }
03745 if (0 == strcmp(exponents[0]->data_type,"R4")) {
03746 float *exps = (float *)exponents[0]->data;
03747 for (ndim = 0; ndim < 3; ndim++)
03748 exps[5+ndim] = *((float *)data + ndim);
03749 } else {
03750 double *exps = (double *)exponents[0]->data;
03751 for (ndim = 0; ndim < 3; ndim++)
03752 exps[5+ndim] = *((double *)data + ndim);
03753 }
03754
03755 exponents[0]->nexps = 8;
03756 free(data);
03757 }
03758 return 0;
03759 }
03760
03761 int cgi_read_units(int in_link, double parent_id, cgns_units **units) {
03762
03763 char_33 unit_name;
03764 char *string_data;
03765 double *id;
03766 int nnod;
03767
03768 if (cgi_get_nodes(parent_id, "DimensionalUnits_t", &nnod, &id)) return 1;
03769 if (nnod<=0) {
03770 units[0]=0;
03771 return 0;
03772 }
03773 units[0] = CGNS_NEW(cgns_units, 1);
03774 units[0]->id = id[0];
03775 units[0]->link = cgi_read_link(id[0]);
03776 units[0]->in_link = in_link;
03777 free(id);
03778
03779 if (cgi_read_string(units[0]->id, units[0]->name, &string_data)) return 1;
03780 if (strlen(string_data) != 32*5) {
03781 free(string_data);
03782 cgi_error("Dimensional Units defined incorrectly.");
03783 return 1;
03784 }
03785 units[0]->nunits = 5;
03786
03787
03788 if (0 == strncmp(&string_data[96], "Celcius", 7)) {
03789 string_data[99] = 's';
03790 if (cg->mode == CG_MODE_MODIFY && !in_link) {
03791 if (cgio_write_all_data(cg->cgio, units[0]->id, string_data)) {
03792 cg_io_error("cgio_write_all_data");
03793 return 1;
03794 }
03795 }
03796 }
03797
03798 strncpy (unit_name, string_data, 32);
03799 unit_name[32] = 0;
03800 cgi_MassUnits(unit_name, &units[0]->mass);
03801
03802 strncpy (unit_name, &string_data[32], 32);
03803 unit_name[32] = 0;
03804 cgi_LengthUnits(unit_name, &units[0]->length);
03805
03806 strncpy (unit_name, &string_data[64], 32);
03807 unit_name[32] = 0;
03808 cgi_TimeUnits(unit_name, &units[0]->time);
03809
03810 strncpy (unit_name, &string_data[96], 32);
03811 unit_name[32] = 0;
03812 cgi_TemperatureUnits(unit_name, &units[0]->temperature);
03813
03814 strncpy (unit_name, &string_data[128], 32);
03815 unit_name[32] = 0;
03816 cgi_AngleUnits(unit_name, &units[0]->angle);
03817
03818 free(string_data);
03819
03820 units[0]->current = ElectricCurrentUnitsNull;
03821 units[0]->amount = SubstanceAmountUnitsNull;
03822 units[0]->intensity = LuminousIntensityUnitsNull;
03823
03824 if (cgi_get_nodes(units[0]->id, "AdditionalUnits_t", &nnod, &id))
03825 return 1;
03826 if (nnod > 0) {
03827 int ierr = cgi_read_string(id[0], unit_name, &string_data);
03828 free(id);
03829 if (ierr) return 1;
03830 if (strlen(string_data) != 32*3) {
03831 free(string_data);
03832 cgi_error("AdditionalUnits for '%s' defined incorrectly.",
03833 units[0]->name);
03834 return 1;
03835 }
03836 units[0]->nunits = 8;
03837
03838 strncpy (unit_name, string_data, 32);
03839 unit_name[32] = 0;
03840 cgi_ElectricCurrentUnits(unit_name, &units[0]->current);
03841
03842 strncpy (unit_name, &string_data[32], 32);
03843 unit_name[32] = 0;
03844 cgi_SubstanceAmountUnits(unit_name, &units[0]->amount);
03845
03846 strncpy (unit_name, &string_data[64], 32);
03847 unit_name[32] = 0;
03848 cgi_LuminousIntensityUnits(unit_name, &units[0]->intensity);
03849
03850 free(string_data);
03851 }
03852
03853 return 0;
03854 }
03855
03856 int cgi_read_string(double id, char_33 name, char **string_data) {
03857 int n, ndim, length[2], len=1;
03858 char_33 data_type;
03859
03860 if (cgi_read_node(id, name, data_type, &ndim, length, (void **)string_data, READ_DATA)) {
03861 cgi_error("Error reading string");
03862 return 1;
03863 }
03864
03865 if (strcmp(data_type,"C1")!=0) {
03866 cgi_error("Invalid datatype for character data: %s",data_type);
03867 return 1;
03868 }
03869
03870 for (n=0; n<ndim; n++) len *= length[n];
03871 string_data[0][len]='\0';
03872
03873 return 0;
03874 }
03875
03876 int cgi_read_DDD(int in_link, double parent_id, int *ndescr,
03877 cgns_descr **descr, DataClass_t *data_class,
03878 cgns_units **units) {
03879 double *id;
03880 int n, nnod;
03881 char_33 name;
03882 char *string_data;
03883
03884
03885
03886 descr[0] = 0;
03887 if (cgi_get_nodes(parent_id, "Descriptor_t", ndescr, &id)) return 1;
03888 if (*ndescr>0) {
03889 descr[0] = CGNS_NEW(cgns_descr, (*ndescr));
03890 for (n=0; n<(*ndescr); n++) {
03891 descr[0][n].id = id[n];
03892 descr[0][n].link = cgi_read_link(id[n]);
03893 descr[0][n].in_link = in_link;
03894 if (cgi_read_string(id[n], descr[0][n].name,
03895 &descr[0][n].text)) return 1;
03896 }
03897 free(id);
03898 }
03899
03900
03901 *data_class = DataClassNull;
03902 if (cgi_get_nodes(parent_id, "DataClass_t", &nnod, &id)) return 1;
03903 if (nnod>0) {
03904 if (cgi_read_string(id[0], name, &string_data)) return 1;
03905 cgi_DataClass(string_data, data_class);
03906 free(string_data);
03907 free(id);
03908 }
03909
03910
03911 if (cgi_read_units(in_link, parent_id, units)) return 1;
03912 return 0;
03913 }
03914
03915 int cgi_read_ordinal(double parent_id, int *ordinal) {
03916 int nnod;
03917 double *id;
03918 char_33 name, data_type;
03919 int ndim, dim_vals[12];
03920 void *ordinal_data;
03921
03922 if (cgi_get_nodes(parent_id, "Ordinal_t", &nnod, &id)) return 1;
03923 if (nnod<=0) {
03924 (*ordinal)=0;
03925 return 0;
03926 }
03927 if (cgi_read_node(id[0], name, data_type, &ndim, dim_vals,
03928 &ordinal_data, READ_DATA)) {
03929 cgi_error("Error reading Ordinal node");
03930 return 1;
03931 }
03932 if (ndim!=1 || dim_vals[0]!=1 || strcmp(data_type,"I4")) {
03933 cgi_error("Ordinal '%s' defined incorrectly",name);
03934 return 1;
03935 }
03936 free(id);
03937 (*ordinal)=*(int *)ordinal_data;
03938 free(ordinal_data);
03939 return 0;
03940 }
03941
03942 int cgi_read_rind(double parent_id, int **rind_planes) {
03943 int n, nnod;
03944 double *id;
03945 char_33 name, data_type;
03946 int ndim, dim_vals[12];
03947
03948 if (cgi_get_nodes(parent_id, "Rind_t", &nnod, &id)) return 1;
03949 if (nnod<=0) {
03950 rind_planes[0] = (int *) malloc (2*Idim*sizeof(int));
03951 if (!rind_planes[0]) {
03952 cgi_error("Error allocating rind_planes.");
03953 return 1;
03954 }
03955 for (n=0; n<2*Idim; n++) rind_planes[0][n]=0;
03956 return 0;
03957 }
03958
03959 if (cgi_read_node(id[0], name, data_type, &ndim, dim_vals,
03960 (void **)rind_planes, READ_DATA)) {
03961 cgi_error("Error reading Rind Planes");
03962 return 1;
03963 }
03964 if (ndim!=1 || dim_vals[0]!=2*Idim || strcmp(data_type,"I4")) {
03965 cgi_error("Rind Planes '%s' defined incorrectly",name);
03966 return 1;
03967 }
03968 free(id);
03969 return 0;
03970 }
03971
03972 int cgi_read_location(double parent_id, char_33 parent_name, GridLocation_t *location) {
03973 int nGL_t;
03974 double *id;
03975 char *location_name;
03976 char_33 name;
03977
03978
03979 if (cgi_get_nodes(parent_id, "GridLocation_t", &nGL_t, &id)) return 1;
03980
03981 if (nGL_t==0) {
03982 *location = Vertex;
03983 } else if (nGL_t<0 || nGL_t >1) {
03984 cgi_error("Invalid definition of GridLocation for %s",parent_name);
03985 return 1;
03986 } else if (nGL_t==1) {
03987
03988
03989 if (cgi_read_string(id[0], name, &location_name)) return 1;
03990 free(id);
03991
03992 if (cgi_GridLocation(location_name, location)) return 1;
03993 free(location_name);
03994
03995 }
03996 return 0;
03997 }
03998
03999 int cgi_read_zonetype(double parent_id, char_33 parent_name, ZoneType_t *type) {
04000 int nchild;
04001 double *id;
04002 char *zonetype_name;
04003 char_33 name;
04004
04005
04006 if (cgi_get_nodes(parent_id, "ZoneType_t", &nchild, &id)) return 1;
04007 if (nchild==0) {
04008
04009 *type = Structured;
04010 return 0;
04011 }
04012
04013 if (nchild >1) {
04014 cgi_error("Invalid definition of ZoneType for %s",parent_name);
04015 return 1;
04016 }
04017
04018 if (cgi_read_string(id[0], name, &zonetype_name)) return 1;
04019 free(id);
04020
04021 if (cgi_ZoneType(zonetype_name, type)) return 1;
04022 free(zonetype_name);
04023 return 0;
04024 }
04025
04026 int cgi_read_simulation(double parent_id, SimulationType_t *type,
04027 double *type_id) {
04028 int nchild;
04029 double *id;
04030 char *type_name;
04031 char_33 name;
04032
04033
04034 *type = SimulationTypeNull;
04035 *type_id = 0;
04036
04037
04038 if (cgi_get_nodes(parent_id, "SimulationType_t", &nchild, &id)) return 1;
04039 if (nchild==0) return 0;
04040 if (nchild >1) {
04041 cgi_error("File incorrect: multiple definition of SimulationType");
04042 return 1;
04043 }
04044 *type_id = id[0];
04045 if (cgi_read_string(id[0], name, &type_name)) return 1;
04046 free(id);
04047
04048 if (cgi_SimulationType(type_name, type)) return 1;
04049 free(type_name);
04050 return 0;
04051 }
04052
04053 int cgi_read_biter(int in_link, double parent_id, cgns_biter **biter) {
04054 double *id;
04055 char_33 datatype;
04056 cgns_array *array;
04057 int ndim, dim_vals[12], *data, nnod;
04058 int i, linked;
04059 int nzones_max = 0, nfamilies_max = 0;
04060 void *vdata;
04061
04062
04063 if (cgi_get_nodes(parent_id, "BaseIterativeData_t", &nnod, &id)) return 1;
04064 if (nnod<=0) {
04065 biter[0]=0;
04066 return 0;
04067 } else if (nnod>1) {
04068 cgi_error("Error: Multiple BaseIterativeData_t found...");
04069 return 1;
04070 }
04071
04072 biter[0] = CGNS_NEW(cgns_biter, 1);
04073
04074 biter[0]->id = id[0];
04075 biter[0]->link = cgi_read_link(id[0]);
04076 biter[0]->in_link = in_link;
04077 linked = biter[0]->link ? 1 : in_link;
04078 free(id);
04079
04080
04081 if (cgi_read_DDD(linked, biter[0]->id, &biter[0]->ndescr, &biter[0]->descr,
04082 &biter[0]->data_class, &biter[0]->units)) return 1;
04083
04084
04085 NumberOfSteps = biter[0]->nsteps = 0;
04086 if (cgi_read_node(biter[0]->id, biter[0]->name, datatype, &ndim,
04087 dim_vals, &vdata, READ_DATA)) {
04088 cgi_error("Error reading BaseIterativeData_t");
04089 return 1;
04090 }
04091 if (ndim!=1 || dim_vals[0]!=1 || strcmp(datatype,"I4")) {
04092 cgi_error("Error in data dimension or type for NumberOfSteps");
04093 return 1;
04094 }
04095 data = (int *)vdata;
04096 if (data[0]<0) {
04097 cgi_error("Error in data: NumberOfSteps<0!");
04098 return 1;
04099 }
04100 NumberOfSteps = biter[0]->nsteps = data[0];
04101 if (biter[0]->nsteps == 0) return 0;
04102 free(vdata);
04103
04104
04105 if (cgi_read_user_data(linked, biter[0]->id, &biter[0]->nuser_data,
04106 &biter[0]->user_data)) return 1;
04107
04108
04109 if (cgi_get_nodes(biter[0]->id, "DataArray_t", &biter[0]->narrays, &id))
04110 return 1;
04111 if (biter[0]->narrays == 0) return 0;
04112 biter[0]->array = CGNS_NEW(cgns_array, biter[0]->narrays);
04113
04114 for (i=0; i<(biter[0]->narrays); i++) {
04115 biter[0]->array[i].id = id[i];
04116 biter[0]->array[i].link = cgi_read_link(id[i]);
04117 biter[0]->array[i].in_link = linked;
04118 if (cgi_read_array(&biter[0]->array[i], "BaseIterativeData_t",
04119 biter[0]->id)) return 1;
04120 array = &biter[0]->array[i];
04121
04122
04123 if (strcmp("TimeValues",array->name)==0 ||
04124 strcmp("IterationValues",array->name)==0 ||
04125 strcmp("NumberOfZones",array->name)==0 ||
04126 strcmp("NumberOfFamilies",array->name)==0) {
04127 if (array->data_dim!=1 || array->dim_vals[0]!=biter[0]->nsteps) {
04128 cgi_error("Error: Array '%s' incorrectly sized",array->name);
04129 return 1;
04130 }
04131 if ((strcmp("TimeValues",array->name)==0 && strcmp(array->data_type,"R4") &&
04132 strcmp(array->data_type,"R8")) ||
04133 (strcmp("IterationValues",array->name)==0 && strcmp(array->data_type,"I4"))) {
04134 cgi_error("Incorrect data type for %s under %s",array->name,biter[0]->name);
04135 return 1;
04136 }
04137 }
04138 }
04139
04140 free(id);
04141
04142
04143 for (i=0; i<(biter[0]->narrays); i++) {
04144 array = &biter[0]->array[i];
04145 if (strcmp("TimeValues",array->name)==0 || strcmp("IterationValues",array->name)==0) break;
04146 if (i == ((biter[0]->narrays)-1)) {
04147 cgi_error("Error: TimeValues or IterationValues must be defined for '%s'",biter[0]->name);
04148 return 1;
04149 }
04150 }
04151
04152
04153 for (i=0; i<(biter[0]->narrays); i++) {
04154 int step;
04155 array = &biter[0]->array[i];
04156 if (strcmp("NumberOfZones",array->name)==0) {
04157 for (step=0; step<biter[0]->nsteps; step++) {
04158 int nzones = *((int *)(array->data)+step);
04159 nzones_max = MAX(nzones_max, nzones);
04160 }
04161 } else if (strcmp("NumberOfFamilies",array->name)==0) {
04162 for (step=0; step<biter[0]->nsteps; step++) {
04163 int nfamilies = *((int *)(array->data)+step);
04164 nfamilies_max = MAX(nfamilies_max, nfamilies);
04165 }
04166 }
04167 }
04168
04169
04170
04171 for (i=0; i<(biter[0]->narrays); i++) {
04172 array = &biter[0]->array[i];
04173 if (strcmp("ZonePointers",array->name)==0) {
04174 if (nzones_max==0) {
04175 cgi_error("NumberofZones (DataArray_t) missing under %s",biter[0]->name);
04176 return 1;
04177 } else {
04178 if (array->data_dim!=3 || array->dim_vals[0]!=32 || array->dim_vals[1]!=nzones_max ||
04179 array->dim_vals[2]!=biter[0]->nsteps || strcmp(array->data_type,"C1")) {
04180 cgi_error("Incorrect definition of ZonePointers under %s",biter[0]->name);
04181 return 1;
04182 }
04183 }
04184 } else if (strcmp("FamilyPointers",array->name)==0) {
04185 if (nfamilies_max==0) {
04186 cgi_error("NumberOfFamilies (DataArray_t) missing under %s",biter[0]->name);
04187 return 1;
04188 } else {
04189 if (array->data_dim!=3 || array->dim_vals[0]!=32 || array->dim_vals[1]!=nfamilies_max ||
04190 array->dim_vals[2]!=biter[0]->nsteps || strcmp(array->data_type,"C1")) {
04191 cgi_error("Incorrect definition of FamilyPointers under %s",biter[0]->name);
04192 return 1;
04193 }
04194 }
04195 }
04196 }
04197 return 0;
04198 }
04199
04200 int cgi_read_ziter(int in_link, double parent_id, cgns_ziter **ziter) {
04201 double *id;
04202 cgns_array *array;
04203 char_33 datatype;
04204 int ndim, dim_vals[12], nnod;
04205 void *data;
04206 int i, linked;
04207
04208
04209 if (cgi_get_nodes(parent_id, "ZoneIterativeData_t", &nnod, &id)) return 1;
04210 if (nnod<=0) {
04211 ziter[0]=0;
04212 return 0;
04213 } else if (nnod>1) {
04214 cgi_error("Error: Multiple ZoneIterativeData_t found...");
04215 return 1;
04216 }
04217 ziter[0] = CGNS_NEW(cgns_ziter, 1);
04218 ziter[0]->id = id[0];
04219 ziter[0]->link = cgi_read_link(id[0]);
04220 ziter[0]->in_link = in_link;
04221 linked = ziter[0]->link ? 1 : in_link;
04222 free(id);
04223
04224
04225 if (cgi_read_node(ziter[0]->id, ziter[0]->name, datatype, &ndim,
04226 dim_vals, &data, READ_DATA)) {
04227 cgi_error("Error reading ZoneIterativeData_t");
04228 return 1;
04229 }
04230 if (strcmp(datatype,"MT")) {
04231 cgi_error("Error in ZoneIterativeData_t node");
04232 return 1;
04233 }
04234
04235
04236 if (cgi_read_DDD(linked, ziter[0]->id, &ziter[0]->ndescr, &ziter[0]->descr,
04237 &ziter[0]->data_class, &ziter[0]->units)) return 1;
04238
04239
04240 if (cgi_read_user_data(linked, ziter[0]->id, &ziter[0]->nuser_data,
04241 &ziter[0]->user_data)) return 1;
04242
04243
04244 if (cgi_get_nodes(ziter[0]->id, "DataArray_t", &ziter[0]->narrays, &id))
04245 return 1;
04246 if (ziter[0]->narrays==0) return 0;
04247 ziter[0]->array = CGNS_NEW(cgns_array,ziter[0]->narrays);
04248
04249 for (i=0; i<(ziter[0]->narrays); i++) {
04250 ziter[0]->array[i].id = id[i];
04251 ziter[0]->array[i].link = cgi_read_link(id[i]);
04252 ziter[0]->array[i].in_link = linked;
04253 if (cgi_read_array(&ziter[0]->array[i], "ZoneIterativeData_t",
04254 ziter[0]->id)) return 1;
04255 array = &ziter[0]->array[i];
04256
04257
04258 if (strcmp("RigidGridMotionPointers",array->name)==0 ||
04259 strcmp("ArbitraryGridMotionPointers",array->name)==0 ||
04260 strcmp("GridCoordinatesPointers",array->name)==0 ||
04261 strcmp("FlowSolutionPointers",array->name)==0) {
04262 if (array->data_dim!=2 || array->dim_vals[0]!=32 ||
04263 array->dim_vals[1]!=NumberOfSteps) {
04264 cgi_error("Error: Array '%s/%s' incorrectly sized", ziter[0]->name, array->name);
04265 return 1;
04266 }
04267 if (strcmp(array->data_type,"C1")) {
04268 cgi_error("Incorrect data type for %s under %s",array->name,ziter[0]->name);
04269 return 1;
04270 }
04271 }
04272 }
04273 free(id);
04274
04275 return 0;
04276 }
04277
04278 int cgi_read_user_data(int in_link, double parent_id, int *nuser_data,
04279 cgns_user_data **user_data) {
04280 double *id, *idi;
04281 int n, i, linked;
04282 double *IA_id, *IR_id;
04283 int nIA_t, nIR_t, nn;
04284 char_33 name;
04285
04286 if (cgi_get_nodes(parent_id, "UserDefinedData_t", nuser_data, &id))
04287 return 1;
04288 if (*nuser_data<=0) {
04289 user_data[0] = 0;
04290 return 0;
04291 }
04292
04293 user_data[0] = CGNS_NEW(cgns_user_data, (*nuser_data));
04294 for (n=0; n<(*nuser_data); n++) {
04295 user_data[0][n].id = id[n];
04296 user_data[0][n].link = cgi_read_link(id[n]);
04297 user_data[0][n].in_link = in_link;
04298 linked = user_data[0][n].link ? 1 : in_link;
04299
04300
04301 if (cgio_get_name(cg->cgio, user_data[0][n].id, user_data[0][n].name)) {
04302 cg_io_error("cgio_get_name");
04303 return 1;
04304 }
04305
04306
04307 if (cgi_read_DDD(linked, id[n], &user_data[0][n].ndescr,
04308 &user_data[0][n].descr, &user_data[0][n].data_class,
04309 &user_data[0][n].units)) return 1;
04310
04311
04312 if (cgi_get_nodes(id[n], "DataArray_t", &user_data[0][n].narrays,
04313 &idi)) return 1;
04314 if (user_data[0][n].narrays>0) {
04315 user_data[0][n].array = CGNS_NEW(cgns_array, user_data[0][n].narrays);
04316 for (i=0; i<user_data[0][n].narrays; i++) {
04317 user_data[0][n].array[i].id = idi[i];
04318 user_data[0][n].array[i].link = cgi_read_link(idi[i]);
04319 user_data[0][n].array[i].in_link = linked;
04320 if (cgi_read_array(&user_data[0][n].array[i],
04321 "UserDefinedData_t", user_data[0][n].id)) return 1;
04322 }
04323 free(idi);
04324 }
04325
04326
04327 if (cgi_read_location(user_data[0][n].id, user_data[0][n].name,
04328 &user_data[0][n].location)) return 1;
04329
04330
04331 if (cgi_read_family_name(linked, user_data[0][n].id,
04332 user_data[0][n].name,
04333 user_data[0][n].family_name))
04334 return 1;
04335
04336
04337 if (cgi_read_ordinal(user_data[0][n].id, &user_data[0][n].ordinal))
04338 return 1;
04339
04340
04341
04342
04343
04344 if (cgi_get_nodes(user_data[0][n].id, "IndexArray_t", &nIA_t,
04345 &IA_id)) return 1;
04346 if (cgi_get_nodes(user_data[0][n].id, "IndexRange_t", &nIR_t,
04347 &IR_id)) return 1;
04348
04349
04350 user_data[0][n].ptset = 0;
04351
04352 for (nn=0; nn<nIR_t; nn++)
04353 {
04354 if (cgio_get_name(cg->cgio, IR_id[nn], name)) {
04355 cg_io_error("cgio_get_name");
04356 return 1;
04357 }
04358 if (strcmp(name,"PointRange") && strcmp(name,"ElementRange")) {
04359 cgi_error("Invalid name for IndexRange_t");
04360 return 1;
04361 }
04362 if (user_data[0][n].ptset!=0) {
04363 cgi_error("Multiple definition of boundary patch found");
04364 return 1;
04365 }
04366 user_data[0][n].ptset = CGNS_NEW(cgns_ptset, 1);
04367 if (strcmp(name,"ElementRange")==0)
04368 user_data[0][n].ptset->type = ElementRange;
04369 else
04370 user_data[0][n].ptset->type = PointRange;
04371 user_data[0][n].ptset->id=IR_id[nn];
04372 user_data[0][n].ptset->link=cgi_read_link(IR_id[nn]);
04373 user_data[0][n].ptset->in_link=linked;
04374 if (cgi_read_ptset(user_data[0][n].id, user_data[0][n].ptset))
04375 return 1;
04376 }
04377 if (nIR_t) free(IR_id);
04378
04379 for (nn=0; nn<nIA_t; nn++)
04380 {
04381 if (cgio_get_name(cg->cgio, IA_id[nn], name)) {
04382 cg_io_error("cgio_get_name");
04383 return 1;
04384 }
04385 if (strcmp(name, "PointList") && strcmp(name,"ElementList"))
04386 continue;
04387
04388 if (user_data[0][n].ptset!=0) {
04389 cgi_error("Multiple definition of boundary patch found");
04390 return 1;
04391 }
04392 user_data[0][n].ptset = CGNS_NEW(cgns_ptset, 1);
04393 if (strcmp(name,"ElementList")==0)
04394 user_data[0][n].ptset->type = ElementList;
04395 else
04396 user_data[0][n].ptset->type = PointList;
04397 user_data[0][n].ptset->id = IA_id[nn];
04398 user_data[0][n].ptset->link = cgi_read_link(IA_id[nn]);
04399 user_data[0][n].ptset->in_link = linked;
04400 if (cgi_read_ptset(user_data[0][n].id, user_data[0][n].ptset))
04401 return 1;
04402 }
04403
04404 if (nIA_t) free(IA_id);
04405
04406
04407 if (cgi_read_user_data(linked, user_data[0][n].id,
04408 &user_data[0][n].nuser_data, &user_data[0][n].user_data)) return 1;
04409 }
04410 free(id);
04411
04412 return 0;
04413 }
04414
04415 int cgi_read_node(double node_id, char_33 name, char_33 data_type,
04416 int *ndim, int *dim_vals, void **data, int data_flag) {
04417
04418 int size=1, n;
04419
04420
04421 if (cgio_get_name(cg->cgio, node_id, name)) {
04422 cg_io_error("cgio_get_name");
04423 return 1;
04424 }
04425
04426
04427 if (cgio_get_data_type(cg->cgio, node_id, data_type)) {
04428 cg_io_error("cgio_get_data_type");
04429 return 1;
04430 }
04431
04432 if (strcmp(data_type,"MT")==0) {
04433 *ndim = 0;
04434 return 0;
04435 }
04436
04437 if (cgio_get_dimensions(cg->cgio, node_id, ndim, dim_vals)) {
04438 cg_io_error("cgio_get_dimensions");
04439 return 1;
04440 }
04441
04442
04443 if (!data_flag) return 0;
04444
04445
04446 for (n=0; n<(*ndim); n++) size*=dim_vals[n];
04447 if (size<=0) {
04448 cgi_error("Error reading node %s",name);
04449 return 1;
04450 }
04451 if (strcmp(data_type,"I4")==0) data[0]=CGNS_NEW(int, size);
04452 else if (strcmp(data_type,"R4")==0) data[0]=CGNS_NEW(float, size);
04453 else if (strcmp(data_type,"R8")==0) data[0]=CGNS_NEW(double, size);
04454 else if (strcmp(data_type,"C1")==0) data[0]=CGNS_NEW(char, size+1);
04455
04456
04457 if (cgio_read_all_data(cg->cgio, node_id, data[0])) {
04458 cg_io_error("cgio_read_all_data");
04459 return 1;
04460 }
04461 return 0;
04462 }
04463
04464 cgns_link *cgi_read_link (double node_id) {
04465 int len;
04466 cgns_link *link;
04467
04468 if (cgio_is_link(cg->cgio, node_id, &len)) {
04469 cg_io_error ("cgio_is_link");
04470 return 0;
04471 }
04472 if (len > 0) {
04473 int file_len, name_len;
04474 if (cgio_link_size (cg->cgio, node_id, &file_len, &name_len)) {
04475 cg_io_error ("cgio_link_size");
04476 return 0;
04477 }
04478 len = name_len + file_len + 2;
04479 link = (cgns_link *) cgi_malloc (1, len + sizeof(cgns_link));
04480 link->filename = (char *)(link + 1);
04481 link->name_in_file = link->filename + file_len + 1;
04482 if (cgio_get_link(cg->cgio, node_id, link->filename,
04483 link->name_in_file)) {
04484 free (link);
04485 cg_io_error ("cgio_get_link");
04486 return 0;
04487 }
04488 link->filename[file_len] = 0;
04489 link->name_in_file[name_len] = 0;
04490 return link;
04491 }
04492 return 0;
04493 }
04494
04495 int cgi_datasize(int Idim, int *CurrentDim, GridLocation_t location,
04496 int *rind_planes, int *DataSize) {
04497 int j;
04498
04499 if (location==Vertex) {
04500 for (j=0; j<Idim; j++)
04501 DataSize[j] = CurrentDim[j] + rind_planes[2*j] + rind_planes[2*j+1];
04502
04503 } else if (location==CellCenter) {
04504 for (j=0; j<Idim; j++)
04505 DataSize[j] = CurrentDim[j+Idim] + rind_planes[2*j] + rind_planes[2*j+1];
04506
04507 } else if (location == IFaceCenter || location == JFaceCenter ||
04508 location == KFaceCenter) {
04509 for (j=0; j<Idim; j++) {
04510 DataSize[j] = CurrentDim[j] + rind_planes[2*j] + rind_planes[2*j+1];
04511 if ((location == IFaceCenter && j!=0) ||
04512 (location == JFaceCenter && j!=1) ||
04513 (location == KFaceCenter && j!=2)) DataSize[j]--;
04514 }
04515 } else {
04516 cgi_error("Location not yet supported");
04517 return 1;
04518 }
04519 return 0;
04520 }
04521
04522
04523
04524
04525
04526
04527 int cgi_write(int file_number) {
04528 cgns_base *base;
04529 int n, b;
04530 int dim_vals;
04531 double dummy_id;
04532 float FileVersion;
04533
04534 cg = cgi_get_file(file_number);
04535 if (cg == 0) return 1;
04536
04537
04538 dim_vals = 1;
04539
04540
04541
04542
04543
04544
04545
04546
04547
04548
04549
04550
04551
04552
04553 FileVersion = (float) CGNS_DOTVERS;
04554 if (cgi_new_node(cg->rootid, "CGNSLibraryVersion",
04555 "CGNSLibraryVersion_t", &dummy_id, "R4", 1, &dim_vals,
04556 (void *)&FileVersion)) return 1;
04557
04558
04559 for (b=0; b<cg->nbases; b++) {
04560 int *data;
04561 data = CGNS_NEW(int, 2);
04562 base = &(cg->base[b]);
04563
04564 data[0]=base->cell_dim;
04565 data[1]=base->phys_dim;
04566
04567
04568 dim_vals=2;
04569 if (cgi_new_node(cg->rootid, base->name, "CGNSBase_t", &base->id,
04570 "I4", 1, &dim_vals, (void *)data)) return 1;
04571 free(data);
04572
04573
04574 Cdim = base->cell_dim;
04575 Pdim = base->phys_dim;
04576
04577
04578 for (n=0; n<base->ndescr; n++)
04579 if (cgi_write_descr(base->id, &base->descr[n])) return 1;
04580
04581
04582 if (base->state && cgi_write_state(base->id, base->state)) return 1;
04583
04584
04585 if (base->gravity && cgi_write_gravity(base->id, base->gravity)) return 1;
04586
04587
04588 if (base->axisym && cgi_write_axisym(base->id, base->axisym)) return 1;
04589
04590
04591 if (base->rotating && cgi_write_rotating(base->id, base->rotating)) return 1;
04592
04593
04594 for (n=0; n<base->nzones; n++) {
04595 if (cgi_write_zone(base->id, &base->zone[n])) return 1;
04596 }
04597
04598
04599 for (n=0; n<base->nfamilies; n++)
04600 if (cgi_write_family(base->id, &base->family[n])) return 1;
04601
04602
04603 if (base->data_class && cgi_write_dataclass(base->id, base->data_class))
04604 return 1;
04605
04606
04607 if (base->units && cgi_write_units(base->id, base->units))
04608 return 1;
04609
04610
04611 if (base->converg && cgi_write_converg(base->id, base->converg))
04612 return 1;
04613
04614
04615 if (base->equations && cgi_write_equations(base->id, base->equations))
04616 return 1;
04617
04618
04619 for (n=0; n<base->nintegrals; n++)
04620 if (cgi_write_integral(base->id, &base->integral[n])) return 1;
04621
04622
04623 if (base->type) {
04624 dim_vals = strlen(SimulationTypeName[base->type]);
04625 if (cgi_new_node(base->id, "SimulationType", "SimulationType_t", &base->type_id,
04626 "C1", 1, &dim_vals, (void *)SimulationTypeName[base->type])) return 1;
04627 }
04628
04629
04630 if (base->biter && cgi_write_biter(base->id, base->biter)) return 1;
04631
04632
04633 for (n=0; n<base->nuser_data; n++)
04634 if (cgi_write_user_data(base->id, &base->user_data[n])) return 1;
04635
04636 }
04637 return 0;
04638 }
04639
04640 int cgi_write_zone(double parent_id, cgns_zone *zone) {
04641 int n, dim_vals[2];
04642 double dummy_id;
04643
04644 Idim = zone->index_dim;
04645 if (zone->link) {
04646 return cgi_write_link(parent_id, zone->name, zone->link, &zone->id);
04647 }
04648
04649
04650 dim_vals[0]= Idim;
04651 dim_vals[1]= 3;
04652 if (cgi_new_node(parent_id, zone->name, "Zone_t", &zone->id,
04653 "I4", 2, dim_vals, (void *)zone->nijk)) return 1;
04654
04655
04656 dim_vals[0] = strlen(ZoneTypeName[zone->type]);
04657 if (cgi_new_node(zone->id, "ZoneType", "ZoneType_t", &dummy_id,
04658 "C1", 1, dim_vals, (void *)ZoneTypeName[zone->type])) return 1;
04659
04660
04661
04662
04663
04664
04665 for (n=0; n<zone->nzcoor; n++)
04666 if (cgi_write_zcoor(zone->id, &zone->zcoor[n])) return 1;
04667
04668
04669 if (zone->family_name[0]!='\0') {
04670 int dim_vals = strlen(zone->family_name);
04671 if (cgi_new_node(zone->id, "FamilyName", "FamilyName_t", &dummy_id, "C1",
04672 1, &dim_vals, (void *)zone->family_name)) return 1;
04673 }
04674
04675
04676 for (n=0; n<zone->nsections; n++)
04677 if (cgi_write_section(zone->id, &zone->section[n])) return 1;
04678
04679
04680 for (n=0; n<zone->nsols; n++)
04681 if (cgi_write_sol(zone->id, &zone->sol[n])) return 1;
04682
04683
04684 if (zone->zconn && cgi_write_zconn(zone->id, zone->zconn)) return 1;
04685
04686
04687 if (zone->zboco && cgi_write_zboco(zone->id, zone->zboco)) return 1;
04688
04689
04690 for (n=0; n<zone->ndiscrete; n++)
04691 if (cgi_write_discrete(zone->id, &zone->discrete[n])) return 1;
04692
04693
04694 for (n=0; n<zone->ndescr; n++)
04695 if (cgi_write_descr(zone->id, &zone->descr[n])) return 1;
04696
04697
04698 if (zone->state && cgi_write_state(zone->id, zone->state)) return 1;
04699
04700
04701 if (zone->data_class && cgi_write_dataclass(zone->id, zone->data_class))
04702 return 1;
04703
04704
04705 if (zone->units && cgi_write_units(zone->id, zone->units))
04706 return 1;
04707
04708
04709 if (zone->converg && cgi_write_converg(zone->id, zone->converg))
04710 return 1;
04711
04712
04713 if (zone->equations && cgi_write_equations(zone->id, zone->equations))
04714 return 1;
04715
04716
04717 for (n=0; n<zone->nintegrals; n++)
04718 if (cgi_write_integral(zone->id, &zone->integral[n])) return 1;
04719
04720
04721 if (zone->ordinal && cgi_write_ordinal(zone->id, zone->ordinal)) return 1;
04722
04723
04724 for (n=0; n<zone->nrmotions; n++)
04725 if (cgi_write_rmotion(zone->id, &zone->rmotion[n])) return 1;
04726
04727
04728 for (n=0; n<zone->namotions; n++)
04729 if (cgi_write_amotion(zone->id, &zone->amotion[n])) return 1;
04730
04731
04732 if (zone->ziter && cgi_write_ziter(zone->id, zone->ziter)) return 1;
04733
04734
04735 for (n=0; n<zone->nuser_data; n++)
04736 if (cgi_write_user_data(zone->id, &zone->user_data[n])) return 1;
04737
04738
04739 if (zone->rotating && cgi_write_rotating(zone->id, zone->rotating)) return 1;
04740
04741 return 0;
04742 }
04743
04744 int cgi_write_family(double parent_id, cgns_family *family) {
04745 int n, dim_vals;
04746
04747 if (family->link) {
04748 return cgi_write_link(parent_id, family->name,
04749 family->link, &family->id);
04750 }
04751
04752
04753 if (cgi_new_node(parent_id, family->name, "Family_t",
04754 &family->id, "MT", 0, 0, 0)) return 1;
04755
04756
04757 for (n=0; n<family->ndescr; n++)
04758 if (cgi_write_descr(family->id, &family->descr[n])) return 1;
04759
04760
04761 for (n=0; n<family->nfambc; n++) {
04762 cgns_fambc *fambc = &family->fambc[n];
04763 if (fambc->link) {
04764 if (cgi_write_link(family->id, fambc->name,
04765 fambc->link, &fambc->id)) return 1;
04766 }
04767 else {
04768 dim_vals = strlen(BCTypeName[fambc->type]);
04769 if (cgi_new_node(family->id, fambc->name, "FamilyBC_t",
04770 &fambc->id, "C1", 1, &dim_vals, BCTypeName[fambc->type]))
04771 return 1;
04772
04773 for (n=0; n < fambc->ndataset; n++)
04774 if (cgi_write_dataset(fambc->id, &fambc->dataset[n])) return 1;
04775 }
04776 }
04777
04778
04779 for (n=0; n<family->ngeos; n++) {
04780 int i, dim_vals;
04781 double dummy_id;
04782 cgns_geo *geo = &family->geo[n];
04783
04784 if (geo->link) {
04785 if (cgi_write_link(family->id, geo->name, geo->link, &geo->id))
04786 return 1;
04787 }
04788 else {
04789 if (cgi_new_node(family->id, geo->name, "GeometryReference_t",
04790 &geo->id, "MT", 0, 0, 0)) return 1;
04791
04792 for (i=0; i<geo->ndescr; i++)
04793 if (cgi_write_descr(geo->id, &geo->descr[i])) return 1;
04794
04795
04796 dim_vals = strlen(geo->file);
04797 if (cgi_new_node(geo->id, "GeometryFile", "GeometryFile_t",
04798 &dummy_id, "C1", 1, &dim_vals, geo->file)) return 1;
04799
04800
04801 dim_vals = strlen(geo->format);
04802 if (cgi_new_node(geo->id, "GeometryFormat", "GeometryFormat_t",
04803 &dummy_id, "C1", 1, &dim_vals, geo->format)) return 1;
04804
04805
04806 for (i=0; i<geo->npart; i++) {
04807 if (cgi_new_node(geo->id, geo->part[i].name, "GeometryEntity_t",
04808 &dummy_id, "MT", 0, 0, 0)) return 1;
04809 }
04810
04811
04812 for (i=0; i<geo->nuser_data; i++) {
04813 if (cgi_write_user_data(geo->id, &geo->user_data[i])) return 1;
04814 }
04815 }
04816 }
04817
04818
04819 if (family->ordinal &&
04820 cgi_write_ordinal(family->id, family->ordinal)) return 1;
04821
04822
04823 for (n=0; n<family->nuser_data; n++)
04824 if (cgi_write_user_data(family->id, &family->user_data[n])) return 1;
04825
04826
04827 if (family->rotating && cgi_write_rotating(family->id, family->rotating))
04828 return 1;
04829
04830 return 0;
04831 }
04832
04833 int cgi_write_section(double parent_id, cgns_section *section) {
04834 int n, dim_vals, data[2];
04835 double dummy_id;
04836
04837 if (section->link) {
04838 return cgi_write_link(parent_id, section->name,
04839 section->link, §ion->id);
04840 }
04841
04842
04843 dim_vals = 2;
04844 data[0]=section->el_type;
04845 data[1]=section->el_bound;
04846 if (cgi_new_node(parent_id, section->name, "Elements_t",
04847 §ion->id, "I4", 1, &dim_vals, data)) return 1;
04848
04849
04850 if (cgi_new_node(section->id, "ElementRange", "IndexRange_t", &dummy_id,
04851 "I4", 1, &dim_vals, section->range)) return 1;
04852
04853
04854 if (cgi_write_array(section->id, section->connect)) return 1;
04855
04856
04857 if (section->parent && cgi_write_array(section->id, section->parent)) return 1;
04858
04859
04860 for (n=0; n<section->ndescr; n++)
04861 if (cgi_write_descr(section->id, §ion->descr[n])) return 1;
04862
04863
04864 for (n=0; n<section->nuser_data; n++)
04865 if (cgi_write_user_data(section->id, §ion->user_data[n])) return 1;
04866
04867 return 0;
04868 }
04869
04870 int cgi_write_zcoor(double parent_id, cgns_zcoor *zcoor) {
04871 int n;
04872
04873 if (zcoor->link) {
04874 return cgi_write_link(parent_id, zcoor->name,
04875 zcoor->link, &zcoor->id);
04876 }
04877
04878
04879 if (cgi_new_node(parent_id, zcoor->name, "GridCoordinates_t",
04880 &zcoor->id, "MT", 0, 0, 0)) return 1;
04881
04882
04883 if (cgi_write_rind(zcoor->id, zcoor->rind_planes, Idim)) return 1;
04884
04885
04886 for (n=0; n<zcoor->ndescr; n++)
04887 if (cgi_write_descr(zcoor->id, &zcoor->descr[n])) return 1;
04888
04889
04890 if (zcoor->data_class &&
04891 cgi_write_dataclass(zcoor->id, zcoor->data_class)) return 1;
04892
04893
04894 if (zcoor->units && cgi_write_units(zcoor->id, zcoor->units)) return 1;
04895
04896
04897 for (n=0; n<zcoor->ncoords; n++)
04898 if (cgi_write_array(zcoor->id, &zcoor->coord[n])) return 1;
04899
04900
04901 for (n=0; n<zcoor->nuser_data; n++)
04902 if (cgi_write_user_data(zcoor->id, &zcoor->user_data[n])) return 1;
04903
04904 return 0;
04905 }
04906
04907 int cgi_write_sol(double parent_id, cgns_sol *sol) {
04908 int n, dim_vals;
04909 double dummy_id;
04910
04911 if (sol->link) {
04912 return cgi_write_link(parent_id, sol->name, sol->link, &sol->id);
04913 }
04914
04915
04916 if (cgi_new_node(parent_id, sol->name, "FlowSolution_t",
04917 &sol->id, "MT", 0, 0, 0)) return 1;
04918
04919
04920 if (sol->location!=Vertex) {
04921 dim_vals = strlen(GridLocationName[sol->location]);
04922 if (cgi_new_node(sol->id, "GridLocation", "GridLocation_t",
04923 &dummy_id, "C1", 1, &dim_vals,
04924 (void *)GridLocationName[sol->location])) return 1;
04925 }
04926
04927
04928 if (cgi_write_rind(sol->id, sol->rind_planes, Idim)) return 1;
04929
04930
04931 for (n=0; n<sol->ndescr; n++)
04932 if (cgi_write_descr(sol->id, &sol->descr[n])) return 1;
04933
04934
04935 if (sol->data_class &&
04936 cgi_write_dataclass(sol->id, sol->data_class)) return 1;
04937
04938
04939 if (sol->units && cgi_write_units(sol->id, sol->units)) return 1;
04940
04941
04942 for (n=0; n<sol->nfields; n++)
04943 if (cgi_write_array(sol->id, &sol->field[n])) return 1;
04944
04945
04946 for (n=0; n<sol->nuser_data; n++)
04947 if (cgi_write_user_data(sol->id, &sol->user_data[n])) return 1;
04948
04949 return 0;
04950 }
04951
04952 int cgi_write_zconn(double parent_id, cgns_zconn *zconn) {
04953 int n;
04954
04955 if (zconn->link) {
04956 return cgi_write_link(parent_id, "ZoneGridConnectivity",
04957 zconn->link, &zconn->id);
04958 }
04959
04960
04961 if (cgi_new_node(parent_id, "ZoneGridConnectivity", "ZoneGridConnectivity_t",
04962 &zconn->id, "MT", 0, 0, 0)) return 1;
04963
04964
04965 for (n=0; n<zconn->n1to1; n++)
04966 if (cgi_write_1to1(zconn->id, &zconn->one21[n])) return 1;
04967
04968
04969 for (n=0; n<zconn->nconns; n++)
04970 if (cgi_write_conns(zconn->id, &zconn->conn[n])) return 1;
04971
04972
04973 for (n=0; n<zconn->nholes; n++)
04974 if (cgi_write_holes(zconn->id, &zconn->hole[n])) return 1;
04975
04976
04977 for (n=0; n<zconn->ndescr; n++)
04978 if (cgi_write_descr(zconn->id, &zconn->descr[n])) return 1;
04979
04980
04981 for (n=0; n<zconn->nuser_data; n++)
04982 if (cgi_write_user_data(zconn->id, &zconn->user_data[n])) return 1;
04983
04984 return 0;
04985 }
04986
04987 int cgi_write_1to1(double parent_id, cgns_1to1 *one21) {
04988 int n, dim_vals;
04989 double dummy_id;
04990 cgns_ptset *ptset;
04991
04992 if (one21->link) {
04993 return cgi_write_link(parent_id, one21->name,
04994 one21->link, &one21->id);
04995 }
04996
04997 dim_vals = strlen(one21->donor);
04998 if (cgi_new_node(parent_id, one21->name, "GridConnectivity1to1_t",
04999 &one21->id, "C1", 1, &dim_vals, one21->donor)) return 1;
05000
05001
05002 if (cgi_new_node(one21->id, "Transform", "\"int[IndexDimension]\"", &dummy_id,
05003 "I4", 1, &Idim, (void *)one21->transform)) return 1;
05004
05005
05006 ptset = &(one21->ptset);
05007 if (cgi_move_node(cg->rootid, ptset->id, one21->id,
05008 PointSetTypeName[ptset->type])) return 1;
05009
05010 ptset = &(one21->dptset);
05011 if (cgi_move_node(cg->rootid, ptset->id, one21->id,
05012 PointSetTypeName[ptset->type])) return 1;
05013
05014
05015 for (n=0; n<one21->ndescr; n++)
05016 if (cgi_write_descr(one21->id, &one21->descr[n])) return 1;
05017
05018
05019 if (one21->ordinal &&
05020 cgi_write_ordinal(one21->id, one21->ordinal)) return 1;
05021
05022
05023 for (n=0; n<one21->nuser_data; n++)
05024 if (cgi_write_user_data(one21->id, &one21->user_data[n])) return 1;
05025
05026
05027 if (one21->cprop &&
05028 cgi_write_cprop(one21->id, one21->cprop)) return 1;
05029
05030 return 0;
05031 }
05032
05033 int cgi_write_conns(double parent_id, cgns_conn *conn) {
05034 int n, dim_vals;
05035 double dummy_id;
05036 cgns_ptset *ptset;
05037
05038 if (conn->link) {
05039 return cgi_write_link(parent_id, conn->name,
05040 conn->link, &conn->id);
05041 }
05042
05043 dim_vals = strlen(conn->donor);
05044 if (cgi_new_node(parent_id, conn->name, "GridConnectivity_t",
05045 &conn->id, "C1", 1, &dim_vals, conn->donor)) return 1;
05046
05047
05048 dim_vals = strlen(GridConnectivityTypeName[conn->type]);
05049 if (cgi_new_node(conn->id, "GridConnectivityType",
05050 "GridConnectivityType_t", &dummy_id, "C1", 1, &dim_vals,
05051 (void *)GridConnectivityTypeName[conn->type])) return 1;
05052
05053
05054 if (conn->location!=Vertex) {
05055 dim_vals = strlen(GridLocationName[conn->location]);
05056 if (cgi_new_node(conn->id, "GridLocation", "GridLocation_t",
05057 &dummy_id, "C1", 1, &dim_vals,
05058 (void *)GridLocationName[conn->location])) return 1;
05059 }
05060
05061
05062 ptset = &(conn->ptset);
05063 if (cgi_move_node(cg->rootid, ptset->id, conn->id,
05064 PointSetTypeName[ptset->type])) return 1;
05065
05066
05067 ptset = &(conn->dptset);
05068 if (ptset->id) {
05069 if (cgi_move_node(cg->rootid, ptset->id, conn->id,
05070 PointSetTypeName[ptset->type])) return 1;
05071 }
05072
05073
05074 if (conn->interpolants) {
05075 if (cgi_write_array(conn->id, conn->interpolants)) return 1;
05076 }
05077
05078
05079 for (n=0; n<conn->ndescr; n++)
05080 if (cgi_write_descr(conn->id, &conn->descr[n])) return 1;
05081
05082
05083 if (conn->ordinal &&
05084 cgi_write_ordinal(conn->id, conn->ordinal)) return 1;
05085
05086
05087 if (conn->cprop &&
05088 cgi_write_cprop(conn->id, conn->cprop)) return 1;
05089
05090
05091 for (n=0; n<conn->nuser_data; n++)
05092 if (cgi_write_user_data(conn->id, &conn->user_data[n])) return 1;
05093
05094 return 0;
05095 }
05096
05097 int cgi_write_cprop(double parent_id, cgns_cprop *cprop) {
05098 int dim_vals, n;
05099 double dummy_id;
05100
05101 if (cprop->link) {
05102 return cgi_write_link(parent_id, "GridConnectivityProperty",
05103 cprop->link, &cprop->id);
05104 }
05105
05106
05107 if (cgi_new_node(parent_id, "GridConnectivityProperty",
05108 "GridConnectivityProperty_t", &cprop->id, "MT", 0, 0, 0)) return 1;
05109
05110
05111 for (n=0; n<cprop->ndescr; n++)
05112 if (cgi_write_descr(cprop->id, &cprop->descr[n])) return 1;
05113
05114
05115 if (cprop->caverage) {
05116 cgns_caverage *caverage = cprop->caverage;
05117 if (caverage->link) {
05118 if (cgi_write_link(cprop->id, "AverageInterface",
05119 caverage->link, &caverage->id)) return 1;
05120 }
05121 else {
05122 if (cgi_new_node(cprop->id, "AverageInterface", "AverageInterface_t",
05123 &caverage->id, "MT", 0, 0, 0)) return 1;
05124
05125
05126 for (n=0; n<caverage->ndescr; n++)
05127 if (cgi_write_descr(caverage->id, &caverage->descr[n])) return 1;
05128
05129
05130 dim_vals = strlen(AverageInterfaceTypeName[caverage->type]);
05131 if (cgi_new_node(caverage->id, "AverageInterfaceType",
05132 "AverageInterfaceType_t", &dummy_id, "C1", 1, &dim_vals,
05133 (void *)AverageInterfaceTypeName[caverage->type])) return 1;
05134
05135
05136 for (n=0; n<caverage->nuser_data; n++)
05137 if (cgi_write_user_data(caverage->id, &caverage->user_data[n]))
05138 return 1;
05139 }
05140 }
05141
05142
05143 if (cprop->cperio) {
05144 cgns_cperio *cperio = cprop->cperio;
05145 if (cperio->link) {
05146 if (cgi_write_link(cprop->id, "Periodic",
05147 cperio->link, &cperio->id)) return 1;
05148 }
05149 else {
05150 if (cgi_new_node(cprop->id, "Periodic", "Periodic_t", &cperio->id,
05151 "MT", 0, 0, 0)) return 1;
05152
05153
05154 for (n=0; n<cperio->ndescr; n++)
05155 if (cgi_write_descr(cperio->id, &cperio->descr[n])) return 1;
05156
05157
05158 for (n=0; n<cperio->narrays; n++)
05159 if (cgi_write_array(cperio->id, &cperio->array[n])) return 1;
05160
05161
05162 if (cperio->data_class &&
05163 cgi_write_dataclass(cperio->id, cperio->data_class)) return 1;
05164
05165
05166 if (cperio->units &&
05167 cgi_write_units(cperio->id, cperio->units)) return 1;
05168
05169
05170 for (n=0; n<cperio->nuser_data; n++)
05171 if (cgi_write_user_data(cperio->id, &cperio->user_data[n])) return 1;
05172 }
05173 }
05174
05175
05176 for (n=0; n<cprop->nuser_data; n++)
05177 if (cgi_write_user_data(cprop->id, &cprop->user_data[n])) return 1;
05178
05179 return 0;
05180 }
05181
05182 int cgi_write_holes(double parent_id, cgns_hole *hole) {
05183 int n, dim_vals;
05184 double dummy_id;
05185 char PointSetName[33];
05186 cgns_ptset *ptset;
05187
05188 if (hole->link) {
05189 return cgi_write_link(parent_id, hole->name,
05190 hole->link, &hole->id);
05191 }
05192
05193
05194 if (cgi_new_node(parent_id, hole->name, "OversetHoles_t",
05195 &hole->id, "MT", 0, 0, 0)) return 1;
05196
05197
05198 if (hole->location!=Vertex) {
05199 dim_vals = strlen(GridLocationName[hole->location]);
05200 if (cgi_new_node(hole->id, "GridLocation", "GridLocation_t",
05201 &dummy_id, "C1", 1, &dim_vals,
05202 (void *)GridLocationName[hole->location])) return 1;
05203 }
05204
05205
05206 for (n=0; n<hole->nptsets; n++) {
05207 ptset = &(hole->ptset[n]);
05208
05209 if (ptset->type == PointRange) sprintf(PointSetName,"PointRange%d",n+1);
05210 else sprintf(PointSetName,"PointSetTypeName[ptset->type]");
05211
05212
05213 if (cgi_move_node(cg->rootid, ptset->id, hole->id,
05214 PointSetName)) return 1;
05215 }
05216
05217 for (n=0; n<hole->ndescr; n++)
05218 if (cgi_write_descr(hole->id, &hole->descr[n])) return 1;
05219
05220
05221 for (n=0; n<hole->nuser_data; n++)
05222 if (cgi_write_user_data(hole->id, &hole->user_data[n])) return 1;
05223
05224 return 0;
05225 }
05226
05227 int cgi_write_zboco(double parent_id, cgns_zboco *zboco) {
05228 int n;
05229
05230 if (zboco->link) {
05231 return cgi_write_link(parent_id, "ZoneBC",
05232 zboco->link, &zboco->id);
05233 }
05234
05235
05236 if (cgi_new_node(parent_id, "ZoneBC", "ZoneBC_t", &zboco->id,
05237 "MT", 0, 0, 0)) return 1;
05238
05239
05240 for (n=0; n<zboco->nbocos; n++)
05241 if (cgi_write_boco(zboco->id, &zboco->boco[n])) return 1;
05242
05243
05244 for (n=0; n<zboco->ndescr; n++)
05245 if (cgi_write_descr(zboco->id, &zboco->descr[n])) return 1;
05246
05247
05248 if (zboco->state && cgi_write_state(zboco->id, zboco->state))
05249 return 1;
05250
05251
05252 if (zboco->data_class &&
05253 cgi_write_dataclass(zboco->id, zboco->data_class)) return 1;
05254
05255
05256 if (zboco->units && cgi_write_units(zboco->id, zboco->units))
05257 return 1;
05258
05259
05260 for (n=0; n<zboco->nuser_data; n++)
05261 if (cgi_write_user_data(zboco->id, &zboco->user_data[n])) return 1;
05262
05263 return 0;
05264 }
05265
05266 int cgi_write_boco(double parent_id, cgns_boco *boco) {
05267 int dim_vals, n;
05268 double dummy_id;
05269
05270 if (boco->link) {
05271 return cgi_write_link(parent_id, boco->name,
05272 boco->link, &boco->id);
05273 }
05274
05275
05276 dim_vals = strlen(BCTypeName[boco->type]);
05277 if (cgi_new_node(parent_id, boco->name, "BC_t", &boco->id, "C1",
05278 1, &dim_vals, BCTypeName[boco->type])) return 1;
05279
05280
05281 if (boco->ptset) {
05282
05283 if (cgi_move_node(cg->rootid, boco->ptset->id, boco->id,
05284 PointSetTypeName[boco->ptset->type])) return 1;
05285 }
05286
05287
05288 if (boco->location != Vertex) {
05289 dim_vals = strlen(GridLocationName[boco->location]);
05290 if (cgi_new_node(boco->id, "GridLocation", "GridLocation_t", &dummy_id,
05291 "C1", 1, &dim_vals, (void *)GridLocationName[boco->location])) return 1;
05292 }
05293
05294
05295 if (boco->family_name[0]!='\0') {
05296 int dim_vals = strlen(boco->family_name);
05297 if (cgi_new_node(boco->id, "FamilyName", "FamilyName_t", &dummy_id, "C1",
05298 1, &dim_vals, (void *)boco->family_name)) return 1;
05299 }
05300
05301
05302 for (n=0; n<boco->ndataset; n++)
05303 if (cgi_write_dataset(boco->id, &boco->dataset[n])) return 1;
05304
05305
05306 if (boco->Nindex) {
05307 if (cgi_new_node(boco->id, "InwardNormalIndex",
05308 "\"int[IndexDimension]\"", &boco->index_id, "I4", 1,
05309 &Idim, (void *)boco->Nindex)) return 1;
05310 }
05311
05312
05313 if (boco->normal) {
05314 if (boco->normal->link) {
05315 if (cgi_write_link(boco->id, boco->normal->name,
05316 boco->normal->link, &boco->normal->id)) return 1;
05317 }
05318 else {
05319 if (cgi_new_node(boco->id, boco->normal->name, "IndexArray_t", &boco->normal->id,
05320 boco->normal->data_type, boco->normal->data_dim, boco->normal->dim_vals,
05321 boco->normal->data)) return 1;
05322 }
05323 }
05324
05325
05326 for (n=0; n<boco->ndescr; n++)
05327 if (cgi_write_descr(boco->id, &boco->descr[n])) return 1;
05328
05329
05330 if (boco->state &&
05331 cgi_write_state(boco->id, boco->state)) return 1;
05332
05333
05334 if (boco->data_class &&
05335 cgi_write_dataclass(boco->id, boco->data_class)) return 1;
05336
05337
05338 if (boco->units && cgi_write_units(boco->id, boco->units))
05339 return 1;
05340
05341
05342 if (boco->ordinal &&
05343 cgi_write_ordinal(boco->id, boco->ordinal)) return 1;
05344
05345
05346 if (boco->bprop &&
05347 cgi_write_bprop(boco->id, boco->bprop)) return 1;
05348
05349
05350 for (n=0; n<boco->nuser_data; n++)
05351 if (cgi_write_user_data(boco->id, &boco->user_data[n])) return 1;
05352
05353 return 0;
05354 }
05355
05356 int cgi_write_bprop(double parent_id, cgns_bprop *bprop) {
05357 int dim_vals, n;
05358 double dummy_id;
05359
05360 if (bprop->link) {
05361 return cgi_write_link(parent_id, "BCProperty",
05362 bprop->link, &bprop->id);
05363 }
05364
05365
05366 if (cgi_new_node(parent_id, "BCProperty", "BCProperty_t", &bprop->id,
05367 "MT", 0, 0, 0)) return 1;
05368
05369
05370 for (n=0; n<bprop->ndescr; n++)
05371 if (cgi_write_descr(bprop->id, &bprop->descr[n])) return 1;
05372
05373
05374 if (bprop->bcwall) {
05375 cgns_bcwall *bcwall = bprop->bcwall;
05376 if (bcwall->link) {
05377 if (cgi_write_link(bprop->id, "WallFunction",
05378 bcwall->link, &bcwall->id)) return 1;
05379 }
05380 else {
05381 if (cgi_new_node(bprop->id, "WallFunction", "WallFunction_t",
05382 &bcwall->id, "MT", 0, 0, 0)) return 1;
05383
05384
05385 for (n=0; n<bcwall->ndescr; n++)
05386 if (cgi_write_descr(bcwall->id, &bcwall->descr[n])) return 1;
05387
05388
05389 dim_vals = strlen(WallFunctionTypeName[bcwall->type]);
05390 if (cgi_new_node(bcwall->id, "WallFunctionType", "WallFunctionType_t",
05391 &dummy_id, "C1", 1, &dim_vals, (void *)WallFunctionTypeName[bcwall->type])) return 1;
05392
05393 for (n=0; n<bcwall->nuser_data; n++)
05394 if (cgi_write_user_data(bcwall->id, &bcwall->user_data[n])) return 1;
05395 }
05396 }
05397
05398
05399 if (bprop->bcarea) {
05400 cgns_bcarea *bcarea = bprop->bcarea;
05401 if (bcarea->link) {
05402 if (cgi_write_link(bprop->id, "Area",
05403 bcarea->link, &bcarea->id)) return 1;
05404 }
05405 else {
05406 if (cgi_new_node(bprop->id, "Area", "Area_t", &bcarea->id,
05407 "MT", 0, 0, 0)) return 1;
05408
05409
05410 for (n=0; n<bcarea->ndescr; n++)
05411 if (cgi_write_descr(bcarea->id, &bcarea->descr[n])) return 1;
05412
05413
05414 dim_vals = strlen(AreaTypeName[bcarea->type]);
05415 if (cgi_new_node(bcarea->id, "AreaType", "AreaType_t", &dummy_id,
05416 "C1", 1, &dim_vals, (void *)AreaTypeName[bcarea->type])) return 1;
05417
05418
05419 for (n=0; n<bcarea->narrays; n++)
05420 if (cgi_write_array(bcarea->id, &bcarea->array[n])) return 1;
05421
05422
05423 for (n=0; n<bcarea->nuser_data; n++)
05424 if (cgi_write_user_data(bcarea->id, &bcarea->user_data[n])) return 1;
05425 }
05426 }
05427
05428
05429 for (n=0; n<bprop->nuser_data; n++)
05430 if (cgi_write_user_data(bprop->id, &bprop->user_data[n])) return 1;
05431
05432 return 0;
05433 }
05434
05435 int cgi_write_dataset(double parent_id, cgns_dataset *dataset) {
05436 int dim_vals, n;
05437 double dummy_id;
05438
05439 if (dataset->link) {
05440 return cgi_write_link(parent_id, dataset->name,
05441 dataset->link, &dataset->id);
05442 }
05443
05444
05445 dim_vals= strlen(BCTypeName[dataset->type]);
05446 if (cgi_new_node(parent_id, dataset->name, "BCDataSet_t", &dataset->id,
05447 "C1", 1, &dim_vals, (void *)BCTypeName[dataset->type])) return 1;
05448
05449
05450 if (dataset->dirichlet) {
05451 if (dataset->dirichlet->link) {
05452 if (cgi_write_link(dataset->id, "DirichletData",
05453 dataset->dirichlet->link, &dataset->dirichlet->id))
05454 return 1;
05455 }
05456 else {
05457 if (cgi_new_node(dataset->id, "DirichletData", "BCData_t",
05458 &dataset->dirichlet->id, "MT", 0, 0, 0)) return 1;
05459 if (cgi_write_bcdata(dataset->dirichlet->id, dataset->dirichlet))
05460 return 1;
05461 }
05462 }
05463
05464
05465 if (dataset->neumann) {
05466 if (dataset->neumann->link) {
05467 if (cgi_write_link(dataset->id, "NeumannData",
05468 dataset->neumann->link, &dataset->neumann->id))
05469 return 1;
05470 }
05471 else {
05472 if (cgi_new_node(dataset->id, "NeumannData", "BCData_t",
05473 &dataset->neumann->id, "MT", 0, 0, 0)) return 1;
05474 if (cgi_write_bcdata(dataset->neumann->id, dataset->neumann))
05475 return 1;
05476 }
05477 }
05478
05479
05480 for (n=0; n<dataset->ndescr; n++)
05481 if (cgi_write_descr(dataset->id, &dataset->descr[n])) return 1;
05482
05483
05484 if (dataset->state &&
05485 cgi_write_state(dataset->id, dataset->state)) return 1;
05486
05487
05488 if (dataset->data_class &&
05489 cgi_write_dataclass(dataset->id, dataset->data_class)) return 1;
05490
05491
05492 if (dataset->units &&
05493 cgi_write_units(dataset->id, dataset->units)) return 1;
05494
05495
05496 for (n=0; n<dataset->nuser_data; n++)
05497 if (cgi_write_user_data(dataset->id, &dataset->user_data[n])) return 1;
05498
05499
05500 if (dataset->location != Vertex) {
05501 dim_vals = strlen(GridLocationName[dataset->location]);
05502 if (cgi_new_node(dataset->id, "GridLocation", "GridLocation_t",
05503 &dummy_id, "C1", 1, &dim_vals,
05504 (void *)GridLocationName[dataset->location]))
05505 return 1;
05506 }
05507
05508
05509 if (dataset->ptset) {
05510
05511 if (cgi_move_node(cg->rootid, dataset->ptset->id, dataset->id,
05512 PointSetTypeName[dataset->ptset->type])) return 1;
05513 }
05514
05515 return 0;
05516 }
05517
05518 int cgi_write_bcdata(double bcdata_id, cgns_bcdata *bcdata) {
05519 int n;
05520
05521
05522 for (n=0; n<bcdata->narrays; n++)
05523 if (cgi_write_array(bcdata_id, &bcdata->array[n])) return 1;
05524
05525
05526 for (n=0; n<bcdata->ndescr; n++)
05527 if (cgi_write_descr(bcdata_id, &bcdata->descr[n])) return 1;
05528
05529
05530 if (bcdata->data_class &&
05531 cgi_write_dataclass(bcdata->id, bcdata->data_class)) return 1;
05532
05533
05534 if (bcdata->units &&
05535 cgi_write_units(bcdata->id, bcdata->units)) return 1;
05536
05537
05538 for (n=0; n<bcdata->nuser_data; n++)
05539 if (cgi_write_user_data(bcdata->id, &bcdata->user_data[n])) return 1;
05540
05541 return 0;
05542 }
05543
05544 int cgi_write_ptset(double parent_id, char_33 name, cgns_ptset *ptset,
05545 int Idim, void *ptset_ptr) {
05546 int dim_vals[12], ndim;
05547 char_33 label;
05548
05549 if (ptset->link) {
05550 return cgi_write_link(parent_id, name, ptset->link, &ptset->id);
05551 }
05552
05553
05554 if (ptset->type == PointRange || ptset->type == ElementRange ||
05555 ptset->type == PointRangeDonor)
05556 strcpy(label,"IndexRange_t");
05557 else strcpy(label,"IndexArray_t");
05558
05559
05560 dim_vals[0]=Idim;
05561 dim_vals[1]=ptset->npts;
05562 ndim = 2;
05563
05564
05565 if (cgi_new_node(parent_id, name, label, &ptset->id,
05566 ptset->data_type, ndim, dim_vals, ptset_ptr)) return 1;
05567
05568 return 0;
05569 }
05570
05571 int cgi_write_equations(double parent_id, cgns_equations *equations) {
05572 int n, dim_vals;
05573 double dummy_id;
05574 cgns_governing *governing;
05575
05576 if (equations->link) {
05577 return cgi_write_link(parent_id, "FlowEquationSet",
05578 equations->link, &equations->id);
05579 }
05580
05581
05582 if (cgi_new_node(parent_id, "FlowEquationSet", "FlowEquationSet_t",
05583 &equations->id, "MT", 0, 0, 0)) return 1;
05584
05585
05586 if (equations->equation_dim) {
05587 dim_vals=1;
05588 if (cgi_new_node(equations->id, "EquationDimension", "\"int\"",
05589 &dummy_id, "I4", 1, &dim_vals, (void *)&equations->equation_dim))
05590 return 1;
05591 }
05592
05593
05594 if (equations->governing) {
05595 governing = equations->governing;
05596 if (governing->link) {
05597 if (cgi_write_link(equations->id, "GoverningEquations",
05598 governing->link, &governing->id)) return 1;
05599 }
05600 else {
05601 dim_vals = strlen(GoverningEquationsTypeName[governing->type]);
05602 if (cgi_new_node(equations->id, "GoverningEquations",
05603 "GoverningEquations_t", &governing->id, "C1", 1, &dim_vals,
05604 GoverningEquationsTypeName[governing->type])) return 1;
05605
05606
05607 for (n=0; n<governing->ndescr; n++)
05608 if (cgi_write_descr(governing->id, &governing->descr[n])) return 1;
05609
05610
05611 if (governing->diffusion_model) {
05612 dim_vals=governing->dim_vals;
05613 if (cgi_new_node(governing->id, "DiffusionModel",
05614 "\"int[1+...+IndexDimension]\"", &dummy_id, "I4", 1,
05615 &dim_vals, (void *)governing->diffusion_model)) return 1;
05616 }
05617
05618
05619 for (n=0; n<governing->nuser_data; n++)
05620 if (cgi_write_user_data(governing->id, &governing->user_data[n])) return 1;
05621 }
05622 }
05623
05624
05625 if (equations->gas &&
05626 cgi_write_model(equations->id, equations->gas)) return 1;
05627
05628
05629 if (equations->visc &&
05630 cgi_write_model(equations->id, equations->visc)) return 1;
05631
05632
05633 if (equations->conduct &&
05634 cgi_write_model(equations->id, equations->conduct)) return 1;
05635
05636
05637 if (equations->closure &&
05638 cgi_write_model(equations->id, equations->closure)) return 1;
05639
05640
05641 if (equations->turbulence) {
05642 if (cgi_write_model(equations->id, equations->turbulence)) return 1;
05643
05644
05645 if (equations->turbulence->diffusion_model) {
05646 dim_vals=equations->turbulence->dim_vals;
05647 if (cgi_new_node(equations->turbulence->id, "DiffusionModel",
05648 "\"int[1+...+IndexDimension]\"", &dummy_id, "I4", 1, &dim_vals,
05649 (void *) equations->turbulence->diffusion_model)) return 1;
05650 }
05651 }
05652
05653
05654 if (equations->relaxation &&
05655 cgi_write_model(equations->id, equations->relaxation)) return 1;
05656
05657
05658 if (equations->chemkin &&
05659 cgi_write_model(equations->id, equations->chemkin)) return 1;
05660
05661
05662 for (n=0; n<equations->ndescr; n++)
05663 if (cgi_write_descr(equations->id, &equations->descr[n])) return 1;
05664
05665
05666 if (equations->data_class &&
05667 cgi_write_dataclass(equations->id, equations->data_class)) return 1;
05668
05669
05670 if (equations->units &&
05671 cgi_write_units(equations->id, equations->units)) return 1;
05672
05673
05674 for (n=0; n<equations->nuser_data; n++)
05675 if (cgi_write_user_data(equations->id, &equations->user_data[n])) return 1;
05676
05677
05678 if (equations->elecfield &&
05679 cgi_write_model(equations->id, equations->elecfield)) return 1;
05680
05681
05682 if (equations->magnfield &&
05683 cgi_write_model(equations->id, equations->magnfield)) return 1;
05684
05685
05686 if (equations->emconduct &&
05687 cgi_write_model(equations->id, equations->emconduct)) return 1;
05688
05689 return 0;
05690 }
05691
05692 int cgi_write_model(double parent_id, cgns_model *model) {
05693 int n, dim_vals;
05694 char_33 label;
05695
05696 if (model->link) {
05697 return cgi_write_link(parent_id, model->name,
05698 model->link, &model->id);
05699 }
05700
05701
05702 sprintf(label,"%s_t",model->name);
05703 dim_vals = strlen(ModelTypeName[model->type]);
05704
05705 if (cgi_new_node(parent_id, model->name, label, &model->id,
05706 "C1", 1, &dim_vals, ModelTypeName[model->type])) return 1;
05707
05708
05709 for (n=0; n<model->ndescr; n++)
05710 if (cgi_write_descr(model->id, &model->descr[n])) return 1;
05711
05712
05713 if (model->data_class &&
05714 cgi_write_dataclass(model->id, model->data_class)) return 1;
05715
05716
05717 if (model->units &&
05718 cgi_write_units(model->id, model->units)) return 1;
05719
05720
05721 for (n=0; n<model->narrays; n++)
05722 if (cgi_write_array(model->id, &model->array[n])) return 1;
05723
05724
05725 for (n=0; n<model->nuser_data; n++)
05726 if (cgi_write_user_data(model->id, &model->user_data[n])) return 1;
05727
05728 return 0;
05729 }
05730
05731 int cgi_write_state(double parent_id, cgns_state *state) {
05732 int n;
05733
05734 if (state->link) {
05735 return cgi_write_link(parent_id, "ReferenceState",
05736 state->link, &state->id);
05737 }
05738
05739
05740 if (cgi_new_node(parent_id, "ReferenceState", "ReferenceState_t",
05741 &state->id, "MT", 0, 0, 0)) return 1;
05742
05743
05744 for (n=0; n<state->ndescr; n++)
05745 if (cgi_write_descr(state->id, &state->descr[n])) return 1;
05746
05747
05748 if (state->StateDescription &&
05749 cgi_write_descr(state->id, state->StateDescription)) return 1;
05750
05751
05752 if (state->data_class &&
05753 cgi_write_dataclass(state->id, state->data_class)) return 1;
05754
05755
05756 if (state->units &&
05757 cgi_write_units(state->id, state->units)) return 1;
05758
05759
05760 for (n=0; n<state->narrays; n++)
05761 if (cgi_write_array(state->id, &state->array[n])) return 1;
05762
05763
05764 for (n=0; n<state->nuser_data; n++)
05765 if (cgi_write_user_data(state->id, &state->user_data[n])) return 1;
05766
05767 return 0;
05768 }
05769
05770 int cgi_write_gravity(double parent_id, cgns_gravity *gravity) {
05771 int n;
05772
05773 if (gravity->link) {
05774 return cgi_write_link(parent_id, "Gravity",
05775 gravity->link, &gravity->id);
05776 }
05777
05778
05779 if (cgi_new_node(parent_id, "Gravity", "Gravity_t",
05780 &gravity->id, "MT", 0, 0, 0)) return 1;
05781
05782
05783 for (n=0; n<gravity->ndescr; n++)
05784 if (cgi_write_descr(gravity->id, &gravity->descr[n])) return 1;
05785
05786
05787 if (gravity->data_class &&
05788 cgi_write_dataclass(gravity->id, gravity->data_class)) return 1;
05789
05790
05791 if (gravity->units &&
05792 cgi_write_units(gravity->id, gravity->units)) return 1;
05793
05794
05795 if (gravity->vector && cgi_write_array(gravity->id, gravity->vector)) return 1;
05796
05797
05798 for (n=0; n<gravity->nuser_data; n++)
05799 if (cgi_write_user_data(gravity->id, &gravity->user_data[n])) return 1;
05800
05801 return 0;
05802 }
05803
05804 int cgi_write_axisym(double parent_id, cgns_axisym *axisym) {
05805 int n;
05806
05807 if (axisym->link) {
05808 return cgi_write_link(parent_id, "Axisymmetry",
05809 axisym->link, &axisym->id);
05810 }
05811
05812
05813 if (cgi_new_node(parent_id, "Axisymmetry", "Axisymmetry_t",
05814 &axisym->id, "MT", 0, 0, 0)) return 1;
05815
05816
05817 for (n=0; n<axisym->ndescr; n++)
05818 if (cgi_write_descr(axisym->id, &axisym->descr[n])) return 1;
05819
05820
05821 if (axisym->data_class &&
05822 cgi_write_dataclass(axisym->id, axisym->data_class)) return 1;
05823
05824
05825 if (axisym->units &&
05826 cgi_write_units(axisym->id, axisym->units)) return 1;
05827
05828
05829 for (n=0; n<axisym->narrays; n++)
05830 if (cgi_write_array(axisym->id, &axisym->array[n])) return 1;
05831
05832
05833 for (n=0; n<axisym->nuser_data; n++)
05834 if (cgi_write_user_data(axisym->id, &axisym->user_data[n])) return 1;
05835
05836 return 0;
05837 }
05838
05839 int cgi_write_rotating(double parent_id, cgns_rotating *rotating) {
05840 int n;
05841
05842 if (rotating->link) {
05843 return cgi_write_link(parent_id, "RotatingCoordinates",
05844 rotating->link, &rotating->id);
05845 }
05846
05847
05848 if (cgi_new_node(parent_id, "RotatingCoordinates", "RotatingCoordinates_t",
05849 &rotating->id, "MT", 0, 0, 0)) return 1;
05850
05851
05852 for (n=0; n<rotating->ndescr; n++)
05853 if (cgi_write_descr(rotating->id, &rotating->descr[n])) return 1;
05854
05855
05856 if (rotating->data_class &&
05857 cgi_write_dataclass(rotating->id, rotating->data_class)) return 1;
05858
05859
05860 if (rotating->units &&
05861 cgi_write_units(rotating->id, rotating->units)) return 1;
05862
05863
05864 for (n=0; n<rotating->narrays; n++)
05865 if (cgi_write_array(rotating->id, &rotating->array[n])) return 1;
05866
05867
05868 for (n=0; n<rotating->nuser_data; n++)
05869 if (cgi_write_user_data(rotating->id, &rotating->user_data[n])) return 1;
05870
05871 return 0;
05872 }
05873
05874 int cgi_write_converg(double parent_id, cgns_converg *converg) {
05875 int n;
05876 int dim_vals;
05877
05878 if (converg->link) {
05879 return cgi_write_link(parent_id, converg->name,
05880 converg->link, &converg->id);
05881 }
05882
05883
05884 dim_vals = 1;
05885 if (cgi_new_node(parent_id, converg->name, "ConvergenceHistory_t",
05886 &converg->id, "I4", 1, &dim_vals, (void *)&converg->iterations)) return 1;
05887
05888
05889 for (n=0; n<converg->ndescr; n++)
05890 if (cgi_write_descr(converg->id, &converg->descr[n])) return 1;
05891
05892
05893 if (converg->NormDefinitions &&
05894 cgi_write_descr(converg->id, converg->NormDefinitions)) return 1;
05895
05896
05897 if (converg->data_class &&
05898 cgi_write_dataclass(converg->id, converg->data_class)) return 1;
05899
05900
05901 if (converg->units &&
05902 cgi_write_units(converg->id, converg->units)) return 1;
05903
05904
05905 for (n=0; n<converg->narrays; n++)
05906 if (cgi_write_array(converg->id, &converg->array[n])) return 1;
05907
05908
05909 for (n=0; n<converg->nuser_data; n++)
05910 if (cgi_write_user_data(converg->id, &converg->user_data[n])) return 1;
05911
05912 return 0;
05913 }
05914
05915 int cgi_write_discrete(double parent_id, cgns_discrete *discrete) {
05916 int n, dim_vals;
05917 double dummy_id;
05918
05919 if (discrete->link) {
05920 return cgi_write_link(parent_id, discrete->name,
05921 discrete->link, &discrete->id);
05922 }
05923
05924
05925 if (cgi_new_node(parent_id, discrete->name, "DiscreteData_t",
05926 &discrete->id, "MT", 0, 0, 0)) return 1;
05927
05928
05929 if (discrete->location != Vertex) {
05930 dim_vals = strlen(GridLocationName[discrete->location]);
05931 if (cgi_new_node(discrete->id, "GridLocation", "GridLocation_t", &dummy_id,
05932 "C1", 1, &dim_vals, (void *)GridLocationName[discrete->location])) return 1;
05933 }
05934
05935
05936 if (cgi_write_rind(discrete->id, discrete->rind_planes, Idim)) return 1;
05937
05938
05939 for (n=0; n<discrete->ndescr; n++)
05940 if (cgi_write_descr(discrete->id, &discrete->descr[n])) return 1;
05941
05942
05943 if (discrete->data_class &&
05944 cgi_write_dataclass(discrete->id, discrete->data_class)) return 1;
05945
05946
05947 if (discrete->units &&
05948 cgi_write_units(discrete->id, discrete->units)) return 1;
05949
05950
05951 for (n=0; n<discrete->narrays; n++)
05952 if (cgi_write_array(discrete->id, &discrete->array[n])) return 1;
05953
05954
05955 for (n=0; n<discrete->nuser_data; n++)
05956 if (cgi_write_user_data(discrete->id, &discrete->user_data[n])) return 1;
05957
05958 return 0;
05959 }
05960
05961 int cgi_write_integral(double parent_id, cgns_integral *integral) {
05962 int n;
05963
05964 if (integral->link) {
05965 return cgi_write_link(parent_id, integral->name,
05966 integral->link, &integral->id);
05967 }
05968
05969
05970 if (cgi_new_node(parent_id, integral->name, "IntegralData_t",
05971 &integral->id, "MT", 0, 0, 0)) return 1;
05972
05973
05974 for (n=0; n<integral->ndescr; n++)
05975 if (cgi_write_descr(integral->id, &integral->descr[n])) return 1;
05976
05977
05978 if (integral->data_class &&
05979 cgi_write_dataclass(integral->id, integral->data_class)) return 1;
05980
05981
05982 if (integral->units &&
05983 cgi_write_units(integral->id, integral->units)) return 1;
05984
05985
05986 for (n=0; n<integral->narrays; n++)
05987 if (cgi_write_array(integral->id, &integral->array[n])) return 1;
05988
05989
05990 for (n=0; n<integral->nuser_data; n++)
05991 if (cgi_write_user_data(integral->id, &integral->user_data[n])) return 1;
05992
05993 return 0;
05994 }
05995
05996 int cgi_write_rmotion(double parent_id, cgns_rmotion *rmotion) {
05997 int n, dim_vals;
05998
05999 if (rmotion->link) {
06000 return cgi_write_link(parent_id, rmotion->name,
06001 rmotion->link, &rmotion->id);
06002 }
06003
06004
06005 dim_vals=strlen(RigidGridMotionTypeName[rmotion->type]);
06006 if (cgi_new_node(parent_id, rmotion->name, "RigidGridMotion_t", &rmotion->id,
06007 "C1", 1, &dim_vals, (void *)RigidGridMotionTypeName[rmotion->type])) return 1;
06008
06009
06010
06011 for (n=0; n<rmotion->ndescr; n++)
06012 if (cgi_write_descr(rmotion->id, &rmotion->descr[n])) return 1;
06013
06014
06015 if (rmotion->data_class &&
06016 cgi_write_dataclass(rmotion->id, rmotion->data_class)) return 1;
06017
06018
06019 if (rmotion->units &&
06020 cgi_write_units(rmotion->id, rmotion->units)) return 1;
06021
06022
06023 for (n=0; n<rmotion->narrays; n++)
06024 if (cgi_write_array(rmotion->id, &rmotion->array[n])) return 1;
06025
06026
06027 for (n=0; n<rmotion->nuser_data; n++)
06028 if (cgi_write_user_data(rmotion->id, &rmotion->user_data[n])) return 1;
06029
06030 return 0;
06031 }
06032
06033 int cgi_write_amotion(double parent_id, cgns_amotion *amotion) {
06034 int n, dim_vals;
06035 double dummy_id;
06036
06037 if (amotion->link) {
06038 return cgi_write_link(parent_id, amotion->name,
06039 amotion->link, &amotion->id);
06040 }
06041
06042
06043 dim_vals=strlen(ArbitraryGridMotionTypeName[amotion->type]);
06044 if (cgi_new_node(parent_id, amotion->name, "ArbitraryGridMotion_t", &amotion->id,
06045 "C1", 1, &dim_vals, (void *)ArbitraryGridMotionTypeName[amotion->type])) return 1;
06046
06047
06048 for (n=0; n<amotion->ndescr; n++)
06049 if (cgi_write_descr(amotion->id, &amotion->descr[n])) return 1;
06050
06051
06052 if (amotion->location != Vertex) {
06053 dim_vals = strlen(GridLocationName[amotion->location]);
06054 if (cgi_new_node(amotion->id, "GridLocation", "GridLocation_t", &dummy_id,
06055 "C1", 1, &dim_vals, (void *)GridLocationName[amotion->location])) return 1;
06056 }
06057
06058
06059 if (cgi_write_rind(amotion->id, amotion->rind_planes, Idim)) return 1;
06060
06061
06062 if (amotion->data_class &&
06063 cgi_write_dataclass(amotion->id, amotion->data_class)) return 1;
06064
06065
06066 if (amotion->units &&
06067 cgi_write_units(amotion->id, amotion->units)) return 1;
06068
06069
06070 for (n=0; n<amotion->narrays; n++)
06071 if (cgi_write_array(amotion->id, &amotion->array[n])) return 1;
06072
06073
06074 for (n=0; n<amotion->nuser_data; n++)
06075 if (cgi_write_user_data(amotion->id, &amotion->user_data[n])) return 1;
06076
06077 return 0;
06078 }
06079
06080 int cgi_write_biter(double parent_id, cgns_biter *biter) {
06081 int n, dim_vals;
06082
06083 if (biter->link) {
06084 return cgi_write_link(parent_id, biter->name,
06085 biter->link, &biter->id);
06086 }
06087
06088
06089 dim_vals=1;
06090 if (cgi_new_node(parent_id, biter->name, "BaseIterativeData_t",
06091 &biter->id, "I4", 1, &dim_vals, (void *)&biter->nsteps)) return 1;
06092
06093
06094 for (n=0; n<biter->ndescr; n++)
06095 if (cgi_write_descr(biter->id, &biter->descr[n])) return 1;
06096
06097
06098 if (biter->data_class &&
06099 cgi_write_dataclass(biter->id, biter->data_class)) return 1;
06100
06101
06102 if (biter->units &&
06103 cgi_write_units(biter->id, biter->units)) return 1;
06104
06105
06106 for (n=0; n<biter->narrays; n++)
06107 if (cgi_write_array(biter->id, &biter->array[n])) return 1;
06108
06109
06110 for (n=0; n<biter->nuser_data; n++)
06111 if (cgi_write_user_data(biter->id, &biter->user_data[n])) return 1;
06112
06113 return 0;
06114 }
06115
06116 int cgi_write_ziter(double parent_id, cgns_ziter *ziter) {
06117 int n;
06118
06119 if (ziter->link) {
06120 return cgi_write_link(parent_id, ziter->name,
06121 ziter->link, &ziter->id);
06122 }
06123
06124
06125 if (cgi_new_node(parent_id, ziter->name, "ZoneIterativeData_t",
06126 &ziter->id, "MT", 0, 0, 0)) return 1;
06127
06128
06129 for (n=0; n<ziter->ndescr; n++)
06130 if (cgi_write_descr(ziter->id, &ziter->descr[n])) return 1;
06131
06132
06133 if (ziter->data_class &&
06134 cgi_write_dataclass(ziter->id, ziter->data_class)) return 1;
06135
06136
06137 if (ziter->units &&
06138 cgi_write_units(ziter->id, ziter->units)) return 1;
06139
06140
06141 for (n=0; n<ziter->narrays; n++)
06142 if (cgi_write_array(ziter->id, &ziter->array[n])) return 1;
06143
06144
06145 for (n=0; n<ziter->nuser_data; n++)
06146 if (cgi_write_user_data(ziter->id, &ziter->user_data[n])) return 1;
06147
06148 return 0;
06149 }
06150
06151 int cgi_write_array(double parent_id, cgns_array *array) {
06152 int n, dim_vals;
06153 double dummy_id;
06154
06155 if (array->link) {
06156 return cgi_write_link(parent_id, array->name,
06157 array->link, &array->id);
06158 }
06159
06160 if (cgi_new_node(parent_id, array->name, "DataArray_t", &array->id,
06161 array->data_type, array->data_dim, array->dim_vals, array->data))
06162 return 1;
06163
06164
06165 if (array->exponents &&
06166 cgi_write_exponents(array->id, array->exponents)) return 1;
06167
06168
06169 if (array->convert) {
06170 dim_vals=2;
06171 if (cgi_new_node(array->id, "DataConversion", "DataConversion_t",
06172 &array->convert->id, array->convert->data_type, 1, &dim_vals,
06173 array->convert->data)) return 1;
06174 }
06175
06176
06177 if (array->data_class &&
06178 cgi_write_dataclass(array->id, array->data_class)) return 1;
06179
06180
06181 for (n=0; n<array->ndescr; n++)
06182 if (cgi_write_descr(array->id, &array->descr[n])) return 1;
06183
06184
06185 if (array->units &&
06186 cgi_write_units(array->id, array->units)) return 1;
06187
06188
06189 dim_vals = 2;
06190 if(array->range[0] != 0 && array->range[1] != 0)
06191 if (cgi_new_node(array->id, "ArrayDataRange", "IndexRange_t",
06192 &dummy_id, "I4", 1, &dim_vals, array->range))
06193 return 1;
06194
06195 return 0;
06196 }
06197
06198 int cgi_write_rind(double parent_id, int *rind_planes, int index_dim) {
06199 int n, dim_vals;
06200 double dummy_id;
06201
06202
06203 if (rind_planes==0) return 0;
06204 for (n=0; n<2*index_dim; n++) {
06205 if (rind_planes[n]!=0) {
06206 dim_vals=2*index_dim;
06207 if (cgi_new_node(parent_id, "Rind", "Rind_t", &dummy_id,
06208 "I4", 1, &dim_vals, (void *)rind_planes)) return 1;
06209 return 0;
06210 }
06211 }
06212 return 0;
06213 }
06214
06215 int cgi_write_units(double parent_id, cgns_units *units) {
06216 char *string_data;
06217 int dim_vals[2];
06218
06219 if (units->link) {
06220 return cgi_write_link(parent_id, "DimensionalUnits",
06221 units->link, &units->id);
06222 }
06223
06224 string_data = (char *) malloc ((32*5+1)*sizeof(char));
06225 if (string_data == NULL) {
06226 cgi_error("Error allocating memory in cgi_write_units.");
06227 return 1;
06228 }
06229 sprintf(string_data,"%-32s%-32s%-32s%-32s%-32s",MassUnitsName[units->mass],
06230 LengthUnitsName[units->length], TimeUnitsName[units->time],
06231 TemperatureUnitsName[units->temperature], AngleUnitsName[units->angle]);
06232
06233 dim_vals[0]=32;
06234 dim_vals[1]=5;
06235
06236 if (cgi_new_node(parent_id, "DimensionalUnits", "DimensionalUnits_t",
06237 &units->id, "C1", 2, dim_vals, (void *)string_data)) return 1;
06238
06239 if (units->nunits == 8) {
06240 double dummy_id;
06241 sprintf(string_data, "%-32s%-32s%-32s",
06242 ElectricCurrentUnitsName[units->current],
06243 SubstanceAmountUnitsName[units->amount],
06244 LuminousIntensityUnitsName[units->intensity]);
06245 dim_vals[1]=3;
06246 if (cgi_new_node(units->id, "AdditionalUnits", "AdditionalUnits_t",
06247 &dummy_id, "C1", 2, dim_vals, (void *)string_data)) return 1;
06248 }
06249
06250 free(string_data);
06251
06252 return 0;
06253 }
06254
06255 int cgi_write_exponents(double parent_id, cgns_exponent *exponent) {
06256 int dim_vals = 5;
06257
06258 if (cgi_new_node(parent_id, "DimensionalExponents",
06259 "DimensionalExponents_t", &exponent->id,
06260 exponent->data_type, 1, &dim_vals, exponent->data)) return 1;
06261 if (exponent->nexps == 8) {
06262 double dummy_id;
06263 void *data;
06264 if (0 == strcmp(exponent->data_type,"R4"))
06265 data = (void *)((float *)exponent->data + 5);
06266 else
06267 data = (void *)((double *)exponent->data + 5);
06268 dim_vals = 3;
06269 if (cgi_new_node(exponent->id, "AdditionalExponents",
06270 "AdditionalExponents_t", &dummy_id,
06271 exponent->data_type, 1, &dim_vals, data)) return 1;
06272 }
06273 return 0;
06274 }
06275
06276 int cgi_write_dataclass(double parent_id, DataClass_t data_class) {
06277 int dim_vals;
06278 double dummy_id;
06279
06280 dim_vals=strlen(DataClassName[data_class]);
06281 if (cgi_new_node(parent_id, "DataClass", "DataClass_t", &dummy_id,
06282 "C1", 1, &dim_vals, (void *)DataClassName[data_class])) return 1;
06283
06284 return 0;
06285 }
06286
06287 int cgi_write_descr(double parent_id, cgns_descr *descr) {
06288 int dim_vals;
06289
06290 if (descr->link) {
06291 return cgi_write_link(parent_id, descr->name,
06292 descr->link, &descr->id);
06293 }
06294
06295 dim_vals=strlen(descr->text);
06296 if (cgi_new_node(parent_id, descr->name, "Descriptor_t",
06297 &descr->id, "C1", 1, &dim_vals, (void *)descr->text)) return 1;
06298
06299 return 0;
06300 }
06301
06302 int cgi_write_ordinal(double parent_id, int ordinal) {
06303 int dim_vals;
06304 double dummy_id;
06305
06306 dim_vals=1;
06307 if (cgi_new_node(parent_id, "Ordinal", "Ordinal_t", &dummy_id,
06308 "I4", 1, &dim_vals, (void *)&ordinal)) return 1;
06309
06310 return 0;
06311 }
06312
06313 int cgi_write_user_data(double parent_id, cgns_user_data *user_data) {
06314 int n;
06315 int dim_vals;
06316 double dummy_id;
06317
06318 if (user_data->link) {
06319 return cgi_write_link(parent_id, user_data->name,
06320 user_data->link, &user_data->id);
06321 }
06322
06323
06324 if (cgi_new_node(parent_id, user_data->name, "UserDefinedData_t",
06325 &user_data->id, "MT", 0, 0, 0)) return 1;
06326
06327
06328 for (n=0; n<user_data->ndescr; n++)
06329 if (cgi_write_descr(user_data->id, &user_data->descr[n])) return 1;
06330
06331
06332 if (user_data->data_class &&
06333 cgi_write_dataclass(user_data->id, user_data->data_class)) return 1;
06334
06335
06336 if (user_data->units &&
06337 cgi_write_units(user_data->id, user_data->units)) return 1;
06338
06339
06340 for (n=0; n<user_data->narrays; n++)
06341 if (cgi_write_array(user_data->id, &user_data->array[n])) return 1;
06342
06343
06344 if (user_data->location != Vertex) {
06345 dim_vals = strlen(GridLocationName[user_data->location]);
06346 if (cgi_new_node(user_data->id, "GridLocation", "GridLocation_t",
06347 &dummy_id, "C1", 1, &dim_vals,
06348 (void *)GridLocationName[user_data->location]))
06349 return 1;
06350 }
06351
06352
06353 if (user_data->family_name[0]!='\0') {
06354 int dim_vals = strlen(user_data->family_name);
06355 if (cgi_new_node(user_data->id, "FamilyName", "FamilyName_t",
06356 &dummy_id, "C1", 1, &dim_vals,
06357 (void *)user_data->family_name))
06358 return 1;
06359 }
06360
06361
06362 if (user_data->ordinal &&
06363 cgi_write_ordinal(user_data->id, user_data->ordinal)) return 1;
06364
06365
06366 if (user_data->ptset) {
06367
06368 if (cgi_move_node(cg->rootid, user_data->ptset->id, user_data->id,
06369 PointSetTypeName[user_data->ptset->type])) return 1;
06370 }
06371
06372
06373 for (n=0; n < user_data->nuser_data; n++)
06374 if (cgi_write_user_data(user_data->id, &user_data->user_data[n]))
06375 return 1;
06376
06377 return 0;
06378 }
06379
06380 int cgi_write_link(double parent_id, char *name, cgns_link *link, double *id) {
06381 if (cgio_create_link(cg->cgio, parent_id, name,
06382 link->filename, link->name_in_file, id)) {
06383 cg_io_error("cgio_create_link");
06384 return 1;
06385 }
06386 (cg->added)++;
06387 return 0;
06388 }
06389
06390
06391
06392 int cgi_new_node(double parent_id, char const *name, char const *label,
06393 double *node_id, char const *data_type,
06394 int ndim, int const *dim_vals, void const *data) {
06395 int i;
06396
06397
06398 if (cgi_check_strlen(name) || cgi_check_strlen(label) ||
06399 cgi_check_strlen(data_type)) return 1;
06400
06401 if (cgio_create_node(cg->cgio, parent_id, name, node_id)) {
06402 cg_io_error("cgio_create_node");
06403 return 1;
06404 }
06405 (cg->added)++;
06406 if (cgio_set_label(cg->cgio, *node_id, label)) {
06407 cg_io_error("cgio_set_label");
06408 return 1;
06409 }
06410
06411 if (strcmp(data_type, "MT")==0) return 0;
06412
06413 if (cgio_set_dimensions(cg->cgio, *node_id, data_type, ndim, dim_vals)) {
06414 cg_io_error("cgio_set_dimensions");
06415 return 1;
06416 }
06417
06418 if (data == NULL) return 0;
06419
06420
06421 if (strcmp(data_type,"I4")==0 || strcmp(data_type,"R4")==0 ||
06422 strcmp(data_type,"R8")==0) {
06423 int ndata=1, nbad=0;
06424
06425 for (i=0; i<ndim; i++) ndata *= dim_vals[i];
06426
06427 if (strcmp(data_type,"I4")==0) {
06428 for (i=0; i<ndata; i++) if (CGNS_NAN(*((int *)data+i))) nbad++;
06429 } else if (strcmp(data_type,"R4")==0) {
06430 for (i=0; i<ndata; i++) if (CGNS_NAN(*((float *)data+i))) nbad++;
06431 } else if (strcmp(data_type,"R8")==0) {
06432 for (i=0; i<ndata; i++) if (CGNS_NAN(*((double *)data+i))) nbad++;
06433 }
06434 if (nbad) {
06435 cgi_error("**** NaN encountered **** ");
06436 return 1;
06437 }
06438 }
06439
06440
06441 if (cgio_write_all_data(cg->cgio, *node_id, data)) {
06442 cg_io_error("cgio_write_all_data");
06443 return 1;
06444 }
06445 return 0;
06446 }
06447
06448
06449
06450
06451
06452
06453 int cgi_new_node_partial(double parent_id, char const *name, char const *label,
06454 double *node_id, char const *data_type, int ndim,
06455 int const *dim_vals, int const *rmin, int const *rmax,
06456 void const *data)
06457 {
06458 int i, m_start[12], m_end[12], m_dim[12], stride[12];
06459
06460
06461 if (cgi_check_strlen(name) || cgi_check_strlen(label) ||
06462 cgi_check_strlen(data_type)) return 1;
06463
06464 if (cgio_create_node(cg->cgio, parent_id, name, node_id)) {
06465 cg_io_error("cgio_create_node");
06466 return 1;
06467 }
06468 (cg->added)++;
06469 if (cgio_set_label(cg->cgio, *node_id, label)) {
06470 cg_io_error("cgio_set_label");
06471 return 1;
06472 }
06473
06474 if (strcmp(data_type, "MT")==0) return 0;
06475
06476 for (i = 0; i < ndim; ++i)
06477 {
06478 m_start[i] = 1;
06479 m_end[i] = rmax[i] - rmin[i] + 1;
06480 m_dim[i] = m_end[i];
06481 stride[i] = 1;
06482 }
06483
06484 if (cgio_set_dimensions(cg->cgio, *node_id, data_type, ndim, dim_vals)) {
06485 cg_io_error("cgio_set_dimensions");
06486 return 1;
06487 }
06488
06489 if (data == NULL) return 0;
06490
06491
06492 if (strcmp(data_type,"I4")==0 || strcmp(data_type,"R4")==0 ||
06493 strcmp(data_type,"R8")==0) {
06494 int ndata = 1, nbad=0;
06495
06496 for (i=0; i<ndim; i++)
06497 ndata *= rmax[i] - rmin[i] + 1;
06498
06499 if (strcmp(data_type,"I4")==0) {
06500 for (i=0; i<ndata; i++) if (CGNS_NAN(*((int *)data+i))) nbad++;
06501 } else if (strcmp(data_type,"R4")==0) {
06502 for (i=0; i<ndata; i++) if (CGNS_NAN(*((float *)data+i))) nbad++;
06503 } else if (strcmp(data_type,"R8")==0) {
06504 for (i=0; i<ndata; i++) if (CGNS_NAN(*((double *)data+i))) nbad++;
06505 }
06506 if (nbad) {
06507 cgi_error("**** NaN encountered **** ");
06508 return 1;
06509 }
06510 }
06511
06512
06513 if (cgio_write_data(cg->cgio, *node_id, rmin, rmax, stride,
06514 ndim, m_dim, m_start, m_end, stride, data)) {
06515 cg_io_error("cgio_write_data");
06516 return 1;
06517 }
06518
06519 return 0;
06520 }
06521
06522 int cgi_move_node(double current_parent_id, double node_id,
06523 double new_parent_id, cchar_33 node_name) {
06524
06525 if (cgio_move_node(cg->cgio, current_parent_id, node_id,
06526 new_parent_id)) {
06527 cg_io_error("cgio_move_node");
06528 return 1;
06529 }
06530 if (cgio_set_name(cg->cgio, new_parent_id, node_id, node_name)) {
06531 cg_io_error("cgio_set_name");
06532 return 1;
06533 }
06534 return 0;
06535 }
06536
06537 int cgi_delete_node (double parent_id, double node_id) {
06538 (cg->deleted)++;
06539 if (cgio_delete_node(cg->cgio, parent_id, node_id)) {
06540 cg_io_error ("cgio_delete_node");
06541 return 1;
06542 }
06543 return 0;
06544 }
06545
06546
06547
06548
06549
06550 int cgi_sort_names(int nnam, double *ids) {
06551 int i,j,k;
06552 int leni, lenj;
06553 char_33 temp;
06554 double temp_id;
06555 char_33 *names;
06556
06557 names = CGNS_NEW(char_33, nnam);
06558 for (i=0; i<nnam; i++) {
06559 if (cgio_get_name(cg->cgio, ids[i], names[i])) {
06560 cg_io_error("cgio_get_name");
06561 return 1;
06562 }
06563 }
06564
06565 for (i=0; i<nnam; i++) {
06566 leni=strlen(names[i]);
06567
06568 for (j=i+1; j<nnam; j++) {
06569 lenj=strlen(names[j]);
06570
06571 for (k=0; k<leni && k<lenj; k++) {
06572
06573 if ((int)names[j][k] < (int)names[i][k]) {
06574 strcpy(temp, names[i]);
06575 strcpy(names[i], names[j]);
06576 strcpy(names[j], temp);
06577 leni=strlen(names[i]);
06578 temp_id = ids[i];
06579 ids[i]=ids[j];
06580 ids[j]=temp_id;
06581
06582 break;
06583 } else if ((int)names[j][k]>(int)names[i][k]) {
06584 break;
06585 }
06586 if (k==(int)(strlen(names[j])-1)) {
06587 strcpy(temp, names[i]);
06588 strcpy(names[i], names[j]);
06589 strcpy(names[j], temp);
06590 leni=strlen(names[i]);
06591 temp_id = ids[i];
06592 ids[i]=ids[j];
06593 ids[j]=temp_id;
06594 }
06595 }
06596 }
06597 }
06598
06599 free(names);
06600
06601 return 0;
06602 }
06603
06604
06605
06606
06607
06608 int cgi_get_nodes(double parent_id, char *label, int *nnodes, double **id) {
06609 int nid, n, nchildren, len;
06610 char nodelabel[CGIO_MAX_NAME_LENGTH+1];
06611 double *idlist;
06612
06613 *nnodes = 0;
06614 if (cgio_number_children(cg->cgio, parent_id, &nchildren)) {
06615 cg_io_error ("cgio_number_children");
06616 return 1;
06617 }
06618 if (nchildren < 1) return 0;
06619 idlist = CGNS_NEW (double, nchildren);
06620 if (cgio_children_ids(cg->cgio, parent_id, 1, nchildren,
06621 &len, idlist)) {
06622 cg_io_error ("cgio_children_ids");
06623 return 1;
06624 }
06625 if (len != nchildren) {
06626 CGNS_FREE (idlist);
06627 cgi_error ("mismatch in number of children and child IDs read");
06628 return 1;
06629 }
06630 nid = 0;
06631 for (nid = 0, n = 0; n < nchildren; n++) {
06632 if (cgio_get_label(cg->cgio, idlist[n], nodelabel)) {
06633 cg_io_error ("cgio_get_label");
06634 return 1;
06635 }
06636 if (0 == strcmp (nodelabel, label)) {
06637 if (nid < n) idlist[nid] = idlist[n];
06638 nid++;
06639 }
06640 else
06641 cgio_release_id (cg->cgio, idlist[n]);
06642 }
06643 if (nid > 0) {
06644 *id = idlist;
06645 *nnodes = nid;
06646 }
06647 else
06648 CGNS_FREE (idlist);
06649 return 0;
06650 }
06651
06652
06653
06654
06655
06656 char *type_of(char_33 data_type) {
06657
06658 if (strcmp(data_type, "I4")==0) return "int";
06659 else if (strcmp(data_type, "R4")==0) return "float";
06660 else if (strcmp(data_type, "R8")==0) return "double";
06661 else if (strcmp(data_type, "C1")==0) return "char";
06662
06663 else {
06664 cgi_error("data_type '%s' not supported by function 'type_of'",data_type);
06665 return 0;
06666 }
06667 }
06668
06669 int size_of(char_33 data_type) {
06670
06671 if (strcmp(data_type, "I4")==0) return sizeof(int);
06672 else if (strcmp(data_type, "R4")==0) return sizeof(float);
06673 else if (strcmp(data_type, "R8")==0) return sizeof(double);
06674 else if (strcmp(data_type, "C1")==0) return sizeof(char);
06675
06676 else {
06677 cgi_error("data_type '%s' not supported by function 'size_of'",data_type);
06678 return 0;
06679 }
06680 }
06681
06682 char *cgi_adf_datatype(DataType_t type) {
06683
06684 if (type==Integer) return "I4";
06685 else if (type == RealSingle) return "R4";
06686 else if (type == RealDouble) return "R8";
06687 else if (type == Character) return "C1";
06688 return "NULL";
06689 }
06690
06691 DataType_t cgi_datatype(cchar_33 adf_type) {
06692
06693 if (strcmp(adf_type, "I4")==0) return Integer;
06694 else if (strcmp(adf_type, "R4")==0) return RealSingle;
06695 else if (strcmp(adf_type, "R8")==0) return RealDouble;
06696 else if (strcmp(adf_type, "C1")==0) return Character;
06697 return DataTypeNull;
06698 }
06699
06700
06701
06702
06703
06704 int cgi_zone_no(cgns_base *base, char *zonename, int *zone_no) {
06705 int i;
06706
06707 for (i=0; i<base->nzones; i++) {
06708 if (strcmp(base->zone[i].name,zonename)==0) {
06709 *zone_no = i+1;
06710 return 0;
06711 }
06712 }
06713 cgi_error("Zone %s not found",zonename);
06714 return 1;
06715 }
06716
06717 int cgi_check_strlen(char const *string) {
06718
06719 if (strlen(string) > 32) {
06720 cgi_error("Name exceeds 32 characters limit: %s",string);
06721 return 1;
06722 }
06723 return 0;
06724 }
06725
06726 int cgi_check_mode(char const *filename, int file_mode, int mode_wanted) {
06727
06728 if (mode_wanted==CG_MODE_READ && file_mode==CG_MODE_WRITE) {
06729 cgi_error("File %s not open for reading", filename);
06730 return 1;
06731 }
06732 if (mode_wanted==CG_MODE_WRITE && file_mode==CG_MODE_READ) {
06733 cgi_error("File %s not open for writing", filename);
06734 return 1;
06735 }
06736 return 0;
06737 }
06738
06739
06740
06741
06742
06743 int cgi_add_czone(char_33 zonename, int_6 range, int_6 donor_range, int index_dim, int *ndouble,
06744 char_33 **Dzonename, int_6 **Drange, int_6 **Ddonor_range) {
06745
06746 int differ=1, k, j;
06747
06748
06749 for (k=0; k<(*ndouble); k++) {
06750 differ=0;
06751 if (strcmp(Dzonename[0][k],zonename)) {
06752 differ=1;
06753 continue;
06754 }
06755 for (j=0; j<index_dim; j++) {
06756 if (Drange[0][k][j]==Drange[0][k][j+index_dim]) continue;
06757 if (Drange[0][k][j]!=MIN(donor_range[j],donor_range[j+index_dim]) ||
06758 Drange[0][k][j+index_dim]!=MAX(donor_range[j],donor_range[j+index_dim])) {
06759 differ=1;
06760 break;
06761 }
06762 }
06763 if (differ) continue;
06764 for (j=0; j<index_dim; j++) {
06765 if (Ddonor_range[0][k][j]==Ddonor_range[0][k][j+index_dim]) continue;
06766 if (Ddonor_range[0][k][j]!=MIN(range[j],range[j+index_dim]) ||
06767 Ddonor_range[0][k][j+index_dim]!=MAX(range[j],range[j+index_dim])) {
06768 differ=1;
06769 break;
06770 }
06771 }
06772 if (differ==0) break;
06773 }
06774
06775 if (k!=(*ndouble)) return 0;
06776
06777
06778
06779 if ((*ndouble)==0) {
06780 Dzonename[0] = CGNS_NEW(char_33, (*ndouble)+1);
06781 Drange[0] = CGNS_NEW(int_6, (*ndouble)+1);
06782 Ddonor_range[0] = CGNS_NEW(int_6, (*ndouble)+1);
06783 } else {
06784 Dzonename[0] = CGNS_RENEW(char_33, (*ndouble)+1, Dzonename[0]);
06785 Drange[0] = CGNS_RENEW(int_6, (*ndouble)+1, Drange[0]);
06786 Ddonor_range[0] = CGNS_RENEW(int_6, (*ndouble)+1, Ddonor_range[0]);
06787 }
06788
06789 strcpy(Dzonename[0][(*ndouble)],zonename);
06790 for (j=0; j<index_dim; j++) {
06791 Drange[0][(*ndouble)][j] = MIN(range[j],range[j+index_dim]);
06792 Drange[0][(*ndouble)][j+index_dim]= MAX(range[j],range[j+index_dim]);
06793 Ddonor_range[0][(*ndouble)][j]= MIN(donor_range[j],donor_range[j+index_dim]);
06794 Ddonor_range[0][(*ndouble)][j+index_dim]= MAX(donor_range[j],donor_range[j+index_dim]);
06795 }
06796 (*ndouble)++;
06797 return 1;
06798 }
06799
06800
06801
06802
06803 int cgi_element_data_size(ElementType_t type, int nelems, const int *connect) {
06804 int ne, npe, size = 0;
06805
06806 if (type == MIXED) {
06807 for (ne = 0; ne < nelems; ne++) {
06808 type = (ElementType_t)connect[size++];
06809 if (type > NGON_n)
06810 npe = type - NGON_n;
06811 else
06812 cg_npe(type, &npe);
06813 if (npe <= 0) {
06814 cgi_error("unhandled element type in MIXED list - %d\n", type);
06815 return -1;
06816 }
06817 size += npe;
06818 }
06819 }
06820 else if (type == NGON_n || type == NFACE_n) {
06821 for (ne = 0; ne < nelems; ne++) {
06822 npe = connect[size++];
06823 size += npe;
06824 }
06825 return size;
06826 }
06827 else {
06828 if (cg_npe(type, &npe) || npe <= 0) {
06829 cgi_error("unhandled element type - %d\n", type);
06830 return -1;
06831 }
06832 size = nelems * npe;
06833 }
06834 return size;
06835 }
06836
06837
06838
06839
06840
06841 cgns_file *cgi_get_file(int file_number) {
06842 int filenum = file_number - file_number_offset;
06843 if (filenum <= 0 || filenum > n_cgns_files) {
06844 cgi_error("CGNS file %d is not open",file_number);
06845 return 0;
06846 }
06847 cg = &(cgns_files[filenum-1]);
06848 if (cg->mode == CG_MODE_CLOSED) {
06849 cgi_error("CGNS %d is closed",file_number);
06850 return 0;
06851 }
06852 return cg;
06853 }
06854
06855 cgns_base *cgi_get_base(cgns_file *cg, int B) {
06856
06857 if (B>cg->nbases || B<=0) {
06858 cgi_error("Base number %d invalid",B);
06859 return 0;
06860 }
06861 return &(cg->base[B-1]);
06862 }
06863
06864 cgns_zone *cgi_get_zone(cgns_file *cg, int B, int Z) {
06865 cgns_base *base;
06866
06867 base = cgi_get_base(cg, B);
06868 if (base==0) return 0;
06869
06870 if (Z>base->nzones || Z<=0) {
06871 cgi_error("Zone number %d invalid",Z);
06872 return 0;
06873 }
06874 return &(base->zone[Z-1]);
06875 }
06876
06877 cgns_family *cgi_get_family(cgns_file *cg, int B, int F) {
06878 cgns_base *base;
06879
06880 base = cgi_get_base(cg, B);
06881 if (base==0) return 0;
06882
06883 if (F>base->nfamilies || F<=0) {
06884 cgi_error("Family number %d invalid",F);
06885 return 0;
06886 }
06887 return &base->family[F-1];
06888 }
06889
06890 cgns_biter *cgi_get_biter(cgns_file *cg, int B) {
06891 cgns_base *base;
06892
06893 base = cgi_get_base(cg, B);
06894 if (base==0) return 0;
06895
06896 if (base->biter == 0) {
06897 cgi_error("BaseIterativeData_t node doesn't exist under CGNSBase %d",B);
06898 return 0;
06899 } else return base->biter;
06900 }
06901
06902 cgns_gravity *cgi_get_gravity(cgns_file *cg, int B) {
06903 cgns_base *base;
06904
06905 base = cgi_get_base(cg, B);
06906 if (base==0) return 0;
06907
06908 if (base->gravity==0) {
06909 cgi_error("Gravity_t node doesn't exist under CGNSBase %d",B);
06910 return 0;
06911 } else return base->gravity;
06912 }
06913
06914 cgns_axisym *cgi_get_axisym(cgns_file *cg, int B) {
06915 cgns_base *base;
06916
06917 base = cgi_get_base(cg, B);
06918 if (base==0) return 0;
06919
06920 if (base->axisym==0) {
06921 cgi_error("Axisymmetry_t node doesn't exist under CGNSBase %d",B);
06922 return 0;
06923 } else return base->axisym;
06924 }
06925
06926 cgns_rotating *cgi_get_rotating(cgns_file *cg, int B, int Z) {
06927 cgns_base *base;
06928 cgns_zone *zone;
06929
06930
06931 if (Z==0) {
06932 base = cgi_get_base(cg, B);
06933 if (base==0) return 0;
06934
06935 if (base->rotating==0) {
06936 cgi_error("RotatingCoordinates_t node doesn't exist under CGNSBase %d",B);
06937 return 0;
06938 } else return base->rotating;
06939 } else {
06940 zone = cgi_get_zone(cg, B, Z);
06941 if (zone==0) return 0;
06942
06943 if (zone->rotating==0) {
06944 cgi_error("RotatingCoordinates_t node doesn't exist under zone %d",Z);
06945 return 0;
06946 } else return zone->rotating;
06947 }
06948 }
06949
06950
06951 cgns_ziter *cgi_get_ziter(cgns_file *cg, int B, int Z) {
06952 cgns_zone *zone;
06953
06954 zone = cgi_get_zone(cg, B, Z);
06955 if (zone==0) return 0;
06956
06957 if (zone->ziter == 0) {
06958 cgi_error("ZoneIterativeData_t node doesn't exist under zone %d",Z);
06959 return 0;
06960 } else return zone->ziter;
06961 }
06962
06963 cgns_zcoor *cgi_get_zcoorGC(cgns_file *cg, int B, int Z) {
06964 cgns_zone *zone;
06965 int i, index_dim;
06966
06967 zone = cgi_get_zone(cg, B, Z);
06968 if (zone==0) return 0;
06969
06970 index_dim = zone->index_dim;
06971
06972 if (zone->nzcoor == 0 && (cg->mode == CG_MODE_WRITE || cg->mode == CG_MODE_MODIFY)) {
06973 zone->zcoor = CGNS_NEW(cgns_zcoor, 1);
06974 strcpy(zone->zcoor->name, "GridCoordinates");
06975 zone->zcoor->id = 0;
06976 zone->zcoor->link = 0;
06977 zone->zcoor->ndescr = 0;
06978 zone->zcoor->rind_planes = CGNS_NEW(int, 2*index_dim);
06979 for (i=0; i<2*index_dim; i++) zone->zcoor->rind_planes[i]=0;
06980 zone->zcoor->ncoords = 0;
06981 zone->zcoor->data_class = DataClassNull;
06982 zone->zcoor->units = 0;
06983 zone->zcoor->nuser_data= 0;
06984
06985 if (cg->mode == CG_MODE_MODIFY) {
06986
06987 if (cgi_new_node(zone->id, "GridCoordinates", "GridCoordinates_t",
06988 &zone->zcoor->id, "MT", 0, 0, 0)) return 0;
06989 }
06990 zone->nzcoor=1;
06991 return zone->zcoor;
06992 } else {
06993 for (i=0; i<zone->nzcoor; i++) {
06994 if (strcmp(zone->zcoor[i].name,"GridCoordinates")==0) {
06995 return &zone->zcoor[i];
06996 }
06997 }
06998 }
06999 cgi_error("Node 'GridCoordinates' not found for zone '%s'",zone->name);
07000 return 0;
07001 }
07002
07003 cgns_zcoor *cgi_get_zcoor(cgns_file *cg, int B, int Z, int C) {
07004 cgns_zone *zone;
07005
07006 zone = cgi_get_zone(cg, B, Z);
07007 if (zone==0) return 0;
07008
07009 if (C>zone->nzcoor || C<=0) {
07010 cgi_error("GridCoordinates node number %d invalid",C);
07011 return 0;
07012 }
07013 return &(zone->zcoor[C-1]);
07014 }
07015
07016 cgns_sol *cgi_get_sol(cgns_file *cg, int B, int Z, int S) {
07017 cgns_zone *zone;
07018
07019 zone = cgi_get_zone(cg, B, Z);
07020 if (zone==0) return 0;
07021
07022 if (S>zone->nsols || S<=0) {
07023 cgi_error("FlowSolution node number %d invalid",S);
07024 return 0;
07025 }
07026 return &(zone->sol[S-1]);
07027 }
07028
07029 cgns_section *cgi_get_section(cgns_file *cg, int B, int Z, int S) {
07030 cgns_zone *zone;
07031
07032 zone = cgi_get_zone(cg, B, Z);
07033 if (zone==0) return 0;
07034
07035 if (S>zone->nsections || S<=0) {
07036 cgi_error("Elements_t node number %d invalid",S);
07037 return 0;
07038 }
07039 return &zone->section[S-1];
07040 }
07041
07042 cgns_array *cgi_get_field(cgns_file *cg, int B, int Z, int S, int F) {
07043 cgns_sol *sol;
07044
07045 sol = cgi_get_sol(cg, B, Z, S);
07046 if (sol==0) return 0;
07047
07048 if (F>sol->nfields || F<=0) {
07049 cgi_error("Solution array number %d invalid",F);
07050 return 0;
07051 }
07052 return &(sol->field[F-1]);
07053 }
07054
07055 cgns_zconn *cgi_get_zconn(cgns_file *cg, int B, int Z) {
07056 cgns_zone *zone;
07057
07058 zone = cgi_get_zone(cg, B, Z);
07059 if (zone==0) return 0;
07060
07061
07062
07063 if (zone->zconn == 0) {
07064 if (cg->mode == CG_MODE_WRITE) {
07065 zone->zconn = CGNS_NEW(cgns_zconn, 1);
07066 strcpy(zone->zconn->name, "ZoneGridConnectivity");
07067 zone->zconn->id=0;
07068 zone->zconn->link=0;
07069 zone->zconn->ndescr=0;
07070 zone->zconn->n1to1=0;
07071 zone->zconn->nconns=0;
07072 zone->zconn->nholes=0;
07073 zone->zconn->nuser_data=0;
07074
07075 } else {
07076 cgi_error("No grid connectivity information for zone %d", Z);
07077 return 0;
07078 }
07079 }
07080 return zone->zconn;
07081 }
07082
07083 cgns_cprop *cgi_get_cprop(cgns_file *cg, int B, int Z, int I) {
07084 cgns_conn *conn;
07085
07086 conn = cgi_get_conn(cg, B, Z, I);
07087 if (conn==0) return 0;
07088
07089 if (conn->cprop == 0)
07090 cgi_error("GridConnectivityProperty_t node doesn't exist under GridConnectivity_t %d",I);
07091
07092 return conn->cprop;
07093 }
07094
07095 cgns_hole *cgi_get_hole(cgns_file *cg, int B, int Z, int I) {
07096 cgns_zconn *zconn;
07097
07098 zconn = cgi_get_zconn(cg, B, Z);
07099 if (zconn==0) return 0;
07100
07101 if (I>zconn->nholes || I<=0) {
07102 cgi_error("OversetHoles node number %d invalid",I);
07103 return 0;
07104 }
07105 return &(zconn->hole[I-1]);
07106 }
07107
07108 cgns_conn *cgi_get_conn(cgns_file *cg, int B, int Z, int I) {
07109 cgns_zconn *zconn;
07110
07111 zconn = cgi_get_zconn(cg, B, Z);
07112 if (zconn==0) return 0;
07113
07114 if (I>zconn->nconns || I<=0) {
07115 cgi_error("GridConnectivity_t node number %d invalid",I);
07116 return 0;
07117 }
07118 return &(zconn->conn[I-1]);
07119 }
07120
07121 cgns_1to1 *cgi_get_1to1(cgns_file *cg, int B, int Z, int I) {
07122 cgns_zconn *zconn;
07123
07124 zconn = cgi_get_zconn(cg, B, Z);
07125 if (zconn==0) return 0;
07126
07127 if (I>zconn->n1to1 || I<=0) {
07128 cgi_error("GridConnectivity1to1_t node number %d invalid",I);
07129 return 0;
07130 }
07131 return &(zconn->one21[I-1]);
07132 }
07133
07134 cgns_zboco *cgi_get_zboco(cgns_file *cg, int B, int Z) {
07135 cgns_zone *zone;
07136
07137 zone = cgi_get_zone(cg, B, Z);
07138 if (zone==0) return 0;
07139
07140
07141
07142 if (zone->zboco == 0) {
07143 if (cg->mode == CG_MODE_WRITE) {
07144 zone->zboco = CGNS_NEW(cgns_zboco, 1);
07145 strcpy(zone->zboco->name,"ZoneBC");
07146 zone->zboco->id=0;
07147 zone->zboco->link=0;
07148 zone->zboco->ndescr=0;
07149 zone->zboco->nbocos=0;
07150 zone->zboco->state=0;
07151 zone->zboco->data_class=DataClassNull;
07152 zone->zboco->units=0;
07153 zone->zboco->nuser_data=0;
07154
07155 } else {
07156 cgi_error("No boundary condition data in zone %d",Z);
07157 return 0;
07158 }
07159 }
07160 return zone->zboco;
07161 }
07162
07163 cgns_bprop *cgi_get_bprop(cgns_file *cg, int B, int Z, int BC) {
07164 cgns_boco *boco;
07165
07166 boco = cgi_get_boco(cg, B, Z, BC);
07167 if (boco==0) return 0;
07168
07169 if (boco->bprop == 0)
07170 cgi_error("BCProperty_t node doesn't exist under BC_t %d",BC);
07171 return boco->bprop;
07172 }
07173
07174 cgns_boco *cgi_get_boco(cgns_file *cg, int B, int Z, int BC) {
07175 cgns_zboco *zboco;
07176
07177 zboco = cgi_get_zboco(cg, B, Z);
07178 if (zboco==0) return 0;
07179
07180 if (BC>zboco->nbocos || BC<=0) {
07181 cgi_error("BC_t node number %d invalid",BC);
07182 return 0;
07183 }
07184 return &(zboco->boco[BC-1]);
07185 }
07186
07187 cgns_dataset *cgi_get_dataset(cgns_file *cg, int B, int Z, int BC, int DSet) {
07188
07189 cgns_boco *boco = cgi_get_boco(cg, B, Z, BC);
07190 if (boco==0) return 0;
07191
07192 if (DSet>boco->ndataset || DSet<=0) {
07193 cgi_error("BCDataSet_t node number %d invalid",DSet);
07194 return 0;
07195 }
07196 return &boco->dataset[DSet-1];
07197 }
07198
07199 cgns_bcdata *cgi_get_bcdata(cgns_file *cg, int B, int Z, int BC, int Dset,
07200 BCDataType_t type) {
07201
07202 cgns_dataset *dataset = cgi_get_dataset(cg, B, Z, BC, Dset);
07203 if (dataset==0) return 0;
07204
07205 if (type==Dirichlet) {
07206 if (dataset->dirichlet==0) {
07207 cgi_error("BCData_t type Dirichlet doesn't exist for Zone %d, BC=%d, BCDataSet=%d",
07208 Z, BC, Dset);
07209 return 0;
07210 } else return dataset->dirichlet;
07211 } else if (type==Neumann) {
07212 if (dataset->neumann==0) {
07213 cgi_error("BCData_t type Neumann doesn't exist for Zone %d, BC=%d, BCDataSet=%d",
07214 Z, BC, Dset);
07215 return 0;
07216 } else return dataset->neumann;
07217 } else {
07218 cgi_error("BCData must be of type Dirichlet or Neumann");
07219 return 0;
07220 }
07221 }
07222
07223 cgns_converg *cgi_get_converg(cgns_file *cg, int B, int Z) {
07224
07225 if (Z==0) {
07226 cgns_base *base=cgi_get_base(cg, B);
07227 if (base==0) return 0;
07228
07229 if (base->converg== 0) {
07230 cgi_error("ConvergenceHistory_t node doesn't exist under CGNSBase %d",B);
07231 return 0;
07232 } else return base->converg;
07233 } else {
07234 cgns_zone *zone=cgi_get_zone(cg, B, Z);
07235 if (zone==0) return 0;
07236
07237 if (zone->converg== 0) {
07238 cgi_error("ConvergenceHistory_t node doesn't exist under CGNSBase %d, Zone %d",B,Z);
07239 return 0;
07240 } else return zone->converg;
07241 }
07242 }
07243
07244 cgns_equations *cgi_get_equations(cgns_file *cg, int B, int Z) {
07245
07246 if (Z==0) {
07247 cgns_base *base=cgi_get_base(cg, B);
07248 if (base==0) return 0;
07249
07250
07251
07252 if (base->equations == 0) {
07253 cgi_error("FlowEquationSet_t Node doesn't exist under CGNSBase %d",B);
07254 return 0;
07255 } else return base->equations;
07256 } else {
07257 cgns_zone *zone=cgi_get_zone(cg, B, Z);
07258 if (zone==0) return 0;
07259
07260 if (zone->equations == 0) {
07261 cgi_error("FlowEquationSet_t Node doesn't exist under CGNSBase %d, Zone %d",B,Z);
07262 return 0;
07263 } else return zone->equations;
07264 }
07265 }
07266
07267 cgns_governing *cgi_get_governing(cgns_file *cg, int B, int Z) {
07268
07269 cgns_equations *eq=cgi_get_equations(cg, B, Z);
07270 if (eq==0) return 0;
07271
07272 if (eq->governing==0) {
07273 if (Z==0) cgi_error("GoverningEquations_t undefined for CGNSBase %d",B);
07274 else cgi_error("GoverningEquations_t undefined for CGNSBase %d, Zone %d", B, Z);
07275 return 0;
07276 } else return eq->governing;
07277 }
07278
07279 cgns_model *cgi_get_model(cgns_file *cg, int B, int Z, char *model) {
07280
07281 cgns_equations *eq=cgi_get_equations(cg, B, Z);
07282 if (eq==0) return 0;
07283
07284 if (strcmp(model, "GasModel_t")==0 && eq->gas)
07285 return eq->gas;
07286 else if (strcmp(model, "ViscosityModel_t")==0 && eq->visc)
07287 return eq->visc;
07288 else if (strcmp(model, "ThermalConductivityModel_t")==0 && eq->conduct)
07289 return eq->conduct;
07290 else if (strcmp(model, "TurbulenceModel_t")==0 && eq->turbulence)
07291 return eq->turbulence;
07292 else if (strcmp(model, "TurbulenceClosure_t")==0 && eq->closure)
07293 return eq->closure;
07294 else if (strcmp(model, "ThermalRelaxationModel_t")==0 && eq->relaxation)
07295 return eq->relaxation;
07296 else if (strcmp(model, "ChemicalKineticsModel_t")==0 && eq->chemkin)
07297 return eq->chemkin;
07298 else if (strcmp(model, "EMElectricFieldModel_t")==0 && eq->elecfield)
07299 return eq->elecfield;
07300 else if (strcmp(model, "EMMagneticFieldModel_t")==0 && eq->magnfield)
07301 return eq->magnfield;
07302 else if (strcmp(model, "EMConductivityModel_t")==0 && eq->emconduct)
07303 return eq->emconduct;
07304 else {
07305 if (Z==0) cgi_error("%s undefined for CGNSBase %d",model, B);
07306 else cgi_error("%s undefined for CGNSBase %d, Zone %d",model, B, Z);
07307 return 0;
07308 }
07309 }
07310
07311 cgns_integral *cgi_get_integral(cgns_file *cg, int B, int Z, int N) {
07312
07313 if (Z==0) {
07314 cgns_base *base=cgi_get_base(cg, B);
07315 if (base==0) return 0;
07316
07317 if (N>base->nintegrals || N<=0) {
07318 cgi_error("IntegralData_t node number %d invalid under CGNSBase %d",N, B);
07319 return 0;
07320 } else return &base->integral[N-1];
07321 } else {
07322 cgns_zone *zone=cgi_get_zone(cg, B, Z);
07323 if (zone==0) return 0;
07324
07325 if (N>zone->nintegrals || N<=0) {
07326 cgi_error("IntegralData_t node number %d invalid under CGNSBase %d, Zone %d",N,B,Z);
07327 return 0;
07328 } else return &zone->integral[N-1];
07329 }
07330 }
07331
07332 cgns_discrete *cgi_get_discrete(cgns_file *cg, int B, int Z, int D) {
07333 cgns_zone *zone;
07334
07335 zone = cgi_get_zone(cg, B, Z);
07336 if (zone==0) return 0;
07337
07338 if (D>zone->ndiscrete || D<=0) {
07339 cgi_error("DiscreteData node number %d invalid",D);
07340 return 0;
07341 }
07342 return &zone->discrete[D-1];
07343 }
07344
07345 cgns_rmotion *cgi_get_rmotion(cgns_file *cg, int B, int Z, int R) {
07346 cgns_zone *zone;
07347
07348 zone = cgi_get_zone(cg, B, Z);
07349 if (zone==0) return 0;
07350
07351 if (R>zone->nrmotions || R<=0) {
07352 cgi_error("RigidGridMotion node number %d invalid",R);
07353 return 0;
07354 }
07355 return &zone->rmotion[R-1];
07356 }
07357
07358 cgns_amotion *cgi_get_amotion(cgns_file *cg, int B, int Z, int R) {
07359 cgns_zone *zone;
07360
07361 zone = cgi_get_zone(cg, B, Z);
07362 if (zone==0) return 0;
07363
07364 if (R>zone->namotions || R<=0) {
07365 cgi_error("ArbitraryGridMotion node number %d invalid",R);
07366 return 0;
07367 }
07368 return &zone->amotion[R-1];
07369 }
07370
07371 cgns_state *cgi_get_state(cgns_file *cg, int B, int Z, int ZBC, int BC,
07372 int Dset) {
07373
07374
07375 if (Z==0 && ZBC==0 && BC==0 && Dset==0) {
07376 cgns_base *base = cgi_get_base(cg, B);
07377 if (base==0) return 0;
07378 if (base->state==0) {
07379 cgi_error("ReferenceState_t undefined under CGNSBase %d",B);
07380 return 0;
07381 } else return base->state;
07382
07383 } else if (ZBC==0 && BC==0 && Dset==0) {
07384 cgns_zone *zone = cgi_get_zone(cg, B, Z);
07385 if (zone==0) return 0;
07386 if (zone->state==0) {
07387 cgi_error("ReferenceState_t undefined under CGNSBase %d, Zone %d",B,Z);
07388 return 0;
07389 } else return zone->state;
07390
07391 } else if (BC==0 && Dset==0) {
07392 cgns_zboco *zboco = cgi_get_zboco(cg, B, Z);
07393 if (zboco==0) return 0;
07394 if (zboco->state==0) {
07395 cgi_error("ReferenceState_t undefined under CGNSBase %d, Zone %d, ZoneBC_t",B,Z);
07396 return 0;
07397 } else return zboco->state;
07398
07399 } else if (Dset==0) {
07400 cgns_boco *boco = cgi_get_boco(cg, B, Z, BC);
07401 if (boco==0) return 0;
07402 if (boco->state==0) {
07403 cgi_error("ReferenceState_t undefined under CGNSBase %d, Zone %d, BC_t %d",B,Z,BC);
07404 return 0;
07405 } else return boco->state;
07406
07407 } else {
07408 cgns_dataset *dataset = cgi_get_dataset(cg, B, Z, BC, Dset);
07409 if (dataset==0) return 0;
07410 if (dataset->state==0) {
07411 cgi_error("ReferenceState_t undefined under CGNSBase %d, Zone %d, BC_t %d, BCDataSet %d", B,Z,BC,Dset);
07412 return 0;
07413 } else return dataset->state;
07414 }
07415 }
07416
07417
07418
07419
07420 static int cgi_add_posit(void *pos, char *label, int index, double id)
07421 {
07422 if (posit_depth == CG_MAX_GOTO_DEPTH) {
07423 cgi_error("max goto depth exceeded");
07424 return CG_ERROR;
07425 }
07426 posit_stack[posit_depth].posit = pos;
07427 strcpy (posit_stack[posit_depth].label, label);
07428 posit_stack[posit_depth].index = index;
07429 posit_stack[posit_depth].id = id;
07430 posit = &posit_stack[posit_depth++];
07431 return CG_OK;
07432 }
07433
07434 static int cgi_next_posit(char *label, int index, char *name)
07435 {
07436 int n;
07437
07438
07439
07440 if (0 == strcmp (posit->label, "CGNSBase_t")) {
07441 cgns_base *b = (cgns_base *)posit->posit;
07442 if (0 == strcmp (label, "Zone_t")) {
07443 if (--index < 0) {
07444 for (n = 0; n < b->nzones; n++) {
07445 if (0 == strcmp (b->zone[n].name, name)) {
07446 index = n;
07447 break;
07448 }
07449 }
07450 }
07451 if (index >= 0 && index < b->nzones) {
07452 posit_zone = index + 1;
07453 return cgi_add_posit((void *)&b->zone[index],
07454 label, index + 1, b->zone[index].id);
07455 }
07456 }
07457 else if (0 == strcmp (label, "ReferenceState_t")) {
07458 if (b->state &&
07459 (index == 1 || 0 == strcmp (b->state->name, name))) {
07460 return cgi_add_posit((void *)b->state,
07461 label, 1, b->state->id);
07462 }
07463 }
07464 else if (0 == strcmp (label, "Family_t")) {
07465 if (--index < 0) {
07466 for (n = 0; n < b->nfamilies; n++) {
07467 if (0 == strcmp (b->family[n].name, name)) {
07468 index = n;
07469 break;
07470 }
07471 }
07472 }
07473 if (index >= 0 && index < b->nfamilies) {
07474 return cgi_add_posit((void *)&b->family[index],
07475 label, index + 1, b->family[index].id);
07476 }
07477 }
07478 else if (0 == strcmp (label, "BaseIterativeData_t")) {
07479 if (b->biter &&
07480 (index == 1 || 0 == strcmp (b->biter->name, name))) {
07481 return cgi_add_posit((void *)b->biter,
07482 label, 1, b->biter->id);
07483 }
07484 }
07485 else if (0 == strcmp (label, "ConvergenceHistory_t")) {
07486 if (b->converg &&
07487 (index == 1 || 0 == strcmp (b->converg->name, name))) {
07488 return cgi_add_posit((void *)b->converg,
07489 label, 1, b->converg->id);
07490 }
07491 }
07492 else if (0 == strcmp (label, "FlowEquationSet_t")) {
07493 if (b->equations &&
07494 (index == 1 || 0 == strcmp (b->equations->name, name))) {
07495 return cgi_add_posit((void *)b->equations,
07496 label, 1, b->equations->id);
07497 }
07498 }
07499 else if (0 == strcmp (label, "IntegralData_t")) {
07500 if (--index < 0) {
07501 for (n = 0; n < b->nintegrals; n++) {
07502 if (0 == strcmp (b->integral[n].name, name)) {
07503 index = n;
07504 break;
07505 }
07506 }
07507 }
07508 if (index >= 0 && index < b->nintegrals) {
07509 return cgi_add_posit((void *)&b->integral[index],
07510 label, index + 1, b->integral[index].id);
07511 }
07512 }
07513 else if (0 == strcmp (label, "UserDefinedData_t")) {
07514 if (--index < 0) {
07515 for (n = 0; n < b->nuser_data; n++) {
07516 if (0 == strcmp (b->user_data[n].name, name)) {
07517 index = n;
07518 break;
07519 }
07520 }
07521 }
07522 if (index >= 0 && index < b->nuser_data) {
07523 return cgi_add_posit((void *)&b->user_data[index],
07524 label, index + 1, b->user_data[index].id);
07525 }
07526 }
07527 else if (0 == strcmp (label, "Gravity_t")) {
07528 if (b->gravity &&
07529 (index == 1 || 0 == strcmp (b->gravity->name, name))) {
07530 return cgi_add_posit((void *)b->gravity,
07531 label, 1, b->gravity->id);
07532 }
07533 }
07534 else if (0 == strcmp (label, "Axisymmetry_t")) {
07535 if (b->axisym &&
07536 (index == 1 || 0 == strcmp (b->axisym->name, name))) {
07537 return cgi_add_posit((void *)b->axisym,
07538 label, 1, b->axisym->id);
07539 }
07540 }
07541 else if (0 == strcmp (label, "RotatingCoordinates_t")) {
07542 if (b->rotating &&
07543 (index == 1 || 0 == strcmp (b->rotating->name, name))) {
07544 return cgi_add_posit((void *)b->rotating,
07545 label, 1, b->rotating->id);
07546 }
07547 }
07548 else
07549 return CG_INCORRECT_PATH;
07550 }
07551
07552
07553
07554 else if (0 == strcmp (posit->label, "Zone_t")) {
07555 cgns_zone *z = (cgns_zone *)posit->posit;
07556 if (0 == strcmp (label, "GridCoordinates_t")) {
07557 if (--index < 0) {
07558 for (n = 0; n < z->nzcoor; n++) {
07559 if (0 == strcmp (z->zcoor[n].name, name)) {
07560 index = n;
07561 break;
07562 }
07563 }
07564 }
07565 if (index >= 0 && index < z->nzcoor) {
07566 return cgi_add_posit((void *)&z->zcoor[index],
07567 label, index + 1, z->zcoor[index].id);
07568 }
07569 }
07570 else if (0 == strcmp (label, "ZoneIterativeData_t")) {
07571 if (z->ziter &&
07572 (index == 1 || 0 == strcmp (z->ziter->name, name))) {
07573 return cgi_add_posit((void *)z->ziter,
07574 label, 1, z->ziter->id);
07575 }
07576 }
07577 else if (0 == strcmp (label, "Elements_t")) {
07578 if (--index < 0) {
07579 for (n = 0; n < z->nsections; n++) {
07580 if (0 == strcmp (z->section[n].name, name)) {
07581 index = n;
07582 break;
07583 }
07584 }
07585 }
07586 if (index >= 0 && index < z->nsections) {
07587 return cgi_add_posit((void *)&z->section[index],
07588 label, index + 1, z->section[index].id);
07589 }
07590 }
07591 else if (0 == strcmp (label, "FlowSolution_t")) {
07592 if (--index < 0) {
07593 for (n = 0; n < z->nsols; n++) {
07594 if (0 == strcmp (z->sol[n].name, name)) {
07595 index = n;
07596 break;
07597 }
07598 }
07599 }
07600 if (index >= 0 && index < z->nsols) {
07601 return cgi_add_posit((void *)&z->sol[index],
07602 label, index + 1, z->sol[index].id);
07603 }
07604 }
07605 else if (0 == strcmp (label, "RigidGridMotion_t")) {
07606 if (--index < 0) {
07607 for (n = 0; n < z->nrmotions; n++) {
07608 if (0 == strcmp (z->rmotion[n].name, name)) {
07609 index = n;
07610 break;
07611 }
07612 }
07613 }
07614 if (index >= 0 && index < z->nrmotions) {
07615 return cgi_add_posit((void *)&z->rmotion[index],
07616 label, index + 1, z->rmotion[index].id);
07617 }
07618 }
07619 else if (0 == strcmp (label, "ArbitraryGridMotion_t")) {
07620 if (--index < 0) {
07621 for (n = 0; n < z->namotions; n++) {
07622 if (0 == strcmp (z->amotion[n].name, name)) {
07623 index = n;
07624 break;
07625 }
07626 }
07627 }
07628 if (index >= 0 && index < z->namotions) {
07629 return cgi_add_posit((void *)&z->amotion[index],
07630 label, index + 1, z->amotion[index].id);
07631 }
07632 }
07633 else if (0 == strcmp (label, "ZoneGridConnectivity_t")) {
07634 if (z->zconn &&
07635 (index == 1 || 0 == strcmp (z->zconn->name, name))) {
07636 return cgi_add_posit((void *)z->zconn,
07637 label, 1, z->zconn->id);
07638 }
07639 }
07640 else if (0 == strcmp (label, "ZoneBC_t")) {
07641 if (z->zboco &&
07642 (index == 1 || 0 == strcmp (z->zboco->name, name))) {
07643 return cgi_add_posit((void *)z->zboco,
07644 label, 1, z->zboco->id);
07645 }
07646 }
07647 else if (0 == strcmp (label, "DiscreteData_t")) {
07648 if (--index < 0) {
07649 for (n = 0; n < z->ndiscrete; n++) {
07650 if (0 == strcmp (z->discrete[n].name, name)) {
07651 index = n;
07652 break;
07653 }
07654 }
07655 }
07656 if (index >= 0 && index < z->ndiscrete) {
07657 return cgi_add_posit((void *)&z->discrete[index],
07658 label, index + 1, z->discrete[index].id);
07659 }
07660 }
07661 else if (0 == strcmp (label, "FlowEquationSet_t")) {
07662 if (z->equations &&
07663 (index == 1 || 0 == strcmp (z->equations->name, name))) {
07664 return cgi_add_posit((void *)z->equations,
07665 label, 1, z->equations->id);
07666 }
07667 }
07668 else if (0 == strcmp (label, "ConvergenceHistory_t")) {
07669 if (z->converg &&
07670 (index == 1 || 0 == strcmp (z->converg->name, name))) {
07671 return cgi_add_posit((void *)z->converg,
07672 label, 1, z->converg->id);
07673 }
07674 }
07675 else if (0 == strcmp (label, "IntegralData_t")) {
07676 if (--index < 0) {
07677 for (n = 0; n < z->nintegrals; n++) {
07678 if (0 == strcmp (z->integral[n].name, name)) {
07679 index = n;
07680 break;
07681 }
07682 }
07683 }
07684 if (index >= 0 && index < z->nintegrals) {
07685 return cgi_add_posit((void *)&z->integral[index],
07686 label, index + 1, z->integral[index].id);
07687 }
07688 }
07689 else if (0 == strcmp (label, "ReferenceState_t")) {
07690 if (z->state &&
07691 (index == 1 || 0 == strcmp (z->state->name, name))) {
07692 return cgi_add_posit((void *)z->state,
07693 label, 1, z->state->id);
07694 }
07695 }
07696 else if (0 == strcmp (label, "UserDefinedData_t")) {
07697 if (--index < 0) {
07698 for (n = 0; n < z->nuser_data; n++) {
07699 if (0 == strcmp (z->user_data[n].name, name)) {
07700 index = n;
07701 break;
07702 }
07703 }
07704 }
07705 if (index >= 0 && index < z->nuser_data) {
07706 return cgi_add_posit((void *)&z->user_data[index],
07707 label, index + 1, z->user_data[index].id);
07708 }
07709 }
07710 else if (0 == strcmp (label, "RotatingCoordinates_t")) {
07711 if (z->rotating &&
07712 (index == 1 || 0 == strcmp (z->rotating->name, name))) {
07713 return cgi_add_posit((void *)z->rotating,
07714 label, 1, z->rotating->id);
07715 }
07716 }
07717 else
07718 return CG_INCORRECT_PATH;
07719 }
07720
07721
07722
07723 else if (0 == strcmp (posit->label, "GridCoordinates_t")) {
07724 cgns_zcoor *z = (cgns_zcoor *)posit->posit;
07725 if (0 == strcmp (label, "DataArray_t")) {
07726 if (--index < 0) {
07727 for (n = 0; n < z->ncoords; n++) {
07728 if (0 == strcmp (z->coord[n].name, name)) {
07729 index = n;
07730 break;
07731 }
07732 }
07733 }
07734 if (index >= 0 && index < z->ncoords) {
07735 return cgi_add_posit((void *)&z->coord[index],
07736 label, index + 1, z->coord[index].id);
07737 }
07738 }
07739 else if (0 == strcmp (label, "UserDefinedData_t")) {
07740 if (--index < 0) {
07741 for (n = 0; n < z->nuser_data; n++) {
07742 if (0 == strcmp (z->user_data[n].name, name)) {
07743 index = n;
07744 break;
07745 }
07746 }
07747 }
07748 if (index >= 0 && index < z->nuser_data) {
07749 return cgi_add_posit((void *)&z->user_data[index],
07750 label, index + 1, z->user_data[index].id);
07751 }
07752 }
07753 else
07754 return CG_INCORRECT_PATH;
07755 }
07756
07757
07758
07759 else if (0 == strcmp (posit->label, "FlowSolution_t")) {
07760 cgns_sol *s = (cgns_sol *)posit->posit;
07761 if (0 == strcmp (label, "DataArray_t")) {
07762 if (--index < 0) {
07763 for (n = 0; n < s->nfields; n++) {
07764 if (0 == strcmp (s->field[n].name, name)) {
07765 index = n;
07766 break;
07767 }
07768 }
07769 }
07770 if (index >= 0 && index < s->nfields) {
07771 return cgi_add_posit((void *)&s->field[index],
07772 label, index + 1, s->field[index].id);
07773 }
07774 }
07775 else if (0 == strcmp (label, "UserDefinedData_t")) {
07776 if (--index < 0) {
07777 for (n = 0; n < s->nuser_data; n++) {
07778 if (0 == strcmp (s->user_data[n].name, name)) {
07779 index = n;
07780 break;
07781 }
07782 }
07783 }
07784 if (index >= 0 && index < s->nuser_data) {
07785 return cgi_add_posit((void *)&s->user_data[index],
07786 label, index + 1, s->user_data[index].id);
07787 }
07788 }
07789 else
07790 return CG_INCORRECT_PATH;
07791 }
07792
07793
07794
07795 else if (0 == strcmp (posit->label, "ZoneGridConnectivity_t")) {
07796 cgns_zconn *z = (cgns_zconn *)posit->posit;
07797 if (0 == strcmp (label, "OversetHoles_t")) {
07798 if (--index < 0) {
07799 for (n = 0; n < z->nholes; n++) {
07800 if (0 == strcmp (z->hole[n].name, name)) {
07801 index = n;
07802 break;
07803 }
07804 }
07805 }
07806 if (index >= 0 && index < z->nholes) {
07807 return cgi_add_posit((void *)&z->hole[index],
07808 label, index + 1, z->hole[index].id);
07809 }
07810 }
07811 else if (0 == strcmp (label, "GridConnectivity_t")) {
07812 if (--index < 0) {
07813 for (n = 0; n < z->nconns; n++) {
07814 if (0 == strcmp (z->conn[n].name, name)) {
07815 index = n;
07816 break;
07817 }
07818 }
07819 }
07820 if (index >= 0 && index < z->nconns) {
07821 return cgi_add_posit((void *)&z->conn[index],
07822 label, index + 1, z->conn[index].id);
07823 }
07824 }
07825 else if (0 == strcmp (label, "GridConnectivity1to1_t")) {
07826 if (--index < 0) {
07827 for (n = 0; n < z->n1to1; n++) {
07828 if (0 == strcmp (z->one21[n].name, name)) {
07829 index = n;
07830 break;
07831 }
07832 }
07833 }
07834 if (index >= 0 && index < z->n1to1) {
07835 return cgi_add_posit((void *)&z->one21[index],
07836 label, index + 1, z->one21[index].id);
07837 }
07838 }
07839 else if (0 == strcmp (label, "UserDefinedData_t")) {
07840 if (--index < 0) {
07841 for (n = 0; n < z->nuser_data; n++) {
07842 if (0 == strcmp (z->user_data[n].name, name)) {
07843 index = n;
07844 break;
07845 }
07846 }
07847 }
07848 if (index >= 0 && index < z->nuser_data) {
07849 return cgi_add_posit((void *)&z->user_data[index],
07850 label, index + 1, z->user_data[index].id);
07851 }
07852 }
07853 else
07854 return CG_INCORRECT_PATH;
07855 }
07856
07857
07858
07859 else if (0 == strcmp (posit->label, "OversetHoles_t")) {
07860 cgns_hole *h = (cgns_hole *)posit->posit;
07861 if (0 == strcmp (label, "UserDefinedData_t")) {
07862 if (--index < 0) {
07863 for (n = 0; n < h->nuser_data; n++) {
07864 if (0 == strcmp (h->user_data[n].name, name)) {
07865 index = n;
07866 break;
07867 }
07868 }
07869 }
07870 if (index >= 0 && index < h->nuser_data) {
07871 return cgi_add_posit((void *)&h->user_data[index],
07872 label, index + 1, h->user_data[index].id);
07873 }
07874 }
07875 else
07876 return CG_INCORRECT_PATH;
07877 }
07878
07879
07880
07881 else if (0 == strcmp (posit->label, "GridConnectivity_t")) {
07882 cgns_conn *c = (cgns_conn *)posit->posit;
07883 if (0 == strcmp (label, "GridConnectivityProperty_t")) {
07884 if (c->cprop &&
07885 (index == 1 || 0 == strcmp (c->cprop->name, name))) {
07886 return cgi_add_posit((void *)c->cprop,
07887 label, 1, c->cprop->id);
07888 }
07889 }
07890 else if (0 == strcmp (label, "UserDefinedData_t")) {
07891 if (--index < 0) {
07892 for (n = 0; n < c->nuser_data; n++) {
07893 if (0 == strcmp (c->user_data[n].name, name)) {
07894 index = n;
07895 break;
07896 }
07897 }
07898 }
07899 if (index >= 0 && index < c->nuser_data) {
07900 return cgi_add_posit((void *)&c->user_data[index],
07901 label, index + 1, c->user_data[index].id);
07902 }
07903 }
07904 else
07905 return CG_INCORRECT_PATH;
07906 }
07907
07908
07909
07910 else if (0 == strcmp (posit->label, "GridConnectivity1to1_t")) {
07911 cgns_1to1 *c = (cgns_1to1 *)posit->posit;
07912 if (0 == strcmp (label, "GridConnectivityProperty_t")) {
07913 if (c->cprop &&
07914 (index == 1 || 0 == strcmp (c->cprop->name, name))) {
07915 return cgi_add_posit((void *)c->cprop,
07916 label, 1, c->cprop->id);
07917 }
07918 }
07919 else if (0 == strcmp (label, "UserDefinedData_t")) {
07920 if (--index < 0) {
07921 for (n = 0; n < c->nuser_data; n++) {
07922 if (0 == strcmp (c->user_data[n].name, name)) {
07923 index = n;
07924 break;
07925 }
07926 }
07927 }
07928 if (index >= 0 && index < c->nuser_data) {
07929 return cgi_add_posit((void *)&c->user_data[index],
07930 label, index + 1, c->user_data[index].id);
07931 }
07932 }
07933 else
07934 return CG_INCORRECT_PATH;
07935 }
07936
07937
07938
07939 else if (0 == strcmp (posit->label, "ZoneBC_t")) {
07940 cgns_zboco *z = (cgns_zboco *)posit->posit;
07941 if (0 == strcmp (label, "BC_t")) {
07942 if (--index < 0) {
07943 for (n = 0; n < z->nbocos; n++) {
07944 if (0 == strcmp (z->boco[n].name, name)) {
07945 index = n;
07946 break;
07947 }
07948 }
07949 }
07950 if (index >= 0 && index < z->nbocos) {
07951 return cgi_add_posit((void *)&z->boco[index],
07952 label, index + 1, z->boco[index].id);
07953 }
07954 }
07955 else if (0 == strcmp (label, "ReferenceState_t")) {
07956 if (z->state &&
07957 (index == 1 || 0 == strcmp (z->state->name, name))) {
07958 return cgi_add_posit((void *)z->state,
07959 label, 1, z->state->id);
07960 }
07961 }
07962 else if (0 == strcmp (label, "UserDefinedData_t")) {
07963 if (--index < 0) {
07964 for (n = 0; n < z->nuser_data; n++) {
07965 if (0 == strcmp (z->user_data[n].name, name)) {
07966 index = n;
07967 break;
07968 }
07969 }
07970 }
07971 if (index >= 0 && index < z->nuser_data) {
07972 return cgi_add_posit((void *)&z->user_data[index],
07973 label, index + 1, z->user_data[index].id);
07974 }
07975 }
07976 else
07977 return CG_INCORRECT_PATH;
07978 }
07979
07980
07981
07982 else if (0 == strcmp (posit->label, "BC_t")) {
07983 cgns_boco *b = (cgns_boco *)posit->posit;
07984 if (0 == strcmp (label, "BCDataSet_t")) {
07985 if (--index < 0) {
07986 for (n = 0; n < b->ndataset; n++) {
07987 if (0 == strcmp (b->dataset[n].name, name)) {
07988 index = n;
07989 break;
07990 }
07991 }
07992 }
07993 if (index >= 0 && index < b->ndataset) {
07994 return cgi_add_posit((void *)&b->dataset[index],
07995 label, index + 1, b->dataset[index].id);
07996 }
07997 }
07998 else if (0 == strcmp (label, "BCProperty_t")) {
07999 if (b->bprop &&
08000 (index == 1 || 0 == strcmp (b->bprop->name, name))) {
08001 return cgi_add_posit((void *)b->bprop,
08002 label, 1, b->bprop->id);
08003 }
08004 }
08005 else if (0 == strcmp (label, "ReferenceState_t")) {
08006 if (b->state &&
08007 (index == 1 || 0 == strcmp (b->state->name, name))) {
08008 return cgi_add_posit((void *)b->state,
08009 label, 1, b->state->id);
08010 }
08011 }
08012 else if (0 == strcmp (label, "UserDefinedData_t")) {
08013 if (--index < 0) {
08014 for (n = 0; n < b->nuser_data; n++) {
08015 if (0 == strcmp (b->user_data[n].name, name)) {
08016 index = n;
08017 break;
08018 }
08019 }
08020 }
08021 if (index >= 0 && index < b->nuser_data) {
08022 return cgi_add_posit((void *)&b->user_data[index],
08023 label, index + 1, b->user_data[index].id);
08024 }
08025 }
08026 else
08027 return CG_INCORRECT_PATH;
08028 }
08029
08030
08031
08032 else if (0 == strcmp (posit->label, "BCDataSet_t")) {
08033 cgns_dataset *d = (cgns_dataset *)posit->posit;
08034 if (0 == strcmp (label, "BCData_t")) {
08035 if (d->dirichlet &&
08036 (index == Dirichlet || 0 == strcmp (d->dirichlet->name, name))) {
08037 return cgi_add_posit((void *)d->dirichlet,
08038 label, 1, d->dirichlet->id);
08039 }
08040 if (d->neumann &&
08041 (index == Neumann || 0 == strcmp (d->neumann->name, name))) {
08042 return cgi_add_posit((void *)d->neumann,
08043 label, 1, d->neumann->id);
08044 }
08045 }
08046 else if (0 == strcmp (label, "ReferenceState_t")) {
08047 if (d->state &&
08048 (index == 1 || 0 == strcmp (d->state->name, name))) {
08049 return cgi_add_posit((void *)d->state,
08050 label, 1, d->state->id);
08051 }
08052 }
08053 else if (0 == strcmp (label, "UserDefinedData_t")) {
08054 if (--index < 0) {
08055 for (n = 0; n < d->nuser_data; n++) {
08056 if (0 == strcmp (d->user_data[n].name, name)) {
08057 index = n;
08058 break;
08059 }
08060 }
08061 }
08062 if (index >= 0 && index < d->nuser_data) {
08063 return cgi_add_posit((void *)&d->user_data[index],
08064 label, index + 1, d->user_data[index].id);
08065 }
08066 }
08067 else
08068 return CG_INCORRECT_PATH;
08069 }
08070
08071
08072
08073 else if (0 == strcmp (posit->label, "BCData_t")) {
08074 cgns_bcdata *b = (cgns_bcdata *)posit->posit;
08075 if (0 == strcmp (label, "DataArray_t")) {
08076 if (--index < 0) {
08077 for (n = 0; n < b->narrays; n++) {
08078 if (0 == strcmp (b->array[n].name, name)) {
08079 index = n;
08080 break;
08081 }
08082 }
08083 }
08084 if (index >= 0 && index < b->narrays) {
08085 return cgi_add_posit((void *)&b->array[index],
08086 label, index + 1, b->array[index].id);
08087 }
08088 }
08089 else if (0 == strcmp (label, "UserDefinedData_t")) {
08090 if (--index < 0) {
08091 for (n = 0; n < b->nuser_data; n++) {
08092 if (0 == strcmp (b->user_data[n].name, name)) {
08093 index = n;
08094 break;
08095 }
08096 }
08097 }
08098 if (index >= 0 && index < b->nuser_data) {
08099 return cgi_add_posit((void *)&b->user_data[index],
08100 label, index + 1, b->user_data[index].id);
08101 }
08102 }
08103 else
08104 return CG_INCORRECT_PATH;
08105 }
08106
08107
08108
08109 else if (0 == strcmp (posit->label, "DiscreteData_t")) {
08110 cgns_discrete *d = (cgns_discrete *)posit->posit;
08111 if (0 == strcmp (label, "DataArray_t")) {
08112 if (--index < 0) {
08113 for (n = 0; n < d->narrays; n++) {
08114 if (0 == strcmp (d->array[n].name, name)) {
08115 index = n;
08116 break;
08117 }
08118 }
08119 }
08120 if (index >= 0 && index < d->narrays) {
08121 return cgi_add_posit((void *)&d->array[index],
08122 label, index + 1, d->array[index].id);
08123 }
08124 }
08125 else if (0 == strcmp (label, "UserDefinedData_t")) {
08126 if (--index < 0) {
08127 for (n = 0; n < d->nuser_data; n++) {
08128 if (0 == strcmp (d->user_data[n].name, name)) {
08129 index = n;
08130 break;
08131 }
08132 }
08133 }
08134 if (index >= 0 && index < d->nuser_data) {
08135 return cgi_add_posit((void *)&d->user_data[index],
08136 label, index + 1, d->user_data[index].id);
08137 }
08138 }
08139 else
08140 return CG_INCORRECT_PATH;
08141 }
08142
08143
08144
08145 else if (0 == strcmp (posit->label, "FlowEquationSet_t")) {
08146 cgns_equations *e = (cgns_equations *)posit->posit;
08147 if (0 == strcmp (label, "GoverningEquations_t")) {
08148 if (e->governing &&
08149 (index == 1 || 0 == strcmp (e->governing->name, name))) {
08150 return cgi_add_posit((void *)e->governing,
08151 label, 1, e->governing->id);
08152 }
08153 }
08154 else if (0 == strcmp (label, "GasModel_t")) {
08155 if (e->gas &&
08156 (index == 1 || 0 == strcmp (e->gas->name, name))) {
08157 return cgi_add_posit((void *)e->gas,
08158 label, 1, e->gas->id);
08159 }
08160 }
08161 else if (0 == strcmp (label, "ViscosityModel_t")) {
08162 if (e->visc &&
08163 (index == 1 || 0 == strcmp (e->visc->name, name))) {
08164 return cgi_add_posit((void *)e->visc,
08165 label, 1, e->visc->id);
08166 }
08167 }
08168 else if (0 == strcmp (label, "ThermalConductivityModel_t")) {
08169 if (e->conduct &&
08170 (index == 1 || 0 == strcmp (e->conduct->name, name))) {
08171 return cgi_add_posit((void *)e->conduct,
08172 label, 1, e->conduct->id);
08173 }
08174 }
08175 else if (0 == strcmp (label, "TurbulenceModel_t")) {
08176 if (e->turbulence &&
08177 (index == 1 || 0 == strcmp (e->turbulence->name, name))) {
08178 return cgi_add_posit((void *)e->turbulence,
08179 label, 1, e->turbulence->id);
08180 }
08181 }
08182 else if (0 == strcmp (label, "TurbulenceClosure_t")) {
08183 if (e->closure &&
08184 (index == 1 || 0 == strcmp (e->closure->name, name))) {
08185 return cgi_add_posit((void *)e->closure,
08186 label, 1, e->closure->id);
08187 }
08188 }
08189 else if (0 == strcmp (label, "ThermalRelaxationModel_t")) {
08190 if (e->relaxation &&
08191 (index == 1 || 0 == strcmp (e->relaxation->name, name))) {
08192 return cgi_add_posit((void *)e->relaxation,
08193 label, 1, e->relaxation->id);
08194 }
08195 }
08196 else if (0 == strcmp (label, "ChemicalKineticsModel_t")) {
08197 if (e->chemkin &&
08198 (index == 1 || 0 == strcmp (e->chemkin->name, name))) {
08199 return cgi_add_posit((void *)e->chemkin,
08200 label, 1, e->chemkin->id);
08201 }
08202 }
08203 else if (0 == strcmp (label, "EMConductivityModel_t")) {
08204 if (e->emconduct &&
08205 (index == 1 || 0 == strcmp (e->emconduct->name, name))) {
08206 return cgi_add_posit((void *)e->emconduct,
08207 label, 1, e->emconduct->id);
08208 }
08209 }
08210 else if (0 == strcmp (label, "EMElectricFieldModel_t")) {
08211 if (e->elecfield &&
08212 (index == 1 || 0 == strcmp (e->elecfield->name, name))) {
08213 return cgi_add_posit((void *)e->elecfield,
08214 label, 1, e->elecfield->id);
08215 }
08216 }
08217 else if (0 == strcmp (label, "EMMagneticFieldModel_t")) {
08218 if (e->magnfield &&
08219 (index == 1 || 0 == strcmp (e->magnfield->name, name))) {
08220 return cgi_add_posit((void *)e->magnfield,
08221 label, 1, e->magnfield->id);
08222 }
08223 }
08224 else if (0 == strcmp (label, "UserDefinedData_t")) {
08225 if (--index < 0) {
08226 for (n = 0; n < e->nuser_data; n++) {
08227 if (0 == strcmp (e->user_data[n].name, name)) {
08228 index = n;
08229 break;
08230 }
08231 }
08232 }
08233 if (index >= 0 && index < e->nuser_data) {
08234 return cgi_add_posit((void *)&e->user_data[index],
08235 label, index + 1, e->user_data[index].id);
08236 }
08237 }
08238 else
08239 return CG_INCORRECT_PATH;
08240 }
08241
08242
08243
08244 else if (0 == strcmp (posit->label, "GoverningEquations_t")) {
08245 cgns_governing *g = (cgns_governing *)posit->posit;
08246 if (0 == strcmp (label, "UserDefinedData_t")) {
08247 if (--index < 0) {
08248 for (n = 0; n < g->nuser_data; n++) {
08249 if (0 == strcmp (g->user_data[n].name, name)) {
08250 index = n;
08251 break;
08252 }
08253 }
08254 }
08255 if (index >= 0 && index < g->nuser_data) {
08256 return cgi_add_posit((void *)&g->user_data[index],
08257 label, index + 1, g->user_data[index].id);
08258 }
08259 }
08260 else
08261 return CG_INCORRECT_PATH;
08262 }
08263
08264
08265
08266
08267
08268
08269
08270
08271
08272
08273
08274
08275 else if (0 == strcmp (posit->label, "GasModel_t") ||
08276 0 == strcmp (posit->label, "ViscosityModel_t") ||
08277 0 == strcmp (posit->label, "ThermalConductivityModel_t") ||
08278 0 == strcmp (posit->label, "TurbulenceModel_t") ||
08279 0 == strcmp (posit->label, "TurbulenceClosure_t") ||
08280 0 == strcmp (posit->label, "ThermalRelaxationModel_t") ||
08281 0 == strcmp (posit->label, "ChemicalKineticsModel_t") ||
08282 0 == strcmp (posit->label, "EMConductivityModel_t") ||
08283 0 == strcmp (posit->label, "EMElectricFieldModel_t") ||
08284 0 == strcmp (posit->label, "EMMagneticFieldModel_t")) {
08285 cgns_model *m = (cgns_model *)posit->posit;
08286 if (0 == strcmp (label, "DataArray_t")) {
08287 if (--index < 0) {
08288 for (n = 0; n < m->narrays; n++) {
08289 if (0 == strcmp (m->array[n].name, name)) {
08290 index = n;
08291 break;
08292 }
08293 }
08294 }
08295 if (index >= 0 && index < m->narrays) {
08296 return cgi_add_posit((void *)&m->array[index],
08297 label, index + 1, m->array[index].id);
08298 }
08299 }
08300 else if (0 == strcmp (label, "UserDefinedData_t")) {
08301 if (--index < 0) {
08302 for (n = 0; n < m->nuser_data; n++) {
08303 if (0 == strcmp (m->user_data[n].name, name)) {
08304 index = n;
08305 break;
08306 }
08307 }
08308 }
08309 if (index >= 0 && index < m->nuser_data) {
08310 return cgi_add_posit((void *)&m->user_data[index],
08311 label, index + 1, m->user_data[index].id);
08312 }
08313 }
08314 else
08315 return CG_INCORRECT_PATH;
08316 }
08317
08318
08319
08320 else if (0 == strcmp (posit->label, "ConvergenceHistory_t")) {
08321 cgns_converg *c = (cgns_converg *)posit->posit;
08322 if (0 == strcmp (label, "DataArray_t")) {
08323 if (--index < 0) {
08324 for (n = 0; n < c->narrays; n++) {
08325 if (0 == strcmp (c->array[n].name, name)) {
08326 index = n;
08327 break;
08328 }
08329 }
08330 }
08331 if (index >= 0 && index < c->narrays) {
08332 return cgi_add_posit((void *)&c->array[index],
08333 label, index + 1, c->array[index].id);
08334 }
08335 }
08336 else if (0 == strcmp (label, "UserDefinedData_t")) {
08337 if (--index < 0) {
08338 for (n = 0; n < c->nuser_data; n++) {
08339 if (0 == strcmp (c->user_data[n].name, name)) {
08340 index = n;
08341 break;
08342 }
08343 }
08344 }
08345 if (index >= 0 && index < c->nuser_data) {
08346 return cgi_add_posit((void *)&c->user_data[index],
08347 label, index + 1, c->user_data[index].id);
08348 }
08349 }
08350 else
08351 return CG_INCORRECT_PATH;
08352 }
08353
08354
08355
08356 else if (0 == strcmp (posit->label, "IntegralData_t")) {
08357 cgns_integral *i = (cgns_integral *)posit->posit;
08358 if (0 == strcmp (label, "DataArray_t")) {
08359 if (--index < 0) {
08360 for (n = 0; n < i->narrays; n++) {
08361 if (0 == strcmp (i->array[n].name, name)) {
08362 index = n;
08363 break;
08364 }
08365 }
08366 }
08367 if (index >= 0 && index < i->narrays) {
08368 return cgi_add_posit((void *)&i->array[index],
08369 label, index + 1, i->array[index].id);
08370 }
08371 }
08372 else if (0 == strcmp (label, "UserDefinedData_t")) {
08373 if (--index < 0) {
08374 for (n = 0; n < i->nuser_data; n++) {
08375 if (0 == strcmp (i->user_data[n].name, name)) {
08376 index = n;
08377 break;
08378 }
08379 }
08380 }
08381 if (index >= 0 && index < i->nuser_data) {
08382 return cgi_add_posit((void *)&i->user_data[index],
08383 label, index + 1, i->user_data[index].id);
08384 }
08385 }
08386 else
08387 return CG_INCORRECT_PATH;
08388 }
08389
08390
08391
08392 else if (0 == strcmp (posit->label, "ReferenceState_t")) {
08393 cgns_state *s = (cgns_state *)posit->posit;
08394 if (0 == strcmp (label, "DataArray_t")) {
08395 if (--index < 0) {
08396 for (n = 0; n < s->narrays; n++) {
08397 if (0 == strcmp (s->array[n].name, name)) {
08398 index = n;
08399 break;
08400 }
08401 }
08402 }
08403 if (index >= 0 && index < s->narrays) {
08404 return cgi_add_posit((void *)&s->array[index],
08405 label, index + 1, s->array[index].id);
08406 }
08407 }
08408 else if (0 == strcmp (label, "UserDefinedData_t")) {
08409 if (--index < 0) {
08410 for (n = 0; n < s->nuser_data; n++) {
08411 if (0 == strcmp (s->user_data[n].name, name)) {
08412 index = n;
08413 break;
08414 }
08415 }
08416 }
08417 if (index >= 0 && index < s->nuser_data) {
08418 return cgi_add_posit((void *)&s->user_data[index],
08419 label, index + 1, s->user_data[index].id);
08420 }
08421 }
08422 else
08423 return CG_INCORRECT_PATH;
08424 }
08425
08426
08427
08428 else if (0 == strcmp (posit->label, "Elements_t")) {
08429 cgns_section *s = (cgns_section *)posit->posit;
08430 if (0 == strcmp (label, "UserDefinedData_t")) {
08431 if (--index < 0) {
08432 for (n = 0; n < s->nuser_data; n++) {
08433 if (0 == strcmp (s->user_data[n].name, name)) {
08434 index = n;
08435 break;
08436 }
08437 }
08438 }
08439 if (index >= 0 && index < s->nuser_data) {
08440 return cgi_add_posit((void *)&s->user_data[index],
08441 label, index + 1, s->user_data[index].id);
08442 }
08443 }
08444 else
08445 return CG_INCORRECT_PATH;
08446 }
08447
08448
08449
08450 else if (0 == strcmp (posit->label, "Family_t")) {
08451 cgns_family *f = (cgns_family *)posit->posit;
08452 if (0 == strcmp (label, "GeometryReference_t")) {
08453 if (--index < 0) {
08454 for (n = 0; n < f->ngeos; n++) {
08455 if (0 == strcmp (f->geo[n].name, name)) {
08456 index = n;
08457 break;
08458 }
08459 }
08460 }
08461 if (index >= 0 && index < f->ngeos) {
08462 return cgi_add_posit((void *)&f->geo[index],
08463 label, index + 1, f->geo[index].id);
08464 }
08465 }
08466 else if (0 == strcmp (label, "FamilyBC_t")) {
08467 if (f->fambc &&
08468 (index == 1 || 0 == strcmp (f->fambc->name, name))) {
08469 return cgi_add_posit((void *)f->fambc,
08470 label, 1, f->fambc->id);
08471 }
08472 }
08473 else if (0 == strcmp (label, "RotatingCoordinates_t")) {
08474 if (f->rotating &&
08475 (index == 1 || 0 == strcmp (f->rotating->name, name))) {
08476 return cgi_add_posit((void *)f->rotating,
08477 label, 1, f->rotating->id);
08478 }
08479 }
08480 else if (0 == strcmp (label, "UserDefinedData_t")) {
08481 if (--index < 0) {
08482 for (n = 0; n < f->nuser_data; n++) {
08483 if (0 == strcmp (f->user_data[n].name, name)) {
08484 index = n;
08485 break;
08486 }
08487 }
08488 }
08489 if (index >= 0 && index < f->nuser_data) {
08490 return cgi_add_posit((void *)&f->user_data[index],
08491 label, index + 1, f->user_data[index].id);
08492 }
08493 }
08494 else
08495 return CG_INCORRECT_PATH;
08496 }
08497
08498
08499
08500 else if (0 == strcmp (posit->label, "GeometryReference_t")) {
08501 cgns_geo *g = (cgns_geo *)posit->posit;
08502 if (0 == strcmp (label, "UserDefinedData_t")) {
08503 if (--index < 0) {
08504 for (n = 0; n < g->nuser_data; n++) {
08505 if (0 == strcmp (g->user_data[n].name, name)) {
08506 index = n;
08507 break;
08508 }
08509 }
08510 }
08511 if (index >= 0 && index < g->nuser_data) {
08512 return cgi_add_posit((void *)&g->user_data[index],
08513 label, index + 1, g->user_data[index].id);
08514 }
08515 }
08516 else
08517 return CG_INCORRECT_PATH;
08518 }
08519
08520
08521
08522 else if (0 == strcmp (posit->label, "FamilyBC_t")) {
08523 cgns_fambc *f = (cgns_fambc *)posit->posit;
08524 if (0 == strcmp (label, "BCDataSet_t")) {
08525 if (--index < 0) {
08526 for (n = 0; n < f->ndataset; n++) {
08527 if (0 == strcmp (f->dataset[n].name, name)) {
08528 index = n;
08529 break;
08530 }
08531 }
08532 }
08533 if (index >= 0 && index < f->ndataset) {
08534 return cgi_add_posit((void *)&f->dataset[index],
08535 label, index + 1, f->dataset[index].id);
08536 }
08537 }
08538 else
08539 return CG_INCORRECT_PATH;
08540 }
08541
08542
08543
08544 else if (0 == strcmp (posit->label, "RigidGridMotion_t")) {
08545 cgns_rmotion *m = (cgns_rmotion *)posit->posit;
08546 if (0 == strcmp (label, "DataArray_t")) {
08547 if (--index < 0) {
08548 for (n = 0; n < m->narrays; n++) {
08549 if (0 == strcmp (m->array[n].name, name)) {
08550 index = n;
08551 break;
08552 }
08553 }
08554 }
08555 if (index >= 0 && index < m->narrays) {
08556 return cgi_add_posit((void *)&m->array[index],
08557 label, index + 1, m->array[index].id);
08558 }
08559 }
08560 else if (0 == strcmp (label, "UserDefinedData_t")) {
08561 if (--index < 0) {
08562 for (n = 0; n < m->nuser_data; n++) {
08563 if (0 == strcmp (m->user_data[n].name, name)) {
08564 index = n;
08565 break;
08566 }
08567 }
08568 }
08569 if (index >= 0 && index < m->nuser_data) {
08570 return cgi_add_posit((void *)&m->user_data[index],
08571 label, index + 1, m->user_data[index].id);
08572 }
08573 }
08574 else
08575 return CG_INCORRECT_PATH;
08576 }
08577
08578
08579
08580 else if (0 == strcmp (posit->label, "ArbitraryGridMotion_t")) {
08581 cgns_amotion *m = (cgns_amotion *)posit->posit;
08582 if (0 == strcmp (label, "DataArray_t")) {
08583 if (--index < 0) {
08584 for (n = 0; n < m->narrays; n++) {
08585 if (0 == strcmp (m->array[n].name, name)) {
08586 index = n;
08587 break;
08588 }
08589 }
08590 }
08591 if (index >= 0 && index < m->narrays) {
08592 return cgi_add_posit((void *)&m->array[index],
08593 label, index + 1, m->array[index].id);
08594 }
08595 }
08596 else if (0 == strcmp (label, "UserDefinedData_t")) {
08597 if (--index < 0) {
08598 for (n = 0; n < m->nuser_data; n++) {
08599 if (0 == strcmp (m->user_data[n].name, name)) {
08600 index = n;
08601 break;
08602 }
08603 }
08604 }
08605 if (index >= 0 && index < m->nuser_data) {
08606 return cgi_add_posit((void *)&m->user_data[index],
08607 label, index + 1, m->user_data[index].id);
08608 }
08609 }
08610 else
08611 return CG_INCORRECT_PATH;
08612 }
08613
08614
08615
08616 else if (0 == strcmp (posit->label, "BaseIterativeData_t")) {
08617 cgns_biter *b = (cgns_biter *)posit->posit;
08618 if (0 == strcmp (label, "DataArray_t")) {
08619 if (--index < 0) {
08620 for (n = 0; n < b->narrays; n++) {
08621 if (0 == strcmp (b->array[n].name, name)) {
08622 index = n;
08623 break;
08624 }
08625 }
08626 }
08627 if (index >= 0 && index < b->narrays) {
08628 return cgi_add_posit((void *)&b->array[index],
08629 label, index + 1, b->array[index].id);
08630 }
08631 }
08632 else if (0 == strcmp (label, "UserDefinedData_t")) {
08633 if (--index < 0) {
08634 for (n = 0; n < b->nuser_data; n++) {
08635 if (0 == strcmp (b->user_data[n].name, name)) {
08636 index = n;
08637 break;
08638 }
08639 }
08640 }
08641 if (index >= 0 && index < b->nuser_data) {
08642 return cgi_add_posit((void *)&b->user_data[index],
08643 label, index + 1, b->user_data[index].id);
08644 }
08645 }
08646 else
08647 return CG_INCORRECT_PATH;
08648 }
08649
08650
08651
08652 else if (0 == strcmp (posit->label, "ZoneIterativeData_t")) {
08653 cgns_ziter *z = (cgns_ziter *)posit->posit;
08654 if (0 == strcmp (label, "DataArray_t")) {
08655 if (--index < 0) {
08656 for (n = 0; n < z->narrays; n++) {
08657 if (0 == strcmp (z->array[n].name, name)) {
08658 index = n;
08659 break;
08660 }
08661 }
08662 }
08663 if (index >= 0 && index < z->narrays) {
08664 return cgi_add_posit((void *)&z->array[index],
08665 label, index + 1, z->array[index].id);
08666 }
08667 }
08668 else if (0 == strcmp (label, "UserDefinedData_t")) {
08669 if (--index < 0) {
08670 for (n = 0; n < z->nuser_data; n++) {
08671 if (0 == strcmp (z->user_data[n].name, name)) {
08672 index = n;
08673 break;
08674 }
08675 }
08676 }
08677 if (index >= 0 && index < z->nuser_data) {
08678 return cgi_add_posit((void *)&z->user_data[index],
08679 label, index + 1, z->user_data[index].id);
08680 }
08681 }
08682 else
08683 return CG_INCORRECT_PATH;
08684 }
08685
08686
08687
08688 else if (0 == strcmp (posit->label, "UserDefinedData_t")) {
08689 cgns_user_data *u = (cgns_user_data *)posit->posit;
08690 if (0 == strcmp (label, "DataArray_t")) {
08691 if (--index < 0) {
08692 for (n = 0; n < u->narrays; n++) {
08693 if (0 == strcmp (u->array[n].name, name)) {
08694 index = n;
08695 break;
08696 }
08697 }
08698 }
08699 if (index >= 0 && index < u->narrays) {
08700 return cgi_add_posit((void *)&u->array[index],
08701 label, index + 1, u->array[index].id);
08702 }
08703 }
08704 else if (0 == strcmp (label, "UserDefinedData_t")) {
08705 if (--index < 0) {
08706 for (n = 0; n < u->nuser_data; n++) {
08707 if (0 == strcmp (u->user_data[n].name, name)) {
08708 index = n;
08709 break;
08710 }
08711 }
08712 }
08713 if (index >= 0 && index < u->nuser_data) {
08714 return cgi_add_posit((void *)&u->user_data[index],
08715 label, index + 1, u->user_data[index].id);
08716 }
08717 }
08718 else
08719 return CG_INCORRECT_PATH;
08720 }
08721
08722
08723
08724 else if (0 == strcmp (posit->label, "Gravity_t")) {
08725 cgns_gravity *g = (cgns_gravity *)posit->posit;
08726 if (0 == strcmp (label, "DataArray_t")) {
08727 if (--index < 0) {
08728 for (n = 0; n < g->narrays; n++) {
08729 if (0 == strcmp (g->vector[n].name, name)) {
08730 index = n;
08731 break;
08732 }
08733 }
08734 }
08735 if (index >= 0 && index < g->narrays) {
08736 return cgi_add_posit((void *)&g->vector[index],
08737 label, index + 1, g->vector[index].id);
08738 }
08739 }
08740 else if (0 == strcmp (label, "UserDefinedData_t")) {
08741 if (--index < 0) {
08742 for (n = 0; n < g->nuser_data; n++) {
08743 if (0 == strcmp (g->user_data[n].name, name)) {
08744 index = n;
08745 break;
08746 }
08747 }
08748 }
08749 if (index >= 0 && index < g->nuser_data) {
08750 return cgi_add_posit((void *)&g->user_data[index],
08751 label, index + 1, g->user_data[index].id);
08752 }
08753 }
08754 else
08755 return CG_INCORRECT_PATH;
08756 }
08757
08758
08759
08760 else if (0 == strcmp (posit->label, "Axisymmetry_t")) {
08761 cgns_axisym *a = (cgns_axisym *)posit->posit;
08762 if (0 == strcmp (label, "DataArray_t")) {
08763 if (--index < 0) {
08764 for (n = 0; n < a->narrays; n++) {
08765 if (0 == strcmp (a->array[n].name, name)) {
08766 index = n;
08767 break;
08768 }
08769 }
08770 }
08771 if (index >= 0 && index < a->narrays) {
08772 return cgi_add_posit((void *)&a->array[index],
08773 label, index + 1, a->array[index].id);
08774 }
08775 }
08776 else if (0 == strcmp (label, "UserDefinedData_t")) {
08777 if (--index < 0) {
08778 for (n = 0; n < a->nuser_data; n++) {
08779 if (0 == strcmp (a->user_data[n].name, name)) {
08780 index = n;
08781 break;
08782 }
08783 }
08784 }
08785 if (index >= 0 && index < a->nuser_data) {
08786 return cgi_add_posit((void *)&a->user_data[index],
08787 label, index + 1, a->user_data[index].id);
08788 }
08789 }
08790 else
08791 return CG_INCORRECT_PATH;
08792 }
08793
08794
08795
08796 else if (0 == strcmp (posit->label, "RotatingCoordinates_t")) {
08797 cgns_rotating *r = (cgns_rotating *)posit->posit;
08798 if (0 == strcmp (label, "DataArray_t")) {
08799 if (--index < 0) {
08800 for (n = 0; n < r->narrays; n++) {
08801 if (0 == strcmp (r->array[n].name, name)) {
08802 index = n;
08803 break;
08804 }
08805 }
08806 }
08807 if (index >= 0 && index < r->narrays) {
08808 return cgi_add_posit((void *)&r->array[index],
08809 label, index + 1, r->array[index].id);
08810 }
08811 }
08812 else if (0 == strcmp (label, "UserDefinedData_t")) {
08813 if (--index < 0) {
08814 for (n = 0; n < r->nuser_data; n++) {
08815 if (0 == strcmp (r->user_data[n].name, name)) {
08816 index = n;
08817 break;
08818 }
08819 }
08820 }
08821 if (index >= 0 && index < r->nuser_data) {
08822 return cgi_add_posit((void *)&r->user_data[index],
08823 label, index + 1, r->user_data[index].id);
08824 }
08825 }
08826 else
08827 return CG_INCORRECT_PATH;
08828 }
08829
08830
08831
08832 else if (0 == strcmp (posit->label, "BCProperty_t")) {
08833 cgns_bprop *b = (cgns_bprop *)posit->posit;
08834 if (0 == strcmp (label, "WallFunction_t")) {
08835 if (b->bcwall &&
08836 (index == 1 || 0 == strcmp (b->bcwall->name, name))) {
08837 return cgi_add_posit((void *)b->bcwall,
08838 label, 1, b->bcwall->id);
08839 }
08840 }
08841 else if (0 == strcmp (label, "Area_t")) {
08842 if (b->bcarea &&
08843 (index == 1 || 0 == strcmp (b->bcarea->name, name))) {
08844 return cgi_add_posit((void *)b->bcarea,
08845 label, 1, b->bcarea->id);
08846 }
08847 }
08848 else if (0 == strcmp (label, "UserDefinedData_t")) {
08849 if (--index < 0) {
08850 for (n = 0; n < b->nuser_data; n++) {
08851 if (0 == strcmp (b->user_data[n].name, name)) {
08852 index = n;
08853 break;
08854 }
08855 }
08856 }
08857 if (index >= 0 && index < b->nuser_data) {
08858 return cgi_add_posit((void *)&b->user_data[index],
08859 label, index + 1, b->user_data[index].id);
08860 }
08861 }
08862 else
08863 return CG_INCORRECT_PATH;
08864 }
08865
08866
08867
08868 else if (0 == strcmp (posit->label, "WallFunction_t")) {
08869 cgns_bcwall *w = (cgns_bcwall *)posit->posit;
08870 if (0 == strcmp (label, "UserDefinedData_t")) {
08871 if (--index < 0) {
08872 for (n = 0; n < w->nuser_data; n++) {
08873 if (0 == strcmp (w->user_data[n].name, name)) {
08874 index = n;
08875 break;
08876 }
08877 }
08878 }
08879 if (index >= 0 && index < w->nuser_data) {
08880 return cgi_add_posit((void *)&w->user_data[index],
08881 label, index + 1, w->user_data[index].id);
08882 }
08883 }
08884 else
08885 return CG_INCORRECT_PATH;
08886 }
08887
08888
08889
08890 else if (0 == strcmp (posit->label, "Area_t")) {
08891 cgns_bcarea *a = (cgns_bcarea *)posit->posit;
08892 if (0 == strcmp (label, "DataArray_t")) {
08893 if (--index < 0) {
08894 for (n = 0; n < a->narrays; n++) {
08895 if (0 == strcmp (a->array[n].name, name)) {
08896 index = n;
08897 break;
08898 }
08899 }
08900 }
08901 if (index >= 0 && index < a->narrays) {
08902 return cgi_add_posit((void *)&a->array[index],
08903 label, index + 1, a->array[index].id);
08904 }
08905 }
08906 else if (0 == strcmp (label, "UserDefinedData_t")) {
08907 if (--index < 0) {
08908 for (n = 0; n < a->nuser_data; n++) {
08909 if (0 == strcmp (a->user_data[n].name, name)) {
08910 index = n;
08911 break;
08912 }
08913 }
08914 }
08915 if (index >= 0 && index < a->nuser_data) {
08916 return cgi_add_posit((void *)&a->user_data[index],
08917 label, index + 1, a->user_data[index].id);
08918 }
08919 }
08920 else
08921 return CG_INCORRECT_PATH;
08922 }
08923
08924
08925
08926 else if (0 == strcmp (posit->label, "GridConnectivityProperty_t")) {
08927 cgns_cprop *c = (cgns_cprop *)posit->posit;
08928 if (0 == strcmp (label, "Periodic_t")) {
08929 if (c->cperio &&
08930 (index == 1 || 0 == strcmp (c->cperio->name, name))) {
08931 return cgi_add_posit((void *)c->cperio,
08932 label, 1, c->cperio->id);
08933 }
08934 }
08935 else if (0 == strcmp (label, "AverageInterface_t")) {
08936 if (c->caverage &&
08937 (index == 1 || 0 == strcmp (c->caverage->name, name))) {
08938 return cgi_add_posit((void *)c->caverage,
08939 label, 1, c->caverage->id);
08940 }
08941 }
08942 else if (0 == strcmp (label, "UserDefinedData_t")) {
08943 if (--index < 0) {
08944 for (n = 0; n < c->nuser_data; n++) {
08945 if (0 == strcmp (c->user_data[n].name, name)) {
08946 index = n;
08947 break;
08948 }
08949 }
08950 }
08951 if (index >= 0 && index < c->nuser_data) {
08952 return cgi_add_posit((void *)&c->user_data[index],
08953 label, index + 1, c->user_data[index].id);
08954 }
08955 }
08956 else
08957 return CG_INCORRECT_PATH;
08958 }
08959
08960
08961
08962 else if (0 == strcmp (posit->label, "Periodic_t")) {
08963 cgns_cperio *p = (cgns_cperio *)posit->posit;
08964 if (0 == strcmp (label, "DataArray_t")) {
08965 if (--index < 0) {
08966 for (n = 0; n < p->narrays; n++) {
08967 if (0 == strcmp (p->array[n].name, name)) {
08968 index = n;
08969 break;
08970 }
08971 }
08972 }
08973 if (index >= 0 && index < p->narrays) {
08974 return cgi_add_posit((void *)&p->array[index],
08975 label, index + 1, p->array[index].id);
08976 }
08977 }
08978 else if (0 == strcmp (label, "UserDefinedData_t")) {
08979 if (--index < 0) {
08980 for (n = 0; n < p->nuser_data; n++) {
08981 if (0 == strcmp (p->user_data[n].name, name)) {
08982 index = n;
08983 break;
08984 }
08985 }
08986 }
08987 if (index >= 0 && index < p->nuser_data) {
08988 return cgi_add_posit((void *)&p->user_data[index],
08989 label, index + 1, p->user_data[index].id);
08990 }
08991 }
08992 else
08993 return CG_INCORRECT_PATH;
08994 }
08995
08996
08997
08998 else if (0 == strcmp (posit->label, "AverageInterface_t")) {
08999 cgns_caverage *a = (cgns_caverage *)posit->posit;
09000 if (0 == strcmp (label, "UserDefinedData_t")) {
09001 if (--index < 0) {
09002 for (n = 0; n < a->nuser_data; n++) {
09003 if (0 == strcmp (a->user_data[n].name, name)) {
09004 index = n;
09005 break;
09006 }
09007 }
09008 }
09009 if (index >= 0 && index < a->nuser_data) {
09010 return cgi_add_posit((void *)&a->user_data[index],
09011 label, index + 1, a->user_data[index].id);
09012 }
09013 }
09014 else
09015 return CG_INCORRECT_PATH;
09016 }
09017
09018
09019
09020 else
09021 return CG_INCORRECT_PATH;
09022
09023 return CG_NODE_NOT_FOUND;
09024 }
09025
09026 int cgi_update_posit(int cnt, int *index, char **label)
09027 {
09028 int n, ierr;
09029 double pid, id;
09030 char lab[33], name[33];
09031
09032 if (posit == 0) {
09033 cgi_error("goto position not set");
09034 return CG_ERROR;
09035 }
09036
09037 for (n = 0; n < cnt; n++) {
09038 if (index[n] > 0) {
09039 strcpy(lab, label[n]);
09040 *name = 0;
09041 }
09042 else if (0 == strcmp(label[n], ".")) {
09043 continue;
09044 }
09045 else if (0 == strcmp(label[n], "..")) {
09046 if (posit_depth == 1) {
09047 cgi_error("can't go up beyond CGNSBase_t node");
09048 posit = 0;
09049 return CG_ERROR;
09050 }
09051 if (0 == strcmp(posit->label, "Zone_t")) posit_zone = 0;
09052 posit_depth--;
09053 posit = &posit_stack[posit_depth-1];
09054 continue;
09055 }
09056 else {
09057 if (cgi_posit_id (&pid)) {
09058 posit = 0;
09059 return CG_ERROR;
09060 }
09061 strcpy(name, label[n]);
09062 if (cgio_get_node_id(cg->cgio, pid, name, &id)) {
09063 posit = 0;
09064 cgi_error ("goto path not found");
09065 return CG_NODE_NOT_FOUND;
09066 }
09067 if (cgio_get_label(cg->cgio, id, lab)) {
09068 posit = 0;
09069 cg_io_error("cgio_get_label");
09070 return CG_ERROR;
09071 }
09072 }
09073 ierr = cgi_next_posit(lab, index[n], name);
09074 if (ierr) {
09075 if (ierr == CG_INCORRECT_PATH) {
09076 cgi_error("can't go to label '%s' under '%s'",
09077 lab, posit->label);
09078 }
09079 if (ierr == CG_NODE_NOT_FOUND) {
09080 if (index[n] > 0)
09081 cgi_error("index %d, label '%s' not a child of '%s'",
09082 index[n], lab, posit->label);
09083 else
09084 cgi_error("node '%s' not a child of '%s'",
09085 name, posit->label);
09086 }
09087 posit = 0;
09088 return ierr;
09089 }
09090 }
09091
09092 return CG_OK;
09093 }
09094
09095 int cgi_set_posit(int fn, int B, int n, int *index, char **label)
09096 {
09097 cgns_base *base;
09098
09099
09100 posit = 0;
09101 posit_file = posit_base = posit_zone = posit_depth = 0;
09102
09103
09104 cg = cgi_get_file(fn);
09105 if (cg == 0) return 0;
09106
09107 base = cgi_get_base(cg, B);
09108 if (base == 0) return CG_NODE_NOT_FOUND;
09109
09110 posit_file = fn;
09111 posit_base = B;
09112 cgi_add_posit((void *)base, "CGNSBase_t", B, base->id);
09113
09114 return cgi_update_posit(n, index, label);
09115 }
09116
09117 int cgi_posit_id(double *posit_id) {
09118
09119 if (posit == 0) {
09120 cgi_error("No current position set by cg_goto\n");
09121 return 1;
09122 }
09123 *posit_id = posit->id;
09124 return 0;
09125 }
09126
09127 cgns_posit *cgi_get_posit() {
09128
09129 if (posit == 0) {
09130 cgi_error("No current position set by cg_goto\n");
09131 return NULL;
09132 }
09133 return posit;
09134 }
09135
09136
09137
09138
09139
09140 cgns_descr *cgi_descr_address(int local_mode, int given_no, char const *given_name, int *ier) {
09141 cgns_descr *descr=0;
09142 int n, error1=0, error2=0;
09143 double parent_id=0;
09144
09145
09146 if (posit == 0) {
09147 cgi_error("No current position set by cg_goto\n");
09148 (*ier) = CG_ERROR;
09149 return 0;
09150 }
09151
09152
09153
09154
09155
09156
09157
09158
09159
09160
09161
09162
09163
09164
09165
09166
09167
09168 if (strcmp(posit->label,"CGNSBase_t")==0)
09169 ADDRESS4MULTIPLE(cgns_base, ndescr, descr, cgns_descr)
09170 else if (strcmp(posit->label,"Zone_t")==0)
09171 ADDRESS4MULTIPLE(cgns_zone, ndescr, descr, cgns_descr)
09172 else if (strcmp(posit->label,"GridCoordinates_t")==0)
09173 ADDRESS4MULTIPLE(cgns_zcoor, ndescr, descr, cgns_descr)
09174 else if (strcmp(posit->label,"Elements_t")==0)
09175 ADDRESS4MULTIPLE(cgns_section, ndescr, descr, cgns_descr)
09176 else if (strcmp(posit->label,"FlowSolution_t")==0)
09177 ADDRESS4MULTIPLE(cgns_sol, ndescr, descr, cgns_descr)
09178 else if (strcmp(posit->label,"DiscreteData_t")==0)
09179 ADDRESS4MULTIPLE(cgns_discrete, ndescr, descr, cgns_descr)
09180 else if (strcmp(posit->label,"ZoneGridConnectivity_t")==0)
09181 ADDRESS4MULTIPLE(cgns_zconn, ndescr, descr, cgns_descr)
09182 else if (strcmp(posit->label,"GridConnectivity1to1_t")==0)
09183 ADDRESS4MULTIPLE(cgns_1to1, ndescr, descr, cgns_descr)
09184 else if (strcmp(posit->label,"GridConnectivity_t")==0)
09185 ADDRESS4MULTIPLE(cgns_conn, ndescr, descr, cgns_descr)
09186 else if (strcmp(posit->label,"OversetHoles_t")==0)
09187 ADDRESS4MULTIPLE(cgns_hole, ndescr, descr, cgns_descr)
09188 else if (strcmp(posit->label,"ZoneBC_t")==0)
09189 ADDRESS4MULTIPLE(cgns_zboco, ndescr, descr, cgns_descr)
09190 else if (strcmp(posit->label,"BC_t")==0)
09191 ADDRESS4MULTIPLE(cgns_boco, ndescr, descr, cgns_descr)
09192 else if (strcmp(posit->label,"BCDataSet_t")==0)
09193 ADDRESS4MULTIPLE(cgns_dataset, ndescr, descr, cgns_descr)
09194 else if (strcmp(posit->label,"BCData_t")==0)
09195 ADDRESS4MULTIPLE(cgns_bcdata, ndescr, descr, cgns_descr)
09196 else if (strcmp(posit->label,"FlowEquationSet_t")==0)
09197 ADDRESS4MULTIPLE(cgns_equations, ndescr, descr, cgns_descr)
09198 else if (strcmp(posit->label,"GoverningEquations_t")==0)
09199 ADDRESS4MULTIPLE(cgns_governing, ndescr, descr, cgns_descr)
09200 else if (strcmp(posit->label,"GasModel_t")==0 ||
09201 strcmp(posit->label,"ViscosityModel_t")==0 ||
09202 strcmp(posit->label,"ThermalConductivityModel_t")==0 ||
09203 strcmp(posit->label,"TurbulenceModel_t")==0 ||
09204 strcmp(posit->label,"TurbulenceClosure_t")==0 ||
09205 strcmp(posit->label,"ThermalRelaxationModel_t")==0 ||
09206 strcmp(posit->label,"ChemicalKineticsModel_t")==0 ||
09207 strcmp(posit->label,"EMElectricFieldModel_t")==0 ||
09208 strcmp(posit->label,"EMMagneticFieldModel_t")==0 ||
09209 strcmp(posit->label,"EMConductivityModel_t")==0)
09210 ADDRESS4MULTIPLE(cgns_model, ndescr, descr, cgns_descr)
09211 else if (strcmp(posit->label,"ConvergenceHistory_t")==0)
09212 ADDRESS4MULTIPLE(cgns_converg, ndescr, descr, cgns_descr)
09213 else if (strcmp(posit->label,"IntegralData_t")==0)
09214 ADDRESS4MULTIPLE(cgns_integral, ndescr, descr, cgns_descr)
09215 else if (strcmp(posit->label,"ReferenceState_t")==0)
09216 ADDRESS4MULTIPLE(cgns_state, ndescr, descr, cgns_descr)
09217 else if (strcmp(posit->label,"DataArray_t")==0)
09218 ADDRESS4MULTIPLE(cgns_array, ndescr, descr, cgns_descr)
09219 else if (strcmp(posit->label,"Family_t")==0)
09220 ADDRESS4MULTIPLE(cgns_family, ndescr, descr, cgns_descr)
09221 else if (strcmp(posit->label,"GeometryReference_t")==0)
09222 ADDRESS4MULTIPLE(cgns_geo, ndescr, descr, cgns_descr)
09223 else if (strcmp(posit->label,"RigidGridMotion_t")==0)
09224 ADDRESS4MULTIPLE(cgns_rmotion, ndescr, descr, cgns_descr)
09225 else if (strcmp(posit->label,"ArbitraryGridMotion_t")==0)
09226 ADDRESS4MULTIPLE(cgns_amotion, ndescr, descr, cgns_descr)
09227 else if (strcmp(posit->label,"BaseIterativeData_t")==0)
09228 ADDRESS4MULTIPLE(cgns_biter, ndescr, descr, cgns_descr)
09229 else if (strcmp(posit->label,"ZoneIterativeData_t")==0)
09230 ADDRESS4MULTIPLE(cgns_ziter, ndescr, descr, cgns_descr)
09231 else if (strcmp(posit->label,"UserDefinedData_t")==0)
09232 ADDRESS4MULTIPLE(cgns_user_data, ndescr, descr, cgns_descr)
09233 else if (strcmp(posit->label,"Gravity_t")==0)
09234 ADDRESS4MULTIPLE(cgns_gravity, ndescr, descr, cgns_descr)
09235 else if (strcmp(posit->label,"Axisymmetry_t")==0)
09236 ADDRESS4MULTIPLE(cgns_axisym, ndescr, descr, cgns_descr)
09237 else if (strcmp(posit->label,"RotatingCoordinates_t")==0)
09238 ADDRESS4MULTIPLE(cgns_rotating, ndescr, descr, cgns_descr)
09239 else if (strcmp(posit->label,"BCProperty_t")==0)
09240 ADDRESS4MULTIPLE(cgns_bprop, ndescr, descr, cgns_descr)
09241 else if (strcmp(posit->label,"WallFunction_t")==0)
09242 ADDRESS4MULTIPLE(cgns_bcwall, ndescr, descr, cgns_descr)
09243 else if (strcmp(posit->label,"Area_t")==0)
09244 ADDRESS4MULTIPLE(cgns_bcarea, ndescr, descr, cgns_descr)
09245 else if (strcmp(posit->label,"GridConnectivityProperty_t")==0)
09246 ADDRESS4MULTIPLE(cgns_cprop, ndescr, descr, cgns_descr)
09247 else if (strcmp(posit->label,"Periodic_t")==0)
09248 ADDRESS4MULTIPLE(cgns_cperio, ndescr, descr, cgns_descr)
09249 else if (strcmp(posit->label,"AverageInterface_t")==0)
09250 ADDRESS4MULTIPLE(cgns_caverage, ndescr, descr, cgns_descr)
09251 else {
09252 cgi_error("Descriptor_t node not supported under '%s' type node (cgi_descr_address)",
09253 posit->label);
09254 (*ier) = CG_INCORRECT_PATH;
09255 return 0;
09256 }
09257
09258 if (error1) {
09259 cgi_error("Duplicate child name found (%s) found under %s",
09260 given_name, posit->label);
09261 (*ier) = CG_ERROR;
09262 return 0;
09263 }
09264 if (error2) {
09265 cgi_error("Descriptor number %d doesn't exist under %s",
09266 given_no, posit->label);
09267 (*ier) = CG_NODE_NOT_FOUND;
09268 return 0;
09269 }
09270 if (parent_id) {
09271 if (cgi_delete_node (parent_id, descr->id)) {
09272 (*ier) = CG_ERROR;
09273 return 0;
09274 }
09275 cgi_free_descr(descr);
09276 }
09277 return descr;
09278 }
09279
09280 char *cgi_famname_address(int local_mode, int *ier) {
09281 double *id, parent_id;
09282 char *family_name=0;
09283 int nnod;
09284
09285
09286 if (posit == 0) {
09287 cgi_error("No current position set by cg_goto\n");
09288 (*ier) = CG_ERROR;
09289 return 0;
09290 }
09291
09292
09293
09294
09295 if (strcmp(posit->label,"Zone_t")==0) {
09296 cgns_zone *zone = (cgns_zone *)posit->posit;
09297 family_name = zone->family_name;
09298 parent_id = zone->id;
09299 } else if (strcmp(posit->label,"BC_t")==0) {
09300 cgns_boco *boco = (cgns_boco *)posit->posit;
09301 family_name = boco->family_name;
09302 parent_id = boco->id;
09303 } else if (strcmp(posit->label,"UserDefinedData_t")==0) {
09304 cgns_user_data *user_data = (cgns_user_data *)posit->posit;
09305 family_name = user_data->family_name;
09306 parent_id = user_data->id;
09307 } else {
09308 cgi_error("FamilyName_t node not supported under '%s' type node",posit->label);
09309 (*ier) = CG_INCORRECT_PATH;
09310 return 0;
09311 }
09312 if (cg->mode == CG_MODE_MODIFY && local_mode == CG_MODE_WRITE) {
09313 if (cgi_get_nodes(parent_id, "FamilyName_t", &nnod, &id)) {
09314 *ier = CG_ERROR;
09315 return 0;
09316 }
09317 if (nnod>0) {
09318 if (cgi_delete_node (parent_id, id[0])) {
09319 (*ier) = CG_ERROR;
09320 return 0;
09321 }
09322 free(id);
09323 }
09324 }
09325 return family_name;
09326 }
09327
09328
09329 DataClass_t *cgi_dataclass_address(int local_mode, int *ier) {
09330 double *id, parent_id;
09331 DataClass_t *data_class=0;
09332 int nnod;
09333
09334
09335 if (posit == 0) {
09336 cgi_error("No current position set by cg_goto\n");
09337 (*ier) = CG_ERROR;
09338 return 0;
09339 }
09340
09341
09342
09343
09344
09345
09346
09347
09348
09349
09350
09351
09352 if (strcmp(posit->label,"CGNSBase_t")==0)
09353 ADDRESS4SINGLE_ALLOC(cgns_base, data_class)
09354 else if (strcmp(posit->label,"Zone_t")==0)
09355 ADDRESS4SINGLE_ALLOC(cgns_zone, data_class)
09356 else if (strcmp(posit->label,"GridCoordinates_t")==0)
09357 ADDRESS4SINGLE_ALLOC(cgns_zcoor, data_class)
09358 else if (strcmp(posit->label,"FlowSolution_t")==0)
09359 ADDRESS4SINGLE_ALLOC(cgns_sol, data_class)
09360 else if (strcmp(posit->label,"DiscreteData_t")==0)
09361 ADDRESS4SINGLE_ALLOC(cgns_discrete, data_class)
09362 else if (strcmp(posit->label,"ZoneBC_t")==0)
09363 ADDRESS4SINGLE_ALLOC(cgns_zboco, data_class)
09364 else if (strcmp(posit->label,"BC_t")==0)
09365 ADDRESS4SINGLE_ALLOC(cgns_boco, data_class)
09366 else if (strcmp(posit->label,"BCDataSet_t")==0)
09367 ADDRESS4SINGLE_ALLOC(cgns_dataset, data_class)
09368 else if (strcmp(posit->label,"BCData_t")==0)
09369 ADDRESS4SINGLE_ALLOC(cgns_bcdata, data_class)
09370 else if (strcmp(posit->label,"FlowEquationSet_t")==0)
09371 ADDRESS4SINGLE_ALLOC(cgns_equations, data_class)
09372 else if (strcmp(posit->label,"GasModel_t")==0 ||
09373 strcmp(posit->label,"ViscosityModel_t")==0 ||
09374 strcmp(posit->label,"ThermalConductivityModel_t")==0 ||
09375 strcmp(posit->label,"TurbulenceModel_t")==0 ||
09376 strcmp(posit->label,"TurbulenceClosure_t")==0 ||
09377 strcmp(posit->label,"ThermalRelaxationModel_t")==0 ||
09378 strcmp(posit->label,"ChemicalKineticsModel_t")==0 ||
09379 strcmp(posit->label,"EMElectricFieldModel_t")==0 ||
09380 strcmp(posit->label,"EMMagneticFieldModel_t")==0 ||
09381 strcmp(posit->label,"EMConductivityModel_t")==0)
09382 ADDRESS4SINGLE_ALLOC(cgns_model, data_class)
09383 else if (strcmp(posit->label,"ConvergenceHistory_t")==0)
09384 ADDRESS4SINGLE_ALLOC(cgns_converg, data_class)
09385 else if (strcmp(posit->label,"IntegralData_t")==0)
09386 ADDRESS4SINGLE_ALLOC(cgns_integral, data_class)
09387 else if (strcmp(posit->label,"ReferenceState_t")==0)
09388 ADDRESS4SINGLE_ALLOC(cgns_state, data_class)
09389 else if (strcmp(posit->label,"DataArray_t")==0)
09390 ADDRESS4SINGLE_ALLOC(cgns_array, data_class)
09391 else if (strcmp(posit->label,"RigidGridMotion_t")==0)
09392 ADDRESS4SINGLE_ALLOC(cgns_rmotion, data_class)
09393 else if (strcmp(posit->label,"ArbitraryGridMotion_t")==0)
09394 ADDRESS4SINGLE_ALLOC(cgns_amotion, data_class)
09395 else if (strcmp(posit->label,"BaseIterativeData_t")==0)
09396 ADDRESS4SINGLE_ALLOC(cgns_biter, data_class)
09397 else if (strcmp(posit->label,"ZoneIterativeData_t")==0)
09398 ADDRESS4SINGLE_ALLOC(cgns_ziter, data_class)
09399 else if (strcmp(posit->label,"UserDefinedData_t")==0)
09400 ADDRESS4SINGLE_ALLOC(cgns_user_data, data_class)
09401 else if (strcmp(posit->label,"Gravity_t")==0)
09402 ADDRESS4SINGLE_ALLOC(cgns_gravity, data_class)
09403 else if (strcmp(posit->label,"Axisymmetry_t")==0)
09404 ADDRESS4SINGLE_ALLOC(cgns_axisym, data_class)
09405 else if (strcmp(posit->label,"RotatingCoordinates_t")==0)
09406 ADDRESS4SINGLE_ALLOC(cgns_rotating, data_class)
09407 else if (strcmp(posit->label,"Periodic_t")==0)
09408 ADDRESS4SINGLE_ALLOC(cgns_cperio, data_class)
09409 else {
09410 cgi_error("DataClass_t node not supported under '%s' type node",posit->label);
09411 (*ier) = CG_INCORRECT_PATH;
09412 return 0;
09413 }
09414 if (cg->mode == CG_MODE_MODIFY && local_mode == CG_MODE_WRITE) {
09415 if (cgi_get_nodes(parent_id, "DataClass_t", &nnod, &id)) return 0;
09416 if (nnod>0) {
09417 if (cgi_delete_node (parent_id, id[0])) {
09418 (*ier) = CG_ERROR;
09419 return 0;
09420 }
09421 free(id);
09422 }
09423 }
09424 return data_class;
09425 }
09426
09427 cgns_units *cgi_units_address(int local_mode, int *ier) {
09428 cgns_units *units=0;
09429 double parent_id=0;
09430 int error1=0;
09431
09432
09433 if (posit == 0) {
09434 cgi_error("No current position set by cg_goto\n");
09435 (*ier) = CG_ERROR;
09436 return 0;
09437 }
09438
09439
09440
09441
09442
09443
09444
09445
09446
09447
09448
09449
09450 if (strcmp(posit->label,"CGNSBase_t")==0)
09451 ADDRESS4SINGLE(cgns_base, units, cgns_units, 1)
09452 else if (strcmp(posit->label,"Zone_t")==0)
09453 ADDRESS4SINGLE(cgns_zone, units, cgns_units, 1)
09454 else if (strcmp(posit->label,"GridCoordinates_t")==0)
09455 ADDRESS4SINGLE(cgns_zcoor, units, cgns_units, 1)
09456 else if (strcmp(posit->label,"FlowSolution_t")==0)
09457 ADDRESS4SINGLE(cgns_sol, units, cgns_units, 1)
09458 else if (strcmp(posit->label,"DiscreteData_t")==0)
09459 ADDRESS4SINGLE(cgns_discrete, units, cgns_units, 1)
09460 else if (strcmp(posit->label,"ZoneBC_t")==0)
09461 ADDRESS4SINGLE(cgns_zboco, units, cgns_units, 1)
09462 else if (strcmp(posit->label,"BC_t")==0)
09463 ADDRESS4SINGLE(cgns_boco, units, cgns_units, 1)
09464 else if (strcmp(posit->label,"BCDataSet_t")==0)
09465 ADDRESS4SINGLE(cgns_dataset, units, cgns_units, 1)
09466 else if (strcmp(posit->label,"BCData_t")==0)
09467 ADDRESS4SINGLE(cgns_bcdata, units, cgns_units, 1)
09468 else if (strcmp(posit->label,"FlowEquationSet_t")==0)
09469 ADDRESS4SINGLE(cgns_equations, units, cgns_units, 1)
09470 else if (strcmp(posit->label,"GasModel_t")==0 ||
09471 strcmp(posit->label,"ViscosityModel_t")==0 ||
09472 strcmp(posit->label,"ThermalConductivityModel_t")==0 ||
09473 strcmp(posit->label,"TurbulenceModel_t")==0 ||
09474 strcmp(posit->label,"TurbulenceClosure_t")==0 ||
09475 strcmp(posit->label,"ThermalRelaxationModel_t")==0 ||
09476 strcmp(posit->label,"ChemicalKineticsModel_t")==0 ||
09477 strcmp(posit->label,"EMElectricFieldModel_t")==0 ||
09478 strcmp(posit->label,"EMMagneticFieldModel_t")==0 ||
09479 strcmp(posit->label,"EMConductivityModel_t")==0)
09480 ADDRESS4SINGLE(cgns_model, units, cgns_units, 1)
09481 else if (strcmp(posit->label,"ConvergenceHistory_t")==0)
09482 ADDRESS4SINGLE(cgns_converg, units, cgns_units, 1)
09483 else if (strcmp(posit->label,"IntegralData_t")==0)
09484 ADDRESS4SINGLE(cgns_integral, units, cgns_units, 1)
09485 else if (strcmp(posit->label,"ReferenceState_t")==0)
09486 ADDRESS4SINGLE(cgns_state, units, cgns_units, 1)
09487 else if (strcmp(posit->label,"DataArray_t")==0)
09488 ADDRESS4SINGLE(cgns_array, units, cgns_units, 1)
09489 else if (strcmp(posit->label,"RigidGridMotion_t")==0)
09490 ADDRESS4SINGLE(cgns_rmotion, units, cgns_units, 1)
09491 else if (strcmp(posit->label,"ArbitraryGridMotion_t")==0)
09492 ADDRESS4SINGLE(cgns_amotion, units, cgns_units, 1)
09493 else if (strcmp(posit->label,"BaseIterativeData_t")==0)
09494 ADDRESS4SINGLE(cgns_biter, units, cgns_units, 1)
09495 else if (strcmp(posit->label,"ZoneIterativeData_t")==0)
09496 ADDRESS4SINGLE(cgns_ziter, units, cgns_units, 1)
09497 else if (strcmp(posit->label,"UserDefinedData_t")==0)
09498 ADDRESS4SINGLE(cgns_user_data, units, cgns_units, 1)
09499 else if (strcmp(posit->label,"Gravity_t")==0)
09500 ADDRESS4SINGLE(cgns_gravity, units, cgns_units, 1)
09501 else if (strcmp(posit->label,"Axisymmetry_t")==0)
09502 ADDRESS4SINGLE(cgns_axisym, units, cgns_units, 1)
09503 else if (strcmp(posit->label,"RotatingCoordinates_t")==0)
09504 ADDRESS4SINGLE(cgns_rotating, units, cgns_units, 1)
09505 else if (strcmp(posit->label,"Periodic_t")==0)
09506 ADDRESS4SINGLE(cgns_cperio, units, cgns_units, 1)
09507
09508 else {
09509 cgi_error("DimensionalUnits_t node not supported under '%s' type node",posit->label);
09510 (*ier) = CG_INCORRECT_PATH;
09511 return 0;
09512 }
09513 if (error1==1) {
09514 cgi_error("DimensionalUnits_t already defined under %s",posit->label);
09515 (*ier) = CG_ERROR;
09516 return 0;
09517 }
09518 if (!units && local_mode == CG_MODE_READ) {
09519 cgi_error("DimensionalUnits_t Node doesn't exist under %s",posit->label);
09520 (*ier) = CG_NODE_NOT_FOUND;
09521 return 0;
09522 }
09523 if (parent_id) {
09524 if (cgi_delete_node (parent_id, units->id)) {
09525 (*ier) = CG_ERROR;
09526 return 0;
09527 }
09528 cgi_free_units(units);
09529 }
09530 return units;
09531 }
09532
09533 int *cgi_ordinal_address(int local_mode, int *ier) {
09534 double *id;
09535 int nnod;
09536 int *ordinal;
09537 double parent_id;
09538
09539
09540 if (posit == 0) {
09541 cgi_error("No current position set by cg_goto\n");
09542 (*ier) = CG_ERROR;
09543 return 0;
09544 }
09545
09546
09547
09548
09549
09550 if (strcmp(posit->label,"Zone_t")==0)
09551 ADDRESS4SINGLE_ALLOC(cgns_zone, ordinal)
09552
09553 else if (strcmp(posit->label,"GridConnectivity1to1_t")==0)
09554 ADDRESS4SINGLE_ALLOC(cgns_1to1, ordinal)
09555
09556 else if (strcmp(posit->label,"GridConnectivity_t")==0)
09557 ADDRESS4SINGLE_ALLOC(cgns_conn, ordinal)
09558
09559 else if (strcmp(posit->label,"BC_t")==0)
09560 ADDRESS4SINGLE_ALLOC(cgns_boco, ordinal)
09561
09562 else if (strcmp(posit->label,"Family_t")==0)
09563 ADDRESS4SINGLE_ALLOC(cgns_family, ordinal)
09564 else if (strcmp(posit->label,"UserDefinedData_t")==0)
09565 ADDRESS4SINGLE_ALLOC(cgns_user_data, ordinal)
09566 else {
09567 cgi_error("Ordinal_t node not supported under '%s' type node",posit->label);
09568 (*ier) = CG_INCORRECT_PATH;
09569 return 0;
09570 }
09571 if (cg->mode == CG_MODE_MODIFY && local_mode == CG_MODE_WRITE) {
09572 if (cgi_get_nodes(parent_id, "Ordinal_t", &nnod, &id)) return 0;
09573 if (nnod>0) {
09574 if (cgi_delete_node (parent_id, id[0])) {
09575 (*ier) = CG_ERROR;
09576 return 0;
09577 }
09578 free(id);
09579 }
09580 }
09581
09582 return ordinal;
09583 }
09584
09585 int *cgi_rind_address(int local_mode, int *ier) {
09586 int *rind_planes=0, nnod;
09587 double parent_id=0, *id;
09588 int error1=0, index_dim;
09589
09590
09591 if (posit == 0) {
09592 cgi_error("No current position set by cg_goto\n");
09593 (*ier) = CG_ERROR;
09594 return 0;
09595 }
09596
09597 if (posit_base && posit_zone) {
09598 index_dim = cg->base[posit_base-1].zone[posit_zone-1].index_dim;
09599 } else {
09600 cgi_error("Can't find IndexDimension in cgi_rind_address");
09601 (*ier) = CG_ERROR;
09602 return 0;
09603 }
09604
09605
09606
09607
09608 if (strcmp(posit->label,"GridCoordinates_t")==0)
09609 ADDRESS4SINGLE(cgns_zcoor, rind_planes, int, 2*index_dim)
09610 else if (strcmp(posit->label,"FlowSolution_t")==0)
09611 ADDRESS4SINGLE(cgns_sol, rind_planes, int, 2*index_dim)
09612 else if (strcmp(posit->label,"DiscreteData_t")==0)
09613 ADDRESS4SINGLE(cgns_discrete, rind_planes, int, 2*index_dim)
09614 else if (strcmp(posit->label,"ArbitraryGridMotion_t")==0)
09615 ADDRESS4SINGLE(cgns_amotion, rind_planes, int, 2*index_dim)
09616 else if (strcmp(posit->label,"Elements_t")==0)
09617 ADDRESS4SINGLE(cgns_section, rind_planes, int, 2*index_dim)
09618
09619 else {
09620 cgi_error("Rind_t node not supported under '%s' type node",posit->label);
09621 (*ier) = CG_INCORRECT_PATH;
09622 return 0;
09623 }
09624
09625
09626
09627
09628
09629
09630
09631
09632 if (!rind_planes && local_mode == CG_MODE_READ) {
09633 cgi_error("Rind_t node doesn't exist under %s",posit->label);
09634 (*ier) = CG_NODE_NOT_FOUND;
09635 return 0;
09636 }
09637 if (parent_id && cg->mode==CG_MODE_MODIFY) {
09638 if (cgi_get_nodes(parent_id, "Rind_t", &nnod, &id)) return 0;
09639 if (nnod>0) {
09640 if (cgi_delete_node (parent_id, id[0])) {
09641 (*ier) = CG_ERROR;
09642 return 0;
09643 }
09644 free(id);
09645 }
09646 }
09647 return rind_planes;
09648 }
09649
09650 GridLocation_t *cgi_location_address(int local_mode, int *ier) {
09651 double *id, parent_id;
09652 GridLocation_t *location=0;
09653 int nnod;
09654
09655
09656 if (posit == 0) {
09657 cgi_error("No current position set by cg_goto\n");
09658 (*ier) = CG_ERROR;
09659 return 0;
09660 }
09661
09662
09663
09664
09665
09666 if (strcmp(posit->label,"FlowSolution_t")==0)
09667 ADDRESS4SINGLE_ALLOC(cgns_sol, location)
09668 else if (strcmp(posit->label,"DiscreteData_t")==0)
09669 ADDRESS4SINGLE_ALLOC(cgns_discrete, location)
09670 else if (strcmp(posit->label,"GridConnectivity_t")==0)
09671 ADDRESS4SINGLE_ALLOC(cgns_conn, location)
09672 else if (strcmp(posit->label,"OversetHoles_t")==0)
09673 ADDRESS4SINGLE_ALLOC(cgns_hole, location)
09674 else if (strcmp(posit->label,"BC_t")==0)
09675 ADDRESS4SINGLE_ALLOC(cgns_boco, location)
09676 else if (strcmp(posit->label,"ArbitraryGridMotion_t")==0)
09677 ADDRESS4SINGLE_ALLOC(cgns_amotion, location)
09678 else if (strcmp(posit->label,"UserDefinedData_t")==0)
09679 ADDRESS4SINGLE_ALLOC(cgns_user_data, location)
09680 else if (strcmp(posit->label,"BCDataSet_t")==0)
09681 ADDRESS4SINGLE_ALLOC(cgns_dataset, location)
09682 else {
09683 cgi_error("GridLocation_t node not supported under '%s' type node",posit->label);
09684 (*ier) = CG_INCORRECT_PATH;
09685 return 0;
09686 }
09687 if (cg->mode == CG_MODE_MODIFY && local_mode == CG_MODE_WRITE) {
09688 if (cgi_get_nodes(parent_id, "GridLocation_t", &nnod, &id)) return 0;
09689 if (nnod>0) {
09690 if (cgi_delete_node (parent_id, id[0])) {
09691 (*ier) = CG_ERROR;
09692 return 0;
09693 }
09694 free(id);
09695 }
09696 }
09697 return location;
09698 }
09699
09700 cgns_conversion *cgi_conversion_address(int local_mode, int *ier) {
09701 cgns_conversion *convert=0;
09702 double parent_id=0;
09703 int error1=0;
09704
09705
09706 if (posit == 0) {
09707 cgi_error("No current position set by cg_goto\n");
09708 (*ier) = CG_ERROR;
09709 return 0;
09710 }
09711
09712
09713
09714 if (strcmp(posit->label,"DataArray_t")==0)
09715 ADDRESS4SINGLE(cgns_array,convert, cgns_conversion, 1)
09716
09717 else {
09718 cgi_error("DataConversion_t node not supported under '%s' type node",posit->label);
09719 (*ier) = CG_INCORRECT_PATH;
09720 return 0;
09721 }
09722 if (error1==1) {
09723 cgi_error("DataConversion_t already defined under %s",posit->label);
09724 (*ier) = CG_ERROR;
09725 return 0;
09726 }
09727 if (!convert && local_mode == CG_MODE_READ) {
09728 cgi_error("DataConversion_t node does not exist under %s",posit->label);
09729 (*ier) = CG_NODE_NOT_FOUND;
09730 return 0;
09731 }
09732 if (parent_id) {
09733 if (cgi_delete_node (parent_id, convert->id)) {
09734 (*ier) = CG_ERROR;
09735 return 0;
09736 }
09737 cgi_free_convert(convert);
09738 }
09739 return convert;
09740 }
09741
09742 cgns_exponent *cgi_exponent_address(int local_mode, int *ier) {
09743 cgns_exponent *exponents=0;
09744 double parent_id=0;
09745 int error1=0;
09746
09747
09748 if (posit == 0) {
09749 cgi_error("No current position set by cg_goto\n");
09750 (*ier) = CG_ERROR;
09751 return 0;
09752 }
09753
09754
09755
09756 if (strcmp(posit->label,"DataArray_t")==0)
09757 ADDRESS4SINGLE(cgns_array, exponents, cgns_exponent, 1)
09758
09759 else {
09760 cgi_error("DimensionalExponents_t node not supported under '%s' type node",posit->label);
09761 (*ier) = CG_INCORRECT_PATH;
09762 return 0;
09763 }
09764 if (error1==1) {
09765 cgi_error("DimensionalExponents_t already defined under %s",posit->label);
09766 (*ier) = CG_ERROR;
09767 return 0;
09768 }
09769 if (!exponents && local_mode == CG_MODE_READ) {
09770 cgi_error("DimensionalExponents_t node does not exist under %s",posit->label);
09771 (*ier) = CG_NODE_NOT_FOUND;
09772 return 0;
09773 }
09774 if (parent_id) {
09775 if (cgi_delete_node (parent_id, exponents->id)) {
09776 (*ier) = CG_ERROR;
09777 return 0;
09778 }
09779 cgi_free_exponents(exponents);
09780 }
09781 return exponents;
09782 }
09783
09784 cgns_integral *cgi_integral_address(int local_mode, int given_no,
09785 char const *given_name, int *ier) {
09786 cgns_integral *integral=0;
09787 int n, error1=0, error2=0;
09788 double parent_id=0;
09789
09790
09791 if (posit == 0) {
09792 cgi_error("No current position set by cg_goto\n");
09793 (*ier) = CG_ERROR;
09794 return 0;
09795 }
09796
09797
09798
09799
09800 if (strcmp(posit->label,"CGNSBase_t")==0)
09801 ADDRESS4MULTIPLE(cgns_base, nintegrals, integral, cgns_integral)
09802 else if (strcmp(posit->label,"Zone_t")==0)
09803 ADDRESS4MULTIPLE(cgns_zone, nintegrals, integral, cgns_integral)
09804 else {
09805 cgi_error("IntegralData_t node not supported under '%s' type node",posit->label);
09806 (*ier) = CG_INCORRECT_PATH;
09807 return 0;
09808 }
09809 if (error1) {
09810 cgi_error("Duplicate child name found (%s) found under %s",
09811 given_name, posit->label);
09812 (*ier) = CG_ERROR;
09813 return 0;
09814 }
09815 if (error2) {
09816 cgi_error("IntegralData index number %d doesn't exist under %s",
09817 given_no, posit->label);
09818 (*ier) = CG_NODE_NOT_FOUND;
09819 return 0;
09820 }
09821 if (parent_id) {
09822 if (cgi_delete_node (parent_id, integral->id)) {
09823 (*ier) = CG_ERROR;
09824 return 0;
09825 }
09826 cgi_free_integral(integral);
09827 }
09828 return integral;
09829 }
09830
09831 cgns_equations *cgi_equations_address(int local_mode, int *ier) {
09832 cgns_equations *equations=0;
09833 double parent_id=0;
09834 int error1=0;
09835
09836
09837 if (posit == 0) {
09838 cgi_error("No current position set by cg_goto\n");
09839 (*ier) = CG_ERROR;
09840 return 0;
09841 }
09842
09843
09844
09845 if (strcmp(posit->label,"CGNSBase_t")==0)
09846 ADDRESS4SINGLE(cgns_base, equations, cgns_equations, 1)
09847
09848 else if (strcmp(posit->label,"Zone_t")==0)
09849 ADDRESS4SINGLE(cgns_zone, equations, cgns_equations, 1)
09850
09851 else {
09852 cgi_error("FlowEquationSet_t node not supported under '%s' type node",posit->label);
09853 (*ier) = CG_INCORRECT_PATH;
09854 return 0;
09855 }
09856 if (error1==1) {
09857 cgi_error("FlowEquationSet_t already defined under %s",posit->label);
09858 (*ier) = CG_ERROR;
09859 return 0;
09860 }
09861 if (!equations && local_mode == CG_MODE_READ) {
09862 cgi_error("FlowEquationSet_t Node doesn't exist under %s",posit->label);
09863 (*ier) = CG_NODE_NOT_FOUND;
09864 return 0;
09865 }
09866 if (parent_id) {
09867 if (cgi_delete_node (parent_id, equations->id)) {
09868 (*ier) = CG_ERROR;
09869 return 0;
09870 }
09871 cgi_free_equations(equations);
09872 }
09873 return equations;
09874 }
09875
09876 cgns_state *cgi_state_address(int local_mode, int *ier) {
09877 cgns_state *state=0;
09878 double parent_id=0;
09879 int error1=0;
09880
09881
09882 if (posit == 0) {
09883 cgi_error("No current position set by cg_goto\n");
09884 (*ier) = CG_ERROR;
09885 return 0;
09886 }
09887
09888
09889
09890
09891 if (strcmp(posit->label,"CGNSBase_t")==0)
09892 ADDRESS4SINGLE(cgns_base, state, cgns_state, 1)
09893
09894 else if (strcmp(posit->label,"Zone_t")==0)
09895 ADDRESS4SINGLE(cgns_zone, state, cgns_state, 1)
09896
09897 else if (strcmp(posit->label,"ZoneBC_t")==0)
09898 ADDRESS4SINGLE(cgns_zboco, state, cgns_state, 1)
09899
09900 else if (strcmp(posit->label,"BC_t")==0)
09901 ADDRESS4SINGLE(cgns_boco, state, cgns_state, 1)
09902
09903 else if (strcmp(posit->label,"BCDataSet_t")==0)
09904 ADDRESS4SINGLE(cgns_dataset, state, cgns_state, 1)
09905
09906 else {
09907 cgi_error("ReferenceState_t node not supported under '%s' type node",posit->label);
09908 (*ier) = CG_INCORRECT_PATH;
09909 return 0;
09910 }
09911 if (error1==1) {
09912 cgi_error("ReferenceState_t already defined under %s",posit->label);
09913 (*ier) = CG_ERROR;
09914 return 0;
09915 }
09916 if (!state && local_mode == CG_MODE_READ) {
09917 cgi_error("ReferenceState_t Node doesn't exist under %s",posit->label);
09918 (*ier) = CG_NODE_NOT_FOUND;
09919 return 0;
09920 }
09921 if (parent_id) {
09922 if (cgi_delete_node (parent_id, state->id)) {
09923 (*ier) = CG_ERROR;
09924 return 0;
09925 }
09926 cgi_free_state(state);
09927 }
09928 return state;
09929 }
09930
09931 cgns_converg *cgi_converg_address(int local_mode, int *ier) {
09932 cgns_converg *converg=0;
09933 double parent_id=0;
09934 int error1=0;
09935
09936
09937 if (posit == 0) {
09938 cgi_error("No current position set by cg_goto\n");
09939 (*ier) = CG_ERROR;
09940 return 0;
09941 }
09942
09943
09944
09945
09946 if (strcmp(posit->label,"CGNSBase_t")==0) {
09947 ADDRESS4SINGLE(cgns_base, converg, cgns_converg, 1)
09948 if (local_mode==CG_MODE_WRITE)
09949 strcpy(converg->name,"GlobalConvergenceHistory");
09950
09951 } else if (strcmp(posit->label,"Zone_t")==0) {
09952 ADDRESS4SINGLE(cgns_zone, converg, cgns_converg, 1)
09953 if (local_mode==CG_MODE_WRITE)
09954 strcpy(converg->name,"ZoneConvergenceHistory");
09955
09956 } else {
09957 cgi_error("ConvergenceHistory_t node not supported under '%s' type node",posit->label);
09958 (*ier) = CG_INCORRECT_PATH;
09959 return 0;
09960 }
09961 if (error1==1) {
09962 cgi_error("ConvergenceHistory_t already defined under %s",posit->label);
09963 (*ier) = CG_ERROR;
09964 return 0;
09965 }
09966 if (!converg && local_mode == CG_MODE_READ) {
09967 cgi_error("ConvergenceHistory_t Node doesn't exist under %s",posit->label);
09968 (*ier) = CG_NODE_NOT_FOUND;
09969 return 0;
09970 }
09971 if (parent_id) {
09972 if (cgi_delete_node (parent_id, converg->id)) {
09973 (*ier) = CG_ERROR;
09974 return 0;
09975 }
09976 cgi_free_converg(converg);
09977 }
09978 return converg;
09979 }
09980
09981 cgns_governing *cgi_governing_address(int local_mode, int *ier) {
09982 cgns_governing *governing;
09983 int error1=0;
09984 double parent_id=0;
09985
09986
09987 if (posit == 0) {
09988 cgi_error("No current position set by cg_goto\n");
09989 (*ier) = CG_ERROR;
09990 return 0;
09991 }
09992
09993
09994
09995
09996 if (strcmp(posit->label,"FlowEquationSet_t")==0)
09997 ADDRESS4SINGLE(cgns_equations, governing, cgns_governing,1)
09998 else {
09999 cgi_error("GoverningEquations_t node not supported under '%s' type node",posit->label);
10000 (*ier) = CG_INCORRECT_PATH;
10001 return 0;
10002 }
10003 if (error1==1) {
10004 cgi_error("GoverningEquations_t already defined under %s",posit->label);
10005 (*ier) = CG_ERROR;
10006 return 0;
10007 }
10008 if (!governing && local_mode == CG_MODE_READ) {
10009 cgi_error("ConvergenceHistory_t Node doesn't exist under %s",posit->label);
10010 (*ier) = CG_NODE_NOT_FOUND;
10011 return 0;
10012 }
10013 if (parent_id) {
10014 if (cgi_delete_node (parent_id, governing->id)) {
10015 (*ier) = CG_ERROR;
10016 return 0;
10017 }
10018 cgi_free_governing(governing);
10019 }
10020 return governing;
10021 }
10022
10023 int *cgi_diffusion_address(int local_mode, int *ier) {
10024 int *diffusion_model=0, error1=0, nnod;
10025 double parent_id=0, *id;
10026
10027
10028 if (posit == 0) {
10029 cgi_error("No current position set by cg_goto\n");
10030 (*ier) = CG_ERROR;
10031 return 0;
10032 }
10033
10034
10035
10036
10037 if (strcmp(posit->label,"GoverningEquations_t")==0)
10038 ADDRESS4SINGLE(cgns_governing, diffusion_model, int, 6)
10039
10040 else if (strcmp(posit->label,"TurbulenceModel_t")==0)
10041 ADDRESS4SINGLE(cgns_model, diffusion_model, int, 6)
10042
10043 else {
10044 cgi_error("Diffusion Model node not supported under '%s' type node",posit->label);
10045 (*ier) = CG_INCORRECT_PATH;
10046 return 0;
10047 }
10048 if (error1==1) {
10049 cgi_error("Diffusion Model already defined under %s",posit->label);
10050 (*ier) = CG_ERROR;
10051 return 0;
10052 }
10053 if (!diffusion_model && local_mode == CG_MODE_READ) {
10054 cgi_error("Diffusion Model Node doesn't exist under %s",posit->label);
10055 (*ier) = CG_NODE_NOT_FOUND;
10056 return 0;
10057 }
10058 if (parent_id) {
10059 if (cgi_get_nodes(parent_id, "\"int[1+...+IndexDimension]\"", &nnod, &id)) return 0;
10060 if (nnod>0) {
10061 if (cgi_delete_node (parent_id, id[0])) {
10062 (*ier) = CG_ERROR;
10063 return 0;
10064 }
10065 free(id);
10066 }
10067 free(diffusion_model);
10068 }
10069 return diffusion_model;
10070 }
10071
10072 cgns_array *cgi_array_address(int local_mode, int given_no, char const *given_name, int *ier) {
10073 cgns_array *array=0, *coord=0;
10074 int n, error1=0, error2=0;
10075 double parent_id=0;
10076
10077
10078 if (posit == 0) {
10079 cgi_error("No current position set by cg_goto\n");
10080 (*ier) = CG_ERROR;
10081 return 0;
10082 }
10083
10084
10085
10086
10087
10088
10089
10090
10091
10092
10093
10094
10095
10096 if (strcmp(posit->label,"GridCoordinates_t")==0) {
10097 ADDRESS4MULTIPLE(cgns_zcoor, ncoords, coord, cgns_array)
10098 array = coord;
10099
10100
10101 } else if (strcmp(posit->label,"Elements_t")==0) {
10102 cgns_section *section= (cgns_section *)posit->posit;
10103 if (local_mode==CG_MODE_WRITE) {
10104 if (strcmp(given_name,"ElementConnectivity") && strcmp(given_name,"ParentData")) {
10105 cgi_error("User defined DataArray_t node not supported under '%s' type node",posit->label);
10106 (*ier) = CG_ERROR;
10107 return 0;
10108 }
10109 if (section->connect==0 && strcmp(given_name,"ElementConnectivity")==0) {
10110 section->connect = CGNS_NEW(cgns_array, 1);
10111 array = section->connect;
10112 } else if (section->parent==0 && strcmp(given_name,"ParentData")==0) {
10113 section->parent = CGNS_NEW(cgns_array, 1);
10114 array = section->parent;
10115 } else {
10116 if (cg->mode == CG_MODE_WRITE) error1=1;
10117 else {
10118 parent_id = section->id;
10119 if (section->connect && strcmp(given_name,"ElementConnectivity")==0)
10120 array = section->connect;
10121 else if (section->parent && strcmp(given_name,"ParentData")==0)
10122 array = section->parent;
10123 }
10124 }
10125 } else if (local_mode == CG_MODE_READ) {
10126 if (section->connect && strcmp(given_name,"ElementConnectivity")==0)
10127 array = section->connect;
10128 else if (section->parent && strcmp(given_name,"ParentData")==0)
10129 array = section->parent;
10130 }
10131
10132
10133 } else if (strcmp(posit->label,"FlowSolution_t")==0) {
10134 cgns_array *field;
10135 ADDRESS4MULTIPLE(cgns_sol, nfields, field, cgns_array)
10136 array = field;
10137
10138
10139 } else if (strcmp(posit->label,"DiscreteData_t")==0) {
10140 ADDRESS4MULTIPLE(cgns_discrete, narrays, array, cgns_array)
10141
10142
10143 } else if (strcmp(posit->label,"GridConnectivity_t")==0) {
10144 cgns_array *interpolants;
10145 if (local_mode==CG_MODE_WRITE && strcmp(given_name,"InterpolantsDonor")) {
10146 cgi_error("User defined DataArray_t node not supported under '%s' type node",posit->label);
10147 (*ier) = CG_ERROR;
10148 return 0;
10149 }
10150 ADDRESS4SINGLE(cgns_conn, interpolants, cgns_array, 1)
10151 array = interpolants;
10152
10153
10154 } else if (strcmp(posit->label,"BC_t")==0) {
10155 cgns_array *normal;
10156 ADDRESS4SINGLE(cgns_boco, normal, cgns_array, 1)
10157 array = normal;
10158
10159
10160 } else if (strcmp(posit->label,"BCData_t")==0) {
10161 ADDRESS4MULTIPLE(cgns_bcdata, narrays, array, cgns_array)
10162
10163
10164 } else if (strcmp(posit->label,"GasModel_t")==0 ||
10165 strcmp(posit->label,"ViscosityModel_t")==0 ||
10166 strcmp(posit->label,"ThermalConductivityModel_t")==0 ||
10167 strcmp(posit->label,"TurbulenceModel_t")==0 ||
10168 strcmp(posit->label,"TurbulenceClosure_t")==0 ||
10169 strcmp(posit->label,"ThermalRelaxationModel_t")==0 ||
10170 strcmp(posit->label,"ChemicalKineticsModel_t")==0 ||
10171 strcmp(posit->label,"EMElectricFieldModel_t")==0 ||
10172 strcmp(posit->label,"EMMagneticFieldModel_t")==0 ||
10173 strcmp(posit->label,"EMConductivityModel_t")==0) {
10174 ADDRESS4MULTIPLE(cgns_model, narrays, array, cgns_array)
10175
10176
10177 } else if (strcmp(posit->label,"ConvergenceHistory_t")==0) {
10178 ADDRESS4MULTIPLE(cgns_converg, narrays, array, cgns_array)
10179
10180
10181 } else if (strcmp(posit->label,"IntegralData_t")==0) {
10182 ADDRESS4MULTIPLE(cgns_integral, narrays, array, cgns_array)
10183
10184
10185 } else if (strcmp(posit->label,"ReferenceState_t")==0) {
10186 ADDRESS4MULTIPLE(cgns_state, narrays, array, cgns_array)
10187
10188
10189 } else if (strcmp(posit->label, "RigidGridMotion_t")==0) {
10190 ADDRESS4MULTIPLE(cgns_rmotion, narrays, array, cgns_array)
10191
10192
10193 } else if (strcmp(posit->label, "ArbitraryGridMotion_t")==0) {
10194 ADDRESS4MULTIPLE(cgns_amotion, narrays, array, cgns_array)
10195
10196
10197 } else if (strcmp(posit->label, "BaseIterativeData_t")==0) {
10198 ADDRESS4MULTIPLE(cgns_biter, narrays, array, cgns_array)
10199
10200
10201 } else if (strcmp(posit->label, "ZoneIterativeData_t")==0) {
10202 ADDRESS4MULTIPLE(cgns_ziter, narrays, array, cgns_array)
10203
10204
10205 } else if (strcmp(posit->label, "UserDefinedData_t")==0) {
10206 ADDRESS4MULTIPLE(cgns_user_data, narrays, array, cgns_array)
10207
10208
10209 } else if (strcmp(posit->label,"Gravity_t")==0) {
10210 cgns_array *vector;
10211 if (local_mode==CG_MODE_WRITE && strcmp(given_name,"GravityVector")) {
10212 cgi_error("User defined DataArray_t node not supported under '%s' type node",posit->label);
10213 (*ier) = CG_ERROR;
10214 return 0;
10215 }
10216 ADDRESS4SINGLE(cgns_gravity, vector, cgns_array, 1)
10217 array = vector;
10218
10219
10220 } else if (strcmp(posit->label,"Axisymmetry_t")==0) {
10221 if (local_mode==CG_MODE_WRITE && strcmp(given_name,"AxisymmetryReferencePoint") &&
10222 strcmp(given_name,"AxisymmetryAxisVector") &&
10223 strcmp(given_name,"AxisymmetryAngle") &&
10224 strcmp(given_name,"CoordinateNames")) {
10225 cgi_error("User defined DataArray_t node not supported under '%s' type node",posit->label);
10226 (*ier) = CG_ERROR;
10227 return 0;
10228 }
10229 ADDRESS4MULTIPLE(cgns_axisym, narrays, array, cgns_array)
10230
10231
10232 } else if (strcmp(posit->label,"RotatingCoordinates_t")==0) {
10233 if (local_mode==CG_MODE_WRITE && strcmp(given_name,"RotationCenter") &&
10234 strcmp(given_name,"RotationRateVector")) {
10235 cgi_error("User defined DataArray_t node not supported under '%s' type node",posit->label);
10236 (*ier) = CG_ERROR;
10237 return 0;
10238 }
10239 ADDRESS4MULTIPLE(cgns_rotating, narrays, array, cgns_array)
10240
10241
10242 } else if (strcmp(posit->label,"Area_t")==0) {
10243 if (local_mode==CG_MODE_WRITE && strcmp(given_name,"SurfaceArea") &&
10244 strcmp(given_name,"RegionName")) {
10245 cgi_error("User defined DataArray_t node not supported under '%s' type node",posit->label);
10246 (*ier) = CG_ERROR;
10247 return 0;
10248 }
10249 ADDRESS4MULTIPLE(cgns_bcarea, narrays, array, cgns_array)
10250
10251
10252 } else if (strcmp(posit->label,"Periodic_t")==0) {
10253 if (local_mode==CG_MODE_WRITE && strcmp(given_name,"RotationCenter") &&
10254 strcmp(given_name,"RotationAngle") && strcmp(given_name,"Translation")) {
10255 cgi_error("User defined DataArray_t node not supported under '%s' type node",posit->label);
10256 (*ier) = CG_ERROR;
10257 return 0;
10258 }
10259 ADDRESS4MULTIPLE(cgns_cperio, narrays, array, cgns_array)
10260
10261 } else {
10262 cgi_error("DataArray_t node not supported under '%s' type node",posit->label);
10263 (*ier) = CG_INCORRECT_PATH;
10264 return 0;
10265 }
10266 if (error1) {
10267 cgi_error("Duplicate child name found (%s) found under %s",
10268 given_name, posit->label);
10269 (*ier) = CG_ERROR;
10270 return 0;
10271 }
10272 if (error2) {
10273 cgi_error("DataArray_t index number %d doesn't exist under %s",
10274 given_no, posit->label);
10275 (*ier) = CG_NODE_NOT_FOUND;
10276 return 0;
10277 }
10278 if (parent_id) {
10279 if (cgi_delete_node (parent_id, array->id)) {
10280 (*ier) = CG_ERROR;
10281 return 0;
10282 }
10283 cgi_free_array(array);
10284 }
10285 return array;
10286 }
10287
10288 cgns_model *cgi_model_address(int local_mode, char const *ModelLabel, int *ier) {
10289 cgns_model *model=0;
10290 double parent_id=0;
10291 int error1=0;
10292
10293
10294 if (posit == 0) {
10295 cgi_error("No current position set by cg_goto\n");
10296 (*ier) = CG_ERROR;
10297 return 0;
10298 }
10299
10300
10301
10302
10303 if (strcmp(posit->label,"FlowEquationSet_t")==0) {
10304 if (strcmp(ModelLabel, "GasModel_t")==0) {
10305 cgns_model *gas;
10306 ADDRESS4SINGLE(cgns_equations, gas, cgns_model, 1)
10307 model = gas;
10308
10309 } else if (strcmp(ModelLabel, "ViscosityModel_t")==0) {
10310 cgns_model *visc;
10311 ADDRESS4SINGLE(cgns_equations, visc, cgns_model, 1)
10312 model = visc;
10313
10314 } else if (strcmp(ModelLabel, "ThermalConductivityModel_t")==0) {
10315 cgns_model *conduct;
10316 ADDRESS4SINGLE(cgns_equations, conduct, cgns_model, 1)
10317 model = conduct;
10318
10319 } else if (strcmp(ModelLabel, "TurbulenceClosure_t")==0) {
10320 cgns_model *closure;
10321 ADDRESS4SINGLE(cgns_equations, closure, cgns_model, 1)
10322 model = closure;
10323
10324 } else if (strcmp(ModelLabel, "TurbulenceModel_t")==0) {
10325 cgns_model *turbulence;
10326 ADDRESS4SINGLE(cgns_equations, turbulence, cgns_model, 1)
10327 model = turbulence;
10328
10329 } else if (strcmp(ModelLabel, "ThermalRelaxationModel_t")==0) {
10330 cgns_model *relaxation;
10331 ADDRESS4SINGLE(cgns_equations, relaxation, cgns_model, 1)
10332 model = relaxation;
10333
10334 } else if (strcmp(ModelLabel, "ChemicalKineticsModel_t")==0) {
10335 cgns_model *chemkin;
10336 ADDRESS4SINGLE(cgns_equations, chemkin, cgns_model, 1)
10337 model = chemkin;
10338 } else if (strcmp(ModelLabel, "EMElectricFieldModel_t")==0) {
10339 cgns_model *elecfield;
10340 ADDRESS4SINGLE(cgns_equations, elecfield, cgns_model, 1)
10341 model = elecfield;
10342
10343 } else if (strcmp(ModelLabel, "EMMagneticFieldModel_t")==0) {
10344 cgns_model *magnfield;
10345 ADDRESS4SINGLE(cgns_equations, magnfield, cgns_model, 1)
10346 model = magnfield;
10347
10348 } else if (strcmp(ModelLabel, "EMConductivityModel_t")==0) {
10349 cgns_model *emconduct;
10350 ADDRESS4SINGLE(cgns_equations, emconduct, cgns_model, 1)
10351 model = emconduct;
10352 } else {
10353 cgi_error("Incorrect model type %s",ModelLabel);
10354 (*ier) = CG_ERROR;
10355 return 0;
10356 }
10357 } else {
10358 cgi_error("%s node not supported under '%s' type node",ModelLabel,posit->label);
10359 (*ier)=CG_INCORRECT_PATH;
10360 return 0;
10361 }
10362 if (!model && local_mode == CG_MODE_READ) {
10363 cgi_error("%s node doesn't exist under %s",ModelLabel,posit->label);
10364 (*ier) = CG_NODE_NOT_FOUND;
10365 return 0;
10366 }
10367 if (error1) {
10368 cgi_error("%s node already defined under %s",ModelLabel,posit->label);
10369 (*ier) = CG_ERROR;
10370 return 0;
10371 }
10372 if (parent_id) {
10373 if (cgi_delete_node (parent_id, model->id)) {
10374 (*ier) = CG_ERROR;
10375 return 0;
10376 }
10377 cgi_free_model(model);
10378 }
10379 return model;
10380 }
10381
10382
10383 cgns_user_data *cgi_user_data_address(int local_mode, int given_no,
10384 char const *given_name, int *ier) {
10385 cgns_user_data *user_data=0;
10386 int n, error1=0, error2=0;
10387 double parent_id=0;
10388
10389
10390 if (posit == 0) {
10391 cgi_error("No current position set by cg_goto\n");
10392 (*ier) = CG_ERROR;
10393 return 0;
10394 }
10395
10396
10397
10398
10399
10400
10401
10402
10403
10404
10405
10406
10407
10408 if (strcmp(posit->label,"IntegralData_t")==0)
10409 ADDRESS4MULTIPLE(cgns_integral, nuser_data, user_data, cgns_user_data)
10410 else if (strcmp(posit->label,"DiscreteData_t")==0)
10411 ADDRESS4MULTIPLE(cgns_discrete, nuser_data, user_data, cgns_user_data)
10412 else if (strcmp(posit->label,"ConvergenceHistory_t")==0)
10413 ADDRESS4MULTIPLE(cgns_converg, nuser_data, user_data, cgns_user_data)
10414 else if (strcmp(posit->label,"ReferenceState_t")==0)
10415 ADDRESS4MULTIPLE(cgns_state, nuser_data, user_data, cgns_user_data)
10416 else if ( (strcmp(posit->label,"GasModel_t")==0)
10417 || (strcmp(posit->label,"ViscosityModel_t")==0)
10418 || (strcmp(posit->label,"ThermalConductivityModel_t")==0)
10419 || (strcmp(posit->label,"TurbulenceModel_t")==0)
10420 || (strcmp(posit->label,"TurbulenceClosureModel_t")==0)
10421 || (strcmp(posit->label,"ThermalRelaxationModel_t")==0)
10422 || (strcmp(posit->label,"ChemicalKineticsModel_t")==0)
10423 || (strcmp(posit->label,"EMElectricFieldModel_t")==0)
10424 || (strcmp(posit->label,"EMMagneticFieldModel_t")==0)
10425 || (strcmp(posit->label,"EMConductivityModel_t")==0) )
10426 ADDRESS4MULTIPLE(cgns_model, nuser_data, user_data, cgns_user_data)
10427 else if (strcmp(posit->label,"GoverningEquations_t")==0)
10428 ADDRESS4MULTIPLE(cgns_governing, nuser_data, user_data, cgns_user_data)
10429 else if (strcmp(posit->label,"FlowEquationSet_t")==0)
10430 ADDRESS4MULTIPLE(cgns_equations, nuser_data, user_data, cgns_user_data)
10431 else if (strcmp(posit->label,"BCData_t")==0)
10432 ADDRESS4MULTIPLE(cgns_bcdata, nuser_data, user_data, cgns_user_data)
10433 else if (strcmp(posit->label,"BCDataSet_t")==0)
10434 ADDRESS4MULTIPLE(cgns_dataset, nuser_data, user_data, cgns_user_data)
10435 else if (strcmp(posit->label,"Elements_t")==0)
10436 ADDRESS4MULTIPLE(cgns_section, nuser_data, user_data, cgns_user_data)
10437 else if (strcmp(posit->label,"BC_t")==0)
10438 ADDRESS4MULTIPLE(cgns_boco, nuser_data, user_data, cgns_user_data)
10439 else if (strcmp(posit->label,"ZoneBC_t")==0)
10440 ADDRESS4MULTIPLE(cgns_zboco, nuser_data, user_data, cgns_user_data)
10441 else if (strcmp(posit->label,"OversetHoles_t")==0)
10442 ADDRESS4MULTIPLE(cgns_hole, nuser_data, user_data, cgns_user_data)
10443 else if (strcmp(posit->label,"GridConnectivity_t")==0)
10444 ADDRESS4MULTIPLE(cgns_conn, nuser_data, user_data, cgns_user_data)
10445 else if (strcmp(posit->label,"GridConnectivity1to1_t")==0)
10446 ADDRESS4MULTIPLE(cgns_1to1, nuser_data, user_data, cgns_user_data)
10447 else if (strcmp(posit->label,"ZoneGridConnectivity_t")==0)
10448 ADDRESS4MULTIPLE(cgns_zconn, nuser_data, user_data, cgns_user_data)
10449 else if (strcmp(posit->label,"FlowSolution_t")==0)
10450 ADDRESS4MULTIPLE(cgns_sol, nuser_data, user_data, cgns_user_data)
10451 else if (strcmp(posit->label,"GridCoordinates_t")==0)
10452 ADDRESS4MULTIPLE(cgns_zcoor, nuser_data, user_data, cgns_user_data)
10453 else if (strcmp(posit->label,"RigidGridMotion_t")==0)
10454 ADDRESS4MULTIPLE(cgns_rmotion, nuser_data, user_data, cgns_user_data)
10455 else if (strcmp(posit->label,"ArbitraryGridMotion_t")==0)
10456 ADDRESS4MULTIPLE(cgns_amotion, nuser_data, user_data, cgns_user_data)
10457 else if (strcmp(posit->label,"ZoneIterativeData_t")==0)
10458 ADDRESS4MULTIPLE(cgns_ziter, nuser_data, user_data, cgns_user_data)
10459 else if (strcmp(posit->label,"BaseIterativeData_t")==0)
10460 ADDRESS4MULTIPLE(cgns_biter, nuser_data, user_data, cgns_user_data)
10461 else if (strcmp(posit->label,"Zone_t")==0)
10462 ADDRESS4MULTIPLE(cgns_zone, nuser_data, user_data, cgns_user_data)
10463 else if (strcmp(posit->label,"GeometryReference_t")==0)
10464 ADDRESS4MULTIPLE(cgns_geo, nuser_data, user_data, cgns_user_data)
10465 else if (strcmp(posit->label,"Family_t")==0)
10466 ADDRESS4MULTIPLE(cgns_family, nuser_data, user_data, cgns_user_data)
10467 else if (strcmp(posit->label,"CGNSBase_t")==0)
10468 ADDRESS4MULTIPLE(cgns_base, nuser_data, user_data, cgns_user_data)
10469 else if (strcmp(posit->label,"Gravity_t")==0)
10470 ADDRESS4MULTIPLE(cgns_gravity, nuser_data, user_data, cgns_user_data)
10471 else if (strcmp(posit->label,"Axisymmetry_t")==0)
10472 ADDRESS4MULTIPLE(cgns_axisym, nuser_data, user_data, cgns_user_data)
10473 else if (strcmp(posit->label,"RotatingCoordinates_t")==0)
10474 ADDRESS4MULTIPLE(cgns_rotating, nuser_data, user_data, cgns_user_data)
10475 else if (strcmp(posit->label,"BCProperty_t")==0)
10476 ADDRESS4MULTIPLE(cgns_bprop, nuser_data, user_data, cgns_user_data)
10477 else if (strcmp(posit->label,"WallFunction_t")==0)
10478 ADDRESS4MULTIPLE(cgns_bcwall, nuser_data, user_data, cgns_user_data)
10479 else if (strcmp(posit->label,"Area_t")==0)
10480 ADDRESS4MULTIPLE(cgns_bcarea, nuser_data, user_data, cgns_user_data)
10481 else if (strcmp(posit->label,"GridConnectivityProperty_t")==0)
10482 ADDRESS4MULTIPLE(cgns_cprop, nuser_data, user_data, cgns_user_data)
10483 else if (strcmp(posit->label,"Periodic_t")==0)
10484 ADDRESS4MULTIPLE(cgns_cperio, nuser_data, user_data, cgns_user_data)
10485 else if (strcmp(posit->label,"AverageInterface_t")==0)
10486 ADDRESS4MULTIPLE(cgns_caverage, nuser_data, user_data, cgns_user_data)
10487 else if (strcmp(posit->label,"UserDefinedData_t")==0)
10488 ADDRESS4MULTIPLE(cgns_user_data, nuser_data, user_data, cgns_user_data)
10489 else {
10490 cgi_error("UserDefinedData_t node not supported under '%s' type node",posit->label);
10491 (*ier) = CG_INCORRECT_PATH;
10492 return 0;
10493 }
10494 if (error1) {
10495 cgi_error("Duplicate child name found (%s) found under %s",
10496 given_name, posit->label);
10497 (*ier) = CG_ERROR;
10498 return 0;
10499 }
10500 if (error2) {
10501 cgi_error("UserDefinedData index number %d doesn't exist under %s",
10502 given_no, posit->label);
10503 (*ier) = CG_NODE_NOT_FOUND;
10504 return 0;
10505 }
10506 if (parent_id) {
10507 if (cgi_delete_node (parent_id, user_data->id)) {
10508 (*ier) = CG_ERROR;
10509 return 0;
10510 }
10511 cgi_free_user_data(user_data);
10512 }
10513 return user_data;
10514 }
10515
10516 cgns_rotating *cgi_rotating_address(int local_mode, int *ier) {
10517 cgns_rotating *rotating=0;
10518 double parent_id=0;
10519 int error1=0;
10520
10521
10522 if (posit == 0) {
10523 cgi_error("No current position set by cg_goto\n");
10524 (*ier) = CG_ERROR;
10525 return 0;
10526 }
10527
10528
10529
10530 if (strcmp(posit->label,"CGNSBase_t")==0)
10531 ADDRESS4SINGLE(cgns_base, rotating, cgns_rotating, 1)
10532
10533 else if (strcmp(posit->label,"Zone_t")==0)
10534 ADDRESS4SINGLE(cgns_zone, rotating, cgns_rotating, 1)
10535 else if (strcmp(posit->label,"Family_t")==0)
10536 ADDRESS4SINGLE(cgns_family, rotating, cgns_rotating, 1)
10537 else {
10538 cgi_error("RotatingCoordinates_t node not supported under '%s' type node",posit->label);
10539 (*ier) = CG_INCORRECT_PATH;
10540 return 0;
10541 }
10542 if (error1==1) {
10543 cgi_error("RotatingCoordinates_t already defined under %s",posit->label);
10544 (*ier) = CG_ERROR;
10545 return 0;
10546 }
10547 if (!rotating && local_mode == CG_MODE_READ) {
10548 cgi_error("RotatingCoordinates_t Node doesn't exist under %s",posit->label);
10549 (*ier) = CG_NODE_NOT_FOUND;
10550 return 0;
10551 }
10552 if (parent_id) {
10553 if (cgi_delete_node (parent_id, rotating->id)) {
10554 (*ier) = CG_ERROR;
10555 return 0;
10556 }
10557 cgi_free_rotating(rotating);
10558 }
10559 return rotating;
10560 }
10561
10562 cgns_dataset *cgi_bcdataset_address(int local_mode, int given_no,
10563 char const *given_name, int *ier)
10564 {
10565 cgns_dataset *dataset=0;
10566 int n, error1=0, error2=0;
10567 double parent_id=0;
10568
10569
10570 if (posit == 0) {
10571 cgi_error("No current position set by cg_goto\n");
10572 (*ier) = CG_ERROR;
10573 return 0;
10574 }
10575
10576
10577
10578
10579
10580
10581
10582 if (strcmp(posit->label,"FamilyBC_t")==0)
10583 ADDRESS4MULTIPLE(cgns_fambc, ndataset, dataset, cgns_dataset)
10584 else {
10585 cgi_error("BCDataSet_t node not supported under '%s' type node",posit->label);
10586 (*ier) = CG_INCORRECT_PATH;
10587 return 0;
10588 }
10589 if (error1) {
10590 cgi_error("Duplicate child name found (%s) found under %s",
10591 given_name, posit->label);
10592 (*ier) = CG_ERROR;
10593 return 0;
10594 }
10595 if (error2) {
10596 cgi_error("BCDataSet index number %d doesn't exist under %s",
10597 given_no, posit->label);
10598 (*ier) = CG_NODE_NOT_FOUND;
10599 return 0;
10600 }
10601 if (parent_id) {
10602 if (cgi_delete_node (parent_id, dataset->id)) {
10603 (*ier) = CG_ERROR;
10604 return 0;
10605 }
10606 cgi_free_dataset(dataset);
10607 }
10608
10609 return dataset;
10610 }
10611
10612 cgns_ptset *cgi_ptset_address(int local_mode, int *ier) {
10613 cgns_ptset *ptset = 0;
10614 double parent_id=0;
10615 int error1=0;
10616
10617
10618 if (posit == 0) {
10619 cgi_error("No current position set by cg_goto\n");
10620 (*ier) = CG_ERROR;
10621 return 0;
10622 }
10623
10624
10625
10626
10627
10628
10629 if (strcmp(posit->label,"UserDefinedData_t")==0)
10630 ADDRESS4SINGLE(cgns_user_data, ptset, cgns_ptset, 1)
10631
10632 else if (strcmp(posit->label,"BCDataSet_t")==0)
10633 ADDRESS4SINGLE(cgns_dataset, ptset, cgns_ptset, 1)
10634 #if 0
10635 else if (strcmp(posit->label,"BC_t")==0)
10636 ADDRESS4SINGLE(cgns_boco, ptset, cgns_ptset, 1)
10637
10638 else if (strcmp(posit->label,"OversetHoles_t")==0)
10639 ADDRESS4SINGLE(cgns_hole, ptset, cgns_ptset, 1)
10640
10641 else if (strcmp(posit->label,"GridConnectivity_t")==0)
10642 ADDRESS4SINGLE_ALLOC(cgns_conn, ptset)
10643
10644 else if (strcmp(posit->label,"GridConnectivity1to1_t")==0)
10645 ADDRESS4SINGLE_ALLOC(cgns_1to1, ptset)
10646 #endif
10647 else {
10648 cgi_error("PointSet node not supported under '%s' type node",posit->label);
10649 (*ier) = CG_INCORRECT_PATH;
10650 return 0;
10651 }
10652
10653 if (error1==1) {
10654 cgi_error("IndexArray/Range_t already defined under %s",posit->label);
10655 (*ier) = CG_ERROR;
10656 return 0;
10657 }
10658 if (!ptset && local_mode == CG_MODE_READ) {
10659 cgi_error("IndexArray/Range_t Node doesn't exist under %s",posit->label);
10660 (*ier) = CG_NODE_NOT_FOUND;
10661 return 0;
10662 }
10663 if (parent_id) {
10664 if (cgi_delete_node (parent_id, ptset->id)) {
10665 (*ier) = CG_ERROR;
10666 return 0;
10667 }
10668 cgi_free_ptset(ptset);
10669 }
10670
10671 return ptset;
10672 }
10673
10674
10675
10676
10677
10678 void cgi_free_file(cgns_file *cg) {
10679 int b;
10680
10681 free(cg->filename);
10682 if (cg->nbases) {
10683 for (b=0; b<cg->nbases; b++)
10684 cgi_free_base(&cg->base[b]);
10685 free(cg->base);
10686 }
10687 }
10688
10689 void cgi_free_base(cgns_base *base) {
10690 int n;
10691
10692 if (base->nzones) {
10693 for (n=0; n<base->nzones; n++)
10694 cgi_free_zone(&base->zone[n]);
10695 free(base->zone);
10696 }
10697 if (base->ndescr) {
10698 for (n=0; n<base->ndescr; n++)
10699 cgi_free_descr(&base->descr[n]);
10700 free(base->descr);
10701 }
10702 if (base->state) {
10703 cgi_free_state(base->state);
10704 free(base->state);
10705 }
10706 if (base->units) {
10707 cgi_free_units(base->units);
10708 free(base->units);
10709 }
10710 if (base->equations) {
10711 cgi_free_equations(base->equations);
10712 free(base->equations);
10713 }
10714 if (base->converg) {
10715 cgi_free_converg(base->converg);
10716 free(base->converg);
10717 }
10718 if (base->nintegrals) {
10719 for (n=0; n<base->nintegrals; n++)
10720 cgi_free_integral(&base->integral[n]);
10721 free(base->integral);
10722 }
10723 if (base->nfamilies) {
10724 for (n=0; n<base->nfamilies; n++)
10725 cgi_free_family(&base->family[n]);
10726 free(base->family);
10727 }
10728 if (base->biter) {
10729 cgi_free_biter(base->biter);
10730 free(base->biter);
10731 }
10732 if (base->nuser_data) {
10733 for (n=0; n<base->nuser_data; n++)
10734 cgi_free_user_data(&base->user_data[n]);
10735 free(base->user_data);
10736 }
10737 if (base->gravity) {
10738 cgi_free_gravity(base->gravity);
10739 free(base->gravity);
10740 }
10741 if (base->axisym) {
10742 cgi_free_axisym(base->axisym);
10743 free(base->axisym);
10744 }
10745 if (base->rotating) {
10746 cgi_free_rotating(base->rotating);
10747 free(base->rotating);
10748 }
10749 }
10750
10751 void cgi_free_zone(cgns_zone *zone) {
10752 int n;
10753
10754 if (zone->link) free(zone->link);
10755 free(zone->nijk);
10756 if (zone->ndescr) {
10757 for (n=0; n<zone->ndescr; n++)
10758 cgi_free_descr(&zone->descr[n]);
10759 free(zone->descr);
10760 }
10761 if (zone->nzcoor) {
10762 for (n=0; n<zone->nzcoor; n++)
10763 cgi_free_zcoor(&zone->zcoor[n]);
10764 free(zone->zcoor);
10765 }
10766 if (zone->nsections) {
10767 for (n=0; n<zone->nsections; n++)
10768 cgi_free_section(&zone->section[n]);
10769 free(zone->section);
10770 }
10771 if (zone->nsols) {
10772 for (n=0; n<zone->nsols; n++)
10773 cgi_free_sol(&zone->sol[n]);
10774 free(zone->sol);
10775 }
10776 if (zone->ndiscrete) {
10777 for (n=0; n<zone->ndiscrete; n++)
10778 cgi_free_discrete(&zone->discrete[n]);
10779 free(zone->discrete);
10780 }
10781 if (zone->nintegrals) {
10782 for (n=0; n<zone->nintegrals; n++)
10783 cgi_free_integral(&zone->integral[n]);
10784 free(zone->integral);
10785 }
10786 if (zone->zconn) {
10787 cgi_free_zconn(zone->zconn);
10788 free(zone->zconn);
10789 }
10790 if (zone->zboco) {
10791 cgi_free_zboco(zone->zboco);
10792 free(zone->zboco);
10793 }
10794 if (zone->state) {
10795 cgi_free_state(zone->state);
10796 free(zone->state);
10797 }
10798 if (zone->units) {
10799 cgi_free_units(zone->units);
10800 free(zone->units);
10801 }
10802 if (zone->equations) {
10803 cgi_free_equations(zone->equations);
10804 free(zone->equations);
10805 }
10806 if (zone->converg) {
10807 cgi_free_converg(zone->converg);
10808 free(zone->converg);
10809 }
10810 if (zone->nrmotions) {
10811 for (n=0; n<zone->nrmotions; n++)
10812 cgi_free_rmotion(&zone->rmotion[n]);
10813 free(zone->rmotion);
10814 }
10815 if (zone->namotions) {
10816 for (n=0; n<zone->namotions; n++)
10817 cgi_free_amotion(&zone->amotion[n]);
10818 free(zone->amotion);
10819 }
10820 if (zone->ziter) {
10821 cgi_free_ziter(zone->ziter);
10822 free(zone->ziter);
10823 }
10824 if (zone->nuser_data) {
10825 for (n=0; n<zone->nuser_data; n++)
10826 cgi_free_user_data(&zone->user_data[n]);
10827 free(zone->user_data);
10828 }
10829 if (zone->rotating) {
10830 cgi_free_rotating(zone->rotating);
10831 free(zone->rotating);
10832 }
10833 }
10834
10835 void cgi_free_section(cgns_section *section) {
10836 int n;
10837 if (section->link) free(section->link);
10838 if (section->ndescr) {
10839 for (n=0; n<section->ndescr; n++)
10840 cgi_free_descr(§ion->descr[n]);
10841 free(section->descr);
10842 }
10843 if (section->rind_planes) free(section->rind_planes);
10844 if (section->connect) {
10845 cgi_free_array(section->connect);
10846 free(section->connect);
10847 }
10848 if (section->parent) {
10849 cgi_free_array(section->parent);
10850 free(section->parent);
10851 }
10852 if (section->nuser_data) {
10853 for (n=0; n<section->nuser_data; n++)
10854 cgi_free_user_data(§ion->user_data[n]);
10855 free(section->user_data);
10856 }
10857 }
10858
10859 void cgi_free_family(cgns_family *family) {
10860 int n;
10861 if (family->link) free(family->link);
10862 if (family->ndescr) {
10863 for (n=0; n<family->ndescr; n++)
10864 cgi_free_descr(&family->descr[n]);
10865 free(family->descr);
10866 }
10867 if (family->nfambc) {
10868 for (n=0; n>family->nfambc; n++)
10869 cgi_free_fambc(&family->fambc[n]);
10870 free(family->fambc);
10871 }
10872 if (family->ngeos) {
10873 for (n=0; n<family->ngeos; n++)
10874 cgi_free_geo(&family->geo[n]);
10875 free(family->geo);
10876 }
10877 if (family->nuser_data) {
10878 for (n=0; n<family->nuser_data; n++)
10879 cgi_free_user_data(&family->user_data[n]);
10880 free(family->user_data);
10881 }
10882 if (family->rotating) {
10883 cgi_free_rotating(family->rotating);
10884 free(family->rotating);
10885 }
10886 }
10887
10888 void cgi_free_fambc(cgns_fambc *fambc) {
10889 if (fambc->link) free(fambc->link);
10890 if (fambc->ndataset) {
10891 int n;
10892 for (n=0; n<fambc->ndataset; n++)
10893 cgi_free_dataset(&fambc->dataset[n]);
10894 free(fambc->dataset);
10895 }
10896 }
10897
10898 void cgi_free_geo(cgns_geo *geo) {
10899 int n;
10900 if (geo->link) free(geo->link);
10901 if (geo->ndescr) {
10902 for (n=0; n<geo->ndescr; n++)
10903 cgi_free_descr(&geo->descr[n]);
10904 free(geo->descr);
10905 }
10906 if (geo->file) free(geo->file);
10907 if (geo->npart) {
10908 for (n=0; n<geo->npart; n++)
10909 cgi_free_part(&geo->part[n]);
10910 free(geo->part);
10911 }
10912 if (geo->nuser_data) {
10913 for (n=0; n<geo->nuser_data; n++)
10914 cgi_free_user_data(&geo->user_data[n]);
10915 free(geo->user_data);
10916 }
10917 }
10918
10919 void cgi_free_part(cgns_part *part) {
10920 if (part->link) free(part->link);
10921 }
10922
10923 void cgi_free_zcoor(cgns_zcoor *zcoor) {
10924 int n;
10925 if (zcoor->link) free(zcoor->link);
10926 if (zcoor->ndescr) {
10927 for (n=0; n<zcoor->ndescr; n++)
10928 cgi_free_descr(&zcoor->descr[n]);
10929 free(zcoor->descr);
10930 }
10931 if (zcoor->rind_planes) free(zcoor->rind_planes);
10932 if (zcoor->ncoords) {
10933 for (n=0; n<zcoor->ncoords; n++)
10934 cgi_free_array(&zcoor->coord[n]);
10935 free(zcoor->coord);
10936 }
10937 if (zcoor->units) {
10938 cgi_free_units(zcoor->units);
10939 free(zcoor->units);
10940 }
10941 if (zcoor->nuser_data) {
10942 for (n=0; n<zcoor->nuser_data; n++)
10943 cgi_free_user_data(&zcoor->user_data[n]);
10944 free(zcoor->user_data);
10945 }
10946 }
10947
10948 void cgi_free_zboco(cgns_zboco *zboco) {
10949 int n;
10950 if (zboco->link) free(zboco->link);
10951 if (zboco->ndescr) {
10952 for (n=0; n<zboco->ndescr; n++)
10953 cgi_free_descr(&zboco->descr[n]);
10954 free(zboco->descr);
10955 }
10956 if (zboco->nbocos) {
10957 for (n=0; n<zboco->nbocos; n++)
10958 cgi_free_boco(&zboco->boco[n]);
10959 free(zboco->boco);
10960 }
10961 if (zboco->state) {
10962 cgi_free_state(zboco->state);
10963 free(zboco->state);
10964 }
10965 if (zboco->units) {
10966 cgi_free_units(zboco->units);
10967 free(zboco->units);
10968 }
10969 if (zboco->nuser_data) {
10970 for (n=0; n<zboco->nuser_data; n++)
10971 cgi_free_user_data(&zboco->user_data[n]);
10972 free(zboco->user_data);
10973 }
10974 }
10975
10976 void cgi_free_zconn(cgns_zconn *zconn) {
10977 int n;
10978 if (zconn->link) free(zconn->link);
10979 if (zconn->ndescr) {
10980 for (n=0; n<zconn->ndescr; n++)
10981 cgi_free_descr(&zconn->descr[n]);
10982 free(zconn->descr);
10983 }
10984 if (zconn->n1to1) {
10985 for (n=0; n<zconn->n1to1; n++)
10986 cgi_free_1to1(&zconn->one21[n]);
10987 free(zconn->one21);
10988 }
10989 if (zconn->nconns) {
10990 for (n=0; n<zconn->nconns; n++)
10991 cgi_free_conn(&zconn->conn[n]);
10992 free(zconn->conn);
10993 }
10994 if (zconn->nholes) {
10995 for (n=0; n<zconn->nholes; n++)
10996 cgi_free_hole(&zconn->hole[n]);
10997 free(zconn->hole);
10998 }
10999 if (zconn->nuser_data) {
11000 for (n=0; n<zconn->nuser_data; n++)
11001 cgi_free_user_data(&zconn->user_data[n]);
11002 free(zconn->user_data);
11003 }
11004 }
11005
11006 void cgi_free_sol(cgns_sol *sol) {
11007 int n;
11008 if (sol->link) free(sol->link);
11009 if (sol->ndescr) {
11010 for (n=0; n<sol->ndescr; n++)
11011 cgi_free_descr(&sol->descr[n]);
11012 free(sol->descr);
11013 }
11014 if (sol->nfields) {
11015 for (n=0; n<sol->nfields; n++)
11016 cgi_free_array(&sol->field[n]);
11017 free(sol->field);
11018 }
11019 if (sol->rind_planes) free(sol->rind_planes);
11020 if (sol->units) {
11021 cgi_free_units(sol->units);
11022 free(sol->units);
11023 }
11024 if (sol->nuser_data) {
11025 for (n=0; n<sol->nuser_data; n++)
11026 cgi_free_user_data(&sol->user_data[n]);
11027 free(sol->user_data);
11028 }
11029 }
11030
11031 void cgi_free_1to1(cgns_1to1 *one21) {
11032 int n;
11033 if (one21->link) free(one21->link);
11034 free(one21->transform);
11035 if (one21->ndescr) {
11036 for (n=0; n<one21->ndescr; n++)
11037 cgi_free_descr(&one21->descr[n]);
11038 free(one21->descr);
11039 }
11040 if (one21->nuser_data) {
11041 for (n=0; n<one21->nuser_data; n++)
11042 cgi_free_user_data(&one21->user_data[n]);
11043 free(one21->user_data);
11044 }
11045 if (one21->cprop) {
11046 cgi_free_cprop(one21->cprop);
11047 free(one21->cprop);
11048 }
11049 }
11050
11051 void cgi_free_hole(cgns_hole *hole) {
11052 int n;
11053 if (hole->link) free(hole->link);
11054 if (hole->ndescr) {
11055 for (n=0; n<hole->ndescr; n++)
11056 cgi_free_descr(&hole->descr[n]);
11057 free(hole->descr);
11058 }
11059 if (hole->nptsets) {
11060 for (n=0; n<hole->nptsets; n++)
11061 cgi_free_ptset(&hole->ptset[n]);
11062 free(hole->ptset);
11063 }
11064 if (hole->nuser_data) {
11065 for (n=0; n<hole->nuser_data; n++)
11066 cgi_free_user_data(&hole->user_data[n]);
11067 free(hole->user_data);
11068 }
11069 }
11070
11071 void cgi_free_conn(cgns_conn *conn) {
11072 int n;
11073 if (conn->link) free(conn->link);
11074 if (conn->ndescr) {
11075 for (n=0; n<conn->ndescr; n++)
11076 cgi_free_descr(&conn->descr[n]);
11077 free(conn->descr);
11078 }
11079 if (conn->interpolants) {
11080 cgi_free_array(conn->interpolants);
11081 free(conn->interpolants);
11082 }
11083 if (conn->nuser_data) {
11084 for (n=0; n<conn->nuser_data; n++)
11085 cgi_free_user_data(&conn->user_data[n]);
11086 free(conn->user_data);
11087 }
11088 if (conn->cprop) {
11089 cgi_free_cprop(conn->cprop);
11090 free(conn->cprop);
11091 }
11092 }
11093
11094 void cgi_free_boco(cgns_boco *boco) {
11095 int n;
11096 if (boco->link) free(boco->link);
11097 if (boco->ndescr) {
11098 for (n=0; n<boco->ndescr; n++)
11099 cgi_free_descr(&boco->descr[n]);
11100 free(boco->descr);
11101 }
11102 if (boco->ptset) {
11103 cgi_free_ptset(boco->ptset);
11104 free(boco->ptset);
11105 }
11106 if (boco->Nindex) free(boco->Nindex);
11107 if (boco->normal) {
11108 cgi_free_array(boco->normal);
11109 free(boco->normal);
11110 }
11111 if (boco->ndataset) {
11112 for (n=0; n<boco->ndataset; n++)
11113 {
11114
11115
11116
11117 if(boco->dataset[n].ptset == boco->ptset)
11118 boco->dataset[n].ptset = 0;
11119 cgi_free_dataset(&boco->dataset[n]);
11120 }
11121 free(boco->dataset);
11122 }
11123 if (boco->state) {
11124 cgi_free_state(boco->state);
11125 free(boco->state);
11126 }
11127 if (boco->units) {
11128 cgi_free_units(boco->units);
11129 free(boco->units);
11130 }
11131 if (boco->nuser_data) {
11132 for (n=0; n<boco->nuser_data; n++)
11133 cgi_free_user_data(&boco->user_data[n]);
11134 free(boco->user_data);
11135 }
11136 if (boco->bprop) {
11137 cgi_free_bprop(boco->bprop);
11138 free(boco->bprop);
11139 }
11140 }
11141
11142 void cgi_free_dataset(cgns_dataset *dataset) {
11143 int n;
11144 if (dataset->link) free(dataset->link);
11145 if (dataset->ndescr) {
11146 for (n=0; n<dataset->ndescr; n++)
11147 cgi_free_descr(&dataset->descr[n]);
11148 free(dataset->descr);
11149 }
11150 if (dataset->dirichlet) {
11151 cgi_free_bcdata(dataset->dirichlet);
11152 free(dataset->dirichlet);
11153 }
11154 if (dataset->neumann) {
11155 cgi_free_bcdata(dataset->neumann);
11156 free(dataset->neumann);
11157 }
11158 if (dataset->state) {
11159 cgi_free_state(dataset->state);
11160 free(dataset->state);
11161 }
11162 if (dataset->units) {
11163 cgi_free_units(dataset->units);
11164 free(dataset->units);
11165 }
11166 if (dataset->nuser_data) {
11167 for (n=0; n<dataset->nuser_data; n++)
11168 cgi_free_user_data(&dataset->user_data[n]);
11169 free(dataset->user_data);
11170 }
11171 if (dataset->ptset) {
11172 cgi_free_ptset(dataset->ptset);
11173 free(dataset->ptset);
11174 }
11175 }
11176
11177 void cgi_free_bcdata(cgns_bcdata *bcdata) {
11178 int n;
11179 if (bcdata->link) free(bcdata->link);
11180 if (bcdata->ndescr) {
11181 for (n=0; n<bcdata->ndescr; n++)
11182 cgi_free_descr(&bcdata->descr[n]);
11183 free(bcdata->descr);
11184 }
11185 if (bcdata->narrays) {
11186 for (n=0; n<bcdata->narrays; n++)
11187 cgi_free_array(&bcdata->array[n]);
11188 free(bcdata->array);
11189 }
11190 if (bcdata->units) {
11191 cgi_free_units(bcdata->units);
11192 free(bcdata->units);
11193 }
11194 if (bcdata->nuser_data) {
11195 for (n=0; n<bcdata->nuser_data; n++)
11196 cgi_free_user_data(&bcdata->user_data[n]);
11197 free(bcdata->user_data);
11198 }
11199 }
11200
11201 void cgi_free_ptset(cgns_ptset *ptset) {
11202 if (ptset->link) free(ptset->link);
11203 if (ptset->data) free(ptset->data);
11204 }
11205
11206 void cgi_free_equations(cgns_equations *equations) {
11207 int n;
11208 if (equations->link) free(equations->link);
11209 if (equations->ndescr) {
11210 for (n=0; n<equations->ndescr; n++)
11211 cgi_free_descr(&equations->descr[n]);
11212 free(equations->descr);
11213 }
11214 if (equations->governing) {
11215 cgi_free_governing(equations->governing);
11216 free(equations->governing);
11217 }
11218 if (equations->gas) {
11219 cgi_free_model(equations->gas);
11220 free(equations->gas);
11221 }
11222 if (equations->visc) {
11223 cgi_free_model(equations->visc);
11224 free(equations->visc);
11225 }
11226 if (equations->conduct) {
11227 cgi_free_model(equations->conduct);
11228 free(equations->conduct);
11229 }
11230 if (equations->closure) {
11231 cgi_free_model(equations->closure);
11232 free(equations->closure);
11233 }
11234 if (equations->turbulence) {
11235 if (equations->turbulence->diffusion_model)
11236 free(equations->turbulence->diffusion_model);
11237 cgi_free_model(equations->turbulence);
11238 free(equations->turbulence);
11239 }
11240 if (equations->relaxation) {
11241 cgi_free_model(equations->relaxation);
11242 free(equations->relaxation);
11243 }
11244 if (equations->chemkin) {
11245 cgi_free_model(equations->chemkin);
11246 free(equations->chemkin);
11247 }
11248 if (equations->units) {
11249 cgi_free_units(equations->units);
11250 free(equations->units);
11251 }
11252 if (equations->nuser_data) {
11253 for (n=0; n<equations->nuser_data; n++)
11254 cgi_free_user_data(&equations->user_data[n]);
11255 free(equations->user_data);
11256 }
11257 if (equations->elecfield) {
11258 cgi_free_model(equations->elecfield);
11259 free(equations->elecfield);
11260 }
11261 if (equations->magnfield) {
11262 cgi_free_model(equations->magnfield);
11263 free(equations->magnfield);
11264 }
11265 if (equations->emconduct) {
11266 cgi_free_model(equations->emconduct);
11267 free(equations->emconduct);
11268 }
11269 }
11270
11271 void cgi_free_governing(cgns_governing *governing) {
11272 int n;
11273 if (governing->link) free(governing->link);
11274 if (governing->ndescr) {
11275 for (n=0; n<governing->ndescr; n++)
11276 cgi_free_descr(&governing->descr[n]);
11277 free(governing->descr);
11278 }
11279 if (governing->diffusion_model) free(governing->diffusion_model);
11280 if (governing->nuser_data) {
11281 for (n=0; n<governing->nuser_data; n++)
11282 cgi_free_user_data(&governing->user_data[n]);
11283 free(governing->user_data);
11284 }
11285 }
11286
11287 void cgi_free_model(cgns_model *model) {
11288 int n;
11289 if (model->link) free(model->link);
11290 if (model->ndescr) {
11291 for (n=0; n<model->ndescr; n++)
11292 cgi_free_descr(&model->descr[n]);
11293 free(model->descr);
11294 }
11295 if (model->narrays) {
11296 for (n=0; n<model->narrays; n++)
11297 cgi_free_array(&model->array[n]);
11298 free(model->array);
11299 }
11300 if (model->units) {
11301 cgi_free_units(model->units);
11302 free(model->units);
11303 }
11304 if (model->nuser_data) {
11305 for (n=0; n<model->nuser_data; n++)
11306 cgi_free_user_data(&model->user_data[n]);
11307 free(model->user_data);
11308 }
11309 }
11310
11311 void cgi_free_state(cgns_state *state) {
11312 int n;
11313 if (state->link) free(state->link);
11314 if (state->ndescr) {
11315 for (n=0; n<state->ndescr; n++)
11316 cgi_free_descr(&state->descr[n]);
11317 free(state->descr);
11318 }
11319 if (state->StateDescription) {
11320 cgi_free_descr(state->StateDescription);
11321 free(state->StateDescription);
11322 }
11323 if (state->narrays) {
11324 for (n=0; n<state->narrays; n++)
11325 cgi_free_array(&state->array[n]);
11326 free(state->array);
11327 }
11328 if (state->units) {
11329 cgi_free_units(state->units);
11330 free(state->units);
11331 }
11332 if (state->nuser_data) {
11333 for (n=0; n<state->nuser_data; n++)
11334 cgi_free_user_data(&state->user_data[n]);
11335 free(state->user_data);
11336 }
11337 }
11338
11339 void cgi_free_converg(cgns_converg *converg) {
11340 int n;
11341 if (converg->link) free(converg->link);
11342 if (converg->ndescr) {
11343 for (n=0; n<converg->ndescr; n++)
11344 cgi_free_descr(&converg->descr[n]);
11345 free(converg->descr);
11346 }
11347 if (converg->NormDefinitions) {
11348 cgi_free_descr(converg->NormDefinitions);
11349 free(converg->NormDefinitions);
11350 }
11351 if (converg->narrays) {
11352 for (n=0; n<converg->narrays; n++)
11353 cgi_free_array(&converg->array[n]);
11354 free(converg->array);
11355 }
11356 if (converg->units) {
11357 cgi_free_units(converg->units);
11358 free(converg->units);
11359 }
11360 if (converg->nuser_data) {
11361 for (n=0; n<converg->nuser_data; n++)
11362 cgi_free_user_data(&converg->user_data[n]);
11363 free(converg->user_data);
11364 }
11365 }
11366
11367 void cgi_free_discrete(cgns_discrete *discrete) {
11368 int n;
11369 if (discrete->link) free(discrete->link);
11370 if (discrete->ndescr) {
11371 for (n=0; n<discrete->ndescr; n++)
11372 cgi_free_descr(&discrete->descr[n]);
11373 free(discrete->descr);
11374 }
11375 if (discrete->rind_planes) free(discrete->rind_planes);
11376 if (discrete->narrays) {
11377 for (n=0; n<discrete->narrays; n++)
11378 cgi_free_array(&discrete->array[n]);
11379 free(discrete->array);
11380 }
11381 if (discrete->units) {
11382 cgi_free_units(discrete->units);
11383 free(discrete->units);
11384 }
11385 if (discrete->nuser_data) {
11386 for (n=0; n<discrete->nuser_data; n++)
11387 cgi_free_user_data(&discrete->user_data[n]);
11388 free(discrete->user_data);
11389 }
11390 }
11391
11392 void cgi_free_integral(cgns_integral *integral) {
11393 int n;
11394 if (integral->link) free(integral->link);
11395 if (integral->ndescr) {
11396 for (n=0; n<integral->ndescr; n++)
11397 cgi_free_descr(&integral->descr[n]);
11398 free(integral->descr);
11399 }
11400 if (integral->narrays) {
11401 for (n=0; n<integral->narrays; n++)
11402 cgi_free_array(&integral->array[n]);
11403 free(integral->array);
11404 }
11405 if (integral->units) {
11406 cgi_free_units(integral->units);
11407 free(integral->units);
11408 }
11409 if (integral->nuser_data) {
11410 for (n=0; n<integral->nuser_data; n++)
11411 cgi_free_user_data(&integral->user_data[n]);
11412 free(integral->user_data);
11413 }
11414 }
11415
11416 void cgi_free_array(cgns_array *array) {
11417 int n;
11418 if (array->link) free(array->link);
11419 if (array->data) free(array->data);
11420 if (array->ndescr) {
11421 for (n=0; n<array->ndescr; n++)
11422 cgi_free_descr(&array->descr[n]);
11423 free(array->descr);
11424 }
11425 if (array->units) {
11426 cgi_free_units(array->units);
11427 free(array->units);
11428 }
11429 if (array->exponents) {
11430 cgi_free_exponents(array->exponents);
11431 free(array->exponents);
11432 }
11433 if (array->convert) {
11434 cgi_free_convert(array->convert);
11435 free(array->convert);
11436 }
11437 }
11438
11439 void cgi_free_convert(cgns_conversion *convert) {
11440 if (convert->link) free(convert->link);
11441 free(convert->data);
11442 }
11443
11444 void cgi_free_exponents(cgns_exponent *exponents) {
11445 if (exponents->link) free(exponents->link);
11446 free(exponents->data);
11447 }
11448
11449 void cgi_free_units(cgns_units *units) {
11450 if (units->link) free(units->link);
11451 }
11452
11453 void cgi_free_descr(cgns_descr *descr) {
11454 if (descr->link) free(descr->link);
11455 if (descr->text) free(descr->text);
11456 }
11457
11458 void cgi_free_rmotion(cgns_rmotion *rmotion) {
11459 int n;
11460 if (rmotion->link) free(rmotion->link);
11461 if (rmotion->ndescr) {
11462 for (n=0; n<rmotion->ndescr; n++)
11463 cgi_free_descr(&rmotion->descr[n]);
11464 free(rmotion->descr);
11465 }
11466 if (rmotion->narrays) {
11467 for (n=0; n<rmotion->narrays; n++)
11468 cgi_free_array(&rmotion->array[n]);
11469 free(rmotion->array);
11470 }
11471 if (rmotion->units) {
11472 cgi_free_units(rmotion->units);
11473 free(rmotion->units);
11474 }
11475 if (rmotion->nuser_data) {
11476 for (n=0; n<rmotion->nuser_data; n++)
11477 cgi_free_user_data(&rmotion->user_data[n]);
11478 free(rmotion->user_data);
11479 }
11480 }
11481
11482 void cgi_free_amotion(cgns_amotion *amotion) {
11483 int n;
11484 if (amotion->link) free(amotion->link);
11485 if (amotion->ndescr) {
11486 for (n=0; n<amotion->ndescr; n++)
11487 cgi_free_descr(&amotion->descr[n]);
11488 free(amotion->descr);
11489 }
11490 if (amotion->rind_planes) free(amotion->rind_planes);
11491 if (amotion->narrays) {
11492 for (n=0; n<amotion->narrays; n++)
11493 cgi_free_array(&amotion->array[n]);
11494 free(amotion->array);
11495 }
11496 if (amotion->units) {
11497 cgi_free_units(amotion->units);
11498 free(amotion->units);
11499 }
11500 if (amotion->nuser_data) {
11501 for (n=0; n<amotion->nuser_data; n++)
11502 cgi_free_user_data(&amotion->user_data[n]);
11503 free(amotion->user_data);
11504 }
11505 }
11506
11507 void cgi_free_biter(cgns_biter *biter) {
11508 int n;
11509 if (biter->link) free(biter->link);
11510 if (biter->ndescr) {
11511 for (n=0; n<biter->ndescr; n++)
11512 cgi_free_descr(&biter->descr[n]);
11513 free(biter->descr);
11514 }
11515 if (biter->narrays) {
11516 for (n=0; n<biter->narrays; n++)
11517 cgi_free_array(&biter->array[n]);
11518 free(biter->array);
11519 }
11520 if (biter->units) {
11521 cgi_free_units(biter->units);
11522 free(biter->units);
11523 }
11524 if (biter->nuser_data) {
11525 for (n=0; n<biter->nuser_data; n++)
11526 cgi_free_user_data(&biter->user_data[n]);
11527 free(biter->user_data);
11528 }
11529 }
11530
11531 void cgi_free_ziter(cgns_ziter *ziter) {
11532 int n;
11533 if (ziter->link) free(ziter->link);
11534 if (ziter->ndescr) {
11535 for (n=0; n<ziter->ndescr; n++)
11536 cgi_free_descr(&ziter->descr[n]);
11537 free(ziter->descr);
11538 }
11539 if (ziter->narrays) {
11540 for (n=0; n<ziter->narrays; n++)
11541 cgi_free_array(&ziter->array[n]);
11542 free(ziter->array);
11543 }
11544 if (ziter->units) {
11545 cgi_free_units(ziter->units);
11546 free(ziter->units);
11547 }
11548 if (ziter->nuser_data) {
11549 for (n=0; n<ziter->nuser_data; n++)
11550 cgi_free_user_data(&ziter->user_data[n]);
11551 free(ziter->user_data);
11552 }
11553 }
11554
11555 void cgi_free_gravity(cgns_gravity *gravity) {
11556 int n;
11557 if (gravity->link) free(gravity->link);
11558 if (gravity->ndescr) {
11559 for (n=0; n<gravity->ndescr; n++)
11560 cgi_free_descr(&gravity->descr[n]);
11561 free(gravity->descr);
11562 }
11563 if (gravity->vector) {
11564 cgi_free_array(gravity->vector);
11565 free(gravity->vector);
11566 }
11567 if (gravity->units) {
11568 cgi_free_units(gravity->units);
11569 free(gravity->units);
11570 }
11571 if (gravity->nuser_data) {
11572 for (n=0; n<gravity->nuser_data; n++)
11573 cgi_free_user_data(&gravity->user_data[n]);
11574 free(gravity->user_data);
11575 }
11576 }
11577
11578 void cgi_free_axisym(cgns_axisym *axisym) {
11579 int n;
11580 if (axisym->link) free(axisym->link);
11581 if (axisym->ndescr) {
11582 for (n=0; n<axisym->ndescr; n++)
11583 cgi_free_descr(&axisym->descr[n]);
11584 free(axisym->descr);
11585 }
11586 if (axisym->units) {
11587 cgi_free_units(axisym->units);
11588 free(axisym->units);
11589 }
11590 if (axisym->narrays) {
11591 for (n=0; n<axisym->narrays; n++)
11592 cgi_free_array(&axisym->array[n]);
11593 free(axisym->array);
11594 }
11595 if (axisym->nuser_data) {
11596 for (n=0; n<axisym->nuser_data; n++)
11597 cgi_free_user_data(&axisym->user_data[n]);
11598 free(axisym->user_data);
11599 }
11600 }
11601
11602 void cgi_free_rotating(cgns_rotating *rotating) {
11603 int n;
11604 if (rotating->link) free(rotating->link);
11605 if (rotating->ndescr) {
11606 for (n=0; n<rotating->ndescr; n++)
11607 cgi_free_descr(&rotating->descr[n]);
11608 free(rotating->descr);
11609 }
11610 if (rotating->units) {
11611 cgi_free_units(rotating->units);
11612 free(rotating->units);
11613 }
11614 if (rotating->narrays) {
11615 for (n=0; n<rotating->narrays; n++)
11616 cgi_free_array(&rotating->array[n]);
11617 free(rotating->array);
11618 }
11619 if (rotating->nuser_data) {
11620 for (n=0; n<rotating->nuser_data; n++)
11621 cgi_free_user_data(&rotating->user_data[n]);
11622 free(rotating->user_data);
11623 }
11624 }
11625
11626 void cgi_free_bprop(cgns_bprop *bprop) {
11627 int n;
11628 if (bprop->link) free(bprop->link);
11629 if (bprop->ndescr) {
11630 for (n=0; n<bprop->ndescr; n++)
11631 cgi_free_descr(&bprop->descr[n]);
11632 free(bprop->descr);
11633 }
11634 if (bprop->bcwall) {
11635 cgi_free_bcwall(bprop->bcwall);
11636 free(bprop->bcwall);
11637 }
11638 if (bprop->bcarea) {
11639 cgi_free_bcarea(bprop->bcarea);
11640 free(bprop->bcarea);
11641 }
11642 if (bprop->nuser_data) {
11643 for (n=0; n<bprop->nuser_data; n++)
11644 cgi_free_user_data(&bprop->user_data[n]);
11645 free(bprop->user_data);
11646 }
11647 }
11648
11649 void cgi_free_cprop(cgns_cprop *cprop) {
11650 int n;
11651 if (cprop->link) free(cprop->link);
11652 if (cprop->ndescr) {
11653 for (n=0; n<cprop->ndescr; n++)
11654 cgi_free_descr(&cprop->descr[n]);
11655 free(cprop->descr);
11656 }
11657 if (cprop->cperio) {
11658 cgi_free_cperio(cprop->cperio);
11659 free(cprop->cperio);
11660 }
11661 if (cprop->caverage) {
11662 cgi_free_caverage(cprop->caverage);
11663 free(cprop->caverage);
11664 }
11665 if (cprop->nuser_data) {
11666 for (n=0; n<cprop->nuser_data; n++)
11667 cgi_free_user_data(&cprop->user_data[n]);
11668 free(cprop->user_data);
11669 }
11670 }
11671
11672 void cgi_free_bcwall(cgns_bcwall *bcwall) {
11673 int n;
11674 if (bcwall->link) free(bcwall->link);
11675 if (bcwall->ndescr) {
11676 for (n=0; n<bcwall->ndescr; n++)
11677 cgi_free_descr(&bcwall->descr[n]);
11678 free(bcwall->descr);
11679 }
11680 if (bcwall->nuser_data) {
11681 for (n=0; n<bcwall->nuser_data; n++)
11682 cgi_free_user_data(&bcwall->user_data[n]);
11683 free(bcwall->user_data);
11684 }
11685 }
11686
11687 void cgi_free_bcarea(cgns_bcarea *bcarea) {
11688 int n;
11689 if (bcarea->link) free(bcarea->link);
11690 if (bcarea->ndescr) {
11691 for (n=0; n<bcarea->ndescr; n++)
11692 cgi_free_descr(&bcarea->descr[n]);
11693 free(bcarea->descr);
11694 }
11695 if (bcarea->narrays) {
11696 for (n=0; n<bcarea->narrays; n++)
11697 cgi_free_array(&bcarea->array[n]);
11698 free(bcarea->array);
11699 }
11700 if (bcarea->nuser_data) {
11701 for (n=0; n<bcarea->nuser_data; n++)
11702 cgi_free_user_data(&bcarea->user_data[n]);
11703 free(bcarea->user_data);
11704 }
11705 }
11706
11707 void cgi_free_cperio(cgns_cperio *cperio) {
11708 int n;
11709 if (cperio->link) free(cperio->link);
11710 if (cperio->ndescr) {
11711 for (n=0; n<cperio->ndescr; n++)
11712 cgi_free_descr(&cperio->descr[n]);
11713 free(cperio->descr);
11714 }
11715 if (cperio->narrays) {
11716 for (n=0; n<cperio->narrays; n++)
11717 cgi_free_array(&cperio->array[n]);
11718 free(cperio->array);
11719 }
11720 if (cperio->units) {
11721 cgi_free_units(cperio->units);
11722 free(cperio->units);
11723 }
11724 if (cperio->nuser_data) {
11725 for (n=0; n<cperio->nuser_data; n++)
11726 cgi_free_user_data(&cperio->user_data[n]);
11727 free(cperio->user_data);
11728 }
11729 }
11730
11731 void cgi_free_caverage(cgns_caverage *caverage) {
11732 int n;
11733 if (caverage->link) free(caverage->link);
11734 if (caverage->ndescr) {
11735 for (n=0; n<caverage->ndescr; n++)
11736 cgi_free_descr(&caverage->descr[n]);
11737 free(caverage->descr);
11738 }
11739 if (caverage->nuser_data) {
11740 for (n=0; n<caverage->nuser_data; n++)
11741 cgi_free_user_data(&caverage->user_data[n]);
11742 free(caverage->user_data);
11743 }
11744 }
11745
11746 void cgi_free_user_data(cgns_user_data *user_data) {
11747 int n;
11748 if (user_data->link) free(user_data->link);
11749 if (user_data->narrays) {
11750 for (n=0; n<user_data->narrays; n++)
11751 cgi_free_array(&user_data->array[n]);
11752 free(user_data->array);
11753 }
11754 if (user_data->ptset) {
11755 cgi_free_ptset(user_data->ptset);
11756 free(user_data->ptset);
11757 }
11758
11759 if (user_data->nuser_data) {
11760 for (n=0; n < user_data->nuser_data; n++)
11761 cgi_free_user_data(&user_data->user_data[n]);
11762 free(user_data->user_data);
11763 }
11764 }
11765
11766
11767
11768
11769
11770 int cgi_GridLocation(char *LocationName, GridLocation_t *type) {
11771 int i;
11772 for (i=0; i<NofValidGridLocation; i++) {
11773 if (strcmp(LocationName, GridLocationName[i])==0) {
11774 (*type) = (GridLocation_t)i;
11775 return 0;
11776 }
11777 }
11778 if (cg->version > CGNSLibVersion) {
11779 (*type) = GridLocationUserDefined;
11780 cgi_warning("Unrecognized Grid Location Type '%s' replaced with 'UserDefined'",LocationName);
11781 return 0;
11782 }
11783 cgi_error("Unrecognized GridLocation: %s", LocationName);
11784 return 1;
11785 }
11786
11787 int cgi_GridConnectivityType(char *GridConnectivityName, GridConnectivityType_t *type) {
11788 int i;
11789 for (i=0; i<NofValidGridConnectivityTypes; i++) {
11790 if (strcmp(GridConnectivityName, GridConnectivityTypeName[i])==0) {
11791 (*type) = (GridConnectivityType_t)i;
11792 return 0;
11793 }
11794 }
11795 if (cg->version > CGNSLibVersion) {
11796 (*type) = GridConnectivityTypeUserDefined;
11797 cgi_warning("Unrecognized Grid Connectivity Type '%s' replaced with 'UserDefined'",GridConnectivityName);
11798 return 0;
11799 }
11800 cgi_error("Unrecognized GridConnectivityType: %s", GridConnectivityName);
11801 return 1;
11802 }
11803
11804 int cgi_PointSetType(char *PointSetName, PointSetType_t *type) {
11805 int i;
11806 for (i=0; i<NofValidPointSetTypes; i++) {
11807 if (strcmp(PointSetName, PointSetTypeName[i])==0) {
11808 (*type) = (PointSetType_t)i;
11809 return 0;
11810 }
11811 }
11812 if (cg->version > CGNSLibVersion) {
11813 (*type) = PointSetTypeUserDefined;
11814 cgi_warning("Unrecognized Point Set Type '%s' replaced with 'UserDefined'",PointSetName);
11815 return 0;
11816 }
11817 cgi_error("Unrecognized PointSetType: %s", PointSetName);
11818 return 1;
11819 }
11820
11821 int cgi_BCType(char *BCName, BCType_t *type) {
11822 int i;
11823 for (i=0; i<NofValidBCTypes; i++) {
11824 if (strcmp(BCName, BCTypeName[i])==0) {
11825 (*type) = (BCType_t)i;
11826 return 0;
11827 }
11828 }
11829 if (cg->version > CGNSLibVersion) {
11830 (*type) = BCTypeUserDefined;
11831 cgi_warning("Unrecognized BCType '%s' replaced with 'UserDefined'",BCName);
11832 return 0;
11833 }
11834 cgi_error("Unrecognized BCType: %s", BCName);
11835 return 1;
11836 }
11837
11838 int cgi_DataClass(char *Name, DataClass_t *data_class) {
11839 int i;
11840 for (i=0; i<NofValidDataClass; i++) {
11841 if (strcmp(Name, DataClassName[i])==0) {
11842 (*data_class) = (DataClass_t) i;
11843 return 0;
11844 }
11845 }
11846 if (cg->version > CGNSLibVersion) {
11847 (*data_class) = DataClassUserDefined;
11848 cgi_warning("Unrecognized Data Class '%s' replaced with 'UserDefined'",Name);
11849 return 0;
11850 }
11851 cgi_error("Unrecognized Data Class: %s",Name);
11852 return 1;
11853 }
11854
11855 int cgi_MassUnits(char *Name, MassUnits_t *mass_unit) {
11856 int i;
11857
11858 for (i=31; i>=0 && Name[i]==' '; i--);
11859 Name[i+1]='\0';
11860
11861 for (i=0; i<NofValidMassUnits; i++) {
11862 if (strcmp(Name, MassUnitsName[i])==0) {
11863 (*mass_unit) = (MassUnits_t) i;
11864 return 0;
11865 }
11866 }
11867 if (cg->version > CGNSLibVersion) {
11868 (*mass_unit) = MassUnitsUserDefined;
11869 cgi_warning("Unrecognized Mass Unit '%s' replaced with 'UserDefined'",Name);
11870 return 0;
11871 }
11872 (*mass_unit) = MassUnitsNull;
11873 cgi_error("Unrecognized Mass Units Name: %s", Name);
11874 return 1;
11875 }
11876
11877 int cgi_LengthUnits(char *Name, LengthUnits_t *length_unit) {
11878 int i;
11879
11880 for (i=31; i>=0 && Name[i]==' '; i--);
11881 Name[i+1]='\0';
11882
11883 for (i=0; i<NofValidLengthUnits; i++) {
11884 if (strcmp(Name, LengthUnitsName[i])==0) {
11885 (*length_unit) = (LengthUnits_t) i;
11886 return 0;
11887 }
11888 }
11889 if (cg->version > CGNSLibVersion) {
11890 (*length_unit) = LengthUnitsUserDefined;
11891 cgi_warning("Unrecognized Length Unit '%s' replaced with 'UserDefined'",Name);
11892 return 0;
11893 }
11894 (*length_unit) = LengthUnitsNull;
11895 cgi_error("Unrecognized Length Units Name: %s", Name);
11896 return 1;
11897 }
11898
11899 int cgi_TimeUnits(char *Name, TimeUnits_t *time_unit) {
11900 int i;
11901
11902 for (i=31; i>=0 && Name[i]==' '; i--);
11903 Name[i+1]='\0';
11904
11905 for (i=0; i<NofValidTimeUnits; i++) {
11906 if (strcmp(Name, TimeUnitsName[i])==0) {
11907 (*time_unit) = (TimeUnits_t) i;
11908 return 0;
11909 }
11910 }
11911 if (cg->version > CGNSLibVersion) {
11912 (*time_unit) = TimeUnitsUserDefined;
11913 cgi_warning("Unrecognized Time Unit '%s' replaced with 'UserDefined'",Name);
11914 return 0;
11915 }
11916 (*time_unit) = TimeUnitsNull;
11917 cgi_error("Unrecognized Time Units Name: %s", Name);
11918 return 1;
11919 }
11920
11921 int cgi_TemperatureUnits(char *Name, TemperatureUnits_t *temperature_unit) {
11922 int i;
11923
11924 for (i=31; i>=0 && Name[i]==' '; i--);
11925 Name[i+1]='\0';
11926 if (0 == strcmp(Name, "Celcius")) {
11927 *temperature_unit = Celsius;
11928 return 0;
11929 }
11930
11931 for (i=0; i<NofValidTemperatureUnits; i++) {
11932 if (strcmp(Name, TemperatureUnitsName[i])==0) {
11933 (*temperature_unit) = (TemperatureUnits_t) i;
11934 return 0;
11935 }
11936 }
11937 if (cg->version > CGNSLibVersion) {
11938 (*temperature_unit) = TemperatureUnitsUserDefined;
11939 cgi_warning("Unrecognized Temperature Unit '%s' replaced with 'UserDefined'",Name);
11940 return 0;
11941 }
11942 (*temperature_unit) = TemperatureUnitsNull;
11943 cgi_error("Unrecognized Temperature Units Name: %s", Name);
11944 return 1;
11945 }
11946
11947 int cgi_AngleUnits(char *Name, AngleUnits_t *angle_unit) {
11948 int i;
11949
11950 for (i=31; i>=0 && Name[i]==' '; i--);
11951 Name[i+1]='\0';
11952
11953 for (i=0; i<NofValidAngleUnits; i++) {
11954 if (strcmp(Name, AngleUnitsName[i])==0) {
11955 (*angle_unit) = (AngleUnits_t) i;
11956 return 0;
11957 }
11958 }
11959 if (cg->version > CGNSLibVersion) {
11960 (*angle_unit) = AngleUnitsUserDefined;
11961 cgi_warning("Unrecognized Angle Unit '%s' replaced with 'UserDefined'",Name);
11962 return 0;
11963 }
11964 (*angle_unit) = AngleUnitsNull;
11965 cgi_error("Unrecognized Angle Units Name: %s", Name);
11966 return 1;
11967 }
11968
11969 int cgi_ElectricCurrentUnits(char *Name, ElectricCurrentUnits_t *unit) {
11970 int i;
11971
11972 for (i=31; i>=0 && Name[i]==' '; i--);
11973 Name[i+1]='\0';
11974
11975 for (i=0; i<NofValidElectricCurrentUnits; i++) {
11976 if (strcmp(Name, ElectricCurrentUnitsName[i])==0) {
11977 (*unit) = (ElectricCurrentUnits_t) i;
11978 return 0;
11979 }
11980 }
11981 if (cg->version > CGNSLibVersion) {
11982 (*unit) = ElectricCurrentUnitsUserDefined;
11983 cgi_warning("Unrecognized ElectricCurrent Unit '%s' replaced with 'UserDefined'",Name);
11984 return 0;
11985 }
11986 (*unit) = ElectricCurrentUnitsNull;
11987 cgi_error("Unrecognized ElectricCurrent Units Name: %s", Name);
11988 return 1;
11989 }
11990
11991 int cgi_SubstanceAmountUnits(char *Name, SubstanceAmountUnits_t *unit) {
11992 int i;
11993
11994 for (i=31; i>=0 && Name[i]==' '; i--);
11995 Name[i+1]='\0';
11996
11997 for (i=0; i<NofValidSubstanceAmountUnits; i++) {
11998 if (strcmp(Name, SubstanceAmountUnitsName[i])==0) {
11999 (*unit) = (SubstanceAmountUnits_t) i;
12000 return 0;
12001 }
12002 }
12003 if (cg->version > CGNSLibVersion) {
12004 (*unit) = SubstanceAmountUnitsUserDefined;
12005 cgi_warning("Unrecognized SubstanceAmount Unit '%s' replaced with 'UserDefined'",Name);
12006 return 0;
12007 }
12008 (*unit) = SubstanceAmountUnitsNull;
12009 cgi_error("Unrecognized SubstanceAmount Units Name: %s", Name);
12010 return 1;
12011 }
12012
12013 int cgi_LuminousIntensityUnits(char *Name, LuminousIntensityUnits_t *unit) {
12014 int i;
12015
12016 for (i=31; i>=0 && Name[i]==' '; i--);
12017 Name[i+1]='\0';
12018
12019 for (i=0; i<NofValidLuminousIntensityUnits; i++) {
12020 if (strcmp(Name, LuminousIntensityUnitsName[i])==0) {
12021 (*unit) = (LuminousIntensityUnits_t) i;
12022 return 0;
12023 }
12024 }
12025 if (cg->version > CGNSLibVersion) {
12026 (*unit) = LuminousIntensityUnitsUserDefined;
12027 cgi_warning("Unrecognized LuminousIntensity Unit '%s' replaced with 'UserDefined'",Name);
12028 return 0;
12029 }
12030 (*unit) = LuminousIntensityUnitsNull;
12031 cgi_error("Unrecognized LuminousIntensity Units Name: %s", Name);
12032 return 1;
12033 }
12034
12035 int cgi_GoverningEquationsType(char *Name, GoverningEquationsType_t *type) {
12036 int i;
12037 for (i=0; i<NofValidGoverningEquationsTypes; i++) {
12038 if (strcmp(Name, GoverningEquationsTypeName[i])==0) {
12039 (*type) = (GoverningEquationsType_t) i;
12040 return 0;
12041 }
12042 }
12043 if (cg->version > CGNSLibVersion) {
12044 (*type) = GoverningEquationsUserDefined;
12045 cgi_warning("Unrecognized Governing Equations Type '%s' replaced with 'UserDefined'",Name);
12046 return 0;
12047 }
12048 cgi_error("Unrecognized Governing Equations Type: %s", Name);
12049 return 1;
12050 }
12051
12052 int cgi_ModelType(char *Name, ModelType_t *type) {
12053 int i;
12054 for (i=0; i<NofValidModelTypes; i++) {
12055 if (strcmp(Name, ModelTypeName[i])==0) {
12056 (*type) = (ModelType_t) i;
12057 return 0;
12058 }
12059 }
12060 if (cg->version > CGNSLibVersion) {
12061 (*type) = ModelTypeUserDefined;
12062 cgi_warning("Unrecognized Model Type '%s' replaced with 'UserDefined'",Name);
12063 return 0;
12064 }
12065 cgi_error("Unrecognized Model Type : %s", Name);
12066 return 1;
12067 }
12068
12069 int cgi_ZoneType(char *Name, ZoneType_t *type) {
12070 int i;
12071 for (i=0; i<NofValidZoneTypes; i++) {
12072 if (strcmp(Name, ZoneTypeName[i])==0) {
12073 (*type) = (ZoneType_t) i;
12074 return 0;
12075 }
12076 }
12077 if (cg->version > CGNSLibVersion) {
12078 (*type) = ZoneTypeUserDefined;
12079 cgi_warning("Unrecognized Zone Type '%s' replaced with 'UserDefined'",Name);
12080 return 0;
12081 }
12082 cgi_error("Unrecognized Zone Type : %s", Name);
12083 return 1;
12084 }
12085
12086 int cgi_RigidGridMotionType(char *Name, RigidGridMotionType_t *type) {
12087 int i;
12088 for (i=0; i<NofValidRigidGridMotionTypes; i++) {
12089 if (strcmp(Name, RigidGridMotionTypeName[i])==0) {
12090 (*type) = (RigidGridMotionType_t) i;
12091 return 0;
12092 }
12093 }
12094 if (cg->version > CGNSLibVersion) {
12095 (*type) = RigidGridMotionTypeUserDefined;
12096 cgi_warning("Unrecognized Rigid Grid Motion Type '%s' replaced with 'UserDefined'",Name);
12097 return 0;
12098 }
12099 cgi_error("Unrecognized Rigid Grid Motion Type: %s", Name);
12100 return 1;
12101 }
12102
12103 int cgi_ArbitraryGridMotionType(char *Name, ArbitraryGridMotionType_t *type) {
12104 int i;
12105 for (i=0; i<NofValidArbitraryGridMotionTypes; i++) {
12106 if (strcmp(Name, ArbitraryGridMotionTypeName[i])==0) {
12107 (*type) = (ArbitraryGridMotionType_t) i;
12108 return 0;
12109 }
12110 }
12111 if (cg->version > CGNSLibVersion) {
12112 (*type) = ArbitraryGridMotionTypeUserDefined;
12113 cgi_warning("Unrecognized Arbitrary Grid Motion Type '%s' replaced with 'UserDefined'",Name);
12114 return 0;
12115 }
12116 cgi_error("Unrecognized Arbitrary Grid Motion Type: %s", Name);
12117 return 1;
12118 }
12119
12120 int cgi_SimulationType(char *Name, SimulationType_t *type) {
12121 int i;
12122 for (i=0; i<NofValidSimulationTypes; i++) {
12123 if (strcmp(Name, SimulationTypeName[i])==0) {
12124 (*type) = (SimulationType_t) i;
12125 return 0;
12126 }
12127 }
12128 if (cg->version > CGNSLibVersion) {
12129 (*type) = SimulationTypeUserDefined;
12130 cgi_warning("Unrecognized Simulation Type '%s' replaced with 'UserDefined'",Name);
12131 return 0;
12132 }
12133 cgi_error("Unrecognized Simulation Type: %s", Name);
12134 return 1;
12135 }
12136
12137 int cgi_WallFunctionType(char *Name, WallFunctionType_t *type) {
12138 int i;
12139 for (i=0; i<NofValidWallFunctionTypes; i++) {
12140 if (strcmp(Name, WallFunctionTypeName[i])==0) {
12141 (*type) = (WallFunctionType_t) i;
12142 return 0;
12143 }
12144 }
12145 if (cg->version > CGNSLibVersion) {
12146 (*type) = WallFunctionTypeUserDefined;
12147 cgi_warning("Unrecognized Wall Function Type '%s' replaced with 'UserDefined'",Name);
12148 return 0;
12149 }
12150 cgi_error("Unrecognized Wall Function Type: %s", Name);
12151 return 1;
12152 }
12153
12154 int cgi_AreaType(char *Name, AreaType_t *type) {
12155 int i;
12156 for (i=0; i<NofValidAreaTypes; i++) {
12157 if (strcmp(Name, AreaTypeName[i])==0) {
12158 (*type) = (AreaType_t) i;
12159 return 0;
12160 }
12161 }
12162 if (cg->version > CGNSLibVersion) {
12163 (*type) = AreaTypeUserDefined;
12164 cgi_warning("Unrecognized Area Type '%s' replaced with 'UserDefined'",Name);
12165 return 0;
12166 }
12167 cgi_error("Unrecognized Area Type: %s", Name);
12168 return 1;
12169 }
12170
12171 int cgi_AverageInterfaceType(char *Name, AverageInterfaceType_t *type) {
12172 int i;
12173 for (i=0; i<NofValidAverageInterfaceTypes; i++) {
12174 if (strcmp(Name, AverageInterfaceTypeName[i])==0) {
12175 (*type) = (AverageInterfaceType_t) i;
12176 return 0;
12177 }
12178 }
12179 if (cg->version > CGNSLibVersion) {
12180 (*type) = AverageInterfaceTypeUserDefined;
12181 cgi_warning("Unrecognized Average Interface Type '%s' replaced with 'UserDefined'",Name);
12182 return 0;
12183 }
12184 cgi_error("Unrecognized Average Interface Type: %s", Name);
12185 return 1;
12186 }
12187
12188 void cgi_array_print(char *routine, cgns_array *array) {
12189 int n;
12190
12191 printf("In %s:\n", routine);
12192 printf("\t array->name='%s'\n",array->name);
12193 printf("\t array->dim_vals=");
12194 for (n=0; n<array->data_dim; n++) printf("%d ",array->dim_vals[n]);
12195 printf("\n");
12196 printf("\t array->data_type='%s'\n",DataTypeName[cgi_datatype(array->data_type)]);
12197 printf("\t array->id=%13.6e\n",array->id);
12198 printf("\t array->ndescr=%d\n",array->ndescr);
12199 for (n=0; n<array->ndescr; n++) printf("%s\n",array->descr->text);
12200 if (array->data_class)
12201 printf("\t array->data_class=%s\n",DataClassName[array->data_class]);
12202 for (n=0; n<(array->dim_vals[0]*array->dim_vals[1]); n++)
12203 printf("%d ", *((int *)array->data+n));
12204
12205 return;
12206 }
12207