#ifndef __MICROCHANNEL_H
#define __MICROCHANNEL_H
#include "util.h"
#include "materials.h"
#define NETWORK_EXTENSION ".csv"
#define FLOORPLAN_EXTENSION ".flp"
#define TSV -1
#define SOLID 0
#define FLUID 1
#define INLET 2
#define OUTLET 3
#define EXTRA_PRESSURE_NODES 1
#define IS_FLUID_CELL(uconf, i, j) (uconf->cell_types[i][j] == FLUID || \
uconf->cell_types[i][j] == INLET || \
uconf->cell_types[i][j] == OUTLET)
#define IS_INLET_CELL(uconf, i, j) (uconf->cell_types[i][j] == INLET)
#define IS_OUTLET_CELL(uconf, i, j) (uconf->cell_types[i][j] == OUTLET)
typedef struct microchannel_config_t_st
{
double cell_width;
double cell_height;
double cell_thickness;
double pumping_pressure;
double pump_internal_res;
double inlet_temperature;
double coolant_capac;
double coolant_res;
double coolant_visc;
double wall_capac;
double wall_res;
double htc;
char network_file[STR_SIZE];
char floorplan_file[STR_SIZE+3];
int num_rows;
int num_columns;
int n_fluid_cells;
int **cell_types;
int **mapping;
double **A;
double *b;
int nnz;
} microchannel_config_t;
microchannel_config_t default_microchannel_config(void);
void microchannel_config_add_from_strs(microchannel_config_t *config, materials_list_t *materials_list, str_pair *table, int size);
int microchannel_config_to_strs(microchannel_config_t *config, str_pair *table, int max_entries);
void microchannel_build_network(microchannel_config_t *config);
void build_pressure_matrix(microchannel_config_t *config);
double flow_rate(microchannel_config_t *config, int cell1_i, int cell1_j, int cell2_i, int cell2_j);
void copy_microchannel(microchannel_config_t *src, microchannel_config_t *dst);
void free_microchannel(microchannel_config_t * config);
#endif