56 namespace it = Input::Type;
60 .
copy_values(OutputFields().make_output_field_selection(
"").close())
64 =
it::Record(
"DarcyMHOutput",
"Parameters of MH output.")
66 "Parameters of output stream.")
70 "Output file for water balance table.")
72 "SPECIAL PURPOSE. Computing errors pro non-compatible coupling.")
74 "Output file with raw data form MH module.");
105 ASSERT(ierr == 0,
"Error in MPI test of rank.");
116 auto ele_pressure_ptr=make_shared< FieldElementwise<3, FieldValue<3>::Scalar> >(
ele_pressure, 1);
124 auto corner_ptr = make_shared< FieldFE<3, FieldValue<3>::Scalar> >();
132 make_shared< FieldElementwise<3, FieldValue<3>::Scalar> >(
ele_piezo_head, 1));
136 make_shared< FieldElementwise<3, FieldValue<3>::VectorFixed> >(
ele_flux, 3));
140 for(
unsigned int i=0; i<
subdomains.size();i++)
143 make_shared< FieldElementwise<3, FieldValue<3>::Integer> >(
subdomains, 1));
160 if (in_rec.
opt_val(
"raw_flow_output", raw_output_file_path)) {
161 xprintf(
Msg,
"Opening raw output: %s\n",
string(raw_output_file_path).c_str() );
240 unsigned int sol_size;
266 flux_in_centre.zeros();
273 for (
unsigned int li = 0; li < ele->n_sides(); li++) {
274 flux_in_centre += dh.
side_flux( *(ele->side( li ) ) )
275 * fe_values.
RT0_value( ele, ele->centre(), li )
279 for(
unsigned int j=0; j<3; j++)
280 ele_flux[3*i_side+j]=flux_in_centre[j];
290 unsigned int ndofs = max(
dh->
fe<1>()->n_dofs(), max(
dh->
fe<2>()->n_dofs(),
dh->
fe<3>()->n_dofs()));
291 unsigned int indices[ndofs];
332 int* sum_elements =
new int [n_nodes];
333 int* sum_sides =
new int [n_nodes];
334 double* sum_ele_dist =
new double [n_nodes];
335 double* sum_side_dist =
new double [n_nodes];
339 bool count_elements =
true;
340 bool count_sides =
true;
346 for (
int i = 0; i < n_nodes; i++){
349 sum_ele_dist[i] = 0.0;
350 sum_side_dist[i] = 0.0;
357 for (
unsigned int li = 0; li < ele->n_nodes(); li++) {
358 node = ele->node[li];
362 ((node->
getX() - ele->centre()[ 0 ])*(node->
getX() - ele->centre()[ 0 ])) +
363 ((node->
getY() - ele->centre()[ 1 ])*(node->
getY() - ele->centre()[ 1 ])) +
364 ((node->
getZ() - ele->centre()[ 2 ])*(node->
getZ() - ele->centre()[ 2 ]))
366 sum_ele_dist[node_index] += dist;
367 sum_elements[node_index]++;
372 for (
unsigned int li = 0; li < side->n_nodes(); li++) {
373 node = side->node(li);
376 ((node->
getX() - side->centre()[ 0 ])*(node->
getX() - side->centre()[ 0 ])) +
377 ((node->
getY() - side->centre()[ 1 ])*(node->
getY() - side->centre()[ 1 ])) +
378 ((node->
getZ() - side->centre()[ 2 ])*(node->
getZ() - side->centre()[ 2 ]))
381 sum_side_dist[node_index] += dist;
382 sum_sides[node_index]++;
390 for (
unsigned int li = 0; li < ele->n_nodes(); li++) {
391 node = ele->node[li];
396 ((node->
getX() - ele->centre()[ 0 ])*(node->
getX() - ele->centre()[ 0 ])) +
397 ((node->
getY() - ele->centre()[ 1 ])*(node->
getY() - ele->centre()[ 1 ])) +
398 ((node->
getZ() - ele->centre()[ 2 ])*(node->
getZ() - ele->centre()[ 2 ]))
401 (1 - dist / (sum_ele_dist[node_index] + sum_side_dist[node_index])) /
402 (sum_elements[node_index] + sum_sides[node_index] - 1);
407 for (
unsigned int li = 0; li < side->n_nodes(); li++) {
408 node = side->node(li);
413 ((node->
getX() - side->centre()[ 0 ])*(node->
getX() - side->centre()[ 0 ])) +
414 ((node->
getY() - side->centre()[ 1 ])*(node->
getY() - side->centre()[ 1 ])) +
415 ((node->
getZ() - side->centre()[ 2 ])*(node->
getZ() - side->centre()[ 2 ]))
420 (1 - dist / (sum_ele_dist[node_index] + sum_side_dist[node_index])) /
421 (sum_sides[node_index] + sum_elements[node_index] - 1);
433 delete [] sum_elements;
435 delete [] sum_ele_dist;
436 delete [] sum_side_dist;
582 unsigned int wl = 2*(w-5)+7;
584 string bc_head_format =
"# %-*s%-*s%-*s%-*s%-*s%-*s\n",
585 bc_format =
"%*s%-*d%-*s %-*g%-*g%-*g%-*g\n",
586 bc_total_format =
"# %-*s%-*g%-*g%-*g\n\n\n";
587 s << setw((w*c+wl-15)/2) << setfill(
'-') <<
"-";
593 w,
"[total_balance]",w,
"[total_outflow]",w,
"[total_inflow]",w,
"[time]");
595 s.str(std::string());
596 s << setw(w*c+wl) << setfill(
'-') <<
"-";
602 double flux = dh.
side_flux( *(bcd->side()) );
606 if (! r.
is_valid())
xprintf(
Msg,
"Invalid region, ele % d, edg: % d\n", bcd->bc_ele_idx_, bcd->edge_idx_);
608 bcd_balance[bc_region_idx] += flux;
610 if (flux > 0) bcd_plus_balance[bc_region_idx] += flux;
611 else bcd_minus_balance[bc_region_idx] += flux;
616 double total_balance = 0,
619 for( RegionSet::const_iterator reg = b_set.begin(); reg != b_set.end(); ++reg) {
621 total_balance += bcd_balance[reg->boundary_idx()];
622 total_outflow += bcd_plus_balance[reg->boundary_idx()];
623 total_inflow += bcd_minus_balance[reg->boundary_idx()];
625 w, bcd_balance[reg->boundary_idx()], w, bcd_plus_balance[reg->boundary_idx()],
631 w,total_balance, w, total_outflow, w, total_inflow);
634 string src_head_format =
"# %-*s%-*s%-*s%-*s%-*s\n",
635 src_format =
"%*s%-*d%-*s %-*g%-*s%-*g\n",
636 src_total_format =
"# %-*s%-*g\n\n\n";
640 w,
"[total_balance]",2*w,
"",w,
"[time]");
648 src_balance[elm->element_accessor().region().bulk_idx()] += elm->measure() *
657 for( RegionSet::const_iterator reg = bulk_set.begin(); reg != bulk_set.end(); ++reg)
659 total_balance += src_balance[reg->bulk_idx()];
662 reg->label().c_str(), w, src_balance[reg->bulk_idx()],2*w,
"", w,
darcy_flow->
time().
t());
694 char dbl_fmt[ 16 ]=
"%.8g ";
696 xfprintf(
raw_output_file,
"// fields:\n//ele_id ele_presure flux_in_barycenter[3] n_sides side_pressures[n] side_fluxes[n]\n");
707 for (i = 0; i < 3; i++)
711 for (i = 0; i < ele->n_sides(); i++)
713 for (i = 0; i < ele->n_sides(); i++)
745 double pressure_error[2], velocity_error[2], div_error[2];
776 for (
unsigned int li = 0; li < ele->n_sides(); li++) {
777 fluxes[li] = result.
dh->
side_flux( *(ele->side( li ) ) );
778 pressure_traces[li] = result.
dh->
side_scalar( *(ele->side( li ) ) );
782 arma::vec analytical(5);
786 double velocity_diff=0, divergence_diff=0, pressure_diff=0, diff;
790 double mean_x_squared=0;
791 for(
unsigned int i_node=0; i_node < ele->n_nodes(); i_node++ )
792 for(
unsigned int j_node=0; j_node < ele->n_nodes(); j_node++ )
794 mean_x_squared += (i_node == j_node ? 2.0 : 1.0) / ( 6 * dim )
795 * arma::dot( ele->node[i_node]->point(), ele->node[j_node]->point());
798 for(
unsigned int i_point=0; i_point < fe_values.
n_points(); i_point++) {
802 analytical = anal_sol.
value(q_point, ele->element_accessor() );
803 for(
unsigned int i=0; i< 3; i++) anal_flux[i] = analytical[i+1];
807 for(
unsigned int i_shape=0; i_shape < ele->n_sides(); i_shape++) {
808 unsigned int oposite_node = (i_shape + dim) % (dim + 1);
810 diff += fluxes[ i_shape ] *
811 ( arma::dot( q_point, q_point )/ 2
813 - arma::dot( q_point, ele->node[oposite_node]->point() )
814 + arma::dot( ele->centre(), ele->node[oposite_node]->point() )
818 diff = - (1.0 / conductivity) * diff / dim / ele->measure() / cross + pressure_mean ;
819 diff = ( diff - analytical[0]);
820 pressure_diff += diff * diff * fe_values.
JxW(i_point);
824 flux_in_q_point.zeros();
825 for(
unsigned int i_shape=0; i_shape < ele->n_sides(); i_shape++) {
826 flux_in_q_point += fluxes[ i_shape ]
831 flux_in_q_point -= anal_flux;
832 velocity_diff += dot(flux_in_q_point, flux_in_q_point) * fe_values.
JxW(i_point);
836 for(
unsigned int i_shape=0; i_shape < ele->n_sides(); i_shape++) diff += fluxes[ i_shape ];
837 diff = ( diff / ele->measure() / cross - analytical[4]);
838 divergence_diff += diff * diff * fe_values.
JxW(i_point);
850 result.
div_error[dim-1] += divergence_diff;
860 DBGMSG(
"l2 norm output\n");
863 const unsigned int order = 4;
880 ExactSolution anal_sol_1d(5);
883 ExactSolution anal_sol_2d(5);
910 auto pressure_diff_ptr = std::make_shared< FieldElementwise<3, FieldValue<3>::Scalar> >(&(result.
pressure_diff[0]), 1,
mesh_->
n_elements());
912 auto div_diff_ptr = std::make_shared< FieldElementwise<3, FieldValue<3>::Scalar> >(&(result.
div_diff[0]), 1,
mesh_->
n_elements());
917 unsigned int solution_size;
926 switch (ele->dim()) {
929 l2_diff_local<1>( ele, fe_values_1d, anal_sol_1d, result);
932 l2_diff_local<2>( ele, fe_values_2d, anal_sol_2d, result);
937 os <<
"l2 norm output\n\n"
938 <<
"pressure error 1d: " << sqrt(result.
pressure_error[0]) << endl
939 <<
"pressure error 2d: " << sqrt(result.
pressure_error[1]) << endl
940 <<
"velocity error 1d: " << sqrt(result.
velocity_error[0]) << endl
941 <<
"velocity error 2d: " << sqrt(result.
velocity_error[1]) << endl
942 <<
"div error 1d: " << sqrt(result.
div_error[0]) << endl
943 <<
"div error 2d: " << sqrt(result.
div_error[1]);