69 namespace IT = Input::Type;
80 EqData().output_fields.make_output_field_selection(
"ConvectionTransport_Output")
159 for (
int sbi=0; sbi<
n_subst_; sbi++)
218 unsigned int sbi, ph;
233 for (sbi = 0; sbi <
n_subst_; sbi++) {
307 for (
int sbi=0; sbi<
n_subst_; sbi++)
321 int i, sbi, n_subst, ph;
335 for (sbi = 0; sbi < n_subst; sbi++) {
348 conc[ph] = (
double**)
xmalloc(n_subst *
sizeof(
double*));
354 for (sbi = 0; sbi < n_subst; sbi++) {
360 conc[ph][sbi][i] = 0.0;
389 int sbi, n_subst, ierr, rank, np;
407 ierr = VecCreateMPIWithArray(PETSC_COMM_WORLD,1,
el_ds->
lsize(), PETSC_DECIDE,
410 for (sbi = 0; sbi < n_subst; sbi++) {
419 VecZeroEntries(
vconc[sbi]);
420 VecZeroEntries(
vpconc[sbi]);
444 unsigned int sbi, loc_el;
450 for (loc_el = 0; loc_el <
el_ds->
lsize(); loc_el++) {
452 if (elm->boundary_idx_ != NULL) {
458 Boundary *b = elm->side(si)->cond();
462 double aij = -(flux / (elm->measure() * csection * por_m) );
466 VecSetValue(
bcvcorr[sbi], new_i, value[sbi] * aij, ADD_VALUES);
490 double conc_diff, csection;
503 for (loc_el = 0; loc_el <
el_ds->
lsize(); loc_el++)
522 for (loc_el = 0; loc_el <
el_ds->
lsize(); loc_el++)
525 if ( conc_diff > 0.0)
538 double conc_diff, csection;
543 VecGetArray(
vpconc[sbi], &pconc);
554 for (loc_el = 0; loc_el <
el_ds->
lsize(); loc_el++)
573 for (loc_el = 0; loc_el <
el_ds->
lsize(); loc_el++)
576 if ( conc_diff > 0.0)
604 unsigned int loc_el,sbi;
674 for (sbi = 0; sbi <
n_subst_; sbi++) {
683 END_TIMER(
"compute_concentration_sources");
809 int n, s, j, np, rank, new_j, new_i;
810 double max_sum, aij, aii;
837 double flux, flux2, edg_flux;
843 for(
int s=0; s < edg.
n_sides; s++) {
845 if ( flux > 0) edge_flow[i]+= flux;
852 for (
unsigned int loc_el = 0; loc_el <
el_ds->
lsize(); loc_el++) {
862 if (elm->side(si)->cond() == NULL) {
863 edg = elm->side(si)->edge();
864 edg_flux = edge_flow[ elm->side(si)->edge_idx() ];
868 if (edg->
side(s) != elm->side(si)) {
873 if ( flux2 > 0.0 && flux <0.0)
874 aij = -(flux * flux2 / ( edg_flux * elm->measure() * csection * por_m) );
876 MatSetValue(
tm, new_i, new_j, aij, INSERT_VALUES);
879 aii -= (flux / (elm->measure() * csection * por_m) );
892 aii -= (flux / (elm->measure() * csection * por_m) );
900 ASSERT( el2 != elm,
"Elm. same\n");
905 if (flux > 0.0) aij = flux / (elm->measure() * csection * por_m);
907 MatSetValue(
tm, new_i, new_j, aij, INSERT_VALUES);
912 aii -= (-flux) / (elm->measure() * csection * por_m);
913 aij = (-flux) / (el2->measure() *
917 MatSetValue(
tm, new_j, new_i, aij, INSERT_VALUES);
920 MatSetValue(
tm, new_i, new_i, aii, INSERT_VALUES);
922 if (fabs(aii) > max_sum)
935 MatAssemblyBegin(
tm, MAT_FINAL_ASSEMBLY);
939 MatAssemblyEnd(
tm, MAT_FINAL_ASSEMBLY);
1193 void ConvectionTransport::transport_until_time(
double time_interval) {
1207 for (t = 1; t <= steps; t++) {
1233 if ((save_step == step) || (write_iterations)) {
1238 for(
int subst_id=0; subst_id<
n_subst_; subst_id++) {
1241 output_time->write_data(
time);
1268 for (sbi = 0; sbi <
n_subst_; sbi++) {
1285 el_distribution_out = this->
el_ds;
1310 VecGetArray(
vpconc[sbi], &pconc[sbi]);
1315 int index =
row_4_el[bcd->side()->element().index()];
1319 double por_m =
data_.
porosity.
value(bcd->side()->element()->centre(), bcd->side()->element()->element_accessor() );
1321 if (water_flux < 0) {
1322 arma::vec bc_conc =
data_.
bc_conc.
value( bcd->element()->centre(), bcd->element_accessor() );
1324 mass_flux[sbi] = water_flux*bc_conc[sbi]*por_m;
1327 mass_flux[sbi] = water_flux*pconc[sbi][loc_index]*por_m;
1330 Region r = bcd->region();
1331 if (! r.
is_valid())
xprintf(
Msg,
"Invalid region, ele % d, edg: % d\n", bcd->bc_ele_idx_, bcd->edge_idx_);
1336 bcd_balance[sbi][bc_region_idx] += mass_flux[sbi];
1338 if (water_flux > 0) bcd_plus_balance[sbi][bc_region_idx] += mass_flux[sbi];
1339 else bcd_minus_balance[sbi][bc_region_idx] += mass_flux[sbi];
1354 int index =
row_4_el[elem.index()];
1366 double sum_sol_phases =
conc[0][sbi][loc_index];
1369 mass[sbi][ele_acc.
region().
bulk_idx()] += por_m*csection*sum_sol_phases*elem->measure();
1370 src_balance[sbi][ele_acc.
region().
bulk_idx()] += sources[loc_index]*elem->measure();