static void build_domain_forest(PP_data *pp_data, Linkage sublinkage) { size_t d, d1, link; DTreeLeaf * dtl; if (pp_data->N_domains > 0) { pp_data->domain_array[pp_data->N_domains-1].parent = NULL; for (d=0; d < pp_data->N_domains-1; d++) { for (d1 = d+1; d1 < pp_data->N_domains; d1++) { if (contained_in(&pp_data->domain_array[d], &pp_data->domain_array[d1], sublinkage)) { pp_data->domain_array[d].parent = &pp_data->domain_array[d1]; break; } } if (d1 == pp_data->N_domains) { /* we know this domain is a root of a new tree */ pp_data->domain_array[d].parent = NULL; } } } /* The parent links of domain nodes have been established. * Now do the leaves. */ for (d = 0; d < pp_data->N_domains; d++) { pp_data->domain_array[d].child = NULL; } for (link=0; link < sublinkage->num_links; link++) { assert (sublinkage->link_array[link].lw != SIZE_MAX); for (d=0; d<pp_data->N_domains; d++) { if (link_in_domain(link, &pp_data->domain_array[d])) { dtl = (DTreeLeaf *) malloc(sizeof(DTreeLeaf)); dtl->link = link; dtl->parent = &pp_data->domain_array[d]; dtl->next = pp_data->domain_array[d].child; pp_data->domain_array[d].child = dtl; break; } } } }
static void build_domain_forest(Postprocessor *pp, Sublinkage *sublinkage) { int d, d1, link; DTreeLeaf * dtl; if (pp->pp_data.N_domains > 0) pp->pp_data.domain_array[pp->pp_data.N_domains-1].parent = NULL; for (d=0; d < pp->pp_data.N_domains-1; d++) { for (d1 = d+1; d1 < pp->pp_data.N_domains; d1++) { if (contained_in(&pp->pp_data.domain_array[d],&pp->pp_data.domain_array[d1],sublinkage)) { pp->pp_data.domain_array[d].parent = &pp->pp_data.domain_array[d1]; break; } } if (d1 == pp->pp_data.N_domains) { /* we know this domain is a root of a new tree */ pp->pp_data.domain_array[d].parent = NULL; /* It's now ok for this to happen. It used to do: printf("I can't find a parent domain for this domain\n"); print_domain(d); exit(1); */ } } /* the parent links of domain nodes have been established. now do the leaves */ for (d=0; d < pp->pp_data.N_domains; d++) { pp->pp_data.domain_array[d].child = NULL; } for (link=0; link < sublinkage->num_links; link++) { if (sublinkage->link[link]->l == -1) continue; /* probably not necessary */ for (d=0; d<pp->pp_data.N_domains; d++) { if (link_in_domain(link, &pp->pp_data.domain_array[d])) { dtl = (DTreeLeaf *) xalloc(sizeof(DTreeLeaf)); dtl->link = link; dtl->parent = &pp->pp_data.domain_array[d]; dtl->next = pp->pp_data.domain_array[d].child; pp->pp_data.domain_array[d].child = dtl; break; } } } }