static inline void check_cell_widths(struct table *t) { int i, j; for (j = 0; j < t->y; j++) for (i = 0; i < t->x; i++) { int min, max; struct table_cell *c = CELL(t, i, j); if (!c->start) continue; get_cell_width(c->start, c->end, t->cellpd, 0, 0, &min, &max, c->link_num, NULL); /*if (min != c->min_width || max < c->max_width) internal("check_cell_widths failed");*/ } }
void check_table_widths(struct table *t) { int *w; int i, j; int s, ns; int m, mi = 0; /* go away, warning! */ if ((unsigned)t->x > MAXINT / sizeof(int)) overalloc(); w = mem_alloc(t->x * sizeof(int)); memset(w, 0, t->x * sizeof(int)); for (j = 0; j < t->y; j++) for (i = 0; i < t->x; i++) { struct table_cell *c = CELL(t, i, j); int k, p = 0; if (!c->start) continue; for (k = 1; k < c->colspan; k++) p += get_vline_width(t, i + k) >= 0; for (k = 0; k < c->colspan; k++) p += t->w_c[i + k]; get_cell_width(c->start, c->end, t->cellpd, p, 1, &c->x_width, NULL, c->link_num, NULL); if (c->x_width > p) { /*int min, max; get_cell_width(c->start, c->end, t->cellpd, 0, 0, &min, &max, c->link_num, NULL); internal("cell is now wider (%d > %d) min = %d, max = %d, now_min = %d, now_max = %d", c->x_width, p, t->min_c[i], t->max_c[i], min, max);*/ /* sbohem, internale. chytl jsi mi spoustu chyb v tabulkovaci, ale ted je proste cas jit ... ;-( */ c->x_width = p; } } s = 1; do { ns = MAXINT; for (i = 0; i < t->x; i++) for (j = 0; j < t->y; j++) { struct table_cell *c = CELL(t, i, j); if (!c->start) continue; if (c->colspan + i > t->x) { /*internal("colspan out of table");*/ mem_free(w); return; } if (c->colspan == s) { int k, p = 0; for (k = 1; k < s; k++) p += get_vline_width(t, i + k) >= 0; dst_width(w + i, s, c->x_width - p, t->max_c + i); /*for (k = i; k < i + s; k++) if (w[k] > t->w_c[k]) { int l; int c; ag: c = 0; for (l = i; l < i + s; l++) if (w[l] < t->w_c[k]) w[l]++, w[k]--, c = 1; if (w[k] > t->w_c[k]) { if (!c) internal("can't shrink cell"); else goto ag; } }*/ } else if (c->colspan > s && c->colspan < ns) ns = c->colspan; } } while ((s = ns) != MAXINT); s = 0; ns = 0; for (i = 0; i < t->x; i++) { s += t->w_c[i], ns += w[i]; /*if (w[i] > t->w_c[i]) { int k; for (k = 0; k < t->x; k++) debug("%d, %d", t->w_c[k], w[k]); debug("column %d: new width(%d) is larger than previous(%d)", i, w[i], t->w_c[i]); }*/ } if (ns > s) { /*internal("new width(%d) is larger than previous(%d)", ns, s);*/ mem_free(w); return; } m = -1; for (i = 0; i < t->x; i++) { /*if (table_level == 1) debug("%d: %d %d %d %d", i, t->max_c[i], t->min_c[i], t->w_c[i], w[i]);*/ if (t->max_c[i] > m) m = t->max_c[i], mi = i; } /*if (table_level == 1) debug("%d %d", mi, s - ns);*/ if (m != -1) { w[mi] += s - ns; if (w[mi] <= t->max_c[mi]) { mem_free(t->w_c); t->w_c = w; return; } } mem_free(w); }
Conductance_t get_conductance_west ( ThermalGrid_t *tgrid, Dimensions_t *dimensions, CellIndex_t layer_index, CellIndex_t row_index, CellIndex_t column_index ) { if (layer_index > tgrid->Size) { fprintf (stderr, "ERROR: layer index %d is out of range\n", layer_index) ; return 0.0 ; } switch (tgrid->LayersProfile [layer_index]) { case TDICE_LAYER_SOLID : case TDICE_LAYER_SOURCE : case TDICE_LAYER_SOLID_CONNECTED_TO_AMBIENT : case TDICE_LAYER_SOURCE_CONNECTED_TO_AMBIENT : return ( tgrid->TCProfile [ layer_index ] * get_cell_width (dimensions, row_index) * get_cell_height (dimensions, layer_index) ) / (get_cell_length (dimensions, column_index) / 2.0) ; case TDICE_LAYER_CHANNEL_4RM : if (IS_CHANNEL_COLUMN (TDICE_CHANNEL_MODEL_MC_4RM, column_index)) return tgrid->Channel->Coolant.HTCSide * get_cell_width (dimensions, row_index) * get_cell_height (dimensions, layer_index) ; else return ( tgrid->TCProfile [ layer_index ] * get_cell_width (dimensions, row_index) * get_cell_height (dimensions, layer_index) ) / (get_cell_length (dimensions, column_index) / 2.0) ; case TDICE_LAYER_CHANNEL_2RM : case TDICE_LAYER_PINFINS_INLINE : case TDICE_LAYER_PINFINS_STAGGERED : case TDICE_LAYER_SPREADER : case TDICE_LAYER_SINK : case TDICE_LAYER_VWALL_CHANNEL : case TDICE_LAYER_VWALL_PINFINS : case TDICE_LAYER_TOP_WALL : case TDICE_LAYER_BOTTOM_WALL : return 0.0 ; case TDICE_LAYER_NONE : fprintf (stderr, "ERROR: unset layer type\n") ; return 0.0 ; default : fprintf (stderr, "ERROR: unknown layer type %d\n", tgrid->LayersProfile [layer_index]) ; return 0.0 ; } }
Conductance_t get_conductance_bottom ( ThermalGrid_t *tgrid, Dimensions_t *dimensions, CellIndex_t layer_index, CellIndex_t row_index, CellIndex_t column_index ) { if (layer_index > tgrid->Size) { fprintf (stderr, "ERROR: layer index %d is out of range\n", layer_index) ; return 0.0 ; } switch (tgrid->LayersProfile [layer_index]) { case TDICE_LAYER_SOLID : case TDICE_LAYER_SOURCE : if (IS_FIRST_LAYER (layer_index)) return 0.0 ; else if (IS_LAST_LAYER (layer_index, dimensions)) return ( tgrid->TCProfile [ layer_index ] * get_cell_length (dimensions, column_index) * get_cell_width (dimensions, row_index) ) / get_cell_height (dimensions, layer_index) ; else return ( tgrid->TCProfile [ layer_index ] * get_cell_length (dimensions, column_index) * get_cell_width (dimensions, row_index) ) / (get_cell_height (dimensions, layer_index) / 2.0) ; case TDICE_LAYER_SOLID_CONNECTED_TO_AMBIENT : case TDICE_LAYER_SOURCE_CONNECTED_TO_AMBIENT : case TDICE_LAYER_SPREADER : case TDICE_LAYER_SINK : return ( tgrid->TCProfile [ layer_index ] * get_cell_length (dimensions, column_index) * get_cell_width (dimensions, row_index) ) / (get_cell_height (dimensions, layer_index) / 2.0) ; case TDICE_LAYER_CHANNEL_4RM : if (IS_CHANNEL_COLUMN (TDICE_CHANNEL_MODEL_MC_4RM, column_index)) return tgrid->Channel->Coolant.HTCBottom * get_cell_width (dimensions, row_index) * get_cell_length (dimensions, column_index) ; else // We assume that layer_index is not the top most layer // or the bottom most layer return ( tgrid->TCProfile [ layer_index ] * get_cell_length (dimensions, column_index) * get_cell_width (dimensions, row_index) ) / (get_cell_height (dimensions, layer_index) / 2.0) ; case TDICE_LAYER_CHANNEL_2RM : return tgrid->Channel->Coolant.HTCBottom * get_cell_width (dimensions, row_index) * get_cell_length (dimensions, column_index) ; case TDICE_LAYER_PINFINS_INLINE : return EFFECTIVE_HTC_PF_INLINE (tgrid->Channel->Coolant.DarcyVelocity) * get_cell_width (dimensions, row_index) * get_cell_length (dimensions, column_index) ; case TDICE_LAYER_PINFINS_STAGGERED : return EFFECTIVE_HTC_PF_STAGGERED (tgrid->Channel->Coolant.DarcyVelocity) * get_cell_width (dimensions, row_index) * get_cell_length (dimensions, column_index) ; case TDICE_LAYER_VWALL_CHANNEL : case TDICE_LAYER_VWALL_PINFINS : return ( tgrid->TCProfile [ layer_index ] * get_cell_length (dimensions, column_index) * get_cell_width (dimensions, row_index) ) / (get_cell_height (dimensions, layer_index) / 2.0) * (1.0 - tgrid->Channel->Porosity) ; case TDICE_LAYER_TOP_WALL : case TDICE_LAYER_BOTTOM_WALL : return 0.0 ; case TDICE_LAYER_NONE : fprintf (stderr, "ERROR: unset layer type\n") ; return 0.0 ; default : fprintf (stderr, "ERROR: unknown layer type %d\n", tgrid->LayersProfile [layer_index]) ; return 0.0 ; } }